UNPKG

workbox-build

Version:

A module that integrates into your build process, helping you generate a manifest of local files that workbox-sw should precache.

145 lines (123 loc) 3.25 kB
"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 { babel } = require('@rollup/plugin-babel'); const { nodeResolve } = require('@rollup/plugin-node-resolve'); const { rollup } = require('rollup'); const { terser } = require('rollup-plugin-terser'); const { writeFile } = require('fs-extra'); const omt = require('@surma/rollup-plugin-off-main-thread'); const presetEnv = require('@babel/preset-env'); const replace = require('@rollup/plugin-replace'); const tempy = require('tempy'); const upath = require('upath'); 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 = [nodeResolve(), replace({ // See https://github.com/GoogleChrome/workbox/issues/2769 'preventAssignment': true, 'process.env.NODE_ENV': JSON.stringify(mode) }), babel({ babelHelpers: 'bundled', // 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; }); };