diff --git a/bun.lock b/bun.lock index 9be93db..1d8ebbf 100644 --- a/bun.lock +++ b/bun.lock @@ -32,6 +32,9 @@ "packages/sideffect": { "name": "sideffect", "version": "0.2.1", + "dependencies": { + "oxc-parser": "catalog:", + }, "devDependencies": { "@cloudflare/vite-plugin": "^1.40.0", "@cloudflare/workers-types": "4.20260605.1", @@ -143,6 +146,17 @@ "wrangler": "^4.6.0", }, }, + "workbench/typescript-ast-bench": { + "name": "typescript-ast-bench", + "version": "0.0.0", + "devDependencies": { + "@swc/core": "1.15.43", + "@types/node": "25.6.2", + "oxc-parser": "catalog:", + "typescript": "catalog:", + "vite-plus": "catalog:", + }, + }, }, "overrides": { "vite": "catalog:", @@ -150,6 +164,7 @@ }, "catalog": { "@typescript/native-preview": "7.0.0-dev.20260509.2", + "oxc-parser": "0.137.0", "typescript": "6.0.3", "vite": "npm:@voidzero-dev/vite-plus-core@0.2.2", "vite-plus": "0.2.2", @@ -244,91 +259,91 @@ "@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.16.1", "", { "peerDependencies": { "unenv": "2.0.0-rc.24", "workerd": ">1.20260305.0 <2.0.0-0" }, "optionalPeers": ["workerd"] }, "sha512-ECxObrMfyTl5bhQf/lZCXwo5G6xX9IAUo+nDMKK4SZ8m4Jvvxp52vilxyySSWh2YTZz8+HQ07qGH/2rEom1vDw=="], - "@cloudflare/vite-plugin": ["@cloudflare/vite-plugin@1.40.2", "", { "dependencies": { "@cloudflare/unenv-preset": "2.16.1", "miniflare": "4.20260611.0", "unenv": "2.0.0-rc.24", "wrangler": "4.100.0", "ws": "8.20.1" }, "peerDependencies": { "vite": "^6.1.0 || ^7.0.0 || ^8.0.0" }, "bin": { "cf-vite": "bin/cf-vite" } }, "sha512-OBo1uYM/Y26WpFhUhaHU+/QxJqFTB8uFhVPBypuf8Dz51CMTNs3Y1JWazaujD/DrS5pt6Q6e6BHhxREXLpzsrA=="], + "@cloudflare/vite-plugin": ["@cloudflare/vite-plugin@1.43.0", "", { "dependencies": { "@cloudflare/unenv-preset": "2.16.1", "miniflare": "4.20260701.0", "unenv": "2.0.0-rc.24", "wrangler": "4.107.0", "ws": "8.21.0" }, "peerDependencies": { "vite": "^6.1.0 || ^7.0.0 || ^8.0.0" }, "bin": { "cf-vite": "bin/cf-vite" } }, "sha512-5ThLXS2ZXPoCa9xpRqDi9BebpkkbYbAhUU1lMomD+UXEp2SeB4/pVxeFF0j/9nbBlUhDOm5aariI31h8ZcXrBg=="], - "@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20260611.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-iJICldmi4sBGgi7IrQles8cStOGXM/Tmv95C4OODVs6VIbMsJPqThUM5h3uYVQNULuJ8I/aVvnJ3Eh/wZCKwuA=="], + "@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20260701.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-Zd9Y1bah6DwwBN2RW8vJohffQrIUazb8UXnqSNecOxM+jJLhUuvv5IOG8dbHcV83TyZAubea6gsQXo2yH1lDdw=="], - "@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20260611.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-yBbVXvbZyltR3I7NJdC4C4ItkItjZSiabcA/3HzEWOUQjLVKFqRh4so6ToHr70VCYh8VGeR8EDZL23igLhXqFQ=="], + "@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20260701.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-yBLsjS1qCWqFyCY37qRUrYfzHHvMGvjh8zRKJ6MvUivYDhkZTzqduppK38FoqYvayLJ5KbcxH7zo5rkxGqbsaA=="], - "@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20260611.1", "", { "os": "linux", "cpu": "x64" }, "sha512-PfNjpxOlaIgZFYuhD7+neEEewCN2Ud993wEEN0fmbtSOax1AK53LGqmXUDvFhnbkHxJLFAxYCSNISW8QbzaAIg=="], + "@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20260701.1", "", { "os": "linux", "cpu": "x64" }, "sha512-vMfqSIMfoo4xmZXEuUVqLpSFS921YKjiR9q7kDXPi6Vld1PK74UHg9LZuBavT2KSyemHUCTpj9y/4JSYOEyQbQ=="], - "@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20260611.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-GEp4XbuIKjlF8pakqXcUDJfKiJosD/Q7S83J0d+r+z9XIlYGfF3ntm08e2aiF5TFTwp3fnG4yMoPUAKNhNJpvQ=="], + "@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20260701.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-HRfwbKU2pK44V2NhoM0+iH0JJSj7nQ9Wv13ifIiGYCmTtDL8/zKtEhX7kQ3D4Vy/Cpjhttl0FkfqXj1aqLDPPg=="], - "@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20260611.1", "", { "os": "win32", "cpu": "x64" }, "sha512-S6JkS0kEbcCKs19RGqEPhjCRbP8GBkQwqYLp2fhBJtD/KTlwqLzOJ9E6PQ7gQKgWHtxy1NBG3oXarlNFRNU/dw=="], + "@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20260701.1", "", { "os": "win32", "cpu": "x64" }, "sha512-ngxCiIN9s/fM2o1IBMD0o1/mcXrv2NJVdyznh51UH8sQuvrTrXvV2nM0Uj/qU2wMwF6prgNBcdcd7AZeZGiBQA=="], "@cloudflare/workers-types": ["@cloudflare/workers-types@4.20260605.1", "", {}, "sha512-9YJaGPQwuQYFHoElVhJP40ZmUO/Z2OiBon58sKpHjgwq5btC/B2BZLC45AQ14k+1I+hjcY2z2t2R6uUxU9AqwQ=="], "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], - "@csstools/color-helpers": ["@csstools/color-helpers@6.0.2", "", {}, "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q=="], + "@csstools/color-helpers": ["@csstools/color-helpers@6.1.0", "", {}, "sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg=="], "@csstools/css-calc": ["@csstools/css-calc@3.2.1", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0" } }, "sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg=="], - "@csstools/css-color-parser": ["@csstools/css-color-parser@4.1.3", "", { "dependencies": { "@csstools/color-helpers": "^6.0.2", "@csstools/css-calc": "^3.2.1" }, "peerDependencies": { "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0" } }, "sha512-DOgvIPkikIOixQRlD4YF31VN6fLLUTdrzhfRbis8vm0kMTgIbEPX0Ip/YX9fOeV9iywAS4sUUbTclpan7yYP8Q=="], + "@csstools/css-color-parser": ["@csstools/css-color-parser@4.1.9", "", { "dependencies": { "@csstools/color-helpers": "^6.1.0", "@csstools/css-calc": "^3.2.1" }, "peerDependencies": { "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0" } }, "sha512-paQcIaOO53Rk5+YrBaBjm/SgrV4INImjo2BT1DtQRYr+XeTRbeAYlS+jxXp9drqvKmtFnWRJKIalDLhZZDu42A=="], "@csstools/css-parser-algorithms": ["@csstools/css-parser-algorithms@4.0.0", "", { "peerDependencies": { "@csstools/css-tokenizer": "^4.0.0" } }, "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w=="], - "@csstools/css-syntax-patches-for-csstree": ["@csstools/css-syntax-patches-for-csstree@1.1.5", "", { "peerDependencies": { "css-tree": "^3.2.1" }, "optionalPeers": ["css-tree"] }, "sha512-oNjBvzLq2GPZtJphCjLqXow/cHySHSgtxvKZb7OqSZ/xHgw6NWNhfad+6AB9cLeVm6eA9d/qMll3JdEHjy6M+A=="], + "@csstools/css-syntax-patches-for-csstree": ["@csstools/css-syntax-patches-for-csstree@1.1.6", "", { "peerDependencies": { "css-tree": "^3.2.1" }, "optionalPeers": ["css-tree"] }, "sha512-TcJCWFbXLPpJYq6z7bfOyjWYJDiDg2/I4gyUC9pqPNqHFRIey0EB0q0L5cSnQDfWJg8Jd6VadakxdIez/3zkqQ=="], "@csstools/css-tokenizer": ["@csstools/css-tokenizer@4.0.0", "", {}, "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA=="], - "@emnapi/core": ["@emnapi/core@1.11.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" } }, "sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q=="], + "@emnapi/core": ["@emnapi/core@1.11.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" } }, "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ=="], - "@emnapi/runtime": ["@emnapi/runtime@1.11.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg=="], + "@emnapi/runtime": ["@emnapi/runtime@1.11.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw=="], "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA=="], - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ=="], - "@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="], + "@esbuild/android-arm": ["@esbuild/android-arm@0.28.1", "", { "os": "android", "cpu": "arm" }, "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ=="], - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.3", "", { "os": "android", "cpu": "arm64" }, "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg=="], + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.28.1", "", { "os": "android", "cpu": "arm64" }, "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg=="], - "@esbuild/android-x64": ["@esbuild/android-x64@0.27.3", "", { "os": "android", "cpu": "x64" }, "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ=="], + "@esbuild/android-x64": ["@esbuild/android-x64@0.28.1", "", { "os": "android", "cpu": "x64" }, "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng=="], - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg=="], + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.28.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q=="], - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg=="], + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.28.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ=="], - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w=="], + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.28.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw=="], - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA=="], + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.28.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ=="], - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.3", "", { "os": "linux", "cpu": "arm" }, "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw=="], + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.28.1", "", { "os": "linux", "cpu": "arm" }, "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ=="], - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg=="], + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.28.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g=="], - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.3", "", { "os": "linux", "cpu": "ia32" }, "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg=="], + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.28.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w=="], - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA=="], + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg=="], - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw=="], + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ=="], - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA=="], + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.28.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ=="], - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ=="], + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ=="], - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw=="], + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.28.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag=="], - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.3", "", { "os": "linux", "cpu": "x64" }, "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA=="], + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.28.1", "", { "os": "linux", "cpu": "x64" }, "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA=="], - "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA=="], + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw=="], - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.3", "", { "os": "none", "cpu": "x64" }, "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA=="], + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.28.1", "", { "os": "none", "cpu": "x64" }, "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg=="], - "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.3", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw=="], + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.28.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q=="], - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ=="], + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.28.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw=="], - "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g=="], + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg=="], - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.3", "", { "os": "sunos", "cpu": "x64" }, "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA=="], + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.28.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ=="], - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA=="], + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.28.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA=="], - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q=="], + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.28.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg=="], - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="], + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.1", "", { "os": "win32", "cpu": "x64" }, "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A=="], "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="], @@ -458,7 +473,7 @@ "@msgpackr-extract/msgpackr-extract-win32-x64": ["@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4", "", { "os": "win32", "cpu": "x64" }, "sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ=="], - "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.5", "", { "dependencies": { "@tybys/wasm-util": "^0.10.2" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q=="], + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.6", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg=="], "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], @@ -474,45 +489,45 @@ "@oozcitak/util": ["@oozcitak/util@10.0.0", "", {}, "sha512-hAX0pT/73190NLqBPPWSdBVGtbY6VOhWYK3qqHqtXQ1gK7kS2yz4+ivsN07hpJ6I3aeMtKP6J6npsEKOAzuTLA=="], - "@oxc-parser/binding-android-arm-eabi": ["@oxc-parser/binding-android-arm-eabi@0.120.0", "", { "os": "android", "cpu": "arm" }, "sha512-WU3qtINx802wOl8RxAF1v0VvmC2O4D9M8Sv486nLeQ7iPHVmncYZrtBhB4SYyX+XZxj2PNnCcN+PW21jHgiOxg=="], + "@oxc-parser/binding-android-arm-eabi": ["@oxc-parser/binding-android-arm-eabi@0.137.0", "", { "os": "android", "cpu": "arm" }, "sha512-KDs+0VPdEmasOkpuJHW9V5WCF+cvYdMQv2Jd+aJXt+cxIx12NToRQRbXaRwUEDsZw+/jMk81Ve8ZFbjUkJTOwA=="], - "@oxc-parser/binding-android-arm64": ["@oxc-parser/binding-android-arm64@0.120.0", "", { "os": "android", "cpu": "arm64" }, "sha512-SEf80EHdhlbjZEgzeWm0ZA/br4GKMenDW3QB/gtyeTV1gStvvZeFi40ioHDZvds2m4Z9J1bUAUL8yn1/+A6iGg=="], + "@oxc-parser/binding-android-arm64": ["@oxc-parser/binding-android-arm64@0.137.0", "", { "os": "android", "cpu": "arm64" }, "sha512-WhALNzfy3x/RfC6bsqX+csavuUY0yHHE7XfgPE5M542uhoBZUUoGTPG+nkMbGoG4+gcfss5s7urMyn5QBHu0sw=="], - "@oxc-parser/binding-darwin-arm64": ["@oxc-parser/binding-darwin-arm64@0.120.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-xVrrbCai8R8CUIBu3CjryutQnEYhZqs1maIqDvtUCFZb8vY33H7uh9mHpL3a0JBIKoBUKjPH8+rzyAeXnS2d6A=="], + "@oxc-parser/binding-darwin-arm64": ["@oxc-parser/binding-darwin-arm64@0.137.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-bFPr5hgmNMOMoyPTGtdsK4Ug21RovIPojRMgDDhSp1LtCnc/DkLwGONKjgRjszg677RlGnkYSviQ8hHaUPOVYA=="], - "@oxc-parser/binding-darwin-x64": ["@oxc-parser/binding-darwin-x64@0.120.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-xyHBbnJ6mydnQUH7MAcafOkkrNzQC6T+LXgDH/3InEq2BWl/g424IMRiJVSpVqGjB+p2bd0h0WRR8iIwzjU7rw=="], + "@oxc-parser/binding-darwin-x64": ["@oxc-parser/binding-darwin-x64@0.137.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-CL5dMm1asqXIDZHg14FLxj3Mc36w8PI7xCWh1uA4is6z8g2XrIILoTcQYOxDbwzuk34RDPX5IAGUxZr6LA9KAg=="], - "@oxc-parser/binding-freebsd-x64": ["@oxc-parser/binding-freebsd-x64@0.120.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-UMnVRllquXUYTeNfFKmxTTEdZ/ix1nLl0ducDzMSREoWYGVIHnOOxoKMWlCOvRr9Wk/HZqo2rh1jeumbPGPV9A=="], + "@oxc-parser/binding-freebsd-x64": ["@oxc-parser/binding-freebsd-x64@0.137.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-79h8rYGnSlKPGWo7mHr2ixO6ea7aW8B0CT965SZ8SLbNnCOH5aOYBTeVXUY6eMvEaiLyWr8Skuiugr5pDYgLGw=="], - "@oxc-parser/binding-linux-arm-gnueabihf": ["@oxc-parser/binding-linux-arm-gnueabihf@0.120.0", "", { "os": "linux", "cpu": "arm" }, "sha512-tkvn2CQ7QdcsMnpfiX3fd3wA3EFsWKYlcQzq9cFw/xc89Al7W6Y4O0FgLVkVQpo0Tnq/qtE1XfkJOnRRA9S/NA=="], + "@oxc-parser/binding-linux-arm-gnueabihf": ["@oxc-parser/binding-linux-arm-gnueabihf@0.137.0", "", { "os": "linux", "cpu": "arm" }, "sha512-ASgmlSimhGyr0lksgVIo6hibz1obnDq4qJbiMX/AzltfgPnanRrzG1Q+23g8ljOHOjv6dsznkUuCYL3gg0sY1Q=="], - "@oxc-parser/binding-linux-arm-musleabihf": ["@oxc-parser/binding-linux-arm-musleabihf@0.120.0", "", { "os": "linux", "cpu": "arm" }, "sha512-WN5y135Ic42gQDk9grbwY9++fDhqf8knN6fnP+0WALlAUh4odY/BDK1nfTJRSfpJD9P3r1BwU0m3pW2DU89whQ=="], + "@oxc-parser/binding-linux-arm-musleabihf": ["@oxc-parser/binding-linux-arm-musleabihf@0.137.0", "", { "os": "linux", "cpu": "arm" }, "sha512-AU2J9aa22Sx32wRGnDjybOU9TQXXQUud5sdUi+ZB0XxwM8aToWLweV+yA0wlQm0yIUVqljquqoHCYEq9II8gJQ=="], - "@oxc-parser/binding-linux-arm64-gnu": ["@oxc-parser/binding-linux-arm64-gnu@0.120.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-1GgQBCcXvFMw99EPdMy+4NZ3aYyXsxjf9kbUUg8HuAy3ZBXzOry5KfFEzT9nqmgZI1cuetvApkiJBZLAPo8uaw=="], + "@oxc-parser/binding-linux-arm64-gnu": ["@oxc-parser/binding-linux-arm64-gnu@0.137.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-GdEtiG89yMr7XkUGxifgodXEEm2f+xW2f9CpDjlgAnBOwhTmrpQMvhOGobLVKUyzf/qHBXW16smk5zbF3nZU6w=="], - "@oxc-parser/binding-linux-arm64-musl": ["@oxc-parser/binding-linux-arm64-musl@0.120.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-gmMQ70gsPdDBgpcErvJEoWNBr7bJooSLlvOBVBSGfOzlP5NvJ3bFvnUeZZ9d+dPrqSngtonf7nyzWUTUj/U+lw=="], + "@oxc-parser/binding-linux-arm64-musl": ["@oxc-parser/binding-linux-arm64-musl@0.137.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-EGJ+Bs8iXx8KBH8DQ5BLoEm5lnHaYjlh4/8j8vFhrr/6z4tqONy5BZDzLpKmmNWlN6Hlc5r8YOuBVHqZ9vRFEQ=="], - "@oxc-parser/binding-linux-ppc64-gnu": ["@oxc-parser/binding-linux-ppc64-gnu@0.120.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-T/kZuU0ajop0xhzVMwH5r3srC9Nqup5HaIo+3uFjIN5uPxa0LvSxC1ZqP4aQGJVW5G0z8/nCkjIfSMS91P/wzw=="], + "@oxc-parser/binding-linux-ppc64-gnu": ["@oxc-parser/binding-linux-ppc64-gnu@0.137.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-vzFUQENy/fnbSe5DZWovq6tIBc1uhuMztanSW6rz1e9WdQE4gHwYuD7ZII6JnrJifd1R3RSoqiZbgRFlVL2tYQ=="], - "@oxc-parser/binding-linux-riscv64-gnu": ["@oxc-parser/binding-linux-riscv64-gnu@0.120.0", "", { "os": "linux", "cpu": "none" }, "sha512-vn21KXLAXzaI3N5CZWlBr1iWeXLl9QFIMor7S1hUjUGTeUuWCoE6JZB040/ZNDwf+JXPX8Ao9KbmJq9FMC2iGw=="], + "@oxc-parser/binding-linux-riscv64-gnu": ["@oxc-parser/binding-linux-riscv64-gnu@0.137.0", "", { "os": "linux", "cpu": "none" }, "sha512-SfVI14HBQs9gtLcUD5hTt5hsNbdrqSUNg9S8muN+LhVQ5nf1WwH3hAoK6B9NKgdYgWAQSXFXGiiBedQ4r/BKuw=="], - "@oxc-parser/binding-linux-riscv64-musl": ["@oxc-parser/binding-linux-riscv64-musl@0.120.0", "", { "os": "linux", "cpu": "none" }, "sha512-SUbUxlar007LTGmSLGIC5x/WJvwhdX+PwNzFJ9f/nOzZOrCFbOT4ikt7pJIRg1tXVsEfzk5mWpGO1NFiSs4PIw=="], + "@oxc-parser/binding-linux-riscv64-musl": ["@oxc-parser/binding-linux-riscv64-musl@0.137.0", "", { "os": "linux", "cpu": "none" }, "sha512-e7Ppy4FCIFNQxT/ikSeIWFoQ0l+N9vgtRBtLcyZXeolTzApyVoPqEXsYPrcdM/9i0Bwk8knvYd37vaEMxHyi6g=="], - "@oxc-parser/binding-linux-s390x-gnu": ["@oxc-parser/binding-linux-s390x-gnu@0.120.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-hYiPJTxyfJY2+lMBFk3p2bo0R9GN+TtpPFlRqVchL1qvLG+pznstramHNvJlw9AjaoRUHwp9IKR7UZQnRPGjgQ=="], + "@oxc-parser/binding-linux-s390x-gnu": ["@oxc-parser/binding-linux-s390x-gnu@0.137.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-Bho5qFwdhqsIFR7gipYEUlqvi3SRrY8sugxXig380MIaakBB1PyU9+7dBiBVScfImTNWhijUxdBwqrprGdq5WA=="], - "@oxc-parser/binding-linux-x64-gnu": ["@oxc-parser/binding-linux-x64-gnu@0.120.0", "", { "os": "linux", "cpu": "x64" }, "sha512-q+5jSVZkprJCIy3dzJpApat0InJaoxQLsJuD6DkX8hrUS61z2lHQ1Fe9L2+TYbKHXCLWbL0zXe7ovkIdopBGMQ=="], + "@oxc-parser/binding-linux-x64-gnu": ["@oxc-parser/binding-linux-x64-gnu@0.137.0", "", { "os": "linux", "cpu": "x64" }, "sha512-36mGWtg7PyFzjJwGDkH6/F4o2nIDEoKXLPr/X/lwqklkomQwJJt1I5GJVmGhovUEmgPK5WAeAZMqlFCehwiy9Q=="], - "@oxc-parser/binding-linux-x64-musl": ["@oxc-parser/binding-linux-x64-musl@0.120.0", "", { "os": "linux", "cpu": "x64" }, "sha512-D9QDDZNnH24e7X4ftSa6ar/2hCavETfW3uk0zgcMIrZNy459O5deTbWrjGzZiVrSWigGtlQwzs2McBP0QsfV1w=="], + "@oxc-parser/binding-linux-x64-musl": ["@oxc-parser/binding-linux-x64-musl@0.137.0", "", { "os": "linux", "cpu": "x64" }, "sha512-/Jqx6+N7A44n2BdvUr7pXhVr2vFjs6WGH3unZRczwrfiH0H1zY0QwKQMG/dtRiTlKGDKGukznPT8lx84/oEsZg=="], - "@oxc-parser/binding-openharmony-arm64": ["@oxc-parser/binding-openharmony-arm64@0.120.0", "", { "os": "none", "cpu": "arm64" }, "sha512-TBU8ZwOUWAOUWVfmI16CYWbvh4uQb9zHnGBHsw5Cp2JUVG044OIY1CSHODLifqzQIMTXvDvLzcL89GGdUIqNrA=="], + "@oxc-parser/binding-openharmony-arm64": ["@oxc-parser/binding-openharmony-arm64@0.137.0", "", { "os": "none", "cpu": "arm64" }, "sha512-9Uj0qHNNl+OgT1UTGwF7ixIXU6T1u2SbMidmgPy/h1h/fl2gRS6YpAxxY1gwHofcWjoTwkoMFd8xs5Vuj6GOFA=="], - "@oxc-parser/binding-wasm32-wasi": ["@oxc-parser/binding-wasm32-wasi@0.120.0", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.1" }, "cpu": "none" }, "sha512-WG/FOZgDJCpJnuF3ToG/K28rcOmSY7FmFmfBKYb2fmLyhDzPpUldFGV7/Fz4ru0Iz/v4KPmf8xVgO8N3lO4KHA=="], + "@oxc-parser/binding-wasm32-wasi": ["@oxc-parser/binding-wasm32-wasi@0.137.0", "", { "dependencies": { "@emnapi/core": "1.11.1", "@emnapi/runtime": "1.11.1", "@napi-rs/wasm-runtime": "^1.1.5" }, "cpu": "none" }, "sha512-gW2vfkytNGgMVADiuzdvOfw0mWG9za20F/1fCJsif5aBMAvWJTSbpIXbIe0XkOe0VENk+PadpQ7cZgUy2sUJcA=="], - "@oxc-parser/binding-win32-arm64-msvc": ["@oxc-parser/binding-win32-arm64-msvc@0.120.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-1T0HKGcsz/BKo77t7+89L8Qvu4f9DoleKWHp3C5sJEcbCjDOLx3m9m722bWZTY+hANlUEs+yjlK+lBFsA+vrVQ=="], + "@oxc-parser/binding-win32-arm64-msvc": ["@oxc-parser/binding-win32-arm64-msvc@0.137.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-x+pFANF0yL5uK/6T7lu6SlR5qid6sp//eZXKLq5iNsIE+EQg6EaS8/wsW7E91nXXjpnPhSoMOHXShSVhGRdn8w=="], - "@oxc-parser/binding-win32-ia32-msvc": ["@oxc-parser/binding-win32-ia32-msvc@0.120.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-L7vfLzbOXsjBXV0rv/6Y3Jd9BRjPeCivINZAqrSyAOZN3moCopDN+Psq9ZrGNZtJzP8946MtlRFZ0Als0wBCOw=="], + "@oxc-parser/binding-win32-ia32-msvc": ["@oxc-parser/binding-win32-ia32-msvc@0.137.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-sQUqym80PFi6McRsIqfJrSu2JrSClEZIXXD+/FjAFoULEKzOPsldIdFBG96xdX8aVMzCNQ9792FPx3MfkEIrFA=="], - "@oxc-parser/binding-win32-x64-msvc": ["@oxc-parser/binding-win32-x64-msvc@0.120.0", "", { "os": "win32", "cpu": "x64" }, "sha512-ys+upfqNtSu58huAhJMBKl3XCkGzyVFBlMlGPzHeFKgpFF/OdgNs1MMf8oaJIbgMH8ZxgGF7qfue39eJohmKIg=="], + "@oxc-parser/binding-win32-x64-msvc": ["@oxc-parser/binding-win32-x64-msvc@0.137.0", "", { "os": "win32", "cpu": "x64" }, "sha512-2AsevxlvNN4WKxpEn3RtqD5zbqMaXF+T7JXblsP4gVuY+vC9dXS4ED/PwfRCliFqoeisYS3Iro4DHzxr0TEvVA=="], "@oxc-project/runtime": ["@oxc-project/runtime@0.138.0", "", {}, "sha512-yHhoXsN8tYxgdJCdD91PbySNjEEaBX/tH2OQRDXJpsQv5b184oC4/qVbU7qlblvfil/JP15Lh2HW7+HN5DS90Q=="], @@ -700,115 +715,145 @@ "@sindresorhus/is": ["@sindresorhus/is@7.2.0", "", {}, "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw=="], - "@solid-primitives/event-listener": ["@solid-primitives/event-listener@2.4.5", "", { "dependencies": { "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-nwRV558mIabl4yVAhZKY8cb6G+O1F0M6Z75ttTu5hk+SxdOnKSGj+eetDIu7Oax1P138ZdUU01qnBPR8rnxaEA=="], + "@solid-primitives/event-listener": ["@solid-primitives/event-listener@2.4.6", "", { "dependencies": { "@solid-primitives/utils": "^6.4.1" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-5I0YJcTVYIWoMmgBSROBZGcz+ymhew/pGTg2dHW74BUjFKsV8Li4bOZYl0YAGP4mHw5o4UBd9/BEesqBci3wxw=="], - "@solid-primitives/keyboard": ["@solid-primitives/keyboard@1.3.5", "", { "dependencies": { "@solid-primitives/event-listener": "^2.4.5", "@solid-primitives/rootless": "^1.5.3", "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-sav+l+PL+74z3yaftVs7qd8c2SXkqzuxPOVibUe5wYMt+U5Hxp3V3XCPgBPN2I6cANjvoFtz0NiU8uHVLdi9FQ=="], + "@solid-primitives/keyboard": ["@solid-primitives/keyboard@1.3.7", "", { "dependencies": { "@solid-primitives/event-listener": "^2.4.6", "@solid-primitives/rootless": "^1.5.4", "@solid-primitives/utils": "^6.4.1" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-558RPNYnXx4nGh537DSqAn4xMrC8iFipl/5+xzgzWoTNFst4RnUN3BOLmtDjJ0UGGoQXVMALYR3bNOHM0xnt1Q=="], - "@solid-primitives/resize-observer": ["@solid-primitives/resize-observer@2.1.5", "", { "dependencies": { "@solid-primitives/event-listener": "^2.4.5", "@solid-primitives/rootless": "^1.5.3", "@solid-primitives/static-store": "^0.1.3", "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-AiyTknKcNBaKHbcSMuxtSNM8FjIuiSuFyFghdD0TcCMU9hKi9EmsC5pjfjDwxE+5EueB1a+T/34PLRI5vbBbKw=="], + "@solid-primitives/resize-observer": ["@solid-primitives/resize-observer@2.1.6", "", { "dependencies": { "@solid-primitives/event-listener": "^2.4.6", "@solid-primitives/rootless": "^1.5.4", "@solid-primitives/static-store": "^0.1.4", "@solid-primitives/utils": "^6.4.1" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-GFj6b81KIahl5SBf35VlyClHshDhVEREeZz2WYkHHKBvam66mE5H5f1g3EralabAAjmcU1bBd18YYYETPv0Knw=="], - "@solid-primitives/rootless": ["@solid-primitives/rootless@1.5.3", "", { "dependencies": { "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-N8cIDAHbWcLahNRLr0knAAQvXyEdEMoAZvIMZKmhNb1mlx9e2UOv9BRD5YNwQUJwbNoYVhhLwFOEOcVXFx0HqA=="], + "@solid-primitives/rootless": ["@solid-primitives/rootless@1.5.4", "", { "dependencies": { "@solid-primitives/utils": "^6.4.1" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-TOIZa1VUfVJ+9nkCcRajw3U4t9vBOP1HxX1WHNTbXq32mXwlqTvUnC4CRIilohcryBkT9u2ZkhUDSHRTaGp55g=="], - "@solid-primitives/static-store": ["@solid-primitives/static-store@0.1.3", "", { "dependencies": { "@solid-primitives/utils": "^6.4.0" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-uxez7SXnr5GiRnzqO2IEDjOJRIXaG+0LZLBizmUA1FwSi+hrpuMzVBwyk70m4prcl8X6FDDXUl9O8hSq8wHbBQ=="], + "@solid-primitives/static-store": ["@solid-primitives/static-store@0.1.4", "", { "dependencies": { "@solid-primitives/utils": "^6.4.1" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-LgtVaVBtB7EbmS4+M0b8xY5Iq6pUWXBsIC4VgtrFKDGDdyCaDt88sHk0fUlx1Enxm/XZnZyLXJABRoa39RjJqA=="], - "@solid-primitives/utils": ["@solid-primitives/utils@6.4.0", "", { "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-AeGTBg8Wtkh/0s+evyLtP8piQoS4wyqqQaAFs2HJcFMMjYAtUgo+ZPduRXLjPlqKVc2ejeR544oeqpbn8Egn8A=="], + "@solid-primitives/utils": ["@solid-primitives/utils@6.4.1", "", { "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-ISSB5QX1qP2ynrheIpYwc4oKR5Ny4siNuUyf1qZniy+Il+p/PtDB0QK1Dnle8noiHpwRD3gpPdubOC3qI/Zamg=="], - "@speed-highlight/core": ["@speed-highlight/core@1.2.16", "", {}, "sha512-yNm/fYEcnpRjYduLMaddTK9XKYil6xB88+qFg79ZdZhHu1PadfoQmFW7pVTx7FZqMBNcUuThiAhxhENgtAO2/w=="], + "@speed-highlight/core": ["@speed-highlight/core@1.2.17", "", {}, "sha512-Z92FwKpCtfaW1V0jTU/fh3QzYEZN8wDwrzRIBoADCJfn4mJCNcJN/XegifX7BDrQ8/h9Xh/JnbyMchL0FqXrkg=="], "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], - "@tailwindcss/node": ["@tailwindcss/node@4.3.1", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "5.21.6", "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.3.1" } }, "sha512-6NDaqRoAMSXD1mr/RXu0HBvNE9a2n5tHPsxu9XHLws8o4Twes5rBM2205SUUiJ9goAtadrN6xTGX0UDEwp/N4A=="], + "@swc/core": ["@swc/core@1.15.43", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.27" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.15.43", "@swc/core-darwin-x64": "1.15.43", "@swc/core-linux-arm-gnueabihf": "1.15.43", "@swc/core-linux-arm64-gnu": "1.15.43", "@swc/core-linux-arm64-musl": "1.15.43", "@swc/core-linux-ppc64-gnu": "1.15.43", "@swc/core-linux-s390x-gnu": "1.15.43", "@swc/core-linux-x64-gnu": "1.15.43", "@swc/core-linux-x64-musl": "1.15.43", "@swc/core-win32-arm64-msvc": "1.15.43", "@swc/core-win32-ia32-msvc": "1.15.43", "@swc/core-win32-x64-msvc": "1.15.43" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" }, "optionalPeers": ["@swc/helpers"] }, "sha512-1CuKjFkPxIgGdeHVuNbkxmBxkcbdc08u0aiI43pFq6yY1tTVKmXT9hFEooyyKs/sJ3xf1GPHyEwTtk9Xl8dvQw=="], + + "@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.15.43", "", { "os": "darwin", "cpu": "arm64" }, "sha512-v1aVuvXdo/BHxJzco9V2xpHrvwWmhfS8t6gziY5wJxd+Z2h8AeJRnAwPD8itCDaGXVBwJ/CaKfxEzTkG0Va0OA=="], + + "@swc/core-darwin-x64": ["@swc/core-darwin-x64@1.15.43", "", { "os": "darwin", "cpu": "x64" }, "sha512-lp3d4Lamc8dt5huYdGLSR+9hLxmfr1jb0l+4XXG2zPqZwYWRN9R0U2qYoTrggiU2RWW0oV9VbWM3kBnqIc2kdQ=="], + + "@swc/core-linux-arm-gnueabihf": ["@swc/core-linux-arm-gnueabihf@1.15.43", "", { "os": "linux", "cpu": "arm" }, "sha512-JWTQQELtsG5GgphDrr/XqqmM2pDN3cZqbMS0Mrg+iTiXL3F74sn/S2IyYE/5u4h2KLkTf9qQ7dXyxsbx7YzkeA=="], + + "@swc/core-linux-arm64-gnu": ["@swc/core-linux-arm64-gnu@1.15.43", "", { "os": "linux", "cpu": "arm64" }, "sha512-B4otJRdPWIsmiSBf0uG7Z/+vMWmkufjz5MmYxubwKuZazDW14Zd3symga1N62QR4RT+kEFeHEgsXfZGyn/w0hw=="], + + "@swc/core-linux-arm64-musl": ["@swc/core-linux-arm64-musl@1.15.43", "", { "os": "linux", "cpu": "arm64" }, "sha512-6zB6OnpViBxYy4tgY3v2i6AZY9fwkcHZ032UOwtwUuW1d19sdT07qF0kZe6/3UR1tUaK6jjg2rmVcUIBCEYVjQ=="], + + "@swc/core-linux-ppc64-gnu": ["@swc/core-linux-ppc64-gnu@1.15.43", "", { "os": "linux", "cpu": "ppc64" }, "sha512-coxE1ZWdB3uSDVNoEtYNrRi/1epvckZx9cTJ8ICUxTMTxGk+yvQ/Twacp3ruZSaMPGCriUjP86C37VhaT6nyRg=="], + + "@swc/core-linux-s390x-gnu": ["@swc/core-linux-s390x-gnu@1.15.43", "", { "os": "linux", "cpu": "s390x" }, "sha512-lXfLhs+LpBsD5inuYx+YDH5WsPPBQ95KPUiy8P5wq9ob9xKDZFqwNfU2QW6bGO8NqRO/H9JQomTSt5Yyh+FGfA=="], + + "@swc/core-linux-x64-gnu": ["@swc/core-linux-x64-gnu@1.15.43", "", { "os": "linux", "cpu": "x64" }, "sha512-07XnKwTmKy8TGOZG3D9fRnLWGynxPjwQnZLVmBFbo6F+7vHYzBIOuwXEhemrChBWb6yDNZsVCcMWCPX6FDD2xg=="], - "@tailwindcss/oxide": ["@tailwindcss/oxide@4.3.1", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.3.1", "@tailwindcss/oxide-darwin-arm64": "4.3.1", "@tailwindcss/oxide-darwin-x64": "4.3.1", "@tailwindcss/oxide-freebsd-x64": "4.3.1", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.1", "@tailwindcss/oxide-linux-arm64-gnu": "4.3.1", "@tailwindcss/oxide-linux-arm64-musl": "4.3.1", "@tailwindcss/oxide-linux-x64-gnu": "4.3.1", "@tailwindcss/oxide-linux-x64-musl": "4.3.1", "@tailwindcss/oxide-wasm32-wasi": "4.3.1", "@tailwindcss/oxide-win32-arm64-msvc": "4.3.1", "@tailwindcss/oxide-win32-x64-msvc": "4.3.1" } }, "sha512-yVPyo8RNkabVr3O2EhHEE0Rewu7YKzc1DhIqfL46LKveFrmu9XbDazNOJY7/GRuvw1h6u3utWnR29H/p5JPlgA=="], + "@swc/core-linux-x64-musl": ["@swc/core-linux-x64-musl@1.15.43", "", { "os": "linux", "cpu": "x64" }, "sha512-TJc+bsSIaBh+hZvZ5GRtW/K1bw66TJ9vsUwvVIsZdiWxU5ObLwZvfcnZ3UpgVfMnFibRes9uriJrQNBHEEogRQ=="], - "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.3.1", "", { "os": "android", "cpu": "arm64" }, "sha512-SVlyf61g374l5cHyg8x9kf5xmLcOaxvOTsbsqDnSsDJaKOEFZ7GCvi84VAVGpxojYOs1+3K6M0UjXfqPU8vmOQ=="], + "@swc/core-win32-arm64-msvc": ["@swc/core-win32-arm64-msvc@1.15.43", "", { "os": "win32", "cpu": "arm64" }, "sha512-jfd7s2/bUQYkOHLs+LWQNKZdmDa8+sufKLllhpWAhVQ2GDCwsHe3vR/j+OSiItZNtkzFuaawa3+SAKz9y5gYfw=="], - "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.3.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-hVnWLwv+e/l7c4WKyVtHVrIPvYdqWHjRB3MDIqARynzFtnQg85kmQEFCbV9Ja0VVx4xXTIiDWY60Y7iz/iNoDA=="], + "@swc/core-win32-ia32-msvc": ["@swc/core-win32-ia32-msvc@1.15.43", "", { "os": "win32", "cpu": "ia32" }, "sha512-rLAE8JvucqEW1ZGohxPQrQWPBQeJG4+ypKbWfdlU/qmKScvCkxf9/Jxnzki1dkUQCQ7P5Enp13RlvqOlvx/32g=="], - "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.3.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-Cf7abu0WVgbhU7ANgPUnSAvm7nCvMweusHb8FnaHlLfv/Caq4GYaEZg7ZImzzmjx4lIAfuS8q+eLIS7A7IzxIg=="], + "@swc/core-win32-x64-msvc": ["@swc/core-win32-x64-msvc@1.15.43", "", { "os": "win32", "cpu": "x64" }, "sha512-h8MLDHZcfIukwQWj03rIJZx1I0E81AYj2X7J/nGErG4nz+QAv6G1Z+peotvinL3lqpbo32tLYSMFo32/ySzxKg=="], - "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.3.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-ZZqzX2Y+GXtXXfqSfpJhDm60OoZfvLHLCgm+J7NVqgHHJjG/m9ugZI77RwTsVd4fnBJuCFP6Ae6kTJb71UdS8g=="], + "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="], - "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.3.1", "", { "os": "linux", "cpu": "arm" }, "sha512-/Ah/xik0LaMYfv9DZ0S/t4pBlBNYOcqtRwusjgovHkvT8ixueWCLyJjsaF5kQIckjb4IT8Q6K6p/iPmZMixYgg=="], + "@swc/types": ["@swc/types@0.1.27", "", { "dependencies": { "@swc/counter": "^0.1.3" } }, "sha512-K6h3iUlqeM946U4sXFYeahefR1YBbXJvko+hv8WS8/0BNJ4OHiHRywMnQUJCqkR7Y9+hqQ1TvEpiKqUhz7NEFg=="], - "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.3.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-gqdFoVJlw444GvpnheZLHmvTzSxI/cOUUh2KSNejQjTcYkW062SVD+En0rUgD+QV91bz1XGIGtt1HJd48xUGbQ=="], + "@tailwindcss/node": ["@tailwindcss/node@4.3.2", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "5.21.6", "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.3.2" } }, "sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg=="], - "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.3.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-Bwv9KwOvE0VKa86xPFif9b9c3Y1NxOV1P0gLti/IYaWEsQYZXDlxfGEtA8mdDZ7SG3wyNXAWYT5SIn3giL57oA=="], + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.3.2", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.3.2", "@tailwindcss/oxide-darwin-arm64": "4.3.2", "@tailwindcss/oxide-darwin-x64": "4.3.2", "@tailwindcss/oxide-freebsd-x64": "4.3.2", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.2", "@tailwindcss/oxide-linux-arm64-gnu": "4.3.2", "@tailwindcss/oxide-linux-arm64-musl": "4.3.2", "@tailwindcss/oxide-linux-x64-gnu": "4.3.2", "@tailwindcss/oxide-linux-x64-musl": "4.3.2", "@tailwindcss/oxide-wasm32-wasi": "4.3.2", "@tailwindcss/oxide-win32-arm64-msvc": "4.3.2", "@tailwindcss/oxide-win32-x64-msvc": "4.3.2" } }, "sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag=="], - "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.3.1", "", { "os": "linux", "cpu": "x64" }, "sha512-Ymi8O8T15HYQdOUWUtTI6ldN0neHP85FC+Qz32xTcZ7iJXtem/x8ITev0o1e9e5rkqj4lONZfTRLvkmin1+tKg=="], + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.3.2", "", { "os": "android", "cpu": "arm64" }, "sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA=="], - "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.3.1", "", { "os": "linux", "cpu": "x64" }, "sha512-M+P/91qJ6uILLw4k2G93GMDRAXj61SMvFQYt39AqvUqYgExXpLL5aepfns7sj4HiAQeolirQF9E0lzRvdf4zPQ=="], + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.3.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w=="], - "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.3.1", "", { "dependencies": { "@emnapi/core": "^1.10.0", "@emnapi/runtime": "^1.10.0", "@emnapi/wasi-threads": "^1.2.1", "@napi-rs/wasm-runtime": "^1.1.4", "@tybys/wasm-util": "^0.10.2", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-zsM8uOeqvVGHsAXsJxsT28ttosFahLJKCLOTUBqRAtKnVgGSRitds9T432QiT8b77Yga7JIBkulIRRlJPtYhRA=="], + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.3.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ=="], - "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.3.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-aiNvSq9BsVk8V513lDKlrCFAgf8qBMPZTpgEhInL+NwQqs97mYmupVMrPrgBBSL8Pv/0zXu9MrMF9rMun1ZeNg=="], + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.3.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA=="], - "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.3.1", "", { "os": "win32", "cpu": "x64" }, "sha512-xDEyu1rg290472FEGaKHnzyDyh5QH+AlWvsU5hMoMtPpzmKlRI0jaYKCgSHDYtaQWZOYbMaduSyCwFwY4n1HmA=="], + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.3.2", "", { "os": "linux", "cpu": "arm" }, "sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w=="], + + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.3.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw=="], + + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.3.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA=="], + + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.3.2", "", { "os": "linux", "cpu": "x64" }, "sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w=="], + + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.3.2", "", { "os": "linux", "cpu": "x64" }, "sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw=="], + + "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.3.2", "", { "dependencies": { "@emnapi/core": "^1.11.1", "@emnapi/runtime": "^1.11.1", "@emnapi/wasi-threads": "^1.2.2", "@napi-rs/wasm-runtime": "^1.1.4", "@tybys/wasm-util": "^0.10.2", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw=="], + + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.3.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ=="], + + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.3.2", "", { "os": "win32", "cpu": "x64" }, "sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ=="], "@tailwindcss/typography": ["@tailwindcss/typography@0.5.20", "", { "dependencies": { "postcss-selector-parser": "6.0.10" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || >=4.0.0 || insiders" } }, "sha512-hwbzQuNUfcPvbegQFatVPl/MY/tcM9KLl963hQ5laJKPh81TEZ1+dNG9PirGvcaDBkp+BCshExAyKVPW91dozw=="], - "@tailwindcss/vite": ["@tailwindcss/vite@4.3.1", "", { "dependencies": { "@tailwindcss/node": "4.3.1", "@tailwindcss/oxide": "4.3.1", "tailwindcss": "4.3.1" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, "sha512-hItDHuIIlEV61R+faXu66s1K36aTurO/Qw0e45Vskz57gXl9pWOT6eg3zmcEui6CZXddbN7zd41bwmvag4JGwQ=="], + "@tailwindcss/vite": ["@tailwindcss/vite@4.3.2", "", { "dependencies": { "@tailwindcss/node": "4.3.2", "@tailwindcss/oxide": "4.3.2", "tailwindcss": "4.3.2" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, "sha512-eHpMeX4JXfVNJDEcsouTeCBubJBTcTLigeaw/NTUW6PB5ATKKXdyonnXgTBX2VuRbjz1hjfz6C5XAhr52ImQXA=="], "@tailwindcss/webpack": ["@tailwindcss/webpack@4.2.0", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.2.0", "@tailwindcss/oxide": "4.2.0", "tailwindcss": "4.2.0" }, "peerDependencies": { "webpack": "^5" } }, "sha512-TohlILOzF/3l+Yolll9iD2b5bsLG/1TuxAXPTxJcA77YAgPyKKc5RIwj4vIjg4l9DFMidekx2Z0BWyPAle9TUA=="], - "@tanstack/devtools": ["@tanstack/devtools@0.12.2", "", { "dependencies": { "@solid-primitives/event-listener": "^2.4.3", "@solid-primitives/keyboard": "^1.3.3", "@solid-primitives/resize-observer": "^2.1.3", "@tanstack/devtools-client": "0.0.6", "@tanstack/devtools-event-bus": "0.4.1", "@tanstack/devtools-ui": "0.5.2", "clsx": "^2.1.1", "goober": "^2.1.16", "solid-js": "^1.9.9" }, "bin": { "intent": "./bin/intent.js" } }, "sha512-Xdl8pLzoDUvXaclQ0poY36WAPx0jEHk8vqUFd8FYFUm1BMshtB7RnTgD1HE9jCAXODxqw9I0gXBiUZLK3o3+Bw=="], + "@tanstack/devtools": ["@tanstack/devtools@0.12.5", "", { "dependencies": { "@solid-primitives/event-listener": "^2.4.3", "@solid-primitives/keyboard": "^1.3.3", "@solid-primitives/resize-observer": "^2.1.3", "@tanstack/devtools-client": "0.0.8", "@tanstack/devtools-event-bus": "0.4.2", "@tanstack/devtools-ui": "0.6.0", "clsx": "^2.1.1", "goober": "^2.1.16", "solid-js": "^1.9.9" }, "bin": { "intent": "./bin/intent.js" } }, "sha512-JdxTSeVdjJheycgz4c7qbldNKDCEDWlWr1l9dZBhd9sOmRBT5Z70ka9Eb8mb+FUnalcOIB62IDSR/iSxAIUD8Q=="], - "@tanstack/devtools-client": ["@tanstack/devtools-client@0.0.6", "", { "dependencies": { "@tanstack/devtools-event-client": "^0.4.1" } }, "sha512-f85ZJXJnDIFOoykG/BFIixuAevJovCvJF391LPs6YjBAPhGYC50NWlx1y4iF/UmK5/cCMx+/JqI5SBOz7FanQQ=="], + "@tanstack/devtools-client": ["@tanstack/devtools-client@0.0.8", "", { "dependencies": { "@tanstack/devtools-event-client": "^0.5.0" } }, "sha512-cG3iZkGWCwN330bLBKa8+9r4Of2AXNoz2zUqcsy/4XsD3105ghVBx78cGyvJj9fSclNomPxoqAnDGXXhg1WLvA=="], - "@tanstack/devtools-event-bus": ["@tanstack/devtools-event-bus@0.4.1", "", { "dependencies": { "ws": "^8.18.3" } }, "sha512-cNnJ89Q021Zf883rlbBTfsaxTfi2r73/qejGtyTa7ksErF3hyDyAq1aTbo5crK9dAL7zSHh9viKY1BtMls1QOA=="], + "@tanstack/devtools-event-bus": ["@tanstack/devtools-event-bus@0.4.2", "", { "dependencies": { "ws": "^8.18.3" } }, "sha512-2LHzhwBFlKHCcklsQrGe8TeyjHd4XAF8nuCO6wHmva5fePUkJUULbu6CsCNAlGlCi0KkEsMXZSvRdR4HgMq4yA=="], - "@tanstack/devtools-event-client": ["@tanstack/devtools-event-client@0.4.3", "", { "bin": { "intent": "bin/intent.js" } }, "sha512-OZI6QyULw0FI0wjgmeYzCIfbgPsOEzwJtCpa69XrfLMtNXLGnz3d/dIabk7frg0TmHo+Ah49w5I4KC7Tufwsvw=="], + "@tanstack/devtools-event-client": ["@tanstack/devtools-event-client@0.5.0", "", { "bin": { "intent": "./bin/intent.js" } }, "sha512-H+OH3zC6Vhu/K0NaVfQKknEKawc/+2PT+D3SB3Ox0V8SiMlTo0abbmH2rH0721R2aNYbjdMXA1oENOd8E2UVoA=="], - "@tanstack/devtools-ui": ["@tanstack/devtools-ui@0.5.2", "", { "dependencies": { "clsx": "^2.1.1", "dayjs": "^1.11.19", "goober": "^2.1.16", "solid-js": "^1.9.9" } }, "sha512-GtaMk8kaGZ9ZdR8Pu5RAfcse/ZrxzH/xsAIFtHMapLs2VMqSPFfb1NvIDO1MAAfUcub8Ix8XKQEP0uYSPzoFKw=="], + "@tanstack/devtools-ui": ["@tanstack/devtools-ui@0.6.0", "", { "dependencies": { "clsx": "^2.1.1", "dayjs": "^1.11.19", "goober": "^2.1.16", "solid-js": "^1.9.9" } }, "sha512-CVaM6rT6Nl5ijo83vJYFa2SjofvpuOl/uOvbYGhBrRgUhhelNHhx8zZX+hnZCHmIr0/lzM65hsocnZ72592Rvg=="], - "@tanstack/devtools-vite": ["@tanstack/devtools-vite@0.7.0", "", { "dependencies": { "@tanstack/devtools-client": "0.0.6", "@tanstack/devtools-event-bus": "0.4.1", "chalk": "^5.6.2", "launch-editor": "^2.11.1", "magic-string": "^0.30.0", "oxc-parser": "^0.120.0", "picomatch": "^4.0.3" }, "peerDependencies": { "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "bin": { "intent": "./bin/intent.js" } }, "sha512-VXki7K+Xwnpo3IKdNSWGe7YOvtZv33YlulGqaQ+YCpeQhYg8JFuxP50BXibDoRLj5EOX4r21Hs7COdxbRHXkTw=="], + "@tanstack/devtools-vite": ["@tanstack/devtools-vite@0.8.1", "", { "dependencies": { "@tanstack/devtools-client": "0.0.8", "@tanstack/devtools-event-bus": "0.4.2", "chalk": "^5.6.2", "launch-editor": "^2.11.1", "magic-string": "^0.30.0", "oxc-parser": "^0.120.0", "picomatch": "^4.0.3" }, "peerDependencies": { "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "bin": { "intent": "./bin/intent.js" } }, "sha512-oQxOo0fI0bwhHtw/psFlIR0OS/bsKrirBxwnw2vuhCM4bjt3k4EZZsW/lvZ1+Vpouhts7LSyvngnxvGXbQ1sUQ=="], "@tanstack/history": ["@tanstack/history@1.162.0", "", {}, "sha512-79pf/RkhteYZTRgcR4F9kbk84P2N8rugQJswxfIqovlbRiT3yI7eBE+5QorIrZaOKktsgzRlXh1l/du/xpl4iA=="], - "@tanstack/query-core": ["@tanstack/query-core@5.101.0", "", {}, "sha512-cQetA74EB+seWySv1TTKr828TnP0u39m6LykwDXIo84SNortpDkp30TMEjkqtYCNP9c40uT/iwl6MLiufEt0Ow=="], + "@tanstack/query-core": ["@tanstack/query-core@5.101.2", "", {}, "sha512-hH5MLoJhF7KaIGd7q3xTXGXvslI+GYlM1Z/35aSHHWaCJWB7XvTSHYuV3eM7tw+aE0mT/xMro4M4Q9rCGHT0lw=="], - "@tanstack/react-devtools": ["@tanstack/react-devtools@0.10.5", "", { "dependencies": { "@tanstack/devtools": "0.12.2" }, "peerDependencies": { "@types/react": ">=16.8", "@types/react-dom": ">=16.8", "react": ">=16.8", "react-dom": ">=16.8" } }, "sha512-orVsRJ7oAXFb7oyafQCgx9YuK44jpILh5T/ddYuxAsolNfN5DZBr5/NLrWErD7HCGIzvYzg1TZI4sPxmiKvtvA=="], + "@tanstack/react-devtools": ["@tanstack/react-devtools@0.10.8", "", { "dependencies": { "@tanstack/devtools": "0.12.5" }, "peerDependencies": { "@types/react": ">=16.8", "@types/react-dom": ">=16.8", "react": ">=16.8", "react-dom": ">=16.8" } }, "sha512-YJV6YttQf9lhhPbPBLULgy1eScEvJUMsCS26mjg9hfBKgAJQA5sF9zvzorDzW9Ob6o/asoXikO81JnRUVuFX0Q=="], - "@tanstack/react-query": ["@tanstack/react-query@5.101.0", "", { "dependencies": { "@tanstack/query-core": "5.101.0" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-rLlJXSpkqfizLWgkR5+eLeIk0MvTx/meEIR7LRjxic+qxiQP8zVjq7BqQkiCMNLQBlLfuOLqqr6KO5GtrDlmSg=="], + "@tanstack/react-query": ["@tanstack/react-query@5.101.2", "", { "dependencies": { "@tanstack/query-core": "5.101.2" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-seDkr6kzGzX1okaaTtZPtgA688CDPlXUz1C6xSg0ESqn04Vuc8tlrYms1s3de+znBqhPVxFRfpAfUf+6XvfPWg=="], - "@tanstack/react-router": ["@tanstack/react-router@1.170.15", "", { "dependencies": { "@tanstack/history": "1.162.0", "@tanstack/react-store": "^0.9.3", "@tanstack/router-core": "1.171.13", "isbot": "^5.1.22" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-GawYz7HEjj8rTUUDoT/SemDEVm63pZUO+2mOcXHY9Jl3EwMS5gFBnPu/2UvcrwRm1jN1k79fokc0d4aFmrLatg=="], + "@tanstack/react-router": ["@tanstack/react-router@1.170.17", "", { "dependencies": { "@tanstack/history": "1.162.0", "@tanstack/react-store": "^0.9.3", "@tanstack/router-core": "1.171.14", "isbot": "^5.1.22" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-ppLkjCfSMaeug9rmFRYzOd4TIqWV+yTE7tzIny7alJsSnM7w4lzEZm6eqCehG0SPetpZ0R3K+UnanSmBgOAVcQ=="], "@tanstack/react-router-devtools": ["@tanstack/react-router-devtools@1.167.0", "", { "dependencies": { "@tanstack/router-devtools-core": "1.168.0" }, "peerDependencies": { "@tanstack/react-router": "^1.170.0", "@tanstack/router-core": "^1.170.0", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" }, "optionalPeers": ["@tanstack/router-core"] }, "sha512-nGw095EG7IHx0h5NtlEmzf6vcCTaFNPWdTSuDKazajhN0ct/v/TkekJ9J6KYUCeV1a8/2ZmToc58M+0rrOyn7w=="], "@tanstack/react-router-ssr-query": ["@tanstack/react-router-ssr-query@1.167.1", "", { "dependencies": { "@tanstack/router-ssr-query-core": "1.169.1" }, "peerDependencies": { "@tanstack/query-core": ">=5.90.0", "@tanstack/react-query": ">=5.90.0", "@tanstack/react-router": ">=1.127.0", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-W9j5JPnBikyafvuUfykFfHIWod58OAbAAa5leNkXBcoDoocghMmu6w9uZOmUZvAWT7CSvgj5tBUtF7CM2OoHXQ=="], - "@tanstack/react-start": ["@tanstack/react-start@1.168.25", "", { "dependencies": { "@tanstack/react-router": "1.170.15", "@tanstack/react-start-client": "1.168.13", "@tanstack/react-start-rsc": "0.1.24", "@tanstack/react-start-server": "1.167.19", "@tanstack/router-utils": "1.162.2", "@tanstack/start-client-core": "1.170.12", "@tanstack/start-plugin-core": "1.171.17", "@tanstack/start-server-core": "1.169.14", "pathe": "^2.0.3" }, "peerDependencies": { "@rsbuild/core": "^2.0.0", "@vitejs/plugin-rsc": "*", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0", "vite": ">=7.0.0" }, "optionalPeers": ["@rsbuild/core", "@vitejs/plugin-rsc", "vite"] }, "sha512-aHlg9YTSeL12gWrYIHAEzoncPHc5JUbQ60Sc26OQ7J1zcsXqdKwdcqaApG4YV12S/keFdbndHjxaiYkUcJlx7Q=="], + "@tanstack/react-start": ["@tanstack/react-start@1.168.27", "", { "dependencies": { "@tanstack/react-router": "1.170.17", "@tanstack/react-start-client": "1.168.15", "@tanstack/react-start-rsc": "0.1.26", "@tanstack/react-start-server": "1.167.21", "@tanstack/router-utils": "1.162.2", "@tanstack/start-client-core": "1.170.13", "@tanstack/start-plugin-core": "1.171.19", "@tanstack/start-server-core": "1.169.16", "pathe": "^2.0.3" }, "peerDependencies": { "@rsbuild/core": "^2.0.0", "@vitejs/plugin-rsc": "*", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0", "vite": ">=7.0.0" }, "optionalPeers": ["@rsbuild/core", "@vitejs/plugin-rsc", "vite"] }, "sha512-rdGFDqfCW71gyofyAxaYxhelNKmeVjpmbpm0uFYbNHORCa///4aBxi7B7ecShibKv9O4GfJ66MPX5F0ozbm+ig=="], - "@tanstack/react-start-client": ["@tanstack/react-start-client@1.168.13", "", { "dependencies": { "@tanstack/react-router": "1.170.15", "@tanstack/router-core": "1.171.13", "@tanstack/start-client-core": "1.170.12" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-enr4hL0Fifqz7jO8Zy4CuEpunEfH1LbvMw/mRjG49j699Bo3CaR7mPDcgN/9tSSjjUT5ZDj9M6TiTp9cSgehww=="], + "@tanstack/react-start-client": ["@tanstack/react-start-client@1.168.15", "", { "dependencies": { "@tanstack/react-router": "1.170.17", "@tanstack/router-core": "1.171.14", "@tanstack/start-client-core": "1.170.13" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-pW50PHvadgi50iNCw6deUOvqc9rzs30SstyFZY2tcS9z1XlqTlELSvGowjxdu2m0ymtqm1emj1jau1iP7+3+PQ=="], - "@tanstack/react-start-rsc": ["@tanstack/react-start-rsc@0.1.24", "", { "dependencies": { "@tanstack/react-router": "1.170.15", "@tanstack/router-core": "1.171.13", "@tanstack/router-utils": "1.162.2", "@tanstack/start-client-core": "1.170.12", "@tanstack/start-fn-stubs": "1.162.0", "@tanstack/start-plugin-core": "1.171.17", "@tanstack/start-server-core": "1.169.14", "@tanstack/start-storage-context": "1.167.15", "pathe": "^2.0.3" }, "peerDependencies": { "@rspack/core": ">=2.0.0-0", "@vitejs/plugin-rsc": ">=0.5.20", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0", "react-server-dom-rspack": ">=0.0.2" }, "optionalPeers": ["@rspack/core", "@vitejs/plugin-rsc", "react-server-dom-rspack"] }, "sha512-8zBLV68t6byrbtIyKYNTCpcc7qFbb0kQiu0yFtFIvsi70fpBeG3VP8bmkN95/Cqpvz1lLio+E4JApRyV52MpxQ=="], + "@tanstack/react-start-rsc": ["@tanstack/react-start-rsc@0.1.26", "", { "dependencies": { "@tanstack/react-router": "1.170.17", "@tanstack/router-core": "1.171.14", "@tanstack/router-utils": "1.162.2", "@tanstack/start-client-core": "1.170.13", "@tanstack/start-fn-stubs": "1.162.0", "@tanstack/start-plugin-core": "1.171.19", "@tanstack/start-server-core": "1.169.16", "@tanstack/start-storage-context": "1.167.16", "pathe": "^2.0.3" }, "peerDependencies": { "@rspack/core": ">=2.0.0-0", "@vitejs/plugin-rsc": ">=0.5.20", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0", "react-server-dom-rspack": ">=0.0.2" }, "optionalPeers": ["@rspack/core", "@vitejs/plugin-rsc", "react-server-dom-rspack"] }, "sha512-+FMm3qtT1gWsl0i5sG/Q70mh1k7tzZUsPBaqbg4v34zVJZ+XGn1mJb34x2w7z1M0/e7co6GkZfV8BRpczrs8UA=="], - "@tanstack/react-start-server": ["@tanstack/react-start-server@1.167.19", "", { "dependencies": { "@tanstack/react-router": "1.170.15", "@tanstack/router-core": "1.171.13", "@tanstack/start-server-core": "1.169.14" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-+eMpAwDreQvCwgX45MdUHTUCF/Wad36+PwQafe6W5wa3qVkGyN3P131ShGyRwT/0WwKa5EVGdW1zFgwby8UNqA=="], + "@tanstack/react-start-server": ["@tanstack/react-start-server@1.167.21", "", { "dependencies": { "@tanstack/react-router": "1.170.17", "@tanstack/router-core": "1.171.14", "@tanstack/start-server-core": "1.169.16" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-puJ7eFxaLuDzeM/tiLDJaXCA4uK+PZnEOoIC73zipsFqx865MGzrRS/GSZxeVxjavC5iHU+ZwC+rgI0qYSol1A=="], "@tanstack/react-store": ["@tanstack/react-store@0.9.3", "", { "dependencies": { "@tanstack/store": "0.9.3", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg=="], - "@tanstack/router-cli": ["@tanstack/router-cli@1.167.17", "", { "dependencies": { "@tanstack/router-generator": "1.167.17", "chokidar": "^5.0.0", "yargs": "^17.7.2" }, "bin": { "tsr": "bin/tsr.cjs" } }, "sha512-kws9PNdspkHbeZG6aLDjjpgH/hg7Q565BdSW9hHrjKmXPq/at7OKxQnA76aw9dJiJqy9OmST2RdOKlMEog43+g=="], + "@tanstack/router-cli": ["@tanstack/router-cli@1.167.18", "", { "dependencies": { "@tanstack/router-generator": "1.167.18", "chokidar": "^5.0.0", "yargs": "^17.7.2" }, "bin": { "tsr": "bin/tsr.cjs" } }, "sha512-R3DwK6uZY1x97EC/CsjGY/xCVUXmeZZhlaaFf+EYgJ4gb5ozxZ5mmDh304g+Q9Lw/oWt5azDJXL8TPZiTAwHzQ=="], - "@tanstack/router-core": ["@tanstack/router-core@1.171.13", "", { "dependencies": { "@tanstack/history": "1.162.0", "cookie-es": "^3.0.0", "seroval": "^1.5.4", "seroval-plugins": "^1.5.4" } }, "sha512-+NOwEj1kO/6IGmpHRIZHasYxYWpyBQGNIZAST9aNrk9Q3YlU9SgqVnl1pbLa9qAKfeNdXQIRve0RQb/0kyDeDA=="], + "@tanstack/router-core": ["@tanstack/router-core@1.171.14", "", { "dependencies": { "@tanstack/history": "1.162.0", "cookie-es": "^3.0.0", "seroval": "^1.5.4", "seroval-plugins": "^1.5.4" } }, "sha512-Mo3hwx0qB0cJsVYGDjG0+Ouf7VV74h/vsoDMGztdlyzDanp4gBA2s7IVvm6hFrmQM6GpD9F0Z7SqD7OldfLE7g=="], "@tanstack/router-devtools-core": ["@tanstack/router-devtools-core@1.168.0", "", { "dependencies": { "clsx": "^2.1.1", "goober": "^2.1.16" }, "peerDependencies": { "@tanstack/router-core": "^1.170.0", "csstype": "^3.0.10" }, "optionalPeers": ["csstype"] }, "sha512-wQoQhlBK7nlZgqzaqdYXKWNTpdHdsaREdaPhFZVH0/Ador+F+eM3/NF2i3f2LPeS0GgKraZUQXe1Q/1+KHyEYg=="], - "@tanstack/router-generator": ["@tanstack/router-generator@1.167.17", "", { "dependencies": { "@babel/types": "^7.28.5", "@tanstack/router-core": "1.171.13", "@tanstack/router-utils": "1.162.2", "@tanstack/virtual-file-routes": "1.162.0", "jiti": "^2.7.0", "magic-string": "^0.30.21", "prettier": "^3.5.0", "zod": "^4.4.3" } }, "sha512-xtB9tB2Ws0tWR6Pi7nc3Qk9IYgoh1mQCKWjHqIl9tf6BNUpKoqniJoPAQ4+LGrK8FeZYU0o0p/qlZEyj9FAulA=="], + "@tanstack/router-generator": ["@tanstack/router-generator@1.167.18", "", { "dependencies": { "@babel/types": "^7.28.5", "@tanstack/router-core": "1.171.14", "@tanstack/router-utils": "1.162.2", "@tanstack/virtual-file-routes": "1.162.0", "jiti": "^2.7.0", "magic-string": "^0.30.21", "prettier": "^3.5.0", "zod": "^4.4.3" } }, "sha512-kFvM4caRds9Q3EXg64bZubJ6rbDxyV0YDSBSGvOGzmKspQPdz5Xrh0uj5T1Ov8avUUg+c761u04VQAaEzSBXRw=="], - "@tanstack/router-plugin": ["@tanstack/router-plugin@1.168.18", "", { "dependencies": { "@babel/core": "^7.28.5", "@babel/template": "^7.27.2", "@babel/types": "^7.28.5", "@tanstack/router-core": "1.171.13", "@tanstack/router-generator": "1.167.17", "@tanstack/router-utils": "1.162.2", "chokidar": "^5.0.0", "unplugin": "^3.0.0", "zod": "^4.4.3" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2 || ^2.0.0", "@tanstack/react-router": "^1.170.15", "vite": ">=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0", "vite-plugin-solid": "^2.11.10 || ^3.0.0-0", "webpack": ">=5.92.0" }, "optionalPeers": ["@rsbuild/core", "@tanstack/react-router", "vite", "vite-plugin-solid", "webpack"] }, "sha512-MofS28/axfnfnhOD2RSgJEaU882aX5RsAzhGz5Vc4XhAmvCjy919u9JrNs4QsTWFbTD1P7IJ8WFlFVsrg0pStg=="], + "@tanstack/router-plugin": ["@tanstack/router-plugin@1.168.19", "", { "dependencies": { "@babel/core": "^7.28.5", "@babel/template": "^7.27.2", "@babel/types": "^7.28.5", "@tanstack/router-core": "1.171.14", "@tanstack/router-generator": "1.167.18", "@tanstack/router-utils": "1.162.2", "chokidar": "^5.0.0", "unplugin": "^3.0.0", "zod": "^4.4.3" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2 || ^2.0.0", "@tanstack/react-router": "^1.170.17", "vite": ">=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0", "vite-plugin-solid": "^2.11.10 || ^3.0.0-0", "webpack": ">=5.92.0" }, "optionalPeers": ["@rsbuild/core", "@tanstack/react-router", "vite", "vite-plugin-solid", "webpack"] }, "sha512-aFglwLc+bbPTgZlkXn3PvOwpjJAfgUyPGSuql4MP3XrqTTh6WkBiy2RYb6oaG5h0s7EKwivEuq85K3Y4V0Mt1g=="], "@tanstack/router-ssr-query-core": ["@tanstack/router-ssr-query-core@1.169.1", "", { "peerDependencies": { "@tanstack/query-core": ">=5.90.0", "@tanstack/router-core": ">=1.127.0" } }, "sha512-rngux8s/3mPQzcjLYDLkNU31coYVyCgrVTfpdwqUdY5jIEHqGTXrO73DTkPR1PppwYUeVhmNCgl8TctRcnupjg=="], "@tanstack/router-utils": ["@tanstack/router-utils@1.162.2", "", { "dependencies": { "@babel/generator": "^7.28.5", "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "ansis": "^4.1.0", "babel-dead-code-elimination": "^1.0.12", "diff": "^8.0.2", "pathe": "^2.0.3", "tinyglobby": "^0.2.15" } }, "sha512-hTWqJtqIFFdvuCl8WXNyrodp2L9zo2G37xKRrcVmVRWpAB2h+U1LuRAfS4tsFTiWOIoE/B+WDVFB8JpoEdw6jQ=="], - "@tanstack/start-client-core": ["@tanstack/start-client-core@1.170.12", "", { "dependencies": { "@tanstack/router-core": "1.171.13", "@tanstack/start-fn-stubs": "1.162.0", "@tanstack/start-storage-context": "1.167.15", "seroval": "^1.5.4" } }, "sha512-gwtZRMPUIAxmDV2AIQUhC0kSW262SV7BkHXEgy5B1woHQdrdsELuGOdJwdweLxrjyefORxk+9MYGqDY0Cxn0bw=="], + "@tanstack/start-client-core": ["@tanstack/start-client-core@1.170.13", "", { "dependencies": { "@tanstack/router-core": "1.171.14", "@tanstack/start-fn-stubs": "1.162.0", "@tanstack/start-storage-context": "1.167.16", "seroval": "^1.5.4" } }, "sha512-o37M3msIK5ec87kPrIYJWXb1XPnjIe5/jrkGLXiXpFuVL99z7mhoBCzftKtVPtzqI8EElnRE/VGFYT9BHNnWcw=="], "@tanstack/start-fn-stubs": ["@tanstack/start-fn-stubs@1.162.0", "", {}, "sha512-QWfUZ3Yo923tdQn38LyKMU8rcTw69zc+T4dAvgTWV4O56SqFRsGfS0lSWIMhJRwXIx/bvdi7nTUBDdZtTHtpTQ=="], - "@tanstack/start-plugin-core": ["@tanstack/start-plugin-core@1.171.17", "", { "dependencies": { "@babel/code-frame": "7.27.1", "@babel/core": "^7.28.5", "@babel/types": "^7.28.5", "@tanstack/router-core": "1.171.13", "@tanstack/router-generator": "1.167.17", "@tanstack/router-plugin": "1.168.18", "@tanstack/router-utils": "1.162.2", "@tanstack/start-server-core": "1.169.14", "exsolve": "^1.0.7", "lightningcss": "^1.32.0", "pathe": "^2.0.3", "picomatch": "^4.0.3", "seroval": "^1.5.4", "source-map": "^0.7.6", "srvx": "^0.11.9", "tinyglobby": "^0.2.15", "ufo": "^1.5.4", "vitefu": "^1.1.1", "xmlbuilder2": "^4.0.3", "zod": "^4.4.3" }, "peerDependencies": { "@rsbuild/core": "^2.0.0", "vite": ">=7.0.0" }, "optionalPeers": ["@rsbuild/core", "vite"] }, "sha512-ngKkp3wn/U3nyeqZl7KcMzjbgTbcypC5ES7O92JpA5/tz4PufFOf5l+eX3pY+4Z6jE6Jb6ekQgnryG7XMjpK7Q=="], + "@tanstack/start-plugin-core": ["@tanstack/start-plugin-core@1.171.19", "", { "dependencies": { "@babel/code-frame": "7.27.1", "@babel/core": "^7.28.5", "@babel/types": "^7.28.5", "@tanstack/router-core": "1.171.14", "@tanstack/router-generator": "1.167.18", "@tanstack/router-plugin": "1.168.19", "@tanstack/router-utils": "1.162.2", "@tanstack/start-server-core": "1.169.16", "exsolve": "^1.0.7", "lightningcss": "^1.32.0", "pathe": "^2.0.3", "picomatch": "^4.0.3", "seroval": "^1.5.4", "source-map": "^0.7.6", "srvx": "^0.11.9", "tinyglobby": "^0.2.15", "ufo": "^1.5.4", "vitefu": "^1.1.1", "xmlbuilder2": "^4.0.3", "zod": "^4.4.3" }, "peerDependencies": { "@rsbuild/core": "^2.0.0", "vite": ">=7.0.0" }, "optionalPeers": ["@rsbuild/core", "vite"] }, "sha512-+fpW3Z/2vPT8HDV1c5p2WC6/g2k/AV/ujdJVDcn/VFd+gXRtzSX1D/LfozlaDbhDoEsqOnAk/mGwjg60JkUA2Q=="], - "@tanstack/start-server-core": ["@tanstack/start-server-core@1.169.14", "", { "dependencies": { "@tanstack/history": "1.162.0", "@tanstack/router-core": "1.171.13", "@tanstack/start-client-core": "1.170.12", "@tanstack/start-storage-context": "1.167.15", "fetchdts": "^0.1.6", "h3-v2": "npm:h3@2.0.1-rc.20", "seroval": "^1.5.4" } }, "sha512-cSCTNbKARrkddPOfavF/soRFDxH+b+v3m4TeW6AvEy419R3E0ZsoZAm5UI6uNR1y4UU9WTOmaxLQ4nzIZPKmXg=="], + "@tanstack/start-server-core": ["@tanstack/start-server-core@1.169.16", "", { "dependencies": { "@tanstack/history": "1.162.0", "@tanstack/router-core": "1.171.14", "@tanstack/start-client-core": "1.170.13", "@tanstack/start-storage-context": "1.167.16", "fetchdts": "^0.1.6", "h3-v2": "npm:h3@2.0.1-rc.20", "seroval": "^1.5.4" } }, "sha512-lvAjQpH3nHJtd4xy0iHIaWbsTbyN9EBxuYCxbtXH0EpeBQPg+TCPhu9GQC9WbbA1rE//s82CpE55oYDQMqkU5A=="], - "@tanstack/start-storage-context": ["@tanstack/start-storage-context@1.167.15", "", { "dependencies": { "@tanstack/router-core": "1.171.13" } }, "sha512-Jy0q4vdG6pv76N92+X+ag3fuOV2zINQagYyMN1/es7tPI1vzpKECIU8AqHqzI6ahkwaph7XDvmfUkiLJ3i4LOA=="], + "@tanstack/start-storage-context": ["@tanstack/start-storage-context@1.167.16", "", { "dependencies": { "@tanstack/router-core": "1.171.14" } }, "sha512-zTegxlij4BC1DbCrC6rsVlMOQVMzOuG5IllacZEkrUdhiFwMIMYpk0VWGH+d0ucx5RBkmv8e8GNX3AOVBWclfg=="], "@tanstack/store": ["@tanstack/store@0.9.3", "", {}, "sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw=="], @@ -820,7 +865,7 @@ "@testing-library/user-event": ["@testing-library/user-event@14.6.1", "", { "peerDependencies": { "@testing-library/dom": ">=7.21.4" } }, "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw=="], - "@tybys/wasm-util": ["@tybys/wasm-util@0.10.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg=="], + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg=="], "@types/aria-query": ["@types/aria-query@5.0.4", "", {}, "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw=="], @@ -864,7 +909,7 @@ "@typescript/native-preview-win32-x64": ["@typescript/native-preview-win32-x64@7.0.0-dev.20260509.2", "", { "os": "win32", "cpu": "x64" }, "sha512-kZV0Vh64hp10saOghPlFZE1qahonqvRgU3iubt8pUY4XLe8IQIofwWCN5vzNNeULE4W4mRtAJbHuvP/muOFomw=="], - "@vitejs/plugin-react": ["@vitejs/plugin-react@6.0.2", "", { "dependencies": { "@rolldown/pluginutils": "^1.0.0" }, "peerDependencies": { "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", "babel-plugin-react-compiler": "^1.0.0", "vite": "^8.0.0" }, "optionalPeers": ["@rolldown/plugin-babel", "babel-plugin-react-compiler"] }, "sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg=="], + "@vitejs/plugin-react": ["@vitejs/plugin-react@6.0.3", "", { "dependencies": { "@rolldown/pluginutils": "^1.0.1" }, "peerDependencies": { "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", "babel-plugin-react-compiler": "^1.0.0", "vite": "^8.0.0" }, "optionalPeers": ["@rolldown/plugin-babel", "babel-plugin-react-compiler"] }, "sha512-vmFvco5/QuC2f9Oj+wTk0+9XeDFkHxSamwZKYc7MxYwKICfvUvlMhqKI0VuICPltGqh1neqBKDvO4kes1ya8vg=="], "@vitest/browser": ["@vitest/browser@4.1.9", "", { "dependencies": { "@blazediff/core": "1.9.1", "@vitest/mocker": "4.1.9", "@vitest/utils": "4.1.9", "magic-string": "^0.30.21", "pngjs": "^7.0.0", "sirv": "^3.0.2", "tinyrainbow": "^3.1.0", "ws": "^8.19.0" }, "peerDependencies": { "vitest": "4.1.9" } }, "sha512-j1BKtWmPcqpMhmx/L9EPLgAJpCb0zKfwoWLmqBbxaogCXHjOwHFSEoHCBfnGtx93xKQwilZ26m+UOsHqHMkRNg=="], @@ -954,7 +999,7 @@ "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "ansis": ["ansis@4.3.1", "", {}, "sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA=="], @@ -974,7 +1019,7 @@ "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - "baseline-browser-mapping": ["baseline-browser-mapping@2.10.37", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-girxaJ7WZssDOFhzCGZTDKoTa1gk6A1TbflaYTpykLJ4UU9Fz9kx1aREM8JCuoVHbL8X8T/mJg7w2oYSq72Oig=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.10.42", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-c/jurFrDLyui7o1J86yLkRu4LMsTYcBohveus7/I2Hzdn9KIP2bdJPTue/lR1KH46enoPbD77GKeSYNdyPoD3Q=="], "better-path-resolve": ["better-path-resolve@1.0.0", "", { "dependencies": { "is-windows": "^1.0.0" } }, "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g=="], @@ -986,7 +1031,7 @@ "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], - "browserslist": ["browserslist@4.28.2", "", { "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", "electron-to-chromium": "^1.5.328", "node-releases": "^2.0.36", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg=="], + "browserslist": ["browserslist@4.28.4", "", { "dependencies": { "baseline-browser-mapping": "^2.10.38", "caniuse-lite": "^1.0.30001799", "electron-to-chromium": "^1.5.376", "node-releases": "^2.0.48", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw=="], "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], @@ -996,13 +1041,13 @@ "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001799", "", {}, "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw=="], + "caniuse-lite": ["caniuse-lite@1.0.30001800", "", {}, "sha512-MMHtuAz9Ys840zAY5F4k6fV5GaivZ9sPk+nz0mY+GYVzRBnYkN0mpqkSR92oWRQ19yQWo4HvBV/FnC16AJX8MA=="], "chai": ["chai@6.2.2", "", {}, "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg=="], - "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], - "chardet": ["chardet@2.1.1", "", {}, "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ=="], + "chardet": ["chardet@2.2.0", "", {}, "sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA=="], "chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], @@ -1074,7 +1119,7 @@ "effect": ["effect@4.0.0-beta.78", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "fast-check": "^4.8.0", "find-my-way-ts": "^0.1.6", "ini": "^7.0.0", "kubernetes-types": "^1.30.0", "msgpackr": "^2.0.1", "multipasta": "^0.2.7", "toml": "^4.1.1", "uuid": "^14.0.0", "yaml": "^2.9.0" } }, "sha512-j79Rl9QpHwMz/ZJWLNpZoiVj9N7zHqiLKN5EcYd/A8J1oqejILWQLfc4HPlvqHqKC8SK55LJ+X4gy4ONJ+JpfQ=="], - "electron-to-chromium": ["electron-to-chromium@1.5.372", "", {}, "sha512-M3yhbAlilnwqC8D21t28UCDGHyitShTmmLRU/H+b74P6Ski16Nb9HONYEaVpMj/pwC7BEo5B95FpjODLCWbtfA=="], + "electron-to-chromium": ["electron-to-chromium@1.5.387", "", {}, "sha512-TaxwufTFDufvPEoXdhwVrA3UdFWBeWGkYoJ1K8ldF1xe6gKfth6iRNS5lTQ5JPNOHdGQm8PT1QYKUqFLCiUefQ=="], "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], @@ -1088,9 +1133,9 @@ "error-stack-parser-es": ["error-stack-parser-es@1.0.5", "", {}, "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA=="], - "es-module-lexer": ["es-module-lexer@2.1.0", "", {}, "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ=="], + "es-module-lexer": ["es-module-lexer@2.3.0", "", {}, "sha512-KLdwQm2NvGLDkQDCGvmiQrhkd0JbMzXthwQAUgWjQuQdBLFa3eiBP5arXZyA+f8x+x7OXgud6bq2rxjGtHV2tw=="], - "esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="], + "esbuild": ["esbuild@0.28.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.1", "@esbuild/android-arm": "0.28.1", "@esbuild/android-arm64": "0.28.1", "@esbuild/android-x64": "0.28.1", "@esbuild/darwin-arm64": "0.28.1", "@esbuild/darwin-x64": "0.28.1", "@esbuild/freebsd-arm64": "0.28.1", "@esbuild/freebsd-x64": "0.28.1", "@esbuild/linux-arm": "0.28.1", "@esbuild/linux-arm64": "0.28.1", "@esbuild/linux-ia32": "0.28.1", "@esbuild/linux-loong64": "0.28.1", "@esbuild/linux-mips64el": "0.28.1", "@esbuild/linux-ppc64": "0.28.1", "@esbuild/linux-riscv64": "0.28.1", "@esbuild/linux-s390x": "0.28.1", "@esbuild/linux-x64": "0.28.1", "@esbuild/netbsd-arm64": "0.28.1", "@esbuild/netbsd-x64": "0.28.1", "@esbuild/openbsd-arm64": "0.28.1", "@esbuild/openbsd-x64": "0.28.1", "@esbuild/openharmony-arm64": "0.28.1", "@esbuild/sunos-x64": "0.28.1", "@esbuild/win32-arm64": "0.28.1", "@esbuild/win32-ia32": "0.28.1", "@esbuild/win32-x64": "0.28.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], @@ -1122,7 +1167,7 @@ "expect-type": ["expect-type@1.4.0", "", {}, "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA=="], - "exsolve": ["exsolve@1.0.8", "", {}, "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA=="], + "exsolve": ["exsolve@1.1.0", "", {}, "sha512-D+42+T12DdIlJM3uepa55qGiL3sYdLBOxIl2ifQCzCHz4c7eiolaHsi3BIqEr7JxBzxv2pYZQX9kw16ziMcEmw=="], "extendable-error": ["extendable-error@0.1.7", "", {}, "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg=="], @@ -1136,7 +1181,7 @@ "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], - "fast-uri": ["fast-uri@3.1.2", "", {}, "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ=="], + "fast-uri": ["fast-uri@3.1.3", "", {}, "sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg=="], "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], @@ -1196,7 +1241,7 @@ "human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], - "iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="], + "iconv-lite": ["iconv-lite@0.7.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ=="], "icss-utils": ["icss-utils@5.1.0", "", { "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA=="], @@ -1228,7 +1273,7 @@ "is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], - "isbot": ["isbot@5.1.42", "", {}, "sha512-/SXsVh7KpPRISrD4ffrGSxnTLlUBzEQUfWIusaJPrpJ93FW1P0YEZri5vAUkFsA0m2HRUhQRQadk2wJ+EeKowQ=="], + "isbot": ["isbot@5.1.44", "", {}, "sha512-PGEHtwMnKbZpeSEXW2Utx+/JWed7dp6DiH0WWg33vGSDA7RUvpUeJSVlLrVkQ1RCpvDOUc/eH9ql7VsdbBZ8pA=="], "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], @@ -1238,7 +1283,7 @@ "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], - "js-yaml": ["js-yaml@4.2.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw=="], + "js-yaml": ["js-yaml@4.3.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q=="], "jsdom": ["jsdom@28.1.0", "", { "dependencies": { "@acemir/cssom": "^0.9.31", "@asamuzakjp/dom-selector": "^6.8.1", "@bramus/specificity": "^2.4.2", "@exodus/bytes": "^1.11.0", "cssstyle": "^6.0.1", "data-urls": "^7.0.0", "decimal.js": "^10.6.0", "html-encoding-sniffer": "^6.0.0", "http-proxy-agent": "^7.0.2", "https-proxy-agent": "^7.0.6", "is-potential-custom-element-name": "^1.0.1", "parse5": "^8.0.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", "tough-cookie": "^6.0.0", "undici": "^7.21.0", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^8.0.1", "whatwg-mimetype": "^5.0.0", "whatwg-url": "^16.0.0", "xml-name-validator": "^5.0.0" }, "peerDependencies": { "canvas": "^3.0.0" }, "optionalPeers": ["canvas"] }, "sha512-0+MoQNYyr2rBHqO1xilltfDjV9G7ymYGlAUazgcDLQaUf8JDHbuGwsxN6U9qWaElZ4w1B2r7yEGIL3GdeW3Rug=="], @@ -1328,7 +1373,7 @@ "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], - "miniflare": ["miniflare@4.20260611.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "sharp": "0.34.5", "undici": "7.24.8", "workerd": "1.20260611.1", "ws": "8.20.1", "youch": "4.1.0-beta.10" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-i+JwEo8vN96naz1WL3ntFgFyRluBDYL408zwhHKvR2jefJ464KsZ/gCmJAQ5k+oaWeb5Ug+s7yne5AyiAEswjg=="], + "miniflare": ["miniflare@4.20260701.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "sharp": "0.34.5", "undici": "7.28.0", "workerd": "1.20260701.1", "ws": "8.21.0", "youch": "4.1.0-beta.10" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-L6eAAi6IKtyb/7J6L+YsH2vb1yBrJWKRXI293JYDiMl70+6nncdAgigex58w6WBd+CwvdMsqOyNyGs95Op5gWQ=="], "minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], @@ -1346,7 +1391,7 @@ "multipasta": ["multipasta@0.2.7", "", {}, "sha512-KPA58d68KgGil15oDqXjkUBEBYc00XvbPj5/X+dyzeo/lWm9Nc25pQRlf1D+gv4OpK7NM0J1odrbu9JNNGvynA=="], - "nanoid": ["nanoid@3.3.12", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ=="], + "nanoid": ["nanoid@3.3.15", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA=="], "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], @@ -1354,7 +1399,7 @@ "node-gyp-build-optional-packages": ["node-gyp-build-optional-packages@5.2.2", "", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-optional": "optional.js", "node-gyp-build-optional-packages-test": "build-test.js" } }, "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw=="], - "node-releases": ["node-releases@2.0.47", "", {}, "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og=="], + "node-releases": ["node-releases@2.0.50", "", {}, "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg=="], "npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="], @@ -1368,7 +1413,7 @@ "outdent": ["outdent@0.5.0", "", {}, "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q=="], - "oxc-parser": ["oxc-parser@0.120.0", "", { "dependencies": { "@oxc-project/types": "^0.120.0" }, "optionalDependencies": { "@oxc-parser/binding-android-arm-eabi": "0.120.0", "@oxc-parser/binding-android-arm64": "0.120.0", "@oxc-parser/binding-darwin-arm64": "0.120.0", "@oxc-parser/binding-darwin-x64": "0.120.0", "@oxc-parser/binding-freebsd-x64": "0.120.0", "@oxc-parser/binding-linux-arm-gnueabihf": "0.120.0", "@oxc-parser/binding-linux-arm-musleabihf": "0.120.0", "@oxc-parser/binding-linux-arm64-gnu": "0.120.0", "@oxc-parser/binding-linux-arm64-musl": "0.120.0", "@oxc-parser/binding-linux-ppc64-gnu": "0.120.0", "@oxc-parser/binding-linux-riscv64-gnu": "0.120.0", "@oxc-parser/binding-linux-riscv64-musl": "0.120.0", "@oxc-parser/binding-linux-s390x-gnu": "0.120.0", "@oxc-parser/binding-linux-x64-gnu": "0.120.0", "@oxc-parser/binding-linux-x64-musl": "0.120.0", "@oxc-parser/binding-openharmony-arm64": "0.120.0", "@oxc-parser/binding-wasm32-wasi": "0.120.0", "@oxc-parser/binding-win32-arm64-msvc": "0.120.0", "@oxc-parser/binding-win32-ia32-msvc": "0.120.0", "@oxc-parser/binding-win32-x64-msvc": "0.120.0" } }, "sha512-WyPWZlcIm+Fkte63FGfgFB8mAAk33aH9h5N9lphXVOHSXEBFFsmYdOBedVKly363aWABjZdaj/m9lBfEY4wt+w=="], + "oxc-parser": ["oxc-parser@0.137.0", "", { "dependencies": { "@oxc-project/types": "^0.137.0" }, "optionalDependencies": { "@oxc-parser/binding-android-arm-eabi": "0.137.0", "@oxc-parser/binding-android-arm64": "0.137.0", "@oxc-parser/binding-darwin-arm64": "0.137.0", "@oxc-parser/binding-darwin-x64": "0.137.0", "@oxc-parser/binding-freebsd-x64": "0.137.0", "@oxc-parser/binding-linux-arm-gnueabihf": "0.137.0", "@oxc-parser/binding-linux-arm-musleabihf": "0.137.0", "@oxc-parser/binding-linux-arm64-gnu": "0.137.0", "@oxc-parser/binding-linux-arm64-musl": "0.137.0", "@oxc-parser/binding-linux-ppc64-gnu": "0.137.0", "@oxc-parser/binding-linux-riscv64-gnu": "0.137.0", "@oxc-parser/binding-linux-riscv64-musl": "0.137.0", "@oxc-parser/binding-linux-s390x-gnu": "0.137.0", "@oxc-parser/binding-linux-x64-gnu": "0.137.0", "@oxc-parser/binding-linux-x64-musl": "0.137.0", "@oxc-parser/binding-openharmony-arm64": "0.137.0", "@oxc-parser/binding-wasm32-wasi": "0.137.0", "@oxc-parser/binding-win32-arm64-msvc": "0.137.0", "@oxc-parser/binding-win32-ia32-msvc": "0.137.0", "@oxc-parser/binding-win32-x64-msvc": "0.137.0" } }, "sha512-yFImD+WLElJpLKy8llG1qe4DCmMsL18peRp8XP1JKfig/gISbJkglnpDtX2aTmAn10kZF7164HbN2H8QPsXxGg=="], "oxfmt": ["oxfmt@0.57.0", "", { "dependencies": { "tinypool": "2.1.0" }, "optionalDependencies": { "@oxfmt/binding-android-arm-eabi": "0.57.0", "@oxfmt/binding-android-arm64": "0.57.0", "@oxfmt/binding-darwin-arm64": "0.57.0", "@oxfmt/binding-darwin-x64": "0.57.0", "@oxfmt/binding-freebsd-x64": "0.57.0", "@oxfmt/binding-linux-arm-gnueabihf": "0.57.0", "@oxfmt/binding-linux-arm-musleabihf": "0.57.0", "@oxfmt/binding-linux-arm64-gnu": "0.57.0", "@oxfmt/binding-linux-arm64-musl": "0.57.0", "@oxfmt/binding-linux-ppc64-gnu": "0.57.0", "@oxfmt/binding-linux-riscv64-gnu": "0.57.0", "@oxfmt/binding-linux-riscv64-musl": "0.57.0", "@oxfmt/binding-linux-s390x-gnu": "0.57.0", "@oxfmt/binding-linux-x64-gnu": "0.57.0", "@oxfmt/binding-linux-x64-musl": "0.57.0", "@oxfmt/binding-openharmony-arm64": "0.57.0", "@oxfmt/binding-win32-arm64-msvc": "0.57.0", "@oxfmt/binding-win32-ia32-msvc": "0.57.0", "@oxfmt/binding-win32-x64-msvc": "0.57.0" }, "peerDependencies": { "svelte": "^5.0.0", "vite-plus": "*" }, "optionalPeers": ["svelte", "vite-plus"], "bin": { "oxfmt": "bin/oxfmt" } }, "sha512-ZB7Bi+rGDSqmVIo9jwcLyFgjxXvQhDdU+jx+ZrVy6VRiVXK2+CHc4hO3J4dUQjHe7V0ymHB+MDuv5z+NhK07HA=="], @@ -1404,13 +1449,13 @@ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], + "picomatch": ["picomatch@4.0.5", "", {}, "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A=="], "pify": ["pify@4.0.1", "", {}, "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="], "pngjs": ["pngjs@7.0.0", "", {}, "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow=="], - "postcss": ["postcss@8.5.15", "", { "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A=="], + "postcss": ["postcss@8.5.16", "", { "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg=="], "postcss-modules-extract-imports": ["postcss-modules-extract-imports@3.1.0", "", { "peerDependencies": { "postcss": "^8.1.0" } }, "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q=="], @@ -1424,7 +1469,7 @@ "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], - "postprocessing": ["postprocessing@6.39.1", "", { "peerDependencies": { "three": ">= 0.168.0 < 0.185.0" } }, "sha512-R2dG2zy+BAx3USl5EHw+PvnrlbT5PKnZVp3se0HCR0pWH8WQdh742yNG4YWOsq6c0bFpffk0Gd2RqPeoP/wKng=="], + "postprocessing": ["postprocessing@6.39.2", "", { "peerDependencies": { "three": ">= 0.168.0 < 0.186.0" } }, "sha512-AxPY+xFyVOsz+8bbHSyQBoOK4AUqSQspTXXIsNcKhmGJRm/afHRAwZ8bKC02AeSPII0PW6lbCN84SgAoWFsKKA=="], "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], @@ -1436,7 +1481,7 @@ "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], - "pure-rand": ["pure-rand@8.4.0", "", {}, "sha512-IoM8YF/jY0hiugFo/wOWqfmarlE6J0wc6fDK1PhftMk7MGhVZl88sZimmqBBFomLOCSmcCCpsfj7wXASCpvK9A=="], + "pure-rand": ["pure-rand@8.4.1", "", {}, "sha512-c58R2+SPFcSIPXoU834QN/KPDDOSd8sXcSrqf6e83Me6Rrp1EYkxukkjXMVrKvKaADs1SOyNkWdfvLf6zY8qLQ=="], "quansync": ["quansync@0.2.11", "", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="], @@ -1478,7 +1523,7 @@ "schema-utils": ["schema-utils@4.3.3", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA=="], - "semver": ["semver@7.8.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA=="], + "semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], "seroval": ["seroval@1.5.4", "", {}, "sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw=="], @@ -1490,7 +1535,7 @@ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], - "shell-quote": ["shell-quote@1.8.4", "", {}, "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ=="], + "shell-quote": ["shell-quote@1.9.0", "", {}, "sha512-Iov+JwFv/2HcTpcwNMKd8+IWNb8tboQJNQTkAY/LLVK7gGH9jy+LGkVqPxfekHl+yMmiqXszdGWXgkfml7hjqA=="], "sideffect": ["sideffect@workspace:packages/sideffect"], @@ -1504,7 +1549,7 @@ "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], - "solid-js": ["solid-js@1.9.13", "", { "dependencies": { "csstype": "^3.1.0", "seroval": "~1.5.0", "seroval-plugins": "~1.5.0" } }, "sha512-6hJeJMOcEX8ktqjpDoJZEmld3ijvcvWBDtiXBm7f4332SiFN66QeAQI1REQshvyUoISsSeJ4PHDauKYbwao9JQ=="], + "solid-js": ["solid-js@1.9.14", "", { "dependencies": { "csstype": "^3.1.0", "seroval": "~1.5.4", "seroval-plugins": "~1.5.4" } }, "sha512-sAEXC0Kk0S1EDg+8ysEWJDbYhA3RRoEjwuySUGlKIemeo0I5YZfOyumNjNs9Sv3y2nmhD+0rW66ag2HsMuQiGQ=="], "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], @@ -1516,7 +1561,7 @@ "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], - "srvx": ["srvx@0.11.16", "", { "bin": { "srvx": "bin/srvx.mjs" } }, "sha512-bp07zRuycfTY43IjAvvTFnmnJi8ikW0VFiHwOhhYcVW/L4xQ1XY4PAd4Nuum1rsA17C39zL7x+CDhrn5AL32Rw=="], + "srvx": ["srvx@0.11.21", "", { "bin": { "srvx": "bin/srvx.mjs" } }, "sha512-GWTHjKMeekX8CwJf4VU9Oo6mJpSGaflGMddbCvR+Cmmh9sslRMiGbAoqqZacE0r1ncARh6buCEETr2W52F8b1w=="], "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], @@ -1540,7 +1585,7 @@ "symbol-tree": ["symbol-tree@3.2.4", "", {}, "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="], - "tailwindcss": ["tailwindcss@4.3.1", "", {}, "sha512-hk+TB1m+K8CYNrP6rjQaq/Y+4Zylwpa87mLYBKCunwnnQ9p+fHb7kmSfGqyEJoxF/O6CDyABWVFEafNSYKll+Q=="], + "tailwindcss": ["tailwindcss@4.3.2", "", {}, "sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA=="], "tapable": ["tapable@2.3.3", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="], @@ -1550,7 +1595,7 @@ "terser-webpack-plugin": ["terser-webpack-plugin@5.6.1", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", "terser": "^5.31.1" }, "peerDependencies": { "@minify-html/node": "*", "@swc/core": "*", "@swc/css": "*", "@swc/html": "*", "clean-css": "*", "cssnano": "*", "csso": "*", "esbuild": "*", "html-minifier-terser": "*", "lightningcss": "*", "postcss": "*", "uglify-js": "*", "webpack": "^5.1.0" }, "optionalPeers": ["@minify-html/node", "@swc/core", "@swc/css", "@swc/html", "clean-css", "cssnano", "csso", "esbuild", "html-minifier-terser", "lightningcss", "postcss", "uglify-js"] }, "sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ=="], - "three": ["three@0.184.0", "", {}, "sha512-wtTRjG92pM5eUg/KuUnHsqSAlPM296brTOcLgMRqEeylYTh/CdtvKUvCyyCQTzFuStieWxvZb8mVTMvdPyUpxg=="], + "three": ["three@0.185.1", "", {}, "sha512-5aojFCXKwnjBRZvUnt3WFfEcvUJgkN5LlijRFN95hMy8WVkG4I0QNcJE+OuWvuJ0bOdStrbfXn0pkd6/QyiAlg=="], "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], @@ -1564,15 +1609,15 @@ "tinyrainbow": ["tinyrainbow@3.1.0", "", {}, "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw=="], - "tldts": ["tldts@7.4.2", "", { "dependencies": { "tldts-core": "^7.4.2" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-kCwffuaH8ntKtygnWe1b4BJKWiCUH30n5KfoTr6IchcXOwR7chAOFJxFrH3vjANafUYrIA4a7SDL+nn7SiR4Sw=="], + "tldts": ["tldts@7.4.6", "", { "dependencies": { "tldts-core": "^7.4.6" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-rbP0Gyx8b3Ae9yO//CU2wbSnQNoQ66m1nJdSbSHmnwKwzkkz/u8mERYU8T2rmlmy+bJvRNn84yNCW8gYqox44Q=="], - "tldts-core": ["tldts-core@7.4.2", "", {}, "sha512-nwEyF4vl4RSJjwSjBUmOSxc3BFPoIFdlRthJ6e+5v9P3bHNsoD06UjuqMUspqp7vsEZ1beaHi1km+optiE17yA=="], + "tldts-core": ["tldts-core@7.4.6", "", {}, "sha512-TkQNGJIhlEphpHCjKodMTSe23egUZr/g+flI2qkLgiJ/maAzSgXypSLRTNH3nCmqgayEmtcJBiLcfODSAr1xoA=="], "to-fast-properties": ["to-fast-properties@2.0.0", "", {}, "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog=="], "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], - "toml": ["toml@4.1.1", "", {}, "sha512-EBJnVBr3dTXdA89WVFoAIPUqkBjxPMwRqsfuo1r240tKFHXv3zgca4+NJib/h6TyvGF7vOawz0jGuryJCdNHrw=="], + "toml": ["toml@4.1.2", "", {}, "sha512-m0vXfHODcw3gk+KONAOlVQ5yNHc3yS3B1ybM3HS1vqDoS0RWTDDVBVVTYi8hH0k+2OM1vmo9fb1WX9EVqjqfHA=="], "totalist": ["totalist@3.0.1", "", {}, "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ=="], @@ -1586,13 +1631,15 @@ "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], + "typescript-ast-bench": ["typescript-ast-bench@workspace:workbench/typescript-ast-bench"], + "ufo": ["ufo@1.6.4", "", {}, "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA=="], "unconfig": ["unconfig@7.5.0", "", { "dependencies": { "@quansync/fs": "^1.0.0", "defu": "^6.1.4", "jiti": "^2.6.1", "quansync": "^1.0.0", "unconfig-core": "7.5.0" } }, "sha512-oi8Qy2JV4D3UQ0PsopR28CzdQ3S/5A1zwsUwp/rosSbfhJ5z7b90bIyTwi/F7hCLD4SGcZVjDzd4XoUQcEanvA=="], "unconfig-core": ["unconfig-core@7.5.0", "", { "dependencies": { "@quansync/fs": "^1.0.0", "quansync": "^1.0.0" } }, "sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w=="], - "undici": ["undici@7.27.2", "", {}, "sha512-uZsKNuzQxDMUY6M3pIMvy5tvlGmtq8XJ2oLAkfRKGNu+1VQAIvLy2xIVG5ATZl5wDXl/tddByAWCizRbOme+TA=="], + "undici": ["undici@7.28.0", "", {}, "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA=="], "undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], @@ -1600,7 +1647,7 @@ "universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], - "unplugin": ["unplugin@3.0.0", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg=="], + "unplugin": ["unplugin@3.3.0", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "picomatch": "^4.0.4", "webpack-virtual-modules": "^0.6.2" }, "peerDependencies": { "@farmfe/core": "*", "@rspack/core": "*", "bun-types-no-globals": "*", "esbuild": "*", "rolldown": "*", "rollup": "*", "unloader": "*", "vite": "*", "webpack": "*" }, "optionalPeers": ["@farmfe/core", "@rspack/core", "bun-types-no-globals", "esbuild", "rolldown", "rollup", "unloader", "vite", "webpack"] }, "sha512-qa66K+crbfyE6JK10GjvbJeRrOsuC/JpbnHctfyp/i4oBTxWOzJfRZyDiOk1PtErMFRu8JhsU/wPvOdBNWe5Rg=="], "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], @@ -1610,13 +1657,13 @@ "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], - "uuid": ["uuid@14.0.0", "", { "bin": { "uuid": "dist-node/bin/uuid" } }, "sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg=="], + "uuid": ["uuid@14.0.1", "", { "bin": { "uuid": "dist-node/bin/uuid" } }, "sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew=="], "video": ["video@workspace:packages/video"], "vite": ["@voidzero-dev/vite-plus-core@0.2.2", "", { "dependencies": { "@oxc-project/runtime": "=0.138.0", "@oxc-project/types": "=0.138.0", "lightningcss": "^1.32.0", "postcss": "^8.5.6" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@arethetypeswrong/core": "^0.18.1", "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.3.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "publint": "^0.3.8", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "typescript": "^5.0.0 || ^6.0.0", "unplugin-unused": "^0.5.0", "unrun": "*", "yaml": "^2.4.2" }, "optionalPeers": ["@arethetypeswrong/core", "@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "publint", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "typescript", "unplugin-unused", "unrun", "yaml"] }, "sha512-yAbKexF3npOGjg1N5EtXxun+7vdM/0x6QE5jucO/dv0LFhCAIzSN3UvLVCeamJt/Bz3jt7DLqQHEgXXrjy8drA=="], - "vite-plus": ["vite-plus@0.2.2", "", { "dependencies": { "@oxc-project/types": "=0.138.0", "@oxlint/plugins": "=1.68.0", "@vitest/browser": "4.1.9", "@vitest/browser-preview": "4.1.9", "@vitest/expect": "4.1.9", "@vitest/mocker": "4.1.9", "@vitest/pretty-format": "4.1.9", "@vitest/runner": "4.1.9", "@vitest/snapshot": "4.1.9", "@vitest/spy": "4.1.9", "@vitest/utils": "4.1.9", "@voidzero-dev/vite-plus-core": "0.2.2", "oxfmt": "=0.57.0", "oxlint": "=1.72.0", "oxlint-tsgolint": "=0.24.0", "vitest": "4.1.9" }, "optionalDependencies": { "@voidzero-dev/vite-plus-darwin-arm64": "0.2.2", "@voidzero-dev/vite-plus-darwin-x64": "0.2.2", "@voidzero-dev/vite-plus-linux-arm64-gnu": "0.2.2", "@voidzero-dev/vite-plus-linux-arm64-musl": "0.2.2", "@voidzero-dev/vite-plus-linux-x64-gnu": "0.2.2", "@voidzero-dev/vite-plus-linux-x64-musl": "0.2.2", "@voidzero-dev/vite-plus-win32-arm64-msvc": "0.2.2", "@voidzero-dev/vite-plus-win32-x64-msvc": "0.2.2" }, "peerDependencies": { "@vitest/browser-playwright": "4.1.9", "@vitest/browser-webdriverio": "4.1.9" }, "optionalPeers": ["@vitest/browser-playwright", "@vitest/browser-webdriverio"], "bin": { "oxfmt": "bin/oxfmt", "oxlint": "bin/oxlint", "vp": "bin/vp", "vpr": "bin/vpr" } }, "sha512-bXO3O0F2/uxtvX9Ck0o67stTErH/Zh0GEcCMd9pAh22tTHABCNTDPrRMWVo733e7Ux3h0Y7HanJ7neOV/nid4g=="], + "vite-plus": ["vite-plus@0.2.2", "", { "dependencies": { "@oxc-project/types": "=0.138.0", "@oxlint/plugins": "=1.68.0", "@vitest/browser": "4.1.9", "@vitest/browser-preview": "4.1.9", "@vitest/expect": "4.1.9", "@vitest/mocker": "4.1.9", "@vitest/pretty-format": "4.1.9", "@vitest/runner": "4.1.9", "@vitest/snapshot": "4.1.9", "@vitest/spy": "4.1.9", "@vitest/utils": "4.1.9", "@voidzero-dev/vite-plus-core": "0.2.2", "oxfmt": "=0.57.0", "oxlint": "=1.72.0", "oxlint-tsgolint": "=0.24.0", "vitest": "4.1.9" }, "optionalDependencies": { "@voidzero-dev/vite-plus-darwin-arm64": "0.2.2", "@voidzero-dev/vite-plus-darwin-x64": "0.2.2", "@voidzero-dev/vite-plus-linux-arm64-gnu": "0.2.2", "@voidzero-dev/vite-plus-linux-arm64-musl": "0.2.2", "@voidzero-dev/vite-plus-linux-x64-gnu": "0.2.2", "@voidzero-dev/vite-plus-linux-x64-musl": "0.2.2", "@voidzero-dev/vite-plus-win32-arm64-msvc": "0.2.2", "@voidzero-dev/vite-plus-win32-x64-msvc": "0.2.2" }, "peerDependencies": { "@vitest/browser-playwright": "4.1.9", "@vitest/browser-webdriverio": "4.1.9" }, "optionalPeers": ["@vitest/browser-playwright", "@vitest/browser-webdriverio"], "bin": { "vp": "bin/vp", "vpr": "bin/vpr", "oxfmt": "bin/oxfmt", "oxlint": "bin/oxlint" } }, "sha512-bXO3O0F2/uxtvX9Ck0o67stTErH/Zh0GEcCMd9pAh22tTHABCNTDPrRMWVo733e7Ux3h0Y7HanJ7neOV/nid4g=="], "vitefu": ["vitefu@1.1.3", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["vite"] }, "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="], @@ -1644,13 +1691,13 @@ "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], - "workerd": ["workerd@1.20260611.1", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20260611.1", "@cloudflare/workerd-darwin-arm64": "1.20260611.1", "@cloudflare/workerd-linux-64": "1.20260611.1", "@cloudflare/workerd-linux-arm64": "1.20260611.1", "@cloudflare/workerd-windows-64": "1.20260611.1" }, "bin": { "workerd": "bin/workerd" } }, "sha512-CS/640T7pIJ2HYX6x2DwKFGbcSckAWN3tgcdq+ptB6SaqjWUhlzIgA/YhPuwIU+/NnMnGpqOFX/hC18Oyge63w=="], + "workerd": ["workerd@1.20260701.1", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20260701.1", "@cloudflare/workerd-darwin-arm64": "1.20260701.1", "@cloudflare/workerd-linux-64": "1.20260701.1", "@cloudflare/workerd-linux-arm64": "1.20260701.1", "@cloudflare/workerd-windows-64": "1.20260701.1" }, "bin": { "workerd": "bin/workerd" } }, "sha512-uF813NG09JwNRRUfJ0zBomyTslSPM810dMj9LVvkQ7RAkLrQLzAlPU8Xh/3dIqZDo2bfd7tChbf2PtqLRARRJQ=="], - "wrangler": ["wrangler@4.100.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.5.0", "@cloudflare/unenv-preset": "2.16.1", "blake3-wasm": "2.1.5", "esbuild": "0.27.3", "miniflare": "4.20260611.0", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", "workerd": "1.20260611.1" }, "optionalDependencies": { "fsevents": "2.3.3" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20260611.1" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "cf-wrangler": "bin/cf-wrangler.js", "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-dSQO7DO+mD6XDzkVWIWBoGLO3yw+lacWSc/KhFvd7pgfpth+kX98qb5SGRHZN8ACCDhhfwzDLXwB6qHsIHhfBg=="], + "wrangler": ["wrangler@4.107.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.5.0", "@cloudflare/unenv-preset": "2.16.1", "blake3-wasm": "2.1.5", "esbuild": "0.28.1", "miniflare": "4.20260701.0", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", "workerd": "1.20260701.1" }, "optionalDependencies": { "fsevents": "2.3.3" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20260701.1" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js", "cf-wrangler": "bin/cf-wrangler.js" } }, "sha512-fw69ThymNitZ0oIEBU2yNeq3kK59UKz/jyA3udwRrQIAIsxX57q5qLOpPTN7qc5t8n9pnUeofe0uxtMuhQZW8w=="], "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - "ws": ["ws@8.20.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w=="], + "ws": ["ws@8.21.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g=="], "xml-name-validator": ["xml-name-validator@5.0.0", "", {}, "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg=="], @@ -1664,7 +1711,7 @@ "yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="], - "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + "yargs": ["yargs@17.7.3", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g=="], "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], @@ -1686,6 +1733,8 @@ "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + "@img/sharp-wasm32/@emnapi/runtime": ["@emnapi/runtime@1.11.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA=="], + "@manypkg/find-root/@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="], "@manypkg/find-root/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], @@ -1702,10 +1751,10 @@ "@quansync/fs/quansync": ["quansync@1.0.0", "", {}, "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA=="], - "@remotion/bundler/esbuild": ["esbuild@0.28.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.1", "@esbuild/android-arm": "0.28.1", "@esbuild/android-arm64": "0.28.1", "@esbuild/android-x64": "0.28.1", "@esbuild/darwin-arm64": "0.28.1", "@esbuild/darwin-x64": "0.28.1", "@esbuild/freebsd-arm64": "0.28.1", "@esbuild/freebsd-x64": "0.28.1", "@esbuild/linux-arm": "0.28.1", "@esbuild/linux-arm64": "0.28.1", "@esbuild/linux-ia32": "0.28.1", "@esbuild/linux-loong64": "0.28.1", "@esbuild/linux-mips64el": "0.28.1", "@esbuild/linux-ppc64": "0.28.1", "@esbuild/linux-riscv64": "0.28.1", "@esbuild/linux-s390x": "0.28.1", "@esbuild/linux-x64": "0.28.1", "@esbuild/netbsd-arm64": "0.28.1", "@esbuild/netbsd-x64": "0.28.1", "@esbuild/openbsd-arm64": "0.28.1", "@esbuild/openbsd-x64": "0.28.1", "@esbuild/openharmony-arm64": "0.28.1", "@esbuild/sunos-x64": "0.28.1", "@esbuild/win32-arm64": "0.28.1", "@esbuild/win32-ia32": "0.28.1", "@esbuild/win32-x64": "0.28.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw=="], - "@remotion/renderer/source-map": ["source-map@0.8.0-beta.0", "", { "dependencies": { "whatwg-url": "^7.0.0" } }, "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA=="], + "@remotion/renderer/ws": ["ws@8.20.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w=="], + "@remotion/studio/semver": ["semver@7.5.3", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ=="], "@remotion/studio-server/@babel/parser": ["@babel/parser@7.24.1", "", { "bin": "./bin/babel-parser.js" }, "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg=="], @@ -1720,15 +1769,15 @@ "@rspack/binding-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.0.7", "", { "dependencies": { "@emnapi/core": "^1.5.0", "@emnapi/runtime": "^1.5.0", "@tybys/wasm-util": "^0.10.1" } }, "sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw=="], - "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q=="], + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA=="], - "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg=="], + "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA=="], "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA=="], - "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.5", "", { "dependencies": { "@tybys/wasm-util": "^0.10.2" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" }, "bundled": true }, "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q=="], + "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.6", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" }, "bundled": true }, "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg=="], - "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg=="], + "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg=="], "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -1738,7 +1787,11 @@ "@tailwindcss/webpack/tailwindcss": ["tailwindcss@4.2.0", "", {}, "sha512-yYzTZ4++b7fNYxFfpnberEEKu43w44aqDMNM9MHMmcKuCH7lL8jJ4yJ7LGHv7rSwiqM0nkiobF9I6cLlpS2P7Q=="], - "@tanstack/router-generator/prettier": ["prettier@3.8.4", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q=="], + "@tanstack/devtools-vite/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + + "@tanstack/devtools-vite/oxc-parser": ["oxc-parser@0.120.0", "", { "dependencies": { "@oxc-project/types": "^0.120.0" }, "optionalDependencies": { "@oxc-parser/binding-android-arm-eabi": "0.120.0", "@oxc-parser/binding-android-arm64": "0.120.0", "@oxc-parser/binding-darwin-arm64": "0.120.0", "@oxc-parser/binding-darwin-x64": "0.120.0", "@oxc-parser/binding-freebsd-x64": "0.120.0", "@oxc-parser/binding-linux-arm-gnueabihf": "0.120.0", "@oxc-parser/binding-linux-arm-musleabihf": "0.120.0", "@oxc-parser/binding-linux-arm64-gnu": "0.120.0", "@oxc-parser/binding-linux-arm64-musl": "0.120.0", "@oxc-parser/binding-linux-ppc64-gnu": "0.120.0", "@oxc-parser/binding-linux-riscv64-gnu": "0.120.0", "@oxc-parser/binding-linux-riscv64-musl": "0.120.0", "@oxc-parser/binding-linux-s390x-gnu": "0.120.0", "@oxc-parser/binding-linux-x64-gnu": "0.120.0", "@oxc-parser/binding-linux-x64-musl": "0.120.0", "@oxc-parser/binding-openharmony-arm64": "0.120.0", "@oxc-parser/binding-wasm32-wasi": "0.120.0", "@oxc-parser/binding-win32-arm64-msvc": "0.120.0", "@oxc-parser/binding-win32-ia32-msvc": "0.120.0", "@oxc-parser/binding-win32-x64-msvc": "0.120.0" } }, "sha512-WyPWZlcIm+Fkte63FGfgFB8mAAk33aH9h5N9lphXVOHSXEBFFsmYdOBedVKly363aWABjZdaj/m9lBfEY4wt+w=="], + + "@tanstack/router-generator/prettier": ["prettier@3.8.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg=="], "@tanstack/router-generator/zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], @@ -1752,9 +1805,9 @@ "ajv-keywords/ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="], - "bumpp/package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="], + "bumpp/package-manager-detector": ["package-manager-detector@1.7.0", "", {}, "sha512-xg1eHpwYL/D/HEdWw2goFZP6vV0FH7W+PZ5rFkGjdIDLtxq7EkzBUeT3m+lndYCt8wKbmofUu1MUdMCXkCk9ZQ=="], - "cloudflare-workflows-tanstack/@types/node": ["@types/node@22.19.21", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-VMeFBSCKQKmm2swI2kW51SFusDqekC6q9trBCvJ/JliDchFSuoYYKN7yVNjPthP1HKZcx3U1gI/wTcEBjEFKTA=="], + "cloudflare-workflows-tanstack/@types/node": ["@types/node@22.20.0", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g=="], "execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], @@ -1766,15 +1819,15 @@ "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], - "miniflare/undici": ["undici@7.24.8", "", {}, "sha512-6KQ/+QxK49Z/p3HO6E5ZCZWNnCasyZLa5ExaVYyvPxUwKtbCPMKELJOqh7EqOle0t9cH/7d2TaaTRRa6Nhs4YQ=="], - - "oxc-parser/@oxc-project/types": ["@oxc-project/types@0.120.0", "", {}, "sha512-k1YNu55DuvAip/MGE1FTsIuU3FUCn6v/ujG9V7Nq5Df/kX2CWb13hhwD0lmJGMGqE+bE1MXvv9SZVnMzEXlWcg=="], + "oxc-parser/@oxc-project/types": ["@oxc-project/types@0.137.0", "", {}, "sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA=="], "postcss-modules-local-by-default/postcss-selector-parser": ["postcss-selector-parser@7.1.4", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg=="], "postcss-modules-scope/postcss-selector-parser": ["postcss-selector-parser@7.1.4", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg=="], - "read-yaml-file/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="], + "pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], + + "read-yaml-file/js-yaml": ["js-yaml@3.15.0", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog=="], "recast/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], @@ -1796,93 +1849,85 @@ "webpack/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], - "wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "@manypkg/find-root/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], - "@remotion/bundler/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ=="], - - "@remotion/bundler/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.28.1", "", { "os": "android", "cpu": "arm" }, "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ=="], - - "@remotion/bundler/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.28.1", "", { "os": "android", "cpu": "arm64" }, "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg=="], - - "@remotion/bundler/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.28.1", "", { "os": "android", "cpu": "x64" }, "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng=="], + "@remotion/renderer/source-map/whatwg-url": ["whatwg-url@7.1.0", "", { "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", "webidl-conversions": "^4.0.2" } }, "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg=="], - "@remotion/bundler/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.28.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q=="], + "@remotion/studio-server/semver/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - "@remotion/bundler/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.28.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ=="], + "@remotion/studio/semver/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - "@remotion/bundler/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.28.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw=="], + "@rspack/binding-wasm32-wasi/@napi-rs/wasm-runtime/@emnapi/core": ["@emnapi/core@1.11.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" } }, "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA=="], - "@remotion/bundler/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.28.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ=="], + "@rspack/binding-wasm32-wasi/@napi-rs/wasm-runtime/@emnapi/runtime": ["@emnapi/runtime@1.11.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA=="], - "@remotion/bundler/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.28.1", "", { "os": "linux", "cpu": "arm" }, "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ=="], + "@tailwindcss/webpack/@tailwindcss/node/lightningcss": ["lightningcss@1.31.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.31.1", "lightningcss-darwin-arm64": "1.31.1", "lightningcss-darwin-x64": "1.31.1", "lightningcss-freebsd-x64": "1.31.1", "lightningcss-linux-arm-gnueabihf": "1.31.1", "lightningcss-linux-arm64-gnu": "1.31.1", "lightningcss-linux-arm64-musl": "1.31.1", "lightningcss-linux-x64-gnu": "1.31.1", "lightningcss-linux-x64-musl": "1.31.1", "lightningcss-win32-arm64-msvc": "1.31.1", "lightningcss-win32-x64-msvc": "1.31.1" } }, "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ=="], - "@remotion/bundler/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.28.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g=="], + "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.2.0", "", { "os": "android", "cpu": "arm64" }, "sha512-F0QkHAVaW/JNBWl4CEKWdZ9PMb0khw5DCELAOnu+RtjAfx5Zgw+gqCHFvqg3AirU1IAd181fwOtJQ5I8Yx5wtw=="], - "@remotion/bundler/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.28.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w=="], + "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.2.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-I0QylkXsBsJMZ4nkUNSR04p6+UptjcwhcVo3Zu828ikiEqHjVmQL9RuQ6uT/cVIiKpvtVA25msu/eRV97JeNSA=="], - "@remotion/bundler/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg=="], + "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.2.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-6TmQIn4p09PBrmnkvbYQ0wbZhLtbaksCDx7Y7R3FYYx0yxNA7xg5KP7dowmQ3d2JVdabIHvs3Hx4K3d5uCf8xg=="], - "@remotion/bundler/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ=="], + "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.2.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-qBudxDvAa2QwGlq9y7VIzhTvp2mLJ6nD/G8/tI70DCDoneaUeLWBJaPcbfzqRIWraj+o969aDQKvKW9dvkUizw=="], - "@remotion/bundler/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.28.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ=="], + "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.2.0", "", { "os": "linux", "cpu": "arm" }, "sha512-7XKkitpy5NIjFZNUQPeUyNJNJn1CJeV7rmMR+exHfTuOsg8rxIO9eNV5TSEnqRcaOK77zQpsyUkBWmPy8FgdSg=="], - "@remotion/bundler/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ=="], + "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.2.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-Mff5a5Q3WoQR01pGU1gr29hHM1N93xYrKkGXfPw/aRtK4bOc331Ho4Tgfsm5WDGvpevqMpdlkCojT3qlCQbCpA=="], - "@remotion/bundler/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.28.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag=="], + "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.2.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-XKcSStleEVnbH6W/9DHzZv1YhjE4eSS6zOu2eRtYAIh7aV4o3vIBs+t/B15xlqoxt6ef/0uiqJVB6hkHjWD/0A=="], - "@remotion/bundler/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.28.1", "", { "os": "linux", "cpu": "x64" }, "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA=="], + "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.2.0", "", { "os": "linux", "cpu": "x64" }, "sha512-/hlXCBqn9K6fi7eAM0RsobHwJYa5V/xzWspVTzxnX+Ft9v6n+30Pz8+RxCn7sQL/vRHHLS30iQPrHQunu6/vJA=="], - "@remotion/bundler/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw=="], + "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.2.0", "", { "os": "linux", "cpu": "x64" }, "sha512-lKUaygq4G7sWkhQbfdRRBkaq4LY39IriqBQ+Gk6l5nKq6Ay2M2ZZb1tlIyRNgZKS8cbErTwuYSor0IIULC0SHw=="], - "@remotion/bundler/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.28.1", "", { "os": "none", "cpu": "x64" }, "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg=="], + "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.2.0", "", { "dependencies": { "@emnapi/core": "^1.8.1", "@emnapi/runtime": "^1.8.1", "@emnapi/wasi-threads": "^1.1.0", "@napi-rs/wasm-runtime": "^1.1.1", "@tybys/wasm-util": "^0.10.1", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-xuDjhAsFdUuFP5W9Ze4k/o4AskUtI8bcAGU4puTYprr89QaYFmhYOPfP+d1pH+k9ets6RoE23BXZM1X1jJqoyw=="], - "@remotion/bundler/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.28.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q=="], + "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.2.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-2UU/15y1sWDEDNJXxEIrfWKC2Yb4YgIW5Xz2fKFqGzFWfoMHWFlfa1EJlGO2Xzjkq/tvSarh9ZTjvbxqWvLLXA=="], - "@remotion/bundler/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.28.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw=="], + "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.2.0", "", { "os": "win32", "cpu": "x64" }, "sha512-CrFadmFoc+z76EV6LPG1jx6XceDsaCG3lFhyLNo/bV9ByPrE+FnBPckXQVP4XRkN76h3Fjt/a+5Er/oA/nCBvQ=="], - "@remotion/bundler/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg=="], + "@tanstack/devtools-vite/oxc-parser/@oxc-parser/binding-android-arm-eabi": ["@oxc-parser/binding-android-arm-eabi@0.120.0", "", { "os": "android", "cpu": "arm" }, "sha512-WU3qtINx802wOl8RxAF1v0VvmC2O4D9M8Sv486nLeQ7iPHVmncYZrtBhB4SYyX+XZxj2PNnCcN+PW21jHgiOxg=="], - "@remotion/bundler/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.28.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ=="], + "@tanstack/devtools-vite/oxc-parser/@oxc-parser/binding-android-arm64": ["@oxc-parser/binding-android-arm64@0.120.0", "", { "os": "android", "cpu": "arm64" }, "sha512-SEf80EHdhlbjZEgzeWm0ZA/br4GKMenDW3QB/gtyeTV1gStvvZeFi40ioHDZvds2m4Z9J1bUAUL8yn1/+A6iGg=="], - "@remotion/bundler/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.28.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA=="], + "@tanstack/devtools-vite/oxc-parser/@oxc-parser/binding-darwin-arm64": ["@oxc-parser/binding-darwin-arm64@0.120.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-xVrrbCai8R8CUIBu3CjryutQnEYhZqs1maIqDvtUCFZb8vY33H7uh9mHpL3a0JBIKoBUKjPH8+rzyAeXnS2d6A=="], - "@remotion/bundler/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.28.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg=="], + "@tanstack/devtools-vite/oxc-parser/@oxc-parser/binding-darwin-x64": ["@oxc-parser/binding-darwin-x64@0.120.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-xyHBbnJ6mydnQUH7MAcafOkkrNzQC6T+LXgDH/3InEq2BWl/g424IMRiJVSpVqGjB+p2bd0h0WRR8iIwzjU7rw=="], - "@remotion/bundler/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.1", "", { "os": "win32", "cpu": "x64" }, "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A=="], + "@tanstack/devtools-vite/oxc-parser/@oxc-parser/binding-freebsd-x64": ["@oxc-parser/binding-freebsd-x64@0.120.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-UMnVRllquXUYTeNfFKmxTTEdZ/ix1nLl0ducDzMSREoWYGVIHnOOxoKMWlCOvRr9Wk/HZqo2rh1jeumbPGPV9A=="], - "@remotion/renderer/source-map/whatwg-url": ["whatwg-url@7.1.0", "", { "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", "webidl-conversions": "^4.0.2" } }, "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg=="], + "@tanstack/devtools-vite/oxc-parser/@oxc-parser/binding-linux-arm-gnueabihf": ["@oxc-parser/binding-linux-arm-gnueabihf@0.120.0", "", { "os": "linux", "cpu": "arm" }, "sha512-tkvn2CQ7QdcsMnpfiX3fd3wA3EFsWKYlcQzq9cFw/xc89Al7W6Y4O0FgLVkVQpo0Tnq/qtE1XfkJOnRRA9S/NA=="], - "@remotion/studio-server/semver/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], + "@tanstack/devtools-vite/oxc-parser/@oxc-parser/binding-linux-arm-musleabihf": ["@oxc-parser/binding-linux-arm-musleabihf@0.120.0", "", { "os": "linux", "cpu": "arm" }, "sha512-WN5y135Ic42gQDk9grbwY9++fDhqf8knN6fnP+0WALlAUh4odY/BDK1nfTJRSfpJD9P3r1BwU0m3pW2DU89whQ=="], - "@remotion/studio/semver/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], + "@tanstack/devtools-vite/oxc-parser/@oxc-parser/binding-linux-arm64-gnu": ["@oxc-parser/binding-linux-arm64-gnu@0.120.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-1GgQBCcXvFMw99EPdMy+4NZ3aYyXsxjf9kbUUg8HuAy3ZBXzOry5KfFEzT9nqmgZI1cuetvApkiJBZLAPo8uaw=="], - "@tailwindcss/webpack/@tailwindcss/node/lightningcss": ["lightningcss@1.31.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.31.1", "lightningcss-darwin-arm64": "1.31.1", "lightningcss-darwin-x64": "1.31.1", "lightningcss-freebsd-x64": "1.31.1", "lightningcss-linux-arm-gnueabihf": "1.31.1", "lightningcss-linux-arm64-gnu": "1.31.1", "lightningcss-linux-arm64-musl": "1.31.1", "lightningcss-linux-x64-gnu": "1.31.1", "lightningcss-linux-x64-musl": "1.31.1", "lightningcss-win32-arm64-msvc": "1.31.1", "lightningcss-win32-x64-msvc": "1.31.1" } }, "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ=="], + "@tanstack/devtools-vite/oxc-parser/@oxc-parser/binding-linux-arm64-musl": ["@oxc-parser/binding-linux-arm64-musl@0.120.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-gmMQ70gsPdDBgpcErvJEoWNBr7bJooSLlvOBVBSGfOzlP5NvJ3bFvnUeZZ9d+dPrqSngtonf7nyzWUTUj/U+lw=="], - "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.2.0", "", { "os": "android", "cpu": "arm64" }, "sha512-F0QkHAVaW/JNBWl4CEKWdZ9PMb0khw5DCELAOnu+RtjAfx5Zgw+gqCHFvqg3AirU1IAd181fwOtJQ5I8Yx5wtw=="], + "@tanstack/devtools-vite/oxc-parser/@oxc-parser/binding-linux-ppc64-gnu": ["@oxc-parser/binding-linux-ppc64-gnu@0.120.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-T/kZuU0ajop0xhzVMwH5r3srC9Nqup5HaIo+3uFjIN5uPxa0LvSxC1ZqP4aQGJVW5G0z8/nCkjIfSMS91P/wzw=="], - "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.2.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-I0QylkXsBsJMZ4nkUNSR04p6+UptjcwhcVo3Zu828ikiEqHjVmQL9RuQ6uT/cVIiKpvtVA25msu/eRV97JeNSA=="], + "@tanstack/devtools-vite/oxc-parser/@oxc-parser/binding-linux-riscv64-gnu": ["@oxc-parser/binding-linux-riscv64-gnu@0.120.0", "", { "os": "linux", "cpu": "none" }, "sha512-vn21KXLAXzaI3N5CZWlBr1iWeXLl9QFIMor7S1hUjUGTeUuWCoE6JZB040/ZNDwf+JXPX8Ao9KbmJq9FMC2iGw=="], - "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.2.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-6TmQIn4p09PBrmnkvbYQ0wbZhLtbaksCDx7Y7R3FYYx0yxNA7xg5KP7dowmQ3d2JVdabIHvs3Hx4K3d5uCf8xg=="], + "@tanstack/devtools-vite/oxc-parser/@oxc-parser/binding-linux-riscv64-musl": ["@oxc-parser/binding-linux-riscv64-musl@0.120.0", "", { "os": "linux", "cpu": "none" }, "sha512-SUbUxlar007LTGmSLGIC5x/WJvwhdX+PwNzFJ9f/nOzZOrCFbOT4ikt7pJIRg1tXVsEfzk5mWpGO1NFiSs4PIw=="], - "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.2.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-qBudxDvAa2QwGlq9y7VIzhTvp2mLJ6nD/G8/tI70DCDoneaUeLWBJaPcbfzqRIWraj+o969aDQKvKW9dvkUizw=="], + "@tanstack/devtools-vite/oxc-parser/@oxc-parser/binding-linux-s390x-gnu": ["@oxc-parser/binding-linux-s390x-gnu@0.120.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-hYiPJTxyfJY2+lMBFk3p2bo0R9GN+TtpPFlRqVchL1qvLG+pznstramHNvJlw9AjaoRUHwp9IKR7UZQnRPGjgQ=="], - "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.2.0", "", { "os": "linux", "cpu": "arm" }, "sha512-7XKkitpy5NIjFZNUQPeUyNJNJn1CJeV7rmMR+exHfTuOsg8rxIO9eNV5TSEnqRcaOK77zQpsyUkBWmPy8FgdSg=="], + "@tanstack/devtools-vite/oxc-parser/@oxc-parser/binding-linux-x64-gnu": ["@oxc-parser/binding-linux-x64-gnu@0.120.0", "", { "os": "linux", "cpu": "x64" }, "sha512-q+5jSVZkprJCIy3dzJpApat0InJaoxQLsJuD6DkX8hrUS61z2lHQ1Fe9L2+TYbKHXCLWbL0zXe7ovkIdopBGMQ=="], - "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.2.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-Mff5a5Q3WoQR01pGU1gr29hHM1N93xYrKkGXfPw/aRtK4bOc331Ho4Tgfsm5WDGvpevqMpdlkCojT3qlCQbCpA=="], + "@tanstack/devtools-vite/oxc-parser/@oxc-parser/binding-linux-x64-musl": ["@oxc-parser/binding-linux-x64-musl@0.120.0", "", { "os": "linux", "cpu": "x64" }, "sha512-D9QDDZNnH24e7X4ftSa6ar/2hCavETfW3uk0zgcMIrZNy459O5deTbWrjGzZiVrSWigGtlQwzs2McBP0QsfV1w=="], - "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.2.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-XKcSStleEVnbH6W/9DHzZv1YhjE4eSS6zOu2eRtYAIh7aV4o3vIBs+t/B15xlqoxt6ef/0uiqJVB6hkHjWD/0A=="], + "@tanstack/devtools-vite/oxc-parser/@oxc-parser/binding-openharmony-arm64": ["@oxc-parser/binding-openharmony-arm64@0.120.0", "", { "os": "none", "cpu": "arm64" }, "sha512-TBU8ZwOUWAOUWVfmI16CYWbvh4uQb9zHnGBHsw5Cp2JUVG044OIY1CSHODLifqzQIMTXvDvLzcL89GGdUIqNrA=="], - "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.2.0", "", { "os": "linux", "cpu": "x64" }, "sha512-/hlXCBqn9K6fi7eAM0RsobHwJYa5V/xzWspVTzxnX+Ft9v6n+30Pz8+RxCn7sQL/vRHHLS30iQPrHQunu6/vJA=="], + "@tanstack/devtools-vite/oxc-parser/@oxc-parser/binding-wasm32-wasi": ["@oxc-parser/binding-wasm32-wasi@0.120.0", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.1" }, "cpu": "none" }, "sha512-WG/FOZgDJCpJnuF3ToG/K28rcOmSY7FmFmfBKYb2fmLyhDzPpUldFGV7/Fz4ru0Iz/v4KPmf8xVgO8N3lO4KHA=="], - "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.2.0", "", { "os": "linux", "cpu": "x64" }, "sha512-lKUaygq4G7sWkhQbfdRRBkaq4LY39IriqBQ+Gk6l5nKq6Ay2M2ZZb1tlIyRNgZKS8cbErTwuYSor0IIULC0SHw=="], + "@tanstack/devtools-vite/oxc-parser/@oxc-parser/binding-win32-arm64-msvc": ["@oxc-parser/binding-win32-arm64-msvc@0.120.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-1T0HKGcsz/BKo77t7+89L8Qvu4f9DoleKWHp3C5sJEcbCjDOLx3m9m722bWZTY+hANlUEs+yjlK+lBFsA+vrVQ=="], - "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.2.0", "", { "dependencies": { "@emnapi/core": "^1.8.1", "@emnapi/runtime": "^1.8.1", "@emnapi/wasi-threads": "^1.1.0", "@napi-rs/wasm-runtime": "^1.1.1", "@tybys/wasm-util": "^0.10.1", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-xuDjhAsFdUuFP5W9Ze4k/o4AskUtI8bcAGU4puTYprr89QaYFmhYOPfP+d1pH+k9ets6RoE23BXZM1X1jJqoyw=="], + "@tanstack/devtools-vite/oxc-parser/@oxc-parser/binding-win32-ia32-msvc": ["@oxc-parser/binding-win32-ia32-msvc@0.120.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-L7vfLzbOXsjBXV0rv/6Y3Jd9BRjPeCivINZAqrSyAOZN3moCopDN+Psq9ZrGNZtJzP8946MtlRFZ0Als0wBCOw=="], - "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.2.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-2UU/15y1sWDEDNJXxEIrfWKC2Yb4YgIW5Xz2fKFqGzFWfoMHWFlfa1EJlGO2Xzjkq/tvSarh9ZTjvbxqWvLLXA=="], + "@tanstack/devtools-vite/oxc-parser/@oxc-parser/binding-win32-x64-msvc": ["@oxc-parser/binding-win32-x64-msvc@0.120.0", "", { "os": "win32", "cpu": "x64" }, "sha512-ys+upfqNtSu58huAhJMBKl3XCkGzyVFBlMlGPzHeFKgpFF/OdgNs1MMf8oaJIbgMH8ZxgGF7qfue39eJohmKIg=="], - "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.2.0", "", { "os": "win32", "cpu": "x64" }, "sha512-CrFadmFoc+z76EV6LPG1jx6XceDsaCG3lFhyLNo/bV9ByPrE+FnBPckXQVP4XRkN76h3Fjt/a+5Er/oA/nCBvQ=="], + "@tanstack/devtools-vite/oxc-parser/@oxc-project/types": ["@oxc-project/types@0.120.0", "", {}, "sha512-k1YNu55DuvAip/MGE1FTsIuU3FUCn6v/ujG9V7Nq5Df/kX2CWb13hhwD0lmJGMGqE+bE1MXvv9SZVnMzEXlWcg=="], "ajv-formats/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], @@ -1928,15 +1973,15 @@ "@tailwindcss/webpack/@tailwindcss/node/lightningcss/lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.31.1", "", { "os": "win32", "cpu": "x64" }, "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw=="], - "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q=="], + "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA=="], - "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg=="], + "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA=="], "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA=="], - "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.5", "", { "dependencies": { "@tybys/wasm-util": "^0.10.2" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" }, "bundled": true }, "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q=="], + "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.6", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" }, "bundled": true }, "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg=="], - "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg=="], + "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg=="], "@tailwindcss/webpack/@tailwindcss/oxide/@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], diff --git a/package.json b/package.json index bdadaec..6c73726 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "packageManager": "bun@1.3.14", "catalog": { "@typescript/native-preview": "7.0.0-dev.20260509.2", + "oxc-parser": "0.137.0", "typescript": "6.0.3", "vite": "npm:@voidzero-dev/vite-plus-core@0.2.2", "vitest": "4.1.9", diff --git a/packages/sideffect/package.json b/packages/sideffect/package.json index 8022874..dc571d3 100644 --- a/packages/sideffect/package.json +++ b/packages/sideffect/package.json @@ -32,6 +32,9 @@ "check": "vp check", "prepublishOnly": "vp run build" }, + "dependencies": { + "oxc-parser": "catalog:" + }, "devDependencies": { "@cloudflare/vite-plugin": "^1.40.0", "@cloudflare/workers-types": "4.20260605.1", diff --git a/packages/sideffect/src/vite.ts b/packages/sideffect/src/vite.ts index 19ad5e4..f3da6d5 100644 --- a/packages/sideffect/src/vite.ts +++ b/packages/sideffect/src/vite.ts @@ -8,7 +8,12 @@ import { writeWorkflowEnvTypes, type CapturedWorkflow, } from "./vite/generated-entry.ts"; -import { collectWorkflowEntries, type WorkflowDiscoveryPaths } from "./vite/workflow-discovery.ts"; +import { + collectWorkflowEntriesForVite, + formatParserSelection, + type WorkflowDiscoveryParserSelection, + type WorkflowDiscoveryPaths, +} from "./vite/workflow-discovery.ts"; import type { CloudflarePluginConfig, WorkerConfig } from "./vite/cloudflare-options.ts"; import type { WorkflowConfigEntry } from "./types.ts"; @@ -49,11 +54,17 @@ export interface Plugin { readonly enforce?: "pre" | "post"; readonly sharedDuringBuild?: boolean; config?(config: { readonly root?: string }): void; - configResolved?(config: { readonly root: string }): void; + configResolved?(config: { readonly root: string; readonly logger?: ViteLogger }): void; resolveId?(source: string): string | void; load?(this: ResolveContext, id: string): Promise | string | void; } +/** Minimal Vite logger shape used for parser-selection diagnostics. */ +interface ViteLogger { + readonly info?: (message: string) => void; + readonly warn?: (message: string) => void; +} + /** Sideffect Vite plugin plus the Cloudflare config object it forwards. */ export interface SideffectWorkflowsPlugin extends Plugin { /** Config object passed to `@cloudflare/vite-plugin` by `withCloudflareWorkflows()`. */ @@ -122,6 +133,8 @@ export function createSideffectWorkflowsPlugin( const captured: { value?: CapturedWorkflowConfig } = {}; let configRoot: string | undefined; let resolvedConfig: { readonly root: string } | undefined; + let logger: ViteLogger | undefined; + let pendingParserSelection: WorkflowDiscoveryParserSelection | undefined; const plugin: SideffectWorkflowsPlugin = { name: "sideffect:cloudflare-workflows", @@ -153,7 +166,15 @@ export function createSideffectWorkflowsPlugin( typeof plugin.cloudflare.configPath === "string" ? dirname(resolve(root, plugin.cloudflare.configPath)) : root; - const discoveredWorkflows = collectWorkflowEntries(workflowPaths, baseDirectory); + const discoveredWorkflows = collectWorkflowEntriesForVite(workflowPaths, baseDirectory, { + onParserSelected(selection) { + if (logParserSelection(logger, selection)) { + pendingParserSelection = undefined; + } else { + pendingParserSelection = selection; + } + }, + }); const discoveredByClassName = new Map( discoveredWorkflows.map((workflow) => [workflow.config.class_name, workflow]), ); @@ -200,6 +221,12 @@ export function createSideffectWorkflowsPlugin( }, configResolved(config) { resolvedConfig = config; + logger = config.logger; + if (pendingParserSelection) { + if (logParserSelection(logger, pendingParserSelection)) { + pendingParserSelection = undefined; + } + } }, resolveId(source) { if (source !== virtualEntry) { @@ -259,3 +286,14 @@ export function createSideffectWorkflowsPlugin( return plugin; } + +function logParserSelection( + logger: ViteLogger | undefined, + selection: WorkflowDiscoveryParserSelection, +): boolean { + if (!logger?.info) { + return false; + } + logger.info(`[sideffect] workflow discovery parser: ${formatParserSelection(selection)}`); + return true; +} diff --git a/packages/sideffect/src/vite/oxc-parser-adapter.ts b/packages/sideffect/src/vite/oxc-parser-adapter.ts new file mode 100644 index 0000000..7c64cdd --- /dev/null +++ b/packages/sideffect/src/vite/oxc-parser-adapter.ts @@ -0,0 +1,171 @@ +import { readFileSync } from "node:fs"; +import { createRequire } from "node:module"; +import { extname } from "node:path"; + +import { Effect } from "effect"; +import type { EcmaScriptModule, Program as OxcProgram } from "oxc-parser"; + +import { + WorkflowParserUnavailable, + WorkflowSourceParseFailed, + WorkflowSourceReadFailed, +} from "./workflow-discovery-errors.ts"; + +const require = createRequire(import.meta.url); + +type OxcParserModule = typeof import("oxc-parser"); +type OxcParserOptions = NonNullable[2]> & { + readonly experimentalRawTransfer?: boolean; +}; + +/** @internal JS runtime executing workflow discovery during Vite config/build. */ +export type JsRuntime = "bun" | "deno" | "node" | "node<22" | "unknown"; + +/** @internal Selected Oxc parser mode for one workflow discovery run. */ +export type WorkflowDiscoveryParserSelection = + | { readonly _tag: "RawTransfer"; readonly runtime: JsRuntime } + | { + readonly _tag: "Standard"; + readonly reason: "RawTransferUnsupported"; + readonly runtime: JsRuntime; + }; + +/** @internal Parsed Oxc source file before conversion to Sideffect's local AST. */ +export interface ParsedOxcSourceFile { + readonly filePath: string; + readonly program: OxcProgram; + readonly module: EcmaScriptModule; +} + +/** @internal Oxc parser dependency and mode selected for workflow discovery. */ +export interface OxcWorkflowParser { + readonly parser: OxcParserModule; + readonly selection: WorkflowDiscoveryParserSelection; +} + +let loadedOxcParser: OxcParserModule | undefined; + +/** @internal Creates the Oxc parser adapter used for one workflow discovery run. */ +export const makeOxcWorkflowParser = Effect.fnUntraced(function* () { + const parser = yield* loadOxcParser(); + const selection = selectParserMode(parser.rawTransferSupported(), currentJsRuntimeLabel()); + + return { parser, selection } satisfies OxcWorkflowParser; +}); + +/** @internal Reads and parses one workflow source file with Oxc. */ +export const parseOxcSourceFile = Effect.fnUntraced(function* ( + workflowParser: OxcWorkflowParser, + filePath: string, +) { + const source = yield* Effect.try({ + try: () => readFileSync(filePath, "utf8"), + catch: (cause) => new WorkflowSourceReadFailed({ filePath, cause }), + }); + const parseOptions: OxcParserOptions = { + astType: "ts", + ...(workflowParser.selection._tag === "RawTransfer" ? { experimentalRawTransfer: true } : {}), + lang: oxcLangForFile(filePath), + preserveParens: false, + range: false, + showSemanticErrors: false, + sourceType: "module", + }; + const result = workflowParser.parser.parseSync(filePath, source, parseOptions); + + if (result.errors.length > 0) { + return yield* new WorkflowSourceParseFailed({ + filePath, + message: result.errors[0]?.message ?? "unknown parser error", + }); + } + + return { filePath, program: result.program, module: result.module } satisfies ParsedOxcSourceFile; +}); + +/** @internal Formats parser mode selection for Vite logs. */ +export function formatParserSelection(selection: WorkflowDiscoveryParserSelection): string { + switch (selection._tag) { + case "RawTransfer": + return "oxc raw-transfer"; + case "Standard": + return `oxc standard (raw transfer unsupported by JS runtime: ${selection.runtime})`; + } +} + +function loadOxcParser() { + if (loadedOxcParser) { + return Effect.succeed(loadedOxcParser); + } + + return Effect.try({ + try: () => { + // SAFETY: The following runtime checks prove the parser surface this adapter uses. + const parser = require("oxc-parser") as Partial; + if (typeof parser.parseSync !== "function") { + throw new Error('Resolved "oxc-parser", but it does not expose parseSync.'); + } + if (typeof parser.rawTransferSupported !== "function") { + throw new Error('Resolved "oxc-parser", but it does not expose rawTransferSupported.'); + } + + // SAFETY: parseSync and rawTransferSupported were checked before caching the module. + loadedOxcParser = parser as OxcParserModule; + return loadedOxcParser; + }, + catch: (cause) => + new WorkflowParserUnavailable({ + cause, + message: "Could not load oxc-parser for workflow discovery.", + }), + }); +} + +function selectParserMode( + rawTransferSupported: boolean, + runtime: JsRuntime, +): WorkflowDiscoveryParserSelection { + return rawTransferSupported + ? { _tag: "RawTransfer", runtime } + : { _tag: "Standard", reason: "RawTransferUnsupported", runtime }; +} + +function currentJsRuntimeLabel(): JsRuntime { + // SAFETY: Runtime detection reads optional global fields and never trusts their payloads. + const global = globalThis as typeof globalThis & { + readonly Bun?: unknown; + readonly Deno?: { readonly version?: { readonly deno?: string } }; + }; + const processLike = global.process as + | { readonly versions?: { readonly bun?: string; readonly node?: string } } + | undefined; + if (global.Bun || processLike?.versions?.bun) { + return "bun"; + } + if (global.Deno) { + return "deno"; + } + + const nodeVersion = processLike?.versions?.node; + const major = nodeVersion ? Number(nodeVersion.split(".")[0]) : Number.NaN; + if (Number.isInteger(major)) { + return major < 22 ? "node<22" : "node"; + } + + return "unknown"; +} + +function oxcLangForFile(path: string): "js" | "jsx" | "ts" | "tsx" { + switch (extname(path)) { + case ".tsx": + return "tsx"; + case ".jsx": + return "jsx"; + case ".js": + case ".mjs": + case ".cjs": + return "js"; + default: + return "ts"; + } +} diff --git a/packages/sideffect/src/vite/oxc-workflow-ast.ts b/packages/sideffect/src/vite/oxc-workflow-ast.ts new file mode 100644 index 0000000..53bf5bf --- /dev/null +++ b/packages/sideffect/src/vite/oxc-workflow-ast.ts @@ -0,0 +1,345 @@ +import type { EcmaScriptModule, Program as OxcProgram } from "oxc-parser"; + +import { isLocalSpecifier } from "./workflow-source-files.ts"; +import { + isIdentifierName, + type LocalImportDeclaration, + type ReExportDeclaration, + type WorkflowExpression, + type WorkflowSourceModule, + type WorkflowStatement, +} from "./workflow-source-analysis.ts"; + +type OxcNode = { readonly type: string; readonly [key: string]: unknown }; +type OxcRecord = { readonly [key: string]: unknown }; + +/** @internal Converts Oxc parser output into Sideffect's local workflow AST. */ +export function parseOxcWorkflowModule( + program: OxcProgram, + module: EcmaScriptModule, +): WorkflowSourceModule { + return { + workflowBindings: parseWorkflowBindings(module), + imports: parseLocalImports(module), + reExports: parseReExports(module), + statements: [...parseWorkflowStatements(program), ...parseLocalExportSpecifiers(module)], + }; +} + +function parseWorkflowBindings(module: EcmaScriptModule): WorkflowSourceModule["workflowBindings"] { + const names = new Set(["Workflow"]); + const namespaces = new Set(); + + for (const importDeclaration of module.staticImports) { + if (importDeclaration.moduleRequest.value !== "sideffect") { + continue; + } + + for (const entry of importDeclaration.entries) { + if (entry.isType) { + continue; + } + if (entry.importName.kind === "NamespaceObject") { + namespaces.add(entry.localName.value); + continue; + } + if (entry.importName.kind === "Name" && entry.importName.name === "Workflow") { + names.add(entry.localName.value); + } + } + } + + return { names, namespaces }; +} + +function parseLocalImports(module: EcmaScriptModule): ReadonlyArray { + const declarations: Array = []; + + for (const importDeclaration of module.staticImports) { + const specifier = importDeclaration.moduleRequest.value; + if (!isLocalSpecifier(specifier)) { + continue; + } + + const imports: Array<{ readonly imported: string; readonly local: string }> = []; + for (const entry of importDeclaration.entries) { + if (entry.isType) { + continue; + } + + const imported = + entry.importName.kind === "Default" + ? "default" + : entry.importName.kind === "Name" + ? entry.importName.name + : undefined; + const local = entry.localName.value; + if (imported && isIdentifierName(imported) && isIdentifierName(local)) { + imports.push({ imported, local }); + } + } + + if (imports.length > 0) { + declarations.push({ specifier, imports }); + } + } + + return declarations; +} + +function parseReExports(module: EcmaScriptModule): ReadonlyArray { + const bySpecifier = new Map< + string, + Array<{ readonly imported: string; readonly exported: string }> + >(); + const starExports = new Set(); + + for (const exportDeclaration of module.staticExports) { + for (const entry of exportDeclaration.entries) { + if (entry.isType || !entry.moduleRequest) { + continue; + } + + const specifier = entry.moduleRequest.value; + if (entry.importName.kind === "AllButDefault") { + starExports.add(specifier); + continue; + } + + if (entry.importName.kind !== "Name" || entry.exportName.kind !== "Name") { + continue; + } + + const imported = entry.importName.name; + const exported = entry.exportName.name; + if (!imported || !exported || !isIdentifierName(imported) || !isIdentifierName(exported)) { + continue; + } + + const exports = bySpecifier.get(specifier) ?? []; + exports.push({ imported, exported }); + bySpecifier.set(specifier, exports); + } + } + + return [ + ...[...starExports].map((specifier): ReExportDeclaration => ({ kind: "all", specifier })), + ...[...bySpecifier].map( + ([specifier, exports]): ReExportDeclaration => ({ kind: "named", specifier, exports }), + ), + ]; +} + +function parseLocalExportSpecifiers(module: EcmaScriptModule): ReadonlyArray { + const specifiers: Array<{ readonly imported: string; readonly exported: string }> = []; + + for (const exportDeclaration of module.staticExports) { + for (const entry of exportDeclaration.entries) { + if (entry.isType || entry.moduleRequest || entry.localName.kind !== "Name") { + continue; + } + if (entry.exportName.kind !== "Name" && entry.exportName.kind !== "Default") { + continue; + } + + const imported = entry.localName.name; + const exported = entry.exportName.kind === "Default" ? "default" : entry.exportName.name; + if (!imported || !exported || !isIdentifierName(imported) || !isIdentifierName(exported)) { + continue; + } + + specifiers.push({ imported, exported }); + } + } + + return specifiers.length > 0 ? [{ _tag: "ExportSpecifiers", specifiers }] : []; +} + +function parseWorkflowStatements(program: OxcProgram): ReadonlyArray { + const statements: Array = []; + + for (const statement of program.body) { + const node = asOxcNode(statement); + if (!node) { + continue; + } + + const variableDeclaration = parseVariableDeclaration(node, false); + if (variableDeclaration.length > 0) { + statements.push(...variableDeclaration); + continue; + } + + if (node.type === "ExportDefaultDeclaration") { + const declaration = nodeField(node, "declaration"); + statements.push({ _tag: "ExportDefault", expression: parseExpression(declaration) }); + continue; + } + + if (node.type !== "ExportNamedDeclaration" || stringField(node, "exportKind") === "type") { + continue; + } + + const declaration = nodeField(node, "declaration"); + if (declaration?.type === "VariableDeclaration") { + statements.push(...parseVariableDeclaration(declaration, true)); + } + } + + return statements; +} + +function parseVariableDeclaration( + node: OxcNode, + exported: boolean, +): ReadonlyArray { + if (node.type !== "VariableDeclaration") { + return []; + } + + const statements: Array = []; + for (const declarator of nodeArrayField(node, "declarations")) { + if (declarator.type !== "VariableDeclarator") { + continue; + } + + const id = nodeField(declarator, "id"); + const name = id?.type === "Identifier" ? stringField(id, "name") : undefined; + const init = nodeField(declarator, "init"); + if (!name || !init || !isIdentifierName(name)) { + continue; + } + + statements.push({ _tag: "Variable", exported, name, init: parseExpression(init) }); + } + + return statements; +} + +function parseExpression(node: OxcNode | undefined): WorkflowExpression { + const expression = unwrapOuterExpression(node); + if (!expression) { + return { _tag: "Unsupported" }; + } + + switch (expression.type) { + case "Identifier": { + const name = stringField(expression, "name"); + return name ? { _tag: "Identifier", name } : { _tag: "Unsupported" }; + } + case "Literal": { + const value = expression.value; + return typeof value === "string" ? { _tag: "StaticString", value } : { _tag: "Unsupported" }; + } + case "TemplateLiteral": { + return parseStaticTemplateLiteral(expression); + } + case "MemberExpression": { + const property = nodeField(expression, "property"); + const propertyName = + property?.type === "Identifier" ? stringField(property, "name") : literalString(property); + if (!propertyName) { + return { _tag: "Unsupported" }; + } + return { + _tag: "Member", + object: parseExpression(nodeField(expression, "object")), + property: propertyName, + }; + } + case "CallExpression": { + return { + _tag: "Call", + arguments: nodeArrayField(expression, "arguments").map(parseExpression), + callee: parseExpression(nodeField(expression, "callee")), + }; + } + case "ObjectExpression": { + const properties = new Map(); + for (const property of nodeArrayField(expression, "properties")) { + if (property.type !== "Property") { + continue; + } + const key = nodeField(property, "key"); + const propertyName = + key?.type === "Identifier" ? stringField(key, "name") : literalString(key); + if (propertyName) { + properties.set(propertyName, parseExpression(nodeField(property, "value"))); + } + } + return { _tag: "Object", properties }; + } + default: + return { _tag: "Unsupported" }; + } +} + +function parseStaticTemplateLiteral(node: OxcNode): WorkflowExpression { + if (nodeArrayField(node, "expressions").length > 0) { + return { _tag: "Unsupported" }; + } + + const quasi = nodeArrayField(node, "quasis")[0]; + if (!quasi) { + return { _tag: "Unsupported" }; + } + + const value = objectField(quasi, "value"); + const cooked = value ? stringField(value, "cooked") : undefined; + const raw = value ? stringField(value, "raw") : undefined; + return cooked || raw + ? { _tag: "StaticString", value: cooked ?? raw ?? "" } + : { _tag: "Unsupported" }; +} + +function unwrapOuterExpression(node: OxcNode | undefined): OxcNode | undefined { + let current = node; + while ( + current?.type === "ParenthesizedExpression" || + current?.type === "TSAsExpression" || + current?.type === "TSSatisfiesExpression" || + current?.type === "TSNonNullExpression" || + current?.type === "TSTypeAssertion" || + current?.type === "ChainExpression" + ) { + current = nodeField(current, "expression"); + } + return current; +} + +function literalString(node: OxcNode | undefined): string | undefined { + if (node?.type !== "Literal") { + return; + } + return typeof node.value === "string" ? node.value : undefined; +} + +function asOxcNode(value: unknown): OxcNode | undefined { + if (typeof value !== "object" || value === null) { + return; + } + + // SAFETY: Oxc public AST nodes are discriminated by a string `type` field. + const type = (value as { readonly type?: unknown }).type; + return typeof type === "string" ? (value as OxcNode) : undefined; +} + +function nodeField(node: OxcNode, key: string): OxcNode | undefined { + return asOxcNode(node[key]); +} + +function nodeArrayField(node: OxcNode, key: string): ReadonlyArray { + const value = node[key]; + return Array.isArray(value) ? value.flatMap((entry) => asOxcNode(entry) ?? []) : []; +} + +function objectField(node: OxcNode, key: string): OxcRecord | undefined { + const value = node[key]; + // SAFETY: Oxc embeds template quasi values as plain objects with string fields. + return typeof value === "object" && value !== null ? (value as OxcRecord) : undefined; +} + +function stringField(node: OxcRecord, key: string): string | undefined { + const value = node[key]; + return typeof value === "string" ? value : undefined; +} diff --git a/packages/sideffect/src/vite/workflow-discovery-errors.ts b/packages/sideffect/src/vite/workflow-discovery-errors.ts new file mode 100644 index 0000000..cbb3bca --- /dev/null +++ b/packages/sideffect/src/vite/workflow-discovery-errors.ts @@ -0,0 +1,79 @@ +import { Schema } from "effect"; + +/** @internal Expected failure while loading the workflow parser dependency. */ +export class WorkflowParserUnavailable extends Schema.TaggedErrorClass()( + "WorkflowParserUnavailable", + { + cause: Schema.Defect(), + message: Schema.String, + }, +) {} + +/** @internal Expected failure while reading a workflow source file. */ +export class WorkflowSourceReadFailed extends Schema.TaggedErrorClass()( + "WorkflowSourceReadFailed", + { + cause: Schema.Defect(), + filePath: Schema.String, + }, +) {} + +/** @internal Expected failure while parsing a workflow source file. */ +export class WorkflowSourceParseFailed extends Schema.TaggedErrorClass()( + "WorkflowSourceParseFailed", + { + filePath: Schema.String, + message: Schema.String, + }, +) {} + +/** @internal Expected failure while resolving a local workflow re-export. */ +export class WorkflowReExportResolveFailed extends Schema.TaggedErrorClass()( + "WorkflowReExportResolveFailed", + { + filePath: Schema.String, + specifier: Schema.String, + }, +) {} + +/** @internal Expected workflow discovery failures. */ +export type WorkflowDiscoveryFailure = + | WorkflowParserUnavailable + | WorkflowSourceReadFailed + | WorkflowSourceParseFailed + | WorkflowReExportResolveFailed; + +/** @internal Converts typed discovery failures into user-facing Vite/build errors. */ +export function toWorkflowDiscoveryBuildError(error: unknown): Error { + if (error instanceof WorkflowParserUnavailable) { + return new Error( + "Sideffect could not load oxc-parser for workflow discovery, so workflow config generation cannot continue. No workflow config was written. Reinstall dependencies, clear node_modules and the lockfile if needed, then rerun your package manager install.", + { cause: error.cause }, + ); + } + + if (error instanceof WorkflowSourceReadFailed) { + return new Error( + `Sideffect could not read workflow source "${error.filePath}" while generating Cloudflare workflow bindings. No workflow config was written. Check that the file is readable, then rerun the build.`, + { cause: error.cause }, + ); + } + + if (error instanceof WorkflowSourceParseFailed) { + return new Error( + `Sideffect could not parse workflow source "${error.filePath}" with oxc-parser while generating Cloudflare workflow bindings: ${error.message}`, + ); + } + + if (error instanceof WorkflowReExportResolveFailed) { + return new Error( + `Sideffect could not resolve workflow re-export module "${error.specifier}" from "${error.filePath}" while generating Cloudflare workflow bindings. No workflow config was written. Check the local import path or export the workflow layer directly.`, + ); + } + + return error instanceof Error + ? error + : new Error( + `Sideffect workflow discovery failed for an unknown reason. No workflow config was written. Cause: ${String(error)}`, + ); +} diff --git a/packages/sideffect/src/vite/workflow-discovery.ts b/packages/sideffect/src/vite/workflow-discovery.ts index f9d5657..5b16a72 100644 --- a/packages/sideffect/src/vite/workflow-discovery.ts +++ b/packages/sideffect/src/vite/workflow-discovery.ts @@ -1,65 +1,27 @@ -import { existsSync, readdirSync, readFileSync, statSync } from "node:fs"; -import { createRequire } from "node:module"; -import { dirname, extname, join, resolve } from "node:path"; - import { Cause, Effect, Exit } from "effect"; -import type * as TypeScript from "typescript"; +import { dirname, resolve } from "node:path"; import { validateWorkflowExportName } from "../entrypoints.ts"; import type { WorkflowConfigEntry } from "../types.ts"; - -const sourceFileExtensions = new Set([ - ".ts", - ".tsx", - ".mts", - ".cts", - ".js", - ".jsx", - ".mjs", - ".cjs", -]); -const declarationFileExtensions = [".d.ts", ".d.mts", ".d.cts"]; -const identifierName = /^[$A-Z_a-z][$\w]*$/; -type TypeScriptModule = typeof TypeScript; - -class TypeScriptWorkflowDiscoveryError extends Error { - constructor(cause: unknown) { - super( - 'Sideffect workflow discovery requires TypeScript\'s parser, but the "typescript" package could not be resolved. Install TypeScript in the project that uses `sideffect/vite`, for example `npm install -D typescript`. Runtime usage of `sideffect` and `sideffect/cloudflare` is unaffected.', - { cause }, - ); - this.name = "TypeScriptWorkflowDiscoveryError"; - } -} - -const require = createRequire(import.meta.url); -let loadedTypeScript: TypeScriptModule | undefined; - -function loadTypeScript(): TypeScriptModule { - if (loadedTypeScript) { - return loadedTypeScript; - } - - const loaded = Effect.runSyncExit( - Effect.try({ - try: () => require("typescript") as TypeScriptModule, - catch: (cause) => new TypeScriptWorkflowDiscoveryError(cause), - }), - ); - - if (Exit.isSuccess(loaded)) { - loadedTypeScript = loaded.value; - return loaded.value; - } - - throw Cause.squash(loaded.cause); -} - -const ts = new Proxy({} as TypeScriptModule, { - get(_target, property) { - return loadTypeScript()[property as keyof TypeScriptModule]; - }, -}); +import { + formatParserSelection, + makeOxcWorkflowParser, + parseOxcSourceFile, + type WorkflowDiscoveryParserSelection, + type OxcWorkflowParser, +} from "./oxc-parser-adapter.ts"; +import { parseOxcWorkflowModule } from "./oxc-workflow-ast.ts"; +import { + toWorkflowDiscoveryBuildError, + type WorkflowDiscoveryFailure, + WorkflowReExportResolveFailed, +} from "./workflow-discovery-errors.ts"; +import { isLocalSpecifier, resolveSourceFile, sourceFiles } from "./workflow-source-files.ts"; +import { + analyzeWorkflowSourceModule, + type DiscoveredWorkflowExport, + type WorkflowSourceModule, +} from "./workflow-source-analysis.ts"; /** Workflow source paths scanned for static `Workflow.make(...).toLayer(...)` exports. */ export type WorkflowDiscoveryPaths = Array; @@ -90,25 +52,15 @@ export interface CapturedSideffectWorkflow { readonly layer: WorkflowLayerImport; } -/** @internal Static workflow export discovered by TypeScript AST traversal. */ -type DiscoveredWorkflowExport = WorkflowLayerImport & { - /** Cloudflare Workflow name from `Workflow.make({ name })`. */ - readonly workflowName: string; -}; - -/** @internal Local re-export shape followed by workflow discovery. */ -type ReExportDeclaration = - | { - readonly kind: "named"; - readonly specifier: string; - readonly exports: Array<{ readonly imported: string; readonly exported: string }>; - } - | { readonly kind: "all"; readonly specifier: string }; +/** @internal Optional diagnostics used by Vite integration. */ +export interface WorkflowDiscoveryDiagnostics { + readonly onParserSelected?: (selection: WorkflowDiscoveryParserSelection) => void; +} -/** @internal Local import bindings that may reference exported workflow definitions. */ -interface LocalImportDeclaration { - readonly specifier: string; - readonly imports: Array<{ readonly imported: string; readonly local: string }>; +interface CollectWorkflowEntriesInput { + readonly patterns: WorkflowDiscoveryPaths | string; + readonly baseDirectory: string; + readonly diagnostics?: WorkflowDiscoveryDiagnostics; } /** @@ -122,138 +74,165 @@ export function collectWorkflowEntries( patterns: WorkflowDiscoveryPaths | string = ["src/workflows"], baseDirectory: string = process.cwd(), ): Array { - const roots = Array.isArray(patterns) ? patterns : [patterns]; - const byClassName = new Map(); + return runWorkflowDiscovery({ patterns, baseDirectory }); +} - for (const pattern of roots) { - const root = resolve(baseDirectory, pattern.replace(/\*.*$/, "")); - for (const filePath of sourceFiles(root)) { - for (const workflow of collectWorkflowExportsFromFile(filePath, new Set()).values()) { - const className = workflow.workflowName - .split(/[^A-Z_a-z0-9]+/) - .filter(Boolean) - .map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`) - .join(""); - validateWorkflowExportName(className); - - const modulePath = workflow.modulePath.replace(/\\/g, "/"); - byClassName.set(className, { - kind: "sideffect", - config: { - binding: workflow.workflowName - .replace(/([a-z0-9])([A-Z])/g, "$1_$2") - .replace(/([A-Z])([A-Z][a-z])/g, "$1_$2") - .replace(/[^A-Z_a-z0-9]+/g, "_") - .toUpperCase(), - name: workflow.workflowName, - class_name: className, - }, - layer: - workflow.exportKind === "default" - ? { modulePath, exportKind: "default", exportName: "default" } - : { modulePath, exportKind: "named", exportName: workflow.exportName }, - }); - } - } +/** @internal Vite-facing discovery API with parser-selection diagnostics. */ +export function collectWorkflowEntriesForVite( + patterns: WorkflowDiscoveryPaths | string = ["src/workflows"], + baseDirectory: string = process.cwd(), + diagnostics: WorkflowDiscoveryDiagnostics = {}, +): Array { + return runWorkflowDiscovery({ patterns, baseDirectory, diagnostics }); +} + +/** @internal Formats parser selection for Vite diagnostics. */ +export { formatParserSelection }; +export type { WorkflowDiscoveryParserSelection }; + +function runWorkflowDiscovery( + input: CollectWorkflowEntriesInput, +): Array { + const exit = Effect.runSyncExit(collectWorkflowEntriesEffect(input)); + if (Exit.isSuccess(exit)) { + return exit.value; } - return [...byClassName.values()]; + throw toWorkflowDiscoveryBuildError(Cause.squash(exit.cause)); } -function sourceFiles(path: string): Array { - const stats = statSync(path, { throwIfNoEntry: false }); - if (!stats) { +const collectWorkflowEntriesEffect = Effect.fnUntraced(function* ( + input: CollectWorkflowEntriesInput, +): Effect.fn.Return, WorkflowDiscoveryFailure> { + const files = workflowSourceFiles(input.patterns, input.baseDirectory); + if (files.length === 0) { return []; } - if (stats.isFile()) { - return isSourceFile(path) ? [path] : []; - } + const parser = yield* makeOxcWorkflowParser(); + input.diagnostics?.onParserSelected?.(parser.selection); - if (!stats.isDirectory()) { - return []; + const byClassName = new Map(); + const moduleCache = new Map(); + for (const filePath of files) { + const workflows = yield* collectWorkflowExportsFromFile( + filePath, + new Set(), + parser, + moduleCache, + ); + for (const workflow of workflows.values()) { + const captured = captureDiscoveredWorkflow(workflow); + byClassName.set(captured.config.class_name, captured); + } } - return readdirSync(path, { withFileTypes: true }) - .sort((left, right) => left.name.localeCompare(right.name)) - .flatMap((entry) => { - const child = join(path, entry.name); - if (entry.isDirectory()) { - return sourceFiles(child); - } - if ( - entry.isFile() && - sourceFileExtensions.has(extname(child)) && - !declarationFileExtensions.some((extension) => child.endsWith(extension)) - ) { - return [child]; - } - return []; - }); -} + return [...byClassName.values()]; +}); -function isSourceFile(path: string): boolean { - return ( - sourceFileExtensions.has(extname(path)) && - !declarationFileExtensions.some((extension) => path.endsWith(extension)) - ); +function workflowSourceFiles( + patterns: WorkflowDiscoveryPaths | string, + baseDirectory: string, +): Array { + const roots = Array.isArray(patterns) ? patterns : [patterns]; + return roots.flatMap((pattern) => { + const root = resolve(baseDirectory, pattern.replace(/\*.*$/, "")); + return sourceFiles(root); + }); } -function collectWorkflowExportsFromFile( +const collectWorkflowExportsFromFile: ( filePath: string, visited: Set, -): Map { - if (visited.has(filePath)) { - return new Map(); - } - visited.add(filePath); + parser: OxcWorkflowParser, + moduleCache: Map, +) => Effect.Effect, WorkflowDiscoveryFailure> = + Effect.fnUntraced(function* ( + filePath: string, + visited: Set, + parser: OxcWorkflowParser, + moduleCache: Map, + ) { + if (visited.has(filePath)) { + return new Map(); + } + visited.add(filePath); + + const module = yield* parseWorkflowModule(filePath, parser, moduleCache); + const importedDefinitions = yield* collectImportedWorkflowDefinitions( + module, + filePath, + new Set(), + parser, + moduleCache, + ); + const analysis = analyzeWorkflowSourceModule(filePath, module, importedDefinitions); + const exports = new Map(analysis.exports); - const analysis = analyzeWorkflowSourceFile(filePath, new Set()); - const exports = new Map(analysis.exports); + for (const reExport of analysis.reExports) { + if (!isLocalSpecifier(reExport.specifier)) { + continue; + } - for (const reExport of analysis.reExports) { - if (!isLocalSpecifier(reExport.specifier)) { - continue; - } + const resolved = resolveSourceFile(dirname(filePath), reExport.specifier); + if (!resolved) { + return yield* new WorkflowReExportResolveFailed({ + filePath, + specifier: reExport.specifier, + }); + } - const resolved = resolveSourceFile(dirname(filePath), reExport.specifier); - if (!resolved) { - throw new Error( - `Sideffect could not resolve workflow re-export module "${reExport.specifier}" from "${filePath}" while generating Cloudflare workflow bindings.`, + const targetExports = yield* collectWorkflowExportsFromFile( + resolved, + visited, + parser, + moduleCache, ); - } - - const targetExports = collectWorkflowExportsFromFile(resolved, visited); - if (reExport.kind === "all") { - for (const [exportName, workflow] of targetExports) { - if (exportName !== "default") { - exports.set(exportName, workflow); + if (reExport.kind === "all") { + for (const [exportName, workflow] of targetExports) { + if (exportName !== "default") { + exports.set(exportName, workflow); + } } + continue; } - continue; - } - for (const exportEntry of reExport.exports) { - const workflow = targetExports.get(exportEntry.imported); - if (workflow) { - exports.set(exportEntry.exported, workflow); + for (const exportEntry of reExport.exports) { + const workflow = targetExports.get(exportEntry.imported); + if (workflow) { + exports.set(exportEntry.exported, workflow); + } } } - } - return exports; -} + return exports; + }); -function collectWorkflowDefinitionExportsFromFile( +const collectWorkflowDefinitionExportsFromFile: ( filePath: string, visited: Set, -): Map { + parser: OxcWorkflowParser, + moduleCache: Map, +) => Effect.Effect, WorkflowDiscoveryFailure> = Effect.fnUntraced(function* ( + filePath: string, + visited: Set, + parser: OxcWorkflowParser, + moduleCache: Map, +) { if (visited.has(filePath)) { - return new Map(); + return new Map(); } visited.add(filePath); - const analysis = analyzeWorkflowSourceFile(filePath, visited); + const module = yield* parseWorkflowModule(filePath, parser, moduleCache); + const importedDefinitions = yield* collectImportedWorkflowDefinitions( + module, + filePath, + visited, + parser, + moduleCache, + ); + const analysis = analyzeWorkflowSourceModule(filePath, module, importedDefinitions); const exports = new Map(analysis.definitionExports); for (const reExport of analysis.reExports) { @@ -266,7 +245,12 @@ function collectWorkflowDefinitionExportsFromFile( continue; } - const targetExports = collectWorkflowDefinitionExportsFromFile(resolved, visited); + const targetExports = yield* collectWorkflowDefinitionExportsFromFile( + resolved, + visited, + parser, + moduleCache, + ); if (reExport.kind === "all") { for (const [exportName, workflowName] of targetExports) { if (exportName !== "default") { @@ -285,222 +269,35 @@ function collectWorkflowDefinitionExportsFromFile( } return exports; -} +}); -function analyzeWorkflowSourceFile( +const collectImportedWorkflowDefinitions: ( + module: WorkflowSourceModule, filePath: string, - definitionVisited: Set, -): { - readonly exports: Map; - readonly definitionExports: Map; - readonly reExports: Array; -} { - const source = readFileSync(filePath, "utf8"); - const sourceFile = ts.createSourceFile( - filePath, - source, - ts.ScriptTarget.Latest, - false, - scriptKindForFile(filePath), - ); - const workflowBindings = collectWorkflowBindings(sourceFile); - const workflowDefinitions = new Map(); - const workflowLayers = new Map(); - const exports = new Map(); - const definitionExports = new Map(); - const reExports: Array = []; - - for (const [name, workflowName] of collectImportedWorkflowDefinitions( - sourceFile, - filePath, - definitionVisited, - )) { - workflowDefinitions.set(name, workflowName); - } - - for (const statement of sourceFile.statements) { - if (ts.isVariableStatement(statement)) { - const exported = - statement.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword) ?? - false; - - for (const declaration of statement.declarationList.declarations) { - if (!ts.isIdentifier(declaration.name) || !declaration.initializer) { - continue; - } - - const name = declaration.name.text; - const workflowName = workflowNameFromMakeCall(declaration.initializer, workflowBindings); - if (workflowName) { - workflowDefinitions.set(name, workflowName); - if (exported) { - definitionExports.set(name, workflowName); - } - continue; - } - - const layerWorkflowName = workflowNameFromLayerExpression( - declaration.initializer, - workflowBindings, - workflowDefinitions, - ); - if (!layerWorkflowName) { - continue; - } - - workflowLayers.set(name, layerWorkflowName); - if (exported) { - exports.set(name, { - workflowName: layerWorkflowName, - modulePath: filePath, - exportKind: "named", - exportName: name, - }); - } - } - continue; - } - - if (ts.isExportAssignment(statement)) { - if (statement.isExportEquals) { - continue; - } - - const expression = skipOuterExpressions(statement.expression); - const layerWorkflowName = - workflowNameFromLayerExpression(expression, workflowBindings, workflowDefinitions) ?? - (ts.isIdentifier(expression) ? workflowLayers.get(expression.text) : undefined); - if (layerWorkflowName) { - exports.set("default", { - workflowName: layerWorkflowName, - modulePath: filePath, - exportKind: "default", - exportName: "default", - }); - continue; - } - - const workflowName = ts.isIdentifier(expression) - ? workflowDefinitions.get(expression.text) - : workflowNameFromMakeCall(expression, workflowBindings); - if (workflowName) { - definitionExports.set("default", workflowName); - } - continue; - } - - if (!ts.isExportDeclaration(statement)) { - continue; - } - - const specifier = - statement.moduleSpecifier && ts.isStringLiteral(statement.moduleSpecifier) - ? statement.moduleSpecifier.text - : undefined; - if (specifier) { - const exportClause = statement.exportClause; - if (!exportClause) { - reExports.push({ kind: "all", specifier }); - } else if (ts.isNamedExports(exportClause)) { - const namedExports = exportSpecifierNames(statement, exportClause); - if (namedExports.length > 0) { - reExports.push({ kind: "named", specifier, exports: namedExports }); - } - } - continue; - } - - if ( - statement.isTypeOnly || - !statement.exportClause || - !ts.isNamedExports(statement.exportClause) - ) { - continue; - } - - for (const exportEntry of exportSpecifierNames(statement, statement.exportClause)) { - const workflowName = workflowLayers.get(exportEntry.imported); - if (workflowName) { - exports.set( - exportEntry.exported, - exportEntry.exported === "default" - ? { - workflowName, - modulePath: filePath, - exportKind: "default", - exportName: "default", - } - : { - workflowName, - modulePath: filePath, - exportKind: "named", - exportName: exportEntry.exported, - }, - ); - } - - const definitionWorkflowName = workflowDefinitions.get(exportEntry.imported); - if (definitionWorkflowName) { - definitionExports.set(exportEntry.exported, definitionWorkflowName); - } - } - } - - return { exports, definitionExports, reExports }; -} - -function collectWorkflowBindings(sourceFile: TypeScript.SourceFile): { - readonly names: Set; - readonly namespaces: Set; -} { - const names = new Set(["Workflow"]); - const namespaces = new Set(); - - for (const statement of sourceFile.statements) { - if ( - !ts.isImportDeclaration(statement) || - !statement.moduleSpecifier || - !ts.isStringLiteral(statement.moduleSpecifier) || - statement.moduleSpecifier.text !== "sideffect" - ) { - continue; - } - - const namedBindings = statement.importClause?.namedBindings; - if (!namedBindings) { - continue; - } - - if (ts.isNamespaceImport(namedBindings)) { - namespaces.add(namedBindings.name.text); - continue; - } - - for (const element of namedBindings.elements) { - const imported = element.propertyName?.text ?? element.name.text; - if (imported === "Workflow") { - names.add(element.name.text); - } - } - } - - return { names, namespaces }; -} - -function collectImportedWorkflowDefinitions( - sourceFile: TypeScript.SourceFile, + visited: Set, + parser: OxcWorkflowParser, + moduleCache: Map, +) => Effect.Effect, WorkflowDiscoveryFailure> = Effect.fnUntraced(function* ( + module: WorkflowSourceModule, filePath: string, visited: Set, -): Map { + parser: OxcWorkflowParser, + moduleCache: Map, +) { const definitions = new Map(); - for (const importDeclaration of collectLocalImports(sourceFile)) { + for (const importDeclaration of module.imports) { const resolved = resolveSourceFile(dirname(filePath), importDeclaration.specifier); if (!resolved) { continue; } - const targetDefinitions = collectWorkflowDefinitionExportsFromFile(resolved, visited); + const targetDefinitions = yield* collectWorkflowDefinitionExportsFromFile( + resolved, + visited, + parser, + moduleCache, + ); for (const importEntry of importDeclaration.imports) { const workflowName = targetDefinitions.get(importEntry.imported); if (workflowName) { @@ -510,212 +307,51 @@ function collectImportedWorkflowDefinitions( } return definitions; -} - -function collectLocalImports(sourceFile: TypeScript.SourceFile): Array { - return sourceFile.statements.flatMap((statement) => { - if ( - !ts.isImportDeclaration(statement) || - statement.importClause?.isTypeOnly || - !statement.moduleSpecifier || - !ts.isStringLiteral(statement.moduleSpecifier) || - !isLocalSpecifier(statement.moduleSpecifier.text) - ) { - return []; - } - - const imports: Array<{ readonly imported: string; readonly local: string }> = []; - const importClause = statement.importClause; - if (!importClause) { - return []; - } - - if (importClause.name && identifierName.test(importClause.name.text)) { - imports.push({ imported: "default", local: importClause.name.text }); - } - - const namedBindings = importClause.namedBindings; - if (!namedBindings || ts.isNamespaceImport(namedBindings)) { - return imports.length > 0 ? [{ specifier: statement.moduleSpecifier.text, imports }] : []; - } - - for (const element of namedBindings.elements) { - if (element.isTypeOnly) { - continue; - } - - const importedName = element.propertyName ?? element.name; - const imported = ts.isIdentifier(importedName) ? importedName.text : undefined; - const local = element.name.text; - if (imported && identifierName.test(imported) && identifierName.test(local)) { - imports.push({ imported, local }); - } - } - - return imports.length > 0 ? [{ specifier: statement.moduleSpecifier.text, imports }] : []; - }); -} - -function workflowNameFromLayerExpression( - expression: TypeScript.Expression, - workflowBindings: { readonly names: Set; readonly namespaces: Set }, - workflowDefinitions: Map, -): string | undefined { - const call = skipOuterExpressions(expression); - if (!ts.isCallExpression(call)) { - return; - } - - const callee = skipOuterExpressions(call.expression); - if (!ts.isPropertyAccessExpression(callee) || callee.name.text !== "toLayer") { - return; - } - - const receiver = skipOuterExpressions(callee.expression); - if (ts.isIdentifier(receiver)) { - return workflowDefinitions.get(receiver.text); - } - - return workflowNameFromMakeCall(receiver, workflowBindings); -} - -function workflowNameFromMakeCall( - expression: TypeScript.Expression, - workflowBindings: { readonly names: Set; readonly namespaces: Set }, -): string | undefined { - const call = skipOuterExpressions(expression); - if (!ts.isCallExpression(call)) { - return; - } - - const callee = skipOuterExpressions(call.expression); - if (!ts.isPropertyAccessExpression(callee) || callee.name.text !== "make") { - return; - } - - const receiver = skipOuterExpressions(callee.expression); - const isWorkflowMake = ts.isIdentifier(receiver) - ? workflowBindings.names.has(receiver.text) - : ts.isPropertyAccessExpression(receiver) && - receiver.name.text === "Workflow" && - ts.isIdentifier(receiver.expression) && - workflowBindings.namespaces.has(receiver.expression.text); - if (!isWorkflowMake) { - return; - } - - const options = call.arguments[0]; - if (!options) { - return; - } - - const object = skipOuterExpressions(options); - if (!ts.isObjectLiteralExpression(object)) { - return; - } - - for (const property of object.properties) { - if (!ts.isPropertyAssignment(property)) { - continue; - } - - const name = property.name; - if ( - !( - (ts.isIdentifier(name) && name.text === "name") || - (ts.isStringLiteral(name) && name.text === "name") - ) - ) { - continue; - } - - const value = skipOuterExpressions(property.initializer); - if (ts.isStringLiteral(value) || ts.isNoSubstitutionTemplateLiteral(value)) { - return value.text; - } - } -} - -function exportSpecifierNames( - declaration: TypeScript.ExportDeclaration, - exports: TypeScript.NamedExports, -): Array<{ readonly imported: string; readonly exported: string }> { - if (declaration.isTypeOnly) { - return []; - } - - return exports.elements.flatMap((element) => { - if (element.isTypeOnly) { - return []; - } - - const importedName = element.propertyName ?? element.name; - const exportedName = element.name; - const imported = - ts.isIdentifier(importedName) && identifierName.test(importedName.text) - ? importedName.text - : undefined; - const exported = - ts.isIdentifier(exportedName) && identifierName.test(exportedName.text) - ? exportedName.text - : undefined; - - return imported && exported ? [{ imported, exported }] : []; - }); -} - -function isLocalSpecifier(specifier: string): boolean { - return specifier.startsWith(".") || specifier.startsWith("/"); -} +}); -function skipOuterExpressions(expression: TypeScript.Expression): TypeScript.Expression { - let current = expression; - while ( - ts.isParenthesizedExpression(current) || - ts.isAsExpression(current) || - ts.isSatisfiesExpression(current) || - ts.isNonNullExpression(current) || - ts.isTypeAssertionExpression(current) - ) { - current = current.expression; +const parseWorkflowModule: ( + filePath: string, + parser: OxcWorkflowParser, + moduleCache: Map, +) => Effect.Effect = Effect.fnUntraced(function* ( + filePath: string, + parser: OxcWorkflowParser, + moduleCache: Map, +) { + const cached = moduleCache.get(filePath); + if (cached) { + return cached; } - return current; -} -function scriptKindForFile(path: string): TypeScript.ScriptKind { - switch (extname(path)) { - case ".tsx": - return ts.ScriptKind.TSX; - case ".jsx": - return ts.ScriptKind.JSX; - case ".js": - case ".mjs": - case ".cjs": - return ts.ScriptKind.JS; - case ".ts": - case ".mts": - case ".cts": - return ts.ScriptKind.TS; - default: - return ts.ScriptKind.Unknown; - } -} + const parsed = yield* parseOxcSourceFile(parser, filePath); + const module = parseOxcWorkflowModule(parsed.program, parsed.module); + moduleCache.set(filePath, module); + return module; +}); -function resolveSourceFile(baseDirectory: string, specifier: string): string | undefined { - const basePath = resolve(baseDirectory, specifier); - const candidates = extname(basePath) - ? [basePath] - : [ - basePath, - `${basePath}.ts`, - `${basePath}.tsx`, - `${basePath}.js`, - `${basePath}.jsx`, - join(basePath, "index.ts"), - join(basePath, "index.tsx"), - join(basePath, "index.js"), - join(basePath, "index.jsx"), - ]; - - return candidates.find((candidate) => existsSync(candidate)); +function captureDiscoveredWorkflow(workflow: DiscoveredWorkflowExport): CapturedSideffectWorkflow { + const className = workflow.workflowName + .split(/[^A-Z_a-z0-9]+/) + .filter(Boolean) + .map((part) => `${part[0]?.toUpperCase() ?? ""}${part.slice(1)}`) + .join(""); + validateWorkflowExportName(className); + + const modulePath = workflow.modulePath.replace(/\\/g, "/"); + return { + kind: "sideffect", + config: { + binding: workflow.workflowName + .replace(/([a-z0-9])([A-Z])/g, "$1_$2") + .replace(/([A-Z])([A-Z][a-z])/g, "$1_$2") + .replace(/[^A-Z_a-z0-9]+/g, "_") + .toUpperCase(), + name: workflow.workflowName, + class_name: className, + }, + layer: + workflow.exportKind === "default" + ? { modulePath, exportKind: "default", exportName: "default" } + : { modulePath, exportKind: "named", exportName: workflow.exportName }, + }; } diff --git a/packages/sideffect/src/vite/workflow-source-analysis.ts b/packages/sideffect/src/vite/workflow-source-analysis.ts new file mode 100644 index 0000000..0096af4 --- /dev/null +++ b/packages/sideffect/src/vite/workflow-source-analysis.ts @@ -0,0 +1,291 @@ +import type { WorkflowLayerImport } from "./workflow-discovery.ts"; + +const identifierName = /^[$A-Z_a-z][$\w]*$/; + +/** @internal Static workflow export discovered from a parsed source module. */ +export type DiscoveredWorkflowExport = WorkflowLayerImport & { + /** Cloudflare Workflow name from `Workflow.make({ name })`. */ + readonly workflowName: string; +}; + +/** @internal Local re-export shape followed by workflow discovery. */ +export type ReExportDeclaration = + | { + readonly kind: "named"; + readonly specifier: string; + readonly exports: ReadonlyArray<{ readonly imported: string; readonly exported: string }>; + } + | { readonly kind: "all"; readonly specifier: string }; + +/** @internal Local import bindings that may reference exported workflow definitions. */ +export interface LocalImportDeclaration { + readonly specifier: string; + readonly imports: ReadonlyArray<{ readonly imported: string; readonly local: string }>; +} + +/** @internal Names that can reference the Sideffect Workflow namespace/value. */ +export interface WorkflowBindings { + readonly names: ReadonlySet; + readonly namespaces: ReadonlySet; +} + +/** @internal Parsed source module used by the pure workflow analyzer. */ +export interface WorkflowSourceModule { + readonly workflowBindings: WorkflowBindings; + readonly imports: ReadonlyArray; + readonly reExports: ReadonlyArray; + readonly statements: ReadonlyArray; +} + +/** @internal Parsed source statements relevant to workflow discovery. */ +export type WorkflowStatement = + | { + readonly _tag: "Variable"; + readonly exported: boolean; + readonly name: string; + readonly init: WorkflowExpression; + } + | { readonly _tag: "ExportDefault"; readonly expression: WorkflowExpression } + | { + readonly _tag: "ExportSpecifiers"; + readonly specifiers: ReadonlyArray<{ readonly imported: string; readonly exported: string }>; + }; + +/** @internal Parsed expression subset needed by workflow discovery. */ +export type WorkflowExpression = + | { readonly _tag: "Identifier"; readonly name: string } + | { readonly _tag: "Member"; readonly object: WorkflowExpression; readonly property: string } + | { + readonly _tag: "Call"; + readonly callee: WorkflowExpression; + readonly arguments: ReadonlyArray; + } + | { readonly _tag: "Object"; readonly properties: ReadonlyMap } + | { readonly _tag: "StaticString"; readonly value: string } + | { readonly _tag: "Unsupported" }; + +/** @internal Result of analyzing one parsed workflow source module. */ +export interface WorkflowSourceAnalysis { + readonly exports: Map; + readonly definitionExports: Map; + readonly reExports: ReadonlyArray; +} + +/** @internal Finds workflow definitions and workflow layer exports in a parsed module. */ +export function analyzeWorkflowSourceModule( + filePath: string, + module: WorkflowSourceModule, + importedWorkflowDefinitions: ReadonlyMap, +): WorkflowSourceAnalysis { + const workflowDefinitions = new Map(importedWorkflowDefinitions); + const workflowLayers = new Map(); + const exports = new Map(); + const definitionExports = new Map(); + + for (const statement of module.statements) { + switch (statement._tag) { + case "Variable": { + collectVariableStatement( + statement, + filePath, + module.workflowBindings, + workflowDefinitions, + workflowLayers, + exports, + definitionExports, + ); + break; + } + case "ExportDefault": { + collectDefaultExport( + statement.expression, + filePath, + module.workflowBindings, + workflowDefinitions, + workflowLayers, + exports, + definitionExports, + ); + break; + } + case "ExportSpecifiers": { + collectExportSpecifiers( + statement.specifiers, + filePath, + workflowDefinitions, + workflowLayers, + exports, + definitionExports, + ); + break; + } + } + } + + return { exports, definitionExports, reExports: module.reExports }; +} + +function collectVariableStatement( + statement: Extract, + filePath: string, + workflowBindings: WorkflowBindings, + workflowDefinitions: Map, + workflowLayers: Map, + exports: Map, + definitionExports: Map, +): void { + const workflowName = workflowNameFromMakeCall(statement.init, workflowBindings); + if (workflowName) { + workflowDefinitions.set(statement.name, workflowName); + if (statement.exported) { + definitionExports.set(statement.name, workflowName); + } + return; + } + + const layerWorkflowName = workflowNameFromLayerExpression( + statement.init, + workflowBindings, + workflowDefinitions, + ); + if (!layerWorkflowName) { + return; + } + + workflowLayers.set(statement.name, layerWorkflowName); + if (statement.exported) { + exports.set(statement.name, { + workflowName: layerWorkflowName, + modulePath: filePath, + exportKind: "named", + exportName: statement.name, + }); + } +} + +function collectDefaultExport( + expression: WorkflowExpression, + filePath: string, + workflowBindings: WorkflowBindings, + workflowDefinitions: Map, + workflowLayers: Map, + exports: Map, + definitionExports: Map, +): void { + const layerWorkflowName = + workflowNameFromLayerExpression(expression, workflowBindings, workflowDefinitions) ?? + (expression._tag === "Identifier" ? workflowLayers.get(expression.name) : undefined); + if (layerWorkflowName) { + exports.set("default", { + workflowName: layerWorkflowName, + modulePath: filePath, + exportKind: "default", + exportName: "default", + }); + return; + } + + const workflowName = + expression._tag === "Identifier" + ? workflowDefinitions.get(expression.name) + : workflowNameFromMakeCall(expression, workflowBindings); + if (workflowName) { + definitionExports.set("default", workflowName); + } +} + +function collectExportSpecifiers( + specifiers: ReadonlyArray<{ readonly imported: string; readonly exported: string }>, + filePath: string, + workflowDefinitions: Map, + workflowLayers: Map, + exports: Map, + definitionExports: Map, +): void { + for (const exportEntry of specifiers) { + const workflowName = workflowLayers.get(exportEntry.imported); + if (workflowName) { + exports.set( + exportEntry.exported, + exportEntry.exported === "default" + ? { workflowName, modulePath: filePath, exportKind: "default", exportName: "default" } + : { + workflowName, + modulePath: filePath, + exportKind: "named", + exportName: exportEntry.exported, + }, + ); + } + + const definitionWorkflowName = workflowDefinitions.get(exportEntry.imported); + if (definitionWorkflowName) { + definitionExports.set(exportEntry.exported, definitionWorkflowName); + } + } +} + +function workflowNameFromLayerExpression( + expression: WorkflowExpression, + workflowBindings: WorkflowBindings, + workflowDefinitions: ReadonlyMap, +): string | undefined { + if (expression._tag !== "Call" || !isMemberNamed(expression.callee, "toLayer")) { + return; + } + + const receiver = expression.callee.object; + if (receiver._tag === "Identifier") { + return workflowDefinitions.get(receiver.name); + } + + return workflowNameFromMakeCall(receiver, workflowBindings); +} + +function workflowNameFromMakeCall( + expression: WorkflowExpression, + workflowBindings: WorkflowBindings, +): string | undefined { + if (expression._tag !== "Call" || !isMemberNamed(expression.callee, "make")) { + return; + } + + if (!isWorkflowReceiver(expression.callee.object, workflowBindings)) { + return; + } + + const options = expression.arguments[0]; + if (options?._tag !== "Object") { + return; + } + + const name = options.properties.get("name"); + return name?._tag === "StaticString" ? name.value : undefined; +} + +function isWorkflowReceiver( + expression: WorkflowExpression, + workflowBindings: WorkflowBindings, +): boolean { + if (expression._tag === "Identifier") { + return workflowBindings.names.has(expression.name); + } + + return ( + isMemberNamed(expression, "Workflow") && + expression.object._tag === "Identifier" && + workflowBindings.namespaces.has(expression.object.name) + ); +} + +function isMemberNamed( + expression: WorkflowExpression, + property: string, +): expression is Extract { + return expression._tag === "Member" && expression.property === property; +} + +/** @internal Checks whether a parsed import/export binding is a valid identifier. */ +export function isIdentifierName(value: string): boolean { + return identifierName.test(value); +} diff --git a/packages/sideffect/src/vite/workflow-source-files.ts b/packages/sideffect/src/vite/workflow-source-files.ts new file mode 100644 index 0000000..3ab4588 --- /dev/null +++ b/packages/sideffect/src/vite/workflow-source-files.ts @@ -0,0 +1,75 @@ +import { existsSync, readdirSync, statSync } from "node:fs"; +import { extname, join, resolve } from "node:path"; + +const sourceFileExtensions = new Set([ + ".ts", + ".tsx", + ".mts", + ".cts", + ".js", + ".jsx", + ".mjs", + ".cjs", +]); +const declarationFileExtensions = [".d.ts", ".d.mts", ".d.cts"]; + +/** @internal Returns source files under a file or directory path in deterministic order. */ +export function sourceFiles(path: string): Array { + const stats = statSync(path, { throwIfNoEntry: false }); + if (!stats) { + return []; + } + + if (stats.isFile()) { + return isSourceFile(path) ? [path] : []; + } + + if (!stats.isDirectory()) { + return []; + } + + return readdirSync(path, { withFileTypes: true }) + .sort((left, right) => left.name.localeCompare(right.name)) + .flatMap((entry) => { + const child = join(path, entry.name); + if (entry.isDirectory()) { + return sourceFiles(child); + } + if (entry.isFile() && isSourceFile(child)) { + return [child]; + } + return []; + }); +} + +/** @internal Checks whether a module specifier is local to the current project. */ +export function isLocalSpecifier(specifier: string): boolean { + return specifier.startsWith(".") || specifier.startsWith("/"); +} + +/** @internal Resolves a local source module specifier to a source file. */ +export function resolveSourceFile(baseDirectory: string, specifier: string): string | undefined { + const basePath = resolve(baseDirectory, specifier); + const candidates = extname(basePath) + ? [basePath] + : [ + basePath, + `${basePath}.ts`, + `${basePath}.tsx`, + `${basePath}.js`, + `${basePath}.jsx`, + join(basePath, "index.ts"), + join(basePath, "index.tsx"), + join(basePath, "index.js"), + join(basePath, "index.jsx"), + ]; + + return candidates.find((candidate) => existsSync(candidate)); +} + +function isSourceFile(path: string): boolean { + return ( + sourceFileExtensions.has(extname(path)) && + !declarationFileExtensions.some((extension) => path.endsWith(extension)) + ); +} diff --git a/packages/sideffect/tests/index.test.ts b/packages/sideffect/tests/index.test.ts index 5613092..4c2da0d 100644 --- a/packages/sideffect/tests/index.test.ts +++ b/packages/sideffect/tests/index.test.ts @@ -97,7 +97,13 @@ function fakeWorkflowEvent( }; } -function callConfigResolved(plugin: SideffectWorkflowsPlugin, config: { readonly root: string }) { +function callConfigResolved( + plugin: SideffectWorkflowsPlugin, + config: { + readonly root: string; + readonly logger?: { readonly info?: (message: string) => void }; + }, +) { const hook = (plugin as any)["configResolved"]; return typeof hook === "function" ? hook(config) : hook?.handler?.(config); } @@ -760,6 +766,40 @@ test("Sideffect workflows plugin discovers workflows from Vite root before confi }, )); +test("Sideffect workflows plugin logs selected Oxc parser once through Vite logger", () => + withTempProject( + { + "src/index.ts": `export default { async fetch() { return new Response("ok"); } };`, + "src/workflows/my-workflow.ts": ` + import { Schema, Workflow } from "sideffect"; + export const layer = Workflow.make({ name: "my-workflow", payload: Schema.String }).toLayer(async () => undefined); + `, + }, + (root) => { + const logs: Array = []; + const plugin = createSideffectWorkflowsPlugin(); + if (typeof plugin.cloudflare.config !== "function") { + throw new Error("Expected cloudflare config customizer"); + } + + callConfig(plugin, { root }); + plugin.cloudflare.config({ main: "src/index.ts" }); + expect(logs).toEqual([]); + + callConfigResolved(plugin, { + root, + logger: { info: (message) => logs.push(message) }, + }); + callConfigResolved(plugin, { + root, + logger: { info: (message) => logs.push(message) }, + }); + + expect(logs).toHaveLength(1); + expect(logs[0]).toMatch(/^\[sideffect\] workflow discovery parser: oxc /); + }, + )); + test("Sideffect workflows plugin imports default workflow layers in generated entry and env types", () => withTempProject( { @@ -988,6 +1028,20 @@ test("workflow collector follows local workflow re-export chains", () => }, )); +test("workflow collector does not treat empty re-exports as export all", () => + withTempProject( + { + "src/workflows/index.ts": `export {} from "./hidden";`, + "src/workflows/hidden.ts": ` + import { Schema, Workflow } from "sideffect"; + export const layer = Workflow.make({ name: "hidden", payload: Schema.String }).toLayer(async () => undefined); + `, + }, + (root) => { + expect(collectWorkflowEntries("src/workflows/index.ts", root)).toEqual([]); + }, + )); + test("workflow collector does not hang on re-export cycles", () => withTempProject( { diff --git a/workbench/typescript-ast-bench/package.json b/workbench/typescript-ast-bench/package.json new file mode 100644 index 0000000..c1ff895 --- /dev/null +++ b/workbench/typescript-ast-bench/package.json @@ -0,0 +1,17 @@ +{ + "name": "typescript-ast-bench", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "bench": "bun run src/ast-bench.ts", + "check": "vp check" + }, + "devDependencies": { + "@swc/core": "1.15.43", + "@types/node": "25.6.2", + "oxc-parser": "catalog:", + "typescript": "catalog:", + "vite-plus": "catalog:" + } +} diff --git a/workbench/typescript-ast-bench/src/ast-bench.ts b/workbench/typescript-ast-bench/src/ast-bench.ts new file mode 100644 index 0000000..0fde9f5 --- /dev/null +++ b/workbench/typescript-ast-bench/src/ast-bench.ts @@ -0,0 +1,1485 @@ +import { existsSync, readdirSync, readFileSync, statSync } from "node:fs"; +import { createRequire } from "node:module"; +import { extname, join, resolve } from "node:path"; +import { performance } from "node:perf_hooks"; + +import type { EcmaScriptModule, Program as OxcProgram } from "oxc-parser"; +import type * as TypeScript from "typescript"; + +type TypeScriptModule = typeof TypeScript; +type SourceFile = TypeScript.SourceFile; +type ParsedSourceFile = SourceFile | OxcSourceFile | SwcSourceFile; + +interface OxcSourceFile { + readonly program: OxcProgram; + readonly module: EcmaScriptModule; +} + +interface SwcSourceFile { + readonly program: unknown; +} + +interface Options { + readonly root: string; + readonly fixture: "files" | "generated"; + readonly files: number; + readonly workflowsPerFile: number; + readonly iterations: number; + readonly warmup: number; +} + +interface SourceEntry { + readonly path: string; + readonly source: string; + readonly bytes: number; + readonly lines: number; +} + +interface CompilerAdapter { + readonly kind: "typescript" | "oxc" | "swc"; + readonly packageName: string; + readonly version: string; + readonly ts?: TypeScriptModule; + readonly parseCorpus: ( + corpus: ReadonlyArray, + ) => Promise>; + readonly close: () => void; +} + +interface CaseResult { + readonly packageName: string; + readonly version: string; + readonly caseName: string; + readonly files: number; + readonly bytes: number; + readonly lines: number; + readonly iterations: number; + readonly warmup: number; + readonly totalMs: number; + readonly meanMs: number; + readonly msPerMb: number; + readonly observations: number; +} + +type BenchCase = { + readonly name: string; + readonly run: (compiler: CompilerAdapter, corpus: ReadonlyArray) => Promise; +}; + +const sourceFileExtensions = new Set([".ts", ".tsx", ".mts", ".cts", ".js", ".jsx"]); +const declarationFileExtensions = [".d.ts", ".d.mts", ".d.cts"]; +const ignoredDirectories = new Set([".git", ".jj", ".wrangler", "dist", "node_modules"]); +const identifierName = /^[$A-Z_a-z][$\w]*$/; +const require = createRequire(import.meta.url); + +const cases: ReadonlyArray = [ + { + name: "parse-only", + run: async (compiler, corpus) => (await compiler.parseCorpus(corpus)).length, + }, + { + name: "parse-and-walk", + run: async (compiler, corpus) => { + let visited = 0; + const parsed = await compiler.parseCorpus(corpus); + if (compiler.kind === "typescript") { + const ts = requireTypeScriptAdapter(compiler); + for (const sourceFile of parsed) { + visited += countAstNodes(ts, sourceFile as SourceFile); + } + return visited; + } + + if (compiler.kind === "oxc") { + for (const sourceFile of parsed) { + visited += countOxcAstNodes((sourceFile as OxcSourceFile).program); + } + return visited; + } + + if (compiler.kind === "swc") { + for (const sourceFile of parsed) { + visited += countSwcAstNodes((sourceFile as SwcSourceFile).program); + } + } + return visited; + }, + }, + { + name: "sideffect-discovery", + run: async (compiler, corpus) => { + let discovered = 0; + const parsed = await compiler.parseCorpus(corpus); + if (compiler.kind === "typescript") { + const ts = requireTypeScriptAdapter(compiler); + for (const sourceFile of parsed) { + discovered += collectSideffectWorkflows(ts, sourceFile as SourceFile); + } + return discovered; + } + + if (compiler.kind === "oxc") { + for (const sourceFile of parsed) { + discovered += collectOxcSideffectWorkflows(sourceFile as OxcSourceFile); + } + return discovered; + } + + if (compiler.kind === "swc") { + for (const sourceFile of parsed) { + discovered += collectSwcSideffectWorkflows(sourceFile as SwcSourceFile); + } + } + return discovered; + }, + }, +]; + +async function main(): Promise { + const options = parseOptions(process.argv.slice(2)); + const corpus = loadCorpus(options); + + if (corpus.length === 0) { + throw new Error( + `No benchmark sources were found for ${options.fixture === "generated" ? "generated fixture" : options.root}. Provide --root or --fixture generated.`, + ); + } + + const compilers = [await loadTypeScript(), ...(await loadOxcParsers()), await loadSwcParser()]; + const results: Array = []; + + try { + for (const compiler of compilers) { + for (const benchCase of cases) { + results.push(await runCase(compiler, benchCase, corpus, options)); + } + } + } finally { + for (const compiler of compilers) { + compiler.close(); + } + } + + printMarkdown(results); + console.log("\n```json"); + console.log(JSON.stringify({ options, results }, null, 2)); + console.log("```"); +} + +function parseOptions(args: ReadonlyArray): Options { + const defaults: Options = { + root: defaultRoot(), + fixture: "files", + files: 250, + workflowsPerFile: 4, + iterations: 50, + warmup: 5, + }; + + let root = defaults.root; + let fixture = defaults.fixture; + let files = defaults.files; + let workflowsPerFile = defaults.workflowsPerFile; + let iterations = defaults.iterations; + let warmup = defaults.warmup; + + for (let index = 0; index < args.length; index += 1) { + const arg = args[index]; + const value = args[index + 1]; + + switch (arg) { + case "--root": + root = requiredValue(arg, value); + index += 1; + break; + case "--fixture": { + const parsed = requiredValue(arg, value); + if (parsed !== "files" && parsed !== "generated") { + throw new Error(`Expected --fixture to be "files" or "generated", got "${parsed}".`); + } + fixture = parsed; + index += 1; + break; + } + case "--files": + files = positiveInteger(arg, requiredValue(arg, value)); + index += 1; + break; + case "--workflows-per-file": + workflowsPerFile = positiveInteger(arg, requiredValue(arg, value)); + index += 1; + break; + case "--iterations": + iterations = positiveInteger(arg, requiredValue(arg, value)); + index += 1; + break; + case "--warmup": + warmup = nonNegativeInteger(arg, requiredValue(arg, value)); + index += 1; + break; + case "--help": + printHelp(); + process.exit(0); + default: + throw new Error(`Unknown argument "${arg}". Run with --help for usage.`); + } + } + + return { root: resolve(root), fixture, files, workflowsPerFile, iterations, warmup }; +} + +function defaultRoot(): string { + const packageRelative = resolve(process.cwd(), "../cloudflare-workflows-shared/src"); + if (existsSync(packageRelative)) { + return packageRelative; + } + return resolve(process.cwd(), "workbench/cloudflare-workflows-shared/src"); +} + +function requiredValue(name: string, value: string | undefined): string { + if (!value || value.startsWith("--")) { + throw new Error(`Missing value for ${name}.`); + } + return value; +} + +function positiveInteger(name: string, value: string): number { + const parsed = Number(value); + if (!Number.isInteger(parsed) || parsed < 1) { + throw new Error(`Expected ${name} to be a positive integer, got "${value}".`); + } + return parsed; +} + +function nonNegativeInteger(name: string, value: string): number { + const parsed = Number(value); + if (!Number.isInteger(parsed) || parsed < 0) { + throw new Error(`Expected ${name} to be a non-negative integer, got "${value}".`); + } + return parsed; +} + +function printHelp(): void { + console.log(`Usage: bun run src/ast-bench.ts [options] + +Options: + --root Source directory or file to benchmark. Defaults to the shared workflow fixture. + --fixture files|generated Use source files from --root or generated Sideffect-like sources. Default: files. + --files Generated fixture file count. Default: 250. + --workflows-per-file Generated workflows per file. Default: 4. + --iterations Measured iterations per case. Default: 50. + --warmup Warmup iterations per case. Default: 5. +`); +} + +function loadCorpus(options: Options): ReadonlyArray { + if (options.fixture === "generated") { + return generateWorkflowSources(options.files, options.workflowsPerFile); + } + + return sourceFiles(options.root).map((path) => { + const source = readFileSync(path, "utf8"); + return sourceEntry(path, source); + }); +} + +function sourceFiles(path: string): Array { + const stats = statSync(path, { throwIfNoEntry: false }); + if (!stats) { + return []; + } + + if (stats.isFile()) { + return isSourceFile(path) ? [path] : []; + } + + if (!stats.isDirectory()) { + return []; + } + + return readdirSync(path, { withFileTypes: true }) + .sort((left, right) => left.name.localeCompare(right.name)) + .flatMap((entry) => { + if (entry.isDirectory() && ignoredDirectories.has(entry.name)) { + return []; + } + + const child = join(path, entry.name); + if (entry.isDirectory()) { + return sourceFiles(child); + } + + return entry.isFile() && isSourceFile(child) ? [child] : []; + }); +} + +function isSourceFile(path: string): boolean { + return ( + sourceFileExtensions.has(extname(path)) && + !declarationFileExtensions.some((extension) => path.endsWith(extension)) + ); +} + +function generateWorkflowSources( + files: number, + workflowsPerFile: number, +): ReadonlyArray { + const entries: Array = []; + + for (let fileIndex = 0; fileIndex < files; fileIndex += 1) { + const declarations: Array = [ + 'import { Effect } from "effect";', + 'import { Schema, Workflow as SideffectWorkflow } from "sideffect";', + 'import * as Sideffect from "sideffect";', + 'import { importedDefinitionWorkflow } from "./imported-definition";', + "", + ]; + + for (let workflowIndex = 0; workflowIndex < workflowsPerFile; workflowIndex += 1) { + const suffix = `${fileIndex}_${workflowIndex}`; + const workflowName = `generated-${fileIndex}-${workflowIndex}`; + declarations.push( + `const workflow${suffix} = SideffectWorkflow.make({`, + ` name: "${workflowName}",`, + " payload: Schema.Struct({ message: Schema.String }),", + "});", + `export const layer${suffix} = workflow${suffix}.toLayer(Effect.fn(function* ({ payload }, step) {`, + ' const result = yield* Effect.promise(() => step.do({ name: "noop", run: async () => payload.message }, undefined));', + " return { result };", + "}));", + "", + `export const directLayer${suffix} = Sideffect.Workflow.make({ name: "direct-${workflowName}" }).toLayer(async () => {`, + " return { ok: true };", + "});", + "", + ); + } + + declarations.push( + "export const importedDefinitionLayer = importedDefinitionWorkflow.toLayer(async () => ({ ok: true }));", + `export { layer${fileIndex}_0 as reExportedLayer${fileIndex} };`, + "", + ); + + entries.push( + sourceEntry( + `/sideffect-ast-bench/generated/workflows-${fileIndex}.ts`, + declarations.join("\n"), + ), + ); + } + + return entries; +} + +function sourceEntry(path: string, source: string): SourceEntry { + return { + path: path.startsWith("/") ? path : resolve(path), + source, + bytes: Buffer.byteLength(source, "utf8"), + lines: source.length === 0 ? 0 : source.split("\n").length, + }; +} + +async function loadTypeScript(): Promise { + const ts = (await import("typescript")) as TypeScriptModule; + return { + kind: "typescript", + packageName: "typescript", + version: ts.version, + ts, + parseCorpus: async (corpus) => corpus.map((entry) => createSourceFile(ts, entry)), + close: () => {}, + }; +} + +async function loadOxcParsers(): Promise> { + const parser = await import("oxc-parser"); + const packageJson = require("oxc-parser/package.json") as { readonly version: string }; + const adapters = [createOxcAdapter(parser, packageJson.version, "standard", {})]; + + if (parser.rawTransferSupported()) { + adapters.push( + createOxcAdapter(parser, packageJson.version, "raw", { experimentalRawTransfer: true }), + createOxcAdapter(parser, packageJson.version, "lazy", { experimentalLazy: true }), + ); + } + + return adapters; +} + +function createOxcAdapter( + parser: typeof import("oxc-parser"), + version: string, + mode: "standard" | "raw" | "lazy", + experimentalOptions: { + readonly experimentalRawTransfer?: boolean; + readonly experimentalLazy?: boolean; + }, +): CompilerAdapter { + type OxcParserOptions = NonNullable[2]> & + typeof experimentalOptions; + + return { + kind: "oxc", + packageName: `oxc-parser/${mode}`, + version, + parseCorpus: async (corpus) => + corpus.map((entry) => { + const result = parser.parseSync(entry.path, entry.source, { + astType: "ts", + ...experimentalOptions, + lang: oxcLangForFile(entry.path), + preserveParens: false, + range: false, + showSemanticErrors: false, + sourceType: "module", + } satisfies OxcParserOptions); + if (result.errors.length > 0) { + throw new Error( + `Oxc failed to parse ${entry.path} while benchmarking Sideffect discovery: ${result.errors[0]?.message ?? "unknown parser error"}`, + ); + } + return { program: result.program, module: result.module }; + }), + close: () => {}, + }; +} + +async function loadSwcParser(): Promise { + const swc = await import("@swc/core"); + const packageJson = require("@swc/core/package.json") as { readonly version: string }; + type SwcParseOptions = NonNullable[1]>; + return { + kind: "swc", + packageName: "@swc/core", + version: packageJson.version, + parseCorpus: async (corpus) => + corpus.map((entry) => ({ + program: swc.parseSync(entry.source, { + comments: false, + syntax: swcSyntaxForFile(entry.path), + target: "es2024", + tsx: extname(entry.path) === ".tsx", + } satisfies SwcParseOptions), + })), + close: () => {}, + }; +} + +function swcSyntaxForFile(path: string): "ecmascript" | "typescript" { + switch (extname(path)) { + case ".js": + case ".jsx": + case ".mjs": + case ".cjs": + return "ecmascript"; + default: + return "typescript"; + } +} + +function requireTypeScriptAdapter(compiler: CompilerAdapter): TypeScriptModule { + if (compiler.kind !== "typescript" || !compiler.ts) { + throw new Error(`Expected a TypeScript benchmark adapter, got ${compiler.packageName}.`); + } + return compiler.ts; +} + +function oxcLangForFile(path: string): "js" | "jsx" | "ts" | "tsx" { + switch (extname(path)) { + case ".tsx": + return "tsx"; + case ".jsx": + return "jsx"; + case ".js": + case ".mjs": + case ".cjs": + return "js"; + default: + return "ts"; + } +} + +async function runCase( + compiler: CompilerAdapter, + benchCase: BenchCase, + corpus: ReadonlyArray, + options: Options, +): Promise { + for (let index = 0; index < options.warmup; index += 1) { + await benchCase.run(compiler, corpus); + } + + let observations = 0; + const start = performance.now(); + for (let index = 0; index < options.iterations; index += 1) { + observations += await benchCase.run(compiler, corpus); + } + const totalMs = performance.now() - start; + const bytes = corpus.reduce((sum, entry) => sum + entry.bytes, 0); + const lines = corpus.reduce((sum, entry) => sum + entry.lines, 0); + const processedMb = (bytes * options.iterations) / 1_000_000; + + return { + packageName: compiler.packageName, + version: compiler.version, + caseName: benchCase.name, + files: corpus.length, + bytes, + lines, + iterations: options.iterations, + warmup: options.warmup, + totalMs, + meanMs: totalMs / options.iterations, + msPerMb: processedMb === 0 ? 0 : totalMs / processedMb, + observations, + }; +} + +function createSourceFile(ts: TypeScriptModule, entry: SourceEntry): SourceFile { + return ts.createSourceFile( + entry.path, + entry.source, + ts.ScriptTarget.Latest, + false, + scriptKindForFile(ts, entry.path), + ); +} + +function scriptKindForFile(ts: TypeScriptModule, path: string): TypeScript.ScriptKind { + switch (extname(path)) { + case ".tsx": + return ts.ScriptKind.TSX; + case ".jsx": + return ts.ScriptKind.JSX; + case ".js": + return ts.ScriptKind.JS; + case ".ts": + case ".mts": + case ".cts": + return ts.ScriptKind.TS; + default: + return ts.ScriptKind.Unknown; + } +} + +function countAstNodes(ts: TypeScriptModule, sourceFile: SourceFile): number { + let count = 1; + const visit = (node: TypeScript.Node): void => { + count += 1; + forEachChild(ts, node, visit); + }; + + forEachChild(ts, sourceFile, visit); + return count; +} + +function forEachChild( + ts: TypeScriptModule, + node: TypeScript.Node, + visit: (node: TypeScript.Node) => void, +): void { + if (typeof ts.forEachChild === "function") { + ts.forEachChild(node, visit); + return; + } + + node.forEachChild(visit); +} + +function collectSideffectWorkflows(ts: TypeScriptModule, sourceFile: SourceFile): number { + const workflowBindings = collectWorkflowBindings(ts, sourceFile); + const workflowDefinitions = new Map(); + const workflowLayers = new Map(); + let discovered = 0; + + for (const statement of sourceFile.statements) { + if (ts.isVariableStatement(statement)) { + const exported = hasExportModifier(ts, statement); + + for (const declaration of statement.declarationList.declarations) { + if (!ts.isIdentifier(declaration.name) || !declaration.initializer) { + continue; + } + + const name = declaration.name.text; + const workflowName = workflowNameFromMakeCall( + ts, + declaration.initializer, + workflowBindings, + ); + if (workflowName) { + workflowDefinitions.set(name, workflowName); + continue; + } + + const layerWorkflowName = workflowNameFromLayerExpression( + ts, + declaration.initializer, + workflowBindings, + workflowDefinitions, + ); + if (!layerWorkflowName) { + continue; + } + + workflowLayers.set(name, layerWorkflowName); + if (exported) { + discovered += 1; + } + } + continue; + } + + if (ts.isExportAssignment(statement) && !statement.isExportEquals) { + const expression = skipOuterExpressions(ts, statement.expression); + const layerWorkflowName = + workflowNameFromLayerExpression(ts, expression, workflowBindings, workflowDefinitions) ?? + (ts.isIdentifier(expression) ? workflowLayers.get(expression.text) : undefined); + if (layerWorkflowName) { + discovered += 1; + } + continue; + } + + if (!ts.isExportDeclaration(statement)) { + continue; + } + + const exportClause = statement.exportClause; + if (!statement.isTypeOnly && exportClause && ts.isNamedExports(exportClause)) { + for (const exportEntry of exportSpecifierNames(ts, statement, exportClause)) { + if (workflowLayers.has(exportEntry.imported)) { + discovered += 1; + } + } + } + } + + return discovered; +} + +function collectWorkflowBindings( + ts: TypeScriptModule, + sourceFile: SourceFile, +): { readonly names: Set; readonly namespaces: Set } { + const names = new Set(["Workflow"]); + const namespaces = new Set(); + + for (const statement of sourceFile.statements) { + if ( + !ts.isImportDeclaration(statement) || + !statement.moduleSpecifier || + !ts.isStringLiteral(statement.moduleSpecifier) || + statement.moduleSpecifier.text !== "sideffect" + ) { + continue; + } + + const namedBindings = statement.importClause?.namedBindings; + if (!namedBindings) { + continue; + } + + if (ts.isNamespaceImport(namedBindings)) { + namespaces.add(namedBindings.name.text); + continue; + } + + for (const element of namedBindings.elements) { + const imported = element.propertyName?.text ?? element.name.text; + if (imported === "Workflow") { + names.add(element.name.text); + } + } + } + + return { names, namespaces }; +} + +function hasExportModifier(ts: TypeScriptModule, node: TypeScript.Node): boolean { + const withModifiers = node as unknown as { + readonly modifiers?: ReadonlyArray<{ readonly kind: TypeScript.SyntaxKind }>; + }; + return ( + withModifiers.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword) ?? + false + ); +} + +function workflowNameFromLayerExpression( + ts: TypeScriptModule, + expression: TypeScript.Expression, + workflowBindings: { readonly names: Set; readonly namespaces: Set }, + workflowDefinitions: Map, +): string | undefined { + const call = skipOuterExpressions(ts, expression); + if (!ts.isCallExpression(call)) { + return; + } + + const callee = skipOuterExpressions(ts, call.expression); + if (!ts.isPropertyAccessExpression(callee) || callee.name.text !== "toLayer") { + return; + } + + const receiver = skipOuterExpressions(ts, callee.expression); + if (ts.isIdentifier(receiver)) { + return workflowDefinitions.get(receiver.text); + } + + return workflowNameFromMakeCall(ts, receiver, workflowBindings); +} + +function workflowNameFromMakeCall( + ts: TypeScriptModule, + expression: TypeScript.Expression, + workflowBindings: { readonly names: Set; readonly namespaces: Set }, +): string | undefined { + const call = skipOuterExpressions(ts, expression); + if (!ts.isCallExpression(call)) { + return; + } + + const callee = skipOuterExpressions(ts, call.expression); + if (!ts.isPropertyAccessExpression(callee) || callee.name.text !== "make") { + return; + } + + const receiver = skipOuterExpressions(ts, callee.expression); + const isWorkflowMake = ts.isIdentifier(receiver) + ? workflowBindings.names.has(receiver.text) + : ts.isPropertyAccessExpression(receiver) && + receiver.name.text === "Workflow" && + ts.isIdentifier(receiver.expression) && + workflowBindings.namespaces.has(receiver.expression.text); + if (!isWorkflowMake) { + return; + } + + const options = call.arguments[0]; + if (!options) { + return; + } + + const object = skipOuterExpressions(ts, options); + if (!ts.isObjectLiteralExpression(object)) { + return; + } + + for (const property of object.properties) { + if (!ts.isPropertyAssignment(property)) { + continue; + } + + const name = property.name; + const isNameProperty = + (ts.isIdentifier(name) && name.text === "name") || + (ts.isStringLiteral(name) && name.text === "name"); + if (!isNameProperty) { + continue; + } + + const value = skipOuterExpressions(ts, property.initializer); + if (ts.isStringLiteral(value) || ts.isNoSubstitutionTemplateLiteral(value)) { + return value.text; + } + } +} + +function exportSpecifierNames( + ts: TypeScriptModule, + declaration: TypeScript.ExportDeclaration, + exports: TypeScript.NamedExports, +): Array<{ readonly imported: string; readonly exported: string }> { + if (declaration.isTypeOnly) { + return []; + } + + const names: Array<{ readonly imported: string; readonly exported: string }> = []; + for (const element of exports.elements) { + if (element.isTypeOnly) { + continue; + } + + const importedName = element.propertyName ?? element.name; + const exportedName = element.name; + const imported = + ts.isIdentifier(importedName) && identifierName.test(importedName.text) + ? importedName.text + : undefined; + const exported = + ts.isIdentifier(exportedName) && identifierName.test(exportedName.text) + ? exportedName.text + : undefined; + + if (imported && exported) { + names.push({ imported, exported }); + } + } + + return names; +} + +function skipOuterExpressions( + ts: TypeScriptModule, + expression: TypeScript.Expression, +): TypeScript.Expression { + let current = expression; + while ( + ts.isParenthesizedExpression(current) || + ts.isAsExpression(current) || + ts.isSatisfiesExpression(current) || + ts.isNonNullExpression(current) || + isTypeAssertionExpression(ts, current) + ) { + current = current.expression; + } + return current; +} + +function isTypeAssertionExpression( + ts: TypeScriptModule, + node: TypeScript.Node, +): node is TypeScript.TypeAssertion { + return typeof ts.isTypeAssertionExpression === "function" && ts.isTypeAssertionExpression(node); +} + +function countOxcAstNodes(program: OxcProgram): number { + let count = 0; + const stack: Array = [program]; + while (stack.length > 0) { + const value = stack.pop(); + if (!isOxcNode(value)) { + continue; + } + + count += 1; + for (const child of Object.values(value)) { + if (Array.isArray(child)) { + for (const item of child) { + stack.push(item); + } + continue; + } + stack.push(child); + } + } + return count; +} + +function collectOxcSideffectWorkflows(sourceFile: OxcSourceFile): number { + const workflowBindings = collectOxcWorkflowBindings(sourceFile.module); + const workflowDefinitions = new Map(); + const workflowLayers = new Map(); + let discovered = 0; + + for (const statement of sourceFile.program.body) { + const node = statement as unknown; + if (isOxcNodeOfType(node, "VariableDeclaration")) { + collectOxcVariableDeclaration( + node, + false, + workflowBindings, + workflowDefinitions, + workflowLayers, + ); + continue; + } + + if (isOxcNodeOfType(node, "ExportNamedDeclaration")) { + const declaration = getOxcNode(node, "declaration"); + if (isOxcNodeOfType(declaration, "VariableDeclaration")) { + discovered += collectOxcVariableDeclaration( + declaration, + true, + workflowBindings, + workflowDefinitions, + workflowLayers, + ); + continue; + } + + for (const specifier of getOxcNodeArray(node, "specifiers")) { + if (!isOxcNodeOfType(specifier, "ExportSpecifier")) { + continue; + } + const local = getOxcIdentifierName(getOxcNode(specifier, "local")); + if (local && workflowLayers.has(local)) { + discovered += 1; + } + } + continue; + } + + if (isOxcNodeOfType(node, "ExportDefaultDeclaration")) { + const declaration = skipOxcOuterExpressions(getOxcNode(node, "declaration")); + const workflowName = + workflowNameFromOxcLayerExpression(declaration, workflowBindings, workflowDefinitions) ?? + (isOxcNodeOfType(declaration, "Identifier") + ? workflowLayers.get(getOxcString(declaration, "name") ?? "") + : undefined); + if (workflowName) { + discovered += 1; + } + } + } + + return discovered; +} + +function collectOxcWorkflowBindings(module: EcmaScriptModule): { + readonly names: Set; + readonly namespaces: Set; +} { + const names = new Set(["Workflow"]); + const namespaces = new Set(); + + for (const importDeclaration of module.staticImports) { + if (importDeclaration.moduleRequest.value !== "sideffect") { + continue; + } + + for (const entry of importDeclaration.entries) { + if (entry.isType) { + continue; + } + if (entry.importName.kind === "NamespaceObject") { + namespaces.add(entry.localName.value); + continue; + } + if (entry.importName.kind === "Name" && entry.importName.name === "Workflow") { + names.add(entry.localName.value); + } + } + } + + return { names, namespaces }; +} + +function collectOxcVariableDeclaration( + declaration: OxcNode, + exported: boolean, + workflowBindings: { readonly names: Set; readonly namespaces: Set }, + workflowDefinitions: Map, + workflowLayers: Map, +): number { + let discovered = 0; + for (const declarator of getOxcNodeArray(declaration, "declarations")) { + if (!isOxcNodeOfType(declarator, "VariableDeclarator")) { + continue; + } + + const id = getOxcNode(declarator, "id"); + const name = getOxcIdentifierName(id); + const init = getOxcNode(declarator, "init"); + if (!name || !init) { + continue; + } + + const workflowName = workflowNameFromOxcMakeCall(init, workflowBindings); + if (workflowName) { + workflowDefinitions.set(name, workflowName); + continue; + } + + const layerWorkflowName = workflowNameFromOxcLayerExpression( + init, + workflowBindings, + workflowDefinitions, + ); + if (!layerWorkflowName) { + continue; + } + + workflowLayers.set(name, layerWorkflowName); + if (exported) { + discovered += 1; + } + } + return discovered; +} + +function workflowNameFromOxcLayerExpression( + expression: unknown, + workflowBindings: { readonly names: Set; readonly namespaces: Set }, + workflowDefinitions: Map, +): string | undefined { + const call = skipOxcOuterExpressions(expression); + if (!isOxcNodeOfType(call, "CallExpression")) { + return; + } + + const callee = skipOxcOuterExpressions(getOxcNode(call, "callee")); + if (!isOxcMemberNamed(callee, "toLayer")) { + return; + } + + const receiver = skipOxcOuterExpressions(getOxcNode(callee, "object")); + const receiverName = getOxcIdentifierName(receiver); + if (receiverName) { + return workflowDefinitions.get(receiverName); + } + + return workflowNameFromOxcMakeCall(receiver, workflowBindings); +} + +function workflowNameFromOxcMakeCall( + expression: unknown, + workflowBindings: { readonly names: Set; readonly namespaces: Set }, +): string | undefined { + const call = skipOxcOuterExpressions(expression); + if (!isOxcNodeOfType(call, "CallExpression")) { + return; + } + + const callee = skipOxcOuterExpressions(getOxcNode(call, "callee")); + if (!isOxcMemberNamed(callee, "make")) { + return; + } + + const receiver = skipOxcOuterExpressions(getOxcNode(callee, "object")); + const receiverName = getOxcIdentifierName(receiver); + const isWorkflowMake = receiverName + ? workflowBindings.names.has(receiverName) + : isOxcMemberNamed(receiver, "Workflow") && + workflowBindings.namespaces.has(getOxcIdentifierName(getOxcNode(receiver, "object")) ?? ""); + if (!isWorkflowMake) { + return; + } + + const options = getOxcNodeArray(call, "arguments")[0]; + const object = skipOxcOuterExpressions(options); + if (!isOxcNodeOfType(object, "ObjectExpression")) { + return; + } + + for (const property of getOxcNodeArray(object, "properties")) { + if (!isOxcNodeOfType(property, "Property")) { + continue; + } + + const key = getOxcNode(property, "key"); + const propertyName = getOxcIdentifierName(key) ?? getOxcLiteralString(key); + if (propertyName !== "name") { + continue; + } + + const value = skipOxcOuterExpressions(getOxcNode(property, "value")); + return getOxcLiteralString(value) ?? getOxcStaticTemplateString(value); + } +} + +function skipOxcOuterExpressions(expression: unknown): unknown { + let current = expression; + while ( + isOxcNodeOfType(current, "ParenthesizedExpression") || + isOxcNodeOfType(current, "TSAsExpression") || + isOxcNodeOfType(current, "TSSatisfiesExpression") || + isOxcNodeOfType(current, "TSNonNullExpression") || + isOxcNodeOfType(current, "TSTypeAssertion") || + isOxcNodeOfType(current, "ChainExpression") + ) { + current = getOxcNode(current, "expression"); + } + return current; +} + +function isOxcMemberNamed(node: unknown, name: string): node is OxcNode { + if (!isOxcNodeOfType(node, "MemberExpression")) { + return false; + } + return getOxcIdentifierName(getOxcNode(node, "property")) === name; +} + +type OxcNode = { readonly type: string; readonly [key: string]: unknown }; + +function isOxcNode(value: unknown): value is OxcNode { + return ( + typeof value === "object" && value !== null && typeof getOxcString(value, "type") === "string" + ); +} + +function isOxcNodeOfType(value: unknown, type: string): value is OxcNode { + return isOxcNode(value) && value.type === type; +} + +function getOxcNode(node: OxcNode, key: string): OxcNode | undefined { + const value = node[key]; + return isOxcNode(value) ? value : undefined; +} + +function getOxcNodeArray(node: OxcNode, key: string): ReadonlyArray { + const value = node[key]; + return Array.isArray(value) ? value.filter(isOxcNode) : []; +} + +function getOxcString(node: unknown, key: string): string | undefined { + if (typeof node !== "object" || node === null) { + return; + } + const value = (node as Record)[key]; + return typeof value === "string" ? value : undefined; +} + +function getOxcIdentifierName(node: unknown): string | undefined { + return isOxcNodeOfType(node, "Identifier") ? getOxcString(node, "name") : undefined; +} + +function getOxcLiteralString(node: unknown): string | undefined { + if (!isOxcNodeOfType(node, "Literal")) { + return; + } + const value = node.value; + return typeof value === "string" ? value : undefined; +} + +function getOxcStaticTemplateString(node: unknown): string | undefined { + if (!isOxcNodeOfType(node, "TemplateLiteral")) { + return; + } + if (getOxcNodeArray(node, "expressions").length > 0) { + return; + } + const quasi = getOxcNodeArray(node, "quasis")[0]; + const value = quasi ? getOxcNode(quasi, "value") : undefined; + return value ? (getOxcString(value, "cooked") ?? getOxcString(value, "raw")) : undefined; +} + +function countSwcAstNodes(program: unknown): number { + let count = 0; + const stack: Array = [program]; + while (stack.length > 0) { + const value = stack.pop(); + if (!isSwcNode(value)) { + continue; + } + + count += 1; + for (const child of Object.values(value)) { + if (Array.isArray(child)) { + for (const item of child) { + stack.push(item); + } + continue; + } + stack.push(child); + } + } + return count; +} + +function collectSwcSideffectWorkflows(sourceFile: SwcSourceFile): number { + const program = sourceFile.program; + if (!isSwcNode(program)) { + return 0; + } + + const workflowBindings = collectSwcWorkflowBindings(program); + const workflowDefinitions = new Map(); + const workflowLayers = new Map(); + let discovered = 0; + + for (const statement of getSwcNodeArray(program, "body")) { + if (isSwcNodeOfType(statement, "VariableDeclaration")) { + collectSwcVariableDeclaration( + statement, + false, + workflowBindings, + workflowDefinitions, + workflowLayers, + ); + continue; + } + + if (isSwcNodeOfType(statement, "ExportDeclaration")) { + const declaration = getSwcNode(statement, "declaration"); + if (isSwcNodeOfType(declaration, "VariableDeclaration")) { + discovered += collectSwcVariableDeclaration( + declaration, + true, + workflowBindings, + workflowDefinitions, + workflowLayers, + ); + } + continue; + } + + if (isSwcNodeOfType(statement, "ExportNamedDeclaration")) { + for (const specifier of getSwcNodeArray(statement, "specifiers")) { + if (!isSwcNodeOfType(specifier, "ExportSpecifier")) { + continue; + } + const local = getSwcIdentifierName(getSwcNode(specifier, "orig")); + if (local && workflowLayers.has(local)) { + discovered += 1; + } + } + continue; + } + + if (isSwcNodeOfType(statement, "ExportDefaultExpression")) { + const expression = skipSwcOuterExpressions(getSwcNode(statement, "expression")); + const workflowName = + workflowNameFromSwcLayerExpression(expression, workflowBindings, workflowDefinitions) ?? + (isSwcNodeOfType(expression, "Identifier") + ? workflowLayers.get(getSwcString(expression, "value") ?? "") + : undefined); + if (workflowName) { + discovered += 1; + } + } + } + + return discovered; +} + +function collectSwcWorkflowBindings(program: SwcNode): { + readonly names: Set; + readonly namespaces: Set; +} { + const names = new Set(["Workflow"]); + const namespaces = new Set(); + + for (const statement of getSwcNodeArray(program, "body")) { + if (!isSwcNodeOfType(statement, "ImportDeclaration")) { + continue; + } + const source = getSwcNode(statement, "source"); + if (getSwcString(source, "value") !== "sideffect" || statement.typeOnly === true) { + continue; + } + + for (const specifier of getSwcNodeArray(statement, "specifiers")) { + if (isSwcNodeOfType(specifier, "ImportNamespaceSpecifier")) { + const name = getSwcIdentifierName(getSwcNode(specifier, "local")); + if (name) { + namespaces.add(name); + } + continue; + } + + if ( + !isSwcNodeOfType(specifier, "ImportSpecifier") || + getSwcBoolean(specifier, "isTypeOnly") + ) { + continue; + } + const imported = getSwcIdentifierName(getSwcNode(specifier, "imported")); + const local = getSwcIdentifierName(getSwcNode(specifier, "local")); + if (imported === "Workflow" && local) { + names.add(local); + } + } + } + + return { names, namespaces }; +} + +function collectSwcVariableDeclaration( + declaration: SwcNode, + exported: boolean, + workflowBindings: { readonly names: Set; readonly namespaces: Set }, + workflowDefinitions: Map, + workflowLayers: Map, +): number { + let discovered = 0; + for (const declarator of getSwcNodeArray(declaration, "declarations")) { + if (!isSwcNodeOfType(declarator, "VariableDeclarator")) { + continue; + } + const name = getSwcIdentifierName(getSwcNode(declarator, "id")); + const init = getSwcNode(declarator, "init"); + if (!name || !init) { + continue; + } + + const workflowName = workflowNameFromSwcMakeCall(init, workflowBindings); + if (workflowName) { + workflowDefinitions.set(name, workflowName); + continue; + } + + const layerWorkflowName = workflowNameFromSwcLayerExpression( + init, + workflowBindings, + workflowDefinitions, + ); + if (!layerWorkflowName) { + continue; + } + + workflowLayers.set(name, layerWorkflowName); + if (exported) { + discovered += 1; + } + } + return discovered; +} + +function workflowNameFromSwcLayerExpression( + expression: unknown, + workflowBindings: { readonly names: Set; readonly namespaces: Set }, + workflowDefinitions: Map, +): string | undefined { + const call = skipSwcOuterExpressions(expression); + if (!isSwcNodeOfType(call, "CallExpression")) { + return; + } + const callee = skipSwcOuterExpressions(getSwcNode(call, "callee")); + if (!isSwcMemberNamed(callee, "toLayer")) { + return; + } + + const receiver = skipSwcOuterExpressions(getSwcNode(callee, "object")); + const receiverName = getSwcIdentifierName(receiver); + if (receiverName) { + return workflowDefinitions.get(receiverName); + } + return workflowNameFromSwcMakeCall(receiver, workflowBindings); +} + +function workflowNameFromSwcMakeCall( + expression: unknown, + workflowBindings: { readonly names: Set; readonly namespaces: Set }, +): string | undefined { + const call = skipSwcOuterExpressions(expression); + if (!isSwcNodeOfType(call, "CallExpression")) { + return; + } + const callee = skipSwcOuterExpressions(getSwcNode(call, "callee")); + if (!isSwcMemberNamed(callee, "make")) { + return; + } + + const receiver = skipSwcOuterExpressions(getSwcNode(callee, "object")); + const receiverName = getSwcIdentifierName(receiver); + const isWorkflowMake = receiverName + ? workflowBindings.names.has(receiverName) + : isSwcMemberNamed(receiver, "Workflow") && + workflowBindings.namespaces.has(getSwcIdentifierName(getSwcNode(receiver, "object")) ?? ""); + if (!isWorkflowMake) { + return; + } + + const object = skipSwcOuterExpressions(getSwcCallArgumentExpression(call, 0)); + if (!isSwcNodeOfType(object, "ObjectExpression")) { + return; + } + + for (const property of getSwcNodeArray(object, "properties")) { + if (!isSwcNodeOfType(property, "KeyValueProperty")) { + continue; + } + const key = getSwcNode(property, "key"); + const propertyName = getSwcIdentifierName(key) ?? getSwcString(key, "value"); + if (propertyName !== "name") { + continue; + } + const value = skipSwcOuterExpressions(getSwcNode(property, "value")); + return getSwcString(value, "value") ?? getSwcStaticTemplateString(value); + } +} + +function skipSwcOuterExpressions(expression: unknown): unknown { + let current = expression; + while ( + isSwcNodeOfType(current, "ParenthesisExpression") || + isSwcNodeOfType(current, "TsAsExpression") || + isSwcNodeOfType(current, "TsSatisfiesExpression") || + isSwcNodeOfType(current, "TsNonNullExpression") || + isSwcNodeOfType(current, "TsTypeAssertion") + ) { + current = getSwcNode(current, "expression"); + } + return current; +} + +function isSwcMemberNamed(node: unknown, name: string): node is SwcNode { + if (!isSwcNodeOfType(node, "MemberExpression")) { + return false; + } + return getSwcIdentifierName(getSwcNode(node, "property")) === name; +} + +type SwcNode = { readonly type: string; readonly [key: string]: unknown }; + +function isSwcNode(value: unknown): value is SwcNode { + return ( + typeof value === "object" && value !== null && typeof getSwcString(value, "type") === "string" + ); +} + +function isSwcNodeOfType(value: unknown, type: string): value is SwcNode { + return isSwcNode(value) && value.type === type; +} + +function getSwcNode(node: SwcNode | undefined, key: string): SwcNode | undefined { + const value = node?.[key]; + return isSwcNode(value) ? value : undefined; +} + +function getSwcNodeArray(node: SwcNode, key: string): ReadonlyArray { + const value = node[key]; + return Array.isArray(value) ? value.filter(isSwcNode) : []; +} + +function getSwcCallArgumentExpression(node: SwcNode, index: number): SwcNode | undefined { + const value = node.arguments; + if (!Array.isArray(value)) { + return; + } + const argument = value[index]; + if (typeof argument !== "object" || argument === null) { + return; + } + return getSwcNode(argument as SwcNode, "expression"); +} + +function getSwcString(node: unknown, key: string): string | undefined { + if (typeof node !== "object" || node === null) { + return; + } + const value = (node as Record)[key]; + return typeof value === "string" ? value : undefined; +} + +function getSwcBoolean(node: unknown, key: string): boolean { + if (typeof node !== "object" || node === null) { + return false; + } + const value = (node as Record)[key]; + return value === true; +} + +function getSwcIdentifierName(node: unknown): string | undefined { + return isSwcNodeOfType(node, "Identifier") ? getSwcString(node, "value") : undefined; +} + +function getSwcStaticTemplateString(node: unknown): string | undefined { + if (!isSwcNodeOfType(node, "TemplateLiteral")) { + return; + } + if (getSwcNodeArray(node, "expressions").length > 0) { + return; + } + const quasi = getSwcNodeArray(node, "quasis")[0]; + const cooked = quasi ? getSwcString(quasi, "cooked") : undefined; + return cooked ?? (quasi ? getSwcString(quasi, "raw") : undefined); +} + +function printMarkdown(results: ReadonlyArray): void { + console.log( + "| package | version | case | files | kB | lines | iterations | total ms | mean ms | ms/MB | observations |", + ); + console.log("|---|---:|---|---:|---:|---:|---:|---:|---:|---:|---:|"); + for (const result of results) { + console.log( + `| ${result.packageName} | ${result.version} | ${result.caseName} | ${result.files} | ${(result.bytes / 1_000).toFixed(1)} | ${result.lines} | ${result.iterations} | ${result.totalMs.toFixed(3)} | ${result.meanMs.toFixed(3)} | ${result.msPerMb.toFixed(3)} | ${result.observations} |`, + ); + } +} + +await main(); diff --git a/workbench/typescript-ast-bench/tsconfig.json b/workbench/typescript-ast-bench/tsconfig.json new file mode 100644 index 0000000..100b7b6 --- /dev/null +++ b/workbench/typescript-ast-bench/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "es2024", + "lib": ["es2024"], + "types": ["node"], + "module": "nodenext", + "moduleResolution": "nodenext", + "allowImportingTsExtensions": true, + "strict": true, + "noEmit": true, + "skipLibCheck": true + }, + "include": ["src"] +}