2046 lines
68 KiB
JavaScript
2046 lines
68 KiB
JavaScript
// node_modules/workbox-core/_version.js
|
|
try {
|
|
self["workbox:core:5.1.4"] && _();
|
|
} catch (e) {
|
|
}
|
|
|
|
// node_modules/workbox-core/_private/logger.js
|
|
var logger = (() => {
|
|
if (!("__WB_DISABLE_DEV_LOGS" in self)) {
|
|
self.__WB_DISABLE_DEV_LOGS = false;
|
|
}
|
|
let inGroup = false;
|
|
const methodToColorMap = {
|
|
debug: `#7f8c8d`,
|
|
log: `#2ecc71`,
|
|
warn: `#f39c12`,
|
|
error: `#c0392b`,
|
|
groupCollapsed: `#3498db`,
|
|
groupEnd: null
|
|
};
|
|
const print = function(method, args) {
|
|
if (self.__WB_DISABLE_DEV_LOGS) {
|
|
return;
|
|
}
|
|
if (method === "groupCollapsed") {
|
|
if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {
|
|
console[method](...args);
|
|
return;
|
|
}
|
|
}
|
|
const styles = [
|
|
`background: ${methodToColorMap[method]}`,
|
|
`border-radius: 0.5em`,
|
|
`color: white`,
|
|
`font-weight: bold`,
|
|
`padding: 2px 0.5em`
|
|
];
|
|
const logPrefix = inGroup ? [] : ["%cworkbox", styles.join(";")];
|
|
console[method](...logPrefix, ...args);
|
|
if (method === "groupCollapsed") {
|
|
inGroup = true;
|
|
}
|
|
if (method === "groupEnd") {
|
|
inGroup = false;
|
|
}
|
|
};
|
|
const api = {};
|
|
const loggerMethods = Object.keys(methodToColorMap);
|
|
for (const key of loggerMethods) {
|
|
const method = key;
|
|
api[method] = (...args) => {
|
|
print(method, args);
|
|
};
|
|
}
|
|
return api;
|
|
})();
|
|
|
|
// node_modules/workbox-core/models/messages/messages.js
|
|
var messages = {
|
|
"invalid-value": ({ paramName, validValueDescription, value }) => {
|
|
if (!paramName || !validValueDescription) {
|
|
throw new Error(`Unexpected input to 'invalid-value' error.`);
|
|
}
|
|
return `The '${paramName}' parameter was given a value with an ` + `unexpected value. ${validValueDescription} Received a value of ` + `${JSON.stringify(value)}.`;
|
|
},
|
|
"not-an-array": ({ moduleName, className, funcName, paramName }) => {
|
|
if (!moduleName || !className || !funcName || !paramName) {
|
|
throw new Error(`Unexpected input to 'not-an-array' error.`);
|
|
}
|
|
return `The parameter '${paramName}' passed into ` + `'${moduleName}.${className}.${funcName}()' must be an array.`;
|
|
},
|
|
"incorrect-type": ({ expectedType, paramName, moduleName, className, funcName }) => {
|
|
if (!expectedType || !paramName || !moduleName || !funcName) {
|
|
throw new Error(`Unexpected input to 'incorrect-type' error.`);
|
|
}
|
|
return `The parameter '${paramName}' passed into ` + `'${moduleName}.${className ? className + "." : ""}` + `${funcName}()' must be of type ${expectedType}.`;
|
|
},
|
|
"incorrect-class": ({ expectedClass, paramName, moduleName, className, funcName, isReturnValueProblem }) => {
|
|
if (!expectedClass || !moduleName || !funcName) {
|
|
throw new Error(`Unexpected input to 'incorrect-class' error.`);
|
|
}
|
|
if (isReturnValueProblem) {
|
|
return `The return value from ` + `'${moduleName}.${className ? className + "." : ""}${funcName}()' ` + `must be an instance of class ${expectedClass.name}.`;
|
|
}
|
|
return `The parameter '${paramName}' passed into ` + `'${moduleName}.${className ? className + "." : ""}${funcName}()' ` + `must be an instance of class ${expectedClass.name}.`;
|
|
},
|
|
"missing-a-method": ({ expectedMethod, paramName, moduleName, className, funcName }) => {
|
|
if (!expectedMethod || !paramName || !moduleName || !className || !funcName) {
|
|
throw new Error(`Unexpected input to 'missing-a-method' error.`);
|
|
}
|
|
return `${moduleName}.${className}.${funcName}() expected the ` + `'${paramName}' parameter to expose a '${expectedMethod}' method.`;
|
|
},
|
|
"add-to-cache-list-unexpected-type": ({ entry }) => {
|
|
return `An unexpected entry was passed to ` + `'workbox-precaching.PrecacheController.addToCacheList()' The entry ` + `'${JSON.stringify(entry)}' isn't supported. You must supply an array of ` + `strings with one or more characters, objects with a url property or ` + `Request objects.`;
|
|
},
|
|
"add-to-cache-list-conflicting-entries": ({ firstEntry, secondEntry }) => {
|
|
if (!firstEntry || !secondEntry) {
|
|
throw new Error(`Unexpected input to ` + `'add-to-cache-list-duplicate-entries' error.`);
|
|
}
|
|
return `Two of the entries passed to ` + `'workbox-precaching.PrecacheController.addToCacheList()' had the URL ` + `${firstEntry._entryId} but different revision details. Workbox is ` + `unable to cache and version the asset correctly. Please remove one ` + `of the entries.`;
|
|
},
|
|
"plugin-error-request-will-fetch": ({ thrownError }) => {
|
|
if (!thrownError) {
|
|
throw new Error(`Unexpected input to ` + `'plugin-error-request-will-fetch', error.`);
|
|
}
|
|
return `An error was thrown by a plugins 'requestWillFetch()' method. ` + `The thrown error message was: '${thrownError.message}'.`;
|
|
},
|
|
"invalid-cache-name": ({ cacheNameId, value }) => {
|
|
if (!cacheNameId) {
|
|
throw new Error(`Expected a 'cacheNameId' for error 'invalid-cache-name'`);
|
|
}
|
|
return `You must provide a name containing at least one character for ` + `setCacheDetails({${cacheNameId}: '...'}). Received a value of ` + `'${JSON.stringify(value)}'`;
|
|
},
|
|
"unregister-route-but-not-found-with-method": ({ method }) => {
|
|
if (!method) {
|
|
throw new Error(`Unexpected input to ` + `'unregister-route-but-not-found-with-method' error.`);
|
|
}
|
|
return `The route you're trying to unregister was not previously ` + `registered for the method type '${method}'.`;
|
|
},
|
|
"unregister-route-route-not-registered": () => {
|
|
return `The route you're trying to unregister was not previously ` + `registered.`;
|
|
},
|
|
"queue-replay-failed": ({ name }) => {
|
|
return `Replaying the background sync queue '${name}' failed.`;
|
|
},
|
|
"duplicate-queue-name": ({ name }) => {
|
|
return `The Queue name '${name}' is already being used. ` + `All instances of backgroundSync.Queue must be given unique names.`;
|
|
},
|
|
"expired-test-without-max-age": ({ methodName, paramName }) => {
|
|
return `The '${methodName}()' method can only be used when the ` + `'${paramName}' is used in the constructor.`;
|
|
},
|
|
"unsupported-route-type": ({ moduleName, className, funcName, paramName }) => {
|
|
return `The supplied '${paramName}' parameter was an unsupported type. ` + `Please check the docs for ${moduleName}.${className}.${funcName} for ` + `valid input types.`;
|
|
},
|
|
"not-array-of-class": ({ value, expectedClass, moduleName, className, funcName, paramName }) => {
|
|
return `The supplied '${paramName}' parameter must be an array of ` + `'${expectedClass}' objects. Received '${JSON.stringify(value)},'. ` + `Please check the call to ${moduleName}.${className}.${funcName}() ` + `to fix the issue.`;
|
|
},
|
|
"max-entries-or-age-required": ({ moduleName, className, funcName }) => {
|
|
return `You must define either config.maxEntries or config.maxAgeSeconds` + `in ${moduleName}.${className}.${funcName}`;
|
|
},
|
|
"statuses-or-headers-required": ({ moduleName, className, funcName }) => {
|
|
return `You must define either config.statuses or config.headers` + `in ${moduleName}.${className}.${funcName}`;
|
|
},
|
|
"invalid-string": ({ moduleName, funcName, paramName }) => {
|
|
if (!paramName || !moduleName || !funcName) {
|
|
throw new Error(`Unexpected input to 'invalid-string' error.`);
|
|
}
|
|
return `When using strings, the '${paramName}' parameter must start with ` + `'http' (for cross-origin matches) or '/' (for same-origin matches). ` + `Please see the docs for ${moduleName}.${funcName}() for ` + `more info.`;
|
|
},
|
|
"channel-name-required": () => {
|
|
return `You must provide a channelName to construct a ` + `BroadcastCacheUpdate instance.`;
|
|
},
|
|
"invalid-responses-are-same-args": () => {
|
|
return `The arguments passed into responsesAreSame() appear to be ` + `invalid. Please ensure valid Responses are used.`;
|
|
},
|
|
"expire-custom-caches-only": () => {
|
|
return `You must provide a 'cacheName' property when using the ` + `expiration plugin with a runtime caching strategy.`;
|
|
},
|
|
"unit-must-be-bytes": ({ normalizedRangeHeader }) => {
|
|
if (!normalizedRangeHeader) {
|
|
throw new Error(`Unexpected input to 'unit-must-be-bytes' error.`);
|
|
}
|
|
return `The 'unit' portion of the Range header must be set to 'bytes'. ` + `The Range header provided was "${normalizedRangeHeader}"`;
|
|
},
|
|
"single-range-only": ({ normalizedRangeHeader }) => {
|
|
if (!normalizedRangeHeader) {
|
|
throw new Error(`Unexpected input to 'single-range-only' error.`);
|
|
}
|
|
return `Multiple ranges are not supported. Please use a single start ` + `value, and optional end value. The Range header provided was ` + `"${normalizedRangeHeader}"`;
|
|
},
|
|
"invalid-range-values": ({ normalizedRangeHeader }) => {
|
|
if (!normalizedRangeHeader) {
|
|
throw new Error(`Unexpected input to 'invalid-range-values' error.`);
|
|
}
|
|
return `The Range header is missing both start and end values. At least ` + `one of those values is needed. The Range header provided was ` + `"${normalizedRangeHeader}"`;
|
|
},
|
|
"no-range-header": () => {
|
|
return `No Range header was found in the Request provided.`;
|
|
},
|
|
"range-not-satisfiable": ({ size, start, end }) => {
|
|
return `The start (${start}) and end (${end}) values in the Range are ` + `not satisfiable by the cached response, which is ${size} bytes.`;
|
|
},
|
|
"attempt-to-cache-non-get-request": ({ url, method }) => {
|
|
return `Unable to cache '${url}' because it is a '${method}' request and ` + `only 'GET' requests can be cached.`;
|
|
},
|
|
"cache-put-with-no-response": ({ url }) => {
|
|
return `There was an attempt to cache '${url}' but the response was not ` + `defined.`;
|
|
},
|
|
"no-response": ({ url, error }) => {
|
|
let message = `The strategy could not generate a response for '${url}'.`;
|
|
if (error) {
|
|
message += ` The underlying error is ${error}.`;
|
|
}
|
|
return message;
|
|
},
|
|
"bad-precaching-response": ({ url, status }) => {
|
|
return `The precaching request for '${url}' failed with an HTTP ` + `status of ${status}.`;
|
|
},
|
|
"non-precached-url": ({ url }) => {
|
|
return `createHandlerBoundToURL('${url}') was called, but that URL is ` + `not precached. Please pass in a URL that is precached instead.`;
|
|
},
|
|
"add-to-cache-list-conflicting-integrities": ({ url }) => {
|
|
return `Two of the entries passed to ` + `'workbox-precaching.PrecacheController.addToCacheList()' had the URL ` + `${url} with different integrity values. Please remove one of them.`;
|
|
},
|
|
"missing-precache-entry": ({ cacheName, url }) => {
|
|
return `Unable to find a precached response in ${cacheName} for ${url}.`;
|
|
}
|
|
};
|
|
|
|
// node_modules/workbox-core/models/messages/messageGenerator.js
|
|
var generatorFunction = (code, details = {}) => {
|
|
const message = messages[code];
|
|
if (!message) {
|
|
throw new Error(`Unable to find message for code '${code}'.`);
|
|
}
|
|
return message(details);
|
|
};
|
|
var messageGenerator = generatorFunction;
|
|
|
|
// node_modules/workbox-core/_private/WorkboxError.js
|
|
class WorkboxError extends Error {
|
|
constructor(errorCode, details) {
|
|
const message = messageGenerator(errorCode, details);
|
|
super(message);
|
|
this.name = errorCode;
|
|
this.details = details;
|
|
}
|
|
}
|
|
|
|
// node_modules/workbox-core/_private/assert.js
|
|
var isArray = (value, details) => {
|
|
if (!Array.isArray(value)) {
|
|
throw new WorkboxError("not-an-array", details);
|
|
}
|
|
};
|
|
var hasMethod = (object, expectedMethod, details) => {
|
|
const type = typeof object[expectedMethod];
|
|
if (type !== "function") {
|
|
details["expectedMethod"] = expectedMethod;
|
|
throw new WorkboxError("missing-a-method", details);
|
|
}
|
|
};
|
|
var isType = (object, expectedType, details) => {
|
|
if (typeof object !== expectedType) {
|
|
details["expectedType"] = expectedType;
|
|
throw new WorkboxError("incorrect-type", details);
|
|
}
|
|
};
|
|
var isInstance = (object, expectedClass, details) => {
|
|
if (!(object instanceof expectedClass)) {
|
|
details["expectedClass"] = expectedClass;
|
|
throw new WorkboxError("incorrect-class", details);
|
|
}
|
|
};
|
|
var isOneOf = (value, validValues, details) => {
|
|
if (!validValues.includes(value)) {
|
|
details["validValueDescription"] = `Valid values are ${JSON.stringify(validValues)}.`;
|
|
throw new WorkboxError("invalid-value", details);
|
|
}
|
|
};
|
|
var isArrayOfClass = (value, expectedClass, details) => {
|
|
const error = new WorkboxError("not-array-of-class", details);
|
|
if (!Array.isArray(value)) {
|
|
throw error;
|
|
}
|
|
for (const item of value) {
|
|
if (!(item instanceof expectedClass)) {
|
|
throw error;
|
|
}
|
|
}
|
|
};
|
|
var finalAssertExports = {
|
|
hasMethod,
|
|
isArray,
|
|
isInstance,
|
|
isOneOf,
|
|
isType,
|
|
isArrayOfClass
|
|
};
|
|
|
|
// node_modules/workbox-core/models/quotaErrorCallbacks.js
|
|
var quotaErrorCallbacks = new Set;
|
|
|
|
// node_modules/workbox-core/registerQuotaErrorCallback.js
|
|
function registerQuotaErrorCallback(callback) {
|
|
if (true) {
|
|
finalAssertExports.isType(callback, "function", {
|
|
moduleName: "workbox-core",
|
|
funcName: "register",
|
|
paramName: "callback"
|
|
});
|
|
}
|
|
quotaErrorCallbacks.add(callback);
|
|
if (true) {
|
|
logger.log("Registered a callback to respond to quota errors.", callback);
|
|
}
|
|
}
|
|
|
|
// node_modules/workbox-core/_private/cacheNames.js
|
|
var _cacheNameDetails = {
|
|
googleAnalytics: "googleAnalytics",
|
|
precache: "precache-v2",
|
|
prefix: "workbox",
|
|
runtime: "runtime",
|
|
suffix: typeof registration !== "undefined" ? registration.scope : ""
|
|
};
|
|
var _createCacheName = (cacheName) => {
|
|
return [_cacheNameDetails.prefix, cacheName, _cacheNameDetails.suffix].filter((value) => value && value.length > 0).join("-");
|
|
};
|
|
var eachCacheNameDetail = (fn) => {
|
|
for (const key of Object.keys(_cacheNameDetails)) {
|
|
fn(key);
|
|
}
|
|
};
|
|
var cacheNames = {
|
|
updateDetails: (details) => {
|
|
eachCacheNameDetail((key) => {
|
|
if (typeof details[key] === "string") {
|
|
_cacheNameDetails[key] = details[key];
|
|
}
|
|
});
|
|
},
|
|
getGoogleAnalyticsName: (userCacheName) => {
|
|
return userCacheName || _createCacheName(_cacheNameDetails.googleAnalytics);
|
|
},
|
|
getPrecacheName: (userCacheName) => {
|
|
return userCacheName || _createCacheName(_cacheNameDetails.precache);
|
|
},
|
|
getPrefix: () => {
|
|
return _cacheNameDetails.prefix;
|
|
},
|
|
getRuntimeName: (userCacheName) => {
|
|
return userCacheName || _createCacheName(_cacheNameDetails.runtime);
|
|
},
|
|
getSuffix: () => {
|
|
return _cacheNameDetails.suffix;
|
|
}
|
|
};
|
|
|
|
// node_modules/workbox-core/_private/executeQuotaErrorCallbacks.js
|
|
async function executeQuotaErrorCallbacks() {
|
|
if (true) {
|
|
logger.log(`About to run ${quotaErrorCallbacks.size} ` + `callbacks to clean up caches.`);
|
|
}
|
|
for (const callback of quotaErrorCallbacks) {
|
|
await callback();
|
|
if (true) {
|
|
logger.log(callback, "is complete.");
|
|
}
|
|
}
|
|
if (true) {
|
|
logger.log("Finished running callbacks.");
|
|
}
|
|
}
|
|
|
|
// node_modules/workbox-core/_private/getFriendlyURL.js
|
|
var getFriendlyURL = (url) => {
|
|
const urlObj = new URL(String(url), location.href);
|
|
return urlObj.href.replace(new RegExp(`^${location.origin}`), "");
|
|
};
|
|
|
|
// node_modules/workbox-core/utils/pluginUtils.js
|
|
var pluginUtils = {
|
|
filter: (plugins, callbackName) => {
|
|
return plugins.filter((plugin) => (callbackName in plugin));
|
|
}
|
|
};
|
|
|
|
// node_modules/workbox-core/_private/cacheWrapper.js
|
|
var _getEffectiveRequest = async ({ request, mode, plugins = [] }) => {
|
|
const cacheKeyWillBeUsedPlugins = pluginUtils.filter(plugins, "cacheKeyWillBeUsed");
|
|
let effectiveRequest = request;
|
|
for (const plugin of cacheKeyWillBeUsedPlugins) {
|
|
effectiveRequest = await plugin["cacheKeyWillBeUsed"].call(plugin, { mode, request: effectiveRequest });
|
|
if (typeof effectiveRequest === "string") {
|
|
effectiveRequest = new Request(effectiveRequest);
|
|
}
|
|
if (true) {
|
|
finalAssertExports.isInstance(effectiveRequest, Request, {
|
|
moduleName: "Plugin",
|
|
funcName: "cacheKeyWillBeUsed",
|
|
isReturnValueProblem: true
|
|
});
|
|
}
|
|
}
|
|
return effectiveRequest;
|
|
};
|
|
var _isResponseSafeToCache = async ({ request, response, event, plugins = [] }) => {
|
|
let responseToCache = response;
|
|
let pluginsUsed = false;
|
|
for (const plugin of plugins) {
|
|
if ("cacheWillUpdate" in plugin) {
|
|
pluginsUsed = true;
|
|
const pluginMethod = plugin["cacheWillUpdate"];
|
|
responseToCache = await pluginMethod.call(plugin, {
|
|
request,
|
|
response: responseToCache,
|
|
event
|
|
});
|
|
if (true) {
|
|
if (responseToCache) {
|
|
finalAssertExports.isInstance(responseToCache, Response, {
|
|
moduleName: "Plugin",
|
|
funcName: "cacheWillUpdate",
|
|
isReturnValueProblem: true
|
|
});
|
|
}
|
|
}
|
|
if (!responseToCache) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (!pluginsUsed) {
|
|
if (true) {
|
|
if (responseToCache) {
|
|
if (responseToCache.status !== 200) {
|
|
if (responseToCache.status === 0) {
|
|
logger.warn(`The response for '${request.url}' is an opaque ` + `response. The caching strategy that you're using will not ` + `cache opaque responses by default.`);
|
|
} else {
|
|
logger.debug(`The response for '${request.url}' returned ` + `a status code of '${response.status}' and won't be cached as a ` + `result.`);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
responseToCache = responseToCache && responseToCache.status === 200 ? responseToCache : undefined;
|
|
}
|
|
return responseToCache ? responseToCache : null;
|
|
};
|
|
var matchWrapper = async ({ cacheName, request, event, matchOptions, plugins = [] }) => {
|
|
const cache = await self.caches.open(cacheName);
|
|
const effectiveRequest = await _getEffectiveRequest({
|
|
plugins,
|
|
request,
|
|
mode: "read"
|
|
});
|
|
let cachedResponse = await cache.match(effectiveRequest, matchOptions);
|
|
if (true) {
|
|
if (cachedResponse) {
|
|
logger.debug(`Found a cached response in '${cacheName}'.`);
|
|
} else {
|
|
logger.debug(`No cached response found in '${cacheName}'.`);
|
|
}
|
|
}
|
|
for (const plugin of plugins) {
|
|
if ("cachedResponseWillBeUsed" in plugin) {
|
|
const pluginMethod = plugin["cachedResponseWillBeUsed"];
|
|
cachedResponse = await pluginMethod.call(plugin, {
|
|
cacheName,
|
|
event,
|
|
matchOptions,
|
|
cachedResponse,
|
|
request: effectiveRequest
|
|
});
|
|
if (true) {
|
|
if (cachedResponse) {
|
|
finalAssertExports.isInstance(cachedResponse, Response, {
|
|
moduleName: "Plugin",
|
|
funcName: "cachedResponseWillBeUsed",
|
|
isReturnValueProblem: true
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return cachedResponse;
|
|
};
|
|
var putWrapper = async ({ cacheName, request, response, event, plugins = [], matchOptions }) => {
|
|
if (true) {
|
|
if (request.method && request.method !== "GET") {
|
|
throw new WorkboxError("attempt-to-cache-non-get-request", {
|
|
url: getFriendlyURL(request.url),
|
|
method: request.method
|
|
});
|
|
}
|
|
}
|
|
const effectiveRequest = await _getEffectiveRequest({
|
|
plugins,
|
|
request,
|
|
mode: "write"
|
|
});
|
|
if (!response) {
|
|
if (true) {
|
|
logger.error(`Cannot cache non-existent response for ` + `'${getFriendlyURL(effectiveRequest.url)}'.`);
|
|
}
|
|
throw new WorkboxError("cache-put-with-no-response", {
|
|
url: getFriendlyURL(effectiveRequest.url)
|
|
});
|
|
}
|
|
const responseToCache = await _isResponseSafeToCache({
|
|
event,
|
|
plugins,
|
|
response,
|
|
request: effectiveRequest
|
|
});
|
|
if (!responseToCache) {
|
|
if (true) {
|
|
logger.debug(`Response '${getFriendlyURL(effectiveRequest.url)}' will ` + `not be cached.`, responseToCache);
|
|
}
|
|
return;
|
|
}
|
|
const cache = await self.caches.open(cacheName);
|
|
const updatePlugins = pluginUtils.filter(plugins, "cacheDidUpdate");
|
|
const oldResponse = updatePlugins.length > 0 ? await matchWrapper({ cacheName, matchOptions, request: effectiveRequest }) : null;
|
|
if (true) {
|
|
logger.debug(`Updating the '${cacheName}' cache with a new Response for ` + `${getFriendlyURL(effectiveRequest.url)}.`);
|
|
}
|
|
try {
|
|
await cache.put(effectiveRequest, responseToCache);
|
|
} catch (error) {
|
|
if (error.name === "QuotaExceededError") {
|
|
await executeQuotaErrorCallbacks();
|
|
}
|
|
throw error;
|
|
}
|
|
for (const plugin of updatePlugins) {
|
|
await plugin["cacheDidUpdate"].call(plugin, {
|
|
cacheName,
|
|
event,
|
|
oldResponse,
|
|
newResponse: responseToCache,
|
|
request: effectiveRequest
|
|
});
|
|
}
|
|
};
|
|
var cacheWrapper = {
|
|
put: putWrapper,
|
|
match: matchWrapper
|
|
};
|
|
|
|
// node_modules/workbox-core/_private/canConstructResponseFromBodyStream.js
|
|
function canConstructResponseFromBodyStream() {
|
|
if (supportStatus === undefined) {
|
|
const testResponse = new Response("");
|
|
if ("body" in testResponse) {
|
|
try {
|
|
new Response(testResponse.body);
|
|
supportStatus = true;
|
|
} catch (error) {
|
|
supportStatus = false;
|
|
}
|
|
}
|
|
supportStatus = false;
|
|
}
|
|
return supportStatus;
|
|
}
|
|
var supportStatus;
|
|
|
|
// node_modules/workbox-core/_private/dontWaitFor.js
|
|
function dontWaitFor(promise) {
|
|
promise.then(() => {
|
|
});
|
|
}
|
|
|
|
// node_modules/workbox-core/_private/DBWrapper.js
|
|
class DBWrapper {
|
|
constructor(name, version, { onupgradeneeded, onversionchange } = {}) {
|
|
this._db = null;
|
|
this._name = name;
|
|
this._version = version;
|
|
this._onupgradeneeded = onupgradeneeded;
|
|
this._onversionchange = onversionchange || (() => this.close());
|
|
}
|
|
get db() {
|
|
return this._db;
|
|
}
|
|
async open() {
|
|
if (this._db)
|
|
return;
|
|
this._db = await new Promise((resolve, reject) => {
|
|
let openRequestTimedOut = false;
|
|
setTimeout(() => {
|
|
openRequestTimedOut = true;
|
|
reject(new Error("The open request was blocked and timed out"));
|
|
}, this.OPEN_TIMEOUT);
|
|
const openRequest = indexedDB.open(this._name, this._version);
|
|
openRequest.onerror = () => reject(openRequest.error);
|
|
openRequest.onupgradeneeded = (evt) => {
|
|
if (openRequestTimedOut) {
|
|
openRequest.transaction.abort();
|
|
openRequest.result.close();
|
|
} else if (typeof this._onupgradeneeded === "function") {
|
|
this._onupgradeneeded(evt);
|
|
}
|
|
};
|
|
openRequest.onsuccess = () => {
|
|
const db = openRequest.result;
|
|
if (openRequestTimedOut) {
|
|
db.close();
|
|
} else {
|
|
db.onversionchange = this._onversionchange.bind(this);
|
|
resolve(db);
|
|
}
|
|
};
|
|
});
|
|
return this;
|
|
}
|
|
async getKey(storeName, query) {
|
|
return (await this.getAllKeys(storeName, query, 1))[0];
|
|
}
|
|
async getAll(storeName, query, count) {
|
|
return await this.getAllMatching(storeName, { query, count });
|
|
}
|
|
async getAllKeys(storeName, query, count) {
|
|
const entries = await this.getAllMatching(storeName, { query, count, includeKeys: true });
|
|
return entries.map((entry) => entry.key);
|
|
}
|
|
async getAllMatching(storeName, {
|
|
index,
|
|
query = null,
|
|
direction = "next",
|
|
count,
|
|
includeKeys = false
|
|
} = {}) {
|
|
return await this.transaction([storeName], "readonly", (txn, done) => {
|
|
const store = txn.objectStore(storeName);
|
|
const target = index ? store.index(index) : store;
|
|
const results = [];
|
|
const request = target.openCursor(query, direction);
|
|
request.onsuccess = () => {
|
|
const cursor = request.result;
|
|
if (cursor) {
|
|
results.push(includeKeys ? cursor : cursor.value);
|
|
if (count && results.length >= count) {
|
|
done(results);
|
|
} else {
|
|
cursor.continue();
|
|
}
|
|
} else {
|
|
done(results);
|
|
}
|
|
};
|
|
});
|
|
}
|
|
async transaction(storeNames, type, callback) {
|
|
await this.open();
|
|
return await new Promise((resolve, reject) => {
|
|
const txn = this._db.transaction(storeNames, type);
|
|
txn.onabort = () => reject(txn.error);
|
|
txn.oncomplete = () => resolve();
|
|
callback(txn, (value) => resolve(value));
|
|
});
|
|
}
|
|
async _call(method, storeName, type, ...args) {
|
|
const callback = (txn, done) => {
|
|
const objStore = txn.objectStore(storeName);
|
|
const request = objStore[method].apply(objStore, args);
|
|
request.onsuccess = () => done(request.result);
|
|
};
|
|
return await this.transaction([storeName], type, callback);
|
|
}
|
|
close() {
|
|
if (this._db) {
|
|
this._db.close();
|
|
this._db = null;
|
|
}
|
|
}
|
|
}
|
|
DBWrapper.prototype.OPEN_TIMEOUT = 2000;
|
|
var methodsToWrap = {
|
|
readonly: ["get", "count", "getKey", "getAll", "getAllKeys"],
|
|
readwrite: ["add", "put", "clear", "delete"]
|
|
};
|
|
for (const [mode, methods] of Object.entries(methodsToWrap)) {
|
|
for (const method of methods) {
|
|
if (method in IDBObjectStore.prototype) {
|
|
DBWrapper.prototype[method] = async function(storeName, ...args) {
|
|
return await this._call(method, storeName, mode, ...args);
|
|
};
|
|
}
|
|
}
|
|
}
|
|
|
|
// node_modules/workbox-core/_private/deleteDatabase.js
|
|
var deleteDatabase = async (name) => {
|
|
await new Promise((resolve, reject) => {
|
|
const request = indexedDB.deleteDatabase(name);
|
|
request.onerror = () => {
|
|
reject(request.error);
|
|
};
|
|
request.onblocked = () => {
|
|
reject(new Error("Delete blocked"));
|
|
};
|
|
request.onsuccess = () => {
|
|
resolve();
|
|
};
|
|
});
|
|
};
|
|
|
|
// node_modules/workbox-core/_private/fetchWrapper.js
|
|
var wrappedFetch = async ({ request, fetchOptions, event, plugins = [] }) => {
|
|
if (typeof request === "string") {
|
|
request = new Request(request);
|
|
}
|
|
if (event instanceof FetchEvent && event.preloadResponse) {
|
|
const possiblePreloadResponse = await event.preloadResponse;
|
|
if (possiblePreloadResponse) {
|
|
if (true) {
|
|
logger.log(`Using a preloaded navigation response for ` + `'${getFriendlyURL(request.url)}'`);
|
|
}
|
|
return possiblePreloadResponse;
|
|
}
|
|
}
|
|
if (true) {
|
|
finalAssertExports.isInstance(request, Request, {
|
|
paramName: "request",
|
|
expectedClass: Request,
|
|
moduleName: "workbox-core",
|
|
className: "fetchWrapper",
|
|
funcName: "wrappedFetch"
|
|
});
|
|
}
|
|
const failedFetchPlugins = pluginUtils.filter(plugins, "fetchDidFail");
|
|
const originalRequest = failedFetchPlugins.length > 0 ? request.clone() : null;
|
|
try {
|
|
for (const plugin of plugins) {
|
|
if ("requestWillFetch" in plugin) {
|
|
const pluginMethod = plugin["requestWillFetch"];
|
|
const requestClone = request.clone();
|
|
request = await pluginMethod.call(plugin, {
|
|
request: requestClone,
|
|
event
|
|
});
|
|
if (true) {
|
|
if (request) {
|
|
finalAssertExports.isInstance(request, Request, {
|
|
moduleName: "Plugin",
|
|
funcName: "cachedResponseWillBeUsed",
|
|
isReturnValueProblem: true
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} catch (err) {
|
|
throw new WorkboxError("plugin-error-request-will-fetch", {
|
|
thrownError: err
|
|
});
|
|
}
|
|
const pluginFilteredRequest = request.clone();
|
|
try {
|
|
let fetchResponse;
|
|
if (request.mode === "navigate") {
|
|
fetchResponse = await fetch(request);
|
|
} else {
|
|
fetchResponse = await fetch(request, fetchOptions);
|
|
}
|
|
if (true) {
|
|
logger.debug(`Network request for ` + `'${getFriendlyURL(request.url)}' returned a response with ` + `status '${fetchResponse.status}'.`);
|
|
}
|
|
for (const plugin of plugins) {
|
|
if ("fetchDidSucceed" in plugin) {
|
|
fetchResponse = await plugin["fetchDidSucceed"].call(plugin, {
|
|
event,
|
|
request: pluginFilteredRequest,
|
|
response: fetchResponse
|
|
});
|
|
if (true) {
|
|
if (fetchResponse) {
|
|
finalAssertExports.isInstance(fetchResponse, Response, {
|
|
moduleName: "Plugin",
|
|
funcName: "fetchDidSucceed",
|
|
isReturnValueProblem: true
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return fetchResponse;
|
|
} catch (error) {
|
|
if (true) {
|
|
logger.error(`Network request for ` + `'${getFriendlyURL(request.url)}' threw an error.`, error);
|
|
}
|
|
for (const plugin of failedFetchPlugins) {
|
|
await plugin["fetchDidFail"].call(plugin, {
|
|
error,
|
|
event,
|
|
originalRequest: originalRequest.clone(),
|
|
request: pluginFilteredRequest.clone()
|
|
});
|
|
}
|
|
throw error;
|
|
}
|
|
};
|
|
var fetchWrapper = {
|
|
fetch: wrappedFetch
|
|
};
|
|
|
|
// node_modules/workbox-core/copyResponse.js
|
|
async function copyResponse(response, modifier) {
|
|
const clonedResponse = response.clone();
|
|
const responseInit = {
|
|
headers: new Headers(clonedResponse.headers),
|
|
status: clonedResponse.status,
|
|
statusText: clonedResponse.statusText
|
|
};
|
|
const modifiedResponseInit = modifier ? modifier(responseInit) : responseInit;
|
|
const body = canConstructResponseFromBodyStream() ? clonedResponse.body : await clonedResponse.blob();
|
|
return new Response(body, modifiedResponseInit);
|
|
}
|
|
|
|
// node_modules/workbox-core/clientsClaim.js
|
|
function clientsClaim() {
|
|
self.addEventListener("activate", () => self.clients.claim());
|
|
}
|
|
// node_modules/workbox-expiration/_version.js
|
|
try {
|
|
self["workbox:expiration:5.1.4"] && _();
|
|
} catch (e) {
|
|
}
|
|
|
|
// node_modules/workbox-expiration/models/CacheTimestampsModel.js
|
|
var DB_NAME = "workbox-expiration";
|
|
var OBJECT_STORE_NAME = "cache-entries";
|
|
var normalizeURL = (unNormalizedUrl) => {
|
|
const url = new URL(unNormalizedUrl, location.href);
|
|
url.hash = "";
|
|
return url.href;
|
|
};
|
|
|
|
class CacheTimestampsModel {
|
|
constructor(cacheName) {
|
|
this._cacheName = cacheName;
|
|
this._db = new DBWrapper(DB_NAME, 1, {
|
|
onupgradeneeded: (event) => this._handleUpgrade(event)
|
|
});
|
|
}
|
|
_handleUpgrade(event) {
|
|
const db = event.target.result;
|
|
const objStore = db.createObjectStore(OBJECT_STORE_NAME, { keyPath: "id" });
|
|
objStore.createIndex("cacheName", "cacheName", { unique: false });
|
|
objStore.createIndex("timestamp", "timestamp", { unique: false });
|
|
deleteDatabase(this._cacheName);
|
|
}
|
|
async setTimestamp(url, timestamp) {
|
|
url = normalizeURL(url);
|
|
const entry = {
|
|
url,
|
|
timestamp,
|
|
cacheName: this._cacheName,
|
|
id: this._getId(url)
|
|
};
|
|
await this._db.put(OBJECT_STORE_NAME, entry);
|
|
}
|
|
async getTimestamp(url) {
|
|
const entry = await this._db.get(OBJECT_STORE_NAME, this._getId(url));
|
|
return entry.timestamp;
|
|
}
|
|
async expireEntries(minTimestamp, maxCount) {
|
|
const entriesToDelete = await this._db.transaction(OBJECT_STORE_NAME, "readwrite", (txn, done) => {
|
|
const store = txn.objectStore(OBJECT_STORE_NAME);
|
|
const request = store.index("timestamp").openCursor(null, "prev");
|
|
const entriesToDelete2 = [];
|
|
let entriesNotDeletedCount = 0;
|
|
request.onsuccess = () => {
|
|
const cursor = request.result;
|
|
if (cursor) {
|
|
const result = cursor.value;
|
|
if (result.cacheName === this._cacheName) {
|
|
if (minTimestamp && result.timestamp < minTimestamp || maxCount && entriesNotDeletedCount >= maxCount) {
|
|
entriesToDelete2.push(cursor.value);
|
|
} else {
|
|
entriesNotDeletedCount++;
|
|
}
|
|
}
|
|
cursor.continue();
|
|
} else {
|
|
done(entriesToDelete2);
|
|
}
|
|
};
|
|
});
|
|
const urlsDeleted = [];
|
|
for (const entry of entriesToDelete) {
|
|
await this._db.delete(OBJECT_STORE_NAME, entry.id);
|
|
urlsDeleted.push(entry.url);
|
|
}
|
|
return urlsDeleted;
|
|
}
|
|
_getId(url) {
|
|
return this._cacheName + "|" + normalizeURL(url);
|
|
}
|
|
}
|
|
|
|
// node_modules/workbox-expiration/CacheExpiration.js
|
|
class CacheExpiration {
|
|
constructor(cacheName, config = {}) {
|
|
this._isRunning = false;
|
|
this._rerunRequested = false;
|
|
if (true) {
|
|
finalAssertExports.isType(cacheName, "string", {
|
|
moduleName: "workbox-expiration",
|
|
className: "CacheExpiration",
|
|
funcName: "constructor",
|
|
paramName: "cacheName"
|
|
});
|
|
if (!(config.maxEntries || config.maxAgeSeconds)) {
|
|
throw new WorkboxError("max-entries-or-age-required", {
|
|
moduleName: "workbox-expiration",
|
|
className: "CacheExpiration",
|
|
funcName: "constructor"
|
|
});
|
|
}
|
|
if (config.maxEntries) {
|
|
finalAssertExports.isType(config.maxEntries, "number", {
|
|
moduleName: "workbox-expiration",
|
|
className: "CacheExpiration",
|
|
funcName: "constructor",
|
|
paramName: "config.maxEntries"
|
|
});
|
|
}
|
|
if (config.maxAgeSeconds) {
|
|
finalAssertExports.isType(config.maxAgeSeconds, "number", {
|
|
moduleName: "workbox-expiration",
|
|
className: "CacheExpiration",
|
|
funcName: "constructor",
|
|
paramName: "config.maxAgeSeconds"
|
|
});
|
|
}
|
|
}
|
|
this._maxEntries = config.maxEntries;
|
|
this._maxAgeSeconds = config.maxAgeSeconds;
|
|
this._cacheName = cacheName;
|
|
this._timestampModel = new CacheTimestampsModel(cacheName);
|
|
}
|
|
async expireEntries() {
|
|
if (this._isRunning) {
|
|
this._rerunRequested = true;
|
|
return;
|
|
}
|
|
this._isRunning = true;
|
|
const minTimestamp = this._maxAgeSeconds ? Date.now() - this._maxAgeSeconds * 1000 : 0;
|
|
const urlsExpired = await this._timestampModel.expireEntries(minTimestamp, this._maxEntries);
|
|
const cache = await self.caches.open(this._cacheName);
|
|
for (const url of urlsExpired) {
|
|
await cache.delete(url);
|
|
}
|
|
if (true) {
|
|
if (urlsExpired.length > 0) {
|
|
logger.groupCollapsed(`Expired ${urlsExpired.length} ` + `${urlsExpired.length === 1 ? "entry" : "entries"} and removed ` + `${urlsExpired.length === 1 ? "it" : "them"} from the ` + `'${this._cacheName}' cache.`);
|
|
logger.log(`Expired the following ${urlsExpired.length === 1 ? "URL" : "URLs"}:`);
|
|
urlsExpired.forEach((url) => logger.log(` ${url}`));
|
|
logger.groupEnd();
|
|
} else {
|
|
logger.debug(`Cache expiration ran and found no entries to remove.`);
|
|
}
|
|
}
|
|
this._isRunning = false;
|
|
if (this._rerunRequested) {
|
|
this._rerunRequested = false;
|
|
dontWaitFor(this.expireEntries());
|
|
}
|
|
}
|
|
async updateTimestamp(url) {
|
|
if (true) {
|
|
finalAssertExports.isType(url, "string", {
|
|
moduleName: "workbox-expiration",
|
|
className: "CacheExpiration",
|
|
funcName: "updateTimestamp",
|
|
paramName: "url"
|
|
});
|
|
}
|
|
await this._timestampModel.setTimestamp(url, Date.now());
|
|
}
|
|
async isURLExpired(url) {
|
|
if (!this._maxAgeSeconds) {
|
|
if (true) {
|
|
throw new WorkboxError(`expired-test-without-max-age`, {
|
|
methodName: "isURLExpired",
|
|
paramName: "maxAgeSeconds"
|
|
});
|
|
}
|
|
return false;
|
|
} else {
|
|
const timestamp = await this._timestampModel.getTimestamp(url);
|
|
const expireOlderThan = Date.now() - this._maxAgeSeconds * 1000;
|
|
return timestamp < expireOlderThan;
|
|
}
|
|
}
|
|
async delete() {
|
|
this._rerunRequested = false;
|
|
await this._timestampModel.expireEntries(Infinity);
|
|
}
|
|
}
|
|
|
|
// node_modules/workbox-expiration/ExpirationPlugin.js
|
|
class ExpirationPlugin {
|
|
constructor(config = {}) {
|
|
this.cachedResponseWillBeUsed = async ({ event, request, cacheName, cachedResponse }) => {
|
|
if (!cachedResponse) {
|
|
return null;
|
|
}
|
|
const isFresh = this._isResponseDateFresh(cachedResponse);
|
|
const cacheExpiration = this._getCacheExpiration(cacheName);
|
|
dontWaitFor(cacheExpiration.expireEntries());
|
|
const updateTimestampDone = cacheExpiration.updateTimestamp(request.url);
|
|
if (event) {
|
|
try {
|
|
event.waitUntil(updateTimestampDone);
|
|
} catch (error) {
|
|
if (true) {
|
|
if ("request" in event) {
|
|
logger.warn(`Unable to ensure service worker stays alive when ` + `updating cache entry for ` + `'${getFriendlyURL(event.request.url)}'.`);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return isFresh ? cachedResponse : null;
|
|
};
|
|
this.cacheDidUpdate = async ({ cacheName, request }) => {
|
|
if (true) {
|
|
finalAssertExports.isType(cacheName, "string", {
|
|
moduleName: "workbox-expiration",
|
|
className: "Plugin",
|
|
funcName: "cacheDidUpdate",
|
|
paramName: "cacheName"
|
|
});
|
|
finalAssertExports.isInstance(request, Request, {
|
|
moduleName: "workbox-expiration",
|
|
className: "Plugin",
|
|
funcName: "cacheDidUpdate",
|
|
paramName: "request"
|
|
});
|
|
}
|
|
const cacheExpiration = this._getCacheExpiration(cacheName);
|
|
await cacheExpiration.updateTimestamp(request.url);
|
|
await cacheExpiration.expireEntries();
|
|
};
|
|
if (true) {
|
|
if (!(config.maxEntries || config.maxAgeSeconds)) {
|
|
throw new WorkboxError("max-entries-or-age-required", {
|
|
moduleName: "workbox-expiration",
|
|
className: "Plugin",
|
|
funcName: "constructor"
|
|
});
|
|
}
|
|
if (config.maxEntries) {
|
|
finalAssertExports.isType(config.maxEntries, "number", {
|
|
moduleName: "workbox-expiration",
|
|
className: "Plugin",
|
|
funcName: "constructor",
|
|
paramName: "config.maxEntries"
|
|
});
|
|
}
|
|
if (config.maxAgeSeconds) {
|
|
finalAssertExports.isType(config.maxAgeSeconds, "number", {
|
|
moduleName: "workbox-expiration",
|
|
className: "Plugin",
|
|
funcName: "constructor",
|
|
paramName: "config.maxAgeSeconds"
|
|
});
|
|
}
|
|
}
|
|
this._config = config;
|
|
this._maxAgeSeconds = config.maxAgeSeconds;
|
|
this._cacheExpirations = new Map;
|
|
if (config.purgeOnQuotaError) {
|
|
registerQuotaErrorCallback(() => this.deleteCacheAndMetadata());
|
|
}
|
|
}
|
|
_getCacheExpiration(cacheName) {
|
|
if (cacheName === cacheNames.getRuntimeName()) {
|
|
throw new WorkboxError("expire-custom-caches-only");
|
|
}
|
|
let cacheExpiration = this._cacheExpirations.get(cacheName);
|
|
if (!cacheExpiration) {
|
|
cacheExpiration = new CacheExpiration(cacheName, this._config);
|
|
this._cacheExpirations.set(cacheName, cacheExpiration);
|
|
}
|
|
return cacheExpiration;
|
|
}
|
|
_isResponseDateFresh(cachedResponse) {
|
|
if (!this._maxAgeSeconds) {
|
|
return true;
|
|
}
|
|
const dateHeaderTimestamp = this._getDateHeaderTimestamp(cachedResponse);
|
|
if (dateHeaderTimestamp === null) {
|
|
return true;
|
|
}
|
|
const now = Date.now();
|
|
return dateHeaderTimestamp >= now - this._maxAgeSeconds * 1000;
|
|
}
|
|
_getDateHeaderTimestamp(cachedResponse) {
|
|
if (!cachedResponse.headers.has("date")) {
|
|
return null;
|
|
}
|
|
const dateHeader = cachedResponse.headers.get("date");
|
|
const parsedDate = new Date(dateHeader);
|
|
const headerTime = parsedDate.getTime();
|
|
if (isNaN(headerTime)) {
|
|
return null;
|
|
}
|
|
return headerTime;
|
|
}
|
|
async deleteCacheAndMetadata() {
|
|
for (const [cacheName, cacheExpiration] of this._cacheExpirations) {
|
|
await self.caches.delete(cacheName);
|
|
await cacheExpiration.delete();
|
|
}
|
|
this._cacheExpirations = new Map;
|
|
}
|
|
}
|
|
// node_modules/workbox-precaching/_version.js
|
|
try {
|
|
self["workbox:precaching:5.1.4"] && _();
|
|
} catch (e) {
|
|
}
|
|
|
|
// node_modules/workbox-precaching/utils/precachePlugins.js
|
|
var plugins = [];
|
|
var precachePlugins = {
|
|
get() {
|
|
return plugins;
|
|
},
|
|
add(newPlugins) {
|
|
plugins.push(...newPlugins);
|
|
}
|
|
};
|
|
|
|
// node_modules/workbox-precaching/utils/createCacheKey.js
|
|
function createCacheKey(entry) {
|
|
if (!entry) {
|
|
throw new WorkboxError("add-to-cache-list-unexpected-type", { entry });
|
|
}
|
|
if (typeof entry === "string") {
|
|
const urlObject = new URL(entry, location.href);
|
|
return {
|
|
cacheKey: urlObject.href,
|
|
url: urlObject.href
|
|
};
|
|
}
|
|
const { revision, url } = entry;
|
|
if (!url) {
|
|
throw new WorkboxError("add-to-cache-list-unexpected-type", { entry });
|
|
}
|
|
if (!revision) {
|
|
const urlObject = new URL(url, location.href);
|
|
return {
|
|
cacheKey: urlObject.href,
|
|
url: urlObject.href
|
|
};
|
|
}
|
|
const cacheKeyURL = new URL(url, location.href);
|
|
const originalURL = new URL(url, location.href);
|
|
cacheKeyURL.searchParams.set(REVISION_SEARCH_PARAM, revision);
|
|
return {
|
|
cacheKey: cacheKeyURL.href,
|
|
url: originalURL.href
|
|
};
|
|
}
|
|
var REVISION_SEARCH_PARAM = "__WB_REVISION__";
|
|
|
|
// node_modules/workbox-precaching/utils/printCleanupDetails.js
|
|
function printCleanupDetails(deletedURLs) {
|
|
const deletionCount = deletedURLs.length;
|
|
if (deletionCount > 0) {
|
|
logger.groupCollapsed(`During precaching cleanup, ` + `${deletionCount} cached ` + `request${deletionCount === 1 ? " was" : "s were"} deleted.`);
|
|
logGroup("Deleted Cache Requests", deletedURLs);
|
|
logger.groupEnd();
|
|
}
|
|
}
|
|
var logGroup = (groupTitle, deletedURLs) => {
|
|
logger.groupCollapsed(groupTitle);
|
|
for (const url of deletedURLs) {
|
|
logger.log(url);
|
|
}
|
|
logger.groupEnd();
|
|
};
|
|
|
|
// node_modules/workbox-precaching/utils/printInstallDetails.js
|
|
function _nestedGroup(groupTitle, urls) {
|
|
if (urls.length === 0) {
|
|
return;
|
|
}
|
|
logger.groupCollapsed(groupTitle);
|
|
for (const url of urls) {
|
|
logger.log(url);
|
|
}
|
|
logger.groupEnd();
|
|
}
|
|
function printInstallDetails(urlsToPrecache, urlsAlreadyPrecached) {
|
|
const precachedCount = urlsToPrecache.length;
|
|
const alreadyPrecachedCount = urlsAlreadyPrecached.length;
|
|
if (precachedCount || alreadyPrecachedCount) {
|
|
let message = `Precaching ${precachedCount} file${precachedCount === 1 ? "" : "s"}.`;
|
|
if (alreadyPrecachedCount > 0) {
|
|
message += ` ${alreadyPrecachedCount} ` + `file${alreadyPrecachedCount === 1 ? " is" : "s are"} already cached.`;
|
|
}
|
|
logger.groupCollapsed(message);
|
|
_nestedGroup(`View newly precached URLs.`, urlsToPrecache);
|
|
_nestedGroup(`View previously precached URLs.`, urlsAlreadyPrecached);
|
|
logger.groupEnd();
|
|
}
|
|
}
|
|
|
|
// node_modules/workbox-precaching/PrecacheController.js
|
|
class PrecacheController {
|
|
constructor(cacheName) {
|
|
this._cacheName = cacheNames.getPrecacheName(cacheName);
|
|
this._urlsToCacheKeys = new Map;
|
|
this._urlsToCacheModes = new Map;
|
|
this._cacheKeysToIntegrities = new Map;
|
|
}
|
|
addToCacheList(entries) {
|
|
if (true) {
|
|
finalAssertExports.isArray(entries, {
|
|
moduleName: "workbox-precaching",
|
|
className: "PrecacheController",
|
|
funcName: "addToCacheList",
|
|
paramName: "entries"
|
|
});
|
|
}
|
|
const urlsToWarnAbout = [];
|
|
for (const entry of entries) {
|
|
if (typeof entry === "string") {
|
|
urlsToWarnAbout.push(entry);
|
|
} else if (entry && entry.revision === undefined) {
|
|
urlsToWarnAbout.push(entry.url);
|
|
}
|
|
const { cacheKey, url } = createCacheKey(entry);
|
|
const cacheMode = typeof entry !== "string" && entry.revision ? "reload" : "default";
|
|
if (this._urlsToCacheKeys.has(url) && this._urlsToCacheKeys.get(url) !== cacheKey) {
|
|
throw new WorkboxError("add-to-cache-list-conflicting-entries", {
|
|
firstEntry: this._urlsToCacheKeys.get(url),
|
|
secondEntry: cacheKey
|
|
});
|
|
}
|
|
if (typeof entry !== "string" && entry.integrity) {
|
|
if (this._cacheKeysToIntegrities.has(cacheKey) && this._cacheKeysToIntegrities.get(cacheKey) !== entry.integrity) {
|
|
throw new WorkboxError("add-to-cache-list-conflicting-integrities", {
|
|
url
|
|
});
|
|
}
|
|
this._cacheKeysToIntegrities.set(cacheKey, entry.integrity);
|
|
}
|
|
this._urlsToCacheKeys.set(url, cacheKey);
|
|
this._urlsToCacheModes.set(url, cacheMode);
|
|
if (urlsToWarnAbout.length > 0) {
|
|
const warningMessage = `Workbox is precaching URLs without revision ` + `info: ${urlsToWarnAbout.join(", ")}\nThis is generally NOT safe. ` + `Learn more at https://bit.ly/wb-precache`;
|
|
if (false) {
|
|
} else {
|
|
logger.warn(warningMessage);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
async install({ event, plugins: plugins2 } = {}) {
|
|
if (true) {
|
|
if (plugins2) {
|
|
finalAssertExports.isArray(plugins2, {
|
|
moduleName: "workbox-precaching",
|
|
className: "PrecacheController",
|
|
funcName: "install",
|
|
paramName: "plugins"
|
|
});
|
|
}
|
|
}
|
|
const toBePrecached = [];
|
|
const alreadyPrecached = [];
|
|
const cache = await self.caches.open(this._cacheName);
|
|
const alreadyCachedRequests = await cache.keys();
|
|
const existingCacheKeys = new Set(alreadyCachedRequests.map((request) => request.url));
|
|
for (const [url, cacheKey] of this._urlsToCacheKeys) {
|
|
if (existingCacheKeys.has(cacheKey)) {
|
|
alreadyPrecached.push(url);
|
|
} else {
|
|
toBePrecached.push({ cacheKey, url });
|
|
}
|
|
}
|
|
const precacheRequests = toBePrecached.map(({ cacheKey, url }) => {
|
|
const integrity = this._cacheKeysToIntegrities.get(cacheKey);
|
|
const cacheMode = this._urlsToCacheModes.get(url);
|
|
return this._addURLToCache({
|
|
cacheKey,
|
|
cacheMode,
|
|
event,
|
|
integrity,
|
|
plugins: plugins2,
|
|
url
|
|
});
|
|
});
|
|
await Promise.all(precacheRequests);
|
|
const updatedURLs = toBePrecached.map((item) => item.url);
|
|
if (true) {
|
|
printInstallDetails(updatedURLs, alreadyPrecached);
|
|
}
|
|
return {
|
|
updatedURLs,
|
|
notUpdatedURLs: alreadyPrecached
|
|
};
|
|
}
|
|
async activate() {
|
|
const cache = await self.caches.open(this._cacheName);
|
|
const currentlyCachedRequests = await cache.keys();
|
|
const expectedCacheKeys = new Set(this._urlsToCacheKeys.values());
|
|
const deletedURLs = [];
|
|
for (const request of currentlyCachedRequests) {
|
|
if (!expectedCacheKeys.has(request.url)) {
|
|
await cache.delete(request);
|
|
deletedURLs.push(request.url);
|
|
}
|
|
}
|
|
if (true) {
|
|
printCleanupDetails(deletedURLs);
|
|
}
|
|
return { deletedURLs };
|
|
}
|
|
async _addURLToCache({ cacheKey, url, cacheMode, event, plugins: plugins2, integrity }) {
|
|
const request = new Request(url, {
|
|
integrity,
|
|
cache: cacheMode,
|
|
credentials: "same-origin"
|
|
});
|
|
let response = await fetchWrapper.fetch({
|
|
event,
|
|
plugins: plugins2,
|
|
request
|
|
});
|
|
let cacheWillUpdatePlugin;
|
|
for (const plugin of plugins2 || []) {
|
|
if ("cacheWillUpdate" in plugin) {
|
|
cacheWillUpdatePlugin = plugin;
|
|
}
|
|
}
|
|
const isValidResponse = cacheWillUpdatePlugin ? await cacheWillUpdatePlugin.cacheWillUpdate({ event, request, response }) : response.status < 400;
|
|
if (!isValidResponse) {
|
|
throw new WorkboxError("bad-precaching-response", {
|
|
url,
|
|
status: response.status
|
|
});
|
|
}
|
|
if (response.redirected) {
|
|
response = await copyResponse(response);
|
|
}
|
|
await cacheWrapper.put({
|
|
event,
|
|
plugins: plugins2,
|
|
response,
|
|
request: cacheKey === url ? request : new Request(cacheKey),
|
|
cacheName: this._cacheName,
|
|
matchOptions: {
|
|
ignoreSearch: true
|
|
}
|
|
});
|
|
}
|
|
getURLsToCacheKeys() {
|
|
return this._urlsToCacheKeys;
|
|
}
|
|
getCachedURLs() {
|
|
return [...this._urlsToCacheKeys.keys()];
|
|
}
|
|
getCacheKeyForURL(url) {
|
|
const urlObject = new URL(url, location.href);
|
|
return this._urlsToCacheKeys.get(urlObject.href);
|
|
}
|
|
async matchPrecache(request) {
|
|
const url = request instanceof Request ? request.url : request;
|
|
const cacheKey = this.getCacheKeyForURL(url);
|
|
if (cacheKey) {
|
|
const cache = await self.caches.open(this._cacheName);
|
|
return cache.match(cacheKey);
|
|
}
|
|
return;
|
|
}
|
|
createHandler(fallbackToNetwork = true) {
|
|
return async ({ request }) => {
|
|
try {
|
|
const response = await this.matchPrecache(request);
|
|
if (response) {
|
|
return response;
|
|
}
|
|
throw new WorkboxError("missing-precache-entry", {
|
|
cacheName: this._cacheName,
|
|
url: request instanceof Request ? request.url : request
|
|
});
|
|
} catch (error) {
|
|
if (fallbackToNetwork) {
|
|
if (true) {
|
|
logger.debug(`Unable to respond with precached response. ` + `Falling back to network.`, error);
|
|
}
|
|
return fetch(request);
|
|
}
|
|
throw error;
|
|
}
|
|
};
|
|
}
|
|
createHandlerBoundToURL(url, fallbackToNetwork = true) {
|
|
const cacheKey = this.getCacheKeyForURL(url);
|
|
if (!cacheKey) {
|
|
throw new WorkboxError("non-precached-url", { url });
|
|
}
|
|
const handler = this.createHandler(fallbackToNetwork);
|
|
const request = new Request(url);
|
|
return () => handler({ request });
|
|
}
|
|
}
|
|
|
|
// node_modules/workbox-precaching/utils/getOrCreatePrecacheController.js
|
|
var precacheController;
|
|
var getOrCreatePrecacheController = () => {
|
|
if (!precacheController) {
|
|
precacheController = new PrecacheController;
|
|
}
|
|
return precacheController;
|
|
};
|
|
|
|
// node_modules/workbox-precaching/utils/removeIgnoredSearchParams.js
|
|
function removeIgnoredSearchParams(urlObject, ignoreURLParametersMatching = []) {
|
|
for (const paramName of [...urlObject.searchParams.keys()]) {
|
|
if (ignoreURLParametersMatching.some((regExp) => regExp.test(paramName))) {
|
|
urlObject.searchParams.delete(paramName);
|
|
}
|
|
}
|
|
return urlObject;
|
|
}
|
|
|
|
// node_modules/workbox-precaching/utils/generateURLVariations.js
|
|
function* generateURLVariations(url, { ignoreURLParametersMatching, directoryIndex, cleanURLs, urlManipulation } = {}) {
|
|
const urlObject = new URL(url, location.href);
|
|
urlObject.hash = "";
|
|
yield urlObject.href;
|
|
const urlWithoutIgnoredParams = removeIgnoredSearchParams(urlObject, ignoreURLParametersMatching);
|
|
yield urlWithoutIgnoredParams.href;
|
|
if (directoryIndex && urlWithoutIgnoredParams.pathname.endsWith("/")) {
|
|
const directoryURL = new URL(urlWithoutIgnoredParams.href);
|
|
directoryURL.pathname += directoryIndex;
|
|
yield directoryURL.href;
|
|
}
|
|
if (cleanURLs) {
|
|
const cleanURL = new URL(urlWithoutIgnoredParams.href);
|
|
cleanURL.pathname += ".html";
|
|
yield cleanURL.href;
|
|
}
|
|
if (urlManipulation) {
|
|
const additionalURLs = urlManipulation({ url: urlObject });
|
|
for (const urlToAttempt of additionalURLs) {
|
|
yield urlToAttempt.href;
|
|
}
|
|
}
|
|
}
|
|
|
|
// node_modules/workbox-precaching/utils/getCacheKeyForURL.js
|
|
var getCacheKeyForURL = (url, options) => {
|
|
const precacheController2 = getOrCreatePrecacheController();
|
|
const urlsToCacheKeys = precacheController2.getURLsToCacheKeys();
|
|
for (const possibleURL of generateURLVariations(url, options)) {
|
|
const possibleCacheKey = urlsToCacheKeys.get(possibleURL);
|
|
if (possibleCacheKey) {
|
|
return possibleCacheKey;
|
|
}
|
|
}
|
|
};
|
|
|
|
// node_modules/workbox-precaching/utils/addFetchListener.js
|
|
var addFetchListener = ({ ignoreURLParametersMatching = [/^utm_/], directoryIndex = "index.html", cleanURLs = true, urlManipulation } = {}) => {
|
|
const cacheName = cacheNames.getPrecacheName();
|
|
self.addEventListener("fetch", (event) => {
|
|
const precachedURL = getCacheKeyForURL(event.request.url, {
|
|
cleanURLs,
|
|
directoryIndex,
|
|
ignoreURLParametersMatching,
|
|
urlManipulation
|
|
});
|
|
if (!precachedURL) {
|
|
if (true) {
|
|
logger.debug(`Precaching did not find a match for ` + getFriendlyURL(event.request.url));
|
|
}
|
|
return;
|
|
}
|
|
let responsePromise = self.caches.open(cacheName).then((cache) => {
|
|
return cache.match(precachedURL);
|
|
}).then((cachedResponse) => {
|
|
if (cachedResponse) {
|
|
return cachedResponse;
|
|
}
|
|
if (true) {
|
|
logger.warn(`The precached response for ` + `${getFriendlyURL(precachedURL)} in ${cacheName} was not found. ` + `Falling back to the network instead.`);
|
|
}
|
|
return fetch(precachedURL);
|
|
});
|
|
if (true) {
|
|
responsePromise = responsePromise.then((response) => {
|
|
logger.groupCollapsed(`Precaching is responding to: ` + getFriendlyURL(event.request.url));
|
|
logger.log(`Serving the precached url: ${precachedURL}`);
|
|
logger.groupCollapsed(`View request details here.`);
|
|
logger.log(event.request);
|
|
logger.groupEnd();
|
|
logger.groupCollapsed(`View response details here.`);
|
|
logger.log(response);
|
|
logger.groupEnd();
|
|
logger.groupEnd();
|
|
return response;
|
|
});
|
|
}
|
|
event.respondWith(responsePromise);
|
|
});
|
|
};
|
|
|
|
// node_modules/workbox-precaching/addRoute.js
|
|
function addRoute(options) {
|
|
if (!listenerAdded) {
|
|
addFetchListener(options);
|
|
listenerAdded = true;
|
|
}
|
|
}
|
|
var listenerAdded = false;
|
|
|
|
// node_modules/workbox-precaching/createHandlerBoundToURL.js
|
|
function createHandlerBoundToURL(url) {
|
|
const precacheController2 = getOrCreatePrecacheController();
|
|
return precacheController2.createHandlerBoundToURL(url);
|
|
}
|
|
|
|
// node_modules/workbox-precaching/precache.js
|
|
function precache(entries) {
|
|
const precacheController2 = getOrCreatePrecacheController();
|
|
precacheController2.addToCacheList(entries);
|
|
if (entries.length > 0) {
|
|
self.addEventListener("install", installListener);
|
|
self.addEventListener("activate", activateListener);
|
|
}
|
|
}
|
|
var installListener = (event) => {
|
|
const precacheController2 = getOrCreatePrecacheController();
|
|
const plugins2 = precachePlugins.get();
|
|
event.waitUntil(precacheController2.install({ event, plugins: plugins2 }).catch((error) => {
|
|
if (true) {
|
|
logger.error(`Service worker installation failed. It will ` + `be retried automatically during the next navigation.`);
|
|
}
|
|
throw error;
|
|
}));
|
|
};
|
|
var activateListener = (event) => {
|
|
const precacheController2 = getOrCreatePrecacheController();
|
|
event.waitUntil(precacheController2.activate());
|
|
};
|
|
|
|
// node_modules/workbox-precaching/precacheAndRoute.js
|
|
function precacheAndRoute(entries, options) {
|
|
precache(entries);
|
|
addRoute(options);
|
|
}
|
|
// node_modules/workbox-routing/_version.js
|
|
try {
|
|
self["workbox:routing:5.1.4"] && _();
|
|
} catch (e) {
|
|
}
|
|
|
|
// node_modules/workbox-routing/utils/constants.js
|
|
var defaultMethod = "GET";
|
|
var validMethods = [
|
|
"DELETE",
|
|
"GET",
|
|
"HEAD",
|
|
"PATCH",
|
|
"POST",
|
|
"PUT"
|
|
];
|
|
|
|
// node_modules/workbox-routing/utils/normalizeHandler.js
|
|
var normalizeHandler = (handler) => {
|
|
if (handler && typeof handler === "object") {
|
|
if (true) {
|
|
finalAssertExports.hasMethod(handler, "handle", {
|
|
moduleName: "workbox-routing",
|
|
className: "Route",
|
|
funcName: "constructor",
|
|
paramName: "handler"
|
|
});
|
|
}
|
|
return handler;
|
|
} else {
|
|
if (true) {
|
|
finalAssertExports.isType(handler, "function", {
|
|
moduleName: "workbox-routing",
|
|
className: "Route",
|
|
funcName: "constructor",
|
|
paramName: "handler"
|
|
});
|
|
}
|
|
return { handle: handler };
|
|
}
|
|
};
|
|
|
|
// node_modules/workbox-routing/Route.js
|
|
class Route {
|
|
constructor(match, handler, method = defaultMethod) {
|
|
if (true) {
|
|
finalAssertExports.isType(match, "function", {
|
|
moduleName: "workbox-routing",
|
|
className: "Route",
|
|
funcName: "constructor",
|
|
paramName: "match"
|
|
});
|
|
if (method) {
|
|
finalAssertExports.isOneOf(method, validMethods, { paramName: "method" });
|
|
}
|
|
}
|
|
this.handler = normalizeHandler(handler);
|
|
this.match = match;
|
|
this.method = method;
|
|
}
|
|
}
|
|
|
|
// node_modules/workbox-routing/RegExpRoute.js
|
|
class RegExpRoute extends Route {
|
|
constructor(regExp, handler, method) {
|
|
if (true) {
|
|
finalAssertExports.isInstance(regExp, RegExp, {
|
|
moduleName: "workbox-routing",
|
|
className: "RegExpRoute",
|
|
funcName: "constructor",
|
|
paramName: "pattern"
|
|
});
|
|
}
|
|
const match = ({ url }) => {
|
|
const result = regExp.exec(url.href);
|
|
if (!result) {
|
|
return;
|
|
}
|
|
if (url.origin !== location.origin && result.index !== 0) {
|
|
if (true) {
|
|
logger.debug(`The regular expression '${regExp}' only partially matched ` + `against the cross-origin URL '${url}'. RegExpRoute's will only ` + `handle cross-origin requests if they match the entire URL.`);
|
|
}
|
|
return;
|
|
}
|
|
return result.slice(1);
|
|
};
|
|
super(match, handler, method);
|
|
}
|
|
}
|
|
|
|
// node_modules/workbox-routing/Router.js
|
|
class Router {
|
|
constructor() {
|
|
this._routes = new Map;
|
|
}
|
|
get routes() {
|
|
return this._routes;
|
|
}
|
|
addFetchListener() {
|
|
self.addEventListener("fetch", (event) => {
|
|
const { request } = event;
|
|
const responsePromise = this.handleRequest({ request, event });
|
|
if (responsePromise) {
|
|
event.respondWith(responsePromise);
|
|
}
|
|
});
|
|
}
|
|
addCacheListener() {
|
|
self.addEventListener("message", (event) => {
|
|
if (event.data && event.data.type === "CACHE_URLS") {
|
|
const { payload } = event.data;
|
|
if (true) {
|
|
logger.debug(`Caching URLs from the window`, payload.urlsToCache);
|
|
}
|
|
const requestPromises = Promise.all(payload.urlsToCache.map((entry) => {
|
|
if (typeof entry === "string") {
|
|
entry = [entry];
|
|
}
|
|
const request = new Request(...entry);
|
|
return this.handleRequest({ request });
|
|
}));
|
|
event.waitUntil(requestPromises);
|
|
if (event.ports && event.ports[0]) {
|
|
requestPromises.then(() => event.ports[0].postMessage(true));
|
|
}
|
|
}
|
|
});
|
|
}
|
|
handleRequest({ request, event }) {
|
|
if (true) {
|
|
finalAssertExports.isInstance(request, Request, {
|
|
moduleName: "workbox-routing",
|
|
className: "Router",
|
|
funcName: "handleRequest",
|
|
paramName: "options.request"
|
|
});
|
|
}
|
|
const url = new URL(request.url, location.href);
|
|
if (!url.protocol.startsWith("http")) {
|
|
if (true) {
|
|
logger.debug(`Workbox Router only supports URLs that start with 'http'.`);
|
|
}
|
|
return;
|
|
}
|
|
const { params, route } = this.findMatchingRoute({ url, request, event });
|
|
let handler = route && route.handler;
|
|
const debugMessages = [];
|
|
if (true) {
|
|
if (handler) {
|
|
debugMessages.push([
|
|
`Found a route to handle this request:`,
|
|
route
|
|
]);
|
|
if (params) {
|
|
debugMessages.push([
|
|
`Passing the following params to the route's handler:`,
|
|
params
|
|
]);
|
|
}
|
|
}
|
|
}
|
|
if (!handler && this._defaultHandler) {
|
|
if (true) {
|
|
debugMessages.push(`Failed to find a matching route. Falling ` + `back to the default handler.`);
|
|
}
|
|
handler = this._defaultHandler;
|
|
}
|
|
if (!handler) {
|
|
if (true) {
|
|
logger.debug(`No route found for: ${getFriendlyURL(url)}`);
|
|
}
|
|
return;
|
|
}
|
|
if (true) {
|
|
logger.groupCollapsed(`Router is responding to: ${getFriendlyURL(url)}`);
|
|
debugMessages.forEach((msg) => {
|
|
if (Array.isArray(msg)) {
|
|
logger.log(...msg);
|
|
} else {
|
|
logger.log(msg);
|
|
}
|
|
});
|
|
logger.groupEnd();
|
|
}
|
|
let responsePromise;
|
|
try {
|
|
responsePromise = handler.handle({ url, request, event, params });
|
|
} catch (err) {
|
|
responsePromise = Promise.reject(err);
|
|
}
|
|
if (responsePromise instanceof Promise && this._catchHandler) {
|
|
responsePromise = responsePromise.catch((err) => {
|
|
if (true) {
|
|
logger.groupCollapsed(`Error thrown when responding to: ` + ` ${getFriendlyURL(url)}. Falling back to Catch Handler.`);
|
|
logger.error(`Error thrown by:`, route);
|
|
logger.error(err);
|
|
logger.groupEnd();
|
|
}
|
|
return this._catchHandler.handle({ url, request, event });
|
|
});
|
|
}
|
|
return responsePromise;
|
|
}
|
|
findMatchingRoute({ url, request, event }) {
|
|
if (true) {
|
|
finalAssertExports.isInstance(url, URL, {
|
|
moduleName: "workbox-routing",
|
|
className: "Router",
|
|
funcName: "findMatchingRoute",
|
|
paramName: "options.url"
|
|
});
|
|
finalAssertExports.isInstance(request, Request, {
|
|
moduleName: "workbox-routing",
|
|
className: "Router",
|
|
funcName: "findMatchingRoute",
|
|
paramName: "options.request"
|
|
});
|
|
}
|
|
const routes = this._routes.get(request.method) || [];
|
|
for (const route of routes) {
|
|
let params;
|
|
const matchResult = route.match({ url, request, event });
|
|
if (matchResult) {
|
|
params = matchResult;
|
|
if (Array.isArray(matchResult) && matchResult.length === 0) {
|
|
params = undefined;
|
|
} else if (matchResult.constructor === Object && Object.keys(matchResult).length === 0) {
|
|
params = undefined;
|
|
} else if (typeof matchResult === "boolean") {
|
|
params = undefined;
|
|
}
|
|
return { route, params };
|
|
}
|
|
}
|
|
return {};
|
|
}
|
|
setDefaultHandler(handler) {
|
|
this._defaultHandler = normalizeHandler(handler);
|
|
}
|
|
setCatchHandler(handler) {
|
|
this._catchHandler = normalizeHandler(handler);
|
|
}
|
|
registerRoute(route) {
|
|
if (true) {
|
|
finalAssertExports.isType(route, "object", {
|
|
moduleName: "workbox-routing",
|
|
className: "Router",
|
|
funcName: "registerRoute",
|
|
paramName: "route"
|
|
});
|
|
finalAssertExports.hasMethod(route, "match", {
|
|
moduleName: "workbox-routing",
|
|
className: "Router",
|
|
funcName: "registerRoute",
|
|
paramName: "route"
|
|
});
|
|
finalAssertExports.isType(route.handler, "object", {
|
|
moduleName: "workbox-routing",
|
|
className: "Router",
|
|
funcName: "registerRoute",
|
|
paramName: "route"
|
|
});
|
|
finalAssertExports.hasMethod(route.handler, "handle", {
|
|
moduleName: "workbox-routing",
|
|
className: "Router",
|
|
funcName: "registerRoute",
|
|
paramName: "route.handler"
|
|
});
|
|
finalAssertExports.isType(route.method, "string", {
|
|
moduleName: "workbox-routing",
|
|
className: "Router",
|
|
funcName: "registerRoute",
|
|
paramName: "route.method"
|
|
});
|
|
}
|
|
if (!this._routes.has(route.method)) {
|
|
this._routes.set(route.method, []);
|
|
}
|
|
this._routes.get(route.method).push(route);
|
|
}
|
|
unregisterRoute(route) {
|
|
if (!this._routes.has(route.method)) {
|
|
throw new WorkboxError("unregister-route-but-not-found-with-method", {
|
|
method: route.method
|
|
});
|
|
}
|
|
const routeIndex = this._routes.get(route.method).indexOf(route);
|
|
if (routeIndex > -1) {
|
|
this._routes.get(route.method).splice(routeIndex, 1);
|
|
} else {
|
|
throw new WorkboxError("unregister-route-route-not-registered");
|
|
}
|
|
}
|
|
}
|
|
|
|
// node_modules/workbox-routing/utils/getOrCreateDefaultRouter.js
|
|
var defaultRouter;
|
|
var getOrCreateDefaultRouter = () => {
|
|
if (!defaultRouter) {
|
|
defaultRouter = new Router;
|
|
defaultRouter.addFetchListener();
|
|
defaultRouter.addCacheListener();
|
|
}
|
|
return defaultRouter;
|
|
};
|
|
|
|
// node_modules/workbox-routing/registerRoute.js
|
|
function registerRoute(capture, handler, method) {
|
|
let route;
|
|
if (typeof capture === "string") {
|
|
const captureUrl = new URL(capture, location.href);
|
|
if (true) {
|
|
if (!(capture.startsWith("/") || capture.startsWith("http"))) {
|
|
throw new WorkboxError("invalid-string", {
|
|
moduleName: "workbox-routing",
|
|
funcName: "registerRoute",
|
|
paramName: "capture"
|
|
});
|
|
}
|
|
const valueToCheck = capture.startsWith("http") ? captureUrl.pathname : capture;
|
|
const wildcards = "[*:?+]";
|
|
if (new RegExp(`${wildcards}`).exec(valueToCheck)) {
|
|
logger.debug(`The '\$capture' parameter contains an Express-style wildcard ` + `character (${wildcards}). Strings are now always interpreted as ` + `exact matches; use a RegExp for partial or wildcard matches.`);
|
|
}
|
|
}
|
|
const matchCallback = ({ url }) => {
|
|
if (true) {
|
|
if (url.pathname === captureUrl.pathname && url.origin !== captureUrl.origin) {
|
|
logger.debug(`${capture} only partially matches the cross-origin URL ` + `${url}. This route will only handle cross-origin requests ` + `if they match the entire URL.`);
|
|
}
|
|
}
|
|
return url.href === captureUrl.href;
|
|
};
|
|
route = new Route(matchCallback, handler, method);
|
|
} else if (capture instanceof RegExp) {
|
|
route = new RegExpRoute(capture, handler, method);
|
|
} else if (typeof capture === "function") {
|
|
route = new Route(capture, handler, method);
|
|
} else if (capture instanceof Route) {
|
|
route = capture;
|
|
} else {
|
|
throw new WorkboxError("unsupported-route-type", {
|
|
moduleName: "workbox-routing",
|
|
funcName: "registerRoute",
|
|
paramName: "capture"
|
|
});
|
|
}
|
|
const defaultRouter2 = getOrCreateDefaultRouter();
|
|
defaultRouter2.registerRoute(route);
|
|
return route;
|
|
}
|
|
// node_modules/workbox-strategies/_version.js
|
|
try {
|
|
self["workbox:strategies:5.1.4"] && _();
|
|
} catch (e) {
|
|
}
|
|
|
|
// node_modules/workbox-strategies/utils/messages.js
|
|
var messages3 = {
|
|
strategyStart: (strategyName, request) => `Using ${strategyName} to respond to '${getFriendlyURL(request.url)}'`,
|
|
printFinalResponse: (response) => {
|
|
if (response) {
|
|
logger.groupCollapsed(`View the final response here.`);
|
|
logger.log(response || "[No response returned]");
|
|
logger.groupEnd();
|
|
}
|
|
}
|
|
};
|
|
|
|
// node_modules/workbox-strategies/plugins/cacheOkAndOpaquePlugin.js
|
|
var cacheOkAndOpaquePlugin = {
|
|
cacheWillUpdate: async ({ response }) => {
|
|
if (response.status === 200 || response.status === 0) {
|
|
return response;
|
|
}
|
|
return null;
|
|
}
|
|
};
|
|
|
|
// node_modules/workbox-strategies/StaleWhileRevalidate.js
|
|
class StaleWhileRevalidate {
|
|
constructor(options = {}) {
|
|
this._cacheName = cacheNames.getRuntimeName(options.cacheName);
|
|
this._plugins = options.plugins || [];
|
|
if (options.plugins) {
|
|
const isUsingCacheWillUpdate = options.plugins.some((plugin) => !!plugin.cacheWillUpdate);
|
|
this._plugins = isUsingCacheWillUpdate ? options.plugins : [cacheOkAndOpaquePlugin, ...options.plugins];
|
|
} else {
|
|
this._plugins = [cacheOkAndOpaquePlugin];
|
|
}
|
|
this._fetchOptions = options.fetchOptions;
|
|
this._matchOptions = options.matchOptions;
|
|
}
|
|
async handle({ event, request }) {
|
|
const logs = [];
|
|
if (typeof request === "string") {
|
|
request = new Request(request);
|
|
}
|
|
if (true) {
|
|
finalAssertExports.isInstance(request, Request, {
|
|
moduleName: "workbox-strategies",
|
|
className: "StaleWhileRevalidate",
|
|
funcName: "handle",
|
|
paramName: "request"
|
|
});
|
|
}
|
|
const fetchAndCachePromise = this._getFromNetwork({ request, event });
|
|
let response = await cacheWrapper.match({
|
|
cacheName: this._cacheName,
|
|
request,
|
|
event,
|
|
matchOptions: this._matchOptions,
|
|
plugins: this._plugins
|
|
});
|
|
let error;
|
|
if (response) {
|
|
if (true) {
|
|
logs.push(`Found a cached response in the '${this._cacheName}'` + ` cache. Will update with the network response in the background.`);
|
|
}
|
|
if (event) {
|
|
try {
|
|
event.waitUntil(fetchAndCachePromise);
|
|
} catch (error2) {
|
|
if (true) {
|
|
logger.warn(`Unable to ensure service worker stays alive when ` + `updating cache for '${getFriendlyURL(request.url)}'.`);
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
if (true) {
|
|
logs.push(`No response found in the '${this._cacheName}' cache. ` + `Will wait for the network response.`);
|
|
}
|
|
try {
|
|
response = await fetchAndCachePromise;
|
|
} catch (err) {
|
|
error = err;
|
|
}
|
|
}
|
|
if (true) {
|
|
logger.groupCollapsed(messages3.strategyStart("StaleWhileRevalidate", request));
|
|
for (const log of logs) {
|
|
logger.log(log);
|
|
}
|
|
messages3.printFinalResponse(response);
|
|
logger.groupEnd();
|
|
}
|
|
if (!response) {
|
|
throw new WorkboxError("no-response", { url: request.url, error });
|
|
}
|
|
return response;
|
|
}
|
|
async _getFromNetwork({ request, event }) {
|
|
const response = await fetchWrapper.fetch({
|
|
request,
|
|
event,
|
|
fetchOptions: this._fetchOptions,
|
|
plugins: this._plugins
|
|
});
|
|
const cachePutPromise = cacheWrapper.put({
|
|
cacheName: this._cacheName,
|
|
request,
|
|
response: response.clone(),
|
|
event,
|
|
plugins: this._plugins
|
|
});
|
|
if (event) {
|
|
try {
|
|
event.waitUntil(cachePutPromise);
|
|
} catch (error) {
|
|
if (true) {
|
|
logger.warn(`Unable to ensure service worker stays alive when ` + `updating cache for '${getFriendlyURL(request.url)}'.`);
|
|
}
|
|
}
|
|
}
|
|
return response;
|
|
}
|
|
}
|
|
// src/service-worker.ts
|
|
clientsClaim();
|
|
precacheAndRoute(self.__WB_MANIFEST);
|
|
var fileExtensionRegexp = new RegExp("/[^/?]+\\.[^/]+$");
|
|
registerRoute(({ request, url }) => {
|
|
if (request.mode !== "navigate") {
|
|
return false;
|
|
}
|
|
if (url.pathname.startsWith("/_")) {
|
|
return false;
|
|
}
|
|
if (url.pathname.match(fileExtensionRegexp)) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}, createHandlerBoundToURL(process.env.PUBLIC_URL + "/index.html"));
|
|
registerRoute(({ url }) => url.origin === self.location.origin && url.pathname.endsWith(".png"), new StaleWhileRevalidate({
|
|
cacheName: "images",
|
|
plugins: [
|
|
new ExpirationPlugin({ maxEntries: 50 })
|
|
]
|
|
}));
|
|
self.addEventListener("message", (event) => {
|
|
if (event.data && event.data.type === "SKIP_WAITING") {
|
|
self.skipWaiting();
|
|
}
|
|
});
|