diff --git a/website/package-lock.json b/website/package-lock.json
index 17bc039..2b8bb60 100644
--- a/website/package-lock.json
+++ b/website/package-lock.json
@@ -37,10 +37,24 @@
"react-player": "^2.11.0",
"react-router-dom": "^5.2.0",
"relevancy": "^0.2.0",
+ "save-dev": "^0.0.1-security",
"stripe": "^10.14.0",
"supermemo": "^2.0.17",
"sylviejs": "^0.0.14",
- "vite-plugin-pwa": "^0.20.1"
+ "tsup": "^8.2.4",
+ "vite-plugin-pwa": "^0.20.1",
+ "workbox-background-sync": "^5.1.3",
+ "workbox-broadcast-update": "^5.1.3",
+ "workbox-cacheable-response": "^5.1.3",
+ "workbox-core": "^5.1.3",
+ "workbox-expiration": "^5.1.3",
+ "workbox-google-analytics": "^5.1.3",
+ "workbox-navigation-preload": "^5.1.3",
+ "workbox-precaching": "^5.1.3",
+ "workbox-range-requests": "^5.1.3",
+ "workbox-routing": "^5.1.3",
+ "workbox-strategies": "^5.1.3",
+ "workbox-streams": "^5.1.3"
},
"devDependencies": {
"@testing-library/jest-dom": "^5.11.4",
@@ -63,6 +77,7 @@
"@types/react-image-crop": "^8.1.2",
"@types/react-router-dom": "^5.1.7",
"@vitejs/plugin-react": "^4.3.1",
+ "bun": "^1.1.24",
"fake-indexeddb": "^3.1.2",
"history": "4",
"jest": "^29.7.0",
@@ -2349,6 +2364,22 @@
"node": ">=12"
}
},
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz",
+ "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
"node_modules/@esbuild/openbsd-x64": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
@@ -2600,6 +2631,102 @@
"url": "https://github.com/sponsors/nzakas"
}
},
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "license": "MIT"
+ },
+ "node_modules/@isaacs/cliui/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
"node_modules/@istanbuljs/load-nyc-config": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
@@ -3034,7 +3161,6 @@
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
"integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "dev": true,
"license": "MIT",
"dependencies": {
"@nodelib/fs.stat": "2.0.5",
@@ -3048,7 +3174,6 @@
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
"integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 8"
@@ -3058,7 +3183,6 @@
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
"integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dev": true,
"license": "MIT",
"dependencies": {
"@nodelib/fs.scandir": "2.1.5",
@@ -3068,6 +3192,128 @@
"node": ">= 8"
}
},
+ "node_modules/@oven/bun-darwin-aarch64": {
+ "version": "1.1.24",
+ "resolved": "https://registry.npmjs.org/@oven/bun-darwin-aarch64/-/bun-darwin-aarch64-1.1.24.tgz",
+ "integrity": "sha512-tT4omX5C9X4tlS0uLiypb6uECTbKjg3/dRNBjAROyL8tLJdndNR0SksfS7IQz0vD4zzifk98ZEsDML4gt+LFgQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@oven/bun-darwin-x64": {
+ "version": "1.1.24",
+ "resolved": "https://registry.npmjs.org/@oven/bun-darwin-x64/-/bun-darwin-x64-1.1.24.tgz",
+ "integrity": "sha512-jSt9jL0mE1zh/8OEWR6fdnGaDF8iWnMwd2a4N2qRuWcr8/QCEjvfK4iJPaJ6f8W06z01CxO5+O4pMF94s6z3pw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@oven/bun-darwin-x64-baseline": {
+ "version": "1.1.24",
+ "resolved": "https://registry.npmjs.org/@oven/bun-darwin-x64-baseline/-/bun-darwin-x64-baseline-1.1.24.tgz",
+ "integrity": "sha512-jp7VhUDNA58scDHF8CKSClUdeWmWGiCWwxcrqs/81jNiARKCb+wjy+nEXWjc8KOB45NAhGaB3BBbl6EM3GzIDw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@oven/bun-linux-aarch64": {
+ "version": "1.1.24",
+ "resolved": "https://registry.npmjs.org/@oven/bun-linux-aarch64/-/bun-linux-aarch64-1.1.24.tgz",
+ "integrity": "sha512-yw/OHSEqygnWJelfuXJP3hSjNVzJ7adxL/Z9vxQPMYi7c7zdfMiggoH9V4U1VIcggfoMH1Gfc5lVpKowuJsSBA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@oven/bun-linux-x64": {
+ "version": "1.1.24",
+ "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64/-/bun-linux-x64-1.1.24.tgz",
+ "integrity": "sha512-U8j716mLJFG5KsFypWgE+uNULo3Y5R0tgP7vEPnPAL4lvwt7IM4Jg1LyxzcEm0jDVrJU3TNaYsu4bsxVVAxmSg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@oven/bun-linux-x64-baseline": {
+ "version": "1.1.24",
+ "resolved": "https://registry.npmjs.org/@oven/bun-linux-x64-baseline/-/bun-linux-x64-baseline-1.1.24.tgz",
+ "integrity": "sha512-L2p9MOY7ug1RzaMYcAknEefMPw+w0LPR9qv780G/SO0uBe1JGl3IzO6/hsPnjj65uT/nNuR+YJXeZbH6p1iwfQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@oven/bun-windows-x64": {
+ "version": "1.1.24",
+ "resolved": "https://registry.npmjs.org/@oven/bun-windows-x64/-/bun-windows-x64-1.1.24.tgz",
+ "integrity": "sha512-8DWCMsavfxAYuJRMRV5M8Tkhttjh/vJo9DEIEBVOfKbKQHoqOnlmXgK7FBPNTqyVzKpmv+W80bTrRoxlnTnk7A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@oven/bun-windows-x64-baseline": {
+ "version": "1.1.24",
+ "resolved": "https://registry.npmjs.org/@oven/bun-windows-x64-baseline/-/bun-windows-x64-baseline-1.1.24.tgz",
+ "integrity": "sha512-Yznr5LJb8Q3MoyG9dM3UosnJSHwOe8AL1AA9fpkVC+TdTl6lmXxjk6JUsE4THQDloRYGN9eqpLLJbK7O6t0aUQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
"node_modules/@popperjs/core": {
"version": "2.9.3",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.3.tgz",
@@ -4656,7 +4902,6 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -4677,11 +4922,16 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "license": "MIT"
+ },
"node_modules/anymatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
"integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
- "dev": true,
"license": "ISC",
"dependencies": {
"normalize-path": "^3.0.0",
@@ -4732,7 +4982,6 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
"integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -5051,6 +5300,18 @@
"node": ">=6.0.0"
}
},
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/bootstrap": {
"version": "4.6.1",
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.1.tgz",
@@ -5079,7 +5340,6 @@
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
"license": "MIT",
"dependencies": {
"fill-range": "^7.0.1"
@@ -5185,6 +5445,61 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/bun": {
+ "version": "1.1.24",
+ "resolved": "https://registry.npmjs.org/bun/-/bun-1.1.24.tgz",
+ "integrity": "sha512-vZt5zNVaoNTSlNprdVdQVZInBcGC2QSik6o9ZsMzuYiiUEAEqpRwwMXAYDUN85mt2FNnsGvmk/8xVlUXS7IzEw==",
+ "cpu": [
+ "arm64",
+ "x64"
+ ],
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "os": [
+ "darwin",
+ "linux",
+ "win32"
+ ],
+ "bin": {
+ "bun": "bin/bun.exe",
+ "bunx": "bin/bun.exe"
+ },
+ "optionalDependencies": {
+ "@oven/bun-darwin-aarch64": "1.1.24",
+ "@oven/bun-darwin-x64": "1.1.24",
+ "@oven/bun-darwin-x64-baseline": "1.1.24",
+ "@oven/bun-linux-aarch64": "1.1.24",
+ "@oven/bun-linux-x64": "1.1.24",
+ "@oven/bun-linux-x64-baseline": "1.1.24",
+ "@oven/bun-windows-x64": "1.1.24",
+ "@oven/bun-windows-x64-baseline": "1.1.24"
+ }
+ },
+ "node_modules/bundle-require": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.0.0.tgz",
+ "integrity": "sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==",
+ "license": "MIT",
+ "dependencies": {
+ "load-tsconfig": "^0.2.3"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "esbuild": ">=0.18"
+ }
+ },
+ "node_modules/cac": {
+ "version": "6.7.14",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
+ "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/call-bind": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
@@ -5278,6 +5593,42 @@
"node": ">=10"
}
},
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/ci-info": {
"version": "3.9.0",
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
@@ -5388,6 +5739,15 @@
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"license": "MIT"
},
+ "node_modules/consola": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz",
+ "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "^14.18.0 || >=16.10.0"
+ }
+ },
"node_modules/convert-source-map": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
@@ -5496,7 +5856,6 @@
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "dev": true,
"license": "MIT",
"dependencies": {
"path-key": "^3.1.0",
@@ -5737,7 +6096,6 @@
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
"integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "dev": true,
"license": "MIT",
"dependencies": {
"path-type": "^4.0.0"
@@ -5780,6 +6138,12 @@
"integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw= sha512-+BNfZ+deCo8hMNpDqDnvT+c0XpJ5cUa6mqYq89bho2Ifze4URTqRkcwR399hWoTrTkbZ/XJYDgP6rc7pRgffEQ==",
"license": "MIT"
},
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "license": "MIT"
+ },
"node_modules/edit-distance": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/edit-distance/-/edit-distance-1.0.5.tgz",
@@ -5824,7 +6188,6 @@
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true,
"license": "MIT"
},
"node_modules/encoding-down": {
@@ -6326,7 +6689,6 @@
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
"integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
- "dev": true,
"license": "MIT",
"dependencies": {
"cross-spawn": "^7.0.3",
@@ -6393,7 +6755,6 @@
"version": "3.2.12",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
"integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
- "dev": true,
"license": "MIT",
"dependencies": {
"@nodelib/fs.stat": "^2.0.2",
@@ -6410,7 +6771,6 @@
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
"license": "ISC",
"dependencies": {
"is-glob": "^4.0.1"
@@ -6443,7 +6803,6 @@
"version": "1.11.1",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.1.tgz",
"integrity": "sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw==",
- "dev": true,
"license": "ISC",
"dependencies": {
"reusify": "^1.0.4"
@@ -6529,7 +6888,6 @@
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"to-regex-range": "^5.0.1"
@@ -6610,6 +6968,34 @@
"is-callable": "^1.1.3"
}
},
+ "node_modules/foreground-child": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
+ "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/foreground-child/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/fp-ts": {
"version": "2.16.0",
"resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.16.0.tgz",
@@ -6754,7 +7140,6 @@
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
"integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=10"
@@ -6844,7 +7229,6 @@
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
"integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
- "dev": true,
"license": "MIT",
"dependencies": {
"array-union": "^2.1.0",
@@ -7007,7 +7391,6 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
"integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
- "dev": true,
"license": "Apache-2.0",
"engines": {
"node": ">=10.17.0"
@@ -7043,7 +7426,6 @@
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
"integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 4"
@@ -7191,6 +7573,18 @@
"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",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "license": "MIT",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/is-boolean-object": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
@@ -7306,7 +7700,6 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -7316,7 +7709,6 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -7336,7 +7728,6 @@
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
"license": "MIT",
"dependencies": {
"is-extglob": "^2.1.1"
@@ -7367,7 +7758,6 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.12.0"
@@ -7536,7 +7926,6 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true,
"license": "ISC"
},
"node_modules/istanbul-lib-coverage": {
@@ -7623,6 +8012,21 @@
"node": ">=8"
}
},
+ "node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
"node_modules/jake": {
"version": "10.9.2",
"resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz",
@@ -8633,6 +9037,15 @@
"url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
+ "node_modules/joycon": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz",
+ "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/jquery": {
"version": "3.7.1",
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz",
@@ -9047,6 +9460,18 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/lilconfig": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz",
+ "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
+ }
+ },
"node_modules/lines-and-columns": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
@@ -9059,6 +9484,15 @@
"integrity": "sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA==",
"license": "MIT"
},
+ "node_modules/load-tsconfig": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz",
+ "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==",
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ }
+ },
"node_modules/locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
@@ -9199,14 +9633,12 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
- "dev": true,
"license": "MIT"
},
"node_modules/merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 8"
@@ -9222,7 +9654,6 @@
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
"integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
- "dev": true,
"license": "MIT",
"dependencies": {
"braces": "^3.0.1",
@@ -9236,7 +9667,6 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
"integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
@@ -9264,6 +9694,15 @@
"node": "*"
}
},
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
"node_modules/moment": {
"version": "2.29.1",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
@@ -9297,6 +9736,17 @@
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"license": "MIT"
},
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
"node_modules/nano": {
"version": "9.0.3",
"resolved": "https://registry.npmjs.org/nano/-/nano-9.0.3.tgz",
@@ -9382,7 +9832,6 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -9392,7 +9841,6 @@
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
"integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
- "dev": true,
"license": "MIT",
"dependencies": {
"path-key": "^3.0.0"
@@ -9468,7 +9916,6 @@
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
"integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
- "dev": true,
"license": "MIT",
"dependencies": {
"mimic-fn": "^2.1.0"
@@ -9554,6 +10001,12 @@
"node": ">=6"
}
},
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz",
+ "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==",
+ "license": "BlueOak-1.0.0"
+ },
"node_modules/papaparse": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.1.tgz",
@@ -9717,7 +10170,6 @@
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -9729,6 +10181,28 @@
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"license": "MIT"
},
+ "node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/path-scurry/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "license": "ISC"
+ },
"node_modules/path-to-regexp": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
@@ -9781,7 +10255,6 @@
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
"integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">= 6"
@@ -10399,6 +10872,18 @@
"string_decoder": "~0.10.x"
}
},
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "license": "MIT",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
"node_modules/realistic-structured-clone": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/realistic-structured-clone/-/realistic-structured-clone-2.0.3.tgz",
@@ -10575,7 +11060,6 @@
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -10601,7 +11085,6 @@
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
"integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "dev": true,
"license": "MIT",
"engines": {
"iojs": ">=1.0.0",
@@ -10647,7 +11130,6 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
"integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "dev": true,
"funding": [
{
"type": "github",
@@ -10728,6 +11210,11 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/save-dev": {
+ "version": "0.0.1-security",
+ "resolved": "https://registry.npmjs.org/save-dev/-/save-dev-0.0.1-security.tgz",
+ "integrity": "sha512-k6knZTDNK8PKKbIqnvxiOveJinuw2LcQjqDoaorZWP9M5AR2EPsnpDeSbeoZZ0pHr5ze1uoaKdK8NBGQrJ34Uw=="
+ },
"node_modules/scheduler": {
"version": "0.23.2",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
@@ -10804,7 +11291,6 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
"license": "MIT",
"dependencies": {
"shebang-regex": "^3.0.0"
@@ -10817,7 +11303,6 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -10845,7 +11330,6 @@
"version": "3.0.7",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "dev": true,
"license": "ISC"
},
"node_modules/sisteransi": {
@@ -10859,7 +11343,6 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -10979,7 +11462,21 @@
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
@@ -11083,7 +11580,19 @@
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
@@ -11115,7 +11624,6 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
"integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
- "dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
@@ -11166,6 +11674,81 @@
"integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==",
"license": "MIT"
},
+ "node_modules/sucrase": {
+ "version": "3.35.0",
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
+ "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "commander": "^4.0.0",
+ "glob": "^10.3.10",
+ "lines-and-columns": "^1.1.6",
+ "mz": "^2.7.0",
+ "pirates": "^4.0.1",
+ "ts-interface-checker": "^0.1.9"
+ },
+ "bin": {
+ "sucrase": "bin/sucrase",
+ "sucrase-node": "bin/sucrase-node"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/sucrase/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/sucrase/node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/sucrase/node_modules/glob": {
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/sucrase/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/supermemo": {
"version": "2.0.17",
"resolved": "https://registry.npmjs.org/supermemo/-/supermemo-2.0.17.tgz",
@@ -11295,6 +11878,27 @@
"license": "MIT",
"peer": true
},
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "license": "MIT",
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
"node_modules/through2": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz",
@@ -11399,7 +12003,6 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
"license": "MIT",
"dependencies": {
"is-number": "^7.0.0"
@@ -11435,6 +12038,15 @@
"node": ">=8"
}
},
+ "node_modules/tree-kill": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+ "license": "MIT",
+ "bin": {
+ "tree-kill": "cli.js"
+ }
+ },
"node_modules/ts-api-utils": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
@@ -11448,6 +12060,12 @@
"typescript": ">=4.2.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",
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
+ "license": "Apache-2.0"
+ },
"node_modules/ts-jest": {
"version": "29.2.4",
"resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.4.tgz",
@@ -11516,6 +12134,552 @@
"integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==",
"license": "0BSD"
},
+ "node_modules/tsup": {
+ "version": "8.2.4",
+ "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.2.4.tgz",
+ "integrity": "sha512-akpCPePnBnC/CXgRrcy72ZSntgIEUa1jN0oJbbvpALWKNOz1B7aM+UVDWGRGIO/T/PZugAESWDJUAb5FD48o8Q==",
+ "license": "MIT",
+ "dependencies": {
+ "bundle-require": "^5.0.0",
+ "cac": "^6.7.14",
+ "chokidar": "^3.6.0",
+ "consola": "^3.2.3",
+ "debug": "^4.3.5",
+ "esbuild": "^0.23.0",
+ "execa": "^5.1.1",
+ "globby": "^11.1.0",
+ "joycon": "^3.1.1",
+ "picocolors": "^1.0.1",
+ "postcss-load-config": "^6.0.1",
+ "resolve-from": "^5.0.0",
+ "rollup": "^4.19.0",
+ "source-map": "0.8.0-beta.0",
+ "sucrase": "^3.35.0",
+ "tree-kill": "^1.2.2"
+ },
+ "bin": {
+ "tsup": "dist/cli-default.js",
+ "tsup-node": "dist/cli-node.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@microsoft/api-extractor": "^7.36.0",
+ "@swc/core": "^1",
+ "postcss": "^8.4.12",
+ "typescript": ">=4.5.0"
+ },
+ "peerDependenciesMeta": {
+ "@microsoft/api-extractor": {
+ "optional": true
+ },
+ "@swc/core": {
+ "optional": true
+ },
+ "postcss": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tsup/node_modules/@esbuild/aix-ppc64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz",
+ "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tsup/node_modules/@esbuild/android-arm": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz",
+ "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tsup/node_modules/@esbuild/android-arm64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz",
+ "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tsup/node_modules/@esbuild/android-x64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz",
+ "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tsup/node_modules/@esbuild/darwin-arm64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz",
+ "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tsup/node_modules/@esbuild/darwin-x64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz",
+ "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tsup/node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz",
+ "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tsup/node_modules/@esbuild/freebsd-x64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz",
+ "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tsup/node_modules/@esbuild/linux-arm": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz",
+ "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tsup/node_modules/@esbuild/linux-arm64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz",
+ "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tsup/node_modules/@esbuild/linux-ia32": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz",
+ "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tsup/node_modules/@esbuild/linux-loong64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz",
+ "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tsup/node_modules/@esbuild/linux-mips64el": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz",
+ "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==",
+ "cpu": [
+ "mips64el"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tsup/node_modules/@esbuild/linux-ppc64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz",
+ "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tsup/node_modules/@esbuild/linux-riscv64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz",
+ "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tsup/node_modules/@esbuild/linux-s390x": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz",
+ "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tsup/node_modules/@esbuild/linux-x64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz",
+ "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tsup/node_modules/@esbuild/netbsd-x64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz",
+ "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tsup/node_modules/@esbuild/openbsd-x64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz",
+ "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tsup/node_modules/@esbuild/sunos-x64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz",
+ "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tsup/node_modules/@esbuild/win32-arm64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz",
+ "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tsup/node_modules/@esbuild/win32-ia32": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz",
+ "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tsup/node_modules/@esbuild/win32-x64": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz",
+ "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tsup/node_modules/esbuild": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz",
+ "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.23.0",
+ "@esbuild/android-arm": "0.23.0",
+ "@esbuild/android-arm64": "0.23.0",
+ "@esbuild/android-x64": "0.23.0",
+ "@esbuild/darwin-arm64": "0.23.0",
+ "@esbuild/darwin-x64": "0.23.0",
+ "@esbuild/freebsd-arm64": "0.23.0",
+ "@esbuild/freebsd-x64": "0.23.0",
+ "@esbuild/linux-arm": "0.23.0",
+ "@esbuild/linux-arm64": "0.23.0",
+ "@esbuild/linux-ia32": "0.23.0",
+ "@esbuild/linux-loong64": "0.23.0",
+ "@esbuild/linux-mips64el": "0.23.0",
+ "@esbuild/linux-ppc64": "0.23.0",
+ "@esbuild/linux-riscv64": "0.23.0",
+ "@esbuild/linux-s390x": "0.23.0",
+ "@esbuild/linux-x64": "0.23.0",
+ "@esbuild/netbsd-x64": "0.23.0",
+ "@esbuild/openbsd-arm64": "0.23.0",
+ "@esbuild/openbsd-x64": "0.23.0",
+ "@esbuild/sunos-x64": "0.23.0",
+ "@esbuild/win32-arm64": "0.23.0",
+ "@esbuild/win32-ia32": "0.23.0",
+ "@esbuild/win32-x64": "0.23.0"
+ }
+ },
+ "node_modules/tsup/node_modules/postcss-load-config": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz",
+ "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "lilconfig": "^3.1.1"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "jiti": ">=1.21.0",
+ "postcss": ">=8.0.9",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ },
+ "postcss": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tsup/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==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "whatwg-url": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/tsup/node_modules/tr46": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
+ "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==",
+ "license": "MIT",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/tsup/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==",
+ "license": "MIT",
+ "dependencies": {
+ "lodash.sortby": "^4.7.0",
+ "tr46": "^1.0.1",
+ "webidl-conversions": "^4.0.2"
+ }
+ },
+ "node_modules/tsup/node_modules/yaml": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz",
+ "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==",
+ "license": "ISC",
+ "optional": true,
+ "peer": true,
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
"node_modules/type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@@ -11630,7 +12794,7 @@
"version": "5.5.4",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz",
"integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==",
- "dev": true,
+ "devOptional": true,
"license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
@@ -12043,7 +13207,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
"license": "ISC",
"dependencies": {
"isexe": "^2.0.0"
@@ -12102,22 +13265,21 @@
}
},
"node_modules/workbox-background-sync": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.1.0.tgz",
- "integrity": "sha512-rMbgrzueVWDFcEq1610YyDW71z0oAXLfdRHRQcKw4SGihkfOK0JUEvqWHFwA6rJ+6TClnMIn7KQI5PNN1XQXwQ==",
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-5.1.4.tgz",
+ "integrity": "sha512-AH6x5pYq4vwQvfRDWH+vfOePfPIYQ00nCEB7dJRU1e0n9+9HMRyvI63FlDvtFT2AvXVRsXvUt7DNMEToyJLpSA==",
"license": "MIT",
"dependencies": {
- "idb": "^7.0.1",
- "workbox-core": "7.1.0"
+ "workbox-core": "^5.1.4"
}
},
"node_modules/workbox-broadcast-update": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.1.0.tgz",
- "integrity": "sha512-O36hIfhjej/c5ar95pO67k1GQw0/bw5tKP7CERNgK+JdxBANQhDmIuOXZTNvwb2IHBx9hj2kxvcDyRIh5nzOgQ==",
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-5.1.4.tgz",
+ "integrity": "sha512-HTyTWkqXvHRuqY73XrwvXPud/FN6x3ROzkfFPsRjtw/kGZuZkPzfeH531qdUGfhtwjmtO/ZzXcWErqVzJNdXaA==",
"license": "MIT",
"dependencies": {
- "workbox-core": "7.1.0"
+ "workbox-core": "^5.1.4"
}
},
"node_modules/workbox-build": {
@@ -12331,7 +13493,26 @@
"webidl-conversions": "^4.0.2"
}
},
- "node_modules/workbox-cacheable-response": {
+ "node_modules/workbox-build/node_modules/workbox-background-sync": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.1.0.tgz",
+ "integrity": "sha512-rMbgrzueVWDFcEq1610YyDW71z0oAXLfdRHRQcKw4SGihkfOK0JUEvqWHFwA6rJ+6TClnMIn7KQI5PNN1XQXwQ==",
+ "license": "MIT",
+ "dependencies": {
+ "idb": "^7.0.1",
+ "workbox-core": "7.1.0"
+ }
+ },
+ "node_modules/workbox-build/node_modules/workbox-broadcast-update": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-7.1.0.tgz",
+ "integrity": "sha512-O36hIfhjej/c5ar95pO67k1GQw0/bw5tKP7CERNgK+JdxBANQhDmIuOXZTNvwb2IHBx9hj2kxvcDyRIh5nzOgQ==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "7.1.0"
+ }
+ },
+ "node_modules/workbox-build/node_modules/workbox-cacheable-response": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.1.0.tgz",
"integrity": "sha512-iwsLBll8Hvua3xCuBB9h92+/e0wdsmSVgR2ZlvcfjepZWwhd3osumQB3x9o7flj+FehtWM2VHbZn8UJeBXXo6Q==",
@@ -12340,13 +13521,13 @@
"workbox-core": "7.1.0"
}
},
- "node_modules/workbox-core": {
+ "node_modules/workbox-build/node_modules/workbox-core": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.1.0.tgz",
"integrity": "sha512-5KB4KOY8rtL31nEF7BfvU7FMzKT4B5TkbYa2tzkS+Peqj0gayMT9SytSFtNzlrvMaWgv6y/yvP9C0IbpFjV30Q==",
"license": "MIT"
},
- "node_modules/workbox-expiration": {
+ "node_modules/workbox-build/node_modules/workbox-expiration": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.1.0.tgz",
"integrity": "sha512-m5DcMY+A63rJlPTbbBNtpJ20i3enkyOtSgYfv/l8h+D6YbbNiA0zKEkCUaMsdDlxggla1oOfRkyqTvl5Ni5KQQ==",
@@ -12356,7 +13537,7 @@
"workbox-core": "7.1.0"
}
},
- "node_modules/workbox-google-analytics": {
+ "node_modules/workbox-build/node_modules/workbox-google-analytics": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-7.1.0.tgz",
"integrity": "sha512-FvE53kBQHfVTcZyczeBVRexhh7JTkyQ8HAvbVY6mXd2n2A7Oyz/9fIwnY406ZcDhvE4NFfKGjW56N4gBiqkrew==",
@@ -12368,7 +13549,7 @@
"workbox-strategies": "7.1.0"
}
},
- "node_modules/workbox-navigation-preload": {
+ "node_modules/workbox-build/node_modules/workbox-navigation-preload": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-7.1.0.tgz",
"integrity": "sha512-4wyAbo0vNI/X0uWNJhCMKxnPanNyhybsReMGN9QUpaePLTiDpKxPqFxl4oUmBNddPwIXug01eTSLVIFXimRG/A==",
@@ -12377,7 +13558,7 @@
"workbox-core": "7.1.0"
}
},
- "node_modules/workbox-precaching": {
+ "node_modules/workbox-build/node_modules/workbox-precaching": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.1.0.tgz",
"integrity": "sha512-LyxzQts+UEpgtmfnolo0hHdNjoB7EoRWcF7EDslt+lQGd0lW4iTvvSe3v5JiIckQSB5KTW5xiCqjFviRKPj1zA==",
@@ -12388,7 +13569,7 @@
"workbox-strategies": "7.1.0"
}
},
- "node_modules/workbox-range-requests": {
+ "node_modules/workbox-build/node_modules/workbox-range-requests": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-7.1.0.tgz",
"integrity": "sha512-m7+O4EHolNs5yb/79CrnwPR/g/PRzMFYEdo01LqwixVnc/sbzNSvKz0d04OE3aMRel1CwAAZQheRsqGDwATgPQ==",
@@ -12397,6 +13578,98 @@
"workbox-core": "7.1.0"
}
},
+ "node_modules/workbox-build/node_modules/workbox-routing": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.1.0.tgz",
+ "integrity": "sha512-oOYk+kLriUY2QyHkIilxUlVcFqwduLJB7oRZIENbqPGeBP/3TWHYNNdmGNhz1dvKuw7aqvJ7CQxn27/jprlTdg==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "7.1.0"
+ }
+ },
+ "node_modules/workbox-build/node_modules/workbox-strategies": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.1.0.tgz",
+ "integrity": "sha512-/UracPiGhUNehGjRm/tLUQ+9PtWmCbRufWtV0tNrALuf+HZ4F7cmObSEK+E4/Bx1p8Syx2tM+pkIrvtyetdlew==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "7.1.0"
+ }
+ },
+ "node_modules/workbox-build/node_modules/workbox-streams": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.1.0.tgz",
+ "integrity": "sha512-WyHAVxRXBMfysM8ORwiZnI98wvGWTVAq/lOyBjf00pXFvG0mNaVz4Ji+u+fKa/mf1i2SnTfikoYKto4ihHeS6w==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "7.1.0",
+ "workbox-routing": "7.1.0"
+ }
+ },
+ "node_modules/workbox-cacheable-response": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-5.1.4.tgz",
+ "integrity": "sha512-0bfvMZs0Of1S5cdswfQK0BXt6ulU5kVD4lwer2CeI+03czHprXR3V4Y8lPTooamn7eHP8Iywi5QjyAMjw0qauA==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "^5.1.4"
+ }
+ },
+ "node_modules/workbox-core": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-5.1.4.tgz",
+ "integrity": "sha512-+4iRQan/1D8I81nR2L5vcbaaFskZC2CL17TLbvWVzQ4qiF/ytOGF6XeV54pVxAvKUtkLANhk8TyIUMtiMw2oDg==",
+ "license": "MIT"
+ },
+ "node_modules/workbox-expiration": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-5.1.4.tgz",
+ "integrity": "sha512-oDO/5iC65h2Eq7jctAv858W2+CeRW5e0jZBMNRXpzp0ZPvuT6GblUiHnAsC5W5lANs1QS9atVOm4ifrBiYY7AQ==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "^5.1.4"
+ }
+ },
+ "node_modules/workbox-google-analytics": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-5.1.4.tgz",
+ "integrity": "sha512-0IFhKoEVrreHpKgcOoddV+oIaVXBFKXUzJVBI+nb0bxmcwYuZMdteBTp8AEDJacENtc9xbR0wa9RDCnYsCDLjA==",
+ "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-background-sync": "^5.1.4",
+ "workbox-core": "^5.1.4",
+ "workbox-routing": "^5.1.4",
+ "workbox-strategies": "^5.1.4"
+ }
+ },
+ "node_modules/workbox-navigation-preload": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-5.1.4.tgz",
+ "integrity": "sha512-Wf03osvK0wTflAfKXba//QmWC5BIaIZARU03JIhAEO2wSB2BDROWI8Q/zmianf54kdV7e1eLaIEZhth4K4MyfQ==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "^5.1.4"
+ }
+ },
+ "node_modules/workbox-precaching": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-5.1.4.tgz",
+ "integrity": "sha512-gCIFrBXmVQLFwvAzuGLCmkUYGVhBb7D1k/IL7pUJUO5xacjLcFUaLnnsoVepBGAiKw34HU1y/YuqvTKim9qAZA==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "^5.1.4"
+ }
+ },
+ "node_modules/workbox-range-requests": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-5.1.4.tgz",
+ "integrity": "sha512-1HSujLjgTeoxHrMR2muDW2dKdxqCGMc1KbeyGcmjZZAizJTFwu7CWLDmLv6O1ceWYrhfuLFJO+umYMddk2XMhw==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "^5.1.4"
+ }
+ },
"node_modules/workbox-recipes": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-7.1.0.tgz",
@@ -12411,7 +13684,43 @@
"workbox-strategies": "7.1.0"
}
},
- "node_modules/workbox-routing": {
+ "node_modules/workbox-recipes/node_modules/workbox-cacheable-response": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.1.0.tgz",
+ "integrity": "sha512-iwsLBll8Hvua3xCuBB9h92+/e0wdsmSVgR2ZlvcfjepZWwhd3osumQB3x9o7flj+FehtWM2VHbZn8UJeBXXo6Q==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "7.1.0"
+ }
+ },
+ "node_modules/workbox-recipes/node_modules/workbox-core": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.1.0.tgz",
+ "integrity": "sha512-5KB4KOY8rtL31nEF7BfvU7FMzKT4B5TkbYa2tzkS+Peqj0gayMT9SytSFtNzlrvMaWgv6y/yvP9C0IbpFjV30Q==",
+ "license": "MIT"
+ },
+ "node_modules/workbox-recipes/node_modules/workbox-expiration": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-7.1.0.tgz",
+ "integrity": "sha512-m5DcMY+A63rJlPTbbBNtpJ20i3enkyOtSgYfv/l8h+D6YbbNiA0zKEkCUaMsdDlxggla1oOfRkyqTvl5Ni5KQQ==",
+ "license": "MIT",
+ "dependencies": {
+ "idb": "^7.0.1",
+ "workbox-core": "7.1.0"
+ }
+ },
+ "node_modules/workbox-recipes/node_modules/workbox-precaching": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-7.1.0.tgz",
+ "integrity": "sha512-LyxzQts+UEpgtmfnolo0hHdNjoB7EoRWcF7EDslt+lQGd0lW4iTvvSe3v5JiIckQSB5KTW5xiCqjFviRKPj1zA==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "7.1.0",
+ "workbox-routing": "7.1.0",
+ "workbox-strategies": "7.1.0"
+ }
+ },
+ "node_modules/workbox-recipes/node_modules/workbox-routing": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-7.1.0.tgz",
"integrity": "sha512-oOYk+kLriUY2QyHkIilxUlVcFqwduLJB7oRZIENbqPGeBP/3TWHYNNdmGNhz1dvKuw7aqvJ7CQxn27/jprlTdg==",
@@ -12420,7 +13729,7 @@
"workbox-core": "7.1.0"
}
},
- "node_modules/workbox-strategies": {
+ "node_modules/workbox-recipes/node_modules/workbox-strategies": {
"version": "7.1.0",
"resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-7.1.0.tgz",
"integrity": "sha512-/UracPiGhUNehGjRm/tLUQ+9PtWmCbRufWtV0tNrALuf+HZ4F7cmObSEK+E4/Bx1p8Syx2tM+pkIrvtyetdlew==",
@@ -12429,14 +13738,33 @@
"workbox-core": "7.1.0"
}
},
- "node_modules/workbox-streams": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-7.1.0.tgz",
- "integrity": "sha512-WyHAVxRXBMfysM8ORwiZnI98wvGWTVAq/lOyBjf00pXFvG0mNaVz4Ji+u+fKa/mf1i2SnTfikoYKto4ihHeS6w==",
+ "node_modules/workbox-routing": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-5.1.4.tgz",
+ "integrity": "sha512-8ljknRfqE1vEQtnMtzfksL+UXO822jJlHTIR7+BtJuxQ17+WPZfsHqvk1ynR/v0EHik4x2+826Hkwpgh4GKDCw==",
"license": "MIT",
"dependencies": {
- "workbox-core": "7.1.0",
- "workbox-routing": "7.1.0"
+ "workbox-core": "^5.1.4"
+ }
+ },
+ "node_modules/workbox-strategies": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-5.1.4.tgz",
+ "integrity": "sha512-VVS57LpaJTdjW3RgZvPwX0NlhNmscR7OQ9bP+N/34cYMDzXLyA6kqWffP6QKXSkca1OFo/v6v7hW7zrrguo6EA==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "^5.1.4",
+ "workbox-routing": "^5.1.4"
+ }
+ },
+ "node_modules/workbox-streams": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-5.1.4.tgz",
+ "integrity": "sha512-xU8yuF1hI/XcVhJUAfbQLa1guQUhdLMPQJkdT0kn6HP5CwiPOGiXnSFq80rAG4b1kJUChQQIGPrq439FQUNVrw==",
+ "license": "MIT",
+ "dependencies": {
+ "workbox-core": "^5.1.4",
+ "workbox-routing": "^5.1.4"
}
},
"node_modules/workbox-sw": {
@@ -12455,6 +13783,12 @@
"workbox-core": "7.1.0"
}
},
+ "node_modules/workbox-window/node_modules/workbox-core": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-7.1.0.tgz",
+ "integrity": "sha512-5KB4KOY8rtL31nEF7BfvU7FMzKT4B5TkbYa2tzkS+Peqj0gayMT9SytSFtNzlrvMaWgv6y/yvP9C0IbpFjV30Q==",
+ "license": "MIT"
+ },
"node_modules/wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
@@ -12473,6 +13807,24 @@
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
diff --git a/website/package.json b/website/package.json
index 8c50fb1..2a8d740 100644
--- a/website/package.json
+++ b/website/package.json
@@ -38,16 +38,30 @@
"react-player": "^2.11.0",
"react-router-dom": "^5.2.0",
"relevancy": "^0.2.0",
+ "save-dev": "^0.0.1-security",
"stripe": "^10.14.0",
"supermemo": "^2.0.17",
"sylviejs": "^0.0.14",
- "vite-plugin-pwa": "^0.20.1"
+ "tsup": "^8.2.4",
+ "vite-plugin-pwa": "^0.20.1",
+ "workbox-background-sync": "^5.1.3",
+ "workbox-broadcast-update": "^5.1.3",
+ "workbox-cacheable-response": "^5.1.3",
+ "workbox-core": "^5.1.3",
+ "workbox-expiration": "^5.1.3",
+ "workbox-google-analytics": "^5.1.3",
+ "workbox-navigation-preload": "^5.1.3",
+ "workbox-precaching": "^5.1.3",
+ "workbox-range-requests": "^5.1.3",
+ "workbox-routing": "^5.1.3",
+ "workbox-strategies": "^5.1.3",
+ "workbox-streams": "^5.1.3"
},
"scripts": {
"dev": "vite",
"lint": "eslint .",
"test": "jest",
- "build": "tsc -b && vite build",
+ "build": "rm -rf dist && tsc -b && vite build && bun build src/service-worker.ts --outdir ./dist",
"preview": "vite preview",
"test-ci": "yarn test --watchAll=false"
},
@@ -85,6 +99,7 @@
"@types/react-image-crop": "^8.1.2",
"@types/react-router-dom": "^5.1.7",
"@vitejs/plugin-react": "^4.3.1",
+ "bun": "^1.1.24",
"fake-indexeddb": "^3.1.2",
"history": "4",
"jest": "^29.7.0",
@@ -95,4 +110,4 @@
"user-event": "^4.0.0",
"vite": "^5.4.0"
}
-}
+}
\ No newline at end of file
diff --git a/website/public/service-worker.js b/website/public/service-worker.js
deleted file mode 100644
index 8502832..0000000
--- a/website/public/service-worker.js
+++ /dev/null
@@ -1,16 +0,0 @@
-// https://github.com/NekR/self-destroying-sw
-
-self.addEventListener("install", function (e) {
- self.skipWaiting();
-});
-
-self.addEventListener("activate", function (e) {
- self.registration
- .unregister()
- .then(function () {
- return self.clients.matchAll();
- })
- .then(function (clients) {
- clients.forEach((client) => client.navigate(client.url));
- });
-});
diff --git a/website/sout/service-worker.js b/website/sout/service-worker.js
new file mode 100644
index 0000000..819e121
--- /dev/null
+++ b/website/sout/service-worker.js
@@ -0,0 +1,2045 @@
+// node_modules/workbox-core/_version.js
+try {
+ self["workbox:core:5.1.4"] && _();
+} catch (e) {
+}
+
+// node_modules/workbox-core/_private/logger.js
+var logger = (() => {
+ if (!("__WB_DISABLE_DEV_LOGS" in self)) {
+ self.__WB_DISABLE_DEV_LOGS = false;
+ }
+ let inGroup = false;
+ const methodToColorMap = {
+ debug: `#7f8c8d`,
+ log: `#2ecc71`,
+ warn: `#f39c12`,
+ error: `#c0392b`,
+ groupCollapsed: `#3498db`,
+ groupEnd: null
+ };
+ const print = function(method, args) {
+ if (self.__WB_DISABLE_DEV_LOGS) {
+ return;
+ }
+ if (method === "groupCollapsed") {
+ if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {
+ console[method](...args);
+ return;
+ }
+ }
+ const styles = [
+ `background: ${methodToColorMap[method]}`,
+ `border-radius: 0.5em`,
+ `color: white`,
+ `font-weight: bold`,
+ `padding: 2px 0.5em`
+ ];
+ const logPrefix = inGroup ? [] : ["%cworkbox", styles.join(";")];
+ console[method](...logPrefix, ...args);
+ if (method === "groupCollapsed") {
+ inGroup = true;
+ }
+ if (method === "groupEnd") {
+ inGroup = false;
+ }
+ };
+ const api = {};
+ const loggerMethods = Object.keys(methodToColorMap);
+ for (const key of loggerMethods) {
+ const method = key;
+ api[method] = (...args) => {
+ print(method, args);
+ };
+ }
+ return api;
+})();
+
+// node_modules/workbox-core/models/messages/messages.js
+var messages = {
+ "invalid-value": ({ paramName, validValueDescription, value }) => {
+ if (!paramName || !validValueDescription) {
+ throw new Error(`Unexpected input to 'invalid-value' error.`);
+ }
+ return `The '${paramName}' parameter was given a value with an ` + `unexpected value. ${validValueDescription} Received a value of ` + `${JSON.stringify(value)}.`;
+ },
+ "not-an-array": ({ moduleName, className, funcName, paramName }) => {
+ if (!moduleName || !className || !funcName || !paramName) {
+ throw new Error(`Unexpected input to 'not-an-array' error.`);
+ }
+ return `The parameter '${paramName}' passed into ` + `'${moduleName}.${className}.${funcName}()' must be an array.`;
+ },
+ "incorrect-type": ({ expectedType, paramName, moduleName, className, funcName }) => {
+ if (!expectedType || !paramName || !moduleName || !funcName) {
+ throw new Error(`Unexpected input to 'incorrect-type' error.`);
+ }
+ return `The parameter '${paramName}' passed into ` + `'${moduleName}.${className ? className + "." : ""}` + `${funcName}()' must be of type ${expectedType}.`;
+ },
+ "incorrect-class": ({ expectedClass, paramName, moduleName, className, funcName, isReturnValueProblem }) => {
+ if (!expectedClass || !moduleName || !funcName) {
+ throw new Error(`Unexpected input to 'incorrect-class' error.`);
+ }
+ if (isReturnValueProblem) {
+ return `The return value from ` + `'${moduleName}.${className ? className + "." : ""}${funcName}()' ` + `must be an instance of class ${expectedClass.name}.`;
+ }
+ return `The parameter '${paramName}' passed into ` + `'${moduleName}.${className ? className + "." : ""}${funcName}()' ` + `must be an instance of class ${expectedClass.name}.`;
+ },
+ "missing-a-method": ({ expectedMethod, paramName, moduleName, className, funcName }) => {
+ if (!expectedMethod || !paramName || !moduleName || !className || !funcName) {
+ throw new Error(`Unexpected input to 'missing-a-method' error.`);
+ }
+ return `${moduleName}.${className}.${funcName}() expected the ` + `'${paramName}' parameter to expose a '${expectedMethod}' method.`;
+ },
+ "add-to-cache-list-unexpected-type": ({ entry }) => {
+ return `An unexpected entry was passed to ` + `'workbox-precaching.PrecacheController.addToCacheList()' The entry ` + `'${JSON.stringify(entry)}' isn't supported. You must supply an array of ` + `strings with one or more characters, objects with a url property or ` + `Request objects.`;
+ },
+ "add-to-cache-list-conflicting-entries": ({ firstEntry, secondEntry }) => {
+ if (!firstEntry || !secondEntry) {
+ throw new Error(`Unexpected input to ` + `'add-to-cache-list-duplicate-entries' error.`);
+ }
+ return `Two of the entries passed to ` + `'workbox-precaching.PrecacheController.addToCacheList()' had the URL ` + `${firstEntry._entryId} but different revision details. Workbox is ` + `unable to cache and version the asset correctly. Please remove one ` + `of the entries.`;
+ },
+ "plugin-error-request-will-fetch": ({ thrownError }) => {
+ if (!thrownError) {
+ throw new Error(`Unexpected input to ` + `'plugin-error-request-will-fetch', error.`);
+ }
+ return `An error was thrown by a plugins 'requestWillFetch()' method. ` + `The thrown error message was: '${thrownError.message}'.`;
+ },
+ "invalid-cache-name": ({ cacheNameId, value }) => {
+ if (!cacheNameId) {
+ throw new Error(`Expected a 'cacheNameId' for error 'invalid-cache-name'`);
+ }
+ return `You must provide a name containing at least one character for ` + `setCacheDetails({${cacheNameId}: '...'}). Received a value of ` + `'${JSON.stringify(value)}'`;
+ },
+ "unregister-route-but-not-found-with-method": ({ method }) => {
+ if (!method) {
+ throw new Error(`Unexpected input to ` + `'unregister-route-but-not-found-with-method' error.`);
+ }
+ return `The route you're trying to unregister was not previously ` + `registered for the method type '${method}'.`;
+ },
+ "unregister-route-route-not-registered": () => {
+ return `The route you're trying to unregister was not previously ` + `registered.`;
+ },
+ "queue-replay-failed": ({ name }) => {
+ return `Replaying the background sync queue '${name}' failed.`;
+ },
+ "duplicate-queue-name": ({ name }) => {
+ return `The Queue name '${name}' is already being used. ` + `All instances of backgroundSync.Queue must be given unique names.`;
+ },
+ "expired-test-without-max-age": ({ methodName, paramName }) => {
+ return `The '${methodName}()' method can only be used when the ` + `'${paramName}' is used in the constructor.`;
+ },
+ "unsupported-route-type": ({ moduleName, className, funcName, paramName }) => {
+ return `The supplied '${paramName}' parameter was an unsupported type. ` + `Please check the docs for ${moduleName}.${className}.${funcName} for ` + `valid input types.`;
+ },
+ "not-array-of-class": ({ value, expectedClass, moduleName, className, funcName, paramName }) => {
+ return `The supplied '${paramName}' parameter must be an array of ` + `'${expectedClass}' objects. Received '${JSON.stringify(value)},'. ` + `Please check the call to ${moduleName}.${className}.${funcName}() ` + `to fix the issue.`;
+ },
+ "max-entries-or-age-required": ({ moduleName, className, funcName }) => {
+ return `You must define either config.maxEntries or config.maxAgeSeconds` + `in ${moduleName}.${className}.${funcName}`;
+ },
+ "statuses-or-headers-required": ({ moduleName, className, funcName }) => {
+ return `You must define either config.statuses or config.headers` + `in ${moduleName}.${className}.${funcName}`;
+ },
+ "invalid-string": ({ moduleName, funcName, paramName }) => {
+ if (!paramName || !moduleName || !funcName) {
+ throw new Error(`Unexpected input to 'invalid-string' error.`);
+ }
+ return `When using strings, the '${paramName}' parameter must start with ` + `'http' (for cross-origin matches) or '/' (for same-origin matches). ` + `Please see the docs for ${moduleName}.${funcName}() for ` + `more info.`;
+ },
+ "channel-name-required": () => {
+ return `You must provide a channelName to construct a ` + `BroadcastCacheUpdate instance.`;
+ },
+ "invalid-responses-are-same-args": () => {
+ return `The arguments passed into responsesAreSame() appear to be ` + `invalid. Please ensure valid Responses are used.`;
+ },
+ "expire-custom-caches-only": () => {
+ return `You must provide a 'cacheName' property when using the ` + `expiration plugin with a runtime caching strategy.`;
+ },
+ "unit-must-be-bytes": ({ normalizedRangeHeader }) => {
+ if (!normalizedRangeHeader) {
+ throw new Error(`Unexpected input to 'unit-must-be-bytes' error.`);
+ }
+ return `The 'unit' portion of the Range header must be set to 'bytes'. ` + `The Range header provided was "${normalizedRangeHeader}"`;
+ },
+ "single-range-only": ({ normalizedRangeHeader }) => {
+ if (!normalizedRangeHeader) {
+ throw new Error(`Unexpected input to 'single-range-only' error.`);
+ }
+ return `Multiple ranges are not supported. Please use a single start ` + `value, and optional end value. The Range header provided was ` + `"${normalizedRangeHeader}"`;
+ },
+ "invalid-range-values": ({ normalizedRangeHeader }) => {
+ if (!normalizedRangeHeader) {
+ throw new Error(`Unexpected input to 'invalid-range-values' error.`);
+ }
+ return `The Range header is missing both start and end values. At least ` + `one of those values is needed. The Range header provided was ` + `"${normalizedRangeHeader}"`;
+ },
+ "no-range-header": () => {
+ return `No Range header was found in the Request provided.`;
+ },
+ "range-not-satisfiable": ({ size, start, end }) => {
+ return `The start (${start}) and end (${end}) values in the Range are ` + `not satisfiable by the cached response, which is ${size} bytes.`;
+ },
+ "attempt-to-cache-non-get-request": ({ url, method }) => {
+ return `Unable to cache '${url}' because it is a '${method}' request and ` + `only 'GET' requests can be cached.`;
+ },
+ "cache-put-with-no-response": ({ url }) => {
+ return `There was an attempt to cache '${url}' but the response was not ` + `defined.`;
+ },
+ "no-response": ({ url, error }) => {
+ let message = `The strategy could not generate a response for '${url}'.`;
+ if (error) {
+ message += ` The underlying error is ${error}.`;
+ }
+ return message;
+ },
+ "bad-precaching-response": ({ url, status }) => {
+ return `The precaching request for '${url}' failed with an HTTP ` + `status of ${status}.`;
+ },
+ "non-precached-url": ({ url }) => {
+ return `createHandlerBoundToURL('${url}') was called, but that URL is ` + `not precached. Please pass in a URL that is precached instead.`;
+ },
+ "add-to-cache-list-conflicting-integrities": ({ url }) => {
+ return `Two of the entries passed to ` + `'workbox-precaching.PrecacheController.addToCacheList()' had the URL ` + `${url} with different integrity values. Please remove one of them.`;
+ },
+ "missing-precache-entry": ({ cacheName, url }) => {
+ return `Unable to find a precached response in ${cacheName} for ${url}.`;
+ }
+};
+
+// node_modules/workbox-core/models/messages/messageGenerator.js
+var generatorFunction = (code, details = {}) => {
+ const message = messages[code];
+ if (!message) {
+ throw new Error(`Unable to find message for code '${code}'.`);
+ }
+ return message(details);
+};
+var messageGenerator = generatorFunction;
+
+// node_modules/workbox-core/_private/WorkboxError.js
+class WorkboxError extends Error {
+ constructor(errorCode, details) {
+ const message = messageGenerator(errorCode, details);
+ super(message);
+ this.name = errorCode;
+ this.details = details;
+ }
+}
+
+// node_modules/workbox-core/_private/assert.js
+var isArray = (value, details) => {
+ if (!Array.isArray(value)) {
+ throw new WorkboxError("not-an-array", details);
+ }
+};
+var hasMethod = (object, expectedMethod, details) => {
+ const type = typeof object[expectedMethod];
+ if (type !== "function") {
+ details["expectedMethod"] = expectedMethod;
+ throw new WorkboxError("missing-a-method", details);
+ }
+};
+var isType = (object, expectedType, details) => {
+ if (typeof object !== expectedType) {
+ details["expectedType"] = expectedType;
+ throw new WorkboxError("incorrect-type", details);
+ }
+};
+var isInstance = (object, expectedClass, details) => {
+ if (!(object instanceof expectedClass)) {
+ details["expectedClass"] = expectedClass;
+ throw new WorkboxError("incorrect-class", details);
+ }
+};
+var isOneOf = (value, validValues, details) => {
+ if (!validValues.includes(value)) {
+ details["validValueDescription"] = `Valid values are ${JSON.stringify(validValues)}.`;
+ throw new WorkboxError("invalid-value", details);
+ }
+};
+var isArrayOfClass = (value, expectedClass, details) => {
+ const error = new WorkboxError("not-array-of-class", details);
+ if (!Array.isArray(value)) {
+ throw error;
+ }
+ for (const item of value) {
+ if (!(item instanceof expectedClass)) {
+ throw error;
+ }
+ }
+};
+var finalAssertExports = {
+ hasMethod,
+ isArray,
+ isInstance,
+ isOneOf,
+ isType,
+ isArrayOfClass
+};
+
+// node_modules/workbox-core/models/quotaErrorCallbacks.js
+var quotaErrorCallbacks = new Set;
+
+// node_modules/workbox-core/registerQuotaErrorCallback.js
+function registerQuotaErrorCallback(callback) {
+ if (true) {
+ finalAssertExports.isType(callback, "function", {
+ moduleName: "workbox-core",
+ funcName: "register",
+ paramName: "callback"
+ });
+ }
+ quotaErrorCallbacks.add(callback);
+ if (true) {
+ logger.log("Registered a callback to respond to quota errors.", callback);
+ }
+}
+
+// node_modules/workbox-core/_private/cacheNames.js
+var _cacheNameDetails = {
+ googleAnalytics: "googleAnalytics",
+ precache: "precache-v2",
+ prefix: "workbox",
+ runtime: "runtime",
+ suffix: typeof registration !== "undefined" ? registration.scope : ""
+};
+var _createCacheName = (cacheName) => {
+ return [_cacheNameDetails.prefix, cacheName, _cacheNameDetails.suffix].filter((value) => value && value.length > 0).join("-");
+};
+var eachCacheNameDetail = (fn) => {
+ for (const key of Object.keys(_cacheNameDetails)) {
+ fn(key);
+ }
+};
+var cacheNames = {
+ updateDetails: (details) => {
+ eachCacheNameDetail((key) => {
+ if (typeof details[key] === "string") {
+ _cacheNameDetails[key] = details[key];
+ }
+ });
+ },
+ getGoogleAnalyticsName: (userCacheName) => {
+ return userCacheName || _createCacheName(_cacheNameDetails.googleAnalytics);
+ },
+ getPrecacheName: (userCacheName) => {
+ return userCacheName || _createCacheName(_cacheNameDetails.precache);
+ },
+ getPrefix: () => {
+ return _cacheNameDetails.prefix;
+ },
+ getRuntimeName: (userCacheName) => {
+ return userCacheName || _createCacheName(_cacheNameDetails.runtime);
+ },
+ getSuffix: () => {
+ return _cacheNameDetails.suffix;
+ }
+};
+
+// node_modules/workbox-core/_private/executeQuotaErrorCallbacks.js
+async function executeQuotaErrorCallbacks() {
+ if (true) {
+ logger.log(`About to run ${quotaErrorCallbacks.size} ` + `callbacks to clean up caches.`);
+ }
+ for (const callback of quotaErrorCallbacks) {
+ await callback();
+ if (true) {
+ logger.log(callback, "is complete.");
+ }
+ }
+ if (true) {
+ logger.log("Finished running callbacks.");
+ }
+}
+
+// node_modules/workbox-core/_private/getFriendlyURL.js
+var getFriendlyURL = (url) => {
+ const urlObj = new URL(String(url), location.href);
+ return urlObj.href.replace(new RegExp(`^${location.origin}`), "");
+};
+
+// node_modules/workbox-core/utils/pluginUtils.js
+var pluginUtils = {
+ filter: (plugins, callbackName) => {
+ return plugins.filter((plugin) => (callbackName in plugin));
+ }
+};
+
+// node_modules/workbox-core/_private/cacheWrapper.js
+var _getEffectiveRequest = async ({ request, mode, plugins = [] }) => {
+ const cacheKeyWillBeUsedPlugins = pluginUtils.filter(plugins, "cacheKeyWillBeUsed");
+ let effectiveRequest = request;
+ for (const plugin of cacheKeyWillBeUsedPlugins) {
+ effectiveRequest = await plugin["cacheKeyWillBeUsed"].call(plugin, { mode, request: effectiveRequest });
+ if (typeof effectiveRequest === "string") {
+ effectiveRequest = new Request(effectiveRequest);
+ }
+ if (true) {
+ finalAssertExports.isInstance(effectiveRequest, Request, {
+ moduleName: "Plugin",
+ funcName: "cacheKeyWillBeUsed",
+ isReturnValueProblem: true
+ });
+ }
+ }
+ return effectiveRequest;
+};
+var _isResponseSafeToCache = async ({ request, response, event, plugins = [] }) => {
+ let responseToCache = response;
+ let pluginsUsed = false;
+ for (const plugin of plugins) {
+ if ("cacheWillUpdate" in plugin) {
+ pluginsUsed = true;
+ const pluginMethod = plugin["cacheWillUpdate"];
+ responseToCache = await pluginMethod.call(plugin, {
+ request,
+ response: responseToCache,
+ event
+ });
+ if (true) {
+ if (responseToCache) {
+ finalAssertExports.isInstance(responseToCache, Response, {
+ moduleName: "Plugin",
+ funcName: "cacheWillUpdate",
+ isReturnValueProblem: true
+ });
+ }
+ }
+ if (!responseToCache) {
+ break;
+ }
+ }
+ }
+ if (!pluginsUsed) {
+ if (true) {
+ if (responseToCache) {
+ if (responseToCache.status !== 200) {
+ if (responseToCache.status === 0) {
+ logger.warn(`The response for '${request.url}' is an opaque ` + `response. The caching strategy that you're using will not ` + `cache opaque responses by default.`);
+ } else {
+ logger.debug(`The response for '${request.url}' returned ` + `a status code of '${response.status}' and won't be cached as a ` + `result.`);
+ }
+ }
+ }
+ }
+ responseToCache = responseToCache && responseToCache.status === 200 ? responseToCache : undefined;
+ }
+ return responseToCache ? responseToCache : null;
+};
+var matchWrapper = async ({ cacheName, request, event, matchOptions, plugins = [] }) => {
+ const cache = await self.caches.open(cacheName);
+ const effectiveRequest = await _getEffectiveRequest({
+ plugins,
+ request,
+ mode: "read"
+ });
+ let cachedResponse = await cache.match(effectiveRequest, matchOptions);
+ if (true) {
+ if (cachedResponse) {
+ logger.debug(`Found a cached response in '${cacheName}'.`);
+ } else {
+ logger.debug(`No cached response found in '${cacheName}'.`);
+ }
+ }
+ for (const plugin of plugins) {
+ if ("cachedResponseWillBeUsed" in plugin) {
+ const pluginMethod = plugin["cachedResponseWillBeUsed"];
+ cachedResponse = await pluginMethod.call(plugin, {
+ cacheName,
+ event,
+ matchOptions,
+ cachedResponse,
+ request: effectiveRequest
+ });
+ if (true) {
+ if (cachedResponse) {
+ finalAssertExports.isInstance(cachedResponse, Response, {
+ moduleName: "Plugin",
+ funcName: "cachedResponseWillBeUsed",
+ isReturnValueProblem: true
+ });
+ }
+ }
+ }
+ }
+ return cachedResponse;
+};
+var putWrapper = async ({ cacheName, request, response, event, plugins = [], matchOptions }) => {
+ if (true) {
+ if (request.method && request.method !== "GET") {
+ throw new WorkboxError("attempt-to-cache-non-get-request", {
+ url: getFriendlyURL(request.url),
+ method: request.method
+ });
+ }
+ }
+ const effectiveRequest = await _getEffectiveRequest({
+ plugins,
+ request,
+ mode: "write"
+ });
+ if (!response) {
+ if (true) {
+ logger.error(`Cannot cache non-existent response for ` + `'${getFriendlyURL(effectiveRequest.url)}'.`);
+ }
+ throw new WorkboxError("cache-put-with-no-response", {
+ url: getFriendlyURL(effectiveRequest.url)
+ });
+ }
+ const responseToCache = await _isResponseSafeToCache({
+ event,
+ plugins,
+ response,
+ request: effectiveRequest
+ });
+ if (!responseToCache) {
+ if (true) {
+ logger.debug(`Response '${getFriendlyURL(effectiveRequest.url)}' will ` + `not be cached.`, responseToCache);
+ }
+ return;
+ }
+ const cache = await self.caches.open(cacheName);
+ const updatePlugins = pluginUtils.filter(plugins, "cacheDidUpdate");
+ const oldResponse = updatePlugins.length > 0 ? await matchWrapper({ cacheName, matchOptions, request: effectiveRequest }) : null;
+ if (true) {
+ logger.debug(`Updating the '${cacheName}' cache with a new Response for ` + `${getFriendlyURL(effectiveRequest.url)}.`);
+ }
+ try {
+ await cache.put(effectiveRequest, responseToCache);
+ } catch (error) {
+ if (error.name === "QuotaExceededError") {
+ await executeQuotaErrorCallbacks();
+ }
+ throw error;
+ }
+ for (const plugin of updatePlugins) {
+ await plugin["cacheDidUpdate"].call(plugin, {
+ cacheName,
+ event,
+ oldResponse,
+ newResponse: responseToCache,
+ request: effectiveRequest
+ });
+ }
+};
+var cacheWrapper = {
+ put: putWrapper,
+ match: matchWrapper
+};
+
+// node_modules/workbox-core/_private/canConstructResponseFromBodyStream.js
+function canConstructResponseFromBodyStream() {
+ if (supportStatus === undefined) {
+ const testResponse = new Response("");
+ if ("body" in testResponse) {
+ try {
+ new Response(testResponse.body);
+ supportStatus = true;
+ } catch (error) {
+ supportStatus = false;
+ }
+ }
+ supportStatus = false;
+ }
+ return supportStatus;
+}
+var supportStatus;
+
+// node_modules/workbox-core/_private/dontWaitFor.js
+function dontWaitFor(promise) {
+ promise.then(() => {
+ });
+}
+
+// node_modules/workbox-core/_private/DBWrapper.js
+class DBWrapper {
+ constructor(name, version, { onupgradeneeded, onversionchange } = {}) {
+ this._db = null;
+ this._name = name;
+ this._version = version;
+ this._onupgradeneeded = onupgradeneeded;
+ this._onversionchange = onversionchange || (() => this.close());
+ }
+ get db() {
+ return this._db;
+ }
+ async open() {
+ if (this._db)
+ return;
+ this._db = await new Promise((resolve, reject) => {
+ let openRequestTimedOut = false;
+ setTimeout(() => {
+ openRequestTimedOut = true;
+ reject(new Error("The open request was blocked and timed out"));
+ }, this.OPEN_TIMEOUT);
+ const openRequest = indexedDB.open(this._name, this._version);
+ openRequest.onerror = () => reject(openRequest.error);
+ openRequest.onupgradeneeded = (evt) => {
+ if (openRequestTimedOut) {
+ openRequest.transaction.abort();
+ openRequest.result.close();
+ } else if (typeof this._onupgradeneeded === "function") {
+ this._onupgradeneeded(evt);
+ }
+ };
+ openRequest.onsuccess = () => {
+ const db = openRequest.result;
+ if (openRequestTimedOut) {
+ db.close();
+ } else {
+ db.onversionchange = this._onversionchange.bind(this);
+ resolve(db);
+ }
+ };
+ });
+ return this;
+ }
+ async getKey(storeName, query) {
+ return (await this.getAllKeys(storeName, query, 1))[0];
+ }
+ async getAll(storeName, query, count) {
+ return await this.getAllMatching(storeName, { query, count });
+ }
+ async getAllKeys(storeName, query, count) {
+ const entries = await this.getAllMatching(storeName, { query, count, includeKeys: true });
+ return entries.map((entry) => entry.key);
+ }
+ async getAllMatching(storeName, {
+ index,
+ query = null,
+ direction = "next",
+ count,
+ includeKeys = false
+ } = {}) {
+ return await this.transaction([storeName], "readonly", (txn, done) => {
+ const store = txn.objectStore(storeName);
+ const target = index ? store.index(index) : store;
+ const results = [];
+ const request = target.openCursor(query, direction);
+ request.onsuccess = () => {
+ const cursor = request.result;
+ if (cursor) {
+ results.push(includeKeys ? cursor : cursor.value);
+ if (count && results.length >= count) {
+ done(results);
+ } else {
+ cursor.continue();
+ }
+ } else {
+ done(results);
+ }
+ };
+ });
+ }
+ async transaction(storeNames, type, callback) {
+ await this.open();
+ return await new Promise((resolve, reject) => {
+ const txn = this._db.transaction(storeNames, type);
+ txn.onabort = () => reject(txn.error);
+ txn.oncomplete = () => resolve();
+ callback(txn, (value) => resolve(value));
+ });
+ }
+ async _call(method, storeName, type, ...args) {
+ const callback = (txn, done) => {
+ const objStore = txn.objectStore(storeName);
+ const request = objStore[method].apply(objStore, args);
+ request.onsuccess = () => done(request.result);
+ };
+ return await this.transaction([storeName], type, callback);
+ }
+ close() {
+ if (this._db) {
+ this._db.close();
+ this._db = null;
+ }
+ }
+}
+DBWrapper.prototype.OPEN_TIMEOUT = 2000;
+var methodsToWrap = {
+ readonly: ["get", "count", "getKey", "getAll", "getAllKeys"],
+ readwrite: ["add", "put", "clear", "delete"]
+};
+for (const [mode, methods] of Object.entries(methodsToWrap)) {
+ for (const method of methods) {
+ if (method in IDBObjectStore.prototype) {
+ DBWrapper.prototype[method] = async function(storeName, ...args) {
+ return await this._call(method, storeName, mode, ...args);
+ };
+ }
+ }
+}
+
+// node_modules/workbox-core/_private/deleteDatabase.js
+var deleteDatabase = async (name) => {
+ await new Promise((resolve, reject) => {
+ const request = indexedDB.deleteDatabase(name);
+ request.onerror = () => {
+ reject(request.error);
+ };
+ request.onblocked = () => {
+ reject(new Error("Delete blocked"));
+ };
+ request.onsuccess = () => {
+ resolve();
+ };
+ });
+};
+
+// node_modules/workbox-core/_private/fetchWrapper.js
+var wrappedFetch = async ({ request, fetchOptions, event, plugins = [] }) => {
+ if (typeof request === "string") {
+ request = new Request(request);
+ }
+ if (event instanceof FetchEvent && event.preloadResponse) {
+ const possiblePreloadResponse = await event.preloadResponse;
+ if (possiblePreloadResponse) {
+ if (true) {
+ logger.log(`Using a preloaded navigation response for ` + `'${getFriendlyURL(request.url)}'`);
+ }
+ return possiblePreloadResponse;
+ }
+ }
+ if (true) {
+ finalAssertExports.isInstance(request, Request, {
+ paramName: "request",
+ expectedClass: Request,
+ moduleName: "workbox-core",
+ className: "fetchWrapper",
+ funcName: "wrappedFetch"
+ });
+ }
+ const failedFetchPlugins = pluginUtils.filter(plugins, "fetchDidFail");
+ const originalRequest = failedFetchPlugins.length > 0 ? request.clone() : null;
+ try {
+ for (const plugin of plugins) {
+ if ("requestWillFetch" in plugin) {
+ const pluginMethod = plugin["requestWillFetch"];
+ const requestClone = request.clone();
+ request = await pluginMethod.call(plugin, {
+ request: requestClone,
+ event
+ });
+ if (true) {
+ if (request) {
+ finalAssertExports.isInstance(request, Request, {
+ moduleName: "Plugin",
+ funcName: "cachedResponseWillBeUsed",
+ isReturnValueProblem: true
+ });
+ }
+ }
+ }
+ }
+ } catch (err) {
+ throw new WorkboxError("plugin-error-request-will-fetch", {
+ thrownError: err
+ });
+ }
+ const pluginFilteredRequest = request.clone();
+ try {
+ let fetchResponse;
+ if (request.mode === "navigate") {
+ fetchResponse = await fetch(request);
+ } else {
+ fetchResponse = await fetch(request, fetchOptions);
+ }
+ if (true) {
+ logger.debug(`Network request for ` + `'${getFriendlyURL(request.url)}' returned a response with ` + `status '${fetchResponse.status}'.`);
+ }
+ for (const plugin of plugins) {
+ if ("fetchDidSucceed" in plugin) {
+ fetchResponse = await plugin["fetchDidSucceed"].call(plugin, {
+ event,
+ request: pluginFilteredRequest,
+ response: fetchResponse
+ });
+ if (true) {
+ if (fetchResponse) {
+ finalAssertExports.isInstance(fetchResponse, Response, {
+ moduleName: "Plugin",
+ funcName: "fetchDidSucceed",
+ isReturnValueProblem: true
+ });
+ }
+ }
+ }
+ }
+ return fetchResponse;
+ } catch (error) {
+ if (true) {
+ logger.error(`Network request for ` + `'${getFriendlyURL(request.url)}' threw an error.`, error);
+ }
+ for (const plugin of failedFetchPlugins) {
+ await plugin["fetchDidFail"].call(plugin, {
+ error,
+ event,
+ originalRequest: originalRequest.clone(),
+ request: pluginFilteredRequest.clone()
+ });
+ }
+ throw error;
+ }
+};
+var fetchWrapper = {
+ fetch: wrappedFetch
+};
+
+// node_modules/workbox-core/copyResponse.js
+async function copyResponse(response, modifier) {
+ const clonedResponse = response.clone();
+ const responseInit = {
+ headers: new Headers(clonedResponse.headers),
+ status: clonedResponse.status,
+ statusText: clonedResponse.statusText
+ };
+ const modifiedResponseInit = modifier ? modifier(responseInit) : responseInit;
+ const body = canConstructResponseFromBodyStream() ? clonedResponse.body : await clonedResponse.blob();
+ return new Response(body, modifiedResponseInit);
+}
+
+// node_modules/workbox-core/clientsClaim.js
+function clientsClaim() {
+ self.addEventListener("activate", () => self.clients.claim());
+}
+// node_modules/workbox-expiration/_version.js
+try {
+ self["workbox:expiration:5.1.4"] && _();
+} catch (e) {
+}
+
+// node_modules/workbox-expiration/models/CacheTimestampsModel.js
+var DB_NAME = "workbox-expiration";
+var OBJECT_STORE_NAME = "cache-entries";
+var normalizeURL = (unNormalizedUrl) => {
+ const url = new URL(unNormalizedUrl, location.href);
+ url.hash = "";
+ return url.href;
+};
+
+class CacheTimestampsModel {
+ constructor(cacheName) {
+ this._cacheName = cacheName;
+ this._db = new DBWrapper(DB_NAME, 1, {
+ onupgradeneeded: (event) => this._handleUpgrade(event)
+ });
+ }
+ _handleUpgrade(event) {
+ const db = event.target.result;
+ const objStore = db.createObjectStore(OBJECT_STORE_NAME, { keyPath: "id" });
+ objStore.createIndex("cacheName", "cacheName", { unique: false });
+ objStore.createIndex("timestamp", "timestamp", { unique: false });
+ deleteDatabase(this._cacheName);
+ }
+ async setTimestamp(url, timestamp) {
+ url = normalizeURL(url);
+ const entry = {
+ url,
+ timestamp,
+ cacheName: this._cacheName,
+ id: this._getId(url)
+ };
+ await this._db.put(OBJECT_STORE_NAME, entry);
+ }
+ async getTimestamp(url) {
+ const entry = await this._db.get(OBJECT_STORE_NAME, this._getId(url));
+ return entry.timestamp;
+ }
+ async expireEntries(minTimestamp, maxCount) {
+ const entriesToDelete = await this._db.transaction(OBJECT_STORE_NAME, "readwrite", (txn, done) => {
+ const store = txn.objectStore(OBJECT_STORE_NAME);
+ const request = store.index("timestamp").openCursor(null, "prev");
+ const entriesToDelete2 = [];
+ let entriesNotDeletedCount = 0;
+ request.onsuccess = () => {
+ const cursor = request.result;
+ if (cursor) {
+ const result = cursor.value;
+ if (result.cacheName === this._cacheName) {
+ if (minTimestamp && result.timestamp < minTimestamp || maxCount && entriesNotDeletedCount >= maxCount) {
+ entriesToDelete2.push(cursor.value);
+ } else {
+ entriesNotDeletedCount++;
+ }
+ }
+ cursor.continue();
+ } else {
+ done(entriesToDelete2);
+ }
+ };
+ });
+ const urlsDeleted = [];
+ for (const entry of entriesToDelete) {
+ await this._db.delete(OBJECT_STORE_NAME, entry.id);
+ urlsDeleted.push(entry.url);
+ }
+ return urlsDeleted;
+ }
+ _getId(url) {
+ return this._cacheName + "|" + normalizeURL(url);
+ }
+}
+
+// node_modules/workbox-expiration/CacheExpiration.js
+class CacheExpiration {
+ constructor(cacheName, config = {}) {
+ this._isRunning = false;
+ this._rerunRequested = false;
+ if (true) {
+ finalAssertExports.isType(cacheName, "string", {
+ moduleName: "workbox-expiration",
+ className: "CacheExpiration",
+ funcName: "constructor",
+ paramName: "cacheName"
+ });
+ if (!(config.maxEntries || config.maxAgeSeconds)) {
+ throw new WorkboxError("max-entries-or-age-required", {
+ moduleName: "workbox-expiration",
+ className: "CacheExpiration",
+ funcName: "constructor"
+ });
+ }
+ if (config.maxEntries) {
+ finalAssertExports.isType(config.maxEntries, "number", {
+ moduleName: "workbox-expiration",
+ className: "CacheExpiration",
+ funcName: "constructor",
+ paramName: "config.maxEntries"
+ });
+ }
+ if (config.maxAgeSeconds) {
+ finalAssertExports.isType(config.maxAgeSeconds, "number", {
+ moduleName: "workbox-expiration",
+ className: "CacheExpiration",
+ funcName: "constructor",
+ paramName: "config.maxAgeSeconds"
+ });
+ }
+ }
+ this._maxEntries = config.maxEntries;
+ this._maxAgeSeconds = config.maxAgeSeconds;
+ this._cacheName = cacheName;
+ this._timestampModel = new CacheTimestampsModel(cacheName);
+ }
+ async expireEntries() {
+ if (this._isRunning) {
+ this._rerunRequested = true;
+ return;
+ }
+ this._isRunning = true;
+ const minTimestamp = this._maxAgeSeconds ? Date.now() - this._maxAgeSeconds * 1000 : 0;
+ const urlsExpired = await this._timestampModel.expireEntries(minTimestamp, this._maxEntries);
+ const cache = await self.caches.open(this._cacheName);
+ for (const url of urlsExpired) {
+ await cache.delete(url);
+ }
+ if (true) {
+ if (urlsExpired.length > 0) {
+ logger.groupCollapsed(`Expired ${urlsExpired.length} ` + `${urlsExpired.length === 1 ? "entry" : "entries"} and removed ` + `${urlsExpired.length === 1 ? "it" : "them"} from the ` + `'${this._cacheName}' cache.`);
+ logger.log(`Expired the following ${urlsExpired.length === 1 ? "URL" : "URLs"}:`);
+ urlsExpired.forEach((url) => logger.log(` ${url}`));
+ logger.groupEnd();
+ } else {
+ logger.debug(`Cache expiration ran and found no entries to remove.`);
+ }
+ }
+ this._isRunning = false;
+ if (this._rerunRequested) {
+ this._rerunRequested = false;
+ dontWaitFor(this.expireEntries());
+ }
+ }
+ async updateTimestamp(url) {
+ if (true) {
+ finalAssertExports.isType(url, "string", {
+ moduleName: "workbox-expiration",
+ className: "CacheExpiration",
+ funcName: "updateTimestamp",
+ paramName: "url"
+ });
+ }
+ await this._timestampModel.setTimestamp(url, Date.now());
+ }
+ async isURLExpired(url) {
+ if (!this._maxAgeSeconds) {
+ if (true) {
+ throw new WorkboxError(`expired-test-without-max-age`, {
+ methodName: "isURLExpired",
+ paramName: "maxAgeSeconds"
+ });
+ }
+ return false;
+ } else {
+ const timestamp = await this._timestampModel.getTimestamp(url);
+ const expireOlderThan = Date.now() - this._maxAgeSeconds * 1000;
+ return timestamp < expireOlderThan;
+ }
+ }
+ async delete() {
+ this._rerunRequested = false;
+ await this._timestampModel.expireEntries(Infinity);
+ }
+}
+
+// node_modules/workbox-expiration/ExpirationPlugin.js
+class ExpirationPlugin {
+ constructor(config = {}) {
+ this.cachedResponseWillBeUsed = async ({ event, request, cacheName, cachedResponse }) => {
+ if (!cachedResponse) {
+ return null;
+ }
+ const isFresh = this._isResponseDateFresh(cachedResponse);
+ const cacheExpiration = this._getCacheExpiration(cacheName);
+ dontWaitFor(cacheExpiration.expireEntries());
+ const updateTimestampDone = cacheExpiration.updateTimestamp(request.url);
+ if (event) {
+ try {
+ event.waitUntil(updateTimestampDone);
+ } catch (error) {
+ if (true) {
+ if ("request" in event) {
+ logger.warn(`Unable to ensure service worker stays alive when ` + `updating cache entry for ` + `'${getFriendlyURL(event.request.url)}'.`);
+ }
+ }
+ }
+ }
+ return isFresh ? cachedResponse : null;
+ };
+ this.cacheDidUpdate = async ({ cacheName, request }) => {
+ if (true) {
+ finalAssertExports.isType(cacheName, "string", {
+ moduleName: "workbox-expiration",
+ className: "Plugin",
+ funcName: "cacheDidUpdate",
+ paramName: "cacheName"
+ });
+ finalAssertExports.isInstance(request, Request, {
+ moduleName: "workbox-expiration",
+ className: "Plugin",
+ funcName: "cacheDidUpdate",
+ paramName: "request"
+ });
+ }
+ const cacheExpiration = this._getCacheExpiration(cacheName);
+ await cacheExpiration.updateTimestamp(request.url);
+ await cacheExpiration.expireEntries();
+ };
+ if (true) {
+ if (!(config.maxEntries || config.maxAgeSeconds)) {
+ throw new WorkboxError("max-entries-or-age-required", {
+ moduleName: "workbox-expiration",
+ className: "Plugin",
+ funcName: "constructor"
+ });
+ }
+ if (config.maxEntries) {
+ finalAssertExports.isType(config.maxEntries, "number", {
+ moduleName: "workbox-expiration",
+ className: "Plugin",
+ funcName: "constructor",
+ paramName: "config.maxEntries"
+ });
+ }
+ if (config.maxAgeSeconds) {
+ finalAssertExports.isType(config.maxAgeSeconds, "number", {
+ moduleName: "workbox-expiration",
+ className: "Plugin",
+ funcName: "constructor",
+ paramName: "config.maxAgeSeconds"
+ });
+ }
+ }
+ this._config = config;
+ this._maxAgeSeconds = config.maxAgeSeconds;
+ this._cacheExpirations = new Map;
+ if (config.purgeOnQuotaError) {
+ registerQuotaErrorCallback(() => this.deleteCacheAndMetadata());
+ }
+ }
+ _getCacheExpiration(cacheName) {
+ if (cacheName === cacheNames.getRuntimeName()) {
+ throw new WorkboxError("expire-custom-caches-only");
+ }
+ let cacheExpiration = this._cacheExpirations.get(cacheName);
+ if (!cacheExpiration) {
+ cacheExpiration = new CacheExpiration(cacheName, this._config);
+ this._cacheExpirations.set(cacheName, cacheExpiration);
+ }
+ return cacheExpiration;
+ }
+ _isResponseDateFresh(cachedResponse) {
+ if (!this._maxAgeSeconds) {
+ return true;
+ }
+ const dateHeaderTimestamp = this._getDateHeaderTimestamp(cachedResponse);
+ if (dateHeaderTimestamp === null) {
+ return true;
+ }
+ const now = Date.now();
+ return dateHeaderTimestamp >= now - this._maxAgeSeconds * 1000;
+ }
+ _getDateHeaderTimestamp(cachedResponse) {
+ if (!cachedResponse.headers.has("date")) {
+ return null;
+ }
+ const dateHeader = cachedResponse.headers.get("date");
+ const parsedDate = new Date(dateHeader);
+ const headerTime = parsedDate.getTime();
+ if (isNaN(headerTime)) {
+ return null;
+ }
+ return headerTime;
+ }
+ async deleteCacheAndMetadata() {
+ for (const [cacheName, cacheExpiration] of this._cacheExpirations) {
+ await self.caches.delete(cacheName);
+ await cacheExpiration.delete();
+ }
+ this._cacheExpirations = new Map;
+ }
+}
+// node_modules/workbox-precaching/_version.js
+try {
+ self["workbox:precaching:5.1.4"] && _();
+} catch (e) {
+}
+
+// node_modules/workbox-precaching/utils/precachePlugins.js
+var plugins = [];
+var precachePlugins = {
+ get() {
+ return plugins;
+ },
+ add(newPlugins) {
+ plugins.push(...newPlugins);
+ }
+};
+
+// node_modules/workbox-precaching/utils/createCacheKey.js
+function createCacheKey(entry) {
+ if (!entry) {
+ throw new WorkboxError("add-to-cache-list-unexpected-type", { entry });
+ }
+ if (typeof entry === "string") {
+ const urlObject = new URL(entry, location.href);
+ return {
+ cacheKey: urlObject.href,
+ url: urlObject.href
+ };
+ }
+ const { revision, url } = entry;
+ if (!url) {
+ throw new WorkboxError("add-to-cache-list-unexpected-type", { entry });
+ }
+ if (!revision) {
+ const urlObject = new URL(url, location.href);
+ return {
+ cacheKey: urlObject.href,
+ url: urlObject.href
+ };
+ }
+ const cacheKeyURL = new URL(url, location.href);
+ const originalURL = new URL(url, location.href);
+ cacheKeyURL.searchParams.set(REVISION_SEARCH_PARAM, revision);
+ return {
+ cacheKey: cacheKeyURL.href,
+ url: originalURL.href
+ };
+}
+var REVISION_SEARCH_PARAM = "__WB_REVISION__";
+
+// node_modules/workbox-precaching/utils/printCleanupDetails.js
+function printCleanupDetails(deletedURLs) {
+ const deletionCount = deletedURLs.length;
+ if (deletionCount > 0) {
+ logger.groupCollapsed(`During precaching cleanup, ` + `${deletionCount} cached ` + `request${deletionCount === 1 ? " was" : "s were"} deleted.`);
+ logGroup("Deleted Cache Requests", deletedURLs);
+ logger.groupEnd();
+ }
+}
+var logGroup = (groupTitle, deletedURLs) => {
+ logger.groupCollapsed(groupTitle);
+ for (const url of deletedURLs) {
+ logger.log(url);
+ }
+ logger.groupEnd();
+};
+
+// node_modules/workbox-precaching/utils/printInstallDetails.js
+function _nestedGroup(groupTitle, urls) {
+ if (urls.length === 0) {
+ return;
+ }
+ logger.groupCollapsed(groupTitle);
+ for (const url of urls) {
+ logger.log(url);
+ }
+ logger.groupEnd();
+}
+function printInstallDetails(urlsToPrecache, urlsAlreadyPrecached) {
+ const precachedCount = urlsToPrecache.length;
+ const alreadyPrecachedCount = urlsAlreadyPrecached.length;
+ if (precachedCount || alreadyPrecachedCount) {
+ let message = `Precaching ${precachedCount} file${precachedCount === 1 ? "" : "s"}.`;
+ if (alreadyPrecachedCount > 0) {
+ message += ` ${alreadyPrecachedCount} ` + `file${alreadyPrecachedCount === 1 ? " is" : "s are"} already cached.`;
+ }
+ logger.groupCollapsed(message);
+ _nestedGroup(`View newly precached URLs.`, urlsToPrecache);
+ _nestedGroup(`View previously precached URLs.`, urlsAlreadyPrecached);
+ logger.groupEnd();
+ }
+}
+
+// node_modules/workbox-precaching/PrecacheController.js
+class PrecacheController {
+ constructor(cacheName) {
+ this._cacheName = cacheNames.getPrecacheName(cacheName);
+ this._urlsToCacheKeys = new Map;
+ this._urlsToCacheModes = new Map;
+ this._cacheKeysToIntegrities = new Map;
+ }
+ addToCacheList(entries) {
+ if (true) {
+ finalAssertExports.isArray(entries, {
+ moduleName: "workbox-precaching",
+ className: "PrecacheController",
+ funcName: "addToCacheList",
+ paramName: "entries"
+ });
+ }
+ const urlsToWarnAbout = [];
+ for (const entry of entries) {
+ if (typeof entry === "string") {
+ urlsToWarnAbout.push(entry);
+ } else if (entry && entry.revision === undefined) {
+ urlsToWarnAbout.push(entry.url);
+ }
+ const { cacheKey, url } = createCacheKey(entry);
+ const cacheMode = typeof entry !== "string" && entry.revision ? "reload" : "default";
+ if (this._urlsToCacheKeys.has(url) && this._urlsToCacheKeys.get(url) !== cacheKey) {
+ throw new WorkboxError("add-to-cache-list-conflicting-entries", {
+ firstEntry: this._urlsToCacheKeys.get(url),
+ secondEntry: cacheKey
+ });
+ }
+ if (typeof entry !== "string" && entry.integrity) {
+ if (this._cacheKeysToIntegrities.has(cacheKey) && this._cacheKeysToIntegrities.get(cacheKey) !== entry.integrity) {
+ throw new WorkboxError("add-to-cache-list-conflicting-integrities", {
+ url
+ });
+ }
+ this._cacheKeysToIntegrities.set(cacheKey, entry.integrity);
+ }
+ this._urlsToCacheKeys.set(url, cacheKey);
+ this._urlsToCacheModes.set(url, cacheMode);
+ if (urlsToWarnAbout.length > 0) {
+ const warningMessage = `Workbox is precaching URLs without revision ` + `info: ${urlsToWarnAbout.join(", ")}\nThis is generally NOT safe. ` + `Learn more at https://bit.ly/wb-precache`;
+ if (false) {
+ } else {
+ logger.warn(warningMessage);
+ }
+ }
+ }
+ }
+ async install({ event, plugins: plugins2 } = {}) {
+ if (true) {
+ if (plugins2) {
+ finalAssertExports.isArray(plugins2, {
+ moduleName: "workbox-precaching",
+ className: "PrecacheController",
+ funcName: "install",
+ paramName: "plugins"
+ });
+ }
+ }
+ const toBePrecached = [];
+ const alreadyPrecached = [];
+ const cache = await self.caches.open(this._cacheName);
+ const alreadyCachedRequests = await cache.keys();
+ const existingCacheKeys = new Set(alreadyCachedRequests.map((request) => request.url));
+ for (const [url, cacheKey] of this._urlsToCacheKeys) {
+ if (existingCacheKeys.has(cacheKey)) {
+ alreadyPrecached.push(url);
+ } else {
+ toBePrecached.push({ cacheKey, url });
+ }
+ }
+ const precacheRequests = toBePrecached.map(({ cacheKey, url }) => {
+ const integrity = this._cacheKeysToIntegrities.get(cacheKey);
+ const cacheMode = this._urlsToCacheModes.get(url);
+ return this._addURLToCache({
+ cacheKey,
+ cacheMode,
+ event,
+ integrity,
+ plugins: plugins2,
+ url
+ });
+ });
+ await Promise.all(precacheRequests);
+ const updatedURLs = toBePrecached.map((item) => item.url);
+ if (true) {
+ printInstallDetails(updatedURLs, alreadyPrecached);
+ }
+ return {
+ updatedURLs,
+ notUpdatedURLs: alreadyPrecached
+ };
+ }
+ async activate() {
+ const cache = await self.caches.open(this._cacheName);
+ const currentlyCachedRequests = await cache.keys();
+ const expectedCacheKeys = new Set(this._urlsToCacheKeys.values());
+ const deletedURLs = [];
+ for (const request of currentlyCachedRequests) {
+ if (!expectedCacheKeys.has(request.url)) {
+ await cache.delete(request);
+ deletedURLs.push(request.url);
+ }
+ }
+ if (true) {
+ printCleanupDetails(deletedURLs);
+ }
+ return { deletedURLs };
+ }
+ async _addURLToCache({ cacheKey, url, cacheMode, event, plugins: plugins2, integrity }) {
+ const request = new Request(url, {
+ integrity,
+ cache: cacheMode,
+ credentials: "same-origin"
+ });
+ let response = await fetchWrapper.fetch({
+ event,
+ plugins: plugins2,
+ request
+ });
+ let cacheWillUpdatePlugin;
+ for (const plugin of plugins2 || []) {
+ if ("cacheWillUpdate" in plugin) {
+ cacheWillUpdatePlugin = plugin;
+ }
+ }
+ const isValidResponse = cacheWillUpdatePlugin ? await cacheWillUpdatePlugin.cacheWillUpdate({ event, request, response }) : response.status < 400;
+ if (!isValidResponse) {
+ throw new WorkboxError("bad-precaching-response", {
+ url,
+ status: response.status
+ });
+ }
+ if (response.redirected) {
+ response = await copyResponse(response);
+ }
+ await cacheWrapper.put({
+ event,
+ plugins: plugins2,
+ response,
+ request: cacheKey === url ? request : new Request(cacheKey),
+ cacheName: this._cacheName,
+ matchOptions: {
+ ignoreSearch: true
+ }
+ });
+ }
+ getURLsToCacheKeys() {
+ return this._urlsToCacheKeys;
+ }
+ getCachedURLs() {
+ return [...this._urlsToCacheKeys.keys()];
+ }
+ getCacheKeyForURL(url) {
+ const urlObject = new URL(url, location.href);
+ return this._urlsToCacheKeys.get(urlObject.href);
+ }
+ async matchPrecache(request) {
+ const url = request instanceof Request ? request.url : request;
+ const cacheKey = this.getCacheKeyForURL(url);
+ if (cacheKey) {
+ const cache = await self.caches.open(this._cacheName);
+ return cache.match(cacheKey);
+ }
+ return;
+ }
+ createHandler(fallbackToNetwork = true) {
+ return async ({ request }) => {
+ try {
+ const response = await this.matchPrecache(request);
+ if (response) {
+ return response;
+ }
+ throw new WorkboxError("missing-precache-entry", {
+ cacheName: this._cacheName,
+ url: request instanceof Request ? request.url : request
+ });
+ } catch (error) {
+ if (fallbackToNetwork) {
+ if (true) {
+ logger.debug(`Unable to respond with precached response. ` + `Falling back to network.`, error);
+ }
+ return fetch(request);
+ }
+ throw error;
+ }
+ };
+ }
+ createHandlerBoundToURL(url, fallbackToNetwork = true) {
+ const cacheKey = this.getCacheKeyForURL(url);
+ if (!cacheKey) {
+ throw new WorkboxError("non-precached-url", { url });
+ }
+ const handler = this.createHandler(fallbackToNetwork);
+ const request = new Request(url);
+ return () => handler({ request });
+ }
+}
+
+// node_modules/workbox-precaching/utils/getOrCreatePrecacheController.js
+var precacheController;
+var getOrCreatePrecacheController = () => {
+ if (!precacheController) {
+ precacheController = new PrecacheController;
+ }
+ return precacheController;
+};
+
+// node_modules/workbox-precaching/utils/removeIgnoredSearchParams.js
+function removeIgnoredSearchParams(urlObject, ignoreURLParametersMatching = []) {
+ for (const paramName of [...urlObject.searchParams.keys()]) {
+ if (ignoreURLParametersMatching.some((regExp) => regExp.test(paramName))) {
+ urlObject.searchParams.delete(paramName);
+ }
+ }
+ return urlObject;
+}
+
+// node_modules/workbox-precaching/utils/generateURLVariations.js
+function* generateURLVariations(url, { ignoreURLParametersMatching, directoryIndex, cleanURLs, urlManipulation } = {}) {
+ const urlObject = new URL(url, location.href);
+ urlObject.hash = "";
+ yield urlObject.href;
+ const urlWithoutIgnoredParams = removeIgnoredSearchParams(urlObject, ignoreURLParametersMatching);
+ yield urlWithoutIgnoredParams.href;
+ if (directoryIndex && urlWithoutIgnoredParams.pathname.endsWith("/")) {
+ const directoryURL = new URL(urlWithoutIgnoredParams.href);
+ directoryURL.pathname += directoryIndex;
+ yield directoryURL.href;
+ }
+ if (cleanURLs) {
+ const cleanURL = new URL(urlWithoutIgnoredParams.href);
+ cleanURL.pathname += ".html";
+ yield cleanURL.href;
+ }
+ if (urlManipulation) {
+ const additionalURLs = urlManipulation({ url: urlObject });
+ for (const urlToAttempt of additionalURLs) {
+ yield urlToAttempt.href;
+ }
+ }
+}
+
+// node_modules/workbox-precaching/utils/getCacheKeyForURL.js
+var getCacheKeyForURL = (url, options) => {
+ const precacheController2 = getOrCreatePrecacheController();
+ const urlsToCacheKeys = precacheController2.getURLsToCacheKeys();
+ for (const possibleURL of generateURLVariations(url, options)) {
+ const possibleCacheKey = urlsToCacheKeys.get(possibleURL);
+ if (possibleCacheKey) {
+ return possibleCacheKey;
+ }
+ }
+};
+
+// node_modules/workbox-precaching/utils/addFetchListener.js
+var addFetchListener = ({ ignoreURLParametersMatching = [/^utm_/], directoryIndex = "index.html", cleanURLs = true, urlManipulation } = {}) => {
+ const cacheName = cacheNames.getPrecacheName();
+ self.addEventListener("fetch", (event) => {
+ const precachedURL = getCacheKeyForURL(event.request.url, {
+ cleanURLs,
+ directoryIndex,
+ ignoreURLParametersMatching,
+ urlManipulation
+ });
+ if (!precachedURL) {
+ if (true) {
+ logger.debug(`Precaching did not find a match for ` + getFriendlyURL(event.request.url));
+ }
+ return;
+ }
+ let responsePromise = self.caches.open(cacheName).then((cache) => {
+ return cache.match(precachedURL);
+ }).then((cachedResponse) => {
+ if (cachedResponse) {
+ return cachedResponse;
+ }
+ if (true) {
+ logger.warn(`The precached response for ` + `${getFriendlyURL(precachedURL)} in ${cacheName} was not found. ` + `Falling back to the network instead.`);
+ }
+ return fetch(precachedURL);
+ });
+ if (true) {
+ responsePromise = responsePromise.then((response) => {
+ logger.groupCollapsed(`Precaching is responding to: ` + getFriendlyURL(event.request.url));
+ logger.log(`Serving the precached url: ${precachedURL}`);
+ logger.groupCollapsed(`View request details here.`);
+ logger.log(event.request);
+ logger.groupEnd();
+ logger.groupCollapsed(`View response details here.`);
+ logger.log(response);
+ logger.groupEnd();
+ logger.groupEnd();
+ return response;
+ });
+ }
+ event.respondWith(responsePromise);
+ });
+};
+
+// node_modules/workbox-precaching/addRoute.js
+function addRoute(options) {
+ if (!listenerAdded) {
+ addFetchListener(options);
+ listenerAdded = true;
+ }
+}
+var listenerAdded = false;
+
+// node_modules/workbox-precaching/createHandlerBoundToURL.js
+function createHandlerBoundToURL(url) {
+ const precacheController2 = getOrCreatePrecacheController();
+ return precacheController2.createHandlerBoundToURL(url);
+}
+
+// node_modules/workbox-precaching/precache.js
+function precache(entries) {
+ const precacheController2 = getOrCreatePrecacheController();
+ precacheController2.addToCacheList(entries);
+ if (entries.length > 0) {
+ self.addEventListener("install", installListener);
+ self.addEventListener("activate", activateListener);
+ }
+}
+var installListener = (event) => {
+ const precacheController2 = getOrCreatePrecacheController();
+ const plugins2 = precachePlugins.get();
+ event.waitUntil(precacheController2.install({ event, plugins: plugins2 }).catch((error) => {
+ if (true) {
+ logger.error(`Service worker installation failed. It will ` + `be retried automatically during the next navigation.`);
+ }
+ throw error;
+ }));
+};
+var activateListener = (event) => {
+ const precacheController2 = getOrCreatePrecacheController();
+ event.waitUntil(precacheController2.activate());
+};
+
+// node_modules/workbox-precaching/precacheAndRoute.js
+function precacheAndRoute(entries, options) {
+ precache(entries);
+ addRoute(options);
+}
+// node_modules/workbox-routing/_version.js
+try {
+ self["workbox:routing:5.1.4"] && _();
+} catch (e) {
+}
+
+// node_modules/workbox-routing/utils/constants.js
+var defaultMethod = "GET";
+var validMethods = [
+ "DELETE",
+ "GET",
+ "HEAD",
+ "PATCH",
+ "POST",
+ "PUT"
+];
+
+// node_modules/workbox-routing/utils/normalizeHandler.js
+var normalizeHandler = (handler) => {
+ if (handler && typeof handler === "object") {
+ if (true) {
+ finalAssertExports.hasMethod(handler, "handle", {
+ moduleName: "workbox-routing",
+ className: "Route",
+ funcName: "constructor",
+ paramName: "handler"
+ });
+ }
+ return handler;
+ } else {
+ if (true) {
+ finalAssertExports.isType(handler, "function", {
+ moduleName: "workbox-routing",
+ className: "Route",
+ funcName: "constructor",
+ paramName: "handler"
+ });
+ }
+ return { handle: handler };
+ }
+};
+
+// node_modules/workbox-routing/Route.js
+class Route {
+ constructor(match, handler, method = defaultMethod) {
+ if (true) {
+ finalAssertExports.isType(match, "function", {
+ moduleName: "workbox-routing",
+ className: "Route",
+ funcName: "constructor",
+ paramName: "match"
+ });
+ if (method) {
+ finalAssertExports.isOneOf(method, validMethods, { paramName: "method" });
+ }
+ }
+ this.handler = normalizeHandler(handler);
+ this.match = match;
+ this.method = method;
+ }
+}
+
+// node_modules/workbox-routing/RegExpRoute.js
+class RegExpRoute extends Route {
+ constructor(regExp, handler, method) {
+ if (true) {
+ finalAssertExports.isInstance(regExp, RegExp, {
+ moduleName: "workbox-routing",
+ className: "RegExpRoute",
+ funcName: "constructor",
+ paramName: "pattern"
+ });
+ }
+ const match = ({ url }) => {
+ const result = regExp.exec(url.href);
+ if (!result) {
+ return;
+ }
+ if (url.origin !== location.origin && result.index !== 0) {
+ if (true) {
+ logger.debug(`The regular expression '${regExp}' only partially matched ` + `against the cross-origin URL '${url}'. RegExpRoute's will only ` + `handle cross-origin requests if they match the entire URL.`);
+ }
+ return;
+ }
+ return result.slice(1);
+ };
+ super(match, handler, method);
+ }
+}
+
+// node_modules/workbox-routing/Router.js
+class Router {
+ constructor() {
+ this._routes = new Map;
+ }
+ get routes() {
+ return this._routes;
+ }
+ addFetchListener() {
+ self.addEventListener("fetch", (event) => {
+ const { request } = event;
+ const responsePromise = this.handleRequest({ request, event });
+ if (responsePromise) {
+ event.respondWith(responsePromise);
+ }
+ });
+ }
+ addCacheListener() {
+ self.addEventListener("message", (event) => {
+ if (event.data && event.data.type === "CACHE_URLS") {
+ const { payload } = event.data;
+ if (true) {
+ logger.debug(`Caching URLs from the window`, payload.urlsToCache);
+ }
+ const requestPromises = Promise.all(payload.urlsToCache.map((entry) => {
+ if (typeof entry === "string") {
+ entry = [entry];
+ }
+ const request = new Request(...entry);
+ return this.handleRequest({ request });
+ }));
+ event.waitUntil(requestPromises);
+ if (event.ports && event.ports[0]) {
+ requestPromises.then(() => event.ports[0].postMessage(true));
+ }
+ }
+ });
+ }
+ handleRequest({ request, event }) {
+ if (true) {
+ finalAssertExports.isInstance(request, Request, {
+ moduleName: "workbox-routing",
+ className: "Router",
+ funcName: "handleRequest",
+ paramName: "options.request"
+ });
+ }
+ const url = new URL(request.url, location.href);
+ if (!url.protocol.startsWith("http")) {
+ if (true) {
+ logger.debug(`Workbox Router only supports URLs that start with 'http'.`);
+ }
+ return;
+ }
+ const { params, route } = this.findMatchingRoute({ url, request, event });
+ let handler = route && route.handler;
+ const debugMessages = [];
+ if (true) {
+ if (handler) {
+ debugMessages.push([
+ `Found a route to handle this request:`,
+ route
+ ]);
+ if (params) {
+ debugMessages.push([
+ `Passing the following params to the route's handler:`,
+ params
+ ]);
+ }
+ }
+ }
+ if (!handler && this._defaultHandler) {
+ if (true) {
+ debugMessages.push(`Failed to find a matching route. Falling ` + `back to the default handler.`);
+ }
+ handler = this._defaultHandler;
+ }
+ if (!handler) {
+ if (true) {
+ logger.debug(`No route found for: ${getFriendlyURL(url)}`);
+ }
+ return;
+ }
+ if (true) {
+ logger.groupCollapsed(`Router is responding to: ${getFriendlyURL(url)}`);
+ debugMessages.forEach((msg) => {
+ if (Array.isArray(msg)) {
+ logger.log(...msg);
+ } else {
+ logger.log(msg);
+ }
+ });
+ logger.groupEnd();
+ }
+ let responsePromise;
+ try {
+ responsePromise = handler.handle({ url, request, event, params });
+ } catch (err) {
+ responsePromise = Promise.reject(err);
+ }
+ if (responsePromise instanceof Promise && this._catchHandler) {
+ responsePromise = responsePromise.catch((err) => {
+ if (true) {
+ logger.groupCollapsed(`Error thrown when responding to: ` + ` ${getFriendlyURL(url)}. Falling back to Catch Handler.`);
+ logger.error(`Error thrown by:`, route);
+ logger.error(err);
+ logger.groupEnd();
+ }
+ return this._catchHandler.handle({ url, request, event });
+ });
+ }
+ return responsePromise;
+ }
+ findMatchingRoute({ url, request, event }) {
+ if (true) {
+ finalAssertExports.isInstance(url, URL, {
+ moduleName: "workbox-routing",
+ className: "Router",
+ funcName: "findMatchingRoute",
+ paramName: "options.url"
+ });
+ finalAssertExports.isInstance(request, Request, {
+ moduleName: "workbox-routing",
+ className: "Router",
+ funcName: "findMatchingRoute",
+ paramName: "options.request"
+ });
+ }
+ const routes = this._routes.get(request.method) || [];
+ for (const route of routes) {
+ let params;
+ const matchResult = route.match({ url, request, event });
+ if (matchResult) {
+ params = matchResult;
+ if (Array.isArray(matchResult) && matchResult.length === 0) {
+ params = undefined;
+ } else if (matchResult.constructor === Object && Object.keys(matchResult).length === 0) {
+ params = undefined;
+ } else if (typeof matchResult === "boolean") {
+ params = undefined;
+ }
+ return { route, params };
+ }
+ }
+ return {};
+ }
+ setDefaultHandler(handler) {
+ this._defaultHandler = normalizeHandler(handler);
+ }
+ setCatchHandler(handler) {
+ this._catchHandler = normalizeHandler(handler);
+ }
+ registerRoute(route) {
+ if (true) {
+ finalAssertExports.isType(route, "object", {
+ moduleName: "workbox-routing",
+ className: "Router",
+ funcName: "registerRoute",
+ paramName: "route"
+ });
+ finalAssertExports.hasMethod(route, "match", {
+ moduleName: "workbox-routing",
+ className: "Router",
+ funcName: "registerRoute",
+ paramName: "route"
+ });
+ finalAssertExports.isType(route.handler, "object", {
+ moduleName: "workbox-routing",
+ className: "Router",
+ funcName: "registerRoute",
+ paramName: "route"
+ });
+ finalAssertExports.hasMethod(route.handler, "handle", {
+ moduleName: "workbox-routing",
+ className: "Router",
+ funcName: "registerRoute",
+ paramName: "route.handler"
+ });
+ finalAssertExports.isType(route.method, "string", {
+ moduleName: "workbox-routing",
+ className: "Router",
+ funcName: "registerRoute",
+ paramName: "route.method"
+ });
+ }
+ if (!this._routes.has(route.method)) {
+ this._routes.set(route.method, []);
+ }
+ this._routes.get(route.method).push(route);
+ }
+ unregisterRoute(route) {
+ if (!this._routes.has(route.method)) {
+ throw new WorkboxError("unregister-route-but-not-found-with-method", {
+ method: route.method
+ });
+ }
+ const routeIndex = this._routes.get(route.method).indexOf(route);
+ if (routeIndex > -1) {
+ this._routes.get(route.method).splice(routeIndex, 1);
+ } else {
+ throw new WorkboxError("unregister-route-route-not-registered");
+ }
+ }
+}
+
+// node_modules/workbox-routing/utils/getOrCreateDefaultRouter.js
+var defaultRouter;
+var getOrCreateDefaultRouter = () => {
+ if (!defaultRouter) {
+ defaultRouter = new Router;
+ defaultRouter.addFetchListener();
+ defaultRouter.addCacheListener();
+ }
+ return defaultRouter;
+};
+
+// node_modules/workbox-routing/registerRoute.js
+function registerRoute(capture, handler, method) {
+ let route;
+ if (typeof capture === "string") {
+ const captureUrl = new URL(capture, location.href);
+ if (true) {
+ if (!(capture.startsWith("/") || capture.startsWith("http"))) {
+ throw new WorkboxError("invalid-string", {
+ moduleName: "workbox-routing",
+ funcName: "registerRoute",
+ paramName: "capture"
+ });
+ }
+ const valueToCheck = capture.startsWith("http") ? captureUrl.pathname : capture;
+ const wildcards = "[*:?+]";
+ if (new RegExp(`${wildcards}`).exec(valueToCheck)) {
+ logger.debug(`The '\$capture' parameter contains an Express-style wildcard ` + `character (${wildcards}). Strings are now always interpreted as ` + `exact matches; use a RegExp for partial or wildcard matches.`);
+ }
+ }
+ const matchCallback = ({ url }) => {
+ if (true) {
+ if (url.pathname === captureUrl.pathname && url.origin !== captureUrl.origin) {
+ logger.debug(`${capture} only partially matches the cross-origin URL ` + `${url}. This route will only handle cross-origin requests ` + `if they match the entire URL.`);
+ }
+ }
+ return url.href === captureUrl.href;
+ };
+ route = new Route(matchCallback, handler, method);
+ } else if (capture instanceof RegExp) {
+ route = new RegExpRoute(capture, handler, method);
+ } else if (typeof capture === "function") {
+ route = new Route(capture, handler, method);
+ } else if (capture instanceof Route) {
+ route = capture;
+ } else {
+ throw new WorkboxError("unsupported-route-type", {
+ moduleName: "workbox-routing",
+ funcName: "registerRoute",
+ paramName: "capture"
+ });
+ }
+ const defaultRouter2 = getOrCreateDefaultRouter();
+ defaultRouter2.registerRoute(route);
+ return route;
+}
+// node_modules/workbox-strategies/_version.js
+try {
+ self["workbox:strategies:5.1.4"] && _();
+} catch (e) {
+}
+
+// node_modules/workbox-strategies/utils/messages.js
+var messages3 = {
+ strategyStart: (strategyName, request) => `Using ${strategyName} to respond to '${getFriendlyURL(request.url)}'`,
+ printFinalResponse: (response) => {
+ if (response) {
+ logger.groupCollapsed(`View the final response here.`);
+ logger.log(response || "[No response returned]");
+ logger.groupEnd();
+ }
+ }
+};
+
+// node_modules/workbox-strategies/plugins/cacheOkAndOpaquePlugin.js
+var cacheOkAndOpaquePlugin = {
+ cacheWillUpdate: async ({ response }) => {
+ if (response.status === 200 || response.status === 0) {
+ return response;
+ }
+ return null;
+ }
+};
+
+// node_modules/workbox-strategies/StaleWhileRevalidate.js
+class StaleWhileRevalidate {
+ constructor(options = {}) {
+ this._cacheName = cacheNames.getRuntimeName(options.cacheName);
+ this._plugins = options.plugins || [];
+ if (options.plugins) {
+ const isUsingCacheWillUpdate = options.plugins.some((plugin) => !!plugin.cacheWillUpdate);
+ this._plugins = isUsingCacheWillUpdate ? options.plugins : [cacheOkAndOpaquePlugin, ...options.plugins];
+ } else {
+ this._plugins = [cacheOkAndOpaquePlugin];
+ }
+ this._fetchOptions = options.fetchOptions;
+ this._matchOptions = options.matchOptions;
+ }
+ async handle({ event, request }) {
+ const logs = [];
+ if (typeof request === "string") {
+ request = new Request(request);
+ }
+ if (true) {
+ finalAssertExports.isInstance(request, Request, {
+ moduleName: "workbox-strategies",
+ className: "StaleWhileRevalidate",
+ funcName: "handle",
+ paramName: "request"
+ });
+ }
+ const fetchAndCachePromise = this._getFromNetwork({ request, event });
+ let response = await cacheWrapper.match({
+ cacheName: this._cacheName,
+ request,
+ event,
+ matchOptions: this._matchOptions,
+ plugins: this._plugins
+ });
+ let error;
+ if (response) {
+ if (true) {
+ logs.push(`Found a cached response in the '${this._cacheName}'` + ` cache. Will update with the network response in the background.`);
+ }
+ if (event) {
+ try {
+ event.waitUntil(fetchAndCachePromise);
+ } catch (error2) {
+ if (true) {
+ logger.warn(`Unable to ensure service worker stays alive when ` + `updating cache for '${getFriendlyURL(request.url)}'.`);
+ }
+ }
+ }
+ } else {
+ if (true) {
+ logs.push(`No response found in the '${this._cacheName}' cache. ` + `Will wait for the network response.`);
+ }
+ try {
+ response = await fetchAndCachePromise;
+ } catch (err) {
+ error = err;
+ }
+ }
+ if (true) {
+ logger.groupCollapsed(messages3.strategyStart("StaleWhileRevalidate", request));
+ for (const log of logs) {
+ logger.log(log);
+ }
+ messages3.printFinalResponse(response);
+ logger.groupEnd();
+ }
+ if (!response) {
+ throw new WorkboxError("no-response", { url: request.url, error });
+ }
+ return response;
+ }
+ async _getFromNetwork({ request, event }) {
+ const response = await fetchWrapper.fetch({
+ request,
+ event,
+ fetchOptions: this._fetchOptions,
+ plugins: this._plugins
+ });
+ const cachePutPromise = cacheWrapper.put({
+ cacheName: this._cacheName,
+ request,
+ response: response.clone(),
+ event,
+ plugins: this._plugins
+ });
+ if (event) {
+ try {
+ event.waitUntil(cachePutPromise);
+ } catch (error) {
+ if (true) {
+ logger.warn(`Unable to ensure service worker stays alive when ` + `updating cache for '${getFriendlyURL(request.url)}'.`);
+ }
+ }
+ }
+ return response;
+ }
+}
+// src/service-worker.ts
+clientsClaim();
+precacheAndRoute(self.__WB_MANIFEST);
+var fileExtensionRegexp = new RegExp("/[^/?]+\\.[^/]+$");
+registerRoute(({ request, url }) => {
+ if (request.mode !== "navigate") {
+ return false;
+ }
+ if (url.pathname.startsWith("/_")) {
+ return false;
+ }
+ if (url.pathname.match(fileExtensionRegexp)) {
+ return false;
+ }
+ return true;
+}, createHandlerBoundToURL(process.env.PUBLIC_URL + "/index.html"));
+registerRoute(({ url }) => url.origin === self.location.origin && url.pathname.endsWith(".png"), new StaleWhileRevalidate({
+ cacheName: "images",
+ plugins: [
+ new ExpirationPlugin({ maxEntries: 50 })
+ ]
+}));
+self.addEventListener("message", (event) => {
+ if (event.data && event.data.type === "SKIP_WAITING") {
+ self.skipWaiting();
+ }
+});
diff --git a/website/src/main.tsx b/website/src/main.tsx
index d4a10b5..57a841a 100644
--- a/website/src/main.tsx
+++ b/website/src/main.tsx
@@ -5,18 +5,7 @@ import { BrowserRouter } from "react-router-dom";
import "@fortawesome/fontawesome-free/css/all.css";
import "./custom-bootstrap.css";
import "./App.css";
-import { registerSW } from "virtual:pwa-register";
-
-const updateSW = registerSW({
- onNeedRefresh() {
- if (window.confirm("App update available. Reload?")) {
- updateSW(true);
- }
- },
- onOfflineReady() {
- console.log("offline ready");
- },
-});
+import * as serviceWorkerRegistration from "./serviceWorkerRegistration";
createRoot(document.getElementById("root")!).render(
@@ -25,3 +14,5 @@ createRoot(document.getElementById("root")!).render(
);
+
+serviceWorkerRegistration.register();
diff --git a/website/src/service-worker.ts b/website/src/service-worker.ts
new file mode 100644
index 0000000..5be3706
--- /dev/null
+++ b/website/src/service-worker.ts
@@ -0,0 +1,81 @@
+///
+/* eslint-disable no-restricted-globals */
+
+// This service worker can be customized!
+// See https://developers.google.com/web/tools/workbox/modules
+// for the list of available Workbox modules, or add any other
+// code you'd like.
+// You can also remove this file if you'd prefer not to use a
+// service worker, and the Workbox build step will be skipped.
+
+import { clientsClaim } from "workbox-core";
+import { ExpirationPlugin } from "workbox-expiration";
+import { precacheAndRoute, createHandlerBoundToURL } from "workbox-precaching";
+import { registerRoute } from "workbox-routing";
+import { StaleWhileRevalidate } from "workbox-strategies";
+
+declare const self: ServiceWorkerGlobalScope;
+
+clientsClaim();
+
+// Precache all of the assets generated by your build process.
+// Their URLs are injected into the manifest variable below.
+// This variable must be present somewhere in your service worker file,
+// even if you decide not to use precaching. See https://cra.link/PWA
+precacheAndRoute(self.__WB_MANIFEST);
+
+// Set up App Shell-style routing, so that all navigation requests
+// are fulfilled with your index.html shell. Learn more at
+// https://developers.google.com/web/fundamentals/architecture/app-shell
+const fileExtensionRegexp = new RegExp("/[^/?]+\\.[^/]+$");
+registerRoute(
+ // Return false to exempt requests from being fulfilled by index.html.
+ ({ request, url }: { request: Request; url: URL }) => {
+ // If this isn't a navigation, skip.
+ if (request.mode !== "navigate") {
+ return false;
+ }
+
+ // If this is a URL that starts with /_, skip.
+ if (url.pathname.startsWith("/_")) {
+ return false;
+ }
+
+ // If this looks like a URL for a resource, because it contains
+ // a file extension, skip.
+ if (url.pathname.match(fileExtensionRegexp)) {
+ return false;
+ }
+
+ // Return true to signal that we want to use the handler.
+ return true;
+ },
+ createHandlerBoundToURL(process.env.PUBLIC_URL + "/index.html")
+);
+
+// An example runtime caching route for requests that aren't handled by the
+// precache, in this case same-origin .png requests like those from in public/
+registerRoute(
+ // Add in any other file extensions or routing criteria as needed.
+ ({ url }) =>
+ url.origin === self.location.origin && url.pathname.endsWith(".png"),
+ // Customize this strategy as needed, e.g., by changing to CacheFirst.
+ new StaleWhileRevalidate({
+ cacheName: "images",
+ plugins: [
+ // Ensure that once this runtime cache reaches a maximum size the
+ // least-recently used images are removed.
+ new ExpirationPlugin({ maxEntries: 50 }),
+ ],
+ })
+);
+
+// This allows the web app to trigger skipWaiting via
+// registration.waiting.postMessage({type: 'SKIP_WAITING'})
+self.addEventListener("message", (event) => {
+ if (event.data && event.data.type === "SKIP_WAITING") {
+ self.skipWaiting();
+ }
+});
+
+// Any other custom service worker logic can go here.
diff --git a/website/src/serviceWorkerRegistration.ts b/website/src/serviceWorkerRegistration.ts
new file mode 100644
index 0000000..840563a
--- /dev/null
+++ b/website/src/serviceWorkerRegistration.ts
@@ -0,0 +1,149 @@
+// This optional code is used to register a service worker.
+// register() is not called by default.
+
+// This lets the app load faster on subsequent visits in production, and gives
+// it offline capabilities. However, it also means that developers (and users)
+// will only see deployed updates on subsequent visits to a page, after all the
+// existing tabs open on the page have been closed, since previously cached
+// resources are updated in the background.
+
+// To learn more about the benefits of this model and instructions on how to
+// opt-in, read https://cra.link/PWA
+
+const isLocalhost = Boolean(
+ window.location.hostname === "localhost" ||
+ // [::1] is the IPv6 localhost address.
+ window.location.hostname === "[::1]" ||
+ // 127.0.0.0/8 are considered localhost for IPv4.
+ window.location.hostname.match(
+ /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
+ )
+);
+
+type Config = {
+ onSuccess?: (registration: ServiceWorkerRegistration) => void;
+ onUpdate?: (registration: ServiceWorkerRegistration) => void;
+};
+
+export function register(config?: Config) {
+ if (process.env.NODE_ENV === "production" && "serviceWorker" in navigator) {
+ // The URL constructor is available in all browsers that support SW.
+ const publicUrl = new URL(
+ "https://dictionary.lingdocs.com",
+ window.location.href
+ );
+ if (publicUrl.origin !== window.location.origin) {
+ // Our service worker won't work if PUBLIC_URL is on a different origin
+ // from what our page is served on. This might happen if a CDN is used to
+ // serve assets; see https://github.com/facebook/create-react-app/issues/2374
+ return;
+ }
+
+ window.addEventListener("load", () => {
+ const swUrl = `https://dictionary.lingdocs.com/service-worker.js`;
+
+ if (isLocalhost) {
+ // This is running on localhost. Let's check if a service worker still exists or not.
+ checkValidServiceWorker(swUrl, config);
+
+ // Add some additional logging to localhost, pointing developers to the
+ // service worker/PWA documentation.
+ navigator.serviceWorker.ready.then(() => {
+ console.log(
+ "This web app is being served cache-first by a service " +
+ "worker. To learn more, visit https://cra.link/PWA"
+ );
+ });
+ } else {
+ // Is not localhost. Just register service worker
+ registerValidSW(swUrl, config);
+ }
+ });
+ }
+}
+
+function registerValidSW(swUrl: string, config?: Config) {
+ navigator.serviceWorker
+ .register(swUrl)
+ .then((registration) => {
+ registration.onupdatefound = () => {
+ const installingWorker = registration.installing;
+ if (installingWorker == null) {
+ return;
+ }
+ installingWorker.onstatechange = () => {
+ if (installingWorker.state === "installed") {
+ if (navigator.serviceWorker.controller) {
+ // At this point, the updated precached content has been fetched,
+ // but the previous service worker will still serve the older
+ // content until all client tabs are closed.
+ console.log(
+ "New content is available and will be used when all " +
+ "tabs for this page are closed. See https://cra.link/PWA."
+ );
+
+ // Execute callback
+ if (config && config.onUpdate) {
+ config.onUpdate(registration);
+ }
+ } else {
+ // At this point, everything has been precached.
+ // It's the perfect time to display a
+ // "Content is cached for offline use." message.
+ console.log("Content is cached for offline use.");
+
+ // Execute callback
+ if (config && config.onSuccess) {
+ config.onSuccess(registration);
+ }
+ }
+ }
+ };
+ };
+ })
+ .catch((error) => {
+ console.error("Error during service worker registration:", error);
+ });
+}
+
+function checkValidServiceWorker(swUrl: string, config?: Config) {
+ // Check if the service worker can be found. If it can't reload the page.
+ fetch(swUrl, {
+ headers: { "Service-Worker": "script" },
+ })
+ .then((response) => {
+ // Ensure service worker exists, and that we really are getting a JS file.
+ const contentType = response.headers.get("content-type");
+ if (
+ response.status === 404 ||
+ (contentType != null && contentType.indexOf("javascript") === -1)
+ ) {
+ // No service worker found. Probably a different app. Reload the page.
+ navigator.serviceWorker.ready.then((registration) => {
+ registration.unregister().then(() => {
+ window.location.reload();
+ });
+ });
+ } else {
+ // Service worker found. Proceed as normal.
+ registerValidSW(swUrl, config);
+ }
+ })
+ .catch(() => {
+ console.log(
+ "No internet connection found. App is running in offline mode."
+ );
+ });
+}
+
+export function unregister() {
+ if ("serviceWorker" in navigator) {
+ navigator.serviceWorker.ready
+ .then((registration) => {
+ registration.unregister();
+ })
+ .catch((error) => {
+ console.error(error.message);
+ });
+ }
+}
diff --git a/website/vite.config.ts b/website/vite.config.ts
index a4c6944..9cc50ea 100644
--- a/website/vite.config.ts
+++ b/website/vite.config.ts
@@ -1,83 +1,7 @@
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
-import { VitePWA } from "vite-plugin-pwa";
// https://vitejs.dev/config/
export default defineConfig({
- plugins: [
- react(),
- VitePWA({
- workbox: {
- // globPatterns: ["**/*.(mp4|m4a)"],
- globPatterns: ["*/*.*", "*.*"],
- maximumFileSizeToCacheInBytes: 5242880,
- cleanupOutdatedCaches: true,
- },
- includeAssets: ["**/*.(js|html|svg|png|jpg|jpeg|eot|woff|woff2|ttf)"],
- filename: "sw.js",
- manifest: {
- short_name: "Pashto Dictionary",
- name: "LingDocs Pashto Dictionary",
- id: "/",
- icons: [
- {
- src: "/icons/android-chrome-192x192.png",
- sizes: "192x192",
- type: "image/png",
- },
- {
- src: "/icons/android-chrome-512x512.png",
- sizes: "512x512",
- type: "image/png",
- },
- {
- src: "/icons/maskable_icon_x512.png",
- sizes: "512x512",
- type: "image/png",
- purpose: "maskable",
- },
- {
- src: "/icons/maskable_icon_x1024.png",
- sizes: "1024x1024",
- type: "image/png",
- purpose: "maskable",
- },
- {
- src: "/icons/android-chrome-512x512.png",
- sizes: "512x512",
- type: "image/png",
- purpose: "any",
- },
- ],
- display: "standalone",
- theme_color: "#596267",
- background_color: "#f9f9f9",
- start_url: ".",
- description:
- "An offline Pashto Dictionary app with audio, approximate search-as-you-type, alphabetical browsing, verb conjugation, inflections, and a phrase generation engine.",
- launch_handler: {
- client_mode: "auto",
- },
- categories: [
- "education",
- "language",
- "productivity",
- "language learning",
- "Pashto",
- "dictionaries",
- ],
- lang: "en",
- prefer_related_applications: false,
- share_target: {
- action: "/share-target",
- method: "GET",
- params: {
- title: "title",
- text: "text",
- url: "url",
- },
- },
- },
- }),
- ],
+ plugins: [react()],
});