diff --git a/.gitignore b/.gitignore index 6e554580..ee2fb41e 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,6 @@ dist/ node_modules/ !/bun.lock -/.claude/ /coverage/ # auto-generated diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 830b672d..2566a6f8 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -2,7 +2,6 @@ "recommendations": [ "biomejs.biome", "dbaeumer.vscode-eslint", - "MylesMurphy.prettify-ts", "oven.bun-vscode", "stylelint.vscode-stylelint", "tekumara.typos-vscode", diff --git a/.vscode/mcp.json b/.vscode/mcp.json deleted file mode 100644 index 971adb7f..00000000 --- a/.vscode/mcp.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "servers": { - "filesystem": { - "command": "bunx", - "args": ["@modelcontextprotocol/server-filesystem", "${workspaceFolder}"] - } - } -} diff --git a/bun.lock b/bun.lock index 0947b831..065aa064 100644 --- a/bun.lock +++ b/bun.lock @@ -4,23 +4,23 @@ "workspaces": { "": { "devDependencies": { - "@biomejs/biome": "2.5.10", + "@biomejs/biome": "2.5.14", "@eslint/js": "10.0.1", "@maxmilton/eslint-config": "0.3.5", "@maxmilton/stylelint-config": "0.4.4", "@maxmilton/test-utils": "0.0.18", - "@types/bun": "1.4.0", - "@types/node": "26.3.0", - "c8": "11.0.0", + "@types/bun": "1.4.2", + "@types/node": "26.6.2", + "c8": "12.0.0", "ekscss": "workspace:*", - "eslint": "10.9.1", - "eslint-plugin-unicorn": "70.0.0", + "eslint": "10.11.0", + "eslint-plugin-unicorn": "76.0.0", "postcss-ekscss": "workspace:*", - "stylelint": "17.14.1", + "stylelint": "17.15.0", "stylelint-config-standard": "40.0.0", - "turbo": "2.10.12", + "turbo": "2.11.2", "typescript": "6.0.3", - "typescript-eslint": "8.68.0", + "typescript-eslint": "8.70.1", "uvu": "0.5.6", }, }, @@ -33,7 +33,7 @@ }, "packages/bun-plugin-ekscss": { "name": "bun-plugin-ekscss", - "version": "0.0.3", + "version": "0.0.4-next.0", "dependencies": { "@ekscss/config-loader": "workspace:^", }, @@ -46,7 +46,7 @@ }, "packages/cli": { "name": "@ekscss/cli", - "version": "0.0.21", + "version": "0.0.22-next.0", "bin": { "ekscss": "bin.js", "xcss": "bin.js", @@ -63,21 +63,23 @@ "version": "0.0.3", "devDependencies": { "@ekscss/build-tools": "workspace:*", - "esbuild": "0.28.1", + "esbuild": "0.28.2", }, }, "packages/ekscss": { "name": "ekscss", - "version": "0.0.23", + "version": "0.0.24-next.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.13", + "@jridgewell/remapping": "^2.3.5", "@types/stylis": "^4.2.7", "stylis": "^4.3.6", }, "devDependencies": { "@ekscss/build-tools": "workspace:*", "@ekscss/plugin-null": "workspace:*", - "esbuild": "0.28.1", + "@jridgewell/trace-mapping": "0.3.31", + "esbuild": "0.28.2", }, }, "packages/esbuild-plugin-ekscss": { @@ -88,7 +90,7 @@ }, "devDependencies": { "ekscss": "workspace:*", - "esbuild": "0.28.1", + "esbuild": "0.28.2", }, "peerDependencies": { "ekscss": "workspace:^", @@ -97,7 +99,7 @@ }, "packages/framework": { "name": "@ekscss/framework", - "version": "0.0.60", + "version": "0.0.61-next.0", "dependencies": { "@ekscss/plugin-apply": "workspace:^", "@ekscss/plugin-import": "workspace:^", @@ -119,14 +121,14 @@ }, "packages/plugin-apply": { "name": "@ekscss/plugin-apply", - "version": "0.0.18", + "version": "0.0.19-next.0", "dependencies": { "stylis": "^4.3.6", }, "devDependencies": { "@ekscss/build-tools": "workspace:*", "ekscss": "workspace:*", - "esbuild": "0.28.1", + "esbuild": "0.28.2", }, "peerDependencies": { "ekscss": "workspace:^", @@ -134,14 +136,15 @@ }, "packages/plugin-import": { "name": "@ekscss/plugin-import", - "version": "0.0.18", + "version": "0.0.19-next.0", "dependencies": { "stylis": "^4.3.6", }, "devDependencies": { "@ekscss/build-tools": "workspace:*", + "@jridgewell/trace-mapping": "0.3.31", "ekscss": "workspace:*", - "esbuild": "0.28.1", + "esbuild": "0.28.2", }, "peerDependencies": { "ekscss": "workspace:^", @@ -156,14 +159,14 @@ }, "packages/plugin-prefix": { "name": "@ekscss/plugin-prefix", - "version": "0.0.17", + "version": "0.0.18-next.0", "dependencies": { "stylis": "^4.3.6", }, "devDependencies": { "@ekscss/build-tools": "workspace:*", "ekscss": "workspace:*", - "esbuild": "0.28.1", + "esbuild": "0.28.2", }, "peerDependencies": { "ekscss": "workspace:^", @@ -171,11 +174,11 @@ }, "packages/postcss-ekscss": { "name": "postcss-ekscss", - "version": "0.0.15", + "version": "0.0.16-next.0", "devDependencies": { "@ekscss/build-tools": "workspace:*", - "esbuild": "0.28.1", - "postcss": "8.5.16", + "esbuild": "0.28.2", + "postcss": "8.5.28", }, "peerDependencies": { "postcss": "^8.0.0", @@ -194,8 +197,8 @@ "devDependencies": { "@ekscss/build-tools": "workspace:*", "ekscss": "workspace:*", - "esbuild": "0.28.1", - "rollup": "4.63.0", + "esbuild": "0.28.2", + "rollup": "4.63.4", }, "peerDependencies": { "ekscss": "workspace:^", @@ -212,8 +215,8 @@ "devDependencies": { "@ekscss/build-tools": "workspace:*", "ekscss": "workspace:*", - "esbuild": "0.28.1", - "svelte": "5.56.10", + "esbuild": "0.28.2", + "svelte": "5.57.1", }, "peerDependencies": { "ekscss": "workspace:^", @@ -228,35 +231,35 @@ "@bcoe/v8-coverage": ["@bcoe/v8-coverage@1.0.2", "", {}, "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA=="], - "@biomejs/biome": ["@biomejs/biome@2.5.10", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.5.10", "@biomejs/cli-darwin-x64": "2.5.10", "@biomejs/cli-linux-arm64": "2.5.10", "@biomejs/cli-linux-arm64-musl": "2.5.10", "@biomejs/cli-linux-x64": "2.5.10", "@biomejs/cli-linux-x64-musl": "2.5.10", "@biomejs/cli-win32-arm64": "2.5.10", "@biomejs/cli-win32-x64": "2.5.10" }, "bin": { "biome": "bin/biome" } }, "sha512-WRKXARA3kTuiV5sxqTpobJ/I0MVd4vk3pOL6wnp5az4LntFIhWTj1RWZq3DI9PCEN3lXcqy7p5aqUHzvq8AXyQ=="], + "@biomejs/biome": ["@biomejs/biome@2.5.14", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.5.14", "@biomejs/cli-darwin-x64": "2.5.14", "@biomejs/cli-linux-arm64": "2.5.14", "@biomejs/cli-linux-arm64-musl": "2.5.14", "@biomejs/cli-linux-x64": "2.5.14", "@biomejs/cli-linux-x64-musl": "2.5.14", "@biomejs/cli-win32-arm64": "2.5.14", "@biomejs/cli-win32-x64": "2.5.14" }, "bin": { "biome": "bin/biome" } }, "sha512-0FabLIjd4M/dm8VFI86RMaLLdgepzbdfiAL2R8cr7V81OYYrP1w7Z73KfAwPK5h9SrEBXTzNG2y+mBwPo9xRnw=="], - "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.5.10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ItCrxKK6SXVT6flYs0qIuBd4AA3TTTl4d66Re6YI2FuGZnN85NmuYNzkiTJUyYw8qBLv69L5zTUB6uyWd++h3Q=="], + "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.5.14", "", { "os": "darwin", "cpu": "arm64" }, "sha512-UnzaXO65L4tsZimFITFP2M121GyhDcWFrT3pL5ZJ5U4XcS/0L5VHYytVohdCf/gnDUFHgl2I9xnt5bV/J1kxHQ=="], - "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.5.10", "", { "os": "darwin", "cpu": "x64" }, "sha512-yLsPU9pAmtChXDu8vhKAzErqe+LeeYuwuUB2FZMkRitsmdodxsYRa9KHrFispsUHzzOu+9HB3nP/TQxyia+Sjw=="], + "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.5.14", "", { "os": "darwin", "cpu": "x64" }, "sha512-kiy8qA16K93J7uvFfWi4LgjqDpnRKyePAna6A0Y4jxyUga35SYpIZ2cNWlhy0lsfgqRenCpfymnJWEZ6mgpRgA=="], - "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.5.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-VG8uQW/86a1roLaIFvtIbEigxIdzdJ190oGyg1tV7VYeQtOS+x10sflk7WbuXgw91EtZX5DlIIIej1YqkNLlcg=="], + "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.5.14", "", { "os": "linux", "cpu": "arm64" }, "sha512-vO/9BaU1n30CiFNLx49gMTMtbCAAqlo/EqFoG0BU3deQInTbJrmXSmTQ9e3FoDZIKQnvSLDVNL4lx1ci7y1T1Q=="], - "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.5.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-t1QAKZwQJRB4dvgJSgFiQ4BNfNPChg69BNonz854qLVxnjT3UvDzQg9mbkTJRu35ZqU0Rw10A73J8Urgbg2RPw=="], + "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.5.14", "", { "os": "linux", "cpu": "arm64" }, "sha512-SJ9PrZkBnnH9dHJDnxk34vKs0GB2dbsioaft6/hPhWJ7AHpwYH83Isnhj0FSRpFkGgpVfJ1lds23ApB2czUDLQ=="], - "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.5.10", "", { "os": "linux", "cpu": "x64" }, "sha512-4O6T0eq2heoHZN0a9UX+rWQoxXEBaKf+lRi2hbsGlHneUz9BWXM76nEWMK7Eeq8gzMxR1khQB6BFpAASpeXqGg=="], + "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.5.14", "", { "os": "linux", "cpu": "x64" }, "sha512-VHZRa7CCQBUWKxNwUvHJeuW03WFRgN5NWO//SDGOitc9QIeNyfA42V9zlKm+x82xFSG9Bzi5fi+hbhm9anO8yA=="], - "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.5.10", "", { "os": "linux", "cpu": "x64" }, "sha512-pgDDqp9JybHm2I0KRgzN6i4+lt8xu4iqxUwLzglUMmOmyRTU1AYBGKzh9sNMOtIjah7xoWvKHlLVetvyifzoiQ=="], + "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.5.14", "", { "os": "linux", "cpu": "x64" }, "sha512-2kI5PrMgW5dcEZYrstLPmUmCwkUwZY39rP4BN93Vxbwcs2O57LDQOktUZZYPvvspN5i0mhGr3TJtF5sU26NUWg=="], - "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.5.10", "", { "os": "win32", "cpu": "arm64" }, "sha512-pxAbxduPO4xq/Cvgaa2lOrs9BB0hEXmmDqfMNP4ZOffGOkUrD1/QGw9UAMpFQpX2P8MqTIIRuQKcmetum4Oa6A=="], + "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.5.14", "", { "os": "win32", "cpu": "arm64" }, "sha512-pHgAFffmZtaYoxavEsWEYNvcA7NwOIjLyqw2HXyLbt16xYryX0L4fMV2u0G9ag6LNYPIoqWaWqzUcnc6rLGGXg=="], - "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.5.10", "", { "os": "win32", "cpu": "x64" }, "sha512-M+2dgBsl3lXRiTfgPVc2p3anS4Tocojke4rzFLScZ2Y/wmF+36dRb1iHCLiyGqOzQGyTplZH1HnEYviiAqi3nA=="], + "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.5.14", "", { "os": "win32", "cpu": "x64" }, "sha512-oJWmBhoHsnhUKIke+0gXDX0mltJrWHA1UyHsrTlXwX0TL64ilVZAo+TYZm97baecV0esBdpzy3k96q+09JaZUQ=="], "@cacheable/memory": ["@cacheable/memory@2.2.0", "", { "dependencies": { "@cacheable/utils": "^2.5.0", "@keyv/bigmap": "^1.3.1", "hookified": "^1.15.1", "keyv": "^5.6.0" } }, "sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ=="], "@cacheable/utils": ["@cacheable/utils@2.5.0", "", { "dependencies": { "hashery": "^1.5.1", "keyv": "^5.6.0" } }, "sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA=="], - "@csstools/css-calc": ["@csstools/css-calc@3.3.0", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0" } }, "sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ=="], + "@csstools/css-calc": ["@csstools/css-calc@3.4.0", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0" } }, "sha512-XQKj5B7QiZcHiegCOCAzcAOJdhGgWOHbbu62h5e5mkHnn8lWcfiJhllkqWmxu5zWR9jucPHuo1iTB56P033hcg=="], "@csstools/css-parser-algorithms": ["@csstools/css-parser-algorithms@4.0.0", "", { "peerDependencies": { "@csstools/css-tokenizer": "^4.0.0" } }, "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w=="], - "@csstools/css-syntax-patches-for-csstree": ["@csstools/css-syntax-patches-for-csstree@1.1.9", "", { "peerDependencies": { "css-tree": "^3.2.1" }, "optionalPeers": ["css-tree"] }, "sha512-iGGw4OsAYsS6pD29MdJ2bX/nJx65a04ZZiw6x+VwWlP2DdXf6f++Zmuv/OzALpdyfVhjbduIIF2cXM7HWBIe9A=="], + "@csstools/css-syntax-patches-for-csstree": ["@csstools/css-syntax-patches-for-csstree@1.1.14", "", { "peerDependencies": { "css-tree": "^3.2.1" }, "optionalPeers": ["css-tree"] }, "sha512-HpbVXyrofRXpHpgkNIjU/3EWR4WJvOkO3emNK/L6X/mTJU7bGUI3AkkpoTNXznQLp0KRjLHELTGeKI5dIkI9JQ=="], - "@csstools/css-tokenizer": ["@csstools/css-tokenizer@4.0.0", "", {}, "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA=="], + "@csstools/css-tokenizer": ["@csstools/css-tokenizer@4.0.1", "", {}, "sha512-bPlN9S9O1A0euCpEWE4qnvB5YDuyYVsUTrxSgmAM1Is0j4tICHoVyOVAXfWMP/kS9ZrjvyIXWV2PmomiAXXqOw=="], "@csstools/media-query-list-parser": ["@csstools/media-query-list-parser@5.0.0", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0" } }, "sha512-T9lXmZOfnam3eMERPsszjY5NK0jX8RmThmmm99FZ8b7z8yMaFZWKwLWGZuTwdO3ddRY5fy13GmmEYZXB4I98Eg=="], @@ -280,57 +283,57 @@ "@ekscss/plugin-prefix": ["@ekscss/plugin-prefix@workspace:packages/plugin-prefix"], - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ=="], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ=="], - "@esbuild/android-arm": ["@esbuild/android-arm@0.28.1", "", { "os": "android", "cpu": "arm" }, "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ=="], + "@esbuild/android-arm": ["@esbuild/android-arm@0.28.2", "", { "os": "android", "cpu": "arm" }, "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg=="], - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.28.1", "", { "os": "android", "cpu": "arm64" }, "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg=="], + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.28.2", "", { "os": "android", "cpu": "arm64" }, "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A=="], - "@esbuild/android-x64": ["@esbuild/android-x64@0.28.1", "", { "os": "android", "cpu": "x64" }, "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng=="], + "@esbuild/android-x64": ["@esbuild/android-x64@0.28.2", "", { "os": "android", "cpu": "x64" }, "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q=="], - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.28.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q=="], + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.28.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw=="], - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.28.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ=="], + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.28.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw=="], - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.28.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw=="], + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.28.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw=="], - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.28.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ=="], + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.28.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg=="], - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.28.1", "", { "os": "linux", "cpu": "arm" }, "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ=="], + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.28.2", "", { "os": "linux", "cpu": "arm" }, "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w=="], - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.28.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g=="], + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.28.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug=="], - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.28.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w=="], + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.28.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ=="], - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg=="], + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.28.2", "", { "os": "linux", "cpu": "none" }, "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ=="], - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ=="], + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.28.2", "", { "os": "linux", "cpu": "none" }, "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA=="], - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.28.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ=="], + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.28.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ=="], - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ=="], + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.28.2", "", { "os": "linux", "cpu": "none" }, "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA=="], - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.28.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag=="], + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.28.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg=="], - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.28.1", "", { "os": "linux", "cpu": "x64" }, "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA=="], + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.28.2", "", { "os": "linux", "cpu": "x64" }, "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ=="], - "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw=="], + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.28.2", "", { "os": "none", "cpu": "arm64" }, "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw=="], - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.28.1", "", { "os": "none", "cpu": "x64" }, "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg=="], + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.28.2", "", { "os": "none", "cpu": "x64" }, "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw=="], - "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.28.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q=="], + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.28.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ=="], - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.28.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw=="], + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.28.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw=="], - "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg=="], + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.28.2", "", { "os": "none", "cpu": "arm64" }, "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q=="], - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.28.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ=="], + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.28.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g=="], - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.28.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA=="], + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.28.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ=="], - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.28.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg=="], + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.28.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA=="], - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.1", "", { "os": "win32", "cpu": "x64" }, "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A=="], + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.2", "", { "os": "win32", "cpu": "x64" }, "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g=="], "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.10.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg=="], @@ -342,11 +345,13 @@ "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], + "@eslint/css-tree": ["@eslint/css-tree@4.1.1", "", { "dependencies": { "mdn-data": "2.35.0", "source-map-js": "^1.2.1" } }, "sha512-A+s89eP+yDAPkKjnIOfjlkGifg5J7GPn01nWx14UjBVWktfkxOU4975F9ZZ13xNxkGiblNcBaAqgKhnQrW6SWA=="], + "@eslint/js": ["@eslint/js@10.0.1", "", { "peerDependencies": { "eslint": "^10.0.0" }, "optionalPeers": ["eslint"] }, "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA=="], "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.3", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q=="], "@humanfs/core": ["@humanfs/core@0.19.2", "", { "dependencies": { "@humanfs/types": "^0.15.0" } }, "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA=="], @@ -366,7 +371,7 @@ "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], - "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.6.0", "", {}, "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw=="], "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], @@ -392,73 +397,73 @@ "@rollup/pluginutils": ["@rollup/pluginutils@5.4.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg=="], - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.63.0", "", { "os": "android", "cpu": "arm" }, "sha512-70TeIFezKKy65LgAVyQh+w94/gjWhvPWaLaGGeMEgVrPkQhuj/M5bAYYZzIFUj9Y69oHyTm5Um/R6gcLh4A8JA=="], + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.63.4", "", { "os": "android", "cpu": "arm" }, "sha512-I+BSHzTAhKN2n7ZwGZsegGcZjDpLqFOMAtJz/u6uFGe0pUFbq56dEHjqJV/ZUdRJtNXNxA+hREUatZBvMR3Oiw=="], - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.63.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YC86tYIHK6M1IV+wbzO+Bxk8RCBr6ZyWYgWxUCzaZD8mc8rrFoIJDNzDrkHBYRc/wKdrsIXmm6/F7NzrAO+OrA=="], + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.63.4", "", { "os": "android", "cpu": "arm64" }, "sha512-pu3BdjS2LtEzRu2elmGzS3fIeWSZy4BMDIaLNwjorO76+k2d0LMluijhsDx3KQyQBQ/lLUZCQA9/s6csvUfuhw=="], - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.63.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-oI+ECtUcli0y0fi4xpW82GdPIXdTkI8G8DSjG2LRuw09fPAGykaWYH/hXxiKuTxiAjiPSTIIuYUqof5Z2hShWw=="], + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.63.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-xfSrj9MHnWK9GaSqT9U0ImHtH/N8WZlHLx4cZHiuLcqs640hvZ3hLPd5UR2AZS57FaE8HrRUSpltbZdWRxHiDA=="], - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.63.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-NwV+1s7TiKrMe4owHyKB/dTLD7ZJD0YEBEhIz+hvav1Cu1GReJjF+rsdNwjzENQeIAbE/CoNiaAc5Vz2h5DPAA=="], + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.63.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-bqU99PLJb/dqb3S0GIMdeuyAEETSUgZBoqXYd3Sd+WCsV+MmPhnN6JrotWyir31+QgH7EvvE5/mwGJlEoci8Fw=="], - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.63.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-tWtHBTu5gOPK4u4Urtk4qAHW3zZ9rQAmbssO8gp7ELvGTGI3aCiq6NqyTQ0PCIg7KbHJF2UkGDDs77YZGxfjCA=="], + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.63.4", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-JinsFZ5G40oXQb+sUuiA5x689vhr6dDYK0H0NL+rwKdL6CqnmYN8PE4ZwfRSoIjrCxqTQG/SLfTtSvHeGxoVlw=="], - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.63.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-2qPoJiwTvtHQ27NnYvTnsgk8laXWYuVmNESG8WFZBcEPKLfZ3I27qBJarjVRQtwGeYyRfq5ZowHXih9lm2BItw=="], + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.63.4", "", { "os": "freebsd", "cpu": "x64" }, "sha512-GAdA4UxpiNm27cLHr2GqXBpAD0x9FqwYBY7/YSP0Ss0/PNi4k8gbviqpIpYbVSRBaS2ZcegXEzgTQMbRNCwxCw=="], - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.63.0", "", { "os": "linux", "cpu": "arm" }, "sha512-FQwsTRvLNuHoTdICABJQfbPUSEueISGmnpT06tXTMpfprf5NiKLSXKA0A+w45wJnCmZAnzgqBwbt6ARFuyOi5w=="], + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.63.4", "", { "os": "linux", "cpu": "arm" }, "sha512-qDd6NoA1znaLjp4jR5U/KWCdLAKDJNB8W9ChbbDaKbo0xA+Atln5HK6LFCZ4oJQpemtRZA288DCirFRjrspptw=="], - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.63.0", "", { "os": "linux", "cpu": "arm" }, "sha512-BBVTXziw8mY1a4ZbWME9tZyfzqXCDPqaC7Z3heQ29p5dkvXzwL0NwelO8zLa8c3RBKvl3YTuSnBgsBhYBtwjIw=="], + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.63.4", "", { "os": "linux", "cpu": "arm" }, "sha512-WtB5Tz5KTNINb8ZA+8sQ7bmjuS1JrRT7YverYIhUGdWWDlpzVWmIwuZE+jidkEXUn1l0zrEkaIMa8dHF3NGcsA=="], - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.63.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-w2Iyy9+RqKwx3d9qWMKsJg0FfRBsY0/pXNv0mCQ3ueRvJI6+QAScfD4nrMlzFLs2HNVW6Ew+mtZfDl9b7Ew5/Q=="], + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.63.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-VcQ3L1tjnkKzWjryAVaFhHEWcqOfICX9uxVVoDzm2t0DpgKRHd2zOpVrJc0xsWeBZcBFyYROCIBdyR/fS174pg=="], - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.63.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-YK++KtrFRHYE0P6/RtYEAy9t8F37znP+K03RrIuLPYOL6SVlObRumf/0OE4V/h63xL9DwkWbNssZfmA9hawuDA=="], + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.63.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-6+ZQX6P5s0cMDN2Ypb8Lbm2+/sZYmZjdaYny992ujUU9UKi/4CWoJWsl1pNvjWJHNHGK51m+jKGLlh1ylb2ifQ=="], - "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.63.0", "", { "os": "linux", "cpu": "none" }, "sha512-aBfOG6fP7YkkPmTqPwufRJeFyz7WPpECv9XNbnsk9+vg7rxdih0lbtEel7jcRng4LZrrmU3FfitCFyEj4BWDWg=="], + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.63.4", "", { "os": "linux", "cpu": "none" }, "sha512-D72ZnvkFkBXOfzMMQLcwfPLyGkKb7HZ9/mf97B7v6/P5Lbv4oFOtSY/uHbS8lH6uKUOxoKiuokdb50XZSzzbJw=="], - "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.63.0", "", { "os": "linux", "cpu": "none" }, "sha512-LGaHEOeHNAag9VuS1Crs5DFg4RrU9MPi2nVnNJk9DTePx/B6RRYKVmrIXt2h7YOJlwjaFJ6lwtFDliZxScTLrQ=="], + "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.63.4", "", { "os": "linux", "cpu": "none" }, "sha512-piU6BxeqA3O9KSu3kRCIQQtNqFFaTu21SEV4FwaRZowpnj3bLaWPZHw+xFqCs0XlJ+aOH3PTRWGoglH+mKA/OA=="], - "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.63.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-jClvk+J0FC3b7Udvegiw5/4hErbHtmsNsQgENnKXDWtNCJXsJYZH5WURvu7imDOO38xYml24eeh5x3A04ppwCw=="], + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.63.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-/5PGpHwqt2EEEOUs1XwzubE/ucr0dWDQ+to3zqi4Ds7EWpwtQ79wXc4JBoxqj/OwpawTsKWzJxHfSuBOq3DrWA=="], - "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.63.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-0OJlaGK+8+B777Ql5okIpD7ua5Ro9+VB9Ve0OKa28OQJZ1RbuUBVNHK/e3pr4BROqsyPl1JrPO1ZxJseCNffcA=="], + "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.63.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-cX3beZDLWt7G2oJF+nhChiT+qtaihs+S2xi7ziGmVB+2pwPng6D0Ed0HmElQOgv2UsUmSJJLGwpBao/3TDx3VA=="], - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.63.0", "", { "os": "linux", "cpu": "none" }, "sha512-Ygsx+HoNH7afwi1bTIXbnTvVnsO+zurPLSYxybV1hHFVU72OWOCl6v05ql/z0hkpAPx+DK7Kn9Bi7MayCcjLTA=="], + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.63.4", "", { "os": "linux", "cpu": "none" }, "sha512-1uz2mGWHyptR7DgHHrlbdRAjXK7v7elGZ9lMja910/RP+ZYbX6xAmCiU9UZSX4hqmgtHMv6lr5l3kq1HIOpcag=="], - "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.63.0", "", { "os": "linux", "cpu": "none" }, "sha512-pDQxtMGb+OvG3fLwR2OkZlSd47hW+kWg4BYMG/++sR6RqorQccwPTDsxda5hPwiIeIErAnCF9ma3SAU06bdQtQ=="], + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.63.4", "", { "os": "linux", "cpu": "none" }, "sha512-nLS8topojxyz7SRpKR2IODRpQ0XPZ+xaOXvT3+hqK/Uy8Lo5HFgkkIBiIrCu5tL5YqzTvgovGw55PwpahTAGig=="], - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.63.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-0BnUG9mS8I4SSHr3XsxVhuCMEiu+rX61xxZF5vujso4LaiAGFZFxvDjg6Xn6tLPNTUAfuCvQYas4LMQMVsKRSQ=="], + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.63.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-gs7DRKotr3l3q+jGPQBjH0ng1FjlEDm5ueQrkw5JtQvtLyEIcLASqAEaor56BhkKRzk+IcQzrcanBdb/bBQn8g=="], - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.63.0", "", { "os": "linux", "cpu": "x64" }, "sha512-Adu/VttB1dpPNW+FEacrZ+xVm9tFty84+RrFzsqlFaPxoJB+9XXyDGtp5dCOoBwGBIEVH0To7lExFXEx0BIF4A=="], + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.63.4", "", { "os": "linux", "cpu": "x64" }, "sha512-791ET7W17NnScOZM7h4dX5hYspxE28htPFsb1awY/NRR8+PRNkS53e475rDdxXXDrP+kwnCcNWg9CX5ztn/Aqw=="], - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.63.0", "", { "os": "linux", "cpu": "x64" }, "sha512-NQ3bDvjUbFKmP23671xUlXtKmqVsUBd6M4PQCvbmNtOy06hnQIdKHy8oG/6S3R/S6He1JgPk6A5VT+prAJMYEw=="], + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.63.4", "", { "os": "linux", "cpu": "x64" }, "sha512-iwZQRcmj7g88g3tzefIrQY7qvmuA/cfYwhrDtTBhsmukO4U2huVO5W+86XacUMRvdSFVAc6kZUZy21JaRwiB9w=="], - "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.63.0", "", { "os": "openbsd", "cpu": "x64" }, "sha512-u2eDAl4+0aFvA13GxlGBtTI3SS3sdgwgtV0HyjZ0QaQVCgNE+jqNGey+GtxWiq+wxr/UycAx/OnfJzApCFamvA=="], + "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.63.4", "", { "os": "openbsd", "cpu": "x64" }, "sha512-dVHFp9gRWrdTpnqQuGfCwd7hOQDatK1VCP2iWhLY/cGrOQs/ucFzJ6A5SRqbXX12ZDI8EUuejSM5kwg+ja7Png=="], - "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.63.0", "", { "os": "none", "cpu": "arm64" }, "sha512-XvRb5vfW3wAZQ+ZUG21AnHHDKtNcw99eigzEhjr//NZ3u7SoBaPP0seSc7FgP7p1epAEdAoZckMW9WY/+4w70w=="], + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.63.4", "", { "os": "none", "cpu": "arm64" }, "sha512-t3NlauOW6gxZVVFcBEnO62Cb4wbyDFL416gTg1uFI/2tgqYQlf69FbSE115Ajre9I+c26Lk4mcmdFUsS/DGifQ=="], - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.63.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-iZPmniy4kNBf5yo2RezbkYNNK5HPbXE9+g+twnbqSng7dtLEJy1SKoxiE/ni4FDacjyuZpEeb9U054N4EoKHYw=="], + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.63.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-xWuIaSye5FWZF8+UYtVEcHtRJDN5kN9Kfgxx3Kq8XIov9KSKbc1fiqQCm90SKrgQbUXZelbnUhnlUJmfSE7P9A=="], - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.63.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-mFBBd+LF37fnE8JnYUOH+imj0aPFPK30vpar4ehJkgnLj9sZn8ZxiRENmLtgIwxK7TC8klF6N57fxdNBwQoqOA=="], + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.63.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-9ALJJUOg/ZflMJepVo2PlgsGxSaxN7SQ4Z8GoZfVlarWr6r3rkHUNsd/zAio7p4YMtChSMXPionxej4Hkf6CXQ=="], - "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.63.0", "", { "os": "win32", "cpu": "x64" }, "sha512-ujeqEY3B+zbGn3Z4Q03cUBG/LGWnBJncVT36WER31LcOsQk9+1dmINKKtvmmfChUvRbK1G0R8OhMWFgHgaZtAw=="], + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.63.4", "", { "os": "win32", "cpu": "x64" }, "sha512-blj9z5qx/Pv4WU0W1NMFDB97e0JH5ed+aZGywW8WCvp/NhWX/4PFAq5uu6Q0AebNn+Vo6KzUYDT++JzTT5ojlQ=="], - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.63.0", "", { "os": "win32", "cpu": "x64" }, "sha512-hncn90N4sOky0L2LKE5oESKLbxCPeVo4eLA2LSMoDzM+879ml4WSr+Rr4DWknNIVVvS1Hirkc9hx02W6YxS8rQ=="], + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.63.4", "", { "os": "win32", "cpu": "x64" }, "sha512-Erx822VRBwLa124shbj+wNXe//BOgMEctDV0m1aqTQdNO1S69DgNUCFKC1RCeZfixs1J31l6igk1ziyXErbigQ=="], "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="], "@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.13", "", { "peerDependencies": { "acorn": "^8.9.0" } }, "sha512-wgKggnhZVL9Bfx1OaKKTrYY9BFRk6C8UAkQNUcIv1+llzYrIqy+RZm5HPKzn0NpEBvTVhTqB4kQyllZywsRBRQ=="], - "@turbo/darwin-64": ["@turbo/darwin-64@2.10.12", "", { "os": "darwin", "cpu": "x64" }, "sha512-9nKgKoF6ZOUsM+or0OtNf+TTJSfGvDNP7ZFv/ZGWVwOSCkumyctQiTeHwB4UNljHTnC41AqylgbunLDHoccNrA=="], + "@turbo/darwin-64": ["@turbo/darwin-64@2.11.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-0pGfE4Lpxrbd+6gUD9z025Tn4z9uMaSNZ3VX0H/hkUPZkjY5xrCa1NfTqocs09NM5NiYE3wEVcoYBadrhayRCA=="], - "@turbo/darwin-arm64": ["@turbo/darwin-arm64@2.10.12", "", { "os": "darwin", "cpu": "arm64" }, "sha512-H4Elb1jqTZVeIC9bbcNwjSzemZ6RegoTOVHeuV5Osirt2Z8UguTyisMEkvZjPVZgMeN9J4ERZBFad40tFnkb7w=="], + "@turbo/darwin-arm64": ["@turbo/darwin-arm64@2.11.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Ub7hTbu0bPSiW156ciuLCexG5/SfuZM/QWeBBh9o8P4XyKiZwKqubT6Y9DdJjdp4ZY2wS47Prdl06Xxzt0q6zw=="], - "@turbo/linux-64": ["@turbo/linux-64@2.10.12", "", { "os": [ "linux", "android", ], "cpu": "x64" }, "sha512-lr7KIotukvjZwEXiFSYAeOH3BWzjFVBbSzTbv0fuGFsNukYyH0+g1hB5ecqnJkgkYU+KHEMG1edOhnjiKON1wQ=="], + "@turbo/linux-64": ["@turbo/linux-64@2.11.2", "", { "os": [ "linux", "android", ], "cpu": "x64" }, "sha512-8ipdmgmvSomfQ8E9afUsefO+BLO6QMW7srrHqMOCXD3BPX4FlYqqWAJY1GvbQotZMWKzNohdVkevrUYM6ZzYKA=="], - "@turbo/linux-arm64": ["@turbo/linux-arm64@2.10.12", "", { "os": [ "linux", "android", ], "cpu": "arm64" }, "sha512-f0pZDTtvzB5SuNwuXBaKbZHUCMCukgc8nMlHEuvLmj91Fzec+MEbr3cAvGNor5htEDqZnO6Lxt9N/GPI/77oGA=="], + "@turbo/linux-arm64": ["@turbo/linux-arm64@2.11.2", "", { "os": [ "linux", "android", ], "cpu": "arm64" }, "sha512-tsftYXAzgc+GdosqyRP8+Zzk2evJ8ej7Otal7/DU+6GVekVZ3kqM/z7zlGuF4TSHeetWxX04KN1I64LkmvYzgg=="], - "@turbo/windows-64": ["@turbo/windows-64@2.10.12", "", { "os": "win32", "cpu": "x64" }, "sha512-SDOueJRjS/QcykWf2KCRtTLmIl5YMKsLbXkXQGhDwcTXvKXZiS5ih5lBl/gkwZIpYFjqA/rAlfMzlAFcVHNe0g=="], + "@turbo/windows-64": ["@turbo/windows-64@2.11.2", "", { "os": "win32", "cpu": "x64" }, "sha512-p5LDVcGmC8W6FCrJPehr1t0ZvYqM8xvG3Va+LkwtDMK3Rl0NhSsJOYbYZVBfMbkm+9RKcCvekFCbSVtQ9Eyuqg=="], - "@turbo/windows-arm64": ["@turbo/windows-arm64@2.10.12", "", { "os": "win32", "cpu": "arm64" }, "sha512-0i0mVUa4kKk+/B3RwEwPMf9CB+T7ul56hn5FFHNA4VUNTOoLBEd6aNf3FaKfCatDNZ6cicCEf6if9QUTVyzzcA=="], + "@turbo/windows-arm64": ["@turbo/windows-arm64@2.11.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-u0M3m1aXo9lpDM/2iQhxlGzgWjHFq/MC4TqHn1YAvxk8g1wGtzRB2QBx/SLqRChhPhC29mzaB8eLcxKh/pcM1g=="], - "@types/bun": ["@types/bun@1.4.0", "", { "dependencies": { "bun-types": "1.4.0" } }, "sha512-K+lZULY23vRgK/CfTjFIV+tyifaNdSMlPh9j+6mQ/cLfpOznLyAuzgV/JQysyECpkBQLVMSyvjlr2fBUSA9wFQ=="], + "@types/bun": ["@types/bun@1.4.2", "", { "dependencies": { "bun-types": "1.4.2" } }, "sha512-GimotNn7+ZV0uVArItBbriZsR1oNf0+WTzPkdcFrzShI7k2norL0uzEaJT8T33dWr7O/c9ZDuAFQrctKCi72oQ=="], "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], @@ -468,31 +473,29 @@ "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], - "@types/node": ["@types/node@26.3.0", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-L3fgrnchriRC2ExBflb8j4uZZURHZfQsmQeyVzhjcHW4kkwVyo8/0h1B2MVzMTrYUJYu6G7EWs14hW/L9putqw=="], + "@types/node": ["@types/node@26.6.2", "", { "dependencies": { "undici-types": "~8.9.0" } }, "sha512-X1P21scMv4zGKLYqjdGjaKa7COa0RKVYYZZN/NfvLQ1JegxFhdhpZG/Lyn8AXx6CDUavKAd11v6BvfpkDByK8g=="], "@types/stylis": ["@types/stylis@4.2.7", "", {}, "sha512-VgDNokpBoKF+wrdvhAAfS55OMQpL6QRglwTwNC3kIgBrzZxA4WsFj+2eLfEA/uMUDzBcEhYmjSbwQakn/i3ajA=="], - "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], - - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.68.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.68.0", "@typescript-eslint/type-utils": "8.68.0", "@typescript-eslint/utils": "8.68.0", "@typescript-eslint/visitor-keys": "8.68.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.68.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-WASHDpCm6qO5jj9g1a+8NiW5+GCkAyLReR56/4VruYmNgfUmqpxOfZ2Yfb8xGfJPWv5Qi6LSD8sXdces3vbp/Q=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.70.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.70.1", "@typescript-eslint/type-utils": "8.70.1", "@typescript-eslint/utils": "8.70.1", "@typescript-eslint/visitor-keys": "8.70.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.70.1", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-nDNrUQ/4ruSNYbu749TRY7cfrzPtoLHEXSNBI8aaNY32LlZCajixqRf3FqcKC4p5Cam4VOHYx/t+i5+nKXvrqA=="], - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.68.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.68.0", "@typescript-eslint/types": "8.68.0", "@typescript-eslint/typescript-estree": "8.68.0", "@typescript-eslint/visitor-keys": "8.68.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-fHq2VC1kpyYfvEcbiMjOpySY4WS7voEp89yAThrHRX5sm9j2lzYppCb2umFMEed4fWcyeLjHxrz0mpjNBaBxMQ=="], + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.70.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.70.1", "@typescript-eslint/types": "8.70.1", "@typescript-eslint/typescript-estree": "8.70.1", "@typescript-eslint/visitor-keys": "8.70.1", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-nO974WLllwhSFWQXnMLj6nDGa8f0khKEz1JzpPJ1u7Vm/4X1X6ZHajpoknU4bb41vJyMB0HHVyS2GqdhWfIXZw=="], - "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.68.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.68.0", "@typescript-eslint/types": "^8.68.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-5GQtWZCXFcFYux955pvoS02WLc49pXNlvIxocKjS0clvwo3in1RdlzVKyiqQH9vE5AKWFLTaUgeQkOrTS+0Qxw=="], + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.70.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.70.1", "@typescript-eslint/types": "^8.70.1", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-62xOgboPfwc3/IgPSX/W6oQR3ZbF04194FPGUGH8HL8iLFHbt/456/8Ph1wLNUgVF+s94FlHoipBsz+v7+LMnA=="], - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.68.0", "", { "dependencies": { "@typescript-eslint/types": "8.68.0", "@typescript-eslint/visitor-keys": "8.68.0" } }, "sha512-T5eXpcaJNg8bhjHJ8Rjp68Vq/QBteYtTKY8TZqVNPaUbuz0f6jI9t6aDkylwvalpAB9XTTFeFOjrjXAZ3YvmVA=="], + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.70.1", "", { "dependencies": { "@typescript-eslint/types": "8.70.1", "@typescript-eslint/visitor-keys": "8.70.1" } }, "sha512-Pa0EeSeAusQc1WbjQMac+YfenewYTBu0KjgYvkUKwhXaHUKbFog23Dm/rp0DX/6tyYOQ3Xl1a+3EcFNZynGHCw=="], - "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.68.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-F7zrGQfiJHojPwi8vhxZQC1tWtJzvL74cK/nqri2lk8YUXvYaYwl263xOJ69jDWPUk1hmcdoayFwk9lX09npVw=="], + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.70.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-jumze1fPI+sDOaM2TWGQdn39PDxTr7TZGeuyLkAbNyx2vtMT3uRnVKChN0hfht5V2TugphJzF6bYXvBcE09qqg=="], - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.68.0", "", { "dependencies": { "@typescript-eslint/types": "8.68.0", "@typescript-eslint/typescript-estree": "8.68.0", "@typescript-eslint/utils": "8.68.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-X77zqoY1EjeWGs/0JNxeaMfp5C5lIz4Tw8y66F1Ne8Faq6g424sBNYM6xBAqElfGZPLpWS+CZAp0DXyKDzWiHg=="], + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.70.1", "", { "dependencies": { "@typescript-eslint/types": "8.70.1", "@typescript-eslint/typescript-estree": "8.70.1", "@typescript-eslint/utils": "8.70.1", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-7zKTnyvaVWqzLZHPFQtX1hVHqgkMC+WebPWakNCSyrQVbIP1AM0L0TlBZtACldIRb6PptI8Odk+jyZ5kP3B1VA=="], - "@typescript-eslint/types": ["@typescript-eslint/types@8.68.0", "", {}, "sha512-9RnpsGJjrAllCMefGVVsImJM24YurhC0Q1h4UbvivtvOqXmR/vEJge2OoE++z9m6hyg8T1Q8t5SNT6tHSbrxcg=="], + "@typescript-eslint/types": ["@typescript-eslint/types@8.70.1", "", {}, "sha512-Dm1ypdhhrGCTyyehxElhgJ6kgk8MVCv5qXdoOVqPr1uqk42jX8KjrZqhROvdShczA8qrDoYiOWn1ykWlx2k81Q=="], - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.68.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.68.0", "@typescript-eslint/tsconfig-utils": "8.68.0", "@typescript-eslint/types": "8.68.0", "@typescript-eslint/visitor-keys": "8.68.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-OKKsD0tYmoNiU5PW2zehO1yO56jYOm1ShYlxon/Z0SJNidAkdVg86eg9ruRuoXf8xfnuWZGbwDsStkoXbZtIIA=="], + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.70.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.70.1", "@typescript-eslint/tsconfig-utils": "8.70.1", "@typescript-eslint/types": "8.70.1", "@typescript-eslint/visitor-keys": "8.70.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-TU8PwyGN0PQJUcE96mw8eCQ44SmxGdQlJmlWakHaHQ15eIuuvye5yNtmh/i6oS88jzXVQB71xdNkbkB/fMwL0g=="], - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.68.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.68.0", "@typescript-eslint/types": "8.68.0", "@typescript-eslint/typescript-estree": "8.68.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-PB5gJMMOg0Q5P1tsgWtEAqQacJXq0qEqRHDX/YJ4FaTMLfZPpHB3gjl2EJuiZyPABxmj4ZQYiY9m1bdAJ5y7tQ=="], + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.70.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.70.1", "@typescript-eslint/types": "8.70.1", "@typescript-eslint/typescript-estree": "8.70.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-Esgul8MsnKnRLdYU2Eb2cRV9bS5HJYtKj1ByJnOzzG2M58DGdSUQ1jUuILxipqcpB2h9WLrbD5GijIWUjX/Tqw=="], - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.68.0", "", { "dependencies": { "@typescript-eslint/types": "8.68.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-YR65gGdGvTUAWLldC3xLOvOzamdGzB4A5/N8rehEaHs3Zvoe39BhgY+u0SPch1OvrVTfLcc55wsSgK2NcnTS/A=="], + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.70.1", "", { "dependencies": { "@typescript-eslint/types": "8.70.1", "eslint-visitor-keys": "^5.0.0" } }, "sha512-Vwj9lUIW5Xq3wQ9w6gv3R86g1hMK8f2zNOdGTAgeXUMMXFK78G9ruCjjqutHMNJc0+CH7LYRnHeUB9IT8wFmcw=="], "acorn": ["acorn@8.18.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ=="], @@ -514,21 +517,21 @@ "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "baseline-browser-mapping": ["baseline-browser-mapping@2.11.19", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-Grytf1xOxOEMTGRwx6rLGKkTabd4vMg3VrKdj/7joCmV0qgh4QwMMO6xh34YEXQqirAuUdgQGa5orJQQ+69RBw=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.11.25", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-gMmEShwwq7FJqMwvfRwvCl00v4kN+KOfJqXn+f4nrufak5gNHJOksd/60Dvjuz7sI8Y5WiSFBa8FEYr+zoyqCw=="], - "brace-expansion": ["brace-expansion@5.0.9", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg=="], + "brace-expansion": ["brace-expansion@5.0.12", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ=="], "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], - "browserslist": ["browserslist@4.28.8", "", { "dependencies": { "baseline-browser-mapping": "^2.11.12", "caniuse-lite": "^1.0.30001809", "electron-to-chromium": "^1.5.402", "node-releases": "^2.0.53", "update-browserslist-db": "^1.3.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA=="], + "browserslist": ["browserslist@4.29.0", "", { "dependencies": { "baseline-browser-mapping": "^2.11.23", "caniuse-lite": "^1.0.30001810", "electron-to-chromium": "^1.5.427", "node-releases": "^2.0.55", "update-browserslist-db": "^1.3.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-3GSvyjvDI4Dur1Meg2BekJquu5uF+9R9a1+5M1Mde192eZoXbeXjzgOsgqPS2V8D5wrrip0gR5Hf/GhWQ9ZzaA=="], - "builtin-modules": ["builtin-modules@5.3.0", "", {}, "sha512-hMQUl2bUFG339QygPM97E+mc8OY1IAchORZxm4a/frcYwKzozMzRVDBwHW0NjOqGElLm2O37AVQE8ikxlZHrMQ=="], + "builtin-modules": ["builtin-modules@5.4.0", "", {}, "sha512-JCWSCdun+4Ovd9BhM/Vtlmwb7oD6Wl4YiPRXXwhAuwlPhW1un/MKgXn7GZoFm53ginnoNzus69V8JWx0K393jg=="], "bun-plugin-ekscss": ["bun-plugin-ekscss@workspace:packages/bun-plugin-ekscss"], - "bun-types": ["bun-types@1.4.0", "", { "dependencies": { "@types/node": "*" } }, "sha512-iIKw23BspnQQYd3prITOBxeUsxBHnwzX6YJfGMuNOZzeNcMmVqzIIVGRm1l69ogaPQmb4wB6BN8mA5bE9YuC5Q=="], + "bun-types": ["bun-types@1.4.2", "", { "dependencies": { "@types/node": "*" } }, "sha512-bxV1FgK7yBIzjRe5zBozIM4Bem11ZJcCXSrjWRG3YWLt8yFDePu4cLjpebO8OvPeIE9trbyPF4fuj3Cia4Fj3w=="], - "c8": ["c8@11.0.0", "", { "dependencies": { "@bcoe/v8-coverage": "^1.0.1", "@istanbuljs/schema": "^0.1.3", "find-up": "^5.0.0", "foreground-child": "^3.1.1", "istanbul-lib-coverage": "^3.2.0", "istanbul-lib-report": "^3.0.1", "istanbul-reports": "^3.1.6", "test-exclude": "^8.0.0", "v8-to-istanbul": "^9.0.0", "yargs": "^17.7.2", "yargs-parser": "^21.1.1" }, "peerDependencies": { "monocart-coverage-reports": "^2" }, "optionalPeers": ["monocart-coverage-reports"], "bin": { "c8": "bin/c8.js" } }, "sha512-e/uRViGHSVIJv7zsaDKM7VRn2390TgHXqUSvYwPHBQaU6L7E9L0n9JbdkwdYPvshDT0KymBmmlwSpms3yBaMNg=="], + "c8": ["c8@12.0.0", "", { "dependencies": { "@bcoe/v8-coverage": "^1.0.1", "@istanbuljs/schema": "^0.1.3", "find-up": "^5.0.0", "foreground-child": "^3.1.1", "istanbul-lib-coverage": "^3.2.0", "istanbul-lib-report": "^3.0.1", "istanbul-reports": "^3.1.6", "test-exclude": "^8.0.0", "v8-to-istanbul": "^9.0.0", "yargs": "^18.0.0", "yargs-parser": "^21.1.1" }, "peerDependencies": { "monocart-coverage-reports": "^2" }, "optionalPeers": ["monocart-coverage-reports"], "bin": { "c8": "bin/c8.js" } }, "sha512-4zpJvrd1nKWutnnKC2pXkFmb6iM1l+ffN//o1CzlTNwW7GSOs9a1xrLqkC48nU8oEkjmPZLPiwMsIaOvoF4Pqg=="], "cacheable": ["cacheable@2.5.0", "", { "dependencies": { "@cacheable/memory": "^2.2.0", "@cacheable/utils": "^2.5.0", "hookified": "^1.15.0", "keyv": "^5.6.0", "qified": "^0.10.1" } }, "sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g=="], @@ -540,7 +543,7 @@ "ci-info": ["ci-info@4.4.0", "", {}, "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg=="], - "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + "cliui": ["cliui@9.0.1", "", { "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w=="], "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], @@ -578,7 +581,7 @@ "detect-indent": ["detect-indent@7.0.2", "", {}, "sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A=="], - "devalue": ["devalue@5.9.2", "", {}, "sha512-po4PAY5c53tw5XMocSnf8A/5OHhbbUftpr93aEN6BBoAdntUmK7vu7wOATqvt7cXO7m1Cl4gMVn6p7n6n4mj0w=="], + "devalue": ["devalue@5.9.4", "", {}, "sha512-sPAT4pztbu6586/hrhOnMKS17IJrvg12mXiSPSS3W5qDeN2RGgvZ0diZCm31dBbnevfVmujNO3IM2wrS4Y2Rhg=="], "diff": ["diff@5.2.2", "", {}, "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A=="], @@ -586,15 +589,17 @@ "ekscss": ["ekscss@workspace:packages/ekscss"], - "electron-to-chromium": ["electron-to-chromium@1.5.415", "", {}, "sha512-958V+Kbhtgz+SxXeEVKBjrlKRBIDAYvUJfwhjxMZ5S6ut9jAl7l9ZKBkBrvjyjZE36PabLUo2L8kEeV5O4vgJg=="], + "electron-to-chromium": ["electron-to-chromium@1.5.434", "", {}, "sha512-7EeFW9OLf1NN9NKQP9xdOE/XKqjxv7JDPP6AEAkHli11+Fae1OaLoNuAf13hQv1PPNtuES0pLQSPk2+fS3s8ww=="], "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + "entities": ["entities@8.1.0", "", {}, "sha512-kxL7msIffSuh9aaFAMD7rxAIuTRMAHMeBtgHW2yUdWw732ZNh4MehkF2gdjvtdmikkaIP9bFDDJOPlsvm7avrA=="], + "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], - "esbuild": ["esbuild@0.28.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.1", "@esbuild/android-arm": "0.28.1", "@esbuild/android-arm64": "0.28.1", "@esbuild/android-x64": "0.28.1", "@esbuild/darwin-arm64": "0.28.1", "@esbuild/darwin-x64": "0.28.1", "@esbuild/freebsd-arm64": "0.28.1", "@esbuild/freebsd-x64": "0.28.1", "@esbuild/linux-arm": "0.28.1", "@esbuild/linux-arm64": "0.28.1", "@esbuild/linux-ia32": "0.28.1", "@esbuild/linux-loong64": "0.28.1", "@esbuild/linux-mips64el": "0.28.1", "@esbuild/linux-ppc64": "0.28.1", "@esbuild/linux-riscv64": "0.28.1", "@esbuild/linux-s390x": "0.28.1", "@esbuild/linux-x64": "0.28.1", "@esbuild/netbsd-arm64": "0.28.1", "@esbuild/netbsd-x64": "0.28.1", "@esbuild/openbsd-arm64": "0.28.1", "@esbuild/openbsd-x64": "0.28.1", "@esbuild/openharmony-arm64": "0.28.1", "@esbuild/sunos-x64": "0.28.1", "@esbuild/win32-arm64": "0.28.1", "@esbuild/win32-ia32": "0.28.1", "@esbuild/win32-x64": "0.28.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw=="], + "esbuild": ["esbuild@0.28.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.2", "@esbuild/android-arm": "0.28.2", "@esbuild/android-arm64": "0.28.2", "@esbuild/android-x64": "0.28.2", "@esbuild/darwin-arm64": "0.28.2", "@esbuild/darwin-x64": "0.28.2", "@esbuild/freebsd-arm64": "0.28.2", "@esbuild/freebsd-x64": "0.28.2", "@esbuild/linux-arm": "0.28.2", "@esbuild/linux-arm64": "0.28.2", "@esbuild/linux-ia32": "0.28.2", "@esbuild/linux-loong64": "0.28.2", "@esbuild/linux-mips64el": "0.28.2", "@esbuild/linux-ppc64": "0.28.2", "@esbuild/linux-riscv64": "0.28.2", "@esbuild/linux-s390x": "0.28.2", "@esbuild/linux-x64": "0.28.2", "@esbuild/netbsd-arm64": "0.28.2", "@esbuild/netbsd-x64": "0.28.2", "@esbuild/openbsd-arm64": "0.28.2", "@esbuild/openbsd-x64": "0.28.2", "@esbuild/openharmony-arm64": "0.28.2", "@esbuild/sunos-x64": "0.28.2", "@esbuild/win32-arm64": "0.28.2", "@esbuild/win32-ia32": "0.28.2", "@esbuild/win32-x64": "0.28.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA=="], "esbuild-plugin-ekscss": ["esbuild-plugin-ekscss@workspace:packages/esbuild-plugin-ekscss"], @@ -602,9 +607,9 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@10.9.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.7.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-9VaAkDURekixUQJy0oJYl2DcN6oKMfxay7XzaGYAWQwsb6qfKf+x76R2k1L8kb1boc+FyCAaTA9GmiKaaiaF+A=="], + "eslint": ["eslint@10.11.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.7.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.3", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "11.1.5 || >11.1.6 <12", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-P7a6UEEqb9G95MYAtqkmsTbVXIYyzIfl6NGOIJk162PaahFxFyeGcrlXYFSiagECg4sEm8IseJdZBKR3rx6MsQ=="], - "eslint-plugin-unicorn": ["eslint-plugin-unicorn@70.0.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "@eslint-community/eslint-utils": "^4.9.1", "browserslist": "^4.28.2", "change-case": "^5.4.4", "ci-info": "^4.4.0", "core-js-compat": "^3.49.0", "detect-indent": "^7.0.2", "find-up-simple": "^1.0.1", "globals": "^17.6.0", "indent-string": "^5.0.0", "is-builtin-module": "^5.0.0", "jsesc": "^3.1.0", "pluralize": "^8.0.0", "regjsparser": "^0.13.1", "semver": "^7.8.4", "strip-indent": "^4.1.1" }, "peerDependencies": { "eslint": ">=10.4" } }, "sha512-uAF9xMcVvvhTfvusCgogJ1wh4To3q2KhVMw3i1Apf/ILTbxsCjscvraAZACsEurb7no2fdXblD3whcbVnjw5zg=="], + "eslint-plugin-unicorn": ["eslint-plugin-unicorn@76.0.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.10.1", "@eslint/css-tree": "^4.0.5", "browserslist": "^4.28.8", "change-case": "^5.4.4", "ci-info": "^4.4.0", "core-js-compat": "^3.50.0", "detect-indent": "^7.0.2", "entities": "^8.0.0", "find-up-simple": "^1.0.1", "globals": "^17.11.0", "identifier-regex": "^1.1.0", "indent-string": "^5.0.0", "is-builtin-module": "^5.0.0", "pluralize": "^8.0.0", "quote-js-string": "^0.1.0", "regjsparser": "^0.13.2", "reserved-identifiers": "^1.2.0", "semver": "^7.8.5", "strip-indent": "^4.1.1", "yaml": "^2.9.0" }, "peerDependencies": { "eslint": ">=10.4" } }, "sha512-3ywJrCMHKYhcBP5yFzGaOOX3dY7+iR3hvpuoS/0EnhRFgVWLejly+t4fOdJvWQxJdHZl1C+QBW7hybXPDld4Pw=="], "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], @@ -616,7 +621,7 @@ "esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="], - "esrap": ["esrap@2.3.6", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, "peerDependencies": { "@typescript-eslint/types": "^8.2.0" }, "optionalPeers": ["@typescript-eslint/types"] }, "sha512-yc0OC12UjPqLoc+fe+v5GNs4TOjAigUw3sTikfC+xeBPGUw7gDRz3DtYaqEhxyMVJojcSWJw7jT0QWR+CbuE/A=="], + "esrap": ["esrap@2.3.7", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, "peerDependencies": { "@typescript-eslint/types": "^8.2.0" }, "optionalPeers": ["@typescript-eslint/types"] }, "sha512-n2nf7fZR3c9yXf0BPEuHuXqT+KW0SJVj4cN5FMEkpCZ3scLjOQWpiccyCxVzCC2q1wubTghuEGzngJY/7Ah0Ow=="], "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], @@ -634,15 +639,15 @@ "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], - "fast-uri": ["fast-uri@3.1.6", "", {}, "sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q=="], + "fast-uri": ["fast-uri@3.1.8", "", {}, "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg=="], "fastest-levenshtein": ["fastest-levenshtein@1.0.16", "", {}, "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg=="], - "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], + "fastq": ["fastq@1.20.3", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw=="], "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], - "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + "file-entry-cache": ["file-entry-cache@11.1.5", "", { "dependencies": { "flat-cache": "^6.1.23" } }, "sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q=="], "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], @@ -650,7 +655,7 @@ "find-up-simple": ["find-up-simple@1.0.1", "", {}, "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ=="], - "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], + "flat-cache": ["flat-cache@6.1.23", "", { "dependencies": { "cacheable": "^2.5.0", "flatted": "^3.4.2", "hookified": "^1.15.0" } }, "sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA=="], "flatted": ["flatted@3.4.4", "", {}, "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q=="], @@ -660,7 +665,7 @@ "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], - "get-east-asian-width": ["get-east-asian-width@1.6.0", "", {}, "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA=="], + "get-east-asian-width": ["get-east-asian-width@1.7.0", "", {}, "sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q=="], "glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], @@ -670,7 +675,7 @@ "global-prefix": ["global-prefix@3.0.0", "", { "dependencies": { "ini": "^1.3.5", "kind-of": "^6.0.2", "which": "^1.3.1" } }, "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg=="], - "globals": ["globals@17.11.0", "", {}, "sha512-Z2I8hM+PbJDXQDq3Icgpzv+mPdwr68iZUU9d5WW4FuXfDUQfkZaZuvjMv42/5crNyw154+9+VWXbYrUgDXbxNw=="], + "globals": ["globals@17.12.0", "", {}, "sha512-cezEd/DTyyht9cvSSURyygXPfy04GtWO/5e6ZPvH7fCtjKz9PYOmuawphw1Ctd1f6C+5JypXfGD7ahNMXvevBA=="], "globby": ["globby@16.2.4", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "fast-glob": "^3.3.3", "ignore": "^7.0.5", "is-path-inside": "^4.0.0", "micromatch": "^4.0.8", "slash": "^5.1.0", "unicorn-magic": "^0.4.0" } }, "sha512-c8B/VNLmxRcmqqenRA9t+9IyOjf9+V6lTxPaUJLqOCONdQkWZ0ETYgX0qbtJqPsgCNusT9MZ5Jeidw8Eb9tn2g=="], @@ -686,6 +691,8 @@ "html-tags": ["html-tags@5.1.0", "", {}, "sha512-n6l5uca7/y5joxZ3LUePhzmBFUJ+U2YWzhMa8XUTecSeSlQiZdF5XAd/Q3/WUl0VsXgUwWi8I7CNIwdI5WN1SQ=="], + "identifier-regex": ["identifier-regex@1.1.0", "", { "dependencies": { "reserved-identifiers": "^1.0.0" } }, "sha512-SLX4H/vtcYlYnL7XqnuJKHU7Z8517TgsW9nmQiGOgMCjQ8V/deLYu6bEmbGoXe7WMMhc9+EUGyFFneHja8KabA=="], + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], @@ -728,15 +735,13 @@ "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], - "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], - "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], - "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + "keyv": ["keyv@5.6.0", "", { "dependencies": { "@keyv/serialize": "^1.1.1" } }, "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw=="], "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="], @@ -752,7 +757,7 @@ "lodash.truncate": ["lodash.truncate@4.4.2", "", {}, "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw=="], - "lru-cache": ["lru-cache@11.5.2", "", {}, "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g=="], + "lru-cache": ["lru-cache@11.5.3", "", {}, "sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg=="], "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], @@ -760,7 +765,7 @@ "mathml-tag-names": ["mathml-tag-names@4.0.0", "", {}, "sha512-aa6AU2Pcx0VP/XWnh8IGL0SYSgQHDT6Ucror2j2mXeFAlN3ahaNs8EZtG1YiticMkSLj3Gt6VPFfZogt7G5iFQ=="], - "mdn-data": ["mdn-data@2.27.1", "", {}, "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ=="], + "mdn-data": ["mdn-data@2.35.0", "", {}, "sha512-k+1+dEIm2z/BEfdvYzT/fIyAGeDBo/1AJNJI4ilFXJRYoxP/3Ds+GP8shAOIq8jYXY9N5nGB3Ag104NsagmLAA=="], "meow": ["meow@14.1.0", "", {}, "sha512-EDYo6VlmtnumlcBCbh1gLJ//9jvM/ndXHfVXIFrZVr6fGcwTUyCTFNTLCKuY3ffbK8L/+3Mzqnd58RojiZqHVw=="], @@ -776,11 +781,11 @@ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], - "nanoid": ["nanoid@3.3.18", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w=="], + "nanoid": ["nanoid@3.3.19", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug=="], "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], - "node-releases": ["node-releases@2.0.54", "", {}, "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ=="], + "node-releases": ["node-releases@2.0.56", "", {}, "sha512-x0InOIyzgdk+eyaWaRJFH5snEtiImgBgblZ2CyPrLmqqcuMQkEvcDPHbzqbD8eDsSeJbVOjn+crzyzHaM4D+/A=="], "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], @@ -806,13 +811,13 @@ "pluralize": ["pluralize@8.0.0", "", {}, "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA=="], - "postcss": ["postcss@8.5.16", "", { "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg=="], + "postcss": ["postcss@8.5.28", "", { "dependencies": { "nanoid": "^3.3.18", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A=="], "postcss-ekscss": ["postcss-ekscss@workspace:packages/postcss-ekscss"], - "postcss-safe-parser": ["postcss-safe-parser@7.0.1", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A=="], + "postcss-safe-parser": ["postcss-safe-parser@7.1.0", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-1WzZxRLaAFwEh6Do+zyGpjWV3nGJNxxhuh7Ubu/q1ICImMgZJnLwhoaEpRbG4pJppp2Y1ncL9ffA2f+LhrefQg=="], - "postcss-selector-parser": ["postcss-selector-parser@7.1.5", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw=="], + "postcss-selector-parser": ["postcss-selector-parser@7.1.6", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw=="], "postcss-sorting": ["postcss-sorting@10.0.0", "", { "peerDependencies": { "postcss": "^8.4.20" } }, "sha512-TXbU+h6vVRW+86c/+ewhWq9k7pr7ijASTnepVhCQiC87zAOTkvB1v2dHyWP+ggstSTX/PNvjzS+IOqzejndz9w=="], @@ -826,17 +831,19 @@ "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], - "regjsparser": ["regjsparser@0.13.2", "", { "dependencies": { "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ=="], + "quote-js-string": ["quote-js-string@0.1.0", "", {}, "sha512-Y3NoRtprEEZQD8RfxMCfS0ZTqc4e+i18OrXEXAvpM6TfC/3y+0L5rNbZiSnbBBEkDfFzbpd8o+cE8q3/anjMGA=="], - "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + "regjsparser": ["regjsparser@0.13.3", "", { "dependencies": { "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-ycwFAS14Jw4mppvmK4GR/J6u3WpWpjkEApehuHtLc/8VpPNpDMbQ4WjqwplXifGeyKOzHSFLmSPqzksDQE2Sfg=="], "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + "reserved-identifiers": ["reserved-identifiers@1.2.0", "", {}, "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw=="], + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], - "rollup": ["rollup@4.63.0", "", { "dependencies": { "@types/estree": "1.0.9" }, "optionalDependencies": { "@napi-rs/lzma-linux-x64-gnu": "1.5.1", "@rollup/rollup-android-arm-eabi": "4.63.0", "@rollup/rollup-android-arm64": "4.63.0", "@rollup/rollup-darwin-arm64": "4.63.0", "@rollup/rollup-darwin-x64": "4.63.0", "@rollup/rollup-freebsd-arm64": "4.63.0", "@rollup/rollup-freebsd-x64": "4.63.0", "@rollup/rollup-linux-arm-gnueabihf": "4.63.0", "@rollup/rollup-linux-arm-musleabihf": "4.63.0", "@rollup/rollup-linux-arm64-gnu": "4.63.0", "@rollup/rollup-linux-arm64-musl": "4.63.0", "@rollup/rollup-linux-loong64-gnu": "4.63.0", "@rollup/rollup-linux-loong64-musl": "4.63.0", "@rollup/rollup-linux-ppc64-gnu": "4.63.0", "@rollup/rollup-linux-ppc64-musl": "4.63.0", "@rollup/rollup-linux-riscv64-gnu": "4.63.0", "@rollup/rollup-linux-riscv64-musl": "4.63.0", "@rollup/rollup-linux-s390x-gnu": "4.63.0", "@rollup/rollup-linux-x64-gnu": "4.63.0", "@rollup/rollup-linux-x64-musl": "4.63.0", "@rollup/rollup-openbsd-x64": "4.63.0", "@rollup/rollup-openharmony-arm64": "4.63.0", "@rollup/rollup-win32-arm64-msvc": "4.63.0", "@rollup/rollup-win32-ia32-msvc": "4.63.0", "@rollup/rollup-win32-x64-gnu": "4.63.0", "@rollup/rollup-win32-x64-msvc": "4.63.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-T5vnZ2y4QqC3/4P+w2+JO+Q/OVdnPsv4XcSYJYMEn0R9/jjl5AgLwO9LAZMzP2lN71O6pypn91rB7lDstUkfrQ=="], + "rollup": ["rollup@4.63.4", "", { "dependencies": { "@types/estree": "1.0.9" }, "optionalDependencies": { "@napi-rs/lzma-linux-x64-gnu": "1.5.1", "@rollup/rollup-android-arm-eabi": "4.63.4", "@rollup/rollup-android-arm64": "4.63.4", "@rollup/rollup-darwin-arm64": "4.63.4", "@rollup/rollup-darwin-x64": "4.63.4", "@rollup/rollup-freebsd-arm64": "4.63.4", "@rollup/rollup-freebsd-x64": "4.63.4", "@rollup/rollup-linux-arm-gnueabihf": "4.63.4", "@rollup/rollup-linux-arm-musleabihf": "4.63.4", "@rollup/rollup-linux-arm64-gnu": "4.63.4", "@rollup/rollup-linux-arm64-musl": "4.63.4", "@rollup/rollup-linux-loong64-gnu": "4.63.4", "@rollup/rollup-linux-loong64-musl": "4.63.4", "@rollup/rollup-linux-ppc64-gnu": "4.63.4", "@rollup/rollup-linux-ppc64-musl": "4.63.4", "@rollup/rollup-linux-riscv64-gnu": "4.63.4", "@rollup/rollup-linux-riscv64-musl": "4.63.4", "@rollup/rollup-linux-s390x-gnu": "4.63.4", "@rollup/rollup-linux-x64-gnu": "4.63.4", "@rollup/rollup-linux-x64-musl": "4.63.4", "@rollup/rollup-openbsd-x64": "4.63.4", "@rollup/rollup-openharmony-arm64": "4.63.4", "@rollup/rollup-win32-arm64-msvc": "4.63.4", "@rollup/rollup-win32-ia32-msvc": "4.63.4", "@rollup/rollup-win32-x64-gnu": "4.63.4", "@rollup/rollup-win32-x64-msvc": "4.63.4", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-4U0liVayNIoLp3GFl1FcI8561WepLnZ1rqfraGh7S9B3Ur5F9S283y8Futii7RUU2C/97tOBmBy7nYvhoiOpbQ=="], "rollup-plugin-ekscss": ["rollup-plugin-ekscss@workspace:packages/rollup-plugin-ekscss"], @@ -864,7 +871,7 @@ "strip-indent": ["strip-indent@4.1.1", "", {}, "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA=="], - "stylelint": ["stylelint@17.14.1", "", { "dependencies": { "@csstools/css-calc": "^3.2.1", "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-syntax-patches-for-csstree": "^1.1.6", "@csstools/css-tokenizer": "^4.0.0", "@csstools/media-query-list-parser": "^5.0.0", "@csstools/selector-resolve-nested": "^4.0.0", "@csstools/selector-specificity": "^6.0.0", "colord": "^2.9.3", "cosmiconfig": "^9.0.2", "css-functions-list": "^3.3.3", "css-tree": "^3.2.1", "debug": "^4.4.3", "fast-glob": "^3.3.3", "fastest-levenshtein": "^1.0.16", "file-entry-cache": "^11.1.5", "global-modules": "^2.0.0", "globby": "^16.2.1", "globjoin": "^0.1.4", "html-tags": "^5.1.0", "ignore": "^7.0.5", "import-meta-resolve": "^4.2.0", "mathml-tag-names": "^4.0.0", "meow": "^14.1.0", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.5.16", "postcss-safe-parser": "^7.0.1", "postcss-selector-parser": "^7.1.4", "postcss-value-parser": "^4.2.0", "string-width": "^8.2.1", "supports-hyperlinks": "^4.5.0", "svg-tags": "^1.0.0", "table": "^6.9.0", "write-file-atomic": "^7.0.1" }, "bin": { "stylelint": "bin/stylelint.mjs" } }, "sha512-xVQwyiuxALUBNB2fBe0tmNemg9KqLtdj3T64mioFDar79B2cU8LIyz+3KL6LdiHs9NkeNfwxpKSaIVOY8f112g=="], + "stylelint": ["stylelint@17.15.0", "", { "dependencies": { "@csstools/css-calc": "^3.3.0", "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-syntax-patches-for-csstree": "^1.1.9", "@csstools/css-tokenizer": "^4.0.0", "@csstools/media-query-list-parser": "^5.0.0", "@csstools/selector-resolve-nested": "^4.0.1", "@csstools/selector-specificity": "^6.0.0", "colord": "^2.10.0", "cosmiconfig": "^9.0.2", "css-functions-list": "^3.3.3", "css-tree": "^3.2.1", "debug": "^4.4.3", "fast-glob": "^3.3.3", "fastest-levenshtein": "^1.0.16", "file-entry-cache": "^11.1.5", "global-modules": "^2.0.0", "globby": "^16.2.4", "globjoin": "^0.1.4", "html-tags": "^5.1.0", "ignore": "^7.0.6", "import-meta-resolve": "^4.2.0", "mathml-tag-names": "^4.0.0", "meow": "^14.1.0", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.5.26", "postcss-safe-parser": "^7.0.1", "postcss-selector-parser": "^7.1.5", "postcss-value-parser": "^4.2.0", "string-width": "^8.2.2", "supports-hyperlinks": "^4.5.0", "svg-tags": "^1.0.0", "table": "^6.9.0", "write-file-atomic": "^7.0.1" }, "bin": { "stylelint": "bin/stylelint.mjs" } }, "sha512-mWIkesYQvQjf4Kvdeu9ns0IL8/K/wtjaGxPqsPd6DlLZvaQxGysJsocxUDrBcyHQ5VleAk4uSMat4yMrVED7PA=="], "stylelint-config-recommended": ["stylelint-config-recommended@18.0.0", "", { "peerDependencies": { "stylelint": "^17.0.0" } }, "sha512-mxgT2XY6YZ3HWWe3Di8umG6aBmWmHTblTgu/f10rqFXnyWxjKWwNdjSWkgkwCtxIKnqjSJzvFmPT5yabVIRxZg=="], @@ -878,7 +885,7 @@ "supports-hyperlinks": ["supports-hyperlinks@4.5.0", "", { "dependencies": { "has-flag": "^5.0.1", "supports-color": "^10.2.2" } }, "sha512-ZW2OvfeCXrNTbLakPUzjQG922EeGCOteFSVoek5DKStTh898wf7zgtuFlzQN8HfZCxC3Eh02yJVrRW51hADf+w=="], - "svelte": ["svelte@5.56.10", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.10", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.8.1", "esm-env": "^1.2.1", "esrap": "^2.2.12", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-Lcxbj8I/KAbpY+VjtY4ENQBV0dDCipfGAhqb51XQZ67CIQqXgsv/8dPkbILaj4Fb6/b6JAEM/PIVbILXgDQy2g=="], + "svelte": ["svelte@5.57.1", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "@jridgewell/sourcemap-codec": "^1.6.0", "@sveltejs/acorn-typescript": "^1.0.13", "@types/estree": "^1.0.9", "acorn": "^8.18.0", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.9.2", "esm-env": "^1.2.1", "esrap": "^2.3.6", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-Uqj49lWKB+iSSnneuwiYYJ7MZgkB+eXr0LXBhv4uDuAkXqnWmq65Sxflfvp0Lc6MdKjMUxGaeOKWJqz5SNiVIA=="], "svelte-ekscss": ["svelte-ekscss@workspace:packages/svelte-ekscss"], @@ -894,19 +901,19 @@ "ts-api-utils": ["ts-api-utils@2.5.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA=="], - "turbo": ["turbo@2.10.12", "", { "optionalDependencies": { "@turbo/darwin-64": "2.10.12", "@turbo/darwin-arm64": "2.10.12", "@turbo/linux-64": "2.10.12", "@turbo/linux-arm64": "2.10.12", "@turbo/windows-64": "2.10.12", "@turbo/windows-arm64": "2.10.12" }, "bin": { "turbo": "bin/turbo" } }, "sha512-AswgMPnpOoaVZHrrSBejETzEbuIA69OVGwfkHwfrY0A23VjWXBANzgq9+OymWOHAIArB7D1+1z498WY8fGg1Jw=="], + "turbo": ["turbo@2.11.2", "", { "optionalDependencies": { "@turbo/darwin-64": "2.11.2", "@turbo/darwin-arm64": "2.11.2", "@turbo/linux-64": "2.11.2", "@turbo/linux-arm64": "2.11.2", "@turbo/windows-64": "2.11.2", "@turbo/windows-arm64": "2.11.2" }, "bin": { "turbo": "bin/turbo" } }, "sha512-s0GhnWXlAAN+wb2GRMQxnZgFweRWTAceRWW/4Lk9iHj7QuLZMjDxQQqu+Xoh7Nckuy8UiSim520w6yqP2+ertw=="], "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], - "typescript-eslint": ["typescript-eslint@8.68.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.68.0", "@typescript-eslint/parser": "8.68.0", "@typescript-eslint/typescript-estree": "8.68.0", "@typescript-eslint/utils": "8.68.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-MHy0Y0ynqeEbx/S45+i/bBssdy3X6KNBfmJAP35GrgtNxu2TQ5K5xsFDhAnmsq1jvpdoZOPG1LGtJo0HWqYCrQ=="], + "typescript-eslint": ["typescript-eslint@8.70.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.70.1", "@typescript-eslint/parser": "8.70.1", "@typescript-eslint/typescript-estree": "8.70.1", "@typescript-eslint/utils": "8.70.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-AcWG7KDjZ2THNXsgwttMaGmzVi0VFRlFYfqFHYQRbDpF3owuYbuiL8c7UUrd2k8s3PoSfIQrWfrGXfcElrWLYA=="], - "undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], + "undici-types": ["undici-types@8.9.0", "", {}, "sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg=="], "unicorn-magic": ["unicorn-magic@0.4.0", "", {}, "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw=="], - "update-browserslist-db": ["update-browserslist-db@1.3.2", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw=="], + "update-browserslist-db": ["update-browserslist-db@1.3.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ=="], "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], @@ -920,51 +927,45 @@ "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], - "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + "wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], "write-file-atomic": ["write-file-atomic@7.0.1", "", { "dependencies": { "signal-exit": "^4.0.1" } }, "sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg=="], "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], - "yargs": ["yargs@17.7.3", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g=="], + "yaml": ["yaml@2.9.1", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw=="], + + "yargs": ["yargs@18.2.0", "", { "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "string-width": "^8.2.1", "y18n": "^5.0.5", "yargs-parser": "^22.0.0" } }, "sha512-9OpKOLeaoNFecEp7P6iYbzze/5CqWoH7N3SMs/6y1XF4nMvFMspEGZzJ6uFi9MmQwXhyzqYoSEKO3tvA3Z/o2w=="], "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], - "zimmerframe": ["zimmerframe@1.1.4", "", {}, "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ=="], - - "@cacheable/memory/keyv": ["keyv@5.6.0", "", { "dependencies": { "@keyv/serialize": "^1.1.1" } }, "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw=="], - - "@cacheable/utils/keyv": ["keyv@5.6.0", "", { "dependencies": { "@keyv/serialize": "^1.1.1" } }, "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw=="], + "zimmerframe": ["zimmerframe@1.1.5", "", {}, "sha512-msJxIvYDYcoNL+PJsu+7qmpDWsYmAxTY+2TNYXXF0hzBzBk0BMecOqDOG/EckUoKCuKwObfbugIl8QpqHDXeFA=="], "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "@keyv/bigmap/keyv": ["keyv@5.6.0", "", { "dependencies": { "@keyv/serialize": "^1.1.1" } }, "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw=="], + "@maxmilton/stylelint-config/postcss-ekscss": ["postcss-ekscss@0.0.15", "", { "peerDependencies": { "postcss": "^8.0.0" }, "optionalPeers": ["postcss"] }, "sha512-jNjVElQTM3pRm+7HAbIY1shr+03C1fAnl9gBKCkTIYpG8oZlFlkqZJyuQpWucR9uU7Dz1+lfgFh4iQIqk6bjAQ=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.6", "", {}, "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.9", "", {}, "sha512-brTTsvFRt5C1gGHtPst/281UjPD5t9fBqbgoMPlVWy11ZLTPfu7HxK4ZYqO9H7o/yC9rSTCI85EaQ4OoY12qYw=="], "ansi-styles/color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], - "cacheable/keyv": ["keyv@5.6.0", "", { "dependencies": { "@keyv/serialize": "^1.1.1" } }, "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw=="], - - "cliui/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "cliui/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], - "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "css-tree/mdn-data": ["mdn-data@2.27.1", "", {}, "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ=="], "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], "global-prefix/which": ["which@1.3.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "./bin/which" } }, "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="], - "globby/ignore": ["ignore@7.0.6", "", {}, "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw=="], + "globby/ignore": ["ignore@7.0.9", "", {}, "sha512-brTTsvFRt5C1gGHtPst/281UjPD5t9fBqbgoMPlVWy11ZLTPfu7HxK4ZYqO9H7o/yC9rSTCI85EaQ4OoY12qYw=="], "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], "qified/hookified": ["hookified@2.2.0", "", {}, "sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA=="], - "stylelint/file-entry-cache": ["file-entry-cache@11.1.5", "", { "dependencies": { "flat-cache": "^6.1.23" } }, "sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q=="], - - "stylelint/ignore": ["ignore@7.0.6", "", {}, "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw=="], + "stylelint/ignore": ["ignore@7.0.9", "", {}, "sha512-brTTsvFRt5C1gGHtPst/281UjPD5t9fBqbgoMPlVWy11ZLTPfu7HxK4ZYqO9H7o/yC9rSTCI85EaQ4OoY12qYw=="], "supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], @@ -976,26 +977,20 @@ "table/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "wrap-ansi/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "wrap-ansi/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], - "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "yargs/yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="], "ansi-styles/color-convert/color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], - "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "stylelint/file-entry-cache/flat-cache": ["flat-cache@6.1.23", "", { "dependencies": { "cacheable": "^2.5.0", "flatted": "^3.4.2", "hookified": "^1.15.0" } }, "sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA=="], + "cliui/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], "table/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], "table/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "wrap-ansi/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], } } diff --git a/bunfig.toml b/bunfig.toml index 242c6190..b385f1fa 100644 --- a/bunfig.toml +++ b/bunfig.toml @@ -1,10 +1,15 @@ "$schema" = "https://www.schemastore.org/bunfig.json" +[run] +bun = true +noOrphans = true + [install] auto = "disable" linker = "isolated" peer = false minimumReleaseAge = 604800 # 7 days +minimumReleaseAgeExcludes = ["@maxmilton/*"] [test] preload = ["./test/setup.ts"] diff --git a/docs/dev/.npmrc b/docs/dev/.npmrc deleted file mode 100644 index 58ec0bea..00000000 --- a/docs/dev/.npmrc +++ /dev/null @@ -1,2 +0,0 @@ -shamefully‑hoist=true -lockfile=false diff --git a/docs/dev/bunfig.toml b/docs/dev/bunfig.toml new file mode 100644 index 00000000..58c18ca4 --- /dev/null +++ b/docs/dev/bunfig.toml @@ -0,0 +1,11 @@ +"$schema" = "https://www.schemastore.org/bunfig.json" + +logLevel = "debug" + +[install] +linker = "isolated" +peer = false +minimumReleaseAge = 604800 # 7 days + +[install.lockfile] +save = false diff --git a/docs/dev/package.json b/docs/dev/package.json index 5b234b94..8ba45511 100644 --- a/docs/dev/package.json +++ b/docs/dev/package.json @@ -5,10 +5,5 @@ "devDependencies": { "microdoc": "*", "sirv-cli": "*" - }, - "__pnpm": { - "overrides": { - "microdoc": "../../../microdoc" - } } } diff --git a/docs/dev/pnpm-workspace.yaml b/docs/dev/pnpm-workspace.yaml deleted file mode 100644 index d05a7e7d..00000000 --- a/docs/dev/pnpm-workspace.yaml +++ /dev/null @@ -1,2 +0,0 @@ -packages: - - . diff --git a/eslint.config.mjs b/eslint.config.mjs index 78f91442..ed236dad 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -24,9 +24,11 @@ export default defineConfig( rules: { "@typescript-eslint/prefer-nullish-coalescing": "warn", // compatibility with node >= v12 "no-plusplus": "off", // byte savings + "unicorn/consistent-boolean-name": "off", "unicorn/no-array-callback-reference": "off", // byte savings "unicorn/no-array-for-each": "off", // slower but more compact (for non-performance-critical code) "unicorn/prefer-at": "off", // bad browser support + "unicorn/prefer-code-point": "off", // faster "unicorn/prefer-global-this": "off", // prefer to clearly separate Bun and DOM "unicorn/prefer-string-replace-all": "off", // bad browser support and slower "unicorn/prefer-uint8array-base64": "off", // not available in node < v25 @@ -65,9 +67,10 @@ export default defineConfig( "unicorn/no-anonymous-default-export": "off", "unicorn/no-process-exit": "off", "unicorn/no-unsafe-string-replacement": "warn", + "unicorn/prefer-early-return": "off", "unicorn/prefer-logical-operator-over-ternary": "off", "unicorn/prefer-minimal-ternary": "off", }, }, - { ignores: ["**/*.bak", "**/dist", "coverage", "packages/framework/*.d.ts"] }, + { ignores: ["**/*.bak", "**/dist", ".claude", "coverage", "packages/framework/*.d.ts"] }, ); diff --git a/package.json b/package.json index 2db94879..671f0ffe 100644 --- a/package.json +++ b/package.json @@ -17,23 +17,23 @@ "test:node:c8": "c8 npm run test:node" }, "devDependencies": { - "@biomejs/biome": "2.5.10", + "@biomejs/biome": "2.5.14", "@eslint/js": "10.0.1", "@maxmilton/eslint-config": "0.3.5", "@maxmilton/stylelint-config": "0.4.4", "@maxmilton/test-utils": "0.0.18", - "@types/bun": "1.4.0", - "@types/node": "26.3.0", - "c8": "11.0.0", + "@types/bun": "1.4.2", + "@types/node": "26.6.2", + "c8": "12.0.0", "ekscss": "workspace:*", - "eslint": "10.9.1", - "eslint-plugin-unicorn": "70.0.0", + "eslint": "10.11.0", + "eslint-plugin-unicorn": "76.0.0", "postcss-ekscss": "workspace:*", - "stylelint": "17.14.1", + "stylelint": "17.15.0", "stylelint-config-standard": "40.0.0", - "turbo": "2.10.12", + "turbo": "2.11.2", "typescript": "6.0.3", - "typescript-eslint": "8.68.0", + "typescript-eslint": "8.70.1", "uvu": "0.5.6" }, "packageManager": "bun@1.99.0" diff --git a/packages/build-tools/src/index.ts b/packages/build-tools/src/index.ts index 0e273adc..c2a508e2 100644 --- a/packages/build-tools/src/index.ts +++ b/packages/build-tools/src/index.ts @@ -14,6 +14,7 @@ export function createTypes(entrypoints: string[], outdir = "dist"): void { skipLibCheck: true, }; const result = createProgram(entrypoints, config).emit(undefined, undefined, undefined, true); + // eslint-disable-next-line unicorn/prefer-early-return if (result.emitSkipped) { // eslint-disable-next-line no-console console.error( diff --git a/packages/bun-plugin-ekscss/package.json b/packages/bun-plugin-ekscss/package.json index b5027d77..c4322dce 100644 --- a/packages/bun-plugin-ekscss/package.json +++ b/packages/bun-plugin-ekscss/package.json @@ -1,6 +1,6 @@ { "name": "bun-plugin-ekscss", - "version": "0.0.3", + "version": "0.0.4-next.0", "description": "Bun plugin to add support for XCSS", "homepage": "https://ekscss.js.org", "repository": "github:maxmilton/ekscss", diff --git a/packages/cli/index.js b/packages/cli/index.js index 0226acff..2a905202 100644 --- a/packages/cli/index.js +++ b/packages/cli/index.js @@ -94,12 +94,7 @@ module.exports = async (src, dest, opts) => { if (sourcemap) { if (config.banner) { - const bannerLineCount = config.banner.split("\n").length; - for (let i = 0; i < bannerLineCount; i++) { - // @ts-expect-error - internal property - // eslint-disable-next-line - sourcemap._map._mappings.unshift([]); - } + sourcemap.shift(config.banner.split("\n").length); } await Promise.all([ diff --git a/packages/cli/package.json b/packages/cli/package.json index d71efaba..b382fc6b 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@ekscss/cli", - "version": "0.0.21", + "version": "0.0.22-next.0", "description": "A simple, fast, and powerful CSS preprocessor", "homepage": "https://ekscss.js.org", "repository": "github:maxmilton/ekscss", diff --git a/packages/config-loader/package.json b/packages/config-loader/package.json index 088649a5..a590e182 100644 --- a/packages/config-loader/package.json +++ b/packages/config-loader/package.json @@ -18,6 +18,6 @@ }, "devDependencies": { "@ekscss/build-tools": "workspace:*", - "esbuild": "0.28.1" + "esbuild": "0.28.2" } } diff --git a/packages/config-loader/src/index.ts b/packages/config-loader/src/index.ts index 3cfad0eb..fdf99cfd 100644 --- a/packages/config-loader/src/index.ts +++ b/packages/config-loader/src/index.ts @@ -125,10 +125,8 @@ export class ConfigLoader { return mod.default || mod; } - if (this.packageJsonCache.has(filePath)) { - return this.packageJsonCache.get(filePath); - } - - return JSON.parse(fs.readFileSync(filePath, "utf8")); + return this.packageJsonCache.has(filePath) + ? this.packageJsonCache.get(filePath) + : JSON.parse(fs.readFileSync(filePath, "utf8")); } } diff --git a/packages/ekscss/build.ts b/packages/ekscss/build.ts index 5277272d..680e3559 100644 --- a/packages/ekscss/build.ts +++ b/packages/ekscss/build.ts @@ -19,7 +19,7 @@ const out1 = await build({ "process.env.BROWSER": "false", "process.env.NODE_ENV": JSON.stringify(mode), }, - external: ["@jridgewell/gen-mapping", "stylis"], + external: ["@jridgewell/*", "stylis"], bundle: true, sourcemap: true, minify: !isDev, diff --git a/packages/ekscss/package.json b/packages/ekscss/package.json index 644219e6..54f99f69 100644 --- a/packages/ekscss/package.json +++ b/packages/ekscss/package.json @@ -1,6 +1,6 @@ { "name": "ekscss", - "version": "0.0.23", + "version": "0.0.24-next.0", "description": "A simple, fast, and powerful CSS preprocessor", "homepage": "https://ekscss.js.org", "repository": "github:maxmilton/ekscss", @@ -19,12 +19,14 @@ }, "dependencies": { "@jridgewell/gen-mapping": "^0.3.13", + "@jridgewell/remapping": "^2.3.5", "@types/stylis": "^4.2.7", "stylis": "^4.3.6" }, "devDependencies": { "@ekscss/build-tools": "workspace:*", "@ekscss/plugin-null": "workspace:*", - "esbuild": "0.28.1" + "@jridgewell/trace-mapping": "0.3.31", + "esbuild": "0.28.2" } } diff --git a/packages/ekscss/src/compiler.ts b/packages/ekscss/src/compiler.ts index 2755dfe9..025237f0 100644 --- a/packages/ekscss/src/compiler.ts +++ b/packages/ekscss/src/compiler.ts @@ -36,27 +36,31 @@ export function compile( ctx.rootDir = rootDir; ctx.from = from; + ctx.raw = map ? code : undefined; + ctx.pos = map ? new Map() : undefined; ctx.fn = fn; ctx.x = x; ctx.dependencies = dependencies; ctx.warnings = warnings; - for (const run of beforeBuild) run(); + try { + for (const run of beforeBuild) run(); - const interpolated = interpolate(code)(xcss, x, fn); - const ast = stylis.compile(interpolated); - const css = stylis.serialize(ast, stylis.middleware(middlewares)); + const interpolated = interpolate(code)(xcss, x, fn); + const ast = stylis.compile(interpolated); + const css = stylis.serialize(ast, stylis.middleware(middlewares)); - for (const run of afterBuild) run(); + for (const run of afterBuild) run(); - // @ts-expect-error - reset ctx to initial state - // dprint-ignore - ctx.rootDir = ctx.from = ctx.fn = ctx.x = ctx.dependencies = ctx.warnings = undefined; // eslint-disable-line no-multi-assign - - return { - css, - map: map ? compileSourceMap(code, ast, rootDir, from, to, warnings) : undefined, - dependencies, - warnings, - }; + return { + css, + map: map ? compileSourceMap(interpolated, ast, to) : undefined, + dependencies, + warnings, + }; + } finally { + // @ts-expect-error - reset ctx for next compile + // biome-ignore format: Reset ctx + ctx.rootDir = ctx.from = ctx.raw = ctx.pos = ctx.fn = ctx.x = ctx.dependencies = ctx.warnings = undefined; // eslint-disable-line no-multi-assign + } } diff --git a/packages/ekscss/src/helpers.ts b/packages/ekscss/src/helpers.ts index f02496a7..03e52add 100644 --- a/packages/ekscss/src/helpers.ts +++ b/packages/ekscss/src/helpers.ts @@ -10,6 +10,8 @@ const toType = (value: unknown): string => Object.prototype.toString.call(value) export const ctx = { rootDir: undefined, from: undefined, + raw: undefined, + pos: undefined, fn: undefined, x: undefined, dependencies: undefined, @@ -85,11 +87,9 @@ export function accessorsProxy(obj: T, parentPath: string): T // eslint-disable-next-line guard-for-in for (const key in baseTarget) { - // eslint-disable-next-line unicorn/no-unsafe-property-key const value = baseTarget[key]; if (typeof value === "object" && value !== null) { - // eslint-disable-next-line unicorn/no-unsafe-property-key baseTarget[key] = accessorsProxy(value, `${parentPath}.${key}`); } } @@ -183,6 +183,33 @@ export function each( return out; } +function resolveExpressionValue(value: Expression): string { + // Reduce XCSS function expressions to their final value + while (typeof value === "function") { + // eslint-disable-next-line no-param-reassign + value = value(ctx.x, ctx.fn); + } + + if (typeof value === "object" && value !== null) { + if (typeof value.toString === "function") { + // eslint-disable-next-line no-param-reassign + value = value.toString(); + } else { + ctx.warnings.push({ + code: "expression-invalid", + message: `Invalid XCSS template expression. Must be string, object with toString() method, number, or falsely but got ${toType( + value, + )}`, + file: ctx.from, + }); + + return "INVALID"; + } + } + + return value === false || value == null ? "" : String(value); +} + /** * XCSS template literal tag function. * @@ -195,35 +222,62 @@ export function xcss(template: TemplateStringsArray, ...expressions: Expression[ let index = 0; let out = ""; - for (; index < len; index++) { - let value = expressions[index - 1]; - - // Reduce XCSS function expressions to their final value - while (typeof value === "function") { - value = value(ctx.x, ctx.fn); + // eslint-disable-next-line prefer-destructuring + const raw = ctx.raw; + const track = raw !== undefined && len > 1; + + // Flat `[genStart, origStart, genStart, origStart, ...]` pairs + let segments: number[] | undefined; + let offsets: number[] | undefined; + + if (track) { + segments = []; + ctx.pos!.set(ctx.from, segments); + + // Literal chunks (`.raw`) are exact, in-order, non-overlapping + // substrings of the original source, so their original offsets can be + // recovered with a sequential scan. We don't have the source text of + // `${...}` expressions themselves (only their evaluated value), so + // expression segments below collapse to a single point instead. + offsets = []; + let cursor = 0; + + for (let i = 0; i < len; i++) { + const found = raw.indexOf(strings[i], cursor); + const start = found === -1 ? cursor : found; + offsets[i] = start; + cursor = start + strings[i].length; } - if (typeof value === "object" && value !== null) { - if (typeof value.toString === "function") { - value = value.toString(); - } else { - ctx.warnings.push({ - code: "expression-invalid", - message: `Invalid XCSS template expression. Must be string, object with toString() method, number, or falsely but got ${toType( - value, - )}`, - file: ctx.from, - }); + // Guard against reentrancy while position-tracking: an expression can + // itself call `xcss` e.g., `${fn.each(items, (k, v) => xcss`...`)}`. + ctx.raw = undefined; + } + + try { + for (; index < len; index++) { + const resolved = resolveExpressionValue(expressions[index - 1]); + + if (track && index > 0) { + // The expression value interpolated between the previous literal + // chunk and this one collapses to a single point mapping at the + // original `${` boundary. + segments!.push(out.length, offsets![index - 1] + strings[index - 1].length); + } + + out += resolved; - value = "INVALID"; + if (track) { + segments!.push(out.length, offsets![index]); } + + out += strings[index]; } - // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing, @typescript-eslint/restrict-plus-operands - out += (value || (value == null || value === false ? "" : value)) + strings[index]; + return out; + } finally { + if (track) ctx.raw = raw; } - - return out; } /** @@ -242,7 +296,7 @@ export function resolvePlugins(plugins: (Middleware | string)[]): Middleware[] { if (typeof plugin !== "string") return plugin; try { - // eslint-disable-next-line + // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-unsafe-assignment, global-require const mod = require(plugin); // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access return (mod.default ?? mod) as Middleware; diff --git a/packages/ekscss/src/sourcemap.ts b/packages/ekscss/src/sourcemap.ts index ef7a3dfe..86d4e4c6 100644 --- a/packages/ekscss/src/sourcemap.ts +++ b/packages/ekscss/src/sourcemap.ts @@ -2,9 +2,7 @@ // - Explain our template engine and link to supporting docs: // ↳ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals // ↳ https://tc39.es/ecma262/#sec-tagged-templates -// - State of source map support -// - How to comment expressions in templates (it's actually not really possible -// depending on the context) +// - How to comment expressions in templates (not possible depending on the context) // - Source map build performance impact (include benchmarks). // - That @import'd files will have their source map applied if they end with a // source map URL ref comment: @@ -12,58 +10,138 @@ // ↳ //# sourceMappingURL=... // ↳ Spec: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.lmz475t4mvbx -// FIXME: Template interpolation needs to be handled in source maps... and can -// it be done in a way that has zero or near-zero performance impact when -// sourcemaps are off? - -/* eslint-disable @typescript-eslint/prefer-for-of, no-underscore-dangle, unicorn/no-for-loop */ +/* eslint-disable @typescript-eslint/prefer-for-of, no-param-reassign, no-underscore-dangle, prefer-destructuring, unicorn/no-for-loop */ +import fs from "node:fs"; import path from "node:path"; import { addMapping, + type EncodedSourceMap, GenMapping, maybeAddMapping, setSourceContent, toEncodedMap, } from "@jridgewell/gen-mapping"; +import remapping, { type SourceMapInput } from "@jridgewell/remapping"; import * as stylis from "stylis"; -import type { Element, RawSourceMap, Warning } from "./types.ts"; +import { ctx } from "./helpers.ts"; +import type { Element, RawSourceMap } from "./types.ts"; function extractSourceMapRef(ast: Element[]): string | null { - let currentNode: Element; - let index = 0; + const prefix = "# sourceMappingURL="; // Look through the last 3 AST nodes to try find a source map ref comment - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, no-cond-assign - while (++index < 4 && (currentNode = ast[ast.length - index])) { + for (let i = 1; i <= 3 && i <= ast.length; i++) { + const node = ast[ast.length - i]; + // NOTE: In stylis, comment nodes always have a string children value. - if ( - currentNode.type === stylis.COMMENT - && (currentNode.children as string).startsWith("# sourceMappingURL=") - ) { - return (currentNode.children as string).slice("# sourceMappingURL=".length).trim(); + if (node.type === stylis.COMMENT && (node.children as string).startsWith(prefix)) { + return (node.children as string).slice(prefix.length).trim(); } } return null; } +function loadSourceMap(ref: string, importerFile: string): EncodedSourceMap | undefined { + try { + const dataUriMatch = /^data:application\/json(?:;charset=[^;]+)?;base64,(.+)$/.exec(ref); + + if (dataUriMatch) { + return JSON.parse( + Buffer.from(dataUriMatch[1], "base64").toString("utf8"), + ) as EncodedSourceMap; + } + + const mapPath = path.resolve(path.dirname(importerFile), ref); + return JSON.parse(fs.readFileSync(mapPath, "utf8")) as EncodedSourceMap; + } catch (error) { + ctx.warnings.push({ + code: "sourcemap-ref-invalid", + message: `Unable to load referenced source map "${ref}": ${(error as Error).message}`, + file: importerFile, + }); + return undefined; + } +} + +/** Character offset of the start of each line (0-based) in `text`. */ +function buildLineStarts(text: string): number[] { + const starts = [0]; + let i = text.indexOf("\n"); + + while (i !== -1) { + starts.push(i + 1); + i = text.indexOf("\n", i + 1); + } + + return starts; +} + +/** Convert a stylis (1-based line, 1-based column) position to a character offset. */ +function offsetAt(lineStarts: number[], line: number, column: number): number { + const lineIndex = Math.min(line - 1, lineStarts.length - 1); + return lineStarts[lineIndex] + (column - 1); +} + +/** + * Convert a character offset back to a (1-based line, 0-based column) + * position, as `addMapping` expects. Writes into `target` directly. + */ +function lineColAt( + lineStarts: number[], + offset: number, + target: { line: number; column: number }, +): void { + let lo = 0; + let hi = lineStarts.length - 1; + + while (lo < hi) { + const mid = Math.floor((lo + hi + 1) / 2); + if (lineStarts[mid] <= offset) lo = mid; + else hi = mid - 1; + } + + target.line = lo + 1; + target.column = offset - lineStarts[lo]; +} + +/** + * Binary search over flat `[genStart, origStart, ...]` pairs (sorted, + * contiguous by construction) for the pair index whose `genStart` is the + * largest one not exceeding `genOffset`, or `-1` if even the first exceeds it. + */ +function findSegmentIndex(segments: number[], genOffset: number): number { + if (segments[0] > genOffset) return -1; + + let lo = 0; + let hi = segments.length / 2 - 1; + + while (lo < hi) { + const mid = Math.floor((lo + hi + 1) / 2); + if (segments[mid * 2] <= genOffset) lo = mid; + else hi = mid - 1; + } + + return lo; +} + export function compileSourceMap( - code: string, + interpolated: string, ast: Element[], - rootDir: string, - from: string | undefined, to: string | undefined, - warnings: Warning[], ): RawSourceMap | undefined { if (process.env.BROWSER) { - warnings.push({ + ctx.warnings.push({ code: "browser-no-sourcemap", message: "Browser runtime does not support sourcemap", }); return undefined; } + const rootDir = ctx.rootDir; + const from = ctx.from; + const code = ctx.raw!; const sourcePath = to ?? from; const sourceRoot = sourcePath ? path.dirname(sourcePath) : rootDir; @@ -74,9 +152,113 @@ export function compileSourceMap( setSourceContent(map, from ? path.relative(rootDir, from) : "", code); - // NOTE: Stylis stringify transforms the AST into a single line string, so we - // only need to track the generated output column position. - let position = 0; + const rawTextByFile = new Map([[from, code]]); + const genTextByFile = new Map([[from, interpolated]]); + const genLineStartsCache = new Map(); + const origLineStartsCache = new Map(); + const importMaps = new Map(); + + function getLineStarts( + cache: Map, + textByFile: Map, + fileKey: string | undefined, + ): number[] | undefined { + let starts = cache.get(fileKey); + if (starts) return starts; + + const text = textByFile.get(fileKey); + if (text === undefined) return undefined; + + starts = buildLineStarts(text); + cache.set(fileKey, starts); + return starts; + } + + function resolveOriginal( + fileKey: string | undefined, + node: Element, + target: { line: number; column: number }, + ): void { + const fallback = () => { + target.line = node.line; + target.column = node.column - 1; + }; + + const segments = ctx.pos!.get(fileKey); + + if (!segments || segments.length === 0) { + fallback(); + return; + } + + const genLineStarts = getLineStarts(genLineStartsCache, genTextByFile, fileKey); + if (!genLineStarts) { + fallback(); + return; + } + + const genOffset = offsetAt(genLineStarts, node.line, node.column); + + // Segments are flat [genStart, origStart, genStart, origStart, ...] + // pairs, sorted and contiguous — walk forward keeping the last pair + // whose genStart doesn't exceed the offset (pairs alternate literal/ + // value by construction, starting with a literal chunk). + const segIndex = findSegmentIndex(segments, genOffset); + if (segIndex === -1) { + fallback(); + return; + } + + const genStart = segments[segIndex * 2]; + const origStart = segments[segIndex * 2 + 1]; + const isLiteral = segIndex % 2 === 0; + + const origLineStarts = getLineStarts(origLineStartsCache, rawTextByFile, fileKey); + if (!origLineStarts) { + fallback(); + return; + } + + const origOffset = isLiteral ? origStart + (genOffset - genStart) : origStart; + + lineColAt(origLineStarts, origOffset, target); + } + + // Tracks the current position in the generated (serialized) output. + // NOTE: Stylis stringify usually produces a single line (whitespace outside + // parens is collapsed), but a declaration value can contain a literal + // newline when it's inside parens (e.g. a hand-formatted multi-line + // `minmax(...)`), so we track line breaks rather than assuming column-only. + let genLine = 1; + let genColumn = 0; + + function advance(text: string) { + const firstNewline = text.indexOf("\n"); + + if (firstNewline === -1) { + genColumn += text.length; + return; + } + + let newlineCount = 1; + let lastNewline = firstNewline; + + for (let i = firstNewline + 1; i < text.length; i++) { + // eslint-disable-next-line no-continue + if (text.charCodeAt(i) !== 10) continue; + newlineCount++; + lastNewline = i; + } + + genLine += newlineCount; + genColumn = text.length - lastNewline - 1; + } + + const nodeMapping = { + generated: { line: 0, column: 0 }, + source: "", + original: { line: 0, column: 0 }, + }; function walk(children: Element[], parent: Element | null) { for (let i = 0; i < children.length; i++) { @@ -84,33 +266,34 @@ export function compileSourceMap( if (node.return) { if ("__ast" in node) { - // FIXME: Use `@jridgewell/remapping` to combine source maps. + const srcFrom = node.__from; + const srcPath = srcFrom ? path.relative(rootDir, srcFrom) : ""; + const content = node.__raw ?? node.__code ?? ""; + + rawTextByFile.set(srcFrom, node.__raw ?? node.__code ?? ""); + genTextByFile.set(srcFrom, node.__code ?? ""); + const sourceMapRef = extractSourceMapRef(node.__ast); - if (sourceMapRef) { - // eslint-disable-next-line no-console - console.warn("Skipping input source map (not yet supported):", sourceMapRef); + if (sourceMapRef && srcFrom) { + const inputMap = loadSourceMap(sourceMapRef, srcFrom); + if (inputMap) importMaps.set(srcPath, inputMap); } - setSourceContent(map, path.relative(rootDir, node.__from!), node.__code!); + setSourceContent(map, srcPath, content); walk(node.__ast, node); } else { const srcFrom = parent?.__from ?? from; const srcPath = srcFrom ? path.relative(rootDir, srcFrom) : ""; - maybeAddMapping(map, { - generated: { - line: 1, - column: position, - }, - source: srcPath, - original: { - line: node.line, - column: node.column, - }, - }); - - position += node.return.length; + nodeMapping.generated.line = genLine; + nodeMapping.generated.column = genColumn; + nodeMapping.source = srcPath; + resolveOriginal(srcFrom, node, nodeMapping.original); + + maybeAddMapping(map, nodeMapping); + + advance(node.return); } } } @@ -118,16 +301,43 @@ export function compileSourceMap( walk(ast, null); + let finalMap: EncodedSourceMap | null = null; + let shiftLines = 0; + + function finalize(): EncodedSourceMap { + if (finalMap) return finalMap; + + const encoded = toEncodedMap(map); + let result = + importMaps.size > 0 + ? (remapping( + encoded as SourceMapInput, + (file) => (importMaps.get(file) as SourceMapInput | undefined) ?? null, + ) as EncodedSourceMap) + : encoded; + + if (shiftLines > 0) { + result = { ...result, mappings: ";".repeat(shiftLines) + result.mappings }; + } + + finalMap = result; + return finalMap; + } + return { - _map: map, addMapping(mapping) { addMapping(map, mapping); + finalMap = null; + }, + shift(lineCount) { + shiftLines += lineCount; + finalMap = null; }, toString() { - return JSON.stringify(toEncodedMap(map)); + return JSON.stringify(finalize()); }, toJSON() { - return toEncodedMap(map); + return finalize(); }, }; } diff --git a/packages/ekscss/src/types.ts b/packages/ekscss/src/types.ts index 103856ae..7bd9bb6c 100644 --- a/packages/ekscss/src/types.ts +++ b/packages/ekscss/src/types.ts @@ -1,10 +1,20 @@ -import type { addMapping, EncodedSourceMap, GenMapping } from "@jridgewell/gen-mapping"; +import type { addMapping, EncodedSourceMap } from "@jridgewell/gen-mapping"; import type { Element as _Element, Middleware } from "stylis"; import type { xcss as _xcss } from "./helpers.ts"; // eslint-disable-next-line unicorn/prefer-export-from export type { Middleware }; +// eslint-disable-next-line @typescript-eslint/consistent-indexed-object-style +interface Dict { + [key: string]: T | undefined; +} + +// eslint-disable-next-line @typescript-eslint/consistent-indexed-object-style +interface ReadOnlyDict { + readonly [key: string]: T | undefined; +} + export interface Element extends _Element { /** * File path of imported file (for constructing source maps). @@ -17,6 +27,13 @@ export interface Element extends _Element { * * Only on `@import` nodes when `@ekscss/plugin-import` is used. */ + __raw?: string; + /** + * Source code of imported file used to compile it, post-interpolation (for + * constructing source maps). + * + * Only on `@import` nodes when `@ekscss/plugin-import` is used. + */ __code?: string; /** * Compiled AST of imported file (for constructing source maps). @@ -42,6 +59,23 @@ export interface Context { rootDir: string; from: string | undefined; + /** + * Original source text of the file currently being compiled, or `undefined` + * when source maps aren't being generated. + */ + raw: string | undefined; + /** + * Per-file interpolation position maps, keyed by `from`, built by `xcss()` + * during interpolation for source maps (only when `raw` is set). + * + * Each value is a flat list of `[genStart, origStart, genStart, origStart, + * ...]` pairs describing contiguous spans of the interpolated/generated + * text and the original-source offset each maps to. Pairs alternate + * literal-chunk/expression-value by construction, starting with a literal + * chunk (even pair index = literal, odd = an interpolated expression's + * value, collapsed to a single original-source point). + */ + pos: Map | undefined; fn: Functions; x: Globals; dependencies: string[]; @@ -98,8 +132,9 @@ export type BuildHook = () => void; export type TemplateFn = (xcss: typeof _xcss, x: Globals, fn: Functions) => string; export interface RawSourceMap { - readonly _map: GenMapping; addMapping(mapping: Parameters[1]): void; + /** Shift every mapping down by `lineCount` generated lines. */ + shift(lineCount: number): void; toString(): string; toJSON(): EncodedSourceMap; } diff --git a/packages/ekscss/test/__snapshots__/sourcemap.test.ts.snap b/packages/ekscss/test/__snapshots__/sourcemap.test.ts.snap new file mode 100644 index 00000000..e6babc4b --- /dev/null +++ b/packages/ekscss/test/__snapshots__/sourcemap.test.ts.snap @@ -0,0 +1,136 @@ +// Bun Snapshot v1, https://bun.sh/docs/test/snapshots + +exports[`source map snapshots encoded map for a simple compile with no interpolation or imports 1`] = ` +{ + "file": undefined, + "ignoreList": [], + "mappings": "AAAE,aACA", + "names": [], + "sourceRoot": undefined, + "sources": [ + "", + ], + "sourcesContent": [ + +"a{color:red} +b{color:blue}" +, + ], + "version": 3, +} +`; + +exports[`source map snapshots encoded map for interpolated expressions spread over multiple rules 1`] = ` +{ + "file": undefined, + "ignoreList": [], + "mappings": "AAAE,kCACA,mCACA", + "names": [], + "sourceRoot": undefined, + "sources": [ + "", + ], + "sourcesContent": [ + +"a{--c1:\${x.c1};--c2:\${x.c2};--c3:\${x.c3}} +b{--c4:\${x.c4};--c5:\${x.c5};--c6:\${x.c6}} +c{--c7:\${x.c7};--c8:\${x.c8};--c9:\${x.c9}}" +, + ], + "version": 3, +} +`; + +exports[`source map snapshots encoded map across an @import chain from multiple distinct files 1`] = ` +{ + "file": undefined, + "ignoreList": [], + "mappings": "ACAG,cACA,iBCDA,eACA,eFCD", + "names": [], + "sourceRoot": undefined, + "sources": [ + "", + "a.css", + "b.css", + ], + "sourcesContent": [ + +"@import "/virtual/a.css"; +@import "/virtual/b.css"; +c{color:green}" +, + +"a1{color:red} +a2{color:orange}" +, + +"b1{color:blue} +b2{color:navy}" +, + ], + "version": 3, +} +`; + +exports[`source map snapshots encoded map when a nested @import's own sourceMappingURL is remapped 1`] = ` +SourceMap { + "file": undefined, + "ignoreList": [], + "mappings": "AAAA,cCCE", + "names": [], + "sourceRoot": undefined, + "sources": [ + "foo.scss", + "", + ], + "sourcesContent": [ + null, + +"@import "/virtual/foo.css"; +a{color:red}" +, + ], + "version": 3, +} +`; + +exports[`source map snapshots encoded map after shift prepends a banner offset 1`] = ` +{ + "file": undefined, + "ignoreList": [], + "mappings": ";;AAAE,aACA", + "names": [], + "sourceRoot": undefined, + "sources": [ + "", + ], + "sourcesContent": [ + +"a{color:red} +b{color:blue}" +, + ], + "version": 3, +} +`; + +exports[`source map snapshots encoded map after addMapping following shift keeps both 1`] = ` +{ + "file": undefined, + "ignoreList": [], + "mappings": ";;AAAE;;;;;;;;;ACAFA", + "names": [ + "synthetic", + ], + "sourceRoot": undefined, + "sources": [ + "", + "synthetic.css", + ], + "sourcesContent": [ + "a{color:red}", + null, + ], + "version": 3, +} +`; diff --git a/packages/ekscss/test/compile.test.ts b/packages/ekscss/test/compile.test.ts index 19591469..989eb0a4 100644 --- a/packages/ekscss/test/compile.test.ts +++ b/packages/ekscss/test/compile.test.ts @@ -1,13 +1,12 @@ // TODO: Write more tests -// - Add new file `sourcemap.test.ts` + write tests for source map support // - Validate "warnings" are generated in expected scenarios and file, line, column are correct // - Validate "dependencies" are added correctly // biome-ignore-all lint/suspicious/noTemplateCurlyInString: used in tests import { describe, expect, mock, test } from "bun:test"; -import { GenMapping } from "@jridgewell/gen-mapping"; import { compile, onAfterBuild, onBeforeBuild } from "../src/compiler.ts"; +import { ctx } from "../src/helpers.ts"; const complexCodeFixture = ` /** @@ -218,63 +217,27 @@ describe("compile", () => { expect(compiled.warnings).toHaveLength(0); }); - describe("source map", () => { - test("returns source map when map option is true", () => { - expect.assertions(2); - const compiled = compile("", { map: true }); - expect(compiled.map).toBeDefined(); - expect(compiled.warnings).toHaveLength(0); - }); - - test("does not return source map when map option is false", () => { - expect.assertions(2); - const compiled = compile("", { map: false }); - expect(compiled.map).toBeUndefined(); - expect(compiled.warnings).toHaveLength(0); - }); - - test("is an object", () => { - expect.assertions(1); - const compiled = compile("", { map: true }); - expect(compiled.map).toBeObject(); - }); - - test("has _map property as instance of GenMapping", () => { - expect.assertions(1); - const compiled = compile("", { map: true }); - // eslint-disable-next-line no-underscore-dangle - expect(compiled.map?._map).toBeInstanceOf(GenMapping); - }); - - test("has an addMapping method", () => { - expect.assertions(2); - const compiled = compile("", { map: true }); - expect(compiled.map).toHaveProperty("addMapping"); - // eslint-disable-next-line @typescript-eslint/unbound-method - expect(compiled.map?.addMapping).toBeFunction(); - }); - - test("has a toString method", () => { - expect.assertions(2); - const compiled = compile("", { map: true }); - expect(compiled.map).toHaveProperty("toString"); - // eslint-disable-next-line @typescript-eslint/unbound-method - expect(compiled.map?.toString).toBeFunction(); - }); - - test("has a toJSON method", () => { - expect.assertions(2); - const compiled = compile("", { map: true }); - expect(compiled.map).toHaveProperty("toJSON"); - // eslint-disable-next-line @typescript-eslint/unbound-method - expect(compiled.map?.toJSON).toBeFunction(); - }); + test("resets ctx even when interpolation throws", () => { + expect.assertions(2); + // eslint-disable-next-line no-template-curly-in-string + expect(() => compile("${undefinedVariable}")).toThrow(); + // Without a try/finally around the compile pipeline, a thrown error + // leaves ctx dangling with this failed compile's state (e.g. rootDir + // stuck at the value it was set to) instead of reset to undefined. + expect(ctx.rootDir).toBeUndefined(); + }); - // TODO: Test addMapping method expects 1 parameter - // TODO: Test addMapping method adds mapping to source map - // TODO: Test toString method expects 0 parameters - // TODO: Test toString method returns expected string - // TODO: Test toJSON method expects 0 parameters - // TODO: Test toJSON method returns expected object shape + test("a later compile still works correctly after a prior one threw", () => { + expect.assertions(1); + try { + // eslint-disable-next-line no-template-curly-in-string + compile("${undefinedVariable}"); + } catch { + // expected + } + const compiled = compile(complexCodeFixture); + expect(compiled.css).toBe(complexCodeResult); }); + + // See sourcemap.test.ts for source map behavior. }); diff --git a/packages/ekscss/test/helpers.test.ts b/packages/ekscss/test/helpers.test.ts index d022e737..c69e1ad5 100644 --- a/packages/ekscss/test/helpers.test.ts +++ b/packages/ekscss/test/helpers.test.ts @@ -52,6 +52,8 @@ describe("ctx", () => { expect(ctx).toStrictEqual({ rootDir: undefined, from: undefined, + raw: undefined, + pos: undefined, fn: undefined, x: undefined, dependencies: undefined, @@ -65,6 +67,8 @@ describe("ctx", () => { expect(ctx).toStrictEqual({ rootDir: undefined, from: undefined, + raw: undefined, + pos: undefined, fn: undefined, x: undefined, dependencies: undefined, @@ -74,10 +78,16 @@ describe("ctx", () => { test("has expected properties during compile", () => { expect.assertions(1); + const code = "${(x, fn) => fn.check()}"; // eslint-disable-line no-template-curly-in-string const check = () => { expect(ctx).toEqual({ rootDir: process.cwd(), from: undefined, + // map option isn't set in this compile() call, so raw (which + // doubles as the "track interpolation positions" flag) stays unset, + // and pos is never allocated. + raw: undefined, + pos: undefined, fn: { check, // this custom function // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment @@ -90,8 +100,7 @@ describe("ctx", () => { warnings: [], }); }; - // eslint-disable-next-line no-template-curly-in-string - compile("${(x, fn) => fn.check()}", { + compile(code, { functions: { check, }, diff --git a/packages/ekscss/test/sourcemap.test.ts b/packages/ekscss/test/sourcemap.test.ts new file mode 100644 index 00000000..16a93f94 --- /dev/null +++ b/packages/ekscss/test/sourcemap.test.ts @@ -0,0 +1,515 @@ +// biome-ignore-all lint/suspicious/noTemplateCurlyInString: used in tests + +import { describe, expect, test } from "bun:test"; +import path from "node:path"; +import { eachMapping, originalPositionFor, TraceMap } from "@jridgewell/trace-mapping"; +import * as stylis from "stylis"; +import { compile } from "../src/compiler.ts"; +import { ctx } from "../src/helpers.ts"; +import type { Element, Middleware } from "../src/types.ts"; + +/** + * Minimal stand-in for `@ekscss/plugin-import`, purpose-built for these + * tests. It only inlines from an in-memory `imports` map (no filesystem), + * setting the same `__from`/`__code`/`__raw`/`__ast` fields the real + * plugin sets so `sourcemap.ts`'s nested `@import` handling can be exercised + * without a cross-package dependency on plugin-import or fixture files on + * disk. Recurses naturally for chained imports (an imported file's own + * `@import`s are resolved through the same `callback` chain), and mirrors + * the real plugin's dedup behavior (only the first occurrence of a given + * path inlines). + */ +function makeImportPlugin(imports: Record): Middleware { + return (element, _index, _children, callback) => { + if (element.type !== stylis.IMPORT || element.return) return; + + const importPath = stylis.tokenize(element.value)[3].replace(/^["']/, "").replace(/["']$/, ""); + if (!Object.hasOwn(imports, importPath)) return; + + const el = element as Element; + + if (ctx.dependencies.includes(importPath)) { + el.value = ""; + return; + } + + const importedCode = imports[importPath]; + const ast = stylis.compile(importedCode); + + el.return = stylis.serialize(ast, callback); + // eslint-disable-next-line no-underscore-dangle + el.__from = importPath; + // eslint-disable-next-line no-underscore-dangle + el.__raw = importedCode; + // eslint-disable-next-line no-underscore-dangle + el.__code = importedCode; + // eslint-disable-next-line no-underscore-dangle + el.__ast = ast; + + ctx.dependencies.push(importPath); + }; +} + +describe("source map", () => { + test("returns source map when map option is true", () => { + expect.assertions(2); + const compiled = compile("", { map: true }); + expect(compiled.map).toBeDefined(); + expect(compiled.warnings).toHaveLength(0); + }); + + test("does not return source map when map option is false", () => { + expect.assertions(2); + const compiled = compile("", { map: false }); + expect(compiled.map).toBeUndefined(); + expect(compiled.warnings).toHaveLength(0); + }); + + test("is an object", () => { + expect.assertions(1); + const compiled = compile("", { map: true }); + expect(compiled.map).toBeObject(); + }); + + test("has an addMapping method", () => { + expect.assertions(2); + const compiled = compile("", { map: true }); + expect(compiled.map).toHaveProperty("addMapping"); + // eslint-disable-next-line @typescript-eslint/unbound-method + expect(compiled.map?.addMapping).toBeFunction(); + }); + + test("has a shift method", () => { + expect.assertions(2); + const compiled = compile("", { map: true }); + expect(compiled.map).toHaveProperty("shift"); + // eslint-disable-next-line @typescript-eslint/unbound-method + expect(compiled.map?.shift).toBeFunction(); + }); + + test("has a toString method", () => { + expect.assertions(2); + const compiled = compile("", { map: true }); + expect(compiled.map).toHaveProperty("toString"); + // eslint-disable-next-line @typescript-eslint/unbound-method + expect(compiled.map?.toString).toBeFunction(); + }); + + test("has a toJSON method", () => { + expect.assertions(2); + const compiled = compile("", { map: true }); + expect(compiled.map).toHaveProperty("toJSON"); + // eslint-disable-next-line @typescript-eslint/unbound-method + expect(compiled.map?.toJSON).toBeFunction(); + }); + + test("shift offsets every mapping's generated line", () => { + expect.assertions(1); + const compiled = compile("a{color:red}", { map: true }); + compiled.map!.shift(2); + const traceMap = new TraceMap(compiled.map!.toJSON()); + const original = originalPositionFor(traceMap, { line: 3, column: 0 }); + expect(original.line).toBe(1); + }); + + test("shift composes across multiple calls", () => { + expect.assertions(1); + const compiled = compile("a{color:red}", { map: true }); + compiled.map!.shift(1); + compiled.map!.shift(2); + const traceMap = new TraceMap(compiled.map!.toJSON()); + const original = originalPositionFor(traceMap, { line: 4, column: 0 }); + expect(original.line).toBe(1); + }); + + test("shift offset survives a later addMapping call", () => { + expect.assertions(1); + const compiled = compile("a{color:red}", { map: true }); + compiled.map!.shift(2); + compiled.map!.addMapping({ + generated: { line: 10, column: 0 }, + source: "synthetic.css", + original: { line: 1, column: 0 }, + name: "synthetic", + }); + const traceMap = new TraceMap(compiled.map!.toJSON()); + const original = originalPositionFor(traceMap, { line: 3, column: 0 }); + expect(original.line).toBe(1); + }); + + test("addMapping adds a mapping reflected in toJSON/toString", () => { + expect.assertions(1); + const compiled = compile("a{color:red}", { map: true }); + compiled.map!.addMapping({ + generated: { line: 5, column: 0 }, + source: "synthetic.css", + original: { line: 9, column: 0 }, + name: "synthetic", + }); + const traceMap = new TraceMap(compiled.map!.toJSON()); + const original = originalPositionFor(traceMap, { line: 5, column: 0 }); + expect(original).toMatchObject({ source: "synthetic.css", line: 9 }); + }); + + test("tracks multi-line generated positions across a newline embedded in a parenthesized value", () => { + expect.assertions(2); + // Whitespace outside parens is collapsed by stylis, but literal newlines + // inside parens (e.g. a hand-formatted multi-line function value) are + // preserved verbatim in the generated output. + const src = "a{grid-template-columns:minmax(\n1fr,\n2fr\n)}\nb{color:red}"; + const compiled = compile(src, { map: true }); + const traceMap = new TraceMap(compiled.map!.toJSON()); + + expect(compiled.css).toInclude("\n"); + + let sawMultiLineMapping = false; + eachMapping(traceMap, (mapping) => { + if (mapping.generatedLine > 1) sawMultiLineMapping = true; + }); + expect(sawMultiLineMapping).toBeTrue(); + }); + + test("maps positions after a multi-line interpolated expression back to the original source", () => { + expect.assertions(1); + // eslint-disable-next-line no-template-curly-in-string + const src = "a{color:red}\nb{color:${\n x.foo\n}}\nc{color:blue}"; + const compiled = compile(src, { map: true, globals: { foo: "green" } }); + const cIndex = compiled.css.indexOf("c{"); + const traceMap = new TraceMap(compiled.map!.toJSON()); + const original = originalPositionFor(traceMap, { line: 1, column: cIndex }); + expect(original.line).toBe(5); + }); + + test("still maps correctly when an expression calls xcss recursively (fn.each/fn.map idiom)", () => { + // NOTE: JS evaluates a tagged template's expressions (here, the nested + // `xcss` calls inside fn.each's callback) before invoking the outer + // `xcss()` call itself, so the outer call's own position tracking always + // runs last and isn't clobbered by the inner ones — this asserts that + // stays true, while the re-entrancy guard in xcss() (helpers.ts) avoids + // the inner calls doing redundant indexOf scans of the whole outer + // source for every loop iteration. + expect.assertions(2); + const src = + // eslint-disable-next-line no-template-curly-in-string + "a{color:red}\n${fn.each(x.colors, (name, value) => xcss`.${name}{color:${value}}`)}\nz{color:black}"; + const compiled = compile(src, { + map: true, + globals: { colors: { red: "coral", green: "seagreen", blue: "deepskyblue" } }, + }); + const zIndex = compiled.css.indexOf("z{"); + const traceMap = new TraceMap(compiled.map!.toJSON()); + + const firstOriginal = originalPositionFor(traceMap, { line: 1, column: 0 }); + const lastOriginal = originalPositionFor(traceMap, { line: 1, column: zIndex }); + + expect(firstOriginal.line).toBe(1); + expect(lastOriginal.line).toBe(3); + }); + + test("resolves correctly across many interpolations spread over multiple rules", () => { + expect.assertions(3); + /* eslint-disable no-template-curly-in-string */ + const src = [ + "a{--c1:${x.c1};--c2:${x.c2};--c3:${x.c3}}", + "b{--c4:${x.c4};--c5:${x.c5};--c6:${x.c6}}", + "c{--c7:${x.c7};--c8:${x.c8};--c9:${x.c9}}", + "d{--c10:${x.c10};--c11:${x.c11};--c12:${x.c12}}", + ].join("\n"); + /* eslint-enable no-template-curly-in-string */ + const compiled = compile(src, { + map: true, + globals: { + c1: "aaaaaaaaaa", + c2: "b", + c3: "cc", + c4: "ddddd", + c5: "e", + c6: "ffffffff", + c7: "g", + c8: "hhh", + c9: "iiiiiiiiiiii", + c10: "j", + c11: "kk", + c12: "l", + }, + }); + const traceMap = new TraceMap(compiled.map!.toJSON()); + const aIndex = compiled.css.indexOf("a{"); + const cIndex = compiled.css.indexOf("c{"); + const dIndex = compiled.css.indexOf("d{"); + + expect(originalPositionFor(traceMap, { line: 1, column: aIndex }).line).toBe(1); + expect(originalPositionFor(traceMap, { line: 1, column: cIndex }).line).toBe(3); + expect(originalPositionFor(traceMap, { line: 1, column: dIndex }).line).toBe(4); + }); + + test("does not corrupt tracking when two expressions are adjacent with no literal between them", () => { + expect.assertions(2); + // eslint-disable-next-line no-template-curly-in-string + const src = "x{color:${x.a}${x.b}}\ny{color:green}"; + const compiled = compile(src, { map: true, globals: { a: "red", b: "blue" } }); + + expect(compiled.css).toBe("x{color:redblue;}y{color:green;}"); + + const traceMap = new TraceMap(compiled.map!.toJSON()); + const yIndex = compiled.css.indexOf("y{"); + const original = originalPositionFor(traceMap, { line: 1, column: yIndex }); + expect(original.line).toBe(2); + }); + + test("does not corrupt tracking when an expression resolves to a falsy value", () => { + expect.assertions(2); + // eslint-disable-next-line no-template-curly-in-string + const src = "x{color:${null}red}\ny{color:green}"; + const compiled = compile(src, { map: true }); + + expect(compiled.css).toBe("x{color:red;}y{color:green;}"); + + const traceMap = new TraceMap(compiled.map!.toJSON()); + const yIndex = compiled.css.indexOf("y{"); + const original = originalPositionFor(traceMap, { line: 1, column: yIndex }); + expect(original.line).toBe(2); + }); + + test("still maps correctly with doubly-nested xcss recursion (loop inside a loop)", () => { + expect.assertions(2); + const src = + // eslint-disable-next-line no-template-curly-in-string + "a{color:red}\n${fn.each(x.groups, (gname, colors) => xcss`${fn.each(colors, (name, value) => xcss`.${gname}-${name}{color:${value}}`)}`)}\nz{color:black}"; + const compiled = compile(src, { + map: true, + globals: { + groups: { + warm: { red: "coral", orange: "coral" }, + cool: { blue: "deepskyblue" }, + }, + }, + }); + const zIndex = compiled.css.indexOf("z{"); + const traceMap = new TraceMap(compiled.map!.toJSON()); + + const firstOriginal = originalPositionFor(traceMap, { line: 1, column: 0 }); + const lastOriginal = originalPositionFor(traceMap, { line: 1, column: zIndex }); + + expect(firstOriginal.line).toBe(1); + expect(lastOriginal.line).toBe(3); + }); + + describe("@import", () => { + test("maps positions inside an @import'd file to that file's own source", () => { + expect.assertions(1); + const importedCode = "b{color:blue}\nc{color:green}"; + const plugin = makeImportPlugin({ "/virtual/foo.css": importedCode }); + + const compiled = compile('@import "/virtual/foo.css";\na{color:red}', { + map: true, + rootDir: "/virtual", + plugins: [plugin], + }); + + const cIndex = compiled.css.indexOf("c{"); + const traceMap = new TraceMap(compiled.map!.toJSON()); + const original = originalPositionFor(traceMap, { line: 1, column: cIndex }); + + expect(original).toMatchObject({ source: "foo.css", line: 2 }); + }); + + test("resolves a nested @import's own sourceMappingURL via remapping", () => { + expect.assertions(1); + const refMap = { + version: 3, + sources: ["foo.scss"], + names: [], + // Single segment: generated (line 1, col 0) -> original (foo.scss, line 1, col 0). + mappings: "AAAA", + }; + const base64 = Buffer.from(JSON.stringify(refMap)).toString("base64"); + const importedCode = `b{color:blue}\n/*# sourceMappingURL=data:application/json;base64,${base64}*/`; + const plugin = makeImportPlugin({ "/virtual/foo.css": importedCode }); + + const compiled = compile('@import "/virtual/foo.css";\na{color:red}', { + map: true, + rootDir: "/virtual", + plugins: [plugin], + }); + + const bIndex = compiled.css.indexOf("b{"); + const traceMap = new TraceMap(compiled.map!.toJSON()); + const original = originalPositionFor(traceMap, { line: 1, column: bIndex }); + + expect(original.source).toBe(path.normalize("foo.scss")); + }); + + test("maps positions from multiple distinct imports and the trailing file content correctly", () => { + expect.assertions(3); + const plugin = makeImportPlugin({ + "/virtual/a.css": "a1{color:red}\na2{color:orange}", + "/virtual/b.css": "b1{color:blue}\nb2{color:navy}", + }); + + const compiled = compile( + '@import "/virtual/a.css";\n@import "/virtual/b.css";\nc{color:green}', + { map: true, rootDir: "/virtual", plugins: [plugin] }, + ); + + const traceMap = new TraceMap(compiled.map!.toJSON()); + const a2Index = compiled.css.indexOf("a2{"); + const b2Index = compiled.css.indexOf("b2{"); + const cIndex = compiled.css.indexOf("c{"); + + expect(originalPositionFor(traceMap, { line: 1, column: a2Index })).toMatchObject({ + source: "a.css", + line: 2, + }); + expect(originalPositionFor(traceMap, { line: 1, column: b2Index })).toMatchObject({ + source: "b.css", + line: 2, + }); + expect(originalPositionFor(traceMap, { line: 1, column: cIndex }).line).toBe(3); + }); + + test("threads source/original resolution through a three-level deep @import chain", () => { + expect.assertions(1); + const plugin = makeImportPlugin({ + "/virtual/a.css": '@import "/virtual/b.css";\na{color:red}', + "/virtual/b.css": '@import "/virtual/c.css";\nb{color:blue}', + "/virtual/c.css": "c1{color:green}\nc2{color:lime}", + }); + + const compiled = compile('@import "/virtual/a.css";', { + map: true, + rootDir: "/virtual", + plugins: [plugin], + }); + + const c2Index = compiled.css.indexOf("c2{"); + const traceMap = new TraceMap(compiled.map!.toJSON()); + const original = originalPositionFor(traceMap, { line: 1, column: c2Index }); + + expect(original).toMatchObject({ source: "c.css", line: 2 }); + }); + + test("does not produce a bogus mapping for a duplicate @import (dedup keeps only the first)", () => { + expect.assertions(2); + const plugin = makeImportPlugin({ "/virtual/a.css": "a{color:red}" }); + + const compiled = compile( + '@import "/virtual/a.css";\n@import "/virtual/a.css";\nb{color:blue}', + { map: true, rootDir: "/virtual", plugins: [plugin] }, + ); + + expect(compiled.css).toBe("a{color:red;}b{color:blue;}"); + + const traceMap = new TraceMap(compiled.map!.toJSON()); + const bIndex = compiled.css.indexOf("b{"); + const original = originalPositionFor(traceMap, { line: 1, column: bIndex }); + expect(original.line).toBe(3); + }); + + test("a malformed sourceMappingURL on an imported file produces a warning instead of crashing", () => { + expect.assertions(3); + const importedCode = "b{color:blue}\n/*# sourceMappingURL=./does-not-exist.map */"; + const plugin = makeImportPlugin({ "/virtual/foo.css": importedCode }); + + const compiled = compile('@import "/virtual/foo.css";\na{color:red}', { + map: true, + rootDir: "/virtual", + plugins: [plugin], + }); + + expect(compiled.map).toBeDefined(); + expect(compiled.warnings.some((w) => w.code === "sourcemap-ref-invalid")).toBeTrue(); + + const bIndex = compiled.css.indexOf("b{"); + const traceMap = new TraceMap(compiled.map!.toJSON()); + const original = originalPositionFor(traceMap, { line: 1, column: bIndex }); + expect(original).toMatchObject({ source: "foo.css", line: 1 }); + }); + }); + + describe("snapshots", () => { + test("encoded map for a simple compile with no interpolation or imports", () => { + expect.assertions(1); + const compiled = compile("a{color:red}\nb{color:blue}", { map: true }); + expect(compiled.map!.toJSON()).toMatchSnapshot(); + }); + + test("encoded map for interpolated expressions spread over multiple rules", () => { + expect.assertions(1); + /* eslint-disable no-template-curly-in-string */ + const src = [ + "a{--c1:${x.c1};--c2:${x.c2};--c3:${x.c3}}", + "b{--c4:${x.c4};--c5:${x.c5};--c6:${x.c6}}", + "c{--c7:${x.c7};--c8:${x.c8};--c9:${x.c9}}", + ].join("\n"); + /* eslint-enable no-template-curly-in-string */ + const compiled = compile(src, { + map: true, + globals: { + c1: "aaaaaaaaaa", + c2: "b", + c3: "cc", + c4: "ddddd", + c5: "e", + c6: "ffffffff", + c7: "g", + c8: "hhh", + c9: "iiiiiiiiiiii", + }, + }); + expect(compiled.map!.toJSON()).toMatchSnapshot(); + }); + + test("encoded map across an @import chain from multiple distinct files", () => { + expect.assertions(1); + const plugin = makeImportPlugin({ + "/virtual/a.css": "a1{color:red}\na2{color:orange}", + "/virtual/b.css": "b1{color:blue}\nb2{color:navy}", + }); + const compiled = compile( + '@import "/virtual/a.css";\n@import "/virtual/b.css";\nc{color:green}', + { map: true, rootDir: "/virtual", plugins: [plugin] }, + ); + expect(compiled.map!.toJSON()).toMatchSnapshot(); + }); + + test("encoded map when a nested @import's own sourceMappingURL is remapped", () => { + expect.assertions(1); + const refMap = { + version: 3, + sources: ["foo.scss"], + names: [], + mappings: "AAAA", + }; + const base64 = Buffer.from(JSON.stringify(refMap)).toString("base64"); + const importedCode = `b{color:blue}\n/*# sourceMappingURL=data:application/json;base64,${base64}*/`; + const plugin = makeImportPlugin({ "/virtual/foo.css": importedCode }); + const compiled = compile('@import "/virtual/foo.css";\na{color:red}', { + map: true, + rootDir: "/virtual", + plugins: [plugin], + }); + expect(compiled.map!.toJSON()).toMatchSnapshot(); + }); + + test("encoded map after shift prepends a banner offset", () => { + expect.assertions(1); + const compiled = compile("a{color:red}\nb{color:blue}", { map: true }); + compiled.map!.shift(2); + expect(compiled.map!.toJSON()).toMatchSnapshot(); + }); + + test("encoded map after addMapping following shift keeps both", () => { + expect.assertions(1); + const compiled = compile("a{color:red}", { map: true }); + compiled.map!.shift(2); + compiled.map!.addMapping({ + generated: { line: 10, column: 0 }, + source: "synthetic.css", + original: { line: 1, column: 0 }, + name: "synthetic", + }); + expect(compiled.map!.toJSON()).toMatchSnapshot(); + }); + }); +}); diff --git a/packages/esbuild-plugin-ekscss/package.json b/packages/esbuild-plugin-ekscss/package.json index 244a0cb3..3f472dab 100644 --- a/packages/esbuild-plugin-ekscss/package.json +++ b/packages/esbuild-plugin-ekscss/package.json @@ -22,7 +22,7 @@ }, "devDependencies": { "ekscss": "workspace:*", - "esbuild": "0.28.1" + "esbuild": "0.28.2" }, "peerDependencies": { "ekscss": "workspace:^", diff --git a/packages/framework/config.js b/packages/framework/config.js index d56243d2..058a661c 100644 --- a/packages/framework/config.js +++ b/packages/framework/config.js @@ -66,6 +66,7 @@ module.exports = { * Copyright 2015 Palantir Technologies, Inc. All rights reserved. * Licensed under the Apache License, Version 2.0. * @see https://github.com/palantir/blueprint/blob/d4c772931b861ec60a0f4ef2032fb296746f8d9b/packages/core/src/common/_colors.scss + * @see https://github.com/palantir/blueprint/blob/develop/packages/colors/src/_colors.scss */ // Gray scale black: "#10161a", diff --git a/packages/framework/package.json b/packages/framework/package.json index 2718d6f4..c6dabe30 100644 --- a/packages/framework/package.json +++ b/packages/framework/package.json @@ -1,6 +1,6 @@ { "name": "@ekscss/framework", - "version": "0.0.60", + "version": "0.0.61-next.0", "description": "Progressive CSS framework powered by ekscss", "homepage": "https://ekscss.js.org", "repository": "github:maxmilton/ekscss", diff --git a/packages/framework/utils.js b/packages/framework/utils.js index b269bd61..be7759bd 100644 --- a/packages/framework/utils.js +++ b/packages/framework/utils.js @@ -27,6 +27,7 @@ const { ctx, interpolate, stylis, xcss } = require("ekscss"); */ function color(value, model) { return Color( + // eslint-disable-next-line unicorn/prefer-simple-condition-first value instanceof Color || typeof value !== "function" ? value : // @ts-expect-error - TODO: Correctly type `value` diff --git a/packages/framework/xcss.config.mjs b/packages/framework/xcss.config.mjs index 74cf4d09..039278b1 100644 --- a/packages/framework/xcss.config.mjs +++ b/packages/framework/xcss.config.mjs @@ -10,7 +10,7 @@ import { ctx, onBeforeBuild } from "ekscss"; import baseConfig from "./config.js"; import { preloadApply } from "./utils.js"; -/** @type {import("./package.json")} */ +/** @type {typeof import("./package.json")} */ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment const pkg = JSON.parse( readFileSync( diff --git a/packages/plugin-apply/package.json b/packages/plugin-apply/package.json index b99ba632..ee19e45c 100644 --- a/packages/plugin-apply/package.json +++ b/packages/plugin-apply/package.json @@ -1,6 +1,6 @@ { "name": "@ekscss/plugin-apply", - "version": "0.0.18", + "version": "0.0.19-next.0", "description": "XCSS plugin to inline the properties of referenced rules", "homepage": "https://ekscss.js.org", "repository": "github:maxmilton/ekscss", @@ -22,7 +22,7 @@ "devDependencies": { "@ekscss/build-tools": "workspace:*", "ekscss": "workspace:*", - "esbuild": "0.28.1" + "esbuild": "0.28.2" }, "peerDependencies": { "ekscss": "workspace:^" diff --git a/packages/plugin-apply/src/index.ts b/packages/plugin-apply/src/index.ts index 0df8339b..608dd9e0 100644 --- a/packages/plugin-apply/src/index.ts +++ b/packages/plugin-apply/src/index.ts @@ -49,11 +49,12 @@ export const applyPlugin: Middleware = (element, _index, _children, callback): v return; } + // eslint-disable-next-line unicorn/prefer-early-return if (element.type === stylis.DECLARATION && element.props === "#apply") { // TODO: Remove type cast; stylis types don't differentiate by element.type const targets = (element.children as string) .split(",") - .map((x) => x.trim().replace(/^["']/, "").replace(/["']$/, "")); + .map((x) => x.trim().replace(/^["']|["']$/g, "")); const decls: Element[] = []; for (const target of targets) { @@ -62,7 +63,9 @@ export const applyPlugin: Middleware = (element, _index, _children, callback): v if (refs) { for (const ref of refs) { // TODO: Remove type cast; stylis types don't differentiate by element.type - decls.push(...(ref.children as Element[])); + for (const decl of ref.children as Element[]) { + decls.push(decl); + } } } else { ctx.warnings.push({ diff --git a/packages/plugin-apply/test/index.test.ts b/packages/plugin-apply/test/index.test.ts new file mode 100644 index 00000000..fcb44491 --- /dev/null +++ b/packages/plugin-apply/test/index.test.ts @@ -0,0 +1,61 @@ +import { describe, expect, test } from "bun:test"; +import { compile } from "ekscss"; +import { applyPlugin } from "../src/index.ts"; + +describe("applyPlugin", () => { + test("inlines the declarations of a referenced ruleset", () => { + expect.assertions(2); + const compiled = compile("a{color:red}b{#apply: a;}", { + plugins: [applyPlugin], + }); + expect(compiled.css).toBe("a{color:red;}b{color:red;}"); + expect(compiled.warnings).toHaveLength(0); + }); + + test("inlines declarations from multiple comma-separated selectors", () => { + expect.assertions(2); + const compiled = compile("a{color:red}b{font-size:1rem}c{#apply: a, b;}", { + plugins: [applyPlugin], + }); + expect(compiled.css).toBe("a{color:red;}b{font-size:1rem;}c{color:red;font-size:1rem;}"); + expect(compiled.warnings).toHaveLength(0); + }); + + test("matches a selector containing special characters when quoted", () => { + expect.assertions(2); + const compiled = compile('.btn:hover{color:blue}c{#apply: ".btn:hover";}', { + plugins: [applyPlugin], + }); + expect(compiled.css).toBe(".btn:hover{color:blue;}c{color:blue;}"); + expect(compiled.warnings).toHaveLength(0); + }); + + test("pushes an apply-no-match warning when the target selector doesn't exist", () => { + expect.assertions(3); + const compiled = compile("b{#apply: a;}", { + plugins: [applyPlugin], + }); + const codes = compiled.warnings.map((w) => w.code); + expect(codes).toContain("apply-no-match"); + expect(compiled.warnings.find((w) => w.code === "apply-no-match")?.message).toContain("a"); + expect(compiled.css).toBe(""); + }); + + test("pushes an apply-empty warning and removes the declaration when the result is empty", () => { + expect.assertions(3); + const compiled = compile("a{}b{#apply: a;}", { + plugins: [applyPlugin], + }); + expect(compiled.css).toBe(""); + expect(compiled.warnings).toHaveLength(1); + expect(compiled.warnings[0]?.code).toBe("apply-empty"); + }); + + test("does not leak applyRefs between separate compile calls", () => { + expect.assertions(2); + compile("a{color:red}", { plugins: [applyPlugin] }); + const compiled = compile("b{#apply: a;}", { plugins: [applyPlugin] }); + expect(compiled.css).toBe(""); + expect(compiled.warnings.map((w) => w.code)).toContain("apply-no-match"); + }); +}); diff --git a/packages/plugin-import/package.json b/packages/plugin-import/package.json index f821e6b8..40581cff 100644 --- a/packages/plugin-import/package.json +++ b/packages/plugin-import/package.json @@ -1,6 +1,6 @@ { "name": "@ekscss/plugin-import", - "version": "0.0.18", + "version": "0.0.19-next.0", "description": "XCSS plugin to inline the contents of @import statements", "homepage": "https://ekscss.js.org", "repository": "github:maxmilton/ekscss", @@ -21,8 +21,9 @@ }, "devDependencies": { "@ekscss/build-tools": "workspace:*", + "@jridgewell/trace-mapping": "0.3.31", "ekscss": "workspace:*", - "esbuild": "0.28.1" + "esbuild": "0.28.2" }, "peerDependencies": { "ekscss": "workspace:^" diff --git a/packages/plugin-import/src/index.ts b/packages/plugin-import/src/index.ts index dab92a5a..c562b0f1 100644 --- a/packages/plugin-import/src/index.ts +++ b/packages/plugin-import/src/index.ts @@ -89,11 +89,15 @@ export const importPlugin: Middleware = (element: Element, _index, _children, ca ctx.from = from; const ext = path.extname(from); - let code = fs.readFileSync(from, "utf8"); + const raw = fs.readFileSync(from, "utf8"); + let code = raw; // TODO: Document this behaviour. if (ext === ".xcss" || !ext) { + const oldRaw = ctx.raw; + if (oldRaw !== undefined) ctx.raw = code; code = interpolate(code)(xcss, ctx.x, ctx.fn); + ctx.raw = oldRaw; } const ast = stylis.compile(code); @@ -101,6 +105,7 @@ export const importPlugin: Middleware = (element: Element, _index, _children, ca // Expose data for constructing source maps element.__from = from; + element.__raw = raw; element.__code = code; element.__ast = ast; diff --git a/packages/plugin-import/test/__snapshots__/index.test.ts.snap b/packages/plugin-import/test/__snapshots__/index.test.ts.snap new file mode 100644 index 00000000..09c9dbca --- /dev/null +++ b/packages/plugin-import/test/__snapshots__/index.test.ts.snap @@ -0,0 +1,24 @@ +// Bun Snapshot v1, https://bun.sh/docs/test/snapshots + +exports[`importPlugin encoded map snapshot for an interpolated .xcss import (real plugin, not a mock) 1`] = ` +{ + "file": undefined, + "ignoreList": [], + "mappings": "ACAE,aACA,eACA", + "names": [], + "sourceRoot": undefined, + "sources": [ + "", + "/fixture.xcss", + ], + "sourcesContent": [ + "@import "/fixture.xcss";", + +"a{color:red} +b{color:\${x.foo}} +c{color:blue}" +, + ], + "version": 3, +} +`; diff --git a/packages/plugin-import/test/index.test.ts b/packages/plugin-import/test/index.test.ts index 9f9af922..f008dd0e 100644 --- a/packages/plugin-import/test/index.test.ts +++ b/packages/plugin-import/test/index.test.ts @@ -1,7 +1,181 @@ -import { test } from "bun:test"; +// biome-ignore-all lint/suspicious/noTemplateCurlyInString: used in tests -console.warn("Not implemented"); +import { describe, expect, test } from "bun:test"; +import fs from "node:fs"; +import os from "node:os"; +import path from "node:path"; +import { originalPositionFor, TraceMap } from "@jridgewell/trace-mapping"; +import { compile } from "ekscss"; +import { importPlugin } from "../src/index.ts"; -test.todo("does not replace url()", () => { - // @import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap'); +function tempFile(content: string, ext = ".xcss"): string { + const dir = fs.mkdtempSync(path.join(os.tmpdir(), "ekscss-plugin-import-")); + const file = path.join(dir, `fixture${ext}`); + fs.writeFileSync(file, content); + return file; +} + +describe("importPlugin", () => { + test("inlines an imported .xcss file with interpolation when map is false", () => { + expect.assertions(2); + // eslint-disable-next-line no-template-curly-in-string + const importedFile = tempFile("b{color:${x.foo}}"); + const compiled = compile(`@import "${importedFile}";`, { + map: false, + globals: { foo: "red" }, + plugins: [importPlugin], + }); + expect(compiled.css).toBe("b{color:red;}"); + expect(compiled.warnings).toHaveLength(0); + }); + + test("inlines an imported .xcss file with interpolation when map is true", () => { + expect.assertions(2); + // eslint-disable-next-line no-template-curly-in-string + const importedFile = tempFile("a{color:red}\nb{color:${x.foo}}"); + const compiled = compile(`@import "${importedFile}";`, { + map: true, + globals: { foo: "green" }, + plugins: [importPlugin], + }); + expect(compiled.css).toBe("a{color:red;}b{color:green;}"); + expect(compiled.map).toBeDefined(); + }); + + test("maps an interpolated .xcss import to the real on-disk source, not the interpolated text", () => { + expect.assertions(1); + // eslint-disable-next-line no-template-curly-in-string + const importedFile = tempFile("a{color:red}\nb{color:${x.foo}}\nc{color:blue}"); + const compiled = compile(`@import "${importedFile}";`, { + map: true, + globals: { foo: "green" }, + plugins: [importPlugin], + }); + const cIndex = compiled.css.indexOf("c{"); + const traceMap = new TraceMap(compiled.map!.toJSON()); + const original = originalPositionFor(traceMap, { line: 1, column: cIndex }); + // Without the `__raw` fix, resolution falls back to the + // post-interpolation text (`green` substituted for `${x.foo}`), whose + // differing length shifts this position onto the wrong line. + expect(original.line).toBe(3); + }); + + test("encoded map snapshot for an interpolated .xcss import (real plugin, not a mock)", () => { + expect.assertions(1); + // eslint-disable-next-line no-template-curly-in-string + const importedFile = tempFile("a{color:red}\nb{color:${x.foo}}\nc{color:blue}"); + const compiled = compile(`@import "${importedFile}";`, { + map: true, + globals: { foo: "green" }, + plugins: [importPlugin], + }); + const map = compiled.map!.toJSON(); + // `importedFile`'s path includes a random mkdtempSync suffix, so it's + // non-deterministic across runs; normalise every occurrence (in both + // `sources` and `sourcesContent`, since the outer document's own source + // text is the `@import "";` statement) so the snapshot is stable. + // eslint-disable-next-line no-confusing-arrow + map.sources = map.sources.map((source) => + source?.endsWith("fixture.xcss") ? "/fixture.xcss" : source, + ); + if (map.sourcesContent) { + // eslint-disable-next-line no-confusing-arrow + map.sourcesContent = map.sourcesContent.map((content) => + content == null ? content : content.replaceAll(importedFile, "/fixture.xcss"), + ); + } + expect(map).toMatchSnapshot(); + }); + + test("maps a plain (non-.xcss) imported file correctly, with no interpolation involved", () => { + expect.assertions(2); + const importedFile = tempFile("a{color:red}\nb{color:blue}", ".css"); + const compiled = compile(`@import "${importedFile}";`, { + map: true, + plugins: [importPlugin], + }); + expect(compiled.css).toBe("a{color:red;}b{color:blue;}"); + const bIndex = compiled.css.indexOf("b{"); + const traceMap = new TraceMap(compiled.map!.toJSON()); + const original = originalPositionFor(traceMap, { line: 1, column: bIndex }); + expect(original.line).toBe(2); + }); + + test("does not replace url() imports", () => { + expect.assertions(2); + const compiled = compile( + '@import url("https://fonts.googleapis.com/css2?family=Roboto&display=swap");', + { plugins: [importPlugin] }, + ); + expect(compiled.css).toBe( + '@import url("https://fonts.googleapis.com/css2?family=Roboto&display=swap");', + ); + expect(compiled.warnings).toHaveLength(0); + }); + + test("warns import-from-invalid for a relative import with no from option", () => { + expect.assertions(3); + const importedFile = tempFile("a{color:red}"); + const compiled = compile('@import "./fixture.xcss";', { + rootDir: path.dirname(importedFile), + plugins: [importPlugin], + }); + expect(compiled.css).toBe("a{color:red;}"); + expect(compiled.warnings).toHaveLength(1); + expect(compiled.warnings[0].code).toBe("import-from-invalid"); + }); + + test("warns import-not-found and leaves the at-rule untouched when the file can't be resolved", () => { + expect.assertions(3); + const compiled = compile('@import "/does/not/exist.xcss";', { + plugins: [importPlugin], + }); + expect(compiled.css).toBe('@import "/does/not/exist.xcss";'); + expect(compiled.warnings).toHaveLength(1); + expect(compiled.warnings[0].code).toBe("import-not-found"); + }); + + test("only inlines the first import of the same file", () => { + expect.assertions(2); + const importedFile = tempFile("a{color:red}"); + const compiled = compile(`@import "${importedFile}"; @import "${importedFile}";`, { + plugins: [importPlugin], + }); + expect(compiled.css).toBe("a{color:red;}"); + expect(compiled.dependencies).toEqual([importedFile]); + }); + + test("does not interpolate an imported file with a non-.xcss extension", () => { + expect.assertions(1); + // eslint-disable-next-line no-template-curly-in-string + const importedFile = tempFile("a{content:'${x.foo}'}", ".css"); + const compiled = compile(`@import "${importedFile}";`, { + globals: { foo: "bar" }, + plugins: [importPlugin], + }); + // eslint-disable-next-line no-template-curly-in-string + expect(compiled.css).toBe("a{content:'${x.foo}';}"); + }); + + test("interpolates an imported file with no extension", () => { + expect.assertions(1); + // eslint-disable-next-line no-template-curly-in-string + const importedFile = tempFile("b{color:${x.foo}}", ""); + const compiled = compile(`@import "${importedFile}";`, { + globals: { foo: "red" }, + plugins: [importPlugin], + }); + expect(compiled.css).toBe("b{color:red;}"); + }); + + test("warns import-empty and drops the at-rule for an empty imported file", () => { + expect.assertions(3); + const importedFile = tempFile(""); + const compiled = compile(`@import "${importedFile}";`, { + plugins: [importPlugin], + }); + expect(compiled.css).toBe(""); + expect(compiled.warnings).toHaveLength(1); + expect(compiled.warnings[0].code).toBe("import-empty"); + }); }); diff --git a/packages/plugin-prefix/package.json b/packages/plugin-prefix/package.json index 1e09f706..02d7c77d 100644 --- a/packages/plugin-prefix/package.json +++ b/packages/plugin-prefix/package.json @@ -1,6 +1,6 @@ { "name": "@ekscss/plugin-prefix", - "version": "0.0.17", + "version": "0.0.18-next.0", "description": "XCSS plugin to add vendor prefixes", "homepage": "https://ekscss.js.org", "repository": "github:maxmilton/ekscss", @@ -22,7 +22,7 @@ "devDependencies": { "@ekscss/build-tools": "workspace:*", "ekscss": "workspace:*", - "esbuild": "0.28.1" + "esbuild": "0.28.2" }, "peerDependencies": { "ekscss": "workspace:^" diff --git a/packages/plugin-prefix/test/index.test.ts b/packages/plugin-prefix/test/index.test.ts new file mode 100644 index 00000000..42fbe115 --- /dev/null +++ b/packages/plugin-prefix/test/index.test.ts @@ -0,0 +1,21 @@ +import { describe, expect, test } from "bun:test"; +import { compile } from "ekscss"; +import { prefixPlugin } from "../src/index.ts"; + +describe("prefixPlugin", () => { + test("adds vendor prefixes for properties that need them", () => { + expect.assertions(1); + const compiled = compile("a{user-select:none}", { + plugins: [prefixPlugin], + }); + expect(compiled.css).toContain("-webkit-user-select:none;"); + }); + + test("does not add vendor prefixes when the plugin isn't used", () => { + expect.assertions(1); + const compiled = compile("a{user-select:none}", { + plugins: [], + }); + expect(compiled.css).toBe("a{user-select:none;}"); + }); +}); diff --git a/packages/postcss-ekscss/modules.d.ts b/packages/postcss-ekscss/modules.d.ts index 6814468b..d425fd84 100644 --- a/packages/postcss-ekscss/modules.d.ts +++ b/packages/postcss-ekscss/modules.d.ts @@ -22,7 +22,6 @@ declare module "postcss/lib/parser" { atrule(token: Token): void; init(node: Node, offset?: number): void; - // eslint-disable-next-line unicorn/consistent-boolean-name raw(node: Node, prop: string, tokens: Token[], customProperty: boolean): void; spacesAndCommentsFromStart(tokens: Token[]): string; spacesFromEnd(tokens: Token[]): string; diff --git a/packages/postcss-ekscss/package.json b/packages/postcss-ekscss/package.json index 9ba4e4a7..abb75114 100644 --- a/packages/postcss-ekscss/package.json +++ b/packages/postcss-ekscss/package.json @@ -1,6 +1,6 @@ { "name": "postcss-ekscss", - "version": "0.0.15", + "version": "0.0.16-next.0", "description": "PostCSS plugin to add support for XCSS", "homepage": "https://ekscss.js.org", "repository": "github:maxmilton/ekscss", @@ -18,8 +18,8 @@ }, "devDependencies": { "@ekscss/build-tools": "workspace:*", - "esbuild": "0.28.1", - "postcss": "8.5.16" + "esbuild": "0.28.2", + "postcss": "8.5.28" }, "peerDependencies": { "postcss": "^8.0.0" diff --git a/packages/postcss-ekscss/src/parser.ts b/packages/postcss-ekscss/src/parser.ts index c3134ac2..e235f059 100644 --- a/packages/postcss-ekscss/src/parser.ts +++ b/packages/postcss-ekscss/src/parser.ts @@ -74,12 +74,11 @@ export class XCSSParser extends Parser { node: AnyNode, prop: string, tokens: Token[], - // eslint-disable-next-line unicorn/consistent-boolean-name customProperty: boolean, ): string | undefined { super.raw(node, prop, tokens, customProperty); - // eslint-disable-next-line unicorn/no-computed-property-existence-check + // eslint-disable-next-line unicorn/no-computed-property-existence-check, unicorn/prefer-early-return if (node.raws[prop]) { const xcss = node.raws[prop].raw; // eslint-disable-next-line no-param-reassign, unicorn/no-array-reduce @@ -208,13 +207,13 @@ export class XCSSParser extends Parser { let str = ""; for (let j = i; j > 0; j--) { const type = cache[j][0]; - if (str.trim().startsWith("!") && type !== "space") { + if (type !== "space" && str.trimStart().startsWith("!")) { // eslint-disable-next-line unicorn/no-break-in-nested-loop break; } str = cache.pop()[1] + str; } - if (str.trim().startsWith("!")) { + if (str.trimStart().startsWith("!")) { node.important = true; node.raws.important = str; // eslint-disable-next-line no-param-reassign diff --git a/packages/postcss-ekscss/src/stringifier.ts b/packages/postcss-ekscss/src/stringifier.ts index b816d4c4..73bba479 100644 --- a/packages/postcss-ekscss/src/stringifier.ts +++ b/packages/postcss-ekscss/src/stringifier.ts @@ -54,9 +54,6 @@ export class XCSSStringifier extends Stringifier { override rawValue(node: AnyNode, prop: string): string { const value = node[prop]; const raw = node.raws[prop]; - if (raw && raw.value === value) { - return raw.xcss || raw.raw; - } - return value; + return raw && raw.value === value ? raw.xcss || raw.raw : value; } } diff --git a/packages/postcss-ekscss/src/tokenize.ts b/packages/postcss-ekscss/src/tokenize.ts index 49d63006..684f9320 100644 --- a/packages/postcss-ekscss/src/tokenize.ts +++ b/packages/postcss-ekscss/src/tokenize.ts @@ -2,8 +2,6 @@ // TODO: Tokenize xcss tagged template literals within XCSS expressions -/* eslint-disable unicorn/prefer-code-point */ - import type { Input } from "postcss"; const SINGLE_QUOTE = 39; // ' @@ -82,14 +80,12 @@ export function tokenize( throw input.error(`Unclosed ${what}`, pos); } - // eslint-disable-next-line unicorn/consistent-boolean-name function endOfFile() { return returned.length === 0 && pos >= len; } function interpolation() { let depth = 1; - // eslint-disable-next-line unicorn/consistent-boolean-name let isStringQuote: boolean | number = false; let isStringEscaped = false; diff --git a/packages/rollup-plugin-ekscss/package.json b/packages/rollup-plugin-ekscss/package.json index 94673db7..776f47cf 100644 --- a/packages/rollup-plugin-ekscss/package.json +++ b/packages/rollup-plugin-ekscss/package.json @@ -22,8 +22,8 @@ "devDependencies": { "@ekscss/build-tools": "workspace:*", "ekscss": "workspace:*", - "esbuild": "0.28.1", - "rollup": "4.63.0" + "esbuild": "0.28.2", + "rollup": "4.63.4" }, "peerDependencies": { "ekscss": "workspace:^", diff --git a/packages/svelte-ekscss/package.json b/packages/svelte-ekscss/package.json index 64e6a4e2..94d2553e 100644 --- a/packages/svelte-ekscss/package.json +++ b/packages/svelte-ekscss/package.json @@ -22,8 +22,8 @@ "devDependencies": { "@ekscss/build-tools": "workspace:*", "ekscss": "workspace:*", - "esbuild": "0.28.1", - "svelte": "5.56.10" + "esbuild": "0.28.2", + "svelte": "5.57.1" }, "peerDependencies": { "ekscss": "workspace:^",