generate.js 3.13 KB
/*
  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 joi = require('@hapi/joi');

const defaults = require('../defaults');
const regExpObject = require('../objects/reg-exp');

module.exports = {
  babelPresetEnvTargets: joi.array().items(joi.string())
      .default(defaults.babelPresetEnvTargets),
  cacheId: joi.string(),
  cleanupOutdatedCaches: joi.boolean().default(defaults.cleanupOutdatedCaches),
  clientsClaim: joi.boolean().default(defaults.clientsClaim),
  directoryIndex: joi.string(),
  disableDevLogs: joi.boolean().default(defaults.disableDevLogs),
  ignoreURLParametersMatching: joi.array().items(regExpObject),
  importScripts: joi.array().items(joi.string()),
  inlineWorkboxRuntime: joi.boolean().default(defaults.inlineWorkboxRuntime),
  navigateFallback: joi.string().default(defaults.navigateFallback),
  navigateFallbackAllowlist: joi.array().items(regExpObject),
  navigateFallbackBlacklist: joi.forbidden().error(new Error(
      'navigateFallbackBlacklist has been renamed navigateFallbackDenylist.')),
  navigateFallbackDenylist: joi.array().items(regExpObject),
  navigateFallbackWhitelist: joi.forbidden().error(new Error(
      'navigateFallbackWhitelist has been renamed navigateFallbackAllowlist.')),
  navigationPreload: joi.boolean().default(defaults.navigationPreload),
  offlineGoogleAnalytics: joi.alternatives().try(joi.boolean(), joi.object())
      .default(defaults.offlineGoogleAnalytics),
  runtimeCaching: joi.array().items(joi.object().keys({
    method: joi.string().valid(
        'DELETE',
        'GET',
        'HEAD',
        'PATCH',
        'POST',
        'PUT',
    ),
    urlPattern: [regExpObject, joi.string(), joi.func()],
    handler: [
      joi.func(),
      joi.string().valid(
          'CacheFirst',
          'CacheOnly',
          'NetworkFirst',
          'NetworkOnly',
          'StaleWhileRevalidate'),
    ],
    options: joi.object().keys({
      backgroundSync: joi.object().keys({
        name: joi.string().required(),
        options: joi.object(),
      }),
      broadcastUpdate: joi.object().keys({
        channelName: joi.string().required(),
        options: joi.object(),
      }),
      cacheableResponse: joi.object().keys({
        statuses: joi.array().items(joi.number().min(0).max(599)),
        headers: joi.object(),
      }).or('statuses', 'headers'),
      cacheName: joi.string(),
      expiration: joi.object().keys({
        maxEntries: joi.number().min(1),
        maxAgeSeconds: joi.number().min(1),
        purgeOnQuotaError: joi.boolean().default(defaults.purgeOnQuotaError),
      }).or('maxEntries', 'maxAgeSeconds'),
      networkTimeoutSeconds: joi.number().min(1),
      plugins: joi.array().items(joi.object()),
      fetchOptions: joi.object(),
      matchOptions: joi.object(),
    }).with('expiration', 'cacheName'),
  }).requiredKeys('urlPattern', 'handler')).when('navigationPreload', {
    is: true,
    then: joi.required(),
  }),
  skipWaiting: joi.boolean().default(defaults.skipWaiting),
  sourcemap: joi.boolean().default(defaults.sourcemap),
};