123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- "use strict";
- /*
- Copyright 2021 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.
- */
- var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
- };
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.validateWebpackInjectManifestOptions = exports.validateWebpackGenerateSWOptions = exports.validateInjectManifestOptions = exports.validateGetManifestOptions = exports.validateGenerateSWOptions = exports.WorkboxConfigError = void 0;
- const better_ajv_errors_1 = require("@apideck/better-ajv-errors");
- const common_tags_1 = require("common-tags");
- const ajv_1 = __importDefault(require("ajv"));
- const errors_1 = require("./errors");
- const ajv = new ajv_1.default({
- useDefaults: true,
- });
- const DEFAULT_EXCLUDE_VALUE = [/\.map$/, /^manifest.*\.js$/];
- class WorkboxConfigError extends Error {
- constructor(message) {
- super(message);
- Object.setPrototypeOf(this, new.target.prototype);
- }
- }
- exports.WorkboxConfigError = WorkboxConfigError;
- // Some methods need to do follow-up validation using the JSON schema,
- // so return both the validated options and then schema.
- function validate(input, methodName) {
- // Don't mutate input: https://github.com/GoogleChrome/workbox/issues/2158
- const inputCopy = Object.assign({}, input);
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
- const jsonSchema = require(`../schema/${methodName}Options.json`);
- const validate = ajv.compile(jsonSchema);
- if (validate(inputCopy)) {
- // All methods support manifestTransforms, so validate it here.
- ensureValidManifestTransforms(inputCopy);
- return [inputCopy, jsonSchema];
- }
- const betterErrors = (0, better_ajv_errors_1.betterAjvErrors)({
- basePath: methodName,
- data: input,
- errors: validate.errors,
- // This is needed as JSONSchema6 is expected, but JSONSchemaType works.
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
- schema: jsonSchema,
- });
- const messages = betterErrors.map((err) => (0, common_tags_1.oneLine) `[${err.path}] ${err.message}.
- ${err.suggestion ? err.suggestion : ''}`);
- throw new WorkboxConfigError(messages.join('\n\n'));
- }
- function ensureValidManifestTransforms(options) {
- if ('manifestTransforms' in options &&
- !(Array.isArray(options.manifestTransforms) &&
- options.manifestTransforms.every((item) => typeof item === 'function'))) {
- throw new WorkboxConfigError(errors_1.errors['manifest-transforms']);
- }
- }
- function ensureValidNavigationPreloadConfig(options) {
- if (options.navigationPreload &&
- (!Array.isArray(options.runtimeCaching) ||
- options.runtimeCaching.length === 0)) {
- throw new WorkboxConfigError(errors_1.errors['nav-preload-runtime-caching']);
- }
- }
- function ensureValidCacheExpiration(options) {
- var _a, _b;
- for (const runtimeCaching of options.runtimeCaching || []) {
- if (((_a = runtimeCaching.options) === null || _a === void 0 ? void 0 : _a.expiration) &&
- !((_b = runtimeCaching.options) === null || _b === void 0 ? void 0 : _b.cacheName)) {
- throw new WorkboxConfigError(errors_1.errors['cache-name-required']);
- }
- }
- }
- function ensureValidRuntimeCachingOrGlobDirectory(options) {
- if (!options.globDirectory &&
- (!Array.isArray(options.runtimeCaching) ||
- options.runtimeCaching.length === 0)) {
- throw new WorkboxConfigError(errors_1.errors['no-manifest-entries-or-runtime-caching']);
- }
- }
- // This is... messy, because we can't rely on the built-in ajv validation for
- // runtimeCaching.handler, as it needs to accept {} (i.e. any) due to
- // https://github.com/GoogleChrome/workbox/pull/2899
- // So we need to perform validation when a string (not a function) is used.
- function ensureValidStringHandler(options, jsonSchema) {
- var _a, _b, _c, _d;
- let validHandlers = [];
- /* eslint-disable */
- for (const handler of ((_d = (_c = (_b = (_a = jsonSchema.definitions) === null || _a === void 0 ? void 0 : _a.RuntimeCaching) === null || _b === void 0 ? void 0 : _b.properties) === null || _c === void 0 ? void 0 : _c.handler) === null || _d === void 0 ? void 0 : _d.anyOf) || []) {
- if ('enum' in handler) {
- validHandlers = handler.enum;
- break;
- }
- }
- /* eslint-enable */
- for (const runtimeCaching of options.runtimeCaching || []) {
- if (typeof runtimeCaching.handler === 'string' &&
- !validHandlers.includes(runtimeCaching.handler)) {
- throw new WorkboxConfigError(errors_1.errors['invalid-handler-string'] + runtimeCaching.handler);
- }
- }
- }
- function validateGenerateSWOptions(input) {
- const [validatedOptions, jsonSchema] = validate(input, 'GenerateSW');
- ensureValidNavigationPreloadConfig(validatedOptions);
- ensureValidCacheExpiration(validatedOptions);
- ensureValidRuntimeCachingOrGlobDirectory(validatedOptions);
- ensureValidStringHandler(validatedOptions, jsonSchema);
- return validatedOptions;
- }
- exports.validateGenerateSWOptions = validateGenerateSWOptions;
- function validateGetManifestOptions(input) {
- const [validatedOptions] = validate(input, 'GetManifest');
- return validatedOptions;
- }
- exports.validateGetManifestOptions = validateGetManifestOptions;
- function validateInjectManifestOptions(input) {
- const [validatedOptions] = validate(input, 'InjectManifest');
- return validatedOptions;
- }
- exports.validateInjectManifestOptions = validateInjectManifestOptions;
- // The default `exclude: [/\.map$/, /^manifest.*\.js$/]` value can't be
- // represented in the JSON schema, so manually set it for the webpack options.
- function validateWebpackGenerateSWOptions(input) {
- const inputWithExcludeDefault = Object.assign({
- // Make a copy, as exclude can be mutated when used.
- exclude: Array.from(DEFAULT_EXCLUDE_VALUE),
- }, input);
- const [validatedOptions, jsonSchema] = validate(inputWithExcludeDefault, 'WebpackGenerateSW');
- ensureValidNavigationPreloadConfig(validatedOptions);
- ensureValidCacheExpiration(validatedOptions);
- ensureValidStringHandler(validatedOptions, jsonSchema);
- return validatedOptions;
- }
- exports.validateWebpackGenerateSWOptions = validateWebpackGenerateSWOptions;
- function validateWebpackInjectManifestOptions(input) {
- const inputWithExcludeDefault = Object.assign({
- // Make a copy, as exclude can be mutated when used.
- exclude: Array.from(DEFAULT_EXCLUDE_VALUE),
- }, input);
- const [validatedOptions] = validate(inputWithExcludeDefault, 'WebpackInjectManifest');
- return validatedOptions;
- }
- exports.validateWebpackInjectManifestOptions = validateWebpackInjectManifestOptions;
|