GoScrobble/web/node_modules/workbox-build/build/lib/bundle.js

138 lines
3.0 KiB
JavaScript

"use strict";
/*
Copyright 2019 Google LLC
Use of this source code is governed by an MIT-style
license that can be found in the LICENSE file or at
https://opensource.org/licenses/MIT.
*/
const {
rollup
} = require('rollup');
const {
terser
} = require('rollup-plugin-terser');
const {
writeFile
} = require('fs-extra');
const babel = require('rollup-plugin-babel');
const omt = require('@surma/rollup-plugin-off-main-thread');
const upath = require('upath');
const presetEnv = require('@babel/preset-env');
const replace = require('@rollup/plugin-replace');
const resolve = require('@rollup/plugin-node-resolve');
const tempy = require('tempy');
module.exports = async ({
babelPresetEnvTargets,
inlineWorkboxRuntime,
mode,
sourcemap,
swDest,
unbundledCode
}) => {
// We need to write this to the "real" file system, as Rollup won't read from
// a custom file system.
const {
dir,
base
} = upath.parse(swDest);
const temporaryFile = tempy.file({
name: base
});
await writeFile(temporaryFile, unbundledCode);
const plugins = [resolve(), replace({
'process.env.NODE_ENV': JSON.stringify(mode)
}), babel({
// Disable the logic that checks for local Babel config files:
// https://github.com/GoogleChrome/workbox/issues/2111
babelrc: false,
configFile: false,
presets: [[presetEnv, {
targets: {
browsers: babelPresetEnvTargets
},
loose: true
}]]
})];
if (mode === 'production') {
plugins.push(terser({
mangle: {
toplevel: true,
properties: {
regex: /(^_|_$)/
}
}
}));
}
const rollupConfig = {
plugins,
input: temporaryFile
}; // Rollup will inline the runtime by default. If we don't want that, we need
// to add in some additional config.
if (!inlineWorkboxRuntime) {
rollupConfig.plugins.unshift(omt());
rollupConfig.manualChunks = id => {
return id.includes('workbox') ? 'workbox' : undefined;
};
}
const bundle = await rollup(rollupConfig);
const {
output
} = await bundle.generate({
sourcemap,
// Using an external Workbox runtime requires 'amd'.
format: inlineWorkboxRuntime ? 'es' : 'amd'
});
const files = [];
for (const chunkOrAsset of output) {
if (chunkOrAsset.isAsset) {
files.push({
name: chunkOrAsset.fileName,
contents: chunkOrAsset.source
});
} else {
let code = chunkOrAsset.code;
if (chunkOrAsset.map) {
const sourceMapFile = chunkOrAsset.fileName + '.map';
code += `//# sourceMappingURL=${sourceMapFile}\n`;
files.push({
name: sourceMapFile,
contents: chunkOrAsset.map.toString()
});
}
files.push({
name: chunkOrAsset.fileName,
contents: code
});
}
} // Make sure that if there was a directory portion included in swDest, it's
// preprended to all of the generated files.
return files.map(file => {
file.name = upath.format({
dir,
base: file.name
});
return file;
});
};