From f2488f86feacf096a3521a01d28f8afd6feb1a1b Mon Sep 17 00:00:00 2001 From: Till JS Date: Tue, 24 Mar 2026 22:36:11 +0100 Subject: [PATCH] feat(infra): add workspace dependency audit script New script scans source imports vs package.json deps to catch missing workspace dependencies that work locally but break in Docker. Fixed: manadeck-web and presi-web missing shared-stores. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../components/observatory/data/mockData.ts | 218 +++++----- apps/manadeck/apps/web/package.json | 3 +- apps/presi/apps/web/package.json | 3 +- pnpm-lock.yaml | 377 ++++++++++++------ scripts/audit-workspace-deps.mjs | 326 +++++++++++++++ 5 files changed, 696 insertions(+), 231 deletions(-) create mode 100755 scripts/audit-workspace-deps.mjs diff --git a/apps/manacore/apps/web/src/lib/components/observatory/data/mockData.ts b/apps/manacore/apps/web/src/lib/components/observatory/data/mockData.ts index bdb160166..6237a6b33 100644 --- a/apps/manacore/apps/web/src/lib/components/observatory/data/mockData.ts +++ b/apps/manacore/apps/web/src/lib/components/observatory/data/mockData.ts @@ -7,6 +7,7 @@ interface AppDefinition { score: number; status: AppStatus; categories: CategoryScores; + previousScore?: number; } function getPlantType(status: AppStatus, score: number): PlantType { @@ -19,37 +20,40 @@ function getPlantType(status: AppStatus, score: number): PlantType { return 'youngTree'; } +// Real ManaScore data from 2026-03-24 audits const APP_DEFINITIONS: AppDefinition[] = [ { id: 'calendar', displayName: 'Calendar', score: 97, + previousScore: 82, status: 'mature', categories: { backend: 95, frontend: 96, - database: 95, - testing: 98, - deployment: 100, + database: 92, + testing: 90, + deployment: 92, documentation: 98, - security: 95, - ux: 98, + security: 92, + ux: 95, }, }, { id: 'todo', displayName: 'Todo', score: 96, + previousScore: 80, status: 'mature', categories: { backend: 94, frontend: 95, - database: 95, - testing: 97, - deployment: 98, + database: 88, + testing: 90, + deployment: 92, documentation: 95, - security: 95, - ux: 96, + security: 90, + ux: 94, }, }, { @@ -60,12 +64,12 @@ const APP_DEFINITIONS: AppDefinition[] = [ categories: { backend: 92, frontend: 90, - database: 95, - testing: 92, - deployment: 95, - documentation: 95, - security: 95, - ux: 94, + database: 88, + testing: 88, + deployment: 90, + documentation: 92, + security: 85, + ux: 85, }, }, { @@ -93,27 +97,28 @@ const APP_DEFINITIONS: AppDefinition[] = [ backend: 90, frontend: 82, database: 85, - testing: 80, - deployment: 90, - documentation: 85, + testing: 82, + deployment: 75, + documentation: 90, security: 85, - ux: 88, + ux: 82, }, }, { id: 'storage', displayName: 'Storage', score: 84, + previousScore: 55, status: 'production', categories: { backend: 88, frontend: 84, database: 82, testing: 78, - deployment: 88, - documentation: 82, - security: 85, - ux: 82, + deployment: 65, + documentation: 78, + security: 78, + ux: 75, }, }, { @@ -124,12 +129,12 @@ const APP_DEFINITIONS: AppDefinition[] = [ categories: { backend: 90, frontend: 82, - database: 80, - testing: 68, - deployment: 88, + database: 95, + testing: 60, + deployment: 92, documentation: 85, - security: 80, - ux: 78, + security: 82, + ux: 80, }, }, { @@ -140,12 +145,12 @@ const APP_DEFINITIONS: AppDefinition[] = [ categories: { backend: 90, frontend: 80, - database: 75, - testing: 65, - deployment: 85, - documentation: 82, - security: 82, - ux: 80, + database: 92, + testing: 55, + deployment: 75, + documentation: 78, + security: 80, + ux: 78, }, }, { @@ -156,12 +161,12 @@ const APP_DEFINITIONS: AppDefinition[] = [ categories: { backend: 90, frontend: 78, - database: 80, - testing: 60, + database: 90, + testing: 65, deployment: 85, - documentation: 78, - security: 80, - ux: 80, + documentation: 80, + security: 78, + ux: 60, }, }, { @@ -172,12 +177,12 @@ const APP_DEFINITIONS: AppDefinition[] = [ categories: { backend: 10, frontend: 78, - database: 60, - testing: 50, - deployment: 85, - documentation: 70, - security: 75, - ux: 72, + database: 20, + testing: 12, + deployment: 92, + documentation: 92, + security: 88, + ux: 82, }, }, { @@ -188,12 +193,12 @@ const APP_DEFINITIONS: AppDefinition[] = [ categories: { backend: 78, frontend: 62, - database: 65, - testing: 42, - deployment: 70, - documentation: 58, - security: 62, - ux: 65, + database: 80, + testing: 58, + deployment: 40, + documentation: 85, + security: 68, + ux: 55, }, }, { @@ -204,12 +209,12 @@ const APP_DEFINITIONS: AppDefinition[] = [ categories: { backend: 82, frontend: 65, - database: 60, - testing: 38, - deployment: 68, - documentation: 55, - security: 60, - ux: 62, + database: 72, + testing: 0, + deployment: 85, + documentation: 78, + security: 65, + ux: 55, }, }, { @@ -220,12 +225,12 @@ const APP_DEFINITIONS: AppDefinition[] = [ categories: { backend: 72, frontend: 78, - database: 60, - testing: 38, - deployment: 68, - documentation: 55, - security: 58, - ux: 65, + database: 75, + testing: 0, + deployment: 92, + documentation: 20, + security: 70, + ux: 75, }, }, { @@ -236,12 +241,12 @@ const APP_DEFINITIONS: AppDefinition[] = [ categories: { backend: 75, frontend: 75, - database: 55, - testing: 32, - deployment: 65, - documentation: 52, - security: 58, - ux: 60, + database: 82, + testing: 55, + deployment: 25, + documentation: 85, + security: 68, + ux: 65, }, }, { @@ -252,12 +257,12 @@ const APP_DEFINITIONS: AppDefinition[] = [ categories: { backend: 75, frontend: 70, - database: 55, - testing: 30, - deployment: 62, - documentation: 48, - security: 55, - ux: 58, + database: 72, + testing: 0, + deployment: 88, + documentation: 10, + security: 60, + ux: 55, }, }, { @@ -268,12 +273,12 @@ const APP_DEFINITIONS: AppDefinition[] = [ categories: { backend: 65, frontend: 68, - database: 55, - testing: 35, - deployment: 60, - documentation: 50, - security: 55, - ux: 60, + database: 72, + testing: 28, + deployment: 55, + documentation: 62, + security: 65, + ux: 72, }, }, { @@ -284,11 +289,11 @@ const APP_DEFINITIONS: AppDefinition[] = [ categories: { backend: 68, frontend: 58, - database: 45, - testing: 25, - deployment: 55, - documentation: 42, - security: 48, + database: 70, + testing: 0, + deployment: 45, + documentation: 62, + security: 55, ux: 50, }, }, @@ -300,12 +305,12 @@ const APP_DEFINITIONS: AppDefinition[] = [ categories: { backend: 50, frontend: 65, - database: 42, - testing: 28, - deployment: 52, - documentation: 45, - security: 42, - ux: 55, + database: 30, + testing: 18, + deployment: 80, + documentation: 25, + security: 55, + ux: 68, }, }, { @@ -316,12 +321,12 @@ const APP_DEFINITIONS: AppDefinition[] = [ categories: { backend: 88, frontend: 62, - database: 40, - testing: 20, - deployment: 45, - documentation: 38, - security: 40, - ux: 42, + database: 78, + testing: 0, + deployment: 10, + documentation: 72, + security: 55, + ux: 55, }, }, { @@ -332,12 +337,12 @@ const APP_DEFINITIONS: AppDefinition[] = [ categories: { backend: 72, frontend: 10, - database: 35, - testing: 15, - deployment: 40, - documentation: 30, - security: 35, - ux: 25, + database: 70, + testing: 0, + deployment: 8, + documentation: 45, + security: 55, + ux: 35, }, }, ]; @@ -345,6 +350,7 @@ const APP_DEFINITIONS: AppDefinition[] = [ export function createMockEcosystem(): AppData[] { return APP_DEFINITIONS.map((def) => { const pos = APP_POSITIONS[def.id] || { x: 800, y: 500, lakeId: 'auth' }; + const trend = def.previousScore ? def.score - def.previousScore : 0; return { id: def.id, name: def.id, @@ -354,7 +360,7 @@ export function createMockEcosystem(): AppData[] { health: 'up' as const, plantType: getPlantType(def.status, def.score), categories: def.categories, - trend: 0, + trend, lakeId: pos.lakeId, position: { x: pos.x, y: pos.y }, }; diff --git a/apps/manadeck/apps/web/package.json b/apps/manadeck/apps/web/package.json index 1e1f28b89..f04130c3c 100644 --- a/apps/manadeck/apps/web/package.json +++ b/apps/manadeck/apps/web/package.json @@ -34,13 +34,14 @@ "@manacore/shared-auth": "workspace:*", "@manacore/shared-auth-ui": "workspace:*", "@manacore/shared-branding": "workspace:*", + "@manacore/shared-config": "workspace:*", "@manacore/shared-error-tracking": "workspace:*", "@manacore/shared-feedback-service": "workspace:*", "@manacore/shared-feedback-ui": "workspace:*", - "@manacore/shared-config": "workspace:*", "@manacore/shared-i18n": "workspace:*", "@manacore/shared-icons": "workspace:*", "@manacore/shared-profile-ui": "workspace:*", + "@manacore/shared-stores": "workspace:*", "@manacore/shared-subscription-types": "workspace:*", "@manacore/shared-subscription-ui": "workspace:*", "@manacore/shared-tailwind": "workspace:*", diff --git a/apps/presi/apps/web/package.json b/apps/presi/apps/web/package.json index e48aa5dfc..2a85a8b4d 100644 --- a/apps/presi/apps/web/package.json +++ b/apps/presi/apps/web/package.json @@ -31,7 +31,6 @@ "vite": "^6.0.0" }, "dependencies": { - "@presi/shared": "workspace:*", "@manacore/shared-app-onboarding": "workspace:*", "@manacore/shared-auth": "workspace:*", "@manacore/shared-auth-ui": "workspace:*", @@ -42,12 +41,14 @@ "@manacore/shared-i18n": "workspace:*", "@manacore/shared-icons": "workspace:*", "@manacore/shared-profile-ui": "workspace:*", + "@manacore/shared-stores": "workspace:*", "@manacore/shared-subscription-ui": "workspace:*", "@manacore/shared-tailwind": "workspace:*", "@manacore/shared-theme": "workspace:*", "@manacore/shared-theme-ui": "workspace:*", "@manacore/shared-ui": "workspace:*", "@manacore/shared-utils": "workspace:*", + "@presi/shared": "workspace:*", "svelte-i18n": "^4.0.1" }, "type": "module" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c8ea0a8b8..01f917ace 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1038,7 +1038,7 @@ importers: version: 6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) vitest: specifier: ^4.1.1 - version: 4.1.1(@opentelemetry/api@1.9.0)(@types/node@20.19.25)(jsdom@27.2.0)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) + version: 4.1.1(@opentelemetry/api@1.9.0)(@types/node@20.19.25)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) apps/clock/apps/backend: dependencies: @@ -2324,7 +2324,7 @@ importers: version: 6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) vitest: specifier: ^4.0.14 - version: 4.0.14(@opentelemetry/api@1.9.0)(@types/node@22.19.1)(@vitest/ui@4.0.14)(jiti@2.6.1)(jsdom@27.2.0)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) + version: 4.0.14(@opentelemetry/api@1.9.0)(@types/node@22.19.1)(@vitest/ui@4.0.14)(jiti@2.6.1)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) apps/manadeck/apps/backend: dependencies: @@ -2685,6 +2685,9 @@ importers: '@manacore/shared-profile-ui': specifier: workspace:* version: link:../../../../packages/shared-profile-ui + '@manacore/shared-stores': + specifier: workspace:* + version: link:../../../../packages/shared-stores '@manacore/shared-subscription-types': specifier: workspace:* version: link:../../../../packages/shared-subscription-types @@ -2992,7 +2995,7 @@ importers: version: 1.2.0(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))(workbox-build@7.4.0(@types/babel__core@7.20.5))(workbox-window@7.4.0) vitest: specifier: ^4.1.0 - version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@22.19.1)(jsdom@27.2.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) + version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@22.19.1)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) workbox-window: specifier: ^7.4.0 version: 7.4.0 @@ -3245,7 +3248,7 @@ importers: version: 4.1.17(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) '@testing-library/svelte': specifier: ^5.2.6 - version: 5.3.1(svelte@5.44.0)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.25)(jsdom@27.2.0)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))) + version: 5.3.1(svelte@5.44.0)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.25)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))) '@types/node': specifier: ^20.0.0 version: 20.19.25 @@ -3278,7 +3281,7 @@ importers: version: 6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) vitest: specifier: ^4.1.0 - version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.25)(jsdom@27.2.0)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) + version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.25)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) apps/mukke/packages/shared: devDependencies: @@ -3590,7 +3593,7 @@ importers: version: 5.9.3 vitest: specifier: ^2.1.8 - version: 2.1.9(@types/node@24.10.1)(jsdom@27.2.0)(lightningcss@1.30.2)(terser@5.44.1) + version: 2.1.9(@types/node@24.10.1)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.30.2)(terser@5.44.1) apps/photos: devDependencies: @@ -4846,6 +4849,9 @@ importers: '@manacore/shared-profile-ui': specifier: workspace:* version: link:../../../../packages/shared-profile-ui + '@manacore/shared-stores': + specifier: workspace:* + version: link:../../../../packages/shared-stores '@manacore/shared-subscription-ui': specifier: workspace:* version: link:../../../../packages/shared-subscription-ui @@ -6552,7 +6558,7 @@ importers: version: 5.9.3 vitest: specifier: ^3.0.5 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@27.2.0)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) packages/shared-api-client: dependencies: @@ -6790,10 +6796,16 @@ importers: gray-matter: specifier: ^4.0.3 version: 4.0.3 + isomorphic-dompurify: + specifier: ^3.7.1 + version: 3.7.1(@noble/hashes@2.0.1) marked: specifier: ^15.0.4 version: 15.0.12 devDependencies: + '@types/dompurify': + specifier: ^3.2.0 + version: 3.2.0 '@types/node': specifier: ^22.10.2 version: 22.19.1 @@ -6931,7 +6943,7 @@ importers: version: 5.9.3 vitest: specifier: ^2.0.0 - version: 2.1.9(@types/node@20.19.25)(jsdom@27.2.0)(lightningcss@1.30.2)(terser@5.44.1) + version: 2.1.9(@types/node@20.19.25)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.30.2)(terser@5.44.1) packages/shared-logger: devDependencies: @@ -7078,7 +7090,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.1.0 - version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(jsdom@27.2.0)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) + version: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) packages/shared-stores: dependencies: @@ -7261,7 +7273,7 @@ importers: version: 5.9.3 vitest: specifier: ^1.6.1 - version: 1.6.1(@types/node@20.19.25)(jsdom@27.2.0)(lightningcss@1.30.2)(terser@5.44.1) + version: 1.6.1(@types/node@20.19.25)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.30.2)(terser@5.44.1) packages/test-config: dependencies: @@ -7273,7 +7285,7 @@ importers: version: 29.7.0(@types/node@24.10.1)(ts-node@10.9.2(@types/node@24.10.1)(typescript@5.9.3)) vitest: specifier: ^3.0.0 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@27.2.0)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) devDependencies: '@types/node': specifier: ^24.10.1 @@ -7299,7 +7311,7 @@ importers: version: 5.9.3 vitest: specifier: ^3.0.5 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@27.2.0)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) services/it-landing: dependencies: @@ -8953,9 +8965,6 @@ packages: graphql: optional: true - '@acemir/cssom@0.9.24': - resolution: {integrity: sha512-5YjgMmAiT2rjJZU7XK1SNI7iqTy92DpaYVgG6x63FxkJ11UpYfLndHJATtinWJClAXiOlW9XWaUyAQf8pMrQPg==} - '@adobe/css-tools@4.4.4': resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} @@ -9027,11 +9036,13 @@ packages: '@asamuzakjp/css-color@3.2.0': resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} - '@asamuzakjp/css-color@4.1.0': - resolution: {integrity: sha512-9xiBAtLn4aNsa4mDnpovJvBn72tNEIACyvlqaNJ+ADemR+yeMJWnBudOi2qGDviJa7SwcDOU/TRh5dnET7qk0w==} + '@asamuzakjp/css-color@5.0.1': + resolution: {integrity: sha512-2SZFvqMyvboVV1d15lMf7XiI3m7SDqXUuKaTymJYLN6dSGadqp+fVojqJlVoMlbZnlTmu3S0TLwLTJpvBMO1Aw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - '@asamuzakjp/dom-selector@6.7.4': - resolution: {integrity: sha512-buQDjkm+wDPXd6c13534URWZqbz0RP5PAhXZ+LIoa5LgwInT9HVJvGIJivg75vi8I13CxDGdTnz+aY5YUJlIAA==} + '@asamuzakjp/dom-selector@7.0.4': + resolution: {integrity: sha512-jXR6x4AcT3eIrS2fSNAwJpwirOkGcd+E7F7CP3zjdTqz9B/2huHOL8YJZBgekKwLML+u7qB/6P1LXQuMScsx0w==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} '@asamuzakjp/nwsapi@2.3.9': resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} @@ -10189,6 +10200,10 @@ packages: '@borewit/text-codec@0.2.2': resolution: {integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==} + '@bramus/specificity@2.4.2': + resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} + hasBin: true + '@bull-board/api@6.16.4': resolution: {integrity: sha512-fn4O+QbA3mRj0rEE41mvwbvtiiv0UYgnxQ9ErWb9n74EwIC/yZbiyxQ+Gh/ehU9u7B0PuaNyR0IOG/h3DGo1Mg==} peerDependencies: @@ -10283,6 +10298,10 @@ packages: resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==} engines: {node: '>=18'} + '@csstools/color-helpers@6.0.2': + resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==} + engines: {node: '>=20.19.0'} + '@csstools/css-calc@2.1.4': resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} engines: {node: '>=18'} @@ -10290,6 +10309,13 @@ packages: '@csstools/css-parser-algorithms': ^3.0.5 '@csstools/css-tokenizer': ^3.0.4 + '@csstools/css-calc@3.1.1': + resolution: {integrity: sha512-HJ26Z/vmsZQqs/o3a6bgKslXGFAungXGbinULZO3eMsOyNJHeBBZfup5FiZInOghgoM4Hwnmw+OgbJCNg1wwUQ==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 + '@csstools/css-color-parser@3.1.0': resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==} engines: {node: '>=18'} @@ -10297,20 +10323,41 @@ packages: '@csstools/css-parser-algorithms': ^3.0.5 '@csstools/css-tokenizer': ^3.0.4 + '@csstools/css-color-parser@4.0.2': + resolution: {integrity: sha512-0GEfbBLmTFf0dJlpsNU7zwxRIH0/BGEMuXLTCvFYxuL1tNhqzTbtnFICyJLTNK4a+RechKP75e7w42ClXSnJQw==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 + '@csstools/css-parser-algorithms@3.0.5': resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} engines: {node: '>=18'} peerDependencies: '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-syntax-patches-for-csstree@1.0.17': - resolution: {integrity: sha512-LCC++2h8pLUSPY+EsZmrrJ1EOUu+5iClpEiDhhdw3zRJpPbABML/N5lmRuBHjxtKm9VnRcsUzioyD0sekFMF0A==} - engines: {node: '>=18'} + '@csstools/css-parser-algorithms@4.0.0': + resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@csstools/css-tokenizer': ^4.0.0 + + '@csstools/css-syntax-patches-for-csstree@1.1.1': + resolution: {integrity: sha512-BvqN0AMWNAnLk9G8jnUT77D+mUbY/H2b3uDTvg2isJkHaOufUE2R3AOwxWo7VBQKT1lOdwdvorddo2B/lk64+w==} + peerDependencies: + css-tree: ^3.2.1 + peerDependenciesMeta: + css-tree: + optional: true '@csstools/css-tokenizer@3.0.4': resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} engines: {node: '>=18'} + '@csstools/css-tokenizer@4.0.0': + resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} + engines: {node: '>=20.19.0'} + '@ctrl/tinycolor@4.2.0': resolution: {integrity: sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==} engines: {node: '>=14'} @@ -11461,6 +11508,15 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@exodus/bytes@1.15.0': + resolution: {integrity: sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + peerDependencies: + '@noble/hashes': ^1.8.0 || ^2.0.0 + peerDependenciesMeta: + '@noble/hashes': + optional: true + '@expo-google-fonts/material-symbols@0.4.25': resolution: {integrity: sha512-MlwOpcYPLYu2+aDAwqv29l3sknNNxA36Jcu07Tg9+MTEvXk2SPcO8eQmwwDeVBbv5Wb6ToD1LmE+e0lLv/9WvA==} @@ -15449,6 +15505,10 @@ packages: '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/dompurify@3.2.0': + resolution: {integrity: sha512-Fgg31wv9QbLDA0SpTOXO3MaxySc4DKGLi8sna4/Utjo4r3ZRPdCt4UQee8BWr+Q5z21yifghREPJGYaEOEIACg==} + deprecated: This is a stub types definition. dompurify provides its own type definitions, so you do not need this installed. + '@types/earcut@3.0.0': resolution: {integrity: sha512-k/9fOUGO39yd2sCjrbAJvGDEQvRwRnQIZlBz43roGwUZo5SHAmyVvSFyaVVZkicRVCaDXPKlbxrUcBuJoSWunQ==} @@ -17796,6 +17856,10 @@ packages: resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + css-what@6.2.2: resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} engines: {node: '>= 6'} @@ -17819,10 +17883,6 @@ packages: resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==} engines: {node: '>=18'} - cssstyle@5.3.3: - resolution: {integrity: sha512-OytmFH+13/QXONJcC75QNdMtKpceNk3u8ThBjyyYjkEcy/ekBwR1mMAuNvi3gdBPW3N5TlCzQ0WZw8H0lN/bDw==} - engines: {node: '>=20'} - csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} @@ -17972,9 +18032,9 @@ packages: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} - data-urls@6.0.0: - resolution: {integrity: sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==} - engines: {node: '>=20'} + data-urls@7.0.0: + resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} @@ -18222,6 +18282,9 @@ packages: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} + dompurify@3.3.3: + resolution: {integrity: sha512-Oj6pzI2+RqBfFG+qOaOLbFXLQ90ARpcGG6UePL82bJLtdsa6CYJD7nmiU8MW9nQNOtCHV3lZ/Bzq1X0QYbBZCA==} + domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} @@ -20711,6 +20774,10 @@ packages: resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} engines: {node: '>=18'} + html-encoding-sniffer@6.0.0: + resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -21235,6 +21302,10 @@ packages: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} + isomorphic-dompurify@3.7.1: + resolution: {integrity: sha512-ChhzwwCm7k8h8ANiq1Vc7geCWeHGaAPusgXU5N4mu7Y2wChgn2JHvbUe6aH/XQOUG3+KV+GmqSq95MntW/V1ng==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} + isstream@0.1.2: resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} @@ -21737,9 +21808,9 @@ packages: canvas: optional: true - jsdom@27.2.0: - resolution: {integrity: sha512-454TI39PeRDW1LgpyLPyURtB4Zx1tklSr6+OFOipsxGUH1WMTvk6C65JQdrj455+DP2uJ1+veBEHTGFKWVLFoA==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + jsdom@29.0.1: + resolution: {integrity: sha512-z6JOK5gRO7aMybVq/y/MlIpKh8JIi68FBKMUtKkK2KH/wMSRlCxQ682d08LB9fYXplyY/UXG8P4XXTScmdjApg==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} peerDependencies: canvas: ^3.0.0 peerDependenciesMeta: @@ -22209,6 +22280,10 @@ packages: resolution: {integrity: sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==} engines: {node: 20 || >=22} + lru-cache@11.2.7: + resolution: {integrity: sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -22377,6 +22452,9 @@ packages: mdn-data@2.12.2: resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + mdurl@1.0.1: resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} @@ -25847,8 +25925,8 @@ packages: resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} engines: {node: '>=16'} - tough-cookie@6.0.0: - resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} + tough-cookie@6.0.1: + resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==} engines: {node: '>=16'} tr46@0.0.3: @@ -26218,6 +26296,10 @@ packages: resolution: {integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==} engines: {node: '>=20.18.1'} + undici@7.24.5: + resolution: {integrity: sha512-3IWdCpjgxp15CbJnsi/Y9TCDE7HWVN19j1hmzVhoAkY/+CJx449tVxT5wZc1Gwg8J+P0LWvzlBzxYRnHJ+1i7Q==} + engines: {node: '>=20.18.1'} + unenv@2.0.0-rc.24: resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} @@ -27089,8 +27171,8 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} - webidl-conversions@8.0.0: - resolution: {integrity: sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA==} + webidl-conversions@8.0.1: + resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} engines: {node: '>=20'} webpack-node-externals@3.0.0: @@ -27133,6 +27215,10 @@ packages: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} engines: {node: '>=18'} + whatwg-mimetype@5.0.0: + resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} + engines: {node: '>=20'} + whatwg-url-minimum@0.1.1: resolution: {integrity: sha512-u2FNVjFVFZhdjb502KzXy1gKn1mEisQRJssmSJT8CPhZdZa0AP6VCbWlXERKyGu0l09t0k50FiDiralpGhBxgA==} @@ -27144,9 +27230,9 @@ packages: resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} engines: {node: '>=18'} - whatwg-url@15.1.0: - resolution: {integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g==} - engines: {node: '>=20'} + whatwg-url@16.0.1: + resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -27578,9 +27664,6 @@ snapshots: '@0no-co/graphql.web@1.2.0': {} - '@acemir/cssom@0.9.24': - optional: true - '@adobe/css-tools@4.4.4': {} '@alloc/quick-lru@5.2.0': {} @@ -27693,26 +27776,23 @@ snapshots: '@csstools/css-tokenizer': 3.0.4 lru-cache: 10.4.3 - '@asamuzakjp/css-color@4.1.0': + '@asamuzakjp/css-color@5.0.1': dependencies: - '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - lru-cache: 11.2.2 - optional: true + '@csstools/css-calc': 3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-color-parser': 4.0.2(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + lru-cache: 11.2.7 - '@asamuzakjp/dom-selector@6.7.4': + '@asamuzakjp/dom-selector@7.0.4': dependencies: '@asamuzakjp/nwsapi': 2.3.9 bidi-js: 1.0.3 - css-tree: 3.1.0 + css-tree: 3.2.1 is-potential-custom-element-name: 1.0.1 - lru-cache: 11.2.2 - optional: true + lru-cache: 11.2.7 - '@asamuzakjp/nwsapi@2.3.9': - optional: true + '@asamuzakjp/nwsapi@2.3.9': {} '@astrojs/check@0.9.5(prettier-plugin-astro@0.14.1)(prettier@3.6.2)(typescript@5.9.3)': dependencies: @@ -29837,6 +29917,10 @@ snapshots: '@borewit/text-codec@0.2.2': {} + '@bramus/specificity@2.4.2': + dependencies: + css-tree: 3.2.1 + '@bull-board/api@6.16.4(@bull-board/ui@6.16.4)': dependencies: '@bull-board/ui': 6.16.4 @@ -29913,11 +29997,18 @@ snapshots: '@csstools/color-helpers@5.1.0': {} + '@csstools/color-helpers@6.0.2': {} + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 + '@csstools/css-calc@3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: '@csstools/color-helpers': 5.1.0 @@ -29925,15 +30016,29 @@ snapshots: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) '@csstools/css-tokenizer': 3.0.4 + '@csstools/css-color-parser@4.0.2(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/color-helpers': 6.0.2 + '@csstools/css-calc': 3.1.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) + '@csstools/css-tokenizer': 4.0.0 + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': dependencies: '@csstools/css-tokenizer': 3.0.4 - '@csstools/css-syntax-patches-for-csstree@1.0.17': - optional: true + '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': + dependencies: + '@csstools/css-tokenizer': 4.0.0 + + '@csstools/css-syntax-patches-for-csstree@1.1.1(css-tree@3.2.1)': + optionalDependencies: + css-tree: 3.2.1 '@csstools/css-tokenizer@3.0.4': {} + '@csstools/css-tokenizer@4.0.0': {} + '@ctrl/tinycolor@4.2.0': {} '@dabh/diagnostics@2.0.8': @@ -30600,6 +30705,10 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 + '@exodus/bytes@1.15.0(@noble/hashes@2.0.1)': + optionalDependencies: + '@noble/hashes': 2.0.1 + '@expo-google-fonts/material-symbols@0.4.25': {} '@expo/bunyan@4.0.1': @@ -39438,14 +39547,14 @@ snapshots: vite: 6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@20.19.25)(jiti@2.6.1)(jsdom@25.0.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) - '@testing-library/svelte@5.3.1(svelte@5.44.0)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.25)(jsdom@27.2.0)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)))': + '@testing-library/svelte@5.3.1(svelte@5.44.0)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))(vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.25)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)))': dependencies: '@testing-library/dom': 10.4.1 '@testing-library/svelte-core': 1.0.0(svelte@5.44.0) svelte: 5.44.0 optionalDependencies: vite: 6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) - vitest: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.25)(jsdom@27.2.0)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) + vitest: 4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.25)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)': dependencies: @@ -39669,6 +39778,10 @@ snapshots: '@types/deep-eql@4.0.2': {} + '@types/dompurify@3.2.0': + dependencies: + dompurify: 3.3.3 + '@types/earcut@3.0.0': {} '@types/eslint-scope@3.7.7': @@ -40883,7 +40996,7 @@ snapshots: magic-string: 0.30.21 sirv: 3.0.2 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@27.2.0)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) ws: 8.18.3 optionalDependencies: playwright: 1.57.0 @@ -40907,7 +41020,7 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.14(@opentelemetry/api@1.9.0)(@types/node@22.19.1)(@vitest/ui@4.0.14)(jiti@2.6.1)(jsdom@27.2.0)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.14(@opentelemetry/api@1.9.0)(@types/node@22.19.1)(@vitest/ui@4.0.14)(jiti@2.6.1)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -41182,7 +41295,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@27.2.0)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) optional: true '@vitest/ui@4.0.14(vitest@4.0.14)': @@ -41194,7 +41307,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vitest: 4.0.14(@opentelemetry/api@1.9.0)(@types/node@22.19.1)(@vitest/ui@4.0.14)(jiti@2.6.1)(jsdom@27.2.0)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) + vitest: 4.0.14(@opentelemetry/api@1.9.0)(@types/node@22.19.1)(@vitest/ui@4.0.14)(jiti@2.6.1)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) '@vitest/utils@1.6.1': dependencies: @@ -42508,7 +42621,6 @@ snapshots: bidi-js@1.0.3: dependencies: require-from-string: 2.0.2 - optional: true big-integer@1.6.52: {} @@ -43370,6 +43482,11 @@ snapshots: mdn-data: 2.12.2 source-map-js: 1.2.1 + css-tree@3.2.1: + dependencies: + mdn-data: 2.27.1 + source-map-js: 1.2.1 + css-what@6.2.2: {} css.escape@1.5.1: {} @@ -43387,13 +43504,6 @@ snapshots: '@asamuzakjp/css-color': 3.2.0 rrweb-cssom: 0.8.0 - cssstyle@5.3.3: - dependencies: - '@asamuzakjp/css-color': 4.1.0 - '@csstools/css-syntax-patches-for-csstree': 1.0.17 - css-tree: 3.1.0 - optional: true - csstype@3.2.3: {} csv-parse@6.1.0: {} @@ -43566,11 +43676,12 @@ snapshots: whatwg-mimetype: 4.0.0 whatwg-url: 14.2.0 - data-urls@6.0.0: + data-urls@7.0.0(@noble/hashes@2.0.1): dependencies: - whatwg-mimetype: 4.0.0 - whatwg-url: 15.1.0 - optional: true + whatwg-mimetype: 5.0.0 + whatwg-url: 16.0.1(@noble/hashes@2.0.1) + transitivePeerDependencies: + - '@noble/hashes' data-view-buffer@1.0.2: dependencies: @@ -43768,6 +43879,10 @@ snapshots: dependencies: domelementtype: 2.3.0 + dompurify@3.3.3: + optionalDependencies: + '@types/trusted-types': 2.0.7 + domutils@3.2.2: dependencies: dom-serializer: 2.0.0 @@ -48732,6 +48847,12 @@ snapshots: dependencies: whatwg-encoding: 3.1.1 + html-encoding-sniffer@6.0.0(@noble/hashes@2.0.1): + dependencies: + '@exodus/bytes': 1.15.0(@noble/hashes@2.0.1) + transitivePeerDependencies: + - '@noble/hashes' + html-escaper@2.0.2: {} html-escaper@3.0.3: {} @@ -49276,6 +49397,14 @@ snapshots: isobject@3.0.1: {} + isomorphic-dompurify@3.7.1(@noble/hashes@2.0.1): + dependencies: + dompurify: 3.3.3 + jsdom: 29.0.1(@noble/hashes@2.0.1) + transitivePeerDependencies: + - '@noble/hashes' + - canvas + isstream@0.1.2: {} istanbul-lib-coverage@3.2.2: {} @@ -50782,33 +50911,31 @@ snapshots: - supports-color - utf-8-validate - jsdom@27.2.0: + jsdom@29.0.1(@noble/hashes@2.0.1): dependencies: - '@acemir/cssom': 0.9.24 - '@asamuzakjp/dom-selector': 6.7.4 - cssstyle: 5.3.3 - data-urls: 6.0.0 + '@asamuzakjp/css-color': 5.0.1 + '@asamuzakjp/dom-selector': 7.0.4 + '@bramus/specificity': 2.4.2 + '@csstools/css-syntax-patches-for-csstree': 1.1.1(css-tree@3.2.1) + '@exodus/bytes': 1.15.0(@noble/hashes@2.0.1) + css-tree: 3.2.1 + data-urls: 7.0.0(@noble/hashes@2.0.1) decimal.js: 10.6.0 - html-encoding-sniffer: 4.0.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 + html-encoding-sniffer: 6.0.0(@noble/hashes@2.0.1) is-potential-custom-element-name: 1.0.1 + lru-cache: 11.2.7 parse5: 8.0.0 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 6.0.0 + tough-cookie: 6.0.1 + undici: 7.24.5 w3c-xmlserializer: 5.0.0 - webidl-conversions: 8.0.0 - whatwg-encoding: 3.1.1 - whatwg-mimetype: 4.0.0 - whatwg-url: 15.1.0 - ws: 8.18.3 + webidl-conversions: 8.0.1 + whatwg-mimetype: 5.0.0 + whatwg-url: 16.0.1(@noble/hashes@2.0.1) xml-name-validator: 5.0.0 transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - optional: true + - '@noble/hashes' jsesc@3.1.0: {} @@ -51218,6 +51345,8 @@ snapshots: lru-cache@11.2.2: {} + lru-cache@11.2.7: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -51559,6 +51688,8 @@ snapshots: mdn-data@2.12.2: {} + mdn-data@2.27.1: {} + mdurl@1.0.1: {} media-typer@0.3.0: {} @@ -53403,7 +53534,6 @@ snapshots: parse5@8.0.0: dependencies: entities: 6.0.1 - optional: true parseley@0.12.1: dependencies: @@ -57479,8 +57609,7 @@ snapshots: tldts-core@6.1.86: {} - tldts-core@7.0.19: - optional: true + tldts-core@7.0.19: {} tldts@6.1.86: dependencies: @@ -57489,7 +57618,6 @@ snapshots: tldts@7.0.19: dependencies: tldts-core: 7.0.19 - optional: true tmp-promise@3.0.3: dependencies: @@ -57539,10 +57667,9 @@ snapshots: dependencies: tldts: 6.1.86 - tough-cookie@6.0.0: + tough-cookie@6.0.1: dependencies: tldts: 7.0.19 - optional: true tr46@0.0.3: {} @@ -57557,7 +57684,6 @@ snapshots: tr46@6.0.0: dependencies: punycode: 2.3.1 - optional: true tree-kill@1.2.2: {} @@ -58014,6 +58140,8 @@ snapshots: undici@7.16.0: {} + undici@7.24.5: {} + unenv@2.0.0-rc.24: dependencies: pathe: 2.0.3 @@ -58760,7 +58888,7 @@ snapshots: optionalDependencies: vite: 7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) - vitest@1.6.1(@types/node@20.19.25)(jsdom@27.2.0)(lightningcss@1.30.2)(terser@5.44.1): + vitest@1.6.1(@types/node@20.19.25)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.30.2)(terser@5.44.1): dependencies: '@vitest/expect': 1.6.1 '@vitest/runner': 1.6.1 @@ -58784,7 +58912,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.19.25 - jsdom: 27.2.0 + jsdom: 29.0.1(@noble/hashes@2.0.1) transitivePeerDependencies: - less - lightningcss @@ -58831,7 +58959,7 @@ snapshots: - supports-color - terser - vitest@2.1.9(@types/node@20.19.25)(jsdom@27.2.0)(lightningcss@1.30.2)(terser@5.44.1): + vitest@2.1.9(@types/node@20.19.25)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.30.2)(terser@5.44.1): dependencies: '@vitest/expect': 2.1.9 '@vitest/mocker': 2.1.9(vite@5.4.21(@types/node@20.19.25)(lightningcss@1.30.2)(terser@5.44.1)) @@ -58855,7 +58983,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 20.19.25 - jsdom: 27.2.0 + jsdom: 29.0.1(@noble/hashes@2.0.1) transitivePeerDependencies: - less - lightningcss @@ -58867,7 +58995,7 @@ snapshots: - supports-color - terser - vitest@2.1.9(@types/node@24.10.1)(jsdom@27.2.0)(lightningcss@1.30.2)(terser@5.44.1): + vitest@2.1.9(@types/node@24.10.1)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.30.2)(terser@5.44.1): dependencies: '@vitest/expect': 2.1.9 '@vitest/mocker': 2.1.9(vite@5.4.21(@types/node@24.10.1)(lightningcss@1.30.2)(terser@5.44.1)) @@ -58891,7 +59019,7 @@ snapshots: why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 24.10.1 - jsdom: 27.2.0 + jsdom: 29.0.1(@noble/hashes@2.0.1) transitivePeerDependencies: - less - lightningcss @@ -58948,7 +59076,7 @@ snapshots: - tsx - yaml - vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@27.2.0)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 @@ -58978,7 +59106,7 @@ snapshots: '@types/node': 24.10.1 '@vitest/browser': 3.2.4(playwright@1.57.0)(vite@6.4.1(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))(vitest@3.2.4) '@vitest/ui': 3.2.4(vitest@3.2.4) - jsdom: 27.2.0 + jsdom: 29.0.1(@noble/hashes@2.0.1) transitivePeerDependencies: - jiti - less @@ -58993,7 +59121,7 @@ snapshots: - tsx - yaml - vitest@4.0.14(@opentelemetry/api@1.9.0)(@types/node@22.19.1)(@vitest/ui@4.0.14)(jiti@2.6.1)(jsdom@27.2.0)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1): + vitest@4.0.14(@opentelemetry/api@1.9.0)(@types/node@22.19.1)(@vitest/ui@4.0.14)(jiti@2.6.1)(jsdom@29.0.1(@noble/hashes@2.0.1))(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1): dependencies: '@vitest/expect': 4.0.14 '@vitest/mocker': 4.0.14(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) @@ -59019,7 +59147,7 @@ snapshots: '@opentelemetry/api': 1.9.0 '@types/node': 22.19.1 '@vitest/ui': 4.0.14(vitest@4.0.14) - jsdom: 27.2.0 + jsdom: 29.0.1(@noble/hashes@2.0.1) transitivePeerDependencies: - jiti - less @@ -59101,7 +59229,7 @@ snapshots: transitivePeerDependencies: - msw - vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.25)(jsdom@27.2.0)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)): + vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@20.19.25)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)): dependencies: '@vitest/expect': 4.1.0 '@vitest/mocker': 4.1.0(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) @@ -59126,11 +59254,11 @@ snapshots: optionalDependencies: '@opentelemetry/api': 1.9.0 '@types/node': 20.19.25 - jsdom: 27.2.0 + jsdom: 29.0.1(@noble/hashes@2.0.1) transitivePeerDependencies: - msw - vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@22.19.1)(jsdom@27.2.0)(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)): + vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@22.19.1)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)): dependencies: '@vitest/expect': 4.1.0 '@vitest/mocker': 4.1.0(vite@6.4.1(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) @@ -59155,11 +59283,11 @@ snapshots: optionalDependencies: '@opentelemetry/api': 1.9.0 '@types/node': 22.19.1 - jsdom: 27.2.0 + jsdom: 29.0.1(@noble/hashes@2.0.1) transitivePeerDependencies: - msw - vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(jsdom@27.2.0)(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)): + vitest@4.1.0(@opentelemetry/api@1.9.0)(@types/node@24.10.1)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)): dependencies: '@vitest/expect': 4.1.0 '@vitest/mocker': 4.1.0(vite@7.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) @@ -59184,11 +59312,11 @@ snapshots: optionalDependencies: '@opentelemetry/api': 1.9.0 '@types/node': 24.10.1 - jsdom: 27.2.0 + jsdom: 29.0.1(@noble/hashes@2.0.1) transitivePeerDependencies: - msw - vitest@4.1.1(@opentelemetry/api@1.9.0)(@types/node@20.19.25)(jsdom@27.2.0)(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)): + vitest@4.1.1(@opentelemetry/api@1.9.0)(@types/node@20.19.25)(jsdom@29.0.1(@noble/hashes@2.0.1))(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)): dependencies: '@vitest/expect': 4.1.1 '@vitest/mocker': 4.1.1(vite@6.4.1(@types/node@20.19.25)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) @@ -59213,7 +59341,7 @@ snapshots: optionalDependencies: '@opentelemetry/api': 1.9.0 '@types/node': 20.19.25 - jsdom: 27.2.0 + jsdom: 29.0.1(@noble/hashes@2.0.1) transitivePeerDependencies: - msw @@ -59359,8 +59487,7 @@ snapshots: webidl-conversions@7.0.0: {} - webidl-conversions@8.0.0: - optional: true + webidl-conversions@8.0.1: {} webpack-node-externals@3.0.0: {} @@ -59498,6 +59625,8 @@ snapshots: whatwg-mimetype@4.0.0: {} + whatwg-mimetype@5.0.0: {} + whatwg-url-minimum@0.1.1: {} whatwg-url-without-unicode@8.0.0-3: @@ -59511,11 +59640,13 @@ snapshots: tr46: 5.1.1 webidl-conversions: 7.0.0 - whatwg-url@15.1.0: + whatwg-url@16.0.1(@noble/hashes@2.0.1): dependencies: + '@exodus/bytes': 1.15.0(@noble/hashes@2.0.1) tr46: 6.0.0 - webidl-conversions: 8.0.0 - optional: true + webidl-conversions: 8.0.1 + transitivePeerDependencies: + - '@noble/hashes' whatwg-url@5.0.0: dependencies: diff --git a/scripts/audit-workspace-deps.mjs b/scripts/audit-workspace-deps.mjs new file mode 100755 index 000000000..a3569a773 --- /dev/null +++ b/scripts/audit-workspace-deps.mjs @@ -0,0 +1,326 @@ +#!/usr/bin/env node + +/** + * Audit Workspace Dependencies + * + * Finds SvelteKit web apps that import workspace packages (@manacore/*, @project/shared, etc.) + * without declaring them in package.json. This works locally due to pnpm hoisting but breaks + * in Docker builds. + * + * Usage: + * node scripts/audit-workspace-deps.mjs # Report missing deps + * node scripts/audit-workspace-deps.mjs --fix # Auto-add missing deps and run pnpm install + */ + +import { readFileSync, readdirSync, statSync, writeFileSync, existsSync } from 'fs'; +import { join, relative, dirname } from 'path'; +import { fileURLToPath } from 'url'; +import { execSync } from 'child_process'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); +const MONOREPO_ROOT = join(__dirname, '..'); + +const FIX_MODE = process.argv.includes('--fix'); + +// Colors +const RED = '\x1b[31m'; +const GREEN = '\x1b[32m'; +const YELLOW = '\x1b[33m'; +const DIM = '\x1b[2m'; +const RESET = '\x1b[0m'; +const BOLD = '\x1b[1m'; + +// Directories to skip when scanning source files +const SKIP_DIRS = new Set(['node_modules', 'dist', '.svelte-kit', 'build', '.turbo', '.vercel']); + +// File extensions to scan +const SCAN_EXTENSIONS = new Set(['.ts', '.svelte', '.js']); + +// Regex to match workspace package imports +// Matches: @manacore/*, @calendar/shared, @todo/shared, @zitare/content, etc. +const IMPORT_REGEX = + /(?:import\s+(?:[\s\S]*?\s+from\s+)?|import\s*\()\s*['"](@[a-z-]+\/[a-z-]+)(?:\/[^'"]*)?['"]/g; + +// Known workspace scopes (to distinguish from npm packages like @sveltejs/kit) +const WORKSPACE_SCOPES = new Set([ + '@manacore', + '@calendar', + '@chat', + '@clock', + '@contacts', + '@context', + '@matrix', + '@mukke', + '@nutriphi', + '@photos', + '@picture', + '@planta', + '@presi', + '@storage', + '@todo', + '@traces', + '@zitare', + '@mana-core', +]); + +/** + * Build a set of all workspace package names by scanning the monorepo. + */ +function buildWorkspacePackageSet() { + const names = new Set(); + const patterns = [ + 'packages/*/package.json', + 'apps/*/packages/*/package.json', + 'services/*/package.json', + ]; + + for (const pattern of patterns) { + const parts = pattern.split('/'); + let dirs = [MONOREPO_ROOT]; + + for (const part of parts) { + const nextDirs = []; + for (const dir of dirs) { + if (part === '*') { + try { + const entries = readdirSync(dir); + for (const entry of entries) { + const full = join(dir, entry); + try { + if (statSync(full).isDirectory()) { + nextDirs.push(full); + } + } catch {} + } + } catch {} + } else { + nextDirs.push(join(dir, part)); + } + } + dirs = nextDirs; + } + + for (const pkgPath of dirs) { + try { + const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')); + if (pkg.name) names.add(pkg.name); + } catch {} + } + } + + return names; +} + +/** + * Recursively collect source files from a directory. + */ +function collectSourceFiles(dir, files = []) { + let entries; + try { + entries = readdirSync(dir); + } catch { + return files; + } + + for (const entry of entries) { + if (SKIP_DIRS.has(entry)) continue; + const full = join(dir, entry); + try { + const stat = statSync(full); + if (stat.isDirectory()) { + collectSourceFiles(full, files); + } else if (stat.isFile()) { + const ext = entry.slice(entry.lastIndexOf('.')); + if (SCAN_EXTENSIONS.has(ext)) { + files.push(full); + } + } + } catch {} + } + + return files; +} + +/** + * Extract workspace package imports from a source file. + */ +function extractImports(filePath, workspacePackages) { + const content = readFileSync(filePath, 'utf-8'); + const imports = new Set(); + + let match; + // Reset regex lastIndex + IMPORT_REGEX.lastIndex = 0; + + while ((match = IMPORT_REGEX.exec(content)) !== null) { + const pkg = match[1]; // e.g. @manacore/shared-utils + const scope = pkg.split('/')[0]; // e.g. @manacore + + if (WORKSPACE_SCOPES.has(scope) && workspacePackages.has(pkg)) { + imports.add(pkg); + } + } + + return imports; +} + +/** + * Get declared dependencies from package.json (both deps and devDeps). + */ +function getDeclaredDeps(pkgJsonPath) { + const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8')); + const deps = new Set(); + + for (const name of Object.keys(pkg.dependencies || {})) { + deps.add(name); + } + for (const name of Object.keys(pkg.devDependencies || {})) { + deps.add(name); + } + + return { deps, pkg }; +} + +/** + * Find all SvelteKit web app directories. + */ +function findWebApps() { + const appsDir = join(MONOREPO_ROOT, 'apps'); + const webApps = []; + + try { + const projects = readdirSync(appsDir); + for (const project of projects) { + // Try the correct path structure: apps/{project}/apps/web + const correctWebDir = join(appsDir, project, 'apps', 'web'); + if (existsSync(join(correctWebDir, 'package.json'))) { + webApps.push(correctWebDir); + } + } + } catch {} + + return webApps.sort(); +} + +// --- Main --- + +console.log(`${BOLD}Workspace Dependency Audit${RESET}`); +console.log(`Scanning SvelteKit web apps for undeclared workspace imports...\n`); + +const workspacePackages = buildWorkspacePackageSet(); +console.log(`${DIM}Found ${workspacePackages.size} workspace packages${RESET}\n`); + +const webApps = findWebApps(); +let totalMissing = 0; +const fixes = []; // { webDir, filterName, missingPkgs } + +for (const webDir of webApps) { + const relPath = relative(MONOREPO_ROOT, webDir); + const pkgJsonPath = join(webDir, 'package.json'); + const srcDir = join(webDir, 'src'); + + if (!existsSync(srcDir)) { + console.log(`${DIM}- ${relPath} - no src/ directory, skipping${RESET}`); + continue; + } + + const { deps, pkg } = getDeclaredDeps(pkgJsonPath); + const sourceFiles = collectSourceFiles(srcDir); + + // Map: packageName -> Set of files that import it + const importedPackages = new Map(); + + for (const file of sourceFiles) { + const fileImports = extractImports(file, workspacePackages); + for (const imp of fileImports) { + if (!importedPackages.has(imp)) { + importedPackages.set(imp, new Set()); + } + importedPackages.get(imp).add(relative(webDir, file)); + } + } + + // Find missing: imported but not declared + const missing = new Map(); + for (const [pkgName, files] of importedPackages) { + if (!deps.has(pkgName)) { + missing.set(pkgName, files); + } + } + + if (missing.size === 0) { + console.log(`${GREEN}\u2713${RESET} ${relPath} - all imports covered`); + } else { + totalMissing += missing.size; + const filterName = pkg.name || relPath; + console.log( + `${RED}\u2717${RESET} ${relPath} - ${BOLD}${missing.size}${RESET} missing dep${missing.size > 1 ? 's' : ''}:` + ); + + const missingPkgs = []; + for (const [pkgName, files] of missing) { + const fileList = [...files].sort().join(', '); + console.log(` ${YELLOW}${pkgName}${RESET} ${DIM}(imported in ${fileList})${RESET}`); + missingPkgs.push(pkgName); + } + console.log(` ${DIM}\u2192 pnpm add ${missingPkgs.join(' ')} --filter ${filterName}${RESET}`); + + fixes.push({ webDir, pkgJsonPath, filterName, missingPkgs }); + } +} + +console.log(''); + +if (totalMissing === 0) { + console.log(`${GREEN}${BOLD}All workspace imports are properly declared!${RESET}`); + process.exit(0); +} + +console.log( + `${RED}${BOLD}Found ${totalMissing} missing dependency declaration${totalMissing > 1 ? 's' : ''} across ${fixes.length} app${fixes.length > 1 ? 's' : ''}.${RESET}` +); + +if (!FIX_MODE) { + console.log(`\n${DIM}Run with --fix to automatically add missing dependencies.${RESET}`); + process.exit(1); +} + +// --- Fix mode --- +console.log(`\n${BOLD}Applying fixes...${RESET}\n`); + +for (const { pkgJsonPath, missingPkgs } of fixes) { + const relPkgPath = relative(MONOREPO_ROOT, pkgJsonPath); + const pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf-8')); + + if (!pkg.dependencies) { + pkg.dependencies = {}; + } + + for (const pkgName of missingPkgs) { + pkg.dependencies[pkgName] = 'workspace:*'; + console.log(` ${GREEN}+${RESET} Added ${pkgName} to ${relPkgPath}`); + } + + // Sort dependencies alphabetically + const sorted = {}; + for (const key of Object.keys(pkg.dependencies).sort()) { + sorted[key] = pkg.dependencies[key]; + } + pkg.dependencies = sorted; + + writeFileSync(pkgJsonPath, JSON.stringify(pkg, null, '\t') + '\n'); +} + +console.log(`\n${BOLD}Running pnpm install to update lockfile...${RESET}\n`); + +try { + execSync('pnpm install', { + cwd: MONOREPO_ROOT, + stdio: 'inherit', + }); + console.log(`\n${GREEN}${BOLD}All fixes applied successfully!${RESET}`); +} catch { + console.error(`\n${RED}pnpm install failed. You may need to run it manually.${RESET}`); + process.exit(1); +}