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) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-03-24 22:36:11 +01:00
parent bf7517d24d
commit f2488f86fe
5 changed files with 696 additions and 231 deletions

View file

@ -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 },
};

View file

@ -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:*",

View file

@ -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"

377
pnpm-lock.yaml generated
View file

@ -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:

326
scripts/audit-workspace-deps.mjs Executable file
View file

@ -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);
}