Files
30-seconds-of-code/node_modules/gatsby-plugin-manifest/gatsby-node.js
2019-08-20 15:52:05 +02:00

311 lines
11 KiB
JavaScript

"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _fs = _interopRequireDefault(require("fs"));
var _path = _interopRequireDefault(require("path"));
var _safeSharp = _interopRequireDefault(require("./safe-sharp"));
var _gatsbyCoreUtils = require("gatsby-core-utils");
var _common = require("./common");
_safeSharp.default.simd(true); // Handle Sharp's concurrency based on the Gatsby CPU count
// See: http://sharp.pixelplumbing.com/en/stable/api-utility/#concurrency
// See: https://www.gatsbyjs.org/docs/multi-core-builds/
_safeSharp.default.concurrency((0, _gatsbyCoreUtils.cpuCoreCount)());
function generateIcon(_x, _x2) {
return _generateIcon.apply(this, arguments);
}
function _generateIcon() {
_generateIcon = (0, _asyncToGenerator2.default)(
/*#__PURE__*/
_regenerator.default.mark(function _callee3(icon, srcIcon) {
var imgPath, size, density;
return _regenerator.default.wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
imgPath = _path.default.join("public", icon.src); // console.log(`generating icon: `, icon.src)
// if (fs.existsSync(imgPath)) {
// console.log(`icon already Exists, not regenerating`)
// return true
// }
size = parseInt(icon.sizes.substring(0, icon.sizes.lastIndexOf("x"))); // For vector graphics, instruct sharp to use a pixel density
// suitable for the resolution we're rasterizing to.
// For pixel graphics sources this has no effect.
// Sharp accept density from 1 to 2400
density = Math.min(2400, Math.max(1, size));
return _context3.abrupt("return", (0, _safeSharp.default)(srcIcon, {
density: density
}).resize({
width: size,
height: size,
fit: "contain",
background: {
r: 255,
g: 255,
b: 255,
alpha: 0
}
}).toFile(imgPath));
case 4:
case "end":
return _context3.stop();
}
}
}, _callee3, this);
}));
return _generateIcon.apply(this, arguments);
}
function checkCache(_x3, _x4, _x5, _x6, _x7) {
return _checkCache.apply(this, arguments);
}
function _checkCache() {
_checkCache = (0, _asyncToGenerator2.default)(
/*#__PURE__*/
_regenerator.default.mark(function _callee4(cache, icon, srcIcon, srcIconDigest, callback) {
var cacheKey, created;
return _regenerator.default.wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
cacheKey = (0, _gatsbyCoreUtils.createContentDigest)("" + icon.src + srcIcon + srcIconDigest);
created = cache.get(cacheKey, srcIcon);
if (created) {
_context4.next = 15;
break;
}
cache.set(cacheKey, true);
_context4.prev = 4;
_context4.next = 7;
return callback(icon, srcIcon);
case 7:
_context4.next = 13;
break;
case 9:
_context4.prev = 9;
_context4.t0 = _context4["catch"](4);
cache.set(cacheKey, false);
throw _context4.t0;
case 13:
_context4.next = 15;
break;
case 15:
case "end":
return _context4.stop();
}
}
}, _callee4, this, [[4, 9]]);
}));
return _checkCache.apply(this, arguments);
}
exports.onPostBootstrap =
/*#__PURE__*/
function () {
var _ref3 = (0, _asyncToGenerator2.default)(
/*#__PURE__*/
_regenerator.default.mark(function _callee(_ref, _ref2) {
var reporter, localize, manifest, activity, cache, locales;
return _regenerator.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
reporter = _ref.reporter;
localize = _ref2.localize, manifest = (0, _objectWithoutPropertiesLoose2.default)(_ref2, ["localize"]);
activity = reporter.activityTimer("Build manifest and related icons");
activity.start();
cache = new Map();
_context.next = 7;
return makeManifest(cache, reporter, manifest);
case 7:
if (!Array.isArray(localize)) {
_context.next = 11;
break;
}
locales = localize.concat();
_context.next = 11;
return Promise.all(locales.map(function (locale) {
var cacheModeOverride = {};
/* localization requires unique filenames for output files if a different src Icon is defined.
otherwise one language would override anothers icons in automatic mode.
*/
if (locale.hasOwnProperty("icon") && !locale.hasOwnProperty("icons")) {
// console.debug(`OVERRIDING CACHE BUSTING`, locale)
cacheModeOverride = {
cache_busting_mode: "name"
};
}
return makeManifest(cache, reporter, (0, _extends2.default)({}, manifest, locale, cacheModeOverride));
}));
case 11:
activity.end();
case 12:
case "end":
return _context.stop();
}
}
}, _callee, this);
}));
return function (_x8, _x9) {
return _ref3.apply(this, arguments);
};
}();
var makeManifest =
/*#__PURE__*/
function () {
var _ref4 = (0, _asyncToGenerator2.default)(
/*#__PURE__*/
_regenerator.default.mark(function _callee2(cache, reporter, pluginOptions) {
var icon, manifest, suffix, paths, sharpIcon, metadata, cacheMode, iconDigest;
return _regenerator.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
icon = pluginOptions.icon, manifest = (0, _objectWithoutPropertiesLoose2.default)(pluginOptions, ["icon"]);
suffix = pluginOptions.lang ? "_" + pluginOptions.lang : ""; // Delete options we won't pass to the manifest.webmanifest.
delete manifest.plugins;
delete manifest.legacy;
delete manifest.theme_color_in_head;
delete manifest.cache_busting_mode;
delete manifest.crossOrigin;
delete manifest.icon_options;
delete manifest.include_favicon; // If icons are not manually defined, use the default icon set.
if (!manifest.icons) {
manifest.icons = _common.defaultIcons.concat();
} // Specify extra options for each icon (if requested).
if (pluginOptions.icon_options) {
manifest.icons = manifest.icons.map(function (icon) {
return (0, _extends2.default)({}, pluginOptions.icon_options, icon);
});
} // Determine destination path for icons.
paths = {};
manifest.icons.forEach(function (icon) {
var iconPath = _path.default.join("public", _path.default.dirname(icon.src));
if (!paths[iconPath]) {
var exists = _fs.default.existsSync(iconPath); //create destination directory if it doesn't exist
if (!exists) {
_fs.default.mkdirSync(iconPath);
}
paths[iconPath] = true;
}
}); // Only auto-generate icons if a src icon is defined.
if (!(icon !== undefined)) {
_context2.next = 30;
break;
}
if ((0, _common.doesIconExist)(icon)) {
_context2.next = 16;
break;
}
throw "icon (" + icon + ") does not exist as defined in gatsby-config.js. Make sure the file exists relative to the root of the site.";
case 16:
sharpIcon = (0, _safeSharp.default)(icon);
_context2.next = 19;
return sharpIcon.metadata();
case 19:
metadata = _context2.sent;
if (metadata.width !== metadata.height) {
reporter.warn("The icon(" + icon + ") you provided to 'gatsby-plugin-manifest' is not square.\n" + "The icons we generate will be square and for the best results we recommend you provide a square icon.\n");
} //add cache busting
cacheMode = typeof pluginOptions.cache_busting_mode !== "undefined" ? pluginOptions.cache_busting_mode : "query";
iconDigest = (0, _gatsbyCoreUtils.createContentDigest)(_fs.default.readFileSync(icon)); //if cacheBusting is being done via url query icons must be generated before cache busting runs
if (!(cacheMode === "query")) {
_context2.next = 26;
break;
}
_context2.next = 26;
return Promise.all(manifest.icons.map(function (dstIcon) {
return checkCache(cache, dstIcon, icon, iconDigest, generateIcon);
}));
case 26:
if (cacheMode !== "none") {
manifest.icons = manifest.icons.map(function (icon) {
var newIcon = (0, _extends2.default)({}, icon);
newIcon.src = (0, _common.addDigestToPath)(icon.src, iconDigest, cacheMode);
return newIcon;
});
} //if file names are being modified by cacheBusting icons must be generated after cache busting runs
if (!(cacheMode !== "query")) {
_context2.next = 30;
break;
}
_context2.next = 30;
return Promise.all(manifest.icons.map(function (dstIcon) {
return checkCache(cache, dstIcon, icon, iconDigest, generateIcon);
}));
case 30:
//Write manifest
_fs.default.writeFileSync(_path.default.join("public", "manifest" + suffix + ".webmanifest"), JSON.stringify(manifest));
case 31:
case "end":
return _context2.stop();
}
}
}, _callee2, this);
}));
return function makeManifest(_x10, _x11, _x12) {
return _ref4.apply(this, arguments);
};
}();