From 5bbe05000e5e0495e344fcf4b6ec0722874f914b Mon Sep 17 00:00:00 2001 From: EvanChal Date: Sun, 25 Jan 2026 19:28:21 +0100 Subject: [PATCH] feat(front+back): pwa added, register parkour update with it, and jeux added in coming soon --- backend/api/routers/vlogs.py | 17 + frontend/PWA_SETUP.md | 51 + frontend/dev-dist/registerSW.js | 1 + frontend/dev-dist/sw.js | 128 + frontend/dev-dist/sw.js.map | 1 + frontend/dev-dist/workbox-47da91e0.js | 4785 +++++++++++ frontend/dev-dist/workbox-47da91e0.js.map | 1 + frontend/index.html | 9 + frontend/package-lock.json | 8101 +++++++++++++++++- frontend/package.json | 7 +- frontend/public/icon-128x128.png | Bin 0 -> 6764 bytes frontend/public/icon-144x144.png | Bin 0 -> 7717 bytes frontend/public/icon-152x152.png | Bin 0 -> 8206 bytes frontend/public/icon-192x192.png | Bin 0 -> 12105 bytes frontend/public/icon-384x384.png | Bin 0 -> 40456 bytes frontend/public/icon-512x512.png | Bin 0 -> 69254 bytes frontend/public/icon-72x72.png | Bin 0 -> 3346 bytes frontend/public/icon-96x96.png | Bin 0 -> 4493 bytes frontend/public/manifest.json | 80 + frontend/scripts/generate-icons.js | 79 + frontend/src/components/PWAInstallPrompt.vue | 152 + frontend/src/layouts/AuthLayout.vue | 16 +- frontend/src/layouts/DefaultLayout.vue | 144 +- frontend/src/services/notificationService.js | 159 + frontend/src/stores/auth.js | 37 +- frontend/src/views/Register.vue | 372 +- frontend/vite.config.js | 166 +- 27 files changed, 14084 insertions(+), 222 deletions(-) create mode 100644 frontend/PWA_SETUP.md create mode 100644 frontend/dev-dist/registerSW.js create mode 100644 frontend/dev-dist/sw.js create mode 100644 frontend/dev-dist/sw.js.map create mode 100644 frontend/dev-dist/workbox-47da91e0.js create mode 100644 frontend/dev-dist/workbox-47da91e0.js.map create mode 100644 frontend/public/icon-128x128.png create mode 100644 frontend/public/icon-144x144.png create mode 100644 frontend/public/icon-152x152.png create mode 100644 frontend/public/icon-192x192.png create mode 100644 frontend/public/icon-384x384.png create mode 100644 frontend/public/icon-512x512.png create mode 100644 frontend/public/icon-72x72.png create mode 100644 frontend/public/icon-96x96.png create mode 100644 frontend/public/manifest.json create mode 100644 frontend/scripts/generate-icons.js create mode 100644 frontend/src/components/PWAInstallPrompt.vue create mode 100644 frontend/src/services/notificationService.js diff --git a/backend/api/routers/vlogs.py b/backend/api/routers/vlogs.py index 7fea8fd..6671454 100644 --- a/backend/api/routers/vlogs.py +++ b/backend/api/routers/vlogs.py @@ -8,6 +8,7 @@ from config.database import get_db from config.settings import settings from models.vlog import Vlog, VlogLike, VlogComment, VlogView from models.user import User +from models.notification import Notification, NotificationType from schemas.vlog import VlogCreate, VlogUpdate, VlogResponse, VlogCommentCreate from utils.security import get_current_active_user from utils.video_utils import generate_video_thumbnail, get_video_duration @@ -332,6 +333,22 @@ async def upload_vlog_video( db.commit() db.refresh(vlog) + # Create notifications for all active users (except the creator) + users = db.query(User).filter(User.is_active == True).all() + for user in users: + if user.id != current_user.id: + notification = Notification( + user_id=user.id, + type=NotificationType.NEW_VLOG, + title="Nouveau vlog", + message=f"{current_user.full_name} a publié un nouveau vlog : {vlog.title}", + link=f"/vlogs/{vlog.id}", + is_read=False + ) + db.add(notification) + + db.commit() + return format_vlog_response(vlog, db, current_user.id) def format_vlog_response(vlog: Vlog, db: Session, current_user_id: int) -> dict: diff --git a/frontend/PWA_SETUP.md b/frontend/PWA_SETUP.md new file mode 100644 index 0000000..0d0ad6a --- /dev/null +++ b/frontend/PWA_SETUP.md @@ -0,0 +1,51 @@ +# Configuration PWA - LeDiscord + +## Installation + +1. **Installer les dépendances PWA :** +```bash +npm install --save-dev vite-plugin-pwa sharp +``` + +2. **Générer les icônes PWA :** +```bash +npm run generate-icons +``` + +Cette commande génère automatiquement toutes les icônes nécessaires (72x72, 96x96, 128x128, 144x144, 152x152, 192x192, 384x384, 512x512) à partir du logo `public/logo_lediscord.png`. + +## Fonctionnalités PWA + +### ✅ Fonctionnalités implémentées + +- **Service Worker** : Cache automatique des assets statiques +- **Manifest.json** : Configuration complète de l'application +- **Icônes** : Support multi-tailles pour tous les appareils +- **Offline** : Cache des ressources pour fonctionner hors ligne +- **Installation** : L'application peut être installée sur mobile et desktop + +### 📱 Cache Strategy + +- **Assets statiques** : Cache First (JS, CSS, images, vidéos) +- **API** : Network First avec cache de 5 minutes +- **Uploads** : Cache First avec expiration de 7 jours +- **Fonts Google** : Cache First avec expiration de 1 an + +### 🔧 Configuration + +La configuration PWA se trouve dans `vite.config.js` dans le plugin `VitePWA`. + +### 🚀 Build Production + +Lors du build en production, le service worker sera automatiquement généré : + +```bash +npm run build +``` + +### 📝 Notes + +- Le service worker est activé en développement (`devOptions.enabled: true`) +- Les mises à jour sont automatiques (`registerType: 'autoUpdate'`) +- Les icônes doivent être générées avant le premier build + diff --git a/frontend/dev-dist/registerSW.js b/frontend/dev-dist/registerSW.js new file mode 100644 index 0000000..1d5625f --- /dev/null +++ b/frontend/dev-dist/registerSW.js @@ -0,0 +1 @@ +if('serviceWorker' in navigator) navigator.serviceWorker.register('/dev-sw.js?dev-sw', { scope: '/', type: 'classic' }) \ No newline at end of file diff --git a/frontend/dev-dist/sw.js b/frontend/dev-dist/sw.js new file mode 100644 index 0000000..03ac438 --- /dev/null +++ b/frontend/dev-dist/sw.js @@ -0,0 +1,128 @@ +/** + * Copyright 2018 Google Inc. All Rights Reserved. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// If the loader is already loaded, just stop. +if (!self.define) { + let registry = {}; + + // Used for `eval` and `importScripts` where we can't get script URL by other means. + // In both cases, it's safe to use a global var because those functions are synchronous. + let nextDefineUri; + + const singleRequire = (uri, parentUri) => { + uri = new URL(uri + ".js", parentUri).href; + return registry[uri] || ( + + new Promise(resolve => { + if ("document" in self) { + const script = document.createElement("script"); + script.src = uri; + script.onload = resolve; + document.head.appendChild(script); + } else { + nextDefineUri = uri; + importScripts(uri); + resolve(); + } + }) + + .then(() => { + let promise = registry[uri]; + if (!promise) { + throw new Error(`Module ${uri} didn’t register its module`); + } + return promise; + }) + ); + }; + + self.define = (depsNames, factory) => { + const uri = nextDefineUri || ("document" in self ? document.currentScript.src : "") || location.href; + if (registry[uri]) { + // Module is already loading or loaded. + return; + } + let exports = {}; + const require = depUri => singleRequire(depUri, uri); + const specialDeps = { + module: { uri }, + exports, + require + }; + registry[uri] = Promise.all(depsNames.map( + depName => specialDeps[depName] || require(depName) + )).then(deps => { + factory(...deps); + return exports; + }); + }; +} +define(['./workbox-47da91e0'], (function (workbox) { 'use strict'; + + self.skipWaiting(); + workbox.clientsClaim(); + + /** + * The precacheAndRoute() method efficiently caches and responds to + * requests for URLs in the manifest. + * See https://goo.gl/S9QRab + */ + workbox.precacheAndRoute([{ + "url": "registerSW.js", + "revision": "3ca0b8505b4bec776b69afdba2768812" + }, { + "url": "index.html", + "revision": "0.abqp38bc5fg" + }], {}); + workbox.cleanupOutdatedCaches(); + workbox.registerRoute(new workbox.NavigationRoute(workbox.createHandlerBoundToURL("index.html"), { + allowlist: [/^\/$/] + })); + workbox.registerRoute(/^https:\/\/fonts\.googleapis\.com\/.*/i, new workbox.CacheFirst({ + "cacheName": "google-fonts-cache", + plugins: [new workbox.ExpirationPlugin({ + maxEntries: 10, + maxAgeSeconds: 31536000 + }), new workbox.CacheableResponsePlugin({ + statuses: [0, 200] + })] + }), 'GET'); + workbox.registerRoute(/^https:\/\/fonts\.gstatic\.com\/.*/i, new workbox.CacheFirst({ + "cacheName": "gstatic-fonts-cache", + plugins: [new workbox.ExpirationPlugin({ + maxEntries: 10, + maxAgeSeconds: 31536000 + }), new workbox.CacheableResponsePlugin({ + statuses: [0, 200] + })] + }), 'GET'); + workbox.registerRoute(/^https?:\/\/.*\/api\/.*/i, new workbox.NetworkFirst({ + "cacheName": "api-cache", + "networkTimeoutSeconds": 10, + plugins: [new workbox.ExpirationPlugin({ + maxEntries: 50, + maxAgeSeconds: 300 + })] + }), 'GET'); + workbox.registerRoute(/^https?:\/\/.*\/uploads\/.*/i, new workbox.CacheFirst({ + "cacheName": "uploads-cache", + plugins: [new workbox.ExpirationPlugin({ + maxEntries: 100, + maxAgeSeconds: 604800 + }), new workbox.CacheableResponsePlugin({ + statuses: [0, 200] + })] + }), 'GET'); + +})); +//# sourceMappingURL=sw.js.map diff --git a/frontend/dev-dist/sw.js.map b/frontend/dev-dist/sw.js.map new file mode 100644 index 0000000..e877817 --- /dev/null +++ b/frontend/dev-dist/sw.js.map @@ -0,0 +1 @@ +{"version":3,"file":"sw.js","sources":["../tmp/e7a8c6b0ef478d4cd50df612e524ab06/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from '/app/node_modules/workbox-routing/registerRoute.mjs';\nimport {ExpirationPlugin as workbox_expiration_ExpirationPlugin} from '/app/node_modules/workbox-expiration/ExpirationPlugin.mjs';\nimport {CacheableResponsePlugin as workbox_cacheable_response_CacheableResponsePlugin} from '/app/node_modules/workbox-cacheable-response/CacheableResponsePlugin.mjs';\nimport {CacheFirst as workbox_strategies_CacheFirst} from '/app/node_modules/workbox-strategies/CacheFirst.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from '/app/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from '/app/node_modules/workbox-core/clientsClaim.mjs';\nimport {precacheAndRoute as workbox_precaching_precacheAndRoute} from '/app/node_modules/workbox-precaching/precacheAndRoute.mjs';\nimport {cleanupOutdatedCaches as workbox_precaching_cleanupOutdatedCaches} from '/app/node_modules/workbox-precaching/cleanupOutdatedCaches.mjs';\nimport {NavigationRoute as workbox_routing_NavigationRoute} from '/app/node_modules/workbox-routing/NavigationRoute.mjs';\nimport {createHandlerBoundToURL as workbox_precaching_createHandlerBoundToURL} from '/app/node_modules/workbox-precaching/createHandlerBoundToURL.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\n\n\n\n\n\n\nself.skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n/**\n * The precacheAndRoute() method efficiently caches and responds to\n * requests for URLs in the manifest.\n * See https://goo.gl/S9QRab\n */\nworkbox_precaching_precacheAndRoute([\n {\n \"url\": \"registerSW.js\",\n \"revision\": \"3ca0b8505b4bec776b69afdba2768812\"\n },\n {\n \"url\": \"index.html\",\n \"revision\": \"0.abqp38bc5fg\"\n }\n], {});\nworkbox_precaching_cleanupOutdatedCaches();\nworkbox_routing_registerRoute(new workbox_routing_NavigationRoute(workbox_precaching_createHandlerBoundToURL(\"index.html\"), {\n allowlist: [/^\\/$/],\n \n}));\n\n\nworkbox_routing_registerRoute(/^https:\\/\\/fonts\\.googleapis\\.com\\/.*/i, new workbox_strategies_CacheFirst({ \"cacheName\":\"google-fonts-cache\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 10, maxAgeSeconds: 31536000 }), new workbox_cacheable_response_CacheableResponsePlugin({ statuses: [ 0, 200 ] })] }), 'GET');\nworkbox_routing_registerRoute(/^https:\\/\\/fonts\\.gstatic\\.com\\/.*/i, new workbox_strategies_CacheFirst({ \"cacheName\":\"gstatic-fonts-cache\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 10, maxAgeSeconds: 31536000 }), new workbox_cacheable_response_CacheableResponsePlugin({ statuses: [ 0, 200 ] })] }), 'GET');\nworkbox_routing_registerRoute(/^https?:\\/\\/.*\\/api\\/.*/i, new workbox_strategies_NetworkFirst({ \"cacheName\":\"api-cache\",\"networkTimeoutSeconds\":10, plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 50, maxAgeSeconds: 300 })] }), 'GET');\nworkbox_routing_registerRoute(/^https?:\\/\\/.*\\/uploads\\/.*/i, new workbox_strategies_CacheFirst({ \"cacheName\":\"uploads-cache\", plugins: [new workbox_expiration_ExpirationPlugin({ maxEntries: 100, maxAgeSeconds: 604800 }), new workbox_cacheable_response_CacheableResponsePlugin({ statuses: [ 0, 200 ] })] }), 'GET');\n\n\n\n\n"],"names":["self","skipWaiting","workbox_core_clientsClaim","workbox_precaching_precacheAndRoute","workbox_precaching_cleanupOutdatedCaches","workbox_routing_registerRoute","workbox_routing_NavigationRoute","workbox_precaching_createHandlerBoundToURL","allowlist","workbox_strategies_CacheFirst","plugins","workbox_expiration_ExpirationPlugin","maxEntries","maxAgeSeconds","workbox_cacheable_response_CacheableResponsePlugin","statuses","workbox_strategies_NetworkFirst"],"mappings":"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"} \ No newline at end of file diff --git a/frontend/dev-dist/workbox-47da91e0.js b/frontend/dev-dist/workbox-47da91e0.js new file mode 100644 index 0000000..a080d1d --- /dev/null +++ b/frontend/dev-dist/workbox-47da91e0.js @@ -0,0 +1,4785 @@ +define(['exports'], (function (exports) { 'use strict'; + + // @ts-ignore + try { + self['workbox:core:7.2.0'] && _(); + } catch (e) {} + + /* + 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 logger = (() => { + // Don't overwrite this value if it's already set. + // See https://github.com/GoogleChrome/workbox/pull/2284#issuecomment-560470923 + if (!('__WB_DISABLE_DEV_LOGS' in globalThis)) { + self.__WB_DISABLE_DEV_LOGS = false; + } + let inGroup = false; + const methodToColorMap = { + debug: `#7f8c8d`, + log: `#2ecc71`, + warn: `#f39c12`, + error: `#c0392b`, + groupCollapsed: `#3498db`, + groupEnd: null // No colored prefix on groupEnd + }; + const print = function (method, args) { + if (self.__WB_DISABLE_DEV_LOGS) { + return; + } + if (method === 'groupCollapsed') { + // Safari doesn't print all console.groupCollapsed() arguments: + // https://bugs.webkit.org/show_bug.cgi?id=182754 + 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`]; + // When in a group, the workbox prefix is not displayed. + const logPrefix = inGroup ? [] : ['%cworkbox', styles.join(';')]; + console[method](...logPrefix, ...args); + if (method === 'groupCollapsed') { + inGroup = true; + } + if (method === 'groupEnd') { + inGroup = false; + } + }; + // eslint-disable-next-line @typescript-eslint/ban-types + const api = {}; + const loggerMethods = Object.keys(methodToColorMap); + for (const key of loggerMethods) { + const method = key; + api[method] = (...args) => { + print(method, args); + }; + } + return api; + })(); + + /* + 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 messages$1 = { + '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.`); + } + const classNameStr = className ? `${className}.` : ''; + return `The parameter '${paramName}' passed into ` + `'${moduleName}.${classNameStr}` + `${funcName}()' must be of type ${expectedType}.`; + }, + 'incorrect-class': ({ + expectedClassName, + paramName, + moduleName, + className, + funcName, + isReturnValueProblem + }) => { + if (!expectedClassName || !moduleName || !funcName) { + throw new Error(`Unexpected input to 'incorrect-class' error.`); + } + const classNameStr = className ? `${className}.` : ''; + if (isReturnValueProblem) { + return `The return value from ` + `'${moduleName}.${classNameStr}${funcName}()' ` + `must be an instance of class ${expectedClassName}.`; + } + return `The parameter '${paramName}' passed into ` + `'${moduleName}.${classNameStr}${funcName}()' ` + `must be an instance of class ${expectedClassName}.`; + }, + '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} 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': ({ + thrownErrorMessage + }) => { + if (!thrownErrorMessage) { + 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: '${thrownErrorMessage}'.`; + }, + '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` + (status ? ` 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}.`; + }, + 'cross-origin-copy-response': ({ + origin + }) => { + return `workbox-core.copyResponse() can only be used with same-origin ` + `responses. It was passed a response with origin ${origin}.`; + }, + 'opaque-streams-source': ({ + type + }) => { + const message = `One of the workbox-streams sources resulted in an ` + `'${type}' response.`; + if (type === 'opaqueredirect') { + return `${message} Please do not use a navigation request that results ` + `in a redirect as a source.`; + } + return `${message} Please ensure your sources are CORS-enabled.`; + } + }; + + /* + 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 generatorFunction = (code, details = {}) => { + const message = messages$1[code]; + if (!message) { + throw new Error(`Unable to find message for code '${code}'.`); + } + return message(details); + }; + const messageGenerator = generatorFunction; + + /* + 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. + */ + /** + * Workbox errors should be thrown with this class. + * This allows use to ensure the type easily in tests, + * helps developers identify errors from workbox + * easily and allows use to optimise error + * messages correctly. + * + * @private + */ + class WorkboxError extends Error { + /** + * + * @param {string} errorCode The error code that + * identifies this particular error. + * @param {Object=} details Any relevant arguments + * that will help developers identify issues should + * be added as a key on the context object. + */ + constructor(errorCode, details) { + const message = messageGenerator(errorCode, details); + super(message); + this.name = errorCode; + this.details = details; + } + } + + /* + 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. + */ + /* + * This method throws if the supplied value is not an array. + * The destructed values are required to produce a meaningful error for users. + * The destructed and restructured object is so it's clear what is + * needed. + */ + const isArray = (value, details) => { + if (!Array.isArray(value)) { + throw new WorkboxError('not-an-array', details); + } + }; + const hasMethod = (object, expectedMethod, details) => { + const type = typeof object[expectedMethod]; + if (type !== 'function') { + details['expectedMethod'] = expectedMethod; + throw new WorkboxError('missing-a-method', details); + } + }; + const isType = (object, expectedType, details) => { + if (typeof object !== expectedType) { + details['expectedType'] = expectedType; + throw new WorkboxError('incorrect-type', details); + } + }; + const isInstance = (object, + // Need the general type to do the check later. + // eslint-disable-next-line @typescript-eslint/ban-types + expectedClass, details) => { + if (!(object instanceof expectedClass)) { + details['expectedClassName'] = expectedClass.name; + throw new WorkboxError('incorrect-class', details); + } + }; + const isOneOf = (value, validValues, details) => { + if (!validValues.includes(value)) { + details['validValueDescription'] = `Valid values are ${JSON.stringify(validValues)}.`; + throw new WorkboxError('invalid-value', details); + } + }; + const isArrayOfClass = (value, + // Need general type to do check later. + expectedClass, + // eslint-disable-line + 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; + } + } + }; + const finalAssertExports = { + hasMethod, + isArray, + isInstance, + isOneOf, + isType, + isArrayOfClass + }; + + // @ts-ignore + try { + self['workbox:routing:7.2.0'] && _(); + } catch (e) {} + + /* + 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. + */ + /** + * The default HTTP method, 'GET', used when there's no specific method + * configured for a route. + * + * @type {string} + * + * @private + */ + const defaultMethod = 'GET'; + /** + * The list of valid HTTP methods associated with requests that could be routed. + * + * @type {Array} + * + * @private + */ + const validMethods = ['DELETE', 'GET', 'HEAD', 'PATCH', 'POST', 'PUT']; + + /* + 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. + */ + /** + * @param {function()|Object} handler Either a function, or an object with a + * 'handle' method. + * @return {Object} An object with a handle method. + * + * @private + */ + const normalizeHandler = handler => { + if (handler && typeof handler === 'object') { + { + finalAssertExports.hasMethod(handler, 'handle', { + moduleName: 'workbox-routing', + className: 'Route', + funcName: 'constructor', + paramName: 'handler' + }); + } + return handler; + } else { + { + finalAssertExports.isType(handler, 'function', { + moduleName: 'workbox-routing', + className: 'Route', + funcName: 'constructor', + paramName: 'handler' + }); + } + return { + handle: handler + }; + } + }; + + /* + 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. + */ + /** + * A `Route` consists of a pair of callback functions, "match" and "handler". + * The "match" callback determine if a route should be used to "handle" a + * request by returning a non-falsy value if it can. The "handler" callback + * is called when there is a match and should return a Promise that resolves + * to a `Response`. + * + * @memberof workbox-routing + */ + class Route { + /** + * Constructor for Route class. + * + * @param {workbox-routing~matchCallback} match + * A callback function that determines whether the route matches a given + * `fetch` event by returning a non-falsy value. + * @param {workbox-routing~handlerCallback} handler A callback + * function that returns a Promise resolving to a Response. + * @param {string} [method='GET'] The HTTP method to match the Route + * against. + */ + constructor(match, handler, method = defaultMethod) { + { + finalAssertExports.isType(match, 'function', { + moduleName: 'workbox-routing', + className: 'Route', + funcName: 'constructor', + paramName: 'match' + }); + if (method) { + finalAssertExports.isOneOf(method, validMethods, { + paramName: 'method' + }); + } + } + // These values are referenced directly by Router so cannot be + // altered by minificaton. + this.handler = normalizeHandler(handler); + this.match = match; + this.method = method; + } + /** + * + * @param {workbox-routing-handlerCallback} handler A callback + * function that returns a Promise resolving to a Response + */ + setCatchHandler(handler) { + this.catchHandler = normalizeHandler(handler); + } + } + + /* + 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. + */ + /** + * RegExpRoute makes it easy to create a regular expression based + * {@link workbox-routing.Route}. + * + * For same-origin requests the RegExp only needs to match part of the URL. For + * requests against third-party servers, you must define a RegExp that matches + * the start of the URL. + * + * @memberof workbox-routing + * @extends workbox-routing.Route + */ + class RegExpRoute extends Route { + /** + * If the regular expression contains + * [capture groups]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#grouping-back-references}, + * the captured values will be passed to the + * {@link workbox-routing~handlerCallback} `params` + * argument. + * + * @param {RegExp} regExp The regular expression to match against URLs. + * @param {workbox-routing~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + * @param {string} [method='GET'] The HTTP method to match the Route + * against. + */ + constructor(regExp, handler, method) { + { + finalAssertExports.isInstance(regExp, RegExp, { + moduleName: 'workbox-routing', + className: 'RegExpRoute', + funcName: 'constructor', + paramName: 'pattern' + }); + } + const match = ({ + url + }) => { + const result = regExp.exec(url.href); + // Return immediately if there's no match. + if (!result) { + return; + } + // Require that the match start at the first character in the URL string + // if it's a cross-origin request. + // See https://github.com/GoogleChrome/workbox/issues/281 for the context + // behind this behavior. + if (url.origin !== location.origin && result.index !== 0) { + { + logger.debug(`The regular expression '${regExp.toString()}' only partially matched ` + `against the cross-origin URL '${url.toString()}'. RegExpRoute's will only ` + `handle cross-origin requests if they match the entire URL.`); + } + return; + } + // If the route matches, but there aren't any capture groups defined, then + // this will return [], which is truthy and therefore sufficient to + // indicate a match. + // If there are capture groups, then it will return their values. + return result.slice(1); + }; + super(match, handler, method); + } + } + + /* + 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 getFriendlyURL = url => { + const urlObj = new URL(String(url), location.href); + // See https://github.com/GoogleChrome/workbox/issues/2323 + // We want to include everything, except for the origin if it's same-origin. + return urlObj.href.replace(new RegExp(`^${location.origin}`), ''); + }; + + /* + 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. + */ + /** + * The Router can be used to process a `FetchEvent` using one or more + * {@link workbox-routing.Route}, responding with a `Response` if + * a matching route exists. + * + * If no route matches a given a request, the Router will use a "default" + * handler if one is defined. + * + * Should the matching Route throw an error, the Router will use a "catch" + * handler if one is defined to gracefully deal with issues and respond with a + * Request. + * + * If a request matches multiple routes, the **earliest** registered route will + * be used to respond to the request. + * + * @memberof workbox-routing + */ + class Router { + /** + * Initializes a new Router. + */ + constructor() { + this._routes = new Map(); + this._defaultHandlerMap = new Map(); + } + /** + * @return {Map>} routes A `Map` of HTTP + * method name ('GET', etc.) to an array of all the corresponding `Route` + * instances that are registered. + */ + get routes() { + return this._routes; + } + /** + * Adds a fetch event listener to respond to events when a route matches + * the event's request. + */ + addFetchListener() { + // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705 + self.addEventListener('fetch', event => { + const { + request + } = event; + const responsePromise = this.handleRequest({ + request, + event + }); + if (responsePromise) { + event.respondWith(responsePromise); + } + }); + } + /** + * Adds a message event listener for URLs to cache from the window. + * This is useful to cache resources loaded on the page prior to when the + * service worker started controlling it. + * + * The format of the message data sent from the window should be as follows. + * Where the `urlsToCache` array may consist of URL strings or an array of + * URL string + `requestInit` object (the same as you'd pass to `fetch()`). + * + * ``` + * { + * type: 'CACHE_URLS', + * payload: { + * urlsToCache: [ + * './script1.js', + * './script2.js', + * ['./script3.js', {mode: 'no-cors'}], + * ], + * }, + * } + * ``` + */ + addCacheListener() { + // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705 + self.addEventListener('message', event => { + // event.data is type 'any' + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + if (event.data && event.data.type === 'CACHE_URLS') { + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const { + payload + } = event.data; + { + 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 + }); + // TODO(philipwalton): TypeScript errors without this typecast for + // some reason (probably a bug). The real type here should work but + // doesn't: `Array | undefined>`. + })); // TypeScript + event.waitUntil(requestPromises); + // If a MessageChannel was used, reply to the message on success. + if (event.ports && event.ports[0]) { + void requestPromises.then(() => event.ports[0].postMessage(true)); + } + } + }); + } + /** + * Apply the routing rules to a FetchEvent object to get a Response from an + * appropriate Route's handler. + * + * @param {Object} options + * @param {Request} options.request The request to handle. + * @param {ExtendableEvent} options.event The event that triggered the + * request. + * @return {Promise|undefined} A promise is returned if a + * registered route can handle the request. If there is no matching + * route and there's no `defaultHandler`, `undefined` is returned. + */ + handleRequest({ + request, + event + }) { + { + 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')) { + { + logger.debug(`Workbox Router only supports URLs that start with 'http'.`); + } + return; + } + const sameOrigin = url.origin === location.origin; + const { + params, + route + } = this.findMatchingRoute({ + event, + request, + sameOrigin, + url + }); + let handler = route && route.handler; + const debugMessages = []; + { + 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 we don't have a handler because there was no matching route, then + // fall back to defaultHandler if that's defined. + const method = request.method; + if (!handler && this._defaultHandlerMap.has(method)) { + { + debugMessages.push(`Failed to find a matching route. Falling ` + `back to the default handler for ${method}.`); + } + handler = this._defaultHandlerMap.get(method); + } + if (!handler) { + { + // No handler so Workbox will do nothing. If logs is set of debug + // i.e. verbose, we should print out this information. + logger.debug(`No route found for: ${getFriendlyURL(url)}`); + } + return; + } + { + // We have a handler, meaning Workbox is going to handle the route. + // print the routing details to the console. + logger.groupCollapsed(`Router is responding to: ${getFriendlyURL(url)}`); + debugMessages.forEach(msg => { + if (Array.isArray(msg)) { + logger.log(...msg); + } else { + logger.log(msg); + } + }); + logger.groupEnd(); + } + // Wrap in try and catch in case the handle method throws a synchronous + // error. It should still callback to the catch handler. + let responsePromise; + try { + responsePromise = handler.handle({ + url, + request, + event, + params + }); + } catch (err) { + responsePromise = Promise.reject(err); + } + // Get route's catch handler, if it exists + const catchHandler = route && route.catchHandler; + if (responsePromise instanceof Promise && (this._catchHandler || catchHandler)) { + responsePromise = responsePromise.catch(async err => { + // If there's a route catch handler, process that first + if (catchHandler) { + { + // Still include URL here as it will be async from the console group + // and may not make sense without the URL + logger.groupCollapsed(`Error thrown when responding to: ` + ` ${getFriendlyURL(url)}. Falling back to route's Catch Handler.`); + logger.error(`Error thrown by:`, route); + logger.error(err); + logger.groupEnd(); + } + try { + return await catchHandler.handle({ + url, + request, + event, + params + }); + } catch (catchErr) { + if (catchErr instanceof Error) { + err = catchErr; + } + } + } + if (this._catchHandler) { + { + // Still include URL here as it will be async from the console group + // and may not make sense without the URL + logger.groupCollapsed(`Error thrown when responding to: ` + ` ${getFriendlyURL(url)}. Falling back to global Catch Handler.`); + logger.error(`Error thrown by:`, route); + logger.error(err); + logger.groupEnd(); + } + return this._catchHandler.handle({ + url, + request, + event + }); + } + throw err; + }); + } + return responsePromise; + } + /** + * Checks a request and URL (and optionally an event) against the list of + * registered routes, and if there's a match, returns the corresponding + * route along with any params generated by the match. + * + * @param {Object} options + * @param {URL} options.url + * @param {boolean} options.sameOrigin The result of comparing `url.origin` + * against the current origin. + * @param {Request} options.request The request to match. + * @param {Event} options.event The corresponding event. + * @return {Object} An object with `route` and `params` properties. + * They are populated if a matching route was found or `undefined` + * otherwise. + */ + findMatchingRoute({ + url, + sameOrigin, + request, + event + }) { + const routes = this._routes.get(request.method) || []; + for (const route of routes) { + let params; + // route.match returns type any, not possible to change right now. + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + const matchResult = route.match({ + url, + sameOrigin, + request, + event + }); + if (matchResult) { + { + // Warn developers that using an async matchCallback is almost always + // not the right thing to do. + if (matchResult instanceof Promise) { + logger.warn(`While routing ${getFriendlyURL(url)}, an async ` + `matchCallback function was used. Please convert the ` + `following route to use a synchronous matchCallback function:`, route); + } + } + // See https://github.com/GoogleChrome/workbox/issues/2079 + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment + params = matchResult; + if (Array.isArray(params) && params.length === 0) { + // Instead of passing an empty array in as params, use undefined. + params = undefined; + } else if (matchResult.constructor === Object && + // eslint-disable-line + Object.keys(matchResult).length === 0) { + // Instead of passing an empty object in as params, use undefined. + params = undefined; + } else if (typeof matchResult === 'boolean') { + // For the boolean value true (rather than just something truth-y), + // don't set params. + // See https://github.com/GoogleChrome/workbox/pull/2134#issuecomment-513924353 + params = undefined; + } + // Return early if have a match. + return { + route, + params + }; + } + } + // If no match was found above, return and empty object. + return {}; + } + /** + * Define a default `handler` that's called when no routes explicitly + * match the incoming request. + * + * Each HTTP method ('GET', 'POST', etc.) gets its own default handler. + * + * Without a default handler, unmatched requests will go against the + * network as if there were no service worker present. + * + * @param {workbox-routing~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + * @param {string} [method='GET'] The HTTP method to associate with this + * default handler. Each method has its own default. + */ + setDefaultHandler(handler, method = defaultMethod) { + this._defaultHandlerMap.set(method, normalizeHandler(handler)); + } + /** + * If a Route throws an error while handling a request, this `handler` + * will be called and given a chance to provide a response. + * + * @param {workbox-routing~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + */ + setCatchHandler(handler) { + this._catchHandler = normalizeHandler(handler); + } + /** + * Registers a route with the router. + * + * @param {workbox-routing.Route} route The route to register. + */ + registerRoute(route) { + { + 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, []); + } + // Give precedence to all of the earlier routes by adding this additional + // route to the end of the array. + this._routes.get(route.method).push(route); + } + /** + * Unregisters a route with the router. + * + * @param {workbox-routing.Route} route The route to unregister. + */ + 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'); + } + } + } + + /* + 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. + */ + let defaultRouter; + /** + * Creates a new, singleton Router instance if one does not exist. If one + * does already exist, that instance is returned. + * + * @private + * @return {Router} + */ + const getOrCreateDefaultRouter = () => { + if (!defaultRouter) { + defaultRouter = new Router(); + // The helpers that use the default Router assume these listeners exist. + defaultRouter.addFetchListener(); + defaultRouter.addCacheListener(); + } + return defaultRouter; + }; + + /* + 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. + */ + /** + * Easily register a RegExp, string, or function with a caching + * strategy to a singleton Router instance. + * + * This method will generate a Route for you if needed and + * call {@link workbox-routing.Router#registerRoute}. + * + * @param {RegExp|string|workbox-routing.Route~matchCallback|workbox-routing.Route} capture + * If the capture param is a `Route`, all other arguments will be ignored. + * @param {workbox-routing~handlerCallback} [handler] A callback + * function that returns a Promise resulting in a Response. This parameter + * is required if `capture` is not a `Route` object. + * @param {string} [method='GET'] The HTTP method to match the Route + * against. + * @return {workbox-routing.Route} The generated `Route`. + * + * @memberof workbox-routing + */ + function registerRoute(capture, handler, method) { + let route; + if (typeof capture === 'string') { + const captureUrl = new URL(capture, location.href); + { + if (!(capture.startsWith('/') || capture.startsWith('http'))) { + throw new WorkboxError('invalid-string', { + moduleName: 'workbox-routing', + funcName: 'registerRoute', + paramName: 'capture' + }); + } + // We want to check if Express-style wildcards are in the pathname only. + // TODO: Remove this log message in v4. + const valueToCheck = capture.startsWith('http') ? captureUrl.pathname : capture; + // See https://github.com/pillarjs/path-to-regexp#parameters + 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 (url.pathname === captureUrl.pathname && url.origin !== captureUrl.origin) { + logger.debug(`${capture} only partially matches the cross-origin URL ` + `${url.toString()}. This route will only handle cross-origin requests ` + `if they match the entire URL.`); + } + } + return url.href === captureUrl.href; + }; + // If `capture` is a string then `handler` and `method` must be present. + route = new Route(matchCallback, handler, method); + } else if (capture instanceof RegExp) { + // If `capture` is a `RegExp` then `handler` and `method` must be present. + route = new RegExpRoute(capture, handler, method); + } else if (typeof capture === 'function') { + // If `capture` is a function then `handler` and `method` must be present. + 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 defaultRouter = getOrCreateDefaultRouter(); + defaultRouter.registerRoute(route); + return route; + } + + /* + 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 _cacheNameDetails = { + googleAnalytics: 'googleAnalytics', + precache: 'precache-v2', + prefix: 'workbox', + runtime: 'runtime', + suffix: typeof registration !== 'undefined' ? registration.scope : '' + }; + const _createCacheName = cacheName => { + return [_cacheNameDetails.prefix, cacheName, _cacheNameDetails.suffix].filter(value => value && value.length > 0).join('-'); + }; + const eachCacheNameDetail = fn => { + for (const key of Object.keys(_cacheNameDetails)) { + fn(key); + } + }; + const 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; + } + }; + + /* + 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. + */ + /** + * A helper function that prevents a promise from being flagged as unused. + * + * @private + **/ + function dontWaitFor(promise) { + // Effective no-op. + void promise.then(() => {}); + } + + /* + 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. + */ + // Callbacks to be executed whenever there's a quota error. + // Can't change Function type right now. + // eslint-disable-next-line @typescript-eslint/ban-types + const quotaErrorCallbacks = new Set(); + + /* + 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. + */ + /** + * Adds a function to the set of quotaErrorCallbacks that will be executed if + * there's a quota error. + * + * @param {Function} callback + * @memberof workbox-core + */ + // Can't change Function type + // eslint-disable-next-line @typescript-eslint/ban-types + function registerQuotaErrorCallback(callback) { + { + finalAssertExports.isType(callback, 'function', { + moduleName: 'workbox-core', + funcName: 'register', + paramName: 'callback' + }); + } + quotaErrorCallbacks.add(callback); + { + logger.log('Registered a callback to respond to quota errors.', callback); + } + } + + function _extends() { + return _extends = Object.assign ? Object.assign.bind() : function (n) { + for (var e = 1; e < arguments.length; e++) { + var t = arguments[e]; + for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); + } + return n; + }, _extends.apply(null, arguments); + } + + const instanceOfAny = (object, constructors) => constructors.some(c => object instanceof c); + let idbProxyableTypes; + let cursorAdvanceMethods; + // This is a function to prevent it throwing up in node environments. + function getIdbProxyableTypes() { + return idbProxyableTypes || (idbProxyableTypes = [IDBDatabase, IDBObjectStore, IDBIndex, IDBCursor, IDBTransaction]); + } + // This is a function to prevent it throwing up in node environments. + function getCursorAdvanceMethods() { + return cursorAdvanceMethods || (cursorAdvanceMethods = [IDBCursor.prototype.advance, IDBCursor.prototype.continue, IDBCursor.prototype.continuePrimaryKey]); + } + const cursorRequestMap = new WeakMap(); + const transactionDoneMap = new WeakMap(); + const transactionStoreNamesMap = new WeakMap(); + const transformCache = new WeakMap(); + const reverseTransformCache = new WeakMap(); + function promisifyRequest(request) { + const promise = new Promise((resolve, reject) => { + const unlisten = () => { + request.removeEventListener('success', success); + request.removeEventListener('error', error); + }; + const success = () => { + resolve(wrap(request.result)); + unlisten(); + }; + const error = () => { + reject(request.error); + unlisten(); + }; + request.addEventListener('success', success); + request.addEventListener('error', error); + }); + promise.then(value => { + // Since cursoring reuses the IDBRequest (*sigh*), we cache it for later retrieval + // (see wrapFunction). + if (value instanceof IDBCursor) { + cursorRequestMap.set(value, request); + } + // Catching to avoid "Uncaught Promise exceptions" + }).catch(() => {}); + // This mapping exists in reverseTransformCache but doesn't doesn't exist in transformCache. This + // is because we create many promises from a single IDBRequest. + reverseTransformCache.set(promise, request); + return promise; + } + function cacheDonePromiseForTransaction(tx) { + // Early bail if we've already created a done promise for this transaction. + if (transactionDoneMap.has(tx)) return; + const done = new Promise((resolve, reject) => { + const unlisten = () => { + tx.removeEventListener('complete', complete); + tx.removeEventListener('error', error); + tx.removeEventListener('abort', error); + }; + const complete = () => { + resolve(); + unlisten(); + }; + const error = () => { + reject(tx.error || new DOMException('AbortError', 'AbortError')); + unlisten(); + }; + tx.addEventListener('complete', complete); + tx.addEventListener('error', error); + tx.addEventListener('abort', error); + }); + // Cache it for later retrieval. + transactionDoneMap.set(tx, done); + } + let idbProxyTraps = { + get(target, prop, receiver) { + if (target instanceof IDBTransaction) { + // Special handling for transaction.done. + if (prop === 'done') return transactionDoneMap.get(target); + // Polyfill for objectStoreNames because of Edge. + if (prop === 'objectStoreNames') { + return target.objectStoreNames || transactionStoreNamesMap.get(target); + } + // Make tx.store return the only store in the transaction, or undefined if there are many. + if (prop === 'store') { + return receiver.objectStoreNames[1] ? undefined : receiver.objectStore(receiver.objectStoreNames[0]); + } + } + // Else transform whatever we get back. + return wrap(target[prop]); + }, + set(target, prop, value) { + target[prop] = value; + return true; + }, + has(target, prop) { + if (target instanceof IDBTransaction && (prop === 'done' || prop === 'store')) { + return true; + } + return prop in target; + } + }; + function replaceTraps(callback) { + idbProxyTraps = callback(idbProxyTraps); + } + function wrapFunction(func) { + // Due to expected object equality (which is enforced by the caching in `wrap`), we + // only create one new func per func. + // Edge doesn't support objectStoreNames (booo), so we polyfill it here. + if (func === IDBDatabase.prototype.transaction && !('objectStoreNames' in IDBTransaction.prototype)) { + return function (storeNames, ...args) { + const tx = func.call(unwrap(this), storeNames, ...args); + transactionStoreNamesMap.set(tx, storeNames.sort ? storeNames.sort() : [storeNames]); + return wrap(tx); + }; + } + // Cursor methods are special, as the behaviour is a little more different to standard IDB. In + // IDB, you advance the cursor and wait for a new 'success' on the IDBRequest that gave you the + // cursor. It's kinda like a promise that can resolve with many values. That doesn't make sense + // with real promises, so each advance methods returns a new promise for the cursor object, or + // undefined if the end of the cursor has been reached. + if (getCursorAdvanceMethods().includes(func)) { + return function (...args) { + // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use + // the original object. + func.apply(unwrap(this), args); + return wrap(cursorRequestMap.get(this)); + }; + } + return function (...args) { + // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use + // the original object. + return wrap(func.apply(unwrap(this), args)); + }; + } + function transformCachableValue(value) { + if (typeof value === 'function') return wrapFunction(value); + // This doesn't return, it just creates a 'done' promise for the transaction, + // which is later returned for transaction.done (see idbObjectHandler). + if (value instanceof IDBTransaction) cacheDonePromiseForTransaction(value); + if (instanceOfAny(value, getIdbProxyableTypes())) return new Proxy(value, idbProxyTraps); + // Return the same value back if we're not going to transform it. + return value; + } + function wrap(value) { + // We sometimes generate multiple promises from a single IDBRequest (eg when cursoring), because + // IDB is weird and a single IDBRequest can yield many responses, so these can't be cached. + if (value instanceof IDBRequest) return promisifyRequest(value); + // If we've already transformed this value before, reuse the transformed value. + // This is faster, but it also provides object equality. + if (transformCache.has(value)) return transformCache.get(value); + const newValue = transformCachableValue(value); + // Not all types are transformed. + // These may be primitive types, so they can't be WeakMap keys. + if (newValue !== value) { + transformCache.set(value, newValue); + reverseTransformCache.set(newValue, value); + } + return newValue; + } + const unwrap = value => reverseTransformCache.get(value); + + /** + * Open a database. + * + * @param name Name of the database. + * @param version Schema version. + * @param callbacks Additional callbacks. + */ + function openDB(name, version, { + blocked, + upgrade, + blocking, + terminated + } = {}) { + const request = indexedDB.open(name, version); + const openPromise = wrap(request); + if (upgrade) { + request.addEventListener('upgradeneeded', event => { + upgrade(wrap(request.result), event.oldVersion, event.newVersion, wrap(request.transaction), event); + }); + } + if (blocked) { + request.addEventListener('blocked', event => blocked( + // Casting due to https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/1405 + event.oldVersion, event.newVersion, event)); + } + openPromise.then(db => { + if (terminated) db.addEventListener('close', () => terminated()); + if (blocking) { + db.addEventListener('versionchange', event => blocking(event.oldVersion, event.newVersion, event)); + } + }).catch(() => {}); + return openPromise; + } + /** + * Delete a database. + * + * @param name Name of the database. + */ + function deleteDB(name, { + blocked + } = {}) { + const request = indexedDB.deleteDatabase(name); + if (blocked) { + request.addEventListener('blocked', event => blocked( + // Casting due to https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/1405 + event.oldVersion, event)); + } + return wrap(request).then(() => undefined); + } + const readMethods = ['get', 'getKey', 'getAll', 'getAllKeys', 'count']; + const writeMethods = ['put', 'add', 'delete', 'clear']; + const cachedMethods = new Map(); + function getMethod(target, prop) { + if (!(target instanceof IDBDatabase && !(prop in target) && typeof prop === 'string')) { + return; + } + if (cachedMethods.get(prop)) return cachedMethods.get(prop); + const targetFuncName = prop.replace(/FromIndex$/, ''); + const useIndex = prop !== targetFuncName; + const isWrite = writeMethods.includes(targetFuncName); + if ( + // Bail if the target doesn't exist on the target. Eg, getAll isn't in Edge. + !(targetFuncName in (useIndex ? IDBIndex : IDBObjectStore).prototype) || !(isWrite || readMethods.includes(targetFuncName))) { + return; + } + const method = async function (storeName, ...args) { + // isWrite ? 'readwrite' : undefined gzipps better, but fails in Edge :( + const tx = this.transaction(storeName, isWrite ? 'readwrite' : 'readonly'); + let target = tx.store; + if (useIndex) target = target.index(args.shift()); + // Must reject if op rejects. + // If it's a write operation, must reject if tx.done rejects. + // Must reject with op rejection first. + // Must resolve with op value. + // Must handle both promises (no unhandled rejections) + return (await Promise.all([target[targetFuncName](...args), isWrite && tx.done]))[0]; + }; + cachedMethods.set(prop, method); + return method; + } + replaceTraps(oldTraps => _extends({}, oldTraps, { + get: (target, prop, receiver) => getMethod(target, prop) || oldTraps.get(target, prop, receiver), + has: (target, prop) => !!getMethod(target, prop) || oldTraps.has(target, prop) + })); + + // @ts-ignore + try { + self['workbox:expiration:7.2.0'] && _(); + } catch (e) {} + + /* + 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 DB_NAME = 'workbox-expiration'; + const CACHE_OBJECT_STORE = 'cache-entries'; + const normalizeURL = unNormalizedUrl => { + const url = new URL(unNormalizedUrl, location.href); + url.hash = ''; + return url.href; + }; + /** + * Returns the timestamp model. + * + * @private + */ + class CacheTimestampsModel { + /** + * + * @param {string} cacheName + * + * @private + */ + constructor(cacheName) { + this._db = null; + this._cacheName = cacheName; + } + /** + * Performs an upgrade of indexedDB. + * + * @param {IDBPDatabase} db + * + * @private + */ + _upgradeDb(db) { + // TODO(philipwalton): EdgeHTML doesn't support arrays as a keyPath, so we + // have to use the `id` keyPath here and create our own values (a + // concatenation of `url + cacheName`) instead of simply using + // `keyPath: ['url', 'cacheName']`, which is supported in other browsers. + const objStore = db.createObjectStore(CACHE_OBJECT_STORE, { + keyPath: 'id' + }); + // TODO(philipwalton): once we don't have to support EdgeHTML, we can + // create a single index with the keyPath `['cacheName', 'timestamp']` + // instead of doing both these indexes. + objStore.createIndex('cacheName', 'cacheName', { + unique: false + }); + objStore.createIndex('timestamp', 'timestamp', { + unique: false + }); + } + /** + * Performs an upgrade of indexedDB and deletes deprecated DBs. + * + * @param {IDBPDatabase} db + * + * @private + */ + _upgradeDbAndDeleteOldDbs(db) { + this._upgradeDb(db); + if (this._cacheName) { + void deleteDB(this._cacheName); + } + } + /** + * @param {string} url + * @param {number} timestamp + * + * @private + */ + async setTimestamp(url, timestamp) { + url = normalizeURL(url); + const entry = { + url, + timestamp, + cacheName: this._cacheName, + // Creating an ID from the URL and cache name won't be necessary once + // Edge switches to Chromium and all browsers we support work with + // array keyPaths. + id: this._getId(url) + }; + const db = await this.getDb(); + const tx = db.transaction(CACHE_OBJECT_STORE, 'readwrite', { + durability: 'relaxed' + }); + await tx.store.put(entry); + await tx.done; + } + /** + * Returns the timestamp stored for a given URL. + * + * @param {string} url + * @return {number | undefined} + * + * @private + */ + async getTimestamp(url) { + const db = await this.getDb(); + const entry = await db.get(CACHE_OBJECT_STORE, this._getId(url)); + return entry === null || entry === void 0 ? void 0 : entry.timestamp; + } + /** + * Iterates through all the entries in the object store (from newest to + * oldest) and removes entries once either `maxCount` is reached or the + * entry's timestamp is less than `minTimestamp`. + * + * @param {number} minTimestamp + * @param {number} maxCount + * @return {Array} + * + * @private + */ + async expireEntries(minTimestamp, maxCount) { + const db = await this.getDb(); + let cursor = await db.transaction(CACHE_OBJECT_STORE).store.index('timestamp').openCursor(null, 'prev'); + const entriesToDelete = []; + let entriesNotDeletedCount = 0; + while (cursor) { + const result = cursor.value; + // TODO(philipwalton): once we can use a multi-key index, we + // won't have to check `cacheName` here. + if (result.cacheName === this._cacheName) { + // Delete an entry if it's older than the max age or + // if we already have the max number allowed. + if (minTimestamp && result.timestamp < minTimestamp || maxCount && entriesNotDeletedCount >= maxCount) { + // TODO(philipwalton): we should be able to delete the + // entry right here, but doing so causes an iteration + // bug in Safari stable (fixed in TP). Instead we can + // store the keys of the entries to delete, and then + // delete the separate transactions. + // https://github.com/GoogleChrome/workbox/issues/1978 + // cursor.delete(); + // We only need to return the URL, not the whole entry. + entriesToDelete.push(cursor.value); + } else { + entriesNotDeletedCount++; + } + } + cursor = await cursor.continue(); + } + // TODO(philipwalton): once the Safari bug in the following issue is fixed, + // we should be able to remove this loop and do the entry deletion in the + // cursor loop above: + // https://github.com/GoogleChrome/workbox/issues/1978 + const urlsDeleted = []; + for (const entry of entriesToDelete) { + await db.delete(CACHE_OBJECT_STORE, entry.id); + urlsDeleted.push(entry.url); + } + return urlsDeleted; + } + /** + * Takes a URL and returns an ID that will be unique in the object store. + * + * @param {string} url + * @return {string} + * + * @private + */ + _getId(url) { + // Creating an ID from the URL and cache name won't be necessary once + // Edge switches to Chromium and all browsers we support work with + // array keyPaths. + return this._cacheName + '|' + normalizeURL(url); + } + /** + * Returns an open connection to the database. + * + * @private + */ + async getDb() { + if (!this._db) { + this._db = await openDB(DB_NAME, 1, { + upgrade: this._upgradeDbAndDeleteOldDbs.bind(this) + }); + } + return this._db; + } + } + + /* + 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. + */ + /** + * The `CacheExpiration` class allows you define an expiration and / or + * limit on the number of responses stored in a + * [`Cache`](https://developer.mozilla.org/en-US/docs/Web/API/Cache). + * + * @memberof workbox-expiration + */ + class CacheExpiration { + /** + * To construct a new CacheExpiration instance you must provide at least + * one of the `config` properties. + * + * @param {string} cacheName Name of the cache to apply restrictions to. + * @param {Object} config + * @param {number} [config.maxEntries] The maximum number of entries to cache. + * Entries used the least will be removed as the maximum is reached. + * @param {number} [config.maxAgeSeconds] The maximum age of an entry before + * it's treated as stale and removed. + * @param {Object} [config.matchOptions] The [`CacheQueryOptions`](https://developer.mozilla.org/en-US/docs/Web/API/Cache/delete#Parameters) + * that will be used when calling `delete()` on the cache. + */ + constructor(cacheName, config = {}) { + this._isRunning = false; + this._rerunRequested = false; + { + 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._matchOptions = config.matchOptions; + this._cacheName = cacheName; + this._timestampModel = new CacheTimestampsModel(cacheName); + } + /** + * Expires entries for the given cache and given criteria. + */ + 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); + // Delete URLs from the cache + const cache = await self.caches.open(this._cacheName); + for (const url of urlsExpired) { + await cache.delete(url, this._matchOptions); + } + { + 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()); + } + } + /** + * Update the timestamp for the given URL. This ensures the when + * removing entries based on maximum entries, most recently used + * is accurate or when expiring, the timestamp is up-to-date. + * + * @param {string} url + */ + async updateTimestamp(url) { + { + finalAssertExports.isType(url, 'string', { + moduleName: 'workbox-expiration', + className: 'CacheExpiration', + funcName: 'updateTimestamp', + paramName: 'url' + }); + } + await this._timestampModel.setTimestamp(url, Date.now()); + } + /** + * Can be used to check if a URL has expired or not before it's used. + * + * This requires a look up from IndexedDB, so can be slow. + * + * Note: This method will not remove the cached entry, call + * `expireEntries()` to remove indexedDB and Cache entries. + * + * @param {string} url + * @return {boolean} + */ + async isURLExpired(url) { + if (!this._maxAgeSeconds) { + { + throw new WorkboxError(`expired-test-without-max-age`, { + methodName: 'isURLExpired', + paramName: 'maxAgeSeconds' + }); + } + } else { + const timestamp = await this._timestampModel.getTimestamp(url); + const expireOlderThan = Date.now() - this._maxAgeSeconds * 1000; + return timestamp !== undefined ? timestamp < expireOlderThan : true; + } + } + /** + * Removes the IndexedDB object store used to keep track of cache expiration + * metadata. + */ + async delete() { + // Make sure we don't attempt another rerun if we're called in the middle of + // a cache expiration. + this._rerunRequested = false; + await this._timestampModel.expireEntries(Infinity); // Expires all. + } + } + + /* + 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. + */ + /** + * This plugin can be used in a `workbox-strategy` to regularly enforce a + * limit on the age and / or the number of cached requests. + * + * It can only be used with `workbox-strategy` instances that have a + * [custom `cacheName` property set](/web/tools/workbox/guides/configure-workbox#custom_cache_names_in_strategies). + * In other words, it can't be used to expire entries in strategy that uses the + * default runtime cache name. + * + * Whenever a cached response is used or updated, this plugin will look + * at the associated cache and remove any old or extra responses. + * + * When using `maxAgeSeconds`, responses may be used *once* after expiring + * because the expiration clean up will not have occurred until *after* the + * cached response has been used. If the response has a "Date" header, then + * a light weight expiration check is performed and the response will not be + * used immediately. + * + * When using `maxEntries`, the entry least-recently requested will be removed + * from the cache first. + * + * @memberof workbox-expiration + */ + class ExpirationPlugin { + /** + * @param {ExpirationPluginOptions} config + * @param {number} [config.maxEntries] The maximum number of entries to cache. + * Entries used the least will be removed as the maximum is reached. + * @param {number} [config.maxAgeSeconds] The maximum age of an entry before + * it's treated as stale and removed. + * @param {Object} [config.matchOptions] The [`CacheQueryOptions`](https://developer.mozilla.org/en-US/docs/Web/API/Cache/delete#Parameters) + * that will be used when calling `delete()` on the cache. + * @param {boolean} [config.purgeOnQuotaError] Whether to opt this cache in to + * automatic deletion if the available storage quota has been exceeded. + */ + constructor(config = {}) { + /** + * A "lifecycle" callback that will be triggered automatically by the + * `workbox-strategies` handlers when a `Response` is about to be returned + * from a [Cache](https://developer.mozilla.org/en-US/docs/Web/API/Cache) to + * the handler. It allows the `Response` to be inspected for freshness and + * prevents it from being used if the `Response`'s `Date` header value is + * older than the configured `maxAgeSeconds`. + * + * @param {Object} options + * @param {string} options.cacheName Name of the cache the response is in. + * @param {Response} options.cachedResponse The `Response` object that's been + * read from a cache and whose freshness should be checked. + * @return {Response} Either the `cachedResponse`, if it's + * fresh, or `null` if the `Response` is older than `maxAgeSeconds`. + * + * @private + */ + this.cachedResponseWillBeUsed = async ({ + event, + request, + cacheName, + cachedResponse + }) => { + if (!cachedResponse) { + return null; + } + const isFresh = this._isResponseDateFresh(cachedResponse); + // Expire entries to ensure that even if the expiration date has + // expired, it'll only be used once. + const cacheExpiration = this._getCacheExpiration(cacheName); + dontWaitFor(cacheExpiration.expireEntries()); + // Update the metadata for the request URL to the current timestamp, + // but don't `await` it as we don't want to block the response. + const updateTimestampDone = cacheExpiration.updateTimestamp(request.url); + if (event) { + try { + event.waitUntil(updateTimestampDone); + } catch (error) { + { + // The event may not be a fetch event; only log the URL if it is. + 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; + }; + /** + * A "lifecycle" callback that will be triggered automatically by the + * `workbox-strategies` handlers when an entry is added to a cache. + * + * @param {Object} options + * @param {string} options.cacheName Name of the cache that was updated. + * @param {string} options.request The Request for the cached entry. + * + * @private + */ + this.cacheDidUpdate = async ({ + cacheName, + request + }) => { + { + 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 (!(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()); + } + } + /** + * A simple helper method to return a CacheExpiration instance for a given + * cache name. + * + * @param {string} cacheName + * @return {CacheExpiration} + * + * @private + */ + _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; + } + /** + * @param {Response} cachedResponse + * @return {boolean} + * + * @private + */ + _isResponseDateFresh(cachedResponse) { + if (!this._maxAgeSeconds) { + // We aren't expiring by age, so return true, it's fresh + return true; + } + // Check if the 'date' header will suffice a quick expiration check. + // See https://github.com/GoogleChromeLabs/sw-toolbox/issues/164 for + // discussion. + const dateHeaderTimestamp = this._getDateHeaderTimestamp(cachedResponse); + if (dateHeaderTimestamp === null) { + // Unable to parse date, so assume it's fresh. + return true; + } + // If we have a valid headerTime, then our response is fresh iff the + // headerTime plus maxAgeSeconds is greater than the current time. + const now = Date.now(); + return dateHeaderTimestamp >= now - this._maxAgeSeconds * 1000; + } + /** + * This method will extract the data header and parse it into a useful + * value. + * + * @param {Response} cachedResponse + * @return {number|null} + * + * @private + */ + _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 the Date header was invalid for some reason, parsedDate.getTime() + // will return NaN. + if (isNaN(headerTime)) { + return null; + } + return headerTime; + } + /** + * This is a helper method that performs two operations: + * + * - Deletes *all* the underlying Cache instances associated with this plugin + * instance, by calling caches.delete() on your behalf. + * - Deletes the metadata from IndexedDB used to keep track of expiration + * details for each Cache instance. + * + * When using cache expiration, calling this method is preferable to calling + * `caches.delete()` directly, since this will ensure that the IndexedDB + * metadata is also cleanly removed and open IndexedDB instances are deleted. + * + * Note that if you're *not* using cache expiration for a given cache, calling + * `caches.delete()` and passing in the cache's name should be sufficient. + * There is no Workbox-specific method needed for cleanup in that case. + */ + async deleteCacheAndMetadata() { + // Do this one at a time instead of all at once via `Promise.all()` to + // reduce the chance of inconsistency if a promise rejects. + for (const [cacheName, cacheExpiration] of this._cacheExpirations) { + await self.caches.delete(cacheName); + await cacheExpiration.delete(); + } + // Reset this._cacheExpirations to its initial state. + this._cacheExpirations = new Map(); + } + } + + // @ts-ignore + try { + self['workbox:cacheable-response:7.2.0'] && _(); + } catch (e) {} + + /* + 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. + */ + /** + * This class allows you to set up rules determining what + * status codes and/or headers need to be present in order for a + * [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response) + * to be considered cacheable. + * + * @memberof workbox-cacheable-response + */ + class CacheableResponse { + /** + * To construct a new CacheableResponse instance you must provide at least + * one of the `config` properties. + * + * If both `statuses` and `headers` are specified, then both conditions must + * be met for the `Response` to be considered cacheable. + * + * @param {Object} config + * @param {Array} [config.statuses] One or more status codes that a + * `Response` can have and be considered cacheable. + * @param {Object} [config.headers] A mapping of header names + * and expected values that a `Response` can have and be considered cacheable. + * If multiple headers are provided, only one needs to be present. + */ + constructor(config = {}) { + { + if (!(config.statuses || config.headers)) { + throw new WorkboxError('statuses-or-headers-required', { + moduleName: 'workbox-cacheable-response', + className: 'CacheableResponse', + funcName: 'constructor' + }); + } + if (config.statuses) { + finalAssertExports.isArray(config.statuses, { + moduleName: 'workbox-cacheable-response', + className: 'CacheableResponse', + funcName: 'constructor', + paramName: 'config.statuses' + }); + } + if (config.headers) { + finalAssertExports.isType(config.headers, 'object', { + moduleName: 'workbox-cacheable-response', + className: 'CacheableResponse', + funcName: 'constructor', + paramName: 'config.headers' + }); + } + } + this._statuses = config.statuses; + this._headers = config.headers; + } + /** + * Checks a response to see whether it's cacheable or not, based on this + * object's configuration. + * + * @param {Response} response The response whose cacheability is being + * checked. + * @return {boolean} `true` if the `Response` is cacheable, and `false` + * otherwise. + */ + isResponseCacheable(response) { + { + finalAssertExports.isInstance(response, Response, { + moduleName: 'workbox-cacheable-response', + className: 'CacheableResponse', + funcName: 'isResponseCacheable', + paramName: 'response' + }); + } + let cacheable = true; + if (this._statuses) { + cacheable = this._statuses.includes(response.status); + } + if (this._headers && cacheable) { + cacheable = Object.keys(this._headers).some(headerName => { + return response.headers.get(headerName) === this._headers[headerName]; + }); + } + { + if (!cacheable) { + logger.groupCollapsed(`The request for ` + `'${getFriendlyURL(response.url)}' returned a response that does ` + `not meet the criteria for being cached.`); + logger.groupCollapsed(`View cacheability criteria here.`); + logger.log(`Cacheable statuses: ` + JSON.stringify(this._statuses)); + logger.log(`Cacheable headers: ` + JSON.stringify(this._headers, null, 2)); + logger.groupEnd(); + const logFriendlyHeaders = {}; + response.headers.forEach((value, key) => { + logFriendlyHeaders[key] = value; + }); + logger.groupCollapsed(`View response status and headers here.`); + logger.log(`Response status: ${response.status}`); + logger.log(`Response headers: ` + JSON.stringify(logFriendlyHeaders, null, 2)); + logger.groupEnd(); + logger.groupCollapsed(`View full response details here.`); + logger.log(response.headers); + logger.log(response); + logger.groupEnd(); + logger.groupEnd(); + } + } + return cacheable; + } + } + + /* + 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. + */ + /** + * A class implementing the `cacheWillUpdate` lifecycle callback. This makes it + * easier to add in cacheability checks to requests made via Workbox's built-in + * strategies. + * + * @memberof workbox-cacheable-response + */ + class CacheableResponsePlugin { + /** + * To construct a new CacheableResponsePlugin instance you must provide at + * least one of the `config` properties. + * + * If both `statuses` and `headers` are specified, then both conditions must + * be met for the `Response` to be considered cacheable. + * + * @param {Object} config + * @param {Array} [config.statuses] One or more status codes that a + * `Response` can have and be considered cacheable. + * @param {Object} [config.headers] A mapping of header names + * and expected values that a `Response` can have and be considered cacheable. + * If multiple headers are provided, only one needs to be present. + */ + constructor(config) { + /** + * @param {Object} options + * @param {Response} options.response + * @return {Response|null} + * @private + */ + this.cacheWillUpdate = async ({ + response + }) => { + if (this._cacheableResponse.isResponseCacheable(response)) { + return response; + } + return null; + }; + this._cacheableResponse = new CacheableResponse(config); + } + } + + /* + Copyright 2020 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. + */ + function stripParams(fullURL, ignoreParams) { + const strippedURL = new URL(fullURL); + for (const param of ignoreParams) { + strippedURL.searchParams.delete(param); + } + return strippedURL.href; + } + /** + * Matches an item in the cache, ignoring specific URL params. This is similar + * to the `ignoreSearch` option, but it allows you to ignore just specific + * params (while continuing to match on the others). + * + * @private + * @param {Cache} cache + * @param {Request} request + * @param {Object} matchOptions + * @param {Array} ignoreParams + * @return {Promise} + */ + async function cacheMatchIgnoreParams(cache, request, ignoreParams, matchOptions) { + const strippedRequestURL = stripParams(request.url, ignoreParams); + // If the request doesn't include any ignored params, match as normal. + if (request.url === strippedRequestURL) { + return cache.match(request, matchOptions); + } + // Otherwise, match by comparing keys + const keysOptions = Object.assign(Object.assign({}, matchOptions), { + ignoreSearch: true + }); + const cacheKeys = await cache.keys(request, keysOptions); + for (const cacheKey of cacheKeys) { + const strippedCacheKeyURL = stripParams(cacheKey.url, ignoreParams); + if (strippedRequestURL === strippedCacheKeyURL) { + return cache.match(cacheKey, matchOptions); + } + } + return; + } + + /* + 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. + */ + /** + * The Deferred class composes Promises in a way that allows for them to be + * resolved or rejected from outside the constructor. In most cases promises + * should be used directly, but Deferreds can be necessary when the logic to + * resolve a promise must be separate. + * + * @private + */ + class Deferred { + /** + * Creates a promise and exposes its resolve and reject functions as methods. + */ + constructor() { + this.promise = new Promise((resolve, reject) => { + this.resolve = resolve; + this.reject = reject; + }); + } + } + + /* + 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. + */ + /** + * Runs all of the callback functions, one at a time sequentially, in the order + * in which they were registered. + * + * @memberof workbox-core + * @private + */ + async function executeQuotaErrorCallbacks() { + { + logger.log(`About to run ${quotaErrorCallbacks.size} ` + `callbacks to clean up caches.`); + } + for (const callback of quotaErrorCallbacks) { + await callback(); + { + logger.log(callback, 'is complete.'); + } + } + { + logger.log('Finished running callbacks.'); + } + } + + /* + 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. + */ + /** + * Returns a promise that resolves and the passed number of milliseconds. + * This utility is an async/await-friendly version of `setTimeout`. + * + * @param {number} ms + * @return {Promise} + * @private + */ + function timeout(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); + } + + // @ts-ignore + try { + self['workbox:strategies:7.2.0'] && _(); + } catch (e) {} + + /* + Copyright 2020 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. + */ + function toRequest(input) { + return typeof input === 'string' ? new Request(input) : input; + } + /** + * A class created every time a Strategy instance instance calls + * {@link workbox-strategies.Strategy~handle} or + * {@link workbox-strategies.Strategy~handleAll} that wraps all fetch and + * cache actions around plugin callbacks and keeps track of when the strategy + * is "done" (i.e. all added `event.waitUntil()` promises have resolved). + * + * @memberof workbox-strategies + */ + class StrategyHandler { + /** + * Creates a new instance associated with the passed strategy and event + * that's handling the request. + * + * The constructor also initializes the state that will be passed to each of + * the plugins handling this request. + * + * @param {workbox-strategies.Strategy} strategy + * @param {Object} options + * @param {Request|string} options.request A request to run this strategy for. + * @param {ExtendableEvent} options.event The event associated with the + * request. + * @param {URL} [options.url] + * @param {*} [options.params] The return value from the + * {@link workbox-routing~matchCallback} (if applicable). + */ + constructor(strategy, options) { + this._cacheKeys = {}; + /** + * The request the strategy is performing (passed to the strategy's + * `handle()` or `handleAll()` method). + * @name request + * @instance + * @type {Request} + * @memberof workbox-strategies.StrategyHandler + */ + /** + * The event associated with this request. + * @name event + * @instance + * @type {ExtendableEvent} + * @memberof workbox-strategies.StrategyHandler + */ + /** + * A `URL` instance of `request.url` (if passed to the strategy's + * `handle()` or `handleAll()` method). + * Note: the `url` param will be present if the strategy was invoked + * from a workbox `Route` object. + * @name url + * @instance + * @type {URL|undefined} + * @memberof workbox-strategies.StrategyHandler + */ + /** + * A `param` value (if passed to the strategy's + * `handle()` or `handleAll()` method). + * Note: the `param` param will be present if the strategy was invoked + * from a workbox `Route` object and the + * {@link workbox-routing~matchCallback} returned + * a truthy value (it will be that value). + * @name params + * @instance + * @type {*|undefined} + * @memberof workbox-strategies.StrategyHandler + */ + { + finalAssertExports.isInstance(options.event, ExtendableEvent, { + moduleName: 'workbox-strategies', + className: 'StrategyHandler', + funcName: 'constructor', + paramName: 'options.event' + }); + } + Object.assign(this, options); + this.event = options.event; + this._strategy = strategy; + this._handlerDeferred = new Deferred(); + this._extendLifetimePromises = []; + // Copy the plugins list (since it's mutable on the strategy), + // so any mutations don't affect this handler instance. + this._plugins = [...strategy.plugins]; + this._pluginStateMap = new Map(); + for (const plugin of this._plugins) { + this._pluginStateMap.set(plugin, {}); + } + this.event.waitUntil(this._handlerDeferred.promise); + } + /** + * Fetches a given request (and invokes any applicable plugin callback + * methods) using the `fetchOptions` (for non-navigation requests) and + * `plugins` defined on the `Strategy` object. + * + * The following plugin lifecycle methods are invoked when using this method: + * - `requestWillFetch()` + * - `fetchDidSucceed()` + * - `fetchDidFail()` + * + * @param {Request|string} input The URL or request to fetch. + * @return {Promise} + */ + async fetch(input) { + const { + event + } = this; + let request = toRequest(input); + if (request.mode === 'navigate' && event instanceof FetchEvent && event.preloadResponse) { + const possiblePreloadResponse = await event.preloadResponse; + if (possiblePreloadResponse) { + { + logger.log(`Using a preloaded navigation response for ` + `'${getFriendlyURL(request.url)}'`); + } + return possiblePreloadResponse; + } + } + // If there is a fetchDidFail plugin, we need to save a clone of the + // original request before it's either modified by a requestWillFetch + // plugin or before the original request's body is consumed via fetch(). + const originalRequest = this.hasCallback('fetchDidFail') ? request.clone() : null; + try { + for (const cb of this.iterateCallbacks('requestWillFetch')) { + request = await cb({ + request: request.clone(), + event + }); + } + } catch (err) { + if (err instanceof Error) { + throw new WorkboxError('plugin-error-request-will-fetch', { + thrownErrorMessage: err.message + }); + } + } + // The request can be altered by plugins with `requestWillFetch` making + // the original request (most likely from a `fetch` event) different + // from the Request we make. Pass both to `fetchDidFail` to aid debugging. + const pluginFilteredRequest = request.clone(); + try { + let fetchResponse; + // See https://github.com/GoogleChrome/workbox/issues/1796 + fetchResponse = await fetch(request, request.mode === 'navigate' ? undefined : this._strategy.fetchOptions); + if ("development" !== 'production') { + logger.debug(`Network request for ` + `'${getFriendlyURL(request.url)}' returned a response with ` + `status '${fetchResponse.status}'.`); + } + for (const callback of this.iterateCallbacks('fetchDidSucceed')) { + fetchResponse = await callback({ + event, + request: pluginFilteredRequest, + response: fetchResponse + }); + } + return fetchResponse; + } catch (error) { + { + logger.log(`Network request for ` + `'${getFriendlyURL(request.url)}' threw an error.`, error); + } + // `originalRequest` will only exist if a `fetchDidFail` callback + // is being used (see above). + if (originalRequest) { + await this.runCallbacks('fetchDidFail', { + error: error, + event, + originalRequest: originalRequest.clone(), + request: pluginFilteredRequest.clone() + }); + } + throw error; + } + } + /** + * Calls `this.fetch()` and (in the background) runs `this.cachePut()` on + * the response generated by `this.fetch()`. + * + * The call to `this.cachePut()` automatically invokes `this.waitUntil()`, + * so you do not have to manually call `waitUntil()` on the event. + * + * @param {Request|string} input The request or URL to fetch and cache. + * @return {Promise} + */ + async fetchAndCachePut(input) { + const response = await this.fetch(input); + const responseClone = response.clone(); + void this.waitUntil(this.cachePut(input, responseClone)); + return response; + } + /** + * Matches a request from the cache (and invokes any applicable plugin + * callback methods) using the `cacheName`, `matchOptions`, and `plugins` + * defined on the strategy object. + * + * The following plugin lifecycle methods are invoked when using this method: + * - cacheKeyWillBeUsed() + * - cachedResponseWillBeUsed() + * + * @param {Request|string} key The Request or URL to use as the cache key. + * @return {Promise} A matching response, if found. + */ + async cacheMatch(key) { + const request = toRequest(key); + let cachedResponse; + const { + cacheName, + matchOptions + } = this._strategy; + const effectiveRequest = await this.getCacheKey(request, 'read'); + const multiMatchOptions = Object.assign(Object.assign({}, matchOptions), { + cacheName + }); + cachedResponse = await caches.match(effectiveRequest, multiMatchOptions); + { + if (cachedResponse) { + logger.debug(`Found a cached response in '${cacheName}'.`); + } else { + logger.debug(`No cached response found in '${cacheName}'.`); + } + } + for (const callback of this.iterateCallbacks('cachedResponseWillBeUsed')) { + cachedResponse = (await callback({ + cacheName, + matchOptions, + cachedResponse, + request: effectiveRequest, + event: this.event + })) || undefined; + } + return cachedResponse; + } + /** + * Puts a request/response pair in the cache (and invokes any applicable + * plugin callback methods) using the `cacheName` and `plugins` defined on + * the strategy object. + * + * The following plugin lifecycle methods are invoked when using this method: + * - cacheKeyWillBeUsed() + * - cacheWillUpdate() + * - cacheDidUpdate() + * + * @param {Request|string} key The request or URL to use as the cache key. + * @param {Response} response The response to cache. + * @return {Promise} `false` if a cacheWillUpdate caused the response + * not be cached, and `true` otherwise. + */ + async cachePut(key, response) { + const request = toRequest(key); + // Run in the next task to avoid blocking other cache reads. + // https://github.com/w3c/ServiceWorker/issues/1397 + await timeout(0); + const effectiveRequest = await this.getCacheKey(request, 'write'); + { + if (effectiveRequest.method && effectiveRequest.method !== 'GET') { + throw new WorkboxError('attempt-to-cache-non-get-request', { + url: getFriendlyURL(effectiveRequest.url), + method: effectiveRequest.method + }); + } + // See https://github.com/GoogleChrome/workbox/issues/2818 + const vary = response.headers.get('Vary'); + if (vary) { + logger.debug(`The response for ${getFriendlyURL(effectiveRequest.url)} ` + `has a 'Vary: ${vary}' header. ` + `Consider setting the {ignoreVary: true} option on your strategy ` + `to ensure cache matching and deletion works as expected.`); + } + } + if (!response) { + { + 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 this._ensureResponseSafeToCache(response); + if (!responseToCache) { + { + logger.debug(`Response '${getFriendlyURL(effectiveRequest.url)}' ` + `will not be cached.`, responseToCache); + } + return false; + } + const { + cacheName, + matchOptions + } = this._strategy; + const cache = await self.caches.open(cacheName); + const hasCacheUpdateCallback = this.hasCallback('cacheDidUpdate'); + const oldResponse = hasCacheUpdateCallback ? await cacheMatchIgnoreParams( + // TODO(philipwalton): the `__WB_REVISION__` param is a precaching + // feature. Consider into ways to only add this behavior if using + // precaching. + cache, effectiveRequest.clone(), ['__WB_REVISION__'], matchOptions) : null; + { + logger.debug(`Updating the '${cacheName}' cache with a new Response ` + `for ${getFriendlyURL(effectiveRequest.url)}.`); + } + try { + await cache.put(effectiveRequest, hasCacheUpdateCallback ? responseToCache.clone() : responseToCache); + } catch (error) { + if (error instanceof Error) { + // See https://developer.mozilla.org/en-US/docs/Web/API/DOMException#exception-QuotaExceededError + if (error.name === 'QuotaExceededError') { + await executeQuotaErrorCallbacks(); + } + throw error; + } + } + for (const callback of this.iterateCallbacks('cacheDidUpdate')) { + await callback({ + cacheName, + oldResponse, + newResponse: responseToCache.clone(), + request: effectiveRequest, + event: this.event + }); + } + return true; + } + /** + * Checks the list of plugins for the `cacheKeyWillBeUsed` callback, and + * executes any of those callbacks found in sequence. The final `Request` + * object returned by the last plugin is treated as the cache key for cache + * reads and/or writes. If no `cacheKeyWillBeUsed` plugin callbacks have + * been registered, the passed request is returned unmodified + * + * @param {Request} request + * @param {string} mode + * @return {Promise} + */ + async getCacheKey(request, mode) { + const key = `${request.url} | ${mode}`; + if (!this._cacheKeys[key]) { + let effectiveRequest = request; + for (const callback of this.iterateCallbacks('cacheKeyWillBeUsed')) { + effectiveRequest = toRequest(await callback({ + mode, + request: effectiveRequest, + event: this.event, + // params has a type any can't change right now. + params: this.params // eslint-disable-line + })); + } + this._cacheKeys[key] = effectiveRequest; + } + return this._cacheKeys[key]; + } + /** + * Returns true if the strategy has at least one plugin with the given + * callback. + * + * @param {string} name The name of the callback to check for. + * @return {boolean} + */ + hasCallback(name) { + for (const plugin of this._strategy.plugins) { + if (name in plugin) { + return true; + } + } + return false; + } + /** + * Runs all plugin callbacks matching the given name, in order, passing the + * given param object (merged ith the current plugin state) as the only + * argument. + * + * Note: since this method runs all plugins, it's not suitable for cases + * where the return value of a callback needs to be applied prior to calling + * the next callback. See + * {@link workbox-strategies.StrategyHandler#iterateCallbacks} + * below for how to handle that case. + * + * @param {string} name The name of the callback to run within each plugin. + * @param {Object} param The object to pass as the first (and only) param + * when executing each callback. This object will be merged with the + * current plugin state prior to callback execution. + */ + async runCallbacks(name, param) { + for (const callback of this.iterateCallbacks(name)) { + // TODO(philipwalton): not sure why `any` is needed. It seems like + // this should work with `as WorkboxPluginCallbackParam[C]`. + await callback(param); + } + } + /** + * Accepts a callback and returns an iterable of matching plugin callbacks, + * where each callback is wrapped with the current handler state (i.e. when + * you call each callback, whatever object parameter you pass it will + * be merged with the plugin's current state). + * + * @param {string} name The name fo the callback to run + * @return {Array} + */ + *iterateCallbacks(name) { + for (const plugin of this._strategy.plugins) { + if (typeof plugin[name] === 'function') { + const state = this._pluginStateMap.get(plugin); + const statefulCallback = param => { + const statefulParam = Object.assign(Object.assign({}, param), { + state + }); + // TODO(philipwalton): not sure why `any` is needed. It seems like + // this should work with `as WorkboxPluginCallbackParam[C]`. + return plugin[name](statefulParam); + }; + yield statefulCallback; + } + } + } + /** + * Adds a promise to the + * [extend lifetime promises]{@link https://w3c.github.io/ServiceWorker/#extendableevent-extend-lifetime-promises} + * of the event event associated with the request being handled (usually a + * `FetchEvent`). + * + * Note: you can await + * {@link workbox-strategies.StrategyHandler~doneWaiting} + * to know when all added promises have settled. + * + * @param {Promise} promise A promise to add to the extend lifetime promises + * of the event that triggered the request. + */ + waitUntil(promise) { + this._extendLifetimePromises.push(promise); + return promise; + } + /** + * Returns a promise that resolves once all promises passed to + * {@link workbox-strategies.StrategyHandler~waitUntil} + * have settled. + * + * Note: any work done after `doneWaiting()` settles should be manually + * passed to an event's `waitUntil()` method (not this handler's + * `waitUntil()` method), otherwise the service worker thread my be killed + * prior to your work completing. + */ + async doneWaiting() { + let promise; + while (promise = this._extendLifetimePromises.shift()) { + await promise; + } + } + /** + * Stops running the strategy and immediately resolves any pending + * `waitUntil()` promises. + */ + destroy() { + this._handlerDeferred.resolve(null); + } + /** + * This method will call cacheWillUpdate on the available plugins (or use + * status === 200) to determine if the Response is safe and valid to cache. + * + * @param {Request} options.request + * @param {Response} options.response + * @return {Promise} + * + * @private + */ + async _ensureResponseSafeToCache(response) { + let responseToCache = response; + let pluginsUsed = false; + for (const callback of this.iterateCallbacks('cacheWillUpdate')) { + responseToCache = (await callback({ + request: this.request, + response: responseToCache, + event: this.event + })) || undefined; + pluginsUsed = true; + if (!responseToCache) { + break; + } + } + if (!pluginsUsed) { + if (responseToCache && responseToCache.status !== 200) { + responseToCache = undefined; + } + { + if (responseToCache) { + if (responseToCache.status !== 200) { + if (responseToCache.status === 0) { + logger.warn(`The response for '${this.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 '${this.request.url}' ` + `returned a status code of '${response.status}' and won't ` + `be cached as a result.`); + } + } + } + } + } + return responseToCache; + } + } + + /* + Copyright 2020 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. + */ + /** + * An abstract base class that all other strategy classes must extend from: + * + * @memberof workbox-strategies + */ + class Strategy { + /** + * Creates a new instance of the strategy and sets all documented option + * properties as public instance properties. + * + * Note: if a custom strategy class extends the base Strategy class and does + * not need more than these properties, it does not need to define its own + * constructor. + * + * @param {Object} [options] + * @param {string} [options.cacheName] Cache name to store and retrieve + * requests. Defaults to the cache names provided by + * {@link workbox-core.cacheNames}. + * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} + * to use in conjunction with this caching strategy. + * @param {Object} [options.fetchOptions] Values passed along to the + * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters) + * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796) + * `fetch()` requests made by this strategy. + * @param {Object} [options.matchOptions] The + * [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions} + * for any `cache.match()` or `cache.put()` calls made by this strategy. + */ + constructor(options = {}) { + /** + * Cache name to store and retrieve + * requests. Defaults to the cache names provided by + * {@link workbox-core.cacheNames}. + * + * @type {string} + */ + this.cacheName = cacheNames.getRuntimeName(options.cacheName); + /** + * The list + * [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} + * used by this strategy. + * + * @type {Array} + */ + this.plugins = options.plugins || []; + /** + * Values passed along to the + * [`init`]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters} + * of all fetch() requests made by this strategy. + * + * @type {Object} + */ + this.fetchOptions = options.fetchOptions; + /** + * The + * [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions} + * for any `cache.match()` or `cache.put()` calls made by this strategy. + * + * @type {Object} + */ + this.matchOptions = options.matchOptions; + } + /** + * Perform a request strategy and returns a `Promise` that will resolve with + * a `Response`, invoking all relevant plugin callbacks. + * + * When a strategy instance is registered with a Workbox + * {@link workbox-routing.Route}, this method is automatically + * called when the route matches. + * + * Alternatively, this method can be used in a standalone `FetchEvent` + * listener by passing it to `event.respondWith()`. + * + * @param {FetchEvent|Object} options A `FetchEvent` or an object with the + * properties listed below. + * @param {Request|string} options.request A request to run this strategy for. + * @param {ExtendableEvent} options.event The event associated with the + * request. + * @param {URL} [options.url] + * @param {*} [options.params] + */ + handle(options) { + const [responseDone] = this.handleAll(options); + return responseDone; + } + /** + * Similar to {@link workbox-strategies.Strategy~handle}, but + * instead of just returning a `Promise` that resolves to a `Response` it + * it will return an tuple of `[response, done]` promises, where the former + * (`response`) is equivalent to what `handle()` returns, and the latter is a + * Promise that will resolve once any promises that were added to + * `event.waitUntil()` as part of performing the strategy have completed. + * + * You can await the `done` promise to ensure any extra work performed by + * the strategy (usually caching responses) completes successfully. + * + * @param {FetchEvent|Object} options A `FetchEvent` or an object with the + * properties listed below. + * @param {Request|string} options.request A request to run this strategy for. + * @param {ExtendableEvent} options.event The event associated with the + * request. + * @param {URL} [options.url] + * @param {*} [options.params] + * @return {Array} A tuple of [response, done] + * promises that can be used to determine when the response resolves as + * well as when the handler has completed all its work. + */ + handleAll(options) { + // Allow for flexible options to be passed. + if (options instanceof FetchEvent) { + options = { + event: options, + request: options.request + }; + } + const event = options.event; + const request = typeof options.request === 'string' ? new Request(options.request) : options.request; + const params = 'params' in options ? options.params : undefined; + const handler = new StrategyHandler(this, { + event, + request, + params + }); + const responseDone = this._getResponse(handler, request, event); + const handlerDone = this._awaitComplete(responseDone, handler, request, event); + // Return an array of promises, suitable for use with Promise.all(). + return [responseDone, handlerDone]; + } + async _getResponse(handler, request, event) { + await handler.runCallbacks('handlerWillStart', { + event, + request + }); + let response = undefined; + try { + response = await this._handle(request, handler); + // The "official" Strategy subclasses all throw this error automatically, + // but in case a third-party Strategy doesn't, ensure that we have a + // consistent failure when there's no response or an error response. + if (!response || response.type === 'error') { + throw new WorkboxError('no-response', { + url: request.url + }); + } + } catch (error) { + if (error instanceof Error) { + for (const callback of handler.iterateCallbacks('handlerDidError')) { + response = await callback({ + error, + event, + request + }); + if (response) { + break; + } + } + } + if (!response) { + throw error; + } else { + logger.log(`While responding to '${getFriendlyURL(request.url)}', ` + `an ${error instanceof Error ? error.toString() : ''} error occurred. Using a fallback response provided by ` + `a handlerDidError plugin.`); + } + } + for (const callback of handler.iterateCallbacks('handlerWillRespond')) { + response = await callback({ + event, + request, + response + }); + } + return response; + } + async _awaitComplete(responseDone, handler, request, event) { + let response; + let error; + try { + response = await responseDone; + } catch (error) { + // Ignore errors, as response errors should be caught via the `response` + // promise above. The `done` promise will only throw for errors in + // promises passed to `handler.waitUntil()`. + } + try { + await handler.runCallbacks('handlerDidRespond', { + event, + request, + response + }); + await handler.doneWaiting(); + } catch (waitUntilError) { + if (waitUntilError instanceof Error) { + error = waitUntilError; + } + } + await handler.runCallbacks('handlerDidComplete', { + event, + request, + response, + error: error + }); + handler.destroy(); + if (error) { + throw error; + } + } + } + /** + * Classes extending the `Strategy` based class should implement this method, + * and leverage the {@link workbox-strategies.StrategyHandler} + * arg to perform all fetching and cache logic, which will ensure all relevant + * cache, cache options, fetch options and plugins are used (per the current + * strategy instance). + * + * @name _handle + * @instance + * @abstract + * @function + * @param {Request} request + * @param {workbox-strategies.StrategyHandler} handler + * @return {Promise} + * + * @memberof workbox-strategies.Strategy + */ + + /* + 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 messages = { + 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(); + } + } + }; + + /* + 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. + */ + /** + * An implementation of a [cache-first](https://developer.chrome.com/docs/workbox/caching-strategies-overview/#cache-first-falling-back-to-network) + * request strategy. + * + * A cache first strategy is useful for assets that have been revisioned, + * such as URLs like `/styles/example.a8f5f1.css`, since they + * can be cached for long periods of time. + * + * If the network request fails, and there is no cache match, this will throw + * a `WorkboxError` exception. + * + * @extends workbox-strategies.Strategy + * @memberof workbox-strategies + */ + class CacheFirst extends Strategy { + /** + * @private + * @param {Request|string} request A request to run this strategy for. + * @param {workbox-strategies.StrategyHandler} handler The event that + * triggered the request. + * @return {Promise} + */ + async _handle(request, handler) { + const logs = []; + { + finalAssertExports.isInstance(request, Request, { + moduleName: 'workbox-strategies', + className: this.constructor.name, + funcName: 'makeRequest', + paramName: 'request' + }); + } + let response = await handler.cacheMatch(request); + let error = undefined; + if (!response) { + { + logs.push(`No response found in the '${this.cacheName}' cache. ` + `Will respond with a network request.`); + } + try { + response = await handler.fetchAndCachePut(request); + } catch (err) { + if (err instanceof Error) { + error = err; + } + } + { + if (response) { + logs.push(`Got response from network.`); + } else { + logs.push(`Unable to get a response from the network.`); + } + } + } else { + { + logs.push(`Found a cached response in the '${this.cacheName}' cache.`); + } + } + { + logger.groupCollapsed(messages.strategyStart(this.constructor.name, request)); + for (const log of logs) { + logger.log(log); + } + messages.printFinalResponse(response); + logger.groupEnd(); + } + if (!response) { + throw new WorkboxError('no-response', { + url: request.url, + error + }); + } + return response; + } + } + + /* + 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 cacheOkAndOpaquePlugin = { + /** + * Returns a valid response (to allow caching) if the status is 200 (OK) or + * 0 (opaque). + * + * @param {Object} options + * @param {Response} options.response + * @return {Response|null} + * + * @private + */ + cacheWillUpdate: async ({ + response + }) => { + if (response.status === 200 || response.status === 0) { + return response; + } + return null; + } + }; + + /* + 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. + */ + /** + * An implementation of a + * [network first](https://developer.chrome.com/docs/workbox/caching-strategies-overview/#network-first-falling-back-to-cache) + * request strategy. + * + * By default, this strategy will cache responses with a 200 status code as + * well as [opaque responses](https://developer.chrome.com/docs/workbox/caching-resources-during-runtime/#opaque-responses). + * Opaque responses are are cross-origin requests where the response doesn't + * support [CORS](https://enable-cors.org/). + * + * If the network request fails, and there is no cache match, this will throw + * a `WorkboxError` exception. + * + * @extends workbox-strategies.Strategy + * @memberof workbox-strategies + */ + class NetworkFirst extends Strategy { + /** + * @param {Object} [options] + * @param {string} [options.cacheName] Cache name to store and retrieve + * requests. Defaults to cache names provided by + * {@link workbox-core.cacheNames}. + * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} + * to use in conjunction with this caching strategy. + * @param {Object} [options.fetchOptions] Values passed along to the + * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters) + * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796) + * `fetch()` requests made by this strategy. + * @param {Object} [options.matchOptions] [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions) + * @param {number} [options.networkTimeoutSeconds] If set, any network requests + * that fail to respond within the timeout will fallback to the cache. + * + * This option can be used to combat + * "[lie-fi]{@link https://developers.google.com/web/fundamentals/performance/poor-connectivity/#lie-fi}" + * scenarios. + */ + constructor(options = {}) { + super(options); + // If this instance contains no plugins with a 'cacheWillUpdate' callback, + // prepend the `cacheOkAndOpaquePlugin` plugin to the plugins list. + if (!this.plugins.some(p => 'cacheWillUpdate' in p)) { + this.plugins.unshift(cacheOkAndOpaquePlugin); + } + this._networkTimeoutSeconds = options.networkTimeoutSeconds || 0; + { + if (this._networkTimeoutSeconds) { + finalAssertExports.isType(this._networkTimeoutSeconds, 'number', { + moduleName: 'workbox-strategies', + className: this.constructor.name, + funcName: 'constructor', + paramName: 'networkTimeoutSeconds' + }); + } + } + } + /** + * @private + * @param {Request|string} request A request to run this strategy for. + * @param {workbox-strategies.StrategyHandler} handler The event that + * triggered the request. + * @return {Promise} + */ + async _handle(request, handler) { + const logs = []; + { + finalAssertExports.isInstance(request, Request, { + moduleName: 'workbox-strategies', + className: this.constructor.name, + funcName: 'handle', + paramName: 'makeRequest' + }); + } + const promises = []; + let timeoutId; + if (this._networkTimeoutSeconds) { + const { + id, + promise + } = this._getTimeoutPromise({ + request, + logs, + handler + }); + timeoutId = id; + promises.push(promise); + } + const networkPromise = this._getNetworkPromise({ + timeoutId, + request, + logs, + handler + }); + promises.push(networkPromise); + const response = await handler.waitUntil((async () => { + // Promise.race() will resolve as soon as the first promise resolves. + return (await handler.waitUntil(Promise.race(promises))) || ( + // If Promise.race() resolved with null, it might be due to a network + // timeout + a cache miss. If that were to happen, we'd rather wait until + // the networkPromise resolves instead of returning null. + // Note that it's fine to await an already-resolved promise, so we don't + // have to check to see if it's still "in flight". + await networkPromise); + })()); + { + logger.groupCollapsed(messages.strategyStart(this.constructor.name, request)); + for (const log of logs) { + logger.log(log); + } + messages.printFinalResponse(response); + logger.groupEnd(); + } + if (!response) { + throw new WorkboxError('no-response', { + url: request.url + }); + } + return response; + } + /** + * @param {Object} options + * @param {Request} options.request + * @param {Array} options.logs A reference to the logs array + * @param {Event} options.event + * @return {Promise} + * + * @private + */ + _getTimeoutPromise({ + request, + logs, + handler + }) { + let timeoutId; + const timeoutPromise = new Promise(resolve => { + const onNetworkTimeout = async () => { + { + logs.push(`Timing out the network response at ` + `${this._networkTimeoutSeconds} seconds.`); + } + resolve(await handler.cacheMatch(request)); + }; + timeoutId = setTimeout(onNetworkTimeout, this._networkTimeoutSeconds * 1000); + }); + return { + promise: timeoutPromise, + id: timeoutId + }; + } + /** + * @param {Object} options + * @param {number|undefined} options.timeoutId + * @param {Request} options.request + * @param {Array} options.logs A reference to the logs Array. + * @param {Event} options.event + * @return {Promise} + * + * @private + */ + async _getNetworkPromise({ + timeoutId, + request, + logs, + handler + }) { + let error; + let response; + try { + response = await handler.fetchAndCachePut(request); + } catch (fetchError) { + if (fetchError instanceof Error) { + error = fetchError; + } + } + if (timeoutId) { + clearTimeout(timeoutId); + } + { + if (response) { + logs.push(`Got response from network.`); + } else { + logs.push(`Unable to get a response from the network. Will respond ` + `with a cached response.`); + } + } + if (error || !response) { + response = await handler.cacheMatch(request); + { + if (response) { + logs.push(`Found a cached response in the '${this.cacheName}'` + ` cache.`); + } else { + logs.push(`No response found in the '${this.cacheName}' cache.`); + } + } + } + return response; + } + } + + /* + 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. + */ + /** + * Claim any currently available clients once the service worker + * becomes active. This is normally used in conjunction with `skipWaiting()`. + * + * @memberof workbox-core + */ + function clientsClaim() { + self.addEventListener('activate', () => self.clients.claim()); + } + + /* + Copyright 2020 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. + */ + /** + * A utility method that makes it easier to use `event.waitUntil` with + * async functions and return the result. + * + * @param {ExtendableEvent} event + * @param {Function} asyncFn + * @return {Function} + * @private + */ + function waitUntil(event, asyncFn) { + const returnPromise = asyncFn(); + event.waitUntil(returnPromise); + return returnPromise; + } + + // @ts-ignore + try { + self['workbox:precaching:7.2.0'] && _(); + } catch (e) {} + + /* + 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. + */ + // Name of the search parameter used to store revision info. + const REVISION_SEARCH_PARAM = '__WB_REVISION__'; + /** + * Converts a manifest entry into a versioned URL suitable for precaching. + * + * @param {Object|string} entry + * @return {string} A URL with versioning info. + * + * @private + * @memberof workbox-precaching + */ + function createCacheKey(entry) { + if (!entry) { + throw new WorkboxError('add-to-cache-list-unexpected-type', { + entry + }); + } + // If a precache manifest entry is a string, it's assumed to be a versioned + // URL, like '/app.abcd1234.js'. Return as-is. + 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 there's just a URL and no revision, then it's also assumed to be a + // versioned URL. + if (!revision) { + const urlObject = new URL(url, location.href); + return { + cacheKey: urlObject.href, + url: urlObject.href + }; + } + // Otherwise, construct a properly versioned URL using the custom Workbox + // search parameter along with the revision info. + 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 + }; + } + + /* + Copyright 2020 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. + */ + /** + * A plugin, designed to be used with PrecacheController, to determine the + * of assets that were updated (or not updated) during the install event. + * + * @private + */ + class PrecacheInstallReportPlugin { + constructor() { + this.updatedURLs = []; + this.notUpdatedURLs = []; + this.handlerWillStart = async ({ + request, + state + }) => { + // TODO: `state` should never be undefined... + if (state) { + state.originalRequest = request; + } + }; + this.cachedResponseWillBeUsed = async ({ + event, + state, + cachedResponse + }) => { + if (event.type === 'install') { + if (state && state.originalRequest && state.originalRequest instanceof Request) { + // TODO: `state` should never be undefined... + const url = state.originalRequest.url; + if (cachedResponse) { + this.notUpdatedURLs.push(url); + } else { + this.updatedURLs.push(url); + } + } + } + return cachedResponse; + }; + } + } + + /* + Copyright 2020 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. + */ + /** + * A plugin, designed to be used with PrecacheController, to translate URLs into + * the corresponding cache key, based on the current revision info. + * + * @private + */ + class PrecacheCacheKeyPlugin { + constructor({ + precacheController + }) { + this.cacheKeyWillBeUsed = async ({ + request, + params + }) => { + // Params is type any, can't change right now. + /* eslint-disable */ + const cacheKey = (params === null || params === void 0 ? void 0 : params.cacheKey) || this._precacheController.getCacheKeyForURL(request.url); + /* eslint-enable */ + return cacheKey ? new Request(cacheKey, { + headers: request.headers + }) : request; + }; + this._precacheController = precacheController; + } + } + + /* + 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. + */ + /** + * @param {string} groupTitle + * @param {Array} deletedURLs + * + * @private + */ + const logGroup = (groupTitle, deletedURLs) => { + logger.groupCollapsed(groupTitle); + for (const url of deletedURLs) { + logger.log(url); + } + logger.groupEnd(); + }; + /** + * @param {Array} deletedURLs + * + * @private + * @memberof workbox-precaching + */ + 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(); + } + } + + /* + 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. + */ + /** + * @param {string} groupTitle + * @param {Array} urls + * + * @private + */ + function _nestedGroup(groupTitle, urls) { + if (urls.length === 0) { + return; + } + logger.groupCollapsed(groupTitle); + for (const url of urls) { + logger.log(url); + } + logger.groupEnd(); + } + /** + * @param {Array} urlsToPrecache + * @param {Array} urlsAlreadyPrecached + * + * @private + * @memberof workbox-precaching + */ + 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(); + } + } + + /* + 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. + */ + let supportStatus; + /** + * A utility function that determines whether the current browser supports + * constructing a new `Response` from a `response.body` stream. + * + * @return {boolean} `true`, if the current browser can successfully + * construct a `Response` from a `response.body` stream, `false` otherwise. + * + * @private + */ + 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; + } + + /* + 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. + */ + /** + * Allows developers to copy a response and modify its `headers`, `status`, + * or `statusText` values (the values settable via a + * [`ResponseInit`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Response/Response#Syntax} + * object in the constructor). + * To modify these values, pass a function as the second argument. That + * function will be invoked with a single object with the response properties + * `{headers, status, statusText}`. The return value of this function will + * be used as the `ResponseInit` for the new `Response`. To change the values + * either modify the passed parameter(s) and return it, or return a totally + * new object. + * + * This method is intentionally limited to same-origin responses, regardless of + * whether CORS was used or not. + * + * @param {Response} response + * @param {Function} modifier + * @memberof workbox-core + */ + async function copyResponse(response, modifier) { + let origin = null; + // If response.url isn't set, assume it's cross-origin and keep origin null. + if (response.url) { + const responseURL = new URL(response.url); + origin = responseURL.origin; + } + if (origin !== self.location.origin) { + throw new WorkboxError('cross-origin-copy-response', { + origin + }); + } + const clonedResponse = response.clone(); + // Create a fresh `ResponseInit` object by cloning the headers. + const responseInit = { + headers: new Headers(clonedResponse.headers), + status: clonedResponse.status, + statusText: clonedResponse.statusText + }; + // Apply any user modifications. + const modifiedResponseInit = modifier ? modifier(responseInit) : responseInit; + // Create the new response from the body stream and `ResponseInit` + // modifications. Note: not all browsers support the Response.body stream, + // so fall back to reading the entire body into memory as a blob. + const body = canConstructResponseFromBodyStream() ? clonedResponse.body : await clonedResponse.blob(); + return new Response(body, modifiedResponseInit); + } + + /* + Copyright 2020 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. + */ + /** + * A {@link workbox-strategies.Strategy} implementation + * specifically designed to work with + * {@link workbox-precaching.PrecacheController} + * to both cache and fetch precached assets. + * + * Note: an instance of this class is created automatically when creating a + * `PrecacheController`; it's generally not necessary to create this yourself. + * + * @extends workbox-strategies.Strategy + * @memberof workbox-precaching + */ + class PrecacheStrategy extends Strategy { + /** + * + * @param {Object} [options] + * @param {string} [options.cacheName] Cache name to store and retrieve + * requests. Defaults to the cache names provided by + * {@link workbox-core.cacheNames}. + * @param {Array} [options.plugins] {@link https://developers.google.com/web/tools/workbox/guides/using-plugins|Plugins} + * to use in conjunction with this caching strategy. + * @param {Object} [options.fetchOptions] Values passed along to the + * {@link https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters|init} + * of all fetch() requests made by this strategy. + * @param {Object} [options.matchOptions] The + * {@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions|CacheQueryOptions} + * for any `cache.match()` or `cache.put()` calls made by this strategy. + * @param {boolean} [options.fallbackToNetwork=true] Whether to attempt to + * get the response from the network if there's a precache miss. + */ + constructor(options = {}) { + options.cacheName = cacheNames.getPrecacheName(options.cacheName); + super(options); + this._fallbackToNetwork = options.fallbackToNetwork === false ? false : true; + // Redirected responses cannot be used to satisfy a navigation request, so + // any redirected response must be "copied" rather than cloned, so the new + // response doesn't contain the `redirected` flag. See: + // https://bugs.chromium.org/p/chromium/issues/detail?id=669363&desc=2#c1 + this.plugins.push(PrecacheStrategy.copyRedirectedCacheableResponsesPlugin); + } + /** + * @private + * @param {Request|string} request A request to run this strategy for. + * @param {workbox-strategies.StrategyHandler} handler The event that + * triggered the request. + * @return {Promise} + */ + async _handle(request, handler) { + const response = await handler.cacheMatch(request); + if (response) { + return response; + } + // If this is an `install` event for an entry that isn't already cached, + // then populate the cache. + if (handler.event && handler.event.type === 'install') { + return await this._handleInstall(request, handler); + } + // Getting here means something went wrong. An entry that should have been + // precached wasn't found in the cache. + return await this._handleFetch(request, handler); + } + async _handleFetch(request, handler) { + let response; + const params = handler.params || {}; + // Fall back to the network if we're configured to do so. + if (this._fallbackToNetwork) { + { + logger.warn(`The precached response for ` + `${getFriendlyURL(request.url)} in ${this.cacheName} was not ` + `found. Falling back to the network.`); + } + const integrityInManifest = params.integrity; + const integrityInRequest = request.integrity; + const noIntegrityConflict = !integrityInRequest || integrityInRequest === integrityInManifest; + // Do not add integrity if the original request is no-cors + // See https://github.com/GoogleChrome/workbox/issues/3096 + response = await handler.fetch(new Request(request, { + integrity: request.mode !== 'no-cors' ? integrityInRequest || integrityInManifest : undefined + })); + // It's only "safe" to repair the cache if we're using SRI to guarantee + // that the response matches the precache manifest's expectations, + // and there's either a) no integrity property in the incoming request + // or b) there is an integrity, and it matches the precache manifest. + // See https://github.com/GoogleChrome/workbox/issues/2858 + // Also if the original request users no-cors we don't use integrity. + // See https://github.com/GoogleChrome/workbox/issues/3096 + if (integrityInManifest && noIntegrityConflict && request.mode !== 'no-cors') { + this._useDefaultCacheabilityPluginIfNeeded(); + const wasCached = await handler.cachePut(request, response.clone()); + { + if (wasCached) { + logger.log(`A response for ${getFriendlyURL(request.url)} ` + `was used to "repair" the precache.`); + } + } + } + } else { + // This shouldn't normally happen, but there are edge cases: + // https://github.com/GoogleChrome/workbox/issues/1441 + throw new WorkboxError('missing-precache-entry', { + cacheName: this.cacheName, + url: request.url + }); + } + { + const cacheKey = params.cacheKey || (await handler.getCacheKey(request, 'read')); + // Workbox is going to handle the route. + // print the routing details to the console. + logger.groupCollapsed(`Precaching is responding to: ` + getFriendlyURL(request.url)); + logger.log(`Serving the precached url: ${getFriendlyURL(cacheKey instanceof Request ? cacheKey.url : cacheKey)}`); + logger.groupCollapsed(`View request details here.`); + logger.log(request); + logger.groupEnd(); + logger.groupCollapsed(`View response details here.`); + logger.log(response); + logger.groupEnd(); + logger.groupEnd(); + } + return response; + } + async _handleInstall(request, handler) { + this._useDefaultCacheabilityPluginIfNeeded(); + const response = await handler.fetch(request); + // Make sure we defer cachePut() until after we know the response + // should be cached; see https://github.com/GoogleChrome/workbox/issues/2737 + const wasCached = await handler.cachePut(request, response.clone()); + if (!wasCached) { + // Throwing here will lead to the `install` handler failing, which + // we want to do if *any* of the responses aren't safe to cache. + throw new WorkboxError('bad-precaching-response', { + url: request.url, + status: response.status + }); + } + return response; + } + /** + * This method is complex, as there a number of things to account for: + * + * The `plugins` array can be set at construction, and/or it might be added to + * to at any time before the strategy is used. + * + * At the time the strategy is used (i.e. during an `install` event), there + * needs to be at least one plugin that implements `cacheWillUpdate` in the + * array, other than `copyRedirectedCacheableResponsesPlugin`. + * + * - If this method is called and there are no suitable `cacheWillUpdate` + * plugins, we need to add `defaultPrecacheCacheabilityPlugin`. + * + * - If this method is called and there is exactly one `cacheWillUpdate`, then + * we don't have to do anything (this might be a previously added + * `defaultPrecacheCacheabilityPlugin`, or it might be a custom plugin). + * + * - If this method is called and there is more than one `cacheWillUpdate`, + * then we need to check if one is `defaultPrecacheCacheabilityPlugin`. If so, + * we need to remove it. (This situation is unlikely, but it could happen if + * the strategy is used multiple times, the first without a `cacheWillUpdate`, + * and then later on after manually adding a custom `cacheWillUpdate`.) + * + * See https://github.com/GoogleChrome/workbox/issues/2737 for more context. + * + * @private + */ + _useDefaultCacheabilityPluginIfNeeded() { + let defaultPluginIndex = null; + let cacheWillUpdatePluginCount = 0; + for (const [index, plugin] of this.plugins.entries()) { + // Ignore the copy redirected plugin when determining what to do. + if (plugin === PrecacheStrategy.copyRedirectedCacheableResponsesPlugin) { + continue; + } + // Save the default plugin's index, in case it needs to be removed. + if (plugin === PrecacheStrategy.defaultPrecacheCacheabilityPlugin) { + defaultPluginIndex = index; + } + if (plugin.cacheWillUpdate) { + cacheWillUpdatePluginCount++; + } + } + if (cacheWillUpdatePluginCount === 0) { + this.plugins.push(PrecacheStrategy.defaultPrecacheCacheabilityPlugin); + } else if (cacheWillUpdatePluginCount > 1 && defaultPluginIndex !== null) { + // Only remove the default plugin; multiple custom plugins are allowed. + this.plugins.splice(defaultPluginIndex, 1); + } + // Nothing needs to be done if cacheWillUpdatePluginCount is 1 + } + } + PrecacheStrategy.defaultPrecacheCacheabilityPlugin = { + async cacheWillUpdate({ + response + }) { + if (!response || response.status >= 400) { + return null; + } + return response; + } + }; + PrecacheStrategy.copyRedirectedCacheableResponsesPlugin = { + async cacheWillUpdate({ + response + }) { + return response.redirected ? await copyResponse(response) : response; + } + }; + + /* + 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. + */ + /** + * Performs efficient precaching of assets. + * + * @memberof workbox-precaching + */ + class PrecacheController { + /** + * Create a new PrecacheController. + * + * @param {Object} [options] + * @param {string} [options.cacheName] The cache to use for precaching. + * @param {string} [options.plugins] Plugins to use when precaching as well + * as responding to fetch events for precached assets. + * @param {boolean} [options.fallbackToNetwork=true] Whether to attempt to + * get the response from the network if there's a precache miss. + */ + constructor({ + cacheName, + plugins = [], + fallbackToNetwork = true + } = {}) { + this._urlsToCacheKeys = new Map(); + this._urlsToCacheModes = new Map(); + this._cacheKeysToIntegrities = new Map(); + this._strategy = new PrecacheStrategy({ + cacheName: cacheNames.getPrecacheName(cacheName), + plugins: [...plugins, new PrecacheCacheKeyPlugin({ + precacheController: this + })], + fallbackToNetwork + }); + // Bind the install and activate methods to the instance. + this.install = this.install.bind(this); + this.activate = this.activate.bind(this); + } + /** + * @type {workbox-precaching.PrecacheStrategy} The strategy created by this controller and + * used to cache assets and respond to fetch events. + */ + get strategy() { + return this._strategy; + } + /** + * Adds items to the precache list, removing any duplicates and + * stores the files in the + * {@link workbox-core.cacheNames|"precache cache"} when the service + * worker installs. + * + * This method can be called multiple times. + * + * @param {Array} [entries=[]] Array of entries to precache. + */ + precache(entries) { + this.addToCacheList(entries); + if (!this._installAndActiveListenersAdded) { + self.addEventListener('install', this.install); + self.addEventListener('activate', this.activate); + this._installAndActiveListenersAdded = true; + } + } + /** + * This method will add items to the precache list, removing duplicates + * and ensuring the information is valid. + * + * @param {Array} entries + * Array of entries to precache. + */ + addToCacheList(entries) { + { + finalAssertExports.isArray(entries, { + moduleName: 'workbox-precaching', + className: 'PrecacheController', + funcName: 'addToCacheList', + paramName: 'entries' + }); + } + const urlsToWarnAbout = []; + for (const entry of entries) { + // See https://github.com/GoogleChrome/workbox/issues/2259 + 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`; + { + logger.warn(warningMessage); + } + } + } + } + /** + * Precaches new and updated assets. Call this method from the service worker + * install event. + * + * Note: this method calls `event.waitUntil()` for you, so you do not need + * to call it yourself in your event handlers. + * + * @param {ExtendableEvent} event + * @return {Promise} + */ + install(event) { + // waitUntil returns Promise + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return waitUntil(event, async () => { + const installReportPlugin = new PrecacheInstallReportPlugin(); + this.strategy.plugins.push(installReportPlugin); + // Cache entries one at a time. + // See https://github.com/GoogleChrome/workbox/issues/2528 + for (const [url, cacheKey] of this._urlsToCacheKeys) { + const integrity = this._cacheKeysToIntegrities.get(cacheKey); + const cacheMode = this._urlsToCacheModes.get(url); + const request = new Request(url, { + integrity, + cache: cacheMode, + credentials: 'same-origin' + }); + await Promise.all(this.strategy.handleAll({ + params: { + cacheKey + }, + request, + event + })); + } + const { + updatedURLs, + notUpdatedURLs + } = installReportPlugin; + { + printInstallDetails(updatedURLs, notUpdatedURLs); + } + return { + updatedURLs, + notUpdatedURLs + }; + }); + } + /** + * Deletes assets that are no longer present in the current precache manifest. + * Call this method from the service worker activate event. + * + * Note: this method calls `event.waitUntil()` for you, so you do not need + * to call it yourself in your event handlers. + * + * @param {ExtendableEvent} event + * @return {Promise} + */ + activate(event) { + // waitUntil returns Promise + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return waitUntil(event, async () => { + const cache = await self.caches.open(this.strategy.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); + } + } + { + printCleanupDetails(deletedURLs); + } + return { + deletedURLs + }; + }); + } + /** + * Returns a mapping of a precached URL to the corresponding cache key, taking + * into account the revision information for the URL. + * + * @return {Map} A URL to cache key mapping. + */ + getURLsToCacheKeys() { + return this._urlsToCacheKeys; + } + /** + * Returns a list of all the URLs that have been precached by the current + * service worker. + * + * @return {Array} The precached URLs. + */ + getCachedURLs() { + return [...this._urlsToCacheKeys.keys()]; + } + /** + * Returns the cache key used for storing a given URL. If that URL is + * unversioned, like `/index.html', then the cache key will be the original + * URL with a search parameter appended to it. + * + * @param {string} url A URL whose cache key you want to look up. + * @return {string} The versioned URL that corresponds to a cache key + * for the original URL, or undefined if that URL isn't precached. + */ + getCacheKeyForURL(url) { + const urlObject = new URL(url, location.href); + return this._urlsToCacheKeys.get(urlObject.href); + } + /** + * @param {string} url A cache key whose SRI you want to look up. + * @return {string} The subresource integrity associated with the cache key, + * or undefined if it's not set. + */ + getIntegrityForCacheKey(cacheKey) { + return this._cacheKeysToIntegrities.get(cacheKey); + } + /** + * This acts as a drop-in replacement for + * [`cache.match()`](https://developer.mozilla.org/en-US/docs/Web/API/Cache/match) + * with the following differences: + * + * - It knows what the name of the precache is, and only checks in that cache. + * - It allows you to pass in an "original" URL without versioning parameters, + * and it will automatically look up the correct cache key for the currently + * active revision of that URL. + * + * E.g., `matchPrecache('index.html')` will find the correct precached + * response for the currently active service worker, even if the actual cache + * key is `'/index.html?__WB_REVISION__=1234abcd'`. + * + * @param {string|Request} request The key (without revisioning parameters) + * to look up in the precache. + * @return {Promise} + */ + 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.strategy.cacheName); + return cache.match(cacheKey); + } + return undefined; + } + /** + * Returns a function that looks up `url` in the precache (taking into + * account revision information), and returns the corresponding `Response`. + * + * @param {string} url The precached URL which will be used to lookup the + * `Response`. + * @return {workbox-routing~handlerCallback} + */ + createHandlerBoundToURL(url) { + const cacheKey = this.getCacheKeyForURL(url); + if (!cacheKey) { + throw new WorkboxError('non-precached-url', { + url + }); + } + return options => { + options.request = new Request(url); + options.params = Object.assign({ + cacheKey + }, options.params); + return this.strategy.handle(options); + }; + } + } + + /* + 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. + */ + let precacheController; + /** + * @return {PrecacheController} + * @private + */ + const getOrCreatePrecacheController = () => { + if (!precacheController) { + precacheController = new PrecacheController(); + } + return precacheController; + }; + + /* + 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. + */ + /** + * Removes any URL search parameters that should be ignored. + * + * @param {URL} urlObject The original URL. + * @param {Array} ignoreURLParametersMatching RegExps to test against + * each search parameter name. Matches mean that the search parameter should be + * ignored. + * @return {URL} The URL with any ignored search parameters removed. + * + * @private + * @memberof workbox-precaching + */ + function removeIgnoredSearchParams(urlObject, ignoreURLParametersMatching = []) { + // Convert the iterable into an array at the start of the loop to make sure + // deletion doesn't mess up iteration. + for (const paramName of [...urlObject.searchParams.keys()]) { + if (ignoreURLParametersMatching.some(regExp => regExp.test(paramName))) { + urlObject.searchParams.delete(paramName); + } + } + return urlObject; + } + + /* + 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. + */ + /** + * Generator function that yields possible variations on the original URL to + * check, one at a time. + * + * @param {string} url + * @param {Object} options + * + * @private + * @memberof workbox-precaching + */ + function* generateURLVariations(url, { + ignoreURLParametersMatching = [/^utm_/, /^fbclid$/], + directoryIndex = 'index.html', + cleanURLs = true, + 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; + } + } + } + + /* + Copyright 2020 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. + */ + /** + * A subclass of {@link workbox-routing.Route} that takes a + * {@link workbox-precaching.PrecacheController} + * instance and uses it to match incoming requests and handle fetching + * responses from the precache. + * + * @memberof workbox-precaching + * @extends workbox-routing.Route + */ + class PrecacheRoute extends Route { + /** + * @param {PrecacheController} precacheController A `PrecacheController` + * instance used to both match requests and respond to fetch events. + * @param {Object} [options] Options to control how requests are matched + * against the list of precached URLs. + * @param {string} [options.directoryIndex=index.html] The `directoryIndex` will + * check cache entries for a URLs ending with '/' to see if there is a hit when + * appending the `directoryIndex` value. + * @param {Array} [options.ignoreURLParametersMatching=[/^utm_/, /^fbclid$/]] An + * array of regex's to remove search params when looking for a cache match. + * @param {boolean} [options.cleanURLs=true] The `cleanURLs` option will + * check the cache for the URL with a `.html` added to the end of the end. + * @param {workbox-precaching~urlManipulation} [options.urlManipulation] + * This is a function that should take a URL and return an array of + * alternative URLs that should be checked for precache matches. + */ + constructor(precacheController, options) { + const match = ({ + request + }) => { + const urlsToCacheKeys = precacheController.getURLsToCacheKeys(); + for (const possibleURL of generateURLVariations(request.url, options)) { + const cacheKey = urlsToCacheKeys.get(possibleURL); + if (cacheKey) { + const integrity = precacheController.getIntegrityForCacheKey(cacheKey); + return { + cacheKey, + integrity + }; + } + } + { + logger.debug(`Precaching did not find a match for ` + getFriendlyURL(request.url)); + } + return; + }; + super(match, precacheController.strategy); + } + } + + /* + 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. + */ + /** + * Add a `fetch` listener to the service worker that will + * respond to + * [network requests]{@link https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#Custom_responses_to_requests} + * with precached assets. + * + * Requests for assets that aren't precached, the `FetchEvent` will not be + * responded to, allowing the event to fall through to other `fetch` event + * listeners. + * + * @param {Object} [options] See the {@link workbox-precaching.PrecacheRoute} + * options. + * + * @memberof workbox-precaching + */ + function addRoute(options) { + const precacheController = getOrCreatePrecacheController(); + const precacheRoute = new PrecacheRoute(precacheController, options); + registerRoute(precacheRoute); + } + + /* + 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. + */ + /** + * Adds items to the precache list, removing any duplicates and + * stores the files in the + * {@link workbox-core.cacheNames|"precache cache"} when the service + * worker installs. + * + * This method can be called multiple times. + * + * Please note: This method **will not** serve any of the cached files for you. + * It only precaches files. To respond to a network request you call + * {@link workbox-precaching.addRoute}. + * + * If you have a single array of files to precache, you can just call + * {@link workbox-precaching.precacheAndRoute}. + * + * @param {Array} [entries=[]] Array of entries to precache. + * + * @memberof workbox-precaching + */ + function precache(entries) { + const precacheController = getOrCreatePrecacheController(); + precacheController.precache(entries); + } + + /* + 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. + */ + /** + * This method will add entries to the precache list and add a route to + * respond to fetch events. + * + * This is a convenience method that will call + * {@link workbox-precaching.precache} and + * {@link workbox-precaching.addRoute} in a single call. + * + * @param {Array} entries Array of entries to precache. + * @param {Object} [options] See the + * {@link workbox-precaching.PrecacheRoute} options. + * + * @memberof workbox-precaching + */ + function precacheAndRoute(entries, options) { + precache(entries); + addRoute(options); + } + + /* + 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 SUBSTRING_TO_FIND = '-precache-'; + /** + * Cleans up incompatible precaches that were created by older versions of + * Workbox, by a service worker registered under the current scope. + * + * This is meant to be called as part of the `activate` event. + * + * This should be safe to use as long as you don't include `substringToFind` + * (defaulting to `-precache-`) in your non-precache cache names. + * + * @param {string} currentPrecacheName The cache name currently in use for + * precaching. This cache won't be deleted. + * @param {string} [substringToFind='-precache-'] Cache names which include this + * substring will be deleted (excluding `currentPrecacheName`). + * @return {Array} A list of all the cache names that were deleted. + * + * @private + * @memberof workbox-precaching + */ + const deleteOutdatedCaches = async (currentPrecacheName, substringToFind = SUBSTRING_TO_FIND) => { + const cacheNames = await self.caches.keys(); + const cacheNamesToDelete = cacheNames.filter(cacheName => { + return cacheName.includes(substringToFind) && cacheName.includes(self.registration.scope) && cacheName !== currentPrecacheName; + }); + await Promise.all(cacheNamesToDelete.map(cacheName => self.caches.delete(cacheName))); + return cacheNamesToDelete; + }; + + /* + 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. + */ + /** + * Adds an `activate` event listener which will clean up incompatible + * precaches that were created by older versions of Workbox. + * + * @memberof workbox-precaching + */ + function cleanupOutdatedCaches() { + // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705 + self.addEventListener('activate', event => { + const cacheName = cacheNames.getPrecacheName(); + event.waitUntil(deleteOutdatedCaches(cacheName).then(cachesDeleted => { + { + if (cachesDeleted.length > 0) { + logger.log(`The following out-of-date precaches were cleaned up ` + `automatically:`, cachesDeleted); + } + } + })); + }); + } + + /* + 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. + */ + /** + * NavigationRoute makes it easy to create a + * {@link workbox-routing.Route} that matches for browser + * [navigation requests]{@link https://developers.google.com/web/fundamentals/primers/service-workers/high-performance-loading#first_what_are_navigation_requests}. + * + * It will only match incoming Requests whose + * {@link https://fetch.spec.whatwg.org/#concept-request-mode|mode} + * is set to `navigate`. + * + * You can optionally only apply this route to a subset of navigation requests + * by using one or both of the `denylist` and `allowlist` parameters. + * + * @memberof workbox-routing + * @extends workbox-routing.Route + */ + class NavigationRoute extends Route { + /** + * If both `denylist` and `allowlist` are provided, the `denylist` will + * take precedence and the request will not match this route. + * + * The regular expressions in `allowlist` and `denylist` + * are matched against the concatenated + * [`pathname`]{@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/pathname} + * and [`search`]{@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/search} + * portions of the requested URL. + * + * *Note*: These RegExps may be evaluated against every destination URL during + * a navigation. Avoid using + * [complex RegExps](https://github.com/GoogleChrome/workbox/issues/3077), + * or else your users may see delays when navigating your site. + * + * @param {workbox-routing~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + * @param {Object} options + * @param {Array} [options.denylist] If any of these patterns match, + * the route will not handle the request (even if a allowlist RegExp matches). + * @param {Array} [options.allowlist=[/./]] If any of these patterns + * match the URL's pathname and search parameter, the route will handle the + * request (assuming the denylist doesn't match). + */ + constructor(handler, { + allowlist = [/./], + denylist = [] + } = {}) { + { + finalAssertExports.isArrayOfClass(allowlist, RegExp, { + moduleName: 'workbox-routing', + className: 'NavigationRoute', + funcName: 'constructor', + paramName: 'options.allowlist' + }); + finalAssertExports.isArrayOfClass(denylist, RegExp, { + moduleName: 'workbox-routing', + className: 'NavigationRoute', + funcName: 'constructor', + paramName: 'options.denylist' + }); + } + super(options => this._match(options), handler); + this._allowlist = allowlist; + this._denylist = denylist; + } + /** + * Routes match handler. + * + * @param {Object} options + * @param {URL} options.url + * @param {Request} options.request + * @return {boolean} + * + * @private + */ + _match({ + url, + request + }) { + if (request && request.mode !== 'navigate') { + return false; + } + const pathnameAndSearch = url.pathname + url.search; + for (const regExp of this._denylist) { + if (regExp.test(pathnameAndSearch)) { + { + logger.log(`The navigation route ${pathnameAndSearch} is not ` + `being used, since the URL matches this denylist pattern: ` + `${regExp.toString()}`); + } + return false; + } + } + if (this._allowlist.some(regExp => regExp.test(pathnameAndSearch))) { + { + logger.debug(`The navigation route ${pathnameAndSearch} ` + `is being used.`); + } + return true; + } + { + logger.log(`The navigation route ${pathnameAndSearch} is not ` + `being used, since the URL being navigated to doesn't ` + `match the allowlist.`); + } + return false; + } + } + + /* + 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. + */ + /** + * Helper function that calls + * {@link PrecacheController#createHandlerBoundToURL} on the default + * {@link PrecacheController} instance. + * + * If you are creating your own {@link PrecacheController}, then call the + * {@link PrecacheController#createHandlerBoundToURL} on that instance, + * instead of using this function. + * + * @param {string} url The precached URL which will be used to lookup the + * `Response`. + * @param {boolean} [fallbackToNetwork=true] Whether to attempt to get the + * response from the network if there's a precache miss. + * @return {workbox-routing~handlerCallback} + * + * @memberof workbox-precaching + */ + function createHandlerBoundToURL(url) { + const precacheController = getOrCreatePrecacheController(); + return precacheController.createHandlerBoundToURL(url); + } + + exports.CacheFirst = CacheFirst; + exports.CacheableResponsePlugin = CacheableResponsePlugin; + exports.ExpirationPlugin = ExpirationPlugin; + exports.NavigationRoute = NavigationRoute; + exports.NetworkFirst = NetworkFirst; + exports.cleanupOutdatedCaches = cleanupOutdatedCaches; + exports.clientsClaim = clientsClaim; + exports.createHandlerBoundToURL = createHandlerBoundToURL; + exports.precacheAndRoute = precacheAndRoute; + exports.registerRoute = registerRoute; + +})); +//# sourceMappingURL=workbox-47da91e0.js.map diff --git a/frontend/dev-dist/workbox-47da91e0.js.map b/frontend/dev-dist/workbox-47da91e0.js.map new file mode 100644 index 0000000..80416b4 --- /dev/null +++ b/frontend/dev-dist/workbox-47da91e0.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-47da91e0.js","sources":["node_modules/workbox-core/_version.js","node_modules/workbox-core/_private/logger.js","node_modules/workbox-core/models/messages/messages.js","node_modules/workbox-core/models/messages/messageGenerator.js","node_modules/workbox-core/_private/WorkboxError.js","node_modules/workbox-core/_private/assert.js","node_modules/workbox-routing/_version.js","node_modules/workbox-routing/utils/constants.js","node_modules/workbox-routing/utils/normalizeHandler.js","node_modules/workbox-routing/Route.js","node_modules/workbox-routing/RegExpRoute.js","node_modules/workbox-core/_private/getFriendlyURL.js","node_modules/workbox-routing/Router.js","node_modules/workbox-routing/utils/getOrCreateDefaultRouter.js","node_modules/workbox-routing/registerRoute.js","node_modules/workbox-core/_private/cacheNames.js","node_modules/workbox-core/_private/dontWaitFor.js","node_modules/workbox-core/models/quotaErrorCallbacks.js","node_modules/workbox-core/registerQuotaErrorCallback.js","node_modules/idb/build/wrap-idb-value.js","node_modules/idb/build/index.js","node_modules/workbox-expiration/_version.js","node_modules/workbox-expiration/models/CacheTimestampsModel.js","node_modules/workbox-expiration/CacheExpiration.js","node_modules/workbox-expiration/ExpirationPlugin.js","node_modules/workbox-cacheable-response/_version.js","node_modules/workbox-cacheable-response/CacheableResponse.js","node_modules/workbox-cacheable-response/CacheableResponsePlugin.js","node_modules/workbox-core/_private/cacheMatchIgnoreParams.js","node_modules/workbox-core/_private/Deferred.js","node_modules/workbox-core/_private/executeQuotaErrorCallbacks.js","node_modules/workbox-core/_private/timeout.js","node_modules/workbox-strategies/_version.js","node_modules/workbox-strategies/StrategyHandler.js","node_modules/workbox-strategies/Strategy.js","node_modules/workbox-strategies/utils/messages.js","node_modules/workbox-strategies/CacheFirst.js","node_modules/workbox-strategies/plugins/cacheOkAndOpaquePlugin.js","node_modules/workbox-strategies/NetworkFirst.js","node_modules/workbox-core/clientsClaim.js","node_modules/workbox-core/_private/waitUntil.js","node_modules/workbox-precaching/_version.js","node_modules/workbox-precaching/utils/createCacheKey.js","node_modules/workbox-precaching/utils/PrecacheInstallReportPlugin.js","node_modules/workbox-precaching/utils/PrecacheCacheKeyPlugin.js","node_modules/workbox-precaching/utils/printCleanupDetails.js","node_modules/workbox-precaching/utils/printInstallDetails.js","node_modules/workbox-core/_private/canConstructResponseFromBodyStream.js","node_modules/workbox-core/copyResponse.js","node_modules/workbox-precaching/PrecacheStrategy.js","node_modules/workbox-precaching/PrecacheController.js","node_modules/workbox-precaching/utils/getOrCreatePrecacheController.js","node_modules/workbox-precaching/utils/removeIgnoredSearchParams.js","node_modules/workbox-precaching/utils/generateURLVariations.js","node_modules/workbox-precaching/PrecacheRoute.js","node_modules/workbox-precaching/addRoute.js","node_modules/workbox-precaching/precache.js","node_modules/workbox-precaching/precacheAndRoute.js","node_modules/workbox-precaching/utils/deleteOutdatedCaches.js","node_modules/workbox-precaching/cleanupOutdatedCaches.js","node_modules/workbox-routing/NavigationRoute.js","node_modules/workbox-precaching/createHandlerBoundToURL.js"],"sourcesContent":["\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:core:7.2.0'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2019 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nconst logger = (process.env.NODE_ENV === 'production'\n ? null\n : (() => {\n // Don't overwrite this value if it's already set.\n // See https://github.com/GoogleChrome/workbox/pull/2284#issuecomment-560470923\n if (!('__WB_DISABLE_DEV_LOGS' in globalThis)) {\n self.__WB_DISABLE_DEV_LOGS = false;\n }\n let inGroup = false;\n const methodToColorMap = {\n debug: `#7f8c8d`,\n log: `#2ecc71`,\n warn: `#f39c12`,\n error: `#c0392b`,\n groupCollapsed: `#3498db`,\n groupEnd: null, // No colored prefix on groupEnd\n };\n const print = function (method, args) {\n if (self.__WB_DISABLE_DEV_LOGS) {\n return;\n }\n if (method === 'groupCollapsed') {\n // Safari doesn't print all console.groupCollapsed() arguments:\n // https://bugs.webkit.org/show_bug.cgi?id=182754\n if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\n console[method](...args);\n return;\n }\n }\n const styles = [\n `background: ${methodToColorMap[method]}`,\n `border-radius: 0.5em`,\n `color: white`,\n `font-weight: bold`,\n `padding: 2px 0.5em`,\n ];\n // When in a group, the workbox prefix is not displayed.\n const logPrefix = inGroup ? [] : ['%cworkbox', styles.join(';')];\n console[method](...logPrefix, ...args);\n if (method === 'groupCollapsed') {\n inGroup = true;\n }\n if (method === 'groupEnd') {\n inGroup = false;\n }\n };\n // eslint-disable-next-line @typescript-eslint/ban-types\n const api = {};\n const loggerMethods = Object.keys(methodToColorMap);\n for (const key of loggerMethods) {\n const method = key;\n api[method] = (...args) => {\n print(method, args);\n };\n }\n return api;\n })());\nexport { logger };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../../_version.js';\nexport const messages = {\n 'invalid-value': ({ paramName, validValueDescription, value }) => {\n if (!paramName || !validValueDescription) {\n throw new Error(`Unexpected input to 'invalid-value' error.`);\n }\n return (`The '${paramName}' parameter was given a value with an ` +\n `unexpected value. ${validValueDescription} Received a value of ` +\n `${JSON.stringify(value)}.`);\n },\n 'not-an-array': ({ moduleName, className, funcName, paramName }) => {\n if (!moduleName || !className || !funcName || !paramName) {\n throw new Error(`Unexpected input to 'not-an-array' error.`);\n }\n return (`The parameter '${paramName}' passed into ` +\n `'${moduleName}.${className}.${funcName}()' must be an array.`);\n },\n 'incorrect-type': ({ expectedType, paramName, moduleName, className, funcName, }) => {\n if (!expectedType || !paramName || !moduleName || !funcName) {\n throw new Error(`Unexpected input to 'incorrect-type' error.`);\n }\n const classNameStr = className ? `${className}.` : '';\n return (`The parameter '${paramName}' passed into ` +\n `'${moduleName}.${classNameStr}` +\n `${funcName}()' must be of type ${expectedType}.`);\n },\n 'incorrect-class': ({ expectedClassName, paramName, moduleName, className, funcName, isReturnValueProblem, }) => {\n if (!expectedClassName || !moduleName || !funcName) {\n throw new Error(`Unexpected input to 'incorrect-class' error.`);\n }\n const classNameStr = className ? `${className}.` : '';\n if (isReturnValueProblem) {\n return (`The return value from ` +\n `'${moduleName}.${classNameStr}${funcName}()' ` +\n `must be an instance of class ${expectedClassName}.`);\n }\n return (`The parameter '${paramName}' passed into ` +\n `'${moduleName}.${classNameStr}${funcName}()' ` +\n `must be an instance of class ${expectedClassName}.`);\n },\n 'missing-a-method': ({ expectedMethod, paramName, moduleName, className, funcName, }) => {\n if (!expectedMethod ||\n !paramName ||\n !moduleName ||\n !className ||\n !funcName) {\n throw new Error(`Unexpected input to 'missing-a-method' error.`);\n }\n return (`${moduleName}.${className}.${funcName}() expected the ` +\n `'${paramName}' parameter to expose a '${expectedMethod}' method.`);\n },\n 'add-to-cache-list-unexpected-type': ({ entry }) => {\n return (`An unexpected entry was passed to ` +\n `'workbox-precaching.PrecacheController.addToCacheList()' The entry ` +\n `'${JSON.stringify(entry)}' isn't supported. You must supply an array of ` +\n `strings with one or more characters, objects with a url property or ` +\n `Request objects.`);\n },\n 'add-to-cache-list-conflicting-entries': ({ firstEntry, secondEntry }) => {\n if (!firstEntry || !secondEntry) {\n throw new Error(`Unexpected input to ` + `'add-to-cache-list-duplicate-entries' error.`);\n }\n return (`Two of the entries passed to ` +\n `'workbox-precaching.PrecacheController.addToCacheList()' had the URL ` +\n `${firstEntry} but different revision details. Workbox is ` +\n `unable to cache and version the asset correctly. Please remove one ` +\n `of the entries.`);\n },\n 'plugin-error-request-will-fetch': ({ thrownErrorMessage }) => {\n if (!thrownErrorMessage) {\n throw new Error(`Unexpected input to ` + `'plugin-error-request-will-fetch', error.`);\n }\n return (`An error was thrown by a plugins 'requestWillFetch()' method. ` +\n `The thrown error message was: '${thrownErrorMessage}'.`);\n },\n 'invalid-cache-name': ({ cacheNameId, value }) => {\n if (!cacheNameId) {\n throw new Error(`Expected a 'cacheNameId' for error 'invalid-cache-name'`);\n }\n return (`You must provide a name containing at least one character for ` +\n `setCacheDetails({${cacheNameId}: '...'}). Received a value of ` +\n `'${JSON.stringify(value)}'`);\n },\n 'unregister-route-but-not-found-with-method': ({ method }) => {\n if (!method) {\n throw new Error(`Unexpected input to ` +\n `'unregister-route-but-not-found-with-method' error.`);\n }\n return (`The route you're trying to unregister was not previously ` +\n `registered for the method type '${method}'.`);\n },\n 'unregister-route-route-not-registered': () => {\n return (`The route you're trying to unregister was not previously ` +\n `registered.`);\n },\n 'queue-replay-failed': ({ name }) => {\n return `Replaying the background sync queue '${name}' failed.`;\n },\n 'duplicate-queue-name': ({ name }) => {\n return (`The Queue name '${name}' is already being used. ` +\n `All instances of backgroundSync.Queue must be given unique names.`);\n },\n 'expired-test-without-max-age': ({ methodName, paramName }) => {\n return (`The '${methodName}()' method can only be used when the ` +\n `'${paramName}' is used in the constructor.`);\n },\n 'unsupported-route-type': ({ moduleName, className, funcName, paramName }) => {\n return (`The supplied '${paramName}' parameter was an unsupported type. ` +\n `Please check the docs for ${moduleName}.${className}.${funcName} for ` +\n `valid input types.`);\n },\n 'not-array-of-class': ({ value, expectedClass, moduleName, className, funcName, paramName, }) => {\n return (`The supplied '${paramName}' parameter must be an array of ` +\n `'${expectedClass}' objects. Received '${JSON.stringify(value)},'. ` +\n `Please check the call to ${moduleName}.${className}.${funcName}() ` +\n `to fix the issue.`);\n },\n 'max-entries-or-age-required': ({ moduleName, className, funcName }) => {\n return (`You must define either config.maxEntries or config.maxAgeSeconds` +\n `in ${moduleName}.${className}.${funcName}`);\n },\n 'statuses-or-headers-required': ({ moduleName, className, funcName }) => {\n return (`You must define either config.statuses or config.headers` +\n `in ${moduleName}.${className}.${funcName}`);\n },\n 'invalid-string': ({ moduleName, funcName, paramName }) => {\n if (!paramName || !moduleName || !funcName) {\n throw new Error(`Unexpected input to 'invalid-string' error.`);\n }\n return (`When using strings, the '${paramName}' parameter must start with ` +\n `'http' (for cross-origin matches) or '/' (for same-origin matches). ` +\n `Please see the docs for ${moduleName}.${funcName}() for ` +\n `more info.`);\n },\n 'channel-name-required': () => {\n return (`You must provide a channelName to construct a ` +\n `BroadcastCacheUpdate instance.`);\n },\n 'invalid-responses-are-same-args': () => {\n return (`The arguments passed into responsesAreSame() appear to be ` +\n `invalid. Please ensure valid Responses are used.`);\n },\n 'expire-custom-caches-only': () => {\n return (`You must provide a 'cacheName' property when using the ` +\n `expiration plugin with a runtime caching strategy.`);\n },\n 'unit-must-be-bytes': ({ normalizedRangeHeader }) => {\n if (!normalizedRangeHeader) {\n throw new Error(`Unexpected input to 'unit-must-be-bytes' error.`);\n }\n return (`The 'unit' portion of the Range header must be set to 'bytes'. ` +\n `The Range header provided was \"${normalizedRangeHeader}\"`);\n },\n 'single-range-only': ({ normalizedRangeHeader }) => {\n if (!normalizedRangeHeader) {\n throw new Error(`Unexpected input to 'single-range-only' error.`);\n }\n return (`Multiple ranges are not supported. Please use a single start ` +\n `value, and optional end value. The Range header provided was ` +\n `\"${normalizedRangeHeader}\"`);\n },\n 'invalid-range-values': ({ normalizedRangeHeader }) => {\n if (!normalizedRangeHeader) {\n throw new Error(`Unexpected input to 'invalid-range-values' error.`);\n }\n return (`The Range header is missing both start and end values. At least ` +\n `one of those values is needed. The Range header provided was ` +\n `\"${normalizedRangeHeader}\"`);\n },\n 'no-range-header': () => {\n return `No Range header was found in the Request provided.`;\n },\n 'range-not-satisfiable': ({ size, start, end }) => {\n return (`The start (${start}) and end (${end}) values in the Range are ` +\n `not satisfiable by the cached response, which is ${size} bytes.`);\n },\n 'attempt-to-cache-non-get-request': ({ url, method }) => {\n return (`Unable to cache '${url}' because it is a '${method}' request and ` +\n `only 'GET' requests can be cached.`);\n },\n 'cache-put-with-no-response': ({ url }) => {\n return (`There was an attempt to cache '${url}' but the response was not ` +\n `defined.`);\n },\n 'no-response': ({ url, error }) => {\n let message = `The strategy could not generate a response for '${url}'.`;\n if (error) {\n message += ` The underlying error is ${error}.`;\n }\n return message;\n },\n 'bad-precaching-response': ({ url, status }) => {\n return (`The precaching request for '${url}' failed` +\n (status ? ` with an HTTP status of ${status}.` : `.`));\n },\n 'non-precached-url': ({ url }) => {\n return (`createHandlerBoundToURL('${url}') was called, but that URL is ` +\n `not precached. Please pass in a URL that is precached instead.`);\n },\n 'add-to-cache-list-conflicting-integrities': ({ url }) => {\n return (`Two of the entries passed to ` +\n `'workbox-precaching.PrecacheController.addToCacheList()' had the URL ` +\n `${url} with different integrity values. Please remove one of them.`);\n },\n 'missing-precache-entry': ({ cacheName, url }) => {\n return `Unable to find a precached response in ${cacheName} for ${url}.`;\n },\n 'cross-origin-copy-response': ({ origin }) => {\n return (`workbox-core.copyResponse() can only be used with same-origin ` +\n `responses. It was passed a response with origin ${origin}.`);\n },\n 'opaque-streams-source': ({ type }) => {\n const message = `One of the workbox-streams sources resulted in an ` +\n `'${type}' response.`;\n if (type === 'opaqueredirect') {\n return (`${message} Please do not use a navigation request that results ` +\n `in a redirect as a source.`);\n }\n return `${message} Please ensure your sources are CORS-enabled.`;\n },\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { messages } from './messages.js';\nimport '../../_version.js';\nconst fallback = (code, ...args) => {\n let msg = code;\n if (args.length > 0) {\n msg += ` :: ${JSON.stringify(args)}`;\n }\n return msg;\n};\nconst generatorFunction = (code, details = {}) => {\n const message = messages[code];\n if (!message) {\n throw new Error(`Unable to find message for code '${code}'.`);\n }\n return message(details);\n};\nexport const messageGenerator = process.env.NODE_ENV === 'production' ? fallback : generatorFunction;\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { messageGenerator } from '../models/messages/messageGenerator.js';\nimport '../_version.js';\n/**\n * Workbox errors should be thrown with this class.\n * This allows use to ensure the type easily in tests,\n * helps developers identify errors from workbox\n * easily and allows use to optimise error\n * messages correctly.\n *\n * @private\n */\nclass WorkboxError extends Error {\n /**\n *\n * @param {string} errorCode The error code that\n * identifies this particular error.\n * @param {Object=} details Any relevant arguments\n * that will help developers identify issues should\n * be added as a key on the context object.\n */\n constructor(errorCode, details) {\n const message = messageGenerator(errorCode, details);\n super(message);\n this.name = errorCode;\n this.details = details;\n }\n}\nexport { WorkboxError };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { WorkboxError } from '../_private/WorkboxError.js';\nimport '../_version.js';\n/*\n * This method throws if the supplied value is not an array.\n * The destructed values are required to produce a meaningful error for users.\n * The destructed and restructured object is so it's clear what is\n * needed.\n */\nconst isArray = (value, details) => {\n if (!Array.isArray(value)) {\n throw new WorkboxError('not-an-array', details);\n }\n};\nconst hasMethod = (object, expectedMethod, details) => {\n const type = typeof object[expectedMethod];\n if (type !== 'function') {\n details['expectedMethod'] = expectedMethod;\n throw new WorkboxError('missing-a-method', details);\n }\n};\nconst isType = (object, expectedType, details) => {\n if (typeof object !== expectedType) {\n details['expectedType'] = expectedType;\n throw new WorkboxError('incorrect-type', details);\n }\n};\nconst isInstance = (object, \n// Need the general type to do the check later.\n// eslint-disable-next-line @typescript-eslint/ban-types\nexpectedClass, details) => {\n if (!(object instanceof expectedClass)) {\n details['expectedClassName'] = expectedClass.name;\n throw new WorkboxError('incorrect-class', details);\n }\n};\nconst isOneOf = (value, validValues, details) => {\n if (!validValues.includes(value)) {\n details['validValueDescription'] = `Valid values are ${JSON.stringify(validValues)}.`;\n throw new WorkboxError('invalid-value', details);\n }\n};\nconst isArrayOfClass = (value, \n// Need general type to do check later.\nexpectedClass, // eslint-disable-line\ndetails) => {\n const error = new WorkboxError('not-array-of-class', details);\n if (!Array.isArray(value)) {\n throw error;\n }\n for (const item of value) {\n if (!(item instanceof expectedClass)) {\n throw error;\n }\n }\n};\nconst finalAssertExports = process.env.NODE_ENV === 'production'\n ? null\n : {\n hasMethod,\n isArray,\n isInstance,\n isOneOf,\n isType,\n isArrayOfClass,\n };\nexport { finalAssertExports as assert };\n","\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:routing:7.2.0'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * The default HTTP method, 'GET', used when there's no specific method\n * configured for a route.\n *\n * @type {string}\n *\n * @private\n */\nexport const defaultMethod = 'GET';\n/**\n * The list of valid HTTP methods associated with requests that could be routed.\n *\n * @type {Array}\n *\n * @private\n */\nexport const validMethods = [\n 'DELETE',\n 'GET',\n 'HEAD',\n 'PATCH',\n 'POST',\n 'PUT',\n];\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport '../_version.js';\n/**\n * @param {function()|Object} handler Either a function, or an object with a\n * 'handle' method.\n * @return {Object} An object with a handle method.\n *\n * @private\n */\nexport const normalizeHandler = (handler) => {\n if (handler && typeof handler === 'object') {\n if (process.env.NODE_ENV !== 'production') {\n assert.hasMethod(handler, 'handle', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'handler',\n });\n }\n return handler;\n }\n else {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(handler, 'function', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'handler',\n });\n }\n return { handle: handler };\n }\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { defaultMethod, validMethods } from './utils/constants.js';\nimport { normalizeHandler } from './utils/normalizeHandler.js';\nimport './_version.js';\n/**\n * A `Route` consists of a pair of callback functions, \"match\" and \"handler\".\n * The \"match\" callback determine if a route should be used to \"handle\" a\n * request by returning a non-falsy value if it can. The \"handler\" callback\n * is called when there is a match and should return a Promise that resolves\n * to a `Response`.\n *\n * @memberof workbox-routing\n */\nclass Route {\n /**\n * Constructor for Route class.\n *\n * @param {workbox-routing~matchCallback} match\n * A callback function that determines whether the route matches a given\n * `fetch` event by returning a non-falsy value.\n * @param {workbox-routing~handlerCallback} handler A callback\n * function that returns a Promise resolving to a Response.\n * @param {string} [method='GET'] The HTTP method to match the Route\n * against.\n */\n constructor(match, handler, method = defaultMethod) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(match, 'function', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'match',\n });\n if (method) {\n assert.isOneOf(method, validMethods, { paramName: 'method' });\n }\n }\n // These values are referenced directly by Router so cannot be\n // altered by minificaton.\n this.handler = normalizeHandler(handler);\n this.match = match;\n this.method = method;\n }\n /**\n *\n * @param {workbox-routing-handlerCallback} handler A callback\n * function that returns a Promise resolving to a Response\n */\n setCatchHandler(handler) {\n this.catchHandler = normalizeHandler(handler);\n }\n}\nexport { Route };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { Route } from './Route.js';\nimport './_version.js';\n/**\n * RegExpRoute makes it easy to create a regular expression based\n * {@link workbox-routing.Route}.\n *\n * For same-origin requests the RegExp only needs to match part of the URL. For\n * requests against third-party servers, you must define a RegExp that matches\n * the start of the URL.\n *\n * @memberof workbox-routing\n * @extends workbox-routing.Route\n */\nclass RegExpRoute extends Route {\n /**\n * If the regular expression contains\n * [capture groups]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#grouping-back-references},\n * the captured values will be passed to the\n * {@link workbox-routing~handlerCallback} `params`\n * argument.\n *\n * @param {RegExp} regExp The regular expression to match against URLs.\n * @param {workbox-routing~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n * @param {string} [method='GET'] The HTTP method to match the Route\n * against.\n */\n constructor(regExp, handler, method) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(regExp, RegExp, {\n moduleName: 'workbox-routing',\n className: 'RegExpRoute',\n funcName: 'constructor',\n paramName: 'pattern',\n });\n }\n const match = ({ url }) => {\n const result = regExp.exec(url.href);\n // Return immediately if there's no match.\n if (!result) {\n return;\n }\n // Require that the match start at the first character in the URL string\n // if it's a cross-origin request.\n // See https://github.com/GoogleChrome/workbox/issues/281 for the context\n // behind this behavior.\n if (url.origin !== location.origin && result.index !== 0) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`The regular expression '${regExp.toString()}' only partially matched ` +\n `against the cross-origin URL '${url.toString()}'. RegExpRoute's will only ` +\n `handle cross-origin requests if they match the entire URL.`);\n }\n return;\n }\n // If the route matches, but there aren't any capture groups defined, then\n // this will return [], which is truthy and therefore sufficient to\n // indicate a match.\n // If there are capture groups, then it will return their values.\n return result.slice(1);\n };\n super(match, handler, method);\n }\n}\nexport { RegExpRoute };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nconst getFriendlyURL = (url) => {\n const urlObj = new URL(String(url), location.href);\n // See https://github.com/GoogleChrome/workbox/issues/2323\n // We want to include everything, except for the origin if it's same-origin.\n return urlObj.href.replace(new RegExp(`^${location.origin}`), '');\n};\nexport { getFriendlyURL };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { defaultMethod } from './utils/constants.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { normalizeHandler } from './utils/normalizeHandler.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport './_version.js';\n/**\n * The Router can be used to process a `FetchEvent` using one or more\n * {@link workbox-routing.Route}, responding with a `Response` if\n * a matching route exists.\n *\n * If no route matches a given a request, the Router will use a \"default\"\n * handler if one is defined.\n *\n * Should the matching Route throw an error, the Router will use a \"catch\"\n * handler if one is defined to gracefully deal with issues and respond with a\n * Request.\n *\n * If a request matches multiple routes, the **earliest** registered route will\n * be used to respond to the request.\n *\n * @memberof workbox-routing\n */\nclass Router {\n /**\n * Initializes a new Router.\n */\n constructor() {\n this._routes = new Map();\n this._defaultHandlerMap = new Map();\n }\n /**\n * @return {Map>} routes A `Map` of HTTP\n * method name ('GET', etc.) to an array of all the corresponding `Route`\n * instances that are registered.\n */\n get routes() {\n return this._routes;\n }\n /**\n * Adds a fetch event listener to respond to events when a route matches\n * the event's request.\n */\n addFetchListener() {\n // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705\n self.addEventListener('fetch', ((event) => {\n const { request } = event;\n const responsePromise = this.handleRequest({ request, event });\n if (responsePromise) {\n event.respondWith(responsePromise);\n }\n }));\n }\n /**\n * Adds a message event listener for URLs to cache from the window.\n * This is useful to cache resources loaded on the page prior to when the\n * service worker started controlling it.\n *\n * The format of the message data sent from the window should be as follows.\n * Where the `urlsToCache` array may consist of URL strings or an array of\n * URL string + `requestInit` object (the same as you'd pass to `fetch()`).\n *\n * ```\n * {\n * type: 'CACHE_URLS',\n * payload: {\n * urlsToCache: [\n * './script1.js',\n * './script2.js',\n * ['./script3.js', {mode: 'no-cors'}],\n * ],\n * },\n * }\n * ```\n */\n addCacheListener() {\n // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705\n self.addEventListener('message', ((event) => {\n // event.data is type 'any'\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (event.data && event.data.type === 'CACHE_URLS') {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { payload } = event.data;\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Caching URLs from the window`, payload.urlsToCache);\n }\n const requestPromises = Promise.all(payload.urlsToCache.map((entry) => {\n if (typeof entry === 'string') {\n entry = [entry];\n }\n const request = new Request(...entry);\n return this.handleRequest({ request, event });\n // TODO(philipwalton): TypeScript errors without this typecast for\n // some reason (probably a bug). The real type here should work but\n // doesn't: `Array | undefined>`.\n })); // TypeScript\n event.waitUntil(requestPromises);\n // If a MessageChannel was used, reply to the message on success.\n if (event.ports && event.ports[0]) {\n void requestPromises.then(() => event.ports[0].postMessage(true));\n }\n }\n }));\n }\n /**\n * Apply the routing rules to a FetchEvent object to get a Response from an\n * appropriate Route's handler.\n *\n * @param {Object} options\n * @param {Request} options.request The request to handle.\n * @param {ExtendableEvent} options.event The event that triggered the\n * request.\n * @return {Promise|undefined} A promise is returned if a\n * registered route can handle the request. If there is no matching\n * route and there's no `defaultHandler`, `undefined` is returned.\n */\n handleRequest({ request, event, }) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'handleRequest',\n paramName: 'options.request',\n });\n }\n const url = new URL(request.url, location.href);\n if (!url.protocol.startsWith('http')) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Workbox Router only supports URLs that start with 'http'.`);\n }\n return;\n }\n const sameOrigin = url.origin === location.origin;\n const { params, route } = this.findMatchingRoute({\n event,\n request,\n sameOrigin,\n url,\n });\n let handler = route && route.handler;\n const debugMessages = [];\n if (process.env.NODE_ENV !== 'production') {\n if (handler) {\n debugMessages.push([`Found a route to handle this request:`, route]);\n if (params) {\n debugMessages.push([\n `Passing the following params to the route's handler:`,\n params,\n ]);\n }\n }\n }\n // If we don't have a handler because there was no matching route, then\n // fall back to defaultHandler if that's defined.\n const method = request.method;\n if (!handler && this._defaultHandlerMap.has(method)) {\n if (process.env.NODE_ENV !== 'production') {\n debugMessages.push(`Failed to find a matching route. Falling ` +\n `back to the default handler for ${method}.`);\n }\n handler = this._defaultHandlerMap.get(method);\n }\n if (!handler) {\n if (process.env.NODE_ENV !== 'production') {\n // No handler so Workbox will do nothing. If logs is set of debug\n // i.e. verbose, we should print out this information.\n logger.debug(`No route found for: ${getFriendlyURL(url)}`);\n }\n return;\n }\n if (process.env.NODE_ENV !== 'production') {\n // We have a handler, meaning Workbox is going to handle the route.\n // print the routing details to the console.\n logger.groupCollapsed(`Router is responding to: ${getFriendlyURL(url)}`);\n debugMessages.forEach((msg) => {\n if (Array.isArray(msg)) {\n logger.log(...msg);\n }\n else {\n logger.log(msg);\n }\n });\n logger.groupEnd();\n }\n // Wrap in try and catch in case the handle method throws a synchronous\n // error. It should still callback to the catch handler.\n let responsePromise;\n try {\n responsePromise = handler.handle({ url, request, event, params });\n }\n catch (err) {\n responsePromise = Promise.reject(err);\n }\n // Get route's catch handler, if it exists\n const catchHandler = route && route.catchHandler;\n if (responsePromise instanceof Promise &&\n (this._catchHandler || catchHandler)) {\n responsePromise = responsePromise.catch(async (err) => {\n // If there's a route catch handler, process that first\n if (catchHandler) {\n if (process.env.NODE_ENV !== 'production') {\n // Still include URL here as it will be async from the console group\n // and may not make sense without the URL\n logger.groupCollapsed(`Error thrown when responding to: ` +\n ` ${getFriendlyURL(url)}. Falling back to route's Catch Handler.`);\n logger.error(`Error thrown by:`, route);\n logger.error(err);\n logger.groupEnd();\n }\n try {\n return await catchHandler.handle({ url, request, event, params });\n }\n catch (catchErr) {\n if (catchErr instanceof Error) {\n err = catchErr;\n }\n }\n }\n if (this._catchHandler) {\n if (process.env.NODE_ENV !== 'production') {\n // Still include URL here as it will be async from the console group\n // and may not make sense without the URL\n logger.groupCollapsed(`Error thrown when responding to: ` +\n ` ${getFriendlyURL(url)}. Falling back to global Catch Handler.`);\n logger.error(`Error thrown by:`, route);\n logger.error(err);\n logger.groupEnd();\n }\n return this._catchHandler.handle({ url, request, event });\n }\n throw err;\n });\n }\n return responsePromise;\n }\n /**\n * Checks a request and URL (and optionally an event) against the list of\n * registered routes, and if there's a match, returns the corresponding\n * route along with any params generated by the match.\n *\n * @param {Object} options\n * @param {URL} options.url\n * @param {boolean} options.sameOrigin The result of comparing `url.origin`\n * against the current origin.\n * @param {Request} options.request The request to match.\n * @param {Event} options.event The corresponding event.\n * @return {Object} An object with `route` and `params` properties.\n * They are populated if a matching route was found or `undefined`\n * otherwise.\n */\n findMatchingRoute({ url, sameOrigin, request, event, }) {\n const routes = this._routes.get(request.method) || [];\n for (const route of routes) {\n let params;\n // route.match returns type any, not possible to change right now.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const matchResult = route.match({ url, sameOrigin, request, event });\n if (matchResult) {\n if (process.env.NODE_ENV !== 'production') {\n // Warn developers that using an async matchCallback is almost always\n // not the right thing to do.\n if (matchResult instanceof Promise) {\n logger.warn(`While routing ${getFriendlyURL(url)}, an async ` +\n `matchCallback function was used. Please convert the ` +\n `following route to use a synchronous matchCallback function:`, route);\n }\n }\n // See https://github.com/GoogleChrome/workbox/issues/2079\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n params = matchResult;\n if (Array.isArray(params) && params.length === 0) {\n // Instead of passing an empty array in as params, use undefined.\n params = undefined;\n }\n else if (matchResult.constructor === Object && // eslint-disable-line\n Object.keys(matchResult).length === 0) {\n // Instead of passing an empty object in as params, use undefined.\n params = undefined;\n }\n else if (typeof matchResult === 'boolean') {\n // For the boolean value true (rather than just something truth-y),\n // don't set params.\n // See https://github.com/GoogleChrome/workbox/pull/2134#issuecomment-513924353\n params = undefined;\n }\n // Return early if have a match.\n return { route, params };\n }\n }\n // If no match was found above, return and empty object.\n return {};\n }\n /**\n * Define a default `handler` that's called when no routes explicitly\n * match the incoming request.\n *\n * Each HTTP method ('GET', 'POST', etc.) gets its own default handler.\n *\n * Without a default handler, unmatched requests will go against the\n * network as if there were no service worker present.\n *\n * @param {workbox-routing~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n * @param {string} [method='GET'] The HTTP method to associate with this\n * default handler. Each method has its own default.\n */\n setDefaultHandler(handler, method = defaultMethod) {\n this._defaultHandlerMap.set(method, normalizeHandler(handler));\n }\n /**\n * If a Route throws an error while handling a request, this `handler`\n * will be called and given a chance to provide a response.\n *\n * @param {workbox-routing~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n */\n setCatchHandler(handler) {\n this._catchHandler = normalizeHandler(handler);\n }\n /**\n * Registers a route with the router.\n *\n * @param {workbox-routing.Route} route The route to register.\n */\n registerRoute(route) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(route, 'object', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route',\n });\n assert.hasMethod(route, 'match', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route',\n });\n assert.isType(route.handler, 'object', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route',\n });\n assert.hasMethod(route.handler, 'handle', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route.handler',\n });\n assert.isType(route.method, 'string', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route.method',\n });\n }\n if (!this._routes.has(route.method)) {\n this._routes.set(route.method, []);\n }\n // Give precedence to all of the earlier routes by adding this additional\n // route to the end of the array.\n this._routes.get(route.method).push(route);\n }\n /**\n * Unregisters a route with the router.\n *\n * @param {workbox-routing.Route} route The route to unregister.\n */\n unregisterRoute(route) {\n if (!this._routes.has(route.method)) {\n throw new WorkboxError('unregister-route-but-not-found-with-method', {\n method: route.method,\n });\n }\n const routeIndex = this._routes.get(route.method).indexOf(route);\n if (routeIndex > -1) {\n this._routes.get(route.method).splice(routeIndex, 1);\n }\n else {\n throw new WorkboxError('unregister-route-route-not-registered');\n }\n }\n}\nexport { Router };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { Router } from '../Router.js';\nimport '../_version.js';\nlet defaultRouter;\n/**\n * Creates a new, singleton Router instance if one does not exist. If one\n * does already exist, that instance is returned.\n *\n * @private\n * @return {Router}\n */\nexport const getOrCreateDefaultRouter = () => {\n if (!defaultRouter) {\n defaultRouter = new Router();\n // The helpers that use the default Router assume these listeners exist.\n defaultRouter.addFetchListener();\n defaultRouter.addCacheListener();\n }\n return defaultRouter;\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { Route } from './Route.js';\nimport { RegExpRoute } from './RegExpRoute.js';\nimport { getOrCreateDefaultRouter } from './utils/getOrCreateDefaultRouter.js';\nimport './_version.js';\n/**\n * Easily register a RegExp, string, or function with a caching\n * strategy to a singleton Router instance.\n *\n * This method will generate a Route for you if needed and\n * call {@link workbox-routing.Router#registerRoute}.\n *\n * @param {RegExp|string|workbox-routing.Route~matchCallback|workbox-routing.Route} capture\n * If the capture param is a `Route`, all other arguments will be ignored.\n * @param {workbox-routing~handlerCallback} [handler] A callback\n * function that returns a Promise resulting in a Response. This parameter\n * is required if `capture` is not a `Route` object.\n * @param {string} [method='GET'] The HTTP method to match the Route\n * against.\n * @return {workbox-routing.Route} The generated `Route`.\n *\n * @memberof workbox-routing\n */\nfunction registerRoute(capture, handler, method) {\n let route;\n if (typeof capture === 'string') {\n const captureUrl = new URL(capture, location.href);\n if (process.env.NODE_ENV !== 'production') {\n if (!(capture.startsWith('/') || capture.startsWith('http'))) {\n throw new WorkboxError('invalid-string', {\n moduleName: 'workbox-routing',\n funcName: 'registerRoute',\n paramName: 'capture',\n });\n }\n // We want to check if Express-style wildcards are in the pathname only.\n // TODO: Remove this log message in v4.\n const valueToCheck = capture.startsWith('http')\n ? captureUrl.pathname\n : capture;\n // See https://github.com/pillarjs/path-to-regexp#parameters\n const wildcards = '[*:?+]';\n if (new RegExp(`${wildcards}`).exec(valueToCheck)) {\n logger.debug(`The '$capture' parameter contains an Express-style wildcard ` +\n `character (${wildcards}). Strings are now always interpreted as ` +\n `exact matches; use a RegExp for partial or wildcard matches.`);\n }\n }\n const matchCallback = ({ url }) => {\n if (process.env.NODE_ENV !== 'production') {\n if (url.pathname === captureUrl.pathname &&\n url.origin !== captureUrl.origin) {\n logger.debug(`${capture} only partially matches the cross-origin URL ` +\n `${url.toString()}. This route will only handle cross-origin requests ` +\n `if they match the entire URL.`);\n }\n }\n return url.href === captureUrl.href;\n };\n // If `capture` is a string then `handler` and `method` must be present.\n route = new Route(matchCallback, handler, method);\n }\n else if (capture instanceof RegExp) {\n // If `capture` is a `RegExp` then `handler` and `method` must be present.\n route = new RegExpRoute(capture, handler, method);\n }\n else if (typeof capture === 'function') {\n // If `capture` is a function then `handler` and `method` must be present.\n route = new Route(capture, handler, method);\n }\n else if (capture instanceof Route) {\n route = capture;\n }\n else {\n throw new WorkboxError('unsupported-route-type', {\n moduleName: 'workbox-routing',\n funcName: 'registerRoute',\n paramName: 'capture',\n });\n }\n const defaultRouter = getOrCreateDefaultRouter();\n defaultRouter.registerRoute(route);\n return route;\n}\nexport { registerRoute };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nconst _cacheNameDetails = {\n googleAnalytics: 'googleAnalytics',\n precache: 'precache-v2',\n prefix: 'workbox',\n runtime: 'runtime',\n suffix: typeof registration !== 'undefined' ? registration.scope : '',\n};\nconst _createCacheName = (cacheName) => {\n return [_cacheNameDetails.prefix, cacheName, _cacheNameDetails.suffix]\n .filter((value) => value && value.length > 0)\n .join('-');\n};\nconst eachCacheNameDetail = (fn) => {\n for (const key of Object.keys(_cacheNameDetails)) {\n fn(key);\n }\n};\nexport const cacheNames = {\n updateDetails: (details) => {\n eachCacheNameDetail((key) => {\n if (typeof details[key] === 'string') {\n _cacheNameDetails[key] = details[key];\n }\n });\n },\n getGoogleAnalyticsName: (userCacheName) => {\n return userCacheName || _createCacheName(_cacheNameDetails.googleAnalytics);\n },\n getPrecacheName: (userCacheName) => {\n return userCacheName || _createCacheName(_cacheNameDetails.precache);\n },\n getPrefix: () => {\n return _cacheNameDetails.prefix;\n },\n getRuntimeName: (userCacheName) => {\n return userCacheName || _createCacheName(_cacheNameDetails.runtime);\n },\n getSuffix: () => {\n return _cacheNameDetails.suffix;\n },\n};\n","/*\n Copyright 2019 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * A helper function that prevents a promise from being flagged as unused.\n *\n * @private\n **/\nexport function dontWaitFor(promise) {\n // Effective no-op.\n void promise.then(() => { });\n}\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n// Callbacks to be executed whenever there's a quota error.\n// Can't change Function type right now.\n// eslint-disable-next-line @typescript-eslint/ban-types\nconst quotaErrorCallbacks = new Set();\nexport { quotaErrorCallbacks };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { logger } from './_private/logger.js';\nimport { assert } from './_private/assert.js';\nimport { quotaErrorCallbacks } from './models/quotaErrorCallbacks.js';\nimport './_version.js';\n/**\n * Adds a function to the set of quotaErrorCallbacks that will be executed if\n * there's a quota error.\n *\n * @param {Function} callback\n * @memberof workbox-core\n */\n// Can't change Function type\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction registerQuotaErrorCallback(callback) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(callback, 'function', {\n moduleName: 'workbox-core',\n funcName: 'register',\n paramName: 'callback',\n });\n }\n quotaErrorCallbacks.add(callback);\n if (process.env.NODE_ENV !== 'production') {\n logger.log('Registered a callback to respond to quota errors.', callback);\n }\n}\nexport { registerQuotaErrorCallback };\n","const instanceOfAny = (object, constructors) => constructors.some((c) => object instanceof c);\n\nlet idbProxyableTypes;\nlet cursorAdvanceMethods;\n// This is a function to prevent it throwing up in node environments.\nfunction getIdbProxyableTypes() {\n return (idbProxyableTypes ||\n (idbProxyableTypes = [\n IDBDatabase,\n IDBObjectStore,\n IDBIndex,\n IDBCursor,\n IDBTransaction,\n ]));\n}\n// This is a function to prevent it throwing up in node environments.\nfunction getCursorAdvanceMethods() {\n return (cursorAdvanceMethods ||\n (cursorAdvanceMethods = [\n IDBCursor.prototype.advance,\n IDBCursor.prototype.continue,\n IDBCursor.prototype.continuePrimaryKey,\n ]));\n}\nconst cursorRequestMap = new WeakMap();\nconst transactionDoneMap = new WeakMap();\nconst transactionStoreNamesMap = new WeakMap();\nconst transformCache = new WeakMap();\nconst reverseTransformCache = new WeakMap();\nfunction promisifyRequest(request) {\n const promise = new Promise((resolve, reject) => {\n const unlisten = () => {\n request.removeEventListener('success', success);\n request.removeEventListener('error', error);\n };\n const success = () => {\n resolve(wrap(request.result));\n unlisten();\n };\n const error = () => {\n reject(request.error);\n unlisten();\n };\n request.addEventListener('success', success);\n request.addEventListener('error', error);\n });\n promise\n .then((value) => {\n // Since cursoring reuses the IDBRequest (*sigh*), we cache it for later retrieval\n // (see wrapFunction).\n if (value instanceof IDBCursor) {\n cursorRequestMap.set(value, request);\n }\n // Catching to avoid \"Uncaught Promise exceptions\"\n })\n .catch(() => { });\n // This mapping exists in reverseTransformCache but doesn't doesn't exist in transformCache. This\n // is because we create many promises from a single IDBRequest.\n reverseTransformCache.set(promise, request);\n return promise;\n}\nfunction cacheDonePromiseForTransaction(tx) {\n // Early bail if we've already created a done promise for this transaction.\n if (transactionDoneMap.has(tx))\n return;\n const done = new Promise((resolve, reject) => {\n const unlisten = () => {\n tx.removeEventListener('complete', complete);\n tx.removeEventListener('error', error);\n tx.removeEventListener('abort', error);\n };\n const complete = () => {\n resolve();\n unlisten();\n };\n const error = () => {\n reject(tx.error || new DOMException('AbortError', 'AbortError'));\n unlisten();\n };\n tx.addEventListener('complete', complete);\n tx.addEventListener('error', error);\n tx.addEventListener('abort', error);\n });\n // Cache it for later retrieval.\n transactionDoneMap.set(tx, done);\n}\nlet idbProxyTraps = {\n get(target, prop, receiver) {\n if (target instanceof IDBTransaction) {\n // Special handling for transaction.done.\n if (prop === 'done')\n return transactionDoneMap.get(target);\n // Polyfill for objectStoreNames because of Edge.\n if (prop === 'objectStoreNames') {\n return target.objectStoreNames || transactionStoreNamesMap.get(target);\n }\n // Make tx.store return the only store in the transaction, or undefined if there are many.\n if (prop === 'store') {\n return receiver.objectStoreNames[1]\n ? undefined\n : receiver.objectStore(receiver.objectStoreNames[0]);\n }\n }\n // Else transform whatever we get back.\n return wrap(target[prop]);\n },\n set(target, prop, value) {\n target[prop] = value;\n return true;\n },\n has(target, prop) {\n if (target instanceof IDBTransaction &&\n (prop === 'done' || prop === 'store')) {\n return true;\n }\n return prop in target;\n },\n};\nfunction replaceTraps(callback) {\n idbProxyTraps = callback(idbProxyTraps);\n}\nfunction wrapFunction(func) {\n // Due to expected object equality (which is enforced by the caching in `wrap`), we\n // only create one new func per func.\n // Edge doesn't support objectStoreNames (booo), so we polyfill it here.\n if (func === IDBDatabase.prototype.transaction &&\n !('objectStoreNames' in IDBTransaction.prototype)) {\n return function (storeNames, ...args) {\n const tx = func.call(unwrap(this), storeNames, ...args);\n transactionStoreNamesMap.set(tx, storeNames.sort ? storeNames.sort() : [storeNames]);\n return wrap(tx);\n };\n }\n // Cursor methods are special, as the behaviour is a little more different to standard IDB. In\n // IDB, you advance the cursor and wait for a new 'success' on the IDBRequest that gave you the\n // cursor. It's kinda like a promise that can resolve with many values. That doesn't make sense\n // with real promises, so each advance methods returns a new promise for the cursor object, or\n // undefined if the end of the cursor has been reached.\n if (getCursorAdvanceMethods().includes(func)) {\n return function (...args) {\n // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n // the original object.\n func.apply(unwrap(this), args);\n return wrap(cursorRequestMap.get(this));\n };\n }\n return function (...args) {\n // Calling the original function with the proxy as 'this' causes ILLEGAL INVOCATION, so we use\n // the original object.\n return wrap(func.apply(unwrap(this), args));\n };\n}\nfunction transformCachableValue(value) {\n if (typeof value === 'function')\n return wrapFunction(value);\n // This doesn't return, it just creates a 'done' promise for the transaction,\n // which is later returned for transaction.done (see idbObjectHandler).\n if (value instanceof IDBTransaction)\n cacheDonePromiseForTransaction(value);\n if (instanceOfAny(value, getIdbProxyableTypes()))\n return new Proxy(value, idbProxyTraps);\n // Return the same value back if we're not going to transform it.\n return value;\n}\nfunction wrap(value) {\n // We sometimes generate multiple promises from a single IDBRequest (eg when cursoring), because\n // IDB is weird and a single IDBRequest can yield many responses, so these can't be cached.\n if (value instanceof IDBRequest)\n return promisifyRequest(value);\n // If we've already transformed this value before, reuse the transformed value.\n // This is faster, but it also provides object equality.\n if (transformCache.has(value))\n return transformCache.get(value);\n const newValue = transformCachableValue(value);\n // Not all types are transformed.\n // These may be primitive types, so they can't be WeakMap keys.\n if (newValue !== value) {\n transformCache.set(value, newValue);\n reverseTransformCache.set(newValue, value);\n }\n return newValue;\n}\nconst unwrap = (value) => reverseTransformCache.get(value);\n\nexport { reverseTransformCache as a, instanceOfAny as i, replaceTraps as r, unwrap as u, wrap as w };\n","import { w as wrap, r as replaceTraps } from './wrap-idb-value.js';\nexport { u as unwrap, w as wrap } from './wrap-idb-value.js';\n\n/**\n * Open a database.\n *\n * @param name Name of the database.\n * @param version Schema version.\n * @param callbacks Additional callbacks.\n */\nfunction openDB(name, version, { blocked, upgrade, blocking, terminated } = {}) {\n const request = indexedDB.open(name, version);\n const openPromise = wrap(request);\n if (upgrade) {\n request.addEventListener('upgradeneeded', (event) => {\n upgrade(wrap(request.result), event.oldVersion, event.newVersion, wrap(request.transaction), event);\n });\n }\n if (blocked) {\n request.addEventListener('blocked', (event) => blocked(\n // Casting due to https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/1405\n event.oldVersion, event.newVersion, event));\n }\n openPromise\n .then((db) => {\n if (terminated)\n db.addEventListener('close', () => terminated());\n if (blocking) {\n db.addEventListener('versionchange', (event) => blocking(event.oldVersion, event.newVersion, event));\n }\n })\n .catch(() => { });\n return openPromise;\n}\n/**\n * Delete a database.\n *\n * @param name Name of the database.\n */\nfunction deleteDB(name, { blocked } = {}) {\n const request = indexedDB.deleteDatabase(name);\n if (blocked) {\n request.addEventListener('blocked', (event) => blocked(\n // Casting due to https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/1405\n event.oldVersion, event));\n }\n return wrap(request).then(() => undefined);\n}\n\nconst readMethods = ['get', 'getKey', 'getAll', 'getAllKeys', 'count'];\nconst writeMethods = ['put', 'add', 'delete', 'clear'];\nconst cachedMethods = new Map();\nfunction getMethod(target, prop) {\n if (!(target instanceof IDBDatabase &&\n !(prop in target) &&\n typeof prop === 'string')) {\n return;\n }\n if (cachedMethods.get(prop))\n return cachedMethods.get(prop);\n const targetFuncName = prop.replace(/FromIndex$/, '');\n const useIndex = prop !== targetFuncName;\n const isWrite = writeMethods.includes(targetFuncName);\n if (\n // Bail if the target doesn't exist on the target. Eg, getAll isn't in Edge.\n !(targetFuncName in (useIndex ? IDBIndex : IDBObjectStore).prototype) ||\n !(isWrite || readMethods.includes(targetFuncName))) {\n return;\n }\n const method = async function (storeName, ...args) {\n // isWrite ? 'readwrite' : undefined gzipps better, but fails in Edge :(\n const tx = this.transaction(storeName, isWrite ? 'readwrite' : 'readonly');\n let target = tx.store;\n if (useIndex)\n target = target.index(args.shift());\n // Must reject if op rejects.\n // If it's a write operation, must reject if tx.done rejects.\n // Must reject with op rejection first.\n // Must resolve with op value.\n // Must handle both promises (no unhandled rejections)\n return (await Promise.all([\n target[targetFuncName](...args),\n isWrite && tx.done,\n ]))[0];\n };\n cachedMethods.set(prop, method);\n return method;\n}\nreplaceTraps((oldTraps) => ({\n ...oldTraps,\n get: (target, prop, receiver) => getMethod(target, prop) || oldTraps.get(target, prop, receiver),\n has: (target, prop) => !!getMethod(target, prop) || oldTraps.has(target, prop),\n}));\n\nexport { deleteDB, openDB };\n","\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:expiration:7.2.0'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { openDB, deleteDB } from 'idb';\nimport '../_version.js';\nconst DB_NAME = 'workbox-expiration';\nconst CACHE_OBJECT_STORE = 'cache-entries';\nconst normalizeURL = (unNormalizedUrl) => {\n const url = new URL(unNormalizedUrl, location.href);\n url.hash = '';\n return url.href;\n};\n/**\n * Returns the timestamp model.\n *\n * @private\n */\nclass CacheTimestampsModel {\n /**\n *\n * @param {string} cacheName\n *\n * @private\n */\n constructor(cacheName) {\n this._db = null;\n this._cacheName = cacheName;\n }\n /**\n * Performs an upgrade of indexedDB.\n *\n * @param {IDBPDatabase} db\n *\n * @private\n */\n _upgradeDb(db) {\n // TODO(philipwalton): EdgeHTML doesn't support arrays as a keyPath, so we\n // have to use the `id` keyPath here and create our own values (a\n // concatenation of `url + cacheName`) instead of simply using\n // `keyPath: ['url', 'cacheName']`, which is supported in other browsers.\n const objStore = db.createObjectStore(CACHE_OBJECT_STORE, { keyPath: 'id' });\n // TODO(philipwalton): once we don't have to support EdgeHTML, we can\n // create a single index with the keyPath `['cacheName', 'timestamp']`\n // instead of doing both these indexes.\n objStore.createIndex('cacheName', 'cacheName', { unique: false });\n objStore.createIndex('timestamp', 'timestamp', { unique: false });\n }\n /**\n * Performs an upgrade of indexedDB and deletes deprecated DBs.\n *\n * @param {IDBPDatabase} db\n *\n * @private\n */\n _upgradeDbAndDeleteOldDbs(db) {\n this._upgradeDb(db);\n if (this._cacheName) {\n void deleteDB(this._cacheName);\n }\n }\n /**\n * @param {string} url\n * @param {number} timestamp\n *\n * @private\n */\n async setTimestamp(url, timestamp) {\n url = normalizeURL(url);\n const entry = {\n url,\n timestamp,\n cacheName: this._cacheName,\n // Creating an ID from the URL and cache name won't be necessary once\n // Edge switches to Chromium and all browsers we support work with\n // array keyPaths.\n id: this._getId(url),\n };\n const db = await this.getDb();\n const tx = db.transaction(CACHE_OBJECT_STORE, 'readwrite', {\n durability: 'relaxed',\n });\n await tx.store.put(entry);\n await tx.done;\n }\n /**\n * Returns the timestamp stored for a given URL.\n *\n * @param {string} url\n * @return {number | undefined}\n *\n * @private\n */\n async getTimestamp(url) {\n const db = await this.getDb();\n const entry = await db.get(CACHE_OBJECT_STORE, this._getId(url));\n return entry === null || entry === void 0 ? void 0 : entry.timestamp;\n }\n /**\n * Iterates through all the entries in the object store (from newest to\n * oldest) and removes entries once either `maxCount` is reached or the\n * entry's timestamp is less than `minTimestamp`.\n *\n * @param {number} minTimestamp\n * @param {number} maxCount\n * @return {Array}\n *\n * @private\n */\n async expireEntries(minTimestamp, maxCount) {\n const db = await this.getDb();\n let cursor = await db\n .transaction(CACHE_OBJECT_STORE)\n .store.index('timestamp')\n .openCursor(null, 'prev');\n const entriesToDelete = [];\n let entriesNotDeletedCount = 0;\n while (cursor) {\n const result = cursor.value;\n // TODO(philipwalton): once we can use a multi-key index, we\n // won't have to check `cacheName` here.\n if (result.cacheName === this._cacheName) {\n // Delete an entry if it's older than the max age or\n // if we already have the max number allowed.\n if ((minTimestamp && result.timestamp < minTimestamp) ||\n (maxCount && entriesNotDeletedCount >= maxCount)) {\n // TODO(philipwalton): we should be able to delete the\n // entry right here, but doing so causes an iteration\n // bug in Safari stable (fixed in TP). Instead we can\n // store the keys of the entries to delete, and then\n // delete the separate transactions.\n // https://github.com/GoogleChrome/workbox/issues/1978\n // cursor.delete();\n // We only need to return the URL, not the whole entry.\n entriesToDelete.push(cursor.value);\n }\n else {\n entriesNotDeletedCount++;\n }\n }\n cursor = await cursor.continue();\n }\n // TODO(philipwalton): once the Safari bug in the following issue is fixed,\n // we should be able to remove this loop and do the entry deletion in the\n // cursor loop above:\n // https://github.com/GoogleChrome/workbox/issues/1978\n const urlsDeleted = [];\n for (const entry of entriesToDelete) {\n await db.delete(CACHE_OBJECT_STORE, entry.id);\n urlsDeleted.push(entry.url);\n }\n return urlsDeleted;\n }\n /**\n * Takes a URL and returns an ID that will be unique in the object store.\n *\n * @param {string} url\n * @return {string}\n *\n * @private\n */\n _getId(url) {\n // Creating an ID from the URL and cache name won't be necessary once\n // Edge switches to Chromium and all browsers we support work with\n // array keyPaths.\n return this._cacheName + '|' + normalizeURL(url);\n }\n /**\n * Returns an open connection to the database.\n *\n * @private\n */\n async getDb() {\n if (!this._db) {\n this._db = await openDB(DB_NAME, 1, {\n upgrade: this._upgradeDbAndDeleteOldDbs.bind(this),\n });\n }\n return this._db;\n }\n}\nexport { CacheTimestampsModel };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { dontWaitFor } from 'workbox-core/_private/dontWaitFor.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { CacheTimestampsModel } from './models/CacheTimestampsModel.js';\nimport './_version.js';\n/**\n * The `CacheExpiration` class allows you define an expiration and / or\n * limit on the number of responses stored in a\n * [`Cache`](https://developer.mozilla.org/en-US/docs/Web/API/Cache).\n *\n * @memberof workbox-expiration\n */\nclass CacheExpiration {\n /**\n * To construct a new CacheExpiration instance you must provide at least\n * one of the `config` properties.\n *\n * @param {string} cacheName Name of the cache to apply restrictions to.\n * @param {Object} config\n * @param {number} [config.maxEntries] The maximum number of entries to cache.\n * Entries used the least will be removed as the maximum is reached.\n * @param {number} [config.maxAgeSeconds] The maximum age of an entry before\n * it's treated as stale and removed.\n * @param {Object} [config.matchOptions] The [`CacheQueryOptions`](https://developer.mozilla.org/en-US/docs/Web/API/Cache/delete#Parameters)\n * that will be used when calling `delete()` on the cache.\n */\n constructor(cacheName, config = {}) {\n this._isRunning = false;\n this._rerunRequested = false;\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(cacheName, 'string', {\n moduleName: 'workbox-expiration',\n className: 'CacheExpiration',\n funcName: 'constructor',\n paramName: 'cacheName',\n });\n if (!(config.maxEntries || config.maxAgeSeconds)) {\n throw new WorkboxError('max-entries-or-age-required', {\n moduleName: 'workbox-expiration',\n className: 'CacheExpiration',\n funcName: 'constructor',\n });\n }\n if (config.maxEntries) {\n assert.isType(config.maxEntries, 'number', {\n moduleName: 'workbox-expiration',\n className: 'CacheExpiration',\n funcName: 'constructor',\n paramName: 'config.maxEntries',\n });\n }\n if (config.maxAgeSeconds) {\n assert.isType(config.maxAgeSeconds, 'number', {\n moduleName: 'workbox-expiration',\n className: 'CacheExpiration',\n funcName: 'constructor',\n paramName: 'config.maxAgeSeconds',\n });\n }\n }\n this._maxEntries = config.maxEntries;\n this._maxAgeSeconds = config.maxAgeSeconds;\n this._matchOptions = config.matchOptions;\n this._cacheName = cacheName;\n this._timestampModel = new CacheTimestampsModel(cacheName);\n }\n /**\n * Expires entries for the given cache and given criteria.\n */\n async expireEntries() {\n if (this._isRunning) {\n this._rerunRequested = true;\n return;\n }\n this._isRunning = true;\n const minTimestamp = this._maxAgeSeconds\n ? Date.now() - this._maxAgeSeconds * 1000\n : 0;\n const urlsExpired = await this._timestampModel.expireEntries(minTimestamp, this._maxEntries);\n // Delete URLs from the cache\n const cache = await self.caches.open(this._cacheName);\n for (const url of urlsExpired) {\n await cache.delete(url, this._matchOptions);\n }\n if (process.env.NODE_ENV !== 'production') {\n if (urlsExpired.length > 0) {\n logger.groupCollapsed(`Expired ${urlsExpired.length} ` +\n `${urlsExpired.length === 1 ? 'entry' : 'entries'} and removed ` +\n `${urlsExpired.length === 1 ? 'it' : 'them'} from the ` +\n `'${this._cacheName}' cache.`);\n logger.log(`Expired the following ${urlsExpired.length === 1 ? 'URL' : 'URLs'}:`);\n urlsExpired.forEach((url) => logger.log(` ${url}`));\n logger.groupEnd();\n }\n else {\n logger.debug(`Cache expiration ran and found no entries to remove.`);\n }\n }\n this._isRunning = false;\n if (this._rerunRequested) {\n this._rerunRequested = false;\n dontWaitFor(this.expireEntries());\n }\n }\n /**\n * Update the timestamp for the given URL. This ensures the when\n * removing entries based on maximum entries, most recently used\n * is accurate or when expiring, the timestamp is up-to-date.\n *\n * @param {string} url\n */\n async updateTimestamp(url) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(url, 'string', {\n moduleName: 'workbox-expiration',\n className: 'CacheExpiration',\n funcName: 'updateTimestamp',\n paramName: 'url',\n });\n }\n await this._timestampModel.setTimestamp(url, Date.now());\n }\n /**\n * Can be used to check if a URL has expired or not before it's used.\n *\n * This requires a look up from IndexedDB, so can be slow.\n *\n * Note: This method will not remove the cached entry, call\n * `expireEntries()` to remove indexedDB and Cache entries.\n *\n * @param {string} url\n * @return {boolean}\n */\n async isURLExpired(url) {\n if (!this._maxAgeSeconds) {\n if (process.env.NODE_ENV !== 'production') {\n throw new WorkboxError(`expired-test-without-max-age`, {\n methodName: 'isURLExpired',\n paramName: 'maxAgeSeconds',\n });\n }\n return false;\n }\n else {\n const timestamp = await this._timestampModel.getTimestamp(url);\n const expireOlderThan = Date.now() - this._maxAgeSeconds * 1000;\n return timestamp !== undefined ? timestamp < expireOlderThan : true;\n }\n }\n /**\n * Removes the IndexedDB object store used to keep track of cache expiration\n * metadata.\n */\n async delete() {\n // Make sure we don't attempt another rerun if we're called in the middle of\n // a cache expiration.\n this._rerunRequested = false;\n await this._timestampModel.expireEntries(Infinity); // Expires all.\n }\n}\nexport { CacheExpiration };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { cacheNames } from 'workbox-core/_private/cacheNames.js';\nimport { dontWaitFor } from 'workbox-core/_private/dontWaitFor.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { registerQuotaErrorCallback } from 'workbox-core/registerQuotaErrorCallback.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { CacheExpiration } from './CacheExpiration.js';\nimport './_version.js';\n/**\n * This plugin can be used in a `workbox-strategy` to regularly enforce a\n * limit on the age and / or the number of cached requests.\n *\n * It can only be used with `workbox-strategy` instances that have a\n * [custom `cacheName` property set](/web/tools/workbox/guides/configure-workbox#custom_cache_names_in_strategies).\n * In other words, it can't be used to expire entries in strategy that uses the\n * default runtime cache name.\n *\n * Whenever a cached response is used or updated, this plugin will look\n * at the associated cache and remove any old or extra responses.\n *\n * When using `maxAgeSeconds`, responses may be used *once* after expiring\n * because the expiration clean up will not have occurred until *after* the\n * cached response has been used. If the response has a \"Date\" header, then\n * a light weight expiration check is performed and the response will not be\n * used immediately.\n *\n * When using `maxEntries`, the entry least-recently requested will be removed\n * from the cache first.\n *\n * @memberof workbox-expiration\n */\nclass ExpirationPlugin {\n /**\n * @param {ExpirationPluginOptions} config\n * @param {number} [config.maxEntries] The maximum number of entries to cache.\n * Entries used the least will be removed as the maximum is reached.\n * @param {number} [config.maxAgeSeconds] The maximum age of an entry before\n * it's treated as stale and removed.\n * @param {Object} [config.matchOptions] The [`CacheQueryOptions`](https://developer.mozilla.org/en-US/docs/Web/API/Cache/delete#Parameters)\n * that will be used when calling `delete()` on the cache.\n * @param {boolean} [config.purgeOnQuotaError] Whether to opt this cache in to\n * automatic deletion if the available storage quota has been exceeded.\n */\n constructor(config = {}) {\n /**\n * A \"lifecycle\" callback that will be triggered automatically by the\n * `workbox-strategies` handlers when a `Response` is about to be returned\n * from a [Cache](https://developer.mozilla.org/en-US/docs/Web/API/Cache) to\n * the handler. It allows the `Response` to be inspected for freshness and\n * prevents it from being used if the `Response`'s `Date` header value is\n * older than the configured `maxAgeSeconds`.\n *\n * @param {Object} options\n * @param {string} options.cacheName Name of the cache the response is in.\n * @param {Response} options.cachedResponse The `Response` object that's been\n * read from a cache and whose freshness should be checked.\n * @return {Response} Either the `cachedResponse`, if it's\n * fresh, or `null` if the `Response` is older than `maxAgeSeconds`.\n *\n * @private\n */\n this.cachedResponseWillBeUsed = async ({ event, request, cacheName, cachedResponse, }) => {\n if (!cachedResponse) {\n return null;\n }\n const isFresh = this._isResponseDateFresh(cachedResponse);\n // Expire entries to ensure that even if the expiration date has\n // expired, it'll only be used once.\n const cacheExpiration = this._getCacheExpiration(cacheName);\n dontWaitFor(cacheExpiration.expireEntries());\n // Update the metadata for the request URL to the current timestamp,\n // but don't `await` it as we don't want to block the response.\n const updateTimestampDone = cacheExpiration.updateTimestamp(request.url);\n if (event) {\n try {\n event.waitUntil(updateTimestampDone);\n }\n catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n // The event may not be a fetch event; only log the URL if it is.\n if ('request' in event) {\n logger.warn(`Unable to ensure service worker stays alive when ` +\n `updating cache entry for ` +\n `'${getFriendlyURL(event.request.url)}'.`);\n }\n }\n }\n }\n return isFresh ? cachedResponse : null;\n };\n /**\n * A \"lifecycle\" callback that will be triggered automatically by the\n * `workbox-strategies` handlers when an entry is added to a cache.\n *\n * @param {Object} options\n * @param {string} options.cacheName Name of the cache that was updated.\n * @param {string} options.request The Request for the cached entry.\n *\n * @private\n */\n this.cacheDidUpdate = async ({ cacheName, request, }) => {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(cacheName, 'string', {\n moduleName: 'workbox-expiration',\n className: 'Plugin',\n funcName: 'cacheDidUpdate',\n paramName: 'cacheName',\n });\n assert.isInstance(request, Request, {\n moduleName: 'workbox-expiration',\n className: 'Plugin',\n funcName: 'cacheDidUpdate',\n paramName: 'request',\n });\n }\n const cacheExpiration = this._getCacheExpiration(cacheName);\n await cacheExpiration.updateTimestamp(request.url);\n await cacheExpiration.expireEntries();\n };\n if (process.env.NODE_ENV !== 'production') {\n if (!(config.maxEntries || config.maxAgeSeconds)) {\n throw new WorkboxError('max-entries-or-age-required', {\n moduleName: 'workbox-expiration',\n className: 'Plugin',\n funcName: 'constructor',\n });\n }\n if (config.maxEntries) {\n assert.isType(config.maxEntries, 'number', {\n moduleName: 'workbox-expiration',\n className: 'Plugin',\n funcName: 'constructor',\n paramName: 'config.maxEntries',\n });\n }\n if (config.maxAgeSeconds) {\n assert.isType(config.maxAgeSeconds, 'number', {\n moduleName: 'workbox-expiration',\n className: 'Plugin',\n funcName: 'constructor',\n paramName: 'config.maxAgeSeconds',\n });\n }\n }\n this._config = config;\n this._maxAgeSeconds = config.maxAgeSeconds;\n this._cacheExpirations = new Map();\n if (config.purgeOnQuotaError) {\n registerQuotaErrorCallback(() => this.deleteCacheAndMetadata());\n }\n }\n /**\n * A simple helper method to return a CacheExpiration instance for a given\n * cache name.\n *\n * @param {string} cacheName\n * @return {CacheExpiration}\n *\n * @private\n */\n _getCacheExpiration(cacheName) {\n if (cacheName === cacheNames.getRuntimeName()) {\n throw new WorkboxError('expire-custom-caches-only');\n }\n let cacheExpiration = this._cacheExpirations.get(cacheName);\n if (!cacheExpiration) {\n cacheExpiration = new CacheExpiration(cacheName, this._config);\n this._cacheExpirations.set(cacheName, cacheExpiration);\n }\n return cacheExpiration;\n }\n /**\n * @param {Response} cachedResponse\n * @return {boolean}\n *\n * @private\n */\n _isResponseDateFresh(cachedResponse) {\n if (!this._maxAgeSeconds) {\n // We aren't expiring by age, so return true, it's fresh\n return true;\n }\n // Check if the 'date' header will suffice a quick expiration check.\n // See https://github.com/GoogleChromeLabs/sw-toolbox/issues/164 for\n // discussion.\n const dateHeaderTimestamp = this._getDateHeaderTimestamp(cachedResponse);\n if (dateHeaderTimestamp === null) {\n // Unable to parse date, so assume it's fresh.\n return true;\n }\n // If we have a valid headerTime, then our response is fresh iff the\n // headerTime plus maxAgeSeconds is greater than the current time.\n const now = Date.now();\n return dateHeaderTimestamp >= now - this._maxAgeSeconds * 1000;\n }\n /**\n * This method will extract the data header and parse it into a useful\n * value.\n *\n * @param {Response} cachedResponse\n * @return {number|null}\n *\n * @private\n */\n _getDateHeaderTimestamp(cachedResponse) {\n if (!cachedResponse.headers.has('date')) {\n return null;\n }\n const dateHeader = cachedResponse.headers.get('date');\n const parsedDate = new Date(dateHeader);\n const headerTime = parsedDate.getTime();\n // If the Date header was invalid for some reason, parsedDate.getTime()\n // will return NaN.\n if (isNaN(headerTime)) {\n return null;\n }\n return headerTime;\n }\n /**\n * This is a helper method that performs two operations:\n *\n * - Deletes *all* the underlying Cache instances associated with this plugin\n * instance, by calling caches.delete() on your behalf.\n * - Deletes the metadata from IndexedDB used to keep track of expiration\n * details for each Cache instance.\n *\n * When using cache expiration, calling this method is preferable to calling\n * `caches.delete()` directly, since this will ensure that the IndexedDB\n * metadata is also cleanly removed and open IndexedDB instances are deleted.\n *\n * Note that if you're *not* using cache expiration for a given cache, calling\n * `caches.delete()` and passing in the cache's name should be sufficient.\n * There is no Workbox-specific method needed for cleanup in that case.\n */\n async deleteCacheAndMetadata() {\n // Do this one at a time instead of all at once via `Promise.all()` to\n // reduce the chance of inconsistency if a promise rejects.\n for (const [cacheName, cacheExpiration] of this._cacheExpirations) {\n await self.caches.delete(cacheName);\n await cacheExpiration.delete();\n }\n // Reset this._cacheExpirations to its initial state.\n this._cacheExpirations = new Map();\n }\n}\nexport { ExpirationPlugin };\n","\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:cacheable-response:7.2.0'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport './_version.js';\n/**\n * This class allows you to set up rules determining what\n * status codes and/or headers need to be present in order for a\n * [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)\n * to be considered cacheable.\n *\n * @memberof workbox-cacheable-response\n */\nclass CacheableResponse {\n /**\n * To construct a new CacheableResponse instance you must provide at least\n * one of the `config` properties.\n *\n * If both `statuses` and `headers` are specified, then both conditions must\n * be met for the `Response` to be considered cacheable.\n *\n * @param {Object} config\n * @param {Array} [config.statuses] One or more status codes that a\n * `Response` can have and be considered cacheable.\n * @param {Object} [config.headers] A mapping of header names\n * and expected values that a `Response` can have and be considered cacheable.\n * If multiple headers are provided, only one needs to be present.\n */\n constructor(config = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (!(config.statuses || config.headers)) {\n throw new WorkboxError('statuses-or-headers-required', {\n moduleName: 'workbox-cacheable-response',\n className: 'CacheableResponse',\n funcName: 'constructor',\n });\n }\n if (config.statuses) {\n assert.isArray(config.statuses, {\n moduleName: 'workbox-cacheable-response',\n className: 'CacheableResponse',\n funcName: 'constructor',\n paramName: 'config.statuses',\n });\n }\n if (config.headers) {\n assert.isType(config.headers, 'object', {\n moduleName: 'workbox-cacheable-response',\n className: 'CacheableResponse',\n funcName: 'constructor',\n paramName: 'config.headers',\n });\n }\n }\n this._statuses = config.statuses;\n this._headers = config.headers;\n }\n /**\n * Checks a response to see whether it's cacheable or not, based on this\n * object's configuration.\n *\n * @param {Response} response The response whose cacheability is being\n * checked.\n * @return {boolean} `true` if the `Response` is cacheable, and `false`\n * otherwise.\n */\n isResponseCacheable(response) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(response, Response, {\n moduleName: 'workbox-cacheable-response',\n className: 'CacheableResponse',\n funcName: 'isResponseCacheable',\n paramName: 'response',\n });\n }\n let cacheable = true;\n if (this._statuses) {\n cacheable = this._statuses.includes(response.status);\n }\n if (this._headers && cacheable) {\n cacheable = Object.keys(this._headers).some((headerName) => {\n return response.headers.get(headerName) === this._headers[headerName];\n });\n }\n if (process.env.NODE_ENV !== 'production') {\n if (!cacheable) {\n logger.groupCollapsed(`The request for ` +\n `'${getFriendlyURL(response.url)}' returned a response that does ` +\n `not meet the criteria for being cached.`);\n logger.groupCollapsed(`View cacheability criteria here.`);\n logger.log(`Cacheable statuses: ` + JSON.stringify(this._statuses));\n logger.log(`Cacheable headers: ` + JSON.stringify(this._headers, null, 2));\n logger.groupEnd();\n const logFriendlyHeaders = {};\n response.headers.forEach((value, key) => {\n logFriendlyHeaders[key] = value;\n });\n logger.groupCollapsed(`View response status and headers here.`);\n logger.log(`Response status: ${response.status}`);\n logger.log(`Response headers: ` + JSON.stringify(logFriendlyHeaders, null, 2));\n logger.groupEnd();\n logger.groupCollapsed(`View full response details here.`);\n logger.log(response.headers);\n logger.log(response);\n logger.groupEnd();\n logger.groupEnd();\n }\n }\n return cacheable;\n }\n}\nexport { CacheableResponse };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { CacheableResponse, } from './CacheableResponse.js';\nimport './_version.js';\n/**\n * A class implementing the `cacheWillUpdate` lifecycle callback. This makes it\n * easier to add in cacheability checks to requests made via Workbox's built-in\n * strategies.\n *\n * @memberof workbox-cacheable-response\n */\nclass CacheableResponsePlugin {\n /**\n * To construct a new CacheableResponsePlugin instance you must provide at\n * least one of the `config` properties.\n *\n * If both `statuses` and `headers` are specified, then both conditions must\n * be met for the `Response` to be considered cacheable.\n *\n * @param {Object} config\n * @param {Array} [config.statuses] One or more status codes that a\n * `Response` can have and be considered cacheable.\n * @param {Object} [config.headers] A mapping of header names\n * and expected values that a `Response` can have and be considered cacheable.\n * If multiple headers are provided, only one needs to be present.\n */\n constructor(config) {\n /**\n * @param {Object} options\n * @param {Response} options.response\n * @return {Response|null}\n * @private\n */\n this.cacheWillUpdate = async ({ response }) => {\n if (this._cacheableResponse.isResponseCacheable(response)) {\n return response;\n }\n return null;\n };\n this._cacheableResponse = new CacheableResponse(config);\n }\n}\nexport { CacheableResponsePlugin };\n","/*\n Copyright 2020 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nfunction stripParams(fullURL, ignoreParams) {\n const strippedURL = new URL(fullURL);\n for (const param of ignoreParams) {\n strippedURL.searchParams.delete(param);\n }\n return strippedURL.href;\n}\n/**\n * Matches an item in the cache, ignoring specific URL params. This is similar\n * to the `ignoreSearch` option, but it allows you to ignore just specific\n * params (while continuing to match on the others).\n *\n * @private\n * @param {Cache} cache\n * @param {Request} request\n * @param {Object} matchOptions\n * @param {Array} ignoreParams\n * @return {Promise}\n */\nasync function cacheMatchIgnoreParams(cache, request, ignoreParams, matchOptions) {\n const strippedRequestURL = stripParams(request.url, ignoreParams);\n // If the request doesn't include any ignored params, match as normal.\n if (request.url === strippedRequestURL) {\n return cache.match(request, matchOptions);\n }\n // Otherwise, match by comparing keys\n const keysOptions = Object.assign(Object.assign({}, matchOptions), { ignoreSearch: true });\n const cacheKeys = await cache.keys(request, keysOptions);\n for (const cacheKey of cacheKeys) {\n const strippedCacheKeyURL = stripParams(cacheKey.url, ignoreParams);\n if (strippedRequestURL === strippedCacheKeyURL) {\n return cache.match(cacheKey, matchOptions);\n }\n }\n return;\n}\nexport { cacheMatchIgnoreParams };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * The Deferred class composes Promises in a way that allows for them to be\n * resolved or rejected from outside the constructor. In most cases promises\n * should be used directly, but Deferreds can be necessary when the logic to\n * resolve a promise must be separate.\n *\n * @private\n */\nclass Deferred {\n /**\n * Creates a promise and exposes its resolve and reject functions as methods.\n */\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n}\nexport { Deferred };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { logger } from '../_private/logger.js';\nimport { quotaErrorCallbacks } from '../models/quotaErrorCallbacks.js';\nimport '../_version.js';\n/**\n * Runs all of the callback functions, one at a time sequentially, in the order\n * in which they were registered.\n *\n * @memberof workbox-core\n * @private\n */\nasync function executeQuotaErrorCallbacks() {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`About to run ${quotaErrorCallbacks.size} ` +\n `callbacks to clean up caches.`);\n }\n for (const callback of quotaErrorCallbacks) {\n await callback();\n if (process.env.NODE_ENV !== 'production') {\n logger.log(callback, 'is complete.');\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n logger.log('Finished running callbacks.');\n }\n}\nexport { executeQuotaErrorCallbacks };\n","/*\n Copyright 2019 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * Returns a promise that resolves and the passed number of milliseconds.\n * This utility is an async/await-friendly version of `setTimeout`.\n *\n * @param {number} ms\n * @return {Promise}\n * @private\n */\nexport function timeout(ms) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:strategies:7.2.0'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2020 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { cacheMatchIgnoreParams } from 'workbox-core/_private/cacheMatchIgnoreParams.js';\nimport { Deferred } from 'workbox-core/_private/Deferred.js';\nimport { executeQuotaErrorCallbacks } from 'workbox-core/_private/executeQuotaErrorCallbacks.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { timeout } from 'workbox-core/_private/timeout.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport './_version.js';\nfunction toRequest(input) {\n return typeof input === 'string' ? new Request(input) : input;\n}\n/**\n * A class created every time a Strategy instance instance calls\n * {@link workbox-strategies.Strategy~handle} or\n * {@link workbox-strategies.Strategy~handleAll} that wraps all fetch and\n * cache actions around plugin callbacks and keeps track of when the strategy\n * is \"done\" (i.e. all added `event.waitUntil()` promises have resolved).\n *\n * @memberof workbox-strategies\n */\nclass StrategyHandler {\n /**\n * Creates a new instance associated with the passed strategy and event\n * that's handling the request.\n *\n * The constructor also initializes the state that will be passed to each of\n * the plugins handling this request.\n *\n * @param {workbox-strategies.Strategy} strategy\n * @param {Object} options\n * @param {Request|string} options.request A request to run this strategy for.\n * @param {ExtendableEvent} options.event The event associated with the\n * request.\n * @param {URL} [options.url]\n * @param {*} [options.params] The return value from the\n * {@link workbox-routing~matchCallback} (if applicable).\n */\n constructor(strategy, options) {\n this._cacheKeys = {};\n /**\n * The request the strategy is performing (passed to the strategy's\n * `handle()` or `handleAll()` method).\n * @name request\n * @instance\n * @type {Request}\n * @memberof workbox-strategies.StrategyHandler\n */\n /**\n * The event associated with this request.\n * @name event\n * @instance\n * @type {ExtendableEvent}\n * @memberof workbox-strategies.StrategyHandler\n */\n /**\n * A `URL` instance of `request.url` (if passed to the strategy's\n * `handle()` or `handleAll()` method).\n * Note: the `url` param will be present if the strategy was invoked\n * from a workbox `Route` object.\n * @name url\n * @instance\n * @type {URL|undefined}\n * @memberof workbox-strategies.StrategyHandler\n */\n /**\n * A `param` value (if passed to the strategy's\n * `handle()` or `handleAll()` method).\n * Note: the `param` param will be present if the strategy was invoked\n * from a workbox `Route` object and the\n * {@link workbox-routing~matchCallback} returned\n * a truthy value (it will be that value).\n * @name params\n * @instance\n * @type {*|undefined}\n * @memberof workbox-strategies.StrategyHandler\n */\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(options.event, ExtendableEvent, {\n moduleName: 'workbox-strategies',\n className: 'StrategyHandler',\n funcName: 'constructor',\n paramName: 'options.event',\n });\n }\n Object.assign(this, options);\n this.event = options.event;\n this._strategy = strategy;\n this._handlerDeferred = new Deferred();\n this._extendLifetimePromises = [];\n // Copy the plugins list (since it's mutable on the strategy),\n // so any mutations don't affect this handler instance.\n this._plugins = [...strategy.plugins];\n this._pluginStateMap = new Map();\n for (const plugin of this._plugins) {\n this._pluginStateMap.set(plugin, {});\n }\n this.event.waitUntil(this._handlerDeferred.promise);\n }\n /**\n * Fetches a given request (and invokes any applicable plugin callback\n * methods) using the `fetchOptions` (for non-navigation requests) and\n * `plugins` defined on the `Strategy` object.\n *\n * The following plugin lifecycle methods are invoked when using this method:\n * - `requestWillFetch()`\n * - `fetchDidSucceed()`\n * - `fetchDidFail()`\n *\n * @param {Request|string} input The URL or request to fetch.\n * @return {Promise}\n */\n async fetch(input) {\n const { event } = this;\n let request = toRequest(input);\n if (request.mode === 'navigate' &&\n event instanceof FetchEvent &&\n event.preloadResponse) {\n const possiblePreloadResponse = (await event.preloadResponse);\n if (possiblePreloadResponse) {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Using a preloaded navigation response for ` +\n `'${getFriendlyURL(request.url)}'`);\n }\n return possiblePreloadResponse;\n }\n }\n // If there is a fetchDidFail plugin, we need to save a clone of the\n // original request before it's either modified by a requestWillFetch\n // plugin or before the original request's body is consumed via fetch().\n const originalRequest = this.hasCallback('fetchDidFail')\n ? request.clone()\n : null;\n try {\n for (const cb of this.iterateCallbacks('requestWillFetch')) {\n request = await cb({ request: request.clone(), event });\n }\n }\n catch (err) {\n if (err instanceof Error) {\n throw new WorkboxError('plugin-error-request-will-fetch', {\n thrownErrorMessage: err.message,\n });\n }\n }\n // The request can be altered by plugins with `requestWillFetch` making\n // the original request (most likely from a `fetch` event) different\n // from the Request we make. Pass both to `fetchDidFail` to aid debugging.\n const pluginFilteredRequest = request.clone();\n try {\n let fetchResponse;\n // See https://github.com/GoogleChrome/workbox/issues/1796\n fetchResponse = await fetch(request, request.mode === 'navigate' ? undefined : this._strategy.fetchOptions);\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Network request for ` +\n `'${getFriendlyURL(request.url)}' returned a response with ` +\n `status '${fetchResponse.status}'.`);\n }\n for (const callback of this.iterateCallbacks('fetchDidSucceed')) {\n fetchResponse = await callback({\n event,\n request: pluginFilteredRequest,\n response: fetchResponse,\n });\n }\n return fetchResponse;\n }\n catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Network request for ` +\n `'${getFriendlyURL(request.url)}' threw an error.`, error);\n }\n // `originalRequest` will only exist if a `fetchDidFail` callback\n // is being used (see above).\n if (originalRequest) {\n await this.runCallbacks('fetchDidFail', {\n error: error,\n event,\n originalRequest: originalRequest.clone(),\n request: pluginFilteredRequest.clone(),\n });\n }\n throw error;\n }\n }\n /**\n * Calls `this.fetch()` and (in the background) runs `this.cachePut()` on\n * the response generated by `this.fetch()`.\n *\n * The call to `this.cachePut()` automatically invokes `this.waitUntil()`,\n * so you do not have to manually call `waitUntil()` on the event.\n *\n * @param {Request|string} input The request or URL to fetch and cache.\n * @return {Promise}\n */\n async fetchAndCachePut(input) {\n const response = await this.fetch(input);\n const responseClone = response.clone();\n void this.waitUntil(this.cachePut(input, responseClone));\n return response;\n }\n /**\n * Matches a request from the cache (and invokes any applicable plugin\n * callback methods) using the `cacheName`, `matchOptions`, and `plugins`\n * defined on the strategy object.\n *\n * The following plugin lifecycle methods are invoked when using this method:\n * - cacheKeyWillBeUsed()\n * - cachedResponseWillBeUsed()\n *\n * @param {Request|string} key The Request or URL to use as the cache key.\n * @return {Promise} A matching response, if found.\n */\n async cacheMatch(key) {\n const request = toRequest(key);\n let cachedResponse;\n const { cacheName, matchOptions } = this._strategy;\n const effectiveRequest = await this.getCacheKey(request, 'read');\n const multiMatchOptions = Object.assign(Object.assign({}, matchOptions), { cacheName });\n cachedResponse = await caches.match(effectiveRequest, multiMatchOptions);\n if (process.env.NODE_ENV !== 'production') {\n if (cachedResponse) {\n logger.debug(`Found a cached response in '${cacheName}'.`);\n }\n else {\n logger.debug(`No cached response found in '${cacheName}'.`);\n }\n }\n for (const callback of this.iterateCallbacks('cachedResponseWillBeUsed')) {\n cachedResponse =\n (await callback({\n cacheName,\n matchOptions,\n cachedResponse,\n request: effectiveRequest,\n event: this.event,\n })) || undefined;\n }\n return cachedResponse;\n }\n /**\n * Puts a request/response pair in the cache (and invokes any applicable\n * plugin callback methods) using the `cacheName` and `plugins` defined on\n * the strategy object.\n *\n * The following plugin lifecycle methods are invoked when using this method:\n * - cacheKeyWillBeUsed()\n * - cacheWillUpdate()\n * - cacheDidUpdate()\n *\n * @param {Request|string} key The request or URL to use as the cache key.\n * @param {Response} response The response to cache.\n * @return {Promise} `false` if a cacheWillUpdate caused the response\n * not be cached, and `true` otherwise.\n */\n async cachePut(key, response) {\n const request = toRequest(key);\n // Run in the next task to avoid blocking other cache reads.\n // https://github.com/w3c/ServiceWorker/issues/1397\n await timeout(0);\n const effectiveRequest = await this.getCacheKey(request, 'write');\n if (process.env.NODE_ENV !== 'production') {\n if (effectiveRequest.method && effectiveRequest.method !== 'GET') {\n throw new WorkboxError('attempt-to-cache-non-get-request', {\n url: getFriendlyURL(effectiveRequest.url),\n method: effectiveRequest.method,\n });\n }\n // See https://github.com/GoogleChrome/workbox/issues/2818\n const vary = response.headers.get('Vary');\n if (vary) {\n logger.debug(`The response for ${getFriendlyURL(effectiveRequest.url)} ` +\n `has a 'Vary: ${vary}' header. ` +\n `Consider setting the {ignoreVary: true} option on your strategy ` +\n `to ensure cache matching and deletion works as expected.`);\n }\n }\n if (!response) {\n if (process.env.NODE_ENV !== 'production') {\n logger.error(`Cannot cache non-existent response for ` +\n `'${getFriendlyURL(effectiveRequest.url)}'.`);\n }\n throw new WorkboxError('cache-put-with-no-response', {\n url: getFriendlyURL(effectiveRequest.url),\n });\n }\n const responseToCache = await this._ensureResponseSafeToCache(response);\n if (!responseToCache) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Response '${getFriendlyURL(effectiveRequest.url)}' ` +\n `will not be cached.`, responseToCache);\n }\n return false;\n }\n const { cacheName, matchOptions } = this._strategy;\n const cache = await self.caches.open(cacheName);\n const hasCacheUpdateCallback = this.hasCallback('cacheDidUpdate');\n const oldResponse = hasCacheUpdateCallback\n ? await cacheMatchIgnoreParams(\n // TODO(philipwalton): the `__WB_REVISION__` param is a precaching\n // feature. Consider into ways to only add this behavior if using\n // precaching.\n cache, effectiveRequest.clone(), ['__WB_REVISION__'], matchOptions)\n : null;\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Updating the '${cacheName}' cache with a new Response ` +\n `for ${getFriendlyURL(effectiveRequest.url)}.`);\n }\n try {\n await cache.put(effectiveRequest, hasCacheUpdateCallback ? responseToCache.clone() : responseToCache);\n }\n catch (error) {\n if (error instanceof Error) {\n // See https://developer.mozilla.org/en-US/docs/Web/API/DOMException#exception-QuotaExceededError\n if (error.name === 'QuotaExceededError') {\n await executeQuotaErrorCallbacks();\n }\n throw error;\n }\n }\n for (const callback of this.iterateCallbacks('cacheDidUpdate')) {\n await callback({\n cacheName,\n oldResponse,\n newResponse: responseToCache.clone(),\n request: effectiveRequest,\n event: this.event,\n });\n }\n return true;\n }\n /**\n * Checks the list of plugins for the `cacheKeyWillBeUsed` callback, and\n * executes any of those callbacks found in sequence. The final `Request`\n * object returned by the last plugin is treated as the cache key for cache\n * reads and/or writes. If no `cacheKeyWillBeUsed` plugin callbacks have\n * been registered, the passed request is returned unmodified\n *\n * @param {Request} request\n * @param {string} mode\n * @return {Promise}\n */\n async getCacheKey(request, mode) {\n const key = `${request.url} | ${mode}`;\n if (!this._cacheKeys[key]) {\n let effectiveRequest = request;\n for (const callback of this.iterateCallbacks('cacheKeyWillBeUsed')) {\n effectiveRequest = toRequest(await callback({\n mode,\n request: effectiveRequest,\n event: this.event,\n // params has a type any can't change right now.\n params: this.params, // eslint-disable-line\n }));\n }\n this._cacheKeys[key] = effectiveRequest;\n }\n return this._cacheKeys[key];\n }\n /**\n * Returns true if the strategy has at least one plugin with the given\n * callback.\n *\n * @param {string} name The name of the callback to check for.\n * @return {boolean}\n */\n hasCallback(name) {\n for (const plugin of this._strategy.plugins) {\n if (name in plugin) {\n return true;\n }\n }\n return false;\n }\n /**\n * Runs all plugin callbacks matching the given name, in order, passing the\n * given param object (merged ith the current plugin state) as the only\n * argument.\n *\n * Note: since this method runs all plugins, it's not suitable for cases\n * where the return value of a callback needs to be applied prior to calling\n * the next callback. See\n * {@link workbox-strategies.StrategyHandler#iterateCallbacks}\n * below for how to handle that case.\n *\n * @param {string} name The name of the callback to run within each plugin.\n * @param {Object} param The object to pass as the first (and only) param\n * when executing each callback. This object will be merged with the\n * current plugin state prior to callback execution.\n */\n async runCallbacks(name, param) {\n for (const callback of this.iterateCallbacks(name)) {\n // TODO(philipwalton): not sure why `any` is needed. It seems like\n // this should work with `as WorkboxPluginCallbackParam[C]`.\n await callback(param);\n }\n }\n /**\n * Accepts a callback and returns an iterable of matching plugin callbacks,\n * where each callback is wrapped with the current handler state (i.e. when\n * you call each callback, whatever object parameter you pass it will\n * be merged with the plugin's current state).\n *\n * @param {string} name The name fo the callback to run\n * @return {Array}\n */\n *iterateCallbacks(name) {\n for (const plugin of this._strategy.plugins) {\n if (typeof plugin[name] === 'function') {\n const state = this._pluginStateMap.get(plugin);\n const statefulCallback = (param) => {\n const statefulParam = Object.assign(Object.assign({}, param), { state });\n // TODO(philipwalton): not sure why `any` is needed. It seems like\n // this should work with `as WorkboxPluginCallbackParam[C]`.\n return plugin[name](statefulParam);\n };\n yield statefulCallback;\n }\n }\n }\n /**\n * Adds a promise to the\n * [extend lifetime promises]{@link https://w3c.github.io/ServiceWorker/#extendableevent-extend-lifetime-promises}\n * of the event event associated with the request being handled (usually a\n * `FetchEvent`).\n *\n * Note: you can await\n * {@link workbox-strategies.StrategyHandler~doneWaiting}\n * to know when all added promises have settled.\n *\n * @param {Promise} promise A promise to add to the extend lifetime promises\n * of the event that triggered the request.\n */\n waitUntil(promise) {\n this._extendLifetimePromises.push(promise);\n return promise;\n }\n /**\n * Returns a promise that resolves once all promises passed to\n * {@link workbox-strategies.StrategyHandler~waitUntil}\n * have settled.\n *\n * Note: any work done after `doneWaiting()` settles should be manually\n * passed to an event's `waitUntil()` method (not this handler's\n * `waitUntil()` method), otherwise the service worker thread my be killed\n * prior to your work completing.\n */\n async doneWaiting() {\n let promise;\n while ((promise = this._extendLifetimePromises.shift())) {\n await promise;\n }\n }\n /**\n * Stops running the strategy and immediately resolves any pending\n * `waitUntil()` promises.\n */\n destroy() {\n this._handlerDeferred.resolve(null);\n }\n /**\n * This method will call cacheWillUpdate on the available plugins (or use\n * status === 200) to determine if the Response is safe and valid to cache.\n *\n * @param {Request} options.request\n * @param {Response} options.response\n * @return {Promise}\n *\n * @private\n */\n async _ensureResponseSafeToCache(response) {\n let responseToCache = response;\n let pluginsUsed = false;\n for (const callback of this.iterateCallbacks('cacheWillUpdate')) {\n responseToCache =\n (await callback({\n request: this.request,\n response: responseToCache,\n event: this.event,\n })) || undefined;\n pluginsUsed = true;\n if (!responseToCache) {\n break;\n }\n }\n if (!pluginsUsed) {\n if (responseToCache && responseToCache.status !== 200) {\n responseToCache = undefined;\n }\n if (process.env.NODE_ENV !== 'production') {\n if (responseToCache) {\n if (responseToCache.status !== 200) {\n if (responseToCache.status === 0) {\n logger.warn(`The response for '${this.request.url}' ` +\n `is an opaque response. The caching strategy that you're ` +\n `using will not cache opaque responses by default.`);\n }\n else {\n logger.debug(`The response for '${this.request.url}' ` +\n `returned a status code of '${response.status}' and won't ` +\n `be cached as a result.`);\n }\n }\n }\n }\n }\n return responseToCache;\n }\n}\nexport { StrategyHandler };\n","/*\n Copyright 2020 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { cacheNames } from 'workbox-core/_private/cacheNames.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { StrategyHandler } from './StrategyHandler.js';\nimport './_version.js';\n/**\n * An abstract base class that all other strategy classes must extend from:\n *\n * @memberof workbox-strategies\n */\nclass Strategy {\n /**\n * Creates a new instance of the strategy and sets all documented option\n * properties as public instance properties.\n *\n * Note: if a custom strategy class extends the base Strategy class and does\n * not need more than these properties, it does not need to define its own\n * constructor.\n *\n * @param {Object} [options]\n * @param {string} [options.cacheName] Cache name to store and retrieve\n * requests. Defaults to the cache names provided by\n * {@link workbox-core.cacheNames}.\n * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} [options.fetchOptions] Values passed along to the\n * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)\n * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796)\n * `fetch()` requests made by this strategy.\n * @param {Object} [options.matchOptions] The\n * [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions}\n * for any `cache.match()` or `cache.put()` calls made by this strategy.\n */\n constructor(options = {}) {\n /**\n * Cache name to store and retrieve\n * requests. Defaults to the cache names provided by\n * {@link workbox-core.cacheNames}.\n *\n * @type {string}\n */\n this.cacheName = cacheNames.getRuntimeName(options.cacheName);\n /**\n * The list\n * [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * used by this strategy.\n *\n * @type {Array}\n */\n this.plugins = options.plugins || [];\n /**\n * Values passed along to the\n * [`init`]{@link https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters}\n * of all fetch() requests made by this strategy.\n *\n * @type {Object}\n */\n this.fetchOptions = options.fetchOptions;\n /**\n * The\n * [`CacheQueryOptions`]{@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions}\n * for any `cache.match()` or `cache.put()` calls made by this strategy.\n *\n * @type {Object}\n */\n this.matchOptions = options.matchOptions;\n }\n /**\n * Perform a request strategy and returns a `Promise` that will resolve with\n * a `Response`, invoking all relevant plugin callbacks.\n *\n * When a strategy instance is registered with a Workbox\n * {@link workbox-routing.Route}, this method is automatically\n * called when the route matches.\n *\n * Alternatively, this method can be used in a standalone `FetchEvent`\n * listener by passing it to `event.respondWith()`.\n *\n * @param {FetchEvent|Object} options A `FetchEvent` or an object with the\n * properties listed below.\n * @param {Request|string} options.request A request to run this strategy for.\n * @param {ExtendableEvent} options.event The event associated with the\n * request.\n * @param {URL} [options.url]\n * @param {*} [options.params]\n */\n handle(options) {\n const [responseDone] = this.handleAll(options);\n return responseDone;\n }\n /**\n * Similar to {@link workbox-strategies.Strategy~handle}, but\n * instead of just returning a `Promise` that resolves to a `Response` it\n * it will return an tuple of `[response, done]` promises, where the former\n * (`response`) is equivalent to what `handle()` returns, and the latter is a\n * Promise that will resolve once any promises that were added to\n * `event.waitUntil()` as part of performing the strategy have completed.\n *\n * You can await the `done` promise to ensure any extra work performed by\n * the strategy (usually caching responses) completes successfully.\n *\n * @param {FetchEvent|Object} options A `FetchEvent` or an object with the\n * properties listed below.\n * @param {Request|string} options.request A request to run this strategy for.\n * @param {ExtendableEvent} options.event The event associated with the\n * request.\n * @param {URL} [options.url]\n * @param {*} [options.params]\n * @return {Array} A tuple of [response, done]\n * promises that can be used to determine when the response resolves as\n * well as when the handler has completed all its work.\n */\n handleAll(options) {\n // Allow for flexible options to be passed.\n if (options instanceof FetchEvent) {\n options = {\n event: options,\n request: options.request,\n };\n }\n const event = options.event;\n const request = typeof options.request === 'string'\n ? new Request(options.request)\n : options.request;\n const params = 'params' in options ? options.params : undefined;\n const handler = new StrategyHandler(this, { event, request, params });\n const responseDone = this._getResponse(handler, request, event);\n const handlerDone = this._awaitComplete(responseDone, handler, request, event);\n // Return an array of promises, suitable for use with Promise.all().\n return [responseDone, handlerDone];\n }\n async _getResponse(handler, request, event) {\n await handler.runCallbacks('handlerWillStart', { event, request });\n let response = undefined;\n try {\n response = await this._handle(request, handler);\n // The \"official\" Strategy subclasses all throw this error automatically,\n // but in case a third-party Strategy doesn't, ensure that we have a\n // consistent failure when there's no response or an error response.\n if (!response || response.type === 'error') {\n throw new WorkboxError('no-response', { url: request.url });\n }\n }\n catch (error) {\n if (error instanceof Error) {\n for (const callback of handler.iterateCallbacks('handlerDidError')) {\n response = await callback({ error, event, request });\n if (response) {\n break;\n }\n }\n }\n if (!response) {\n throw error;\n }\n else if (process.env.NODE_ENV !== 'production') {\n logger.log(`While responding to '${getFriendlyURL(request.url)}', ` +\n `an ${error instanceof Error ? error.toString() : ''} error occurred. Using a fallback response provided by ` +\n `a handlerDidError plugin.`);\n }\n }\n for (const callback of handler.iterateCallbacks('handlerWillRespond')) {\n response = await callback({ event, request, response });\n }\n return response;\n }\n async _awaitComplete(responseDone, handler, request, event) {\n let response;\n let error;\n try {\n response = await responseDone;\n }\n catch (error) {\n // Ignore errors, as response errors should be caught via the `response`\n // promise above. The `done` promise will only throw for errors in\n // promises passed to `handler.waitUntil()`.\n }\n try {\n await handler.runCallbacks('handlerDidRespond', {\n event,\n request,\n response,\n });\n await handler.doneWaiting();\n }\n catch (waitUntilError) {\n if (waitUntilError instanceof Error) {\n error = waitUntilError;\n }\n }\n await handler.runCallbacks('handlerDidComplete', {\n event,\n request,\n response,\n error: error,\n });\n handler.destroy();\n if (error) {\n throw error;\n }\n }\n}\nexport { Strategy };\n/**\n * Classes extending the `Strategy` based class should implement this method,\n * and leverage the {@link workbox-strategies.StrategyHandler}\n * arg to perform all fetching and cache logic, which will ensure all relevant\n * cache, cache options, fetch options and plugins are used (per the current\n * strategy instance).\n *\n * @name _handle\n * @instance\n * @abstract\n * @function\n * @param {Request} request\n * @param {workbox-strategies.StrategyHandler} handler\n * @return {Promise}\n *\n * @memberof workbox-strategies.Strategy\n */\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport '../_version.js';\nexport const messages = {\n strategyStart: (strategyName, request) => `Using ${strategyName} to respond to '${getFriendlyURL(request.url)}'`,\n printFinalResponse: (response) => {\n if (response) {\n logger.groupCollapsed(`View the final response here.`);\n logger.log(response || '[No response returned]');\n logger.groupEnd();\n }\n },\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { Strategy } from './Strategy.js';\nimport { messages } from './utils/messages.js';\nimport './_version.js';\n/**\n * An implementation of a [cache-first](https://developer.chrome.com/docs/workbox/caching-strategies-overview/#cache-first-falling-back-to-network)\n * request strategy.\n *\n * A cache first strategy is useful for assets that have been revisioned,\n * such as URLs like `/styles/example.a8f5f1.css`, since they\n * can be cached for long periods of time.\n *\n * If the network request fails, and there is no cache match, this will throw\n * a `WorkboxError` exception.\n *\n * @extends workbox-strategies.Strategy\n * @memberof workbox-strategies\n */\nclass CacheFirst extends Strategy {\n /**\n * @private\n * @param {Request|string} request A request to run this strategy for.\n * @param {workbox-strategies.StrategyHandler} handler The event that\n * triggered the request.\n * @return {Promise}\n */\n async _handle(request, handler) {\n const logs = [];\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-strategies',\n className: this.constructor.name,\n funcName: 'makeRequest',\n paramName: 'request',\n });\n }\n let response = await handler.cacheMatch(request);\n let error = undefined;\n if (!response) {\n if (process.env.NODE_ENV !== 'production') {\n logs.push(`No response found in the '${this.cacheName}' cache. ` +\n `Will respond with a network request.`);\n }\n try {\n response = await handler.fetchAndCachePut(request);\n }\n catch (err) {\n if (err instanceof Error) {\n error = err;\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n if (response) {\n logs.push(`Got response from network.`);\n }\n else {\n logs.push(`Unable to get a response from the network.`);\n }\n }\n }\n else {\n if (process.env.NODE_ENV !== 'production') {\n logs.push(`Found a cached response in the '${this.cacheName}' cache.`);\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n logger.groupCollapsed(messages.strategyStart(this.constructor.name, request));\n for (const log of logs) {\n logger.log(log);\n }\n messages.printFinalResponse(response);\n logger.groupEnd();\n }\n if (!response) {\n throw new WorkboxError('no-response', { url: request.url, error });\n }\n return response;\n }\n}\nexport { CacheFirst };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nexport const cacheOkAndOpaquePlugin = {\n /**\n * Returns a valid response (to allow caching) if the status is 200 (OK) or\n * 0 (opaque).\n *\n * @param {Object} options\n * @param {Response} options.response\n * @return {Response|null}\n *\n * @private\n */\n cacheWillUpdate: async ({ response }) => {\n if (response.status === 200 || response.status === 0) {\n return response;\n }\n return null;\n },\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { cacheOkAndOpaquePlugin } from './plugins/cacheOkAndOpaquePlugin.js';\nimport { Strategy } from './Strategy.js';\nimport { messages } from './utils/messages.js';\nimport './_version.js';\n/**\n * An implementation of a\n * [network first](https://developer.chrome.com/docs/workbox/caching-strategies-overview/#network-first-falling-back-to-cache)\n * request strategy.\n *\n * By default, this strategy will cache responses with a 200 status code as\n * well as [opaque responses](https://developer.chrome.com/docs/workbox/caching-resources-during-runtime/#opaque-responses).\n * Opaque responses are are cross-origin requests where the response doesn't\n * support [CORS](https://enable-cors.org/).\n *\n * If the network request fails, and there is no cache match, this will throw\n * a `WorkboxError` exception.\n *\n * @extends workbox-strategies.Strategy\n * @memberof workbox-strategies\n */\nclass NetworkFirst extends Strategy {\n /**\n * @param {Object} [options]\n * @param {string} [options.cacheName] Cache name to store and retrieve\n * requests. Defaults to cache names provided by\n * {@link workbox-core.cacheNames}.\n * @param {Array} [options.plugins] [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} [options.fetchOptions] Values passed along to the\n * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)\n * of [non-navigation](https://github.com/GoogleChrome/workbox/issues/1796)\n * `fetch()` requests made by this strategy.\n * @param {Object} [options.matchOptions] [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions)\n * @param {number} [options.networkTimeoutSeconds] If set, any network requests\n * that fail to respond within the timeout will fallback to the cache.\n *\n * This option can be used to combat\n * \"[lie-fi]{@link https://developers.google.com/web/fundamentals/performance/poor-connectivity/#lie-fi}\"\n * scenarios.\n */\n constructor(options = {}) {\n super(options);\n // If this instance contains no plugins with a 'cacheWillUpdate' callback,\n // prepend the `cacheOkAndOpaquePlugin` plugin to the plugins list.\n if (!this.plugins.some((p) => 'cacheWillUpdate' in p)) {\n this.plugins.unshift(cacheOkAndOpaquePlugin);\n }\n this._networkTimeoutSeconds = options.networkTimeoutSeconds || 0;\n if (process.env.NODE_ENV !== 'production') {\n if (this._networkTimeoutSeconds) {\n assert.isType(this._networkTimeoutSeconds, 'number', {\n moduleName: 'workbox-strategies',\n className: this.constructor.name,\n funcName: 'constructor',\n paramName: 'networkTimeoutSeconds',\n });\n }\n }\n }\n /**\n * @private\n * @param {Request|string} request A request to run this strategy for.\n * @param {workbox-strategies.StrategyHandler} handler The event that\n * triggered the request.\n * @return {Promise}\n */\n async _handle(request, handler) {\n const logs = [];\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-strategies',\n className: this.constructor.name,\n funcName: 'handle',\n paramName: 'makeRequest',\n });\n }\n const promises = [];\n let timeoutId;\n if (this._networkTimeoutSeconds) {\n const { id, promise } = this._getTimeoutPromise({ request, logs, handler });\n timeoutId = id;\n promises.push(promise);\n }\n const networkPromise = this._getNetworkPromise({\n timeoutId,\n request,\n logs,\n handler,\n });\n promises.push(networkPromise);\n const response = await handler.waitUntil((async () => {\n // Promise.race() will resolve as soon as the first promise resolves.\n return ((await handler.waitUntil(Promise.race(promises))) ||\n // If Promise.race() resolved with null, it might be due to a network\n // timeout + a cache miss. If that were to happen, we'd rather wait until\n // the networkPromise resolves instead of returning null.\n // Note that it's fine to await an already-resolved promise, so we don't\n // have to check to see if it's still \"in flight\".\n (await networkPromise));\n })());\n if (process.env.NODE_ENV !== 'production') {\n logger.groupCollapsed(messages.strategyStart(this.constructor.name, request));\n for (const log of logs) {\n logger.log(log);\n }\n messages.printFinalResponse(response);\n logger.groupEnd();\n }\n if (!response) {\n throw new WorkboxError('no-response', { url: request.url });\n }\n return response;\n }\n /**\n * @param {Object} options\n * @param {Request} options.request\n * @param {Array} options.logs A reference to the logs array\n * @param {Event} options.event\n * @return {Promise}\n *\n * @private\n */\n _getTimeoutPromise({ request, logs, handler, }) {\n let timeoutId;\n const timeoutPromise = new Promise((resolve) => {\n const onNetworkTimeout = async () => {\n if (process.env.NODE_ENV !== 'production') {\n logs.push(`Timing out the network response at ` +\n `${this._networkTimeoutSeconds} seconds.`);\n }\n resolve(await handler.cacheMatch(request));\n };\n timeoutId = setTimeout(onNetworkTimeout, this._networkTimeoutSeconds * 1000);\n });\n return {\n promise: timeoutPromise,\n id: timeoutId,\n };\n }\n /**\n * @param {Object} options\n * @param {number|undefined} options.timeoutId\n * @param {Request} options.request\n * @param {Array} options.logs A reference to the logs Array.\n * @param {Event} options.event\n * @return {Promise}\n *\n * @private\n */\n async _getNetworkPromise({ timeoutId, request, logs, handler, }) {\n let error;\n let response;\n try {\n response = await handler.fetchAndCachePut(request);\n }\n catch (fetchError) {\n if (fetchError instanceof Error) {\n error = fetchError;\n }\n }\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n if (process.env.NODE_ENV !== 'production') {\n if (response) {\n logs.push(`Got response from network.`);\n }\n else {\n logs.push(`Unable to get a response from the network. Will respond ` +\n `with a cached response.`);\n }\n }\n if (error || !response) {\n response = await handler.cacheMatch(request);\n if (process.env.NODE_ENV !== 'production') {\n if (response) {\n logs.push(`Found a cached response in the '${this.cacheName}'` + ` cache.`);\n }\n else {\n logs.push(`No response found in the '${this.cacheName}' cache.`);\n }\n }\n }\n return response;\n }\n}\nexport { NetworkFirst };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport './_version.js';\n/**\n * Claim any currently available clients once the service worker\n * becomes active. This is normally used in conjunction with `skipWaiting()`.\n *\n * @memberof workbox-core\n */\nfunction clientsClaim() {\n self.addEventListener('activate', () => self.clients.claim());\n}\nexport { clientsClaim };\n","/*\n Copyright 2020 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * A utility method that makes it easier to use `event.waitUntil` with\n * async functions and return the result.\n *\n * @param {ExtendableEvent} event\n * @param {Function} asyncFn\n * @return {Function}\n * @private\n */\nfunction waitUntil(event, asyncFn) {\n const returnPromise = asyncFn();\n event.waitUntil(returnPromise);\n return returnPromise;\n}\nexport { waitUntil };\n","\"use strict\";\n// @ts-ignore\ntry {\n self['workbox:precaching:7.2.0'] && _();\n}\ncatch (e) { }\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport '../_version.js';\n// Name of the search parameter used to store revision info.\nconst REVISION_SEARCH_PARAM = '__WB_REVISION__';\n/**\n * Converts a manifest entry into a versioned URL suitable for precaching.\n *\n * @param {Object|string} entry\n * @return {string} A URL with versioning info.\n *\n * @private\n * @memberof workbox-precaching\n */\nexport function createCacheKey(entry) {\n if (!entry) {\n throw new WorkboxError('add-to-cache-list-unexpected-type', { entry });\n }\n // If a precache manifest entry is a string, it's assumed to be a versioned\n // URL, like '/app.abcd1234.js'. Return as-is.\n if (typeof entry === 'string') {\n const urlObject = new URL(entry, location.href);\n return {\n cacheKey: urlObject.href,\n url: urlObject.href,\n };\n }\n const { revision, url } = entry;\n if (!url) {\n throw new WorkboxError('add-to-cache-list-unexpected-type', { entry });\n }\n // If there's just a URL and no revision, then it's also assumed to be a\n // versioned URL.\n if (!revision) {\n const urlObject = new URL(url, location.href);\n return {\n cacheKey: urlObject.href,\n url: urlObject.href,\n };\n }\n // Otherwise, construct a properly versioned URL using the custom Workbox\n // search parameter along with the revision info.\n const cacheKeyURL = new URL(url, location.href);\n const originalURL = new URL(url, location.href);\n cacheKeyURL.searchParams.set(REVISION_SEARCH_PARAM, revision);\n return {\n cacheKey: cacheKeyURL.href,\n url: originalURL.href,\n };\n}\n","/*\n Copyright 2020 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * A plugin, designed to be used with PrecacheController, to determine the\n * of assets that were updated (or not updated) during the install event.\n *\n * @private\n */\nclass PrecacheInstallReportPlugin {\n constructor() {\n this.updatedURLs = [];\n this.notUpdatedURLs = [];\n this.handlerWillStart = async ({ request, state, }) => {\n // TODO: `state` should never be undefined...\n if (state) {\n state.originalRequest = request;\n }\n };\n this.cachedResponseWillBeUsed = async ({ event, state, cachedResponse, }) => {\n if (event.type === 'install') {\n if (state &&\n state.originalRequest &&\n state.originalRequest instanceof Request) {\n // TODO: `state` should never be undefined...\n const url = state.originalRequest.url;\n if (cachedResponse) {\n this.notUpdatedURLs.push(url);\n }\n else {\n this.updatedURLs.push(url);\n }\n }\n }\n return cachedResponse;\n };\n }\n}\nexport { PrecacheInstallReportPlugin };\n","/*\n Copyright 2020 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * A plugin, designed to be used with PrecacheController, to translate URLs into\n * the corresponding cache key, based on the current revision info.\n *\n * @private\n */\nclass PrecacheCacheKeyPlugin {\n constructor({ precacheController }) {\n this.cacheKeyWillBeUsed = async ({ request, params, }) => {\n // Params is type any, can't change right now.\n /* eslint-disable */\n const cacheKey = (params === null || params === void 0 ? void 0 : params.cacheKey) ||\n this._precacheController.getCacheKeyForURL(request.url);\n /* eslint-enable */\n return cacheKey\n ? new Request(cacheKey, { headers: request.headers })\n : request;\n };\n this._precacheController = precacheController;\n }\n}\nexport { PrecacheCacheKeyPlugin };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { logger } from 'workbox-core/_private/logger.js';\nimport '../_version.js';\n/**\n * @param {string} groupTitle\n * @param {Array} deletedURLs\n *\n * @private\n */\nconst logGroup = (groupTitle, deletedURLs) => {\n logger.groupCollapsed(groupTitle);\n for (const url of deletedURLs) {\n logger.log(url);\n }\n logger.groupEnd();\n};\n/**\n * @param {Array} deletedURLs\n *\n * @private\n * @memberof workbox-precaching\n */\nexport function printCleanupDetails(deletedURLs) {\n const deletionCount = deletedURLs.length;\n if (deletionCount > 0) {\n logger.groupCollapsed(`During precaching cleanup, ` +\n `${deletionCount} cached ` +\n `request${deletionCount === 1 ? ' was' : 's were'} deleted.`);\n logGroup('Deleted Cache Requests', deletedURLs);\n logger.groupEnd();\n }\n}\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { logger } from 'workbox-core/_private/logger.js';\nimport '../_version.js';\n/**\n * @param {string} groupTitle\n * @param {Array} urls\n *\n * @private\n */\nfunction _nestedGroup(groupTitle, urls) {\n if (urls.length === 0) {\n return;\n }\n logger.groupCollapsed(groupTitle);\n for (const url of urls) {\n logger.log(url);\n }\n logger.groupEnd();\n}\n/**\n * @param {Array} urlsToPrecache\n * @param {Array} urlsAlreadyPrecached\n *\n * @private\n * @memberof workbox-precaching\n */\nexport function printInstallDetails(urlsToPrecache, urlsAlreadyPrecached) {\n const precachedCount = urlsToPrecache.length;\n const alreadyPrecachedCount = urlsAlreadyPrecached.length;\n if (precachedCount || alreadyPrecachedCount) {\n let message = `Precaching ${precachedCount} file${precachedCount === 1 ? '' : 's'}.`;\n if (alreadyPrecachedCount > 0) {\n message +=\n ` ${alreadyPrecachedCount} ` +\n `file${alreadyPrecachedCount === 1 ? ' is' : 's are'} already cached.`;\n }\n logger.groupCollapsed(message);\n _nestedGroup(`View newly precached URLs.`, urlsToPrecache);\n _nestedGroup(`View previously precached URLs.`, urlsAlreadyPrecached);\n logger.groupEnd();\n }\n}\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nlet supportStatus;\n/**\n * A utility function that determines whether the current browser supports\n * constructing a new `Response` from a `response.body` stream.\n *\n * @return {boolean} `true`, if the current browser can successfully\n * construct a `Response` from a `response.body` stream, `false` otherwise.\n *\n * @private\n */\nfunction canConstructResponseFromBodyStream() {\n if (supportStatus === undefined) {\n const testResponse = new Response('');\n if ('body' in testResponse) {\n try {\n new Response(testResponse.body);\n supportStatus = true;\n }\n catch (error) {\n supportStatus = false;\n }\n }\n supportStatus = false;\n }\n return supportStatus;\n}\nexport { canConstructResponseFromBodyStream };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { canConstructResponseFromBodyStream } from './_private/canConstructResponseFromBodyStream.js';\nimport { WorkboxError } from './_private/WorkboxError.js';\nimport './_version.js';\n/**\n * Allows developers to copy a response and modify its `headers`, `status`,\n * or `statusText` values (the values settable via a\n * [`ResponseInit`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Response/Response#Syntax}\n * object in the constructor).\n * To modify these values, pass a function as the second argument. That\n * function will be invoked with a single object with the response properties\n * `{headers, status, statusText}`. The return value of this function will\n * be used as the `ResponseInit` for the new `Response`. To change the values\n * either modify the passed parameter(s) and return it, or return a totally\n * new object.\n *\n * This method is intentionally limited to same-origin responses, regardless of\n * whether CORS was used or not.\n *\n * @param {Response} response\n * @param {Function} modifier\n * @memberof workbox-core\n */\nasync function copyResponse(response, modifier) {\n let origin = null;\n // If response.url isn't set, assume it's cross-origin and keep origin null.\n if (response.url) {\n const responseURL = new URL(response.url);\n origin = responseURL.origin;\n }\n if (origin !== self.location.origin) {\n throw new WorkboxError('cross-origin-copy-response', { origin });\n }\n const clonedResponse = response.clone();\n // Create a fresh `ResponseInit` object by cloning the headers.\n const responseInit = {\n headers: new Headers(clonedResponse.headers),\n status: clonedResponse.status,\n statusText: clonedResponse.statusText,\n };\n // Apply any user modifications.\n const modifiedResponseInit = modifier ? modifier(responseInit) : responseInit;\n // Create the new response from the body stream and `ResponseInit`\n // modifications. Note: not all browsers support the Response.body stream,\n // so fall back to reading the entire body into memory as a blob.\n const body = canConstructResponseFromBodyStream()\n ? clonedResponse.body\n : await clonedResponse.blob();\n return new Response(body, modifiedResponseInit);\n}\nexport { copyResponse };\n","/*\n Copyright 2020 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { copyResponse } from 'workbox-core/copyResponse.js';\nimport { cacheNames } from 'workbox-core/_private/cacheNames.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { Strategy } from 'workbox-strategies/Strategy.js';\nimport './_version.js';\n/**\n * A {@link workbox-strategies.Strategy} implementation\n * specifically designed to work with\n * {@link workbox-precaching.PrecacheController}\n * to both cache and fetch precached assets.\n *\n * Note: an instance of this class is created automatically when creating a\n * `PrecacheController`; it's generally not necessary to create this yourself.\n *\n * @extends workbox-strategies.Strategy\n * @memberof workbox-precaching\n */\nclass PrecacheStrategy extends Strategy {\n /**\n *\n * @param {Object} [options]\n * @param {string} [options.cacheName] Cache name to store and retrieve\n * requests. Defaults to the cache names provided by\n * {@link workbox-core.cacheNames}.\n * @param {Array} [options.plugins] {@link https://developers.google.com/web/tools/workbox/guides/using-plugins|Plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} [options.fetchOptions] Values passed along to the\n * {@link https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters|init}\n * of all fetch() requests made by this strategy.\n * @param {Object} [options.matchOptions] The\n * {@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions|CacheQueryOptions}\n * for any `cache.match()` or `cache.put()` calls made by this strategy.\n * @param {boolean} [options.fallbackToNetwork=true] Whether to attempt to\n * get the response from the network if there's a precache miss.\n */\n constructor(options = {}) {\n options.cacheName = cacheNames.getPrecacheName(options.cacheName);\n super(options);\n this._fallbackToNetwork =\n options.fallbackToNetwork === false ? false : true;\n // Redirected responses cannot be used to satisfy a navigation request, so\n // any redirected response must be \"copied\" rather than cloned, so the new\n // response doesn't contain the `redirected` flag. See:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=669363&desc=2#c1\n this.plugins.push(PrecacheStrategy.copyRedirectedCacheableResponsesPlugin);\n }\n /**\n * @private\n * @param {Request|string} request A request to run this strategy for.\n * @param {workbox-strategies.StrategyHandler} handler The event that\n * triggered the request.\n * @return {Promise}\n */\n async _handle(request, handler) {\n const response = await handler.cacheMatch(request);\n if (response) {\n return response;\n }\n // If this is an `install` event for an entry that isn't already cached,\n // then populate the cache.\n if (handler.event && handler.event.type === 'install') {\n return await this._handleInstall(request, handler);\n }\n // Getting here means something went wrong. An entry that should have been\n // precached wasn't found in the cache.\n return await this._handleFetch(request, handler);\n }\n async _handleFetch(request, handler) {\n let response;\n const params = (handler.params || {});\n // Fall back to the network if we're configured to do so.\n if (this._fallbackToNetwork) {\n if (process.env.NODE_ENV !== 'production') {\n logger.warn(`The precached response for ` +\n `${getFriendlyURL(request.url)} in ${this.cacheName} was not ` +\n `found. Falling back to the network.`);\n }\n const integrityInManifest = params.integrity;\n const integrityInRequest = request.integrity;\n const noIntegrityConflict = !integrityInRequest || integrityInRequest === integrityInManifest;\n // Do not add integrity if the original request is no-cors\n // See https://github.com/GoogleChrome/workbox/issues/3096\n response = await handler.fetch(new Request(request, {\n integrity: request.mode !== 'no-cors'\n ? integrityInRequest || integrityInManifest\n : undefined,\n }));\n // It's only \"safe\" to repair the cache if we're using SRI to guarantee\n // that the response matches the precache manifest's expectations,\n // and there's either a) no integrity property in the incoming request\n // or b) there is an integrity, and it matches the precache manifest.\n // See https://github.com/GoogleChrome/workbox/issues/2858\n // Also if the original request users no-cors we don't use integrity.\n // See https://github.com/GoogleChrome/workbox/issues/3096\n if (integrityInManifest &&\n noIntegrityConflict &&\n request.mode !== 'no-cors') {\n this._useDefaultCacheabilityPluginIfNeeded();\n const wasCached = await handler.cachePut(request, response.clone());\n if (process.env.NODE_ENV !== 'production') {\n if (wasCached) {\n logger.log(`A response for ${getFriendlyURL(request.url)} ` +\n `was used to \"repair\" the precache.`);\n }\n }\n }\n }\n else {\n // This shouldn't normally happen, but there are edge cases:\n // https://github.com/GoogleChrome/workbox/issues/1441\n throw new WorkboxError('missing-precache-entry', {\n cacheName: this.cacheName,\n url: request.url,\n });\n }\n if (process.env.NODE_ENV !== 'production') {\n const cacheKey = params.cacheKey || (await handler.getCacheKey(request, 'read'));\n // Workbox is going to handle the route.\n // print the routing details to the console.\n logger.groupCollapsed(`Precaching is responding to: ` + getFriendlyURL(request.url));\n logger.log(`Serving the precached url: ${getFriendlyURL(cacheKey instanceof Request ? cacheKey.url : cacheKey)}`);\n logger.groupCollapsed(`View request details here.`);\n logger.log(request);\n logger.groupEnd();\n logger.groupCollapsed(`View response details here.`);\n logger.log(response);\n logger.groupEnd();\n logger.groupEnd();\n }\n return response;\n }\n async _handleInstall(request, handler) {\n this._useDefaultCacheabilityPluginIfNeeded();\n const response = await handler.fetch(request);\n // Make sure we defer cachePut() until after we know the response\n // should be cached; see https://github.com/GoogleChrome/workbox/issues/2737\n const wasCached = await handler.cachePut(request, response.clone());\n if (!wasCached) {\n // Throwing here will lead to the `install` handler failing, which\n // we want to do if *any* of the responses aren't safe to cache.\n throw new WorkboxError('bad-precaching-response', {\n url: request.url,\n status: response.status,\n });\n }\n return response;\n }\n /**\n * This method is complex, as there a number of things to account for:\n *\n * The `plugins` array can be set at construction, and/or it might be added to\n * to at any time before the strategy is used.\n *\n * At the time the strategy is used (i.e. during an `install` event), there\n * needs to be at least one plugin that implements `cacheWillUpdate` in the\n * array, other than `copyRedirectedCacheableResponsesPlugin`.\n *\n * - If this method is called and there are no suitable `cacheWillUpdate`\n * plugins, we need to add `defaultPrecacheCacheabilityPlugin`.\n *\n * - If this method is called and there is exactly one `cacheWillUpdate`, then\n * we don't have to do anything (this might be a previously added\n * `defaultPrecacheCacheabilityPlugin`, or it might be a custom plugin).\n *\n * - If this method is called and there is more than one `cacheWillUpdate`,\n * then we need to check if one is `defaultPrecacheCacheabilityPlugin`. If so,\n * we need to remove it. (This situation is unlikely, but it could happen if\n * the strategy is used multiple times, the first without a `cacheWillUpdate`,\n * and then later on after manually adding a custom `cacheWillUpdate`.)\n *\n * See https://github.com/GoogleChrome/workbox/issues/2737 for more context.\n *\n * @private\n */\n _useDefaultCacheabilityPluginIfNeeded() {\n let defaultPluginIndex = null;\n let cacheWillUpdatePluginCount = 0;\n for (const [index, plugin] of this.plugins.entries()) {\n // Ignore the copy redirected plugin when determining what to do.\n if (plugin === PrecacheStrategy.copyRedirectedCacheableResponsesPlugin) {\n continue;\n }\n // Save the default plugin's index, in case it needs to be removed.\n if (plugin === PrecacheStrategy.defaultPrecacheCacheabilityPlugin) {\n defaultPluginIndex = index;\n }\n if (plugin.cacheWillUpdate) {\n cacheWillUpdatePluginCount++;\n }\n }\n if (cacheWillUpdatePluginCount === 0) {\n this.plugins.push(PrecacheStrategy.defaultPrecacheCacheabilityPlugin);\n }\n else if (cacheWillUpdatePluginCount > 1 && defaultPluginIndex !== null) {\n // Only remove the default plugin; multiple custom plugins are allowed.\n this.plugins.splice(defaultPluginIndex, 1);\n }\n // Nothing needs to be done if cacheWillUpdatePluginCount is 1\n }\n}\nPrecacheStrategy.defaultPrecacheCacheabilityPlugin = {\n async cacheWillUpdate({ response }) {\n if (!response || response.status >= 400) {\n return null;\n }\n return response;\n },\n};\nPrecacheStrategy.copyRedirectedCacheableResponsesPlugin = {\n async cacheWillUpdate({ response }) {\n return response.redirected ? await copyResponse(response) : response;\n },\n};\nexport { PrecacheStrategy };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { cacheNames } from 'workbox-core/_private/cacheNames.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { WorkboxError } from 'workbox-core/_private/WorkboxError.js';\nimport { waitUntil } from 'workbox-core/_private/waitUntil.js';\nimport { createCacheKey } from './utils/createCacheKey.js';\nimport { PrecacheInstallReportPlugin } from './utils/PrecacheInstallReportPlugin.js';\nimport { PrecacheCacheKeyPlugin } from './utils/PrecacheCacheKeyPlugin.js';\nimport { printCleanupDetails } from './utils/printCleanupDetails.js';\nimport { printInstallDetails } from './utils/printInstallDetails.js';\nimport { PrecacheStrategy } from './PrecacheStrategy.js';\nimport './_version.js';\n/**\n * Performs efficient precaching of assets.\n *\n * @memberof workbox-precaching\n */\nclass PrecacheController {\n /**\n * Create a new PrecacheController.\n *\n * @param {Object} [options]\n * @param {string} [options.cacheName] The cache to use for precaching.\n * @param {string} [options.plugins] Plugins to use when precaching as well\n * as responding to fetch events for precached assets.\n * @param {boolean} [options.fallbackToNetwork=true] Whether to attempt to\n * get the response from the network if there's a precache miss.\n */\n constructor({ cacheName, plugins = [], fallbackToNetwork = true, } = {}) {\n this._urlsToCacheKeys = new Map();\n this._urlsToCacheModes = new Map();\n this._cacheKeysToIntegrities = new Map();\n this._strategy = new PrecacheStrategy({\n cacheName: cacheNames.getPrecacheName(cacheName),\n plugins: [\n ...plugins,\n new PrecacheCacheKeyPlugin({ precacheController: this }),\n ],\n fallbackToNetwork,\n });\n // Bind the install and activate methods to the instance.\n this.install = this.install.bind(this);\n this.activate = this.activate.bind(this);\n }\n /**\n * @type {workbox-precaching.PrecacheStrategy} The strategy created by this controller and\n * used to cache assets and respond to fetch events.\n */\n get strategy() {\n return this._strategy;\n }\n /**\n * Adds items to the precache list, removing any duplicates and\n * stores the files in the\n * {@link workbox-core.cacheNames|\"precache cache\"} when the service\n * worker installs.\n *\n * This method can be called multiple times.\n *\n * @param {Array} [entries=[]] Array of entries to precache.\n */\n precache(entries) {\n this.addToCacheList(entries);\n if (!this._installAndActiveListenersAdded) {\n self.addEventListener('install', this.install);\n self.addEventListener('activate', this.activate);\n this._installAndActiveListenersAdded = true;\n }\n }\n /**\n * This method will add items to the precache list, removing duplicates\n * and ensuring the information is valid.\n *\n * @param {Array} entries\n * Array of entries to precache.\n */\n addToCacheList(entries) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isArray(entries, {\n moduleName: 'workbox-precaching',\n className: 'PrecacheController',\n funcName: 'addToCacheList',\n paramName: 'entries',\n });\n }\n const urlsToWarnAbout = [];\n for (const entry of entries) {\n // See https://github.com/GoogleChrome/workbox/issues/2259\n if (typeof entry === 'string') {\n urlsToWarnAbout.push(entry);\n }\n else if (entry && entry.revision === undefined) {\n urlsToWarnAbout.push(entry.url);\n }\n const { cacheKey, url } = createCacheKey(entry);\n const cacheMode = typeof entry !== 'string' && entry.revision ? 'reload' : 'default';\n if (this._urlsToCacheKeys.has(url) &&\n this._urlsToCacheKeys.get(url) !== cacheKey) {\n throw new WorkboxError('add-to-cache-list-conflicting-entries', {\n firstEntry: this._urlsToCacheKeys.get(url),\n secondEntry: cacheKey,\n });\n }\n if (typeof entry !== 'string' && entry.integrity) {\n if (this._cacheKeysToIntegrities.has(cacheKey) &&\n this._cacheKeysToIntegrities.get(cacheKey) !== entry.integrity) {\n throw new WorkboxError('add-to-cache-list-conflicting-integrities', {\n url,\n });\n }\n this._cacheKeysToIntegrities.set(cacheKey, entry.integrity);\n }\n this._urlsToCacheKeys.set(url, cacheKey);\n this._urlsToCacheModes.set(url, cacheMode);\n if (urlsToWarnAbout.length > 0) {\n const warningMessage = `Workbox is precaching URLs without revision ` +\n `info: ${urlsToWarnAbout.join(', ')}\\nThis is generally NOT safe. ` +\n `Learn more at https://bit.ly/wb-precache`;\n if (process.env.NODE_ENV === 'production') {\n // Use console directly to display this warning without bloating\n // bundle sizes by pulling in all of the logger codebase in prod.\n console.warn(warningMessage);\n }\n else {\n logger.warn(warningMessage);\n }\n }\n }\n }\n /**\n * Precaches new and updated assets. Call this method from the service worker\n * install event.\n *\n * Note: this method calls `event.waitUntil()` for you, so you do not need\n * to call it yourself in your event handlers.\n *\n * @param {ExtendableEvent} event\n * @return {Promise}\n */\n install(event) {\n // waitUntil returns Promise\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return waitUntil(event, async () => {\n const installReportPlugin = new PrecacheInstallReportPlugin();\n this.strategy.plugins.push(installReportPlugin);\n // Cache entries one at a time.\n // See https://github.com/GoogleChrome/workbox/issues/2528\n for (const [url, cacheKey] of this._urlsToCacheKeys) {\n const integrity = this._cacheKeysToIntegrities.get(cacheKey);\n const cacheMode = this._urlsToCacheModes.get(url);\n const request = new Request(url, {\n integrity,\n cache: cacheMode,\n credentials: 'same-origin',\n });\n await Promise.all(this.strategy.handleAll({\n params: { cacheKey },\n request,\n event,\n }));\n }\n const { updatedURLs, notUpdatedURLs } = installReportPlugin;\n if (process.env.NODE_ENV !== 'production') {\n printInstallDetails(updatedURLs, notUpdatedURLs);\n }\n return { updatedURLs, notUpdatedURLs };\n });\n }\n /**\n * Deletes assets that are no longer present in the current precache manifest.\n * Call this method from the service worker activate event.\n *\n * Note: this method calls `event.waitUntil()` for you, so you do not need\n * to call it yourself in your event handlers.\n *\n * @param {ExtendableEvent} event\n * @return {Promise}\n */\n activate(event) {\n // waitUntil returns Promise\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return waitUntil(event, async () => {\n const cache = await self.caches.open(this.strategy.cacheName);\n const currentlyCachedRequests = await cache.keys();\n const expectedCacheKeys = new Set(this._urlsToCacheKeys.values());\n const deletedURLs = [];\n for (const request of currentlyCachedRequests) {\n if (!expectedCacheKeys.has(request.url)) {\n await cache.delete(request);\n deletedURLs.push(request.url);\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n printCleanupDetails(deletedURLs);\n }\n return { deletedURLs };\n });\n }\n /**\n * Returns a mapping of a precached URL to the corresponding cache key, taking\n * into account the revision information for the URL.\n *\n * @return {Map} A URL to cache key mapping.\n */\n getURLsToCacheKeys() {\n return this._urlsToCacheKeys;\n }\n /**\n * Returns a list of all the URLs that have been precached by the current\n * service worker.\n *\n * @return {Array} The precached URLs.\n */\n getCachedURLs() {\n return [...this._urlsToCacheKeys.keys()];\n }\n /**\n * Returns the cache key used for storing a given URL. If that URL is\n * unversioned, like `/index.html', then the cache key will be the original\n * URL with a search parameter appended to it.\n *\n * @param {string} url A URL whose cache key you want to look up.\n * @return {string} The versioned URL that corresponds to a cache key\n * for the original URL, or undefined if that URL isn't precached.\n */\n getCacheKeyForURL(url) {\n const urlObject = new URL(url, location.href);\n return this._urlsToCacheKeys.get(urlObject.href);\n }\n /**\n * @param {string} url A cache key whose SRI you want to look up.\n * @return {string} The subresource integrity associated with the cache key,\n * or undefined if it's not set.\n */\n getIntegrityForCacheKey(cacheKey) {\n return this._cacheKeysToIntegrities.get(cacheKey);\n }\n /**\n * This acts as a drop-in replacement for\n * [`cache.match()`](https://developer.mozilla.org/en-US/docs/Web/API/Cache/match)\n * with the following differences:\n *\n * - It knows what the name of the precache is, and only checks in that cache.\n * - It allows you to pass in an \"original\" URL without versioning parameters,\n * and it will automatically look up the correct cache key for the currently\n * active revision of that URL.\n *\n * E.g., `matchPrecache('index.html')` will find the correct precached\n * response for the currently active service worker, even if the actual cache\n * key is `'/index.html?__WB_REVISION__=1234abcd'`.\n *\n * @param {string|Request} request The key (without revisioning parameters)\n * to look up in the precache.\n * @return {Promise}\n */\n async matchPrecache(request) {\n const url = request instanceof Request ? request.url : request;\n const cacheKey = this.getCacheKeyForURL(url);\n if (cacheKey) {\n const cache = await self.caches.open(this.strategy.cacheName);\n return cache.match(cacheKey);\n }\n return undefined;\n }\n /**\n * Returns a function that looks up `url` in the precache (taking into\n * account revision information), and returns the corresponding `Response`.\n *\n * @param {string} url The precached URL which will be used to lookup the\n * `Response`.\n * @return {workbox-routing~handlerCallback}\n */\n createHandlerBoundToURL(url) {\n const cacheKey = this.getCacheKeyForURL(url);\n if (!cacheKey) {\n throw new WorkboxError('non-precached-url', { url });\n }\n return (options) => {\n options.request = new Request(url);\n options.params = Object.assign({ cacheKey }, options.params);\n return this.strategy.handle(options);\n };\n }\n}\nexport { PrecacheController };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { PrecacheController } from '../PrecacheController.js';\nimport '../_version.js';\nlet precacheController;\n/**\n * @return {PrecacheController}\n * @private\n */\nexport const getOrCreatePrecacheController = () => {\n if (!precacheController) {\n precacheController = new PrecacheController();\n }\n return precacheController;\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\n/**\n * Removes any URL search parameters that should be ignored.\n *\n * @param {URL} urlObject The original URL.\n * @param {Array} ignoreURLParametersMatching RegExps to test against\n * each search parameter name. Matches mean that the search parameter should be\n * ignored.\n * @return {URL} The URL with any ignored search parameters removed.\n *\n * @private\n * @memberof workbox-precaching\n */\nexport function removeIgnoredSearchParams(urlObject, ignoreURLParametersMatching = []) {\n // Convert the iterable into an array at the start of the loop to make sure\n // deletion doesn't mess up iteration.\n for (const paramName of [...urlObject.searchParams.keys()]) {\n if (ignoreURLParametersMatching.some((regExp) => regExp.test(paramName))) {\n urlObject.searchParams.delete(paramName);\n }\n }\n return urlObject;\n}\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { removeIgnoredSearchParams } from './removeIgnoredSearchParams.js';\nimport '../_version.js';\n/**\n * Generator function that yields possible variations on the original URL to\n * check, one at a time.\n *\n * @param {string} url\n * @param {Object} options\n *\n * @private\n * @memberof workbox-precaching\n */\nexport function* generateURLVariations(url, { ignoreURLParametersMatching = [/^utm_/, /^fbclid$/], directoryIndex = 'index.html', cleanURLs = true, urlManipulation, } = {}) {\n const urlObject = new URL(url, location.href);\n urlObject.hash = '';\n yield urlObject.href;\n const urlWithoutIgnoredParams = removeIgnoredSearchParams(urlObject, ignoreURLParametersMatching);\n yield urlWithoutIgnoredParams.href;\n if (directoryIndex && urlWithoutIgnoredParams.pathname.endsWith('/')) {\n const directoryURL = new URL(urlWithoutIgnoredParams.href);\n directoryURL.pathname += directoryIndex;\n yield directoryURL.href;\n }\n if (cleanURLs) {\n const cleanURL = new URL(urlWithoutIgnoredParams.href);\n cleanURL.pathname += '.html';\n yield cleanURL.href;\n }\n if (urlManipulation) {\n const additionalURLs = urlManipulation({ url: urlObject });\n for (const urlToAttempt of additionalURLs) {\n yield urlToAttempt.href;\n }\n }\n}\n","/*\n Copyright 2020 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';\nimport { Route } from 'workbox-routing/Route.js';\nimport { generateURLVariations } from './utils/generateURLVariations.js';\nimport './_version.js';\n/**\n * A subclass of {@link workbox-routing.Route} that takes a\n * {@link workbox-precaching.PrecacheController}\n * instance and uses it to match incoming requests and handle fetching\n * responses from the precache.\n *\n * @memberof workbox-precaching\n * @extends workbox-routing.Route\n */\nclass PrecacheRoute extends Route {\n /**\n * @param {PrecacheController} precacheController A `PrecacheController`\n * instance used to both match requests and respond to fetch events.\n * @param {Object} [options] Options to control how requests are matched\n * against the list of precached URLs.\n * @param {string} [options.directoryIndex=index.html] The `directoryIndex` will\n * check cache entries for a URLs ending with '/' to see if there is a hit when\n * appending the `directoryIndex` value.\n * @param {Array} [options.ignoreURLParametersMatching=[/^utm_/, /^fbclid$/]] An\n * array of regex's to remove search params when looking for a cache match.\n * @param {boolean} [options.cleanURLs=true] The `cleanURLs` option will\n * check the cache for the URL with a `.html` added to the end of the end.\n * @param {workbox-precaching~urlManipulation} [options.urlManipulation]\n * This is a function that should take a URL and return an array of\n * alternative URLs that should be checked for precache matches.\n */\n constructor(precacheController, options) {\n const match = ({ request, }) => {\n const urlsToCacheKeys = precacheController.getURLsToCacheKeys();\n for (const possibleURL of generateURLVariations(request.url, options)) {\n const cacheKey = urlsToCacheKeys.get(possibleURL);\n if (cacheKey) {\n const integrity = precacheController.getIntegrityForCacheKey(cacheKey);\n return { cacheKey, integrity };\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Precaching did not find a match for ` + getFriendlyURL(request.url));\n }\n return;\n };\n super(match, precacheController.strategy);\n }\n}\nexport { PrecacheRoute };\n","/*\n Copyright 2019 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { registerRoute } from 'workbox-routing/registerRoute.js';\nimport { getOrCreatePrecacheController } from './utils/getOrCreatePrecacheController.js';\nimport { PrecacheRoute } from './PrecacheRoute.js';\nimport './_version.js';\n/**\n * Add a `fetch` listener to the service worker that will\n * respond to\n * [network requests]{@link https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#Custom_responses_to_requests}\n * with precached assets.\n *\n * Requests for assets that aren't precached, the `FetchEvent` will not be\n * responded to, allowing the event to fall through to other `fetch` event\n * listeners.\n *\n * @param {Object} [options] See the {@link workbox-precaching.PrecacheRoute}\n * options.\n *\n * @memberof workbox-precaching\n */\nfunction addRoute(options) {\n const precacheController = getOrCreatePrecacheController();\n const precacheRoute = new PrecacheRoute(precacheController, options);\n registerRoute(precacheRoute);\n}\nexport { addRoute };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { getOrCreatePrecacheController } from './utils/getOrCreatePrecacheController.js';\nimport './_version.js';\n/**\n * Adds items to the precache list, removing any duplicates and\n * stores the files in the\n * {@link workbox-core.cacheNames|\"precache cache\"} when the service\n * worker installs.\n *\n * This method can be called multiple times.\n *\n * Please note: This method **will not** serve any of the cached files for you.\n * It only precaches files. To respond to a network request you call\n * {@link workbox-precaching.addRoute}.\n *\n * If you have a single array of files to precache, you can just call\n * {@link workbox-precaching.precacheAndRoute}.\n *\n * @param {Array} [entries=[]] Array of entries to precache.\n *\n * @memberof workbox-precaching\n */\nfunction precache(entries) {\n const precacheController = getOrCreatePrecacheController();\n precacheController.precache(entries);\n}\nexport { precache };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { addRoute } from './addRoute.js';\nimport { precache } from './precache.js';\nimport './_version.js';\n/**\n * This method will add entries to the precache list and add a route to\n * respond to fetch events.\n *\n * This is a convenience method that will call\n * {@link workbox-precaching.precache} and\n * {@link workbox-precaching.addRoute} in a single call.\n *\n * @param {Array} entries Array of entries to precache.\n * @param {Object} [options] See the\n * {@link workbox-precaching.PrecacheRoute} options.\n *\n * @memberof workbox-precaching\n */\nfunction precacheAndRoute(entries, options) {\n precache(entries);\n addRoute(options);\n}\nexport { precacheAndRoute };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport '../_version.js';\nconst SUBSTRING_TO_FIND = '-precache-';\n/**\n * Cleans up incompatible precaches that were created by older versions of\n * Workbox, by a service worker registered under the current scope.\n *\n * This is meant to be called as part of the `activate` event.\n *\n * This should be safe to use as long as you don't include `substringToFind`\n * (defaulting to `-precache-`) in your non-precache cache names.\n *\n * @param {string} currentPrecacheName The cache name currently in use for\n * precaching. This cache won't be deleted.\n * @param {string} [substringToFind='-precache-'] Cache names which include this\n * substring will be deleted (excluding `currentPrecacheName`).\n * @return {Array} A list of all the cache names that were deleted.\n *\n * @private\n * @memberof workbox-precaching\n */\nconst deleteOutdatedCaches = async (currentPrecacheName, substringToFind = SUBSTRING_TO_FIND) => {\n const cacheNames = await self.caches.keys();\n const cacheNamesToDelete = cacheNames.filter((cacheName) => {\n return (cacheName.includes(substringToFind) &&\n cacheName.includes(self.registration.scope) &&\n cacheName !== currentPrecacheName);\n });\n await Promise.all(cacheNamesToDelete.map((cacheName) => self.caches.delete(cacheName)));\n return cacheNamesToDelete;\n};\nexport { deleteOutdatedCaches };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { cacheNames } from 'workbox-core/_private/cacheNames.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { deleteOutdatedCaches } from './utils/deleteOutdatedCaches.js';\nimport './_version.js';\n/**\n * Adds an `activate` event listener which will clean up incompatible\n * precaches that were created by older versions of Workbox.\n *\n * @memberof workbox-precaching\n */\nfunction cleanupOutdatedCaches() {\n // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705\n self.addEventListener('activate', ((event) => {\n const cacheName = cacheNames.getPrecacheName();\n event.waitUntil(deleteOutdatedCaches(cacheName).then((cachesDeleted) => {\n if (process.env.NODE_ENV !== 'production') {\n if (cachesDeleted.length > 0) {\n logger.log(`The following out-of-date precaches were cleaned up ` +\n `automatically:`, cachesDeleted);\n }\n }\n }));\n }));\n}\nexport { cleanupOutdatedCaches };\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { assert } from 'workbox-core/_private/assert.js';\nimport { logger } from 'workbox-core/_private/logger.js';\nimport { Route } from './Route.js';\nimport './_version.js';\n/**\n * NavigationRoute makes it easy to create a\n * {@link workbox-routing.Route} that matches for browser\n * [navigation requests]{@link https://developers.google.com/web/fundamentals/primers/service-workers/high-performance-loading#first_what_are_navigation_requests}.\n *\n * It will only match incoming Requests whose\n * {@link https://fetch.spec.whatwg.org/#concept-request-mode|mode}\n * is set to `navigate`.\n *\n * You can optionally only apply this route to a subset of navigation requests\n * by using one or both of the `denylist` and `allowlist` parameters.\n *\n * @memberof workbox-routing\n * @extends workbox-routing.Route\n */\nclass NavigationRoute extends Route {\n /**\n * If both `denylist` and `allowlist` are provided, the `denylist` will\n * take precedence and the request will not match this route.\n *\n * The regular expressions in `allowlist` and `denylist`\n * are matched against the concatenated\n * [`pathname`]{@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/pathname}\n * and [`search`]{@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/search}\n * portions of the requested URL.\n *\n * *Note*: These RegExps may be evaluated against every destination URL during\n * a navigation. Avoid using\n * [complex RegExps](https://github.com/GoogleChrome/workbox/issues/3077),\n * or else your users may see delays when navigating your site.\n *\n * @param {workbox-routing~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n * @param {Object} options\n * @param {Array} [options.denylist] If any of these patterns match,\n * the route will not handle the request (even if a allowlist RegExp matches).\n * @param {Array} [options.allowlist=[/./]] If any of these patterns\n * match the URL's pathname and search parameter, the route will handle the\n * request (assuming the denylist doesn't match).\n */\n constructor(handler, { allowlist = [/./], denylist = [] } = {}) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isArrayOfClass(allowlist, RegExp, {\n moduleName: 'workbox-routing',\n className: 'NavigationRoute',\n funcName: 'constructor',\n paramName: 'options.allowlist',\n });\n assert.isArrayOfClass(denylist, RegExp, {\n moduleName: 'workbox-routing',\n className: 'NavigationRoute',\n funcName: 'constructor',\n paramName: 'options.denylist',\n });\n }\n super((options) => this._match(options), handler);\n this._allowlist = allowlist;\n this._denylist = denylist;\n }\n /**\n * Routes match handler.\n *\n * @param {Object} options\n * @param {URL} options.url\n * @param {Request} options.request\n * @return {boolean}\n *\n * @private\n */\n _match({ url, request }) {\n if (request && request.mode !== 'navigate') {\n return false;\n }\n const pathnameAndSearch = url.pathname + url.search;\n for (const regExp of this._denylist) {\n if (regExp.test(pathnameAndSearch)) {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`The navigation route ${pathnameAndSearch} is not ` +\n `being used, since the URL matches this denylist pattern: ` +\n `${regExp.toString()}`);\n }\n return false;\n }\n }\n if (this._allowlist.some((regExp) => regExp.test(pathnameAndSearch))) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`The navigation route ${pathnameAndSearch} ` + `is being used.`);\n }\n return true;\n }\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`The navigation route ${pathnameAndSearch} is not ` +\n `being used, since the URL being navigated to doesn't ` +\n `match the allowlist.`);\n }\n return false;\n }\n}\nexport { NavigationRoute };\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\nimport { getOrCreatePrecacheController } from './utils/getOrCreatePrecacheController.js';\nimport './_version.js';\n/**\n * Helper function that calls\n * {@link PrecacheController#createHandlerBoundToURL} on the default\n * {@link PrecacheController} instance.\n *\n * If you are creating your own {@link PrecacheController}, then call the\n * {@link PrecacheController#createHandlerBoundToURL} on that instance,\n * instead of using this function.\n *\n * @param {string} url The precached URL which will be used to lookup the\n * `Response`.\n * @param {boolean} [fallbackToNetwork=true] Whether to attempt to get the\n * response from the network if there's a precache miss.\n * @return {workbox-routing~handlerCallback}\n *\n * @memberof workbox-precaching\n */\nfunction createHandlerBoundToURL(url) {\n const precacheController = getOrCreatePrecacheController();\n return precacheController.createHandlerBoundToURL(url);\n}\nexport { createHandlerBoundToURL };\n"],"names":["self","_","e","logger","globalThis","__WB_DISABLE_DEV_LOGS","inGroup","methodToColorMap","debug","log","warn","error","groupCollapsed","groupEnd","print","method","args","test","navigator","userAgent","console","styles","logPrefix","join","api","loggerMethods","Object","keys","key","messages","invalid-value","paramName","validValueDescription","value","Error","JSON","stringify","not-an-array","moduleName","className","funcName","incorrect-type","expectedType","classNameStr","incorrect-class","expectedClassName","isReturnValueProblem","missing-a-method","expectedMethod","add-to-cache-list-unexpected-type","entry","add-to-cache-list-conflicting-entries","firstEntry","secondEntry","plugin-error-request-will-fetch","thrownErrorMessage","invalid-cache-name","cacheNameId","unregister-route-but-not-found-with-method","unregister-route-route-not-registered","queue-replay-failed","name","duplicate-queue-name","expired-test-without-max-age","methodName","unsupported-route-type","not-array-of-class","expectedClass","max-entries-or-age-required","statuses-or-headers-required","invalid-string","channel-name-required","invalid-responses-are-same-args","expire-custom-caches-only","unit-must-be-bytes","normalizedRangeHeader","single-range-only","invalid-range-values","no-range-header","range-not-satisfiable","size","start","end","attempt-to-cache-non-get-request","url","cache-put-with-no-response","no-response","message","bad-precaching-response","status","non-precached-url","add-to-cache-list-conflicting-integrities","missing-precache-entry","cacheName","cross-origin-copy-response","origin","opaque-streams-source","type","generatorFunction","code","details","messageGenerator","WorkboxError","constructor","errorCode","isArray","Array","hasMethod","object","isType","isInstance","isOneOf","validValues","includes","isArrayOfClass","item","finalAssertExports","defaultMethod","validMethods","normalizeHandler","handler","assert","handle","Route","match","setCatchHandler","catchHandler","RegExpRoute","regExp","RegExp","result","exec","href","location","index","toString","slice","getFriendlyURL","urlObj","URL","String","replace","Router","_routes","Map","_defaultHandlerMap","routes","addFetchListener","addEventListener","event","request","responsePromise","handleRequest","respondWith","addCacheListener","data","payload","urlsToCache","requestPromises","Promise","all","map","Request","waitUntil","ports","then","postMessage","protocol","startsWith","sameOrigin","params","route","findMatchingRoute","debugMessages","push","has","get","forEach","msg","err","reject","_catchHandler","catch","catchErr","matchResult","length","undefined","setDefaultHandler","set","registerRoute","unregisterRoute","routeIndex","indexOf","splice","defaultRouter","getOrCreateDefaultRouter","capture","captureUrl","valueToCheck","pathname","wildcards","matchCallback","_cacheNameDetails","googleAnalytics","precache","prefix","runtime","suffix","registration","scope","_createCacheName","filter","eachCacheNameDetail","fn","cacheNames","updateDetails","getGoogleAnalyticsName","userCacheName","getPrecacheName","getPrefix","getRuntimeName","getSuffix","dontWaitFor","promise","quotaErrorCallbacks","Set","registerQuotaErrorCallback","callback","add","instanceOfAny","constructors","some","c","idbProxyableTypes","cursorAdvanceMethods","getIdbProxyableTypes","IDBDatabase","IDBObjectStore","IDBIndex","IDBCursor","IDBTransaction","getCursorAdvanceMethods","prototype","advance","continue","continuePrimaryKey","cursorRequestMap","WeakMap","transactionDoneMap","transactionStoreNamesMap","transformCache","reverseTransformCache","promisifyRequest","resolve","unlisten","removeEventListener","success","wrap","cacheDonePromiseForTransaction","tx","done","complete","DOMException","idbProxyTraps","target","prop","receiver","objectStoreNames","objectStore","replaceTraps","wrapFunction","func","transaction","storeNames","call","unwrap","sort","apply","transformCachableValue","Proxy","IDBRequest","newValue","openDB","version","blocked","upgrade","blocking","terminated","indexedDB","open","openPromise","oldVersion","newVersion","db","deleteDB","deleteDatabase","readMethods","writeMethods","cachedMethods","getMethod","targetFuncName","useIndex","isWrite","storeName","store","shift","oldTraps","_extends","DB_NAME","CACHE_OBJECT_STORE","normalizeURL","unNormalizedUrl","hash","CacheTimestampsModel","_db","_cacheName","_upgradeDb","objStore","createObjectStore","keyPath","createIndex","unique","_upgradeDbAndDeleteOldDbs","setTimestamp","timestamp","id","_getId","getDb","durability","put","getTimestamp","expireEntries","minTimestamp","maxCount","cursor","openCursor","entriesToDelete","entriesNotDeletedCount","urlsDeleted","delete","bind","CacheExpiration","config","_isRunning","_rerunRequested","maxEntries","maxAgeSeconds","_maxEntries","_maxAgeSeconds","_matchOptions","matchOptions","_timestampModel","Date","now","urlsExpired","cache","caches","updateTimestamp","isURLExpired","expireOlderThan","Infinity","ExpirationPlugin","cachedResponseWillBeUsed","cachedResponse","isFresh","_isResponseDateFresh","cacheExpiration","_getCacheExpiration","updateTimestampDone","cacheDidUpdate","_config","_cacheExpirations","purgeOnQuotaError","deleteCacheAndMetadata","dateHeaderTimestamp","_getDateHeaderTimestamp","headers","dateHeader","parsedDate","headerTime","getTime","isNaN","CacheableResponse","statuses","_statuses","_headers","isResponseCacheable","response","Response","cacheable","headerName","logFriendlyHeaders","CacheableResponsePlugin","cacheWillUpdate","_cacheableResponse","stripParams","fullURL","ignoreParams","strippedURL","param","searchParams","cacheMatchIgnoreParams","strippedRequestURL","keysOptions","assign","ignoreSearch","cacheKeys","cacheKey","strippedCacheKeyURL","Deferred","executeQuotaErrorCallbacks","timeout","ms","setTimeout","toRequest","input","StrategyHandler","strategy","options","_cacheKeys","ExtendableEvent","_strategy","_handlerDeferred","_extendLifetimePromises","_plugins","plugins","_pluginStateMap","plugin","fetch","mode","FetchEvent","preloadResponse","possiblePreloadResponse","originalRequest","hasCallback","clone","cb","iterateCallbacks","pluginFilteredRequest","fetchResponse","fetchOptions","runCallbacks","fetchAndCachePut","responseClone","cachePut","cacheMatch","effectiveRequest","getCacheKey","multiMatchOptions","vary","responseToCache","_ensureResponseSafeToCache","hasCacheUpdateCallback","oldResponse","newResponse","state","statefulCallback","statefulParam","doneWaiting","destroy","pluginsUsed","Strategy","responseDone","handleAll","_getResponse","handlerDone","_awaitComplete","_handle","waitUntilError","strategyStart","strategyName","printFinalResponse","CacheFirst","logs","cacheOkAndOpaquePlugin","NetworkFirst","p","unshift","_networkTimeoutSeconds","networkTimeoutSeconds","promises","timeoutId","_getTimeoutPromise","networkPromise","_getNetworkPromise","race","timeoutPromise","onNetworkTimeout","fetchError","clearTimeout","clientsClaim","clients","claim","asyncFn","returnPromise","REVISION_SEARCH_PARAM","createCacheKey","urlObject","revision","cacheKeyURL","originalURL","PrecacheInstallReportPlugin","updatedURLs","notUpdatedURLs","handlerWillStart","PrecacheCacheKeyPlugin","precacheController","cacheKeyWillBeUsed","_precacheController","getCacheKeyForURL","logGroup","groupTitle","deletedURLs","printCleanupDetails","deletionCount","_nestedGroup","urls","printInstallDetails","urlsToPrecache","urlsAlreadyPrecached","precachedCount","alreadyPrecachedCount","supportStatus","canConstructResponseFromBodyStream","testResponse","body","copyResponse","modifier","responseURL","clonedResponse","responseInit","Headers","statusText","modifiedResponseInit","blob","PrecacheStrategy","_fallbackToNetwork","fallbackToNetwork","copyRedirectedCacheableResponsesPlugin","_handleInstall","_handleFetch","integrityInManifest","integrity","integrityInRequest","noIntegrityConflict","_useDefaultCacheabilityPluginIfNeeded","wasCached","defaultPluginIndex","cacheWillUpdatePluginCount","entries","defaultPrecacheCacheabilityPlugin","redirected","PrecacheController","_urlsToCacheKeys","_urlsToCacheModes","_cacheKeysToIntegrities","install","activate","addToCacheList","_installAndActiveListenersAdded","urlsToWarnAbout","cacheMode","warningMessage","installReportPlugin","credentials","currentlyCachedRequests","expectedCacheKeys","values","getURLsToCacheKeys","getCachedURLs","getIntegrityForCacheKey","matchPrecache","createHandlerBoundToURL","getOrCreatePrecacheController","removeIgnoredSearchParams","ignoreURLParametersMatching","generateURLVariations","directoryIndex","cleanURLs","urlManipulation","urlWithoutIgnoredParams","endsWith","directoryURL","cleanURL","additionalURLs","urlToAttempt","PrecacheRoute","urlsToCacheKeys","possibleURL","addRoute","precacheRoute","precacheAndRoute","SUBSTRING_TO_FIND","deleteOutdatedCaches","currentPrecacheName","substringToFind","cacheNamesToDelete","cleanupOutdatedCaches","cachesDeleted","NavigationRoute","allowlist","denylist","_match","_allowlist","_denylist","pathnameAndSearch","search"],"mappings":"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"} \ No newline at end of file diff --git a/frontend/index.html b/frontend/index.html index 1eae32e..945b4a4 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -4,6 +4,15 @@ + + + + + + + + + LeDiscord - Notre espace diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 511ed13..9c14d76 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -23,9 +23,11 @@ "@vitejs/plugin-vue": "^4.5.0", "autoprefixer": "^10.4.16", "postcss": "^8.4.31", + "sharp": "^0.33.5", "tailwindcss": "^3.3.5", "terser": "^5.43.1", - "vite": "^5.0.0" + "vite": "^5.0.0", + "vite-plugin-pwa": "^0.20.5" } }, "node_modules/@alloc/quick-lru": { @@ -41,6 +43,323 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ajv": ">=8" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", + "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", + "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", + "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.6.tgz", + "integrity": "sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.11" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", @@ -51,21 +370,60 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/parser": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", - "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", + "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.2" + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.6" }, "bin": { "parser": "bin/babel-parser.js" @@ -74,6 +432,1108 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", + "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", + "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.6.tgz", + "integrity": "sha512-9knsChgsMzBV5Yh3kkhrZNxH3oCYAfMBkNNaVN4cP2RVlFPe8wYdwwcnOsAbkdDoV9UjFtOXWrWB52M8W4jNeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", + "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", + "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", + "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", + "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", + "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", + "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", + "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.28.6.tgz", + "integrity": "sha512-5suVoXjC14lUN6ZL9OLKIHCNVWCrqGqlmEp/ixdXjvgnEl/kauLvvMO/Xw9NyMc95Joj1AeLVPVMvibBgSoFlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", + "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", + "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", + "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", + "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", + "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", + "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", + "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", + "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", + "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", + "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", + "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", + "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.6.tgz", + "integrity": "sha512-eZhoEZHYQLL5uc1gS5e9/oTknS0sSSAtd5TkKMUp3J+S/CaUjagc0kOUPsEbDmMeva0nC3WWl4SxVY6+OBuxfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", + "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", + "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", + "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", + "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.6.tgz", + "integrity": "sha512-GaTI4nXDrs7l0qaJ6Rg06dtOXTBCG6TMDB44zbqofCIC4PqC7SEvmFFtpxzCDw9W5aJ7RKVshgXTLvLdBFV/qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.28.6", + "@babel/plugin-syntax-import-attributes": "^7.28.6", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.6", + "@babel/plugin-transform-async-to-generator": "^7.28.6", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.6", + "@babel/plugin-transform-class-properties": "^7.28.6", + "@babel/plugin-transform-class-static-block": "^7.28.6", + "@babel/plugin-transform-classes": "^7.28.6", + "@babel/plugin-transform-computed-properties": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-dotall-regex": "^7.28.6", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.28.6", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.6", + "@babel/plugin-transform-exponentiation-operator": "^7.28.6", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.28.6", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.28.6", + "@babel/plugin-transform-modules-systemjs": "^7.28.5", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", + "@babel/plugin-transform-numeric-separator": "^7.28.6", + "@babel/plugin-transform-object-rest-spread": "^7.28.6", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.28.6", + "@babel/plugin-transform-optional-chaining": "^7.28.6", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.28.6", + "@babel/plugin-transform-private-property-in-object": "^7.28.6", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.6", + "@babel/plugin-transform-regexp-modifiers": "^7.28.6", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.28.6", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.28.6", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/@babel/runtime": { "version": "7.28.3", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", @@ -83,19 +1543,64 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/traverse": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", + "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", @@ -487,6 +1992,386 @@ "node": ">=12" } }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.2.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -516,6 +2401,17 @@ "@jridgewell/trace-mapping": "^0.3.24" } }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -603,6 +2499,90 @@ "node": ">=14" } }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", + "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-terser": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", + "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.47.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.47.1.tgz", @@ -883,6 +2863,29 @@ "win32" ] }, + "node_modules/@surma/rollup-plugin-off-main-thread": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" + } + }, + "node_modules/@surma/rollup-plugin-off-main-thread/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -890,6 +2893,20 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/web-bluetooth": { "version": "0.0.20", "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", @@ -1134,6 +3151,23 @@ "pkcs7": "^1.0.4" } }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/ansi-regex": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", @@ -1188,12 +3222,78 @@ "dev": true, "license": "MIT" }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT" }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/autoprefixer": { "version": "10.4.21", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", @@ -1232,6 +3332,22 @@ "postcss": "^8.1.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/axios": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", @@ -1243,6 +3359,48 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.15.tgz", + "integrity": "sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.6", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.6.tgz", + "integrity": "sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.6" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1250,6 +3408,16 @@ "dev": true, "license": "MIT" }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.18", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.18.tgz", + "integrity": "sha512-e23vBV1ZLfjb9apvfPk4rHVu2ry6RIr2Wfs+O324okSidrX7pTAnEJPCh/O5BtRlr7QtZI7ktOP3vsqr7Z5XoA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -1287,9 +3455,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.3.tgz", - "integrity": "sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, "funding": [ { @@ -1307,10 +3475,11 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001735", - "electron-to-chromium": "^1.5.204", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" @@ -1326,6 +3495,25 @@ "dev": true, "license": "MIT" }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -1339,6 +3527,23 @@ "node": ">= 0.4" } }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/camelcase-css": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", @@ -1350,9 +3555,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001736", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001736.tgz", - "integrity": "sha512-ImpN5gLEY8gWeqfLUyEF4b7mYWcYoR2Si1VhnrbM4JizRFmfGaAQ12PhNykq6nvI4XvKLrsp8Xde74D5phJOSw==", + "version": "1.0.30001766", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", + "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==", "dev": true, "funding": [ { @@ -1379,7 +3584,6 @@ "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.3.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", @@ -1409,6 +3613,20 @@ "node": ">= 6" } }, + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1429,6 +3647,17 @@ "dev": true, "license": "MIT" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -1451,6 +3680,44 @@ "node": ">= 6" } }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-js-compat": { + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.48.0.tgz", + "integrity": "sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -1466,6 +3733,16 @@ "node": ">= 8" } }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -1485,6 +3762,60 @@ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "license": "MIT" }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/date-fns": { "version": "2.30.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", @@ -1509,6 +3840,70 @@ "date-fns": ">=2.0.0" } }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -1518,6 +3913,16 @@ "node": ">=0.4.0" } }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -1558,10 +3963,26 @@ "dev": true, "license": "MIT" }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/electron-to-chromium": { - "version": "1.5.208", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.208.tgz", - "integrity": "sha512-ozZyibehoe7tOhNaf16lKmljVf+3npZcJIEbJRVftVsmAg5TeA1mGS9dVCZzOwr2xT7xK15V0p7+GZqSPgkuPg==", + "version": "1.5.278", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.278.tgz", + "integrity": "sha512-dQ0tM1svDRQOwxnXxm+twlGTjr9Upvt8UFWAgmLsxEzFQxhbti4VwxmMjsDxVC51Zo84swW7FVCXEV+VAkhuPw==", "dev": true, "license": "ISC" }, @@ -1584,6 +4005,75 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/es-abstract": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -1629,6 +4119,24 @@ "node": ">= 0.4" } }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/esbuild": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", @@ -1636,31 +4144,6 @@ "dev": true, "hasInstallScript": true, "license": "MIT", - "dependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - }, "bin": { "esbuild": "bin/esbuild" }, @@ -1709,6 +4192,23 @@ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "license": "MIT" }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", @@ -1739,6 +4239,30 @@ "node": ">= 6" } }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/fastq": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", @@ -1749,6 +4273,29 @@ "reusify": "^1.0.4" } }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -1782,6 +4329,22 @@ } } }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/foreground-child": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", @@ -1829,6 +4392,29 @@ "url": "https://github.com/sponsors/rawify" } }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -1853,6 +4439,57 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -1877,6 +4514,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true, + "license": "ISC" + }, "node_modules/get-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", @@ -1890,6 +4534,24 @@ "node": ">= 0.4" } }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/glob": { "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", @@ -1934,6 +4596,23 @@ "process": "^0.11.10" } }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -1946,6 +4625,55 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -1985,6 +4713,108 @@ "node": ">= 0.4" } }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -1998,6 +4828,36 @@ "node": ">=8" } }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", @@ -2014,6 +4874,41 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2024,6 +4919,22 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -2040,6 +4951,26 @@ "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", "license": "MIT" }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -2053,6 +4984,39 @@ "node": ">=0.10.0" } }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -2063,6 +5027,208 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2077,8 +5243,7 @@ "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" + "@isaacs/cliui": "^8.0.2" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -2087,6 +5252,24 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/jiti": { "version": "1.21.7", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", @@ -2097,6 +5280,86 @@ "jiti": "bin/jiti.js" } }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true, + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/lilconfig": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", @@ -2117,6 +5380,27 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true, + "license": "MIT" + }, "node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", @@ -2256,6 +5540,13 @@ "mpd-to-m3u8-json": "bin/parse.js" } }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, "node_modules/mux.js": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/mux.js/-/mux.js-7.1.0.tgz", @@ -2304,9 +5595,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true, "license": "MIT" }, @@ -2350,6 +5641,78 @@ "node": ">= 6" } }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", @@ -2357,6 +5720,16 @@ "dev": true, "license": "BlueOak-1.0.0" }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -2464,6 +5837,16 @@ "pkcs7": "bin/cli.js" } }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", @@ -2613,6 +5996,19 @@ "dev": true, "license": "MIT" }, + "node_modules/pretty-bytes": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", + "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -2628,6 +6024,16 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT" }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -2649,6 +6055,16 @@ ], "license": "MIT" }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -2672,14 +6088,126 @@ "node": ">=8.10.0" } }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.0", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -2711,28 +6239,7 @@ "dev": true, "license": "MIT", "dependencies": { - "@rollup/rollup-android-arm-eabi": "4.47.1", - "@rollup/rollup-android-arm64": "4.47.1", - "@rollup/rollup-darwin-arm64": "4.47.1", - "@rollup/rollup-darwin-x64": "4.47.1", - "@rollup/rollup-freebsd-arm64": "4.47.1", - "@rollup/rollup-freebsd-x64": "4.47.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.47.1", - "@rollup/rollup-linux-arm-musleabihf": "4.47.1", - "@rollup/rollup-linux-arm64-gnu": "4.47.1", - "@rollup/rollup-linux-arm64-musl": "4.47.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.47.1", - "@rollup/rollup-linux-ppc64-gnu": "4.47.1", - "@rollup/rollup-linux-riscv64-gnu": "4.47.1", - "@rollup/rollup-linux-riscv64-musl": "4.47.1", - "@rollup/rollup-linux-s390x-gnu": "4.47.1", - "@rollup/rollup-linux-x64-gnu": "4.47.1", - "@rollup/rollup-linux-x64-musl": "4.47.1", - "@rollup/rollup-win32-arm64-msvc": "4.47.1", - "@rollup/rollup-win32-ia32-msvc": "4.47.1", - "@rollup/rollup-win32-x64-msvc": "4.47.1", - "@types/estree": "1.0.8", - "fsevents": "~2.3.2" + "@types/estree": "1.0.8" }, "bin": { "rollup": "dist/bin/rollup" @@ -2789,6 +6296,204 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2812,6 +6517,82 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -2825,6 +6606,23 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/simple-swizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/smob": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", + "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", + "dev": true, + "license": "MIT" + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -2855,6 +6653,28 @@ "source-map": "^0.6.0" } }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -2919,6 +6739,108 @@ "node": ">=8" } }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/strip-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", @@ -2959,6 +6881,16 @@ "node": ">=8" } }, + "node_modules/strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/sucrase": { "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", @@ -3033,6 +6965,35 @@ "node": ">=14.0.0" } }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/terser": { "version": "5.43.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", @@ -3082,6 +7043,54 @@ "node": ">=0.8" } }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -3095,6 +7104,16 @@ "node": ">=8.0" } }, + "node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -3102,10 +7121,206 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "funding": [ { @@ -3199,7 +7414,6 @@ "license": "MIT", "dependencies": { "esbuild": "^0.21.3", - "fsevents": "~2.3.3", "postcss": "^8.4.43", "rollup": "^4.20.0" }, @@ -3252,6 +7466,37 @@ } } }, + "node_modules/vite-plugin-pwa": { + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.20.5.tgz", + "integrity": "sha512-aweuI/6G6n4C5Inn0vwHumElU/UEpNuO+9iZzwPZGTCH87TeZ6YFMrEY6ZUBQdIHHlhTsbMDryFARcSuOdsz9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.6", + "pretty-bytes": "^6.1.1", + "tinyglobby": "^0.2.0", + "workbox-build": "^7.1.0", + "workbox-window": "^7.1.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vite-pwa/assets-generator": "^0.2.6", + "vite": "^3.1.0 || ^4.0.0 || ^5.0.0", + "workbox-build": "^7.1.0", + "workbox-window": "^7.1.0" + }, + "peerDependenciesMeta": { + "@vite-pwa/assets-generator": { + "optional": true + } + } + }, "node_modules/vue": { "version": "3.5.19", "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.19.tgz", @@ -3323,6 +7568,25 @@ "vue": "^3.0.2" } }, + "node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3339,6 +7603,489 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/workbox-background-sync": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.3.0.tgz", + "integrity": "sha512-PCSk3eK7Mxeuyatb22pcSx9dlgWNv3+M8PqPaYDokks8Y5/FX4soaOqj3yhAZr5k6Q5JWTOMYgaJBpbw11G9Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-broadcast-update": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.3.0.tgz", + "integrity": "sha512-T9/F5VEdJVhwmrIAE+E/kq5at2OY6+OXXgOWQevnubal6sO92Gjo24v6dCVwQiclAF5NS3hlmsifRrpQzZCdUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-build": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-7.3.0.tgz", + "integrity": "sha512-JGL6vZTPlxnlqZRhR/K/msqg3wKP+m0wfEUVosK7gsYzSgeIxvZLi1ViJJzVL7CEeI8r7rGFV973RiEqkP3lWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.24.4", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-replace": "^2.4.1", + "@rollup/plugin-terser": "^0.4.3", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "7.3.0", + "workbox-broadcast-update": "7.3.0", + "workbox-cacheable-response": "7.3.0", + "workbox-core": "7.3.0", + "workbox-expiration": "7.3.0", + "workbox-google-analytics": "7.3.0", + "workbox-navigation-preload": "7.3.0", + "workbox-precaching": "7.3.0", + "workbox-range-requests": "7.3.0", + "workbox-recipes": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0", + "workbox-streams": "7.3.0", + "workbox-sw": "7.3.0", + "workbox-window": "7.3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/workbox-build/node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } + } + }, + "node_modules/workbox-build/node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/workbox-build/node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/workbox-build/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/workbox-build/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/workbox-build/node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true, + "license": "MIT" + }, + "node_modules/workbox-build/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/workbox-build/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/workbox-build/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/workbox-build/node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/workbox-build/node_modules/rollup": { + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + "dev": true, + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/workbox-build/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "deprecated": "The work that was done in this beta branch won't be included in future versions", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/workbox-build/node_modules/workbox-window": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.3.0.tgz", + "integrity": "sha512-qW8PDy16OV1UBaUNGlTVcepzrlzyzNW/ZJvFQQs2j2TzGsg6IKjcpZC1RSquqQnTOafl5pCj5bGfAHlCjOOjdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-cacheable-response": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.3.0.tgz", + "integrity": "sha512-eAFERIg6J2LuyELhLlmeRcJFa5e16Mj8kL2yCDbhWE+HUun9skRQrGIFVUagqWj4DMaaPSMWfAolM7XZZxNmxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-core": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.3.0.tgz", + "integrity": "sha512-Z+mYrErfh4t3zi7NVTvOuACB0A/jA3bgxUN3PwtAVHvfEsZxV9Iju580VEETug3zYJRc0Dmii/aixI/Uxj8fmw==", + "dev": true, + "license": "MIT" + }, + "node_modules/workbox-expiration": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.3.0.tgz", + "integrity": "sha512-lpnSSLp2BM+K6bgFCWc5bS1LR5pAwDWbcKt1iL87/eTSJRdLdAwGQznZE+1czLgn/X05YChsrEegTNxjM067vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-google-analytics": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.3.0.tgz", + "integrity": "sha512-ii/tSfFdhjLHZ2BrYgFNTrb/yk04pw2hasgbM70jpZfLk0vdJAXgaiMAWsoE+wfJDNWoZmBYY0hMVI0v5wWDbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-background-sync": "7.3.0", + "workbox-core": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0" + } + }, + "node_modules/workbox-navigation-preload": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.3.0.tgz", + "integrity": "sha512-fTJzogmFaTv4bShZ6aA7Bfj4Cewaq5rp30qcxl2iYM45YD79rKIhvzNHiFj1P+u5ZZldroqhASXwwoyusnr2cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-precaching": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.3.0.tgz", + "integrity": "sha512-ckp/3t0msgXclVAYaNndAGeAoWQUv7Rwc4fdhWL69CCAb2UHo3Cef0KIUctqfQj1p8h6aGyz3w8Cy3Ihq9OmIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0" + } + }, + "node_modules/workbox-range-requests": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.3.0.tgz", + "integrity": "sha512-EyFmM1KpDzzAouNF3+EWa15yDEenwxoeXu9bgxOEYnFfCxns7eAxA9WSSaVd8kujFFt3eIbShNqa4hLQNFvmVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-recipes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.3.0.tgz", + "integrity": "sha512-BJro/MpuW35I/zjZQBcoxsctgeB+kyb2JAP5EB3EYzePg8wDGoQuUdyYQS+CheTb+GhqJeWmVs3QxLI8EBP1sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-cacheable-response": "7.3.0", + "workbox-core": "7.3.0", + "workbox-expiration": "7.3.0", + "workbox-precaching": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0" + } + }, + "node_modules/workbox-routing": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.3.0.tgz", + "integrity": "sha512-ZUlysUVn5ZUzMOmQN3bqu+gK98vNfgX/gSTZ127izJg/pMMy4LryAthnYtjuqcjkN4HEAx1mdgxNiKJMZQM76A==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-strategies": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.3.0.tgz", + "integrity": "sha512-tmZydug+qzDFATwX7QiEL5Hdf7FrkhjaF9db1CbB39sDmEZJg3l9ayDvPxy8Y18C3Y66Nrr9kkN1f/RlkDgllg==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-streams": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.3.0.tgz", + "integrity": "sha512-SZnXucyg8x2Y61VGtDjKPO5EgPUG5NDn/v86WYHX+9ZqvAsGOytP0Jxp1bl663YUuMoXSAtsGLL+byHzEuMRpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.3.0", + "workbox-routing": "7.3.0" + } + }, + "node_modules/workbox-sw": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.3.0.tgz", + "integrity": "sha512-aCUyoAZU9IZtH05mn0ACUpyHzPs0lMeJimAYkQkBsOWiqaJLgusfDCR+yllkPkFRxWpZKF8vSvgHYeG7LwhlmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/workbox-window": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.4.0.tgz", + "integrity": "sha512-/bIYdBLAVsNR3v7gYGaV4pQW3M3kEPx5E8vDxGvxo6khTrGtSSCS7QiFKv9ogzBgZiy0OXLP9zO28U/1nF1mfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "7.4.0" + } + }, + "node_modules/workbox-window/node_modules/workbox-core": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.4.0.tgz", + "integrity": "sha512-6BMfd8tYEnN4baG4emG9U0hdXM4gGuDU3ectXuVHnj71vwxTFI7WOpQJC4siTOlVtGqCUtj0ZQNsrvi6kZZTAQ==", + "dev": true, + "license": "MIT" + }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -3437,6 +8184,20 @@ "node": ">=8" } }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, "node_modules/yaml": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", @@ -3458,22 +8219,941 @@ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", "dev": true }, + "@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "dev": true, + "requires": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + } + }, + "@babel/code-frame": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + } + }, + "@babel/compat-data": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", + "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", + "dev": true + }, + "@babel/core": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", + "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + } + }, + "@babel/generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", + "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", + "dev": true, + "requires": { + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "requires": { + "@babel/types": "^7.27.3" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.6", + "semver": "^6.3.1" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.6.tgz", + "integrity": "sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "debug": "^4.4.3", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.11" + } + }, + "@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "dev": true, + "requires": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "requires": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dev": true, + "requires": { + "@babel/types": "^7.27.1" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + } + }, + "@babel/helper-replace-supers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.28.6" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dev": true, + "requires": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + } + }, "@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==" }, "@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==" + }, + "@babel/helper-validator-option": { "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==" + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.6.tgz", + "integrity": "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==", + "dev": true, + "requires": { + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + } + }, + "@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "requires": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + } }, "@babel/parser": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", - "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", "requires": { - "@babel/types": "^7.28.2" + "@babel/types": "^7.28.6" + } + }, + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + } + }, + "@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + } + }, + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", + "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/traverse": "^7.28.6" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "requires": {} + }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", + "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.28.6" + } + }, + "@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.28.6" + } + }, + "@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-async-generator-functions": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.6.tgz", + "integrity": "sha512-9knsChgsMzBV5Yh3kkhrZNxH3oCYAfMBkNNaVN4cP2RVlFPe8wYdwwcnOsAbkdDoV9UjFtOXWrWB52M8W4jNeA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.6" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", + "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-remap-async-to-generator": "^7.27.1" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", + "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.28.6" + } + }, + "@babel/plugin-transform-class-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", + "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + } + }, + "@babel/plugin-transform-class-static-block": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", + "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", + "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/traverse": "^7.28.6" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", + "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/template": "^7.28.6" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", + "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.28.6.tgz", + "integrity": "sha512-5suVoXjC14lUN6ZL9OLKIHCNVWCrqGqlmEp/ixdXjvgnEl/kauLvvMO/Xw9NyMc95Joj1AeLVPVMvibBgSoFlA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + } + }, + "@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", + "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", + "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.28.6" + } + }, + "@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + } + }, + "@babel/plugin-transform-json-strings": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", + "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.28.6" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-logical-assignment-operators": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", + "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.28.6" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", + "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", + "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.5" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", + "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.28.6" + } + }, + "@babel/plugin-transform-numeric-separator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", + "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.28.6" + } + }, + "@babel/plugin-transform-object-rest-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", + "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.6" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + } + }, + "@babel/plugin-transform-optional-catch-binding": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", + "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.28.6" + } + }, + "@babel/plugin-transform-optional-chaining": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", + "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-private-methods": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", + "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + } + }, + "@babel/plugin-transform-private-property-in-object": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", + "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.6.tgz", + "integrity": "sha512-eZhoEZHYQLL5uc1gS5e9/oTknS0sSSAtd5TkKMUp3J+S/CaUjagc0kOUPsEbDmMeva0nC3WWl4SxVY6+OBuxfw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.28.6" + } + }, + "@babel/plugin-transform-regexp-modifiers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", + "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", + "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-unicode-property-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", + "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + } + }, + "@babel/plugin-transform-unicode-sets-regex": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", + "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.28.6" + } + }, + "@babel/preset-env": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.6.tgz", + "integrity": "sha512-GaTI4nXDrs7l0qaJ6Rg06dtOXTBCG6TMDB44zbqofCIC4PqC7SEvmFFtpxzCDw9W5aJ7RKVshgXTLvLdBFV/qw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.28.6", + "@babel/plugin-syntax-import-attributes": "^7.28.6", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.6", + "@babel/plugin-transform-async-to-generator": "^7.28.6", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.6", + "@babel/plugin-transform-class-properties": "^7.28.6", + "@babel/plugin-transform-class-static-block": "^7.28.6", + "@babel/plugin-transform-classes": "^7.28.6", + "@babel/plugin-transform-computed-properties": "^7.28.6", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-dotall-regex": "^7.28.6", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.28.6", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.6", + "@babel/plugin-transform-exponentiation-operator": "^7.28.6", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.28.6", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.28.6", + "@babel/plugin-transform-modules-systemjs": "^7.28.5", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", + "@babel/plugin-transform-numeric-separator": "^7.28.6", + "@babel/plugin-transform-object-rest-spread": "^7.28.6", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.28.6", + "@babel/plugin-transform-optional-chaining": "^7.28.6", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.28.6", + "@babel/plugin-transform-private-property-in-object": "^7.28.6", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.6", + "@babel/plugin-transform-regexp-modifiers": "^7.28.6", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.28.6", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.28.6", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", + "semver": "^6.3.1" + } + }, + "@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" } }, "@babel/runtime": { @@ -3481,13 +9161,49 @@ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==" }, + "@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + } + }, + "@babel/traverse": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", + "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6", + "debug": "^4.3.1" + } + }, "@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", "requires": { "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-validator-identifier": "^7.28.5" + } + }, + "@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.4.0" } }, "@esbuild/aix-ppc64": { @@ -3651,6 +9367,166 @@ "dev": true, "optional": true }, + "@img/sharp-darwin-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", + "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "dev": true, + "optional": true, + "requires": { + "@img/sharp-libvips-darwin-arm64": "1.0.4" + } + }, + "@img/sharp-darwin-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", + "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "dev": true, + "optional": true, + "requires": { + "@img/sharp-libvips-darwin-x64": "1.0.4" + } + }, + "@img/sharp-libvips-darwin-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", + "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "dev": true, + "optional": true + }, + "@img/sharp-libvips-darwin-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", + "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "dev": true, + "optional": true + }, + "@img/sharp-libvips-linux-arm": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", + "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "dev": true, + "optional": true + }, + "@img/sharp-libvips-linux-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", + "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "dev": true, + "optional": true + }, + "@img/sharp-libvips-linux-s390x": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", + "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "dev": true, + "optional": true + }, + "@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "dev": true, + "optional": true + }, + "@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", + "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "dev": true, + "optional": true + }, + "@img/sharp-libvips-linuxmusl-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", + "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "dev": true, + "optional": true + }, + "@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", + "dev": true, + "optional": true, + "requires": { + "@img/sharp-libvips-linux-arm": "1.0.5" + } + }, + "@img/sharp-linux-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", + "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "dev": true, + "optional": true, + "requires": { + "@img/sharp-libvips-linux-arm64": "1.0.4" + } + }, + "@img/sharp-linux-s390x": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", + "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "dev": true, + "optional": true, + "requires": { + "@img/sharp-libvips-linux-s390x": "1.0.4" + } + }, + "@img/sharp-linux-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", + "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "dev": true, + "optional": true, + "requires": { + "@img/sharp-libvips-linux-x64": "1.0.4" + } + }, + "@img/sharp-linuxmusl-arm64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", + "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "dev": true, + "optional": true, + "requires": { + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + } + }, + "@img/sharp-linuxmusl-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", + "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "dev": true, + "optional": true, + "requires": { + "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + } + }, + "@img/sharp-wasm32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", + "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "dev": true, + "optional": true, + "requires": { + "@emnapi/runtime": "^1.2.0" + } + }, + "@img/sharp-win32-ia32": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", + "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "dev": true, + "optional": true + }, + "@img/sharp-win32-x64": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", + "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "dev": true, + "optional": true + }, "@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -3675,6 +9551,16 @@ "@jridgewell/trace-mapping": "^0.3.24" } }, + "@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -3739,6 +9625,49 @@ "dev": true, "optional": true }, + "@rollup/plugin-node-resolve": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", + "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + } + }, + "@rollup/plugin-terser": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", + "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", + "dev": true, + "requires": { + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" + } + }, + "@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "dev": true, + "requires": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "dependencies": { + "picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true + } + } + }, "@rollup/rollup-android-arm-eabi": { "version": "4.47.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.47.1.tgz", @@ -3879,12 +9808,47 @@ "dev": true, "optional": true }, + "@surma/rollup-plugin-off-main-thread": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", + "dev": true, + "requires": { + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" + }, + "dependencies": { + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + } + } + }, "@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true }, + "@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true + }, + "@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "dev": true + }, "@types/web-bluetooth": { "version": "0.0.20", "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", @@ -4070,6 +10034,18 @@ "pkcs7": "^1.0.4" } }, + "ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + } + }, "ansi-regex": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", @@ -4104,11 +10080,54 @@ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "dev": true }, + "array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "requires": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + } + }, + "arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + } + }, + "async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true + }, + "async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, "autoprefixer": { "version": "10.4.21", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", @@ -4123,6 +10142,15 @@ "postcss-value-parser": "^4.2.0" } }, + "available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "requires": { + "possible-typed-array-names": "^1.0.0" + } + }, "axios": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", @@ -4133,12 +10161,48 @@ "proxy-from-env": "^1.1.0" } }, + "babel-plugin-polyfill-corejs2": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.15.tgz", + "integrity": "sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.6", + "semver": "^6.3.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.6.tgz", + "integrity": "sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.6.6" + } + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "baseline-browser-mapping": { + "version": "2.9.18", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.18.tgz", + "integrity": "sha512-e23vBV1ZLfjb9apvfPk4rHVu2ry6RIr2Wfs+O324okSidrX7pTAnEJPCh/O5BtRlr7QtZI7ktOP3vsqr7Z5XoA==", + "dev": true + }, "binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -4164,15 +10228,16 @@ } }, "browserslist": { - "version": "4.25.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.3.tgz", - "integrity": "sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001735", - "electron-to-chromium": "^1.5.204", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" } }, "buffer-from": { @@ -4181,6 +10246,18 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "requires": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + } + }, "call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -4190,6 +10267,16 @@ "function-bind": "^1.1.2" } }, + "call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "requires": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + } + }, "camelcase-css": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", @@ -4197,9 +10284,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001736", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001736.tgz", - "integrity": "sha512-ImpN5gLEY8gWeqfLUyEF4b7mYWcYoR2Si1VhnrbM4JizRFmfGaAQ12PhNykq6nvI4XvKLrsp8Xde74D5phJOSw==", + "version": "1.0.30001766", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", + "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==", "dev": true }, "chokidar": { @@ -4229,6 +10316,16 @@ } } }, + "color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dev": true, + "requires": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + } + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -4244,6 +10341,16 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -4258,6 +10365,33 @@ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true }, + "common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "core-js-compat": { + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.48.0.tgz", + "integrity": "sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==", + "dev": true, + "requires": { + "browserslist": "^4.28.1" + } + }, "cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -4269,6 +10403,12 @@ "which": "^2.0.1" } }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true + }, "cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -4280,6 +10420,39 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, + "data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "requires": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + } + }, + "data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "requires": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + } + }, + "data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + } + }, "date-fns": { "version": "2.30.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", @@ -4294,11 +10467,54 @@ "integrity": "sha512-OAtcLdB9vxSXTWHdT8b398ARImVwQMyjfYGkKD2zaGpHseG2UPHbHjXELReErZFxWdSLph3c2zOaaTyHfOhERQ==", "requires": {} }, + "debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, + "deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true + }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, + "define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "requires": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, + "detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true + }, "didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -4332,10 +10548,19 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, + "ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "requires": { + "jake": "^10.8.5" + } + }, "electron-to-chromium": { - "version": "1.5.208", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.208.tgz", - "integrity": "sha512-ozZyibehoe7tOhNaf16lKmljVf+3npZcJIEbJRVftVsmAg5TeA1mGS9dVCZzOwr2xT7xK15V0p7+GZqSPgkuPg==", + "version": "1.5.278", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.278.tgz", + "integrity": "sha512-dQ0tM1svDRQOwxnXxm+twlGTjr9Upvt8UFWAgmLsxEzFQxhbti4VwxmMjsDxVC51Zo84swW7FVCXEV+VAkhuPw==", "dev": true }, "emoji-regex": { @@ -4349,6 +10574,68 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" }, + "es-abstract": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", + "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + } + }, "es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -4378,6 +10665,17 @@ "hasown": "^2.0.2" } }, + "es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "requires": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + } + }, "esbuild": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", @@ -4420,6 +10718,18 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, "fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", @@ -4444,6 +10754,18 @@ } } }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true + }, "fastq": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", @@ -4453,6 +10775,26 @@ "reusify": "^1.0.4" } }, + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -4467,6 +10809,15 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==" }, + "for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "requires": { + "is-callable": "^1.2.7" + } + }, "foreground-child": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", @@ -4495,6 +10846,24 @@ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, "fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -4507,6 +10876,38 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, + "function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, + "generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, "get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -4524,6 +10925,12 @@ "math-intrinsics": "^1.1.0" } }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "dev": true + }, "get-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", @@ -4533,6 +10940,17 @@ "es-object-atoms": "^1.0.0" } }, + "get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "requires": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + } + }, "glob": { "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", @@ -4565,11 +10983,51 @@ "process": "^0.11.10" } }, + "globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "requires": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + } + }, "gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true + }, + "has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0" + } + }, + "has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "requires": { + "dunder-proto": "^1.0.0" + } + }, "has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -4591,6 +11049,78 @@ "function-bind": "^1.1.2" } }, + "idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + } + }, + "is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "requires": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + } + }, + "is-arrayish": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", + "dev": true + }, + "is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "requires": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + } + }, + "is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "requires": { + "has-bigints": "^1.0.2" + } + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -4600,6 +11130,22 @@ "binary-extensions": "^2.0.0" } }, + "is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "requires": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, "is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", @@ -4609,12 +11155,42 @@ "hasown": "^2.0.2" } }, + "is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "requires": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + } + }, + "is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "requires": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + } + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true }, + "is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "requires": { + "call-bound": "^1.0.3" + } + }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -4626,6 +11202,19 @@ "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" }, + "is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "requires": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + } + }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -4635,12 +11224,146 @@ "is-extglob": "^2.1.1" } }, + "is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "requires": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "dev": true + }, + "is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "requires": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "dev": true + }, + "is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true + }, + "is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "requires": { + "call-bound": "^1.0.3" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "requires": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + } + }, + "is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "requires": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + } + }, + "is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "requires": { + "which-typed-array": "^1.1.16" + } + }, + "is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true + }, + "is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "requires": { + "call-bound": "^1.0.3" + } + }, + "is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "requires": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + } + }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -4657,12 +11380,75 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "jake": { + "version": "10.9.4", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", + "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", + "dev": true, + "requires": { + "async": "^3.2.6", + "filelist": "^1.0.4", + "picocolors": "^1.1.1" + } + }, "jiti": { "version": "1.21.7", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "dev": true }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "dev": true + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, "lilconfig": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", @@ -4675,6 +11461,24 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true + }, "lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", @@ -4773,6 +11577,12 @@ "global": "^4.4.0" } }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, "mux.js": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/mux.js/-/mux.js-7.1.0.tgz", @@ -4799,9 +11609,9 @@ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==" }, "node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", "dev": true }, "normalize-path": { @@ -4828,12 +11638,64 @@ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", "dev": true }, + "object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "requires": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + } + }, "package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "dev": true }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -4896,6 +11758,12 @@ "@babel/runtime": "^7.5.5" } }, + "possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true + }, "postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", @@ -4961,6 +11829,12 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "pretty-bytes": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", + "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", + "dev": true + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -4971,12 +11845,27 @@ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, + "punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true + }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, "read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -4995,13 +11884,93 @@ "picomatch": "^2.2.1" } }, - "resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, "requires": { - "is-core-module": "^2.16.0", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, + "regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "requires": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + } + }, + "regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "dev": true, + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + } + }, + "regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true + }, + "regjsparser": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "dev": true, + "requires": { + "jsesc": "~3.1.0" + } + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "requires": { + "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -5051,6 +12020,136 @@ "queue-microtask": "^1.2.2" } }, + "safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + } + }, + "safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + }, + "serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, + "set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + } + }, + "set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "requires": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + } + }, + "sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "dev": true, + "requires": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5", + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" + }, + "dependencies": { + "semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true + } + } + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -5066,12 +12165,75 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + } + }, + "side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + } + }, + "side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + } + }, + "side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + } + }, "signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true }, + "simple-swizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + } + }, + "smob": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", + "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -5093,6 +12255,22 @@ "source-map": "^0.6.0" } }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + } + }, "string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -5138,6 +12316,76 @@ } } }, + "string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "requires": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + } + }, + "string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "requires": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + } + }, + "string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + } + }, + "string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dev": true, + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + } + }, "strip-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", @@ -5164,6 +12412,12 @@ } } }, + "strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "dev": true + }, "sucrase": { "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", @@ -5215,6 +12469,24 @@ "sucrase": "^3.35.0" } }, + "temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "dev": true + }, + "tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + } + }, "terser": { "version": "5.43.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", @@ -5253,6 +12525,31 @@ "thenify": ">= 3.1.0 < 4" } }, + "tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "requires": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "dependencies": { + "fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "requires": {} + }, + "picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true + } + } + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -5262,16 +12559,152 @@ "is-number": "^7.0.0" } }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, "ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "dev": true }, + "tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "optional": true + }, + "type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "dev": true + }, + "typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "requires": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + } + }, + "typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "requires": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + } + }, + "typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + } + }, + "typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + } + }, + "unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "requires": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "dev": true + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, "update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "dev": true, "requires": { "escalade": "^3.2.0", @@ -5336,6 +12769,19 @@ "rollup": "^4.20.0" } }, + "vite-plugin-pwa": { + "version": "0.20.5", + "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-0.20.5.tgz", + "integrity": "sha512-aweuI/6G6n4C5Inn0vwHumElU/UEpNuO+9iZzwPZGTCH87TeZ6YFMrEY6ZUBQdIHHlhTsbMDryFARcSuOdsz9Q==", + "dev": true, + "requires": { + "debug": "^4.3.6", + "pretty-bytes": "^6.1.1", + "tinyglobby": "^0.2.0", + "workbox-build": "^7.1.0", + "workbox-window": "^7.1.0" + } + }, "vue": { "version": "3.5.19", "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.19.tgz", @@ -5368,6 +12814,23 @@ "integrity": "sha512-q73e5jy6gucEO/U+P48hqX+/qyXDozAGmaGgLFm5tXX4wJBcVsnGp4e/iJqlm9xzHETYOilUuwOUje2Qg1JdwA==", "requires": {} }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -5377,6 +12840,384 @@ "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "requires": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + } + }, + "which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "requires": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + } + }, + "which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "requires": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + } + }, + "which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + } + }, + "workbox-background-sync": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.3.0.tgz", + "integrity": "sha512-PCSk3eK7Mxeuyatb22pcSx9dlgWNv3+M8PqPaYDokks8Y5/FX4soaOqj3yhAZr5k6Q5JWTOMYgaJBpbw11G9Eg==", + "dev": true, + "requires": { + "idb": "^7.0.1", + "workbox-core": "7.3.0" + } + }, + "workbox-broadcast-update": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.3.0.tgz", + "integrity": "sha512-T9/F5VEdJVhwmrIAE+E/kq5at2OY6+OXXgOWQevnubal6sO92Gjo24v6dCVwQiclAF5NS3hlmsifRrpQzZCdUA==", + "dev": true, + "requires": { + "workbox-core": "7.3.0" + } + }, + "workbox-build": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-7.3.0.tgz", + "integrity": "sha512-JGL6vZTPlxnlqZRhR/K/msqg3wKP+m0wfEUVosK7gsYzSgeIxvZLi1ViJJzVL7CEeI8r7rGFV973RiEqkP3lWQ==", + "dev": true, + "requires": { + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.24.4", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-replace": "^2.4.1", + "@rollup/plugin-terser": "^0.4.3", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "7.3.0", + "workbox-broadcast-update": "7.3.0", + "workbox-cacheable-response": "7.3.0", + "workbox-core": "7.3.0", + "workbox-expiration": "7.3.0", + "workbox-google-analytics": "7.3.0", + "workbox-navigation-preload": "7.3.0", + "workbox-precaching": "7.3.0", + "workbox-range-requests": "7.3.0", + "workbox-recipes": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0", + "workbox-streams": "7.3.0", + "workbox-sw": "7.3.0", + "workbox-window": "7.3.0" + }, + "dependencies": { + "@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + } + }, + "@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "dev": true, + "requires": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + } + }, + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + } + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true + }, + "rollup": { + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, + "requires": { + "whatwg-url": "^7.0.0" + } + }, + "workbox-window": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.3.0.tgz", + "integrity": "sha512-qW8PDy16OV1UBaUNGlTVcepzrlzyzNW/ZJvFQQs2j2TzGsg6IKjcpZC1RSquqQnTOafl5pCj5bGfAHlCjOOjdA==", + "dev": true, + "requires": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "7.3.0" + } + } + } + }, + "workbox-cacheable-response": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.3.0.tgz", + "integrity": "sha512-eAFERIg6J2LuyELhLlmeRcJFa5e16Mj8kL2yCDbhWE+HUun9skRQrGIFVUagqWj4DMaaPSMWfAolM7XZZxNmxA==", + "dev": true, + "requires": { + "workbox-core": "7.3.0" + } + }, + "workbox-core": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.3.0.tgz", + "integrity": "sha512-Z+mYrErfh4t3zi7NVTvOuACB0A/jA3bgxUN3PwtAVHvfEsZxV9Iju580VEETug3zYJRc0Dmii/aixI/Uxj8fmw==", + "dev": true + }, + "workbox-expiration": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.3.0.tgz", + "integrity": "sha512-lpnSSLp2BM+K6bgFCWc5bS1LR5pAwDWbcKt1iL87/eTSJRdLdAwGQznZE+1czLgn/X05YChsrEegTNxjM067vQ==", + "dev": true, + "requires": { + "idb": "^7.0.1", + "workbox-core": "7.3.0" + } + }, + "workbox-google-analytics": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.3.0.tgz", + "integrity": "sha512-ii/tSfFdhjLHZ2BrYgFNTrb/yk04pw2hasgbM70jpZfLk0vdJAXgaiMAWsoE+wfJDNWoZmBYY0hMVI0v5wWDbg==", + "dev": true, + "requires": { + "workbox-background-sync": "7.3.0", + "workbox-core": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0" + } + }, + "workbox-navigation-preload": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.3.0.tgz", + "integrity": "sha512-fTJzogmFaTv4bShZ6aA7Bfj4Cewaq5rp30qcxl2iYM45YD79rKIhvzNHiFj1P+u5ZZldroqhASXwwoyusnr2cg==", + "dev": true, + "requires": { + "workbox-core": "7.3.0" + } + }, + "workbox-precaching": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.3.0.tgz", + "integrity": "sha512-ckp/3t0msgXclVAYaNndAGeAoWQUv7Rwc4fdhWL69CCAb2UHo3Cef0KIUctqfQj1p8h6aGyz3w8Cy3Ihq9OmIw==", + "dev": true, + "requires": { + "workbox-core": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0" + } + }, + "workbox-range-requests": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.3.0.tgz", + "integrity": "sha512-EyFmM1KpDzzAouNF3+EWa15yDEenwxoeXu9bgxOEYnFfCxns7eAxA9WSSaVd8kujFFt3eIbShNqa4hLQNFvmVQ==", + "dev": true, + "requires": { + "workbox-core": "7.3.0" + } + }, + "workbox-recipes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.3.0.tgz", + "integrity": "sha512-BJro/MpuW35I/zjZQBcoxsctgeB+kyb2JAP5EB3EYzePg8wDGoQuUdyYQS+CheTb+GhqJeWmVs3QxLI8EBP1sg==", + "dev": true, + "requires": { + "workbox-cacheable-response": "7.3.0", + "workbox-core": "7.3.0", + "workbox-expiration": "7.3.0", + "workbox-precaching": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0" + } + }, + "workbox-routing": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.3.0.tgz", + "integrity": "sha512-ZUlysUVn5ZUzMOmQN3bqu+gK98vNfgX/gSTZ127izJg/pMMy4LryAthnYtjuqcjkN4HEAx1mdgxNiKJMZQM76A==", + "dev": true, + "requires": { + "workbox-core": "7.3.0" + } + }, + "workbox-strategies": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.3.0.tgz", + "integrity": "sha512-tmZydug+qzDFATwX7QiEL5Hdf7FrkhjaF9db1CbB39sDmEZJg3l9ayDvPxy8Y18C3Y66Nrr9kkN1f/RlkDgllg==", + "dev": true, + "requires": { + "workbox-core": "7.3.0" + } + }, + "workbox-streams": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.3.0.tgz", + "integrity": "sha512-SZnXucyg8x2Y61VGtDjKPO5EgPUG5NDn/v86WYHX+9ZqvAsGOytP0Jxp1bl663YUuMoXSAtsGLL+byHzEuMRpw==", + "dev": true, + "requires": { + "workbox-core": "7.3.0", + "workbox-routing": "7.3.0" + } + }, + "workbox-sw": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-7.3.0.tgz", + "integrity": "sha512-aCUyoAZU9IZtH05mn0ACUpyHzPs0lMeJimAYkQkBsOWiqaJLgusfDCR+yllkPkFRxWpZKF8vSvgHYeG7LwhlmA==", + "dev": true + }, + "workbox-window": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-7.4.0.tgz", + "integrity": "sha512-/bIYdBLAVsNR3v7gYGaV4pQW3M3kEPx5E8vDxGvxo6khTrGtSSCS7QiFKv9ogzBgZiy0OXLP9zO28U/1nF1mfw==", + "dev": true, + "requires": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "7.4.0" + }, + "dependencies": { + "workbox-core": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.4.0.tgz", + "integrity": "sha512-6BMfd8tYEnN4baG4emG9U0hdXM4gGuDU3ectXuVHnj71vwxTFI7WOpQJC4siTOlVtGqCUtj0ZQNsrvi6kZZTAQ==", + "dev": true + } + } + }, "wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -5442,6 +13283,18 @@ } } }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, "yaml": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", diff --git a/frontend/package.json b/frontend/package.json index c440b89..fac2965 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -5,7 +5,8 @@ "scripts": { "dev": "vite", "build": "vite build", - "preview": "vite preview" + "preview": "vite preview", + "generate-icons": "node scripts/generate-icons.js" }, "dependencies": { "@vueuse/core": "^10.6.1", @@ -23,8 +24,10 @@ "@vitejs/plugin-vue": "^4.5.0", "autoprefixer": "^10.4.16", "postcss": "^8.4.31", + "sharp": "^0.33.5", "tailwindcss": "^3.3.5", "terser": "^5.43.1", - "vite": "^5.0.0" + "vite": "^5.0.0", + "vite-plugin-pwa": "^0.20.5" } } diff --git a/frontend/public/icon-128x128.png b/frontend/public/icon-128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..7394a54ba8c883a454d0d5251c79a95e301e776e GIT binary patch literal 6764 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 literal 0 HcmV?d00001 diff --git a/frontend/public/icon-144x144.png b/frontend/public/icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..78e93180d2120ed0e24add01eae10a74a0a4fbdf GIT binary patch literal 7717 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 literal 0 HcmV?d00001 diff --git a/frontend/public/icon-152x152.png b/frontend/public/icon-152x152.png new file mode 100644 index 0000000000000000000000000000000000000000..17a26d0011f5fafad1308336c920d686ff47ca55 GIT binary patch literal 8206 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 z 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 literal 0 HcmV?d00001 diff --git a/frontend/public/icon-512x512.png b/frontend/public/icon-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..3fa2f37a4614c41de92172c944bb450271514622 GIT binary patch literal 69254 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

}!OlX{L( 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 RQG@@n?W~+Ft8d(S{9hWXQuhD= literal 0 HcmV?d00001 diff --git a/frontend/public/icon-72x72.png b/frontend/public/icon-72x72.png new file mode 100644 index 0000000000000000000000000000000000000000..06f0d420a2ff7380d4cb6a9ca9760ffb4192634a GIT binary patch literal 3346 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 literal 0 HcmV?d00001 diff --git a/frontend/public/icon-96x96.png b/frontend/public/icon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..063c9528e138b1c6fc2aea52518b2332d8be8223 GIT binary patch literal 4493 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 +
+
+
+
+ + + +
+
+
+

+ Installer LeDiscord +

+

+ Installez l'application pour un accès rapide et une meilleure expérience. +

+
+ + +
+
+ +
+
+ + + + + + diff --git a/frontend/src/layouts/AuthLayout.vue b/frontend/src/layouts/AuthLayout.vue index f00515f..04bfd65 100644 --- a/frontend/src/layouts/AuthLayout.vue +++ b/frontend/src/layouts/AuthLayout.vue @@ -1,20 +1,20 @@ \ No newline at end of file diff --git a/frontend/src/services/notificationService.js b/frontend/src/services/notificationService.js new file mode 100644 index 0000000..83df873 --- /dev/null +++ b/frontend/src/services/notificationService.js @@ -0,0 +1,159 @@ +import { useAuthStore } from '@/stores/auth' + +class NotificationService { + constructor() { + this.pollingInterval = null + this.pollInterval = 30000 // 30 secondes + this.isPolling = false + } + + startPolling() { + if (this.isPolling) return + + const authStore = useAuthStore() + if (!authStore.isAuthenticated) return + + this.isPolling = true + + // Récupérer immédiatement + this.fetchNotifications() + + // Puis toutes les 30 secondes + this.pollingInterval = setInterval(() => { + this.fetchNotifications() + }, this.pollInterval) + } + + stopPolling() { + if (this.pollingInterval) { + clearInterval(this.pollingInterval) + this.pollingInterval = null + } + this.isPolling = false + } + + async fetchNotifications() { + const authStore = useAuthStore() + if (!authStore.isAuthenticated) { + this.stopPolling() + return + } + + try { + const result = await authStore.fetchNotifications() + + // Si de nouvelles notifications non lues ont été détectées + if (result && result.hasNewNotifications && result.newCount > result.previousCount) { + // Trouver les nouvelles notifications non lues (les plus récentes en premier) + const newUnreadNotifications = authStore.notifications + .filter(n => !n.is_read) + .sort((a, b) => new Date(b.created_at) - new Date(a.created_at)) + .slice(0, result.newCount - result.previousCount) + + if (newUnreadNotifications.length > 0) { + // Afficher une notification push pour la plus récente + const latestNotification = newUnreadNotifications[0] + await this.showPushNotification(latestNotification.title, { + body: latestNotification.message, + link: latestNotification.link || '/', + data: { notificationId: latestNotification.id } + }) + } + } + } catch (error) { + console.error('Error polling notifications:', error) + } + } + + showNotificationBadge() { + // Mettre à jour le badge du titre de la page + if ('Notification' in window && Notification.permission === 'granted') { + // La notification push sera gérée par le service worker + return + } + } + + // Gestion des notifications push PWA + async requestNotificationPermission() { + if (!('Notification' in window)) { + console.log('Ce navigateur ne supporte pas les notifications') + return false + } + + if (Notification.permission === 'granted') { + return true + } + + if (Notification.permission !== 'denied') { + const permission = await Notification.requestPermission() + return permission === 'granted' + } + + return false + } + + async showPushNotification(title, options = {}) { + if (!('Notification' in window)) return + + const hasPermission = await this.requestNotificationPermission() + if (!hasPermission) return + + // Si on est dans un service worker, utiliser la notification API du SW + if ('serviceWorker' in navigator) { + try { + const registration = await navigator.serviceWorker.ready + await registration.showNotification(title, { + icon: '/icon-192x192.png', + badge: '/icon-96x96.png', + tag: 'lediscord-notification', + requireInteraction: false, + vibrate: [200, 100, 200], + ...options + }) + return + } catch (error) { + console.error('Error showing notification via service worker:', error) + } + } + + // Fallback: notification native du navigateur + const notification = new Notification(title, { + icon: '/icon-192x192.png', + badge: '/icon-96x96.png', + tag: 'lediscord-notification', + requireInteraction: false, + ...options + }) + + notification.onclick = () => { + window.focus() + notification.close() + + if (options.link) { + window.location.href = options.link + } + } + + // Fermer automatiquement après 5 secondes + setTimeout(() => { + notification.close() + }, 5000) + + return notification + } + + // Écouter les messages du service worker pour les notifications push + setupServiceWorkerListener() { + if ('serviceWorker' in navigator) { + navigator.serviceWorker.addEventListener('message', (event) => { + if (event.data && event.data.type === 'NOTIFICATION') { + const { title, options } = event.data + this.showPushNotification(title, options) + } + }) + } + } +} + +export default new NotificationService() + diff --git a/frontend/src/stores/auth.js b/frontend/src/stores/auth.js index 110ec23..546e1dd 100644 --- a/frontend/src/stores/auth.js +++ b/frontend/src/stores/auth.js @@ -68,8 +68,15 @@ export const useAuthStore = defineStore('auth', () => { async function logout() { token.value = null user.value = null + notifications.value = [] + unreadCount.value = 0 localStorage.removeItem('token') delete axios.defaults.headers.common['Authorization'] + + // Arrêter le polling des notifications + const notificationService = (await import('@/services/notificationService')).default + notificationService.stopPolling() + router.push('/login') toast.info('Déconnexion réussie') } @@ -130,10 +137,36 @@ export const useAuthStore = defineStore('auth', () => { try { const response = await axios.get('/api/notifications?limit=50') - notifications.value = response.data - unreadCount.value = notifications.value.filter(n => !n.is_read).length + const newNotifications = response.data + + // Détecter les nouvelles notifications non lues + const previousIds = new Set(notifications.value.map(n => n.id)) + const previousUnreadIds = new Set( + notifications.value.filter(n => !n.is_read).map(n => n.id) + ) + + // Nouvelles notifications = celles qui n'existaient pas avant + const hasNewNotifications = newNotifications.some(n => !previousIds.has(n.id)) + + // Nouvelles notifications non lues = nouvelles ET non lues + const newUnreadNotifications = newNotifications.filter( + n => !previousIds.has(n.id) && !n.is_read + ) + + notifications.value = newNotifications + const newUnreadCount = notifications.value.filter(n => !n.is_read).length + const previousUnreadCount = unreadCount.value + unreadCount.value = newUnreadCount + + // Retourner si de nouvelles notifications non lues ont été détectées + return { + hasNewNotifications: newUnreadNotifications.length > 0, + newCount: newUnreadCount, + previousCount: previousUnreadCount + } } catch (error) { console.error('Error fetching notifications:', error) + return { hasNewNotifications: false, newCount: unreadCount.value, previousCount: unreadCount.value } } } diff --git a/frontend/src/views/Register.vue b/frontend/src/views/Register.vue index b3ce4cc..97f729a 100644 --- a/frontend/src/views/Register.vue +++ b/frontend/src/views/Register.vue @@ -1,144 +1,333 @@ diff --git a/frontend/vite.config.js b/frontend/vite.config.js index 056c285..ae7175d 100644 --- a/frontend/vite.config.js +++ b/frontend/vite.config.js @@ -2,6 +2,15 @@ const { defineConfig } = require('vite') const vue = require('@vitejs/plugin-vue') const path = require('path') +// Import conditionnel du plugin PWA +let VitePWA = null +try { + VitePWA = require('vite-plugin-pwa').VitePWA +} catch (e) { + console.warn('⚠️ vite-plugin-pwa n\'est pas installé. La fonctionnalité PWA sera désactivée.') + console.warn(' Installez-le avec: npm install --save-dev vite-plugin-pwa') +} + // Configuration par environnement const getEnvironmentConfig = (mode) => { const configs = { @@ -79,8 +88,163 @@ module.exports = defineConfig(({ command, mode }) => { VITE_APP_URL: process.env.VITE_APP_URL }) + const plugins = [vue()] + + // Ajouter le plugin PWA seulement s'il est installé + if (VitePWA) { + plugins.push(VitePWA({ + registerType: 'autoUpdate', + includeAssets: ['favicon.ico', 'logo_lediscord.png'], + manifest: { + name: 'LeDiscord - Notre espace', + short_name: 'LeDiscord', + description: 'Plateforme communautaire LeDiscord', + theme_color: '#6366f1', + background_color: '#ffffff', + display: 'standalone', + orientation: 'portrait-primary', + scope: '/', + start_url: '/', + icons: [ + { + src: '/icon-72x72.png', + sizes: '72x72', + type: 'image/png', + purpose: 'any maskable' + }, + { + src: '/icon-96x96.png', + sizes: '96x96', + type: 'image/png', + purpose: 'any maskable' + }, + { + src: '/icon-128x128.png', + sizes: '128x128', + type: 'image/png', + purpose: 'any maskable' + }, + { + src: '/icon-144x144.png', + sizes: '144x144', + type: 'image/png', + purpose: 'any maskable' + }, + { + src: '/icon-152x152.png', + sizes: '152x152', + type: 'image/png', + purpose: 'any maskable' + }, + { + src: '/icon-192x192.png', + sizes: '192x192', + type: 'image/png', + purpose: 'any maskable' + }, + { + src: '/icon-384x384.png', + sizes: '384x384', + type: 'image/png', + purpose: 'any maskable' + }, + { + src: '/icon-512x512.png', + sizes: '512x512', + type: 'image/png', + purpose: 'any maskable' + } + ], + shortcuts: [ + { + name: 'Vlogs', + short_name: 'Vlogs', + description: 'Voir les vlogs', + url: '/vlogs', + icons: [{ src: '/icon-96x96.png', sizes: '96x96' }] + }, + { + name: 'Albums', + short_name: 'Albums', + description: 'Voir les albums', + url: '/albums', + icons: [{ src: '/icon-96x96.png', sizes: '96x96' }] + } + ], + categories: ['social', 'entertainment'] + }, + workbox: { + globPatterns: ['**/*.{js,css,html,ico,png,svg,jpg,jpeg,webp,mp4}'], + // Notifications push + navigateFallback: null, + skipWaiting: true, + clientsClaim: true, + runtimeCaching: [ + { + urlPattern: /^https:\/\/fonts\.googleapis\.com\/.*/i, + handler: 'CacheFirst', + options: { + cacheName: 'google-fonts-cache', + expiration: { + maxEntries: 10, + maxAgeSeconds: 60 * 60 * 24 * 365 // 1 year + }, + cacheableResponse: { + statuses: [0, 200] + } + } + }, + { + urlPattern: /^https:\/\/fonts\.gstatic\.com\/.*/i, + handler: 'CacheFirst', + options: { + cacheName: 'gstatic-fonts-cache', + expiration: { + maxEntries: 10, + maxAgeSeconds: 60 * 60 * 24 * 365 // 1 year + }, + cacheableResponse: { + statuses: [0, 200] + } + } + }, + { + urlPattern: /^https?:\/\/.*\/api\/.*/i, + handler: 'NetworkFirst', + options: { + cacheName: 'api-cache', + expiration: { + maxEntries: 50, + maxAgeSeconds: 60 * 5 // 5 minutes + }, + networkTimeoutSeconds: 10 + } + }, + { + urlPattern: /^https?:\/\/.*\/uploads\/.*/i, + handler: 'CacheFirst', + options: { + cacheName: 'uploads-cache', + expiration: { + maxEntries: 100, + maxAgeSeconds: 60 * 60 * 24 * 7 // 7 days + }, + cacheableResponse: { + statuses: [0, 200] + } + } + } + ] + }, + devOptions: { + enabled: true, + type: 'module' + } + })) + } + return { - plugins: [vue()], + plugins, resolve: { alias: { '@': path.resolve(__dirname, './src')