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 1b400ac4..ae7db565 100644 --- a/bun.lock +++ b/bun.lock @@ -4,23 +4,23 @@ "workspaces": { "": { "devDependencies": { - "@biomejs/biome": "2.5.1", + "@biomejs/biome": "2.5.5", "@eslint/js": "10.0.1", - "@maxmilton/eslint-config": "0.3.2", + "@maxmilton/eslint-config": "0.3.4", "@maxmilton/stylelint-config": "0.4.3", "@maxmilton/test-utils": "0.0.15", "@types/bun": "1.3.14", - "@types/node": "26.1.0", - "c8": "11.0.0", + "@types/node": "26.1.1", + "c8": "12.0.0", "ekscss": "workspace:*", - "eslint": "10.6.0", - "eslint-plugin-unicorn": "70.0.0", + "eslint": "10.8.0", + "eslint-plugin-unicorn": "72.0.0", "postcss-ekscss": "workspace:*", - "stylelint": "17.14.0", + "stylelint": "17.14.1", "stylelint-config-standard": "40.0.0", - "turbo": "2.10.2", + "turbo": "2.10.7", "typescript": "6.0.3", - "typescript-eslint": "8.62.1", + "typescript-eslint": "8.65.0", "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", @@ -68,15 +68,17 @@ }, "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:*", + "@jridgewell/trace-mapping": "0.3.31", "esbuild": "0.28.1", }, }, @@ -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,7 +121,7 @@ }, "packages/plugin-apply": { "name": "@ekscss/plugin-apply", - "version": "0.0.18", + "version": "0.0.19-next.0", "dependencies": { "stylis": "^4.3.6", }, @@ -134,12 +136,13 @@ }, "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", }, @@ -156,7 +159,7 @@ }, "packages/plugin-prefix": { "name": "@ekscss/plugin-prefix", - "version": "0.0.17", + "version": "0.0.18-next.0", "dependencies": { "stylis": "^4.3.6", }, @@ -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", + "postcss": "8.5.23", }, "peerDependencies": { "postcss": "^8.0.0", @@ -195,7 +198,7 @@ "@ekscss/build-tools": "workspace:*", "ekscss": "workspace:*", "esbuild": "0.28.1", - "rollup": "4.62.2", + "rollup": "4.62.3", }, "peerDependencies": { "ekscss": "workspace:^", @@ -213,7 +216,7 @@ "@ekscss/build-tools": "workspace:*", "ekscss": "workspace:*", "esbuild": "0.28.1", - "svelte": "5.56.4", + "svelte": "5.56.8", }, "peerDependencies": { "ekscss": "workspace:^", @@ -228,39 +231,39 @@ "@bcoe/v8-coverage": ["@bcoe/v8-coverage@1.0.2", "", {}, "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA=="], - "@biomejs/biome": ["@biomejs/biome@2.5.1", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.5.1", "@biomejs/cli-darwin-x64": "2.5.1", "@biomejs/cli-linux-arm64": "2.5.1", "@biomejs/cli-linux-arm64-musl": "2.5.1", "@biomejs/cli-linux-x64": "2.5.1", "@biomejs/cli-linux-x64-musl": "2.5.1", "@biomejs/cli-win32-arm64": "2.5.1", "@biomejs/cli-win32-x64": "2.5.1" }, "bin": { "biome": "bin/biome" } }, "sha512-IXWLCxKmae+rI7LOHS1B3EbVisQ6GRAWbhN9msa6KjNCyFWrvKZWR4oUdinaNssrV852OrSHuSPa95h1GPJc7Q=="], + "@biomejs/biome": ["@biomejs/biome@2.5.5", "", { "optionalDependencies": { "@biomejs/cli-darwin-arm64": "2.5.5", "@biomejs/cli-darwin-x64": "2.5.5", "@biomejs/cli-linux-arm64": "2.5.5", "@biomejs/cli-linux-arm64-musl": "2.5.5", "@biomejs/cli-linux-x64": "2.5.5", "@biomejs/cli-linux-x64-musl": "2.5.5", "@biomejs/cli-win32-arm64": "2.5.5", "@biomejs/cli-win32-x64": "2.5.5" }, "bin": { "biome": "bin/biome" } }, "sha512-r1S8nFsAG1MY+vJFZALzIvwXAJv6ejDQ0mxP21Tgr9YK3ZFtjrvbBwDdNhx1rUqvccEIeNg20cYCNzl6Cr69pQ=="], - "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.5.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-npqDzvqv7vFaWRiNN1Te71siRgPaqS9MpqgYCdP/CrUbkJ7ApezaeaKjueKHRN/JH/6lRjJQAHi8acQDCAz22w=="], + "@biomejs/cli-darwin-arm64": ["@biomejs/cli-darwin-arm64@2.5.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-kUrAhXVWUrwmAUnV2iXSK7umxKFysTwvqK+Ty6ptUcLY/7T3SnCAjUowE4uvwaEej6nXZ7hu/dTtbokKdsPeag=="], - "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.5.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-RgwTqPAM8g2tn1j+b5oRjF/DbSBX8a4gwojtuG9XuhfK7GgomvZ9+T+tqjXiVbjLEeGJOoL6VEk8mvRTVeSybw=="], + "@biomejs/cli-darwin-x64": ["@biomejs/cli-darwin-x64@2.5.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-DamiYc5bUYZ2uxlfc+RLEPtz1Abb6PO5eTbOkufLpSGwd/7AMQAdxhFYiXmwwkJL8IsT8S7GvdgwDHqaMFAvKw=="], - "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.5.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-yhV35CzZh38VyMvTEXi3JTjxZBs++oCKK9KG8vB6VI5+uvQvZNR3BFWEKKzuOmx9DJJj7sQpZ4LQJcmbGTs3+Q=="], + "@biomejs/cli-linux-arm64": ["@biomejs/cli-linux-arm64@2.5.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-lRKF/pH/1RiYiBKExi3TCZVAtvzEm77aifrvcNiDFrR9WxeAnDUjDnseb6y2XV85mjitLs6SILGm2XG77cHtSQ=="], - "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.5.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-WMcvMLgByyTqVxGlq918NBBYliq9FRR9GAQVETHb+VjGVqXCZFfHlZHC1FX4ibuYY/Hg6TJE3rHU0xVrdJXNRw=="], + "@biomejs/cli-linux-arm64-musl": ["@biomejs/cli-linux-arm64-musl@2.5.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-U4WMl/sy/E/Q73vf15VspakLRRs2LDFcCeBxJnQfXzssb88zpV6PJPaQ3ezhQ7H6Ht2/8bvuZeHgJWzmoxllZg=="], - "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-J/7uHSX7NfoYDI7HijAkd8lnQIOrRb2W7j3X+tw4R+N5ExvXGsyXFiGdQcfcxfOmNQmZVSQOCDk757fwpzqQcg=="], + "@biomejs/cli-linux-x64": ["@biomejs/cli-linux-x64@2.5.5", "", { "os": "linux", "cpu": "x64" }, "sha512-H/O39nJEw/2Zm/fm7hrmxxoF8kK/aU1uCoPp70ruXVbomaAdLpJJnCmL11Q2JotT8QVHH06So04Oq53lCSwSwQ=="], - "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.5.1", "", { "os": "linux", "cpu": "x64" }, "sha512-ANTowtlLmPYm5yeMckWY8Xzb9Ix+JJP3tgHR/n6xRj1VWyIzzWtfRfih9hv9VmClwadpBvZduISZIbBsIlYG3A=="], + "@biomejs/cli-linux-x64-musl": ["@biomejs/cli-linux-x64-musl@2.5.5", "", { "os": "linux", "cpu": "x64" }, "sha512-m7wC7tjX5Lrmo69dc4md8FeKpPU1NTCY1v7xUoQQ2vadWwNnBS0KZOG8471otFPHrTHihQJAjQPgMObpLvDe6A=="], - "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.5.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-zgXnKNgWPC4iPF7Y1lR3STUeCUuZRpD6IiOrC7TZTlh0Lx6FiVUT05myuMQHQ9D+1cc7uyMldi4forE6lp0ivQ=="], + "@biomejs/cli-win32-arm64": ["@biomejs/cli-win32-arm64@2.5.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-7BryINPuYypLUAH3o/o5ZdgomJ4zn3EDR0ChZJst7n32S6ZhKbgHXuYydLu+YAnx59ehGFR0z/MG6qnzQi3Yyw=="], - "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.5.1", "", { "os": "win32", "cpu": "x64" }, "sha512-6uxpR9hvaglANkZemeSiN/FhYgkGasrEGn267eXIWvjrjJ2LhDlk251IhjVJq6MXzkV2/bcXwLwSroLyPtqRZg=="], + "@biomejs/cli-win32-x64": ["@biomejs/cli-win32-x64@2.5.5", "", { "os": "win32", "cpu": "x64" }, "sha512-bIBFo+n6MIxdNcVFy5CrurbKiZQiUciK3bt8+O9I4wjFZNTfXLpi+giq47522eXqW5NBc9ulx7dR1SlZKi2J5g=="], "@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.2.1", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0" } }, "sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg=="], + "@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-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.6", "", { "peerDependencies": { "css-tree": "^3.2.1" }, "optionalPeers": ["css-tree"] }, "sha512-TcJCWFbXLPpJYq6z7bfOyjWYJDiDg2/I4gyUC9pqPNqHFRIey0EB0q0L5cSnQDfWJg8Jd6VadakxdIez/3zkqQ=="], + "@csstools/css-syntax-patches-for-csstree": ["@csstools/css-syntax-patches-for-csstree@1.1.7", "", { "peerDependencies": { "css-tree": "^3.2.1" }, "optionalPeers": ["css-tree"] }, "sha512-fQ+05118eQS1cofO3aJpB5efgpBZMvIzwr/sbC8kDLVA5XLG8q1kJV5yzrUAI1f7lvhPnm8fgIjzFB8/O/5Dig=="], "@csstools/css-tokenizer": ["@csstools/css-tokenizer@4.0.0", "", {}, "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA=="], "@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=="], - "@csstools/selector-resolve-nested": ["@csstools/selector-resolve-nested@4.0.0", "", { "peerDependencies": { "postcss-selector-parser": "^7.1.1" } }, "sha512-9vAPxmp+Dx3wQBIUwc1v7Mdisw1kbbaGqXUM8QLTgWg7SoPGYtXBsMXvsFs/0Bn5yoFhcktzxNZGNaUt0VjgjA=="], + "@csstools/selector-resolve-nested": ["@csstools/selector-resolve-nested@4.0.1", "", { "peerDependencies": { "postcss-selector-parser": "^7.1.1" } }, "sha512-j3vdQu0XwLME5qOTWxm8cnmvsf423R2YL6DbKklCHZwkDm7UdKNu6RPlw4REIJhSlKBICY3B70/7QZdicLqZgg=="], "@csstools/selector-specificity": ["@csstools/selector-specificity@6.0.0", "", { "peerDependencies": { "postcss-selector-parser": "^7.1.1" } }, "sha512-4sSgl78OtOXEX/2d++8A83zHNTgwCJMaR24FvsYL7Uf/VS8HZk9PTwR51elTbGqMuwH3szLvvOXEaVnqn0Z3zA=="], @@ -332,16 +335,18 @@ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.1", "", { "os": "win32", "cpu": "x64" }, "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A=="], - "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="], + "@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=="], "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.7.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw=="], "@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.0.5", "", { "dependencies": { "mdn-data": "2.29.0", "source-map-js": "^1.2.1" } }, "sha512-iPmijIAq4hlIJB86PYmY/fcZORHtjphSqICDbwuw32A/JmkhZQ/K/6TjHE03zqf3n5yABpVcbRAMG8Mi9ojy8g=="], + "@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=="], @@ -374,7 +379,7 @@ "@keyv/serialize": ["@keyv/serialize@1.1.1", "", {}, "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA=="], - "@maxmilton/eslint-config": ["@maxmilton/eslint-config@0.3.2", "", { "peerDependencies": { "@eslint/js": "^10.0.0", "eslint": "^10.0.0", "eslint-plugin-unicorn": ">=62.0.0", "typescript-eslint": "^8.62.0" }, "optionalPeers": ["eslint-plugin-unicorn"] }, "sha512-QXrAPOyajCysYXDJ9uA19j2qISPCUqg0W1QnIp4wlpID+z9AYU6a7XFSjjGBl2N4Z42gl8SIoDMcrNhbU0BUpA=="], + "@maxmilton/eslint-config": ["@maxmilton/eslint-config@0.3.4", "", { "peerDependencies": { "@eslint/js": "^10.0.0", "eslint": "^10.0.0", "eslint-plugin-unicorn": ">=72.0.0", "typescript-eslint": "^8.64.0" }, "optionalPeers": ["eslint-plugin-unicorn"] }, "sha512-wPHznKfkq5kcxtY1ykeCSGFQ+HMPaJ1yCi0lQ1ckh4nwGCKKWMalrCk84WY5yCubR1Ng/VeOxut5X2v/DZWQfg=="], "@maxmilton/html-parser": ["@maxmilton/html-parser@0.0.12", "", {}, "sha512-hrmgn5evsM1OpYF+iH5IEi/Z+ZKLmYAxSTVnehxypGERNkjhhp+MDPFeXmxPNKapru5F7XfvUGCXZgjkrM2q9g=="], @@ -390,71 +395,71 @@ "@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.62.2", "", { "os": "android", "cpu": "arm" }, "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg=="], + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.62.3", "", { "os": "android", "cpu": "arm" }, "sha512-c0wdcekXtQvvn5Tsrk/+op/gUArrbWaFduBnTLP2l1cKLSQs4diMWjJw3m6A0DdzT8dAAX95KpkJ3qynCePbmw=="], - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.62.2", "", { "os": "android", "cpu": "arm64" }, "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw=="], + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.62.3", "", { "os": "android", "cpu": "arm64" }, "sha512-3YjElDdWN+qXAFbJ/CzPV+0wspLqh54k/I6GfdYtEJRqg7buSgc1yPM3B+93j1M4neobtkATHZTmxK2AMVGfnA=="], - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.62.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A=="], + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.62.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Pch2pFNOxxz1hTjypIdPyRTR6riiwRl84+VcN9djS680fw+Co1nAJINrdpqp7KV0NvyuU8ilZXZCjd7ykJl1GQ=="], - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.62.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA=="], + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.62.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-LEuncFUHFiF8t4yZVZvvZA1wk0pjAscRnsrn1EfTEmN4HXotBi2YtcnLRyaK6UbuczW7xZS5ES+81Rdz8Z0T6g=="], - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.62.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw=="], + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.62.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-zvBUvsQUpOWALdDsk6qbS8bXf2VxmPisuudNDrY7x0p0jBdsoZl8HsHczIOgkQiZldmcacMKtBzpoGVNeIe2bQ=="], - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.62.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg=="], + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.62.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-C2KmNrcSem/AMg984H/dev+si0lieQGdXdR/lYGJnuumXnFb9Y7QdiI62obFdLlxRYLBv4P0eUVIDbD4c1vVvw=="], - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.62.2", "", { "os": "linux", "cpu": "arm" }, "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg=="], + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.62.3", "", { "os": "linux", "cpu": "arm" }, "sha512-ggXnsTAEzNQx74XpunRsiZ9aBZDsI7XIa0hm2nzR9f4WzH5/f/d73ZSDaC5ejJ8YLY4NW+V3wr0tjOaeCq8hqA=="], - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.62.2", "", { "os": "linux", "cpu": "arm" }, "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA=="], + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.62.3", "", { "os": "linux", "cpu": "arm" }, "sha512-2vng+FlzNUhKZxtej3IUqJgbZoQk2M/dwQM20+ULV0R/E/8tr9/P6uEf2iiGIk4HL0zMKh5Jry7mUHdUOvyGgA=="], - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.62.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA=="], + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.62.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-LLLFZKt4/Nraf9rxDkhiU8QVgLF4WmCkfr0L4fj0fPfIZFBib0DeiFk1hhaYKd03LFAFJcxHslhDFlNJLylf5Q=="], - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.62.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ=="], + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.62.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-WJkdQCvS9sWNOUBJZfQRKpZGFBztRzcowI+nndmflKgU4XY+3a420FgTOSKTsVqJbnzSxeT4vaJalpOaPo2YCQ=="], - "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.62.2", "", { "os": "linux", "cpu": "none" }, "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg=="], + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.62.3", "", { "os": "linux", "cpu": "none" }, "sha512-PwHXCCS2n64/1Ot6rP1YEYA02MGYBcQlr8CSZZyrUG2O7NH6NklYmvr9v3Jy+5e/eDeNchc/ukmKJi9LuflMIQ=="], - "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.62.2", "", { "os": "linux", "cpu": "none" }, "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ=="], + "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.62.3", "", { "os": "linux", "cpu": "none" }, "sha512-vUjxINQu3RC8NZS3ykk1gN65gIz8pAopOq2HXuZhiIxHdx7TFvDG+jgrdSgInu1Eza4/Rfi2VzZgyIgEH4WOaw=="], - "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.62.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A=="], + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.62.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-wzko4aJ13+0G3kGnviCg5gnXFKd40izKsrf2uOw12US4XqprkDrmwOpeW14aSNa37V8bfPcz5Fkob6LZ3BAPmA=="], - "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.62.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w=="], + "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.62.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-8120ue0JUMSwy11stlwnfdX3pPd+WZYGCDBwEHWtIHi6pOpZmsEF5QKB7a/UN+XFdqvobxz98kv8RTqikyCEBw=="], - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.62.2", "", { "os": "linux", "cpu": "none" }, "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg=="], + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.62.3", "", { "os": "linux", "cpu": "none" }, "sha512-XLFHnR3tXMjbOCh2vtVJHmxt+995uJsTERQyseFDRA0xxMxyTZPLa3OIUlyFaO4mF/Lu0FjmWHCuPXJT1n/IOg=="], - "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.62.2", "", { "os": "linux", "cpu": "none" }, "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q=="], + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.62.3", "", { "os": "linux", "cpu": "none" }, "sha512-se6yXvNGMIl0f+RQzyh7XAmia8/9kplQx424wnG2w0C1oi6XgO6Y8otKhdXFHbHs88Ihavzmvh1NWjuovE76BQ=="], - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.62.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg=="], + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.62.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-gNoxRefktVIiGflpONuxWWXZAzIQG++z9qHO3xKwk4WdDMuQja3JHGfE1u0i3PfPDyvhypdk+WrgIJqLhGG7sg=="], - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.62.2", "", { "os": "linux", "cpu": "x64" }, "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A=="], + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.62.3", "", { "os": "linux", "cpu": "x64" }, "sha512-V4KtWtQfAFMU7+9/A/VDps/VI8CHd3cYz0L8sgJzz8qK7eY7wI4ruFD82UYIYvW9Z4DtlTfhQcsl4XyPHW5uSg=="], - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.62.2", "", { "os": "linux", "cpu": "x64" }, "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg=="], + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.62.3", "", { "os": "linux", "cpu": "x64" }, "sha512-LBx9LYXvj2CBkMkjLdNAWLwH0MLMin7do2VcVo9kVPibGLkY0BQQut2fv7NVqkXqZ/CrAu9LqDHVV1xHCMpCPw=="], - "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.62.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg=="], + "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.62.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-ABVf3Q0RCu7NcyCCOZQI0pJ3GuSdfSl8EXcy88QtdceIMIoCUdfhsJChZ64L9zVM2aJHjde1Bhn5uqSRcX9ySA=="], - "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.62.2", "", { "os": "none", "cpu": "arm64" }, "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA=="], + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.62.3", "", { "os": "none", "cpu": "arm64" }, "sha512-+2Cy/ldweGBLlPIKsQLF8U5N44a0KDdbrk1rAjHOM9M2K+kGdIVjHLmmrZIcx+9Ny3ke/1JomCsDI1ocb11+sg=="], - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.62.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg=="], + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.62.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-dtZvzc8BedpSaFNy75x6uiWwAGTH+aZHDtdrqP6qk+WcLJrfti6sGje1ZJ9UxyzDLF23d/mV+PaMwuC0hL7UVA=="], - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.62.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q=="], + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.62.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-Rj8Ra4noo+aYy7sKBggCx0407mws34kAb1ySyWuq5DAtFBQdkSwnsjCgPrhPe9cvgBKZIukpE+CVHvORCS93kQ=="], - "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.62.2", "", { "os": "win32", "cpu": "x64" }, "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg=="], + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.62.3", "", { "os": "win32", "cpu": "x64" }, "sha512-vp7N084ew/odXn2gi/mzm9mUkQu9l6AiN6dt4IeUM2Uvm9o+cVmP+YkqbMOteLbiGgqBBlJZjIMYVCfOOIVbVQ=="], - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.62.2", "", { "os": "win32", "cpu": "x64" }, "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA=="], + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.62.3", "", { "os": "win32", "cpu": "x64" }, "sha512-MOG/3gTOn4Fwf574RVOaY61I5o6P90legkFADiTyn1hyjNydT+cerU2rLUwPdZkKKyJ+iT+K9p7WXK4LM1Ka6g=="], "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="], - "@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.10", "", { "peerDependencies": { "acorn": "^8.9.0" } }, "sha512-4WfKk68eTih+MiJD4fSbxN7E8kVBmTMPWHUPYjvl2N0rMs53YLTT8/YjKU5Dtnz5LqDjl7LEw4U7lXR2W3J5WA=="], + "@sveltejs/acorn-typescript": ["@sveltejs/acorn-typescript@1.0.11", "", { "peerDependencies": { "acorn": "^8.9.0" } }, "sha512-LFuZUkjJ9iF7JZye/aG5XM0SFcQ5VyL0oVX4WJ9dc0Va3R3s0OauX1BESVCb+YN/ol8TAfqGDDAQsTG627Y5kw=="], - "@turbo/darwin-64": ["@turbo/darwin-64@2.10.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-wBM3ObqOWnKUDmg7QfUFDkDHPFUAJmrYlYqmEM8jMPAPA/I6wRJIbWimeQUqhOiQ8xPKhzyWM+xaiUP0wz8FEQ=="], + "@turbo/darwin-64": ["@turbo/darwin-64@2.10.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-/c9cSBRermWDv85oufLhoH6XRLOVbvzJLRd+WLyfJCP+i0HFLQj4PVNDrHcY17/ve5l8X0Oua4bJBqJUgJPnZA=="], - "@turbo/darwin-arm64": ["@turbo/darwin-arm64@2.10.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-/Cq0joWnuMjDPfhjbFP4sv+C/7gkQ415zlaO4XUzD5EZxbtrKgXKvuuydMvogG8GeUnN1aDltW71RlmEfpjbyw=="], + "@turbo/darwin-arm64": ["@turbo/darwin-arm64@2.10.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-8lpCCGWZBl9PIF8w8f2iEWrLMbHBWIfJeV6l2UEGqysD6HRIM4ySj/8R7HGEzbECJ4r/gnJcHmxEoG8yjFe64A=="], - "@turbo/linux-64": ["@turbo/linux-64@2.10.2", "", { "os": "linux", "cpu": "x64" }, "sha512-mMsf5IIhiKuceEXNstd25IbadjBXZ0amxzFOqliEzJX6HyeeHdBQPVSY583PWqYDyqM/FB8d5ZjkthfBSeuH3Q=="], + "@turbo/linux-64": ["@turbo/linux-64@2.10.7", "", { "os": "linux", "cpu": "x64" }, "sha512-Midw9Ed00yw9rqkWN82fY3LmLNFQ6yiL1GXB56DJKUEjWaEd27zh7ohCxzzrjfjQVrEeVWd3UPytTAV16XDQlA=="], - "@turbo/linux-arm64": ["@turbo/linux-arm64@2.10.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-Wcng1i2kaKmXutmwxT9MUoYZvdaIekXAdlGr4+0TpgbhGLw7nDuEcRBFrxb5BbRoX1d1q8SpdRxLc45TvDZIdQ=="], + "@turbo/linux-arm64": ["@turbo/linux-arm64@2.10.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-UVEy+MW/xn4BcsiV3v3uv0/oObyaQgVtRT+Jj4WE53rNH05VEYEc1Z13q3zV6276wCZR4Yxc4hiTTcjw7PjSpg=="], - "@turbo/windows-64": ["@turbo/windows-64@2.10.2", "", { "os": "win32", "cpu": "x64" }, "sha512-SsNhM7Ho7EpAdwtrJKBOic9Hso23vu6Dp0gAfLOvUFjPzurr/sGQlXZEvr6z89ne4RDOypTwz5CBDrixpMKtXw=="], + "@turbo/windows-64": ["@turbo/windows-64@2.10.7", "", { "os": "win32", "cpu": "x64" }, "sha512-l2nH9KGLV46SWjcXvyc2+xo5gdf5J0NVADknQk9OCJhzJBpiNl/byd26yIfwZBjLupdqT6UOdPhPxcpUPxRykQ=="], - "@turbo/windows-arm64": ["@turbo/windows-arm64@2.10.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-Gf+S7ICAdimT/n02bOuVWKvhHnct/HYjZg3oBNIz5hZ9ZyWHbQim9J3P5Qip8WpX0ksxF7eaBVziJCuLnjhqDg=="], + "@turbo/windows-arm64": ["@turbo/windows-arm64@2.10.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-qjE1apG6RThuX49vUJd5ks2dV2ndXC2qktDChQonFMvUzrMrEnZMQzO+IgxBiYq1j+NbXQcRwj84nGnk1TBw1g=="], "@types/bun": ["@types/bun@1.3.14", "", { "dependencies": { "bun-types": "1.3.14" } }, "sha512-h1hFqFVcvAvD9j9K7ZW7vd82aSA+rTdznZa+5bwvCwqSB1jmmfLcbIWhOLx1/+boy/xmjgCs/OMUL8hRJSmnPw=="], @@ -466,31 +471,31 @@ "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], - "@types/node": ["@types/node@26.1.0", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-O0A1G3xPGy4w7AgQdAQYUlQ+BKk2Oovw8eRpofyp5KdBZULnbe+WqaOVNrm705SHphCiG4XHsACrSmPu1f+Kgw=="], + "@types/node": ["@types/node@26.1.1", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw=="], "@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.62.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.62.1", "@typescript-eslint/type-utils": "8.62.1", "@typescript-eslint/utils": "8.62.1", "@typescript-eslint/visitor-keys": "8.62.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.62.1", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-4EQM77WgVNxj7OkL/5b/D/xZsw00G577+UriYTC7JF5opcF3T2AuoeY7ueLaZgSVjSgCS6yOAJB5bRGLPSJUzA=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.65.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.65.0", "@typescript-eslint/type-utils": "8.65.0", "@typescript-eslint/utils": "8.65.0", "@typescript-eslint/visitor-keys": "8.65.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.65.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA=="], - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.62.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.62.1", "@typescript-eslint/types": "8.62.1", "@typescript-eslint/typescript-estree": "8.62.1", "@typescript-eslint/visitor-keys": "8.62.1", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-sPhE4iHuJDSvoAiec+Ro8JyXw8f0ql13HFR82P99nCm9GwTEKG0KYLvDe6REk8BCXuit6vJAv/Yxg5ABaNS2rA=="], + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.65.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.65.0", "@typescript-eslint/types": "8.65.0", "@typescript-eslint/typescript-estree": "8.65.0", "@typescript-eslint/visitor-keys": "8.65.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA=="], - "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.62.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.62.1", "@typescript-eslint/types": "^8.62.1", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-yQ3RgY5RkSBpsNS1Bx/JQEcA24FOSdfGktoyprAr5u18390UQdtVcfnEv4nIrIshNnavlVyZBKxQwT1fIAE6cg=="], + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.65.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.65.0", "@typescript-eslint/types": "^8.65.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q=="], - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.62.1", "", { "dependencies": { "@typescript-eslint/types": "8.62.1", "@typescript-eslint/visitor-keys": "8.62.1" } }, "sha512-r4d249KbQ1SFdpeStvob8Ih6aPPIzfqllPVOtvhve6ZcpuVcYo5/7zUWckKpHE7StASX4kTKZTLf0WQm/wPkcg=="], + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.65.0", "", { "dependencies": { "@typescript-eslint/types": "8.65.0", "@typescript-eslint/visitor-keys": "8.65.0" } }, "sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg=="], - "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.62.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-xadytJqX9vJVQ2fdQjkcIVigwaOJNWkpjdLt6cEQ+xPnrI1fkp+/jZE/I97k9KUjqtpd25i0HeyZf3T6dutv2g=="], + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.65.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg=="], - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.62.1", "", { "dependencies": { "@typescript-eslint/types": "8.62.1", "@typescript-eslint/typescript-estree": "8.62.1", "@typescript-eslint/utils": "8.62.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-aXM5xlqXiTxPibXB93cLAURfT3rlizf7uMXISCXy66Isr/9hISJx3yDsKl0L7lKa51b8JpFuNKby0/O0pEm9jg=="], + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.65.0", "", { "dependencies": { "@typescript-eslint/types": "8.65.0", "@typescript-eslint/typescript-estree": "8.65.0", "@typescript-eslint/utils": "8.65.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-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g=="], - "@typescript-eslint/types": ["@typescript-eslint/types@8.62.1", "", {}, "sha512-ooCzJFaf+Hg+uG6fA3NRFGuFjlfNlDhBthbv4ZPU/0elCAFUfnyXUvf/WOpHz/jYwSmvU2GkR2LtyUfy1AxZ1Q=="], + "@typescript-eslint/types": ["@typescript-eslint/types@8.65.0", "", {}, "sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg=="], - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.62.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.62.1", "@typescript-eslint/tsconfig-utils": "8.62.1", "@typescript-eslint/types": "8.62.1", "@typescript-eslint/visitor-keys": "8.62.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-xMcW9oP9u7fAMXYs9A65CVmtLQe2r//oXINHfi8HV+oiqhih17sbLdhXr4540YWlgpDKQdY854OL5ZrdCiQsAA=="], + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.65.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.65.0", "@typescript-eslint/tsconfig-utils": "8.65.0", "@typescript-eslint/types": "8.65.0", "@typescript-eslint/visitor-keys": "8.65.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-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg=="], - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.62.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.62.1", "@typescript-eslint/types": "8.62.1", "@typescript-eslint/typescript-estree": "8.62.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-sHtbPfuKNZCG+ih8SyjjucqRntSVmp8XgL5u6o9mAhiSn8ds5o/M/XdM0abweme2Tln3szOstOrZ9OXitvPh0g=="], + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.65.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.65.0", "@typescript-eslint/types": "8.65.0", "@typescript-eslint/typescript-estree": "8.65.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA=="], - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.62.1", "", { "dependencies": { "@typescript-eslint/types": "8.62.1", "eslint-visitor-keys": "^5.0.0" } }, "sha512-4g3BLxfdTMy8iZG0MaBkadnlRrCJ74cQiFbyEVMrkwIoqdyaXXQM22cotDvrl4x28wgIZ9rEJRoM+mmhSJpJ1g=="], + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.65.0", "", { "dependencies": { "@typescript-eslint/types": "8.65.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A=="], "acorn": ["acorn@8.17.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg=="], @@ -512,13 +517,13 @@ "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "baseline-browser-mapping": ["baseline-browser-mapping@2.10.41", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-WwS7MHhqGHHlaVsqRZnhvCEMS0owDX+SxRlve7JkuH7My1Ara3ZriTmCQupPfYjxMZ8I/tgxtJYr2t7taHaH4A=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.11.4", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-s4+sLr9mZ/CyqeRritFeYV/Zx73OAtmaHn6kkBS1XRoJn1hrg3xIDUcpicAEX68tkcIN0iBCgti31C8zxtkhsQ=="], - "brace-expansion": ["brace-expansion@5.0.7", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA=="], + "brace-expansion": ["brace-expansion@5.0.8", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg=="], "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], - "browserslist": ["browserslist@4.28.4", "", { "dependencies": { "baseline-browser-mapping": "^2.10.38", "caniuse-lite": "^1.0.30001799", "electron-to-chromium": "^1.5.376", "node-releases": "^2.0.48", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw=="], + "browserslist": ["browserslist@4.28.7", "", { "dependencies": { "baseline-browser-mapping": "^2.10.44", "caniuse-lite": "^1.0.30001806", "electron-to-chromium": "^1.5.393", "node-releases": "^2.0.51", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw=="], "builtin-modules": ["builtin-modules@5.3.0", "", {}, "sha512-hMQUl2bUFG339QygPM97E+mc8OY1IAchORZxm4a/frcYwKzozMzRVDBwHW0NjOqGElLm2O37AVQE8ikxlZHrMQ=="], @@ -526,19 +531,19 @@ "bun-types": ["bun-types@1.3.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-4N0ig0fEomHt5R0KCFWjovxow98rIoRwKolrYdCcknNwMekCXRnWEUvgu5soYV8QXtVsrUD8B95MBOZGPvr6KQ=="], - "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=="], "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001800", "", {}, "sha512-MMHtuAz9Ys840zAY5F4k6fV5GaivZ9sPk+nz0mY+GYVzRBnYkN0mpqkSR92oWRQ19yQWo4HvBV/FnC16AJX8MA=="], + "caniuse-lite": ["caniuse-lite@1.0.30001806", "", {}, "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw=="], "change-case": ["change-case@5.4.4", "", {}, "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w=="], "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=="], @@ -546,12 +551,14 @@ "color-convert": ["color-convert@3.1.3", "", { "dependencies": { "color-name": "^2.0.0" } }, "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg=="], - "color-name": ["color-name@2.1.0", "", {}, "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg=="], + "color-name": ["color-name@2.1.1", "", {}, "sha512-p2FdgwVx1a9yWBHP2wI0VgShkDpgN4kZISkxdNipGBJWpa5G6b04OINlVWCyJj0JmfvcPrgqt95E9k8yvaOJFg=="], "color-string": ["color-string@2.1.4", "", { "dependencies": { "color-name": "^2.0.0" } }, "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg=="], "colord": ["colord@2.9.3", "", {}, "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw=="], + "convert-hrtime": ["convert-hrtime@5.0.0", "", {}, "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg=="], + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], "core-js-compat": ["core-js-compat@3.49.0", "", { "dependencies": { "browserslist": "^4.28.1" } }, "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA=="], @@ -576,7 +583,7 @@ "detect-indent": ["detect-indent@7.0.2", "", {}, "sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A=="], - "devalue": ["devalue@5.8.1", "", {}, "sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw=="], + "devalue": ["devalue@5.8.2", "", {}, "sha512-DObPPAfdtFbXjxLqK8s2Xk9ZuWz5+ZoFEhC7J76es4GU/rEiXwHTmbImoCdyoCOcBH1UF3+Cz6Z2sYD4hyl5TA=="], "diff": ["diff@5.2.2", "", {}, "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A=="], @@ -584,10 +591,12 @@ "ekscss": ["ekscss@workspace:packages/ekscss"], - "electron-to-chromium": ["electron-to-chromium@1.5.385", "", {}, "sha512-78sa/M08MNAYHQfjoWMvOlKQqZ0ElhSm/L5HNUc96VZ3b+KvDVnngFm8sYQy0XrhTRgAhggHr5abA7yTvRdo4Q=="], + "electron-to-chromium": ["electron-to-chromium@1.5.396", "", {}, "sha512-yHiw2Y3C3H9U6TMbOfoWK/BPreiOPXRfTWPBwQBoZG6/8TB6eOPnsy5oaRYuatR7Fw2SJ4kKforgufeo7fq0EQ=="], "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + "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=="], @@ -600,9 +609,9 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@10.6.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.6.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.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-6lVbcqSodALYo+4ELD0heG6lFiFxnLMuLkiMi2qV8LMp54N8tE8FT1GMH+ev4Ti00nFjNze2+Su6DsV5OQW3Dg=="], + "eslint": ["eslint@10.8.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.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-nuKKvN+oIBO0koN7Tm7dlkmnkc21mtt0QJLwAKzjLq14y6lRTdVG36MZHJ8eQHwdJMwZbQNMlPOYedMq/oVJvQ=="], - "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@72.0.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@eslint/css-tree": "^4.0.4", "browserslist": "^4.28.4", "change-case": "^5.4.4", "ci-info": "^4.4.0", "core-js-compat": "^3.49.0", "detect-indent": "^7.0.2", "entities": "^4.5.0", "find-up-simple": "^1.0.1", "globals": "^17.7.0", "indent-string": "^5.0.0", "is-builtin-module": "^5.0.0", "is-identifier": "^1.1.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-hqO6ksoOHO+ZhdseTuKRVQbx9U7PRO/cv8qAR1mctwzdVO2hYud8uS9luAhp43RJgziYgHAph8eHyipT8GL0ng=="], "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=="], @@ -614,7 +623,7 @@ "esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="], - "esrap": ["esrap@2.2.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, "peerDependencies": { "@typescript-eslint/types": "^8.2.0" }, "optionalPeers": ["@typescript-eslint/types"] }, "sha512-m8jH5hZgJE2RRUK/jjkGPcJEDAV+dYnZYFkosQaPTcE+Yw4xynXHOo6FUdwaWBtdR3b1MMa7wEDTSHeR2VWsGA=="], + "esrap": ["esrap@2.3.0", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, "peerDependencies": { "@typescript-eslint/types": "^8.2.0" }, "optionalPeers": ["@typescript-eslint/types"] }, "sha512-GQ/7RN8uOtEfNpzZzBMTzW9JBcX42oaSVtPzdF+6cEL8pqIL094iUpr9jzYGn4O4P/1S60dJ6izyT8F4LYARng=="], "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], @@ -632,7 +641,7 @@ "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], - "fast-uri": ["fast-uri@3.1.3", "", {}, "sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg=="], + "fast-uri": ["fast-uri@3.1.4", "", {}, "sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw=="], "fastest-levenshtein": ["fastest-levenshtein@1.0.16", "", {}, "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg=="], @@ -650,12 +659,14 @@ "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], - "flatted": ["flatted@3.4.2", "", {}, "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA=="], + "flatted": ["flatted@3.4.3", "", {}, "sha512-/zipXxyO6rGvuNGDiULY9MvEGSkb2gaG4GGH4ygMi0ZZzyMHdUZBmntJmx5x1G2VuPytCwGN4xsJP6cw+sK+vQ=="], "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "function-timeout": ["function-timeout@1.0.2", "", {}, "sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA=="], + "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=="], @@ -668,9 +679,9 @@ "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.7.0", "", {}, "sha512-Czmyns5dUsq4seFBR/Kdydhmo8y9kC79hiSkPn0YcGtNnYWnrgt0vjrSjx9tspoDGWm2CMarffRuLjM4xUz8xg=="], + "globals": ["globals@17.8.0", "", {}, "sha512-Zz/LMDZScFmkakeL2cTHzf+PbWKdpU3uclqkZT7TjDG58j5WPt0PpA+n9uPI24fZtlw07q0OtEi84K+umsRzqQ=="], - "globby": ["globby@16.2.0", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "fast-glob": "^3.3.3", "ignore": "^7.0.5", "is-path-inside": "^4.0.0", "slash": "^5.1.0", "unicorn-magic": "^0.4.0" } }, "sha512-QrJia2qDf5BB/V6HYlDTs0I0lBahyjLzpGQg3KT7FnCdTonAyPy2RtY802m2k4ALx6Dp752f82WsOczEVr3l6Q=="], + "globby": ["globby@16.2.2", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "fast-glob": "^3.3.3", "ignore": "^7.0.5", "is-path-inside": "^4.0.0", "slash": "^5.1.0", "unicorn-magic": "^0.4.0" } }, "sha512-NLvV9ubZ6NDsJaOpKPy3cQeJpKi9DcWiyCiFUpJPA0YihRqiE6RWaLUmgNNPr8MgPpLZjnBjSmou7uZBRJv9wA=="], "globjoin": ["globjoin@0.1.4", "", {}, "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg=="], @@ -684,6 +695,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=="], @@ -706,6 +719,8 @@ "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + "is-identifier": ["is-identifier@1.1.0", "", { "dependencies": { "identifier-regex": "^1.1.0", "super-regex": "^1.1.0" } }, "sha512-NhOds0mDx9lJu+1lBRO0xbwFo5nobA7GCk/0e5xjr6+6XugX985+0OyGX35BNrTkPAsdLcIKg02HUQJOK8D8kw=="], + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], "is-path-inside": ["is-path-inside@4.0.0", "", {}, "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA=="], @@ -750,15 +765,17 @@ "lodash.truncate": ["lodash.truncate@4.4.2", "", {}, "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw=="], - "lru-cache": ["lru-cache@11.5.1", "", {}, "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A=="], + "lru-cache": ["lru-cache@11.5.2", "", {}, "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g=="], "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + "make-asynchronous": ["make-asynchronous@1.1.0", "", { "dependencies": { "p-event": "^6.0.0", "type-fest": "^4.6.0", "web-worker": "^1.5.0" } }, "sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg=="], + "make-dir": ["make-dir@4.0.0", "", { "dependencies": { "semver": "^7.5.3" } }, "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw=="], "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.29.0", "", {}, "sha512-pVxQFCcaYUEAH853+v7yoI/qzhxXSq1bTb9obMYGYAN1c3Hen+XDCEvr296XhstrwlSTNgOR7mCSD4JPjbJe5A=="], "meow": ["meow@14.1.0", "", {}, "sha512-EDYo6VlmtnumlcBCbh1gLJ//9jvM/ndXHfVXIFrZVr6fGcwTUyCTFNTLCKuY3ffbK8L/+3Mzqnd58RojiZqHVw=="], @@ -774,20 +791,24 @@ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], - "nanoid": ["nanoid@3.3.15", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA=="], + "nanoid": ["nanoid@3.3.16", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q=="], "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], - "node-releases": ["node-releases@2.0.50", "", {}, "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg=="], + "node-releases": ["node-releases@2.0.51", "", {}, "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ=="], "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + "p-event": ["p-event@6.0.1", "", { "dependencies": { "p-timeout": "^6.1.2" } }, "sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w=="], + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + "p-timeout": ["p-timeout@6.1.4", "", {}, "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg=="], + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], @@ -804,7 +825,7 @@ "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.23", "", { "dependencies": { "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg=="], "postcss-ekscss": ["postcss-ekscss@workspace:packages/postcss-ekscss"], @@ -824,17 +845,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.2", "", { "dependencies": { "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ=="], "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.62.2", "", { "dependencies": { "@types/estree": "1.0.9" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.62.2", "@rollup/rollup-android-arm64": "4.62.2", "@rollup/rollup-darwin-arm64": "4.62.2", "@rollup/rollup-darwin-x64": "4.62.2", "@rollup/rollup-freebsd-arm64": "4.62.2", "@rollup/rollup-freebsd-x64": "4.62.2", "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", "@rollup/rollup-linux-arm-musleabihf": "4.62.2", "@rollup/rollup-linux-arm64-gnu": "4.62.2", "@rollup/rollup-linux-arm64-musl": "4.62.2", "@rollup/rollup-linux-loong64-gnu": "4.62.2", "@rollup/rollup-linux-loong64-musl": "4.62.2", "@rollup/rollup-linux-ppc64-gnu": "4.62.2", "@rollup/rollup-linux-ppc64-musl": "4.62.2", "@rollup/rollup-linux-riscv64-gnu": "4.62.2", "@rollup/rollup-linux-riscv64-musl": "4.62.2", "@rollup/rollup-linux-s390x-gnu": "4.62.2", "@rollup/rollup-linux-x64-gnu": "4.62.2", "@rollup/rollup-linux-x64-musl": "4.62.2", "@rollup/rollup-openbsd-x64": "4.62.2", "@rollup/rollup-openharmony-arm64": "4.62.2", "@rollup/rollup-win32-arm64-msvc": "4.62.2", "@rollup/rollup-win32-ia32-msvc": "4.62.2", "@rollup/rollup-win32-x64-gnu": "4.62.2", "@rollup/rollup-win32-x64-msvc": "4.62.2", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA=="], + "rollup": ["rollup@4.62.3", "", { "dependencies": { "@types/estree": "1.0.9" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.62.3", "@rollup/rollup-android-arm64": "4.62.3", "@rollup/rollup-darwin-arm64": "4.62.3", "@rollup/rollup-darwin-x64": "4.62.3", "@rollup/rollup-freebsd-arm64": "4.62.3", "@rollup/rollup-freebsd-x64": "4.62.3", "@rollup/rollup-linux-arm-gnueabihf": "4.62.3", "@rollup/rollup-linux-arm-musleabihf": "4.62.3", "@rollup/rollup-linux-arm64-gnu": "4.62.3", "@rollup/rollup-linux-arm64-musl": "4.62.3", "@rollup/rollup-linux-loong64-gnu": "4.62.3", "@rollup/rollup-linux-loong64-musl": "4.62.3", "@rollup/rollup-linux-ppc64-gnu": "4.62.3", "@rollup/rollup-linux-ppc64-musl": "4.62.3", "@rollup/rollup-linux-riscv64-gnu": "4.62.3", "@rollup/rollup-linux-riscv64-musl": "4.62.3", "@rollup/rollup-linux-s390x-gnu": "4.62.3", "@rollup/rollup-linux-x64-gnu": "4.62.3", "@rollup/rollup-linux-x64-musl": "4.62.3", "@rollup/rollup-openbsd-x64": "4.62.3", "@rollup/rollup-openharmony-arm64": "4.62.3", "@rollup/rollup-win32-arm64-msvc": "4.62.3", "@rollup/rollup-win32-ia32-msvc": "4.62.3", "@rollup/rollup-win32-x64-gnu": "4.62.3", "@rollup/rollup-win32-x64-msvc": "4.62.3", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-Gu0c0iH9FzgX1L1t7ByIbbS3Vmdz+6KHm/EsqmmC71gUQ82yvZRkTK6XzrFObSka91WUVdynqp6nsfilzr5k6Q=="], "rollup-plugin-ekscss": ["rollup-plugin-ekscss@workspace:packages/rollup-plugin-ekscss"], @@ -856,13 +879,13 @@ "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], - "string-width": ["string-width@8.2.1", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA=="], + "string-width": ["string-width@8.2.2", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg=="], "strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], "strip-indent": ["strip-indent@4.1.1", "", {}, "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA=="], - "stylelint": ["stylelint@17.14.0", "", { "dependencies": { "@csstools/css-calc": "^3.2.1", "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-syntax-patches-for-csstree": "^1.1.5", "@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.3", "global-modules": "^2.0.0", "globby": "^16.2.0", "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.15", "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.4.0", "svg-tags": "^1.0.0", "table": "^6.9.0", "write-file-atomic": "^7.0.1" }, "bin": { "stylelint": "bin/stylelint.mjs" } }, "sha512-8xkHPpdqYryeIsOgfsYTmr6cIeC4nLYWk5S8BPxpodq8mIuepggkMljsHewWfuAjj/+qpRKou2QerhjMH3iasg=="], + "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-config-recommended": ["stylelint-config-recommended@18.0.0", "", { "peerDependencies": { "stylelint": "^17.0.0" } }, "sha512-mxgT2XY6YZ3HWWe3Di8umG6aBmWmHTblTgu/f10rqFXnyWxjKWwNdjSWkgkwCtxIKnqjSJzvFmPT5yabVIRxZg=="], @@ -872,11 +895,13 @@ "stylis": ["stylis@4.4.0", "", {}, "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA=="], + "super-regex": ["super-regex@1.1.0", "", { "dependencies": { "function-timeout": "^1.0.1", "make-asynchronous": "^1.0.1", "time-span": "^5.1.0" } }, "sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ=="], + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], "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.4", "", { "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-/d0QHehmRuJW8gVz395MTkPcPozxzdjBMBE8oEYGz8O3b9KTMzzQ9ZHJQLuFKOHOPQbU6kx/X4iid/EBBzH7iw=="], + "svelte": ["svelte@5.56.8", "", { "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-PY8LOw7xP6c8IOiVqdo0sbbZVYhXRSfklOQLAUyGBKqjTX0wx/z4l/9J+PmBpmlLnxzEb1NqltxQ5/wZme/Cmg=="], "svelte-ekscss": ["svelte-ekscss@workspace:packages/svelte-ekscss"], @@ -886,19 +911,23 @@ "test-exclude": ["test-exclude@8.0.0", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^13.0.6", "minimatch": "^10.2.2" } }, "sha512-ZOffsNrXYggvU1mDGHk54I96r26P8SyMjO5slMKSc7+IWmtB/MQKnEC2fP51imB3/pT6YK5cT5E8f+Dd9KdyOQ=="], + "time-span": ["time-span@5.1.0", "", { "dependencies": { "convert-hrtime": "^5.0.0" } }, "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA=="], + "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], "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.2", "", { "optionalDependencies": { "@turbo/darwin-64": "2.10.2", "@turbo/darwin-arm64": "2.10.2", "@turbo/linux-64": "2.10.2", "@turbo/linux-arm64": "2.10.2", "@turbo/windows-64": "2.10.2", "@turbo/windows-arm64": "2.10.2" }, "bin": { "turbo": "bin/turbo" } }, "sha512-wTExrNrRjB8qzIcg+ZLm0A3GFNLDsWNwdS/RBXB0FPrBDyzk3i96Yx+TxWZC7a0k1SIreFB8ciUbxjmEqTH8IQ=="], + "turbo": ["turbo@2.10.7", "", { "optionalDependencies": { "@turbo/darwin-64": "2.10.7", "@turbo/darwin-arm64": "2.10.7", "@turbo/linux-64": "2.10.7", "@turbo/linux-arm64": "2.10.7", "@turbo/windows-64": "2.10.7", "@turbo/windows-arm64": "2.10.7" }, "bin": { "turbo": "bin/turbo" } }, "sha512-GHx6WExIFSKNJ5qMlzDpXBXlu9ApxaMjqxAVrCNcW94xf/+uqgIz41SAuRUMbXva2ExNAaY/h8V0q90SWSzmRw=="], "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + "type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], + "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], - "typescript-eslint": ["typescript-eslint@8.62.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.62.1", "@typescript-eslint/parser": "8.62.1", "@typescript-eslint/typescript-estree": "8.62.1", "@typescript-eslint/utils": "8.62.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-vymnnM5g0AKQDSAyfP12nMIBvgwgA42syg74kkuZ4x1VuTzwQKwc5h9rGxeShCjny5o+zWAb6OEoz7XLgrIkIw=="], + "typescript-eslint": ["typescript-eslint@8.65.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.65.0", "@typescript-eslint/parser": "8.65.0", "@typescript-eslint/typescript-estree": "8.65.0", "@typescript-eslint/utils": "8.65.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-/ggrHAwyjENDusvyxbuqxAC2dTnZg/Z8F+fgQtYIz+L6n/9HfSlEZcFGV/NsMNa6CkGk0xUjUAFwC0vHOflvIA=="], "undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], @@ -914,17 +943,21 @@ "v8-to-istanbul": ["v8-to-istanbul@9.3.0", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^2.0.0" } }, "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA=="], + "web-worker": ["web-worker@1.5.0", "", {}, "sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw=="], + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], "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.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="], + + "yargs": ["yargs@18.1.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-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg=="], "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], @@ -940,21 +973,23 @@ "@keyv/bigmap/keyv": ["keyv@5.6.0", "", { "dependencies": { "@keyv/serialize": "^1.1.1" } }, "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + "@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=="], "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.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + "globby/ignore": ["ignore@7.0.6", "", {}, "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw=="], "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], @@ -962,7 +997,7 @@ "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.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + "stylelint/ignore": ["ignore@7.0.6", "", {}, "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw=="], "supports-color/has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], @@ -974,15 +1009,15 @@ "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=="], + "cliui/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], "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=="], @@ -990,10 +1025,6 @@ "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..4293ba62 100644 --- a/bunfig.toml +++ b/bunfig.toml @@ -1,10 +1,14 @@ "$schema" = "https://www.schemastore.org/bunfig.json" +[run] +bun = 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..d8ef9f3a 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 @@ -69,5 +71,5 @@ export default defineConfig( "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 c68104cb..68197131 100644 --- a/package.json +++ b/package.json @@ -17,23 +17,23 @@ "test:node:c8": "c8 npm run test:node" }, "devDependencies": { - "@biomejs/biome": "2.5.1", + "@biomejs/biome": "2.5.5", "@eslint/js": "10.0.1", - "@maxmilton/eslint-config": "0.3.2", + "@maxmilton/eslint-config": "0.3.4", "@maxmilton/stylelint-config": "0.4.3", "@maxmilton/test-utils": "0.0.15", "@types/bun": "1.3.14", - "@types/node": "26.1.0", - "c8": "11.0.0", + "@types/node": "26.1.1", + "c8": "12.0.0", "ekscss": "workspace:*", - "eslint": "10.6.0", - "eslint-plugin-unicorn": "70.0.0", + "eslint": "10.8.0", + "eslint-plugin-unicorn": "72.0.0", "postcss-ekscss": "workspace:*", - "stylelint": "17.14.0", + "stylelint": "17.14.1", "stylelint-config-standard": "40.0.0", - "turbo": "2.10.2", + "turbo": "2.10.7", "typescript": "6.0.3", - "typescript-eslint": "8.62.1", + "typescript-eslint": "8.65.0", "uvu": "0.5.6" }, "packageManager": "bun@1.99.0" 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/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..006accd9 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:*", + "@jridgewell/trace-mapping": "0.3.31", "esbuild": "0.28.1" } } 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..ea4725fb --- /dev/null +++ b/packages/ekscss/test/__snapshots__/sourcemap.test.ts.snap @@ -0,0 +1,177 @@ +// 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, +} +`; + +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/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/plugin-apply/package.json b/packages/plugin-apply/package.json index b99ba632..fd3f82cd 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", diff --git a/packages/plugin-apply/src/index.ts b/packages/plugin-apply/src/index.ts index 0df8339b..731ceb15 100644 --- a/packages/plugin-apply/src/index.ts +++ b/packages/plugin-apply/src/index.ts @@ -53,7 +53,7 @@ export const applyPlugin: Middleware = (element, _index, _children, callback): v // 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 +62,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..3ddbf33d 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,6 +21,7 @@ }, "devDependencies": { "@ekscss/build-tools": "workspace:*", + "@jridgewell/trace-mapping": "0.3.31", "ekscss": "workspace:*", "esbuild": "0.28.1" }, 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..cd00f6ab 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", 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..5556d517 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", @@ -19,7 +19,7 @@ "devDependencies": { "@ekscss/build-tools": "workspace:*", "esbuild": "0.28.1", - "postcss": "8.5.16" + "postcss": "8.5.23" }, "peerDependencies": { "postcss": "^8.0.0" diff --git a/packages/postcss-ekscss/src/parser.ts b/packages/postcss-ekscss/src/parser.ts index c3134ac2..a4a9ca4c 100644 --- a/packages/postcss-ekscss/src/parser.ts +++ b/packages/postcss-ekscss/src/parser.ts @@ -74,7 +74,6 @@ 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); @@ -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/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 d50ffd10..6652a90d 100644 --- a/packages/rollup-plugin-ekscss/package.json +++ b/packages/rollup-plugin-ekscss/package.json @@ -23,7 +23,7 @@ "@ekscss/build-tools": "workspace:*", "ekscss": "workspace:*", "esbuild": "0.28.1", - "rollup": "4.62.2" + "rollup": "4.62.3" }, "peerDependencies": { "ekscss": "workspace:^", diff --git a/packages/svelte-ekscss/package.json b/packages/svelte-ekscss/package.json index 74249607..60c5a407 100644 --- a/packages/svelte-ekscss/package.json +++ b/packages/svelte-ekscss/package.json @@ -23,7 +23,7 @@ "@ekscss/build-tools": "workspace:*", "ekscss": "workspace:*", "esbuild": "0.28.1", - "svelte": "5.56.4" + "svelte": "5.56.8" }, "peerDependencies": { "ekscss": "workspace:^",