diff --git a/.gitignore b/.gitignore
index fe37f48..540b90e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
_live
+node_modules
diff --git a/node_modules/.bin/acorn b/node_modules/.bin/acorn
deleted file mode 120000
index cf76760..0000000
--- a/node_modules/.bin/acorn
+++ /dev/null
@@ -1 +0,0 @@
-../acorn/bin/acorn
\ No newline at end of file
diff --git a/node_modules/.bin/eleventy b/node_modules/.bin/eleventy
deleted file mode 120000
index 996774d..0000000
--- a/node_modules/.bin/eleventy
+++ /dev/null
@@ -1 +0,0 @@
-../@11ty/eleventy/cmd.cjs
\ No newline at end of file
diff --git a/node_modules/.bin/eleventy-dev-server b/node_modules/.bin/eleventy-dev-server
deleted file mode 120000
index 31a8419..0000000
--- a/node_modules/.bin/eleventy-dev-server
+++ /dev/null
@@ -1 +0,0 @@
-../@11ty/eleventy-dev-server/cmd.js
\ No newline at end of file
diff --git a/node_modules/.bin/errno b/node_modules/.bin/errno
deleted file mode 120000
index 5a98e53..0000000
--- a/node_modules/.bin/errno
+++ /dev/null
@@ -1 +0,0 @@
-../errno/cli.js
\ No newline at end of file
diff --git a/node_modules/.bin/esparse b/node_modules/.bin/esparse
deleted file mode 120000
index 7423b18..0000000
--- a/node_modules/.bin/esparse
+++ /dev/null
@@ -1 +0,0 @@
-../esprima/bin/esparse.js
\ No newline at end of file
diff --git a/node_modules/.bin/esvalidate b/node_modules/.bin/esvalidate
deleted file mode 120000
index 16069ef..0000000
--- a/node_modules/.bin/esvalidate
+++ /dev/null
@@ -1 +0,0 @@
-../esprima/bin/esvalidate.js
\ No newline at end of file
diff --git a/node_modules/.bin/image-size b/node_modules/.bin/image-size
deleted file mode 120000
index f575317..0000000
--- a/node_modules/.bin/image-size
+++ /dev/null
@@ -1 +0,0 @@
-../image-size/bin/image-size.js
\ No newline at end of file
diff --git a/node_modules/.bin/js-yaml b/node_modules/.bin/js-yaml
deleted file mode 120000
index 9dbd010..0000000
--- a/node_modules/.bin/js-yaml
+++ /dev/null
@@ -1 +0,0 @@
-../js-yaml/bin/js-yaml.js
\ No newline at end of file
diff --git a/node_modules/.bin/liquid b/node_modules/.bin/liquid
deleted file mode 120000
index b06ee5f..0000000
--- a/node_modules/.bin/liquid
+++ /dev/null
@@ -1 +0,0 @@
-../liquidjs/bin/liquid.js
\ No newline at end of file
diff --git a/node_modules/.bin/liquidjs b/node_modules/.bin/liquidjs
deleted file mode 120000
index b06ee5f..0000000
--- a/node_modules/.bin/liquidjs
+++ /dev/null
@@ -1 +0,0 @@
-../liquidjs/bin/liquid.js
\ No newline at end of file
diff --git a/node_modules/.bin/markdown-it b/node_modules/.bin/markdown-it
deleted file mode 120000
index 8a64108..0000000
--- a/node_modules/.bin/markdown-it
+++ /dev/null
@@ -1 +0,0 @@
-../markdown-it/bin/markdown-it.mjs
\ No newline at end of file
diff --git a/node_modules/.bin/mime b/node_modules/.bin/mime
deleted file mode 120000
index fbb7ee0..0000000
--- a/node_modules/.bin/mime
+++ /dev/null
@@ -1 +0,0 @@
-../mime/cli.js
\ No newline at end of file
diff --git a/node_modules/.bin/nunjucks-precompile b/node_modules/.bin/nunjucks-precompile
deleted file mode 120000
index 3465a52..0000000
--- a/node_modules/.bin/nunjucks-precompile
+++ /dev/null
@@ -1 +0,0 @@
-../nunjucks/bin/precompile
\ No newline at end of file
diff --git a/node_modules/.bin/semver b/node_modules/.bin/semver
deleted file mode 120000
index 5aaadf4..0000000
--- a/node_modules/.bin/semver
+++ /dev/null
@@ -1 +0,0 @@
-../semver/bin/semver.js
\ No newline at end of file
diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json
deleted file mode 100644
index 600198e..0000000
--- a/node_modules/.package-lock.json
+++ /dev/null
@@ -1,2018 +0,0 @@
-{
- "name": "beall-eleventy",
- "version": "1.0.0",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "node_modules/@11ty/dependency-tree": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@11ty/dependency-tree/-/dependency-tree-4.0.2.tgz",
- "integrity": "sha512-RTF6VTZHatYf7fSZBUN3RKwiUeJh5dhWV61gDPrHhQF2/gzruAkYz8yXuvGLx3w3ZBKreGrR+MfYpSVkdbdbLA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@11ty/eleventy-utils": "^2.0.1"
- }
- },
- "node_modules/@11ty/dependency-tree-esm": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@11ty/dependency-tree-esm/-/dependency-tree-esm-2.0.4.tgz",
- "integrity": "sha512-MYKC0Ac77ILr1HnRJalzKDlb9Z8To3kXQCltx299pUXXUFtJ1RIONtULlknknqW8cLe19DLVgmxVCtjEFm7h0A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@11ty/eleventy-utils": "^2.0.7",
- "acorn": "^8.15.0",
- "dependency-graph": "^1.0.0",
- "normalize-path": "^3.0.0"
- }
- },
- "node_modules/@11ty/eleventy": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-3.1.5.tgz",
- "integrity": "sha512-hZ0g6MwZyRxCqXsPm82gIM304LraKbUz3ZmezOSjsqxttZG6cHTib3Qq8QkESJoKwnr+yX1eyfOkPC5/mEgZnQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@11ty/dependency-tree": "^4.0.2",
- "@11ty/dependency-tree-esm": "^2.0.4",
- "@11ty/eleventy-dev-server": "^2.0.8",
- "@11ty/eleventy-plugin-bundle": "^3.0.7",
- "@11ty/eleventy-utils": "^2.0.7",
- "@11ty/lodash-custom": "^4.17.21",
- "@11ty/posthtml-urls": "^1.0.2",
- "@11ty/recursive-copy": "^4.0.4",
- "@sindresorhus/slugify": "^2.2.1",
- "bcp-47-normalize": "^2.3.0",
- "chokidar": "^3.6.0",
- "debug": "^4.4.3",
- "dependency-graph": "^1.0.0",
- "entities": "^6.0.1",
- "filesize": "^10.1.6",
- "gray-matter": "^4.0.3",
- "iso-639-1": "^3.1.5",
- "js-yaml": "^4.1.1",
- "kleur": "^4.1.5",
- "liquidjs": "^10.25.0",
- "luxon": "^3.7.2",
- "markdown-it": "^14.1.1",
- "minimist": "^1.2.8",
- "moo": "0.5.2",
- "node-retrieve-globals": "^6.0.1",
- "nunjucks": "^3.2.4",
- "picomatch": "^4.0.3",
- "please-upgrade-node": "^3.2.0",
- "posthtml": "^0.16.7",
- "posthtml-match-helper": "^2.0.3",
- "semver": "^7.7.4",
- "slugify": "^1.6.8",
- "tinyglobby": "^0.2.15"
- },
- "bin": {
- "eleventy": "cmd.cjs"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/11ty"
- }
- },
- "node_modules/@11ty/eleventy-dev-server": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/@11ty/eleventy-dev-server/-/eleventy-dev-server-2.0.8.tgz",
- "integrity": "sha512-15oC5M1DQlCaOMUq4limKRYmWiGecDaGwryr7fTE/oM9Ix8siqMvWi+I8VjsfrGr+iViDvWcH/TVI6D12d93mA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@11ty/eleventy-utils": "^2.0.1",
- "chokidar": "^3.6.0",
- "debug": "^4.4.0",
- "finalhandler": "^1.3.1",
- "mime": "^3.0.0",
- "minimist": "^1.2.8",
- "morphdom": "^2.7.4",
- "please-upgrade-node": "^3.2.0",
- "send": "^1.1.0",
- "ssri": "^11.0.0",
- "urlpattern-polyfill": "^10.0.0",
- "ws": "^8.18.1"
- },
- "bin": {
- "eleventy-dev-server": "cmd.js"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/11ty"
- }
- },
- "node_modules/@11ty/eleventy-fetch": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/@11ty/eleventy-fetch/-/eleventy-fetch-5.1.2.tgz",
- "integrity": "sha512-YxDARdR3S9UT4gOGRWgGNyokYT9jkCAjJge3OVKFdNMv1cyvWg1NHCvj9NVvK9XHenCLFy3cwvM/YYpZZTZopw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@11ty/eleventy-utils": "^2.0.7",
- "@rgrove/parse-xml": "^4.2.0",
- "debug": "^4.4.3",
- "flatted": "^3.4.2",
- "p-queue": "6.6.2"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/11ty"
- }
- },
- "node_modules/@11ty/eleventy-img": {
- "version": "6.0.4",
- "resolved": "https://registry.npmjs.org/@11ty/eleventy-img/-/eleventy-img-6.0.4.tgz",
- "integrity": "sha512-jSy9BmubVs0mN76dcXWfSYDgRU+1+/rq/SxUR3MgIvTUAJRDop5pFW+Z1f56CDcOlEHaiPqHgnfOlqRmJvXl7g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@11ty/eleventy-fetch": "^5.1.0",
- "@11ty/eleventy-utils": "^2.0.7",
- "brotli-size": "^4.0.0",
- "debug": "^4.4.0",
- "entities": "^6.0.0",
- "image-size": "^1.2.1",
- "p-queue": "^6.6.2",
- "sharp": "^0.33.5"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/11ty"
- }
- },
- "node_modules/@11ty/eleventy-navigation": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@11ty/eleventy-navigation/-/eleventy-navigation-1.0.5.tgz",
- "integrity": "sha512-zb6xe29cM9viSdYtZywKIkJw2HIROyBINdBcFWC9uD0c/jYOTAex5nwy3HNEuh5t6/Ld/S9V4gEizfmeYuYpCQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "dependency-graph": "^1.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/11ty"
- }
- },
- "node_modules/@11ty/eleventy-plugin-bundle": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-bundle/-/eleventy-plugin-bundle-3.0.7.tgz",
- "integrity": "sha512-QK1tRFBhQdZASnYU8GMzpTdsMMFLVAkuU0gVVILqNyp09xJJZb81kAS3AFrNrwBCsgLxTdWHJ8N64+OTTsoKkA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@11ty/eleventy-utils": "^2.0.2",
- "debug": "^4.4.0",
- "posthtml-match-helper": "^2.0.3"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/11ty"
- }
- },
- "node_modules/@11ty/eleventy-utils": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/@11ty/eleventy-utils/-/eleventy-utils-2.0.7.tgz",
- "integrity": "sha512-6QE+duqSQ0GY9rENXYb4iPR4AYGdrFpqnmi59tFp9VrleOl0QSh8VlBr2yd6dlhkdtj7904poZW5PvGr9cMiJQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/11ty"
- }
- },
- "node_modules/@11ty/lodash-custom": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/@11ty/lodash-custom/-/lodash-custom-4.17.21.tgz",
- "integrity": "sha512-Mqt6im1xpb1Ykn3nbcCovWXK3ggywRJa+IXIdoz4wIIK+cvozADH63lexcuPpGS/gJ6/m2JxyyXDyupkMr5DHw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/11ty"
- }
- },
- "node_modules/@11ty/posthtml-urls": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@11ty/posthtml-urls/-/posthtml-urls-1.0.3.tgz",
- "integrity": "sha512-1YvhnkaNlFnnJic1rBMWmTC2adbuy+JQiBfl1Hecr1Wjjik1pQZmGyk/eC9zKX/FQv52s2Nht1Gi/UwhYqrBeg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "evaluate-value": "^2.0.0",
- "http-equiv-refresh": "^2.0.1",
- "list-to-array": "^1.1.0",
- "parse-srcset": "^1.0.2"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/@11ty/recursive-copy": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/@11ty/recursive-copy/-/recursive-copy-4.0.4.tgz",
- "integrity": "sha512-oI7m8pa7/IAU/3lqRU9vjBbs20iKFo7x+1K9kT3aVira6scc1X9MjBdgLCHzLJeJ7iB6wydioA+kr9/qPnvmlQ==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "errno": "^1.0.0",
- "junk": "^3.1.0",
- "minimatch": "^3.1.5",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@img/sharp-libvips-linux-x64": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz",
- "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "LGPL-3.0-or-later",
- "optional": true,
- "os": [
- "linux"
- ],
- "funding": {
- "url": "https://opencollective.com/libvips"
- }
- },
- "node_modules/@img/sharp-linux-x64": {
- "version": "0.33.5",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz",
- "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "Apache-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linux-x64": "1.0.4"
- }
- },
- "node_modules/@mdit/helper": {
- "version": "0.23.1",
- "resolved": "https://registry.npmjs.org/@mdit/helper/-/helper-0.23.1.tgz",
- "integrity": "sha512-ifWDG3VbUAx1ia7eBWEHm5vpv5QFUPY3kFLPPZzYBr15A7/d5w7D+8ZBg8xxqkvyC73Ys+zF14EQCq7eQAXYxg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/markdown-it": "^14.1.2"
- },
- "engines": {
- "node": ">= 20"
- },
- "peerDependencies": {
- "markdown-it": "^14.1.0"
- },
- "peerDependenciesMeta": {
- "markdown-it": {
- "optional": true
- }
- }
- },
- "node_modules/@mdit/plugin-attrs": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/@mdit/plugin-attrs/-/plugin-attrs-0.25.1.tgz",
- "integrity": "sha512-nJ8vZvREJOUcbih3D+BaCnbsYbA3MskOzWX6JAjRmnfQFFDmigK0WTx9Z5xLlo87D120AIYWGo3DGxZhwLCE0Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@mdit/helper": "0.23.1",
- "@types/markdown-it": "^14.1.2"
- },
- "engines": {
- "node": ">= 20"
- },
- "peerDependencies": {
- "markdown-it": "^14.1.0"
- },
- "peerDependenciesMeta": {
- "markdown-it": {
- "optional": true
- }
- }
- },
- "node_modules/@rgrove/parse-xml": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@rgrove/parse-xml/-/parse-xml-4.2.0.tgz",
- "integrity": "sha512-UuBOt7BOsKVOkFXRe4Ypd/lADuNIfqJXv8GvHqtXaTYXPPKkj2nS2zPllVsrtRjcomDhIJVBnZwfmlI222WH8g==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/@sindresorhus/slugify": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-2.2.1.tgz",
- "integrity": "sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@sindresorhus/transliterate": "^1.0.0",
- "escape-string-regexp": "^5.0.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@sindresorhus/transliterate": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-1.6.0.tgz",
- "integrity": "sha512-doH1gimEu3A46VX6aVxpHTeHrytJAG6HgdxntYnCFiIFHEM/ZGpG8KiZGBChchjQmG0XFIBL552kBTjVcMZXwQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "escape-string-regexp": "^5.0.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@types/linkify-it": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz",
- "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/markdown-it": {
- "version": "14.1.2",
- "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz",
- "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/linkify-it": "^5",
- "@types/mdurl": "^2"
- }
- },
- "node_modules/@types/mdurl": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz",
- "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/a-sync-waterfall": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz",
- "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/acorn": {
- "version": "8.16.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
- "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/acorn-walk": {
- "version": "8.3.5",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz",
- "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "acorn": "^8.11.0"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/anymatch": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
- "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/anymatch/node_modules/picomatch": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
- "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true,
- "license": "Python-2.0"
- },
- "node_modules/asap": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
- "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/bcp-47": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.0.tgz",
- "integrity": "sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-alphabetical": "^2.0.0",
- "is-alphanumerical": "^2.0.0",
- "is-decimal": "^2.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/bcp-47-match": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz",
- "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/bcp-47-normalize": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/bcp-47-normalize/-/bcp-47-normalize-2.3.0.tgz",
- "integrity": "sha512-8I/wfzqQvttUFz7HVJgIZ7+dj3vUaIyIxYXaTRP1YWoSDfzt6TUmxaKZeuXR62qBmYr+nvuWINFRl6pZ5DlN4Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "bcp-47": "^2.0.0",
- "bcp-47-match": "^2.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "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==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/brace-expansion": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz",
- "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/braces": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
- "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fill-range": "^7.1.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/brotli-size": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/brotli-size/-/brotli-size-4.0.0.tgz",
- "integrity": "sha512-uA9fOtlTRC0iqKfzff1W34DXUA3GyVqbUaeo3Rw3d4gd1eavKVCETXrn3NzO74W+UVkG3UHu8WxUi+XvKI/huA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "duplexer": "0.1.1"
- },
- "engines": {
- "node": ">= 10.16.0"
- }
- },
- "node_modules/chokidar": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
- "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
- "dev": true,
- "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/color": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
- "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1",
- "color-string": "^1.9.0"
- },
- "engines": {
- "node": ">=12.5.0"
- }
- },
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/color-string": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
- "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-name": "^1.0.0",
- "simple-swizzle": "^0.2.2"
- }
- },
- "node_modules/commander": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
- "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/debug": {
- "version": "4.4.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
- "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/dependency-graph": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz",
- "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/detect-libc": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
- "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/dom-serializer": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
- "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "domelementtype": "^2.0.1",
- "domhandler": "^4.2.0",
- "entities": "^2.0.0"
- },
- "funding": {
- "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
- }
- },
- "node_modules/dom-serializer/node_modules/entities": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
- "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
- "dev": true,
- "license": "BSD-2-Clause",
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
- }
- },
- "node_modules/domelementtype": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
- "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/fb55"
- }
- ],
- "license": "BSD-2-Clause"
- },
- "node_modules/domhandler": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
- "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "domelementtype": "^2.2.0"
- },
- "engines": {
- "node": ">= 4"
- },
- "funding": {
- "url": "https://github.com/fb55/domhandler?sponsor=1"
- }
- },
- "node_modules/domutils": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
- "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "dom-serializer": "^1.0.1",
- "domelementtype": "^2.2.0",
- "domhandler": "^4.2.0"
- },
- "funding": {
- "url": "https://github.com/fb55/domutils?sponsor=1"
- }
- },
- "node_modules/duplexer": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
- "integrity": "sha512-sxNZ+ljy+RA1maXoUReeqBBpBC6RLKmg5ewzV+x+mSETmWNoKdZN6vcQjpFROemza23hGFskJtFNoUWUaQ+R4Q==",
- "dev": true
- },
- "node_modules/ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/encodeurl": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
- "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/entities": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
- "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
- "dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=0.12"
- },
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
- }
- },
- "node_modules/errno": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/errno/-/errno-1.0.0.tgz",
- "integrity": "sha512-3zV5mFS1E8/1bPxt/B0xxzI1snsg3uSCIh6Zo1qKg6iMw93hzPANk9oBFzSFBFrwuVoQuE3rLoouAUfwOAj1wQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "prr": "~1.0.1"
- },
- "bin": {
- "errno": "cli.js"
- }
- },
- "node_modules/escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/escape-string-regexp": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
- "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/esm-import-transformer": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/esm-import-transformer/-/esm-import-transformer-3.0.5.tgz",
- "integrity": "sha512-1GKLvfuMnnpI75l8c6sHoz0L3Z872xL5akGuBudgqTDPv4Vy6f2Ec7jEMKTxlqWl/3kSvNbHELeimJtnqgYniw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "acorn": "^8.15.0"
- }
- },
- "node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true,
- "license": "BSD-2-Clause",
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/evaluate-value": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/evaluate-value/-/evaluate-value-2.0.0.tgz",
- "integrity": "sha512-VonfiuDJc0z4sOO7W0Pd130VLsXN6vmBWZlrog1mCb/o7o/Nl5Lr25+Kj/nkCCAhG+zqeeGjxhkK9oHpkgTHhQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/eventemitter3": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
- "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-extendable": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/fdir": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
- "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12.0.0"
- },
- "peerDependencies": {
- "picomatch": "^3 || ^4"
- },
- "peerDependenciesMeta": {
- "picomatch": {
- "optional": true
- }
- }
- },
- "node_modules/filesize": {
- "version": "10.1.6",
- "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.6.tgz",
- "integrity": "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==",
- "dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">= 10.4.0"
- }
- },
- "node_modules/fill-range": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
- "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/finalhandler": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz",
- "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "debug": "2.6.9",
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "on-finished": "~2.4.1",
- "parseurl": "~1.3.3",
- "statuses": "~2.0.2",
- "unpipe": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/finalhandler/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/finalhandler/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/flatted": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
- "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/fresh": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
- "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "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==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/gray-matter": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz",
- "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "js-yaml": "^3.13.1",
- "kind-of": "^6.0.2",
- "section-matter": "^1.0.0",
- "strip-bom-string": "^1.0.0"
- },
- "engines": {
- "node": ">=6.0"
- }
- },
- "node_modules/gray-matter/node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "sprintf-js": "~1.0.2"
- }
- },
- "node_modules/gray-matter/node_modules/js-yaml": {
- "version": "3.14.2",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz",
- "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/htmlparser2": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz",
- "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==",
- "dev": true,
- "funding": [
- "https://github.com/fb55/htmlparser2?sponsor=1",
- {
- "type": "github",
- "url": "https://github.com/sponsors/fb55"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "domelementtype": "^2.0.1",
- "domhandler": "^4.2.2",
- "domutils": "^2.8.0",
- "entities": "^3.0.1"
- }
- },
- "node_modules/htmlparser2/node_modules/entities": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
- "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==",
- "dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=0.12"
- },
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
- }
- },
- "node_modules/http-equiv-refresh": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/http-equiv-refresh/-/http-equiv-refresh-2.0.1.tgz",
- "integrity": "sha512-XJpDL/MLkV3dKwLzHwr2dY05dYNfBNlyPu4STQ8WvKCFdc6vC5tPXuq28of663+gHVg03C+16pHHs/+FmmDjcw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/http-errors": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
- "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "depd": "~2.0.0",
- "inherits": "~2.0.4",
- "setprototypeof": "~1.2.0",
- "statuses": "~2.0.2",
- "toidentifier": "~1.0.1"
- },
- "engines": {
- "node": ">= 0.8"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/express"
- }
- },
- "node_modules/image-size": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz",
- "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "queue": "6.0.2"
- },
- "bin": {
- "image-size": "bin/image-size.js"
- },
- "engines": {
- "node": ">=16.x"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/is-alphabetical": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz",
- "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/is-alphanumerical": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz",
- "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-alphabetical": "^2.0.0",
- "is-decimal": "^2.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/is-arrayish": {
- "version": "0.3.4",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz",
- "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/is-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==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "binary-extensions": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-decimal": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
- "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/is-extendable": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-glob": {
- "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"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-json": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-json/-/is-json-2.0.1.tgz",
- "integrity": "sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/iso-639-1": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/iso-639-1/-/iso-639-1-3.1.5.tgz",
- "integrity": "sha512-gXkz5+KN7HrG0Q5UGqSMO2qB9AsbEeyLP54kF1YrMsIxmu+g4BdB7rflReZTSTZGpfj8wywu6pfPBCylPIzGQA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.0"
- }
- },
- "node_modules/js-yaml": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
- "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "argparse": "^2.0.1"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/junk": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz",
- "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/kleur": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
- "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/linkify-it": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz",
- "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "uc.micro": "^2.0.0"
- }
- },
- "node_modules/liquidjs": {
- "version": "10.25.2",
- "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-10.25.2.tgz",
- "integrity": "sha512-ZbgcjEjGNlAIjqhuMzymO3lCpHgmVMftKfrq4/YLLxmKaFFeQMXRGrJTqKX7OXX1hKVPUDpTIrvL7lxt3X/hmw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "commander": "^10.0.0"
- },
- "bin": {
- "liquid": "bin/liquid.js",
- "liquidjs": "bin/liquid.js"
- },
- "engines": {
- "node": ">=16"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/liquidjs"
- }
- },
- "node_modules/list-to-array": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/list-to-array/-/list-to-array-1.1.0.tgz",
- "integrity": "sha512-+dAZZ2mM+/m+vY9ezfoueVvrgnHIGi5FvgSymbIgJOFwiznWyA59mav95L+Mc6xPtL3s9gm5eNTlNtxJLbNM1g==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/luxon": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz",
- "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/markdown-it": {
- "version": "14.1.1",
- "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz",
- "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "argparse": "^2.0.1",
- "entities": "^4.4.0",
- "linkify-it": "^5.0.0",
- "mdurl": "^2.0.0",
- "punycode.js": "^2.3.1",
- "uc.micro": "^2.1.0"
- },
- "bin": {
- "markdown-it": "bin/markdown-it.mjs"
- }
- },
- "node_modules/markdown-it/node_modules/entities": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
- "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
- "dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=0.12"
- },
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
- }
- },
- "node_modules/mdurl": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz",
- "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/mime": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
- "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "mime": "cli.js"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/mime-db": {
- "version": "1.54.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
- "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime-types": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
- "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "mime-db": "^1.54.0"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/express"
- }
- },
- "node_modules/minimatch": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
- "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/minimist": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
- "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/minipass": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
- "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": ">=16 || 14 >=14.17"
- }
- },
- "node_modules/moo": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz",
- "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==",
- "dev": true,
- "license": "BSD-3-Clause"
- },
- "node_modules/morphdom": {
- "version": "2.7.8",
- "resolved": "https://registry.npmjs.org/morphdom/-/morphdom-2.7.8.tgz",
- "integrity": "sha512-D/fR4xgGUyVRbdMGU6Nejea1RFzYxYtyurG4Fbv2Fi/daKlWKuXGLOdXtl+3eIwL110cI2hz1ZojGICjjFLgTg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/node-retrieve-globals": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/node-retrieve-globals/-/node-retrieve-globals-6.0.1.tgz",
- "integrity": "sha512-j0DeFuZ/Wg3VlklfbxUgZF/mdHMTEiEipBb3q0SpMMbHaV3AVfoUQF8UGxh1s/yjqO0TgRZd4Pi/x2yRqoQ4Eg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "acorn": "^8.14.1",
- "acorn-walk": "^8.3.4",
- "esm-import-transformer": "^3.0.3"
- }
- },
- "node_modules/normalize-path": {
- "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"
- }
- },
- "node_modules/nunjucks": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz",
- "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "a-sync-waterfall": "^1.0.0",
- "asap": "^2.0.3",
- "commander": "^5.1.0"
- },
- "bin": {
- "nunjucks-precompile": "bin/precompile"
- },
- "engines": {
- "node": ">= 6.9.0"
- },
- "peerDependencies": {
- "chokidar": "^3.3.0"
- },
- "peerDependenciesMeta": {
- "chokidar": {
- "optional": true
- }
- }
- },
- "node_modules/nunjucks/node_modules/commander": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
- "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/on-finished": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
- "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ee-first": "1.1.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/p-finally": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
- "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/p-queue": {
- "version": "6.6.2",
- "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz",
- "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "eventemitter3": "^4.0.4",
- "p-timeout": "^3.2.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-timeout": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz",
- "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-finally": "^1.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/parse-srcset": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz",
- "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/picomatch": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
- "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/please-upgrade-node": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz",
- "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "semver-compare": "^1.0.0"
- }
- },
- "node_modules/posthtml": {
- "version": "0.16.7",
- "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.16.7.tgz",
- "integrity": "sha512-7Hc+IvlQ7hlaIfQFZnxlRl0jnpWq2qwibORBhQYIb0QbNtuicc5ZxvKkVT71HJ4Py1wSZ/3VR1r8LfkCtoCzhw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "posthtml-parser": "^0.11.0",
- "posthtml-render": "^3.0.0"
- },
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "node_modules/posthtml-match-helper": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/posthtml-match-helper/-/posthtml-match-helper-2.0.3.tgz",
- "integrity": "sha512-p9oJgTdMF2dyd7WE54QI1LvpBIkNkbSiiECKezNnDVYhGhD1AaOnAkw0Uh0y5TW+OHO8iBdSqnd8Wkpb6iUqmw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "peerDependencies": {
- "posthtml": "^0.16.6"
- }
- },
- "node_modules/posthtml-parser": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.11.0.tgz",
- "integrity": "sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "htmlparser2": "^7.1.1"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/posthtml-render": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-3.0.0.tgz",
- "integrity": "sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-json": "^2.0.1"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/prr": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
- "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/punycode.js": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz",
- "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/queue": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz",
- "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "inherits": "~2.0.3"
- }
- },
- "node_modules/range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "picomatch": "^2.2.1"
- },
- "engines": {
- "node": ">=8.10.0"
- }
- },
- "node_modules/readdirp/node_modules/picomatch": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz",
- "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/section-matter": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz",
- "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "extend-shallow": "^2.0.1",
- "kind-of": "^6.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/semver": {
- "version": "7.7.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
- "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/semver-compare": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
- "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/send": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz",
- "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "debug": "^4.4.3",
- "encodeurl": "^2.0.0",
- "escape-html": "^1.0.3",
- "etag": "^1.8.1",
- "fresh": "^2.0.0",
- "http-errors": "^2.0.1",
- "mime-types": "^3.0.2",
- "ms": "^2.1.3",
- "on-finished": "^2.4.1",
- "range-parser": "^1.2.1",
- "statuses": "^2.0.2"
- },
- "engines": {
- "node": ">= 18"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/express"
- }
- },
- "node_modules/setprototypeof": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/sharp": {
- "version": "0.33.5",
- "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz",
- "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==",
- "dev": true,
- "hasInstallScript": true,
- "license": "Apache-2.0",
- "dependencies": {
- "color": "^4.2.3",
- "detect-libc": "^2.0.3",
- "semver": "^7.6.3"
- },
- "engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-darwin-arm64": "0.33.5",
- "@img/sharp-darwin-x64": "0.33.5",
- "@img/sharp-libvips-darwin-arm64": "1.0.4",
- "@img/sharp-libvips-darwin-x64": "1.0.4",
- "@img/sharp-libvips-linux-arm": "1.0.5",
- "@img/sharp-libvips-linux-arm64": "1.0.4",
- "@img/sharp-libvips-linux-s390x": "1.0.4",
- "@img/sharp-libvips-linux-x64": "1.0.4",
- "@img/sharp-libvips-linuxmusl-arm64": "1.0.4",
- "@img/sharp-libvips-linuxmusl-x64": "1.0.4",
- "@img/sharp-linux-arm": "0.33.5",
- "@img/sharp-linux-arm64": "0.33.5",
- "@img/sharp-linux-s390x": "0.33.5",
- "@img/sharp-linux-x64": "0.33.5",
- "@img/sharp-linuxmusl-arm64": "0.33.5",
- "@img/sharp-linuxmusl-x64": "0.33.5",
- "@img/sharp-wasm32": "0.33.5",
- "@img/sharp-win32-ia32": "0.33.5",
- "@img/sharp-win32-x64": "0.33.5"
- }
- },
- "node_modules/simple-swizzle": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz",
- "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-arrayish": "^0.3.1"
- }
- },
- "node_modules/slash": {
- "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"
- }
- },
- "node_modules/slugify": {
- "version": "1.6.8",
- "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.8.tgz",
- "integrity": "sha512-HVk9X1E0gz3mSpoi60h/saazLKXKaZThMLU3u/aNwoYn8/xQyX2MGxL0ui2eaokkD7tF+Zo+cKTHUbe1mmmGzA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
- "dev": true,
- "license": "BSD-3-Clause"
- },
- "node_modules/ssri": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/ssri/-/ssri-11.0.0.tgz",
- "integrity": "sha512-aZpUoMN/Jj2MqA4vMCeiKGnc/8SuSyHbGSBdgFbZxP8OJGF/lFkIuElzPxsN0q8TQQ+prw3P4EDfB3TBHHgfXw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "minipass": "^7.0.3"
- },
- "engines": {
- "node": "^16.14.0 || >=18.0.0"
- }
- },
- "node_modules/statuses": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
- "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/strip-bom-string": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz",
- "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/tinyglobby": {
- "version": "0.2.15",
- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
- "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fdir": "^6.5.0",
- "picomatch": "^4.0.3"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/SuperchupuDev"
- }
- },
- "node_modules/to-regex-range": {
- "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"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/toidentifier": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
- "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/uc.micro": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz",
- "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/urlpattern-polyfill": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz",
- "integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/ws": {
- "version": "8.20.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz",
- "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": ">=5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- }
- }
-}
diff --git a/node_modules/@11ty/dependency-tree-esm/LICENSE b/node_modules/@11ty/dependency-tree-esm/LICENSE
deleted file mode 100644
index cb72e93..0000000
--- a/node_modules/@11ty/dependency-tree-esm/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2023 Zach Leatherman
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/node_modules/@11ty/dependency-tree-esm/README.md b/node_modules/@11ty/dependency-tree-esm/README.md
deleted file mode 100644
index 5684472..0000000
--- a/node_modules/@11ty/dependency-tree-esm/README.md
+++ /dev/null
@@ -1,53 +0,0 @@
-# `dependency-tree-esm`
-
-Returns an unordered array of local paths to dependencies of a Node ES module JavaScript file.
-
-* See also: [`dependency-tree`](https://github.com/11ty/eleventy-dependency-tree) for the CommonJS version.
-
-This is used by Eleventy to find dependencies of a JavaScript file to watch for changes to re-run Eleventy’s build.
-
-## Installation
-
-```
-npm install --save-dev @11ty/dependency-tree-esm
-```
-
-## Features
-
-* Ignores bare specifiers (e.g. `import "my-package"`)
-* Ignores Node’s built-ins (e.g. `import "path"`)
-* Handles circular dependencies
-* Returns an empty set if the file does not exist.
-
-## Usage
-
-```js
-// my-file.js
-
-// if my-local-dependency.js has dependencies, it will include those too
-import "./my-local-dependency.js";
-
-
-// ignored, is a built-in
-import path from "path";
-```
-
-```js
-import { find } from "@11ty/dependency-tree-esm";
-// CommonJS is fine too
-// const { find } = require("@11ty/dependency-tree-esm");
-
-await find("./my-file.js");
-// returns ["./my-local-dependency.js"]
-```
-
-Return a [dependency-graph](https://github.com/jriecken/dependency-graph) instance:
-
-```js
-import { findGraph } from "@11ty/dependency-tree-esm";
-// CommonJS is fine too
-// const { find } = require("@11ty/dependency-tree-esm");
-
-(await findGraph("./my-file.js")).overallOrder();
-// returns ["./my-local-dependency.js", "./my-file.js"]
-```
\ No newline at end of file
diff --git a/node_modules/@11ty/dependency-tree-esm/main.js b/node_modules/@11ty/dependency-tree-esm/main.js
deleted file mode 100644
index 4e9a9b4..0000000
--- a/node_modules/@11ty/dependency-tree-esm/main.js
+++ /dev/null
@@ -1,173 +0,0 @@
-const path = require("node:path");
-const { readFileSync, existsSync } = require("node:fs");
-
-const acorn = require("acorn");
-const normalizePath = require("normalize-path");
-const { TemplatePath } = require("@11ty/eleventy-utils");
-const { DepGraph } = require("dependency-graph");
-
-// Is *not* a bare specifier (e.g. 'some-package')
-// https://nodejs.org/dist/latest-v18.x/docs/api/esm.html#terminology
-function isNonBareSpecifier(importSource) {
- // Change \\ to / on Windows
- let normalized = normalizePath(importSource);
- // Relative specifier (e.g. './startup.js')
- if(normalized.startsWith("./") || normalized.startsWith("../")) {
- return true;
- }
- // Absolute specifier (e.g. 'file:///opt/nodejs/config.js')
- if(normalized.startsWith("file:")) {
- return true;
- }
-
- return false;
-}
-
-function normalizeFilePath(filePath) {
- return TemplatePath.standardizeFilePath(path.relative(".", filePath));
-}
-
-function normalizeImportSourceToFilePath(filePath, source) {
- let { dir } = path.parse(filePath);
- let normalized = path.join(dir, source);
- return normalizeFilePath(normalized);
-}
-
-function getImportAttributeType(attributes = []) {
- for(let node of attributes) {
- if(node.type === "ImportAttribute" && node.key.type === "Identifier" && node.key.name === "type") {
- return node.value.value;
- }
- }
-}
-
-async function getSources(filePath, contents, options = {}) {
- let { parserOverride } = Object.assign({}, options);
- let sources = new Set();
- let sourcesToRecurse = new Set();
-
- let ast = (parserOverride || acorn).parse(contents, {
- sourceType: "module",
- ecmaVersion: "latest",
- });
-
- for(let node of ast.body) {
- if(node.type === "ImportDeclaration" && isNonBareSpecifier(node.source.value)) {
- let importAttributeType = getImportAttributeType(node?.attributes);
- let normalized = normalizeImportSourceToFilePath(filePath, node.source.value);
- if(normalized !== filePath) {
- sources.add(normalized);
-
- // Recurse typeless (JavaScript) import types only
- // Right now only `css` and `json` are valid but others might come later
- if(!importAttributeType) {
- sourcesToRecurse.add(normalized);
- }
- }
- }
- }
-
-
- return {
- sources,
- sourcesToRecurse,
- }
-}
-
-// second argument used to be `alreadyParsedSet = new Set()`, keep that backwards compat
-async function find(filePath, options = {}) {
- if(options instanceof Set) {
- options = {
- alreadyParsedSet: options
- };
- }
-
- if(!options.alreadyParsedSet) {
- options.alreadyParsedSet = new Set();
- }
-
- // TODO add a cache here
- // Unfortunately we need to read the entire file, imports need to be at the top level but they can be anywhere 🫠
- let normalized = normalizeFilePath(filePath);
- if(options.alreadyParsedSet.has(normalized) || !existsSync(filePath)) {
- return [];
- }
- options.alreadyParsedSet.add(normalized);
-
- let contents = readFileSync(normalized, { encoding: 'utf8' });
- let { sources, sourcesToRecurse } = await getSources(filePath, contents, options);
-
- // Recurse for nested deps
- for(let source of sourcesToRecurse) {
- let s = await find(source, options);
- for(let p of s) {
- if(sources.has(p) || p === filePath) {
- continue;
- }
-
- sources.add(p);
- }
- }
-
- return Array.from(sources);
-}
-
-function mergeGraphs(rootGraph, ...graphs) {
- if(!(rootGraph instanceof DepGraph)) {
- throw new Error("Incorrect type passed to mergeGraphs, expected DepGraph");
- }
- for(let g of graphs) {
- for(let node of g.overallOrder()) {
- if(!rootGraph.hasNode(node)) {
- rootGraph.addNode(node);
- }
- for(let dep of g.directDependenciesOf(node)) {
- rootGraph.addDependency(node, dep);
- }
- }
- }
-}
-
-// second argument used to be `alreadyParsedSet = new Set()`, keep that backwards compat
-async function findGraph(filePath, options = {}) {
- if(options instanceof Set) {
- options = {
- alreadyParsedSet: options
- };
- }
- if(!options.alreadyParsedSet) {
- options.alreadyParsedSet = new Set();
- }
-
- let graph = new DepGraph();
- let normalized = normalizeFilePath(filePath);
- graph.addNode(filePath);
-
- if(options.alreadyParsedSet.has(normalized) || !existsSync(filePath)) {
- return graph;
- }
- options.alreadyParsedSet.add(normalized);
-
- let contents = readFileSync(normalized, "utf8");
- let { sources, sourcesToRecurse } = await getSources(filePath, contents, options);
- for(let source of sources) {
- if(!graph.hasNode(source)) {
- graph.addNode(source);
- }
- graph.addDependency(normalized, source);
- }
-
- // Recurse for nested deps
- for(let source of sourcesToRecurse) {
- let recursedGraph = await findGraph(source, options);
- mergeGraphs(graph, recursedGraph);
- }
-
- return graph;
-}
-
-module.exports = {
- find,
- findGraph,
- mergeGraphs,
-};
\ No newline at end of file
diff --git a/node_modules/@11ty/dependency-tree-esm/package.json b/node_modules/@11ty/dependency-tree-esm/package.json
deleted file mode 100644
index 40b8cd7..0000000
--- a/node_modules/@11ty/dependency-tree-esm/package.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "name": "@11ty/dependency-tree-esm",
- "version": "2.0.4",
- "description": "Finds all JavaScript ES Module dependencies from a filename.",
- "main": "main.js",
- "type": "commonjs",
- "scripts": {
- "test": "echo \"Error: run tests from root directory\" && exit 1"
- },
- "repository": {
- "type": "git",
- "url": "git+https://github.com/11ty/eleventy-utils.git"
- },
- "author": {
- "name": "Zach Leatherman",
- "email": "zach@zachleat.com",
- "url": "https://zachleat.com/"
- },
- "license": "MIT",
- "dependencies": {
- "@11ty/eleventy-utils": "^2.0.7",
- "acorn": "^8.15.0",
- "dependency-graph": "^1.0.0",
- "normalize-path": "^3.0.0"
- }
-}
diff --git a/node_modules/@11ty/dependency-tree/LICENSE b/node_modules/@11ty/dependency-tree/LICENSE
deleted file mode 100644
index bad6417..0000000
--- a/node_modules/@11ty/dependency-tree/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2019 Zach Leatherman
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/node_modules/@11ty/dependency-tree/README.md b/node_modules/@11ty/dependency-tree/README.md
deleted file mode 100644
index 0910ca4..0000000
--- a/node_modules/@11ty/dependency-tree/README.md
+++ /dev/null
@@ -1,109 +0,0 @@
-# `@11ty/dependency-tree`
-
-Returns an unordered array of local paths to dependencies of a CommonJS node JavaScript file (everything it or any of its dependencies `require`s).
-
-* See also: [`@11ty/dependency-tree-esm`](https://github.com/11ty/eleventy-utils/tree/main/parse-deps-esm) for the ESM version.
-* See also: [`@11ty/dependency-tree-typescript`](https://github.com/11ty/eleventy-utils/tree/main/parse-deps-typescript) for the TypeScript version.
-
-Reduced feature (faster) alternative to the [`dependency-tree` package](https://www.npmjs.com/package/dependency-tree). This is used by Eleventy to find dependencies of a JavaScript file to watch for changes to re-run Eleventy’s build.
-
-## Big Huge Caveat
-
-⚠ A big caveat to this plugin is that it will require the file in order to build a dependency tree. So if your module has side effects and you don’t want it to execute—do not use this!
-
-## Installation
-
-```
-npm install --save-dev @11ty/dependency-tree
-```
-
-## Features
-
-* Ignores `node_modules`
-* Or, use `nodeModuleNames` to control whether or not `node_modules` package names are included (added in v2.0.1)
-* Ignores Node’s built-ins (e.g. `path`)
-* Handles circular dependencies (Node does this too)
-
-## Usage
-
-```js
-// my-file.js
-
-// if my-local-dependency.js has dependencies, it will include those too
-const test = require("./my-local-dependency.js");
-
-// ignored, is a built-in
-const path = require("path");
-```
-
-```js
-const DependencyTree = require("@11ty/dependency-tree");
-
-DependencyTree("./my-file.js");
-// returns ["./my-local-dependency.js"]
-```
-
-### `allowNotFound`
-
-```js
-const DependencyTree = require("@11ty/dependency-tree");
-
-DependencyTree("./this-does-not-exist.js"); // throws an error
-
-DependencyTree("./this-does-not-exist.js", { allowNotFound: true });
-// returns []
-```
-
-### `nodeModuleNames`
-
-(Added in v2.0.1) Controls whether or not node package names are included in the list of dependencies.
-
-* `nodeModuleNames: "include"`: included alongside the local JS files.
-* `nodeModuleNames: "exclude"` (default): node module package names are excluded.
-* `nodeModuleNames: "only"`: only node module package names are returned.
-
-```js
-// my-file.js:
-
-require("./my-local-dependency.js");
-require("@11ty/eleventy");
-```
-
-```js
-const DependencyTree = require("@11ty/dependency-tree");
-
-DependencyTree("./my-file.js");
-// returns ["./my-local-dependency.js"]
-
-DependencyTree("./my-file.js", { nodeModuleNames: "exclude" });
-// returns ["./my-local-dependency.js"]
-
-DependencyTree("./my-file.js", { nodeModuleNames: "include" });
-// returns ["./my-local-dependency.js", "@11ty/eleventy"]
-
-DependencyTree("./my-file.js", { nodeModuleNames: "only" });
-// returns ["@11ty/eleventy"]
-```
-
-#### (Deprecated) `nodeModuleNamesOnly`
-
-(Added in v2.0.0) Changed to use `nodeModuleNames` option instead. Backwards compatibility is maintained automatically.
-
-* `nodeModuleNamesOnly: false` is mapped to `nodeModuleNames: "exclude"`
-* `nodeModuleNamesOnly: true` is mapped to `nodeModuleNames: "only"`
-
-If both `nodeModuleNamesOnly` and `nodeModuleNames` are included in options, `nodeModuleNames` takes precedence.
-
-### `getPackagesByType` method
-
-_Added in v4.0.2._
-
-```js
-const DependencyTree = require("@11ty/dependency-tree");
-const {getPackagesByType} = DependencyTree;
-
-// With `require(esm)` support, some targets may be modules!
-// Return separate lists for commonjs and esm lists
-getPackagesByType("./my-file.js");
-// returns { commonjs: ["./my-file.js"], esm: [] }
-```
diff --git a/node_modules/@11ty/dependency-tree/main.js b/node_modules/@11ty/dependency-tree/main.js
deleted file mode 100644
index b7dd2d2..0000000
--- a/node_modules/@11ty/dependency-tree/main.js
+++ /dev/null
@@ -1,157 +0,0 @@
-const path = require("node:path");
-const { TemplatePath } = require("@11ty/eleventy-utils");
-
-function getAbsolutePath(filename) {
- let normalizedFilename = path.normalize(filename); // removes dot slash
- let hasDotSlash = filename.startsWith("./");
- return hasDotSlash ? path.join(path.resolve("."), normalizedFilename) : normalizedFilename;
-}
-
-function getRelativePath(filename) {
- let normalizedFilename = path.normalize(filename); // removes dot slash
- let workingDirectory = path.resolve(".");
- let result = "./" + (normalizedFilename.startsWith(workingDirectory) ? normalizedFilename.substr(workingDirectory.length + 1) : normalizedFilename);
- return result;
-}
-
-function getNodeModuleName(filename) {
- let foundNodeModules = false;
- let moduleName = [];
-
- let s = filename.split(path.sep);
- for(let entry of s) {
- if(entry === '.pnpm') {
- foundNodeModules = false;
- }
-
- if(foundNodeModules) {
- moduleName.push(entry);
- if(!entry.startsWith("@")) {
- return moduleName.join("/");
- }
- }
-
- if(entry === "node_modules") {
- foundNodeModules = true;
- }
- }
-
- return false;
-}
-
-/* unordered */
-function getDependenciesFor(filename, avoidCircular, optionsArg = {}) {
- // backwards compatibility with `nodeModuleNamesOnly` boolean option
- // Using `nodeModuleNames` property moving forward
- if(("nodeModuleNamesOnly" in optionsArg) && !("nodeModuleNames" in optionsArg)) {
- if(optionsArg.nodeModuleNamesOnly === true) {
- optionsArg.nodeModuleNames = "only";
- }
- if(optionsArg.nodeModuleNamesOnly === false) {
- optionsArg.nodeModuleNames = "exclude";
- }
- }
-
- let options = Object.assign({
- allowNotFound: false,
- nodeModuleNames: "exclude", // also "include" or "only"
- }, optionsArg);
- let absoluteFilename = getAbsolutePath(filename);
- let modules = new Set();
-
- try {
- let res = require(absoluteFilename);
- if(res[Symbol.toStringTag] === "Module" || res.__esModule) {
- modules.add(filename);
- }
- } catch(e) {
- if(e.code === "MODULE_NOT_FOUND" && options.allowNotFound) {
- // do nothing
- } else {
- throw e;
- }
- }
-
-
- let mod;
- for(let entry in require.cache) {
- if(entry === absoluteFilename) {
- mod = require.cache[entry];
- break;
- }
- }
-
- let dependencies = new Set();
-
- if(!mod) {
- if(!options.allowNotFound) {
- throw new Error(`Could not find ${filename} in @11ty/dependency-tree`);
- }
- } else {
- let relativeFilename = getRelativePath(mod.filename);
- if(!avoidCircular) {
- avoidCircular = {};
- } else if(options.nodeModuleNames !== "only") {
- dependencies.add(relativeFilename);
- }
-
- avoidCircular[relativeFilename] = true;
-
- if(Array.isArray(mod.children) && mod.children.length > 0) {
- for(let child of mod.children) {
- let relativeChildFilename = getRelativePath(child.filename);
- let nodeModuleName = getNodeModuleName(child.filename);
-
- if(options.nodeModuleNames !== "exclude" && nodeModuleName) {
- dependencies.add(nodeModuleName);
- }
- // Add dependencies of this dependency (not top level node_modules)
- if(nodeModuleName === false) {
- if(!dependencies.has(relativeChildFilename) && // avoid infinite looping with circular deps
- !avoidCircular[relativeChildFilename] ) {
- let { commonjs, esm } = getDependenciesFor(relativeChildFilename, avoidCircular, options);
- for(let dependency of commonjs) {
- dependencies.add(dependency);
- }
- for(let dependency of esm) {
- modules.add(dependency);
- }
- }
- }
- }
- }
- }
-
- return {
- esm: modules,
- commonjs: dependencies,
- }
-}
-
-function normalizeList(packageSet) {
- return Array.from( packageSet ).map(filePath => {
- if(filePath.startsWith("./")) {
- return TemplatePath.standardizeFilePath(filePath);
- }
- return filePath; // node_module name
- })
-}
-
-function getCleanDependencyListFor(filename, options = {}) {
- let { commonjs } = getDependenciesFor(filename, null, options);
-
- return normalizeList(commonjs);
-}
-
-function getCleanDependencyListByTypeFor(filename, options = {}) {
- let { commonjs, esm } = getDependenciesFor(filename, null, options);
-
- return {
- commonjs: normalizeList(commonjs),
- esm: normalizeList(esm),
- };
-}
-
-module.exports = getCleanDependencyListFor;
-module.exports.getPackagesByType = getCleanDependencyListByTypeFor;
-module.exports.getNodeModuleName = getNodeModuleName;
\ No newline at end of file
diff --git a/node_modules/@11ty/dependency-tree/package.json b/node_modules/@11ty/dependency-tree/package.json
deleted file mode 100644
index f140f82..0000000
--- a/node_modules/@11ty/dependency-tree/package.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
- "name": "@11ty/dependency-tree",
- "version": "4.0.2",
- "description": "Finds all JavaScript CommmonJS require() dependencies from a filename.",
- "main": "main.js",
- "files": [
- "main.js",
- "!test",
- "!test/**"
- ],
- "scripts": {
- "test": "npx ava"
- },
- "repository": {
- "type": "git",
- "url": "git+https://github.com/11ty/eleventy-dependency-tree.git"
- },
- "author": {
- "name": "Zach Leatherman",
- "email": "zach@zachleat.com",
- "url": "https://zachleat.com/"
- },
- "license": "MIT",
- "ava": {
- "files": [
- "./test/*.js"
- ],
- "watchMode": {
- "ignoreChanged": [
- "./test/stubs/**"
- ]
- }
- },
- "devDependencies": {
- "@sindresorhus/is": "^4.6.0",
- "ava": "^6.4.1",
- "semver": "^7.7.3"
- },
- "dependencies": {
- "@11ty/eleventy-utils": "^2.0.1"
- }
-}
diff --git a/node_modules/@11ty/eleventy-dev-server/README.md b/node_modules/@11ty/eleventy-dev-server/README.md
deleted file mode 100644
index 2d74590..0000000
--- a/node_modules/@11ty/eleventy-dev-server/README.md
+++ /dev/null
@@ -1,60 +0,0 @@
-

-
-# eleventy-dev-server 🕚⚡️🎈🐀
-
-A minimal, modern, generic, hot-reloading local web server to help web developers.
-
-## ➡ [Documentation](https://www.11ty.dev/docs/watch-serve/#eleventy-dev-server)
-
-- Please star [Eleventy on GitHub](https://github.com/11ty/eleventy/)!
-- Follow us on Twitter [@eleven_ty](https://twitter.com/eleven_ty)
-- Support [11ty on Open Collective](https://opencollective.com/11ty)
-- [11ty on npm](https://www.npmjs.com/org/11ty)
-- [11ty on GitHub](https://github.com/11ty)
-
-[](https://www.npmjs.com/package/@11ty/eleventy-dev-server)
-
-## Installation
-
-This is bundled with `@11ty/eleventy` (and you do not need to install it separately) in Eleventy v2.0.
-
-## CLI
-
-Eleventy Dev Server now also includes a CLI. The CLI is for **standalone** (non-Eleventy) use only: separate installation is unnecessary if you’re using this server with `@11ty/eleventy`.
-
-```sh
-npm install -g @11ty/eleventy-dev-server
-
-# Alternatively, install locally into your project
-npm install @11ty/eleventy-dev-server
-```
-
-This package requires Node 18 or newer.
-
-### CLI Usage
-
-```sh
-# Serve the current directory
-npx @11ty/eleventy-dev-server
-
-# Serve a different subdirectory (also aliased as --input)
-npx @11ty/eleventy-dev-server --dir=_site
-
-# Disable the `domdiff` feature
-npx @11ty/eleventy-dev-server --domdiff=false
-
-# Full command list in the Help
-npx @11ty/eleventy-dev-server --help
-```
-
-## Tests
-
-```
-npm run test
-```
-
-- We use the [ava JavaScript test runner](https://github.com/avajs/ava) ([Assertions documentation](https://github.com/avajs/ava/blob/master/docs/03-assertions.md))
-
-## Changelog
-
-* `v2.0.0` bumps Node.js minimum to 18.
\ No newline at end of file
diff --git a/node_modules/@11ty/eleventy-dev-server/cli.js b/node_modules/@11ty/eleventy-dev-server/cli.js
deleted file mode 100644
index 04be1ca..0000000
--- a/node_modules/@11ty/eleventy-dev-server/cli.js
+++ /dev/null
@@ -1,89 +0,0 @@
-const pkg = require("./package.json");
-const EleventyDevServer = require("./server.js");
-
-const Logger = {
- info: function(...args) {
- console.log( "[11ty/eleventy-dev-server]", ...args );
- },
- error: function(...args) {
- console.error( "[11ty/eleventy-dev-server]", ...args );
- },
- fatal: function(...args) {
- Logger.error(...args);
- process.exitCode = 1;
- }
-};
-
-Logger.log = Logger.info;
-
-class Cli {
- static getVersion() {
- return pkg.version;
- }
-
- static getHelp() {
- return `Usage:
-
- eleventy-dev-server
- eleventy-dev-server --dir=_site
- eleventy-dev-server --port=3000
-
-Arguments:
-
- --version
-
- --dir=.
- Directory to serve (default: \`.\`)
-
- --input (alias for --dir)
-
- --port=8080
- Run the web server on this port (default: \`8080\`)
- Will autoincrement if already in use.
-
- --domdiff (enabled, default)
- --domdiff=false (disabled)
- Apply HTML changes without a full page reload.
-
- --help`;
- }
-
- static getDefaultOptions() {
- return {
- port: "8080",
- input: ".",
- domDiff: true,
- }
- }
-
- async serve(options = {}) {
- this.options = Object.assign(Cli.getDefaultOptions(), options);
-
- this.server = EleventyDevServer.getServer("eleventy-dev-server-cli", this.options.input, {
- // TODO allow server configuration extensions
- showVersion: true,
- logger: Logger,
- domDiff: this.options.domDiff,
-
- // CLI watches all files in the folder by default
- // this is different from Eleventy usage!
- watch: [ this.options.input ],
- });
-
- this.server.serve(this.options.port);
-
- // TODO? send any errors here to the server too
- // with server.sendError({ error });
- }
-
- close() {
- if(this.server) {
- return this.server.close();
- }
- }
-}
-
-module.exports = {
- Logger,
- Cli
-}
diff --git a/node_modules/@11ty/eleventy-dev-server/client/reload-client.js b/node_modules/@11ty/eleventy-dev-server/client/reload-client.js
deleted file mode 100644
index fc0ddd1..0000000
--- a/node_modules/@11ty/eleventy-dev-server/client/reload-client.js
+++ /dev/null
@@ -1,336 +0,0 @@
-class Util {
- static pad(num, digits = 2) {
- let zeroes = new Array(digits + 1).join(0);
- return `${zeroes}${num}`.slice(-1 * digits);
- }
-
- static log(message) {
- Util.output("log", message);
- }
- static error(message, error) {
- Util.output("error", message, error);
- }
- static output(type, ...messages) {
- let now = new Date();
- let date = `${Util.pad(now.getUTCHours())}:${Util.pad(
- now.getUTCMinutes()
- )}:${Util.pad(now.getUTCSeconds())}.${Util.pad(
- now.getUTCMilliseconds(),
- 3
- )}`;
- console[type](`[11ty][${date} UTC]`, ...messages);
- }
-
- static capitalize(word) {
- return word.substr(0, 1).toUpperCase() + word.substr(1);
- }
-
- static matchRootAttributes(htmlContent) {
- // Workaround for morphdom bug with attributes on https://github.com/11ty/eleventy-dev-server/issues/6
- // Note also `childrenOnly: true` above
- const parser = new DOMParser();
- let parsed = parser.parseFromString(htmlContent, "text/html");
- let parsedDoc = parsed.documentElement;
- let newAttrs = parsedDoc.getAttributeNames();
-
- let docEl = document.documentElement;
- // Remove old
- let removedAttrs = docEl.getAttributeNames().filter(name => !newAttrs.includes(name));
- for(let attr of removedAttrs) {
- docEl.removeAttribute(attr);
- }
-
- // Add new
- for(let attr of newAttrs) {
- docEl.setAttribute(attr, parsedDoc.getAttribute(attr));
- }
- }
-
- static isEleventyLinkNodeMatch(from, to) {
- // Issue #18 https://github.com/11ty/eleventy-dev-server/issues/18
- // Don’t update a if the _11ty searchParam is the only thing that’s different
- if(from.tagName !== "LINK" || to.tagName !== "LINK") {
- return false;
- }
-
- let oldWithoutHref = from.cloneNode();
- let newWithoutHref = to.cloneNode();
-
- oldWithoutHref.removeAttribute("href");
- newWithoutHref.removeAttribute("href");
-
- // if all other attributes besides href match
- if(!oldWithoutHref.isEqualNode(newWithoutHref)) {
- return false;
- }
-
- let oldUrl = new URL(from.href);
- let newUrl = new URL(to.href);
-
- // morphdom wants to force href="style.css?_11ty" => href="style.css"
- let paramName = EleventyReload.QUERY_PARAM;
- let isErasing = oldUrl.searchParams.has(paramName) && !newUrl.searchParams.has(paramName);
- if(!isErasing) {
- // not a match if _11ty has a new value (not being erased)
- return false;
- }
-
- oldUrl.searchParams.set(paramName, "");
- newUrl.searchParams.set(paramName, "");
-
- // is a match if erasing and the rest of the href matches too
- return oldUrl.toString() === newUrl.toString();
- }
-
- // https://github.com/patrick-steele-idem/morphdom/issues/178#issuecomment-652562769
- static runScript(source, target) {
- let script = document.createElement('script');
-
- // copy over the attributes
- for(let attr of [...source.attributes]) {
- script.setAttribute(attr.nodeName ,attr.nodeValue);
- }
-
- script.innerHTML = source.innerHTML;
- (target || source).replaceWith(script);
- }
-
- static fullPageReload() {
- Util.log(`Page reload initiated.`);
- window.location.reload();
- }
-}
-
-class EleventyReload {
- static QUERY_PARAM = "_11ty";
-
- static reloadTypes = {
- css: (files, build = {}) => {
- // Initiate a full page refresh if a CSS change is made but does match any stylesheet url
- // `build.stylesheets` available in Eleventy v3.0.1-alpha.5+
- if(Array.isArray(build.stylesheets)) {
- let match = false;
- for (let link of document.querySelectorAll(`link[rel="stylesheet"]`)) {
- if (link.href) {
- let url = new URL(link.href);
- if(build.stylesheets.includes(url.pathname)) {
- match = true;
- }
- }
- }
-
- if(!match) {
- Util.fullPageReload();
- return;
- }
- }
-
- for (let link of document.querySelectorAll(`link[rel="stylesheet"]`)) {
- if (link.href) {
- let url = new URL(link.href);
- url.searchParams.set(this.QUERY_PARAM, Date.now());
- link.href = url.toString();
- }
- }
-
- Util.log(`CSS updated without page reload.`);
- },
- default: async (files, build = {}) => {
- let morphed = false;
- let domdiffTemplates = (build?.templates || []).filter(({url, inputPath}) => {
- return url === document.location.pathname && (files || []).includes(inputPath);
- });
-
- if(domdiffTemplates.length === 0) {
- Util.fullPageReload();
- return;
- }
-
- try {
- // Important: using `./` allows the `.11ty` folder name to be changed
- const { default: morphdom } = await import(`./morphdom.js`);
-
- for (let {url, inputPath, content} of domdiffTemplates) {
- // Notable limitation: this won’t re-run script elements or JavaScript page lifecycle events (load/DOMContentLoaded)
- morphed = true;
-
- morphdom(document.documentElement, content, {
- childrenOnly: true,
- onBeforeElUpdated: function (fromEl, toEl) {
- if (fromEl.nodeName === "SCRIPT" && toEl.nodeName === "SCRIPT") {
- if(toEl.innerHTML !== fromEl.innerHTML) {
- Util.log(`JavaScript modified, reload initiated.`);
- window.location.reload();
- }
-
- return false;
- }
-
- // Speed-up trick from morphdom docs
- // https://dom.spec.whatwg.org/#concept-node-equals
- if (fromEl.isEqualNode(toEl)) {
- return false;
- }
-
- if(Util.isEleventyLinkNodeMatch(fromEl, toEl)) {
- return false;
- }
-
- return true;
- },
- addChild: function(parent, child) {
- // Declarative Shadow DOM https://github.com/11ty/eleventy-dev-server/issues/90
- if(child.nodeName === "TEMPLATE" && child.hasAttribute("shadowrootmode")) {
- let root = parent.shadowRoot;
- if(root) {
- // remove all shadow root children
- while(root.firstChild) {
- root.removeChild(root.firstChild);
- }
- }
- for(let newChild of child.content.childNodes) {
- root.appendChild(newChild);
- }
- } else {
- parent.appendChild(child);
- }
- },
- onNodeAdded: function (node) {
- if (node.nodeName === 'SCRIPT') {
- Util.log(`JavaScript added, reload initiated.`);
- window.location.reload();
- }
- },
- onElUpdated: function(node) {
- // Re-attach custom elements
- if(customElements.get(node.tagName.toLowerCase())) {
- let placeholder = document.createElement("div");
- node.replaceWith(placeholder);
- requestAnimationFrame(() => {
- placeholder.replaceWith(node);
- placeholder = undefined;
- });
- }
- }
- });
-
- Util.matchRootAttributes(content);
- Util.log(`HTML delta applied without page reload.`);
- }
- } catch(e) {
- Util.error( "Morphdom error", e );
- }
-
- if (!morphed) {
- Util.fullPageReload();
- }
- }
- }
-
- constructor() {
- this.connectionMessageShown = false;
- this.reconnectEventCallback = this.reconnect.bind(this);
- }
-
- init(options = {}) {
- if (!("WebSocket" in window)) {
- return;
- }
-
- let documentUrl = new URL(document.location.href);
-
- let reloadPort = new URL(import.meta.url).searchParams.get("reloadPort");
- if(reloadPort) {
- documentUrl.port = reloadPort;
- }
-
- let { protocol, host } = documentUrl;
-
- // works with http (ws) and https (wss)
- let websocketProtocol = protocol.replace("http", "ws");
-
- let socket = new WebSocket(`${websocketProtocol}//${host}`);
-
- socket.addEventListener("message", async (event) => {
- try {
- let data = JSON.parse(event.data);
- // Util.log( JSON.stringify(data, null, 2) );
-
- let { type } = data;
-
- if (type === "eleventy.reload") {
- await this.onreload(data);
- } else if (type === "eleventy.msg") {
- Util.log(`${data.message}`);
- } else if (type === "eleventy.error") {
- // Log Eleventy build errors
- // Extra parsing for Node Error objects
- let e = JSON.parse(data.error);
- Util.error(`Build error: ${e.message}`, e);
- } else if (type === "eleventy.status") {
- // Full page reload on initial reconnect
- if (data.status === "connected" && options.mode === "reconnect") {
- window.location.reload();
- }
-
- if(data.status === "connected") {
- // With multiple windows, only show one connection message
- if(!this.isConnected) {
- Util.log(Util.capitalize(data.status));
- }
-
- this.connectionMessageShown = true;
- } else {
- if(data.status === "disconnected") {
- this.addReconnectListeners();
- }
-
- Util.log(Util.capitalize(data.status));
- }
- } else {
- Util.log("Unknown event type", data);
- }
- } catch (e) {
- Util.error(`Error parsing ${event.data}: ${e.message}`, e);
- }
- });
-
- socket.addEventListener("open", () => {
- // no reconnection when the connect is already open
- this.removeReconnectListeners();
- });
-
- socket.addEventListener("close", () => {
- this.connectionMessageShown = false;
- this.addReconnectListeners();
- });
- }
-
- reconnect() {
- Util.log( "Reconnecting…" );
- this.init({ mode: "reconnect" });
- }
-
- async onreload({ subtype, files, build }) {
- if(!EleventyReload.reloadTypes[subtype]) {
- subtype = "default";
- }
-
- await EleventyReload.reloadTypes[subtype](files, build);
- }
-
- addReconnectListeners() {
- this.removeReconnectListeners();
-
- window.addEventListener("focus", this.reconnectEventCallback);
- window.addEventListener("visibilitychange", this.reconnectEventCallback);
- }
-
- removeReconnectListeners() {
- window.removeEventListener("focus", this.reconnectEventCallback);
- window.removeEventListener("visibilitychange", this.reconnectEventCallback);
- }
-}
-
-let reloader = new EleventyReload();
-reloader.init();
\ No newline at end of file
diff --git a/node_modules/@11ty/eleventy-dev-server/cmd.js b/node_modules/@11ty/eleventy-dev-server/cmd.js
deleted file mode 100755
index 695b845..0000000
--- a/node_modules/@11ty/eleventy-dev-server/cmd.js
+++ /dev/null
@@ -1,77 +0,0 @@
-#!/usr/bin/env node
-
-const pkg = require("./package.json");
-
-// Node check
-require("please-upgrade-node")(pkg, {
- message: function (requiredVersion) {
- return (
- "eleventy-dev-server requires Node " +
- requiredVersion +
- ". You will need to upgrade Node!"
- );
- },
-});
-
-const { Logger, Cli } = require("./cli.js");
-
-const debug = require("debug")("Eleventy:DevServer");
-
-try {
- const defaults = Cli.getDefaultOptions();
- for(let key in defaults) {
- if(key.toLowerCase() !== key) {
- defaults[key.toLowerCase()] = defaults[key];
- delete defaults[key];
- }
- }
-
- const argv = require("minimist")(process.argv.slice(2), {
- string: [
- "dir",
- "input", // alias for dir
- "port",
- ],
- boolean: [
- "version",
- "help",
- "domdiff",
- ],
- default: defaults,
- unknown: function (unknownArgument) {
- throw new Error(
- `We don’t know what '${unknownArgument}' is. Use --help to see the list of supported commands.`
- );
- },
- });
-
- debug("command: eleventy-dev-server %o", argv);
-
- process.on("unhandledRejection", (error, promise) => {
- Logger.fatal("Unhandled rejection in promise:", promise, error);
- });
- process.on("uncaughtException", (error) => {
- Logger.fatal("Uncaught exception:", error);
- });
-
- if (argv.version) {
- console.log(Cli.getVersion());
- } else if (argv.help) {
- console.log(Cli.getHelp());
- } else {
- let cli = new Cli();
-
- cli.serve({
- input: argv.dir || argv.input,
- port: argv.port,
- domDiff: argv.domdiff,
- });
-
- process.on("SIGINT", async () => {
- await cli.close();
- process.exitCode = 0;
- });
- }
-} catch (e) {
- Logger.fatal("Fatal Error:", e)
-}
diff --git a/node_modules/@11ty/eleventy-dev-server/package.json b/node_modules/@11ty/eleventy-dev-server/package.json
deleted file mode 100644
index e413c7c..0000000
--- a/node_modules/@11ty/eleventy-dev-server/package.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "name": "@11ty/eleventy-dev-server",
- "version": "2.0.8",
- "description": "A minimal, modern, generic, hot-reloading local web server to help web developers.",
- "main": "server.js",
- "scripts": {
- "test": "npx ava --verbose",
- "sample": "node cmd.js --input=test/stubs"
- },
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/11ty"
- },
- "bin": {
- "eleventy-dev-server": "./cmd.js"
- },
- "keywords": [
- "eleventy",
- "server",
- "cli"
- ],
- "publishConfig": {
- "access": "public"
- },
- "author": {
- "name": "Zach Leatherman",
- "email": "zachleatherman@gmail.com",
- "url": "https://zachleat.com/"
- },
- "repository": {
- "type": "git",
- "url": "git://github.com/11ty/eleventy-dev-server.git"
- },
- "bugs": "https://github.com/11ty/eleventy-dev-server/issues",
- "homepage": "https://github.com/11ty/eleventy-dev-server/",
- "dependencies": {
- "@11ty/eleventy-utils": "^2.0.1",
- "chokidar": "^3.6.0",
- "debug": "^4.4.0",
- "finalhandler": "^1.3.1",
- "mime": "^3.0.0",
- "minimist": "^1.2.8",
- "morphdom": "^2.7.4",
- "please-upgrade-node": "^3.2.0",
- "send": "^1.1.0",
- "ssri": "^11.0.0",
- "urlpattern-polyfill": "^10.0.0",
- "ws": "^8.18.1"
- },
- "devDependencies": {
- "ava": "^6.2.0"
- }
-}
diff --git a/node_modules/@11ty/eleventy-dev-server/server.js b/node_modules/@11ty/eleventy-dev-server/server.js
deleted file mode 100644
index 9fbe898..0000000
--- a/node_modules/@11ty/eleventy-dev-server/server.js
+++ /dev/null
@@ -1,1024 +0,0 @@
-const path = require("node:path");
-const fs = require("node:fs");
-
-const finalhandler = require("finalhandler");
-const WebSocket = require("ws");
-const { WebSocketServer } = WebSocket;
-const mime = require("mime");
-const ssri = require("ssri");
-const send = require("send");
-const chokidar = require("chokidar");
-const { TemplatePath, isPlainObject } = require("@11ty/eleventy-utils");
-
-const debug = require("debug")("Eleventy:DevServer");
-
-const pkg = require("./package.json");
-const wrapResponse = require("./server/wrapResponse.js");
-const ipAddress = require("./server/ipAddress.js");
-
-if (!globalThis.URLPattern) {
- require("urlpattern-polyfill");
-}
-
-const DEFAULT_OPTIONS = {
- port: 8080,
- reloadPort: false, // Falsy uses same as `port`
- liveReload: true, // Enable live reload at all
- showAllHosts: false, // IP address based hosts (other than localhost)
- injectedScriptsFolder: ".11ty", // Change the name of the special folder used for injected scripts
- portReassignmentRetryCount: 10, // number of times to increment the port if in use
- https: {}, // `key` and `cert`, required for http/2 and https
- domDiff: true, // Use morphdom to apply DOM diffing delta updates to HTML
- showVersion: false, // Whether or not to show the server version on the command line.
- encoding: "utf-8", // Default file encoding
- pathPrefix: "/", // May be overridden by Eleventy, adds a virtual base directory to your project
- watch: [], // Globs to pass to separate dev server chokidar for watching
- aliases: {}, // Aliasing feature
- indexFileName: "index.html", // Allow custom index file name
- useCache: false, // Use a cache for file contents
- headers: {}, // Set default response headers
- messageOnStart: ({ hosts, startupTime, version, options }) => {
- let hostsStr = " started";
- if(Array.isArray(hosts) && hosts.length > 0) {
- // TODO what happens when the cert doesn’t cover non-localhost hosts?
- hostsStr = ` at ${hosts.join(" or ")}`;
- }
-
- return `Server${hostsStr}${options.showVersion ? ` (v${version})` : ""}`;
- },
-
- onRequest: {}, // Maps URLPatterns to dynamic callback functions that run on a request from a client.
-
- // Example:
- // "/foo/:name": function({ url, pattern, patternGroups }) {
- // return {
- // headers: {
- // "Content-Type": "text/html",
- // },
- // body: `${url} ${JSON.stringify(patternGroups)}`
- // }
- // }
-
- // Logger (fancier one is injected by Eleventy)
- logger: {
- info: console.log,
- log: console.log,
- error: console.error,
- }
-}
-
-class EleventyDevServer {
- #watcher;
- #serverClosing;
- #serverState;
- #readyPromise;
- #readyResolve;
-
- static getServer(...args) {
- return new EleventyDevServer(...args);
- }
-
- constructor(name, dir, options = {}) {
- debug("Creating new Dev Server instance.")
- this.name = name;
- this.normalizeOptions(options);
-
- this.fileCache = {};
- // Directory to serve
- if(!dir) {
- throw new Error("Missing `dir` to serve.");
- }
- this.dir = dir;
- this.logger = this.options.logger;
- this.getWatcher();
-
- this.#readyPromise = new Promise((resolve) => {
- this.#readyResolve = resolve;
- })
- }
-
- normalizeOptions(options = {}) {
- this.options = Object.assign({}, DEFAULT_OPTIONS, options);
-
- // better names for options https://github.com/11ty/eleventy-dev-server/issues/41
- if(options.folder !== undefined) {
- this.options.injectedScriptsFolder = options.folder;
- delete this.options.folder;
- }
- if(options.domdiff !== undefined) {
- this.options.domDiff = options.domdiff;
- delete this.options.domdiff;
- }
- if(options.enabled !== undefined) {
- this.options.liveReload = options.enabled;
- delete this.options.enabled;
- }
-
- this.options.pathPrefix = this.cleanupPathPrefix(this.options.pathPrefix);
- }
-
- get watcher() {
- if(this.#watcher) {
- return this.#watcher;
- }
-
- debug("Watching %O", this.options.watch);
- // TODO if using Eleventy and `watch` option includes output folder (_site) this will trigger two update events!
- this.#watcher = chokidar.watch(this.options.watch, {
- // TODO allow chokidar configuration extensions (or re-use the ones in Eleventy)
-
- ignored: ["**/node_modules/**", ".git"],
- ignoreInitial: true,
-
- // same values as Eleventy
- awaitWriteFinish: {
- stabilityThreshold: 150,
- pollInterval: 25,
- },
- });
-
- this.#watcher.on("change", (path) => {
- this.logger.log( `File changed: ${path} (skips build)` );
- this.reloadFiles([path]);
- });
-
- this.#watcher.on("add", (path) => {
- this.logger.log( `File added: ${path} (skips build)` );
- this.reloadFiles([path]);
- });
-
- return this.#watcher;
- }
-
- getWatcher() {
- // only initialize watcher if watcher via getWatcher if has targets
- // this.watcher in watchFiles() is a manual workaround
- if(this.options.watch.length > 0) {
- return this.watcher;
- }
- }
-
- watchFiles(files) {
- if(Array.isArray(files) && files.length > 0) {
- files = files.map(entry => TemplatePath.stripLeadingDotSlash(entry));
-
- debug("Also watching %O", files);
- this.watcher.add(files);
- }
- }
-
- cleanupPathPrefix(pathPrefix) {
- if(!pathPrefix || pathPrefix === "/") {
- return "/";
- }
- if(!pathPrefix.startsWith("/")) {
- pathPrefix = `/${pathPrefix}`
- }
- if(!pathPrefix.endsWith("/")) {
- pathPrefix = `${pathPrefix}/`;
- }
- return pathPrefix;
- }
-
- // Allowed list of files that can be served from outside `dir`
- setAliases(aliases) {
- if(aliases) {
- this.passthroughAliases = aliases;
- debug( "Setting aliases (emulated passthrough copy) %O", aliases );
- }
- }
-
- matchPassthroughAlias(url) {
- let aliases = Object.assign({}, this.options.aliases, this.passthroughAliases);
- for(let targetUrl in aliases) {
- if(!targetUrl) {
- continue;
- }
-
- let file = aliases[targetUrl];
- if(url.startsWith(targetUrl)) {
- let inputDirectoryPath = file + url.slice(targetUrl.length);
-
- // e.g. addPassthroughCopy("img/") but
- // generated by the image plugin (written to the output folder)
- // If they do not exist in the input directory, this will fallback to the output directory.
- if(fs.existsSync(inputDirectoryPath)) {
- return inputDirectoryPath;
- }
- }
- }
- return false;
- }
-
- isFileInDirectory(dir, file) {
- let absoluteDir = TemplatePath.absolutePath(dir);
- let absoluteFile = TemplatePath.absolutePath(file);
- return absoluteFile.startsWith(absoluteDir);
- }
-
- getOutputDirFilePath(filepath, filename = "") {
- let computedPath;
- if(filename === ".html") {
- // avoid trailing slash for filepath/.html requests
- let prefix = path.join(this.dir, filepath);
- if(prefix.endsWith(path.sep)) {
- prefix = prefix.substring(0, prefix.length - path.sep.length);
- }
- computedPath = prefix + filename;
- } else {
- computedPath = path.join(this.dir, filepath, filename);
- }
-
- computedPath = decodeURIComponent(computedPath);
-
- if(!filename) { // is a direct URL request (not an implicit .html or index.html add)
- let alias = this.matchPassthroughAlias(filepath);
-
- if(alias) {
- if(!this.isFileInDirectory(path.resolve("."), alias)) {
- throw new Error("Invalid path");
- }
-
- return alias;
- }
- }
-
- // Check that the file is in the output path (error if folks try use `..` in the filepath)
- if(!this.isFileInDirectory(this.dir, computedPath)) {
- throw new Error("Invalid path");
- }
-
- return computedPath;
- }
-
- isOutputFilePathExists(rawPath) {
- return fs.existsSync(rawPath) && !TemplatePath.isDirectorySync(rawPath);
- }
-
- /* Use conventions documented here https://www.zachleat.com/web/trailing-slash/
- * resource.html exists:
- * /resource matches
- * /resource/ redirects to /resource
- * resource/index.html exists:
- * /resource redirects to /resource/
- * /resource/ matches
- * both resource.html and resource/index.html exists:
- * /resource matches /resource.html
- * /resource/ matches /resource/index.html
- */
- mapUrlToFilePath(url) {
- // Note: `localhost` is not important here, any host would work
- let u = new URL(url, "http://localhost/");
- url = u.pathname;
-
- // Remove PathPrefix from start of URL
- if (this.options.pathPrefix !== "/") {
- // Requests to root should redirect to new pathPrefix
- if(url === "/") {
- return {
- statusCode: 302,
- url: this.options.pathPrefix,
- }
- }
-
- // Requests to anything outside of root should fail with 404
- if (!url.startsWith(this.options.pathPrefix)) {
- return {
- statusCode: 404,
- };
- }
-
- url = url.slice(this.options.pathPrefix.length - 1);
- }
-
- let rawPath = this.getOutputDirFilePath(url);
- if (this.isOutputFilePathExists(rawPath)) {
- return {
- statusCode: 200,
- filepath: rawPath,
- };
- }
-
- let indexHtmlPath = this.getOutputDirFilePath(url, this.options.indexFileName);
- let indexHtmlExists = fs.existsSync(indexHtmlPath);
-
- let htmlPath = this.getOutputDirFilePath(url, ".html");
- let htmlExists = fs.existsSync(htmlPath);
-
- // /resource/ => /resource/index.html
- if (indexHtmlExists && url.endsWith("/")) {
- return {
- statusCode: 200,
- filepath: indexHtmlPath,
- };
- }
- // /resource => resource.html
- if (htmlExists && !url.endsWith("/")) {
- return {
- statusCode: 200,
- filepath: htmlPath,
- };
- }
-
- // /resource => redirect to /resource/
- if (indexHtmlExists && !url.endsWith("/")) {
- return {
- statusCode: 301,
- url: u.pathname + "/",
- };
- }
-
- // /resource/ => redirect to /resource
- if (htmlExists && url.endsWith("/")) {
- return {
- statusCode: 301,
- url: u.pathname.substring(0, u.pathname.length - 1),
- };
- }
-
- return {
- statusCode: 404,
- };
- }
-
- #readFile(filepath) {
- if(this.options.useCache && this.fileCache[filepath]) {
- return this.fileCache[filepath];
- }
-
- let contents = fs.readFileSync(filepath, {
- encoding: this.options.encoding,
- });
-
- if(this.options.useCache) {
- this.fileCache[filepath] = contents;
- }
-
- return contents;
- }
-
- #getFileContents(localpath, rootDir) {
- let filepath;
- let searchLocations = [];
-
- if(rootDir) {
- searchLocations.push(TemplatePath.absolutePath(rootDir, localpath));
- }
-
- // fallbacks for file:../ installations
- searchLocations.push(TemplatePath.absolutePath(__dirname, localpath));
- searchLocations.push(TemplatePath.absolutePath(__dirname, "../../../", localpath));
-
- for(let loc of searchLocations) {
- if(fs.existsSync(loc)) {
- filepath = loc;
- break;
- }
- }
-
- return this.#readFile(filepath);
- }
-
- augmentContentWithNotifier(content, inlineContents = false, options = {}) {
- let { integrityHash, scriptContents } = options;
- if(!scriptContents) {
- scriptContents = this.#getFileContents("./client/reload-client.js");
- }
- if(!integrityHash) {
- integrityHash = ssri.fromData(scriptContents);
- }
-
- let searchParams = new URLSearchParams();
- if(this.options.reloadPort) {
- searchParams.set("reloadPort", this.options.reloadPort);
- }
-
- let searchParamsStr = searchParams.size > 0 ? `?${searchParams.toString()}` : "";
-
- // This isn’t super necessary because it’s a local file, but it’s included anyway
- let script = ``;
-
- if (content.includes("")) {
- return content.replace("", `${script}`);
- }
-
- // If the HTML document contains an importmap, insert the module script after the importmap element
- let importMapRegEx = /
\ No newline at end of file
diff --git a/node_modules/@11ty/eleventy-img/eslint.config.mjs b/node_modules/@11ty/eleventy-img/eslint.config.mjs
deleted file mode 100644
index ed7517e..0000000
--- a/node_modules/@11ty/eleventy-img/eslint.config.mjs
+++ /dev/null
@@ -1,29 +0,0 @@
-import { defineConfig } from "eslint/config";
-import pluginJs from "@eslint/js";
-import pluginStylistic from "@stylistic/eslint-plugin-js";
-import globals from "globals";
-
-const GLOB_JS = '**/*.?([cm])js';
-
-export default defineConfig([
- {
- files: [GLOB_JS],
- plugins: {
- js: pluginJs,
- "@stylistic/js": pluginStylistic
- },
- extends: [
- "js/recommended",
- ],
- languageOptions: {
- ecmaVersion: 2022,
- sourceType: "module",
- globals: { ...globals.node },
- },
- rules: {
- "@stylistic/js/indent": ["error", 2],
- "@stylistic/js/linebreak-style": ["error", "unix"],
- "@stylistic/js/semi": ["error", "always"],
- },
- },
-]);
diff --git a/node_modules/@11ty/eleventy-img/img.js b/node_modules/@11ty/eleventy-img/img.js
deleted file mode 100644
index ee4ed6d..0000000
--- a/node_modules/@11ty/eleventy-img/img.js
+++ /dev/null
@@ -1,151 +0,0 @@
-const {default: PQueue} = require("p-queue");
-
-const DeferCounter = require("./src/defer-counter.js");
-const BuildLogger = require("./src/build-logger.js");
-const Util = require("./src/util.js");
-const Image = require("./src/image.js");
-const DirectoryManager = require("./src/directory-manager.js");
-
-// For exports
-const getImageSize = require("image-size");
-const ImagePath = require("./src/image-path.js");
-
-const debug = require("debug")("Eleventy:Image");
-
-const GLOBAL_OPTIONS = require("./src/global-options.js").defaults;
-
-const { memCache, diskCache } = require("./src/caches.js");
-
-let deferCounter = new DeferCounter();
-let buildLogger = new BuildLogger();
-let directoryManager = new DirectoryManager();
-
-/* Queue */
-let processingQueue = new PQueue({
- concurrency: GLOBAL_OPTIONS.concurrency
-});
-processingQueue.on("active", () => {
- debug( `Concurrency: ${processingQueue.concurrency}, Size: ${processingQueue.size}, Pending: ${processingQueue.pending}` );
-});
-
-// TODO move this into build-logger.js
-function setupLogger(eleventyConfig, opts) {
- if(typeof eleventyConfig?.logger?.logWithOptions !== "function" || Util.isRequested(opts?.generatedVia)) {
- return;
- }
-
- buildLogger.setupOnce(eleventyConfig, () => {
- // before build
- deferCounter.resetCount();
- memCache.resetCount();
- diskCache.resetCount();
- }, () => {
- // after build
- let [memoryCacheHit] = memCache.getCount();
- let [diskCacheHit, diskCacheMiss] = diskCache.getCount();
- // these are unique images, multiple requests to optimize the same image are de-duplicated
- let deferCount = deferCounter.getCount();
-
- let cachedCount = memoryCacheHit + diskCacheHit;
- let optimizedCount = diskCacheMiss + diskCacheHit + memoryCacheHit + deferCount;
-
- let msg = [];
- msg.push(`${optimizedCount} ${optimizedCount !== 1 ? "images" : "image"} optimized`);
-
- if(cachedCount > 0 || deferCount > 0) {
- let innerMsg = [];
- if(cachedCount > 0) {
- innerMsg.push(`${cachedCount} cached`);
- }
- if(deferCount > 0) {
- innerMsg.push(`${deferCount} deferred`);
- }
- msg.push(` (${innerMsg.join(", ")})`);
- }
-
- if(optimizedCount > 0 || cachedCount > 0 || deferCount > 0) {
- eleventyConfig?.logger?.logWithOptions({
- message: msg.join(""),
- prefix: "[11ty/eleventy-img]",
- color: "green",
- });
- }
- });
-}
-
-function createImage(src, opts = {}) {
- let eleventyConfig = opts.eleventyConfig;
-
- if(opts?.eleventyConfig && {}.propertyIsEnumerable.call(opts, "eleventyConfig")) {
- delete opts.eleventyConfig;
- Util.addConfig(eleventyConfig, opts);
- }
-
- let img = Image.create(src, opts);
-
- img.setQueue(processingQueue);
- img.setBuildLogger(buildLogger);
- img.setDirectoryManager(directoryManager);
-
- setupLogger(eleventyConfig, opts);
-
- if(opts.transformOnRequest) {
- deferCounter.increment(src);
- }
-
- return img;
-};
-
-function queueImage(src, opts = {}) {
- if(src.constructor?.name === "UserConfig") {
- throw new Error(`Eleventy Image’s default export is not an Eleventy Plugin and cannot be used with \`eleventyConfig.addPlugin()\`. Use the \`eleventyImageTransformPlugin\` named export instead, like this: \`import { eleventyImageTransformPlugin } from '@11ty/eleventy-img';\` or this: \`const { eleventyImageTransformPlugin } = require('@11ty/eleventy-img');\``);
- }
-
- let img = createImage(src, opts);
- return img.queue();
-}
-
-// Exports
-
-module.exports = queueImage;
-
-Object.defineProperty(module.exports, "concurrency", {
- get: function() {
- return processingQueue.concurrency;
- },
- set: function(concurrency) {
- processingQueue.concurrency = concurrency;
- },
-});
-
-module.exports.Util = Util;
-module.exports.Image = Image;
-module.exports.ImagePath = ImagePath;
-module.exports.ImageSize = getImageSize;
-
-// Backwards compat
-module.exports.statsSync = Image.statsSync;
-module.exports.statsByDimensionsSync = Image.statsByDimensionsSync;
-module.exports.getFormats = Image.getFormatsArray;
-module.exports.getWidths = Image.getValidWidths;
-
-module.exports.getHash = function getHash(src, options) {
- let img = new Image(src, options);
- return img.getHash();
-};
-
-module.exports.setupLogger = setupLogger;
-
-const generateHTML = require("./src/generate-html.js");
-module.exports.generateHTML = generateHTML;
-module.exports.generateObject = generateHTML.generateObject;
-
-const { eleventyWebcOptionsPlugin } = require("./src/webc-options-plugin.js");
-module.exports.eleventyImagePlugin = eleventyWebcOptionsPlugin;
-module.exports.eleventyImageWebcOptionsPlugin = eleventyWebcOptionsPlugin;
-
-const { eleventyImageTransformPlugin } = require("./src/transform-plugin.js");
-module.exports.eleventyImageTransformPlugin = eleventyImageTransformPlugin;
-
-const { eleventyImageOnRequestDuringServePlugin } = require("./src/on-request-during-serve-plugin.js");
-module.exports.eleventyImageOnRequestDuringServePlugin = eleventyImageOnRequestDuringServePlugin;
diff --git a/node_modules/@11ty/eleventy-img/package.json b/node_modules/@11ty/eleventy-img/package.json
deleted file mode 100644
index 9a2b34a..0000000
--- a/node_modules/@11ty/eleventy-img/package.json
+++ /dev/null
@@ -1,75 +0,0 @@
-{
- "name": "@11ty/eleventy-img",
- "version": "6.0.4",
- "description": "Low level utility to perform build-time image transformations.",
- "publishConfig": {
- "access": "public"
- },
- "main": "img.js",
- "engines": {
- "node": ">=18"
- },
- "scripts": {
- "pretest": "eslint img.js src/**.js test/**.js",
- "test": "ava --no-worker-threads",
- "watch": "ava --no-worker-threads --watch",
- "sample": "cd sample && node sample.js"
- },
- "repository": {
- "type": "git",
- "url": "git+https://github.com/11ty/eleventy-img.git"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/11ty"
- },
- "keywords": [
- "eleventy",
- "eleventy-utility"
- ],
- "author": {
- "name": "Zach Leatherman",
- "email": "zachleatherman@gmail.com",
- "url": "https://zachleat.com/"
- },
- "license": "MIT",
- "bugs": {
- "url": "https://github.com/11ty/eleventy-img/issues"
- },
- "homepage": "https://github.com/11ty/eleventy-img#readme",
- "dependencies": {
- "@11ty/eleventy-fetch": "^5.1.0",
- "@11ty/eleventy-utils": "^2.0.7",
- "brotli-size": "^4.0.0",
- "debug": "^4.4.0",
- "entities": "^6.0.0",
- "image-size": "^1.2.1",
- "p-queue": "^6.6.2",
- "sharp": "^0.33.5"
- },
- "devDependencies": {
- "@11ty/eleventy": "^3.0.0",
- "@11ty/eleventy-plugin-webc": "^0.11.2",
- "@eslint/js": "^9.26.0",
- "@stylistic/eslint-plugin-js": "^4.2.0",
- "ava": "^6.3.0",
- "eslint": "^9.26.0",
- "exifr": "^7.1.3",
- "globals": "^16.1.0",
- "pixelmatch": "^5.3.0"
- },
- "ava": {
- "failFast": false,
- "files": [
- "./test/*.{js,cjs,mjs}"
- ],
- "watchMode": {
- "ignoreChanges": [
- "./.cache/*",
- "./img/*",
- "./test/img/*",
- "./test/**/generated*"
- ]
- }
- }
-}
diff --git a/node_modules/@11ty/eleventy-img/src/adapters/brotli-size.browser.js b/node_modules/@11ty/eleventy-img/src/adapters/brotli-size.browser.js
deleted file mode 100644
index cf0ce10..0000000
--- a/node_modules/@11ty/eleventy-img/src/adapters/brotli-size.browser.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = function() {
- throw new Error("`svgCompressionSize: 'br'` feature is not supported in browser.");
-};
diff --git a/node_modules/@11ty/eleventy-img/src/adapters/brotli-size.js b/node_modules/@11ty/eleventy-img/src/adapters/brotli-size.js
deleted file mode 100644
index 57efc1a..0000000
--- a/node_modules/@11ty/eleventy-img/src/adapters/brotli-size.js
+++ /dev/null
@@ -1,5 +0,0 @@
-const brotliSize = require("brotli-size");
-
-module.exports = function(contents) {
- return brotliSize.sync(contents);
-};
diff --git a/node_modules/@11ty/eleventy-img/src/adapters/sharp.browser.js b/node_modules/@11ty/eleventy-img/src/adapters/sharp.browser.js
deleted file mode 100644
index c1f6eb2..0000000
--- a/node_modules/@11ty/eleventy-img/src/adapters/sharp.browser.js
+++ /dev/null
@@ -1,3 +0,0 @@
-module.exports = function() {
- throw new Error("Sharp is not supported in browser.");
-};
diff --git a/node_modules/@11ty/eleventy-img/src/adapters/sharp.js b/node_modules/@11ty/eleventy-img/src/adapters/sharp.js
deleted file mode 100644
index 63e9253..0000000
--- a/node_modules/@11ty/eleventy-img/src/adapters/sharp.js
+++ /dev/null
@@ -1,3 +0,0 @@
-const sharp = require("sharp");
-
-module.exports = sharp;
diff --git a/node_modules/@11ty/eleventy-img/src/build-logger.js b/node_modules/@11ty/eleventy-img/src/build-logger.js
deleted file mode 100644
index 434fc8e..0000000
--- a/node_modules/@11ty/eleventy-img/src/build-logger.js
+++ /dev/null
@@ -1,66 +0,0 @@
-const path = require("node:path");
-const { TemplatePath } = require("@11ty/eleventy-utils");
-
-const Util = require("./util.js");
-
-class BuildLogger {
- #eleventyConfig;
-
- constructor() {
- this.hasAssigned = false;
- }
-
- setupOnce(eleventyConfig, beforeCallback, afterCallback) {
- if(this.hasAssigned) {
- return;
- }
-
- this.hasAssigned = true;
- this.#eleventyConfig = eleventyConfig;
-
- eleventyConfig.on("eleventy.before", beforeCallback);
- eleventyConfig.on("eleventy.after", afterCallback);
-
- eleventyConfig.on("eleventy.reset", () => {
- this.hasAssigned = false;
- beforeCallback(); // we run this on reset because the before callback will have disappeared (as the config reset)
- });
- }
-
- getFriendlyImageSource(imageSource) {
- if(Buffer.isBuffer(imageSource)) {
- return ``;
- }
-
- if(Util.isRemoteUrl(imageSource)) {
- return imageSource;
- }
- if(path.isAbsolute(imageSource)) {
- // convert back to relative url
- return TemplatePath.addLeadingDotSlash(path.relative(path.resolve("."), imageSource));
- }
-
- return TemplatePath.addLeadingDotSlash(imageSource);
- }
-
- log(message, options = {}, logOptions = {}) {
- if(typeof this.#eleventyConfig?.logger?.logWithOptions !== "function" || options.transformOnRequest) {
- return;
- }
-
- this.#eleventyConfig.logger.logWithOptions(Object.assign({
- message: `${message}${options.generatedVia ? ` (${options.generatedVia})` : ""}`,
- type: "log",
- prefix: "[11ty/eleventy-img]"
- }, logOptions));
- }
-
- error(message, options = {}, logOptions = {}) {
- logOptions.type = "error";
- logOptions.force = true;
-
- this.log(message, options, logOptions);
- }
-}
-
-module.exports = BuildLogger;
diff --git a/node_modules/@11ty/eleventy-img/src/caches.js b/node_modules/@11ty/eleventy-img/src/caches.js
deleted file mode 100644
index 62818ac..0000000
--- a/node_modules/@11ty/eleventy-img/src/caches.js
+++ /dev/null
@@ -1,16 +0,0 @@
-const MemoryCache = require("./memory-cache.js");
-const DiskCache = require("./disk-cache.js");
-const ExistsCache = require("./exists-cache.js");
-
-let memCache = new MemoryCache();
-
-let existsCache = new ExistsCache();
-
-let diskCache = new DiskCache();
-diskCache.setExistsCache(existsCache);
-
-module.exports = {
- memCache,
- diskCache,
- existsCache
-};
diff --git a/node_modules/@11ty/eleventy-img/src/defer-counter.js b/node_modules/@11ty/eleventy-img/src/defer-counter.js
deleted file mode 100644
index 9fcb0ff..0000000
--- a/node_modules/@11ty/eleventy-img/src/defer-counter.js
+++ /dev/null
@@ -1,27 +0,0 @@
-class DeferCounter {
- constructor() {
- this.resetCount();
- }
-
- resetCount() {
- this.deferCount = 0;
- this.inputs = new Map();
- }
-
- getCount() {
- return this.deferCount;
- }
-
- increment(input) {
- if(input) {
- if(this.inputs.has(input)) {
- return;
- }
- this.inputs.set(input, true);
- }
-
- this.deferCount++;
- }
-}
-
-module.exports = DeferCounter;
diff --git a/node_modules/@11ty/eleventy-img/src/directory-manager.js b/node_modules/@11ty/eleventy-img/src/directory-manager.js
deleted file mode 100644
index a2ebbe0..0000000
--- a/node_modules/@11ty/eleventy-img/src/directory-manager.js
+++ /dev/null
@@ -1,29 +0,0 @@
-const fs = require("node:fs");
-const path = require("node:path");
-const debugUtil = require("debug");
-const debugAssets = debugUtil("Eleventy:Assets");
-
-class DirectoryManager {
- #dirs = new Set();
-
- isCreated(dir) {
- return this.#dirs.has(dir);
- }
-
- create(dir) {
- if(this.isCreated(dir)) {
- return;
- }
-
- this.#dirs.add(dir);
- debugAssets("[11ty/eleventy-img] Creating directory %o", dir);
- fs.mkdirSync(dir, { recursive: true });
- }
-
- createFromFile(filepath) {
- let dir = path.dirname(filepath);
- this.create(dir);
- }
-}
-
-module.exports = DirectoryManager;
diff --git a/node_modules/@11ty/eleventy-img/src/disk-cache.js b/node_modules/@11ty/eleventy-img/src/disk-cache.js
deleted file mode 100644
index 4d14319..0000000
--- a/node_modules/@11ty/eleventy-img/src/disk-cache.js
+++ /dev/null
@@ -1,54 +0,0 @@
-// const debug = require("debug")("Eleventy:Image");
-
-class DiskCache {
- #existsCache;
-
- constructor() {
- this.hitCounter = 0;
- this.missCounter = 0;
- this.inputs = new Map();
- }
-
- setExistsCache(existsCache) {
- this.#existsCache = existsCache;
- }
-
- resetCount() {
- this.hitCounter = 0;
- this.missCounter = 0;
- }
-
- getCount() {
- return [this.hitCounter, this.missCounter];
- }
-
- isCached(targetFile, sourceInput, incrementCounts = true) {
- if(!this.#existsCache) {
- throw new Error("Missing `#existsCache`");
- }
-
- // Disk cache runs once per output file, so we only increment counts once per input
- if(this.inputs.has(sourceInput)) {
- incrementCounts = false;
- }
-
- this.inputs.set(sourceInput, true);
-
- if(this.#existsCache?.exists(targetFile)) {
- if(incrementCounts) {
- this.hitCounter++;
- }
-
- // debug("Images re-used (via disk cache): %o", this.hitCounter);
- return true;
- }
-
- if(incrementCounts) {
- this.missCounter++;
- }
-
- return false;
- }
-}
-
-module.exports = DiskCache;
diff --git a/node_modules/@11ty/eleventy-img/src/exists-cache.js b/node_modules/@11ty/eleventy-img/src/exists-cache.js
deleted file mode 100644
index 56b1702..0000000
--- a/node_modules/@11ty/eleventy-img/src/exists-cache.js
+++ /dev/null
@@ -1,40 +0,0 @@
-const fs = require("node:fs");
-const Util = require("./util.js");
-
-// Checks both files and directories
-class ExistsCache {
- #exists = new Map();
-
- constructor() {
- this.lookupCount = 0;
- }
-
- get size() {
- return this.#exists.size;
- }
-
- has(path) {
- return this.#exists.has(path);
- }
-
- // Relative paths (to root directory) expected (but not enforced due to perf costs)
- exists(path) {
- if(Util.isFullUrl(path)) {
- return false;
- }
-
- if (!this.#exists.has(path)) {
- let exists = fs.existsSync(path);
- this.lookupCount++;
-
- // mark for next time
- this.#exists.set(path, Boolean(exists));
-
- return exists;
- }
-
- return this.#exists.get(path);
- }
-}
-
-module.exports = ExistsCache;
diff --git a/node_modules/@11ty/eleventy-img/src/format-hooks/svg.js b/node_modules/@11ty/eleventy-img/src/format-hooks/svg.js
deleted file mode 100644
index ff42e69..0000000
--- a/node_modules/@11ty/eleventy-img/src/format-hooks/svg.js
+++ /dev/null
@@ -1,14 +0,0 @@
-const fs = require("node:fs");
-const debugUtil = require("debug");
-const debugAssets = debugUtil("Eleventy:Assets");
-
-module.exports = async function createSvg(sharpInstance) {
- let input = sharpInstance.options.input;
- let svgBuffer = input.buffer;
- if(svgBuffer) { // remote URL already has buffer
- return svgBuffer;
- } else { // local file system
- debugAssets("[11ty/eleventy-img] Reading %o", input.file);
- return fs.readFileSync(input.file);
- }
-};
diff --git a/node_modules/@11ty/eleventy-img/src/generate-html.js b/node_modules/@11ty/eleventy-img/src/generate-html.js
deleted file mode 100644
index 87ade77..0000000
--- a/node_modules/@11ty/eleventy-img/src/generate-html.js
+++ /dev/null
@@ -1,220 +0,0 @@
-const { escapeAttribute } = require("entities");
-
-const LOWSRC_FORMAT_PREFERENCE = ["jpeg", "png", "gif", "svg", "webp", "avif"];
-
-const CHILDREN_OBJECT_KEY = "@children";
-
-function generateSrcset(metadataFormatEntry) {
- if(!Array.isArray(metadataFormatEntry)) {
- return "";
- }
-
- return metadataFormatEntry.map(entry => entry.srcset).join(", ");
-}
-
-/*
- Returns:
- e.g. { img: { alt: "", src: "" }
- e.g. { img: { alt: "", src: "", srcset: "", sizes: "" } }
- e.g. { picture: {
- class: "",
- @children: [
- { source: { srcset: "", sizes: "" } },
- { source: { srcset: "", sizes: "" } },
- { img: { alt: "", src: "", srcset: "", sizes: "" } },
- ]
- }
- */
-function generateObject(metadata, userDefinedImgAttributes = {}, userDefinedPictureAttributes = {}, options = {}) {
- let htmlOptions = options?.htmlOptions || {};
- let imgAttributes = Object.assign({}, options?.defaultAttributes, htmlOptions?.imgAttributes, userDefinedImgAttributes);
- let pictureAttributes = Object.assign({}, htmlOptions?.pictureAttributes, userDefinedPictureAttributes);
-
- // The attributes.src gets overwritten later on. Save it here to make the error outputs less cryptic.
- let originalSrc = imgAttributes.src;
-
- if(imgAttributes.alt === undefined) {
- // You bet we throw an error on missing alt (alt="" works okay)
- throw new Error(`Missing \`alt\` attribute on eleventy-img shortcode from: ${originalSrc}`);
- }
-
- let formats = Object.keys(metadata);
- let values = Object.values(metadata);
- let entryCount = 0;
- for(let imageFormat of values) {
- entryCount += imageFormat.length;
- }
-
- if(entryCount === 0) {
- throw new Error("No image results found from `eleventy-img` in generateHTML. Expects a results object similar to: https://www.11ty.dev/docs/plugins/image/#usage.");
- }
-
- let lowsrc;
- let lowsrcFormat;
- for(let format of LOWSRC_FORMAT_PREFERENCE) {
- if((format in metadata) && metadata[format].length) {
- lowsrcFormat = format;
- lowsrc = metadata[lowsrcFormat];
- break;
- }
- }
-
- // Handle if empty intersection between format and LOWSRC_FORMAT_PREFERENCE (e.g. gif)
- // If there’s only one format in the results, use that
- if(!lowsrc && formats.length === 1) {
- lowsrcFormat = formats[0];
- lowsrc = metadata[lowsrcFormat];
- }
-
- if(!lowsrc || !lowsrc.length) {
- throw new Error(`Could not find the lowest
source for responsive markup for ${originalSrc}`);
- }
-
- imgAttributes.src = lowsrc[0].url;
-
- if(htmlOptions.fallback === "largest" || htmlOptions.fallback === undefined) {
- imgAttributes.width = lowsrc[lowsrc.length - 1].width;
- imgAttributes.height = lowsrc[lowsrc.length - 1].height;
- } else if(htmlOptions.fallback === "smallest") {
- imgAttributes.width = lowsrc[0].width;
- imgAttributes.height = lowsrc[0].height;
- } else {
- throw new Error("Invalid `fallback` option specified. 'largest' and 'smallest' are supported. Received: " + htmlOptions.fallback);
- }
-
- let imgAttributesWithoutSizes = Object.assign({}, imgAttributes);
- delete imgAttributesWithoutSizes.sizes;
-
- //
: one format and one size
- if(entryCount === 1) {
- return {
- img: imgAttributesWithoutSizes
- };
- }
-
- // Per the HTML specification sizes is required srcset is using the `w` unit
- // https://html.spec.whatwg.org/dev/semantics.html#the-link-element:attr-link-imagesrcset-4
- // Using the default "100vw" is okay
- let missingSizesErrorMessage = `Missing \`sizes\` attribute on eleventy-img shortcode from: ${originalSrc}. Workarounds: 1. Use a single output width for this image 2. Use \`loading="lazy"\` (which uses sizes="auto" though browser support currently varies)`;
-
- //
: one format and multiple sizes
- if(formats.length === 1) { // implied entryCount > 1
- if(entryCount > 1 && !imgAttributes.sizes) {
- // Use `sizes="auto"` when using `loading="lazy"` instead of throwing an error.
- if(imgAttributes.loading === "lazy") {
- imgAttributes.sizes = "auto";
- } else {
- throw new Error(missingSizesErrorMessage);
- }
- }
-
- let imgAttributesCopy = Object.assign({}, imgAttributesWithoutSizes);
- imgAttributesCopy.srcset = generateSrcset(lowsrc);
- imgAttributesCopy.sizes = imgAttributes.sizes;
-
- return {
- img: imgAttributesCopy
- };
- }
-
- let children = [];
- values.filter(imageFormat => {
- return imageFormat.length > 0 && (lowsrcFormat !== imageFormat[0].format);
- }).forEach(imageFormat => {
- if(imageFormat.length > 1 && !imgAttributes.sizes) {
- if(imgAttributes.loading === "lazy") {
- imgAttributes.sizes = "auto";
- } else {
- throw new Error(missingSizesErrorMessage);
- }
- }
-
- let sourceAttrs = {
- type: imageFormat[0].sourceType,
- srcset: generateSrcset(imageFormat),
- };
-
- if(imgAttributes.sizes) {
- sourceAttrs.sizes = imgAttributes.sizes;
- }
-
- children.push({
- "source": sourceAttrs
- });
- });
-
- /*
- Add lowsrc as an img, for browsers that don’t support picture or the formats provided in source
-
- If we have more than one size, we can use srcset and sizes.
- If the browser doesn't support those attributes, it should ignore them.
- */
- let imgAttributesForPicture = Object.assign({}, imgAttributesWithoutSizes);
- if (lowsrc.length > 1) {
- if (!imgAttributes.sizes) {
- // Per the HTML specification sizes is required srcset is using the `w` unit
- // https://html.spec.whatwg.org/dev/semantics.html#the-link-element:attr-link-imagesrcset-4
- // Using the default "100vw" is okay
- throw new Error(missingSizesErrorMessage);
- }
-
- imgAttributesForPicture.srcset = generateSrcset(lowsrc);
- imgAttributesForPicture.sizes = imgAttributes.sizes;
- }
-
- children.push({
- "img": imgAttributesForPicture
- });
-
- return {
- "picture": {
- ...pictureAttributes,
- [CHILDREN_OBJECT_KEY]: children,
- }
- };
-}
-
-function mapObjectToHTML(tagName, attrs = {}) {
- let attrHtml = Object.entries(attrs).map(entry => {
- let [key, value] = entry;
- if(key === CHILDREN_OBJECT_KEY) {
- return false;
- }
-
- // Issue #82
- if(key === "alt") {
- return `${key}="${value ? escapeAttribute(value) : ""}"`;
- }
-
- return `${key}="${value}"`;
- }).filter(keyPair => Boolean(keyPair)).join(" ");
-
- return `<${tagName}${attrHtml ? ` ${attrHtml}` : ""}>`;
-}
-
-function generateHTML(metadata, attributes = {}, htmlOptionsOverride = {}) {
- let htmlOptions = Object.assign({}, metadata?.eleventyImage?.htmlOptions, htmlOptionsOverride);
-
- let isInline = htmlOptions.whitespaceMode !== "block";
- let markup = [];
-
- // htmlOptions.imgAttributes and htmlOptions.pictureAttributes are merged in generateObject
- let obj = generateObject(metadata, attributes, {}, { htmlOptions });
- for(let tag in obj) {
- markup.push(mapObjectToHTML(tag, obj[tag]));
-
- //
- if(Array.isArray(obj[tag]?.[CHILDREN_OBJECT_KEY])) {
- for(let child of obj[tag][CHILDREN_OBJECT_KEY]) {
- let childTagName = Object.keys(child)[0];
- markup.push((!isInline ? " " : "") + mapObjectToHTML(childTagName, child[childTagName]));
- }
-
- markup.push(`${tag}>`);
- }
- }
- return markup.join(!isInline ? "\n" : "");
-}
-
-module.exports = generateHTML;
-module.exports.generateObject = generateObject;
diff --git a/node_modules/@11ty/eleventy-img/src/global-options.js b/node_modules/@11ty/eleventy-img/src/global-options.js
deleted file mode 100644
index 70f8bee..0000000
--- a/node_modules/@11ty/eleventy-img/src/global-options.js
+++ /dev/null
@@ -1,121 +0,0 @@
-const path = require("node:path");
-const os = require("node:os");
-
-const Util = require("./util.js");
-const svgHook = require("./format-hooks/svg.js");
-
-const DEFAULTS = {
- widths: ["auto"],
- formats: ["webp", "jpeg"], // "png", "svg", "avif"
-
- formatFiltering: ["transparent", "animated"],
-
- // Via https://github.com/11ty/eleventy-img/issues/258
- concurrency: Math.min(Math.max(8, os.availableParallelism()), 16),
-
- urlPath: "/img/",
- outputDir: "img/",
-
- // true to skip raster formats if SVG input is found
- // "size" to skip raster formats if larger than SVG input
- svgShortCircuit: false,
- svgAllowUpscale: true,
- svgCompressionSize: "", // "br" to report SVG `size` property in metadata as Brotli compressed
- // overrideInputFormat: false, // internal, used to force svg output in statsSync et al
- sharpOptions: {}, // options passed to the Sharp constructor
- sharpWebpOptions: {}, // options passed to the Sharp webp output method
- sharpPngOptions: {}, // options passed to the Sharp png output method
- sharpJpegOptions: {}, // options passed to the Sharp jpeg output method
- sharpAvifOptions: {}, // options passed to the Sharp avif output method
-
- formatHooks: {
- svg: svgHook,
- },
-
- cacheDuration: "1d", // deprecated, use cacheOptions.duration
-
- // disk cache for remote assets
- cacheOptions: {
- // duration: "1d",
- // directory: ".cache",
- // removeUrlQueryParams: false,
- // fetchOptions: {},
- },
-
- filenameFormat: null,
-
- // urlFormat allows you to return a full URL to an image including the domain.
- // Useful when you’re using your own hosted image service (probably via .statsSync or .statsByDimensionsSync)
- // Note: when you use this, metadata will not include .filename or .outputPath
- urlFormat: null,
-
- // If true, skips all image processing, just return stats. Doesn’t read files, doesn’t write files.
- // Important to note that `dryRun: true` performs image processing and includes a buffer—this does not.
- // Useful when used with `urlFormat` above.
- // Better than .statsSync* functions, because this will use the in-memory cache and de-dupe requests. Those will not.
- statsOnly: false,
- remoteImageMetadata: {}, // For `statsOnly` remote images, this needs to be populated with { width, height, format? }
-
- useCache: true, // in-memory and disk cache
- dryRun: false, // Also returns a buffer instance in the return object. Doesn’t write anything to the file system
-
- hashLength: 10, // Truncates the hash to this length
-
- fixOrientation: false, // always rotate images to ensure correct orientation
-
- // When the original width is smaller than the desired output width, this is the minimum size difference
- // between the next smallest image width that will generate one extra width in the output.
- // e.g. when using `widths: [400, 800]`, the source image would need to be at least (400 * 1.25 =) 500px wide
- // to generate two outputs (400px, 500px). If the source image is less than 500px, only one output will
- // be generated (400px).
- // Read more at https://github.com/11ty/eleventy-img/issues/184 and https://github.com/11ty/eleventy-img/pull/190
- minimumThreshold: 1.25,
-
- // During --serve mode in Eleventy, this will generate images on request instead of part of the build skipping
- // writes to the file system and speeding up builds!
- transformOnRequest: false,
-
- // operate on Sharp instance manually.
- transform: undefined,
-
- // return HTML from generateHTML directly
- returnType: "object", // or "html"
-
- // Defaults used when generateHTML is called from a result set
- htmlOptions: {
- imgAttributes: {},
- pictureAttributes: {},
-
- whitespaceMode: "inline", // "block"
-
- // the
will use the largest dimensions for width/height (when multiple output widths are specified)
- // see https://github.com/11ty/eleventy-img/issues/63
- fallback: "largest", // or "smallest"
- },
-
- // v5.0.0 Removed `extensions`, option to override output format with new file extension. It wasn’t being used anywhere or documented.
- // v6.0.0, removed `useCacheValidityInHash: true` see https://github.com/11ty/eleventy-img/issues/146#issuecomment-2555741376
-};
-
-function getGlobalOptions(eleventyConfig, options, via) {
- let directories = eleventyConfig.directories;
- let globalOptions = Object.assign({
- packages: {
- image: require("../"),
- },
- outputDir: path.join(directories.output, options.urlPath || ""),
- failOnError: true,
- }, options);
-
- globalOptions.directories = directories;
- globalOptions.generatedVia = via;
-
- Util.addConfig(eleventyConfig, globalOptions);
-
- return globalOptions;
-}
-
-module.exports = {
- getGlobalOptions,
- defaults: DEFAULTS,
-};
diff --git a/node_modules/@11ty/eleventy-img/src/image-attrs-to-posthtml-node.js b/node_modules/@11ty/eleventy-img/src/image-attrs-to-posthtml-node.js
deleted file mode 100644
index 55b41b1..0000000
--- a/node_modules/@11ty/eleventy-img/src/image-attrs-to-posthtml-node.js
+++ /dev/null
@@ -1,140 +0,0 @@
-const eleventyImage = require("../img.js");
-const Util = require("./util.js");
-
-const ATTR_PREFIX = "eleventy:";
-
-const CHILDREN_OBJECT_KEY = "@children";
-
-const ATTR = {
- IGNORE: `${ATTR_PREFIX}ignore`,
- WIDTHS: `${ATTR_PREFIX}widths`,
- FORMATS: `${ATTR_PREFIX}formats`,
- OUTPUT: `${ATTR_PREFIX}output`,
- OPTIONAL: `${ATTR_PREFIX}optional`,
- PICTURE: `${ATTR_PREFIX}pictureattr:`,
-};
-
-function getPictureAttributesFromImgNode(attrs = {}) {
- let pictureAttrs = {};
- for(let key in attrs) {
- //
hoists to `
- // e.g.
hoists to
- if(key.startsWith(ATTR.PICTURE)) {
- pictureAttrs[key.slice(ATTR.PICTURE.length)] = attrs[key];
- }
- }
- return pictureAttrs;
-}
-
-function convertToPosthtmlNode(obj) {
- // node.tag
- // node.attrs
- // node.content
-
- let node = {};
- let [key] = Object.keys(obj);
- node.tag = key;
-
- let children = obj[key]?.[CHILDREN_OBJECT_KEY];
- let attributes = {};
- for(let attrKey in obj[key]) {
- if(attrKey !== CHILDREN_OBJECT_KEY) {
- attributes[attrKey] = obj[key][attrKey];
- }
- }
- node.attrs = attributes;
-
- if(Array.isArray(children)) {
- node.content = obj[key]?.[CHILDREN_OBJECT_KEY]
- .filter(child => Boolean(child))
- .map(child => {
- return convertToPosthtmlNode(child);
- });
- }
-
- return node;
-}
-
-function isValidSimpleWidthAttribute(width) {
- // `width` must be a single integer (not comma separated). Don’t use invalid HTML in width attribute. Use eleventy:widths if you want more complex support
- return (""+width) == (""+parseInt(width, 10));
-}
-
-async function imageAttributesToPosthtmlNode(attributes, instanceOptions, globalPluginOptions) {
- if(!attributes.src) {
- throw new Error("Missing `src` attribute for `@11ty/eleventy-img`");
- }
-
- if(!globalPluginOptions) {
- throw new Error("Missing global defaults for `@11ty/eleventy-img`: did you call addPlugin?");
- }
-
- if(!instanceOptions) {
- instanceOptions = {};
- }
-
- // overrides global widths
- if(attributes.width && isValidSimpleWidthAttribute(attributes.width)) {
- // Support `width` but only single value
- instanceOptions.widths = [ parseInt(attributes.width, 10) ];
- } else if(attributes[ATTR.WIDTHS] && typeof attributes[ATTR.WIDTHS] === "string") {
- instanceOptions.widths = attributes[ATTR.WIDTHS].split(",").map(entry => parseInt(entry, 10));
- }
-
- if(attributes[ATTR.FORMATS] && typeof attributes[ATTR.FORMATS] === "string") {
- instanceOptions.formats = attributes[ATTR.FORMATS].split(",");
- }
-
- let options = Object.assign({}, globalPluginOptions, instanceOptions);
- Util.addConfig(globalPluginOptions.eleventyConfig, options);
-
- let metadata = await eleventyImage(attributes.src, options);
- let pictureAttributes = getPictureAttributesFromImgNode(attributes);
-
- cleanAttrs(attributes);
-
- // You bet we throw an error on missing alt in `imageAttributes` (alt="" works okay)
- let obj = await eleventyImage.generateObject(metadata, attributes, pictureAttributes, options);
- return convertToPosthtmlNode(obj);
-}
-
-function cleanAttrs(attrs = {}) {
- for(let key in attrs) {
- if(key.startsWith(ATTR_PREFIX)) {
- delete attrs?.[key];
- }
- }
-}
-
-function cleanTag(node) {
- // Delete all prefixed attributes
- cleanAttrs(node?.attrs);
-}
-
-function isIgnored(node) {
- return node?.attrs && node?.attrs?.[ATTR.IGNORE] !== undefined;
-}
-
-function isOptional(node, comparisonValue) {
- let attrValue = node?.attrs && node?.attrs?.[ATTR.OPTIONAL];
- if(attrValue !== undefined) {
- // if comparisonValue is not specified, return true
- if(comparisonValue === undefined) {
- return true;
- }
- return attrValue === comparisonValue;
- }
- return false;
-}
-
-function getOutputDirectory(node) {
- return node?.attrs?.[ATTR.OUTPUT];
-}
-
-module.exports = {
- imageAttributesToPosthtmlNode,
- cleanTag,
- isIgnored,
- isOptional,
- getOutputDirectory,
-};
diff --git a/node_modules/@11ty/eleventy-img/src/image-path.js b/node_modules/@11ty/eleventy-img/src/image-path.js
deleted file mode 100644
index 1a875c7..0000000
--- a/node_modules/@11ty/eleventy-img/src/image-path.js
+++ /dev/null
@@ -1,30 +0,0 @@
-const path = require("node:path");
-
-class ImagePath {
- static filenameFormat(id, src, width, format) { // and options
- if (width) {
- return `${id}-${width}.${format}`;
- }
-
- return `${id}.${format}`;
- }
-
- static getFilename(id, src, width, format, options = {}) {
- if (typeof options.filenameFormat === "function") {
- let filename = options.filenameFormat(id, src, width, format, options);
- // if options.filenameFormat returns falsy, use fallback filename
- if(filename) {
- return filename;
- }
- }
-
- return ImagePath.filenameFormat(id, src, width, format, options);
- }
-
- static convertFilePathToUrl(dir, filename) {
- let src = path.join(dir, filename);
- return src.split(path.sep).join("/");
- }
-}
-
-module.exports = ImagePath;
diff --git a/node_modules/@11ty/eleventy-img/src/image.js b/node_modules/@11ty/eleventy-img/src/image.js
deleted file mode 100644
index 0f01861..0000000
--- a/node_modules/@11ty/eleventy-img/src/image.js
+++ /dev/null
@@ -1,930 +0,0 @@
-const fs = require("node:fs");
-const fsp = fs.promises;
-const path = require("node:path");
-const getImageSize = require("image-size");
-const debugUtil = require("debug");
-
-const { createHashSync } = require("@11ty/eleventy-utils");
-const { Fetch } = require("@11ty/eleventy-fetch");
-
-const sharp = require("./adapters/sharp.js");
-const brotliSize = require("./adapters/brotli-size.js");
-const Util = require("./util.js");
-const ImagePath = require("./image-path.js");
-const generateHTML = require("./generate-html.js");
-
-const GLOBAL_OPTIONS = require("./global-options.js").defaults;
-const { existsCache, memCache, diskCache } = require("./caches.js");
-
-const debug = debugUtil("Eleventy:Image");
-const debugAssets = debugUtil("Eleventy:Assets");
-
-const MIME_TYPES = {
- "jpeg": "image/jpeg",
- "webp": "image/webp",
- "png": "image/png",
- "svg": "image/svg+xml",
- "avif": "image/avif",
- "gif": "image/gif",
-};
-
-const FORMAT_ALIASES = {
- "jpg": "jpeg",
- // if you’re working from a mime type input, let’s alias it back to svg
- "svg+xml": "svg",
-};
-
-const ANIMATED_TYPES = [
- "webp",
- "gif",
-];
-
-const TRANSPARENCY_TYPES = [
- "avif",
- "png",
- "webp",
- "gif",
- "svg",
-];
-
-const MINIMUM_TRANSPARENCY_TYPES = [
- "png",
- "gif",
- "svg",
-];
-
-class Image {
- #input;
- #contents = {};
- #queue;
- #queuePromise;
- #buildLogger;
- #computedHash;
- #directoryManager;
-
- constructor(src, options = {}) {
- if(!src) {
- throw new Error("`src` is a required argument to the eleventy-img utility (can be a String file path, String URL, or Buffer).");
- }
-
- this.src = src;
- this.isRemoteUrl = typeof src === "string" && Util.isRemoteUrl(src);
-
- this.rawOptions = options;
- this.options = Object.assign({}, GLOBAL_OPTIONS, options);
-
- // Compatible with eleventy-dev-server and Eleventy 3.0.0-alpha.7+ in serve mode.
- if(this.options.transformOnRequest && !this.options.urlFormat) {
- this.options.urlFormat = function({ src, width, format }/*, imageOptions*/, options) {
- return `/.11ty/image/?src=${encodeURIComponent(src)}&width=${width}&format=${format}${options.generatedVia ? `&via=${options.generatedVia}` : ""}`;
- };
-
- this.options.statsOnly = true;
- }
-
- if(this.isRemoteUrl) {
- this.cacheOptions = Object.assign({
- type: "buffer",
- // deprecated in Eleventy Image, but we already prefer this.cacheOptions.duration automatically
- duration: this.options.cacheDuration,
- // Issue #117: re-use eleventy-img dryRun option value for eleventy-fetch dryRun
- dryRun: this.options.dryRun,
- }, this.options.cacheOptions);
-
- // v6.0.0 this now inherits eleventy-fetch option defaults
- this.assetCache = Fetch(src, this.cacheOptions);
- }
- }
-
- setQueue(queue) {
- this.#queue = queue;
- }
-
- setBuildLogger(buildLogger) {
- this.#buildLogger = buildLogger;
- }
-
- setDirectoryManager(manager) {
- this.#directoryManager = manager;
- }
-
- get directoryManager() {
- if(!this.#directoryManager) {
- throw new Error("Missing #directoryManager");
- }
-
- return this.#directoryManager;
- }
-
- get buildLogger() {
- if(!this.#buildLogger) {
- throw new Error("Missing #buildLogger. Call `setBuildLogger`");
- }
- return this.#buildLogger;
- }
-
- // In memory cache is up front, handles promise de-duping from input (this does not use getHash)
- // Note: output cache is also in play below (uses getHash)
- getInMemoryCacheKey() {
- let opts = Util.getSortedObject(this.options);
-
- opts.__originalSrc = this.src;
-
- if(this.isRemoteUrl) {
- opts.sourceUrl = this.src; // the source url
- } else if(Buffer.isBuffer(this.src)) {
- opts.sourceUrl = this.src.toString();
- opts.__originalSize = this.src.length;
- } else {
- // Important: do not cache this
- opts.__originalSize = fs.statSync(this.src).size;
- }
-
- return JSON.stringify(opts, function(key, value) {
- // allows `transform` functions to be truthy for in-memory key
- if (typeof value === "function") {
- return "" + (value.name || "");
- }
- return value;
- });
- }
-
- getFileContents(overrideLocalFilePath) {
- if(!overrideLocalFilePath && this.isRemoteUrl) {
- return false;
- }
-
- let src = overrideLocalFilePath || this.src;
-
- if(!this.#contents[src]) {
- // perf: check to make sure it’s not a string first
- if(typeof src !== "string" && Buffer.isBuffer(src)) {
- this.#contents[src] = src;
- } else {
- debugAssets("[11ty/eleventy-img] Reading %o", src);
- this.#contents[src] = fs.readFileSync(src);
- }
- }
-
- // Always
- return this.#contents[src];
- }
-
- static getValidWidths(originalWidth, widths = [], allowUpscale = false, minimumThreshold = 1) {
- // replace any falsy values with the original width
- let valid = widths.map(width => !width || width === 'auto' ? originalWidth : width);
-
- // Convert strings to numbers, "400" (floats are not allowed in sharp)
- valid = valid.map(width => parseInt(width, 10));
-
- // Replace any larger-than-original widths with the original width if upscaling is not allowed.
- // This ensures that if a larger width has been requested, we're at least providing the closest
- // non-upscaled image that we can.
- if (!allowUpscale) {
- let lastWidthWasBigEnough = true; // first one is always valid
- valid = valid.sort((a, b) => a - b).map(width => {
- if(width > originalWidth) {
- if(lastWidthWasBigEnough) {
- return originalWidth;
- }
- return -1;
- }
-
- lastWidthWasBigEnough = originalWidth > Math.floor(width * minimumThreshold);
-
- return width;
- }).filter(width => width > 0);
- }
-
- // Remove duplicates (e.g., if null happens to coincide with an explicit width
- // or a user passes in multiple duplicate values, or multiple larger-than-original
- // widths have resulted in the original width being included multiple times)
- valid = [...new Set(valid)];
-
- // sort ascending
- return valid.sort((a, b) => a - b);
- }
-
- static getFormatsArray(formats, autoFormat, svgShortCircuit, isAnimated, hasTransparency) {
- if(formats && formats.length) {
- if(typeof formats === "string") {
- formats = formats.split(",");
- }
-
- formats = formats.map(format => {
- if(autoFormat) {
- if((!format || format === "auto")) {
- format = autoFormat;
- }
- }
-
- if(FORMAT_ALIASES[format]) {
- return FORMAT_ALIASES[format];
- }
- return format;
- });
-
- if(svgShortCircuit !== "size") {
- // svg must come first for possible short circuiting
- formats.sort((a, b) => {
- if(a === "svg") {
- return -1;
- } else if(b === "svg") {
- return 1;
- }
- return 0;
- });
- }
-
- if(isAnimated) {
- let validAnimatedFormats = formats.filter(f => ANIMATED_TYPES.includes(f));
- // override formats if a valid animated format is found, otherwise leave as-is
- if(validAnimatedFormats.length > 0) {
- debug("Filtering non-animated formats from output: from %o to %o", formats, validAnimatedFormats);
- formats = validAnimatedFormats;
- } else {
- debug("No animated output formats found for animated image, using original formats (may be a static image): %o", formats);
- }
- }
-
- if(hasTransparency) {
- let minimumValidTransparencyFormats = formats.filter(f => MINIMUM_TRANSPARENCY_TYPES.includes(f));
- // override formats if a valid animated format is found, otherwise leave as-is
- if(minimumValidTransparencyFormats.length > 0) {
- let validTransparencyFormats = formats.filter(f => TRANSPARENCY_TYPES.includes(f));
- debug("Filtering non-transparency-friendly formats from output: from %o to %o", formats, validTransparencyFormats);
- formats = validTransparencyFormats;
- } else {
- debug("At least one transparency-friendly output format of %o must be included if the source image has an alpha channel, skipping formatFiltering and using original formats: %o", MINIMUM_TRANSPARENCY_TYPES, formats);
- }
- }
-
- // Remove duplicates (e.g., if null happens to coincide with an explicit format
- // or a user passes in multiple duplicate values)
- formats = [...new Set(formats)];
-
- return formats;
- }
-
- return [];
- }
-
- #transformRawFiles(files = []) {
- let byType = {};
- for(let file of files) {
- if(!byType[file.format]) {
- byType[file.format] = [];
- }
- byType[file.format].push(file);
- }
- for(let type in byType) {
- // sort by width, ascending (for `srcset`)
- byType[type].sort((a, b) => {
- return a.width - b.width;
- });
- }
-
- let filterLargeRasterImages = this.options.svgShortCircuit === "size";
- let svgEntry = byType.svg;
- let svgSize = svgEntry && svgEntry.length && svgEntry[0].size;
-
- if(filterLargeRasterImages && svgSize) {
- for(let type of Object.keys(byType)) {
- if(type === "svg") {
- continue;
- }
-
- let svgAdded = false;
- let originalFormatKept = false;
- byType[type] = byType[type].map(entry => {
- if(entry.size > svgSize) {
- if(!svgAdded) {
- svgAdded = true;
- // need at least one raster smaller than SVG to do this trick
- if(originalFormatKept) {
- return svgEntry[0];
- }
- // all rasters are bigger
- return false;
- }
-
- return false;
- }
-
- originalFormatKept = true;
- return entry;
- }).filter(entry => entry);
- }
- }
-
- return byType;
- }
-
- #finalizeResults(results = {}) {
- // used when results are passed to generate HTML, we maintain some internal metadata about the options used.
- let imgAttributes = this.options.htmlOptions?.imgAttributes || {};
- imgAttributes.src = this.src;
-
- Object.defineProperty(results, "eleventyImage", {
- enumerable: false,
- writable: false,
- value: {
- htmlOptions: {
- whitespaceMode: this.options.htmlOptions?.whitespaceMode,
- imgAttributes,
- pictureAttributes: this.options.htmlOptions?.pictureAttributes,
- fallback: this.options.htmlOptions?.fallback,
- },
- }
- });
-
- // renamed `return` to `returnType` to match Fetch API in v6.0.0-beta.3
- if(this.options.returnType === "html" || this.options.return === "html") {
- return generateHTML(results);
- }
-
- return results;
- }
-
- getSharpOptionsForFormat(format) {
- if(format === "webp") {
- return this.options.sharpWebpOptions;
- } else if(format === "jpeg") {
- return this.options.sharpJpegOptions;
- } else if(format === "png") {
- return this.options.sharpPngOptions;
- } else if(format === "avif") {
- return this.options.sharpAvifOptions;
- }
- return {};
- }
-
- async getInput() {
- // internal cache
- if(!this.#input) {
- if(this.isRemoteUrl) {
- // fetch remote image Buffer
- this.#input = this.assetCache.queue();
- } else {
- // not actually a promise, this is sync
- this.#input = this.getFileContents();
- }
- }
-
- return this.#input;
- }
-
- getHash() {
- if (this.#computedHash) {
- return this.#computedHash;
- }
-
- // debug("Creating hash for %o", this.src);
- let hashContents = [];
-
- if(existsCache.exists(this.src)) {
- let fileContents = this.getFileContents();
-
- // If the file starts with whitespace or the '<' character, it might be SVG.
- // Otherwise, skip the expensive buffer.toString() call
- // (no point in unicode encoding a binary file)
- let fileContentsPrefix = fileContents?.slice(0, 1)?.toString()?.trim();
- if (!fileContentsPrefix || fileContentsPrefix[0] == "<") {
- // remove all newlines for hashing for better cross-OS hash compatibility (Issue #122)
- let fileContentsStr = fileContents.toString();
- let firstFour = fileContentsStr.trim().slice(0, 5);
- if(firstFour === "