From 843dbbe243f54dc50fab2cd4ccb2f1f4c21ef3b0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 17:12:33 +0000 Subject: [PATCH 01/50] Bump import-module-string from 2.0.1 to 2.0.3 Bumps [import-module-string](https://github.com/zachleat/import-module-string) from 2.0.1 to 2.0.3. - [Release notes](https://github.com/zachleat/import-module-string/releases) - [Commits](https://github.com/zachleat/import-module-string/compare/v2.0.1...v2.0.3) --- updated-dependencies: - dependency-name: import-module-string dependency-version: 2.0.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 18 +++++++++--------- package.json | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2d8aa8362..1fa81a94a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,7 +28,7 @@ "debug": "^4.4.1", "dependency-graph": "^1.0.0", "entities": "^6.0.1", - "import-module-string": "^2.0.1", + "import-module-string": "^2.0.3", "iso-639-1": "^3.1.5", "kleur": "^4.1.5", "liquidjs": "^10.21.1", @@ -4932,12 +4932,12 @@ } }, "node_modules/esm-import-transformer": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/esm-import-transformer/-/esm-import-transformer-3.0.3.tgz", - "integrity": "sha512-Wj9kBIA9vKZRYAQzhe229M7wmWb2f3vTu86CkszZUy2/iiVCYljXm/EkwJtWKc0vup30WHhxbm3rpkysBKczxQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/esm-import-transformer/-/esm-import-transformer-3.0.5.tgz", + "integrity": "sha512-1GKLvfuMnnpI75l8c6sHoz0L3Z872xL5akGuBudgqTDPv4Vy6f2Ec7jEMKTxlqWl/3kSvNbHELeimJtnqgYniw==", "license": "MIT", "dependencies": { - "acorn": "^8.11.2" + "acorn": "^8.15.0" } }, "node_modules/espree": { @@ -5969,14 +5969,14 @@ } }, "node_modules/import-module-string": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/import-module-string/-/import-module-string-2.0.1.tgz", - "integrity": "sha512-rEgKrsMwWbn48b0tf/BEUs/KDAsx99G4KZgrdQIAOgNjiMz4136gfVvM/ypJYCJWRnFWgrFAZPLWLVCGx2BZcA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/import-module-string/-/import-module-string-2.0.3.tgz", + "integrity": "sha512-r4YU95vbJbQ6ZI/8faM4EKJr8mw03nVJInEozgPIYFFDrYNtNgYu+WDBrWnIQnQUhP4/H9Ce91sgwsA4yEu25A==", "license": "MIT", "dependencies": { "acorn": "^8.15.0", "acorn-walk": "^8.3.4", - "esm-import-transformer": "^3.0.3" + "esm-import-transformer": "^3.0.5" } }, "node_modules/imurmurhash": { diff --git a/package.json b/package.json index e27698d90..2c04370e9 100644 --- a/package.json +++ b/package.json @@ -148,7 +148,7 @@ "debug": "^4.4.1", "dependency-graph": "^1.0.0", "entities": "^6.0.1", - "import-module-string": "^2.0.1", + "import-module-string": "^2.0.3", "iso-639-1": "^3.1.5", "kleur": "^4.1.5", "liquidjs": "^10.21.1", From 13280f5140cde2adf47fd2f4908000bbba1097dd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Aug 2025 22:09:37 +0000 Subject: [PATCH 02/50] Bump @11ty/eleventy-plugin-bundle from 3.0.6 to 3.0.7 Bumps [@11ty/eleventy-plugin-bundle](https://github.com/11ty/eleventy-plugin-bundle) from 3.0.6 to 3.0.7. - [Release notes](https://github.com/11ty/eleventy-plugin-bundle/releases) - [Commits](https://github.com/11ty/eleventy-plugin-bundle/compare/v3.0.6...v3.0.7) --- updated-dependencies: - dependency-name: "@11ty/eleventy-plugin-bundle" dependency-version: 3.0.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1fa81a94a..184f063a5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "@11ty/dependency-tree": "^4.0.0", "@11ty/dependency-tree-esm": "^2.0.0", "@11ty/eleventy-dev-server": "3.0.0-alpha.3", - "@11ty/eleventy-plugin-bundle": "^3.0.6", + "@11ty/eleventy-plugin-bundle": "^3.0.7", "@11ty/eleventy-utils": "^2.0.7", "@11ty/gray-matter": "^2.0.0", "@11ty/lodash-custom": "^4.17.21", @@ -193,9 +193,9 @@ } }, "node_modules/@11ty/eleventy-plugin-bundle": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-bundle/-/eleventy-plugin-bundle-3.0.6.tgz", - "integrity": "sha512-wlEIMa1SEe6HE6ZyREEnPQiTw72337a2MPkyn0D1IzrqHrKU9euB17mv27LnnnyKvMJamCCqtU0985F5yyDL8g==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-bundle/-/eleventy-plugin-bundle-3.0.7.tgz", + "integrity": "sha512-QK1tRFBhQdZASnYU8GMzpTdsMMFLVAkuU0gVVILqNyp09xJJZb81kAS3AFrNrwBCsgLxTdWHJ8N64+OTTsoKkA==", "license": "MIT", "dependencies": { "@11ty/eleventy-utils": "^2.0.2", diff --git a/package.json b/package.json index 2c04370e9..bd30b72ff 100644 --- a/package.json +++ b/package.json @@ -135,7 +135,7 @@ "@11ty/dependency-tree": "^4.0.0", "@11ty/dependency-tree-esm": "^2.0.0", "@11ty/eleventy-dev-server": "3.0.0-alpha.3", - "@11ty/eleventy-plugin-bundle": "^3.0.6", + "@11ty/eleventy-plugin-bundle": "^3.0.7", "@11ty/eleventy-utils": "^2.0.7", "@11ty/gray-matter": "^2.0.0", "@11ty/lodash-custom": "^4.17.21", From 5d117f749a93db6d35e80f7ffc2f13e165729414 Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Thu, 28 Aug 2025 16:40:55 -0500 Subject: [PATCH 03/50] Upgrade dev deps --- package-lock.json | 1096 ++++++++++++++++++++++----------------------- package.json | 25 +- 2 files changed, 557 insertions(+), 564 deletions(-) diff --git a/package-lock.json b/package-lock.json index 184f063a5..dfc412252 100644 --- a/package-lock.json +++ b/package-lock.json @@ -50,22 +50,22 @@ "devDependencies": { "@11ty/eleventy-img": "^6.0.4", "@11ty/eleventy-plugin-rss": "^2.0.4", - "@11ty/eleventy-plugin-syntaxhighlight": "^5.0.1", - "@11ty/eleventy-plugin-webc": "^0.12.0-beta.3", - "@eslint/js": "^9.32.0", + "@11ty/eleventy-plugin-syntaxhighlight": "^5.0.2", + "@11ty/eleventy-plugin-webc": "^0.12.0-beta.7", + "@eslint/js": "^9.34.0", "@iarna/toml": "^2.2.5", "@mdx-js/node-loader": "^3.1.0", "@stylistic/eslint-plugin-js": "^4.4.1", - "@types/node": "^22.17.0", - "@vue/server-renderer": "^3.5.18", + "@types/node": "^22.18.0", + "@vue/server-renderer": "^3.5.20", "@zachleat/noop": "^1.0.6", "ava": "^6.4.1", "c8": "^10.1.3", - "cross-env": "^7.0.3", - "eslint": "^9.32.0", + "cross-env": "^10.0.0", + "eslint": "^9.34.0", "eslint-config-prettier": "^10.1.8", "globals": "^16.3.0", - "jsx-async-runtime": "^1.0.3", + "jsx-async-runtime": "^1.0.4", "luxon": "^3.7.1", "markdown-it-abbr": "^2.0.0", "markdown-it-emoji": "^3.0.0", @@ -76,11 +76,11 @@ "react": "^19.1.1", "react-dom": "^19.1.1", "rimraf": "^6.0.1", - "sass": "^1.89.2", + "sass": "^1.91.0", "simple-git-hooks": "^2.13.1", - "tsx": "^4.20.3", + "tsx": "^4.20.5", "typescript": "^5.9.2", - "vue": "^3.5.18", + "vue": "^3.5.20", "zod": "^3.25.76", "zod-validation-error": "^3.5.3" }, @@ -228,9 +228,9 @@ } }, "node_modules/@11ty/eleventy-plugin-syntaxhighlight": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-syntaxhighlight/-/eleventy-plugin-syntaxhighlight-5.0.1.tgz", - "integrity": "sha512-xDPF3Ay38XlmWZe9ER0SLtMmNah7olUBlGORhUiCUkPh3jYGVCDTDayi4tbFI9Dxha8NwKlfBZ2FXM/s3aZzAg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-syntaxhighlight/-/eleventy-plugin-syntaxhighlight-5.0.2.tgz", + "integrity": "sha512-T6xVVRDJuHlrFMHbUiZkHjj5o1IlLzZW+1IL9eUsyXFU7rY2ztcYhZew/64vmceFFpQwzuSfxQOXxTJYmKkQ+A==", "dev": true, "license": "MIT", "dependencies": { @@ -242,13 +242,15 @@ } }, "node_modules/@11ty/eleventy-plugin-webc": { - "version": "0.12.0-beta.3", - "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-webc/-/eleventy-plugin-webc-0.12.0-beta.3.tgz", - "integrity": "sha512-gI6x1/0w5uTI1pl4TNVDhEZPHbhyZWRzvAqcLvaV1USJ89yxwL5aWCPfMK009WuFZ7EwsiC9ANBGm/3+x4OPEw==", + "version": "0.12.0-beta.7", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-webc/-/eleventy-plugin-webc-0.12.0-beta.7.tgz", + "integrity": "sha512-8XSUZHU4XPjJo/L3xIYyi+Mqg1VQM+cGW45VqsUBin2x4QUITXtY/a1PUIK86R2bSPc9+1GJI+V37InzmR4GIg==", "dev": true, "license": "MIT", "dependencies": { - "@11ty/webc": "^0.11" + "@11ty/eleventy-plugin-bundle": "^3.0.7", + "@11ty/webc": "^0.12.0-beta.2", + "import-module-string": "^2.0.3" }, "engines": { "node": ">= 18" @@ -366,81 +368,30 @@ } }, "node_modules/@11ty/webc": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/@11ty/webc/-/webc-0.11.4.tgz", - "integrity": "sha512-q1GMcjNnx9PxUr6jyTT5CdDFma3JWkT5D45wRNYUQ/B4cxTTxpC15b2rYdzNaGuSqB6tsArQ9Qh4BPqg6Xo9cA==", + "version": "0.12.0-beta.2", + "resolved": "https://registry.npmjs.org/@11ty/webc/-/webc-0.12.0-beta.2.tgz", + "integrity": "sha512-qkvMBPrICRQY4FK5xTzo7gFeqIgEoBFDEEhxiPGIGiufna0f5diRUJ23Njj5XYXBjaVCKsgFAhDEMIEZ8mrExg==", "dev": true, "license": "MIT", "dependencies": { - "@11ty/eleventy-utils": "^1.0.1", - "css-tree": "^2.3.1", - "dependency-graph": "^0.11.0", - "entities": "^4.4.0", - "fast-glob": "^3.2.12", + "@11ty/eleventy-utils": "^2.0.7", + "css-tree": "^3.1.0", + "dependency-graph": "^1.0.0", + "entities": "^6.0.1", + "fast-glob": "^3.3.3", + "import-module-string": "^2.0.3", "is-glob": "^4.0.3", - "nanoid": "^4.0.1", - "node-retrieve-globals": "^2.0.7", - "parse5": "^7.1.2" + "nanoid": "^5.1.5", + "parse5": "^8.0.0" }, "engines": { - "node": ">=14.18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/11ty" - } - }, - "node_modules/@11ty/webc/node_modules/@11ty/eleventy-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@11ty/eleventy-utils/-/eleventy-utils-1.0.3.tgz", - "integrity": "sha512-nULO91om7vQw4Y/UBjM8i7nJ1xl+/nyK4rImZ41lFxiY2d+XUz7ChAj1CDYFjrLZeu0utAYJTZ45LlcHTkUG4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "normalize-path": "^3.0.0" - }, - "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/11ty" } }, - "node_modules/@11ty/webc/node_modules/dependency-graph": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/@11ty/webc/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/@11ty/webc/node_modules/node-retrieve-globals": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/node-retrieve-globals/-/node-retrieve-globals-2.0.8.tgz", - "integrity": "sha512-mVimS/m8H28kyMdvOIfyMCM8wFNiKXM83ag1yHYP297iVmlCSmCh7Ih4b+ig9/DZ2+LbXZCPLDSZO4yRa5ttyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.8.2", - "acorn-walk": "^8.2.0" - } - }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -477,13 +428,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", - "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", + "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.0" + "@babel/types": "^7.28.2" }, "bin": { "parser": "bin/babel-parser.js" @@ -493,9 +444,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.2.tgz", - "integrity": "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", + "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==", "dev": true, "license": "MIT", "engines": { @@ -537,10 +488,17 @@ "tslib": "^2.4.0" } }, + "node_modules/@epic-web/invariant": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", + "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==", + "dev": true, + "license": "MIT" + }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz", - "integrity": "sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", + "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", "cpu": [ "ppc64" ], @@ -555,9 +513,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.8.tgz", - "integrity": "sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", + "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", "cpu": [ "arm" ], @@ -572,9 +530,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz", - "integrity": "sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", + "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", "cpu": [ "arm64" ], @@ -589,9 +547,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.8.tgz", - "integrity": "sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", + "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", "cpu": [ "x64" ], @@ -606,9 +564,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz", - "integrity": "sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", + "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", "cpu": [ "arm64" ], @@ -623,9 +581,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz", - "integrity": "sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", + "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", "cpu": [ "x64" ], @@ -640,9 +598,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz", - "integrity": "sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", + "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", "cpu": [ "arm64" ], @@ -657,9 +615,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz", - "integrity": "sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", + "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", "cpu": [ "x64" ], @@ -674,9 +632,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz", - "integrity": "sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", + "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", "cpu": [ "arm" ], @@ -691,9 +649,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz", - "integrity": "sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", + "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", "cpu": [ "arm64" ], @@ -708,9 +666,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz", - "integrity": "sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", + "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", "cpu": [ "ia32" ], @@ -725,9 +683,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz", - "integrity": "sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", + "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", "cpu": [ "loong64" ], @@ -742,9 +700,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz", - "integrity": "sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", + "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", "cpu": [ "mips64el" ], @@ -759,9 +717,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz", - "integrity": "sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", + "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", "cpu": [ "ppc64" ], @@ -776,9 +734,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz", - "integrity": "sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", + "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", "cpu": [ "riscv64" ], @@ -793,9 +751,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz", - "integrity": "sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", + "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", "cpu": [ "s390x" ], @@ -810,9 +768,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz", - "integrity": "sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", + "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", "cpu": [ "x64" ], @@ -827,9 +785,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz", - "integrity": "sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", + "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", "cpu": [ "arm64" ], @@ -844,9 +802,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz", - "integrity": "sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", + "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", "cpu": [ "x64" ], @@ -861,9 +819,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz", - "integrity": "sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", + "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", "cpu": [ "arm64" ], @@ -878,9 +836,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz", - "integrity": "sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", + "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", "cpu": [ "x64" ], @@ -895,9 +853,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz", - "integrity": "sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", + "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", "cpu": [ "arm64" ], @@ -912,9 +870,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz", - "integrity": "sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", + "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", "cpu": [ "x64" ], @@ -929,9 +887,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz", - "integrity": "sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", + "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", "cpu": [ "arm64" ], @@ -946,9 +904,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz", - "integrity": "sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", + "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", "cpu": [ "ia32" ], @@ -963,9 +921,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz", - "integrity": "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", + "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", "cpu": [ "x64" ], @@ -1037,9 +995,9 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", - "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1047,9 +1005,9 @@ } }, "node_modules/@eslint/core": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", - "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1097,9 +1055,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.32.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.32.0.tgz", - "integrity": "sha512-BBpRFZK3eX6uMLKz8WxFOBIFFcGFJ/g8XuwjTHCqHROSIsopI+ddn/d5Cfh36+7+e5edVS8dbSHnBNhrLEX0zg==", + "version": "9.34.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz", + "integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==", "dev": true, "license": "MIT", "engines": { @@ -1120,13 +1078,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz", - "integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.15.1", + "@eslint/core": "^0.15.2", "levn": "^0.4.1" }, "engines": { @@ -1686,16 +1644,16 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", - "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.29", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", - "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "version": "0.3.30", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", + "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1720,17 +1678,75 @@ "tslib": "2" } }, + "node_modules/@jsonjoy.com/buffers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.0.0.tgz", + "integrity": "sha512-NDigYR3PHqCnQLXYyoLbnEdzMMvzeiCWo1KOut7Q0CoIqg9tUAPKJ1iq/2nFhc5kZtexzutNY0LFjdwWL3Dw3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/codegen": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", + "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, "node_modules/@jsonjoy.com/json-pack": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.2.0.tgz", - "integrity": "sha512-io1zEbbYcElht3tdlqEOFxZ0dMTYrHz9iMf0gqn1pPjZFTCgM5R4R5IMA20Chb2UPYYsxjzs8CgZ7Nb5n2K2rA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.11.0.tgz", + "integrity": "sha512-nLqSTAYwpk+5ZQIoVp7pfd/oSKNWlEdvTq2LzVA4r2wtWZg6v+5u0VgBOaDJuUfNOuw/4Ysq6glN5QKSrOCgrA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/base64": "^1.1.1", - "@jsonjoy.com/util": "^1.1.2", + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.1", + "@jsonjoy.com/util": "^1.9.0", "hyperdyperid": "^1.2.0", - "thingies": "^1.20.0" + "thingies": "^2.5.0" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" + } + }, + "node_modules/@jsonjoy.com/json-pointer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", + "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/util": "^1.9.0" }, "engines": { "node": ">=10.0" @@ -1744,11 +1760,15 @@ } }, "node_modules/@jsonjoy.com/util": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.7.0.tgz", - "integrity": "sha512-breG4JCjVWedznFKdFrg62+WcS7WbbzhS6OerKB5qeNQEoqVbTXYyM3rQs+e8Il1DK4exAhsN86L9mmwj/X5kg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", + "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0" + }, "engines": { "node": ">=10.0" }, @@ -2264,9 +2284,9 @@ "license": "MIT" }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.1.tgz", - "integrity": "sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.49.0.tgz", + "integrity": "sha512-rlKIeL854Ed0e09QGYFlmDNbka6I3EQFw7iZuugQjMb11KMpJCLPFL4ZPbMfaEhLADEL1yx0oujGkBQ7+qW3eA==", "cpu": [ "arm" ], @@ -2275,13 +2295,12 @@ "optional": true, "os": [ "android" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.1.tgz", - "integrity": "sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.49.0.tgz", + "integrity": "sha512-cqPpZdKUSQYRtLLr6R4X3sD4jCBO1zUmeo3qrWBCqYIeH8Q3KRL4F3V7XJ2Rm8/RJOQBZuqzQGWPjjvFUcYa/w==", "cpu": [ "arm64" ], @@ -2290,13 +2309,12 @@ "optional": true, "os": [ "android" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.1.tgz", - "integrity": "sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.49.0.tgz", + "integrity": "sha512-99kMMSMQT7got6iYX3yyIiJfFndpojBmkHfTc1rIje8VbjhmqBXE+nb7ZZP3A5skLyujvT0eIUCUsxAe6NjWbw==", "cpu": [ "arm64" ], @@ -2305,13 +2323,12 @@ "optional": true, "os": [ "darwin" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.1.tgz", - "integrity": "sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.49.0.tgz", + "integrity": "sha512-y8cXoD3wdWUDpjOLMKLx6l+NFz3NlkWKcBCBfttUn+VGSfgsQ5o/yDUGtzE9HvsodkP0+16N0P4Ty1VuhtRUGg==", "cpu": [ "x64" ], @@ -2320,13 +2337,12 @@ "optional": true, "os": [ "darwin" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.1.tgz", - "integrity": "sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.49.0.tgz", + "integrity": "sha512-3mY5Pr7qv4GS4ZvWoSP8zha8YoiqrU+e0ViPvB549jvliBbdNLrg2ywPGkgLC3cmvN8ya3za+Q2xVyT6z+vZqA==", "cpu": [ "arm64" ], @@ -2335,13 +2351,12 @@ "optional": true, "os": [ "freebsd" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.1.tgz", - "integrity": "sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.49.0.tgz", + "integrity": "sha512-C9KzzOAQU5gU4kG8DTk+tjdKjpWhVWd5uVkinCwwFub2m7cDYLOdtXoMrExfeBmeRy9kBQMkiyJ+HULyF1yj9w==", "cpu": [ "x64" ], @@ -2350,13 +2365,12 @@ "optional": true, "os": [ "freebsd" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.1.tgz", - "integrity": "sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.49.0.tgz", + "integrity": "sha512-OVSQgEZDVLnTbMq5NBs6xkmz3AADByCWI4RdKSFNlDsYXdFtlxS59J+w+LippJe8KcmeSSM3ba+GlsM9+WwC1w==", "cpu": [ "arm" ], @@ -2365,13 +2379,12 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.1.tgz", - "integrity": "sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.49.0.tgz", + "integrity": "sha512-ZnfSFA7fDUHNa4P3VwAcfaBLakCbYaxCk0jUnS3dTou9P95kwoOLAMlT3WmEJDBCSrOEFFV0Y1HXiwfLYJuLlA==", "cpu": [ "arm" ], @@ -2380,13 +2393,12 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.1.tgz", - "integrity": "sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.49.0.tgz", + "integrity": "sha512-Z81u+gfrobVK2iV7GqZCBfEB1y6+I61AH466lNK+xy1jfqFLiQ9Qv716WUM5fxFrYxwC7ziVdZRU9qvGHkYIJg==", "cpu": [ "arm64" ], @@ -2395,13 +2407,12 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.1.tgz", - "integrity": "sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.49.0.tgz", + "integrity": "sha512-zoAwS0KCXSnTp9NH/h9aamBAIve0DXeYpll85shf9NJ0URjSTzzS+Z9evmolN+ICfD3v8skKUPyk2PO0uGdFqg==", "cpu": [ "arm64" ], @@ -2410,13 +2421,12 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.1.tgz", - "integrity": "sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.49.0.tgz", + "integrity": "sha512-2QyUyQQ1ZtwZGiq0nvODL+vLJBtciItC3/5cYN8ncDQcv5avrt2MbKt1XU/vFAJlLta5KujqyHdYtdag4YEjYQ==", "cpu": [ "loong64" ], @@ -2425,13 +2435,12 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.1.tgz", - "integrity": "sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==", + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.49.0.tgz", + "integrity": "sha512-k9aEmOWt+mrMuD3skjVJSSxHckJp+SiFzFG+v8JLXbc/xi9hv2icSkR3U7uQzqy+/QbbYY7iNB9eDTwrELo14g==", "cpu": [ "ppc64" ], @@ -2440,13 +2449,12 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.1.tgz", - "integrity": "sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.49.0.tgz", + "integrity": "sha512-rDKRFFIWJ/zJn6uk2IdYLc09Z7zkE5IFIOWqpuU0o6ZpHcdniAyWkwSUWE/Z25N/wNDmFHHMzin84qW7Wzkjsw==", "cpu": [ "riscv64" ], @@ -2455,13 +2463,12 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.1.tgz", - "integrity": "sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.49.0.tgz", + "integrity": "sha512-FkkhIY/hYFVnOzz1WeV3S9Bd1h0hda/gRqvZCMpHWDHdiIHn6pqsY3b5eSbvGccWHMQ1uUzgZTKS4oGpykf8Tw==", "cpu": [ "riscv64" ], @@ -2470,13 +2477,12 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.1.tgz", - "integrity": "sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.49.0.tgz", + "integrity": "sha512-gRf5c+A7QiOG3UwLyOOtyJMD31JJhMjBvpfhAitPAoqZFcOeK3Kc1Veg1z/trmt+2P6F/biT02fU19GGTS529A==", "cpu": [ "s390x" ], @@ -2485,13 +2491,12 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.1.tgz", - "integrity": "sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.49.0.tgz", + "integrity": "sha512-BR7+blScdLW1h/2hB/2oXM+dhTmpW3rQt1DeSiCP9mc2NMMkqVgjIN3DDsNpKmezffGC9R8XKVOLmBkRUcK/sA==", "cpu": [ "x64" ], @@ -2500,13 +2505,12 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.1.tgz", - "integrity": "sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.49.0.tgz", + "integrity": "sha512-hDMOAe+6nX3V5ei1I7Au3wcr9h3ktKzDvF2ne5ovX8RZiAHEtX1A5SNNk4zt1Qt77CmnbqT+upb/umzoPMWiPg==", "cpu": [ "x64" ], @@ -2515,13 +2519,12 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.1.tgz", - "integrity": "sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.49.0.tgz", + "integrity": "sha512-wkNRzfiIGaElC9kXUT+HLx17z7D0jl+9tGYRKwd8r7cUqTL7GYAvgUY++U2hK6Ar7z5Z6IRRoWC8kQxpmM7TDA==", "cpu": [ "arm64" ], @@ -2530,13 +2533,12 @@ "optional": true, "os": [ "win32" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.1.tgz", - "integrity": "sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.49.0.tgz", + "integrity": "sha512-gq5aW/SyNpjp71AAzroH37DtINDcX1Qw2iv9Chyz49ZgdOP3NV8QCyKZUrGsYX9Yyggj5soFiRCgsL3HwD8TdA==", "cpu": [ "ia32" ], @@ -2545,13 +2547,12 @@ "optional": true, "os": [ "win32" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.1.tgz", - "integrity": "sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.49.0.tgz", + "integrity": "sha512-gEtqFbzmZLFk2xKh7g0Rlo8xzho8KrEFEkzvHbfUGkrgXOpZ4XagQ6n+wIZFNh1nTb8UD16J4nFSFKXYgnbdBg==", "cpu": [ "x64" ], @@ -2560,8 +2561,7 @@ "optional": true, "os": [ "win32" - ], - "peer": true + ] }, "node_modules/@sindresorhus/merge-streams": { "version": "2.3.0", @@ -2625,9 +2625,9 @@ } }, "node_modules/@testing-library/dom": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", - "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", "dev": true, "license": "MIT", "dependencies": { @@ -2635,48 +2635,15 @@ "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", - "chalk": "^4.1.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", + "picocolors": "1.1.1", "pretty-format": "^27.0.2" }, "engines": { "node": ">=18" } }, - "node_modules/@testing-library/dom/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@testing-library/dom/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/@testing-library/user-event": { "version": "14.6.1", "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", @@ -2791,9 +2758,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.17.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.17.0.tgz", - "integrity": "sha512-bbAKTCqX5aNVryi7qXVMi+OkB3w/OyblodicMbvE38blyAz7GxXf6XYhklokijuPwwVg9sDLKRxt0ZHXQwZVfQ==", + "version": "22.18.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.0.tgz", + "integrity": "sha512-m5ObIqwsUp6BZzyiy4RdZpzWGub9bqLJMvZDD0QMXhxjqMHMENlj+SqF5QxoUwaQNFe+8kz8XM8ZQhqkQPTgMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3007,14 +2974,14 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.18.tgz", - "integrity": "sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==", + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.20.tgz", + "integrity": "sha512-8TWXUyiqFd3GmP4JTX9hbiTFRwYHgVL/vr3cqhr4YQ258+9FADwvj7golk2sWNGHR67QgmCZ8gz80nQcMokhwg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.0", - "@vue/shared": "3.5.18", + "@babel/parser": "^7.28.3", + "@vue/shared": "3.5.20", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" @@ -3041,28 +3008,28 @@ "license": "MIT" }, "node_modules/@vue/compiler-dom": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz", - "integrity": "sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==", + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.20.tgz", + "integrity": "sha512-whB44M59XKjqUEYOMPYU0ijUV0G+4fdrHVKDe32abNdX/kJe1NUEMqsi4cwzXa9kyM9w5S8WqFsrfo1ogtBZGQ==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.18", - "@vue/shared": "3.5.18" + "@vue/compiler-core": "3.5.20", + "@vue/shared": "3.5.20" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz", - "integrity": "sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==", + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.20.tgz", + "integrity": "sha512-SFcxapQc0/feWiSBfkGsa1v4DOrnMAQSYuvDMpEaxbpH5dKbnEM5KobSNSgU+1MbHCl+9ftm7oQWxvwDB6iBfw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.0", - "@vue/compiler-core": "3.5.18", - "@vue/compiler-dom": "3.5.18", - "@vue/compiler-ssr": "3.5.18", - "@vue/shared": "3.5.18", + "@babel/parser": "^7.28.3", + "@vue/compiler-core": "3.5.20", + "@vue/compiler-dom": "3.5.20", + "@vue/compiler-ssr": "3.5.20", + "@vue/shared": "3.5.20", "estree-walker": "^2.0.2", "magic-string": "^0.30.17", "postcss": "^8.5.6", @@ -3077,68 +3044,68 @@ "license": "MIT" }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz", - "integrity": "sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==", + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.20.tgz", + "integrity": "sha512-RSl5XAMc5YFUXpDQi+UQDdVjH9FnEpLDHIALg5J0ITHxkEzJ8uQLlo7CIbjPYqmZtt6w0TsIPbo1izYXwDG7JA==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.18", - "@vue/shared": "3.5.18" + "@vue/compiler-dom": "3.5.20", + "@vue/shared": "3.5.20" } }, "node_modules/@vue/reactivity": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.18.tgz", - "integrity": "sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==", + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.20.tgz", + "integrity": "sha512-hS8l8x4cl1fmZpSQX/NXlqWKARqEsNmfkwOIYqtR2F616NGfsLUm0G6FQBK6uDKUCVyi1YOL8Xmt/RkZcd/jYQ==", "dev": true, "license": "MIT", "dependencies": { - "@vue/shared": "3.5.18" + "@vue/shared": "3.5.20" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.18.tgz", - "integrity": "sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==", + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.20.tgz", + "integrity": "sha512-vyQRiH5uSZlOa+4I/t4Qw/SsD/gbth0SW2J7oMeVlMFMAmsG1rwDD6ok0VMmjXY3eI0iHNSSOBilEDW98PLRKw==", "dev": true, "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.18", - "@vue/shared": "3.5.18" + "@vue/reactivity": "3.5.20", + "@vue/shared": "3.5.20" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.18.tgz", - "integrity": "sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==", + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.20.tgz", + "integrity": "sha512-KBHzPld/Djw3im0CQ7tGCpgRedryIn4CcAl047EhFTCCPT2xFf4e8j6WeKLgEEoqPSl9TYqShc3Q6tpWpz/Xgw==", "dev": true, "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.18", - "@vue/runtime-core": "3.5.18", - "@vue/shared": "3.5.18", + "@vue/reactivity": "3.5.20", + "@vue/runtime-core": "3.5.20", + "@vue/shared": "3.5.20", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.18.tgz", - "integrity": "sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==", + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.20.tgz", + "integrity": "sha512-HthAS0lZJDH21HFJBVNTtx+ULcIbJQRpjSVomVjfyPkFSpCwvsPTA+jIzOaUm3Hrqx36ozBHePztQFg6pj5aKg==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.18", - "@vue/shared": "3.5.18" + "@vue/compiler-ssr": "3.5.20", + "@vue/shared": "3.5.20" }, "peerDependencies": { - "vue": "3.5.18" + "vue": "3.5.20" } }, "node_modules/@vue/shared": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz", - "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==", + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.20.tgz", + "integrity": "sha512-SoRGP596KU/ig6TfgkCMbXkr4YJ91n/QSdMuqeP5r3hVIYA3CPHUBCc7Skak0EAKV+5lL4KyIh61VA/pK1CIAA==", "dev": true, "license": "MIT" }, @@ -3237,9 +3204,9 @@ } }, "node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", + "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", "dev": true, "license": "MIT", "engines": { @@ -3730,9 +3697,9 @@ } }, "node_modules/cbor": { - "version": "10.0.9", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-10.0.9.tgz", - "integrity": "sha512-KEWYehb/vJkRmigctVQLsz73Us2RNnITo/wOwQV5AtZpLGH1r2PPlsNHdsX460YuHZCyhLklbYzAOuJfOeg34Q==", + "version": "10.0.11", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-10.0.11.tgz", + "integrity": "sha512-vIwORDd/WyB8Nc23o2zNN5RrtFGlR6Fca61TtjkUXueI3Jf2DOZDl1zsshvBntZ3wZHBM9ztjnkXSmzQDaq3WA==", "dev": true, "license": "MIT", "dependencies": { @@ -3754,9 +3721,9 @@ } }, "node_modules/chai": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.1.tgz", - "integrity": "sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", "dev": true, "license": "MIT", "dependencies": { @@ -3771,9 +3738,9 @@ } }, "node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.0.tgz", + "integrity": "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==", "dev": true, "license": "MIT", "engines": { @@ -4202,22 +4169,21 @@ } }, "node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.0.0.tgz", + "integrity": "sha512-aU8qlEK/nHYtVuN4p7UQgAwVljzMg8hB4YK5ThRqD2l/ziSnryncPNn7bMLt5cFYsKVKBh8HqLqyCoTupEUu7Q==", "dev": true, "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.1" + "@epic-web/invariant": "^1.0.0", + "cross-spawn": "^7.0.6" }, "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" + "cross-env": "dist/bin/cross-env.js", + "cross-env-shell": "dist/bin/cross-env-shell.js" }, "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" + "node": ">=20" } }, "node_modules/cross-spawn": { @@ -4236,13 +4202,13 @@ } }, "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", "dev": true, "license": "MIT", "dependencies": { - "mdn-data": "2.0.30", + "mdn-data": "2.12.2", "source-map-js": "^1.0.1" }, "engines": { @@ -4582,9 +4548,9 @@ } }, "node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.5.0.tgz", + "integrity": "sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==", "dev": true, "license": "MIT" }, @@ -4696,9 +4662,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.8", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.8.tgz", - "integrity": "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==", + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", + "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4709,32 +4675,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.8", - "@esbuild/android-arm": "0.25.8", - "@esbuild/android-arm64": "0.25.8", - "@esbuild/android-x64": "0.25.8", - "@esbuild/darwin-arm64": "0.25.8", - "@esbuild/darwin-x64": "0.25.8", - "@esbuild/freebsd-arm64": "0.25.8", - "@esbuild/freebsd-x64": "0.25.8", - "@esbuild/linux-arm": "0.25.8", - "@esbuild/linux-arm64": "0.25.8", - "@esbuild/linux-ia32": "0.25.8", - "@esbuild/linux-loong64": "0.25.8", - "@esbuild/linux-mips64el": "0.25.8", - "@esbuild/linux-ppc64": "0.25.8", - "@esbuild/linux-riscv64": "0.25.8", - "@esbuild/linux-s390x": "0.25.8", - "@esbuild/linux-x64": "0.25.8", - "@esbuild/netbsd-arm64": "0.25.8", - "@esbuild/netbsd-x64": "0.25.8", - "@esbuild/openbsd-arm64": "0.25.8", - "@esbuild/openbsd-x64": "0.25.8", - "@esbuild/openharmony-arm64": "0.25.8", - "@esbuild/sunos-x64": "0.25.8", - "@esbuild/win32-arm64": "0.25.8", - "@esbuild/win32-ia32": "0.25.8", - "@esbuild/win32-x64": "0.25.8" + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" } }, "node_modules/escalade": { @@ -4766,20 +4732,20 @@ } }, "node_modules/eslint": { - "version": "9.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.32.0.tgz", - "integrity": "sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==", + "version": "9.34.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz", + "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.0", - "@eslint/core": "^0.15.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.32.0", - "@eslint/plugin-kit": "^0.3.4", + "@eslint/js": "9.34.0", + "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -4918,19 +4884,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/esm-import-transformer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/esm-import-transformer/-/esm-import-transformer-3.0.5.tgz", @@ -5211,6 +5164,19 @@ "node": ">=8.6.0" } }, + "node_modules/fast-glob/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/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -5530,16 +5496,33 @@ } }, "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==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", "dependencies": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regex.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.0.1.tgz", + "integrity": "sha512-CG/iEvgQqfzoVsMUbxSJcwbG2JwyZ3naEqPkeltwl0BSS8Bp83k3xlGms+0QdWFUAwV+uvo80wNswKF6FWEkKg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, "node_modules/glob/node_modules/brace-expansion": { @@ -6348,9 +6331,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -6486,9 +6469,9 @@ "license": "MIT" }, "node_modules/jsx-async-runtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/jsx-async-runtime/-/jsx-async-runtime-1.0.3.tgz", - "integrity": "sha512-VaykRhIYLWlX0Vra6gJjQCremJfjG6bjryzmQ3Az/4ERPLcmN5fUEo15R7DFPt0FJr+GFSY2+DboUaidsIwkkQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/jsx-async-runtime/-/jsx-async-runtime-1.0.4.tgz", + "integrity": "sha512-advawyL6BfDRSuyzcegdaWSLbYBbLT+WwYDBPY4/5NuMo0gHC9jJjjcj8seHFbuEf1ku+OImtDPx2hgSjtNwaA==", "dev": true, "license": "MIT" }, @@ -6633,9 +6616,9 @@ } }, "node_modules/loupe": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.0.tgz", - "integrity": "sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", "dev": true, "license": "MIT" }, @@ -6667,13 +6650,13 @@ } }, "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "version": "0.30.18", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz", + "integrity": "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/make-dir": { @@ -7004,9 +6987,9 @@ } }, "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", "dev": true, "license": "CC0-1.0" }, @@ -7017,15 +7000,17 @@ "license": "MIT" }, "node_modules/memfs": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.18.0.tgz", - "integrity": "sha512-iAapt2W+mfJWjoOgGJjgETwLjByanfdhr8b3yqfYr4ZyAXAbBv1icPoxPHksBlo/+XAclzv83dI/lyMJLiPlsA==", + "version": "4.38.2", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.38.2.tgz", + "integrity": "sha512-FpWsVHpAkoSh/LfY1BgAl72BVd374ooMRtDi2VqzBycX4XEfvC0XKACCe0C9VRZoYq5viuoyTv6lYXZ/Q7TrLQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@jsonjoy.com/json-pack": "^1.0.3", - "@jsonjoy.com/util": "^1.3.0", - "tree-dump": "^1.0.1", + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", "tslib": "^2.0.0" }, "engines": { @@ -7866,9 +7851,9 @@ } }, "node_modules/nanoid": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", - "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.5.tgz", + "integrity": "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw==", "dev": true, "funding": [ { @@ -7881,7 +7866,7 @@ "nanoid": "bin/nanoid.js" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": "^18 || >=20" } }, "node_modules/natural-compare": { @@ -8269,9 +8254,9 @@ "license": "MIT" }, "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", + "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", "dev": true, "license": "MIT", "dependencies": { @@ -8405,13 +8390,13 @@ } }, "node_modules/playwright": { - "version": "1.54.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.54.1.tgz", - "integrity": "sha512-peWpSwIBmSLi6aW2auvrUtf2DqY16YYcCMO8rTVx486jKmDTJg7UAhyrraP98GB8BoPURZP8+nxO7TSd4cPr5g==", + "version": "1.55.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.55.0.tgz", + "integrity": "sha512-sdCWStblvV1YU909Xqx0DhOjPZE4/5lJsIS84IfN9dAZfcl/CIZ5O8l3o0j7hPMjDvqoTF8ZUcc+i/GL5erstA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.54.1" + "playwright-core": "1.55.0" }, "bin": { "playwright": "cli.js" @@ -8424,9 +8409,9 @@ } }, "node_modules/playwright-core": { - "version": "1.54.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.54.1.tgz", - "integrity": "sha512-Nbjs2zjj0htNhzgiy5wu+3w09YetDx5pkrpI/kZotDlDUaYk0HVA5xrBVPdow4SAUIlhgKcJeJg4GRKW6xHusA==", + "version": "1.55.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.55.0.tgz", + "integrity": "sha512-GvZs4vU3U5ro2nZpeiwyb0zuFaqb9sUiAJuyrWpcGouD8y9/HLgGbNRjIph7zU9D3hnPaisMl9zG9CgFi/biIg==", "dev": true, "license": "Apache-2.0", "bin": { @@ -8841,9 +8826,9 @@ } }, "node_modules/recma-jsx": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.0.tgz", - "integrity": "sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", "dev": true, "license": "MIT", "dependencies": { @@ -8856,6 +8841,9 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/recma-parse": { @@ -9116,9 +9104,9 @@ } }, "node_modules/rollup": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.45.1.tgz", - "integrity": "sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==", + "version": "4.49.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.49.0.tgz", + "integrity": "sha512-3IVq0cGJ6H7fKXXEdVt+RcYvRCt8beYY9K1760wGQwSAHZcS9eot1zDG5axUbcp/kWRi5zKIIDX8MoKv/TzvZA==", "dev": true, "license": "MIT", "dependencies": { @@ -9132,26 +9120,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.45.1", - "@rollup/rollup-android-arm64": "4.45.1", - "@rollup/rollup-darwin-arm64": "4.45.1", - "@rollup/rollup-darwin-x64": "4.45.1", - "@rollup/rollup-freebsd-arm64": "4.45.1", - "@rollup/rollup-freebsd-x64": "4.45.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.45.1", - "@rollup/rollup-linux-arm-musleabihf": "4.45.1", - "@rollup/rollup-linux-arm64-gnu": "4.45.1", - "@rollup/rollup-linux-arm64-musl": "4.45.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.45.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.45.1", - "@rollup/rollup-linux-riscv64-gnu": "4.45.1", - "@rollup/rollup-linux-riscv64-musl": "4.45.1", - "@rollup/rollup-linux-s390x-gnu": "4.45.1", - "@rollup/rollup-linux-x64-gnu": "4.45.1", - "@rollup/rollup-linux-x64-musl": "4.45.1", - "@rollup/rollup-win32-arm64-msvc": "4.45.1", - "@rollup/rollup-win32-ia32-msvc": "4.45.1", - "@rollup/rollup-win32-x64-msvc": "4.45.1", + "@rollup/rollup-android-arm-eabi": "4.49.0", + "@rollup/rollup-android-arm64": "4.49.0", + "@rollup/rollup-darwin-arm64": "4.49.0", + "@rollup/rollup-darwin-x64": "4.49.0", + "@rollup/rollup-freebsd-arm64": "4.49.0", + "@rollup/rollup-freebsd-x64": "4.49.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.49.0", + "@rollup/rollup-linux-arm-musleabihf": "4.49.0", + "@rollup/rollup-linux-arm64-gnu": "4.49.0", + "@rollup/rollup-linux-arm64-musl": "4.49.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.49.0", + "@rollup/rollup-linux-ppc64-gnu": "4.49.0", + "@rollup/rollup-linux-riscv64-gnu": "4.49.0", + "@rollup/rollup-linux-riscv64-musl": "4.49.0", + "@rollup/rollup-linux-s390x-gnu": "4.49.0", + "@rollup/rollup-linux-x64-gnu": "4.49.0", + "@rollup/rollup-linux-x64-musl": "4.49.0", + "@rollup/rollup-win32-arm64-msvc": "4.49.0", + "@rollup/rollup-win32-ia32-msvc": "4.49.0", + "@rollup/rollup-win32-x64-msvc": "4.49.0", "fsevents": "~2.3.2" } }, @@ -9198,9 +9186,9 @@ } }, "node_modules/sass": { - "version": "1.89.2", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.89.2.tgz", - "integrity": "sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==", + "version": "1.91.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.91.0.tgz", + "integrity": "sha512-aFOZHGf+ur+bp1bCHZ+u8otKGh77ZtmFyXDo4tlYvT7PWql41Kwd8wdkPqhhT+h2879IVblcHFglIMofsFd1EA==", "dev": true, "license": "MIT", "dependencies": { @@ -9873,14 +9861,18 @@ } }, "node_modules/thingies": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", - "integrity": "sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz", + "integrity": "sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==", "dev": true, - "license": "Unlicense", + "license": "MIT", "engines": { "node": ">=10.18" }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, "peerDependencies": { "tslib": "^2" } @@ -10041,9 +10033,9 @@ "license": "0BSD" }, "node_modules/tsx": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.3.tgz", - "integrity": "sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==", + "version": "4.20.5", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.5.tgz", + "integrity": "sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==", "dev": true, "license": "MIT", "dependencies": { @@ -10294,9 +10286,9 @@ } }, "node_modules/vfile-message": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", "dev": true, "license": "MIT", "dependencies": { @@ -10391,17 +10383,17 @@ } }, "node_modules/vite": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.6.tgz", - "integrity": "sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.3.tgz", + "integrity": "sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.25.0", - "fdir": "^6.4.6", + "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", - "rollup": "^4.40.0", + "rollup": "^4.43.0", "tinyglobby": "^0.2.14" }, "bin": { @@ -10562,17 +10554,17 @@ } }, "node_modules/vue": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.18.tgz", - "integrity": "sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==", + "version": "3.5.20", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.20.tgz", + "integrity": "sha512-2sBz0x/wis5TkF1XZ2vH25zWq3G1bFEPOfkBcx2ikowmphoQsPH6X0V3mmPCXA2K1N/XGTnifVyDQP4GfDDeQw==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.18", - "@vue/compiler-sfc": "3.5.18", - "@vue/runtime-dom": "3.5.18", - "@vue/server-renderer": "3.5.18", - "@vue/shared": "3.5.18" + "@vue/compiler-dom": "3.5.20", + "@vue/compiler-sfc": "3.5.20", + "@vue/runtime-dom": "3.5.20", + "@vue/server-renderer": "3.5.20", + "@vue/shared": "3.5.20" }, "peerDependencies": { "typescript": "*" diff --git a/package.json b/package.json index bd30b72ff..052977ac9 100644 --- a/package.json +++ b/package.json @@ -97,22 +97,22 @@ "devDependencies": { "@11ty/eleventy-img": "^6.0.4", "@11ty/eleventy-plugin-rss": "^2.0.4", - "@11ty/eleventy-plugin-syntaxhighlight": "^5.0.1", - "@11ty/eleventy-plugin-webc": "^0.12.0-beta.3", - "@eslint/js": "^9.32.0", + "@11ty/eleventy-plugin-syntaxhighlight": "^5.0.2", + "@11ty/eleventy-plugin-webc": "^0.12.0-beta.7", + "@eslint/js": "^9.34.0", "@iarna/toml": "^2.2.5", "@mdx-js/node-loader": "^3.1.0", "@stylistic/eslint-plugin-js": "^4.4.1", - "@types/node": "^22.17.0", - "@vue/server-renderer": "^3.5.18", + "@types/node": "^22.18.0", + "@vue/server-renderer": "^3.5.20", "@zachleat/noop": "^1.0.6", "ava": "^6.4.1", "c8": "^10.1.3", - "cross-env": "^7.0.3", - "eslint": "^9.32.0", + "cross-env": "^10.0.0", + "eslint": "^9.34.0", "eslint-config-prettier": "^10.1.8", "globals": "^16.3.0", - "jsx-async-runtime": "^1.0.3", + "jsx-async-runtime": "^1.0.4", "luxon": "^3.7.1", "markdown-it-abbr": "^2.0.0", "markdown-it-emoji": "^3.0.0", @@ -123,11 +123,11 @@ "react": "^19.1.1", "react-dom": "^19.1.1", "rimraf": "^6.0.1", - "sass": "^1.89.2", + "sass": "^1.91.0", "simple-git-hooks": "^2.13.1", - "tsx": "^4.20.3", + "tsx": "^4.20.5", "typescript": "^5.9.2", - "vue": "^3.5.18", + "vue": "^3.5.20", "zod": "^3.25.76", "zod-validation-error": "^3.5.3" }, @@ -165,6 +165,7 @@ "tinyglobby": "^0.2.14" }, "overrides": { - "chokidar": "$chokidar" + "chokidar": "$chokidar", + "fdir": "6.4.6" } } From 0c89371802c45dcdc635c797192ccd2ad96693c9 Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Thu, 28 Aug 2025 16:50:37 -0500 Subject: [PATCH 04/50] Need to regenerate the package-lock file using npm@10 (not 11!) to bypass https://github.com/npm/cli/issues/4828 --- package-lock.json | 60 +++++++++++++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 20 deletions(-) diff --git a/package-lock.json b/package-lock.json index dfc412252..3bd0baa3e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2295,7 +2295,8 @@ "optional": true, "os": [ "android" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-android-arm64": { "version": "4.49.0", @@ -2309,7 +2310,8 @@ "optional": true, "os": [ "android" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.49.0", @@ -2323,7 +2325,8 @@ "optional": true, "os": [ "darwin" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-darwin-x64": { "version": "4.49.0", @@ -2337,7 +2340,8 @@ "optional": true, "os": [ "darwin" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-freebsd-arm64": { "version": "4.49.0", @@ -2351,7 +2355,8 @@ "optional": true, "os": [ "freebsd" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-freebsd-x64": { "version": "4.49.0", @@ -2365,7 +2370,8 @@ "optional": true, "os": [ "freebsd" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { "version": "4.49.0", @@ -2379,7 +2385,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { "version": "4.49.0", @@ -2393,7 +2400,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-arm64-gnu": { "version": "4.49.0", @@ -2407,7 +2415,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-arm64-musl": { "version": "4.49.0", @@ -2421,7 +2430,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { "version": "4.49.0", @@ -2435,7 +2445,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { "version": "4.49.0", @@ -2449,7 +2460,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { "version": "4.49.0", @@ -2463,7 +2475,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-riscv64-musl": { "version": "4.49.0", @@ -2477,7 +2490,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-s390x-gnu": { "version": "4.49.0", @@ -2491,7 +2505,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.49.0", @@ -2505,7 +2520,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-x64-musl": { "version": "4.49.0", @@ -2519,7 +2535,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-win32-arm64-msvc": { "version": "4.49.0", @@ -2533,7 +2550,8 @@ "optional": true, "os": [ "win32" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-win32-ia32-msvc": { "version": "4.49.0", @@ -2547,7 +2565,8 @@ "optional": true, "os": [ "win32" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-win32-x64-msvc": { "version": "4.49.0", @@ -2561,7 +2580,8 @@ "optional": true, "os": [ "win32" - ] + ], + "peer": true }, "node_modules/@sindresorhus/merge-streams": { "version": "2.3.0", From b52a44ae8b1cccd40c972dbaa13f451bf2021c88 Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Fri, 5 Sep 2025 16:50:18 -0500 Subject: [PATCH 05/50] Remove auto init in core code for tests --- src/EleventyFiles.js | 4 ---- test/EleventyFilesTest.js | 1 - test/_testHelpers.js | 3 ++- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/EleventyFiles.js b/src/EleventyFiles.js index d204b4759..17e2c575e 100644 --- a/src/EleventyFiles.js +++ b/src/EleventyFiles.js @@ -148,10 +148,6 @@ class EleventyFiles { } get templateData() { - if (!this._templateData) { - this._templateData = new TemplateData(this.templateConfig); - } - return this._templateData; } diff --git a/test/EleventyFilesTest.js b/test/EleventyFilesTest.js index 56687e372..5acd9b366 100644 --- a/test/EleventyFilesTest.js +++ b/test/EleventyFilesTest.js @@ -3,7 +3,6 @@ import { glob } from "tinyglobby"; import EleventyFiles from "../src/EleventyFiles.js"; import TemplateConfig from "../src/TemplateConfig.js"; -import FileSystemSearch from "../src/FileSystemSearch.js"; import TemplatePassthroughManager from "../src/TemplatePassthroughManager.js"; import ProjectDirectories from "../src/Util/ProjectDirectories.js"; diff --git a/test/_testHelpers.js b/test/_testHelpers.js index 35c19c2b8..c3e5a9988 100644 --- a/test/_testHelpers.js +++ b/test/_testHelpers.js @@ -7,6 +7,7 @@ import EleventyFiles from "../src/EleventyFiles.js"; import FileSystemSearch from "../src/FileSystemSearch.js"; import TemplateWriter from "../src/TemplateWriter.js"; import TemplateEngineManager from "../src/Engines/TemplateEngineManager.js"; +import TemplateData from "../src/Data/TemplateData.js"; export async function getTemplateConfigInstance(configObj, dirs, configObjOverride = undefined) { let eleventyConfig; @@ -91,7 +92,7 @@ export function getEleventyFilesInstance(formats, templateConfig) { files.setPassthroughManager(mgr); files.setFileSystemSearch(fss); files.extensionMap = map; - // files.templateData = this.templateData; + files.templateData = new TemplateData(templateConfig); files.init(); return { From 6a856aa5cae7e9c0b8e8a1f4b04bc6956db6f2a3 Mon Sep 17 00:00:00 2001 From: Mohammed Hassan Date: Thu, 11 Sep 2025 12:51:29 +0100 Subject: [PATCH 06/50] #3938 feat: optimize TemplateMap performance with O(1) lookup - Replace O(n) Array.find() with O(1) Map.get() in getMapEntryForInputPath() - Add inputPathMap for fast template lookups by input path - Maintain backward compatibility with both relative and absolute paths - Significant performance improvement for sites with many templates - All existing tests pass Fixes performance bottleneck in template rendering pipeline --- src/TemplateMap.js | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/src/TemplateMap.js b/src/TemplateMap.js index 52cceb187..b3aa89085 100644 --- a/src/TemplateMap.js +++ b/src/TemplateMap.js @@ -36,6 +36,7 @@ class TemplateMap { } this.eleventyConfig = eleventyConfig; this.map = []; + this.inputPathMap = new Map(); // NEW: O(1) lookup Map for performance this.collectionsData = null; this.cached = false; this.verboseOutput = true; @@ -72,6 +73,7 @@ class TemplateMap { for (let map of entries) { this.map.push(map); + this._addToInputPathMap(map); // NEW: Add to lookup Map for O(1) access } } @@ -79,6 +81,20 @@ class TemplateMap { return this.map; } + // NEW: Helper method to add entries to the lookup Map + _addToInputPathMap(mapEntry) { + const inputPath = mapEntry.inputPath; + + // Store under the original inputPath + this.inputPathMap.set(inputPath, mapEntry); + + // Also store under absolute path if different + const absoluteInputPath = TemplatePath.absolutePath(inputPath); + if (absoluteInputPath !== inputPath) { + this.inputPathMap.set(absoluteInputPath, mapEntry); + } + } + getTagTarget(str) { if (str === "collections") { // special, means targeting `collections` specifically @@ -325,14 +341,17 @@ class TemplateMap { return Boolean(this.getMapEntryForInputPath(inputPath)); } - // TODO(slightlyoff): hot inner loop? + // OPTIMIZED: O(1) lookup instead of O(n) search - Performance improvement for template rendering getMapEntryForInputPath(inputPath) { + // Try direct lookup first (most common case) + let entry = this.inputPathMap.get(inputPath); + if (entry) { + return entry; + } + + // Try absolute path lookup if direct lookup failed let absoluteInputPath = TemplatePath.absolutePath(inputPath); - return this.map.find((entry) => { - if (entry.inputPath === inputPath || entry.inputPath === absoluteInputPath) { - return entry; - } - }); + return this.inputPathMap.get(absoluteInputPath); } #removeTagsFromTemplateOrder(maps) { From 4193be880e77df8e157e12dadcb5ea5682cb16ee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 12:21:58 +0000 Subject: [PATCH 07/50] Bump debug from 4.4.1 to 4.4.3 Bumps [debug](https://github.com/debug-js/debug) from 4.4.1 to 4.4.3. - [Release notes](https://github.com/debug-js/debug/releases) - [Commits](https://github.com/debug-js/debug/compare/4.4.1...4.4.3) --- updated-dependencies: - dependency-name: debug dependency-version: 4.4.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3bd0baa3e..da76855d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "@sindresorhus/slugify": "^2.2.1", "bcp-47-normalize": "^2.3.0", "chokidar": "^4.0.3", - "debug": "^4.4.1", + "debug": "^4.4.3", "dependency-graph": "^1.0.0", "entities": "^6.0.1", "import-module-string": "^2.0.3", @@ -4269,9 +4269,9 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" diff --git a/package.json b/package.json index 052977ac9..62845d888 100644 --- a/package.json +++ b/package.json @@ -145,7 +145,7 @@ "@sindresorhus/slugify": "^2.2.1", "bcp-47-normalize": "^2.3.0", "chokidar": "^4.0.3", - "debug": "^4.4.1", + "debug": "^4.4.3", "dependency-graph": "^1.0.0", "entities": "^6.0.1", "import-module-string": "^2.0.3", From 865dee09e90da6e366283bc028b4741ca8e65044 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 12:27:17 +0000 Subject: [PATCH 08/50] Bump @sindresorhus/slugify from 2.2.1 to 3.0.0 Bumps [@sindresorhus/slugify](https://github.com/sindresorhus/slugify) from 2.2.1 to 3.0.0. - [Release notes](https://github.com/sindresorhus/slugify/releases) - [Commits](https://github.com/sindresorhus/slugify/compare/v2.2.1...v3.0.0) --- updated-dependencies: - dependency-name: "@sindresorhus/slugify" dependency-version: 3.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package-lock.json | 23 ++++++++++------------- package.json | 2 +- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3bd0baa3e..72d870354 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,7 @@ "@11ty/parse-date-strings": "^2.0.5", "@11ty/posthtml-urls": "^1.0.1", "@11ty/recursive-copy": "^4.0.2", - "@sindresorhus/slugify": "^2.2.1", + "@sindresorhus/slugify": "^3.0.0", "bcp-47-normalize": "^2.3.0", "chokidar": "^4.0.3", "debug": "^4.4.1", @@ -2597,31 +2597,28 @@ } }, "node_modules/@sindresorhus/slugify": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-2.2.1.tgz", - "integrity": "sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-3.0.0.tgz", + "integrity": "sha512-SCrKh1zS96q+CuH5GumHcyQEVPsM4Ve8oE0E6tw7AAhGq50K8ojbTUOQnX/j9Mhcv/AXiIsbCfquovyGOo5fGw==", "license": "MIT", "dependencies": { - "@sindresorhus/transliterate": "^1.0.0", + "@sindresorhus/transliterate": "^2.0.0", "escape-string-regexp": "^5.0.0" }, "engines": { - "node": ">=12" + "node": ">=20" }, "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-2.0.0.tgz", + "integrity": "sha512-lRx63oCHxeJ90DqIgmbxH1PQmiBDY1wVaLzB4hK0d/xS5BrG1iZO3HdCJS/DQJk6GJ8xHDev8OMI7iGxvE1ZUA==", "license": "MIT", - "dependencies": { - "escape-string-regexp": "^5.0.0" - }, "engines": { - "node": ">=12" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" diff --git a/package.json b/package.json index 052977ac9..5610e3a55 100644 --- a/package.json +++ b/package.json @@ -142,7 +142,7 @@ "@11ty/parse-date-strings": "^2.0.5", "@11ty/posthtml-urls": "^1.0.1", "@11ty/recursive-copy": "^4.0.2", - "@sindresorhus/slugify": "^2.2.1", + "@sindresorhus/slugify": "^3.0.0", "bcp-47-normalize": "^2.3.0", "chokidar": "^4.0.3", "debug": "^4.4.1", From 90c320738044109a4708383b92e966ac2cb81e3f Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Wed, 22 Oct 2025 12:35:25 -0500 Subject: [PATCH 09/50] Fixes #3954 --- src/Template.js | 4 +--- src/TemplateContent.js | 4 ++++ src/TemplateLayout.js | 42 +++++++++++++++++++++++++++++++++--- test/EleventyMarkdownTest.js | 29 +++++++++++++++++++++++++ 4 files changed, 73 insertions(+), 6 deletions(-) create mode 100644 test/EleventyMarkdownTest.js diff --git a/src/Template.js b/src/Template.js index 83898f5a9..81d516b1a 100755 --- a/src/Template.js +++ b/src/Template.js @@ -452,9 +452,7 @@ class Template extends TemplateContent { data.page.fileSlug = this.fileSlugStr; data.page.filePathStem = this.filePathStem; data.page.outputFileExtension = this.engine.defaultTemplateFileExtension; - data.page.templateSyntax = this.templateRender.getEnginesList( - data[this.config.keys.engineOverride], - ); + data.page.templateSyntax = this.getEngineNames(data[this.config.keys.engineOverride]); let newDate = await this.getMappedDate(data); // Skip date assignment if custom date is falsy. diff --git a/src/TemplateContent.js b/src/TemplateContent.js index 436836c85..4376b6320 100644 --- a/src/TemplateContent.js +++ b/src/TemplateContent.js @@ -433,6 +433,10 @@ class TemplateContent { return this._frontMatterDataCache; } + getEngineNames(engineOverride) { + return this.templateRender.getEnginesList(engineOverride); + } + async getEngineOverride() { return this.getFrontMatterData().then((data) => { return data[this.config.keys.engineOverride]; diff --git a/src/TemplateLayout.js b/src/TemplateLayout.js index f8526f23e..f2945c67c 100644 --- a/src/TemplateLayout.js +++ b/src/TemplateLayout.js @@ -9,6 +9,36 @@ import layoutCache from "./LayoutCache.js"; // const debug = debugUtil("Eleventy:TemplateLayout"); const debugDev = debugUtil("Dev:Eleventy:TemplateLayout"); +// https://github.com/11ty/eleventy/issues/3954 +class CdataWrapper { + static PREFIX = ""; + + constructor(templateSyntax) { + this.isEligible = CdataWrapper.isEligible(templateSyntax); + } + + // Markdown only + static isEligible(templateSyntax) { + return templateSyntax.split(",").includes("md"); + } + + wrap(content) { + if (this.isEligible) { + return CdataWrapper.PREFIX + content + CdataWrapper.POSTFIX; + } + return content; + } + + unwrap(content) { + if (this.isEligible) { + return content.replaceAll(CdataWrapper.PREFIX, "").replaceAll(CdataWrapper.POSTFIX, ""); + } + + return content; + } +} + class TemplateLayout extends TemplateContent { constructor(key, extensionMap, eleventyConfig) { if (!eleventyConfig || eleventyConfig.constructor.name !== "TemplateConfig") { @@ -177,6 +207,8 @@ class TemplateLayout extends TemplateContent { try { fns.push({ + inputPath: this.inputPath, + template: this, render: await this.getCachedCompiledLayoutFunction(), }); @@ -215,13 +247,17 @@ class TemplateLayout extends TemplateContent { async renderPageEntry(pageEntry) { let templateContent = pageEntry.templateContent; let compiledFunctions = await this.getCompiledLayoutFunctions(); - for (let { render } of compiledFunctions) { + for (let { render, template } of compiledFunctions) { + let templateSyntax = template.getEngineNames(pageEntry.data[this.config.keys.engineOverride]); + + let cdata = new CdataWrapper(templateSyntax); + let data = { - content: templateContent, + content: cdata.wrap(templateContent), ...pageEntry.data, }; - templateContent = await render(data); + templateContent = cdata.unwrap(await render(data)); } // Don’t set `templateContent` on pageEntry because collection items should not have layout markup diff --git a/test/EleventyMarkdownTest.js b/test/EleventyMarkdownTest.js new file mode 100644 index 000000000..3898a5bf3 --- /dev/null +++ b/test/EleventyMarkdownTest.js @@ -0,0 +1,29 @@ +import test from "ava"; +import Eleventy from "../src/Eleventy.js"; + +test("Markdown in markdown #3954", async (t) => { + let elev = new Eleventy({ + input: "./test/stubs-virtual/", + config: eleventyConfig => { + eleventyConfig.addTemplate("_includes/layout.md", `{{ content }}`); + eleventyConfig.addTemplate("index.md", `--- +layout: layout.md +--- +# Heading + +\`\`\` +# This is code + +# This is another code +\`\`\``); + } + }); + + let results = await elev.toJSON(); + t.is(results.length, 1); + t.is(results[0].content.trim(), `

Heading

+
# This is code
+
+# This is another code
+
`); +}); From b7ce4eed9c5263fc708f98bb28a36ffc5cbb9aeb Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Wed, 22 Oct 2025 17:29:33 -0500 Subject: [PATCH 10/50] Fixes #3925 --- src/TemplateRender.js | 10 ++++++++-- src/UserConfig.js | 6 +++--- test/EleventyMarkdownTest.js | 25 +++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/TemplateRender.js b/src/TemplateRender.js index 1c21f0ac0..22b97f597 100644 --- a/src/TemplateRender.js +++ b/src/TemplateRender.js @@ -1,8 +1,8 @@ +import debugUtil from "debug"; import EleventyBaseError from "./Errors/EleventyBaseError.js"; import TemplateEngineManager from "./Engines/TemplateEngineManager.js"; -// import debugUtil from "debug"; -// const debug = debugUtil("Eleventy:TemplateRender"); +const debugConfiguration = debugUtil("Eleventy:UserConfig"); class TemplateRenderUnknownEngineError extends EleventyBaseError {} @@ -19,6 +19,12 @@ export default class TemplateRender { this.engineNameOrPath = tmplPath; this.parseMarkdownWith = this.config.markdownTemplateEngine; + if (this.parseMarkdownWith === "md") { + this.parseMarkdownWith = false; + debugConfiguration( + "Misconfiguration warning: the preprocessing template syntax for Markdown files cannot be Markdown, we’re assuming you meant `false` to skip preprocessing altogether (via the `markdownTemplateEngine` configuration property or the `setMarkdownTemplateEngine` configuration method). Read more: https://www.11ty.dev/docs/config/#default-template-engine-for-markdown-files", + ); + } this.parseHtmlWith = this.config.htmlTemplateEngine; } diff --git a/src/UserConfig.js b/src/UserConfig.js index 483298607..9c2f14726 100644 --- a/src/UserConfig.js +++ b/src/UserConfig.js @@ -337,9 +337,9 @@ class UserConfig { * Markdown */ - // This is a method for plugins, probably shouldn’t use this in projects. - // Projects should use `setLibrary` as documented here: - // https://github.com/11ty/eleventy/blob/master/docs/engines/markdown.md#use-your-own-options + // Don’t use this, projects should use `amendLibrary` as documented here: + // https://www.11ty.dev/docs/languages/markdown/#optional-amend-the-library-instance + // Warning: this is in use by the Syntax Highlighting plugin (as of v5.0.2) addMarkdownHighlighter(highlightFn) { this.markdownHighlighter = highlightFn; } diff --git a/test/EleventyMarkdownTest.js b/test/EleventyMarkdownTest.js index 3898a5bf3..e2f6839fd 100644 --- a/test/EleventyMarkdownTest.js +++ b/test/EleventyMarkdownTest.js @@ -27,3 +27,28 @@ layout: layout.md # This is another code `); }); + + +test("Preprocess Markdown with markdown #3925", async (t) => { + let elev = new Eleventy({ + input: "./test/stubs-virtual/", + config: eleventyConfig => { + eleventyConfig.setMarkdownTemplateEngine("md"); + eleventyConfig.addTemplate("index.md", `# Heading + +\`\`\` +# This is code + +# This is another code +\`\`\``); + } + }); + + let results = await elev.toJSON(); + t.is(results.length, 1); + t.is(results[0].content.trim(), `

Heading

+
# This is code
+
+# This is another code
+
`); +}); From 73e4269c356dc0f4cd9806deea7e63fa5e78136c Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Thu, 23 Oct 2025 17:07:04 -0500 Subject: [PATCH 11/50] Fixes #3937 --- src/Data/TemplateData.js | 16 +----- src/Template.js | 11 +--- src/TemplateLayout.js | 5 +- src/UserConfig.js | 72 +++++++++++------------ test/TemplateDataTest.js | 6 +- test/TemplateTest-ComputedData.js | 3 +- test/TemplateTest.js | 96 ------------------------------- 7 files changed, 47 insertions(+), 162 deletions(-) diff --git a/src/Data/TemplateData.js b/src/Data/TemplateData.js index d47600f57..ee74e7536 100644 --- a/src/Data/TemplateData.js +++ b/src/Data/TemplateData.js @@ -305,7 +305,7 @@ class TemplateData { ); let oldData = lodashGet(globalData, objectPathTarget); - data = TemplateData.mergeDeep(this.config.dataDeepMerge, oldData, data); + data = Merge(oldData, data); } dataFileConflicts[objectPathTargetString] = files[j]; @@ -422,7 +422,7 @@ class TemplateData { } dataSource[key] = path; } - TemplateData.mergeDeep(this.config.dataDeepMerge, localData, cleanedDataForPath); + Merge(localData, cleanedDataForPath); } } return localData; @@ -632,18 +632,6 @@ class TemplateData { return unique(paths).reverse(); } - static mergeDeep(deepMerge, target, ...source) { - if (!deepMerge && deepMerge !== undefined) { - return Object.assign(target, ...source); - } else { - return TemplateData.merge(target, ...source); - } - } - - static merge(target, ...source) { - return Merge(target, ...source); - } - /* Like cleanupData() but does not mutate */ static getCleanedTagsImmutable(data, options = {}) { let tags = []; diff --git a/src/Template.js b/src/Template.js index 81d516b1a..3ea84e4d9 100755 --- a/src/Template.js +++ b/src/Template.js @@ -2,7 +2,7 @@ import path from "node:path"; import { statSync } from "node:fs"; import lodash from "@11ty/lodash-custom"; -import { TemplatePath, isPlainObject } from "@11ty/eleventy-utils"; +import { Merge, TemplatePath, isPlainObject } from "@11ty/eleventy-utils"; import debugUtil from "debug"; import chalk from "./Adapters/Packages/chalk.js"; @@ -398,14 +398,7 @@ class Template extends TemplateContent { } try { - let mergedData = TemplateData.mergeDeep( - this.config.dataDeepMerge, - {}, - globalData, - mergedLayoutData, - localData, - frontMatterData, - ); + let mergedData = Merge({}, globalData, mergedLayoutData, localData, frontMatterData); if (this.config.freezeReservedData) { ReservedData.check(mergedData); diff --git a/src/TemplateLayout.js b/src/TemplateLayout.js index f2945c67c..2156feb58 100644 --- a/src/TemplateLayout.js +++ b/src/TemplateLayout.js @@ -1,9 +1,8 @@ -import { TemplatePath } from "@11ty/eleventy-utils"; +import { Merge, TemplatePath } from "@11ty/eleventy-utils"; import debugUtil from "debug"; import TemplateLayoutPathResolver from "./TemplateLayoutPathResolver.js"; import TemplateContent from "./TemplateContent.js"; -import TemplateData from "./Data/TemplateData.js"; import layoutCache from "./LayoutCache.js"; // const debug = debugUtil("Eleventy:TemplateLayout"); @@ -173,7 +172,7 @@ class TemplateLayout extends TemplateContent { } // Deep merge of layout front matter - let data = TemplateData.mergeDeep(this.config.dataDeepMerge, {}, ...dataToMerge); + let data = Merge({}, ...dataToMerge); delete data[this.config.keys.layout]; return data; diff --git a/src/UserConfig.js b/src/UserConfig.js index 9c2f14726..32c1d052c 100644 --- a/src/UserConfig.js +++ b/src/UserConfig.js @@ -25,8 +25,6 @@ class UserConfig { #pluginExecution = false; /** @type {boolean} */ #quietModeLocked = false; - /** @type {boolean} */ - #dataDeepMergeModified = false; /** @type {number|undefined} */ #uniqueId; /** @type {number} */ @@ -62,13 +60,6 @@ class UserConfig { this.#uniqueId = Math.random(); } - // this.DateTime removed in v4 - get DateTime() { - throw new Error( - 'Luxon’s DateTime property in configuration was removed in Eleventy v4. Please `import { DateTime } from "luxon"` directly.', - ); - } - // Internally used in TemplateContent for cache keys _getUniqueId() { return this.#uniqueId; @@ -173,7 +164,6 @@ class UserConfig { this.ignores = new Set(defaultIgnores); this.watchIgnores = new Set(defaultIgnores); - this.dataDeepMerge = true; this.extensionMap = new Set(); this.extensionMapClasses = {}; /** @type {object} */ @@ -797,10 +787,6 @@ class UserConfig { /* * Template Formats */ - _normalizeTemplateFormats() { - throw new Error("The internal _normalizeTemplateFormats() method was removed in Eleventy 3.0"); - } - setTemplateFormats(templateFormats) { this.templateFormats = templateFormats; } @@ -866,16 +852,6 @@ class UserConfig { this.useGitIgnore = !!enabled; } - setDataDeepMerge(deepMerge) { - this.#dataDeepMergeModified = true; - this.dataDeepMerge = !!deepMerge; - } - - // Used by the Upgrade Helper Plugin - isDataDeepMergeModified() { - return this.#dataDeepMergeModified; - } - addWatchTarget(additionalWatchTargets, options = {}) { // Reset the config when the target path changes if (options.resetConfig) { @@ -897,13 +873,6 @@ class UserConfig { } } - setBrowserSyncConfig() { - this._attemptedBrowserSyncUse = true; - debug( - "The `setBrowserSyncConfig` method was removed in Eleventy 2.0.0. Use `setServerOptions` with the new Eleventy development server or the `@11ty/eleventy-browser-sync` plugin moving forward.", - ); - } - setChokidarConfig(options = {}) { this.chokidarConfig = options; } @@ -1172,11 +1141,6 @@ class UserConfig { Object.assign(this.errorReporting, options); } - configureTemplateHandling(options = {}) { - // Was used for sync/async swapping on file write operations - throw new Error("Internal configuration API method `configureTemplateHandling` was removed."); - } - /* * Collections */ @@ -1268,7 +1232,6 @@ class UserConfig { useGitIgnore: this.useGitIgnore, ignores: this.ignores, watchIgnores: this.watchIgnores, - dataDeepMerge: this.dataDeepMerge, watchJavaScriptDependencies: this.watchJavaScriptDependencies, additionalWatchTargets: this.additionalWatchTargets, watchTargetsConfigReset: this.watchTargetsConfigReset, @@ -1310,12 +1273,47 @@ class UserConfig { return obj; } + // Removed features + get DateTime() { + throw new Error( + 'Luxon’s DateTime property in configuration was removed in Eleventy v4. Please `import { DateTime } from "luxon"` directly.', + ); + } + + _normalizeTemplateFormats() { + throw new Error("The internal _normalizeTemplateFormats() method was removed in Eleventy v3"); + } + + setBrowserSyncConfig() { + this._attemptedBrowserSyncUse = true; + debug( + "The `setBrowserSyncConfig` method was removed in Eleventy v2. Use `setServerOptions` with the new Eleventy development server or the `@11ty/eleventy-browser-sync` plugin moving forward.", + ); + } + + configureTemplateHandling(options = {}) { + // Was used for sync/async swapping on file write operations + throw new Error("Internal configuration API method `configureTemplateHandling` was removed."); + } + + setDataDeepMerge(deepMerge) { + if (Boolean(deepMerge) === false) { + throw new Error( + "The `setDataDeepMerge(false)` Configuration API feature was removed in Eleventy v4. Read more at https://github.com/11ty/eleventy/issues/3937", + ); + } + } + // No-op functions for backwards compat addHandlebarsHelper() {} setPugOptions() {} setEjsOptions() {} addHandlebarsShortcode() {} addPairedHandlebarsShortcode() {} + + // Used by the Upgrade Helper Plugin v1 (no longer relevant) + // https://github.com/11ty/eleventy-upgrade-help/blob/v1.x/src/data-deep-merge.js#L5-L9 + isDataDeepMergeModified() {} } export default UserConfig; diff --git a/test/TemplateDataTest.js b/test/TemplateDataTest.js index 8882d690d..884c7ffdb 100644 --- a/test/TemplateDataTest.js +++ b/test/TemplateDataTest.js @@ -1,6 +1,7 @@ import test from "ava"; import semver from "semver"; import { createRequire } from "module"; +import { Merge } from "@11ty/eleventy-utils"; import TemplateData from "../src/Data/TemplateData.js"; import FileSystemSearch from "../src/FileSystemSearch.js"; @@ -696,9 +697,10 @@ test("getTemplateDataFileGlob", async (t) => { ]); }); -test("TemplateData.merge", (t) => { +// https://github.com/11ty/eleventy/issues/3937 +test("TemplateData.merge is now Merge()", (t) => { t.deepEqual( - TemplateData.merge( + Merge( { tags: [1, 2, 3], }, diff --git a/test/TemplateTest-ComputedData.js b/test/TemplateTest-ComputedData.js index 987fe11fd..098b733e9 100644 --- a/test/TemplateTest-ComputedData.js +++ b/test/TemplateTest-ComputedData.js @@ -154,7 +154,8 @@ test("eleventyComputed intermixes with global data", async (t) => { input: "test/stubs-computed-global", output: "dist", }, function(cfg) { - cfg.setDataDeepMerge(true); + // Defaulted in v1 + // cfg.setDataDeepMerge(true); }); let dataObj = new TemplateData(eleventyConfig); diff --git a/test/TemplateTest.js b/test/TemplateTest.js index e67f39c4d..b4881f823 100644 --- a/test/TemplateTest.js +++ b/test/TemplateTest.js @@ -1190,46 +1190,6 @@ test("Data Cascade (Deep merge)", async (t) => { t.is(data.parent.child, -2); }); -test("Data Cascade (Shallow merge)", async (t) => { - let eleventyConfig = await getTemplateConfigInstanceCustomCallback({ - input: "test", - output: "dist", - }, function(cfg) { - // Default changed in 1.0 - cfg.setDataDeepMerge(false); - }); - - let dataObj = new TemplateData(eleventyConfig); - dataObj.extensionMap = new EleventyExtensionMap(eleventyConfig); - dataObj.setProjectUsingEsm(true); - dataObj.setFileSystemSearch(new FileSystemSearch()); - await dataObj.getGlobalData(); - - let tmpl = await getNewTemplate( - "./test/stubs/data-cascade/template.njk", - "./test/", - "./dist", - dataObj, - null, - eleventyConfig - ); - - let data = await tmpl.getData(); - t.deepEqual(Object.keys(data).sort(), [ - "datafile", - "eleventy", - "frontmatter", - "page", - "parent", - "pkg", - "tags", - ]); - - t.deepEqual(Object.keys(data.parent).sort(), ["child", "frontmatter"]); - - t.is(data.parent.child, -2); -}); - test("Data Cascade Tag Merge (Deep merge)", async (t) => { let eleventyConfig = await getTemplateConfigInstanceCustomCallback({ input: "test/stubs", @@ -1286,62 +1246,6 @@ test("Data Cascade Tag Merge (Deep Merge - Deduplication)", async (t) => { t.deepEqual(data.tags.sort(), ["tagA", "tagB", "tagC", "tagD"]); }); -test("Data Cascade Tag Merge (Shallow merge)", async (t) => { - let eleventyConfig = await getTemplateConfigInstanceCustomCallback({ - input: "test/stubs", - output: "dist" - }, function(cfg) { - // Default changed in 1.0 - cfg.setDataDeepMerge(false); - }); - - let dataObj = new TemplateData(eleventyConfig); - dataObj.extensionMap = new EleventyExtensionMap(eleventyConfig); - dataObj.setProjectUsingEsm(true); - dataObj.setFileSystemSearch(new FileSystemSearch()); - await dataObj.getGlobalData(); - - let tmpl = await getNewTemplate( - "./test/stubs/data-cascade/template.njk", - "./test/stubs/", - "./dist", - dataObj, - null, - eleventyConfig - ); - - let data = await tmpl.getData(); - t.deepEqual(data.tags.sort(), ["tagA", "tagB"]); -}); - -test('Local data inherits tags string ([tags] vs "tags") Shallow Merge', async (t) => { - let eleventyConfig = await getTemplateConfigInstanceCustomCallback({ - input: "test/stubs", - output: "dist" - }, function(cfg) { - // Default changed in 1.0 - cfg.setDataDeepMerge(false); - }); - - let dataObj = new TemplateData(eleventyConfig); - dataObj.extensionMap = new EleventyExtensionMap(eleventyConfig); - dataObj.setProjectUsingEsm(true); - dataObj.setFileSystemSearch(new FileSystemSearch()); - await dataObj.getGlobalData(); - - let tmpl = await getNewTemplate( - "./test/stubs/local-data-tags/component.njk", - "./test/stubs/", - "./dist", - dataObj, - null, - eleventyConfig - ); - - let data = await tmpl.getData(); - t.deepEqual(data.tags.sort(), ["tag1", "tag2"]); -}); - test('Local data inherits tags string ([tags] vs "tags") Deep Merge', async (t) => { let eleventyConfig = await getTemplateConfigInstanceCustomCallback({ input: "test/stubs", From 21b96d86ca42402750af81d44b5a226fb8c81844 Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Fri, 24 Oct 2025 11:06:19 -0500 Subject: [PATCH 12/50] Fxies #2261, possible implications to #1749 --- src/Engines/Nunjucks.js | 106 ++++++++++++++++------------ test/EleventyNunjucksTest.js | 13 ++++ test/stubs-2261/_includes/block.njk | 1 + test/stubs-2261/eleventy.config.js | 5 ++ test/stubs-2261/index.njk | 2 + 5 files changed, 83 insertions(+), 44 deletions(-) create mode 100644 test/EleventyNunjucksTest.js create mode 100644 test/stubs-2261/_includes/block.njk create mode 100644 test/stubs-2261/eleventy.config.js create mode 100644 test/stubs-2261/index.njk diff --git a/src/Engines/Nunjucks.js b/src/Engines/Nunjucks.js index 5d9c9268f..c93c8d48f 100755 --- a/src/Engines/Nunjucks.js +++ b/src/Engines/Nunjucks.js @@ -114,10 +114,15 @@ export default class Nunjucks extends TemplateEngine { // TODO these all go to the same place (addTag), add warnings for overwrites // TODO(zachleat): variableName should work with quotes or without quotes (same as {% set %}) - this.addPairedShortcode("setAsync", function (content, variableName) { - this.ctx[variableName] = content; - return ""; - }); + // This was changed to be an async function in v4 but notably previous versions of synchronous paired shortcodes used CallExtensionAsync + this.addPairedShortcode( + "setAsync", + async function (content, variableName) { + this.ctx[variableName] = content; + return ""; + }, + true, + ); this.addCustomTags(this.config.nunjucksTags); this.addAllShortcodes(this.config.nunjucksShortcodes); @@ -283,34 +288,34 @@ export default class Nunjucks extends TemplateEngine { return function PairedShortcodeFunction() { this.tags = [shortcodeName]; - this.parse = function (parser, nodes) { - var tok = parser.nextToken(); + if (isAsync) { + this.parse = function (parser, nodes) { + var tok = parser.nextToken(); - var args = parser.parseSignature(true, true); - parser.advanceAfterBlockEnd(tok.value); + var args = parser.parseSignature(true, true); + parser.advanceAfterBlockEnd(tok.value); - var body = parser.parseUntilBlocks("end" + shortcodeName); - parser.advanceAfterBlockEnd(); + var body = parser.parseUntilBlocks("end" + shortcodeName); + parser.advanceAfterBlockEnd(); - return new nodes.CallExtensionAsync(this, "run", args, [body]); - }; + return new nodes.CallExtensionAsync(this, "run", args, [body]); + }; - this.run = function (...args) { - let resolve = args.pop(); - let body = args.pop(); - let [context, ...argArray] = args; + this.run = function (...args) { + let resolve = args.pop(); + let body = args.pop(); + let [context, ...argArray] = args; - body(function (e, bodyContent) { - if (e) { - resolve( - new EleventyNunjucksError( - `Error with Nunjucks paired shortcode \`${shortcodeName}\``, - e, - ), - ); - } + body(function (e, bodyContent) { + if (e) { + resolve( + new EleventyNunjucksError( + `Error with Nunjucks paired shortcode \`${shortcodeName}\``, + e, + ), + ); + } - if (isAsync) { let ret = shortcodeFn.call( Nunjucks.normalizeContext(context), bodyContent, @@ -337,25 +342,38 @@ export default class Nunjucks extends TemplateEngine { ); }, ); - } else { - try { - resolve( - null, - new NunjucksLib.runtime.SafeString( - shortcodeFn.call(Nunjucks.normalizeContext(context), bodyContent, ...argArray), - ), - ); - } catch (e) { - resolve( - new EleventyNunjucksError( - `Error with Nunjucks paired shortcode \`${shortcodeName}\``, - e, - ), - ); - } + }); + }; + } else { + this.parse = function (parser, nodes) { + var tok = parser.nextToken(); + + var args = parser.parseSignature(true, true); + parser.advanceAfterBlockEnd(tok.value); + + var body = parser.parseUntilBlocks("end" + shortcodeName); + parser.advanceAfterBlockEnd(); + + return new nodes.CallExtension(this, "run", args, [body]); + }; + + this.run = function (...args) { + let body = args.pop(); + let [context, ...argArray] = args; + let bodyContent = body(); + + try { + return new NunjucksLib.runtime.SafeString( + shortcodeFn.call(Nunjucks.normalizeContext(context), bodyContent, ...argArray), + ); + } catch (e) { + throw new EleventyNunjucksError( + `Error with Nunjucks paired shortcode \`${shortcodeName}\``, + e, + ); } - }); - }; + }; + } }; } diff --git a/test/EleventyNunjucksTest.js b/test/EleventyNunjucksTest.js new file mode 100644 index 000000000..2cfb01e21 --- /dev/null +++ b/test/EleventyNunjucksTest.js @@ -0,0 +1,13 @@ +import test from "ava"; +import Eleventy from "../src/Eleventy.js"; + +test("Paired shortcodes in macros #2261 #1749", async (t) => { + let elev = new Eleventy({ + input: "./test/stubs-2261/", + configPath: "./test/stubs-2261/eleventy.config.js", + }); + + let results = await elev.toJSON(); + t.is(results.length, 1); + t.is(results[0].content.trim(), `
HelloHello Manuel
`); +}); diff --git a/test/stubs-2261/_includes/block.njk b/test/stubs-2261/_includes/block.njk new file mode 100644 index 000000000..8923d0de3 --- /dev/null +++ b/test/stubs-2261/_includes/block.njk @@ -0,0 +1 @@ +{% macro block() %}
{{ caller() }}
{% endmacro %} \ No newline at end of file diff --git a/test/stubs-2261/eleventy.config.js b/test/stubs-2261/eleventy.config.js new file mode 100644 index 000000000..076d99fe2 --- /dev/null +++ b/test/stubs-2261/eleventy.config.js @@ -0,0 +1,5 @@ +export default function(eleventyConfig) { + eleventyConfig.addPairedShortcode("sample", function(content, firstName) { + return `${content} ${firstName}` + }); +}; \ No newline at end of file diff --git a/test/stubs-2261/index.njk b/test/stubs-2261/index.njk new file mode 100644 index 000000000..b8a366c83 --- /dev/null +++ b/test/stubs-2261/index.njk @@ -0,0 +1,2 @@ +{% from "block.njk" import block with context %} +{% call block() %}Hello{% sample "Manuel" %}Hello{% endsample %}{% endcall %} \ No newline at end of file From 1501b77e6ce00231abc605a7ab15ff6546c3992a Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Fri, 24 Oct 2025 12:39:33 -0500 Subject: [PATCH 13/50] Improve error messaging for #838 --- src/Template.js | 26 ++++++++++++++------------ src/TemplatePermalink.js | 20 +++++++++++++------- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/src/Template.js b/src/Template.js index 3ea84e4d9..32378e800 100755 --- a/src/Template.js +++ b/src/Template.js @@ -202,15 +202,6 @@ class Template extends TemplateContent { return this.extensionMap.removeTemplateExtension(this.parsed.base); } - async _getRawPermalinkInstance(permalinkValue) { - let perm = new TemplatePermalink(permalinkValue, this.extraOutputSubdirectory); - perm.setUrlTransforms(this.config.urlTransforms); - - this.behavior.setFromPermalink(perm); - - return perm; - } - async _getLink(data) { if (!data) { throw new Error("Internal error: data argument missing in Template->_getLink"); @@ -220,13 +211,16 @@ class Template extends TemplateContent { data[this.config.keys.permalink] ?? data?.[this.config.keys.computed]?.[this.config.keys.permalink]; let permalinkValue; + let isDynamicPermalinkEnabled = + this.config.dynamicPermalinks && data.dynamicPermalink !== false; // `permalink: false` means render but no file system write, e.g. use in collections only) // `permalink: true` throws an error if (typeof permalink === "boolean") { debugDev("Using boolean permalink %o", permalink); permalinkValue = permalink; - } else if (permalink && (!this.config.dynamicPermalinks || data.dynamicPermalink === false)) { + } else if (permalink && !isDynamicPermalinkEnabled) { + // Issue #838 debugDev("Not using dynamic permalinks, using %o", permalink); permalinkValue = permalink; } else if (isPlainObject(permalink)) { @@ -270,7 +264,7 @@ class Template extends TemplateContent { } // Override default permalink behavior. Only do this if permalink was _not_ in the data cascade - if (!permalink && this.config.dynamicPermalinks && data.dynamicPermalink !== false) { + if (!permalink && isDynamicPermalinkEnabled) { let tr = await this.getTemplateRender(); let permalinkCompilation = tr.engine.permalinkNeedsCompilation(""); if (typeof permalinkCompilation === "function") { @@ -288,7 +282,14 @@ class Template extends TemplateContent { } if (permalinkValue !== undefined) { - return this._getRawPermalinkInstance(permalinkValue); + let p = new TemplatePermalink( + permalinkValue, + this.extraOutputSubdirectory, + isDynamicPermalinkEnabled, + ); + p.setUrlTransforms(this.config.urlTransforms); + this.behavior.setFromPermalink(p); + return p; } // No `permalink` specified in data cascade, do the default @@ -297,6 +298,7 @@ class Template extends TemplateContent { this.baseFile, this.extraOutputSubdirectory, this.engine.defaultTemplateFileExtension, + isDynamicPermalinkEnabled, ); p.setUrlTransforms(this.config.urlTransforms); return p; diff --git a/src/TemplatePermalink.js b/src/TemplatePermalink.js index 9ad51119f..81fd85f63 100644 --- a/src/TemplatePermalink.js +++ b/src/TemplatePermalink.js @@ -2,12 +2,15 @@ import path from "node:path"; import { TemplatePath, isPlainObject } from "@11ty/eleventy-utils"; class TemplatePermalink { + #dynamicPermalinkEnabled; + // `link` with template syntax should have already been rendered in Template.js - constructor(link, extraSubdir) { + constructor(link, extraSubdir, isDynamicPermalinkEnabled = true) { let isLinkAnObject = isPlainObject(link); this._isRendered = true; this._writeToFileSystem = true; + this.#dynamicPermalinkEnabled = isDynamicPermalinkEnabled; let buildLink; @@ -44,10 +47,7 @@ class TemplatePermalink { if (typeof buildLink !== "string") { let stringToString = "toString" in buildLink ? `:\n\n${buildLink.toString()}` : ""; throw new Error( - "Expected permalink value to be a string. Received `" + - typeof buildLink + - "`" + - stringToString, + `Expected permalink value to be a string. Received \`${typeof buildLink}\` (dynamicPermalink: ${this.#dynamicPermalinkEnabled})${stringToString}`, ); } this.buildLink = buildLink; @@ -175,7 +175,13 @@ class TemplatePermalink { return folders[folders.length - 1] === base; } - static generate(dir, filenameNoExt, extraSubdir, fileExtension = "html") { + static generate( + dir, + filenameNoExt, + extraSubdir, + fileExtension = "html", + isDynamicPermalinkEnabled, + ) { let path; if (fileExtension === "html") { let hasDupeFolder = TemplatePermalink._hasDuplicateFolder(dir, filenameNoExt); @@ -188,7 +194,7 @@ class TemplatePermalink { path = (dir ? dir + "/" : "") + filenameNoExt + "." + fileExtension; } - return new TemplatePermalink(path, extraSubdir); + return new TemplatePermalink(path, extraSubdir, isDynamicPermalinkEnabled); } } From a0fc8f4e72e9aaad0c4b5ae4cd67185bb1695e2f Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Fri, 24 Oct 2025 16:15:41 -0500 Subject: [PATCH 14/50] Fixes #3933 --- src/Template.js | 85 ++++++------------------------ src/TemplateContent.js | 12 ++--- src/TemplateMap.js | 5 ++ src/TemplatePreprocessors.js | 70 ++++++++++++++++++++++++ test/EleventyTest-Preprocessors.js | 38 +++++++++++++ 5 files changed, 136 insertions(+), 74 deletions(-) create mode 100644 src/TemplatePreprocessors.js diff --git a/src/Template.js b/src/Template.js index 32378e800..603e846f7 100755 --- a/src/Template.js +++ b/src/Template.js @@ -9,7 +9,6 @@ import chalk from "./Adapters/Packages/chalk.js"; import ConsoleLogger from "./Util/ConsoleLogger.js"; import getDateFromGitLastUpdated from "./Util/DateGitLastUpdated.js"; import getDateFromGitFirstAdded from "./Util/DateGitFirstAdded.js"; -import TemplateData from "./Data/TemplateData.js"; import TemplateContent from "./TemplateContent.js"; import TemplatePermalink from "./TemplatePermalink.js"; import TemplateLayout from "./TemplateLayout.js"; @@ -24,6 +23,7 @@ import { fromISOtoDateUTC } from "./Util/DateParse.js"; import ReservedData from "./Util/ReservedData.js"; import TransformsUtil from "./Util/TransformsUtil.js"; import { FileSystemManager } from "./Util/FileSystemManager.js"; +import { TemplatePreprocessors } from "./TemplatePreprocessors.js"; const { set: lodashSet, get: lodashGet } = lodash; @@ -34,6 +34,7 @@ class Template extends TemplateContent { #logger; #fsManager; #stats; + #preprocessorCache; constructor(templatePath, templateData, extensionMap, config) { debugDev("new Template(%o)", templatePath); @@ -63,6 +64,8 @@ class Template extends TemplateContent { this.behavior = new TemplateBehavior(this.config); this.behavior.setOutputFormat(this.outputFormat); + + this.templatePreprocessor = new TemplatePreprocessors(this.config.preprocessors); } #initFileSlug() { @@ -129,6 +132,10 @@ class Template extends TemplateContent { super.resetCaches(types); + if (types.data || types.read) { + this.#preprocessorCache = undefined; + } + if (types.data) { delete this._dataCache; // delete this._usePermalinkRoot; @@ -710,82 +717,24 @@ class Template extends TemplateContent { }); } - static async runPreprocessors(inputPath, content, data, preprocessors) { - let skippedVia = false; - for (let [name, preprocessor] of Object.entries(preprocessors)) { - let { filter, callback } = preprocessor; - - let filters; - if (Array.isArray(filter)) { - filters = filter; - } else if (typeof filter === "string") { - filters = filter.split(","); - } else { - throw new Error( - `Expected file extensions passed to "${name}" content preprocessor to be a string or array. Received: ${filter}`, - ); - } - - filters = filters.map((extension) => { - if (extension.startsWith(".") || extension === "*") { - return extension; - } - - return `.${extension}`; - }); - - if (!filters.some((extension) => extension === "*" || inputPath.endsWith(extension))) { - // skip - continue; - } - - try { - let ret = await callback.call( - { - inputPath, - }, - data, - content, - ); - - // Returning explicit false is the same as ignoring the template - if (ret === false) { - skippedVia = name; - continue; - } - - // Different from transforms: returning falsy (not false) here does nothing (skips the preprocessor) - if (ret) { - content = ret; - } - } catch (e) { - throw new EleventyBaseError( - `Preprocessor \`${name}\` encountered an error when transforming ${inputPath}.`, - e, - ); - } + async runPreprocessors(data) { + // @cachedproperty + if (!this.#preprocessorCache) { + this.#preprocessorCache = this.templatePreprocessor.runAll(this, data); } - return { - skippedVia, - content, - }; + return this.#preprocessorCache; } async getTemplates(data) { - let content = await this.getPreRender(); - let { skippedVia, content: rawInput } = await Template.runPreprocessors( - this.inputPath, - content, - data, - this.config.preprocessors, - ); + let { skippedVia: skippedViaPreprocessorName, content: rawInput } = + await this.runPreprocessors(data); - if (skippedVia) { + if (skippedViaPreprocessorName) { debug( "Skipping %o, the %o preprocessor returned an explicit `false`", this.inputPath, - skippedVia, + skippedViaPreprocessorName, ); return []; } diff --git a/src/TemplateContent.js b/src/TemplateContent.js index 4376b6320..4a6b58ada 100644 --- a/src/TemplateContent.js +++ b/src/TemplateContent.js @@ -26,7 +26,7 @@ class TemplateContent { #initialized = false; #config; #templateRender; - #preprocessorEngine; + #renderPreprocessorEngine; #extensionMap; #configOptions; #frontMatterOptions; @@ -52,7 +52,7 @@ class TemplateContent { let preprocessorEngineName = this.templateRender.getPreprocessorEngineName(); if (preprocessorEngineName && this.templateRender.engine.getName() !== preprocessorEngineName) { let engine = await this.templateRender.getEngineByName(preprocessorEngineName); - this.#preprocessorEngine = engine; + this.#renderPreprocessorEngine = engine; } } @@ -445,8 +445,8 @@ class TemplateContent { // checks engines isTemplateCacheable() { - if (this.#preprocessorEngine) { - return this.#preprocessorEngine.cacheable; + if (this.#renderPreprocessorEngine) { + return this.#renderPreprocessorEngine.cacheable; } return this.engine.cacheable; } @@ -549,8 +549,8 @@ class TemplateContent { // Don’t use markdown as the engine to parse for symbols // TODO pass in engineOverride here - if (this.#preprocessorEngine) { - engine = this.#preprocessorEngine; + if (this.#renderPreprocessorEngine) { + engine = this.#renderPreprocessorEngine; } if ("parseForSymbols" in engine) { diff --git a/src/TemplateMap.js b/src/TemplateMap.js index 52cceb187..a32d2e820 100644 --- a/src/TemplateMap.js +++ b/src/TemplateMap.js @@ -69,6 +69,11 @@ class TemplateMap { let data = await template.getData(); let entries = await template.getTemplateMapEntries(data); + let { skippedVia } = await template.runPreprocessors(data); + + if (skippedVia) { + return; + } for (let map of entries) { this.map.push(map); diff --git a/src/TemplatePreprocessors.js b/src/TemplatePreprocessors.js new file mode 100644 index 000000000..6fa35c0d4 --- /dev/null +++ b/src/TemplatePreprocessors.js @@ -0,0 +1,70 @@ +export class TemplatePreprocessors { + constructor(preprocessors) { + this.preprocessors = preprocessors || []; + } + + async runAll(template, data) { + let { inputPath } = template; + let content = await template.getPreRender(); + + let skippedVia = false; + for (let [name, preprocessor] of Object.entries(this.preprocessors)) { + let { filter, callback } = preprocessor; + + let filters; + if (Array.isArray(filter)) { + filters = filter; + } else if (typeof filter === "string") { + filters = filter.split(","); + } else { + throw new Error( + `Expected file extensions passed to "${name}" content preprocessor to be a string or array. Received: ${filter}`, + ); + } + + filters = filters.map((extension) => { + if (extension.startsWith(".") || extension === "*") { + return extension; + } + + return `.${extension}`; + }); + + if (!filters.some((extension) => extension === "*" || inputPath.endsWith(extension))) { + // skip + continue; + } + + try { + let ret = await callback.call( + { + inputPath, + }, + data, + content, + ); + + // Returning explicit false is the same as ignoring the template + if (ret === false) { + skippedVia = name; + continue; + } + + // Different from transforms: returning falsy (not false) here does nothing (skips the preprocessor) + if (ret) { + content = ret; + } + } catch (e) { + throw new Error( + `Preprocessor \`${name}\` encountered an error when transforming ${inputPath}.`, + { cause: e }, + ); + } + } + + return { + skippedVia, + content, + }; + } +} diff --git a/test/EleventyTest-Preprocessors.js b/test/EleventyTest-Preprocessors.js index 2ff5ed08c..9ff63ed93 100644 --- a/test/EleventyTest-Preprocessors.js +++ b/test/EleventyTest-Preprocessors.js @@ -281,3 +281,41 @@ test("addPreprocessor and addExtension with custom `compile` (new render functio t.is(results[0].url, `/template/`); t.is(results[0].content.trim(), `Compiled content`); }); + +// #3933 +test("Tags in pages excluded with preprocessing should not populate collections props", async (t) => { + let preprocessorRuns = 0; + let elev = new Eleventy("./test/stubs-virtual/", undefined, { + config: eleventyConfig => { + eleventyConfig.addPreprocessor("drafts", "njk", (data, content) => { + preprocessorRuns++; + if(data.draft) { + return false; + } + return `Hello ${content}`; + }); + + eleventyConfig.addTemplate("paged.njk", "{{ tag }}", { + pagination: { + data: "collections", + size: 1, + alias: "tag", + filter: ["all"], + }, + permalink: "/{{ tag }}/" + }); + eleventyConfig.addTemplate("source.njk", "Before", { tags: ["yep"] }); + eleventyConfig.addTemplate("source-draft.njk", "Before", { draft: true, tags: ["nope"] }); + } + }); + + let results = await elev.toJSON(); + t.is(preprocessorRuns, 3); + t.is(results.length, 2); + t.truthy(results.find(entry => entry.inputPath.endsWith("source.njk"))); + t.falsy(results.find(entry => entry.inputPath.endsWith("source-draft.njk"))); + + let pages = results.filter(entry => entry.inputPath.endsWith("paged.njk")); + t.is(pages.length, 1); + t.is(pages[0].content, "Hello yep"); +}); From f996b57d071a2d68cfd5473e5e18fac412b67943 Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Fri, 24 Oct 2025 17:25:32 -0500 Subject: [PATCH 15/50] Fixes #3896 (needs a test) --- src/FileSystemSearch.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/FileSystemSearch.js b/src/FileSystemSearch.js index 4f0044e56..53a50bbf9 100644 --- a/src/FileSystemSearch.js +++ b/src/FileSystemSearch.js @@ -1,3 +1,4 @@ +import path from "node:path"; import { glob } from "tinyglobby"; import { TemplatePath } from "@11ty/eleventy-utils"; import debugUtil from "debug"; @@ -31,7 +32,13 @@ class FileSystemSearch { } // Strip leading slashes from everything! - globs = globs.map((entry) => TemplatePath.stripLeadingDotSlash(entry)); + globs = globs.map((entry) => { + // Remap absolute paths to relative paths so that ignores work as expected with cwd, #3896 + if (path.isAbsolute(entry)) { + entry = path.relative(path.resolve("."), entry); + } + return TemplatePath.stripLeadingDotSlash(entry); + }); let cwd = GlobRemap.getCwd(globs); if (cwd) { From 00999a696fb4782d03aa5f7de655f80675cb151a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Oct 2025 12:19:27 +0000 Subject: [PATCH 16/50] Bump liquidjs from 10.21.1 to 10.23.0 Bumps [liquidjs](https://github.com/harttle/liquidjs) from 10.21.1 to 10.23.0. - [Release notes](https://github.com/harttle/liquidjs/releases) - [Changelog](https://github.com/harttle/liquidjs/blob/master/CHANGELOG.md) - [Commits](https://github.com/harttle/liquidjs/compare/v10.21.1...v10.23.0) --- updated-dependencies: - dependency-name: liquidjs dependency-version: 10.23.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 10 +++++----- package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3bd0baa3e..3c3b97e26 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,7 +31,7 @@ "import-module-string": "^2.0.3", "iso-639-1": "^3.1.5", "kleur": "^4.1.5", - "liquidjs": "^10.21.1", + "liquidjs": "^10.23.0", "markdown-it": "^14.1.0", "minimist": "^1.2.8", "moo": "^0.5.2", @@ -6556,9 +6556,9 @@ } }, "node_modules/liquidjs": { - "version": "10.21.1", - "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-10.21.1.tgz", - "integrity": "sha512-NZXmCwv3RG5nire3fmIn9HsOyJX3vo+ptp0yaXUHAMzSNBhx74Hm+dAGJvscUA6lNqbLuYfXgNavRQ9UbUJhQQ==", + "version": "10.23.0", + "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-10.23.0.tgz", + "integrity": "sha512-Chm3luYvACZUj+Wlq7Nxwi0YvGXJv3vx+LPIGfa6n1FaUoMxe8T2M+5S1m2YkSToqJcsxZRK0VeCPZNrSa2yOw==", "license": "MIT", "dependencies": { "commander": "^10.0.0" @@ -6568,7 +6568,7 @@ "liquidjs": "bin/liquid.js" }, "engines": { - "node": ">=14" + "node": ">=16" }, "funding": { "type": "opencollective", diff --git a/package.json b/package.json index 052977ac9..b1a8acf9b 100644 --- a/package.json +++ b/package.json @@ -151,7 +151,7 @@ "import-module-string": "^2.0.3", "iso-639-1": "^3.1.5", "kleur": "^4.1.5", - "liquidjs": "^10.21.1", + "liquidjs": "^10.23.0", "markdown-it": "^14.1.0", "minimist": "^1.2.8", "moo": "^0.5.2", From 24979f2b9d5900ff85538ef31501f63cca905f57 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Oct 2025 16:12:21 +0000 Subject: [PATCH 17/50] Bump semver from 7.7.2 to 7.7.3 Bumps [semver](https://github.com/npm/node-semver) from 7.7.2 to 7.7.3. - [Release notes](https://github.com/npm/node-semver/releases) - [Changelog](https://github.com/npm/node-semver/blob/main/CHANGELOG.md) - [Commits](https://github.com/npm/node-semver/compare/v7.7.2...v7.7.3) --- updated-dependencies: - dependency-name: semver dependency-version: 7.7.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3bd0baa3e..2b5875afb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,7 +41,7 @@ "please-upgrade-node": "^3.2.0", "posthtml": "^0.16.6", "posthtml-match-helper": "^2.0.3", - "semver": "^7.7.2", + "semver": "^7.7.3", "tinyglobby": "^0.2.14" }, "bin": { @@ -9247,9 +9247,9 @@ } }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "license": "ISC", "bin": { "semver": "bin/semver.js" diff --git a/package.json b/package.json index 052977ac9..cfe54d19c 100644 --- a/package.json +++ b/package.json @@ -161,7 +161,7 @@ "please-upgrade-node": "^3.2.0", "posthtml": "^0.16.6", "posthtml-match-helper": "^2.0.3", - "semver": "^7.7.2", + "semver": "^7.7.3", "tinyglobby": "^0.2.14" }, "overrides": { From 228439aedd6bb56ba085c51226df0b72199a4cb3 Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Mon, 27 Oct 2025 11:16:54 -0500 Subject: [PATCH 18/50] Change input and output directories to be relative to fix issues with glob remapping internally #3896 (#3805) --- src/FileSystemSearch.js | 4 ---- src/Util/ProjectDirectories.js | 14 ++++++++++---- test/EleventyTest.js | 9 +++++---- test/Issue3853Test.js | 2 +- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/FileSystemSearch.js b/src/FileSystemSearch.js index 53a50bbf9..430abdd5c 100644 --- a/src/FileSystemSearch.js +++ b/src/FileSystemSearch.js @@ -33,10 +33,6 @@ class FileSystemSearch { // Strip leading slashes from everything! globs = globs.map((entry) => { - // Remap absolute paths to relative paths so that ignores work as expected with cwd, #3896 - if (path.isAbsolute(entry)) { - entry = path.relative(path.resolve("."), entry); - } return TemplatePath.stripLeadingDotSlash(entry); }); diff --git a/src/Util/ProjectDirectories.js b/src/Util/ProjectDirectories.js index e34dd18c4..e75c3b9ae 100644 --- a/src/Util/ProjectDirectories.js +++ b/src/Util/ProjectDirectories.js @@ -134,10 +134,10 @@ class ProjectDirectories { return; } - // Normalize absolute paths to relative, #3805 - // if(path.isAbsolute(dirOrFile)) { - // dirOrFile = path.relative(".", dirOrFile); - // } + // Normalize absolute paths to relative, #3805 #3896 + if (path.isAbsolute(dirOrFile)) { + dirOrFile = path.relative(".", dirOrFile); + } // Input has to exist (assumed glob if it does not exist) let inputExists = existsSync(dirOrFile); @@ -226,6 +226,12 @@ class ProjectDirectories { if (dir !== undefined) { this.#raw.output = dir; + + // Normalize absolute paths to relative, #3805 #3896 + if (path.isAbsolute(dir)) { + dir = path.relative(".", dir); + } + this.#dirs.output = ProjectDirectories.normalizeDirectory(dir || ""); } } diff --git a/test/EleventyTest.js b/test/EleventyTest.js index d59ed1514..1aba319b1 100644 --- a/test/EleventyTest.js +++ b/test/EleventyTest.js @@ -884,16 +884,17 @@ test("setInputDirectory config method #1503 in a plugin throws error", async (t) test("Accepts absolute paths for input and output", async (t) => { let input = path.resolve("./test/noop/"); let output = path.resolve("./test/noop/_site"); + let elev = new Eleventy(input, output); let results = await elev.toJSON(); // trailing slashes are expected - t.is(PathNormalizer.normalizeSeperator(elev.directories.input), PathNormalizer.normalizeSeperator(path.resolve("./test/noop/") + path.sep)); - t.is(PathNormalizer.normalizeSeperator(elev.directories.includes), PathNormalizer.normalizeSeperator(path.resolve("./test/noop/_includes/") + path.sep)); - t.is(PathNormalizer.normalizeSeperator(elev.directories.data), PathNormalizer.normalizeSeperator(path.resolve("./test/noop/_data/") + path.sep)); + t.is(PathNormalizer.normalizeSeperator(elev.directories.input), PathNormalizer.normalizeSeperator("./test/noop/")); + t.is(PathNormalizer.normalizeSeperator(elev.directories.includes), PathNormalizer.normalizeSeperator("./test/noop/_includes/")); + t.is(PathNormalizer.normalizeSeperator(elev.directories.data), PathNormalizer.normalizeSeperator("./test/noop/_data/")); t.is(elev.directories.layouts, undefined); - t.is(PathNormalizer.normalizeSeperator(elev.directories.output), PathNormalizer.normalizeSeperator(path.resolve("./test/noop/_site/") + path.sep)); + t.is(PathNormalizer.normalizeSeperator(elev.directories.output), PathNormalizer.normalizeSeperator("./test/noop/_site/")); }); test("Accepts absolute paths urls for input and output, results output #3805", async (t) => { diff --git a/test/Issue3853Test.js b/test/Issue3853Test.js index 4324d221a..a578a3374 100644 --- a/test/Issue3853Test.js +++ b/test/Issue3853Test.js @@ -18,6 +18,6 @@ test("#3853 absolute path input should strip output from permalink", async (t) = let json = JSON.parse(result); t.is(json.length, 1); - t.is(json[0]?.outputPath, TemplatePath.standardizeFilePath(path.join(output, "index.html"))); + t.is(json[0]?.outputPath, TemplatePath.standardizeFilePath("./public/site/index.html")); t.is(json[0]?.content.trim(), "3853"); }); From f8f3067af7735b0e50f503c2fea61b6c424945dc Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Mon, 27 Oct 2025 11:29:13 -0500 Subject: [PATCH 19/50] Test for #3896 --- .../3896/eleventy-input-folder/3896.html | 1 + .../_archive/ignored.html | 1 + .../3896/test-files/eleventy.config.js | 15 +++++++++++++ .../_issues/3896/test-files/issue3896-test.js | 21 +++++++++++++++++++ 4 files changed, 38 insertions(+) create mode 100644 test/_issues/3896/eleventy-input-folder/3896.html create mode 100644 test/_issues/3896/eleventy-input-folder/_archive/ignored.html create mode 100644 test/_issues/3896/test-files/eleventy.config.js create mode 100644 test/_issues/3896/test-files/issue3896-test.js diff --git a/test/_issues/3896/eleventy-input-folder/3896.html b/test/_issues/3896/eleventy-input-folder/3896.html new file mode 100644 index 000000000..d2b0390d9 --- /dev/null +++ b/test/_issues/3896/eleventy-input-folder/3896.html @@ -0,0 +1 @@ +Issue 3896 \ No newline at end of file diff --git a/test/_issues/3896/eleventy-input-folder/_archive/ignored.html b/test/_issues/3896/eleventy-input-folder/_archive/ignored.html new file mode 100644 index 000000000..47daf8125 --- /dev/null +++ b/test/_issues/3896/eleventy-input-folder/_archive/ignored.html @@ -0,0 +1 @@ +This should be ignored \ No newline at end of file diff --git a/test/_issues/3896/test-files/eleventy.config.js b/test/_issues/3896/test-files/eleventy.config.js new file mode 100644 index 000000000..9b5b81641 --- /dev/null +++ b/test/_issues/3896/test-files/eleventy.config.js @@ -0,0 +1,15 @@ +import path from "node:path"; + +export default function(cfg) { + // Works + // cfg.ignores.add("../**/_archive/**"); + + cfg.ignores.add("**/_archive/**"); +}; + +export const config = { + dir: { + input: path.resolve("../eleventy-input-folder"), + output: path.resolve("../_site") + } +} \ No newline at end of file diff --git a/test/_issues/3896/test-files/issue3896-test.js b/test/_issues/3896/test-files/issue3896-test.js new file mode 100644 index 000000000..2e8af69eb --- /dev/null +++ b/test/_issues/3896/test-files/issue3896-test.js @@ -0,0 +1,21 @@ +import test from "ava"; +import { TemplatePath } from "@11ty/eleventy-utils"; + +import { spawnAsync } from "../../../../src/Util/spawn.js"; + +test("#3896 ignores should respect relative parent directory ../", async (t) => { + let result = await spawnAsync( + "node", + ["../../../../cmd.cjs", "--to=json"], + { + cwd: "test/_issues/3896/test-files/" + } + ); + + let json = JSON.parse(result); + + t.is(json.length, 1); + t.is(json[0]?.outputPath, TemplatePath.standardizeFilePath("../_site/3896/index.html")); + t.is(json[0]?.content.trim(), "Issue 3896"); +}); + From 6d22424bce469e93112f8252e1852a03a49391c0 Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Mon, 27 Oct 2025 11:32:01 -0500 Subject: [PATCH 20/50] Removed unused path --- src/FileSystemSearch.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/FileSystemSearch.js b/src/FileSystemSearch.js index 430abdd5c..43c486d46 100644 --- a/src/FileSystemSearch.js +++ b/src/FileSystemSearch.js @@ -1,4 +1,3 @@ -import path from "node:path"; import { glob } from "tinyglobby"; import { TemplatePath } from "@11ty/eleventy-utils"; import debugUtil from "debug"; From ecf5163ef74c798f6122b47aec83900ba3404778 Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Mon, 27 Oct 2025 12:15:04 -0500 Subject: [PATCH 21/50] Add stub issue --- test/_issues/0/content/index.html | 1 + test/_issues/0/eleventy.config.js | 6 ++++++ test/_issues/0/issue-0-test.js | 22 ++++++++++++++++++++++ 3 files changed, 29 insertions(+) create mode 100644 test/_issues/0/content/index.html create mode 100644 test/_issues/0/eleventy.config.js create mode 100644 test/_issues/0/issue-0-test.js diff --git a/test/_issues/0/content/index.html b/test/_issues/0/content/index.html new file mode 100644 index 000000000..f7d993e06 --- /dev/null +++ b/test/_issues/0/content/index.html @@ -0,0 +1 @@ +

HTML

diff --git a/test/_issues/0/eleventy.config.js b/test/_issues/0/eleventy.config.js new file mode 100644 index 000000000..7ffc9d7be --- /dev/null +++ b/test/_issues/0/eleventy.config.js @@ -0,0 +1,6 @@ +export default function(cfg) { +}; + +export const config = { + dir: {} +} diff --git a/test/_issues/0/issue-0-test.js b/test/_issues/0/issue-0-test.js new file mode 100644 index 000000000..ec08c2c01 --- /dev/null +++ b/test/_issues/0/issue-0-test.js @@ -0,0 +1,22 @@ +import test from "ava"; +import { fileURLToPath } from "node:url"; +import { parse } from "node:path"; +import { spawnAsync } from "../../../src/Util/spawn.js"; + +const CURRENT_DIR = parse(fileURLToPath(import.meta.url)).dir; + +test.skip("Issue #0 (this is a stub file)", async (t) => { + let result = await spawnAsync( + "node", + ["../../../cmd.cjs", "--to=json"], + { + cwd: CURRENT_DIR, + } + ); + + let json = JSON.parse(result); + + t.is(json.length, 1); + t.is(json[0]?.content.trim(), "

HTML

"); +}); + From 88ea807b21c34fadbdff7d51eaf81d689c7c695a Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Mon, 27 Oct 2025 12:16:13 -0500 Subject: [PATCH 22/50] dev package metadata --- package-lock.json | 78 ++++++++++++++++++++++------------------------- 1 file changed, 37 insertions(+), 41 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3c3b97e26..3738159f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2295,8 +2295,7 @@ "optional": true, "os": [ "android" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-android-arm64": { "version": "4.49.0", @@ -2310,8 +2309,7 @@ "optional": true, "os": [ "android" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.49.0", @@ -2325,8 +2323,7 @@ "optional": true, "os": [ "darwin" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-darwin-x64": { "version": "4.49.0", @@ -2340,8 +2337,7 @@ "optional": true, "os": [ "darwin" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-freebsd-arm64": { "version": "4.49.0", @@ -2355,8 +2351,7 @@ "optional": true, "os": [ "freebsd" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-freebsd-x64": { "version": "4.49.0", @@ -2370,8 +2365,7 @@ "optional": true, "os": [ "freebsd" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { "version": "4.49.0", @@ -2385,8 +2379,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { "version": "4.49.0", @@ -2400,8 +2393,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { "version": "4.49.0", @@ -2415,8 +2407,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { "version": "4.49.0", @@ -2430,8 +2421,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { "version": "4.49.0", @@ -2445,8 +2435,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { "version": "4.49.0", @@ -2460,8 +2449,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { "version": "4.49.0", @@ -2475,8 +2463,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { "version": "4.49.0", @@ -2490,8 +2477,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { "version": "4.49.0", @@ -2505,8 +2491,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.49.0", @@ -2520,8 +2505,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-linux-x64-musl": { "version": "4.49.0", @@ -2535,8 +2519,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { "version": "4.49.0", @@ -2550,8 +2533,7 @@ "optional": true, "os": [ "win32" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { "version": "4.49.0", @@ -2565,8 +2547,7 @@ "optional": true, "os": [ "win32" - ], - "peer": true + ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { "version": "4.49.0", @@ -2580,8 +2561,7 @@ "optional": true, "os": [ "win32" - ], - "peer": true + ] }, "node_modules/@sindresorhus/merge-streams": { "version": "2.3.0", @@ -2650,6 +2630,7 @@ "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -2701,6 +2682,7 @@ "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/ms": "*" } @@ -2783,6 +2765,7 @@ "integrity": "sha512-m5ObIqwsUp6BZzyiy4RdZpzWGub9bqLJMvZDD0QMXhxjqMHMENlj+SqF5QxoUwaQNFe+8kz8XM8ZQhqkQPTgMQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -2848,6 +2831,7 @@ "integrity": "sha512-tJxiPrWmzH8a+w9nLKlQMzAKX/7VjFs50MWgcAj7p9XQ7AQ9/35fByFYptgPELyLw+0aixTnC4pUWV+APcZ/kw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@testing-library/dom": "^10.4.0", "@testing-library/user-event": "^14.6.1", @@ -3157,6 +3141,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -4757,6 +4742,7 @@ "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", @@ -8544,6 +8530,7 @@ "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.16.6.tgz", "integrity": "sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==", "license": "MIT", + "peer": true, "dependencies": { "posthtml-parser": "^0.11.0", "posthtml-render": "^3.0.0" @@ -8792,6 +8779,7 @@ "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -9211,6 +9199,7 @@ "integrity": "sha512-aFOZHGf+ur+bp1bCHZ+u8otKGh77ZtmFyXDo4tlYvT7PWql41Kwd8wdkPqhhT+h2879IVblcHFglIMofsFd1EA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", @@ -10050,7 +10039,8 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/tsx": { "version": "4.20.5", @@ -10058,6 +10048,7 @@ "integrity": "sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" @@ -10104,6 +10095,7 @@ "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -10408,6 +10400,7 @@ "integrity": "sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -10506,6 +10499,7 @@ "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", @@ -10579,6 +10573,7 @@ "integrity": "sha512-2sBz0x/wis5TkF1XZ2vH25zWq3G1bFEPOfkBcx2ikowmphoQsPH6X0V3mmPCXA2K1N/XGTnifVyDQP4GfDDeQw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vue/compiler-dom": "3.5.20", "@vue/compiler-sfc": "3.5.20", @@ -10979,6 +10974,7 @@ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } From 96fb97e4007269501081d90ef0a9a52368556057 Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Mon, 27 Oct 2025 12:16:33 -0500 Subject: [PATCH 23/50] Fixes #3932 --- src/TemplateFileSlug.js | 2 +- test/_issues/3932/1/2025.html | 1 + test/_issues/3932/eleventy.config.js | 6 ++++++ test/_issues/3932/issue-3932-test.js | 24 ++++++++++++++++++++++++ 4 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 test/_issues/3932/1/2025.html create mode 100644 test/_issues/3932/eleventy.config.js create mode 100644 test/_issues/3932/issue-3932-test.js diff --git a/src/TemplateFileSlug.js b/src/TemplateFileSlug.js index 03c9a29ef..143e7a3e1 100644 --- a/src/TemplateFileSlug.js +++ b/src/TemplateFileSlug.js @@ -9,7 +9,7 @@ class TemplateFileSlug { } this.inputPath = inputPath; - this.cleanInputPath = inputPath.replace(/^.\//, ""); + this.cleanInputPath = TemplatePath.stripLeadingDotSlash(inputPath); let dirs = this.cleanInputPath.split("/"); this.dirs = dirs; diff --git a/test/_issues/3932/1/2025.html b/test/_issues/3932/1/2025.html new file mode 100644 index 000000000..e4c457763 --- /dev/null +++ b/test/_issues/3932/1/2025.html @@ -0,0 +1 @@ +{{ page.filePathStem }} diff --git a/test/_issues/3932/eleventy.config.js b/test/_issues/3932/eleventy.config.js new file mode 100644 index 000000000..7ffc9d7be --- /dev/null +++ b/test/_issues/3932/eleventy.config.js @@ -0,0 +1,6 @@ +export default function(cfg) { +}; + +export const config = { + dir: {} +} diff --git a/test/_issues/3932/issue-3932-test.js b/test/_issues/3932/issue-3932-test.js new file mode 100644 index 000000000..1c664fef1 --- /dev/null +++ b/test/_issues/3932/issue-3932-test.js @@ -0,0 +1,24 @@ +import test from "ava"; +import { fileURLToPath } from "node:url"; +import { parse } from "node:path"; +import { spawnAsync } from "../../../src/Util/spawn.js"; + +const CURRENT_DIR = parse(fileURLToPath(import.meta.url)).dir; + +test.only("Issue #3932", async (t) => { + let result = await spawnAsync( + "node", + ["../../../cmd.cjs", "--to=json"], + { + cwd: CURRENT_DIR, + } + ); + + let json = JSON.parse(result); + + t.is(json.length, 1); + t.is(json[0]?.inputPath.trim(), "./1/2025.html"); + t.is(json[0]?.content.trim(), "/1/2025"); + t.is(json[0]?.outputPath.trim(), "./_site/1/2025/index.html"); +}); + From beb929deb91525eb8cd82bd40f5d3d43f6f3f474 Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Wed, 29 Oct 2025 13:02:53 -0500 Subject: [PATCH 24/50] Tests for #3912 --- src/Template.js | 2 ++ src/Util/DateGitFirstAdded.js | 1 + src/Util/DateGitLastUpdated.js | 1 + test/EleventyTest.js | 6 +++++- 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Template.js b/src/Template.js index 603e846f7..59a247571 100755 --- a/src/Template.js +++ b/src/Template.js @@ -1063,6 +1063,7 @@ class Template extends TemplateContent { if (dateValue.toLowerCase() === "git last modified") { let d = await getDateFromGitLastUpdated(this.inputPath); if (d) { + debug(`getMappedDate: found git last modified date for ${this.inputPath}: %o`, d); return d; } @@ -1075,6 +1076,7 @@ class Template extends TemplateContent { if (dateValue.toLowerCase() === "git created") { let d = await getDateFromGitFirstAdded(this.inputPath); if (d) { + debug(`getMappedDate: found git created date for ${this.inputPath}: %o`, d); return d; } diff --git a/src/Util/DateGitFirstAdded.js b/src/Util/DateGitFirstAdded.js index 05d7f3efc..4140748b8 100644 --- a/src/Util/DateGitFirstAdded.js +++ b/src/Util/DateGitFirstAdded.js @@ -8,6 +8,7 @@ async function getGitFirstAddedTimeStamp(filePath) { // %at author date, UNIX timestamp ["log", "--diff-filter=A", "--follow", "-1", "--format=%at", filePath], ); + // parseInt removes trailing \n return parseInt(timestamp, 10) * 1000; } catch (e) { // do nothing diff --git a/src/Util/DateGitLastUpdated.js b/src/Util/DateGitLastUpdated.js index 85e270f8c..9517cbdcb 100644 --- a/src/Util/DateGitLastUpdated.js +++ b/src/Util/DateGitLastUpdated.js @@ -8,6 +8,7 @@ async function getGitLastUpdatedTimeStamp(filePath) { // %at author date, UNIX timestamp ["log", "-1", "--format=%at", filePath], ); + // parseInt removes trailing \n return parseInt(timestamp, 10) * 1000; } catch (e) { // do nothing diff --git a/test/EleventyTest.js b/test/EleventyTest.js index 1aba319b1..4a22e0db5 100644 --- a/test/EleventyTest.js +++ b/test/EleventyTest.js @@ -429,8 +429,10 @@ test("#142: date 'git Last Modified' populates page.date", async (t) => { let results = await elev.toJSON(); let [result] = results; - // This doesn’t test the validity of the function, only that it populates page.date. + // Warning: this doesn’t test the validity of the function, only that it populates page.date. let comparisonDate = await DateGitLastUpdated("./test/stubs-142/index.njk"); + t.truthy(result.content.trim()); + t.truthy(comparisonDate.getTime()); t.is(result.content.trim(), "" + comparisonDate.getTime()); }); @@ -541,6 +543,8 @@ test("#2224: date 'git created' populates page.date", async (t) => { // This doesn’t test the validity of the function, only that it populates page.date. let comparisonDate = await DateGitFirstAdded("./test/stubs-2224/index.njk"); + t.truthy(result.content.trim()); + t.truthy(comparisonDate.getTime()); t.is(result.content.trim(), "" + comparisonDate.getTime()); }); From 41255c784ddfd44580dbec02d4d74afc5da89e0b Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Wed, 29 Oct 2025 16:57:10 -0500 Subject: [PATCH 25/50] Fixes #3917 --- src/Engines/FrontMatter/JavaScript.js | 4 +++- src/Util/RetrieveGlobals.js | 9 +++++++-- test/JavaScriptFrontMatterTest.js | 26 ++++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/Engines/FrontMatter/JavaScript.js b/src/Engines/FrontMatter/JavaScript.js index 652fd50ca..8d9167daf 100644 --- a/src/Engines/FrontMatter/JavaScript.js +++ b/src/Engines/FrontMatter/JavaScript.js @@ -7,7 +7,9 @@ export default function (frontMatterCode, context = {}) { // Legacy `javascript` type was removed in @11ty/gray-matter@2 to avoid eval() let trimmed = frontMatterCode.trimStart(); if (trimmed.startsWith("{")) { - return RetrieveGlobals(`export default ${trimmed}`, filePath).then((res) => { + return RetrieveGlobals(`export default ${trimmed}`, filePath, { + isJavaScriptFrontMatterCompat: true, // turns off implicit exports + }).then((res) => { return res.default; }); } diff --git a/src/Util/RetrieveGlobals.js b/src/Util/RetrieveGlobals.js index 569a1189a..932c18803 100644 --- a/src/Util/RetrieveGlobals.js +++ b/src/Util/RetrieveGlobals.js @@ -2,7 +2,11 @@ import { RetrieveGlobals as NodeRetrieveGlobals } from "node-retrieve-globals"; import { parseCode, walkCode, importFromString } from "import-module-string"; import { isBuiltin } from "node:module"; -export async function RetrieveGlobals(code, filePath) { +export async function RetrieveGlobals(code, filePath, options = {}) { + let { isJavaScriptFrontMatterCompat } = Object.assign( + { isJavaScriptFrontMatterCompat: false }, + options, + ); let data = { page: { // Theoretically fileSlug and filePathStem could be added here but require extensionMap @@ -15,7 +19,8 @@ export async function RetrieveGlobals(code, filePath) { let nonBuiltinImports = Array.from(imports).filter((name) => !isBuiltin(name)); if (nonBuiltinImports.length === 0) { - return importFromString(code, { ast, data, filePath }); + let implicitExports = isJavaScriptFrontMatterCompat ? false : true; + return importFromString(code, { ast, data, filePath, implicitExports }); } // TODO re-use already parsed AST from `import-module-string` in `node-retrieve-globals` diff --git a/test/JavaScriptFrontMatterTest.js b/test/JavaScriptFrontMatterTest.js index a010a8e7f..f446efe2f 100644 --- a/test/JavaScriptFrontMatterTest.js +++ b/test/JavaScriptFrontMatterTest.js @@ -39,3 +39,29 @@ test("Custom Front Matter Parsing Options (using backwards-compatible `js` inste t.is(result[0]?.content, `
HELLO!
`); }); + +// https://github.com/11ty/eleventy/issues/3917 +test("Issue #3917 previous JS object front matter shouldn’t have had implicit exports turned on", async (t) => { + let elev = new Eleventy("./test/stubs-virtual-nowrite", "./test/stubs-virtual-nowrite/_site", { + config: function(eleventyConfig) { + eleventyConfig.addTemplate("test.njk", `---js +{ + eleventyComputed: { + summary: async function (data) { + let textInsert = data ? 'something' : 'nothing'; + return "Some text"; + } + } +} +--- +Hello`); + } + }); + elev.disableLogger(); + + let result = await elev.toJSON(); + + t.deepEqual(result.length, 1); + + t.is(result[0]?.content, `Hello`); +}); From 99aa77a8cda377dd7fa0ac2d5c564dc11a44bbbc Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Thu, 30 Oct 2025 16:43:45 -0500 Subject: [PATCH 26/50] Fixes #3899 and changes watch to only spider active config file --- package-lock.json | 12 ++++---- package.json | 2 +- src/Eleventy.js | 19 ++++++------ src/TemplateConfig.js | 16 ++++++++-- src/Util/ExistsCache.js | 5 ++++ src/Util/JavaScriptDependencies.js | 38 +++++++++++++++++++++-- src/Util/{SetUnion.js => SetUtil.js} | 4 +-- src/WatchTargets.js | 45 ++++++++++++++++++++-------- test/EleventyTest.js | 20 ++++--------- test/UtilSetUnionTest.js | 10 +++---- 10 files changed, 115 insertions(+), 56 deletions(-) rename src/Util/{SetUnion.js => SetUtil.js} (69%) diff --git a/package-lock.json b/package-lock.json index 3738159f3..40082f671 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ ], "dependencies": { "@11ty/dependency-tree": "^4.0.0", - "@11ty/dependency-tree-esm": "^2.0.0", + "@11ty/dependency-tree-esm": "^2.0.2", "@11ty/eleventy-dev-server": "3.0.0-alpha.3", "@11ty/eleventy-plugin-bundle": "^3.0.7", "@11ty/eleventy-utils": "^2.0.7", @@ -106,13 +106,13 @@ } }, "node_modules/@11ty/dependency-tree-esm": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@11ty/dependency-tree-esm/-/dependency-tree-esm-2.0.0.tgz", - "integrity": "sha512-+4ySOON4aEAiyAGuH6XQJtxpGSpo6nibfG01krgix00sqjhman2+UaDUopq6Ksv8/jBB3hqkhsHe3fDE4z8rbA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@11ty/dependency-tree-esm/-/dependency-tree-esm-2.0.2.tgz", + "integrity": "sha512-kSTmXneksQLBhwsfqjxiSi9ecRKENXmRtT5RG95rFoWSI8kkwLcGlYpoXsPkCD9uQwSU1rmDzXBDnqUJlWaIyw==", "license": "MIT", "dependencies": { - "@11ty/eleventy-utils": "^2.0.1", - "acorn": "^8.14.0", + "@11ty/eleventy-utils": "^2.0.7", + "acorn": "^8.15.0", "dependency-graph": "^1.0.0", "normalize-path": "^3.0.0" } diff --git a/package.json b/package.json index b1a8acf9b..54ece3dfe 100644 --- a/package.json +++ b/package.json @@ -133,7 +133,7 @@ }, "dependencies": { "@11ty/dependency-tree": "^4.0.0", - "@11ty/dependency-tree-esm": "^2.0.0", + "@11ty/dependency-tree-esm": "^2.0.2", "@11ty/eleventy-dev-server": "3.0.0-alpha.3", "@11ty/eleventy-plugin-bundle": "^3.0.7", "@11ty/eleventy-utils": "^2.0.7", diff --git a/src/Eleventy.js b/src/Eleventy.js index e95d7752d..3f19cdb6e 100644 --- a/src/Eleventy.js +++ b/src/Eleventy.js @@ -126,6 +126,7 @@ export default class Eleventy extends Core { } shouldTriggerConfigReset(changedFiles) { + // looks for all eligible config files (not just the active one, handles config file rename) let configFilePaths = new Set(this.eleventyConfig.getLocalProjectConfigFiles()); // https://www.11ty.dev/docs/watch-serve/#reset-configuration @@ -142,7 +143,7 @@ export default class Eleventy extends Core { } } - for (const configFilePath of configFilePaths) { + for (let configFilePath of configFilePaths) { // Any dependencies of the config file changed let configFileDependencies = new Set(this.watchTargets.getDependenciesOf(configFilePath)); @@ -297,7 +298,7 @@ export default class Eleventy extends Core { this.watchTargets.add(this.eleventyFiles.getIgnoreFiles()); // Watch the local project config file - this.watchTargets.add(this.eleventyConfig.getLocalProjectConfigFiles()); + this.watchTargets.add(this.eleventyConfig.getActiveConfigPath()); // Template and Directory Data Files this.watchTargets.add(await this.eleventyFiles.getGlobWatcherTemplateDataFiles()); @@ -401,12 +402,6 @@ export default class Eleventy extends Core { return; } - // TODO use DirContains - let dataDir = TemplatePath.stripLeadingDotSlash(this.templateData.getDataDir()); - function filterOutGlobalDataFiles(path) { - return !dataDir || !TemplatePath.stripLeadingDotSlash(path).startsWith(dataDir); - } - // Lazy resolve isEsm only for --watch this.watchTargets.setProjectUsingEsm(this.isEsm); @@ -414,9 +409,15 @@ export default class Eleventy extends Core { let templateFiles = await this.eleventyFiles.getWatchPathCache(); await this.watchTargets.addDependencies(templateFiles); + // TODO use DirContains + let dataDir = TemplatePath.stripLeadingDotSlash(this.templateData.getDataDir()); + function filterOutGlobalDataFiles(path) { + return !dataDir || !TemplatePath.stripLeadingDotSlash(path).startsWith(dataDir); + } + // Config file dependencies await this.watchTargets.addDependencies( - this.eleventyConfig.getLocalProjectConfigFiles(), + this.eleventyConfig.getActiveConfigPath(), filterOutGlobalDataFiles, ); diff --git a/src/TemplateConfig.js b/src/TemplateConfig.js index 3f7c31aa3..dbee0f852 100644 --- a/src/TemplateConfig.js +++ b/src/TemplateConfig.js @@ -52,6 +52,7 @@ class TemplateConfig { #existsCache = new ExistsCache(); #usesGraph; #previousBuildModifiedFile; + #activeConfigPath; constructor(customRootConfig, projectConfigPath) { /** @type {object} */ @@ -173,7 +174,7 @@ class TemplateConfig { */ getLocalProjectConfigFile() { let configFiles = this.getLocalProjectConfigFiles(); - let configFile = configFiles.find((path) => path && existsSync(path)); + let configFile = configFiles.find((path) => path && this.existsCache.exists(path)); if (configFile) { return configFile; } @@ -187,6 +188,13 @@ class TemplateConfig { return []; } + getActiveConfigPath() { + if (!this.#activeConfigPath) { + this.#activeConfigPath = this.getLocalProjectConfigFile(); + } + return this.#activeConfigPath; + } + setProjectUsingEsm(isEsmProject) { this.isEsm = !!isEsmProject; this.usesGraph.setIsEsm(isEsmProject); @@ -200,6 +208,8 @@ class TemplateConfig { * Resets the configuration. */ async reset() { + this.#existsCache.reset(); + debugDev("Resetting configuration: TemplateConfig and UserConfig."); this.userConfig.reset(); this.usesGraph.reset(); // needs to be before forceReloadConfig #3711 @@ -228,6 +238,8 @@ class TemplateConfig { * Async-friendly init method */ async init(overrides) { + this.#activeConfigPath = undefined; // reset + await this.initializeRootConfig(); if (overrides) { @@ -382,7 +394,7 @@ class TemplateConfig { let localConfig = {}; let exportedConfig = {}; - let path = this.projectConfigPaths.filter((path) => path).find((path) => existsSync(path)); + let path = this.getActiveConfigPath(); if (this.projectConfigPaths.length > 0 && this.#configManuallyDefined && !path) { throw new EleventyConfigError( diff --git a/src/Util/ExistsCache.js b/src/Util/ExistsCache.js index 77ef5f950..92fdcaf2d 100644 --- a/src/Util/ExistsCache.js +++ b/src/Util/ExistsCache.js @@ -10,6 +10,11 @@ class ExistsCache { this.lookupCount = 0; } + reset() { + this.#exists = new Map(); + this.#dirs = new Map(); + } + get size() { return this.#exists.size; } diff --git a/src/Util/JavaScriptDependencies.js b/src/Util/JavaScriptDependencies.js index 7f6e80939..ca8e551aa 100644 --- a/src/Util/JavaScriptDependencies.js +++ b/src/Util/JavaScriptDependencies.js @@ -1,7 +1,9 @@ import dependencyTree from "@11ty/dependency-tree"; -import { find } from "@11ty/dependency-tree-esm"; +import { find, findGraph, mergeGraphs } from "@11ty/dependency-tree-esm"; import { TemplatePath } from "@11ty/eleventy-utils"; +import { DepGraph } from "dependency-graph"; +import { union } from "./SetUtil.js"; import EleventyBaseError from "../Errors/EleventyBaseError.js"; class JavaScriptDependencies { @@ -9,7 +11,7 @@ class JavaScriptDependencies { return `A problem was encountered looking for JavaScript dependencies in ${type} file: ${file}. This only affects --watch and --serve behavior and does not affect your build.`; } - static async getDependencies(inputFiles, isProjectUsingEsm) { + static async getCommonJsDependencies(inputFiles, isProjectUsingEsm) { let depSet = new Set(); // TODO does this need to work with aliasing? what other JS extensions will have deps? @@ -34,6 +36,12 @@ class JavaScriptDependencies { } } + return depSet; + } + + static async getEsmDependencies(inputFiles, isProjectUsingEsm) { + let depSet = new Set(); + let esmFiles = inputFiles.filter( (file) => (isProjectUsingEsm && file.endsWith(".js")) || file.endsWith(".mjs"), ); @@ -48,7 +56,31 @@ class JavaScriptDependencies { } } - return Array.from(depSet).sort(); + return depSet; + } + + static async getDependencies(inputFiles, isProjectUsingEsm) { + let cjs = await this.getCommonJsDependencies(inputFiles, isProjectUsingEsm); + let esm = await this.getEsmDependencies(inputFiles, isProjectUsingEsm); + return Array.from(union(cjs, esm)); + } + + static async getEsmGraph(inputFiles, isProjectUsingEsm) { + let rootGraph = new DepGraph(); + let esmFiles = inputFiles.filter( + (file) => (isProjectUsingEsm && file.endsWith(".js")) || file.endsWith(".mjs"), + ); + for (let file of esmFiles) { + try { + let graph = await findGraph(file); + + mergeGraphs(rootGraph, graph); + } catch (e) { + throw new EleventyBaseError(this.getErrorMessage(file, "ESM"), e); + } + } + + return rootGraph; } } diff --git a/src/Util/SetUnion.js b/src/Util/SetUtil.js similarity index 69% rename from src/Util/SetUnion.js rename to src/Util/SetUtil.js index 50e6b9c64..ec31e80d1 100644 --- a/src/Util/SetUnion.js +++ b/src/Util/SetUtil.js @@ -1,4 +1,4 @@ -function setUnion(...sets) { +export function union(...sets) { let root = new Set(); for (let set of sets) { for (let entry of set) { @@ -7,5 +7,3 @@ function setUnion(...sets) { } return root; } - -export { setUnion }; diff --git a/src/WatchTargets.js b/src/WatchTargets.js index b99b185ed..ac3ef51ca 100644 --- a/src/WatchTargets.js +++ b/src/WatchTargets.js @@ -1,5 +1,6 @@ import { TemplatePath } from "@11ty/eleventy-utils"; import { DepGraph } from "dependency-graph"; +import { mergeGraphs } from "@11ty/dependency-tree-esm"; import JavaScriptDependencies from "./Util/JavaScriptDependencies.js"; import eventBus from "./EventBus.js"; @@ -74,7 +75,7 @@ export default class WatchTargets { } } - static normalize(targets) { + static toArray(targets) { if (!targets) { return []; } else if (Array.isArray(targets)) { @@ -86,11 +87,11 @@ export default class WatchTargets { // add only a target add(targets) { - this.addRaw(WatchTargets.normalize(targets)); + this.addRaw(WatchTargets.toArray(targets)); } static normalizeToGlobs(targets) { - return WatchTargets.normalize(targets).map((entry) => + return WatchTargets.toArray(targets).map((entry) => TemplatePath.convertToRecursiveGlobSync(entry), ); } @@ -101,16 +102,35 @@ export default class WatchTargets { return; } - targets = WatchTargets.normalize(targets); - let deps = await JavaScriptDependencies.getDependencies(targets, this.isEsm); + targets = WatchTargets.toArray(targets); + let cjsDeps = Array.from( + await JavaScriptDependencies.getCommonJsDependencies(targets, this.isEsm), + ); if (filterCallback) { - deps = deps.filter(filterCallback); + cjsDeps = cjsDeps.filter(filterCallback); } - for (let target of targets) { - this.addToDependencyGraph(target, deps); + this.addToDependencyGraph(target, cjsDeps); + } + this.addRaw(cjsDeps, true); + + let esmGraph = await JavaScriptDependencies.getEsmGraph(targets, this.isEsm); + if (filterCallback) { + for (let node of esmGraph.overallOrder()) { + if (!filterCallback(node)) { + esmGraph.removeNode(node); + } + } + } + + mergeGraphs(this.graph, esmGraph); + + // ESM graph includes original targets, which we do not want for addRaw so we’ll remove them before adding + let rawEsmGraph = esmGraph.clone(); + for (let t of targets) { + rawEsmGraph.removeNode(t); } - this.addRaw(deps, true); + this.addRaw(rawEsmGraph.overallOrder(), true); } setWriter(templateWriter) { @@ -134,10 +154,9 @@ export default class WatchTargets { } // Use GlobalDependencyMap - if (this.#templateConfig) { - for (let dep of this.#templateConfig.usesGraph.getDependantsFor(filePath)) { - paths.add(dep); - } + let dependantsMapped = this.#templateConfig?.usesGraph.getDependantsFor(filePath) || []; + for (let dep of dependantsMapped) { + paths.add(dep); } } diff --git a/test/EleventyTest.js b/test/EleventyTest.js index 4a22e0db5..22e036497 100644 --- a/test/EleventyTest.js +++ b/test/EleventyTest.js @@ -120,6 +120,7 @@ test("Eleventy file watching", async (t) => { await elev.startWatch(); let { targets, ignores } = await elev.getWatchedTargets(); + await elev.stopWatch(); t.deepEqual(targets, [ "./package.json", @@ -129,10 +130,6 @@ test("Eleventy file watching", async (t) => { "./.gitignore", "./.eleventyignore", "./test/stubs/.eleventyignore", - "./.eleventy.js", - "./eleventy.config.js", - "./eleventy.config.mjs", - "./eleventy.config.cjs", "./test/stubs/**/*.{json,11tydata.mjs,11tydata.cjs,11tydata.js}", "./test/stubs/deps/dep1.cjs", "./test/stubs/deps/dep2.cjs", @@ -143,8 +140,6 @@ test("Eleventy file watching", async (t) => { t.true(ignores.includes("test/stubs/_site/**")); t.true(ignores.includes("./.git/**")); t.true(ignores.includes(".cache")); - - await elev.stopWatch(); }); test("Eleventy file watching (don’t watch deps of passthrough copy .js files)", async (t) => { @@ -156,9 +151,10 @@ test("Eleventy file watching (don’t watch deps of passthrough copy .js files)" await elev.eleventyFiles.getFiles(); await elev.startWatch(); - t.deepEqual(await elev.eleventyFiles.getWatchPathCache(), ["./test/stubs-1325/test.11ty.js"]); + let paths = await elev.eleventyFiles.getWatchPathCache(); + await elev.stopWatch(); - await elev.stopWatch(); + t.deepEqual(paths, ["./test/stubs-1325/test.11ty.js"]); }); test("Eleventy file watching (no JS dependencies)", async (t) => { @@ -175,6 +171,8 @@ test("Eleventy file watching (no JS dependencies)", async (t) => { let { targets, ignores } = await elev.getWatchedTargets(); + await elev.stopWatch(); + t.deepEqual(targets, [ "./package.json", "./test/stubs/**/*.njk", @@ -183,10 +181,6 @@ test("Eleventy file watching (no JS dependencies)", async (t) => { "./.gitignore", "./.eleventyignore", "./test/stubs/.eleventyignore", - "./.eleventy.js", - "./eleventy.config.js", - "./eleventy.config.mjs", - "./eleventy.config.cjs", "./test/stubs/**/*.{json,11tydata.mjs,11tydata.cjs,11tydata.js}", ]); @@ -195,8 +189,6 @@ test("Eleventy file watching (no JS dependencies)", async (t) => { t.true(ignores.includes("test/stubs/_site/**")); t.true(ignores.includes("./.git/**")); t.true(ignores.includes(".cache")); - - await elev.stopWatch(); }); test("Eleventy set input/output, one file input", async (t) => { diff --git a/test/UtilSetUnionTest.js b/test/UtilSetUnionTest.js index 0636d9e28..329696bc7 100644 --- a/test/UtilSetUnionTest.js +++ b/test/UtilSetUnionTest.js @@ -1,24 +1,24 @@ import test from "ava"; -import { setUnion } from "../src/Util/SetUnion.js"; +import { union } from "../src/Util/SetUtil.js"; test("Basic set union (zero)", t => { - t.deepEqual(setUnion(), new Set()); + t.deepEqual(union(), new Set()); }); test("Basic set union (one)", t => { let a = new Set([1,2,3]); - t.deepEqual(setUnion(a), new Set([1,2,3])); + t.deepEqual(union(a), new Set([1,2,3])); }); test("Basic set union (two)", t => { let a = new Set([1,2,3]); let b = new Set([3,4,5]); - t.deepEqual(setUnion(a, b), new Set([1,2,3,4,5])); + t.deepEqual(union(a, b), new Set([1,2,3,4,5])); }); test("Basic set union (three)", t => { let a = new Set([0,1,2,3]); let b = new Set([3,4,5]); let c = new Set([3,4,5,6]); - t.deepEqual(setUnion(a, b, c), new Set([0,1,2,3,4,5,6])); + t.deepEqual(union(a, b, c), new Set([0,1,2,3,4,5,6])); }); From 920e9d5cb73c53ad9f2ea5002ea7f526f8616bb6 Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Thu, 30 Oct 2025 17:00:17 -0500 Subject: [PATCH 27/50] Updates Vitest and deps on client package --- package-lock.json | 634 +++++++++++++------------------ packages/client/package.json | 9 +- packages/client/vitest.config.js | 3 +- 3 files changed, 269 insertions(+), 377 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9f7d2acaa..7ec9ea8c9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -392,21 +392,6 @@ "url": "https://opencollective.com/11ty" } }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", @@ -443,16 +428,6 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/runtime": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz", - "integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/types": { "version": "7.28.2", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", @@ -2607,6 +2582,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "dev": true, + "license": "MIT" + }, "node_modules/@stylistic/eslint-plugin-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-4.4.1.tgz", @@ -2624,56 +2606,15 @@ "eslint": ">=9.0.0" } }, - "node_modules/@testing-library/dom": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", - "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "picocolors": "1.1.1", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@testing-library/user-event": { - "version": "14.6.1", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", - "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" - } - }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/chai": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", - "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", "dev": true, "license": "MIT", "dependencies": { - "@types/deep-eql": "*" + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" } }, "node_modules/@types/debug": { @@ -2826,76 +2767,98 @@ "license": "MIT" }, "node_modules/@vitest/browser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-3.2.4.tgz", - "integrity": "sha512-tJxiPrWmzH8a+w9nLKlQMzAKX/7VjFs50MWgcAj7p9XQ7AQ9/35fByFYptgPELyLw+0aixTnC4pUWV+APcZ/kw==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.0.5.tgz", + "integrity": "sha512-WqIm7lAm/Yx3TucvFPPmOjJ1NtQS3tm8N/r63eUufFNK28Fl0+qNfVoqrP7+ZPshBACOWXD2i678cDjdnhl6pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/mocker": "4.0.5", + "@vitest/utils": "4.0.5", + "magic-string": "^0.30.19", + "pixelmatch": "7.1.0", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.0.3", + "ws": "^8.18.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.0.5" + } + }, + "node_modules/@vitest/browser-playwright": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.0.5.tgz", + "integrity": "sha512-2ppt3/sMHSnfMnYJjgUqpPfv8hvWR9hhCiQpcI+0Ls5CpBKCxoYfKSNOexQu+65Y2CA+yoIW9MXKmG7AnX7jtQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@testing-library/dom": "^10.4.0", - "@testing-library/user-event": "^14.6.1", - "@vitest/mocker": "3.2.4", - "@vitest/utils": "3.2.4", - "magic-string": "^0.30.17", - "sirv": "^3.0.1", - "tinyrainbow": "^2.0.0", - "ws": "^8.18.2" + "@vitest/browser": "4.0.5", + "@vitest/mocker": "4.0.5", + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "playwright": "*", - "vitest": "3.2.4", - "webdriverio": "^7.0.0 || ^8.0.0 || ^9.0.0" + "vitest": "4.0.5" }, "peerDependenciesMeta": { "playwright": { - "optional": true - }, - "safaridriver": { - "optional": true - }, - "webdriverio": { - "optional": true + "optional": false } } }, + "node_modules/@vitest/browser/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, "node_modules/@vitest/expect": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", - "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.5.tgz", + "integrity": "sha512-DJctLVlKoddvP/G389oGmKWNG6GD9frm2FPXARziU80Rjo7SIYxQzb2YFzmQ4fVD3Q5utUYY8nUmWrqsuIlIXQ==", "dev": true, "license": "MIT", "dependencies": { + "@standard-schema/spec": "^1.0.0", "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" + "@vitest/spy": "4.0.5", + "@vitest/utils": "4.0.5", + "chai": "^6.0.1", + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/mocker": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", - "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.5.tgz", + "integrity": "sha512-iYHIy72LfbK+mL5W8zXROp6oOcJKXWeKcNjcPPsqoa18qIEDrhB6/Z08o0wRajTd6SSSDNw8NCSIHVNOMpz0mw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.2.4", + "@vitest/spy": "4.0.5", "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" + "magic-string": "^0.30.19" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + "vite": "^6.0.0 || ^7.0.0-0" }, "peerDependenciesMeta": { "msw": { @@ -2906,72 +2869,87 @@ } } }, + "node_modules/@vitest/mocker/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, "node_modules/@vitest/pretty-format": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.5.tgz", + "integrity": "sha512-t1T/sSdsYyNc5AZl0EMeD0jW9cpJe2cODP0R++ZQe1kTkpgrwEfxGFR/yCG4w8ZybizbXRTHU7lE8sTDD/QsGw==", "dev": true, "license": "MIT", "dependencies": { - "tinyrainbow": "^2.0.0" + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/runner": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", - "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.5.tgz", + "integrity": "sha512-CQVVe+YEeKSiFBD5gBAmRDQglm4PnMBYzeTmt06t5iWtsUN9StQeeKhYCea/oaqBYilf8sARG6fSctUcEL/UmQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "3.2.4", - "pathe": "^2.0.3", - "strip-literal": "^3.0.0" + "@vitest/utils": "4.0.5", + "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/snapshot": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", - "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.5.tgz", + "integrity": "sha512-jfmSAeR6xYNEvcD+/RxFGA1bzpqHtkVhgxo2cxXia+Q3xX7m6GpZij07rz+WyQcA/xEGn4eIS1OItkMyWsGBmQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.4", - "magic-string": "^0.30.17", + "@vitest/pretty-format": "4.0.5", + "magic-string": "^0.30.19", "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/spy": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", - "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "node_modules/@vitest/snapshot/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, "license": "MIT", "dependencies": { - "tinyspy": "^4.0.3" - }, + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/@vitest/spy": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.5.tgz", + "integrity": "sha512-TUmVQpAQign7r8+EnZsgTF3vY9BdGofTUge1rGNbnHn2IN3FChiQoT9lrPz7A7AVUZJU2LAZXl4v66HhsNMhoA==", + "dev": true, + "license": "MIT", "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.5.tgz", + "integrity": "sha512-V5RndUgCB5/AfNvK9zxGCrRs99IrPYtMTIdUzJMMFs9nrmE5JXExIEfjVtUteyTRiLfCm+dCRMHf/Uu7Mm8/dg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.4", - "loupe": "^3.1.4", - "tinyrainbow": "^2.0.0" + "@vitest/pretty-format": "4.0.5", + "tinyrainbow": "^3.0.3" }, "funding": { "url": "https://opencollective.com/vitest" @@ -3240,16 +3218,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "license": "Python-2.0" }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" - } - }, "node_modules/array-differ": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", @@ -3628,16 +3596,6 @@ } } }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -3726,18 +3684,11 @@ } }, "node_modules/chai": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.0.tgz", + "integrity": "sha512-aUTnJc/JipRzJrNADXVvpVqi6CO0dn3nx4EVPxijri+fj3LUUDyZQOgVeW54Ob3Y1Xh9Iz8f+CgaCl8v0mn9bA==", "dev": true, "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, "engines": { "node": ">=18" } @@ -3799,16 +3750,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, "node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -4284,16 +4225,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -4389,13 +4320,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "dev": true, - "license": "MIT" - }, "node_modules/dom-serializer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", @@ -6434,13 +6358,6 @@ "node": ">= 0.8" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -6621,13 +6538,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/loupe": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", - "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", - "dev": true, - "license": "MIT" - }, "node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", @@ -6645,16 +6555,6 @@ "node": ">=12" } }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "dev": true, - "license": "MIT", - "bin": { - "lz-string": "bin/bin.js" - } - }, "node_modules/magic-string": { "version": "0.30.18", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz", @@ -8366,16 +8266,6 @@ "dev": true, "license": "MIT" }, - "node_modules/pathval": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", - "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -8388,6 +8278,7 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -8395,14 +8286,27 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pixelmatch": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-7.1.0.tgz", + "integrity": "sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng==", + "dev": true, + "license": "ISC", + "dependencies": { + "pngjs": "^7.0.0" + }, + "bin": { + "pixelmatch": "bin/pixelmatch" + } + }, "node_modules/playwright": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.55.0.tgz", - "integrity": "sha512-sdCWStblvV1YU909Xqx0DhOjPZE4/5lJsIS84IfN9dAZfcl/CIZ5O8l3o0j7hPMjDvqoTF8ZUcc+i/GL5erstA==", + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.56.1.tgz", + "integrity": "sha512-aFi5B0WovBHTEvpM3DzXTUaeN6eN0qWnTkKx4NQaH4Wvcmc153PdaY2UBdSYKaGYw+UyWXSVyxDUg5DoPEttjw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.55.0" + "playwright-core": "1.56.1" }, "bin": { "playwright": "cli.js" @@ -8415,9 +8319,9 @@ } }, "node_modules/playwright-core": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.55.0.tgz", - "integrity": "sha512-GvZs4vU3U5ro2nZpeiwyb0zuFaqb9sUiAJuyrWpcGouD8y9/HLgGbNRjIph7zU9D3hnPaisMl9zG9CgFi/biIg==", + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.56.1.tgz", + "integrity": "sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -8467,6 +8371,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pngjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.19.0" + } + }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -8616,44 +8530,6 @@ "node": ">=0.10.0" } }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/pretty-ms": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.2.0.tgz", @@ -8797,13 +8673,6 @@ "react": "^19.1.1" } }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true, - "license": "MIT" - }, "node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", @@ -9420,9 +9289,9 @@ } }, "node_modules/sirv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", - "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", "dev": true, "license": "MIT", "dependencies": { @@ -9550,9 +9419,9 @@ } }, "node_modules/std-env": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", - "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", "dev": true, "license": "MIT" }, @@ -9707,26 +9576,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-literal": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", - "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true, - "license": "MIT" - }, "node_modules/style-to-js": { "version": "1.1.17", "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.17.tgz", @@ -9926,30 +9775,10 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinypool": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, "node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz", - "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", "dev": true, "license": "MIT", "engines": { @@ -10395,19 +10224,18 @@ } }, "node_modules/vite": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.3.tgz", - "integrity": "sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==", + "version": "7.1.12", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.12.tgz", + "integrity": "sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", - "tinyglobby": "^0.2.14" + "tinyglobby": "^0.2.15" }, "bin": { "vite": "bin/vite.js" @@ -10470,66 +10298,74 @@ } } }, - "node_modules/vite-node": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", - "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", + "node_modules/vite/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", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.1", - "es-module-lexer": "^1.7.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + "engines": { + "node": ">=12.0.0" }, - "bin": { - "vite-node": "vite-node.mjs" + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/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": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": ">=12.0.0" }, "funding": { - "url": "https://opencollective.com/vitest" + "url": "https://github.com/sponsors/SuperchupuDev" } }, "node_modules/vitest": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", - "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.5.tgz", + "integrity": "sha512-4H+J28MI5oeYgGg3h5BFSkQ1g/2GKK1IR8oorH3a6EQQbb7CwjbnyBjH4PGxw9/6vpwAPNzaeUMp4Js4WJmdXQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/expect": "3.2.4", - "@vitest/mocker": "3.2.4", - "@vitest/pretty-format": "^3.2.4", - "@vitest/runner": "3.2.4", - "@vitest/snapshot": "3.2.4", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "debug": "^4.4.1", - "expect-type": "^1.2.1", - "magic-string": "^0.30.17", + "@vitest/expect": "4.0.5", + "@vitest/mocker": "4.0.5", + "@vitest/pretty-format": "4.0.5", + "@vitest/runner": "4.0.5", + "@vitest/snapshot": "4.0.5", + "@vitest/spy": "4.0.5", + "@vitest/utils": "4.0.5", + "debug": "^4.4.3", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.19", "pathe": "^2.0.3", - "picomatch": "^4.0.2", + "picomatch": "^4.0.3", "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", - "tinyglobby": "^0.2.14", - "tinypool": "^1.1.1", - "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", - "vite-node": "3.2.4", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", "why-is-node-running": "^2.3.0" }, "bin": { "vitest": "vitest.mjs" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" }, "funding": { "url": "https://opencollective.com/vitest" @@ -10537,9 +10373,11 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.2.4", - "@vitest/ui": "3.2.4", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.5", + "@vitest/browser-preview": "4.0.5", + "@vitest/browser-webdriverio": "4.0.5", + "@vitest/ui": "4.0.5", "happy-dom": "*", "jsdom": "*" }, @@ -10553,7 +10391,13 @@ "@types/node": { "optional": true }, - "@vitest/browser": { + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { "optional": true }, "@vitest/ui": { @@ -10567,6 +10411,51 @@ } } }, + "node_modules/vitest/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/vitest/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/vitest/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/vue": { "version": "3.5.20", "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.20.tgz", @@ -11009,9 +10898,10 @@ "license": "MIT", "devDependencies": { "@11ty/package-bundler": "^0.4.2", - "@vitest/browser": "^3.2.4", - "playwright": "^1.54.1", - "vitest": "^3.2.4" + "@vitest/browser": "^4.0.5", + "@vitest/browser-playwright": "^4.0.5", + "playwright": "^1.56.1", + "vitest": "^4.0.5" }, "funding": { "type": "opencollective", diff --git a/packages/client/package.json b/packages/client/package.json index eeeb8ae99..09841df04 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -39,8 +39,9 @@ "homepage": "https://www.11ty.dev/", "devDependencies": { "@11ty/package-bundler": "^0.4.2", - "@vitest/browser": "^3.2.4", - "playwright": "^1.54.1", - "vitest": "^3.2.4" + "@vitest/browser": "^4.0.5", + "@vitest/browser-playwright": "^4.0.5", + "playwright": "^1.56.1", + "vitest": "^4.0.5" } -} \ No newline at end of file +} diff --git a/packages/client/vitest.config.js b/packages/client/vitest.config.js index f3459e823..812f6cf0e 100644 --- a/packages/client/vitest.config.js +++ b/packages/client/vitest.config.js @@ -1,4 +1,5 @@ import { defineConfig } from "vitest/config"; +import { playwright } from "@vitest/browser-playwright"; import os from "node:os"; let instances = [{ browser: "chromium" }, { browser: "firefox" }]; @@ -11,9 +12,9 @@ export default defineConfig({ test: { browser: { enabled: true, + provider: playwright(), headless: true, screenshotFailures: false, - provider: "playwright", // https://vitest.dev/guide/browser/playwright instances, }, From b3f3340292869ccec14a460f723dd4c95b42cf4d Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Thu, 30 Oct 2025 17:02:42 -0500 Subject: [PATCH 28/50] Upgrade entities dependency (no API changes https://github.com/fb55/entities/releases/tag/v7.0.0) --- package-lock.json | 49 +++++++++++++++++++++++++++++++++++++++++++---- package.json | 2 +- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7ec9ea8c9..804f02720 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,7 +27,7 @@ "chokidar": "^4.0.3", "debug": "^4.4.3", "dependency-graph": "^1.0.0", - "entities": "^6.0.1", + "entities": "^7.0.0", "import-module-string": "^2.0.3", "iso-639-1": "^3.1.5", "kleur": "^4.1.5", @@ -192,6 +192,19 @@ "url": "https://opencollective.com/11ty" } }, + "node_modules/@11ty/eleventy-img/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/@11ty/eleventy-plugin-bundle": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-bundle/-/eleventy-plugin-bundle-3.0.7.tgz", @@ -392,6 +405,19 @@ "url": "https://opencollective.com/11ty" } }, + "node_modules/@11ty/webc/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/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", @@ -4493,9 +4519,9 @@ } }, "node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.0.tgz", + "integrity": "sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -8172,6 +8198,19 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parse5/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/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -10229,6 +10268,7 @@ "integrity": "sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -10339,6 +10379,7 @@ "integrity": "sha512-4H+J28MI5oeYgGg3h5BFSkQ1g/2GKK1IR8oorH3a6EQQbb7CwjbnyBjH4PGxw9/6vpwAPNzaeUMp4Js4WJmdXQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/expect": "4.0.5", "@vitest/mocker": "4.0.5", diff --git a/package.json b/package.json index 7b189b26d..a82f0f50d 100644 --- a/package.json +++ b/package.json @@ -147,7 +147,7 @@ "chokidar": "^4.0.3", "debug": "^4.4.3", "dependency-graph": "^1.0.0", - "entities": "^6.0.1", + "entities": "^7.0.0", "import-module-string": "^2.0.3", "iso-639-1": "^3.1.5", "kleur": "^4.1.5", From cfa85deae2e79346ebf31d64846862dbbbf85d2a Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Thu, 30 Oct 2025 17:30:43 -0500 Subject: [PATCH 29/50] One more note for #3899 (ESM-fix) --- src/WatchTargets.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/WatchTargets.js b/src/WatchTargets.js index ac3ef51ca..77879c689 100644 --- a/src/WatchTargets.js +++ b/src/WatchTargets.js @@ -114,6 +114,8 @@ export default class WatchTargets { } this.addRaw(cjsDeps, true); + // https://github.com/11ty/eleventy/issues/3899 + // Note that this fix is ESM-only, dependency-tree CJS doesn’t support returning graphs (yet?) let esmGraph = await JavaScriptDependencies.getEsmGraph(targets, this.isEsm); if (filterCallback) { for (let node of esmGraph.overallOrder()) { From 118f3e623576b4dc8eca55859c9a8d1d18c25dd9 Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Fri, 31 Oct 2025 14:14:05 -0500 Subject: [PATCH 30/50] Fixes #3959 --- package.json | 3 ++- src/Template.js | 25 +++++++++++++++---------- src/Util/DateGitFirstAdded.js | 24 ------------------------ src/Util/DateGitLastUpdated.js | 24 ------------------------ src/Util/Git.js | 33 +++++++++++++++++++++++++++++++++ test/EleventyTest.js | 23 +++++++++++------------ 6 files changed, 61 insertions(+), 71 deletions(-) delete mode 100644 src/Util/DateGitFirstAdded.js delete mode 100644 src/Util/DateGitLastUpdated.js create mode 100644 src/Util/Git.js diff --git a/package.json b/package.json index a82f0f50d..3bfb20041 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,8 @@ }, "./UserConfig": { "types": "./src/UserConfig.js" - } + }, + "./utils/git": "./src/Util/Git.js" }, "bin": { "eleventy": "cmd.cjs" diff --git a/src/Template.js b/src/Template.js index 59a247571..b2c7b2f62 100755 --- a/src/Template.js +++ b/src/Template.js @@ -7,8 +7,7 @@ import debugUtil from "debug"; import chalk from "./Adapters/Packages/chalk.js"; import ConsoleLogger from "./Util/ConsoleLogger.js"; -import getDateFromGitLastUpdated from "./Util/DateGitLastUpdated.js"; -import getDateFromGitFirstAdded from "./Util/DateGitFirstAdded.js"; +import { getCreatedTimestamp, getUpdatedTimestamp } from "./Util/Git.js"; import TemplateContent from "./TemplateContent.js"; import TemplatePermalink from "./TemplatePermalink.js"; import TemplateLayout from "./TemplateLayout.js"; @@ -1061,10 +1060,13 @@ class Template extends TemplateContent { // special strings if (!this.isVirtualTemplate()) { if (dateValue.toLowerCase() === "git last modified") { - let d = await getDateFromGitLastUpdated(this.inputPath); - if (d) { - debug(`getMappedDate: found git last modified date for ${this.inputPath}: %o`, d); - return d; + let timestamp = await getUpdatedTimestamp(this.inputPath); + if (timestamp) { + debug( + `getMappedDate: found git last modified timestamp for ${this.inputPath}: %o`, + timestamp, + ); + return new Date(timestamp); } // return now if this file is not yet available in `git` @@ -1074,10 +1076,13 @@ class Template extends TemplateContent { return this._getDateInstance("ctimeMs"); } if (dateValue.toLowerCase() === "git created") { - let d = await getDateFromGitFirstAdded(this.inputPath); - if (d) { - debug(`getMappedDate: found git created date for ${this.inputPath}: %o`, d); - return d; + let timestamp = await getCreatedTimestamp(this.inputPath); + if (timestamp) { + debug( + `getMappedDate: found git created timestamp for ${this.inputPath}: %o`, + timestamp, + ); + return new Date(timestamp); } // return now if this file is not yet available in `git` diff --git a/src/Util/DateGitFirstAdded.js b/src/Util/DateGitFirstAdded.js deleted file mode 100644 index 4140748b8..000000000 --- a/src/Util/DateGitFirstAdded.js +++ /dev/null @@ -1,24 +0,0 @@ -import { spawnAsync } from "./spawn.js"; - -async function getGitFirstAddedTimeStamp(filePath) { - try { - let timestamp = await spawnAsync( - "git", - // Formats https://www.git-scm.com/docs/git-log#_pretty_formats - // %at author date, UNIX timestamp - ["log", "--diff-filter=A", "--follow", "-1", "--format=%at", filePath], - ); - // parseInt removes trailing \n - return parseInt(timestamp, 10) * 1000; - } catch (e) { - // do nothing - } -} - -// return a Date -export default async function (inputPath) { - let timestamp = await getGitFirstAddedTimeStamp(inputPath); - if (timestamp) { - return new Date(timestamp); - } -} diff --git a/src/Util/DateGitLastUpdated.js b/src/Util/DateGitLastUpdated.js deleted file mode 100644 index 9517cbdcb..000000000 --- a/src/Util/DateGitLastUpdated.js +++ /dev/null @@ -1,24 +0,0 @@ -import { spawnAsync } from "./spawn.js"; - -async function getGitLastUpdatedTimeStamp(filePath) { - try { - let timestamp = await spawnAsync( - "git", - // Formats https://www.git-scm.com/docs/git-log#_pretty_formats - // %at author date, UNIX timestamp - ["log", "-1", "--format=%at", filePath], - ); - // parseInt removes trailing \n - return parseInt(timestamp, 10) * 1000; - } catch (e) { - // do nothing - } -} - -// return a Date -export default async function (inputPath) { - let timestamp = await getGitLastUpdatedTimeStamp(inputPath); - if (timestamp) { - return new Date(timestamp); - } -} diff --git a/src/Util/Git.js b/src/Util/Git.js new file mode 100644 index 000000000..a8f3fae75 --- /dev/null +++ b/src/Util/Git.js @@ -0,0 +1,33 @@ +import { spawnAsync } from "./spawn.js"; +import memoize from "./MemoizeFunction.js"; + +const getCreatedTimestamp = memoize(async function (filePath) { + try { + let timestamp = await spawnAsync( + "git", + // Formats https://www.git-scm.com/docs/git-log#_pretty_formats + // %at author date, UNIX timestamp + ["log", "--diff-filter=A", "--follow", "-1", "--format=%at", filePath], + ); + // parseInt removes trailing \n + return parseInt(timestamp, 10) * 1000; + } catch (e) { + // do nothing + } +}); + +const getUpdatedTimestamp = memoize(async function (filePath) { + try { + let timestamp = await spawnAsync( + "git", + // Formats https://www.git-scm.com/docs/git-log#_pretty_formats + // %at author date, UNIX timestamp + ["log", "-1", "--format=%at", filePath], + ); + return parseInt(timestamp, 10) * 1000; + } catch (e) { + // do nothing + } +}); + +export { getCreatedTimestamp, getUpdatedTimestamp }; diff --git a/test/EleventyTest.js b/test/EleventyTest.js index 22e036497..d3afdef9d 100644 --- a/test/EleventyTest.js +++ b/test/EleventyTest.js @@ -13,8 +13,7 @@ import Eleventy, { HtmlBasePlugin } from "../src/Eleventy.js"; import TemplateContent from "../src/TemplateContent.js"; import TemplateMap from "../src/TemplateMap.js"; import TemplateConfig from "../src/TemplateConfig.js"; -import DateGitFirstAdded from "../src/Util/DateGitFirstAdded.js"; -import DateGitLastUpdated from "../src/Util/DateGitLastUpdated.js"; +import { getCreatedTimestamp, getUpdatedTimestamp } from "../src/Util/Git.js"; import PathNormalizer from "../src/Util/PathNormalizer.js"; import { normalizeNewLines, localizeNewLines } from "./Util/normalizeNewLines.js"; @@ -422,14 +421,14 @@ test("#142: date 'git Last Modified' populates page.date", async (t) => { let [result] = results; // Warning: this doesn’t test the validity of the function, only that it populates page.date. - let comparisonDate = await DateGitLastUpdated("./test/stubs-142/index.njk"); + let timestamp = await getUpdatedTimestamp("./test/stubs-142/index.njk"); t.truthy(result.content.trim()); - t.truthy(comparisonDate.getTime()); - t.is(result.content.trim(), "" + comparisonDate.getTime()); + t.truthy(timestamp); + t.is(result.content.trim(), "" + timestamp); }); -test("DateGitLastUpdated returns undefined on nonexistent path", async (t) => { - t.is(await DateGitLastUpdated("./test/invalid.invalid"), undefined); +test("git getUpdatedTimestamp returns undefined on nonexistent path", async (t) => { + t.is(await getUpdatedTimestamp("./test/invalid.invalid"), undefined); }); test("#2167: Pagination with permalink: false", async (t) => { @@ -534,14 +533,14 @@ test("#2224: date 'git created' populates page.date", async (t) => { let [result] = results; // This doesn’t test the validity of the function, only that it populates page.date. - let comparisonDate = await DateGitFirstAdded("./test/stubs-2224/index.njk"); + let timestamp = await getCreatedTimestamp("./test/stubs-2224/index.njk"); t.truthy(result.content.trim()); - t.truthy(comparisonDate.getTime()); - t.is(result.content.trim(), "" + comparisonDate.getTime()); + t.truthy(timestamp); + t.is(result.content.trim(), "" + timestamp); }); -test("DateGitFirstAdded returns undefined on nonexistent path", async (t) => { - t.is(await DateGitFirstAdded("./test/invalid.invalid"), undefined); +test("git getCreatedTimestamp returns undefined on nonexistent path", async (t) => { + t.is(await getCreatedTimestamp("./test/invalid.invalid"), undefined); }); test("Does pathPrefix affect page URLs", async (t) => { From eddc993adc9503c1199c134f506e6abcdbfee9d4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Nov 2025 11:14:45 +0000 Subject: [PATCH 31/50] Bump liquidjs from 10.23.0 to 10.24.0 Bumps [liquidjs](https://github.com/harttle/liquidjs) from 10.23.0 to 10.24.0. - [Release notes](https://github.com/harttle/liquidjs/releases) - [Changelog](https://github.com/harttle/liquidjs/blob/master/CHANGELOG.md) - [Commits](https://github.com/harttle/liquidjs/compare/v10.23.0...v10.24.0) --- updated-dependencies: - dependency-name: liquidjs dependency-version: 10.24.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 86 +++++++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 46 insertions(+), 42 deletions(-) diff --git a/package-lock.json b/package-lock.json index 804f02720..99d39965c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,7 +31,7 @@ "import-module-string": "^2.0.3", "iso-639-1": "^3.1.5", "kleur": "^4.1.5", - "liquidjs": "^10.23.0", + "liquidjs": "^10.24.0", "markdown-it": "^14.1.0", "minimist": "^1.2.8", "moo": "^0.5.2", @@ -2296,7 +2296,8 @@ "optional": true, "os": [ "android" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-android-arm64": { "version": "4.49.0", @@ -2310,7 +2311,8 @@ "optional": true, "os": [ "android" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.49.0", @@ -2324,7 +2326,8 @@ "optional": true, "os": [ "darwin" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-darwin-x64": { "version": "4.49.0", @@ -2338,7 +2341,8 @@ "optional": true, "os": [ "darwin" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-freebsd-arm64": { "version": "4.49.0", @@ -2352,7 +2356,8 @@ "optional": true, "os": [ "freebsd" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-freebsd-x64": { "version": "4.49.0", @@ -2366,7 +2371,8 @@ "optional": true, "os": [ "freebsd" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { "version": "4.49.0", @@ -2380,7 +2386,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { "version": "4.49.0", @@ -2394,7 +2401,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-arm64-gnu": { "version": "4.49.0", @@ -2408,7 +2416,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-arm64-musl": { "version": "4.49.0", @@ -2422,7 +2431,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { "version": "4.49.0", @@ -2436,7 +2446,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { "version": "4.49.0", @@ -2450,7 +2461,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { "version": "4.49.0", @@ -2464,7 +2476,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-riscv64-musl": { "version": "4.49.0", @@ -2478,7 +2491,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-s390x-gnu": { "version": "4.49.0", @@ -2492,7 +2506,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.49.0", @@ -2506,7 +2521,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-linux-x64-musl": { "version": "4.49.0", @@ -2520,7 +2536,8 @@ "optional": true, "os": [ "linux" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-win32-arm64-msvc": { "version": "4.49.0", @@ -2534,7 +2551,8 @@ "optional": true, "os": [ "win32" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-win32-ia32-msvc": { "version": "4.49.0", @@ -2548,7 +2566,8 @@ "optional": true, "os": [ "win32" - ] + ], + "peer": true }, "node_modules/@rollup/rollup-win32-x64-msvc": { "version": "4.49.0", @@ -2562,7 +2581,8 @@ "optional": true, "os": [ "win32" - ] + ], + "peer": true }, "node_modules/@sindresorhus/merge-streams": { "version": "2.3.0", @@ -2649,7 +2669,6 @@ "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/ms": "*" } @@ -2732,7 +2751,6 @@ "integrity": "sha512-m5ObIqwsUp6BZzyiy4RdZpzWGub9bqLJMvZDD0QMXhxjqMHMENlj+SqF5QxoUwaQNFe+8kz8XM8ZQhqkQPTgMQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -2821,7 +2839,6 @@ "integrity": "sha512-2ppt3/sMHSnfMnYJjgUqpPfv8hvWR9hhCiQpcI+0Ls5CpBKCxoYfKSNOexQu+65Y2CA+yoIW9MXKmG7AnX7jtQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/browser": "4.0.5", "@vitest/mocker": "4.0.5", @@ -3145,7 +3162,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -4692,7 +4708,6 @@ "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", @@ -6485,9 +6500,9 @@ } }, "node_modules/liquidjs": { - "version": "10.23.0", - "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-10.23.0.tgz", - "integrity": "sha512-Chm3luYvACZUj+Wlq7Nxwi0YvGXJv3vx+LPIGfa6n1FaUoMxe8T2M+5S1m2YkSToqJcsxZRK0VeCPZNrSa2yOw==", + "version": "10.24.0", + "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-10.24.0.tgz", + "integrity": "sha512-TAUNAdgwaAXjjcUFuYVJm9kOVH7zc0mTKxsG9t9Lu4qdWjB2BEblyVIYpjWcmJLMGgiYqnGNJjpNMHx0gp/46A==", "license": "MIT", "dependencies": { "commander": "^10.0.0" @@ -8317,7 +8332,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -8483,7 +8497,6 @@ "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.16.6.tgz", "integrity": "sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==", "license": "MIT", - "peer": true, "dependencies": { "posthtml-parser": "^0.11.0", "posthtml-render": "^3.0.0" @@ -8694,7 +8707,6 @@ "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -9107,7 +9119,6 @@ "integrity": "sha512-aFOZHGf+ur+bp1bCHZ+u8otKGh77ZtmFyXDo4tlYvT7PWql41Kwd8wdkPqhhT+h2879IVblcHFglIMofsFd1EA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", @@ -9907,8 +9918,7 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/tsx": { "version": "4.20.5", @@ -9916,7 +9926,6 @@ "integrity": "sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" @@ -9963,7 +9972,6 @@ "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -10268,7 +10276,6 @@ "integrity": "sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -10379,7 +10386,6 @@ "integrity": "sha512-4H+J28MI5oeYgGg3h5BFSkQ1g/2GKK1IR8oorH3a6EQQbb7CwjbnyBjH4PGxw9/6vpwAPNzaeUMp4Js4WJmdXQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vitest/expect": "4.0.5", "@vitest/mocker": "4.0.5", @@ -10503,7 +10509,6 @@ "integrity": "sha512-2sBz0x/wis5TkF1XZ2vH25zWq3G1bFEPOfkBcx2ikowmphoQsPH6X0V3mmPCXA2K1N/XGTnifVyDQP4GfDDeQw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@vue/compiler-dom": "3.5.20", "@vue/compiler-sfc": "3.5.20", @@ -10904,7 +10909,6 @@ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "dev": true, "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index 3bfb20041..2001037a3 100644 --- a/package.json +++ b/package.json @@ -152,7 +152,7 @@ "import-module-string": "^2.0.3", "iso-639-1": "^3.1.5", "kleur": "^4.1.5", - "liquidjs": "^10.23.0", + "liquidjs": "^10.24.0", "markdown-it": "^14.1.0", "minimist": "^1.2.8", "moo": "^0.5.2", From 33fee4f65583d9323da57f90dcde4e1bc105cf52 Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Mon, 3 Nov 2025 13:44:31 -0600 Subject: [PATCH 32/50] Fixes #3934, tinyglobby dependency update --- package-lock.json | 351 +++++++++++++++-------------------- package.json | 2 +- packages/client/package.json | 2 +- 3 files changed, 156 insertions(+), 199 deletions(-) diff --git a/package-lock.json b/package-lock.json index 804f02720..743e3134e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,7 +42,7 @@ "posthtml": "^0.16.6", "posthtml-match-helper": "^2.0.3", "semver": "^7.7.3", - "tinyglobby": "^0.2.14" + "tinyglobby": "^0.2.15" }, "bin": { "eleventy": "cmd.cjs" @@ -315,17 +315,17 @@ } }, "node_modules/@11ty/package-bundler": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@11ty/package-bundler/-/package-bundler-0.4.2.tgz", - "integrity": "sha512-hod+Na/0WinreHp6rqXPOCZ7GNIuPPuve7fDOkUH6Wo6SpmwiR1wPahbh1qCQX7wvqtRA+DpQMR3TiD4Szw80A==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@11ty/package-bundler/-/package-bundler-0.5.1.tgz", + "integrity": "sha512-MfXxkHTgvw0GUaJBhfH9xLHUQUbKnfzC/szVSeGLDGcv1z+7FQ8oR2FAwzRDyVG/tFiAd3KmccNqqZLWTAPGOA==", "dev": true, "license": "MIT", "dependencies": { "assert": "^2.1.0", "buffer": "^6.0.3", - "esbuild": "^0.25.5", + "esbuild": "^0.25.12", "events": "^3.3.0", - "memfs": "^4.17.2", + "memfs": "^4.50.0", "path": "^0.12.7", "process": "^0.11.10" }, @@ -497,9 +497,9 @@ "license": "MIT" }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", - "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", "cpu": [ "ppc64" ], @@ -514,9 +514,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", - "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", "cpu": [ "arm" ], @@ -531,9 +531,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", - "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", "cpu": [ "arm64" ], @@ -548,9 +548,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", - "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", "cpu": [ "x64" ], @@ -565,9 +565,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", - "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", "cpu": [ "arm64" ], @@ -582,9 +582,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", - "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", "cpu": [ "x64" ], @@ -599,9 +599,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", - "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", "cpu": [ "arm64" ], @@ -616,9 +616,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", - "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", "cpu": [ "x64" ], @@ -633,9 +633,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", - "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", "cpu": [ "arm" ], @@ -650,9 +650,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", - "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", "cpu": [ "arm64" ], @@ -667,9 +667,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", - "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", "cpu": [ "ia32" ], @@ -684,9 +684,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", - "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", "cpu": [ "loong64" ], @@ -701,9 +701,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", - "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", "cpu": [ "mips64el" ], @@ -718,9 +718,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", - "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", "cpu": [ "ppc64" ], @@ -735,9 +735,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", - "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", "cpu": [ "riscv64" ], @@ -752,9 +752,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", - "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", "cpu": [ "s390x" ], @@ -769,9 +769,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", - "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", "cpu": [ "x64" ], @@ -786,9 +786,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", - "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", "cpu": [ "arm64" ], @@ -803,9 +803,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", - "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", "cpu": [ "x64" ], @@ -820,9 +820,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", - "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", "cpu": [ "arm64" ], @@ -837,9 +837,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", - "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", "cpu": [ "x64" ], @@ -854,9 +854,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", - "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", "cpu": [ "arm64" ], @@ -871,9 +871,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", - "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", "cpu": [ "x64" ], @@ -888,9 +888,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", - "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", "cpu": [ "arm64" ], @@ -905,9 +905,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", - "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", "cpu": [ "ia32" ], @@ -922,9 +922,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", - "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", "cpu": [ "x64" ], @@ -1680,9 +1680,9 @@ } }, "node_modules/@jsonjoy.com/buffers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.0.0.tgz", - "integrity": "sha512-NDigYR3PHqCnQLXYyoLbnEdzMMvzeiCWo1KOut7Q0CoIqg9tUAPKJ1iq/2nFhc5kZtexzutNY0LFjdwWL3Dw3Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", + "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1714,19 +1714,20 @@ } }, "node_modules/@jsonjoy.com/json-pack": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.11.0.tgz", - "integrity": "sha512-nLqSTAYwpk+5ZQIoVp7pfd/oSKNWlEdvTq2LzVA4r2wtWZg6v+5u0VgBOaDJuUfNOuw/4Ysq6glN5QKSrOCgrA==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", + "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", "dev": true, "license": "Apache-2.0", "dependencies": { "@jsonjoy.com/base64": "^1.1.2", - "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/buffers": "^1.2.0", "@jsonjoy.com/codegen": "^1.0.0", - "@jsonjoy.com/json-pointer": "^1.0.1", + "@jsonjoy.com/json-pointer": "^1.0.2", "@jsonjoy.com/util": "^1.9.0", "hyperdyperid": "^1.2.0", - "thingies": "^2.5.0" + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" }, "engines": { "node": ">=10.0" @@ -4617,9 +4618,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", - "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4630,32 +4631,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.9", - "@esbuild/android-arm": "0.25.9", - "@esbuild/android-arm64": "0.25.9", - "@esbuild/android-x64": "0.25.9", - "@esbuild/darwin-arm64": "0.25.9", - "@esbuild/darwin-x64": "0.25.9", - "@esbuild/freebsd-arm64": "0.25.9", - "@esbuild/freebsd-x64": "0.25.9", - "@esbuild/linux-arm": "0.25.9", - "@esbuild/linux-arm64": "0.25.9", - "@esbuild/linux-ia32": "0.25.9", - "@esbuild/linux-loong64": "0.25.9", - "@esbuild/linux-mips64el": "0.25.9", - "@esbuild/linux-ppc64": "0.25.9", - "@esbuild/linux-riscv64": "0.25.9", - "@esbuild/linux-s390x": "0.25.9", - "@esbuild/linux-x64": "0.25.9", - "@esbuild/netbsd-arm64": "0.25.9", - "@esbuild/netbsd-x64": "0.25.9", - "@esbuild/openbsd-arm64": "0.25.9", - "@esbuild/openbsd-x64": "0.25.9", - "@esbuild/openharmony-arm64": "0.25.9", - "@esbuild/sunos-x64": "0.25.9", - "@esbuild/win32-arm64": "0.25.9", - "@esbuild/win32-ia32": "0.25.9", - "@esbuild/win32-x64": "0.25.9" + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" } }, "node_modules/escalade": { @@ -5355,6 +5356,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -5465,9 +5476,9 @@ } }, "node_modules/glob-to-regex.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.0.1.tgz", - "integrity": "sha512-CG/iEvgQqfzoVsMUbxSJcwbG2JwyZ3naEqPkeltwl0BSS8Bp83k3xlGms+0QdWFUAwV+uvo80wNswKF6FWEkKg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", + "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -6082,14 +6093,15 @@ } }, "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" }, @@ -6932,9 +6944,9 @@ "license": "MIT" }, "node_modules/memfs": { - "version": "4.38.2", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.38.2.tgz", - "integrity": "sha512-FpWsVHpAkoSh/LfY1BgAl72BVd374ooMRtDi2VqzBycX4XEfvC0XKACCe0C9VRZoYq5viuoyTv6lYXZ/Q7TrLQ==", + "version": "4.50.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.50.0.tgz", + "integrity": "sha512-N0LUYQMUA1yS5tJKmMtU9yprPm6ZIg24yr/OVv/7t6q0kKDIho4cBbXRi1XKttUmNYDYgF/q45qrKE/UhGO0CA==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -6945,9 +6957,6 @@ "tree-dump": "^1.0.3", "tslib": "^2.0.0" }, - "engines": { - "node": ">= 4.0.0" - }, "funding": { "type": "github", "url": "https://github.com/sponsors/streamich" @@ -9799,13 +9808,13 @@ "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "license": "MIT", "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -9864,9 +9873,9 @@ "license": "MIT" }, "node_modules/tree-dump": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.3.tgz", - "integrity": "sha512-il+Cv80yVHFBwokQSfd4bldvr1Md951DpgAGfmhydt04L+YzHgubm2tQ7zueWDcGENKHq0ZvGFR/hjvNXilHEg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", + "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -10356,23 +10365,6 @@ } } }, - "node_modules/vite/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/vitest": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.5.tgz", @@ -10452,24 +10444,6 @@ } } }, - "node_modules/vitest/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/vitest/node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", @@ -10480,23 +10454,6 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "node_modules/vitest/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/vue": { "version": "3.5.20", "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.20.tgz", @@ -10938,7 +10895,7 @@ "version": "PRIVATE", "license": "MIT", "devDependencies": { - "@11ty/package-bundler": "^0.4.2", + "@11ty/package-bundler": "^0.5.1", "@vitest/browser": "^4.0.5", "@vitest/browser-playwright": "^4.0.5", "playwright": "^1.56.1", diff --git a/package.json b/package.json index 3bfb20041..f5f65989f 100644 --- a/package.json +++ b/package.json @@ -163,7 +163,7 @@ "posthtml": "^0.16.6", "posthtml-match-helper": "^2.0.3", "semver": "^7.7.3", - "tinyglobby": "^0.2.14" + "tinyglobby": "^0.2.15" }, "overrides": { "chokidar": "$chokidar", diff --git a/packages/client/package.json b/packages/client/package.json index 09841df04..0bb110d85 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -38,7 +38,7 @@ "bugs": "https://github.com/11ty/eleventy/issues", "homepage": "https://www.11ty.dev/", "devDependencies": { - "@11ty/package-bundler": "^0.4.2", + "@11ty/package-bundler": "^0.5.1", "@vitest/browser": "^4.0.5", "@vitest/browser-playwright": "^4.0.5", "playwright": "^1.56.1", From d5e429d9294509f91c41f203b5e95d5ad0177a1e Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Mon, 3 Nov 2025 16:35:37 -0600 Subject: [PATCH 33/50] Changing some workflows based on https://www.11ty.dev/blog/github-issues/ --- .github/ISSUE_TEMPLATE/config.yml | 9 ++++++- .github/ISSUE_TEMPLATE/documentation.md | 7 ----- .github/ISSUE_TEMPLATE/enhancement.yml | 34 ------------------------- .github/ISSUE_TEMPLATE/possible-bug.yml | 12 +++------ 4 files changed, 12 insertions(+), 50 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/documentation.md delete mode 100644 .github/ISSUE_TEMPLATE/enhancement.yml diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 07f0e392b..0c7a4a3ad 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,7 +1,14 @@ contact_links: - name: I have a question about Eleventy url: https://github.com/11ty/eleventy/discussions/ - about: General education topics should be filed on our Discussions board e.g. “How do I do this in Eleventy?” or “Can Eleventy do this?” + about: General education topics should be filed on our Discussions board e.g. “How do I do this in Eleventy?” or “Can Eleventy do this?” (Please search existing discussion first!) + - name: I have an idea or feature request for Eleventy + url: https://github.com/11ty/eleventy/discussions/new?category=enhancement-queue + about: Enhancement or new Features. e.g. “I wish Eleventy did this.” Suggest an idea! (Please search existing discussion first!) + - name: I think something is missing from the documentation (or is inaccurate!) + url: https://github.com/11ty/11ty-website/issues + - name: I have an idea for the documentation + url: https://github.com/11ty/11ty-website/discussions/categories/enhancement-queue - name: Discord Community url: https://discord.gg/GBkBy9u about: Ask the community on Discord diff --git a/.github/ISSUE_TEMPLATE/documentation.md b/.github/ISSUE_TEMPLATE/documentation.md deleted file mode 100644 index cfc948081..000000000 --- a/.github/ISSUE_TEMPLATE/documentation.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -name: Documentation! -about: A thing that Eleventy does needs to be documented better or is currently documented incorrectly! -title: "" -labels: documentation -assignees: "" ---- diff --git a/.github/ISSUE_TEMPLATE/enhancement.yml b/.github/ISSUE_TEMPLATE/enhancement.yml deleted file mode 100644 index 48233f5b0..000000000 --- a/.github/ISSUE_TEMPLATE/enhancement.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: Feature request! -description: Enhancements. e.g. “I wish Eleventy did this.” Suggest an idea! -labels: [enhancement] -body: - - type: markdown - attributes: - value: | - Before opening a feature request, please search for the feature in the existing issues. - - --- - - Thank you for taking the time to file a feature request. To address this feature as fast as possible, we need some information. - - type: textarea - id: problem - attributes: - label: Is your feature request related to a problem? Please describe. - description: A clear and concise description of what the problem is. Ex. I'm always frustrated when ... - - type: textarea - id: solution - attributes: - label: Describe the solution you'd like - description: A clear and concise description of what you want to happen. - validations: - required: true - - type: textarea - id: alternative - attributes: - label: Describe alternatives you've considered - description: A clear and concise description of any alternative solutions or features you've considered. - - type: textarea - id: context - attributes: - label: Additional context - description: Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/possible-bug.yml b/.github/ISSUE_TEMPLATE/possible-bug.yml index c04605b9d..ba5ee1122 100644 --- a/.github/ISSUE_TEMPLATE/possible-bug.yml +++ b/.github/ISSUE_TEMPLATE/possible-bug.yml @@ -5,7 +5,7 @@ body: - type: markdown attributes: value: | - Before opening a bug report, please search for the behavior in the existing issues. + Before opening a bug report, please search for the behavior in the existing issues. --- @@ -36,22 +36,18 @@ body: - type: textarea id: repro attributes: - label: Reproduction steps + label: Reproduction steps and expected behavaior description: Steps to reproduce the behavior. value: | 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See an error - - type: textarea - id: expected - attributes: - label: Expected behavior - description: A clear and concise description of what you expected to happen. + 5. What do you expect to happen? - type: input id: repro-url attributes: - label: Reproduction URL + label: Reproduction Source Code URL description: "Optional: The URL to the **public** repository for the reproduction. _[parser:url]_" placeholder: e.g. https://github.com/zachleat/zachleat.com validations: From a6cca6ac3129ab0b6fb73582c4be7eae56a42298 Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Mon, 3 Nov 2025 16:39:47 -0600 Subject: [PATCH 34/50] Copy on GitHub issue templates --- .github/ISSUE_TEMPLATE/config.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 0c7a4a3ad..a97e357d5 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,14 +1,16 @@ contact_links: - name: I have a question about Eleventy url: https://github.com/11ty/eleventy/discussions/ - about: General education topics should be filed on our Discussions board e.g. “How do I do this in Eleventy?” or “Can Eleventy do this?” (Please search existing discussion first!) + about: General education topics should be filed on our Discussions board e.g. “How do I do this in Eleventy?” or “Can Eleventy do this?” (Please search existing discussions first!) - name: I have an idea or feature request for Eleventy url: https://github.com/11ty/eleventy/discussions/new?category=enhancement-queue about: Enhancement or new Features. e.g. “I wish Eleventy did this.” Suggest an idea! (Please search existing discussion first!) - - name: I think something is missing from the documentation (or is inaccurate!) + - name: Some docs are missing or inaccurate! url: https://github.com/11ty/11ty-website/issues - - name: I have an idea for the documentation + about: Something missing from the documentation? Something wrong? Something just downright confusing? Tell us! + - name: I have a feature request for the docs url: https://github.com/11ty/11ty-website/discussions/categories/enhancement-queue + about: Enhancement or new Features for the documentation. e.g. “I wish the Eleventy docs did this.” Suggest an idea! (Please search existing discussions first!) - name: Discord Community url: https://discord.gg/GBkBy9u about: Ask the community on Discord From 006d31c99e7bb54e46191f002a491448faac1756 Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Mon, 3 Nov 2025 16:50:17 -0600 Subject: [PATCH 35/50] Simplify bug reporting --- .github/ISSUE_TEMPLATE/possible-bug.yml | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/possible-bug.yml b/.github/ISSUE_TEMPLATE/possible-bug.yml index ba5ee1122..bd00a9ffc 100644 --- a/.github/ISSUE_TEMPLATE/possible-bug.yml +++ b/.github/ISSUE_TEMPLATE/possible-bug.yml @@ -30,20 +30,13 @@ body: id: bug-description attributes: label: Describe the bug - description: A clear and concise description of what the bug is. + description: A clear and concise description of how to reproduce the bug + value: | + 1. I ran *this* command with *these* flags '...' + 2. I used the following configuration and template syntax '....' + 3. I got *this* error or I expected this to happen and it didn’t validations: required: true - - type: textarea - id: repro - attributes: - label: Reproduction steps and expected behavaior - description: Steps to reproduce the behavior. - value: | - 1. Go to '...' - 2. Click on '....' - 3. Scroll down to '....' - 4. See an error - 5. What do you expect to happen? - type: input id: repro-url attributes: From edc8b6b25940e8ad5f4c8f70a884a36b9d958d4c Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Mon, 3 Nov 2025 16:51:25 -0600 Subject: [PATCH 36/50] Simplification --- .github/ISSUE_TEMPLATE/config.yml | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index a97e357d5..902bfb860 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -2,15 +2,12 @@ contact_links: - name: I have a question about Eleventy url: https://github.com/11ty/eleventy/discussions/ about: General education topics should be filed on our Discussions board e.g. “How do I do this in Eleventy?” or “Can Eleventy do this?” (Please search existing discussions first!) - - name: I have an idea or feature request for Eleventy + - name: I have a feature request for Eleventy url: https://github.com/11ty/eleventy/discussions/new?category=enhancement-queue about: Enhancement or new Features. e.g. “I wish Eleventy did this.” Suggest an idea! (Please search existing discussion first!) - - name: Some docs are missing or inaccurate! - url: https://github.com/11ty/11ty-website/issues - about: Something missing from the documentation? Something wrong? Something just downright confusing? Tell us! - - name: I have a feature request for the docs - url: https://github.com/11ty/11ty-website/discussions/categories/enhancement-queue - about: Enhancement or new Features for the documentation. e.g. “I wish the Eleventy docs did this.” Suggest an idea! (Please search existing discussions first!) + - name: I wish the docs were different! + url: https://github.com/11ty/11ty-website/issues/new/choose + about: Something missing from the documentation? Something wrong? Something confusing? You want the 11ty-website repo! - name: Discord Community url: https://discord.gg/GBkBy9u about: Ask the community on Discord From a9ee377494a68934a8233559e3986839bdff5d5e Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Mon, 3 Nov 2025 16:55:52 -0600 Subject: [PATCH 37/50] Typo --- .github/ISSUE_TEMPLATE/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 902bfb860..3ce54d182 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -4,7 +4,7 @@ contact_links: about: General education topics should be filed on our Discussions board e.g. “How do I do this in Eleventy?” or “Can Eleventy do this?” (Please search existing discussions first!) - name: I have a feature request for Eleventy url: https://github.com/11ty/eleventy/discussions/new?category=enhancement-queue - about: Enhancement or new Features. e.g. “I wish Eleventy did this.” Suggest an idea! (Please search existing discussion first!) + about: Enhancement or new Features. e.g. “I wish Eleventy did this.” Suggest an idea! (Please search existing discussions first!) - name: I wish the docs were different! url: https://github.com/11ty/11ty-website/issues/new/choose about: Something missing from the documentation? Something wrong? Something confusing? You want the 11ty-website repo! From 4c064684788b1aaaf3fe0b66c37935f86a581cdf Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Mon, 3 Nov 2025 17:32:06 -0600 Subject: [PATCH 38/50] Update enhancement queue link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ec52e0b41..725fdbb33 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ These run in various environments: ## Community Roadmap -- [Top Feature Requests](https://github.com/11ty/eleventy/issues?q=label%3Aneeds-votes+sort%3Areactions-%2B1-desc+label%3Aenhancement) (Add your own votes using the 👍 reaction) +- [Top Feature Requests](https://github.com/11ty/eleventy/discussions/categories/enhancement-queue?discussions_q=is%3Aopen+category%3A%22Enhancement+Queue%22+sort%3Atop) (Vote for your favorites!) - [Top Bugs 😱](https://github.com/11ty/eleventy/issues?q=is%3Aissue+is%3Aopen+label%3Abug+sort%3Areactions) (Add your own votes using the 👍 reaction) ## Plugins From 4cc29b1af71b89a8acf691d72a21434010a9c429 Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Mon, 3 Nov 2025 17:32:38 -0600 Subject: [PATCH 39/50] More concise export --- src/Util/PromiseUtil.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Util/PromiseUtil.js b/src/Util/PromiseUtil.js index fa88da0f4..b4306d8fc 100644 --- a/src/Util/PromiseUtil.js +++ b/src/Util/PromiseUtil.js @@ -1,4 +1,4 @@ -function withResolvers() { +export function withResolvers() { if ("withResolvers" in Promise) { return Promise.withResolvers(); } @@ -11,5 +11,3 @@ function withResolvers() { }); return { promise, resolve, reject }; } - -export { withResolvers }; From c64419d932a946c32bbe1b887be7c4a9000bfbd5 Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Fri, 14 Nov 2025 10:44:40 -0600 Subject: [PATCH 40/50] Fixes #4151 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f5f65989f..ffc418f3a 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "author": "Zach Leatherman (https://zachleat.com/)", "repository": { "type": "git", - "url": "git://github.com/11ty/eleventy.git" + "url": "git+https://github.com/11ty/eleventy.git" }, "bugs": "https://github.com/11ty/eleventy/issues", "homepage": "https://www.11ty.dev/", From 4b51126d59f91fb241e379164956e5f8382c82f0 Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Fri, 14 Nov 2025 11:11:58 -0600 Subject: [PATCH 41/50] Upgrade dep --- package-lock.json | 16 ++++++++-------- package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 743e3134e..772bb14dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "@11ty/eleventy-dev-server": "3.0.0-alpha.3", "@11ty/eleventy-plugin-bundle": "^3.0.7", "@11ty/eleventy-utils": "^2.0.7", - "@11ty/gray-matter": "^2.0.0", + "@11ty/gray-matter": "^2.0.1", "@11ty/lodash-custom": "^4.17.21", "@11ty/parse-date-strings": "^2.0.5", "@11ty/posthtml-urls": "^1.0.1", @@ -287,12 +287,12 @@ } }, "node_modules/@11ty/gray-matter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@11ty/gray-matter/-/gray-matter-2.0.0.tgz", - "integrity": "sha512-/SYlaidm5alB6/HMnFTLj7NEskdi0NDr05gl5mfcqLjfUWOy1GZ+ZA/3ZbLqnjToPie666Us6sZhScJ0pCt7JQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@11ty/gray-matter/-/gray-matter-2.0.1.tgz", + "integrity": "sha512-IJtfwNC6pX4lV1PXqf25Tnqlp5wFAg7MyuSzqQ9vWoRJsnRggc+yuOQUT3GiedEhGGu8d19n51LzLlRbMPPYZQ==", "license": "MIT", "dependencies": { - "js-yaml": "^4.1.0", + "js-yaml": "^4.1.1", "kind-of": "^6.0.3", "section-matter": "^1.0.0", "strip-bom-string": "^1.0.0" @@ -6397,9 +6397,9 @@ } }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "license": "MIT", "dependencies": { "argparse": "^2.0.1" diff --git a/package.json b/package.json index ffc418f3a..901b4b7fd 100644 --- a/package.json +++ b/package.json @@ -138,7 +138,7 @@ "@11ty/eleventy-dev-server": "3.0.0-alpha.3", "@11ty/eleventy-plugin-bundle": "^3.0.7", "@11ty/eleventy-utils": "^2.0.7", - "@11ty/gray-matter": "^2.0.0", + "@11ty/gray-matter": "^2.0.1", "@11ty/lodash-custom": "^4.17.21", "@11ty/parse-date-strings": "^2.0.5", "@11ty/posthtml-urls": "^1.0.1", From 34199357551e80aab42cc65ea63119db66a3c706 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 14 Nov 2025 17:31:06 +0000 Subject: [PATCH 42/50] Bump posthtml from 0.16.6 to 0.16.7 Bumps [posthtml](https://github.com/posthtml/posthtml) from 0.16.6 to 0.16.7. - [Release notes](https://github.com/posthtml/posthtml/releases) - [Changelog](https://github.com/posthtml/posthtml/blob/master/changelog.md) - [Commits](https://github.com/posthtml/posthtml/compare/v0.16.6...v0.16.7) --- updated-dependencies: - dependency-name: posthtml dependency-version: 0.16.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 085fa552a..db1fdb24b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,7 +39,7 @@ "nunjucks": "^3.2.4", "picomatch": "^4.0.3", "please-upgrade-node": "^3.2.0", - "posthtml": "^0.16.6", + "posthtml": "^0.16.7", "posthtml-match-helper": "^2.0.3", "semver": "^7.7.3", "tinyglobby": "^0.2.15" @@ -8499,9 +8499,9 @@ } }, "node_modules/posthtml": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.16.6.tgz", - "integrity": "sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==", + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.16.7.tgz", + "integrity": "sha512-7Hc+IvlQ7hlaIfQFZnxlRl0jnpWq2qwibORBhQYIb0QbNtuicc5ZxvKkVT71HJ4Py1wSZ/3VR1r8LfkCtoCzhw==", "license": "MIT", "dependencies": { "posthtml-parser": "^0.11.0", diff --git a/package.json b/package.json index 4e4f396a7..f892fa716 100644 --- a/package.json +++ b/package.json @@ -160,7 +160,7 @@ "nunjucks": "^3.2.4", "picomatch": "^4.0.3", "please-upgrade-node": "^3.2.0", - "posthtml": "^0.16.6", + "posthtml": "^0.16.7", "posthtml-match-helper": "^2.0.3", "semver": "^7.7.3", "tinyglobby": "^0.2.15" From 0eb291ce3b034f9e6fc9b3d918efa28cd09cad1e Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Fri, 14 Nov 2025 11:51:24 -0600 Subject: [PATCH 43/50] Store only under absolute path, retrieval is already normalized to absolute paths --- src/TemplateMap.js | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/TemplateMap.js b/src/TemplateMap.js index b3aa89085..b3e4bb1d0 100644 --- a/src/TemplateMap.js +++ b/src/TemplateMap.js @@ -81,18 +81,10 @@ class TemplateMap { return this.map; } - // NEW: Helper method to add entries to the lookup Map _addToInputPathMap(mapEntry) { - const inputPath = mapEntry.inputPath; - - // Store under the original inputPath - this.inputPathMap.set(inputPath, mapEntry); - - // Also store under absolute path if different - const absoluteInputPath = TemplatePath.absolutePath(inputPath); - if (absoluteInputPath !== inputPath) { - this.inputPathMap.set(absoluteInputPath, mapEntry); - } + // Store under absolute path + let absoluteInputPath = TemplatePath.absolutePath(mapEntry.inputPath); + this.inputPathMap.set(absoluteInputPath, mapEntry); } getTagTarget(str) { From cc3f2a1dee825f633395ff934d1d98c34aab68e6 Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Fri, 14 Nov 2025 11:52:52 -0600 Subject: [PATCH 44/50] Always normalize to absolute path when retrieving map entry --- src/TemplateMap.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/TemplateMap.js b/src/TemplateMap.js index b3e4bb1d0..439095d31 100644 --- a/src/TemplateMap.js +++ b/src/TemplateMap.js @@ -333,15 +333,7 @@ class TemplateMap { return Boolean(this.getMapEntryForInputPath(inputPath)); } - // OPTIMIZED: O(1) lookup instead of O(n) search - Performance improvement for template rendering getMapEntryForInputPath(inputPath) { - // Try direct lookup first (most common case) - let entry = this.inputPathMap.get(inputPath); - if (entry) { - return entry; - } - - // Try absolute path lookup if direct lookup failed let absoluteInputPath = TemplatePath.absolutePath(inputPath); return this.inputPathMap.get(absoluteInputPath); } From f1ceaf0bc746ee991764e058b579f7fcfebe3ace Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Fri, 14 Nov 2025 14:04:51 -0600 Subject: [PATCH 45/50] Fixes #3794, adds page.dir and page.inputPathDir --- src/Filters/Url.js | 2 +- src/Plugins/HtmlBasePlugin.js | 2 +- src/Plugins/InputPathToUrl.js | 2 +- src/Plugins/Pagination.js | 4 +- src/Template.js | 17 ++++-- src/TemplateMap.js | 13 +--- src/Util/HtmlRelativeCopy.js | 2 +- src/Util/PathNormalizer.js | 22 +++++-- src/Util/UrlUtil.js | 24 ++++++++ src/Util/ValidUrl.js | 9 --- test/EleventyTest-PageData.js | 112 ++++++++++++++++++++++++++++++++++ test/EleventyTest.js | 4 +- 12 files changed, 178 insertions(+), 35 deletions(-) create mode 100644 src/Util/UrlUtil.js delete mode 100644 src/Util/ValidUrl.js create mode 100644 test/EleventyTest-PageData.js diff --git a/src/Filters/Url.js b/src/Filters/Url.js index 87fc1e2e3..2b87e554d 100644 --- a/src/Filters/Url.js +++ b/src/Filters/Url.js @@ -1,6 +1,6 @@ import { TemplatePath } from "@11ty/eleventy-utils"; -import isValidUrl from "../Util/ValidUrl.js"; +import { isValidUrl } from "../Util/UrlUtil.js"; // Note: This filter is used in the Eleventy Navigation plugin in versions prior to 0.3.4 export default function (url, pathPrefix) { diff --git a/src/Plugins/HtmlBasePlugin.js b/src/Plugins/HtmlBasePlugin.js index fa5f900c5..1af613926 100644 --- a/src/Plugins/HtmlBasePlugin.js +++ b/src/Plugins/HtmlBasePlugin.js @@ -2,7 +2,7 @@ import { DeepCopy } from "@11ty/eleventy-utils"; import urlFilter from "../Filters/Url.js"; import PathPrefixer from "../Util/PathPrefixer.js"; import { HtmlTransformer } from "../Util/HtmlTransformer.js"; -import isValidUrl from "../Util/ValidUrl.js"; +import { isValidUrl } from "../Util/UrlUtil.js"; function addPathPrefixToUrl(url, pathPrefix, base) { let u; diff --git a/src/Plugins/InputPathToUrl.js b/src/Plugins/InputPathToUrl.js index aca148bf4..1f183b4a7 100644 --- a/src/Plugins/InputPathToUrl.js +++ b/src/Plugins/InputPathToUrl.js @@ -1,6 +1,6 @@ import path from "node:path"; import { TemplatePath } from "@11ty/eleventy-utils"; -import isValidUrl from "../Util/ValidUrl.js"; +import { isValidUrl } from "../Util/UrlUtil.js"; function getValidPath(contentMap, testPath) { // if the path is coming from Markdown, it may be encoded diff --git a/src/Plugins/Pagination.js b/src/Plugins/Pagination.js index 8e5b1ded4..da2f51fb8 100755 --- a/src/Plugins/Pagination.js +++ b/src/Plugins/Pagination.js @@ -337,7 +337,8 @@ class Pagination { // Previous method: // let clonedData = DeepCopy(paginationData, parentData); - let { /*linkInstance,*/ rawPath, path, href } = await cloned.getOutputLocations(clonedData); + let { /*linkInstance,*/ rawPath, path, href, dir } = + await cloned.getOutputLocations(clonedData); // TODO subdirectory to links if the site doesn’t live at / if (rawPath) { links.push("/" + rawPath); @@ -348,6 +349,7 @@ class Pagination { // page.url and page.outputPath are used to avoid another getOutputLocations call later, see Template->addComputedData clonedData.page.url = href; clonedData.page.outputPath = path; + clonedData.page.dir = dir; entries.push({ pageNumber, diff --git a/src/Template.js b/src/Template.js index b2c7b2f62..4c60a1aed 100755 --- a/src/Template.js +++ b/src/Template.js @@ -1,4 +1,4 @@ -import path from "node:path"; +import { parse } from "node:path"; import { statSync } from "node:fs"; import lodash from "@11ty/lodash-custom"; @@ -23,6 +23,8 @@ import ReservedData from "./Util/ReservedData.js"; import TransformsUtil from "./Util/TransformsUtil.js"; import { FileSystemManager } from "./Util/FileSystemManager.js"; import { TemplatePreprocessors } from "./TemplatePreprocessors.js"; +import PathNormalizer from "./Util/PathNormalizer.js"; +import { getDirectoryFromUrl } from "./Util/UrlUtil.js"; const { set: lodashSet, get: lodashGet } = lodash; @@ -39,7 +41,7 @@ class Template extends TemplateContent { debugDev("new Template(%o)", templatePath); super(templatePath, config); - this.parsed = path.parse(templatePath); + this.parsed = parse(templatePath); // for pagination this.extraOutputSubdirectory = ""; @@ -332,11 +334,13 @@ class Template extends TemplateContent { path = link.toPath(this.outputDir); } + let href = link.toHref(); return { linkInstance: link, - rawPath: link.toOutputPath(), - href: link.toHref(), + rawPath: link.toOutputPath(), // includes output directory + href, path: path, + dir: getDirectoryFromUrl(href), // for `page.dir` }; } @@ -450,6 +454,8 @@ class Template extends TemplateContent { // Make sure to keep these keys synchronized in src/Util/ReservedData.js data.page.inputPath = this.inputPath; + // parsed dir never has the trailing slash + data.page.inputPathDir = PathNormalizer.getDirectoryFromFilePath(this.inputPath); data.page.fileSlug = this.fileSlugStr; data.page.filePathStem = this.filePathStem; data.page.outputFileExtension = this.engine.defaultTemplateFileExtension; @@ -648,9 +654,10 @@ class Template extends TemplateContent { return; } - let { href, path } = await this.getOutputLocations(data); + let { href, path, dir } = await this.getOutputLocations(data); data.page.url = href; data.page.outputPath = path; + data.page.dir = dir; } } diff --git a/src/TemplateMap.js b/src/TemplateMap.js index d693b9191..afec1fb30 100644 --- a/src/TemplateMap.js +++ b/src/TemplateMap.js @@ -4,16 +4,12 @@ import debugUtil from "debug"; import TemplateCollection from "./TemplateCollection.js"; import EleventyErrorUtil from "./Errors/EleventyErrorUtil.js"; import UsingCircularTemplateContentReferenceError from "./Errors/UsingCircularTemplateContentReferenceError.js"; -import EleventyBaseError from "./Errors/EleventyBaseError.js"; import DuplicatePermalinkOutputError from "./Errors/DuplicatePermalinkOutputError.js"; import TemplateData from "./Data/TemplateData.js"; import GlobalDependencyMap from "./GlobalDependencyMap.js"; const debug = debugUtil("Eleventy:TemplateMap"); -class EleventyMapPagesError extends EleventyBaseError {} -class EleventyDataSchemaError extends EleventyBaseError {} - // These template URL filenames are allowed to exclude file extensions const EXTENSIONLESS_URL_ALLOWLIST = [ "/_redirects", // Netlify specific @@ -204,10 +200,7 @@ class TemplateMap { try { map._pages = await map.template.getTemplates(map.data); } catch (e) { - throw new EleventyMapPagesError( - "Error generating template page(s) for " + map.inputPath + ".", - e, - ); + throw new Error("Error generating template page(s) for " + map.inputPath + ".", { cause: e }); } if (map._pages.length === 0) { @@ -359,9 +352,9 @@ class TemplateMap { try { await pageEntry.data[this.config.keys.dataSchema](pageEntry.data); } catch (e) { - throw new EleventyDataSchemaError( + throw new Error( `Error in the data schema for: ${map.inputPath} (via \`eleventyDataSchema\`)`, - e, + { cause: e }, ); } } diff --git a/src/Util/HtmlRelativeCopy.js b/src/Util/HtmlRelativeCopy.js index fe2ebe1a2..907b7fbf1 100644 --- a/src/Util/HtmlRelativeCopy.js +++ b/src/Util/HtmlRelativeCopy.js @@ -1,6 +1,6 @@ import path from "node:path"; import { TemplatePath } from "@11ty/eleventy-utils"; -import isValidUrl from "../Util/ValidUrl.js"; +import { isValidUrl } from "./UrlUtil.js"; import { isGlobMatch } from "./GlobMatcher.js"; // https://github.com/11ty/eleventy/pull/3573 diff --git a/src/Util/PathNormalizer.js b/src/Util/PathNormalizer.js index 7afe383b9..eedcf69d3 100644 --- a/src/Util/PathNormalizer.js +++ b/src/Util/PathNormalizer.js @@ -1,4 +1,4 @@ -import path from "node:path"; +import { parse, sep } from "node:path"; import { TemplatePath } from "@11ty/eleventy-utils"; import { fileURLToPath } from "../Adapters/Packages/url.js"; @@ -9,8 +9,8 @@ export default class PathNormalizer { } let separator = "/"; - if (inputPath.includes(path.sep)) { - separator = path.sep; + if (inputPath.includes(sep)) { + separator = sep; } return inputPath.split(separator).filter((entry) => entry !== "."); @@ -35,7 +35,21 @@ export default class PathNormalizer { if (!inputPath) { return inputPath; } - return inputPath.split(path.sep).join("/"); + return inputPath.split(sep).join("/"); + } + + static addTrailingSlashToDirectory(dir) { + if (dir.endsWith("/")) { + return dir; + } + + return dir + sep; + } + + // returns a path + static getDirectoryFromFilePath(filePath) { + let parsed = parse(filePath); + return this.addTrailingSlashToDirectory(parsed.dir); } static fullNormalization(inputPath) { diff --git a/src/Util/UrlUtil.js b/src/Util/UrlUtil.js new file mode 100644 index 000000000..61685d5c1 --- /dev/null +++ b/src/Util/UrlUtil.js @@ -0,0 +1,24 @@ +export function isValidUrl(url) { + try { + new URL(url); + return true; + } catch (e) { + // invalid url OR local path + return false; + } +} + +export function getDirectoryFromUrl(url) { + if (url === false) { + return false; + } + + // returns a url + if (url.endsWith("/")) { + return url; + } + + let parts = url.split("/"); + parts.pop(); + return parts.join("/") + "/"; +} diff --git a/src/Util/ValidUrl.js b/src/Util/ValidUrl.js deleted file mode 100644 index 9d0f59ba1..000000000 --- a/src/Util/ValidUrl.js +++ /dev/null @@ -1,9 +0,0 @@ -export default function isValidUrl(url) { - try { - new URL(url); - return true; - } catch (e) { - // invalid url OR local path - return false; - } -} diff --git a/test/EleventyTest-PageData.js b/test/EleventyTest-PageData.js new file mode 100644 index 000000000..c25fc3ddf --- /dev/null +++ b/test/EleventyTest-PageData.js @@ -0,0 +1,112 @@ +import test from "ava"; +import Eleventy from "../src/Eleventy.js"; + +test("#3794: page.inputPathDir and page.dir", async (t) => { + let elev = new Eleventy("./test/stubs-virtual/", undefined, { + config: function(eleventyConfig) { + eleventyConfig.addTemplate("test.njk", `{{ page.inputPathDir }} and {{ page.dir }}`, {}); + } + }); + + let [result] = await elev.toJSON(); + t.is(result.content, "./test/stubs-virtual/ and /test/"); +}); + +test("#3794: page.inputPathDir and page.dir (index file)", async (t) => { + let elev = new Eleventy("./test/stubs-virtual/", undefined, { + config: function(eleventyConfig) { + eleventyConfig.addTemplate("index.njk", `{{ page.inputPathDir }} and {{ page.dir }}`, {}); + } + }); + + let [result] = await elev.toJSON(); + t.is(result.content, "./test/stubs-virtual/ and /"); +}); + +test("#3794: page.inputPathDir and page.dir (paginated)", async (t) => { + let elev = new Eleventy("./test/stubs-virtual/", undefined, { + config: function(eleventyConfig) { + eleventyConfig.addTemplate("index.njk", `{{ page.inputPathDir }} and {{ page.dir }}`, { + data: [1,2,3], + pagination: { + data: "data", + size: 1, + } + }); + } + }); + + let results = await elev.toJSON(); + t.is(results.length, 3); + + let [page1, page2, page3] = results; + t.is(page1.content, "./test/stubs-virtual/ and /"); + t.is(page2.content, "./test/stubs-virtual/ and /1/"); + t.is(page3.content, "./test/stubs-virtual/ and /2/"); +}); + +test("#3794: page.inputPathDir and page.dir (with file slug and index)", async (t) => { + let elev = new Eleventy("./test/stubs-virtual/", undefined, { + config: function(eleventyConfig) { + eleventyConfig.addTemplate("yawn/index.njk", `{{ page.inputPathDir }} and {{ page.dir }}`, { + permalink: "/{{ page.filePathStem }}.{{ page.outputFileExtension }}" + }); + } + }); + + let results = await elev.toJSON(); + t.is(results.length, 1); + + let [page1] = results; + t.is(page1.content, "./test/stubs-virtual/yawn/ and /yawn/"); +}); + +test("#3794: page.inputPathDir and page.dir (with file slug and not-index)", async (t) => { + let elev = new Eleventy("./test/stubs-virtual/", undefined, { + config: function(eleventyConfig) { + eleventyConfig.addTemplate("yawn/test.njk", `{{ page.inputPathDir }} and {{ page.dir }}`, { + permalink: "/{{ page.filePathStem }}.{{ page.outputFileExtension }}" + }); + } + }); + + let results = await elev.toJSON(); + t.is(results.length, 1); + + let [page1] = results; + t.is(page1.content, "./test/stubs-virtual/yawn/ and /yawn/"); +}); + +test("#3794: page.inputPathDir and page.dir (paginated with file slug and not-index)", async (t) => { + let elev = new Eleventy("./test/stubs-virtual/", undefined, { + config: function(eleventyConfig) { + eleventyConfig.addTemplate("yawn/test.njk", `{{ page.inputPathDir }} and {{ page.dir }}`, { + data: [1,2,3], + pagination: { + data: "data", + size: 1, + }, + permalink: "/{{ pagination.pageNumber }}/{{ page.filePathStem }}.{{ page.outputFileExtension }}" + }); + } + }); + + let results = await elev.toJSON(); + t.is(results.length, 3); + + let [page1, page2, page3] = results; + t.is(page1.content, "./test/stubs-virtual/yawn/ and /0/yawn/"); + t.is(page2.content, "./test/stubs-virtual/yawn/ and /1/yawn/"); + t.is(page3.content, "./test/stubs-virtual/yawn/ and /2/yawn/"); +}); + +test("#3794: page.inputPathDir and page.dir (permalink: false)", async (t) => { + let elev = new Eleventy("./test/stubs-virtual/", undefined, { + config: function(eleventyConfig) { + eleventyConfig.addTemplate("index.njk", `{{ page.inputPathDir }} and {{ page.dir }}`, { permalink: false }); + } + }); + + let [result] = await elev.toJSON(); + t.is(result.content, "./test/stubs-virtual/ and false"); +}); diff --git a/test/EleventyTest.js b/test/EleventyTest.js index d3afdef9d..cbfe9e65c 100644 --- a/test/EleventyTest.js +++ b/test/EleventyTest.js @@ -1193,7 +1193,7 @@ test("Eleventy data schema (fails) #879", async (t) => { message: 'Error in the data schema for: ./test/stubs-virtual/index1.html (via `eleventyDataSchema`)' }); - t.is(e.originalError.toString(), "Error: Invalid data type for draft."); + t.is(e.cause.toString(), "Error: Invalid data type for draft."); }); test("Eleventy data schema (fails, using zod) #879", async (t) => { @@ -1219,7 +1219,7 @@ test("Eleventy data schema (fails, using zod) #879", async (t) => { message: 'Error in the data schema for: ./test/stubs-virtual/index1.html (via `eleventyDataSchema`)' }); - t.is(e.originalError.toString(), 'Validation error: Expected boolean, received number at "draft", or Expected undefined, received number at "draft"'); + t.is(e.cause.toString(), 'Validation error: Expected boolean, received number at "draft", or Expected undefined, received number at "draft"'); }); test("Eleventy data schema has access to custom collections created via API #879", async (t) => { From f422405c36c316b5a620788316b4006cd807a069 Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Fri, 14 Nov 2025 14:12:49 -0600 Subject: [PATCH 46/50] Windows fix --- src/Util/PathNormalizer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Util/PathNormalizer.js b/src/Util/PathNormalizer.js index eedcf69d3..88577dcbf 100644 --- a/src/Util/PathNormalizer.js +++ b/src/Util/PathNormalizer.js @@ -43,7 +43,7 @@ export default class PathNormalizer { return dir; } - return dir + sep; + return dir + "/"; } // returns a path From bbd617a1f2d2ae4a70503340e24f1e23bf16ad67 Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Fri, 14 Nov 2025 14:18:32 -0600 Subject: [PATCH 47/50] Slightly incorrect use of filePathStem in tests --- test/EleventyTest-PageData.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/EleventyTest-PageData.js b/test/EleventyTest-PageData.js index c25fc3ddf..8fe703a84 100644 --- a/test/EleventyTest-PageData.js +++ b/test/EleventyTest-PageData.js @@ -49,7 +49,7 @@ test("#3794: page.inputPathDir and page.dir (with file slug and index)", async ( let elev = new Eleventy("./test/stubs-virtual/", undefined, { config: function(eleventyConfig) { eleventyConfig.addTemplate("yawn/index.njk", `{{ page.inputPathDir }} and {{ page.dir }}`, { - permalink: "/{{ page.filePathStem }}.{{ page.outputFileExtension }}" + permalink: "{{ page.filePathStem }}.{{ page.outputFileExtension }}" }); } }); @@ -65,7 +65,7 @@ test("#3794: page.inputPathDir and page.dir (with file slug and not-index)", asy let elev = new Eleventy("./test/stubs-virtual/", undefined, { config: function(eleventyConfig) { eleventyConfig.addTemplate("yawn/test.njk", `{{ page.inputPathDir }} and {{ page.dir }}`, { - permalink: "/{{ page.filePathStem }}.{{ page.outputFileExtension }}" + permalink: "{{ page.filePathStem }}.{{ page.outputFileExtension }}" }); } }); @@ -86,7 +86,7 @@ test("#3794: page.inputPathDir and page.dir (paginated with file slug and not-in data: "data", size: 1, }, - permalink: "/{{ pagination.pageNumber }}/{{ page.filePathStem }}.{{ page.outputFileExtension }}" + permalink: "/{{ pagination.pageNumber }}{{ page.filePathStem }}.{{ page.outputFileExtension }}" }); } }); From f783eb393d671ea80349afafd58151c5aaa59618 Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Fri, 14 Nov 2025 15:21:17 -0600 Subject: [PATCH 48/50] Fixes #3507 --- src/Engines/Liquid.js | 2 +- test/TemplateRenderLiquidTest.js | 19 +++++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/Engines/Liquid.js b/src/Engines/Liquid.js index d13ee62d5..8014ad43e 100644 --- a/src/Engines/Liquid.js +++ b/src/Engines/Liquid.js @@ -49,8 +49,8 @@ export default class Liquid extends TemplateEngine { root: [this.dirs.includes, this.dirs.input], // supplemented in compile with inputPath below extname: ".liquid", strictFilters: true, - // TODO? // cache: true, + jsTruthy: true, // Breaking in v4 #3507 }; let options = Object.assign(defaults, this.liquidOptions || {}); diff --git a/test/TemplateRenderLiquidTest.js b/test/TemplateRenderLiquidTest.js index e041b7523..e5797035a 100644 --- a/test/TemplateRenderLiquidTest.js +++ b/test/TemplateRenderLiquidTest.js @@ -692,8 +692,9 @@ test("Liquid Render Scope Leak", async (t) => { t.is(tr1.getEngineName(), "liquid"); let tr2 = await getNewTemplateRender("liquid", "./test/stubs/"); - let fn = await tr2.getCompiledTemplate("

{% render 'scopeleak' %}{{ test }}

"); - t.is(await fn({ test: 1 }), "

21

"); + // see scopeleak.liquid + let fn = await tr2.getCompiledTemplate("

{% render 'scopeleak' %}-{{ test }}

"); + t.is(await fn({ test: 1 }), "

2-1

"); }); // Note: this strictFilters default changed in 1.0 from false to true @@ -1157,3 +1158,17 @@ test("Eleventy paired shortcode uses new built-in Liquid argument parsing behavi let [result] = await elev.toJSON(); t.deepEqual(result.content, `["hi",123,456]`); }); + +test("jsTruthy default changed, breaking in v4 #3507", async (t) => { + let elev = new Eleventy("./test/stubs-virtual/", undefined, { + config: eleventyConfig => { + eleventyConfig.addTemplate("index.liquid", `{% if emptyString %}notempty{% endif %}-{% if zero %}notzero{% endif %}-{% if not emptyString %}empty{% endif %}-{% if not zero %}zero{% endif %}`, { + emptyString: "", + zero: 0 + }); + } + }); + + let [result] = await elev.toJSON(); + t.deepEqual(result.content, `--empty-zero`); +}); From b84a1d7bf965182d14f30715389fcfa11f270969 Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Fri, 14 Nov 2025 15:29:25 -0600 Subject: [PATCH 49/50] Fixes #4047 --- src/UserConfig.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/UserConfig.js b/src/UserConfig.js index 32c1d052c..687a7276c 100644 --- a/src/UserConfig.js +++ b/src/UserConfig.js @@ -106,7 +106,7 @@ class UserConfig { filters: {}, shortcodes: {}, pairedShortcodes: {}, - parameterParsing: "legacy", // or builtin + parameterParsing: "builtin", // or legacy (Breaking: default swapped in v4.0.0) }; /** @type {object} */ From 5ea252e08aac8742ed79650171829a53373923d4 Mon Sep 17 00:00:00 2001 From: Zach Leatherman Date: Fri, 14 Nov 2025 16:17:40 -0600 Subject: [PATCH 50/50] Fixes #1541 --- src/Engines/Liquid.js | 6 ++++++ test/TemplateRenderLiquidTest.js | 11 +++++++++++ test/stubs/stubs-1541/_includes/render-source.liquid | 1 + 3 files changed, 18 insertions(+) create mode 100644 test/stubs/stubs-1541/_includes/render-source.liquid diff --git a/src/Engines/Liquid.js b/src/Engines/Liquid.js index 8014ad43e..6bd118fb2 100644 --- a/src/Engines/Liquid.js +++ b/src/Engines/Liquid.js @@ -325,6 +325,12 @@ export default class Liquid extends TemplateEngine { return async function (data) { let tmpl = await tmplReady; + options.globals = { + page: data?.page, + eleventy: data?.eleventy, + collections: data?.collections, + }; + return engine.render(tmpl, data, options); }; } diff --git a/test/TemplateRenderLiquidTest.js b/test/TemplateRenderLiquidTest.js index e5797035a..fecf67963 100644 --- a/test/TemplateRenderLiquidTest.js +++ b/test/TemplateRenderLiquidTest.js @@ -1172,3 +1172,14 @@ test("jsTruthy default changed, breaking in v4 #3507", async (t) => { let [result] = await elev.toJSON(); t.deepEqual(result.content, `--empty-zero`); }); + +test("Use globals for page/eleventy/collections for use inside {% render %} #1541", async (t) => { + let elev = new Eleventy("./test/stubs/stubs-1541/", undefined, { + config: eleventyConfig => { + eleventyConfig.addTemplate("index.liquid", `{% render "render-source.liquid" %}`); + } + }); + + let [result] = await elev.toJSON(); + t.deepEqual(result.content, `/ via script collections.all size: 1`); +}); diff --git a/test/stubs/stubs-1541/_includes/render-source.liquid b/test/stubs/stubs-1541/_includes/render-source.liquid new file mode 100644 index 000000000..949f33107 --- /dev/null +++ b/test/stubs/stubs-1541/_includes/render-source.liquid @@ -0,0 +1 @@ +{{ page.url }} via {{ eleventy.env.source }} collections.all size: {{ collections.all | size }} \ No newline at end of file