write-sw-using-default-template.js 2.02 KB
/*
  Copyright 2018 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 fse = require('fs-extra');
const upath = require('upath');

const bundle = require('./bundle');
const errors = require('./errors');
const populateSWTemplate = require('./populate-sw-template');

module.exports = async ({
  babelPresetEnvTargets,
  cacheId,
  cleanupOutdatedCaches,
  clientsClaim,
  directoryIndex,
  disableDevLogs,
  ignoreURLParametersMatching,
  importScripts,
  inlineWorkboxRuntime,
  manifestEntries,
  mode,
  navigateFallback,
  navigateFallbackDenylist,
  navigateFallbackAllowlist,
  navigationPreload,
  offlineGoogleAnalytics,
  runtimeCaching,
  skipWaiting,
  sourcemap,
  swDest,
}) => {
  const outputDir = upath.dirname(swDest);
  try {
    await fse.mkdirp(outputDir);
  } catch (error) {
    throw new Error(`${errors['unable-to-make-sw-directory']}. ` +
      `'${error.message}'`);
  }

  const unbundledCode = populateSWTemplate({
    cacheId,
    cleanupOutdatedCaches,
    clientsClaim,
    directoryIndex,
    disableDevLogs,
    ignoreURLParametersMatching,
    importScripts,
    manifestEntries,
    navigateFallback,
    navigateFallbackDenylist,
    navigateFallbackAllowlist,
    navigationPreload,
    offlineGoogleAnalytics,
    runtimeCaching,
    skipWaiting,
  });

  try {
    const files = await bundle({
      babelPresetEnvTargets,
      inlineWorkboxRuntime,
      mode,
      sourcemap,
      swDest,
      unbundledCode,
    });

    const filePaths = [];

    for (const file of files) {
      const filePath = upath.resolve(file.name);
      filePaths.push(filePath);
      await fse.writeFile(filePath, file.contents);
    }

    return filePaths;
  } catch (error) {
    if (error.code === 'EISDIR') {
      // See https://github.com/GoogleChrome/workbox/issues/612
      throw new Error(errors['sw-write-failure-directory']);
    }
    throw new Error(`${errors['sw-write-failure']} '${error.message}'`);
  }
};