From 91eeaa83b04cc4800e3b397b5992fdb73c5f644b Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Thu, 22 Jan 2026 12:42:27 +0100 Subject: [PATCH 01/38] Add package.json --- packages/eslint-plugin/package.json | 19 +++++++++++++++++++ packages/eslint-plugin/src/index.ts | 0 pnpm-lock.yaml | 2 ++ 3 files changed, 21 insertions(+) create mode 100644 packages/eslint-plugin/package.json create mode 100644 packages/eslint-plugin/src/index.ts diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json new file mode 100644 index 0000000000..d6bb19ade1 --- /dev/null +++ b/packages/eslint-plugin/package.json @@ -0,0 +1,19 @@ +{ + "name": "eslint-plugin-typegpu", + "version": "0.9.0", + "description": "An eslint plugin containing custom rules for TypeGPU.", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + }, + "scripts": { + "build": "tsup src/index.ts --format cjs,esm --dts", + "test": "vitest" + }, + "sideEffects": false, + "license": "MIT", + "packageManager": "pnpm@10.15.1" +} diff --git a/packages/eslint-plugin/src/index.ts b/packages/eslint-plugin/src/index.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f8bb49a5d4..b06b2a3e64 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -366,6 +366,8 @@ importers: specifier: ^2.8.1 version: 2.8.1 + packages/eslint-plugin: {} + packages/tgpu-dev-cli: dependencies: arg: From e063b7c8e699018ffb6a13008ec5753e3e869ef6 Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Thu, 22 Jan 2026 12:59:09 +0100 Subject: [PATCH 02/38] Add index.ts --- packages/eslint-plugin/package.json | 5 +- packages/eslint-plugin/src/index.ts | 17 + pnpm-lock.yaml | 471 +++++++++++++++++++++++++++- 3 files changed, 483 insertions(+), 10 deletions(-) diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index d6bb19ade1..eebe5c8d61 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -15,5 +15,8 @@ }, "sideEffects": false, "license": "MIT", - "packageManager": "pnpm@10.15.1" + "packageManager": "pnpm@10.15.1", + "devDependencies": { + "eslint": "^9.39.2" + } } diff --git a/packages/eslint-plugin/src/index.ts b/packages/eslint-plugin/src/index.ts index e69de29bb2..742c60f714 100644 --- a/packages/eslint-plugin/src/index.ts +++ b/packages/eslint-plugin/src/index.ts @@ -0,0 +1,17 @@ +import fs from "node:fs"; + +const pkg = JSON.parse( + fs.readFileSync(new URL("./package.json", import.meta.url), "utf8"), +); + +const plugin = { + meta: { + name: pkg.name, + version: pkg.version, + }, + rules: { + // TBA + }, +}; + +export default plugin; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b06b2a3e64..dd3c78b922 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -110,7 +110,7 @@ importers: devDependencies: '@types/bun': specifier: latest - version: 1.3.5 + version: 1.3.6 apps/infra-benchmarks: devDependencies: @@ -366,7 +366,11 @@ importers: specifier: ^2.8.1 version: 2.8.1 - packages/eslint-plugin: {} + packages/eslint-plugin: + devDependencies: + eslint: + specifier: ^9.39.2 + version: 9.39.2(jiti@2.6.1) packages/tgpu-dev-cli: dependencies: @@ -1449,6 +1453,44 @@ packages: cpu: [x64] os: [win32] + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.3.3': + resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.39.2': + resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@expressive-code/core@0.41.2': resolution: {integrity: sha512-AJW5Tp9czbLqKMzwudL9Rv4js9afXBxkSGLmCNPq1iRgAYcx9NkTPJiSNCesjKRWoVC328AdSu6fqrD22zDgDg==} @@ -1479,6 +1521,22 @@ packages: '@gerrit0/mini-shiki@1.27.2': resolution: {integrity: sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og==} + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + '@img/sharp-darwin-arm64@0.34.2': resolution: {integrity: sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -2693,8 +2751,8 @@ packages: '@types/bun@1.2.22': resolution: {integrity: sha512-5A/KrKos2ZcN0c6ljRSOa1fYIyCKhZfIVYeuyb4snnvomnpFqC0tTsEkdqNxbAgExV384OETQ//WAjl3XbYqQA==} - '@types/bun@1.3.5': - resolution: {integrity: sha512-RnygCqNrd3srIPEWBd5LFeUYG7plCoH2Yw9WaZGyNmdTEei+gWaHqydbaIRkIkcbXwhBT94q78QljxN0Sk838w==} + '@types/bun@1.3.6': + resolution: {integrity: sha512-uWCv6FO/8LcpREhenN1d1b6fcspAB+cefwD7uti8C8VffIv0Um08TKMn98FynpTiU38+y2dUO55T11NgDt8VAA==} '@types/chai@5.2.2': resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} @@ -3054,6 +3112,9 @@ packages: peerDependencies: ajv: ^8.8.2 + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} @@ -3212,6 +3273,9 @@ packages: resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} engines: {node: '>=18'} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + brace-expansion@2.0.2: resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} @@ -3248,8 +3312,8 @@ packages: peerDependencies: '@types/react': ^19 - bun-types@1.3.5: - resolution: {integrity: sha512-inmAYe2PFLs0SUbFOWSVD24sg1jFlMPxOjOSSCYqUgn4Hsc3rDc7dFvfVYjFPNHtov6kgUeulV4SxbuIV/stPw==} + bun-types@1.3.6: + resolution: {integrity: sha512-OlFwHcnNV99r//9v5IIOgQ9Uk37gZqrNMCcqEaExdkVq3Avwqok1bJFmvGMCkCE0FqzdY8VMOZpfpR3lwI+CsQ==} bundle-require@5.1.0: resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} @@ -3264,6 +3328,10 @@ packages: call-me-maybe@1.0.2: resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + camelcase@8.0.0: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} @@ -3434,6 +3502,9 @@ packages: commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} @@ -3698,6 +3769,9 @@ packages: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -3874,6 +3948,10 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + escape-string-regexp@5.0.0: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} @@ -3882,10 +3960,40 @@ packages: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.39.2: + resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + esm@3.2.25: resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} engines: {node: '>=6'} + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -3922,6 +4030,10 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} @@ -3968,6 +4080,12 @@ packages: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-uri@3.0.6: resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} @@ -4006,6 +4124,10 @@ packages: resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} engines: {node: '>=18'} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -4018,9 +4140,17 @@ packages: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + fix-dts-default-cjs-exports@1.0.0: resolution: {integrity: sha512-i9Vd++WOWo6JilNgZvNvmy1T0r+/j7vikghQSEhKIuDwz4GjUrYj+Z18zlL7MleYNxE+xE6t3aG7LiAwA1P+dg==} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true @@ -4028,6 +4158,9 @@ packages: flatbuffers@25.9.23: resolution: {integrity: sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==} + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + flattie@1.1.1: resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} engines: {node: '>=8'} @@ -4114,6 +4247,10 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} @@ -4126,6 +4263,10 @@ packages: engines: {node: 20 || >=22} hasBin: true + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -4262,6 +4403,10 @@ packages: resolution: {integrity: sha512-LAU2iVl6MuLbARLrZFEOrgqUFGmHij0FqqOR1/mMndUzJoPz2BU4gCXUhjikgwwmfhBPa/1szwiliUy//ZWafw==} engines: {node: '>=20.0.0'} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + import-local@3.2.0: resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} engines: {node: '>=8'} @@ -4270,6 +4415,10 @@ packages: import-meta-resolve@4.2.0: resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -4468,6 +4617,10 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + jsdom@27.0.0: resolution: {integrity: sha512-lIHeR1qlIRrIN5VMccd8tI2Sgw6ieYXSVktcSHaNe3Z5nE/tcPQYQWOq00wxMvYOsz+73eAkNenVvmPC6bba9A==} engines: {node: '>=20'} @@ -4482,12 +4635,21 @@ packages: engines: {node: '>=6'} hasBin: true + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -4515,6 +4677,9 @@ packages: resolution: {integrity: sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==} hasBin: true + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -4534,6 +4699,10 @@ packages: knitwork@1.2.0: resolution: {integrity: sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==} + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + lightningcss-darwin-arm64@1.30.1: resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} engines: {node: '>= 12.0.0'} @@ -4620,9 +4789,16 @@ packages: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} @@ -4951,6 +5127,9 @@ packages: resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} engines: {node: 20 || >=22} + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -5062,6 +5241,9 @@ packages: napi-build-utils@2.0.0: resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + nearley@2.20.1: resolution: {integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==} hasBin: true @@ -5145,6 +5327,10 @@ packages: onnxruntime-web@1.23.0-dev.20250917-21fbad8a65: resolution: {integrity: sha512-6KjMyvZOCmn4yaHJzSsIJw8pwmv5tzSX3R+qQZHRLaefKq9x5fGafLYt2bfqVr/987Emb1zIgzsChWsFVTa31Q==} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + ora@5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} @@ -5168,6 +5354,10 @@ packages: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + p-queue@8.1.1: resolution: {integrity: sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==} engines: {node: '>=18'} @@ -5193,6 +5383,10 @@ packages: pako@0.2.9: resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + parse-entities@4.0.2: resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} @@ -5505,6 +5699,10 @@ packages: engines: {node: '>=10'} hasBin: true + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + prettier@2.8.7: resolution: {integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==} engines: {node: '>=10.13.0'} @@ -5752,6 +5950,10 @@ packages: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -6054,6 +6256,10 @@ packages: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + strip-literal@3.0.0: resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} @@ -6336,6 +6542,10 @@ packages: peerDependencies: typescript: '*' + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + type-detect@4.1.0: resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} engines: {node: '>=4'} @@ -6561,6 +6771,9 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + url-join@5.0.0: resolution: {integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -6909,6 +7122,10 @@ packages: wildcard@2.0.1: resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -7782,6 +7999,52 @@ snapshots: '@esbuild/win32-x64@0.25.10': optional: true + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.6.1))': + dependencies: + eslint: 9.39.2(jiti@2.6.1) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/config-array@0.21.1': + dependencies: + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 + + '@eslint/core@0.17.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.3': + dependencies: + ajv: 6.12.6 + debug: 4.4.3 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.39.2': {} + + '@eslint/object-schema@2.1.7': {} + + '@eslint/plugin-kit@0.4.1': + dependencies: + '@eslint/core': 0.17.0 + levn: 0.4.1 + '@expressive-code/core@0.41.2': dependencies: '@ctrl/tinycolor': 4.1.0 @@ -7830,6 +8093,17 @@ snapshots: '@shikijs/types': 1.29.2 '@shikijs/vscode-textmate': 10.0.2 + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.7': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + '@img/sharp-darwin-arm64@0.34.2': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.1.0 @@ -8937,9 +9211,9 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@types/bun@1.3.5': + '@types/bun@1.3.6': dependencies: - bun-types: 1.3.5 + bun-types: 1.3.6 '@types/chai@5.2.2': dependencies: @@ -9385,6 +9659,13 @@ snapshots: ajv: 8.17.1 fast-deep-equal: 3.1.3 + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 @@ -9649,6 +9930,11 @@ snapshots: widest-line: 5.0.0 wrap-ansi: 9.0.2 + brace-expansion@1.1.12: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 @@ -9696,7 +9982,7 @@ snapshots: '@types/node': 24.10.0 '@types/react': 19.1.8 - bun-types@1.3.5: + bun-types@1.3.6: dependencies: '@types/node': 24.10.0 @@ -9709,6 +9995,8 @@ snapshots: call-me-maybe@1.0.2: {} + callsites@3.1.0: {} + camelcase@8.0.0: {} caniuse-api@3.0.0: @@ -9851,6 +10139,8 @@ snapshots: commondir@1.0.1: {} + concat-map@0.0.1: {} + confbox@0.1.8: {} confbox@0.2.1: {} @@ -10150,6 +10440,8 @@ snapshots: deep-extend@0.6.0: optional: true + deep-is@0.1.4: {} + deepmerge@4.3.1: {} defaults@1.0.4: @@ -10347,6 +10639,8 @@ snapshots: escalade@3.2.0: {} + escape-string-regexp@4.0.0: {} + escape-string-regexp@5.0.0: {} eslint-scope@5.1.1: @@ -10354,8 +10648,68 @@ snapshots: esrecurse: 4.3.0 estraverse: 4.3.0 + eslint-scope@8.4.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint@9.39.2(jiti@2.6.1): + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 + '@eslint/eslintrc': 3.3.3 + '@eslint/js': 9.39.2 + '@eslint/plugin-kit': 0.4.1 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.6.1 + transitivePeerDependencies: + - supports-color + esm@3.2.25: {} + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 @@ -10399,6 +10753,8 @@ snapshots: dependencies: '@types/estree': 1.0.6 + esutils@2.0.3: {} + eventemitter3@5.0.1: {} events@3.3.0: {} @@ -10458,6 +10814,10 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + fast-uri@3.0.6: {} fast-xml-parser@4.5.3: @@ -10484,6 +10844,10 @@ snapshots: dependencies: is-unicode-supported: 2.1.0 + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -10495,16 +10859,28 @@ snapshots: locate-path: 5.0.0 path-exists: 4.0.0 + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + fix-dts-default-cjs-exports@1.0.0: dependencies: magic-string: 0.30.19 mlly: 1.7.4 rollup: 4.34.8 + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + flat@5.0.2: {} flatbuffers@25.9.23: {} + flatted@3.3.3: {} + flattie@1.1.1: {} fontace@0.3.0: @@ -10584,6 +10960,10 @@ snapshots: dependencies: is-glob: 4.0.3 + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + glob-to-regexp@0.4.1: {} glob@10.4.5: @@ -10604,6 +10984,8 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 2.0.0 + globals@14.0.0: {} + graceful-fs@4.2.11: {} graphql@16.12.0: @@ -10867,6 +11249,11 @@ snapshots: imagetools-core@9.0.0: {} + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + import-local@3.2.0: dependencies: pkg-dir: 4.2.0 @@ -10874,6 +11261,8 @@ snapshots: import-meta-resolve@4.2.0: {} + imurmurhash@0.1.4: {} + inherits@2.0.4: {} ini@1.3.8: @@ -11025,6 +11414,10 @@ snapshots: dependencies: argparse: 2.0.1 + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6): dependencies: '@asamuzakjp/dom-selector': 6.5.6 @@ -11057,10 +11450,16 @@ snapshots: jsesc@3.1.0: {} + json-buffer@3.0.1: {} + json-parse-even-better-errors@2.3.1: {} + json-schema-traverse@0.4.1: {} + json-schema-traverse@1.0.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} + json5@2.2.3: {} jsonc-parser@2.3.1: {} @@ -11084,6 +11483,10 @@ snapshots: dependencies: commander: 8.3.0 + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + kind-of@6.0.3: {} kleur@3.0.3: {} @@ -11094,6 +11497,11 @@ snapshots: knitwork@1.2.0: {} + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + lightningcss-darwin-arm64@1.30.1: optional: true @@ -11155,8 +11563,14 @@ snapshots: dependencies: p-locate: 4.1.0 + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + lodash.memoize@4.1.2: {} + lodash.merge@4.6.2: {} + lodash.sortby@4.7.0: {} lodash.uniq@4.5.0: {} @@ -11774,6 +12188,10 @@ snapshots: dependencies: '@isaacs/brace-expansion': 5.0.0 + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.12 + minimatch@9.0.5: dependencies: brace-expansion: 2.0.2 @@ -11890,6 +12308,8 @@ snapshots: napi-build-utils@2.0.0: optional: true + natural-compare@1.4.0: {} + nearley@2.20.1: dependencies: commander: 2.20.3 @@ -11975,6 +12395,15 @@ snapshots: platform: 1.3.6 protobufjs: 7.5.4 + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + ora@5.4.1: dependencies: bl: 4.1.0 @@ -12006,6 +12435,10 @@ snapshots: dependencies: p-limit: 2.3.0 + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + p-queue@8.1.1: dependencies: eventemitter3: 5.0.1 @@ -12029,6 +12462,10 @@ snapshots: pako@0.2.9: {} + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + parse-entities@4.0.2: dependencies: '@types/unist': 2.0.11 @@ -12343,6 +12780,8 @@ snapshots: tunnel-agent: 0.6.0 optional: true + prelude-ls@1.2.1: {} + prettier@2.8.7: optional: true @@ -12676,6 +13115,8 @@ snapshots: dependencies: resolve-from: 5.0.0 + resolve-from@4.0.0: {} + resolve-from@5.0.0: {} resolve-pkg-maps@1.0.0: {} @@ -13067,6 +13508,8 @@ snapshots: strip-json-comments@2.0.1: optional: true + strip-json-comments@3.1.1: {} + strip-literal@3.0.0: dependencies: js-tokens: 9.0.1 @@ -13388,6 +13831,10 @@ snapshots: transitivePeerDependencies: - supports-color + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + type-detect@4.1.0: {} type-fest@4.38.0: {} @@ -13616,6 +14063,10 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + url-join@5.0.0: {} url-parse@1.5.10: @@ -14075,6 +14526,8 @@ snapshots: wildcard@2.0.1: {} + word-wrap@1.2.5: {} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 From a558156b275173c012215157800d86bfc8c8d1e5 Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Thu, 22 Jan 2026 13:02:35 +0100 Subject: [PATCH 03/38] Add tsup config --- packages/eslint-plugin/package.json | 2 +- packages/eslint-plugin/tsup.config.ts | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 packages/eslint-plugin/tsup.config.ts diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index eebe5c8d61..f07f08987f 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -10,7 +10,7 @@ } }, "scripts": { - "build": "tsup src/index.ts --format cjs,esm --dts", + "build": "tsup", "test": "vitest" }, "sideEffects": false, diff --git a/packages/eslint-plugin/tsup.config.ts b/packages/eslint-plugin/tsup.config.ts new file mode 100644 index 0000000000..9ed03697f4 --- /dev/null +++ b/packages/eslint-plugin/tsup.config.ts @@ -0,0 +1,12 @@ +import { defineConfig, type Options } from "tsup"; + +const config: Options = { + entry: ["src/index.ts"], + format: ["cjs", "esm"], + dts: true, + clean: true, + splitting: true, + sourcemap: true, +}; + +export default defineConfig(config); From 1af79a1fc0cb027190315178c5742c63cb98aee6 Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Thu, 22 Jan 2026 13:35:43 +0100 Subject: [PATCH 04/38] Add a dummy rule for testing --- packages/eslint-plugin/package.json | 1 + packages/eslint-plugin/src/index.ts | 3 +- .../eslint-plugin/src/rules/properNames.ts | 36 +++++++ pnpm-lock.yaml | 101 ++++++++++++++++++ 4 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 packages/eslint-plugin/src/rules/properNames.ts diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index f07f08987f..34a32dff52 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -17,6 +17,7 @@ "license": "MIT", "packageManager": "pnpm@10.15.1", "devDependencies": { + "@typescript-eslint/utils": "^8.53.1", "eslint": "^9.39.2" } } diff --git a/packages/eslint-plugin/src/index.ts b/packages/eslint-plugin/src/index.ts index 742c60f714..86a35d7ff5 100644 --- a/packages/eslint-plugin/src/index.ts +++ b/packages/eslint-plugin/src/index.ts @@ -1,4 +1,5 @@ import fs from "node:fs"; +import { properNames } from "./rules/properNames.ts"; const pkg = JSON.parse( fs.readFileSync(new URL("./package.json", import.meta.url), "utf8"), @@ -10,7 +11,7 @@ const plugin = { version: pkg.version, }, rules: { - // TBA + "proper-names": properNames, }, }; diff --git a/packages/eslint-plugin/src/rules/properNames.ts b/packages/eslint-plugin/src/rules/properNames.ts new file mode 100644 index 0000000000..2953b6b13b --- /dev/null +++ b/packages/eslint-plugin/src/rules/properNames.ts @@ -0,0 +1,36 @@ +import { ESLintUtils } from "@typescript-eslint/utils"; + +const createRule = ESLintUtils.RuleCreator( + (name) => `https://typegpu.com/rules/${name}`, +); + +export const properNames = createRule({ + name: "proper-names", + meta: { + type: "suggestion", + docs: { description: 'Enforce that no variables are named "AAA".' }, + messages: { badName: "Variable '{{name}}' has invalid name." }, + schema: [], + }, + defaultOptions: [], + + create(context) { + return { + VariableDeclarator(node) { + if (node.id.type !== "Identifier") { + return; + } + + const name = node.id.name; + + if (name === "AAA") { + context.report({ + node: node.id, + messageId: "badName", + data: { name }, + }); + } + }, + }; + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dd3c78b922..81304ec01b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -368,6 +368,9 @@ importers: packages/eslint-plugin: devDependencies: + '@typescript-eslint/utils': + specifier: ^8.53.1 + version: 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) eslint: specifier: ^9.39.2 version: 9.39.2(jiti@2.6.1) @@ -2873,6 +2876,43 @@ packages: '@types/webxr@0.5.22': resolution: {integrity: sha512-Vr6Stjv5jPRqH690f5I5GLjVk8GSsoQSYJ2FVd/3jJF7KaqfwPi3ehfBS96mlQ2kPCwZaX6U0rG2+NGHBKkA/A==} + '@typescript-eslint/project-service@8.53.1': + resolution: {integrity: sha512-WYC4FB5Ra0xidsmlPb+1SsnaSKPmS3gsjIARwbEkHkoWloQmuzcfypljaJcR78uyLA1h8sHdWWPHSLDI+MtNog==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/scope-manager@8.53.1': + resolution: {integrity: sha512-Lu23yw1uJMFY8cUeq7JlrizAgeQvWugNQzJp8C3x8Eo5Jw5Q2ykMdiiTB9vBVOOUBysMzmRRmUfwFrZuI2C4SQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.53.1': + resolution: {integrity: sha512-qfvLXS6F6b1y43pnf0pPbXJ+YoXIC7HKg0UGZ27uMIemKMKA6XH2DTxsEDdpdN29D+vHV07x/pnlPNVLhdhWiA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/types@8.53.1': + resolution: {integrity: sha512-jr/swrr2aRmUAUjW5/zQHbMaui//vQlsZcJKijZf3M26bnmLj8LyZUpj8/Rd6uzaek06OWsqdofN/Thenm5O8A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.53.1': + resolution: {integrity: sha512-RGlVipGhQAG4GxV1s34O91cxQ/vWiHJTDHbXRr0li2q/BGg3RR/7NM8QDWgkEgrwQYCvmJV9ichIwyoKCQ+DTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/utils@8.53.1': + resolution: {integrity: sha512-c4bMvGVWW4hv6JmDUEG7fSYlWOl3II2I4ylt0NM+seinYQlZMQIaKaXIIVJWt9Ofh6whrpM+EdDQXKXjNovvrg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/visitor-keys@8.53.1': + resolution: {integrity: sha512-oy+wV7xDKFPRyNggmXuZQSBzvoLnpmJs+GhzRhPjrxl2b/jIlyjVokzm47CZCDUdXKr2zd7ZLodPfOBpOPyPlg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript/analyze-trace@0.10.1': resolution: {integrity: sha512-RnlSOPh14QbopGCApgkSx5UBgGda5MX1cHqp2fsqfiDyCwGL/m1jaeB9fzu7didVS81LQqGZZuxFBcg8YU8EVw==} hasBin: true @@ -6459,6 +6499,12 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + ts-api-utils@2.4.0: + resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} @@ -9334,6 +9380,57 @@ snapshots: '@types/webxr@0.5.22': {} + '@typescript-eslint/project-service@8.53.1(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.53.1(typescript@5.9.3) + '@typescript-eslint/types': 8.53.1 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.53.1': + dependencies: + '@typescript-eslint/types': 8.53.1 + '@typescript-eslint/visitor-keys': 8.53.1 + + '@typescript-eslint/tsconfig-utils@8.53.1(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/types@8.53.1': {} + + '@typescript-eslint/typescript-estree@8.53.1(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.53.1(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.53.1(typescript@5.9.3) + '@typescript-eslint/types': 8.53.1 + '@typescript-eslint/visitor-keys': 8.53.1 + debug: 4.4.3 + minimatch: 9.0.5 + semver: 7.7.3 + tinyglobby: 0.2.15 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.53.1 + '@typescript-eslint/types': 8.53.1 + '@typescript-eslint/typescript-estree': 8.53.1(typescript@5.9.3) + eslint: 9.39.2(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.53.1': + dependencies: + '@typescript-eslint/types': 8.53.1 + eslint-visitor-keys: 4.2.1 + '@typescript/analyze-trace@0.10.1': dependencies: chalk: 4.1.2 @@ -13710,6 +13807,10 @@ snapshots: trough@2.2.0: {} + ts-api-utils@2.4.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + ts-interface-checker@0.1.13: {} ts-loader@9.5.4(typescript@5.9.3)(webpack@5.104.1): From d0b66514887013463b5d7c9301bde3da0812ed49 Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Thu, 22 Jan 2026 14:53:03 +0100 Subject: [PATCH 05/38] Add testing infrastructure --- packages/eslint-plugin/package.json | 6 +- .../eslint-plugin/src/rules/properNames.ts | 3 +- .../eslint-plugin/tests/properNames.test.ts | 14 ++ packages/eslint-plugin/tests/ruleTester.ts | 10 + packages/eslint-plugin/vitest.config.ts | 8 + pnpm-lock.yaml | 226 ++++++++++++++++++ 6 files changed, 265 insertions(+), 2 deletions(-) create mode 100644 packages/eslint-plugin/tests/properNames.test.ts create mode 100644 packages/eslint-plugin/tests/ruleTester.ts create mode 100644 packages/eslint-plugin/vitest.config.ts diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index 34a32dff52..7aaa8839dc 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -17,7 +17,11 @@ "license": "MIT", "packageManager": "pnpm@10.15.1", "devDependencies": { + "@typescript-eslint/parser": "^8.53.1", + "@typescript-eslint/rule-tester": "^8.53.1", "@typescript-eslint/utils": "^8.53.1", - "eslint": "^9.39.2" + "eslint": "^9.39.2", + "typescript": "^5.9.3", + "vitest": "^4.0.17" } } diff --git a/packages/eslint-plugin/src/rules/properNames.ts b/packages/eslint-plugin/src/rules/properNames.ts index 2953b6b13b..6f335af083 100644 --- a/packages/eslint-plugin/src/rules/properNames.ts +++ b/packages/eslint-plugin/src/rules/properNames.ts @@ -1,7 +1,8 @@ import { ESLintUtils } from "@typescript-eslint/utils"; const createRule = ESLintUtils.RuleCreator( - (name) => `https://typegpu.com/rules/${name}`, + // TODO: docs for lint rules + () => `https://docs.swmansion.com/TypeGPU/getting-started/`, ); export const properNames = createRule({ diff --git a/packages/eslint-plugin/tests/properNames.test.ts b/packages/eslint-plugin/tests/properNames.test.ts new file mode 100644 index 0000000000..a33a1b7974 --- /dev/null +++ b/packages/eslint-plugin/tests/properNames.test.ts @@ -0,0 +1,14 @@ +import { properNames } from "../src/rules/properNames.ts"; +import { ruleTester } from "./ruleTester.ts"; + +ruleTester.run("properNames", properNames, { + valid: ["const myNumber = 10;"], + invalid: [ + { + code: "const AAA = 10;", + errors: [ + { messageId: "badName", data: { name: "AAA" } }, + ], + }, + ], +}); diff --git a/packages/eslint-plugin/tests/ruleTester.ts b/packages/eslint-plugin/tests/ruleTester.ts new file mode 100644 index 0000000000..538dd92bdc --- /dev/null +++ b/packages/eslint-plugin/tests/ruleTester.ts @@ -0,0 +1,10 @@ +import { RuleTester } from "@typescript-eslint/rule-tester"; +import { afterAll, describe, it } from "vitest"; + +// RuleTester relies on global hooks for tests. +// Vitest doesn't make the hooks available globally, so we need to bind them. +RuleTester.describe = describe; +RuleTester.it = it; +RuleTester.afterAll = afterAll; + +export const ruleTester = new RuleTester(); diff --git a/packages/eslint-plugin/vitest.config.ts b/packages/eslint-plugin/vitest.config.ts new file mode 100644 index 0000000000..ba29bd1c7a --- /dev/null +++ b/packages/eslint-plugin/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + include: ["tests/**/*.test.ts"], + environment: "node", + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 81304ec01b..64f6371f35 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -368,12 +368,24 @@ importers: packages/eslint-plugin: devDependencies: + '@typescript-eslint/parser': + specifier: ^8.53.1 + version: 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/rule-tester': + specifier: ^8.53.1 + version: 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/utils': specifier: ^8.53.1 version: 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) eslint: specifier: ^9.39.2 version: 9.39.2(jiti@2.6.1) + typescript: + specifier: ^5.9.3 + version: 5.9.3 + vitest: + specifier: ^4.0.17 + version: 4.0.17(@types/node@24.10.0)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) packages/tgpu-dev-cli: dependencies: @@ -2617,6 +2629,9 @@ packages: '@stackblitz/sdk@1.11.0': resolution: {integrity: sha512-DFQGANNkEZRzFk1/rDP6TcFdM82ycHE+zfl9C/M/jXlH68jiqHWHFMQURLELoD8koxvu/eW5uhg94NSAZlYrUQ==} + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@swc/helpers@0.5.17': resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} @@ -2876,12 +2891,25 @@ packages: '@types/webxr@0.5.22': resolution: {integrity: sha512-Vr6Stjv5jPRqH690f5I5GLjVk8GSsoQSYJ2FVd/3jJF7KaqfwPi3ehfBS96mlQ2kPCwZaX6U0rG2+NGHBKkA/A==} + '@typescript-eslint/parser@8.53.1': + resolution: {integrity: sha512-nm3cvFN9SqZGXjmw5bZ6cGmvJSyJPn0wU9gHAZZHDnZl2wF9PhHv78Xf06E0MaNk4zLVHL8hb2/c32XvyJOLQg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/project-service@8.53.1': resolution: {integrity: sha512-WYC4FB5Ra0xidsmlPb+1SsnaSKPmS3gsjIARwbEkHkoWloQmuzcfypljaJcR78uyLA1h8sHdWWPHSLDI+MtNog==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/rule-tester@8.53.1': + resolution: {integrity: sha512-+Xn/2Wd3AxB4LD1AYVLSDNYMCjbFrZAwt0rYgS/KmT7DjJr/TRMXVtS4eK4Gje8r4XUdWbiR/akse6aVYgqcCA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + '@typescript-eslint/scope-manager@8.53.1': resolution: {integrity: sha512-Lu23yw1uJMFY8cUeq7JlrizAgeQvWugNQzJp8C3x8Eo5Jw5Q2ykMdiiTB9vBVOOUBysMzmRRmUfwFrZuI2C4SQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2964,6 +2992,9 @@ packages: '@vitest/expect@3.2.4': resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + '@vitest/expect@4.0.17': + resolution: {integrity: sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==} + '@vitest/mocker@3.2.4': resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} peerDependencies: @@ -2975,21 +3006,47 @@ packages: vite: optional: true + '@vitest/mocker@4.0.17': + resolution: {integrity: sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + '@vitest/pretty-format@3.2.4': resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + '@vitest/pretty-format@4.0.17': + resolution: {integrity: sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==} + '@vitest/runner@3.2.4': resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + '@vitest/runner@4.0.17': + resolution: {integrity: sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==} + '@vitest/snapshot@3.2.4': resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + '@vitest/snapshot@4.0.17': + resolution: {integrity: sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==} + '@vitest/spy@3.2.4': resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@vitest/spy@4.0.17': + resolution: {integrity: sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==} + '@vitest/utils@3.2.4': resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@vitest/utils@4.0.17': + resolution: {integrity: sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==} + '@volar/kit@2.4.11': resolution: {integrity: sha512-ups5RKbMzMCr6RKafcCqDRnJhJDNWqo2vfekwOAj6psZ15v5TlcQFQAyokQJ3wZxVkzxrQM+TqTRDENfQEXpmA==} peerDependencies: @@ -3399,6 +3456,10 @@ packages: resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} engines: {node: '>=12'} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -4097,6 +4158,10 @@ packages: resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} engines: {node: '>=12.0.0'} + expect-type@1.3.0: + resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + engines: {node: '>=12.0.0'} + expressive-code-twoslash@0.5.3: resolution: {integrity: sha512-BcttA3taicvhesKpQ4TvRxoDHByDr2FH6bvjc6elxC8TXVU3GVZv0wHvdcNz9xrVEUcwbDbsprqsGF7M7Yq59A==} peerDependencies: @@ -6245,6 +6310,9 @@ packages: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + std-env@3.9.0: resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} @@ -6435,6 +6503,10 @@ packages: tinyexec@1.0.1: resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} + tinyglobby@0.2.12: resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} engines: {node: '>=12.0.0'} @@ -6451,6 +6523,10 @@ packages: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + engines: {node: '>=14.0.0'} + tinyspy@4.0.3: resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} engines: {node: '>=14.0.0'} @@ -6956,6 +7032,40 @@ packages: jsdom: optional: true + vitest@4.0.17: + resolution: {integrity: sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.0.17 + '@vitest/browser-preview': 4.0.17 + '@vitest/browser-webdriverio': 4.0.17 + '@vitest/ui': 4.0.17 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + volar-service-css@0.0.62: resolution: {integrity: sha512-JwNyKsH3F8PuzZYuqPf+2e+4CTU8YoyUHEHVnoXNlrLe7wy9U3biomZ56llN69Ris7TTy/+DEX41yVxQpM4qvg==} peerDependencies: @@ -9117,6 +9227,8 @@ snapshots: '@stackblitz/sdk@1.11.0': {} + '@standard-schema/spec@1.1.0': {} + '@swc/helpers@0.5.17': dependencies: tslib: 2.8.1 @@ -9380,6 +9492,18 @@ snapshots: '@types/webxr@0.5.22': {} + '@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.53.1 + '@typescript-eslint/types': 8.53.1 + '@typescript-eslint/typescript-estree': 8.53.1(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.53.1 + debug: 4.4.3 + eslint: 9.39.2(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/project-service@8.53.1(typescript@5.9.3)': dependencies: '@typescript-eslint/tsconfig-utils': 8.53.1(typescript@5.9.3) @@ -9389,6 +9513,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/rule-tester@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/parser': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.53.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + ajv: 6.12.6 + eslint: 9.39.2(jiti@2.6.1) + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + semver: 7.7.3 + transitivePeerDependencies: + - supports-color + - typescript + '@typescript-eslint/scope-manager@8.53.1': dependencies: '@typescript-eslint/types': 8.53.1 @@ -9530,6 +9668,15 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 + '@vitest/expect@4.0.17': + dependencies: + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.2 + '@vitest/spy': 4.0.17 + '@vitest/utils': 4.0.17 + chai: 6.2.2 + tinyrainbow: 3.0.3 + '@vitest/mocker@3.2.4(msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3))(vite@6.3.6(@types/node@24.10.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 @@ -9548,32 +9695,63 @@ snapshots: msw: 2.10.2(@types/node@24.10.0)(typescript@5.9.3) vite: 6.3.6(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + '@vitest/mocker@4.0.17(msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3))(vite@6.3.6(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + '@vitest/spy': 4.0.17 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + msw: 2.10.2(@types/node@24.10.0)(typescript@5.9.3) + vite: 6.3.6(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 + '@vitest/pretty-format@4.0.17': + dependencies: + tinyrainbow: 3.0.3 + '@vitest/runner@3.2.4': dependencies: '@vitest/utils': 3.2.4 pathe: 2.0.3 strip-literal: 3.0.0 + '@vitest/runner@4.0.17': + dependencies: + '@vitest/utils': 4.0.17 + pathe: 2.0.3 + '@vitest/snapshot@3.2.4': dependencies: '@vitest/pretty-format': 3.2.4 magic-string: 0.30.19 pathe: 2.0.3 + '@vitest/snapshot@4.0.17': + dependencies: + '@vitest/pretty-format': 4.0.17 + magic-string: 0.30.21 + pathe: 2.0.3 + '@vitest/spy@3.2.4': dependencies: tinyspy: 4.0.3 + '@vitest/spy@4.0.17': {} + '@vitest/utils@3.2.4': dependencies: '@vitest/pretty-format': 3.2.4 loupe: 3.1.4 tinyrainbow: 2.0.0 + '@vitest/utils@4.0.17': + dependencies: + '@vitest/pretty-format': 4.0.17 + tinyrainbow: 3.0.3 + '@volar/kit@2.4.11(typescript@5.9.3)': dependencies: '@volar/language-service': 2.4.11 @@ -10125,6 +10303,8 @@ snapshots: loupe: 3.1.4 pathval: 2.0.0 + chai@6.2.2: {} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -10878,6 +11058,8 @@ snapshots: expect-type@1.2.1: {} + expect-type@1.3.0: {} + expressive-code-twoslash@0.5.3(@expressive-code/core@0.41.2)(expressive-code@0.41.2)(typescript@5.9.3): dependencies: '@expressive-code/core': 0.41.2 @@ -13552,6 +13734,8 @@ snapshots: statuses@2.0.2: optional: true + std-env@3.10.0: {} + std-env@3.9.0: {} stream-replace-string@2.0.0: {} @@ -13751,6 +13935,8 @@ snapshots: tinyexec@1.0.1: {} + tinyexec@1.0.2: {} + tinyglobby@0.2.12: dependencies: fdir: 6.4.3(picomatch@4.0.3) @@ -13765,6 +13951,8 @@ snapshots: tinyrainbow@2.0.0: {} + tinyrainbow@3.0.3: {} + tinyspy@4.0.3: {} tldts-core@7.0.16: {} @@ -14395,6 +14583,44 @@ snapshots: - tsx - yaml + vitest@4.0.17(@types/node@24.10.0)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): + dependencies: + '@vitest/expect': 4.0.17 + '@vitest/mocker': 4.0.17(msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3))(vite@6.3.6(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/pretty-format': 4.0.17 + '@vitest/runner': 4.0.17 + '@vitest/snapshot': 4.0.17 + '@vitest/spy': 4.0.17 + '@vitest/utils': 4.0.17 + es-module-lexer: 1.7.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.1 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: 6.3.6(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 24.10.0 + jsdom: 27.0.0(canvas@3.2.0)(postcss@8.5.6) + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + volar-service-css@0.0.62(@volar/language-service@2.4.11): dependencies: vscode-css-languageservice: 6.3.2 From bb433b8138089365d3c172a69d4180a19edc5a14 Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Thu, 22 Jan 2026 15:46:43 +0100 Subject: [PATCH 06/38] Add a proper rule --- packages/eslint-plugin/src/ruleCreator.ts | 6 ++ .../src/rules/integerDivision.ts | 55 +++++++++++++++++++ .../eslint-plugin/src/rules/properNames.ts | 7 +-- .../tests/integerDivision.test.ts | 24 ++++++++ 4 files changed, 86 insertions(+), 6 deletions(-) create mode 100644 packages/eslint-plugin/src/ruleCreator.ts create mode 100644 packages/eslint-plugin/src/rules/integerDivision.ts create mode 100644 packages/eslint-plugin/tests/integerDivision.test.ts diff --git a/packages/eslint-plugin/src/ruleCreator.ts b/packages/eslint-plugin/src/ruleCreator.ts new file mode 100644 index 0000000000..c6ccdff90c --- /dev/null +++ b/packages/eslint-plugin/src/ruleCreator.ts @@ -0,0 +1,6 @@ +import { ESLintUtils } from "@typescript-eslint/utils"; + +export const createRule = ESLintUtils.RuleCreator( + // TODO: docs for lint rules + () => `https://docs.swmansion.com/TypeGPU/getting-started/`, +); diff --git a/packages/eslint-plugin/src/rules/integerDivision.ts b/packages/eslint-plugin/src/rules/integerDivision.ts new file mode 100644 index 0000000000..50292d7124 --- /dev/null +++ b/packages/eslint-plugin/src/rules/integerDivision.ts @@ -0,0 +1,55 @@ +import type { TSESTree } from "@typescript-eslint/utils"; +import { createRule } from "../ruleCreator.ts"; + +/** + * Checks if a node is a call expression to an integer cast function (i32 or u32). + * + * @example + * hasIntCasts('d.u32()'); // true + * hasIntCasts('i32()'); // true + * hasIntCasts('f32()'); // false + */ +function hasIntCasts(node: TSESTree.Expression): boolean { + if (node.type !== "CallExpression") { + return false; + } + + let callee: TSESTree.Node = node.callee; + while (callee.type === "MemberExpression") { + callee = callee.property; + } + + return callee.type === "Identifier" && ["i32", "u32"].includes(callee.name); +} + +export const integerDivision = createRule({ + name: "integer-division", + meta: { + type: "suggestion", + docs: { description: `Avoid dividing numbers wrapped in 'u32' and 'i32'.` }, + messages: { + intDiv: + "'{{node}}' will result in floating point values. To perform integer division, wrap the result in 'd.u32' or 'd.i32' instead.", + }, + schema: [], + }, + defaultOptions: [], + + create(context) { + return { + BinaryExpression(node) { + if (node.operator !== "/") { + return; + } + + if (hasIntCasts(node.left) && hasIntCasts(node.right)) { + context.report({ + node: node, + messageId: "intDiv", + data: { node: context.sourceCode.getText(node) }, + }); + } + }, + }; + }, +}); diff --git a/packages/eslint-plugin/src/rules/properNames.ts b/packages/eslint-plugin/src/rules/properNames.ts index 6f335af083..a28c1b9442 100644 --- a/packages/eslint-plugin/src/rules/properNames.ts +++ b/packages/eslint-plugin/src/rules/properNames.ts @@ -1,9 +1,4 @@ -import { ESLintUtils } from "@typescript-eslint/utils"; - -const createRule = ESLintUtils.RuleCreator( - // TODO: docs for lint rules - () => `https://docs.swmansion.com/TypeGPU/getting-started/`, -); +import { createRule } from "./ruleCreator.ts"; export const properNames = createRule({ name: "proper-names", diff --git a/packages/eslint-plugin/tests/integerDivision.test.ts b/packages/eslint-plugin/tests/integerDivision.test.ts new file mode 100644 index 0000000000..8a49d2a259 --- /dev/null +++ b/packages/eslint-plugin/tests/integerDivision.test.ts @@ -0,0 +1,24 @@ +import { integerDivision } from "../src/rules/integerDivision.ts"; +import { ruleTester } from "./ruleTester.ts"; + +ruleTester.run("integerDivision", integerDivision, { + valid: [ + "1 / 2", + "d.u32(1) / 2", + "1 / d.u32(2)", + ], + invalid: [ + { + code: "d.u32(1) / d.u32(2)", + errors: [ + { messageId: "intDiv", data: { node: "d.u32(1) / d.u32(2)" } }, + ], + }, + { + code: "d.i32(1) / d.i32(2)", + errors: [ + { messageId: "intDiv", data: { node: "d.i32(1) / d.i32(2)" } }, + ], + }, + ], +}); From dfbadddcf83ba2b8243acc8e2ac2f3410a461025 Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Thu, 22 Jan 2026 15:47:46 +0100 Subject: [PATCH 07/38] Remove the dummy rule --- packages/eslint-plugin/src/index.ts | 4 +-- .../eslint-plugin/src/rules/properNames.ts | 32 ------------------- .../eslint-plugin/tests/properNames.test.ts | 14 -------- 3 files changed, 2 insertions(+), 48 deletions(-) delete mode 100644 packages/eslint-plugin/src/rules/properNames.ts delete mode 100644 packages/eslint-plugin/tests/properNames.test.ts diff --git a/packages/eslint-plugin/src/index.ts b/packages/eslint-plugin/src/index.ts index 86a35d7ff5..29c6cb1258 100644 --- a/packages/eslint-plugin/src/index.ts +++ b/packages/eslint-plugin/src/index.ts @@ -1,5 +1,5 @@ import fs from "node:fs"; -import { properNames } from "./rules/properNames.ts"; +import { integerDivision } from "./rules/integerDivision.ts"; const pkg = JSON.parse( fs.readFileSync(new URL("./package.json", import.meta.url), "utf8"), @@ -11,7 +11,7 @@ const plugin = { version: pkg.version, }, rules: { - "proper-names": properNames, + "integer-division": integerDivision, }, }; diff --git a/packages/eslint-plugin/src/rules/properNames.ts b/packages/eslint-plugin/src/rules/properNames.ts deleted file mode 100644 index a28c1b9442..0000000000 --- a/packages/eslint-plugin/src/rules/properNames.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { createRule } from "./ruleCreator.ts"; - -export const properNames = createRule({ - name: "proper-names", - meta: { - type: "suggestion", - docs: { description: 'Enforce that no variables are named "AAA".' }, - messages: { badName: "Variable '{{name}}' has invalid name." }, - schema: [], - }, - defaultOptions: [], - - create(context) { - return { - VariableDeclarator(node) { - if (node.id.type !== "Identifier") { - return; - } - - const name = node.id.name; - - if (name === "AAA") { - context.report({ - node: node.id, - messageId: "badName", - data: { name }, - }); - } - }, - }; - }, -}); diff --git a/packages/eslint-plugin/tests/properNames.test.ts b/packages/eslint-plugin/tests/properNames.test.ts deleted file mode 100644 index a33a1b7974..0000000000 --- a/packages/eslint-plugin/tests/properNames.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { properNames } from "../src/rules/properNames.ts"; -import { ruleTester } from "./ruleTester.ts"; - -ruleTester.run("properNames", properNames, { - valid: ["const myNumber = 10;"], - invalid: [ - { - code: "const AAA = 10;", - errors: [ - { messageId: "badName", data: { name: "AAA" } }, - ], - }, - ], -}); From 4eead5a4ab6a8b50f09be1815e4cb01b9eac0100 Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Thu, 22 Jan 2026 15:49:37 +0100 Subject: [PATCH 08/38] Add a readme stub --- packages/eslint-plugin/README.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 packages/eslint-plugin/README.md diff --git a/packages/eslint-plugin/README.md b/packages/eslint-plugin/README.md new file mode 100644 index 0000000000..7dd857c15d --- /dev/null +++ b/packages/eslint-plugin/README.md @@ -0,0 +1,8 @@ +
+ +# eslint-plugin-typegpu + +🚧 **Under Construction** 🚧 - +[GitHub](https://github.com/software-mansion/TypeGPU/tree/main/packages/eslint-plugin) + +
From 19bbcd75e00b3041273a19b91fa4022fe3fcffd0 Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Thu, 22 Jan 2026 15:50:26 +0100 Subject: [PATCH 09/38] Add formatting --- packages/eslint-plugin/deno.json | 7 +++++++ packages/eslint-plugin/src/index.ts | 8 ++++---- packages/eslint-plugin/src/ruleCreator.ts | 2 +- .../src/rules/integerDivision.ts | 18 ++++++++--------- .../tests/integerDivision.test.ts | 20 +++++++++---------- packages/eslint-plugin/tests/ruleTester.ts | 4 ++-- packages/eslint-plugin/tsup.config.ts | 6 +++--- packages/eslint-plugin/vitest.config.ts | 6 +++--- 8 files changed, 39 insertions(+), 32 deletions(-) create mode 100644 packages/eslint-plugin/deno.json diff --git a/packages/eslint-plugin/deno.json b/packages/eslint-plugin/deno.json new file mode 100644 index 0000000000..66699a4b54 --- /dev/null +++ b/packages/eslint-plugin/deno.json @@ -0,0 +1,7 @@ +{ + "exclude": ["."], + "fmt": { + "exclude": ["!."], + "singleQuote": true + } +} diff --git a/packages/eslint-plugin/src/index.ts b/packages/eslint-plugin/src/index.ts index 29c6cb1258..411f0ee55f 100644 --- a/packages/eslint-plugin/src/index.ts +++ b/packages/eslint-plugin/src/index.ts @@ -1,8 +1,8 @@ -import fs from "node:fs"; -import { integerDivision } from "./rules/integerDivision.ts"; +import fs from 'node:fs'; +import { integerDivision } from './rules/integerDivision.ts'; const pkg = JSON.parse( - fs.readFileSync(new URL("./package.json", import.meta.url), "utf8"), + fs.readFileSync(new URL('./package.json', import.meta.url), 'utf8'), ); const plugin = { @@ -11,7 +11,7 @@ const plugin = { version: pkg.version, }, rules: { - "integer-division": integerDivision, + 'integer-division': integerDivision, }, }; diff --git a/packages/eslint-plugin/src/ruleCreator.ts b/packages/eslint-plugin/src/ruleCreator.ts index c6ccdff90c..6d07477ffc 100644 --- a/packages/eslint-plugin/src/ruleCreator.ts +++ b/packages/eslint-plugin/src/ruleCreator.ts @@ -1,4 +1,4 @@ -import { ESLintUtils } from "@typescript-eslint/utils"; +import { ESLintUtils } from '@typescript-eslint/utils'; export const createRule = ESLintUtils.RuleCreator( // TODO: docs for lint rules diff --git a/packages/eslint-plugin/src/rules/integerDivision.ts b/packages/eslint-plugin/src/rules/integerDivision.ts index 50292d7124..7192353ed1 100644 --- a/packages/eslint-plugin/src/rules/integerDivision.ts +++ b/packages/eslint-plugin/src/rules/integerDivision.ts @@ -1,5 +1,5 @@ -import type { TSESTree } from "@typescript-eslint/utils"; -import { createRule } from "../ruleCreator.ts"; +import type { TSESTree } from '@typescript-eslint/utils'; +import { createRule } from '../ruleCreator.ts'; /** * Checks if a node is a call expression to an integer cast function (i32 or u32). @@ -10,22 +10,22 @@ import { createRule } from "../ruleCreator.ts"; * hasIntCasts('f32()'); // false */ function hasIntCasts(node: TSESTree.Expression): boolean { - if (node.type !== "CallExpression") { + if (node.type !== 'CallExpression') { return false; } let callee: TSESTree.Node = node.callee; - while (callee.type === "MemberExpression") { + while (callee.type === 'MemberExpression') { callee = callee.property; } - return callee.type === "Identifier" && ["i32", "u32"].includes(callee.name); + return callee.type === 'Identifier' && ['i32', 'u32'].includes(callee.name); } export const integerDivision = createRule({ - name: "integer-division", + name: 'integer-division', meta: { - type: "suggestion", + type: 'suggestion', docs: { description: `Avoid dividing numbers wrapped in 'u32' and 'i32'.` }, messages: { intDiv: @@ -38,14 +38,14 @@ export const integerDivision = createRule({ create(context) { return { BinaryExpression(node) { - if (node.operator !== "/") { + if (node.operator !== '/') { return; } if (hasIntCasts(node.left) && hasIntCasts(node.right)) { context.report({ node: node, - messageId: "intDiv", + messageId: 'intDiv', data: { node: context.sourceCode.getText(node) }, }); } diff --git a/packages/eslint-plugin/tests/integerDivision.test.ts b/packages/eslint-plugin/tests/integerDivision.test.ts index 8a49d2a259..02e8c6333d 100644 --- a/packages/eslint-plugin/tests/integerDivision.test.ts +++ b/packages/eslint-plugin/tests/integerDivision.test.ts @@ -1,23 +1,23 @@ -import { integerDivision } from "../src/rules/integerDivision.ts"; -import { ruleTester } from "./ruleTester.ts"; +import { integerDivision } from '../src/rules/integerDivision.ts'; +import { ruleTester } from './ruleTester.ts'; -ruleTester.run("integerDivision", integerDivision, { +ruleTester.run('integerDivision', integerDivision, { valid: [ - "1 / 2", - "d.u32(1) / 2", - "1 / d.u32(2)", + '1 / 2', + 'd.u32(1) / 2', + '1 / d.u32(2)', ], invalid: [ { - code: "d.u32(1) / d.u32(2)", + code: 'd.u32(1) / d.u32(2)', errors: [ - { messageId: "intDiv", data: { node: "d.u32(1) / d.u32(2)" } }, + { messageId: 'intDiv', data: { node: 'd.u32(1) / d.u32(2)' } }, ], }, { - code: "d.i32(1) / d.i32(2)", + code: 'd.i32(1) / d.i32(2)', errors: [ - { messageId: "intDiv", data: { node: "d.i32(1) / d.i32(2)" } }, + { messageId: 'intDiv', data: { node: 'd.i32(1) / d.i32(2)' } }, ], }, ], diff --git a/packages/eslint-plugin/tests/ruleTester.ts b/packages/eslint-plugin/tests/ruleTester.ts index 538dd92bdc..3efee657d3 100644 --- a/packages/eslint-plugin/tests/ruleTester.ts +++ b/packages/eslint-plugin/tests/ruleTester.ts @@ -1,5 +1,5 @@ -import { RuleTester } from "@typescript-eslint/rule-tester"; -import { afterAll, describe, it } from "vitest"; +import { RuleTester } from '@typescript-eslint/rule-tester'; +import { afterAll, describe, it } from 'vitest'; // RuleTester relies on global hooks for tests. // Vitest doesn't make the hooks available globally, so we need to bind them. diff --git a/packages/eslint-plugin/tsup.config.ts b/packages/eslint-plugin/tsup.config.ts index 9ed03697f4..a829547b55 100644 --- a/packages/eslint-plugin/tsup.config.ts +++ b/packages/eslint-plugin/tsup.config.ts @@ -1,8 +1,8 @@ -import { defineConfig, type Options } from "tsup"; +import { defineConfig, type Options } from 'tsup'; const config: Options = { - entry: ["src/index.ts"], - format: ["cjs", "esm"], + entry: ['src/index.ts'], + format: ['cjs', 'esm'], dts: true, clean: true, splitting: true, diff --git a/packages/eslint-plugin/vitest.config.ts b/packages/eslint-plugin/vitest.config.ts index ba29bd1c7a..b0e95a5a89 100644 --- a/packages/eslint-plugin/vitest.config.ts +++ b/packages/eslint-plugin/vitest.config.ts @@ -1,8 +1,8 @@ -import { defineConfig } from "vitest/config"; +import { defineConfig } from 'vitest/config'; export default defineConfig({ test: { - include: ["tests/**/*.test.ts"], - environment: "node", + include: ['tests/**/*.test.ts'], + environment: 'node', }, }); From 0ec6db1ef6dae4ecf04b36199afa6162aca6f634 Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Thu, 22 Jan 2026 15:56:07 +0100 Subject: [PATCH 10/38] Check for a cast in parent --- packages/eslint-plugin/src/rules/integerDivision.ts | 4 ++++ packages/eslint-plugin/tests/integerDivision.test.ts | 1 + 2 files changed, 5 insertions(+) diff --git a/packages/eslint-plugin/src/rules/integerDivision.ts b/packages/eslint-plugin/src/rules/integerDivision.ts index 7192353ed1..cf6983f885 100644 --- a/packages/eslint-plugin/src/rules/integerDivision.ts +++ b/packages/eslint-plugin/src/rules/integerDivision.ts @@ -42,6 +42,10 @@ export const integerDivision = createRule({ return; } + if (node.parent.type === 'CallExpression' && hasIntCasts(node.parent)) { + return; + } + if (hasIntCasts(node.left) && hasIntCasts(node.right)) { context.report({ node: node, diff --git a/packages/eslint-plugin/tests/integerDivision.test.ts b/packages/eslint-plugin/tests/integerDivision.test.ts index 02e8c6333d..07627dc83b 100644 --- a/packages/eslint-plugin/tests/integerDivision.test.ts +++ b/packages/eslint-plugin/tests/integerDivision.test.ts @@ -6,6 +6,7 @@ ruleTester.run('integerDivision', integerDivision, { '1 / 2', 'd.u32(1) / 2', '1 / d.u32(2)', + 'd.u32(d.u32(1) / d.u32(2))', ], invalid: [ { From 6712b4bd2c090f54fac9fc6e04672efd32b9a71c Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Thu, 22 Jan 2026 16:26:42 +0100 Subject: [PATCH 11/38] Review fixes --- packages/eslint-plugin/src/index.ts | 18 +++++-- .../src/rules/integerDivision.ts | 53 ++++++++++--------- .../tests/integerDivision.test.ts | 4 +- 3 files changed, 43 insertions(+), 32 deletions(-) diff --git a/packages/eslint-plugin/src/index.ts b/packages/eslint-plugin/src/index.ts index 411f0ee55f..79dffddd5e 100644 --- a/packages/eslint-plugin/src/index.ts +++ b/packages/eslint-plugin/src/index.ts @@ -2,17 +2,27 @@ import fs from 'node:fs'; import { integerDivision } from './rules/integerDivision.ts'; const pkg = JSON.parse( - fs.readFileSync(new URL('./package.json', import.meta.url), 'utf8'), + fs.readFileSync(new URL('../package.json', import.meta.url), 'utf8'), ); +const rules = { + 'integer-division': integerDivision, +}; + +// const recommendedRules = { +// 'typegpu/proper-buffer-names': 'error', +// }; + +// const allRules = Object.fromEntries( +// Object.keys(rules).map((name) => [`typegpu/${name}`, 'error']), +// ); + const plugin = { meta: { name: pkg.name, version: pkg.version, }, - rules: { - 'integer-division': integerDivision, - }, + rules, }; export default plugin; diff --git a/packages/eslint-plugin/src/rules/integerDivision.ts b/packages/eslint-plugin/src/rules/integerDivision.ts index cf6983f885..65d88abb2a 100644 --- a/packages/eslint-plugin/src/rules/integerDivision.ts +++ b/packages/eslint-plugin/src/rules/integerDivision.ts @@ -1,27 +1,6 @@ import type { TSESTree } from '@typescript-eslint/utils'; import { createRule } from '../ruleCreator.ts'; -/** - * Checks if a node is a call expression to an integer cast function (i32 or u32). - * - * @example - * hasIntCasts('d.u32()'); // true - * hasIntCasts('i32()'); // true - * hasIntCasts('f32()'); // false - */ -function hasIntCasts(node: TSESTree.Expression): boolean { - if (node.type !== 'CallExpression') { - return false; - } - - let callee: TSESTree.Node = node.callee; - while (callee.type === 'MemberExpression') { - callee = callee.property; - } - - return callee.type === 'Identifier' && ['i32', 'u32'].includes(callee.name); -} - export const integerDivision = createRule({ name: 'integer-division', meta: { @@ -29,7 +8,7 @@ export const integerDivision = createRule({ docs: { description: `Avoid dividing numbers wrapped in 'u32' and 'i32'.` }, messages: { intDiv: - "'{{node}}' will result in floating point values. To perform integer division, wrap the result in 'd.u32' or 'd.i32' instead.", + "'{{snippet}}' might result in floating point values. To perform integer division, wrap the result in 'd.u32' or 'd.i32' instead.", }, schema: [], }, @@ -42,18 +21,40 @@ export const integerDivision = createRule({ return; } - if (node.parent.type === 'CallExpression' && hasIntCasts(node.parent)) { + if (node.parent?.type === 'CallExpression' && isIntCasts(node.parent)) { return; } - if (hasIntCasts(node.left) && hasIntCasts(node.right)) { + if (isIntCasts(node.left) && isIntCasts(node.right)) { context.report({ - node: node, + node, messageId: 'intDiv', - data: { node: context.sourceCode.getText(node) }, + data: { snippet: context.sourceCode.getText(node) }, }); } }, }; }, }); + +/** + * Checks if a node is a call expression to an integer cast function (i32 or u32). + * + * @example + * // for simplicity, using code snippets instead of ASTs + * isIntCasts('d.u32()'); // true + * isIntCasts('i32()'); // true + * isIntCasts('f32()'); // false + */ +function isIntCasts(node: TSESTree.Expression): boolean { + if (node.type !== 'CallExpression') { + return false; + } + + let callee: TSESTree.Node = node.callee; + while (callee.type === 'MemberExpression') { + callee = callee.property; + } + + return callee.type === 'Identifier' && ['i32', 'u32'].includes(callee.name); +} diff --git a/packages/eslint-plugin/tests/integerDivision.test.ts b/packages/eslint-plugin/tests/integerDivision.test.ts index 07627dc83b..c9742b22f0 100644 --- a/packages/eslint-plugin/tests/integerDivision.test.ts +++ b/packages/eslint-plugin/tests/integerDivision.test.ts @@ -12,13 +12,13 @@ ruleTester.run('integerDivision', integerDivision, { { code: 'd.u32(1) / d.u32(2)', errors: [ - { messageId: 'intDiv', data: { node: 'd.u32(1) / d.u32(2)' } }, + { messageId: 'intDiv', data: { snippet: 'd.u32(1) / d.u32(2)' } }, ], }, { code: 'd.i32(1) / d.i32(2)', errors: [ - { messageId: 'intDiv', data: { node: 'd.i32(1) / d.i32(2)' } }, + { messageId: 'intDiv', data: { snippet: 'd.i32(1) / d.i32(2)' } }, ], }, ], From 320563bbffe58af172fbe2a117cfa4cafe960366 Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Fri, 23 Jan 2026 10:21:59 +0100 Subject: [PATCH 12/38] Add a describe to please vitest gods --- .../tests/integerDivision.test.ts | 45 ++++++++++--------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/packages/eslint-plugin/tests/integerDivision.test.ts b/packages/eslint-plugin/tests/integerDivision.test.ts index c9742b22f0..4df6b8c7e4 100644 --- a/packages/eslint-plugin/tests/integerDivision.test.ts +++ b/packages/eslint-plugin/tests/integerDivision.test.ts @@ -1,25 +1,28 @@ +import { describe } from 'vitest'; import { integerDivision } from '../src/rules/integerDivision.ts'; import { ruleTester } from './ruleTester.ts'; -ruleTester.run('integerDivision', integerDivision, { - valid: [ - '1 / 2', - 'd.u32(1) / 2', - '1 / d.u32(2)', - 'd.u32(d.u32(1) / d.u32(2))', - ], - invalid: [ - { - code: 'd.u32(1) / d.u32(2)', - errors: [ - { messageId: 'intDiv', data: { snippet: 'd.u32(1) / d.u32(2)' } }, - ], - }, - { - code: 'd.i32(1) / d.i32(2)', - errors: [ - { messageId: 'intDiv', data: { snippet: 'd.i32(1) / d.i32(2)' } }, - ], - }, - ], +describe('integerDivision', () => { + ruleTester.run('integerDivision', integerDivision, { + valid: [ + '1 / 2', + 'd.u32(1) / 2', + '1 / d.u32(2)', + 'd.u32(d.u32(1) / d.u32(2))', + ], + invalid: [ + { + code: 'd.u32(1) / d.u32(2)', + errors: [ + { messageId: 'intDiv', data: { snippet: 'd.u32(1) / d.u32(2)' } }, + ], + }, + { + code: 'd.i32(1) / d.i32(2)', + errors: [ + { messageId: 'intDiv', data: { snippet: 'd.i32(1) / d.i32(2)' } }, + ], + }, + ], + }); }); From b5d3a2144957cd748600949a00254eccdb6ea620 Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Fri, 23 Jan 2026 10:30:16 +0100 Subject: [PATCH 13/38] Add configuration for test:types --- packages/eslint-plugin/package.json | 1 + packages/eslint-plugin/tsconfig.json | 5 +++++ 2 files changed, 6 insertions(+) create mode 100644 packages/eslint-plugin/tsconfig.json diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index 7aaa8839dc..a56afdf246 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -11,6 +11,7 @@ }, "scripts": { "build": "tsup", + "test:types": "pnpm tsc --p ./tsconfig.json --noEmit", "test": "vitest" }, "sideEffects": false, diff --git a/packages/eslint-plugin/tsconfig.json b/packages/eslint-plugin/tsconfig.json new file mode 100644 index 0000000000..48f7eb54e6 --- /dev/null +++ b/packages/eslint-plugin/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "../../tsconfig.base.json", + "include": ["src/**/*", "test/**/*"], + "exclude": ["node_modules", "dist"] +} From c25556256a04c7f76e4f92567fa10ad8c43791e3 Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Fri, 23 Jan 2026 11:37:27 +0100 Subject: [PATCH 14/38] Increase old size limit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index da51a5f4ee..01c7d29c98 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "test:circular-deps": "pnpm dpdm -T --exit-code circular:1 packages/**/index.ts", "test:types": "pnpm run -r --parallel test:types", "test:style": "biome lint . && deno fmt --check", - "test:unit-and-attest": "vitest run --project=!browser", + "test:unit-and-attest": "NODE_OPTIONS='--max-old-space-size=8192' vitest run --project=!browser", "test:unit": "ATTEST_skipTypes=1 vitest run --project=!browser", "test:unit:watch": "ATTEST_skipTypes=1 vitest --project=!browser", "test:browser": "vitest run --browser.enabled --project browser", From ea990e64c69d69c183718829a3c917fa20744b3d Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Fri, 23 Jan 2026 11:52:37 +0100 Subject: [PATCH 15/38] Bump attest --- package.json | 2 +- packages/typegpu/package.json | 2 +- pnpm-lock.yaml | 50 +++++++++++++++++++++++++++-------- 3 files changed, 41 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 01c7d29c98..da51a5f4ee 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "test:circular-deps": "pnpm dpdm -T --exit-code circular:1 packages/**/index.ts", "test:types": "pnpm run -r --parallel test:types", "test:style": "biome lint . && deno fmt --check", - "test:unit-and-attest": "NODE_OPTIONS='--max-old-space-size=8192' vitest run --project=!browser", + "test:unit-and-attest": "vitest run --project=!browser", "test:unit": "ATTEST_skipTypes=1 vitest run --project=!browser", "test:unit:watch": "ATTEST_skipTypes=1 vitest --project=!browser", "test:browser": "vitest run --browser.enabled --project browser", diff --git a/packages/typegpu/package.json b/packages/typegpu/package.json index 9f962c24ab..f3e3d833ff 100644 --- a/packages/typegpu/package.json +++ b/packages/typegpu/package.json @@ -65,7 +65,7 @@ }, "homepage": "https://typegpu.com", "devDependencies": { - "@ark/attest": "^0.53.0", + "@ark/attest": "^0.56.0", "@typegpu/tgpu-dev-cli": "workspace:*", "@webgpu/types": "catalog:types", "arktype": "catalog:", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 64f6371f35..6446e4d8e2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -520,8 +520,8 @@ importers: version: 4.3.2 devDependencies: '@ark/attest': - specifier: ^0.53.0 - version: 0.53.0(typescript@5.9.3) + specifier: ^0.56.0 + version: 0.56.0(typescript@5.9.3) '@typegpu/tgpu-dev-cli': specifier: workspace:* version: link:../tgpu-dev-cli @@ -751,21 +751,27 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@ark/attest@0.53.0': - resolution: {integrity: sha512-ZY5FKpa0wuHkonwSnuzWnoYupdJU+xVzzD5D2ARC2pKapXm5bPc303YK6QQ69fkRVne33Mx9ktM5OGzYQqqduQ==} + '@ark/attest@0.56.0': + resolution: {integrity: sha512-Pngs8f1UJiWbeO8LKVdyBL0K3rT/PDVACR7TPyCEULNcN8V1rVec6dKvUnQVpQSj60p4ejlK6dKs+fQoqdUMqA==} hasBin: true peerDependencies: typescript: '*' - '@ark/fs@0.53.0': - resolution: {integrity: sha512-XL0EbBAZgyy+j9aPhftYaBsbKAW5PTNSKCN6oLRRdrHuHPSAZgR6765/z0YZGhPxHEUNmq0vBoSk8yOLk91dNQ==} + '@ark/fs@0.56.0': + resolution: {integrity: sha512-zY/wDDhcvmt6/upQwZM766PAnvIzdEMcgydUGd9pqY9FMGNo9I9uE4RYAfms9AeUUtbZJu2h2Ua0tvFsO5XF4Q==} '@ark/schema@0.53.0': resolution: {integrity: sha512-1PB7RThUiTlmIu8jbSurPrhHpVixPd4C+xNBUF/HrjIENCeDcAMg36n5mpMzED7OQGDVIzpfXXiMnaTiutjHJw==} + '@ark/schema@0.56.0': + resolution: {integrity: sha512-ECg3hox/6Z/nLajxXqNhgPtNdHWC9zNsDyskwO28WinoFEnWow4IsERNz9AnXRhTZJnYIlAJ4uGn3nlLk65vZA==} + '@ark/util@0.53.0': resolution: {integrity: sha512-TGn4gLlA6dJcQiqrtCtd88JhGb2XBHo6qIejsDre+nxpGuUVW4G3YZGVrwjNBTO0EyR+ykzIo4joHJzOj+/cpA==} + '@ark/util@0.56.0': + resolution: {integrity: sha512-BghfRC8b9pNs3vBoDJhcta0/c1J1rsoS1+HgVUreMFPdhz/CRAKReAu57YEllNaSy98rWAdY1gE+gFup7OXpgA==} + '@asamuzakjp/css-color@4.0.5': resolution: {integrity: sha512-lMrXidNhPGsDjytDy11Vwlb6OIGrT3CmLg3VWNFyWkLWtijKl7xjvForlh8vuj0SHGjgl4qZEQzUmYTeQA2JFQ==} @@ -3273,12 +3279,18 @@ packages: arkregex@0.0.2: resolution: {integrity: sha512-ttjDUICBVoXD/m8bf7eOjx8XMR6yIT2FmmW9vsN0FCcFOygEZvvIX8zK98tTdXkzi0LkRi5CmadB44jFEIyDNA==} + arkregex@0.0.4: + resolution: {integrity: sha512-biS/FkvSwQq59TZ453piUp8bxMui11pgOMV9WHAnli1F8o0ayNCZzUwQadL/bGIUic5TkS/QlPcyMuI8ZIwedQ==} + arktype@1.0.29-alpha: resolution: {integrity: sha512-glMLgVhIQRSkR3tymiS+POAcWVJH09sfrgic0jHnyFL8BlhHAJZX2BzdImU9zYr1y9NBqy+U93ZNrRTHXsKRDw==} arktype@2.1.25: resolution: {integrity: sha512-fdj10sNlUPeDRg1QUqMbzJ4Q7gutTOWOpLUNdcC4vxeVrN0G+cbDOvLbuxQOFj/NDAode1G7kwFv4yKwQvupJg==} + arktype@2.1.28: + resolution: {integrity: sha512-LVZqXl2zWRpNFnbITrtFmqeqNkPPo+KemuzbGSY6jvJwCb4v8NsDzrWOLHnQgWl26TkJeWWcUNUeBpq2Mst1/Q==} + array-iterate@2.0.1: resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} @@ -7415,27 +7427,33 @@ snapshots: '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - '@ark/attest@0.53.0(typescript@5.9.3)': + '@ark/attest@0.56.0(typescript@5.9.3)': dependencies: - '@ark/fs': 0.53.0 - '@ark/util': 0.53.0 + '@ark/fs': 0.56.0 + '@ark/util': 0.56.0 '@prettier/sync': 0.6.1(prettier@3.6.2) '@typescript/analyze-trace': 0.10.1 '@typescript/vfs': 1.6.1(typescript@5.9.3) - arktype: 2.1.25 + arktype: 2.1.28 prettier: 3.6.2 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@ark/fs@0.53.0': {} + '@ark/fs@0.56.0': {} '@ark/schema@0.53.0': dependencies: '@ark/util': 0.53.0 + '@ark/schema@0.56.0': + dependencies: + '@ark/util': 0.56.0 + '@ark/util@0.53.0': {} + '@ark/util@0.56.0': {} + '@asamuzakjp/css-color@4.0.5': dependencies: '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) @@ -9993,6 +10011,10 @@ snapshots: dependencies: '@ark/util': 0.53.0 + arkregex@0.0.4: + dependencies: + '@ark/util': 0.56.0 + arktype@1.0.29-alpha: {} arktype@2.1.25: @@ -10001,6 +10023,12 @@ snapshots: '@ark/util': 0.53.0 arkregex: 0.0.2 + arktype@2.1.28: + dependencies: + '@ark/schema': 0.56.0 + '@ark/util': 0.56.0 + arkregex: 0.0.4 + array-iterate@2.0.1: {} assertion-error@2.0.1: {} From cfd112e8ab399c226c796d6899c06267df1a4a7e Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Fri, 23 Jan 2026 12:13:23 +0100 Subject: [PATCH 16/38] Fix failing build --- packages/eslint-plugin/package.json | 1 + packages/eslint-plugin/tsconfig.json | 5 +- pnpm-lock.yaml | 141 ++++++++++++++++----------- 3 files changed, 89 insertions(+), 58 deletions(-) diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index a56afdf246..272956f3b9 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -18,6 +18,7 @@ "license": "MIT", "packageManager": "pnpm@10.15.1", "devDependencies": { + "@types/node": "^25.0.10", "@typescript-eslint/parser": "^8.53.1", "@typescript-eslint/rule-tester": "^8.53.1", "@typescript-eslint/utils": "^8.53.1", diff --git a/packages/eslint-plugin/tsconfig.json b/packages/eslint-plugin/tsconfig.json index 48f7eb54e6..3a544d3dd8 100644 --- a/packages/eslint-plugin/tsconfig.json +++ b/packages/eslint-plugin/tsconfig.json @@ -1,5 +1,8 @@ { "extends": "../../tsconfig.base.json", - "include": ["src/**/*", "test/**/*"], + "compilerOptions": { + "types": ["node"] + }, + "include": ["src/**/*", "tests/**/*"], "exclude": ["node_modules", "dist"] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6446e4d8e2..5b0fd56a5a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -61,7 +61,7 @@ importers: version: link:packages/tgpu-dev-cli '@vitest/browser': specifier: ^3.2.4 - version: 3.2.4(msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3))(vite@6.3.6(@types/node@24.10.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) + version: 3.2.4(msw@2.10.2(@types/node@25.0.10)(typescript@5.9.3))(vite@6.3.6(@types/node@25.0.10)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) '@vitest/coverage-v8': specifier: 3.1.2 version: 3.1.2(@vitest/browser@3.2.4)(vitest@3.2.4) @@ -91,7 +91,7 @@ importers: version: 9.0.0(rollup@4.34.8) vitest: specifier: catalog:test - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.0)(@vitest/browser@3.2.4)(jiti@2.6.0)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@25.0.10)(@vitest/browser@3.2.4)(jiti@2.6.0)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.10.2(@types/node@25.0.10)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) apps/bun-example: dependencies: @@ -368,6 +368,9 @@ importers: packages/eslint-plugin: devDependencies: + '@types/node': + specifier: ^25.0.10 + version: 25.0.10 '@typescript-eslint/parser': specifier: ^8.53.1 version: 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) @@ -385,7 +388,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.0.17 - version: 4.0.17(@types/node@24.10.0)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + version: 4.0.17(@types/node@25.0.10)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.10.2(@types/node@25.0.10)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) packages/tgpu-dev-cli: dependencies: @@ -434,7 +437,7 @@ importers: devDependencies: vitest: specifier: catalog:test - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@25.0.10)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.10.2(@types/node@25.0.10)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) packages/tgpu-wgsl-parser: dependencies: @@ -468,7 +471,7 @@ importers: version: 5.9.3 vitest: specifier: catalog:test - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@25.0.10)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.10.2(@types/node@25.0.10)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) publishDirectory: dist packages/tinyest: @@ -2853,6 +2856,9 @@ packages: '@types/node@24.10.0': resolution: {integrity: sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==} + '@types/node@25.0.10': + resolution: {integrity: sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg==} + '@types/picomatch@4.0.1': resolution: {integrity: sha512-dLqxmi5VJRC9XTvc/oaTtk+bDb4RRqxLZPZ3jIpYBHEnDXX8lu02w2yWI6NsPPsELuVK298Z2iR8jgoWKRdUVQ==} @@ -8362,34 +8368,34 @@ snapshots: '@inquirer/ansi@1.0.1': optional: true - '@inquirer/confirm@5.1.19(@types/node@24.10.0)': + '@inquirer/confirm@5.1.19(@types/node@25.0.10)': dependencies: - '@inquirer/core': 10.3.0(@types/node@24.10.0) - '@inquirer/type': 3.0.9(@types/node@24.10.0) + '@inquirer/core': 10.3.0(@types/node@25.0.10) + '@inquirer/type': 3.0.9(@types/node@25.0.10) optionalDependencies: - '@types/node': 24.10.0 + '@types/node': 25.0.10 optional: true - '@inquirer/core@10.3.0(@types/node@24.10.0)': + '@inquirer/core@10.3.0(@types/node@25.0.10)': dependencies: '@inquirer/ansi': 1.0.1 '@inquirer/figures': 1.0.14 - '@inquirer/type': 3.0.9(@types/node@24.10.0) + '@inquirer/type': 3.0.9(@types/node@25.0.10) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 24.10.0 + '@types/node': 25.0.10 optional: true '@inquirer/figures@1.0.14': optional: true - '@inquirer/type@3.0.9(@types/node@24.10.0)': + '@inquirer/type@3.0.9(@types/node@25.0.10)': optionalDependencies: - '@types/node': 24.10.0 + '@types/node': 25.0.10 optional: true '@isaacs/balanced-match@4.0.1': {} @@ -9466,6 +9472,10 @@ snapshots: dependencies: undici-types: 7.16.0 + '@types/node@25.0.10': + dependencies: + undici-types: 7.16.0 + '@types/picomatch@4.0.1': {} '@types/react-dom@19.1.6(@types/react@19.1.8)': @@ -9623,16 +9633,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/browser@3.2.4(msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3))(vite@6.3.6(@types/node@24.10.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)': + '@vitest/browser@3.2.4(msw@2.10.2(@types/node@25.0.10)(typescript@5.9.3))(vite@6.3.6(@types/node@25.0.10)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)': dependencies: '@testing-library/dom': 10.4.0 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) - '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3))(vite@6.3.6(@types/node@24.10.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@25.0.10)(typescript@5.9.3))(vite@6.3.6(@types/node@25.0.10)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/utils': 3.2.4 magic-string: 0.30.17 sirv: 3.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.0)(@vitest/browser@3.2.4)(jiti@2.6.0)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.0.10)(@vitest/browser@3.2.4)(jiti@2.6.0)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.10.2(@types/node@25.0.10)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) ws: 8.18.3 transitivePeerDependencies: - bufferutil @@ -9640,16 +9650,16 @@ snapshots: - utf-8-validate - vite - '@vitest/browser@3.2.4(msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3))(vite@6.3.6(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)': + '@vitest/browser@3.2.4(msw@2.10.2(@types/node@25.0.10)(typescript@5.9.3))(vite@6.3.6(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)': dependencies: '@testing-library/dom': 10.4.0 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) - '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3))(vite@6.3.6(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@25.0.10)(typescript@5.9.3))(vite@6.3.6(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/utils': 3.2.4 magic-string: 0.30.17 sirv: 3.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.0.10)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.10.2(@types/node@25.0.10)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) ws: 8.18.3 transitivePeerDependencies: - bufferutil @@ -9672,9 +9682,9 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.0)(@vitest/browser@3.2.4)(jiti@2.6.0)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.0.10)(@vitest/browser@3.2.4)(jiti@2.6.0)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.10.2(@types/node@25.0.10)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) optionalDependencies: - '@vitest/browser': 3.2.4(msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3))(vite@6.3.6(@types/node@24.10.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) + '@vitest/browser': 3.2.4(msw@2.10.2(@types/node@25.0.10)(typescript@5.9.3))(vite@6.3.6(@types/node@25.0.10)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) transitivePeerDependencies: - supports-color @@ -9695,32 +9705,32 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@3.2.4(msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3))(vite@6.3.6(@types/node@24.10.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(msw@2.10.2(@types/node@25.0.10)(typescript@5.9.3))(vite@6.3.6(@types/node@25.0.10)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: - msw: 2.10.2(@types/node@24.10.0)(typescript@5.9.3) - vite: 6.3.6(@types/node@24.10.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + msw: 2.10.2(@types/node@25.0.10)(typescript@5.9.3) + vite: 6.3.6(@types/node@25.0.10)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) - '@vitest/mocker@3.2.4(msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3))(vite@6.3.6(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(msw@2.10.2(@types/node@25.0.10)(typescript@5.9.3))(vite@6.3.6(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.19 optionalDependencies: - msw: 2.10.2(@types/node@24.10.0)(typescript@5.9.3) - vite: 6.3.6(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + msw: 2.10.2(@types/node@25.0.10)(typescript@5.9.3) + vite: 6.3.6(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) - '@vitest/mocker@4.0.17(msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3))(vite@6.3.6(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/mocker@4.0.17(msw@2.10.2(@types/node@25.0.10)(typescript@5.9.3))(vite@6.3.6(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@vitest/spy': 4.0.17 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - msw: 2.10.2(@types/node@24.10.0)(typescript@5.9.3) - vite: 6.3.6(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + msw: 2.10.2(@types/node@25.0.10)(typescript@5.9.3) + vite: 6.3.6(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) '@vitest/pretty-format@3.2.4': dependencies: @@ -11690,7 +11700,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 20.19.27 + '@types/node': 24.10.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -12573,12 +12583,12 @@ snapshots: ms@2.1.3: {} - msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3): + msw@2.10.2(@types/node@25.0.10)(typescript@5.9.3): dependencies: '@bundled-es-modules/cookie': 2.0.1 '@bundled-es-modules/statuses': 1.0.1 '@bundled-es-modules/tough-cookie': 0.1.6 - '@inquirer/confirm': 5.1.19(@types/node@24.10.0) + '@inquirer/confirm': 5.1.19(@types/node@25.0.10) '@mswjs/interceptors': 0.39.8 '@open-draft/deferred-promise': 2.2.0 '@open-draft/until': 2.1.0 @@ -14439,13 +14449,13 @@ snapshots: transitivePeerDependencies: - rollup - vite-node@3.2.4(@types/node@24.10.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): + vite-node@3.2.4(@types/node@25.0.10)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.6(@types/node@24.10.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vite: 6.3.6(@types/node@25.0.10)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -14460,13 +14470,13 @@ snapshots: - tsx - yaml - vite-node@3.2.4(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): + vite-node@3.2.4(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.6(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vite: 6.3.6(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -14485,7 +14495,7 @@ snapshots: dependencies: vite: 6.3.6(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) - vite@6.3.6(@types/node@24.10.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): + vite@6.3.6(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): dependencies: esbuild: 0.25.10 fdir: 6.5.0(picomatch@4.0.3) @@ -14496,13 +14506,30 @@ snapshots: optionalDependencies: '@types/node': 24.10.0 fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.30.1 + terser: 5.44.1 + tsx: 4.20.6 + yaml: 2.8.1 + + vite@6.3.6(@types/node@25.0.10)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): + dependencies: + esbuild: 0.25.10 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.34.8 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 25.0.10 + fsevents: 2.3.3 jiti: 2.6.0 lightningcss: 1.30.1 terser: 5.44.1 tsx: 4.20.6 yaml: 2.8.1 - vite@6.3.6(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): + vite@6.3.6(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): dependencies: esbuild: 0.25.10 fdir: 6.5.0(picomatch@4.0.3) @@ -14511,7 +14538,7 @@ snapshots: rollup: 4.34.8 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.10.0 + '@types/node': 25.0.10 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.30.1 @@ -14523,11 +14550,11 @@ snapshots: optionalDependencies: vite: 6.3.6(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.10.0)(@vitest/browser@3.2.4)(jiti@2.6.0)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.0.10)(@vitest/browser@3.2.4)(jiti@2.6.0)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.10.2(@types/node@25.0.10)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3))(vite@6.3.6(@types/node@24.10.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@25.0.10)(typescript@5.9.3))(vite@6.3.6(@types/node@25.0.10)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -14545,13 +14572,13 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.3.6(@types/node@24.10.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@24.10.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vite: 6.3.6(@types/node@25.0.10)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@25.0.10)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 24.10.0 - '@vitest/browser': 3.2.4(msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3))(vite@6.3.6(@types/node@24.10.0)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) + '@types/node': 25.0.10 + '@vitest/browser': 3.2.4(msw@2.10.2(@types/node@25.0.10)(typescript@5.9.3))(vite@6.3.6(@types/node@25.0.10)(jiti@2.6.0)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) jsdom: 27.0.0(canvas@3.2.0)(postcss@8.5.6) transitivePeerDependencies: - jiti @@ -14567,11 +14594,11 @@ snapshots: - tsx - yaml - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.10.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.0.10)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.10.2(@types/node@25.0.10)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3))(vite@6.3.6(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@25.0.10)(typescript@5.9.3))(vite@6.3.6(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -14589,13 +14616,13 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.3.6(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vite: 6.3.6(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 24.10.0 - '@vitest/browser': 3.2.4(msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3))(vite@6.3.6(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) + '@types/node': 25.0.10 + '@vitest/browser': 3.2.4(msw@2.10.2(@types/node@25.0.10)(typescript@5.9.3))(vite@6.3.6(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) jsdom: 27.0.0(canvas@3.2.0)(postcss@8.5.6) transitivePeerDependencies: - jiti @@ -14611,10 +14638,10 @@ snapshots: - tsx - yaml - vitest@4.0.17(@types/node@24.10.0)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): + vitest@4.0.17(@types/node@25.0.10)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.10.2(@types/node@25.0.10)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@vitest/expect': 4.0.17 - '@vitest/mocker': 4.0.17(msw@2.10.2(@types/node@24.10.0)(typescript@5.9.3))(vite@6.3.6(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 4.0.17(msw@2.10.2(@types/node@25.0.10)(typescript@5.9.3))(vite@6.3.6(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/pretty-format': 4.0.17 '@vitest/runner': 4.0.17 '@vitest/snapshot': 4.0.17 @@ -14631,10 +14658,10 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 6.3.6(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vite: 6.3.6(@types/node@25.0.10)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 24.10.0 + '@types/node': 25.0.10 jsdom: 27.0.0(canvas@3.2.0)(postcss@8.5.6) transitivePeerDependencies: - jiti From 30af466fdb3287a798a6a3262a33e059a119df42 Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Fri, 23 Jan 2026 12:52:50 +0100 Subject: [PATCH 17/38] Add recommended rules --- packages/eslint-plugin/src/configs.ts | 11 ++++++++ packages/eslint-plugin/src/index.ts | 27 +------------------ packages/eslint-plugin/src/plugin.ts | 39 +++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 26 deletions(-) create mode 100644 packages/eslint-plugin/src/configs.ts create mode 100644 packages/eslint-plugin/src/plugin.ts diff --git a/packages/eslint-plugin/src/configs.ts b/packages/eslint-plugin/src/configs.ts new file mode 100644 index 0000000000..3774421c86 --- /dev/null +++ b/packages/eslint-plugin/src/configs.ts @@ -0,0 +1,11 @@ +import type { TSESLint } from '@typescript-eslint/utils'; +import type { RawRules } from './plugin.ts'; + +type Rules = Record< + `typegpu/${keyof RawRules}`, + TSESLint.FlatConfig.RuleEntry +>; + +export const recommendedRules: Rules = { + 'typegpu/integer-division': 'warn', +}; diff --git a/packages/eslint-plugin/src/index.ts b/packages/eslint-plugin/src/index.ts index 79dffddd5e..b32be0e9a7 100644 --- a/packages/eslint-plugin/src/index.ts +++ b/packages/eslint-plugin/src/index.ts @@ -1,28 +1,3 @@ -import fs from 'node:fs'; -import { integerDivision } from './rules/integerDivision.ts'; - -const pkg = JSON.parse( - fs.readFileSync(new URL('../package.json', import.meta.url), 'utf8'), -); - -const rules = { - 'integer-division': integerDivision, -}; - -// const recommendedRules = { -// 'typegpu/proper-buffer-names': 'error', -// }; - -// const allRules = Object.fromEntries( -// Object.keys(rules).map((name) => [`typegpu/${name}`, 'error']), -// ); - -const plugin = { - meta: { - name: pkg.name, - version: pkg.version, - }, - rules, -}; +import { plugin } from './plugin.ts'; export default plugin; diff --git a/packages/eslint-plugin/src/plugin.ts b/packages/eslint-plugin/src/plugin.ts new file mode 100644 index 0000000000..c8500a7d89 --- /dev/null +++ b/packages/eslint-plugin/src/plugin.ts @@ -0,0 +1,39 @@ +import fs from 'node:fs'; +import { integerDivision } from './rules/integerDivision.ts'; +import type { TSESLint } from '@typescript-eslint/utils'; +import { recommendedRules } from './configs.ts'; + +const pkg = JSON.parse( + fs.readFileSync(new URL('../package.json', import.meta.url), 'utf8'), +); + +const rules = { + 'integer-division': integerDivision, +} as const; + +export type RawRules = typeof rules; + +const pluginBase: TSESLint.FlatConfig.Plugin = { + meta: { + name: pkg.name, + version: pkg.version, + }, + rules, +}; + +const recommended: TSESLint.FlatConfig.Config = { + name: 'typegpu/recommended', + plugins: { typegpu: pluginBase }, + rules: recommendedRules, +}; + +export const plugin: TSESLint.FlatConfig.Plugin = { + ...pluginBase, + configs: { + recommended, + }, +}; + +// const allRules = Object.fromEntries( +// Object.keys(rules).map((name) => [`typegpu/${name}`, 'error']), +// ); From adb679984ee65dd6fc6e1f7c305c298fffd7e779 Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Fri, 23 Jan 2026 12:57:23 +0100 Subject: [PATCH 18/38] Add all rules --- packages/eslint-plugin/src/configs.ts | 12 +++++++-- packages/eslint-plugin/src/index.ts | 36 +++++++++++++++++++++++-- packages/eslint-plugin/src/plugin.ts | 39 --------------------------- 3 files changed, 44 insertions(+), 43 deletions(-) delete mode 100644 packages/eslint-plugin/src/plugin.ts diff --git a/packages/eslint-plugin/src/configs.ts b/packages/eslint-plugin/src/configs.ts index 3774421c86..fca94576cc 100644 --- a/packages/eslint-plugin/src/configs.ts +++ b/packages/eslint-plugin/src/configs.ts @@ -1,11 +1,19 @@ import type { TSESLint } from '@typescript-eslint/utils'; -import type { RawRules } from './plugin.ts'; +import { integerDivision } from './rules/integerDivision.ts'; + +export const rules = { + 'integer-division': integerDivision, +} as const; type Rules = Record< - `typegpu/${keyof RawRules}`, + `typegpu/${keyof typeof rules}`, TSESLint.FlatConfig.RuleEntry >; export const recommendedRules: Rules = { 'typegpu/integer-division': 'warn', }; + +export const allRules: Rules = { + 'typegpu/integer-division': 'warn', +}; diff --git a/packages/eslint-plugin/src/index.ts b/packages/eslint-plugin/src/index.ts index b32be0e9a7..951085567b 100644 --- a/packages/eslint-plugin/src/index.ts +++ b/packages/eslint-plugin/src/index.ts @@ -1,3 +1,35 @@ -import { plugin } from './plugin.ts'; +import fs from 'node:fs'; +import type { TSESLint } from '@typescript-eslint/utils'; +import { allRules, recommendedRules, rules } from './configs.ts'; -export default plugin; +const pkg = JSON.parse( + fs.readFileSync(new URL('../package.json', import.meta.url), 'utf8'), +); + +const pluginBase: TSESLint.FlatConfig.Plugin = { + meta: { + name: pkg.name, + version: pkg.version, + }, + rules, +}; + +const recommended: TSESLint.FlatConfig.Config = { + name: 'typegpu/recommended', + plugins: { typegpu: pluginBase }, + rules: recommendedRules, +}; + +const all: TSESLint.FlatConfig.Config = { + name: 'typegpu/all', + plugins: { typegpu: pluginBase }, + rules: allRules, +}; + +export const plugin: TSESLint.FlatConfig.Plugin = { + ...pluginBase, + configs: { + recommended, + all, + }, +}; diff --git a/packages/eslint-plugin/src/plugin.ts b/packages/eslint-plugin/src/plugin.ts deleted file mode 100644 index c8500a7d89..0000000000 --- a/packages/eslint-plugin/src/plugin.ts +++ /dev/null @@ -1,39 +0,0 @@ -import fs from 'node:fs'; -import { integerDivision } from './rules/integerDivision.ts'; -import type { TSESLint } from '@typescript-eslint/utils'; -import { recommendedRules } from './configs.ts'; - -const pkg = JSON.parse( - fs.readFileSync(new URL('../package.json', import.meta.url), 'utf8'), -); - -const rules = { - 'integer-division': integerDivision, -} as const; - -export type RawRules = typeof rules; - -const pluginBase: TSESLint.FlatConfig.Plugin = { - meta: { - name: pkg.name, - version: pkg.version, - }, - rules, -}; - -const recommended: TSESLint.FlatConfig.Config = { - name: 'typegpu/recommended', - plugins: { typegpu: pluginBase }, - rules: recommendedRules, -}; - -export const plugin: TSESLint.FlatConfig.Plugin = { - ...pluginBase, - configs: { - recommended, - }, -}; - -// const allRules = Object.fromEntries( -// Object.keys(rules).map((name) => [`typegpu/${name}`, 'error']), -// ); From 340a9244d9d06255eae5ee46af09ff9fc6056ab9 Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Fri, 23 Jan 2026 14:04:13 +0100 Subject: [PATCH 19/38] Fix configuration so that the plugin is usable --- packages/eslint-plugin/package.json | 9 ++++++++- packages/eslint-plugin/src/index.ts | 10 ++++------ packages/eslint-plugin/tsup.config.ts | 2 +- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index 272956f3b9..e629231e4f 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -2,6 +2,7 @@ "name": "eslint-plugin-typegpu", "version": "0.9.0", "description": "An eslint plugin containing custom rules for TypeGPU.", + "type": "module", "exports": { ".": { "types": "./dist/index.d.ts", @@ -17,11 +18,17 @@ "sideEffects": false, "license": "MIT", "packageManager": "pnpm@10.15.1", + "dependencies": { + "@typescript-eslint/utils": "^8.53.1" + }, + "peerDependencies": { + "eslint": "^9.0.0", + "@typescript-eslint/parser": "^8.0.0" + }, "devDependencies": { "@types/node": "^25.0.10", "@typescript-eslint/parser": "^8.53.1", "@typescript-eslint/rule-tester": "^8.53.1", - "@typescript-eslint/utils": "^8.53.1", "eslint": "^9.39.2", "typescript": "^5.9.3", "vitest": "^4.0.17" diff --git a/packages/eslint-plugin/src/index.ts b/packages/eslint-plugin/src/index.ts index 951085567b..08763811d3 100644 --- a/packages/eslint-plugin/src/index.ts +++ b/packages/eslint-plugin/src/index.ts @@ -1,11 +1,7 @@ -import fs from 'node:fs'; +import pkg from '../package.json' with { type: 'json' }; import type { TSESLint } from '@typescript-eslint/utils'; import { allRules, recommendedRules, rules } from './configs.ts'; -const pkg = JSON.parse( - fs.readFileSync(new URL('../package.json', import.meta.url), 'utf8'), -); - const pluginBase: TSESLint.FlatConfig.Plugin = { meta: { name: pkg.name, @@ -26,10 +22,12 @@ const all: TSESLint.FlatConfig.Config = { rules: allRules, }; -export const plugin: TSESLint.FlatConfig.Plugin = { +const plugin: TSESLint.FlatConfig.Plugin = { ...pluginBase, configs: { recommended, all, }, }; + +export default plugin; diff --git a/packages/eslint-plugin/tsup.config.ts b/packages/eslint-plugin/tsup.config.ts index a829547b55..e06072d65f 100644 --- a/packages/eslint-plugin/tsup.config.ts +++ b/packages/eslint-plugin/tsup.config.ts @@ -2,7 +2,7 @@ import { defineConfig, type Options } from 'tsup'; const config: Options = { entry: ['src/index.ts'], - format: ['cjs', 'esm'], + format: ['esm'], dts: true, clean: true, splitting: true, From 9042d4e3058ba6b6581d03507c1fc5232aaf921f Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Fri, 23 Jan 2026 14:11:29 +0100 Subject: [PATCH 20/38] Update lock --- pnpm-lock.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5b0fd56a5a..f1b204b8a0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -367,6 +367,10 @@ importers: version: 2.8.1 packages/eslint-plugin: + dependencies: + '@typescript-eslint/utils': + specifier: ^8.53.1 + version: 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) devDependencies: '@types/node': specifier: ^25.0.10 @@ -377,9 +381,6 @@ importers: '@typescript-eslint/rule-tester': specifier: ^8.53.1 version: 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': - specifier: ^8.53.1 - version: 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) eslint: specifier: ^9.39.2 version: 9.39.2(jiti@2.6.1) From a49362e12c4302dcd2de69aa7a4921b397b89620 Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Fri, 23 Jan 2026 15:14:17 +0100 Subject: [PATCH 21/38] Review fixes --- packages/eslint-plugin/package.json | 4 ++-- packages/eslint-plugin/src/index.ts | 2 +- .../eslint-plugin/src/rules/integerDivision.ts | 7 ++++--- .../tests/integerDivision.test.ts | 18 ++++++++++++++++++ packages/eslint-plugin/tsup.config.ts | 2 +- pnpm-lock.yaml | 2 +- 6 files changed, 27 insertions(+), 8 deletions(-) diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index e629231e4f..3604f7da7e 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -19,11 +19,11 @@ "license": "MIT", "packageManager": "pnpm@10.15.1", "dependencies": { - "@typescript-eslint/utils": "^8.53.1" + "@typescript-eslint/utils": "^8.53.0" }, "peerDependencies": { "eslint": "^9.0.0", - "@typescript-eslint/parser": "^8.0.0" + "@typescript-eslint/parser": "^8.53.0" }, "devDependencies": { "@types/node": "^25.0.10", diff --git a/packages/eslint-plugin/src/index.ts b/packages/eslint-plugin/src/index.ts index 08763811d3..7a3dfcf2bb 100644 --- a/packages/eslint-plugin/src/index.ts +++ b/packages/eslint-plugin/src/index.ts @@ -1,4 +1,4 @@ -import pkg from '../package.json' with { type: 'json' }; +import pkg from '../package.json'; import type { TSESLint } from '@typescript-eslint/utils'; import { allRules, recommendedRules, rules } from './configs.ts'; diff --git a/packages/eslint-plugin/src/rules/integerDivision.ts b/packages/eslint-plugin/src/rules/integerDivision.ts index 65d88abb2a..222f27c86c 100644 --- a/packages/eslint-plugin/src/rules/integerDivision.ts +++ b/packages/eslint-plugin/src/rules/integerDivision.ts @@ -1,6 +1,7 @@ import type { TSESTree } from '@typescript-eslint/utils'; import { createRule } from '../ruleCreator.ts'; +// TODO: detect `std.div(d.u32(1), d.u32(2))` export const integerDivision = createRule({ name: 'integer-division', meta: { @@ -21,11 +22,11 @@ export const integerDivision = createRule({ return; } - if (node.parent?.type === 'CallExpression' && isIntCasts(node.parent)) { + if (node.parent?.type === 'CallExpression' && isIntCast(node.parent)) { return; } - if (isIntCasts(node.left) && isIntCasts(node.right)) { + if (isIntCast(node.left) && isIntCast(node.right)) { context.report({ node, messageId: 'intDiv', @@ -46,7 +47,7 @@ export const integerDivision = createRule({ * isIntCasts('i32()'); // true * isIntCasts('f32()'); // false */ -function isIntCasts(node: TSESTree.Expression): boolean { +function isIntCast(node: TSESTree.Expression): boolean { if (node.type !== 'CallExpression') { return false; } diff --git a/packages/eslint-plugin/tests/integerDivision.test.ts b/packages/eslint-plugin/tests/integerDivision.test.ts index 4df6b8c7e4..d4adb748a5 100644 --- a/packages/eslint-plugin/tests/integerDivision.test.ts +++ b/packages/eslint-plugin/tests/integerDivision.test.ts @@ -23,6 +23,24 @@ describe('integerDivision', () => { { messageId: 'intDiv', data: { snippet: 'd.i32(1) / d.i32(2)' } }, ], }, + { + code: 'd.u32(1) / d.i32(2)', + errors: [ + { messageId: 'intDiv', data: { snippet: 'd.u32(1) / d.i32(2)' } }, + ], + }, + { + code: 'u32(1) / u32(2)', + errors: [ + { messageId: 'intDiv', data: { snippet: 'u32(1) / u32(2)' } }, + ], + }, + { + code: 'd.u32(1) / d.u32(2) / d.u32(3)', + errors: [ + { messageId: 'intDiv', data: { snippet: 'd.u32(1) / d.u32(2)' } }, + ], + }, ], }); }); diff --git a/packages/eslint-plugin/tsup.config.ts b/packages/eslint-plugin/tsup.config.ts index e06072d65f..a829547b55 100644 --- a/packages/eslint-plugin/tsup.config.ts +++ b/packages/eslint-plugin/tsup.config.ts @@ -2,7 +2,7 @@ import { defineConfig, type Options } from 'tsup'; const config: Options = { entry: ['src/index.ts'], - format: ['esm'], + format: ['cjs', 'esm'], dts: true, clean: true, splitting: true, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 28f9dc1f29..5d54fdbea0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -369,7 +369,7 @@ importers: packages/eslint-plugin: dependencies: '@typescript-eslint/utils': - specifier: ^8.53.1 + specifier: ^8.53.0 version: 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) devDependencies: '@types/node': From ff415f6321ad5a8ff68179a88878f710a052f16d Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Fri, 23 Jan 2026 15:25:14 +0100 Subject: [PATCH 22/38] Remove an unnecessary dependency --- packages/eslint-plugin/package.json | 4 +-- pnpm-lock.yaml | 49 ++--------------------------- 2 files changed, 3 insertions(+), 50 deletions(-) diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index 3604f7da7e..a97917b948 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -22,12 +22,10 @@ "@typescript-eslint/utils": "^8.53.0" }, "peerDependencies": { - "eslint": "^9.0.0", - "@typescript-eslint/parser": "^8.53.0" + "eslint": "^9.0.0" }, "devDependencies": { "@types/node": "^25.0.10", - "@typescript-eslint/parser": "^8.53.1", "@typescript-eslint/rule-tester": "^8.53.1", "eslint": "^9.39.2", "typescript": "^5.9.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5d54fdbea0..26a12717b0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,47 +4,6 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -catalogs: - build: - jiti: - specifier: ^2.6.0 - version: 2.6.0 - tsup: - specifier: ^8.5.0 - version: 8.5.0 - unbuild: - specifier: ^3.5.0 - version: 3.5.0 - default: - arktype: - specifier: ^2.1.22 - version: 2.1.25 - example: - wgpu-matrix: - specifier: ^3.4.0 - version: 3.4.0 - frontend: - fuse.js: - specifier: ^7.1.0 - version: 7.1.0 - vite-imagetools: - specifier: ^9.0.0 - version: 9.0.0 - test: - vitest: - specifier: ^3.2.4 - version: 3.2.4 - types: - '@types/three': - specifier: ^0.181.0 - version: 0.181.0 - '@webgpu/types': - specifier: ^0.1.66 - version: 0.1.66 - typescript: - specifier: ^5.9.3 - version: 5.9.3 - overrides: rollup: 4.34.8 three: ^0.181.0 @@ -375,9 +334,6 @@ importers: '@types/node': specifier: ^25.0.10 version: 25.0.10 - '@typescript-eslint/parser': - specifier: ^8.53.1 - version: 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/rule-tester': specifier: ^8.53.1 version: 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) @@ -11042,8 +10998,7 @@ snapshots: detect-libc@2.1.0: {} - detect-libc@2.1.2: - optional: true + detect-libc@2.1.2: {} detect-node-es@1.1.0: {} @@ -12103,7 +12058,7 @@ snapshots: lightningcss@1.30.1: dependencies: - detect-libc: 2.1.0 + detect-libc: 2.1.2 optionalDependencies: lightningcss-darwin-arm64: 1.30.1 lightningcss-darwin-x64: 1.30.1 From 079548664b63bd73426ab4ad78b462aec0e77f33 Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Fri, 23 Jan 2026 15:33:45 +0100 Subject: [PATCH 23/38] smol --- packages/eslint-plugin/src/configs.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/eslint-plugin/src/configs.ts b/packages/eslint-plugin/src/configs.ts index fca94576cc..62891e939b 100644 --- a/packages/eslint-plugin/src/configs.ts +++ b/packages/eslint-plugin/src/configs.ts @@ -15,5 +15,5 @@ export const recommendedRules: Rules = { }; export const allRules: Rules = { - 'typegpu/integer-division': 'warn', + 'typegpu/integer-division': 'error', }; From 460e199eb8901d1d111754a9d9506bb5017683cc Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Wed, 4 Feb 2026 10:56:59 +0100 Subject: [PATCH 24/38] Report on || instead of && --- .../eslint-plugin/src/rules/integerDivision.ts | 2 +- .../tests/integerDivision.test.ts | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/packages/eslint-plugin/src/rules/integerDivision.ts b/packages/eslint-plugin/src/rules/integerDivision.ts index 222f27c86c..fa1d21271f 100644 --- a/packages/eslint-plugin/src/rules/integerDivision.ts +++ b/packages/eslint-plugin/src/rules/integerDivision.ts @@ -26,7 +26,7 @@ export const integerDivision = createRule({ return; } - if (isIntCast(node.left) && isIntCast(node.right)) { + if (isIntCast(node.left) || isIntCast(node.right)) { context.report({ node, messageId: 'intDiv', diff --git a/packages/eslint-plugin/tests/integerDivision.test.ts b/packages/eslint-plugin/tests/integerDivision.test.ts index d4adb748a5..a243959e2a 100644 --- a/packages/eslint-plugin/tests/integerDivision.test.ts +++ b/packages/eslint-plugin/tests/integerDivision.test.ts @@ -6,11 +6,21 @@ describe('integerDivision', () => { ruleTester.run('integerDivision', integerDivision, { valid: [ '1 / 2', - 'd.u32(1) / 2', - '1 / d.u32(2)', 'd.u32(d.u32(1) / d.u32(2))', ], invalid: [ + { + code: 'd.u32(1) / 2', + errors: [ + { messageId: 'intDiv', data: { snippet: 'd.u32(1) / 2' } }, + ], + }, + { + code: '1 / d.u32(2)', + errors: [ + { messageId: 'intDiv', data: { snippet: '1 / d.u32(2)' } }, + ], + }, { code: 'd.u32(1) / d.u32(2)', errors: [ @@ -38,6 +48,10 @@ describe('integerDivision', () => { { code: 'd.u32(1) / d.u32(2) / d.u32(3)', errors: [ + { + messageId: 'intDiv', + data: { snippet: 'd.u32(1) / d.u32(2) / d.u32(3)' }, + }, { messageId: 'intDiv', data: { snippet: 'd.u32(1) / d.u32(2)' } }, ], }, From 83121723883626e0a86c576ec082ce56fbd55f4d Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Mon, 9 Feb 2026 16:48:48 +0100 Subject: [PATCH 25/38] Fix lock --- pnpm-lock.yaml | 960 +++++++++++++++++++++++++++++++------------------ 1 file changed, 603 insertions(+), 357 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5c4432fbdc..21c3ef543d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -61,7 +61,7 @@ importers: version: link:packages/tgpu-dev-cli '@vitest/browser': specifier: ^3.2.4 - version: 3.2.4(msw@2.10.2(@types/node@25.2.0)(typescript@5.9.3))(vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) + version: 3.2.4(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) '@vitest/coverage-v8': specifier: 3.1.2 version: 3.1.2(@vitest/browser@3.2.4)(vitest@3.2.4) @@ -91,7 +91,7 @@ importers: version: 9.0.0(rollup@4.34.8) vitest: specifier: catalog:test - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.2.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) apps/bun-example: dependencies: @@ -159,7 +159,7 @@ importers: dependencies: '@astrojs/check': specifier: ^0.9.4 - version: 0.9.4(prettier@3.6.2)(typescript@5.9.3) + version: 0.9.4(prettier@3.8.0)(typescript@5.9.3) '@astrojs/react': specifier: ^4.3.1 version: 4.3.1(@types/node@24.10.0)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) @@ -346,7 +346,7 @@ importers: version: 0.1.66 astro-vtbot: specifier: ^2.1.10 - version: 2.1.10(prettier@3.6.2)(typescript@5.9.3) + version: 2.1.10(prettier@3.8.0)(typescript@5.9.3) autoprefixer: specifier: ^10.4.21 version: 10.4.21(postcss@8.5.6) @@ -370,14 +370,14 @@ importers: dependencies: '@typescript-eslint/utils': specifier: ^8.53.0 - version: 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) devDependencies: '@types/node': specifier: ^25.0.10 - version: 25.2.0 + version: 25.1.0 '@typescript-eslint/rule-tester': specifier: ^8.53.1 - version: 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + version: 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) eslint: specifier: ^9.39.2 version: 9.39.2(jiti@2.6.1) @@ -386,7 +386,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.0.17 - version: 4.0.17(@types/node@25.2.0)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.2.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + version: 4.0.18(@types/node@25.1.0)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) packages/tgpu-dev-cli: dependencies: @@ -435,7 +435,7 @@ importers: devDependencies: vitest: specifier: catalog:test - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.2.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) packages/tgpu-wgsl-parser: dependencies: @@ -469,7 +469,7 @@ importers: version: 5.9.3 vitest: specifier: catalog:test - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.2.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) publishDirectory: dist packages/tinyest: @@ -993,6 +993,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.28.6': + resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-transform-react-jsx-self@7.27.1': resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} engines: {node: '>=6.9.0'} @@ -1041,14 +1046,14 @@ packages: resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.4': - resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} - engines: {node: '>=6.9.0'} - '@babel/types@7.28.5': resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} + '@babel/types@7.28.6': + resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} + engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@1.0.2': resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} @@ -1212,6 +1217,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.24.2': resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} engines: {node: '>=18'} @@ -1224,6 +1235,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.24.2': resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} engines: {node: '>=18'} @@ -1236,6 +1253,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.24.2': resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} engines: {node: '>=18'} @@ -1248,6 +1271,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.24.2': resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} engines: {node: '>=18'} @@ -1260,6 +1289,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.24.2': resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} engines: {node: '>=18'} @@ -1272,6 +1307,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.24.2': resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} engines: {node: '>=18'} @@ -1284,6 +1325,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.24.2': resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} engines: {node: '>=18'} @@ -1296,6 +1343,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.24.2': resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} engines: {node: '>=18'} @@ -1308,6 +1361,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.24.2': resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} engines: {node: '>=18'} @@ -1320,6 +1379,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.24.2': resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} engines: {node: '>=18'} @@ -1332,6 +1397,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.24.2': resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} engines: {node: '>=18'} @@ -1344,6 +1415,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.24.2': resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} engines: {node: '>=18'} @@ -1356,6 +1433,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.24.2': resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} engines: {node: '>=18'} @@ -1368,6 +1451,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.24.2': resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} engines: {node: '>=18'} @@ -1380,6 +1469,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.24.2': resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} engines: {node: '>=18'} @@ -1392,6 +1487,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.24.2': resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} engines: {node: '>=18'} @@ -1404,6 +1505,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.24.2': resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} engines: {node: '>=18'} @@ -1416,6 +1523,12 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.24.2': resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} engines: {node: '>=18'} @@ -1428,6 +1541,12 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.24.2': resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} engines: {node: '>=18'} @@ -1440,6 +1559,12 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.24.2': resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} engines: {node: '>=18'} @@ -1452,12 +1577,24 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openharmony-arm64@0.25.10': resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.24.2': resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} engines: {node: '>=18'} @@ -1470,6 +1607,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.24.2': resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} engines: {node: '>=18'} @@ -1482,6 +1625,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.24.2': resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} engines: {node: '>=18'} @@ -1494,6 +1643,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.24.2': resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} engines: {node: '>=18'} @@ -1506,6 +1661,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2615,45 +2776,27 @@ packages: '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - '@shikijs/core@3.12.2': - resolution: {integrity: sha512-L1Safnhra3tX/oJK5kYHaWmLEBJi1irASwewzY3taX5ibyXyMkkSDZlq01qigjryOBwrXSdFgTiZ3ryzSNeu7Q==} - '@shikijs/core@3.21.0': resolution: {integrity: sha512-AXSQu/2n1UIQekY8euBJlvFYZIw0PHY63jUzGbrOma4wPxzznJXTXkri+QcHeBNaFxiiOljKxxJkVSoB3PjbyA==} - '@shikijs/engine-javascript@3.12.2': - resolution: {integrity: sha512-Nm3/azSsaVS7hk6EwtHEnTythjQfwvrO5tKqMlaH9TwG1P+PNaR8M0EAKZ+GaH2DFwvcr4iSfTveyxMIvXEHMw==} - '@shikijs/engine-javascript@3.21.0': resolution: {integrity: sha512-ATwv86xlbmfD9n9gKRiwuPpWgPENAWCLwYCGz9ugTJlsO2kOzhOkvoyV/UD+tJ0uT7YRyD530x6ugNSffmvIiQ==} '@shikijs/engine-oniguruma@1.29.2': resolution: {integrity: sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==} - '@shikijs/engine-oniguruma@3.12.2': - resolution: {integrity: sha512-hozwnFHsLvujK4/CPVHNo3Bcg2EsnG8krI/ZQ2FlBlCRpPZW4XAEQmEwqegJsypsTAN9ehu2tEYe30lYKSZW/w==} - '@shikijs/engine-oniguruma@3.21.0': resolution: {integrity: sha512-OYknTCct6qiwpQDqDdf3iedRdzj6hFlOPv5hMvI+hkWfCKs5mlJ4TXziBG9nyabLwGulrUjHiCq3xCspSzErYQ==} - '@shikijs/langs@3.12.2': - resolution: {integrity: sha512-bVx5PfuZHDSHoBal+KzJZGheFuyH4qwwcwG/n+MsWno5cTlKmaNtTsGzJpHYQ8YPbB5BdEdKU1rga5/6JGY8ww==} - '@shikijs/langs@3.21.0': resolution: {integrity: sha512-g6mn5m+Y6GBJ4wxmBYqalK9Sp0CFkUqfNzUy2pJglUginz6ZpWbaWjDB4fbQ/8SHzFjYbtU6Ddlp1pc+PPNDVA==} - '@shikijs/themes@3.12.2': - resolution: {integrity: sha512-fTR3QAgnwYpfGczpIbzPjlRnxyONJOerguQv1iwpyQZ9QXX4qy/XFQqXlf17XTsorxnHoJGbH/LXBvwtqDsF5A==} - '@shikijs/themes@3.21.0': resolution: {integrity: sha512-BAE4cr9EDiZyYzwIHEk7JTBJ9CzlPuM4PchfcA5ao1dWXb25nv6hYsoDiBq2aZK9E3dlt3WB78uI96UESD+8Mw==} '@shikijs/types@1.29.2': resolution: {integrity: sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==} - '@shikijs/types@3.12.2': - resolution: {integrity: sha512-K5UIBzxCyv0YoxN3LMrKB9zuhp1bV+LgewxuVwHdl4Gz5oePoUFrr9EfgJlGlDeXCU1b/yhdnXeuRvAnz8HN8Q==} - '@shikijs/types@3.21.0': resolution: {integrity: sha512-zGrWOxZ0/+0ovPY7PvBU2gIS9tmhSUUt30jAcNV0Bq0gb2S98gwfjIs1vxlmH5zM7/4YxLamT6ChlqqAJmPPjA==} @@ -2885,8 +3028,8 @@ packages: '@types/node@24.10.0': resolution: {integrity: sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==} - '@types/node@25.2.0': - resolution: {integrity: sha512-DZ8VwRFUNzuqJ5khrvwMXHmvPe+zGayJhr2CDNiKB1WBE1ST8Djl00D0IC4vvNmHMdj6DlbYRIaFE7WHjlDl5w==} + '@types/node@25.1.0': + resolution: {integrity: sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA==} '@types/picomatch@4.0.1': resolution: {integrity: sha512-dLqxmi5VJRC9XTvc/oaTtk+bDb4RRqxLZPZ3jIpYBHEnDXX8lu02w2yWI6NsPPsELuVK298Z2iR8jgoWKRdUVQ==} @@ -2932,54 +3075,54 @@ packages: '@types/webxr@0.5.22': resolution: {integrity: sha512-Vr6Stjv5jPRqH690f5I5GLjVk8GSsoQSYJ2FVd/3jJF7KaqfwPi3ehfBS96mlQ2kPCwZaX6U0rG2+NGHBKkA/A==} - '@typescript-eslint/parser@8.53.1': - resolution: {integrity: sha512-nm3cvFN9SqZGXjmw5bZ6cGmvJSyJPn0wU9gHAZZHDnZl2wF9PhHv78Xf06E0MaNk4zLVHL8hb2/c32XvyJOLQg==} + '@typescript-eslint/parser@8.54.0': + resolution: {integrity: sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.53.1': - resolution: {integrity: sha512-WYC4FB5Ra0xidsmlPb+1SsnaSKPmS3gsjIARwbEkHkoWloQmuzcfypljaJcR78uyLA1h8sHdWWPHSLDI+MtNog==} + '@typescript-eslint/project-service@8.54.0': + resolution: {integrity: sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/rule-tester@8.53.1': - resolution: {integrity: sha512-+Xn/2Wd3AxB4LD1AYVLSDNYMCjbFrZAwt0rYgS/KmT7DjJr/TRMXVtS4eK4Gje8r4XUdWbiR/akse6aVYgqcCA==} + '@typescript-eslint/rule-tester@8.54.0': + resolution: {integrity: sha512-+Fc1Y8xmSgdIBJXUKIjlswZ1EvSejqoayHxEfV20piWhKik+GKaJznKCz6XnCIzJLwzRlncnVjTceZohsKYvyg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - '@typescript-eslint/scope-manager@8.53.1': - resolution: {integrity: sha512-Lu23yw1uJMFY8cUeq7JlrizAgeQvWugNQzJp8C3x8Eo5Jw5Q2ykMdiiTB9vBVOOUBysMzmRRmUfwFrZuI2C4SQ==} + '@typescript-eslint/scope-manager@8.54.0': + resolution: {integrity: sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.53.1': - resolution: {integrity: sha512-qfvLXS6F6b1y43pnf0pPbXJ+YoXIC7HKg0UGZ27uMIemKMKA6XH2DTxsEDdpdN29D+vHV07x/pnlPNVLhdhWiA==} + '@typescript-eslint/tsconfig-utils@8.54.0': + resolution: {integrity: sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.53.1': - resolution: {integrity: sha512-jr/swrr2aRmUAUjW5/zQHbMaui//vQlsZcJKijZf3M26bnmLj8LyZUpj8/Rd6uzaek06OWsqdofN/Thenm5O8A==} + '@typescript-eslint/types@8.54.0': + resolution: {integrity: sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.53.1': - resolution: {integrity: sha512-RGlVipGhQAG4GxV1s34O91cxQ/vWiHJTDHbXRr0li2q/BGg3RR/7NM8QDWgkEgrwQYCvmJV9ichIwyoKCQ+DTg==} + '@typescript-eslint/typescript-estree@8.54.0': + resolution: {integrity: sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.53.1': - resolution: {integrity: sha512-c4bMvGVWW4hv6JmDUEG7fSYlWOl3II2I4ylt0NM+seinYQlZMQIaKaXIIVJWt9Ofh6whrpM+EdDQXKXjNovvrg==} + '@typescript-eslint/utils@8.54.0': + resolution: {integrity: sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.53.1': - resolution: {integrity: sha512-oy+wV7xDKFPRyNggmXuZQSBzvoLnpmJs+GhzRhPjrxl2b/jIlyjVokzm47CZCDUdXKr2zd7ZLodPfOBpOPyPlg==} + '@typescript-eslint/visitor-keys@8.54.0': + resolution: {integrity: sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript/analyze-trace@0.10.1': @@ -3033,8 +3176,8 @@ packages: '@vitest/expect@3.2.4': resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} - '@vitest/expect@4.0.17': - resolution: {integrity: sha512-mEoqP3RqhKlbmUmntNDDCJeTDavDR+fVYkSOw8qRwJFaW/0/5zA9zFeTrHqNtcmwh6j26yMmwx2PqUDPzt5ZAQ==} + '@vitest/expect@4.0.18': + resolution: {integrity: sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ==} '@vitest/mocker@3.2.4': resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} @@ -3047,8 +3190,8 @@ packages: vite: optional: true - '@vitest/mocker@4.0.17': - resolution: {integrity: sha512-+ZtQhLA3lDh1tI2wxe3yMsGzbp7uuJSWBM1iTIKCbppWTSBN09PUC+L+fyNlQApQoR+Ps8twt2pbSSXg2fQVEQ==} + '@vitest/mocker@4.0.18': + resolution: {integrity: sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0-0 @@ -3061,32 +3204,32 @@ packages: '@vitest/pretty-format@3.2.4': resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - '@vitest/pretty-format@4.0.17': - resolution: {integrity: sha512-Ah3VAYmjcEdHg6+MwFE17qyLqBHZ+ni2ScKCiW2XrlSBV4H3Z7vYfPfz7CWQ33gyu76oc0Ai36+kgLU3rfF4nw==} + '@vitest/pretty-format@4.0.18': + resolution: {integrity: sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw==} '@vitest/runner@3.2.4': resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} - '@vitest/runner@4.0.17': - resolution: {integrity: sha512-JmuQyf8aMWoo/LmNFppdpkfRVHJcsgzkbCA+/Bk7VfNH7RE6Ut2qxegeyx2j3ojtJtKIbIGy3h+KxGfYfk28YQ==} + '@vitest/runner@4.0.18': + resolution: {integrity: sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw==} '@vitest/snapshot@3.2.4': resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} - '@vitest/snapshot@4.0.17': - resolution: {integrity: sha512-npPelD7oyL+YQM2gbIYvlavlMVWUfNNGZPcu0aEUQXt7FXTuqhmgiYupPnAanhKvyP6Srs2pIbWo30K0RbDtRQ==} + '@vitest/snapshot@4.0.18': + resolution: {integrity: sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA==} '@vitest/spy@3.2.4': resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} - '@vitest/spy@4.0.17': - resolution: {integrity: sha512-I1bQo8QaP6tZlTomQNWKJE6ym4SHf3oLS7ceNjozxxgzavRAgZDc06T7kD8gb9bXKEgcLNt00Z+kZO6KaJ62Ew==} + '@vitest/spy@4.0.18': + resolution: {integrity: sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw==} '@vitest/utils@3.2.4': resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} - '@vitest/utils@4.0.17': - resolution: {integrity: sha512-RG6iy+IzQpa9SB8HAFHJ9Y+pTzI+h8553MrciN9eC6TFBErqrQaTas4vG+MVj8S4uKk8uTT2p0vgZPnTdxd96w==} + '@vitest/utils@4.0.18': + resolution: {integrity: sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA==} '@volar/kit@2.4.11': resolution: {integrity: sha512-ups5RKbMzMCr6RKafcCqDRnJhJDNWqo2vfekwOAj6psZ15v5TlcQFQAyokQJ3wZxVkzxrQM+TqTRDENfQEXpmA==} @@ -3291,10 +3434,6 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} - engines: {node: '>=12'} - ansi-regex@6.2.2: resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} @@ -4055,8 +4194,8 @@ packages: emmet@2.4.11: resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==} - emoji-regex@10.5.0: - resolution: {integrity: sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg==} + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -4075,6 +4214,10 @@ packages: resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} engines: {node: '>=10.13.0'} + enhanced-resolve@5.18.4: + resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} + engines: {node: '>=10.13.0'} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -4110,6 +4253,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -4200,8 +4348,8 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} @@ -4219,6 +4367,10 @@ packages: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} + expect-type@1.2.1: + resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} + engines: {node: '>=12.0.0'} + expect-type@1.3.0: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} @@ -4412,8 +4564,8 @@ packages: glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} hasBin: true glob@11.1.0: @@ -4491,8 +4643,8 @@ packages: hast-util-to-jsx-runtime@2.3.6: resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} - hast-util-to-parse5@8.0.0: - resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + hast-util-to-parse5@8.0.1: + resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} hast-util-to-string@3.0.1: resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} @@ -4988,6 +5140,10 @@ packages: resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} engines: {node: 20 || >=22} + lru-cache@11.2.4: + resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -5010,9 +5166,6 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - magic-string@0.30.19: - resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} - magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -5120,6 +5273,9 @@ packages: mdast-util-to-hast@13.2.0: resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + mdast-util-to-markdown@2.1.2: resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} @@ -5408,8 +5564,8 @@ packages: nlcst-to-string@4.0.0: resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} - node-abi@3.80.0: - resolution: {integrity: sha512-LyPuZJcI9HVwzXK1GPxWNzrr+vr8Hp/3UqlmWxxh8p54U1ZbclOqbSog9lWHaCX+dBaiGi6n/hIX+mKu74GmPA==} + node-abi@3.87.0: + resolution: {integrity: sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==} engines: {node: '>=10'} node-addon-api@7.1.1: @@ -5468,9 +5624,6 @@ packages: oniguruma-parser@0.12.1: resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} - oniguruma-to-es@4.3.3: - resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==} - oniguruma-to-es@4.3.4: resolution: {integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==} @@ -5575,8 +5728,8 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - path-scurry@2.0.0: - resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + path-scurry@2.0.1: + resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} engines: {node: 20 || >=22} path-to-regexp@6.3.0: @@ -5866,6 +6019,11 @@ packages: engines: {node: '>=14'} hasBin: true + prettier@3.8.0: + resolution: {integrity: sha512-yEPsovQfpxYfgWNhCfECjG5AQaO+K3dp6XERmOepyPDVqcJm+bjyCVO3pmU+nAPe0N5dDvekfGezt/EIiRe1TA==} + engines: {node: '>=14'} + hasBin: true + pretty-bytes@6.1.1: resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} engines: {node: ^14.13.1 || >=16.0.0} @@ -5886,12 +6044,12 @@ packages: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} - property-information@6.5.0: - resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} - property-information@7.0.0: resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + protobufjs@7.5.4: resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} engines: {node: '>=12.0.0'} @@ -6031,8 +6189,8 @@ packages: regex-utilities@2.3.0: resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} - regex@6.0.1: - resolution: {integrity: sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==} + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} rehype-expressive-code@0.41.2: resolution: {integrity: sha512-vHYfWO9WxAw6kHHctddOt+P4266BtyT1mrOIuxJD+1ELuvuJAa5uBIhYt0OVMyOhlvf57hzWOXJkHnMhpaHyxw==} @@ -6208,8 +6366,9 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sax@1.4.1: - resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + sax@1.4.4: + resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} + engines: {node: '>=11.0.0'} saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} @@ -6258,9 +6417,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@3.12.2: - resolution: {integrity: sha512-uIrKI+f9IPz1zDT+GMz+0RjzKJiijVr6WDWm9Pe3NNY6QigKCfifCEv9v9R2mDASKKjzjQ2QpFLcxaR3iHSnMA==} - shiki@3.21.0: resolution: {integrity: sha512-N65B/3bqL/TI2crrXr+4UivctrAGEjmsib5rPMMPpFp1xAx/w03v8WZ9RDDFYteXoEgY7qZ4HGgl5KBIu1153w==} @@ -6299,10 +6455,6 @@ packages: resolution: {integrity: sha512-TzobUYoEft/xBtb2voRPryAUIvYguG0V7Tt3de79I1WfXgCwelqVsGuZSnu3GFGRZhXR90AeEYIM+icuB/S06Q==} hasBin: true - smol-toml@1.4.2: - resolution: {integrity: sha512-rInDH6lCNiEyn3+hH8KVGFdbjc099j47+OSgbMrfDYX1CmXLfdKd7qi6IfcWj2wFxvSVkuI46M+wPGYfEOEj6g==} - engines: {node: '>= 18'} - smol-toml@1.6.0: resolution: {integrity: sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==} engines: {node: '>= 18'} @@ -6403,10 +6555,6 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - strip-ansi@7.1.2: resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} engines: {node: '>=12'} @@ -6753,6 +6901,9 @@ packages: typescript-auto-import-cache@0.3.5: resolution: {integrity: sha512-fAIveQKsoYj55CozUiBoj4b/7WpN0i4o74wiGY5JVUEoD0XiqDk1tJqTEjgzL2/AizKQrXxyRosSebyDzBZKjw==} + typescript-auto-import-cache@0.3.6: + resolution: {integrity: sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==} + typescript@5.8.3: resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} engines: {node: '>=14.17'} @@ -6826,6 +6977,9 @@ packages: unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + unist-util-modify-children@4.0.0: resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} @@ -7130,18 +7284,18 @@ packages: jsdom: optional: true - vitest@4.0.17: - resolution: {integrity: sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==} + vitest@4.0.18: + resolution: {integrity: sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.0.17 - '@vitest/browser-preview': 4.0.17 - '@vitest/browser-webdriverio': 4.0.17 - '@vitest/ui': 4.0.17 + '@vitest/browser-playwright': 4.0.18 + '@vitest/browser-preview': 4.0.18 + '@vitest/browser-webdriverio': 4.0.18 + '@vitest/ui': 4.0.18 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -7285,6 +7439,9 @@ packages: vscode-css-languageservice@6.3.2: resolution: {integrity: sha512-GEpPxrUTAeXWdZWHev1OJU9lz2Q2/PPBxQ2TIRmLGvQiH3WZbqaNoute0n0ewxlgtjzTW3AKZT+NHySk5Rf4Eg==} + vscode-css-languageservice@6.3.9: + resolution: {integrity: sha512-1tLWfp+TDM5ZuVWht3jmaY5y7O6aZmpeXLoHl5bv1QtRsRKt4xYGRMmdJa5Pqx/FTkgRbsna9R+Gn2xE+evVuA==} + vscode-html-languageservice@5.3.1: resolution: {integrity: sha512-ysUh4hFeW/WOWz/TO9gm08xigiSsV/FOAZ+DolgJfeLftna54YdmZ4A+lIn46RbdO3/Qv5QHTn1ZGqmrXQhZyA==} @@ -7532,8 +7689,8 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-queue@1.2.1: - resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} engines: {node: '>=12.20'} yocto-spinner@0.2.3: @@ -7623,7 +7780,7 @@ snapshots: '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 - lru-cache: 11.2.2 + lru-cache: 11.2.4 '@asamuzakjp/dom-selector@6.5.6': dependencies: @@ -7635,9 +7792,9 @@ snapshots: '@asamuzakjp/nwsapi@2.3.9': {} - '@astrojs/check@0.9.4(prettier@3.6.2)(typescript@5.9.3)': + '@astrojs/check@0.9.4(prettier@3.8.0)(typescript@5.9.3)': dependencies: - '@astrojs/language-server': 2.15.4(prettier@3.6.2)(typescript@5.9.3) + '@astrojs/language-server': 2.15.4(prettier@3.8.0)(typescript@5.9.3) chokidar: 4.0.3 kleur: 4.1.5 typescript: 5.9.3 @@ -7646,9 +7803,9 @@ snapshots: - prettier - prettier-plugin-astro - '@astrojs/check@0.9.6(prettier@3.6.2)(typescript@5.9.3)': + '@astrojs/check@0.9.6(prettier@3.8.0)(typescript@5.9.3)': dependencies: - '@astrojs/language-server': 2.16.3(prettier@3.6.2)(typescript@5.9.3) + '@astrojs/language-server': 2.16.3(prettier@3.8.0)(typescript@5.9.3) chokidar: 4.0.3 kleur: 4.1.5 typescript: 5.9.3 @@ -7665,7 +7822,7 @@ snapshots: '@astrojs/internal-helpers@0.7.5': {} - '@astrojs/language-server@2.15.4(prettier@3.6.2)(typescript@5.9.3)': + '@astrojs/language-server@2.15.4(prettier@3.8.0)(typescript@5.9.3)': dependencies: '@astrojs/compiler': 2.13.0 '@astrojs/yaml2ts': 0.2.2 @@ -7679,18 +7836,18 @@ snapshots: volar-service-css: 0.0.62(@volar/language-service@2.4.11) volar-service-emmet: 0.0.62(@volar/language-service@2.4.11) volar-service-html: 0.0.62(@volar/language-service@2.4.11) - volar-service-prettier: 0.0.62(@volar/language-service@2.4.11)(prettier@3.6.2) + volar-service-prettier: 0.0.62(@volar/language-service@2.4.11)(prettier@3.8.0) volar-service-typescript: 0.0.62(@volar/language-service@2.4.11) volar-service-typescript-twoslash-queries: 0.0.62(@volar/language-service@2.4.11) volar-service-yaml: 0.0.62(@volar/language-service@2.4.11) vscode-html-languageservice: 5.3.1 vscode-uri: 3.1.0 optionalDependencies: - prettier: 3.6.2 + prettier: 3.8.0 transitivePeerDependencies: - typescript - '@astrojs/language-server@2.16.3(prettier@3.6.2)(typescript@5.9.3)': + '@astrojs/language-server@2.16.3(prettier@3.8.0)(typescript@5.9.3)': dependencies: '@astrojs/compiler': 2.13.0 '@astrojs/yaml2ts': 0.2.2 @@ -7704,14 +7861,14 @@ snapshots: volar-service-css: 0.0.68(@volar/language-service@2.4.27) volar-service-emmet: 0.0.68(@volar/language-service@2.4.27) volar-service-html: 0.0.68(@volar/language-service@2.4.27) - volar-service-prettier: 0.0.68(@volar/language-service@2.4.27)(prettier@3.6.2) + volar-service-prettier: 0.0.68(@volar/language-service@2.4.27)(prettier@3.8.0) volar-service-typescript: 0.0.68(@volar/language-service@2.4.27) volar-service-typescript-twoslash-queries: 0.0.68(@volar/language-service@2.4.27) volar-service-yaml: 0.0.68(@volar/language-service@2.4.27) vscode-html-languageservice: 5.6.1 vscode-uri: 3.1.0 optionalDependencies: - prettier: 3.6.2 + prettier: 3.8.0 transitivePeerDependencies: - typescript @@ -7723,7 +7880,7 @@ snapshots: hast-util-from-html: 2.0.3 hast-util-to-text: 4.0.2 import-meta-resolve: 4.2.0 - js-yaml: 4.1.0 + js-yaml: 4.1.1 mdast-util-definitions: 6.0.0 rehype-raw: 7.0.0 rehype-stringify: 10.0.1 @@ -7731,8 +7888,8 @@ snapshots: remark-parse: 11.0.0 remark-rehype: 11.1.2 remark-smartypants: 3.0.2 - shiki: 3.12.2 - smol-toml: 1.4.2 + shiki: 3.21.0 + smol-toml: 1.6.0 unified: 11.0.5 unist-util-remove-position: 5.0.0 unist-util-visit: 5.0.0 @@ -7757,8 +7914,8 @@ snapshots: remark-parse: 11.0.0 remark-rehype: 11.1.2 remark-smartypants: 3.0.2 - shiki: 3.12.2 - smol-toml: 1.4.2 + shiki: 3.21.0 + smol-toml: 1.6.0 unified: 11.0.5 unist-util-remove-position: 5.0.0 unist-util-visit: 5.0.0 @@ -7933,10 +8090,10 @@ snapshots: '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) '@babel/helpers': 7.28.4 - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.6 '@babel/template': 7.27.2 '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/types': 7.28.6 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3 @@ -7948,8 +8105,8 @@ snapshots: '@babel/generator@7.28.3': dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 @@ -7975,7 +8132,7 @@ snapshots: '@babel/helper-module-imports@7.27.1': dependencies: '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/types': 7.28.6 transitivePeerDependencies: - supports-color @@ -7983,7 +8140,7 @@ snapshots: dependencies: '@babel/core': 7.28.4 '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 '@babel/traverse': 7.28.4 transitivePeerDependencies: - supports-color @@ -8005,7 +8162,7 @@ snapshots: '@babel/helpers@7.28.4': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.4 + '@babel/types': 7.28.6 '@babel/parser@7.26.9': dependencies: @@ -8021,12 +8178,16 @@ snapshots: '@babel/parser@7.28.4': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.6 '@babel/parser@7.28.5': dependencies: '@babel/types': 7.28.5 + '@babel/parser@7.28.6': + dependencies: + '@babel/types': 7.28.6 + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 @@ -8056,9 +8217,9 @@ snapshots: '@babel/code-frame': 7.27.1 '@babel/generator': 7.28.3 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.6 '@babel/template': 7.27.2 - '@babel/types': 7.28.4 + '@babel/types': 7.28.6 debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -8083,12 +8244,12 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@babel/types@7.28.4': + '@babel/types@7.28.5': dependencies: '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 - '@babel/types@7.28.5': + '@babel/types@7.28.6': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 @@ -8232,153 +8393,231 @@ snapshots: '@esbuild/aix-ppc64@0.25.10': optional: true + '@esbuild/aix-ppc64@0.25.12': + optional: true + '@esbuild/android-arm64@0.24.2': optional: true '@esbuild/android-arm64@0.25.10': optional: true + '@esbuild/android-arm64@0.25.12': + optional: true + '@esbuild/android-arm@0.24.2': optional: true '@esbuild/android-arm@0.25.10': optional: true + '@esbuild/android-arm@0.25.12': + optional: true + '@esbuild/android-x64@0.24.2': optional: true '@esbuild/android-x64@0.25.10': optional: true + '@esbuild/android-x64@0.25.12': + optional: true + '@esbuild/darwin-arm64@0.24.2': optional: true '@esbuild/darwin-arm64@0.25.10': optional: true + '@esbuild/darwin-arm64@0.25.12': + optional: true + '@esbuild/darwin-x64@0.24.2': optional: true '@esbuild/darwin-x64@0.25.10': optional: true + '@esbuild/darwin-x64@0.25.12': + optional: true + '@esbuild/freebsd-arm64@0.24.2': optional: true '@esbuild/freebsd-arm64@0.25.10': optional: true + '@esbuild/freebsd-arm64@0.25.12': + optional: true + '@esbuild/freebsd-x64@0.24.2': optional: true '@esbuild/freebsd-x64@0.25.10': optional: true + '@esbuild/freebsd-x64@0.25.12': + optional: true + '@esbuild/linux-arm64@0.24.2': optional: true '@esbuild/linux-arm64@0.25.10': optional: true + '@esbuild/linux-arm64@0.25.12': + optional: true + '@esbuild/linux-arm@0.24.2': optional: true '@esbuild/linux-arm@0.25.10': optional: true + '@esbuild/linux-arm@0.25.12': + optional: true + '@esbuild/linux-ia32@0.24.2': optional: true '@esbuild/linux-ia32@0.25.10': optional: true + '@esbuild/linux-ia32@0.25.12': + optional: true + '@esbuild/linux-loong64@0.24.2': optional: true '@esbuild/linux-loong64@0.25.10': optional: true + '@esbuild/linux-loong64@0.25.12': + optional: true + '@esbuild/linux-mips64el@0.24.2': optional: true '@esbuild/linux-mips64el@0.25.10': optional: true + '@esbuild/linux-mips64el@0.25.12': + optional: true + '@esbuild/linux-ppc64@0.24.2': optional: true '@esbuild/linux-ppc64@0.25.10': optional: true + '@esbuild/linux-ppc64@0.25.12': + optional: true + '@esbuild/linux-riscv64@0.24.2': optional: true '@esbuild/linux-riscv64@0.25.10': optional: true + '@esbuild/linux-riscv64@0.25.12': + optional: true + '@esbuild/linux-s390x@0.24.2': optional: true '@esbuild/linux-s390x@0.25.10': optional: true + '@esbuild/linux-s390x@0.25.12': + optional: true + '@esbuild/linux-x64@0.24.2': optional: true '@esbuild/linux-x64@0.25.10': optional: true + '@esbuild/linux-x64@0.25.12': + optional: true + '@esbuild/netbsd-arm64@0.24.2': optional: true '@esbuild/netbsd-arm64@0.25.10': optional: true + '@esbuild/netbsd-arm64@0.25.12': + optional: true + '@esbuild/netbsd-x64@0.24.2': optional: true '@esbuild/netbsd-x64@0.25.10': optional: true + '@esbuild/netbsd-x64@0.25.12': + optional: true + '@esbuild/openbsd-arm64@0.24.2': optional: true '@esbuild/openbsd-arm64@0.25.10': optional: true + '@esbuild/openbsd-arm64@0.25.12': + optional: true + '@esbuild/openbsd-x64@0.24.2': optional: true '@esbuild/openbsd-x64@0.25.10': optional: true + '@esbuild/openbsd-x64@0.25.12': + optional: true + '@esbuild/openharmony-arm64@0.25.10': optional: true + '@esbuild/openharmony-arm64@0.25.12': + optional: true + '@esbuild/sunos-x64@0.24.2': optional: true '@esbuild/sunos-x64@0.25.10': optional: true + '@esbuild/sunos-x64@0.25.12': + optional: true + '@esbuild/win32-arm64@0.24.2': optional: true '@esbuild/win32-arm64@0.25.10': optional: true + '@esbuild/win32-arm64@0.25.12': + optional: true + '@esbuild/win32-ia32@0.24.2': optional: true '@esbuild/win32-ia32@0.25.10': optional: true + '@esbuild/win32-ia32@0.25.12': + optional: true + '@esbuild/win32-x64@0.24.2': optional: true '@esbuild/win32-x64@0.25.10': optional: true + '@esbuild/win32-x64@0.25.12': + optional: true + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.6.1))': dependencies: eslint: 9.39.2(jiti@2.6.1) @@ -8435,7 +8674,7 @@ snapshots: postcss: 8.5.6 postcss-nested: 6.2.0(postcss@8.5.6) unist-util-visit: 5.0.0 - unist-util-visit-parents: 6.0.1 + unist-util-visit-parents: 6.0.2 '@expressive-code/plugin-frames@0.41.2': dependencies: @@ -8444,7 +8683,7 @@ snapshots: '@expressive-code/plugin-shiki@0.41.2': dependencies: '@expressive-code/core': 0.41.2 - shiki: 3.12.2 + shiki: 3.21.0 '@expressive-code/plugin-text-markers@0.41.2': dependencies: @@ -8570,34 +8809,34 @@ snapshots: '@inquirer/ansi@1.0.2': optional: true - '@inquirer/confirm@5.1.21(@types/node@25.2.0)': + '@inquirer/confirm@5.1.21(@types/node@25.1.0)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.2.0) - '@inquirer/type': 3.0.10(@types/node@25.2.0) + '@inquirer/core': 10.3.2(@types/node@25.1.0) + '@inquirer/type': 3.0.10(@types/node@25.1.0) optionalDependencies: - '@types/node': 25.2.0 + '@types/node': 25.1.0 optional: true - '@inquirer/core@10.3.2(@types/node@25.2.0)': + '@inquirer/core@10.3.2(@types/node@25.1.0)': dependencies: '@inquirer/ansi': 1.0.2 '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.2.0) + '@inquirer/type': 3.0.10(@types/node@25.1.0) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.2.0 + '@types/node': 25.1.0 optional: true '@inquirer/figures@1.0.15': optional: true - '@inquirer/type@3.0.10(@types/node@25.2.0)': + '@inquirer/type@3.0.10(@types/node@25.1.0)': optionalDependencies: - '@types/node': 25.2.0 + '@types/node': 25.1.0 optional: true '@isaacs/balanced-match@4.0.1': {} @@ -8610,7 +8849,7 @@ snapshots: dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 + strip-ansi: 7.1.2 strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 @@ -9371,13 +9610,6 @@ snapshots: '@sec-ant/readable-stream@0.4.1': {} - '@shikijs/core@3.12.2': - dependencies: - '@shikijs/types': 3.12.2 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - hast-util-to-html: 9.0.5 - '@shikijs/core@3.21.0': dependencies: '@shikijs/types': 3.21.0 @@ -9385,12 +9617,6 @@ snapshots: '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 - '@shikijs/engine-javascript@3.12.2': - dependencies: - '@shikijs/types': 3.12.2 - '@shikijs/vscode-textmate': 10.0.2 - oniguruma-to-es: 4.3.3 - '@shikijs/engine-javascript@3.21.0': dependencies: '@shikijs/types': 3.21.0 @@ -9402,28 +9628,15 @@ snapshots: '@shikijs/types': 1.29.2 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/engine-oniguruma@3.12.2': - dependencies: - '@shikijs/types': 3.12.2 - '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/engine-oniguruma@3.21.0': dependencies: '@shikijs/types': 3.21.0 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@3.12.2': - dependencies: - '@shikijs/types': 3.12.2 - '@shikijs/langs@3.21.0': dependencies: '@shikijs/types': 3.21.0 - '@shikijs/themes@3.12.2': - dependencies: - '@shikijs/types': 3.12.2 - '@shikijs/themes@3.21.0': dependencies: '@shikijs/types': 3.21.0 @@ -9433,11 +9646,6 @@ snapshots: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - '@shikijs/types@3.12.2': - dependencies: - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - '@shikijs/types@3.21.0': dependencies: '@shikijs/vscode-textmate': 10.0.2 @@ -9458,7 +9666,7 @@ snapshots: '@tailwindcss/node@4.1.18': dependencies: '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.18.3 + enhanced-resolve: 5.18.4 jiti: 2.6.1 lightningcss: 1.30.2 magic-string: 0.30.21 @@ -9625,7 +9833,7 @@ snapshots: '@types/fontkit@2.0.8': dependencies: - '@types/node': 24.10.0 + '@types/node': 25.1.0 '@types/geojson@7946.0.16': {} @@ -9667,7 +9875,7 @@ snapshots: dependencies: undici-types: 7.16.0 - '@types/node@25.2.0': + '@types/node@25.1.0': dependencies: undici-types: 7.16.0 @@ -9685,7 +9893,7 @@ snapshots: '@types/sax@1.2.7': dependencies: - '@types/node': 24.10.0 + '@types/node': 25.1.0 '@types/stats.js@0.17.4': {} @@ -9715,32 +9923,32 @@ snapshots: '@types/webxr@0.5.22': {} - '@typescript-eslint/parser@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.53.1 - '@typescript-eslint/types': 8.53.1 - '@typescript-eslint/typescript-estree': 8.53.1(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.53.1 + '@typescript-eslint/scope-manager': 8.54.0 + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.54.0 debug: 4.4.3 eslint: 9.39.2(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.53.1(typescript@5.9.3)': + '@typescript-eslint/project-service@8.54.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.53.1(typescript@5.9.3) - '@typescript-eslint/types': 8.53.1 + '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) + '@typescript-eslint/types': 8.54.0 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/rule-tester@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/rule-tester@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/parser': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.53.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) ajv: 6.12.6 eslint: 9.39.2(jiti@2.6.1) json-stable-stringify-without-jsonify: 1.0.1 @@ -9750,23 +9958,23 @@ snapshots: - supports-color - typescript - '@typescript-eslint/scope-manager@8.53.1': + '@typescript-eslint/scope-manager@8.54.0': dependencies: - '@typescript-eslint/types': 8.53.1 - '@typescript-eslint/visitor-keys': 8.53.1 + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/visitor-keys': 8.54.0 - '@typescript-eslint/tsconfig-utils@8.53.1(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.54.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/types@8.53.1': {} + '@typescript-eslint/types@8.54.0': {} - '@typescript-eslint/typescript-estree@8.53.1(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.54.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.53.1(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.53.1(typescript@5.9.3) - '@typescript-eslint/types': 8.53.1 - '@typescript-eslint/visitor-keys': 8.53.1 + '@typescript-eslint/project-service': 8.54.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.54.0(typescript@5.9.3) + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/visitor-keys': 8.54.0 debug: 4.4.3 minimatch: 9.0.5 semver: 7.7.3 @@ -9776,20 +9984,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.53.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.53.1 - '@typescript-eslint/types': 8.53.1 - '@typescript-eslint/typescript-estree': 8.53.1(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.54.0 + '@typescript-eslint/types': 8.54.0 + '@typescript-eslint/typescript-estree': 8.54.0(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.53.1': + '@typescript-eslint/visitor-keys@8.54.0': dependencies: - '@typescript-eslint/types': 8.53.1 + '@typescript-eslint/types': 8.54.0 eslint-visitor-keys: 4.2.1 '@typescript/analyze-trace@0.10.1': @@ -9828,16 +10036,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/browser@3.2.4(msw@2.10.2(@types/node@25.2.0)(typescript@5.9.3))(vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)': + '@vitest/browser@3.2.4(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4)': dependencies: '@testing-library/dom': 10.4.0 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) - '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@25.2.0)(typescript@5.9.3))(vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/utils': 3.2.4 magic-string: 0.30.17 sirv: 3.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.2.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) ws: 8.18.3 transitivePeerDependencies: - bufferutil @@ -9859,9 +10067,9 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.2.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.2.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) optionalDependencies: - '@vitest/browser': 3.2.4(msw@2.10.2(@types/node@25.2.0)(typescript@5.9.3))(vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) + '@vitest/browser': 3.2.4(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) transitivePeerDependencies: - supports-color @@ -9873,38 +10081,38 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/expect@4.0.17': + '@vitest/expect@4.0.18': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.2 - '@vitest/spy': 4.0.17 - '@vitest/utils': 4.0.17 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@3.2.4(msw@2.10.2(@types/node@25.2.0)(typescript@5.9.3))(vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/mocker@3.2.4(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 - magic-string: 0.30.19 + magic-string: 0.30.21 optionalDependencies: - msw: 2.10.2(@types/node@25.2.0)(typescript@5.9.3) - vite: 6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + msw: 2.10.2(@types/node@25.1.0)(typescript@5.9.3) + vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) - '@vitest/mocker@4.0.17(msw@2.10.2(@types/node@25.2.0)(typescript@5.9.3))(vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': + '@vitest/mocker@4.0.18(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': dependencies: - '@vitest/spy': 4.0.17 + '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - msw: 2.10.2(@types/node@25.2.0)(typescript@5.9.3) - vite: 6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + msw: 2.10.2(@types/node@25.1.0)(typescript@5.9.3) + vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 - '@vitest/pretty-format@4.0.17': + '@vitest/pretty-format@4.0.18': dependencies: tinyrainbow: 3.0.3 @@ -9914,9 +10122,9 @@ snapshots: pathe: 2.0.3 strip-literal: 3.0.0 - '@vitest/runner@4.0.17': + '@vitest/runner@4.0.18': dependencies: - '@vitest/utils': 4.0.17 + '@vitest/utils': 4.0.18 pathe: 2.0.3 '@vitest/snapshot@3.2.4': @@ -9925,9 +10133,9 @@ snapshots: magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/snapshot@4.0.17': + '@vitest/snapshot@4.0.18': dependencies: - '@vitest/pretty-format': 4.0.17 + '@vitest/pretty-format': 4.0.18 magic-string: 0.30.21 pathe: 2.0.3 @@ -9935,7 +10143,7 @@ snapshots: dependencies: tinyspy: 4.0.3 - '@vitest/spy@4.0.17': {} + '@vitest/spy@4.0.18': {} '@vitest/utils@3.2.4': dependencies: @@ -9943,9 +10151,9 @@ snapshots: loupe: 3.1.4 tinyrainbow: 2.0.0 - '@vitest/utils@4.0.17': + '@vitest/utils@4.0.18': dependencies: - '@vitest/pretty-format': 4.0.17 + '@vitest/pretty-format': 4.0.18 tinyrainbow: 3.0.3 '@volar/kit@2.4.11(typescript@5.9.3)': @@ -10042,9 +10250,9 @@ snapshots: '@vtbag/element-crossing@1.1.0': {} - '@vtbag/inspection-chamber@1.0.23(prettier@3.6.2)(typescript@5.9.3)': + '@vtbag/inspection-chamber@1.0.23(prettier@3.8.0)(typescript@5.9.3)': dependencies: - '@astrojs/check': 0.9.6(prettier@3.6.2)(typescript@5.9.3) + '@astrojs/check': 0.9.6(prettier@3.8.0)(typescript@5.9.3) transitivePeerDependencies: - prettier - prettier-plugin-astro @@ -10200,8 +10408,6 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.1.0: {} - ansi-regex@6.2.2: {} ansi-styles@4.3.0: @@ -10271,11 +10477,11 @@ snapshots: marked-smartypants: 1.1.9(marked@12.0.2) ultrahtml: 1.6.0 - astro-vtbot@2.1.10(prettier@3.6.2)(typescript@5.9.3): + astro-vtbot@2.1.10(prettier@3.8.0)(typescript@5.9.3): dependencies: '@vtbag/cam-shaft': 1.0.6 '@vtbag/element-crossing': 1.1.0 - '@vtbag/inspection-chamber': 1.0.23(prettier@3.6.2)(typescript@5.9.3) + '@vtbag/inspection-chamber': 1.0.23(prettier@3.8.0)(typescript@5.9.3) '@vtbag/turn-signal': 1.3.1 '@vtbag/utensil-drawer': 1.2.14 transitivePeerDependencies: @@ -10308,7 +10514,7 @@ snapshots: dlv: 1.1.3 dset: 3.1.4 es-module-lexer: 1.7.0 - esbuild: 0.25.10 + esbuild: 0.25.12 estree-walker: 3.0.3 flattie: 1.1.1 fontace: 0.3.1 @@ -10504,16 +10710,16 @@ snapshots: bun-types@1.2.22(@types/react@19.1.8): dependencies: - '@types/node': 24.10.0 + '@types/node': 25.1.0 '@types/react': 19.1.8 bun-types@1.3.8: dependencies: - '@types/node': 24.10.0 + '@types/node': 25.1.0 - bundle-require@5.1.0(esbuild@0.25.10): + bundle-require@5.1.0(esbuild@0.25.12): dependencies: - esbuild: 0.25.10 + esbuild: 0.25.12 load-tsconfig: 0.2.5 cac@6.7.14: {} @@ -11041,7 +11247,7 @@ snapshots: dependencies: chalk: 4.1.2 fs-extra: 11.3.0 - glob: 10.4.5 + glob: 10.5.0 ora: 5.4.1 tslib: 2.8.1 typescript: 5.9.3 @@ -11064,7 +11270,7 @@ snapshots: '@emmetio/abbreviation': 2.3.3 '@emmetio/css-abbreviation': 2.1.8 - emoji-regex@10.5.0: {} + emoji-regex@10.6.0: {} emoji-regex@8.0.0: {} @@ -11082,6 +11288,11 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.2.3 + enhanced-resolve@5.18.4: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + entities@4.5.0: {} entities@6.0.1: {} @@ -11163,6 +11374,35 @@ snapshots: '@esbuild/win32-ia32': 0.25.10 '@esbuild/win32-x64': 0.25.10 + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + escalade@3.2.0: {} escape-string-regexp@4.0.0: {} @@ -11281,7 +11521,7 @@ snapshots: esutils@2.0.3: {} - eventemitter3@5.0.1: {} + eventemitter3@5.0.4: {} events@3.3.0: {} @@ -11305,6 +11545,8 @@ snapshots: expand-template@2.0.3: optional: true + expect-type@1.2.1: {} + expect-type@1.3.0: {} expressive-code-twoslash@0.5.3(@expressive-code/core@0.41.2)(expressive-code@0.41.2)(typescript@5.9.3): @@ -11488,7 +11730,7 @@ snapshots: glob-to-regexp@0.4.1: {} - glob@10.4.5: + glob@10.5.0: dependencies: foreground-child: 3.3.1 jackspeak: 3.4.3 @@ -11504,7 +11746,7 @@ snapshots: minimatch: 10.1.1 minipass: 7.1.2 package-json-from-dist: 1.0.1 - path-scurry: 2.0.0 + path-scurry: 2.0.1 globals@14.0.0: {} @@ -11546,7 +11788,7 @@ snapshots: hast-util-phrasing: 3.0.1 hast-util-whitespace: 3.0.0 html-whitespace-sensitive-tag-names: 3.0.1 - unist-util-visit-parents: 6.0.1 + unist-util-visit-parents: 6.0.2 hast-util-from-html@2.0.3: dependencies: @@ -11586,7 +11828,7 @@ snapshots: hast-util-embedded: 3.0.0 hast-util-is-element: 3.0.0 hast-util-whitespace: 3.0.0 - unist-util-is: 6.0.0 + unist-util-is: 6.0.1 hast-util-parse-selector@4.0.0: dependencies: @@ -11606,9 +11848,9 @@ snapshots: '@types/unist': 3.0.3 '@ungap/structured-clone': 1.3.0 hast-util-from-parse5: 8.0.3 - hast-util-to-parse5: 8.0.0 + hast-util-to-parse5: 8.0.1 html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.0 + mdast-util-to-hast: 13.2.1 parse5: 7.3.0 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 @@ -11689,12 +11931,12 @@ snapshots: transitivePeerDependencies: - supports-color - hast-util-to-parse5@8.0.0: + hast-util-to-parse5@8.0.1: dependencies: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 devlop: 1.1.0 - property-information: 6.5.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 web-namespaces: 2.0.1 zwitch: 2.0.4 @@ -11905,7 +12147,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 24.10.0 + '@types/node': 25.1.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -12116,6 +12358,8 @@ snapshots: lru-cache@11.2.2: {} + lru-cache@11.2.4: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -12136,10 +12380,6 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.4 - magic-string@0.30.19: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -12152,8 +12392,8 @@ snapshots: magicast@0.5.1: dependencies: - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/parser': 7.28.6 + '@babel/types': 7.28.6 source-map-js: 1.2.1 make-dir@4.0.0: @@ -12223,8 +12463,8 @@ snapshots: dependencies: '@types/mdast': 4.0.4 escape-string-regexp: 5.0.0 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 mdast-util-from-markdown@2.0.2: dependencies: @@ -12364,7 +12604,7 @@ snapshots: mdast-util-phrasing@4.1.0: dependencies: '@types/mdast': 4.0.4 - unist-util-is: 6.0.0 + unist-util-is: 6.0.1 mdast-util-to-hast@13.2.0: dependencies: @@ -12378,6 +12618,18 @@ snapshots: unist-util-visit: 5.0.0 vfile: 6.0.3 + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + mdast-util-to-markdown@2.1.2: dependencies: '@types/mdast': 4.0.4 @@ -12788,12 +13040,12 @@ snapshots: ms@2.1.3: {} - msw@2.10.2(@types/node@25.2.0)(typescript@5.9.3): + msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3): dependencies: '@bundled-es-modules/cookie': 2.0.1 '@bundled-es-modules/statuses': 1.0.1 '@bundled-es-modules/tough-cookie': 0.1.6 - '@inquirer/confirm': 5.1.21(@types/node@25.2.0) + '@inquirer/confirm': 5.1.21(@types/node@25.1.0) '@mswjs/interceptors': 0.39.8 '@open-draft/deferred-promise': 2.2.0 '@open-draft/until': 2.1.0 @@ -12847,7 +13099,7 @@ snapshots: dependencies: '@types/nlcst': 2.0.3 - node-abi@3.80.0: + node-abi@3.87.0: dependencies: semver: 7.7.3 optional: true @@ -12900,16 +13152,10 @@ snapshots: oniguruma-parser@0.12.1: {} - oniguruma-to-es@4.3.3: - dependencies: - oniguruma-parser: 0.12.1 - regex: 6.0.1 - regex-recursion: 6.0.2 - oniguruma-to-es@4.3.4: dependencies: oniguruma-parser: 0.12.1 - regex: 6.0.1 + regex: 6.1.0 regex-recursion: 6.0.2 onnxruntime-common@1.23.0-dev.20250703-7fc6235861: {} @@ -12957,7 +13203,7 @@ snapshots: p-limit@6.2.0: dependencies: - yocto-queue: 1.2.1 + yocto-queue: 1.2.2 p-locate@4.1.0: dependencies: @@ -12969,7 +13215,7 @@ snapshots: p-queue@8.1.1: dependencies: - eventemitter3: 5.0.1 + eventemitter3: 5.0.4 p-timeout: 6.1.4 p-timeout@6.1.4: {} @@ -13034,9 +13280,9 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 - path-scurry@2.0.0: + path-scurry@2.0.1: dependencies: - lru-cache: 11.2.2 + lru-cache: 11.2.4 minipass: 7.1.2 path-to-regexp@6.3.0: @@ -13292,7 +13538,7 @@ snapshots: minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 2.0.0 - node-abi: 3.80.0 + node-abi: 3.87.0 pump: 3.0.3 rc: 1.2.8 simple-get: 4.0.1 @@ -13307,6 +13553,8 @@ snapshots: prettier@3.6.2: {} + prettier@3.8.0: {} + pretty-bytes@6.1.1: {} pretty-format@27.5.1: @@ -13326,10 +13574,10 @@ snapshots: kleur: 3.0.3 sisteransi: 1.0.5 - property-information@6.5.0: {} - property-information@7.0.0: {} + property-information@7.1.0: {} + protobufjs@7.5.4: dependencies: '@protobufjs/aspromise': 1.1.2 @@ -13342,7 +13590,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 24.10.0 + '@types/node': 25.1.0 long: 5.3.2 psl@1.15.0: @@ -13495,7 +13743,7 @@ snapshots: regex-utilities@2.3.0: {} - regex@6.0.1: + regex@6.1.0: dependencies: regex-utilities: 2.3.0 @@ -13601,7 +13849,7 @@ snapshots: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - mdast-util-to-hast: 13.2.0 + mdast-util-to-hast: 13.2.1 unified: 11.0.5 vfile: 6.0.3 @@ -13791,7 +14039,7 @@ snapshots: safer-buffer@2.1.2: {} - sax@1.4.1: {} + sax@1.4.4: {} saxes@6.0.0: dependencies: @@ -13856,17 +14104,6 @@ snapshots: shebang-regex@3.0.0: {} - shiki@3.12.2: - dependencies: - '@shikijs/core': 3.12.2 - '@shikijs/engine-javascript': 3.12.2 - '@shikijs/engine-oniguruma': 3.12.2 - '@shikijs/langs': 3.12.2 - '@shikijs/themes': 3.12.2 - '@shikijs/types': 3.12.2 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - shiki@3.21.0: dependencies: '@shikijs/core': 3.21.0 @@ -13911,12 +14148,10 @@ snapshots: '@types/node': 17.0.45 '@types/sax': 1.2.7 arg: 5.0.2 - sax: 1.4.1 + sax: 1.4.4 smartypants@0.2.2: {} - smol-toml@1.4.2: {} - smol-toml@1.6.0: {} source-map-js@1.2.1: {} @@ -14004,7 +14239,7 @@ snapshots: string-width@7.2.0: dependencies: - emoji-regex: 10.5.0 + emoji-regex: 10.6.0 get-east-asian-width: 1.4.0 strip-ansi: 7.1.2 @@ -14021,10 +14256,6 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.1.0 - strip-ansi@7.1.2: dependencies: ansi-regex: 6.2.2 @@ -14060,7 +14291,7 @@ snapshots: dependencies: '@jridgewell/gen-mapping': 0.3.13 commander: 4.1.1 - glob: 10.4.5 + glob: 10.5.0 lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.6 @@ -14138,7 +14369,7 @@ snapshots: test-exclude@7.0.1: dependencies: '@istanbuljs/schema': 0.1.3 - glob: 10.4.5 + glob: 10.5.0 minimatch: 9.0.5 thenify-all@1.6.0: @@ -14275,12 +14506,12 @@ snapshots: tsup@8.5.0(jiti@2.6.1)(postcss@8.5.6)(tsx@4.20.6)(typescript@5.9.3)(yaml@2.8.1): dependencies: - bundle-require: 5.1.0(esbuild@0.25.10) + bundle-require: 5.1.0(esbuild@0.25.12) cac: 6.7.14 chokidar: 4.0.3 consola: 3.4.0 debug: 4.4.3 - esbuild: 0.25.10 + esbuild: 0.25.12 fix-dts-default-cjs-exports: 1.0.0 joycon: 3.1.1 picocolors: 1.1.1 @@ -14356,6 +14587,10 @@ snapshots: dependencies: semver: 7.7.3 + typescript-auto-import-cache@0.3.6: + dependencies: + semver: 7.7.3 + typescript@5.8.3: {} typescript@5.9.3: {} @@ -14377,7 +14612,7 @@ snapshots: citty: 0.1.6 consola: 3.4.0 defu: 6.1.4 - esbuild: 0.25.10 + esbuild: 0.25.12 fix-dts-default-cjs-exports: 1.0.0 hookable: 5.5.3 jiti: 2.6.1 @@ -14455,12 +14690,16 @@ snapshots: unist-util-find-after@5.0.0: dependencies: '@types/unist': 3.0.3 - unist-util-is: 6.0.0 + unist-util-is: 6.0.1 unist-util-is@6.0.0: dependencies: '@types/unist': 3.0.3 + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + unist-util-modify-children@4.0.0: dependencies: '@types/unist': 3.0.3 @@ -14495,13 +14734,13 @@ snapshots: unist-util-visit-parents@6.0.2: dependencies: '@types/unist': 3.0.3 - unist-util-is: 6.0.0 + unist-util-is: 6.0.1 unist-util-visit@5.0.0: dependencies: '@types/unist': 3.0.3 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 universal-user-agent@6.0.1: {} @@ -14535,7 +14774,7 @@ snapshots: chokidar: 5.0.0 destr: 2.0.5 h3: 1.15.5 - lru-cache: 11.2.2 + lru-cache: 11.2.4 node-fetch-native: 1.6.7 ofetch: 1.5.1 ufo: 1.6.3 @@ -14625,13 +14864,13 @@ snapshots: transitivePeerDependencies: - rollup - vite-node@3.2.4(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): + vite-node@3.2.4(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - jiti @@ -14652,7 +14891,7 @@ snapshots: vite@6.3.6(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): dependencies: - esbuild: 0.25.10 + esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 @@ -14669,7 +14908,7 @@ snapshots: vite@6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): dependencies: - esbuild: 0.25.10 + esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 @@ -14684,16 +14923,16 @@ snapshots: tsx: 4.20.6 yaml: 2.8.1 - vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): + vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): dependencies: - esbuild: 0.25.10 + esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 rollup: 4.34.8 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 25.2.0 + '@types/node': 25.1.0 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.30.2 @@ -14705,11 +14944,11 @@ snapshots: optionalDependencies: vite: 6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) - vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.2.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.2.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.1.0)(@vitest/browser@3.2.4)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@25.2.0)(typescript@5.9.3))(vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -14717,23 +14956,23 @@ snapshots: '@vitest/utils': 3.2.4 chai: 5.2.0 debug: 4.4.3 - expect-type: 1.3.0 + expect-type: 1.2.1 magic-string: 0.30.21 pathe: 2.0.3 picomatch: 4.0.3 - std-env: 3.10.0 + std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) - vite-node: 3.2.4(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 25.2.0 - '@vitest/browser': 3.2.4(msw@2.10.2(@types/node@25.2.0)(typescript@5.9.3))(vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) + '@types/node': 25.1.0 + '@vitest/browser': 3.2.4(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))(vitest@3.2.4) jsdom: 27.0.0(canvas@3.2.0)(postcss@8.5.6) transitivePeerDependencies: - jiti @@ -14749,15 +14988,15 @@ snapshots: - tsx - yaml - vitest@4.0.17(@types/node@25.2.0)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.2.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): + vitest@4.0.18(@types/node@25.1.0)(jiti@2.6.1)(jsdom@27.0.0(canvas@3.2.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1): dependencies: - '@vitest/expect': 4.0.17 - '@vitest/mocker': 4.0.17(msw@2.10.2(@types/node@25.2.0)(typescript@5.9.3))(vite@6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) - '@vitest/pretty-format': 4.0.17 - '@vitest/runner': 4.0.17 - '@vitest/snapshot': 4.0.17 - '@vitest/spy': 4.0.17 - '@vitest/utils': 4.0.17 + '@vitest/expect': 4.0.18 + '@vitest/mocker': 4.0.18(msw@2.10.2(@types/node@25.1.0)(typescript@5.9.3))(vite@6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/pretty-format': 4.0.18 + '@vitest/runner': 4.0.18 + '@vitest/snapshot': 4.0.18 + '@vitest/spy': 4.0.18 + '@vitest/utils': 4.0.18 es-module-lexer: 1.7.0 expect-type: 1.3.0 magic-string: 0.30.21 @@ -14769,10 +15008,10 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 6.4.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) + vite: 6.4.1(@types/node@25.1.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 25.2.0 + '@types/node': 25.1.0 jsdom: 27.0.0(canvas@3.2.0)(postcss@8.5.6) transitivePeerDependencies: - jiti @@ -14797,7 +15036,7 @@ snapshots: volar-service-css@0.0.68(@volar/language-service@2.4.27): dependencies: - vscode-css-languageservice: 6.3.2 + vscode-css-languageservice: 6.3.9 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 optionalDependencies: @@ -14837,19 +15076,19 @@ snapshots: optionalDependencies: '@volar/language-service': 2.4.27 - volar-service-prettier@0.0.62(@volar/language-service@2.4.11)(prettier@3.6.2): + volar-service-prettier@0.0.62(@volar/language-service@2.4.11)(prettier@3.8.0): dependencies: vscode-uri: 3.1.0 optionalDependencies: '@volar/language-service': 2.4.11 - prettier: 3.6.2 + prettier: 3.8.0 - volar-service-prettier@0.0.68(@volar/language-service@2.4.27)(prettier@3.6.2): + volar-service-prettier@0.0.68(@volar/language-service@2.4.27)(prettier@3.8.0): dependencies: vscode-uri: 3.1.0 optionalDependencies: '@volar/language-service': 2.4.27 - prettier: 3.6.2 + prettier: 3.8.0 volar-service-typescript-twoslash-queries@0.0.62(@volar/language-service@2.4.11): dependencies: @@ -14878,7 +15117,7 @@ snapshots: dependencies: path-browserify: 1.0.1 semver: 7.7.3 - typescript-auto-import-cache: 0.3.5 + typescript-auto-import-cache: 0.3.6 vscode-languageserver-textdocument: 1.0.12 vscode-nls: 5.2.0 vscode-uri: 3.1.0 @@ -14906,6 +15145,13 @@ snapshots: vscode-languageserver-types: 3.17.5 vscode-uri: 3.1.0 + vscode-css-languageservice@6.3.9: + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.1.0 + vscode-html-languageservice@5.3.1: dependencies: '@vscode/l10n': 0.0.18 @@ -15144,7 +15390,7 @@ snapshots: ajv: 8.17.1 ajv-draft-04: 1.0.0(ajv@8.17.1) lodash: 4.17.21 - prettier: 3.6.2 + prettier: 3.8.0 request-light: 0.5.8 vscode-json-languageservice: 4.1.8 vscode-languageserver: 9.0.1 @@ -15185,7 +15431,7 @@ snapshots: yocto-queue@0.1.0: {} - yocto-queue@1.2.1: {} + yocto-queue@1.2.2: {} yocto-spinner@0.2.3: dependencies: From 3b6ee060f2079a0c327c0580657e73ad7ee49c29 Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Fri, 30 Jan 2026 11:35:29 +0100 Subject: [PATCH 26/38] Add a base for the rule --- .../eslint-plugin/src/rules/unwrappedPojos.ts | 20 ++++++++++++++++ .../tests/unwrappedPojos.test.ts | 23 +++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 packages/eslint-plugin/src/rules/unwrappedPojos.ts create mode 100644 packages/eslint-plugin/tests/unwrappedPojos.test.ts diff --git a/packages/eslint-plugin/src/rules/unwrappedPojos.ts b/packages/eslint-plugin/src/rules/unwrappedPojos.ts new file mode 100644 index 0000000000..7641a2a378 --- /dev/null +++ b/packages/eslint-plugin/src/rules/unwrappedPojos.ts @@ -0,0 +1,20 @@ +import { createRule } from '../ruleCreator.ts'; + +export const unwrappedPojos = createRule({ + name: 'AAA', + meta: { + type: 'problem', + docs: { + description: `Always wrap plain old javascript objects with schemas.`, + }, + messages: { + unwrappedPojo: '{{snippet}}', + }, + schema: [], + }, + defaultOptions: [], + + create(context) { + return {}; + }, +}); diff --git a/packages/eslint-plugin/tests/unwrappedPojos.test.ts b/packages/eslint-plugin/tests/unwrappedPojos.test.ts new file mode 100644 index 0000000000..fa4d310799 --- /dev/null +++ b/packages/eslint-plugin/tests/unwrappedPojos.test.ts @@ -0,0 +1,23 @@ +import { describe } from 'vitest'; +import { ruleTester } from './ruleTester.ts'; +import { unwrappedPojos } from '../src/rules/unwrappedPojos.ts'; + +describe('unwrappedPojos', () => { + ruleTester.run('unwrappedPojos', unwrappedPojos, { + valid: [ + 'const pojo = { a: 1 };', + "() => { 'use gpu'; const wrapped = Schema({ a: 1 }); }", + ], + invalid: [ + { + code: "() => { 'use gpu'; const pojo = { a: 1 }; }", + errors: [ + { + messageId: 'unwrappedPojo', + data: { snippet: '{ a: 1 }' }, + }, + ], + }, + ], + }); +}); From a2cc3765d488053c77faf0e3ffcb0e0dca237594 Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Fri, 30 Jan 2026 13:45:23 +0100 Subject: [PATCH 27/38] Rule enhancers POC --- .../src/enhancers/directiveTracking.ts | 45 ++++++++++++ packages/eslint-plugin/src/ruleEnhancer.ts | 70 +++++++++++++++++++ .../eslint-plugin/src/rules/unwrappedPojos.ts | 18 ++++- .../tests/unwrappedPojos.test.ts | 2 +- 4 files changed, 131 insertions(+), 4 deletions(-) create mode 100644 packages/eslint-plugin/src/enhancers/directiveTracking.ts create mode 100644 packages/eslint-plugin/src/ruleEnhancer.ts diff --git a/packages/eslint-plugin/src/enhancers/directiveTracking.ts b/packages/eslint-plugin/src/enhancers/directiveTracking.ts new file mode 100644 index 0000000000..a4ad848ddf --- /dev/null +++ b/packages/eslint-plugin/src/enhancers/directiveTracking.ts @@ -0,0 +1,45 @@ +import type { + RuleContext, + RuleListener, +} from '@typescript-eslint/utils/ts-eslint'; +import type { RuleEnhancer } from '../ruleEnhancer.ts'; + +export type FunctionDirectiveList = { + current: () => string[]; +}; + +export const directiveTracking: RuleEnhancer = ( + context: RuleContext, +) => { + const stack: string[][] = []; + + const visitors: RuleListener = { + FunctionDeclaration() { + // TODO: actually detect directives + stack.push(['use gpu']); + }, + FunctionExpression() { + // TODO: actually detect directives + stack.push(['use gpu']); + }, + ArrowFunctionExpression() { + // TODO: actually detect directives + stack.push(['use gpu']); + }, + + 'FunctionDeclaration:exit'() { + stack.pop(); + }, + 'FunctionExpression:exit'() { + stack.pop(); + }, + 'ArrowFunctionExpression:exit'() { + stack.pop(); + }, + }; + + return { + visitors, + state: { current: () => stack.at(-1) ?? [] }, + }; +}; diff --git a/packages/eslint-plugin/src/ruleEnhancer.ts b/packages/eslint-plugin/src/ruleEnhancer.ts new file mode 100644 index 0000000000..8b3fc071cb --- /dev/null +++ b/packages/eslint-plugin/src/ruleEnhancer.ts @@ -0,0 +1,70 @@ +import type { + RuleContext, + RuleListener, +} from '@typescript-eslint/utils/ts-eslint'; + +export type RuleEnhancer = (context: RuleContext) => { + visitors: RuleListener; + state: TState; +}; + +type InferState = T extends RuleEnhancer ? S : never; + +export function enhanceRule< + TMap extends Record>, + Context extends RuleContext, +>( + enhancers: TMap, + rule: ( + context: Context, + state: { [K in keyof TMap]: InferState }, + ) => RuleListener, +): (context: Context) => RuleListener { + return (context: Context) => { + const enhancerVisitors: RuleListener[] = []; + const combinedState: any = {}; + + // A. Initialize every enhancer + for (const [key, enhancer] of Object.entries(enhancers)) { + const result = enhancer(context); + enhancerVisitors.push(result.visitors); + combinedState[key] = result.state; + } + + // B. Initialize the user's rule with the fully constructed state + const userRuleVisitor = rule(context, combinedState); + + // C. Merge visitors: Enhancers first, User Rule last + // (smartMerge handles the reversal for :exit automatically) + return smartMerge([...enhancerVisitors, userRuleVisitor]); + }; +} + +function smartMerge(visitorsList: RuleListener[]): RuleListener { + const merged: RuleListener = {}; + + // Get unique keys from all visitors + const allKeys = new Set(visitorsList.flatMap((v) => Object.keys(v))); + + for (const key of allKeys) { + const listeners = visitorsList + .map((v) => v[key]) + .filter((fn): fn is Function => typeof fn === 'function'); + + if (listeners.length === 0) continue; + + // "Onion" Architecture: + // Entry nodes: [Enhancer 1, Enhancer 2, Rule] -> Setup in order + // Exit nodes: [Rule, Enhancer 2, Enhancer 1] -> Teardown in reverse + if (key.endsWith(':exit')) { + listeners.reverse(); + } + + // Create the merged listener + merged[key] = (...args: unknown[]) => { + listeners.forEach((fn) => fn(...args)); + }; + } + + return merged; +} diff --git a/packages/eslint-plugin/src/rules/unwrappedPojos.ts b/packages/eslint-plugin/src/rules/unwrappedPojos.ts index 7641a2a378..723ae76756 100644 --- a/packages/eslint-plugin/src/rules/unwrappedPojos.ts +++ b/packages/eslint-plugin/src/rules/unwrappedPojos.ts @@ -1,4 +1,6 @@ import { createRule } from '../ruleCreator.ts'; +import { enhanceRule } from '../ruleEnhancer.ts'; +import { directiveTracking } from '../enhancers/directiveTracking.ts'; export const unwrappedPojos = createRule({ name: 'AAA', @@ -14,7 +16,17 @@ export const unwrappedPojos = createRule({ }, defaultOptions: [], - create(context) { - return {}; - }, + create: enhanceRule({ tracking: directiveTracking }, (context, state) => { + return { + ObjectExpression(node) { + if (state.tracking.current().includes('use gpu')) { + context.report({ + node, + messageId: 'unwrappedPojo', + data: { snippet: context.sourceCode.getText(node) }, + }); + } + }, + }; + }), }); diff --git a/packages/eslint-plugin/tests/unwrappedPojos.test.ts b/packages/eslint-plugin/tests/unwrappedPojos.test.ts index fa4d310799..cd4f230738 100644 --- a/packages/eslint-plugin/tests/unwrappedPojos.test.ts +++ b/packages/eslint-plugin/tests/unwrappedPojos.test.ts @@ -6,7 +6,7 @@ describe('unwrappedPojos', () => { ruleTester.run('unwrappedPojos', unwrappedPojos, { valid: [ 'const pojo = { a: 1 };', - "() => { 'use gpu'; const wrapped = Schema({ a: 1 }); }", + // "() => { 'use gpu'; const wrapped = Schema({ a: 1 }); }", ], invalid: [ { From f2a0ff1441479d58cca5304c63fb75e9e280061d Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Fri, 30 Jan 2026 14:36:21 +0100 Subject: [PATCH 28/38] Clean up types --- packages/eslint-plugin/src/enhanceRule.ts | 91 +++++++++++++++++++ .../src/enhancers/directiveTracking.ts | 10 +- packages/eslint-plugin/src/ruleEnhancer.ts | 70 -------------- .../eslint-plugin/src/rules/unwrappedPojos.ts | 8 +- 4 files changed, 103 insertions(+), 76 deletions(-) create mode 100644 packages/eslint-plugin/src/enhanceRule.ts delete mode 100644 packages/eslint-plugin/src/ruleEnhancer.ts diff --git a/packages/eslint-plugin/src/enhanceRule.ts b/packages/eslint-plugin/src/enhanceRule.ts new file mode 100644 index 0000000000..95883c05aa --- /dev/null +++ b/packages/eslint-plugin/src/enhanceRule.ts @@ -0,0 +1,91 @@ +import type { + RuleContext, + RuleListener, +} from '@typescript-eslint/utils/ts-eslint'; + +export type RuleEnhancer = ( + context: RuleContext, +) => { + visitors: RuleListener; + state: TState; +}; + +type State>> = { + [K in keyof TMap]: TMap[K] extends RuleEnhancer ? S : never; +}; + +/** + * Allows enhancing rule code with additional context provided by RuleEnhancers (reusable node visitors collecting data). + * @param enhancers a record of RuleEnhancers + * @param rule a visitor with an additional `state` argument that allows access to the enhancers' data + * @returns a resulting `(context: Context) => RuleListener` function + * + * @example + * // inside of `createRule` + * create: enhanceRule({ metadata: metadataTrackingEnhancer }, (context, state) => { + * const { metadata } = state; + * + * return { + * ObjectExpression(node) { + * if (metadata.shouldReport()) { + * context.report({ node, messageId: 'error' }); + * } + * }, + * } + */ +export function enhanceRule< + TMap extends Record>, + Context extends RuleContext, +>( + enhancers: TMap, + rule: (context: Context, state: State) => RuleListener, +) { + return (context: Context) => { + const enhancerVisitors: RuleListener[] = []; + const combinedState: Record = {}; + + for (const [key, enhancer] of Object.entries(enhancers)) { + const initializedEnhancer = enhancer(context); + enhancerVisitors.push(initializedEnhancer.visitors); + combinedState[key] = initializedEnhancer.state; + } + + const initializedRule = rule(context, combinedState as State); + + return mergeVisitors([...enhancerVisitors, initializedRule]); + }; +} + +/** + * Merges all passed visitors into one visitor. + * Retains visitor order: + * - on node enter, visitors are called in `visitorsList` order, + * - on node exit, visitors are called in reversed order. + */ +function mergeVisitors(visitors: RuleListener[]): RuleListener { + const merged: RuleListener = {}; + + const allKeys = new Set(visitors.flatMap((v) => Object.keys(v))); + + for (const key of allKeys) { + const listeners = visitors + .map((v) => v[key]) + .filter((fn) => fn !== undefined); + + if (listeners.length === 0) { + continue; + } + + // Reverse order if node is an exit node + if (key.endsWith(':exit')) { + listeners.reverse(); + } + + merged[key] = (...args: unknown[]) => { + // biome-ignore lint/suspicious/useIterableCallbackReturn: those functions return void + listeners.forEach((fn) => (fn as (...args: unknown[]) => void)(...args)); + }; + } + + return merged; +} diff --git a/packages/eslint-plugin/src/enhancers/directiveTracking.ts b/packages/eslint-plugin/src/enhancers/directiveTracking.ts index a4ad848ddf..2851dea6d4 100644 --- a/packages/eslint-plugin/src/enhancers/directiveTracking.ts +++ b/packages/eslint-plugin/src/enhancers/directiveTracking.ts @@ -2,13 +2,17 @@ import type { RuleContext, RuleListener, } from '@typescript-eslint/utils/ts-eslint'; -import type { RuleEnhancer } from '../ruleEnhancer.ts'; +import type { RuleEnhancer } from '../enhanceRule.ts'; -export type FunctionDirectiveList = { +export type DirectiveList = { current: () => string[]; }; -export const directiveTracking: RuleEnhancer = ( +/** + * A RuleEnhancer that exposes the list of directives of the currently parsed function scope. + * TODO (when needed): switch to a map from function node to a list of directives, and implement top level directive tracking + */ +export const directiveTracking: RuleEnhancer = ( context: RuleContext, ) => { const stack: string[][] = []; diff --git a/packages/eslint-plugin/src/ruleEnhancer.ts b/packages/eslint-plugin/src/ruleEnhancer.ts deleted file mode 100644 index 8b3fc071cb..0000000000 --- a/packages/eslint-plugin/src/ruleEnhancer.ts +++ /dev/null @@ -1,70 +0,0 @@ -import type { - RuleContext, - RuleListener, -} from '@typescript-eslint/utils/ts-eslint'; - -export type RuleEnhancer = (context: RuleContext) => { - visitors: RuleListener; - state: TState; -}; - -type InferState = T extends RuleEnhancer ? S : never; - -export function enhanceRule< - TMap extends Record>, - Context extends RuleContext, ->( - enhancers: TMap, - rule: ( - context: Context, - state: { [K in keyof TMap]: InferState }, - ) => RuleListener, -): (context: Context) => RuleListener { - return (context: Context) => { - const enhancerVisitors: RuleListener[] = []; - const combinedState: any = {}; - - // A. Initialize every enhancer - for (const [key, enhancer] of Object.entries(enhancers)) { - const result = enhancer(context); - enhancerVisitors.push(result.visitors); - combinedState[key] = result.state; - } - - // B. Initialize the user's rule with the fully constructed state - const userRuleVisitor = rule(context, combinedState); - - // C. Merge visitors: Enhancers first, User Rule last - // (smartMerge handles the reversal for :exit automatically) - return smartMerge([...enhancerVisitors, userRuleVisitor]); - }; -} - -function smartMerge(visitorsList: RuleListener[]): RuleListener { - const merged: RuleListener = {}; - - // Get unique keys from all visitors - const allKeys = new Set(visitorsList.flatMap((v) => Object.keys(v))); - - for (const key of allKeys) { - const listeners = visitorsList - .map((v) => v[key]) - .filter((fn): fn is Function => typeof fn === 'function'); - - if (listeners.length === 0) continue; - - // "Onion" Architecture: - // Entry nodes: [Enhancer 1, Enhancer 2, Rule] -> Setup in order - // Exit nodes: [Rule, Enhancer 2, Enhancer 1] -> Teardown in reverse - if (key.endsWith(':exit')) { - listeners.reverse(); - } - - // Create the merged listener - merged[key] = (...args: unknown[]) => { - listeners.forEach((fn) => fn(...args)); - }; - } - - return merged; -} diff --git a/packages/eslint-plugin/src/rules/unwrappedPojos.ts b/packages/eslint-plugin/src/rules/unwrappedPojos.ts index 723ae76756..1407f228d5 100644 --- a/packages/eslint-plugin/src/rules/unwrappedPojos.ts +++ b/packages/eslint-plugin/src/rules/unwrappedPojos.ts @@ -1,5 +1,5 @@ import { createRule } from '../ruleCreator.ts'; -import { enhanceRule } from '../ruleEnhancer.ts'; +import { enhanceRule } from '../enhanceRule.ts'; import { directiveTracking } from '../enhancers/directiveTracking.ts'; export const unwrappedPojos = createRule({ @@ -16,10 +16,12 @@ export const unwrappedPojos = createRule({ }, defaultOptions: [], - create: enhanceRule({ tracking: directiveTracking }, (context, state) => { + create: enhanceRule({ directives: directiveTracking }, (context, state) => { + const { directives } = state; + return { ObjectExpression(node) { - if (state.tracking.current().includes('use gpu')) { + if (directives.current().includes('use gpu')) { context.report({ node, messageId: 'unwrappedPojo', From 252665f51e17bcac3ef30994f6f2c1c4f0fdca9e Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Fri, 30 Jan 2026 14:42:21 +0100 Subject: [PATCH 29/38] Update directiveTracking API --- .../src/enhancers/directiveTracking.ts | 17 +++++++++++------ .../eslint-plugin/src/rules/unwrappedPojos.ts | 2 +- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/packages/eslint-plugin/src/enhancers/directiveTracking.ts b/packages/eslint-plugin/src/enhancers/directiveTracking.ts index 2851dea6d4..5d9e8c4d69 100644 --- a/packages/eslint-plugin/src/enhancers/directiveTracking.ts +++ b/packages/eslint-plugin/src/enhancers/directiveTracking.ts @@ -4,15 +4,20 @@ import type { } from '@typescript-eslint/utils/ts-eslint'; import type { RuleEnhancer } from '../enhanceRule.ts'; -export type DirectiveList = { - current: () => string[]; +export type DirectiveData = { + insideUseGpu: () => boolean; }; /** - * A RuleEnhancer that exposes the list of directives of the currently parsed function scope. - * TODO (when needed): switch to a map from function node to a list of directives, and implement top level directive tracking + * A RuleEnhancer that tracks whether the current node is inside a 'use gpu' function. + * + * @privateRemarks + * Should the need arise, the API could be updated to expose: + * - a list of directives of the current function, + * - directives of other visited functions, + * - top level directives. */ -export const directiveTracking: RuleEnhancer = ( +export const directiveTracking: RuleEnhancer = ( context: RuleContext, ) => { const stack: string[][] = []; @@ -44,6 +49,6 @@ export const directiveTracking: RuleEnhancer = ( return { visitors, - state: { current: () => stack.at(-1) ?? [] }, + state: { insideUseGpu: () => (stack.at(-1) ?? []).includes('use gpu') }, }; }; diff --git a/packages/eslint-plugin/src/rules/unwrappedPojos.ts b/packages/eslint-plugin/src/rules/unwrappedPojos.ts index 1407f228d5..e498646c8b 100644 --- a/packages/eslint-plugin/src/rules/unwrappedPojos.ts +++ b/packages/eslint-plugin/src/rules/unwrappedPojos.ts @@ -21,7 +21,7 @@ export const unwrappedPojos = createRule({ return { ObjectExpression(node) { - if (directives.current().includes('use gpu')) { + if (directives.insideUseGpu()) { context.report({ node, messageId: 'unwrappedPojo', From ec684e3c31923e5667decfefeff5562e27773b74 Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Fri, 30 Jan 2026 15:45:35 +0100 Subject: [PATCH 30/38] Add more tests and implement rule logic --- .../eslint-plugin/src/rules/unwrappedPojos.ts | 16 +++-- .../tests/unwrappedPojos.test.ts | 63 ++++++++++++++++++- 2 files changed, 71 insertions(+), 8 deletions(-) diff --git a/packages/eslint-plugin/src/rules/unwrappedPojos.ts b/packages/eslint-plugin/src/rules/unwrappedPojos.ts index e498646c8b..53f623499e 100644 --- a/packages/eslint-plugin/src/rules/unwrappedPojos.ts +++ b/packages/eslint-plugin/src/rules/unwrappedPojos.ts @@ -21,13 +21,17 @@ export const unwrappedPojos = createRule({ return { ObjectExpression(node) { - if (directives.insideUseGpu()) { - context.report({ - node, - messageId: 'unwrappedPojo', - data: { snippet: context.sourceCode.getText(node) }, - }); + if (!directives.insideUseGpu()) { + return; } + if (node.parent.type === 'CallExpression') { + return; + } + context.report({ + node, + messageId: 'unwrappedPojo', + data: { snippet: context.sourceCode.getText(node) }, + }); }, }; }), diff --git a/packages/eslint-plugin/tests/unwrappedPojos.test.ts b/packages/eslint-plugin/tests/unwrappedPojos.test.ts index cd4f230738..e10e08eae6 100644 --- a/packages/eslint-plugin/tests/unwrappedPojos.test.ts +++ b/packages/eslint-plugin/tests/unwrappedPojos.test.ts @@ -6,11 +6,70 @@ describe('unwrappedPojos', () => { ruleTester.run('unwrappedPojos', unwrappedPojos, { valid: [ 'const pojo = { a: 1 };', - // "() => { 'use gpu'; const wrapped = Schema({ a: 1 }); }", + + 'function func() { const unwrapped = { a: 1 }; }', + 'function func() { return { a: 1 }; }', + 'const func = function () { const unwrapped = { a: 1 }; }', + 'const func = function () { return { a: 1 }; }', + '() => { const unwrapped = { a: 1 }; }', + '() => { return { a: 1 }; }', + + "function func() { 'use gpu'; const wrapped = Schema({ a: 1 }); }", + "function func() { 'use gpu'; return Schema({ a: 1 }); }", + "const func = function() { 'use gpu'; const wrapped = Schema({ a: 1 }); }", + "const func = function() { 'use gpu'; return Schema({ a: 1 }); }", + "() => { 'use gpu'; const wrapped = Schema({ a: 1 }); }", + "() => { 'use gpu'; return Schema({ a: 1 }); }", ], invalid: [ { - code: "() => { 'use gpu'; const pojo = { a: 1 }; }", + code: "function func() { 'use gpu'; const unwrapped = { a: 1 }; }", + errors: [ + { + messageId: 'unwrappedPojo', + data: { snippet: '{ a: 1 }' }, + }, + ], + }, + { + code: "function func() { 'use gpu'; return { a: 1 }; }", + errors: [ + { + messageId: 'unwrappedPojo', + data: { snippet: '{ a: 1 }' }, + }, + ], + }, + { + code: + "const func = function() { 'use gpu'; const unwrapped = { a: 1 }; }", + errors: [ + { + messageId: 'unwrappedPojo', + data: { snippet: '{ a: 1 }' }, + }, + ], + }, + { + code: "const func = function() { 'use gpu'; return { a: 1 }; }", + errors: [ + { + messageId: 'unwrappedPojo', + data: { snippet: '{ a: 1 }' }, + }, + ], + }, + { + code: "() => { 'use gpu'; const unwrapped = { a: 1 }; }", + errors: [ + { + messageId: 'unwrappedPojo', + data: { snippet: '{ a: 1 }' }, + }, + ], + }, + { + code: "() => { 'use gpu'; return { a: 1 }; }", errors: [ { messageId: 'unwrappedPojo', From 770fd0332af6380ccab4eb036f986c545db63dbc Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Fri, 30 Jan 2026 16:59:50 +0100 Subject: [PATCH 31/38] Implement directive tracking --- .../src/enhancers/directiveTracking.ts | 48 ++++++++++++------- .../eslint-plugin/src/rules/unwrappedPojos.ts | 2 +- .../tests/unwrappedPojos.test.ts | 10 ++++ 3 files changed, 43 insertions(+), 17 deletions(-) diff --git a/packages/eslint-plugin/src/enhancers/directiveTracking.ts b/packages/eslint-plugin/src/enhancers/directiveTracking.ts index 5d9e8c4d69..d8efde55d0 100644 --- a/packages/eslint-plugin/src/enhancers/directiveTracking.ts +++ b/packages/eslint-plugin/src/enhancers/directiveTracking.ts @@ -1,7 +1,5 @@ -import type { - RuleContext, - RuleListener, -} from '@typescript-eslint/utils/ts-eslint'; +import type { TSESTree } from '@typescript-eslint/utils'; +import type { RuleListener } from '@typescript-eslint/utils/ts-eslint'; import type { RuleEnhancer } from '../enhanceRule.ts'; export type DirectiveData = { @@ -17,23 +15,18 @@ export type DirectiveData = { * - directives of other visited functions, * - top level directives. */ -export const directiveTracking: RuleEnhancer = ( - context: RuleContext, -) => { +export const directiveTracking: RuleEnhancer = () => { const stack: string[][] = []; const visitors: RuleListener = { - FunctionDeclaration() { - // TODO: actually detect directives - stack.push(['use gpu']); + FunctionDeclaration(node) { + stack.push(getDirectives(node)); }, - FunctionExpression() { - // TODO: actually detect directives - stack.push(['use gpu']); + FunctionExpression(node) { + stack.push(getDirectives(node)); }, - ArrowFunctionExpression() { - // TODO: actually detect directives - stack.push(['use gpu']); + ArrowFunctionExpression(node) { + stack.push(getDirectives(node)); }, 'FunctionDeclaration:exit'() { @@ -52,3 +45,26 @@ export const directiveTracking: RuleEnhancer = ( state: { insideUseGpu: () => (stack.at(-1) ?? []).includes('use gpu') }, }; }; + +function getDirectives( + node: + | TSESTree.FunctionDeclaration + | TSESTree.FunctionExpression + | TSESTree.ArrowFunctionExpression, +): string[] { + const body = node.body; + if (body.type !== 'BlockStatement') { + return []; + } + + const directives: string[] = []; + for (const statement of body.body) { + if (statement.type === 'ExpressionStatement' && statement.directive) { + directives.push(statement.directive); + } else { + break; + } + } + + return directives; +} diff --git a/packages/eslint-plugin/src/rules/unwrappedPojos.ts b/packages/eslint-plugin/src/rules/unwrappedPojos.ts index 53f623499e..bad6c46f87 100644 --- a/packages/eslint-plugin/src/rules/unwrappedPojos.ts +++ b/packages/eslint-plugin/src/rules/unwrappedPojos.ts @@ -1,6 +1,6 @@ -import { createRule } from '../ruleCreator.ts'; import { enhanceRule } from '../enhanceRule.ts'; import { directiveTracking } from '../enhancers/directiveTracking.ts'; +import { createRule } from '../ruleCreator.ts'; export const unwrappedPojos = createRule({ name: 'AAA', diff --git a/packages/eslint-plugin/tests/unwrappedPojos.test.ts b/packages/eslint-plugin/tests/unwrappedPojos.test.ts index e10e08eae6..a2b8dd5b26 100644 --- a/packages/eslint-plugin/tests/unwrappedPojos.test.ts +++ b/packages/eslint-plugin/tests/unwrappedPojos.test.ts @@ -77,6 +77,16 @@ describe('unwrappedPojos', () => { }, ], }, + { + code: + "function func() { 'unknown directive'; 'use gpu'; const unwrapped = { a: 1 }; }", + errors: [ + { + messageId: 'unwrappedPojo', + data: { snippet: '{ a: 1 }' }, + }, + ], + }, ], }); }); From 7c9188200f7cff34ac5da8985d4af4fede8f5abd Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Fri, 30 Jan 2026 17:49:43 +0100 Subject: [PATCH 32/38] Self review --- packages/eslint-plugin/src/configs.ts | 4 ++++ packages/eslint-plugin/src/rules/unwrappedPojos.ts | 7 ++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/eslint-plugin/src/configs.ts b/packages/eslint-plugin/src/configs.ts index 62891e939b..e8a2e8d387 100644 --- a/packages/eslint-plugin/src/configs.ts +++ b/packages/eslint-plugin/src/configs.ts @@ -1,8 +1,10 @@ import type { TSESLint } from '@typescript-eslint/utils'; import { integerDivision } from './rules/integerDivision.ts'; +import { unwrappedPojos } from './rules/unwrappedPojos.ts'; export const rules = { 'integer-division': integerDivision, + 'unwrapped-pojo': unwrappedPojos, } as const; type Rules = Record< @@ -12,8 +14,10 @@ type Rules = Record< export const recommendedRules: Rules = { 'typegpu/integer-division': 'warn', + 'typegpu/unwrapped-pojo': 'warn', }; export const allRules: Rules = { 'typegpu/integer-division': 'error', + 'typegpu/unwrapped-pojo': 'error', }; diff --git a/packages/eslint-plugin/src/rules/unwrappedPojos.ts b/packages/eslint-plugin/src/rules/unwrappedPojos.ts index bad6c46f87..72648f6cbb 100644 --- a/packages/eslint-plugin/src/rules/unwrappedPojos.ts +++ b/packages/eslint-plugin/src/rules/unwrappedPojos.ts @@ -3,14 +3,15 @@ import { directiveTracking } from '../enhancers/directiveTracking.ts'; import { createRule } from '../ruleCreator.ts'; export const unwrappedPojos = createRule({ - name: 'AAA', + name: 'unwrapped-pojo', meta: { type: 'problem', docs: { - description: `Always wrap plain old javascript objects with schemas.`, + description: `Always wrap Plain Old JavaScript Objects with schemas.`, }, messages: { - unwrappedPojo: '{{snippet}}', + unwrappedPojo: + '{{snippet}} is a POJO that is not wrapped in a schema. To allow WGSL resolution, wrap it in a schema call.', }, schema: [], }, From 2664a723257109cd2ff59db3633fc5383a6b0dca Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Mon, 9 Feb 2026 17:31:49 +0100 Subject: [PATCH 33/38] Ignores returns --- .../eslint-plugin/src/rules/unwrappedPojos.ts | 7 ++- .../tests/unwrappedPojos.test.ts | 51 ++++++------------- 2 files changed, 20 insertions(+), 38 deletions(-) diff --git a/packages/eslint-plugin/src/rules/unwrappedPojos.ts b/packages/eslint-plugin/src/rules/unwrappedPojos.ts index 72648f6cbb..3d887e53a5 100644 --- a/packages/eslint-plugin/src/rules/unwrappedPojos.ts +++ b/packages/eslint-plugin/src/rules/unwrappedPojos.ts @@ -7,7 +7,7 @@ export const unwrappedPojos = createRule({ meta: { type: 'problem', docs: { - description: `Always wrap Plain Old JavaScript Objects with schemas.`, + description: `Wrap Plain Old JavaScript Objects with schemas.`, }, messages: { unwrappedPojo: @@ -25,7 +25,10 @@ export const unwrappedPojos = createRule({ if (!directives.insideUseGpu()) { return; } - if (node.parent.type === 'CallExpression') { + if (node.parent?.type === 'CallExpression') { + return; + } + if (node.parent?.type === 'ReturnStatement') { return; } context.report({ diff --git a/packages/eslint-plugin/tests/unwrappedPojos.test.ts b/packages/eslint-plugin/tests/unwrappedPojos.test.ts index a2b8dd5b26..3c2bf41242 100644 --- a/packages/eslint-plugin/tests/unwrappedPojos.test.ts +++ b/packages/eslint-plugin/tests/unwrappedPojos.test.ts @@ -5,21 +5,27 @@ import { unwrappedPojos } from '../src/rules/unwrappedPojos.ts'; describe('unwrappedPojos', () => { ruleTester.run('unwrappedPojos', unwrappedPojos, { valid: [ - 'const pojo = { a: 1 };', + // correctly wrapped + "function func() { 'use gpu'; const wrapped = Schema({ a: 1 }); }", + "const func = function() { 'use gpu'; const wrapped = Schema({ a: 1 }); }", + "() => { 'use gpu'; const wrapped = Schema({ a: 1 }); }", + "function func() { 'use gpu'; return Schema({ a: 1 }); }", + "const func = function() { 'use gpu'; return Schema({ a: 1 }); }", + "() => { 'use gpu'; return Schema({ a: 1 }); }", + // not inside 'use gpu' function + 'const pojo = { a: 1 };', 'function func() { const unwrapped = { a: 1 }; }', - 'function func() { return { a: 1 }; }', 'const func = function () { const unwrapped = { a: 1 }; }', - 'const func = function () { return { a: 1 }; }', '() => { const unwrapped = { a: 1 }; }', + 'function func() { return { a: 1 }; }', + 'const func = function () { return { a: 1 }; }', '() => { return { a: 1 }; }', - "function func() { 'use gpu'; const wrapped = Schema({ a: 1 }); }", - "function func() { 'use gpu'; return Schema({ a: 1 }); }", - "const func = function() { 'use gpu'; const wrapped = Schema({ a: 1 }); }", - "const func = function() { 'use gpu'; return Schema({ a: 1 }); }", - "() => { 'use gpu'; const wrapped = Schema({ a: 1 }); }", - "() => { 'use gpu'; return Schema({ a: 1 }); }", + // return from 'use gpu' function + "function func() { 'use gpu'; return { a: 1 }; }", + "const func = function() { 'use gpu'; return { a: 1 }; }", + "() => { 'use gpu'; return { a: 1 }; }", ], invalid: [ { @@ -31,15 +37,6 @@ describe('unwrappedPojos', () => { }, ], }, - { - code: "function func() { 'use gpu'; return { a: 1 }; }", - errors: [ - { - messageId: 'unwrappedPojo', - data: { snippet: '{ a: 1 }' }, - }, - ], - }, { code: "const func = function() { 'use gpu'; const unwrapped = { a: 1 }; }", @@ -50,15 +47,6 @@ describe('unwrappedPojos', () => { }, ], }, - { - code: "const func = function() { 'use gpu'; return { a: 1 }; }", - errors: [ - { - messageId: 'unwrappedPojo', - data: { snippet: '{ a: 1 }' }, - }, - ], - }, { code: "() => { 'use gpu'; const unwrapped = { a: 1 }; }", errors: [ @@ -68,15 +56,6 @@ describe('unwrappedPojos', () => { }, ], }, - { - code: "() => { 'use gpu'; return { a: 1 }; }", - errors: [ - { - messageId: 'unwrappedPojo', - data: { snippet: '{ a: 1 }' }, - }, - ], - }, { code: "function func() { 'unknown directive'; 'use gpu'; const unwrapped = { a: 1 }; }", From 8e85376326723d1077fbf612b338db10b242d576 Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Mon, 9 Feb 2026 17:42:34 +0100 Subject: [PATCH 34/38] Handle nested structs --- packages/eslint-plugin/src/enhanceRule.ts | 2 +- packages/eslint-plugin/src/rules/unwrappedPojos.ts | 8 +++++++- packages/eslint-plugin/tests/unwrappedPojos.test.ts | 13 +++++++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/packages/eslint-plugin/src/enhanceRule.ts b/packages/eslint-plugin/src/enhanceRule.ts index 95883c05aa..cf6da04063 100644 --- a/packages/eslint-plugin/src/enhanceRule.ts +++ b/packages/eslint-plugin/src/enhanceRule.ts @@ -31,7 +31,7 @@ type State>> = { * context.report({ node, messageId: 'error' }); * } * }, - * } + * }; */ export function enhanceRule< TMap extends Record>, diff --git a/packages/eslint-plugin/src/rules/unwrappedPojos.ts b/packages/eslint-plugin/src/rules/unwrappedPojos.ts index 3d887e53a5..babe1a3f8b 100644 --- a/packages/eslint-plugin/src/rules/unwrappedPojos.ts +++ b/packages/eslint-plugin/src/rules/unwrappedPojos.ts @@ -11,7 +11,7 @@ export const unwrappedPojos = createRule({ }, messages: { unwrappedPojo: - '{{snippet}} is a POJO that is not wrapped in a schema. To allow WGSL resolution, wrap it in a schema call.', + '{{snippet}} is a POJO that is not wrapped in a schema. To allow WGSL resolution, wrap it in a schema call. You only need to wrap the outermost object.', }, schema: [], }, @@ -25,10 +25,16 @@ export const unwrappedPojos = createRule({ if (!directives.insideUseGpu()) { return; } + if (node.parent?.type === 'Property') { + // a part of a bigger struct + return; + } if (node.parent?.type === 'CallExpression') { + // wrapped in a schema call return; } if (node.parent?.type === 'ReturnStatement') { + // likely inferred (shelled fn or shell-less entry) so we cannot report return; } context.report({ diff --git a/packages/eslint-plugin/tests/unwrappedPojos.test.ts b/packages/eslint-plugin/tests/unwrappedPojos.test.ts index 3c2bf41242..c2dba1e8b3 100644 --- a/packages/eslint-plugin/tests/unwrappedPojos.test.ts +++ b/packages/eslint-plugin/tests/unwrappedPojos.test.ts @@ -13,6 +13,8 @@ describe('unwrappedPojos', () => { "const func = function() { 'use gpu'; return Schema({ a: 1 }); }", "() => { 'use gpu'; return Schema({ a: 1 }); }", + "() => { 'use gpu'; return Schema({ a: { b: 1 } }); }", + // not inside 'use gpu' function 'const pojo = { a: 1 };', 'function func() { const unwrapped = { a: 1 }; }', @@ -26,6 +28,8 @@ describe('unwrappedPojos', () => { "function func() { 'use gpu'; return { a: 1 }; }", "const func = function() { 'use gpu'; return { a: 1 }; }", "() => { 'use gpu'; return { a: 1 }; }", + + "() => { 'use gpu'; return { a: { b: 1 } }; }", ], invalid: [ { @@ -66,6 +70,15 @@ describe('unwrappedPojos', () => { }, ], }, + { + code: "() => { 'use gpu'; const unwrapped = { a: { b: 1 } }; }", + errors: [ + { + messageId: 'unwrappedPojo', + data: { snippet: '{ a: { b: 1 } }' }, + }, + ], + }, ], }); }); From f8076862cc3172534d14d6cdbba6376588bdca8f Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Fri, 27 Feb 2026 13:50:27 +0100 Subject: [PATCH 35/38] Fix import --- packages/eslint-plugin/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/eslint-plugin/src/index.ts b/packages/eslint-plugin/src/index.ts index 7a3dfcf2bb..08763811d3 100644 --- a/packages/eslint-plugin/src/index.ts +++ b/packages/eslint-plugin/src/index.ts @@ -1,4 +1,4 @@ -import pkg from '../package.json'; +import pkg from '../package.json' with { type: 'json' }; import type { TSESLint } from '@typescript-eslint/utils'; import { allRules, recommendedRules, rules } from './configs.ts'; From 069be78a27771fd714dc36f53fbf88e872eb53fd Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Wed, 4 Mar 2026 13:15:31 +0100 Subject: [PATCH 36/38] Format files --- packages/eslint-plugin/src/enhanceRule.ts | 18 ++++-------------- .../eslint-plugin/tests/unwrappedPojos.test.ts | 6 ++---- 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/packages/eslint-plugin/src/enhanceRule.ts b/packages/eslint-plugin/src/enhanceRule.ts index cf6da04063..efd74ee2ee 100644 --- a/packages/eslint-plugin/src/enhanceRule.ts +++ b/packages/eslint-plugin/src/enhanceRule.ts @@ -1,11 +1,6 @@ -import type { - RuleContext, - RuleListener, -} from '@typescript-eslint/utils/ts-eslint'; +import type { RuleContext, RuleListener } from '@typescript-eslint/utils/ts-eslint'; -export type RuleEnhancer = ( - context: RuleContext, -) => { +export type RuleEnhancer = (context: RuleContext) => { visitors: RuleListener; state: TState; }; @@ -36,10 +31,7 @@ type State>> = { export function enhanceRule< TMap extends Record>, Context extends RuleContext, ->( - enhancers: TMap, - rule: (context: Context, state: State) => RuleListener, -) { +>(enhancers: TMap, rule: (context: Context, state: State) => RuleListener) { return (context: Context) => { const enhancerVisitors: RuleListener[] = []; const combinedState: Record = {}; @@ -68,9 +60,7 @@ function mergeVisitors(visitors: RuleListener[]): RuleListener { const allKeys = new Set(visitors.flatMap((v) => Object.keys(v))); for (const key of allKeys) { - const listeners = visitors - .map((v) => v[key]) - .filter((fn) => fn !== undefined); + const listeners = visitors.map((v) => v[key]).filter((fn) => fn !== undefined); if (listeners.length === 0) { continue; diff --git a/packages/eslint-plugin/tests/unwrappedPojos.test.ts b/packages/eslint-plugin/tests/unwrappedPojos.test.ts index c2dba1e8b3..c0b3fd018b 100644 --- a/packages/eslint-plugin/tests/unwrappedPojos.test.ts +++ b/packages/eslint-plugin/tests/unwrappedPojos.test.ts @@ -42,8 +42,7 @@ describe('unwrappedPojos', () => { ], }, { - code: - "const func = function() { 'use gpu'; const unwrapped = { a: 1 }; }", + code: "const func = function() { 'use gpu'; const unwrapped = { a: 1 }; }", errors: [ { messageId: 'unwrappedPojo', @@ -61,8 +60,7 @@ describe('unwrappedPojos', () => { ], }, { - code: - "function func() { 'unknown directive'; 'use gpu'; const unwrapped = { a: 1 }; }", + code: "function func() { 'unknown directive'; 'use gpu'; const unwrapped = { a: 1 }; }", errors: [ { messageId: 'unwrappedPojo', From 0c9a4767e4974b2cdac29d726421d4c17793f564 Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Wed, 4 Mar 2026 13:18:04 +0100 Subject: [PATCH 37/38] Update tests --- packages/eslint-plugin/tests/unwrappedPojos.test.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages/eslint-plugin/tests/unwrappedPojos.test.ts b/packages/eslint-plugin/tests/unwrappedPojos.test.ts index c0b3fd018b..77204c7eab 100644 --- a/packages/eslint-plugin/tests/unwrappedPojos.test.ts +++ b/packages/eslint-plugin/tests/unwrappedPojos.test.ts @@ -9,11 +9,6 @@ describe('unwrappedPojos', () => { "function func() { 'use gpu'; const wrapped = Schema({ a: 1 }); }", "const func = function() { 'use gpu'; const wrapped = Schema({ a: 1 }); }", "() => { 'use gpu'; const wrapped = Schema({ a: 1 }); }", - "function func() { 'use gpu'; return Schema({ a: 1 }); }", - "const func = function() { 'use gpu'; return Schema({ a: 1 }); }", - "() => { 'use gpu'; return Schema({ a: 1 }); }", - - "() => { 'use gpu'; return Schema({ a: { b: 1 } }); }", // not inside 'use gpu' function 'const pojo = { a: 1 };', @@ -28,7 +23,6 @@ describe('unwrappedPojos', () => { "function func() { 'use gpu'; return { a: 1 }; }", "const func = function() { 'use gpu'; return { a: 1 }; }", "() => { 'use gpu'; return { a: 1 }; }", - "() => { 'use gpu'; return { a: { b: 1 } }; }", ], invalid: [ From 74377b0273f68ad3a32b2f7ea7e486b2066817ef Mon Sep 17 00:00:00 2001 From: Aleksander Katan Date: Wed, 4 Mar 2026 13:27:25 +0100 Subject: [PATCH 38/38] Remove tsup config --- packages/eslint-plugin/tsup.config.ts | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 packages/eslint-plugin/tsup.config.ts diff --git a/packages/eslint-plugin/tsup.config.ts b/packages/eslint-plugin/tsup.config.ts deleted file mode 100644 index a829547b55..0000000000 --- a/packages/eslint-plugin/tsup.config.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { defineConfig, type Options } from 'tsup'; - -const config: Options = { - entry: ['src/index.ts'], - format: ['cjs', 'esm'], - dts: true, - clean: true, - splitting: true, - sourcemap: true, -}; - -export default defineConfig(config);