From e35206b93a97f85b16b1092da9248985a69b4348 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Fri, 12 Dec 2025 18:52:11 +0100 Subject: [PATCH 01/13] Create new Svelte project ``` pnpm dlx sv create --template minimal --types ts --add prettier eslint vitest="usages:unit,component" --install pnpm svelte ``` --- pnpm-lock.yaml | 734 +++++++++++++++++++++++++- pnpm-workspace.yaml | 1 + svelte/.gitignore | 23 + svelte/.prettierignore | 9 + svelte/.prettierrc | 15 + svelte/README.md | 38 ++ svelte/eslint.config.js | 41 ++ svelte/package.json | 41 ++ svelte/src/app.d.ts | 13 + svelte/src/app.html | 11 + svelte/src/demo.spec.ts | 7 + svelte/src/lib/assets/favicon.svg | 1 + svelte/src/lib/index.ts | 1 + svelte/src/routes/+layout.svelte | 11 + svelte/src/routes/+page.svelte | 2 + svelte/src/routes/page.svelte.spec.ts | 13 + svelte/static/robots.txt | 3 + svelte/svelte.config.js | 18 + svelte/tsconfig.json | 20 + svelte/vite.config.ts | 41 ++ 20 files changed, 1036 insertions(+), 7 deletions(-) create mode 100644 svelte/.gitignore create mode 100644 svelte/.prettierignore create mode 100644 svelte/.prettierrc create mode 100644 svelte/README.md create mode 100644 svelte/eslint.config.js create mode 100644 svelte/package.json create mode 100644 svelte/src/app.d.ts create mode 100644 svelte/src/app.html create mode 100644 svelte/src/demo.spec.ts create mode 100644 svelte/src/lib/assets/favicon.svg create mode 100644 svelte/src/lib/index.ts create mode 100644 svelte/src/routes/+layout.svelte create mode 100644 svelte/src/routes/+page.svelte create mode 100644 svelte/src/routes/page.svelte.spec.ts create mode 100644 svelte/static/robots.txt create mode 100644 svelte/svelte.config.js create mode 100644 svelte/tsconfig.json create mode 100644 svelte/vite.config.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d38de5ee11..ccac169a4d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -182,7 +182,7 @@ importers: version: 0.2.0 ember-eslint-parser: specifier: 0.5.13 - version: 0.5.13(@babel/core@7.28.5)(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + version: 0.5.13(@babel/core@7.28.5)(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) ember-event-helpers: specifier: 0.1.1 version: 0.1.1 @@ -248,7 +248,7 @@ importers: version: 10.1.8(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-ember: specifier: 12.7.5 - version: 12.7.5(@babel/core@7.28.5)(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + version: 12.7.5(@babel/core@7.28.5)(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint-plugin-ember-concurrency: specifier: 0.5.1 version: 0.5.1(eslint@9.39.1(jiti@2.6.1)) @@ -339,7 +339,73 @@ importers: devDependencies: vitest: specifier: 4.0.15 - version: 4.0.15(@types/node@24.10.2)(jiti@2.6.1)(jsdom@25.0.1)(msw@2.12.4(@types/node@24.10.2)(typescript@5.9.3))(terser@5.44.1)(yaml@2.8.2) + version: 4.0.15(@types/node@24.10.2)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1)(jsdom@25.0.1)(msw@2.12.4(@types/node@24.10.2)(typescript@5.9.3))(terser@5.44.1)(yaml@2.8.2) + + svelte: + devDependencies: + '@eslint/compat': + specifier: ^1.4.0 + version: 1.4.1(eslint@9.39.1(jiti@2.6.1)) + '@eslint/js': + specifier: ^9.39.1 + version: 9.39.1 + '@sveltejs/adapter-auto': + specifier: ^7.0.0 + version: 7.0.0(@sveltejs/kit@2.49.2(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)))(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))) + '@sveltejs/kit': + specifier: ^2.49.1 + version: 2.49.2(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)))(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) + '@sveltejs/vite-plugin-svelte': + specifier: ^6.2.1 + version: 6.2.1(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) + '@types/node': + specifier: ^24 + version: 24.10.2 + '@vitest/browser-playwright': + specifier: ^4.0.15 + version: 4.0.15(msw@2.12.4(@types/node@24.10.2)(typescript@5.9.3))(playwright@1.57.0)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))(vitest@4.0.15) + eslint: + specifier: ^9.39.1 + version: 9.39.1(jiti@2.6.1) + eslint-config-prettier: + specifier: ^10.1.8 + version: 10.1.8(eslint@9.39.1(jiti@2.6.1)) + eslint-plugin-svelte: + specifier: ^3.13.1 + version: 3.13.1(eslint@9.39.1(jiti@2.6.1))(svelte@5.45.10) + globals: + specifier: ^16.5.0 + version: 16.5.0 + playwright: + specifier: ^1.57.0 + version: 1.57.0 + prettier: + specifier: ^3.7.4 + version: 3.7.4 + prettier-plugin-svelte: + specifier: ^3.4.0 + version: 3.4.0(prettier@3.7.4)(svelte@5.45.10) + svelte: + specifier: ^5.45.6 + version: 5.45.10 + svelte-check: + specifier: ^4.3.4 + version: 4.3.4(picomatch@4.0.3)(svelte@5.45.10)(typescript@5.9.3) + typescript: + specifier: ^5.9.3 + version: 5.9.3 + typescript-eslint: + specifier: ^8.48.1 + version: 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + vite: + specifier: ^7.2.6 + version: 7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2) + vitest: + specifier: ^4.0.15 + version: 4.0.15(@types/node@24.10.2)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1)(jsdom@25.0.1)(msw@2.12.4(@types/node@24.10.2)(typescript@5.9.3))(terser@5.44.1)(yaml@2.8.2) + vitest-browser-svelte: + specifier: ^2.0.1 + version: 2.0.1(svelte@5.45.10)(vitest@4.0.15) packages: @@ -1548,6 +1614,15 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint/compat@1.4.1': + resolution: {integrity: sha512-cfO82V9zxxGBxcQDr1lfaYB7wykTa0b00mGa36FrJl7iTFd0Z2cHfEYuxcBRP/iNijCsWsEkA+jzT8hGYmv33w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.40 || 9 + peerDependenciesMeta: + eslint: + optional: true + '@eslint/config-array@0.21.1': resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1936,6 +2011,9 @@ packages: resolution: {integrity: sha512-4rdu8GPY9TeQwsYp5D2My74dC3dSVS3tghAvisG80ybK4lqa0gvlrglaSTBxogJbxqHRw/NjI/liEtb3+SD+Bw==} engines: {node: '>=18.12'} + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} + '@rollup/wasm-node@4.53.3': resolution: {integrity: sha512-mB8z32H6kz4kVjn+tfTGcrXBae7rIeAvm/g6itsE3IqcXpjSRRvk1/EOWDEi5wL8NNmxXiH71t4jtNfr128zpw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -2000,6 +2078,44 @@ packages: '@standard-schema/spec@1.0.0': resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@sveltejs/acorn-typescript@1.0.8': + resolution: {integrity: sha512-esgN+54+q0NjB0Y/4BomT9samII7jGwNy/2a3wNZbT2A2RpmXsXwUt24LvLhx6jUq2gVk4cWEvcRO6MFQbOfNA==} + peerDependencies: + acorn: ^8.9.0 + + '@sveltejs/adapter-auto@7.0.0': + resolution: {integrity: sha512-ImDWaErTOCkRS4Gt+5gZuymKFBobnhChXUZ9lhUZLahUgvA4OOvRzi3sahzYgbxGj5nkA6OV0GAW378+dl/gyw==} + peerDependencies: + '@sveltejs/kit': ^2.0.0 + + '@sveltejs/kit@2.49.2': + resolution: {integrity: sha512-Vp3zX/qlwerQmHMP6x0Ry1oY7eKKRcOWGc2P59srOp4zcqyn+etJyQpELgOi4+ZSUgteX8Y387NuwruLgGXLUQ==} + engines: {node: '>=18.13'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.0.0 + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 + svelte: ^4.0.0 || ^5.0.0-next.0 + vite: ^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + + '@sveltejs/vite-plugin-svelte-inspector@5.0.1': + resolution: {integrity: sha512-ubWshlMk4bc8mkwWbg6vNvCeT7lGQojE3ijDh3QTR6Zr/R+GXxsGbyH4PExEPpiFmqPhYiVSVmHBjUcVc1JIrA==} + engines: {node: ^20.19 || ^22.12 || >=24} + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^6.0.0-next.0 + svelte: ^5.0.0 + vite: ^6.3.0 || ^7.0.0 + + '@sveltejs/vite-plugin-svelte@6.2.1': + resolution: {integrity: sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ==} + engines: {node: ^20.19 || ^22.12 || >=24} + peerDependencies: + svelte: ^5.0.0 + vite: ^6.3.0 || ^7.0.0 + '@tootallnate/once@1.1.2': resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} engines: {node: '>= 6'} @@ -2025,6 +2141,9 @@ packages: '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + '@types/cors@2.8.19': resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} @@ -2218,12 +2337,82 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + '@typescript-eslint/eslint-plugin@8.49.0': + resolution: {integrity: sha512-JXij0vzIaTtCwu6SxTh8qBc66kmf1xs7pI4UOiMDFVct6q86G0Zs7KRcEoJgY3Cav3x5Tq0MF5jwgpgLqgKG3A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.49.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/parser@8.49.0': + resolution: {integrity: sha512-N9lBGA9o9aqb1hVMc9hzySbhKibHmB+N3IpoShyV6HyQYRGIhlrO5rQgttypi+yEeKsKI4idxC8Jw6gXKD4THA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.49.0': + resolution: {integrity: sha512-/wJN0/DKkmRUMXjZUXYZpD1NEQzQAAn9QWfGwo+Ai8gnzqH7tvqS7oNVdTjKqOcPyVIdZdyCMoqN66Ia789e7g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/scope-manager@8.49.0': + resolution: {integrity: sha512-npgS3zi+/30KSOkXNs0LQXtsg9ekZ8OISAOLGWA/ZOEn0ZH74Ginfl7foziV8DT+D98WfQ5Kopwqb/PZOaIJGg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/tsconfig-utils@8.48.1': resolution: {integrity: sha512-k0Jhs4CpEffIBm6wPaCXBAD7jxBtrHjrSgtfCjUvPp9AZ78lXKdTR8fxyZO5y4vWNlOvYXRtngSZNSn+H53Jkw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/tsconfig-utils@8.49.0': + resolution: {integrity: sha512-8prixNi1/6nawsRYxet4YOhnbW+W9FK/bQPxsGB1D3ZrDzbJ5FXw5XmzxZv82X3B+ZccuSxo/X8q9nQ+mFecWA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.49.0': + resolution: {integrity: sha512-KTExJfQ+svY8I10P4HdxKzWsvtVnsuCifU5MvXrRwoP2KOlNZ9ADNEWWsQTJgMxLzS5VLQKDjkCT/YzgsnqmZg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/types@8.49.0': + resolution: {integrity: sha512-e9k/fneezorUo6WShlQpMxXh8/8wfyc+biu6tnAqA81oWrEic0k21RHzP9uqqpyBBeBKu4T+Bsjy9/b8u7obXQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.49.0': + resolution: {integrity: sha512-jrLdRuAbPfPIdYNppHJ/D0wN+wwNfJ32YTAm10eJVsFmrVpXQnDWBn8niCSMlWjvml8jsce5E/O+86IQtTbJWA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/utils@8.49.0': + resolution: {integrity: sha512-N3W7rJw7Rw+z1tRsHZbK395TWSYvufBXumYtEGzypgMUthlg0/hmCImeA8hgO2d2G4pd7ftpxxul2J8OdtdaFA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/visitor-keys@8.49.0': + resolution: {integrity: sha512-LlKaciDe3GmZFphXIc79THF/YYBugZ7FS1pO581E/edlVVNbZKDy93evqmrfQ9/Y4uN0vVhX4iuchq26mK/iiA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@vitest/browser-playwright@4.0.15': + resolution: {integrity: sha512-94yVpDbb+ykiT7mK6ToonGnq2GIHEQGBTZTAzGxBGQXcVNCh54YKC2/WkfaDzxy0m6Kgw05kq3FYHKHu+wRdIA==} + peerDependencies: + playwright: '*' + vitest: 4.0.15 + + '@vitest/browser@4.0.15': + resolution: {integrity: sha512-zedtczX688KehaIaAv7m25CeDLb0gBtAOa2Oi1G1cqvSO5aLSVfH6lpZMJLW8BKYuWMxLQc9/5GYoM+jgvGIrw==} + peerDependencies: + vitest: 4.0.15 + '@vitest/expect@4.0.15': resolution: {integrity: sha512-Gfyva9/GxPAWXIWjyGDli9O+waHDC0Q0jaLdFP1qPAUUfo1FEXPXUfUkp3eZA0sSq340vPycSyOlYUeM15Ft1w==} @@ -2505,6 +2694,10 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + arr-diff@4.0.0: resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} engines: {node: '>=0.10.0'} @@ -2616,6 +2809,10 @@ packages: resolution: {integrity: sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==} engines: {node: '>=4'} + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + babel-import-util@2.1.1: resolution: {integrity: sha512-3qBQWRjzP9NreSH/YrOEU1Lj5F60+pWSLP0kIdCWxjFHH7pX2YPHIxQ67el4gnMNfYoDxSDGcT0zpVlZ+gVtQA==} engines: {node: '>= 12.*'} @@ -3033,6 +3230,10 @@ packages: chevrotain@11.0.3: resolution: {integrity: sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + chrome-trace-event@1.0.4: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} @@ -3101,6 +3302,10 @@ packages: resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} engines: {node: '>=0.8'} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + coa@2.0.2: resolution: {integrity: sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==} engines: {node: '>= 4.0'} @@ -3402,6 +3607,10 @@ packages: cookie-signature@1.0.7: resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + cookie@0.7.2: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} @@ -3801,6 +4010,10 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} @@ -3862,6 +4075,9 @@ packages: resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + devalue@5.6.1: + resolution: {integrity: sha512-jDwizj+IlEZBunHcOuuFVBnIMPAEHvTsJj0BcIp94xYguLRVBcXO853px/MyIJvbVzWdsGvrRweIUWJw8hBP7A==} + diff@7.0.0: resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} engines: {node: '>=0.3.1'} @@ -4408,6 +4624,16 @@ packages: resolution: {integrity: sha512-qr7RJCYImKQjB+39q4q46i1l7p1V3joHzBE5CAYfxn5tfVFjrnjn/tw7q/kDyweU9kAIcLul0Dx/KWVUCb3BgA==} engines: {node: ^16.0.0 || ^18.0.0 || >=20.0.0} + eslint-plugin-svelte@3.13.1: + resolution: {integrity: sha512-Ng+kV/qGS8P/isbNYVE3sJORtubB+yLEcYICMkUWNaDTb0SwZni/JhAYXh/Dz/q2eThUwWY0VMPZ//KYD1n3eQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.1 || ^9.0.0 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + eslint-plugin-unicorn@62.0.0: resolution: {integrity: sha512-HIlIkGLkvf29YEiS/ImuDZQbP12gWyx5i3C6XrRxMvVdqMroCI9qoVYCoIl17ChN+U89pn9sVwLxhIWj5nEc7g==} engines: {node: ^20.10.0 || >=21.0.0} @@ -4454,6 +4680,9 @@ packages: jiti: optional: true + esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + esm@3.2.25: resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} engines: {node: '>=6'} @@ -4476,6 +4705,9 @@ packages: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} + esrap@2.2.1: + resolution: {integrity: sha512-GiYWG34AN/4CUyaWAgunGt0Rxvr1PTMlGC0vvEov/uOQYWne2bpN03Um+k8jT+q3op33mKouP2zeJ6OlM+qeUg==} + esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -5414,6 +5646,9 @@ packages: is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -5635,6 +5870,13 @@ packages: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + known-css-properties@0.37.0: + resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} + langium@3.3.1: resolution: {integrity: sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==} engines: {node: '>=16.0.0'} @@ -5653,6 +5895,10 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + line-column@1.0.2: resolution: {integrity: sha512-Ktrjk5noGYlHsVnYWh62FLVs4hTb8A3e+vucNZMgPeAOITdshMSgv4cCZQeRDjm7+goqmo6+liZwTXo+U3sVww==} @@ -5676,6 +5922,9 @@ packages: loader.js@4.7.0: resolution: {integrity: sha512-9M2KvGT6duzGMgkOcTkWb+PR/Q2Oe54df/tLgHGVmFpAmtqJ553xJh6N63iFYI2yjo2PeJXbS5skHi/QpJq4vA==} + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + locate-path@2.0.0: resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} engines: {node: '>=4'} @@ -5988,6 +6237,14 @@ packages: resolution: {integrity: sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==} engines: {node: '>= 0.8.0'} + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -6402,6 +6659,10 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} + pixelmatch@7.1.0: + resolution: {integrity: sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng==} + hasBin: true + pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -6445,6 +6706,10 @@ packages: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} + pngjs@7.0.0: + resolution: {integrity: sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==} + engines: {node: '>=14.19.0'} + points-on-curve@0.2.0: resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} @@ -6558,6 +6823,18 @@ packages: peerDependencies: postcss: ^8.4 + postcss-load-config@3.1.4: + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} + engines: {node: '>= 10'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + postcss-loader@8.2.0: resolution: {integrity: sha512-tHX+RkpsXVcc7st4dSdDGliI+r4aAQDuv+v3vFYHixb6YgjreG5AG4SEB0kDK8u2s6htqEEpKlkhSBUTvWKYnA==} engines: {node: '>= 18.12.0'} @@ -6647,6 +6924,18 @@ packages: peerDependencies: postcss: ^8.0.3 + postcss-safe-parser@7.0.1: + resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.4.31 + + postcss-scss@4.0.9: + resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.4.29 + postcss-selector-not@8.0.1: resolution: {integrity: sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==} engines: {node: '>=18'} @@ -6682,6 +6971,12 @@ packages: peerDependencies: prettier: '>= 3.0.0' + prettier-plugin-svelte@3.4.0: + resolution: {integrity: sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ==} + peerDependencies: + prettier: ^3.0.0 + svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 + prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} @@ -6802,6 +7097,10 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + recast@0.18.10: resolution: {integrity: sha512-XNvYvkfdAN9QewbrxeTOjgINkdY/odTgTS56ZNEWL9Ml0weT4T3sFtvnTuF+Gxyu46ANcRm1ntrF6F5LAJPAaQ==} engines: {node: '>= 4'} @@ -7025,6 +7324,10 @@ packages: rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + safe-array-concat@1.1.3: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} @@ -7121,6 +7424,9 @@ packages: set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + set-cookie-parser@2.7.2: + resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -7194,6 +7500,10 @@ packages: simple-html-tokenizer@0.5.11: resolution: {integrity: sha512-C2WEK/Z3HoSFbYq8tI7ni3eOo/NneSPRoPpcM7WdLjFOArFuyXEjAoCdOC3DgMfRyziZQ1hCNR4mrNdWEvD0og==} + sirv@3.0.2: + resolution: {integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==} + engines: {node: '>=18'} + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -7445,6 +7755,27 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + svelte-check@4.3.4: + resolution: {integrity: sha512-DVWvxhBrDsd+0hHWKfjP99lsSXASeOhHJYyuKOFYJcP7ThfSCKgjVarE8XfuMWpS5JV3AlDf+iK1YGGo2TACdw==} + engines: {node: '>= 18.0.0'} + hasBin: true + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.0 + typescript: '>=5.0.0' + + svelte-eslint-parser@1.4.1: + resolution: {integrity: sha512-1eqkfQ93goAhjAXxZiu1SaKI9+0/sxp4JIWQwUpsz7ybehRE5L8dNuz7Iry7K22R47p5/+s9EM+38nHV2OlgXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0, pnpm: 10.24.0} + peerDependencies: + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + + svelte@5.45.10: + resolution: {integrity: sha512-GiWXq6akkEN3zVDMQ1BVlRolmks5JkEdzD/67mvXOz6drRfuddT5JwsGZjMGSnsTRv/PjAXX8fqBcOr2g2qc/Q==} + engines: {node: '>=18'} + svg-tags@1.0.0: resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} @@ -7612,6 +7943,10 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + totalist@3.0.1: + resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + engines: {node: '>=6'} + tough-cookie@4.1.4: resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} engines: {node: '>=6'} @@ -7642,6 +7977,12 @@ packages: resolution: {integrity: sha512-OLWW+Nd99NOM53aZ8ilT/YpEiOo6mXD3F4/wLbARqybSZ3Jb8IxHK5UGVbZaae0wtXAyQshVV+SeqVBik+Fbmw==} engines: {node: '>=8'} + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + ts-dedent@2.2.0: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} @@ -7699,6 +8040,13 @@ packages: typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + typescript-eslint@8.49.0: + resolution: {integrity: sha512-zRSVH1WXD0uXczCXw+nsdjGPUdx4dfrs5VQoHnUWmv1U3oNlAKv4FUNdLDhVUg+gYn+a5hUESqch//Rv5wVhrg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + typescript-memoize@1.1.1: resolution: {integrity: sha512-GQ90TcKpIH4XxYTI2F98yEQYZgjNMOGPpOgdjIBhaLaWji5HPWlRnZ4AeA1hfBxtY7bCGDJsqDDHk/KaHOl5bA==} @@ -7886,6 +8234,20 @@ packages: yaml: optional: true + vitefu@1.1.1: + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 + peerDependenciesMeta: + vite: + optional: true + + vitest-browser-svelte@2.0.1: + resolution: {integrity: sha512-z7GFio7vxaOolY+xwPUMEKuwL4KcPzB8+bepA9F0Phqag/TJ4j7IAGSwm4Y/FBh7KznsP+7aEIllMay0qDpFXw==} + peerDependencies: + svelte: ^3 || ^4 || ^5 || ^5.0.0-next.0 + vitest: ^4.0.0 + vitest@4.0.15: resolution: {integrity: sha512-n1RxDp8UJm6N0IbJLQo+yzLZ2sQCDyl1o0LeugbPWf8+8Fttp29GghsQBjYJVmWq3gBFfe9Hs1spR44vovn2wA==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -8174,6 +8536,10 @@ packages: resolution: {integrity: sha512-Hv9xxHtsJ9228wNhk03xnlDReUuWVvHwM4rIbjdAXYvHLs17xjuyF50N6XXFMN6N0omBaqgOok/MCK3At9fTAg==} engines: {node: ^4.5 || 6.* || >= 7.*} + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + yaml@2.8.2: resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} engines: {node: '>= 14.6'} @@ -8210,6 +8576,9 @@ packages: resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} + zimmerframe@1.1.4: + resolution: {integrity: sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==} + zod@4.1.13: resolution: {integrity: sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==} @@ -9800,6 +10169,12 @@ snapshots: '@eslint-community/regexpp@4.12.2': {} + '@eslint/compat@1.4.1(eslint@9.39.1(jiti@2.6.1))': + dependencies: + '@eslint/core': 0.17.0 + optionalDependencies: + eslint: 9.39.1(jiti@2.6.1) + '@eslint/config-array@0.21.1': dependencies: '@eslint/object-schema': 2.1.7 @@ -10385,6 +10760,8 @@ snapshots: '@pnpm/error': 1000.0.5 find-up: 5.0.0 + '@polka/url@1.0.0-next.29': {} + '@rollup/wasm-node@4.53.3': dependencies: '@types/estree': 1.0.8 @@ -10465,6 +10842,54 @@ snapshots: '@standard-schema/spec@1.0.0': {} + '@sveltejs/acorn-typescript@1.0.8(acorn@8.15.0)': + dependencies: + acorn: 8.15.0 + + '@sveltejs/adapter-auto@7.0.0(@sveltejs/kit@2.49.2(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)))(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)))': + dependencies: + '@sveltejs/kit': 2.49.2(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)))(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) + + '@sveltejs/kit@2.49.2(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)))(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))': + dependencies: + '@standard-schema/spec': 1.0.0 + '@sveltejs/acorn-typescript': 1.0.8(acorn@8.15.0) + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) + '@types/cookie': 0.6.0 + acorn: 8.15.0 + cookie: 0.6.0 + devalue: 5.6.1 + esm-env: 1.2.2 + kleur: 4.1.5 + magic-string: 0.30.21 + mrmime: 2.0.1 + sade: 1.8.1 + set-cookie-parser: 2.7.2 + sirv: 3.0.2 + svelte: 5.45.10 + vite: 7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2) + + '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)))(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))': + dependencies: + '@sveltejs/vite-plugin-svelte': 6.2.1(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) + debug: 4.4.3(supports-color@8.1.1) + svelte: 5.45.10 + vite: 7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)))(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) + debug: 4.4.3(supports-color@8.1.1) + deepmerge: 4.3.1 + magic-string: 0.30.21 + svelte: 5.45.10 + vite: 7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2) + vitefu: 1.1.1(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) + transitivePeerDependencies: + - supports-color + '@tootallnate/once@1.1.2': {} '@tootallnate/quickjs-emscripten@0.23.0': {} @@ -10491,6 +10916,8 @@ snapshots: dependencies: '@types/node': 24.10.2 + '@types/cookie@0.6.0': {} + '@types/cors@2.8.19': dependencies: '@types/node': 24.10.2 @@ -10723,10 +11150,131 @@ snapshots: '@types/node': 24.10.2 optional: true + '@typescript-eslint/eslint-plugin@8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.49.0 + '@typescript-eslint/type-utils': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.49.0 + eslint: 9.39.1(jiti@2.6.1) + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.49.0 + '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.49.0 + debug: 4.4.3(supports-color@8.1.1) + eslint: 9.39.1(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.49.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.9.3) + '@typescript-eslint/types': 8.49.0 + debug: 4.4.3(supports-color@8.1.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.49.0': + dependencies: + '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/visitor-keys': 8.49.0 + '@typescript-eslint/tsconfig-utils@8.48.1(typescript@5.9.3)': dependencies: typescript: 5.9.3 + '@typescript-eslint/tsconfig-utils@8.49.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + debug: 4.4.3(supports-color@8.1.1) + eslint: 9.39.1(jiti@2.6.1) + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.49.0': {} + + '@typescript-eslint/typescript-estree@8.49.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.49.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.9.3) + '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/visitor-keys': 8.49.0 + debug: 4.4.3(supports-color@8.1.1) + minimatch: 9.0.5 + semver: 7.7.3 + tinyglobby: 0.2.15 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.49.0 + '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3) + eslint: 9.39.1(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.49.0': + dependencies: + '@typescript-eslint/types': 8.49.0 + eslint-visitor-keys: 4.2.1 + + '@vitest/browser-playwright@4.0.15(msw@2.12.4(@types/node@24.10.2)(typescript@5.9.3))(playwright@1.57.0)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))(vitest@4.0.15)': + dependencies: + '@vitest/browser': 4.0.15(msw@2.12.4(@types/node@24.10.2)(typescript@5.9.3))(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))(vitest@4.0.15) + '@vitest/mocker': 4.0.15(msw@2.12.4(@types/node@24.10.2)(typescript@5.9.3))(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) + playwright: 1.57.0 + tinyrainbow: 3.0.3 + vitest: 4.0.15(@types/node@24.10.2)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1)(jsdom@25.0.1)(msw@2.12.4(@types/node@24.10.2)(typescript@5.9.3))(terser@5.44.1)(yaml@2.8.2) + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite + + '@vitest/browser@4.0.15(msw@2.12.4(@types/node@24.10.2)(typescript@5.9.3))(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))(vitest@4.0.15)': + dependencies: + '@vitest/mocker': 4.0.15(msw@2.12.4(@types/node@24.10.2)(typescript@5.9.3))(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) + '@vitest/utils': 4.0.15 + magic-string: 0.30.21 + pixelmatch: 7.1.0 + pngjs: 7.0.0 + sirv: 3.0.2 + tinyrainbow: 3.0.3 + vitest: 4.0.15(@types/node@24.10.2)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1)(jsdom@25.0.1)(msw@2.12.4(@types/node@24.10.2)(typescript@5.9.3))(terser@5.44.1)(yaml@2.8.2) + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - msw + - utf-8-validate + - vite + '@vitest/expect@4.0.15': dependencies: '@standard-schema/spec': 1.0.0 @@ -11066,6 +11614,8 @@ snapshots: argparse@2.0.1: {} + aria-query@5.3.2: {} + arr-diff@4.0.0: {} arr-flatten@1.1.0: {} @@ -11185,6 +11735,8 @@ snapshots: axe-core@4.11.0: {} + axobject-query@4.1.0: {} + babel-import-util@2.1.1: {} babel-import-util@3.0.1: {} @@ -11890,6 +12442,10 @@ snapshots: '@chevrotain/utils': 11.0.3 lodash-es: 4.17.21 + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + chrome-trace-event@1.0.4: {} ci-info@4.3.1: {} @@ -11947,6 +12503,8 @@ snapshots: clone@2.1.2: {} + clsx@2.1.1: {} + coa@2.0.2: dependencies: '@types/q': 1.5.8 @@ -12081,6 +12639,8 @@ snapshots: cookie-signature@1.0.7: {} + cookie@0.6.0: {} + cookie@0.7.2: {} cookie@1.1.1: {} @@ -12508,6 +13068,8 @@ snapshots: deep-is@0.1.4: {} + deepmerge@4.3.1: {} + defaults@1.0.4: dependencies: clone: 1.0.4 @@ -12563,6 +13125,8 @@ snapshots: detect-newline@4.0.1: {} + devalue@5.6.1: {} + diff@7.0.0: {} dir-glob@3.0.1: @@ -13193,7 +13757,7 @@ snapshots: transitivePeerDependencies: - supports-color - ember-eslint-parser@0.5.13(@babel/core@7.28.5)(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + ember-eslint-parser@0.5.13(@babel/core@7.28.5)(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): dependencies: '@babel/core': 7.28.5(supports-color@8.1.1) '@babel/eslint-parser': 7.28.5(@babel/core@7.28.5)(eslint@9.39.1(jiti@2.6.1)) @@ -13204,6 +13768,8 @@ snapshots: html-tags: 3.3.1 mathml-tag-names: 2.1.3 svg-tags: 1.0.0 + optionalDependencies: + '@typescript-eslint/parser': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) transitivePeerDependencies: - eslint - typescript @@ -13681,11 +14247,11 @@ snapshots: dependencies: eslint: 9.39.1(jiti@2.6.1) - eslint-plugin-ember@12.7.5(@babel/core@7.28.5)(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + eslint-plugin-ember@12.7.5(@babel/core@7.28.5)(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): dependencies: '@ember-data/rfc395-data': 0.0.4 css-tree: 3.1.0 - ember-eslint-parser: 0.5.13(@babel/core@7.28.5)(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + ember-eslint-parser: 0.5.13(@babel/core@7.28.5)(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) ember-rfc176-data: 0.3.18 eslint: 9.39.1(jiti@2.6.1) eslint-utils: 3.0.0(eslint@9.39.1(jiti@2.6.1)) @@ -13694,6 +14260,8 @@ snapshots: lodash.kebabcase: 4.1.1 requireindex: 1.2.0 snake-case: 3.0.4 + optionalDependencies: + '@typescript-eslint/parser': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) transitivePeerDependencies: - '@babel/core' - typescript @@ -13723,6 +14291,24 @@ snapshots: transitivePeerDependencies: - eslint + eslint-plugin-svelte@3.13.1(eslint@9.39.1(jiti@2.6.1))(svelte@5.45.10): + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) + '@jridgewell/sourcemap-codec': 1.5.5 + eslint: 9.39.1(jiti@2.6.1) + esutils: 2.0.3 + globals: 16.5.0 + known-css-properties: 0.37.0 + postcss: 8.5.6 + postcss-load-config: 3.1.4(postcss@8.5.6) + postcss-safe-parser: 7.0.1(postcss@8.5.6) + semver: 7.7.3 + svelte-eslint-parser: 1.4.1(svelte@5.45.10) + optionalDependencies: + svelte: 5.45.10 + transitivePeerDependencies: + - ts-node + eslint-plugin-unicorn@62.0.0(eslint@9.39.1(jiti@2.6.1)): dependencies: '@babel/helper-validator-identifier': 7.28.5 @@ -13812,6 +14398,8 @@ snapshots: transitivePeerDependencies: - supports-color + esm-env@1.2.2: {} + esm@3.2.25: {} espree@10.4.0: @@ -13828,6 +14416,10 @@ snapshots: dependencies: estraverse: 5.3.0 + esrap@2.2.1: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 @@ -14992,6 +15584,10 @@ snapshots: is-potential-custom-element-name@1.0.1: {} + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.8 + is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -15245,6 +15841,10 @@ snapshots: kind-of@6.0.3: {} + kleur@4.1.5: {} + + known-css-properties@0.37.0: {} + langium@3.3.1: dependencies: chevrotain: 11.0.3 @@ -15266,6 +15866,8 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lilconfig@2.1.0: {} + line-column@1.0.2: dependencies: isarray: 1.0.0 @@ -15289,6 +15891,8 @@ snapshots: loader.js@4.7.0: {} + locate-character@3.0.0: {} + locate-path@2.0.0: dependencies: p-locate: 2.0.0 @@ -15628,6 +16232,10 @@ snapshots: transitivePeerDependencies: - supports-color + mri@1.2.0: {} + + mrmime@2.0.1: {} + ms@2.0.0: {} ms@2.1.3: {} @@ -16043,6 +16651,10 @@ snapshots: picomatch@4.0.3: {} + pixelmatch@7.1.0: + dependencies: + pngjs: 7.0.0 + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 @@ -16084,6 +16696,8 @@ snapshots: pluralize@8.0.0: {} + pngjs@7.0.0: {} + points-on-curve@0.2.0: {} points-on-path@0.2.1: @@ -16203,6 +16817,13 @@ snapshots: '@csstools/utilities': 2.0.0(postcss@8.5.6) postcss: 8.5.6 + postcss-load-config@3.1.4(postcss@8.5.6): + dependencies: + lilconfig: 2.1.0 + yaml: 1.10.2 + optionalDependencies: + postcss: 8.5.6 + postcss-loader@8.2.0(postcss@8.5.6)(typescript@5.9.3)(webpack@5.103.0): dependencies: cosmiconfig: 9.0.0(typescript@5.9.3) @@ -16347,6 +16968,14 @@ snapshots: dependencies: postcss: 8.5.6 + postcss-safe-parser@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-scss@4.0.9(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-not@8.0.1(postcss@8.5.6): dependencies: postcss: 8.5.6 @@ -16384,6 +17013,11 @@ snapshots: transitivePeerDependencies: - supports-color + prettier-plugin-svelte@3.4.0(prettier@3.7.4)(svelte@5.45.10): + dependencies: + prettier: 3.7.4 + svelte: 5.45.10 + prettier@2.8.8: {} prettier@3.7.4: {} @@ -16497,6 +17131,8 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 + readdirp@4.1.2: {} + recast@0.18.10: dependencies: ast-types: 0.13.3 @@ -16715,6 +17351,10 @@ snapshots: dependencies: tslib: 2.8.1 + sade@1.8.1: + dependencies: + mri: 1.2.0 + safe-array-concat@1.1.3: dependencies: call-bind: 1.0.8 @@ -16860,6 +17500,8 @@ snapshots: set-blocking@2.0.0: {} + set-cookie-parser@2.7.2: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -16949,6 +17591,12 @@ snapshots: simple-html-tokenizer@0.5.11: {} + sirv@3.0.2: + dependencies: + '@polka/url': 1.0.0-next.29 + mrmime: 2.0.1 + totalist: 3.0.1 + slash@3.0.0: {} slash@5.1.0: {} @@ -17241,6 +17889,47 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + svelte-check@4.3.4(picomatch@4.0.3)(svelte@5.45.10)(typescript@5.9.3): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + chokidar: 4.0.3 + fdir: 6.5.0(picomatch@4.0.3) + picocolors: 1.1.1 + sade: 1.8.1 + svelte: 5.45.10 + typescript: 5.9.3 + transitivePeerDependencies: + - picomatch + + svelte-eslint-parser@1.4.1(svelte@5.45.10): + dependencies: + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + postcss: 8.5.6 + postcss-scss: 4.0.9(postcss@8.5.6) + postcss-selector-parser: 7.1.1 + optionalDependencies: + svelte: 5.45.10 + + svelte@5.45.10: + dependencies: + '@jridgewell/remapping': 2.3.5 + '@jridgewell/sourcemap-codec': 1.5.5 + '@sveltejs/acorn-typescript': 1.0.8(acorn@8.15.0) + '@types/estree': 1.0.8 + acorn: 8.15.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + clsx: 2.1.1 + devalue: 5.6.1 + esm-env: 1.2.2 + esrap: 2.2.1 + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.21 + zimmerframe: 1.1.4 + svg-tags@1.0.0: {} svgo@1.3.0: @@ -17501,6 +18190,8 @@ snapshots: toidentifier@1.0.1: {} + totalist@3.0.1: {} + tough-cookie@4.1.4: dependencies: psl: 1.15.0 @@ -17553,6 +18244,10 @@ snapshots: transitivePeerDependencies: - supports-color + ts-api-utils@2.1.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + ts-dedent@2.2.0: {} tslib@1.14.1: {} @@ -17617,6 +18312,17 @@ snapshots: dependencies: is-typedarray: 1.0.0 + typescript-eslint@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.49.0(@typescript-eslint/parser@8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.49.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.1(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + typescript-memoize@1.1.1: {} typescript@5.9.3: {} @@ -17754,7 +18460,16 @@ snapshots: terser: 5.44.1 yaml: 2.8.2 - vitest@4.0.15(@types/node@24.10.2)(jiti@2.6.1)(jsdom@25.0.1)(msw@2.12.4(@types/node@24.10.2)(typescript@5.9.3))(terser@5.44.1)(yaml@2.8.2): + vitefu@1.1.1(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)): + optionalDependencies: + vite: 7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2) + + vitest-browser-svelte@2.0.1(svelte@5.45.10)(vitest@4.0.15): + dependencies: + svelte: 5.45.10 + vitest: 4.0.15(@types/node@24.10.2)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1)(jsdom@25.0.1)(msw@2.12.4(@types/node@24.10.2)(typescript@5.9.3))(terser@5.44.1)(yaml@2.8.2) + + vitest@4.0.15(@types/node@24.10.2)(@vitest/browser-playwright@4.0.15)(jiti@2.6.1)(jsdom@25.0.1)(msw@2.12.4(@types/node@24.10.2)(typescript@5.9.3))(terser@5.44.1)(yaml@2.8.2): dependencies: '@vitest/expect': 4.0.15 '@vitest/mocker': 4.0.15(msw@2.12.4(@types/node@24.10.2)(typescript@5.9.3))(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) @@ -17778,6 +18493,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 24.10.2 + '@vitest/browser-playwright': 4.0.15(msw@2.12.4(@types/node@24.10.2)(typescript@5.9.3))(playwright@1.57.0)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))(vitest@4.0.15) jsdom: 25.0.1(supports-color@8.1.1) transitivePeerDependencies: - jiti @@ -18070,6 +18786,8 @@ snapshots: fs-extra: 4.0.3 lodash.merge: 4.6.2 + yaml@1.10.2: {} + yaml@2.8.2: {} yargs-parser@20.2.9: {} @@ -18107,4 +18825,6 @@ snapshots: yoctocolors-cjs@2.1.3: {} + zimmerframe@1.1.4: {} + zod@4.1.13: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 18ec407efc..c0424f5d06 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,2 +1,3 @@ packages: - 'packages/*' + - 'svelte/' diff --git a/svelte/.gitignore b/svelte/.gitignore new file mode 100644 index 0000000000..3b462cb0c4 --- /dev/null +++ b/svelte/.gitignore @@ -0,0 +1,23 @@ +node_modules + +# Output +.output +.vercel +.netlify +.wrangler +/.svelte-kit +/build + +# OS +.DS_Store +Thumbs.db + +# Env +.env +.env.* +!.env.example +!.env.test + +# Vite +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/svelte/.prettierignore b/svelte/.prettierignore new file mode 100644 index 0000000000..7d74fe2468 --- /dev/null +++ b/svelte/.prettierignore @@ -0,0 +1,9 @@ +# Package Managers +package-lock.json +pnpm-lock.yaml +yarn.lock +bun.lock +bun.lockb + +# Miscellaneous +/static/ diff --git a/svelte/.prettierrc b/svelte/.prettierrc new file mode 100644 index 0000000000..3f7802c372 --- /dev/null +++ b/svelte/.prettierrc @@ -0,0 +1,15 @@ +{ + "useTabs": true, + "singleQuote": true, + "trailingComma": "none", + "printWidth": 100, + "plugins": ["prettier-plugin-svelte"], + "overrides": [ + { + "files": "*.svelte", + "options": { + "parser": "svelte" + } + } + ] +} diff --git a/svelte/README.md b/svelte/README.md new file mode 100644 index 0000000000..75842c404d --- /dev/null +++ b/svelte/README.md @@ -0,0 +1,38 @@ +# sv + +Everything you need to build a Svelte project, powered by [`sv`](https://github.com/sveltejs/cli). + +## Creating a project + +If you're seeing this, you've probably already done this step. Congrats! + +```sh +# create a new project in the current directory +npx sv create + +# create a new project in my-app +npx sv create my-app +``` + +## Developing + +Once you've created a project and installed dependencies with `npm install` (or `pnpm install` or `yarn`), start a development server: + +```sh +npm run dev + +# or start the server and open the app in a new browser tab +npm run dev -- --open +``` + +## Building + +To create a production version of your app: + +```sh +npm run build +``` + +You can preview the production build with `npm run preview`. + +> To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment. diff --git a/svelte/eslint.config.js b/svelte/eslint.config.js new file mode 100644 index 0000000000..a3c1f11c5f --- /dev/null +++ b/svelte/eslint.config.js @@ -0,0 +1,41 @@ +import prettier from 'eslint-config-prettier'; +import { fileURLToPath } from 'node:url'; +import { includeIgnoreFile } from '@eslint/compat'; +import js from '@eslint/js'; +import svelte from 'eslint-plugin-svelte'; +import { defineConfig } from 'eslint/config'; +import globals from 'globals'; +import ts from 'typescript-eslint'; +import svelteConfig from './svelte.config.js'; + +const gitignorePath = fileURLToPath(new URL('./.gitignore', import.meta.url)); + +export default defineConfig( + includeIgnoreFile(gitignorePath), + js.configs.recommended, + ...ts.configs.recommended, + ...svelte.configs.recommended, + prettier, + ...svelte.configs.prettier, + { + languageOptions: { globals: { ...globals.browser, ...globals.node } }, + + rules: { + // typescript-eslint strongly recommend that you do not use the no-undef lint rule on TypeScript projects. + // see: https://typescript-eslint.io/troubleshooting/faqs/eslint/#i-get-errors-from-the-no-undef-rule-about-global-variables-not-being-defined-even-though-there-are-no-typescript-errors + 'no-undef': 'off', + }, + }, + { + files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'], + + languageOptions: { + parserOptions: { + projectService: true, + extraFileExtensions: ['.svelte'], + parser: ts.parser, + svelteConfig, + }, + }, + }, +); diff --git a/svelte/package.json b/svelte/package.json new file mode 100644 index 0000000000..958a32cc1a --- /dev/null +++ b/svelte/package.json @@ -0,0 +1,41 @@ +{ + "name": "crates.io-svelte", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "prepare": "svelte-kit sync || echo ''", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "format": "prettier --write .", + "lint": "prettier --check . && eslint .", + "test:unit": "vitest", + "test": "npm run test:unit -- --run" + }, + "devDependencies": { + "@eslint/compat": "^1.4.0", + "@eslint/js": "^9.39.1", + "@sveltejs/adapter-auto": "^7.0.0", + "@sveltejs/kit": "^2.49.1", + "@sveltejs/vite-plugin-svelte": "^6.2.1", + "@types/node": "^24", + "@vitest/browser-playwright": "^4.0.15", + "eslint": "^9.39.1", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-svelte": "^3.13.1", + "globals": "^16.5.0", + "playwright": "^1.57.0", + "prettier": "^3.7.4", + "prettier-plugin-svelte": "^3.4.0", + "svelte": "^5.45.6", + "svelte-check": "^4.3.4", + "typescript": "^5.9.3", + "typescript-eslint": "^8.48.1", + "vite": "^7.2.6", + "vitest": "^4.0.15", + "vitest-browser-svelte": "^2.0.1" + } +} diff --git a/svelte/src/app.d.ts b/svelte/src/app.d.ts new file mode 100644 index 0000000000..da08e6da59 --- /dev/null +++ b/svelte/src/app.d.ts @@ -0,0 +1,13 @@ +// See https://svelte.dev/docs/kit/types#app.d.ts +// for information about these interfaces +declare global { + namespace App { + // interface Error {} + // interface Locals {} + // interface PageData {} + // interface PageState {} + // interface Platform {} + } +} + +export {}; diff --git a/svelte/src/app.html b/svelte/src/app.html new file mode 100644 index 0000000000..f273cc58f7 --- /dev/null +++ b/svelte/src/app.html @@ -0,0 +1,11 @@ + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/svelte/src/demo.spec.ts b/svelte/src/demo.spec.ts new file mode 100644 index 0000000000..e07cbbd725 --- /dev/null +++ b/svelte/src/demo.spec.ts @@ -0,0 +1,7 @@ +import { describe, it, expect } from 'vitest'; + +describe('sum test', () => { + it('adds 1 + 2 to equal 3', () => { + expect(1 + 2).toBe(3); + }); +}); diff --git a/svelte/src/lib/assets/favicon.svg b/svelte/src/lib/assets/favicon.svg new file mode 100644 index 0000000000..cc5dc66a3a --- /dev/null +++ b/svelte/src/lib/assets/favicon.svg @@ -0,0 +1 @@ +svelte-logo \ No newline at end of file diff --git a/svelte/src/lib/index.ts b/svelte/src/lib/index.ts new file mode 100644 index 0000000000..856f2b6c38 --- /dev/null +++ b/svelte/src/lib/index.ts @@ -0,0 +1 @@ +// place files you want to import through the `$lib` alias in this folder. diff --git a/svelte/src/routes/+layout.svelte b/svelte/src/routes/+layout.svelte new file mode 100644 index 0000000000..9cebde5455 --- /dev/null +++ b/svelte/src/routes/+layout.svelte @@ -0,0 +1,11 @@ + + + + + + +{@render children()} diff --git a/svelte/src/routes/+page.svelte b/svelte/src/routes/+page.svelte new file mode 100644 index 0000000000..cc88df0ea3 --- /dev/null +++ b/svelte/src/routes/+page.svelte @@ -0,0 +1,2 @@ +

Welcome to SvelteKit

+

Visit svelte.dev/docs/kit to read the documentation

diff --git a/svelte/src/routes/page.svelte.spec.ts b/svelte/src/routes/page.svelte.spec.ts new file mode 100644 index 0000000000..d54f00a743 --- /dev/null +++ b/svelte/src/routes/page.svelte.spec.ts @@ -0,0 +1,13 @@ +import { page } from 'vitest/browser'; +import { describe, expect, it } from 'vitest'; +import { render } from 'vitest-browser-svelte'; +import Page from './+page.svelte'; + +describe('/+page.svelte', () => { + it('should render h1', async () => { + render(Page); + + const heading = page.getByRole('heading', { level: 1 }); + await expect.element(heading).toBeInTheDocument(); + }); +}); diff --git a/svelte/static/robots.txt b/svelte/static/robots.txt new file mode 100644 index 0000000000..b6dd6670cb --- /dev/null +++ b/svelte/static/robots.txt @@ -0,0 +1,3 @@ +# allow crawling everything by default +User-agent: * +Disallow: diff --git a/svelte/svelte.config.js b/svelte/svelte.config.js new file mode 100644 index 0000000000..1295460d12 --- /dev/null +++ b/svelte/svelte.config.js @@ -0,0 +1,18 @@ +import adapter from '@sveltejs/adapter-auto'; +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + // Consult https://svelte.dev/docs/kit/integrations + // for more information about preprocessors + preprocess: vitePreprocess(), + + kit: { + // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list. + // If your environment is not supported, or you settled on a specific environment, switch out the adapter. + // See https://svelte.dev/docs/kit/adapters for more information about adapters. + adapter: adapter() + } +}; + +export default config; diff --git a/svelte/tsconfig.json b/svelte/tsconfig.json new file mode 100644 index 0000000000..2c2ed3c4d8 --- /dev/null +++ b/svelte/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "rewriteRelativeImportExtensions": true, + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } + // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias + // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files + // + // To make changes to top-level options such as include and exclude, we recommend extending + // the generated config; see https://svelte.dev/docs/kit/configuration#typescript +} diff --git a/svelte/vite.config.ts b/svelte/vite.config.ts new file mode 100644 index 0000000000..e6d7c798ef --- /dev/null +++ b/svelte/vite.config.ts @@ -0,0 +1,41 @@ +import { defineConfig } from 'vitest/config'; +import { playwright } from '@vitest/browser-playwright'; +import { sveltekit } from '@sveltejs/kit/vite'; + +export default defineConfig({ + plugins: [sveltekit()], + + test: { + expect: { requireAssertions: true }, + + projects: [ + { + extends: './vite.config.ts', + + test: { + name: 'client', + + browser: { + enabled: true, + provider: playwright(), + instances: [{ browser: 'chromium', headless: true }] + }, + + include: ['src/**/*.svelte.{test,spec}.{js,ts}'], + exclude: ['src/lib/server/**'] + } + }, + + { + extends: './vite.config.ts', + + test: { + name: 'server', + environment: 'node', + include: ['src/**/*.{test,spec}.{js,ts}'], + exclude: ['src/**/*.svelte.{test,spec}.{js,ts}'] + } + } + ] + } +}); From 5be72264616ae3dd8c07ef28934a85f4beabb857 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Fri, 12 Dec 2025 19:29:35 +0100 Subject: [PATCH 02/13] svelte: Add to AGENTS.md file --- AGENTS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AGENTS.md b/AGENTS.md index cbd2fb4a08..5ad62ebc04 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -17,6 +17,7 @@ - `/app/models/` - Ember Data models (crate, version, user, keyword, etc.) - `/app/adapters/`, `/app/serializers/` - Ember Data adapter layer - `/app/services/` - Shared services (session, notifications, API client) +- `/svelte/` - Frontend SvelteKit application (WIP) - `/crates/` - Workspace crates providing specialized functionality - `crates_io_api_types/` - API response serialization types - `crates_io_database/` - Database models and schema (Diesel ORM) From 44287df2be5bb68f807b7472369602fec91f3fb0 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Fri, 12 Dec 2025 18:57:00 +0100 Subject: [PATCH 03/13] svelte: Adjust prettier rules to match Ember.js app --- svelte/.prettierrc | 27 +++++----- svelte/package.json | 78 +++++++++++++-------------- svelte/src/app.d.ts | 14 ++--- svelte/src/app.html | 16 +++--- svelte/src/demo.spec.ts | 6 +-- svelte/src/routes/+layout.svelte | 6 +-- svelte/src/routes/+page.svelte | 4 +- svelte/src/routes/page.svelte.spec.ts | 10 ++-- svelte/svelte.config.js | 18 +++---- svelte/tsconfig.json | 36 ++++++------- svelte/vite.config.ts | 70 ++++++++++++------------ 11 files changed, 144 insertions(+), 141 deletions(-) diff --git a/svelte/.prettierrc b/svelte/.prettierrc index 3f7802c372..d1fa6cb929 100644 --- a/svelte/.prettierrc +++ b/svelte/.prettierrc @@ -1,15 +1,16 @@ { - "useTabs": true, - "singleQuote": true, - "trailingComma": "none", - "printWidth": 100, - "plugins": ["prettier-plugin-svelte"], - "overrides": [ - { - "files": "*.svelte", - "options": { - "parser": "svelte" - } - } - ] + "arrowParens": "avoid", + "printWidth": 120, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "all", + "plugins": ["prettier-plugin-svelte"], + "overrides": [ + { + "files": "*.svelte", + "options": { + "parser": "svelte" + } + } + ] } diff --git a/svelte/package.json b/svelte/package.json index 958a32cc1a..bf13ec3272 100644 --- a/svelte/package.json +++ b/svelte/package.json @@ -1,41 +1,41 @@ { - "name": "crates.io-svelte", - "version": "0.0.0", - "private": true, - "type": "module", - "scripts": { - "dev": "vite dev", - "build": "vite build", - "preview": "vite preview", - "prepare": "svelte-kit sync || echo ''", - "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", - "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", - "format": "prettier --write .", - "lint": "prettier --check . && eslint .", - "test:unit": "vitest", - "test": "npm run test:unit -- --run" - }, - "devDependencies": { - "@eslint/compat": "^1.4.0", - "@eslint/js": "^9.39.1", - "@sveltejs/adapter-auto": "^7.0.0", - "@sveltejs/kit": "^2.49.1", - "@sveltejs/vite-plugin-svelte": "^6.2.1", - "@types/node": "^24", - "@vitest/browser-playwright": "^4.0.15", - "eslint": "^9.39.1", - "eslint-config-prettier": "^10.1.8", - "eslint-plugin-svelte": "^3.13.1", - "globals": "^16.5.0", - "playwright": "^1.57.0", - "prettier": "^3.7.4", - "prettier-plugin-svelte": "^3.4.0", - "svelte": "^5.45.6", - "svelte-check": "^4.3.4", - "typescript": "^5.9.3", - "typescript-eslint": "^8.48.1", - "vite": "^7.2.6", - "vitest": "^4.0.15", - "vitest-browser-svelte": "^2.0.1" - } + "name": "crates.io-svelte", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "prepare": "svelte-kit sync || echo ''", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "format": "prettier --write .", + "lint": "prettier --check . && eslint .", + "test:unit": "vitest", + "test": "npm run test:unit -- --run" + }, + "devDependencies": { + "@eslint/compat": "^1.4.0", + "@eslint/js": "^9.39.1", + "@sveltejs/adapter-auto": "^7.0.0", + "@sveltejs/kit": "^2.49.1", + "@sveltejs/vite-plugin-svelte": "^6.2.1", + "@types/node": "^24", + "@vitest/browser-playwright": "^4.0.15", + "eslint": "^9.39.1", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-svelte": "^3.13.1", + "globals": "^16.5.0", + "playwright": "^1.57.0", + "prettier": "^3.7.4", + "prettier-plugin-svelte": "^3.4.0", + "svelte": "^5.45.6", + "svelte-check": "^4.3.4", + "typescript": "^5.9.3", + "typescript-eslint": "^8.48.1", + "vite": "^7.2.6", + "vitest": "^4.0.15", + "vitest-browser-svelte": "^2.0.1" + } } diff --git a/svelte/src/app.d.ts b/svelte/src/app.d.ts index da08e6da59..520c4217a1 100644 --- a/svelte/src/app.d.ts +++ b/svelte/src/app.d.ts @@ -1,13 +1,13 @@ // See https://svelte.dev/docs/kit/types#app.d.ts // for information about these interfaces declare global { - namespace App { - // interface Error {} - // interface Locals {} - // interface PageData {} - // interface PageState {} - // interface Platform {} - } + namespace App { + // interface Error {} + // interface Locals {} + // interface PageData {} + // interface PageState {} + // interface Platform {} + } } export {}; diff --git a/svelte/src/app.html b/svelte/src/app.html index f273cc58f7..adf8bd8737 100644 --- a/svelte/src/app.html +++ b/svelte/src/app.html @@ -1,11 +1,11 @@ - - - - %sveltekit.head% - - -
%sveltekit.body%
- + + + + %sveltekit.head% + + +
%sveltekit.body%
+ diff --git a/svelte/src/demo.spec.ts b/svelte/src/demo.spec.ts index e07cbbd725..964d287251 100644 --- a/svelte/src/demo.spec.ts +++ b/svelte/src/demo.spec.ts @@ -1,7 +1,7 @@ import { describe, it, expect } from 'vitest'; describe('sum test', () => { - it('adds 1 + 2 to equal 3', () => { - expect(1 + 2).toBe(3); - }); + it('adds 1 + 2 to equal 3', () => { + expect(1 + 2).toBe(3); + }); }); diff --git a/svelte/src/routes/+layout.svelte b/svelte/src/routes/+layout.svelte index 9cebde5455..cba194029e 100644 --- a/svelte/src/routes/+layout.svelte +++ b/svelte/src/routes/+layout.svelte @@ -1,11 +1,11 @@ - + {@render children()} diff --git a/svelte/src/routes/+page.svelte b/svelte/src/routes/+page.svelte index cc88df0ea3..1a0164136a 100644 --- a/svelte/src/routes/+page.svelte +++ b/svelte/src/routes/+page.svelte @@ -1,2 +1,4 @@

Welcome to SvelteKit

-

Visit svelte.dev/docs/kit to read the documentation

+

+ Visit svelte.dev/docs/kit to read the documentation +

diff --git a/svelte/src/routes/page.svelte.spec.ts b/svelte/src/routes/page.svelte.spec.ts index d54f00a743..8e43bd6eba 100644 --- a/svelte/src/routes/page.svelte.spec.ts +++ b/svelte/src/routes/page.svelte.spec.ts @@ -4,10 +4,10 @@ import { render } from 'vitest-browser-svelte'; import Page from './+page.svelte'; describe('/+page.svelte', () => { - it('should render h1', async () => { - render(Page); + it('should render h1', async () => { + render(Page); - const heading = page.getByRole('heading', { level: 1 }); - await expect.element(heading).toBeInTheDocument(); - }); + const heading = page.getByRole('heading', { level: 1 }); + await expect.element(heading).toBeInTheDocument(); + }); }); diff --git a/svelte/svelte.config.js b/svelte/svelte.config.js index 1295460d12..ff3d5f7c03 100644 --- a/svelte/svelte.config.js +++ b/svelte/svelte.config.js @@ -3,16 +3,16 @@ import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; /** @type {import('@sveltejs/kit').Config} */ const config = { - // Consult https://svelte.dev/docs/kit/integrations - // for more information about preprocessors - preprocess: vitePreprocess(), + // Consult https://svelte.dev/docs/kit/integrations + // for more information about preprocessors + preprocess: vitePreprocess(), - kit: { - // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list. - // If your environment is not supported, or you settled on a specific environment, switch out the adapter. - // See https://svelte.dev/docs/kit/adapters for more information about adapters. - adapter: adapter() - } + kit: { + // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list. + // If your environment is not supported, or you settled on a specific environment, switch out the adapter. + // See https://svelte.dev/docs/kit/adapters for more information about adapters. + adapter: adapter(), + }, }; export default config; diff --git a/svelte/tsconfig.json b/svelte/tsconfig.json index 2c2ed3c4d8..c7b9df597d 100644 --- a/svelte/tsconfig.json +++ b/svelte/tsconfig.json @@ -1,20 +1,20 @@ { - "extends": "./.svelte-kit/tsconfig.json", - "compilerOptions": { - "rewriteRelativeImportExtensions": true, - "allowJs": true, - "checkJs": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "resolveJsonModule": true, - "skipLibCheck": true, - "sourceMap": true, - "strict": true, - "moduleResolution": "bundler" - } - // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias - // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files - // - // To make changes to top-level options such as include and exclude, we recommend extending - // the generated config; see https://svelte.dev/docs/kit/configuration#typescript + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "rewriteRelativeImportExtensions": true, + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } + // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias + // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files + // + // To make changes to top-level options such as include and exclude, we recommend extending + // the generated config; see https://svelte.dev/docs/kit/configuration#typescript } diff --git a/svelte/vite.config.ts b/svelte/vite.config.ts index e6d7c798ef..69de33d692 100644 --- a/svelte/vite.config.ts +++ b/svelte/vite.config.ts @@ -3,39 +3,39 @@ import { playwright } from '@vitest/browser-playwright'; import { sveltekit } from '@sveltejs/kit/vite'; export default defineConfig({ - plugins: [sveltekit()], - - test: { - expect: { requireAssertions: true }, - - projects: [ - { - extends: './vite.config.ts', - - test: { - name: 'client', - - browser: { - enabled: true, - provider: playwright(), - instances: [{ browser: 'chromium', headless: true }] - }, - - include: ['src/**/*.svelte.{test,spec}.{js,ts}'], - exclude: ['src/lib/server/**'] - } - }, - - { - extends: './vite.config.ts', - - test: { - name: 'server', - environment: 'node', - include: ['src/**/*.{test,spec}.{js,ts}'], - exclude: ['src/**/*.svelte.{test,spec}.{js,ts}'] - } - } - ] - } + plugins: [sveltekit()], + + test: { + expect: { requireAssertions: true }, + + projects: [ + { + extends: './vite.config.ts', + + test: { + name: 'client', + + browser: { + enabled: true, + provider: playwright(), + instances: [{ browser: 'chromium', headless: true }], + }, + + include: ['src/**/*.svelte.{test,spec}.{js,ts}'], + exclude: ['src/lib/server/**'], + }, + }, + + { + extends: './vite.config.ts', + + test: { + name: 'server', + environment: 'node', + include: ['src/**/*.{test,spec}.{js,ts}'], + exclude: ['src/**/*.svelte.{test,spec}.{js,ts}'], + }, + }, + ], + }, }); From 7bc54ddeb96b6235dd28ec46f6f38bf321fae83a Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Fri, 12 Dec 2025 19:09:25 +0100 Subject: [PATCH 04/13] svelte: Use SPA mode This should make the migration a bit easier for now. We can go back to SSR rendering in the future once SPA mode works sufficiently well. --- pnpm-lock.yaml | 12 ++++++------ svelte/package.json | 2 +- svelte/src/routes/+layout.js | 1 + svelte/svelte.config.js | 11 ++++++----- 4 files changed, 14 insertions(+), 12 deletions(-) create mode 100644 svelte/src/routes/+layout.js diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ccac169a4d..bcb14705e7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -349,9 +349,9 @@ importers: '@eslint/js': specifier: ^9.39.1 version: 9.39.1 - '@sveltejs/adapter-auto': - specifier: ^7.0.0 - version: 7.0.0(@sveltejs/kit@2.49.2(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)))(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))) + '@sveltejs/adapter-static': + specifier: ^3.0.10 + version: 3.0.10(@sveltejs/kit@2.49.2(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)))(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2))) '@sveltejs/kit': specifier: ^2.49.1 version: 2.49.2(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)))(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) @@ -2083,8 +2083,8 @@ packages: peerDependencies: acorn: ^8.9.0 - '@sveltejs/adapter-auto@7.0.0': - resolution: {integrity: sha512-ImDWaErTOCkRS4Gt+5gZuymKFBobnhChXUZ9lhUZLahUgvA4OOvRzi3sahzYgbxGj5nkA6OV0GAW378+dl/gyw==} + '@sveltejs/adapter-static@3.0.10': + resolution: {integrity: sha512-7D9lYFWJmB7zxZyTE/qxjksvMqzMuYrrsyh1f4AlZqeZeACPRySjbC3aFiY55wb1tWUaKOQG9PVbm74JcN2Iew==} peerDependencies: '@sveltejs/kit': ^2.0.0 @@ -10846,7 +10846,7 @@ snapshots: dependencies: acorn: 8.15.0 - '@sveltejs/adapter-auto@7.0.0(@sveltejs/kit@2.49.2(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)))(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)))': + '@sveltejs/adapter-static@3.0.10(@sveltejs/kit@2.49.2(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)))(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)))': dependencies: '@sveltejs/kit': 2.49.2(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)))(svelte@5.45.10)(vite@7.2.6(@types/node@24.10.2)(jiti@2.6.1)(terser@5.44.1)(yaml@2.8.2)) diff --git a/svelte/package.json b/svelte/package.json index bf13ec3272..76cd6d7870 100644 --- a/svelte/package.json +++ b/svelte/package.json @@ -18,7 +18,7 @@ "devDependencies": { "@eslint/compat": "^1.4.0", "@eslint/js": "^9.39.1", - "@sveltejs/adapter-auto": "^7.0.0", + "@sveltejs/adapter-static": "^3.0.10", "@sveltejs/kit": "^2.49.1", "@sveltejs/vite-plugin-svelte": "^6.2.1", "@types/node": "^24", diff --git a/svelte/src/routes/+layout.js b/svelte/src/routes/+layout.js new file mode 100644 index 0000000000..a3d15781a7 --- /dev/null +++ b/svelte/src/routes/+layout.js @@ -0,0 +1 @@ +export const ssr = false; diff --git a/svelte/svelte.config.js b/svelte/svelte.config.js index ff3d5f7c03..f78845a041 100644 --- a/svelte/svelte.config.js +++ b/svelte/svelte.config.js @@ -1,4 +1,4 @@ -import adapter from '@sveltejs/adapter-auto'; +import adapter from '@sveltejs/adapter-static'; import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; /** @type {import('@sveltejs/kit').Config} */ @@ -8,10 +8,11 @@ const config = { preprocess: vitePreprocess(), kit: { - // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list. - // If your environment is not supported, or you settled on a specific environment, switch out the adapter. - // See https://svelte.dev/docs/kit/adapters for more information about adapters. - adapter: adapter(), + adapter: adapter({ + // https://svelte.dev/docs/kit/single-page-apps#Usage recommends to + // avoid using `index.html` as a fallback page, so we use `200.html` instead. + fallback: '200.html', + }), }, }; From a9a6457da19204d285305c6b463648a9e2908481 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Sat, 13 Dec 2025 11:07:45 +0100 Subject: [PATCH 05/13] svelte: Use `/svelte` base path for now --- svelte/svelte.config.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/svelte/svelte.config.js b/svelte/svelte.config.js index f78845a041..6f2ddab6ec 100644 --- a/svelte/svelte.config.js +++ b/svelte/svelte.config.js @@ -13,6 +13,11 @@ const config = { // avoid using `index.html` as a fallback page, so we use `200.html` instead. fallback: '200.html', }), + paths: { + // We are serving the app from the `/svelte` subdirectory for now + // to be able to serve it alongside the Ember.js app at `/`. + base: process.env.VITEST ? '' : '/svelte', + }, }, }; From 92890ccfe5fc0ba766a655d9a949ce235d5369ca Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Sat, 13 Dec 2025 11:46:58 +0100 Subject: [PATCH 06/13] middleware: Serve `svelte/build/` folder under `/svelte` path --- src/middleware.rs | 3 ++ src/middleware/static_or_continue.rs | 41 +++++++++++++++++++++++++--- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/middleware.rs b/src/middleware.rs index c23211bb82..c4df793f8b 100644 --- a/src/middleware.rs +++ b/src/middleware.rs @@ -78,6 +78,9 @@ pub fn apply_axum_middleware(state: AppState, router: Router<()>) -> Router { .layer(conditional_layer(config.serve_dist, || { from_fn(static_or_continue::serve_dist) })) + .layer(conditional_layer(config.serve_dist, || { + from_fn(static_or_continue::serve_svelte) + })) .layer(conditional_layer(config.serve_html, || { from_fn_with_state(state.clone(), ember_html::serve_html) })) diff --git a/src/middleware/static_or_continue.rs b/src/middleware/static_or_continue.rs index ed010dba0a..d35c0ab779 100644 --- a/src/middleware/static_or_continue.rs +++ b/src/middleware/static_or_continue.rs @@ -4,29 +4,47 @@ use axum::extract::Request; use axum::middleware::Next; use axum::response::Response; -use http::{Method, StatusCode}; +use http::uri::PathAndQuery; +use http::{Method, StatusCode, Uri}; use std::path::Path; use tower::ServiceExt; use tower_http::services::ServeDir; pub async fn serve_local_uploads(request: Request, next: Next) -> Response { - serve("local_uploads", request, next).await + serve("local_uploads", None, request, next).await } pub async fn serve_dist(request: Request, next: Next) -> Response { - serve("dist", request, next).await + serve("dist", None, request, next).await } -async fn serve>(path: P, request: Request, next: Next) -> Response { +pub async fn serve_svelte(request: Request, next: Next) -> Response { + serve("svelte/build", Some("/svelte"), request, next).await +} + +async fn serve>( + path: P, + strip_prefix: Option<&str>, + request: Request, + next: Next, +) -> Response { // index.html is a Jinja template, which is to be rendered by `ember_html::serve_html`. if matches!(*request.method(), Method::GET | Method::HEAD) && !matches!(request.uri().path().as_bytes(), b"/" | b"/index.html") + && strip_prefix.is_none_or(|prefix| request.uri().path().starts_with(prefix)) { let mut static_req = Request::new(()); *static_req.method_mut() = request.method().clone(); *static_req.uri_mut() = request.uri().clone(); *static_req.headers_mut() = request.headers().clone(); + if let Some(prefix) = strip_prefix + && let Some(new_path) = request.uri().path().strip_prefix(prefix) + && let Some(new_uri) = replace_uri_path(request.uri(), new_path) + { + *static_req.uri_mut() = new_uri; + } + let serve_dir = ServeDir::new(path).precompressed_br().precompressed_gzip(); let Ok(response) = serve_dir.oneshot(static_req).await; if response.status() != StatusCode::NOT_FOUND { @@ -36,3 +54,18 @@ async fn serve>(path: P, request: Request, next: Next) -> Respons next.run(request).await } + +/// Replaces the path component of a URI while preserving the query string. +fn replace_uri_path(uri: &Uri, new_path: &str) -> Option { + let new_path = if new_path.is_empty() { "/" } else { new_path }; + + let new_path_and_query = match uri.query() { + Some(query) => format!("{new_path}?{query}"), + None => new_path.to_owned(), + }; + + let path_and_query = PathAndQuery::try_from(new_path_and_query).ok()?; + let mut parts = uri.clone().into_parts(); + parts.path_and_query = Some(path_and_query); + Uri::from_parts(parts).ok() +} From 6916449d001e3657b805b9fd78886bab4c7d85ee Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Sat, 13 Dec 2025 11:47:33 +0100 Subject: [PATCH 07/13] middleware: Serve `svelte/build/200.html` file under `/svelte` paths --- src/middleware/ember_html.rs | 43 +++++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/src/middleware/ember_html.rs b/src/middleware/ember_html.rs index e46ff2de26..4bbbe8acb8 100644 --- a/src/middleware/ember_html.rs +++ b/src/middleware/ember_html.rs @@ -22,25 +22,54 @@ use url::Url; use crate::app::AppState; const OG_IMAGE_FALLBACK_URL: &str = "https://crates.io/assets/og-image.png"; -const INDEX_TEMPLATE_NAME: &str = "index_html"; const PATH_PREFIX_CRATES: &str = "/crates/"; +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +enum FrontendApp { + Ember, + Svelte, +} + +impl FrontendApp { + fn from_path(path: &str) -> Self { + if path.starts_with("/svelte/") { + FrontendApp::Svelte + } else { + FrontendApp::Ember + } + } + + fn index_template_name(&self) -> &'static str { + match self { + FrontendApp::Ember => "index_html", + FrontendApp::Svelte => "svelte_index_html", + } + } +} + /// The [`Shared`] allows for multiple tasks to wait on a single future, [`BoxFuture`] allows /// us to name the type in the declaration of static variables, and the [`Arc`] ensures /// the [`minijinja::Environment`] doesn't get cloned each request. type TemplateEnvFut = Shared>>>; -type TemplateCache = moka::future::Cache, String>; +type TemplateCache = moka::future::Cache<(Cow<'static, str>, FrontendApp), String>; /// Initialize [`minijinja::Environment`] given the index.html file at `dist/index.html`. /// This should only be done once as it will load said file from persistent storage. async fn init_template_env() -> Arc> { + let mut env = minijinja::Environment::empty(); + let template_j2 = tokio::fs::read_to_string("dist/index.html") .await .expect("Error loading dist/index.html template. Is the frontend package built yet?"); - let mut env = minijinja::Environment::empty(); - env.add_template_owned(INDEX_TEMPLATE_NAME, template_j2) + env.add_template_owned(FrontendApp::Ember.index_template_name(), template_j2) .expect("Error loading template"); + + if let Ok(svelte_template) = tokio::fs::read_to_string("svelte/build/200.html").await { + env.add_template_owned(FrontendApp::Svelte.index_template_name(), svelte_template) + .expect("Error loading Svelte template"); + } + Arc::new(env) } @@ -83,8 +112,10 @@ pub async fn serve_html(state: AppState, request: Request, next: Next) -> Respon let html_cache = RENDERED_HTML_CACHE .get_or_init(|| init_html_cache(state.config.html_render_cache_max_capacity)); + let frontend_app = FrontendApp::from_path(path); + let render_result = html_cache - .entry_by_ref(&og_image_url) + .entry_by_ref(&(og_image_url.clone(), frontend_app)) .or_try_insert_with::<_, minijinja::Error>(async { // `LazyLock::deref` blocks as long as its initializer is running in another thread. // Note that this won't take long, as the constructed Futures are not awaited @@ -94,7 +125,7 @@ pub async fn serve_html(state: AppState, request: Request, next: Next) -> Respon // Render the HTML given the OG image URL let env = template_env.clone().await; let html = env - .get_template(INDEX_TEMPLATE_NAME)? + .get_template(frontend_app.index_template_name())? .render(minijinja::context! { og_image_url})?; Ok(html) From 40b13752dca43df397b879fe5a72e667eae3f2a2 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Sat, 13 Dec 2025 11:49:07 +0100 Subject: [PATCH 08/13] middleware: Disable CSP for Svelte app for now The Svelte app is using an inline script in the HTML file which includes the fingerprinted JS file paths, so we can't use a static hash of the script. We can figure these details out in the future. --- src/middleware/common_headers.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/middleware/common_headers.rs b/src/middleware/common_headers.rs index b79467eaee..cf2ecb0fa1 100644 --- a/src/middleware/common_headers.rs +++ b/src/middleware/common_headers.rs @@ -38,6 +38,8 @@ pub async fn add_common_headers( expires(&mut headers, 10 * ONE_YEAR); } + let is_svelte = path.starts_with("/svelte/"); + let response = next.run(request).await; headers.insert(header::ACCESS_CONTROL_ALLOW_ORIGIN, v("*")); @@ -47,7 +49,10 @@ pub async fn add_common_headers( headers.insert(header::X_CONTENT_TYPE_OPTIONS, v("nosniff")); headers.insert(header::X_FRAME_OPTIONS, v("SAMEORIGIN")); headers.insert(header::X_XSS_PROTECTION, v("0")); - if let Some(ref csp) = state.config.content_security_policy { + if let Some(ref csp) = state.config.content_security_policy + // TODO: CSP is disabled for the Svelte frontend for now + && !is_svelte + { headers.insert(header::CONTENT_SECURITY_POLICY, csp.clone()); } headers.insert(header::VARY, v("Accept, Accept-Encoding, Cookie")); From bd66828e1aa04313ba428cea89a32f66dbb382ce Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Sat, 13 Dec 2025 12:02:42 +0100 Subject: [PATCH 09/13] Heroku: Update buildpack to also build Svelte app --- .buildpacks | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.buildpacks b/.buildpacks index d7fc891187..a8ce0f075a 100644 --- a/.buildpacks +++ b/.buildpacks @@ -1,2 +1,2 @@ https://github.com/heroku/heroku-buildpack-apt -https://github.com/Turbo87/heroku-buildpack-crates-io#7916dff181a455c55ef3a1603a4efe00920a16c2 +https://github.com/Turbo87/heroku-buildpack-crates-io#548cef4ec86eda61bfbf62d0546269dc4632175f From e1dbbf8c47fe9a37cf97b70af45b2fcfd1469f58 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Sat, 13 Dec 2025 12:29:56 +0100 Subject: [PATCH 10/13] CI: Add `svelte` job --- .github/workflows/ci.yml | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c1a8a29c33..983cfde3ca 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -82,11 +82,17 @@ jobs: with: files: .github/workflows/** + - uses: tj-actions/changed-files@24d32ffd492484c1d75e0c0b894501ddb9d30d62 # v47.0.0 + id: changed-files-svelte + with: + files: svelte/** + outputs: non-js: ${{ steps.changed-files-non-js.outputs.any_modified }} non-rust: ${{ steps.changed-files-non-rust.outputs.any_modified }} rust-lockfile: ${{ steps.changed-files-rust-lockfile.outputs.any_modified }} ci: ${{ steps.changed-files-ci.outputs.any_modified }} + svelte: ${{ steps.changed-files-svelte.outputs.any_modified }} percy-nonce: name: Frontend / Percy Nonce @@ -362,3 +368,35 @@ jobs: with: sarif_file: results.sarif category: zizmor + + svelte: + name: Svelte (experimental) + runs-on: ubuntu-24.04 + needs: changed-files + if: needs.changed-files.outputs.svelte == 'true' + + defaults: + run: + working-directory: svelte + + steps: + - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + with: + persist-credentials: false + + - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 + with: + version: ${{ env.PNPM_VERSION }} + + - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 + with: + cache: pnpm + node-version-file: package.json + + - run: pnpm install + + - run: pnpm lint + - run: pnpm check + - run: pnpm build + - run: pnpm playwright install chromium-headless-shell + - run: pnpm test From 96590dc7a8ebb9d1826b5f6b20c41248c7966884 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Sat, 13 Dec 2025 13:00:22 +0100 Subject: [PATCH 11/13] ESLint: Ignore `svelte/` folder for Ember.js ESLint config --- eslint.config.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/eslint.config.mjs b/eslint.config.mjs index 03936fd836..84303cb8a1 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -25,6 +25,7 @@ export default [ '.git/**/*', 'crates/', 'playwright-report/', + 'svelte/', 'target/', 'test-results/', 'tmp/', From 9d33ccef14b3511db74eaffa25b532013fc73203 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Sat, 13 Dec 2025 13:03:25 +0100 Subject: [PATCH 12/13] ESLint: Fix `no-redeclare` warnings Not sure where this is suddenly coming from, but we can just use different variable names instead to fix it. --- eslint.config.mjs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index 84303cb8a1..72af1b3077 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -10,10 +10,10 @@ import globals from 'globals'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); +const filename = fileURLToPath(import.meta.url); +const dirname = path.dirname(filename); const compat = new FlatCompat({ - baseDirectory: __dirname, + baseDirectory: dirname, recommendedConfig: js.configs.recommended, allConfig: js.configs.all, }); From 8830a9d9ba838e72c9bb93797865aa59836351d3 Mon Sep 17 00:00:00 2001 From: Tobias Bieniek Date: Sat, 13 Dec 2025 13:28:18 +0100 Subject: [PATCH 13/13] prettier: Ignore `svelte/` folder for Ember.js prettier config --- .prettierignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.prettierignore b/.prettierignore index 849ddff3b7..bade11b63b 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1 +1,2 @@ dist/ +svelte/