fix lint build and tests

This commit is contained in:
dal 2025-09-20 15:22:28 -06:00
parent 189dedd32e
commit 0e89b502ea
No known key found for this signature in database
GPG Key ID: 16F4B0E1E9F61122
26 changed files with 116 additions and 299 deletions

View File

@ -1,7 +1,7 @@
#!/usr/bin/env node #!/usr/bin/env node
import * as fs from 'fs'; import * as fs from 'node:fs';
import * as path from 'path'; import * as path from 'node:path';
import { fileURLToPath } from 'url'; import { fileURLToPath } from 'node:url';
import { sql } from 'drizzle-orm'; import { sql } from 'drizzle-orm';
import { getTableName } from 'drizzle-orm'; import { getTableName } from 'drizzle-orm';
import { getTableConfig } from 'drizzle-orm/pg-core'; import { getTableConfig } from 'drizzle-orm/pg-core';

View File

@ -1,7 +1,7 @@
#!/usr/bin/env node #!/usr/bin/env node
import * as fs from 'fs'; import * as fs from 'node:fs';
import * as path from 'path'; import * as path from 'node:path';
import { fileURLToPath } from 'url'; import { fileURLToPath } from 'node:url';
import { eq, sql } from 'drizzle-orm'; import { eq, sql } from 'drizzle-orm';
import { getTableName } from 'drizzle-orm'; import { getTableName } from 'drizzle-orm';
import { db } from '../src/connection'; import { db } from '../src/connection';
@ -17,7 +17,7 @@ function getAllTables(): Record<string, any> {
for (const [key, value] of Object.entries(schema)) { for (const [key, value] of Object.entries(schema)) {
if (value && typeof value === 'object' && Symbol.for('drizzle:IsDrizzleTable') in value) { if (value && typeof value === 'object' && Symbol.for('drizzle:IsDrizzleTable') in value) {
try { try {
const tableName = getTableName(value); const _tableName = getTableName(value);
tables[key] = value; tables[key] = value;
} catch { } catch {
// Not a table, skip // Not a table, skip
@ -203,9 +203,9 @@ async function seed() {
const seedData: Record<string, any[]> = {}; const seedData: Record<string, any[]> = {};
// Load auth data from files (but we'll use hardcoded instead) // Load auth data from files (but we'll use hardcoded instead)
const authUsers = await loadJsonFile(path.join(dataDir, 'auth.users.json')); const _authUsers = await loadJsonFile(path.join(dataDir, 'auth.users.json'));
const authIdentities = await loadJsonFile(path.join(dataDir, 'auth.identities.json')); const _authIdentities = await loadJsonFile(path.join(dataDir, 'auth.identities.json'));
const vaultSecrets = await loadJsonFile(path.join(dataDir, 'vault.secrets.json')); const _vaultSecrets = await loadJsonFile(path.join(dataDir, 'vault.secrets.json'));
// Load public schema data // Load public schema data
for (const tableName of tableOrder) { for (const tableName of tableOrder) {
@ -220,7 +220,7 @@ async function seed() {
console.log('=== Upserting seed data (no deletion needed) ===\n'); console.log('=== Upserting seed data (no deletion needed) ===\n');
// Generate auth users for all public users in the seed data // Generate auth users for all public users in the seed data
const publicUsers = seedData['users'] || []; const publicUsers = seedData.users || [];
const authUsers = publicUsers.map(generateAuthUser); const authUsers = publicUsers.map(generateAuthUser);
const authIdentities = publicUsers.map(generateAuthIdentity); const authIdentities = publicUsers.map(generateAuthIdentity);
@ -294,7 +294,7 @@ async function seed() {
} }
// After all data is inserted, create vault secrets for data sources // After all data is inserted, create vault secrets for data sources
const dataSources = seedData['dataSources'] || []; const dataSources = seedData.dataSources || [];
if (dataSources.length > 0) { if (dataSources.length > 0) {
console.log('\n=== Creating vault secrets for data sources ===\n'); console.log('\n=== Creating vault secrets for data sources ===\n');
for (const dataSource of dataSources) { for (const dataSource of dataSources) {
@ -307,7 +307,7 @@ async function seed() {
DELETE FROM vault.secrets WHERE name = ${dataSource.id} DELETE FROM vault.secrets WHERE name = ${dataSource.id}
`); `);
console.log(`Deleted existing vault secret for ${dataSource.name}`); console.log(`Deleted existing vault secret for ${dataSource.name}`);
} catch (deleteError) { } catch (_deleteError) {
// It's fine if the delete fails, it might not exist // It's fine if the delete fails, it might not exist
} }
@ -323,11 +323,13 @@ async function seed() {
if (secretId) { if (secretId) {
// Update the data source with the new secret ID // Update the data source with the new secret ID
console.log(`Updating data source ${dataSource.name} with new secret ID: ${secretId}`); console.log(
`Updating data source ${dataSource.name} with new secret ID: ${secretId}`
);
await tx await tx
.update(tables['dataSources']) .update(tables.dataSources)
.set({ secretId: secretId }) .set({ secretId: secretId })
.where(eq(tables['dataSources'].id, dataSource.id)); .where(eq(tables.dataSources.id, dataSource.id));
console.log(`Successfully linked vault secret to data source ${dataSource.name}`); console.log(`Successfully linked vault secret to data source ${dataSource.name}`);
} }
} catch (vaultError: any) { } catch (vaultError: any) {
@ -343,8 +345,8 @@ async function seed() {
// Show summary // Show summary
console.log('\nSummary:'); console.log('\nSummary:');
const publicUserCount = (seedData['users'] || []).length; const publicUserCount = (seedData.users || []).length;
const dataSourceCount = (seedData['dataSources'] || []).length; const dataSourceCount = (seedData.dataSources || []).length;
const totalRecords = const totalRecords =
Object.values(seedData).reduce((sum, data) => sum + data.length, 0) + publicUserCount * 2; // x2 for auth users + identities Object.values(seedData).reduce((sum, data) => sum + data.length, 0) + publicUserCount * 2; // x2 for auth users + identities
console.log(`Total records upserted: ${totalRecords}`); console.log(`Total records upserted: ${totalRecords}`);
@ -381,7 +383,7 @@ if (isDryRun) {
console.log('Seed operation plan:\n'); console.log('Seed operation plan:\n');
console.log('Tables will be seeded in this order:'); console.log('Tables will be seeded in this order:');
if (metadata && metadata.tables) { if (metadata?.tables) {
metadata.tables.forEach((table: any, index: number) => { metadata.tables.forEach((table: any, index: number) => {
const deps = const deps =
table.dependencies?.length > 0 ? ` (depends on: ${table.dependencies.join(', ')})` : ''; table.dependencies?.length > 0 ? ` (depends on: ${table.dependencies.join(', ')})` : '';

View File

@ -15,17 +15,12 @@
{ {
"name": "apiKeys", "name": "apiKeys",
"recordCount": 1, "recordCount": 1,
"dependencies": [ "dependencies": ["organizations", "users"]
"organizations",
"users"
]
}, },
{ {
"name": "assetPermissions", "name": "assetPermissions",
"recordCount": 6, "recordCount": 6,
"dependencies": [ "dependencies": ["users"]
"users"
]
}, },
{ {
"name": "assetSearch", "name": "assetSearch",
@ -35,134 +30,87 @@
{ {
"name": "chats", "name": "chats",
"recordCount": 3, "recordCount": 3,
"dependencies": [ "dependencies": ["organizations", "users"]
"organizations",
"users"
]
}, },
{ {
"name": "dataSources", "name": "dataSources",
"recordCount": 1, "recordCount": 1,
"dependencies": [ "dependencies": ["organizations", "users"]
"organizations",
"users"
]
}, },
{ {
"name": "datasetGroups", "name": "datasetGroups",
"recordCount": 2, "recordCount": 2,
"dependencies": [ "dependencies": ["organizations"]
"organizations"
]
}, },
{ {
"name": "datasetGroupsPermissions", "name": "datasetGroupsPermissions",
"recordCount": 1, "recordCount": 1,
"dependencies": [ "dependencies": ["datasetGroups", "organizations"]
"datasetGroups",
"organizations"
]
}, },
{ {
"name": "datasets", "name": "datasets",
"recordCount": 102, "recordCount": 102,
"dependencies": [ "dependencies": ["dataSources", "organizations", "users"]
"dataSources",
"organizations",
"users"
]
}, },
{ {
"name": "datasetPermissions", "name": "datasetPermissions",
"recordCount": 4, "recordCount": 4,
"dependencies": [ "dependencies": ["organizations", "datasets"]
"organizations",
"datasets"
]
}, },
{ {
"name": "datasetsToDatasetGroups", "name": "datasetsToDatasetGroups",
"recordCount": 18, "recordCount": 18,
"dependencies": [ "dependencies": ["datasets", "datasetGroups"]
"datasets",
"datasetGroups"
]
}, },
{ {
"name": "permissionGroups", "name": "permissionGroups",
"recordCount": 3, "recordCount": 3,
"dependencies": [ "dependencies": ["organizations", "users"]
"organizations",
"users"
]
}, },
{ {
"name": "docs", "name": "docs",
"recordCount": 1, "recordCount": 1,
"dependencies": [ "dependencies": ["organizations"]
"organizations"
]
}, },
{ {
"name": "messages", "name": "messages",
"recordCount": 3, "recordCount": 3,
"dependencies": [ "dependencies": ["chats", "users"]
"chats",
"users"
]
}, },
{ {
"name": "messagesToFiles", "name": "messagesToFiles",
"recordCount": 2, "recordCount": 2,
"dependencies": [ "dependencies": ["messages"]
"messages"
]
}, },
{ {
"name": "metricFiles", "name": "metricFiles",
"recordCount": 2, "recordCount": 2,
"dependencies": [ "dependencies": ["users", "dataSources"]
"users",
"dataSources"
]
}, },
{ {
"name": "permissionGroupsToIdentities", "name": "permissionGroupsToIdentities",
"recordCount": 5, "recordCount": 5,
"dependencies": [ "dependencies": ["users"]
"users"
]
}, },
{ {
"name": "teams", "name": "teams",
"recordCount": 2, "recordCount": 2,
"dependencies": [ "dependencies": ["organizations", "users"]
"organizations",
"users"
]
}, },
{ {
"name": "teamsToUsers", "name": "teamsToUsers",
"recordCount": 2, "recordCount": 2,
"dependencies": [ "dependencies": ["teams", "users"]
"teams",
"users"
]
}, },
{ {
"name": "textSearch", "name": "textSearch",
"recordCount": 58, "recordCount": 58,
"dependencies": [ "dependencies": ["organizations"]
"organizations"
]
}, },
{ {
"name": "usersToOrganizations", "name": "usersToOrganizations",
"recordCount": 6, "recordCount": 6,
"dependencies": [ "dependencies": ["organizations", "users"]
"organizations",
"users"
]
} }
], ],
"tableOrder": [ "tableOrder": [
@ -206,140 +154,43 @@
"usersToOrganizations" "usersToOrganizations"
], ],
"dependencies": { "dependencies": {
"apiKeys": [ "apiKeys": ["organizations", "users"],
"organizations", "assetPermissions": ["users"],
"users"
],
"assetPermissions": [
"users"
],
"assetSearch": [], "assetSearch": [],
"chats": [ "chats": ["organizations", "users"],
"organizations", "collections": ["organizations", "users"],
"users" "collectionsToAssets": ["users"],
], "dashboardFiles": ["users"],
"collections": [ "dataSources": ["organizations", "users"],
"organizations", "datasetGroups": ["organizations"],
"users" "datasetGroupsPermissions": ["datasetGroups", "organizations"],
], "datasetPermissions": ["organizations", "datasets"],
"collectionsToAssets": [ "datasets": ["dataSources", "organizations", "users"],
"users" "datasetsToDatasetGroups": ["datasets", "datasetGroups"],
], "datasetsToPermissionGroups": ["datasets", "permissionGroups"],
"dashboardFiles": [ "docs": ["organizations"],
"users" "githubIntegrations": ["organizations", "users"],
], "messages": ["chats", "users"],
"dataSources": [ "messagesToFiles": ["messages"],
"organizations", "messagesToSlackMessages": ["messages", "slackMessageTracking"],
"users" "metricFiles": ["users", "dataSources"],
], "metricFilesToDashboardFiles": ["metricFiles", "dashboardFiles", "users"],
"datasetGroups": [ "metricFilesToDatasets": ["metricFiles", "datasets"],
"organizations" "metricFilesToReportFiles": ["metricFiles", "reportFiles", "users"],
],
"datasetGroupsPermissions": [
"datasetGroups",
"organizations"
],
"datasetPermissions": [
"organizations",
"datasets"
],
"datasets": [
"dataSources",
"organizations",
"users"
],
"datasetsToDatasetGroups": [
"datasets",
"datasetGroups"
],
"datasetsToPermissionGroups": [
"datasets",
"permissionGroups"
],
"docs": [
"organizations"
],
"githubIntegrations": [
"organizations",
"users"
],
"messages": [
"chats",
"users"
],
"messagesToFiles": [
"messages"
],
"messagesToSlackMessages": [
"messages",
"slackMessageTracking"
],
"metricFiles": [
"users",
"dataSources"
],
"metricFilesToDashboardFiles": [
"metricFiles",
"dashboardFiles",
"users"
],
"metricFilesToDatasets": [
"metricFiles",
"datasets"
],
"metricFilesToReportFiles": [
"metricFiles",
"reportFiles",
"users"
],
"organizations": [], "organizations": [],
"permissionGroups": [ "permissionGroups": ["organizations", "users"],
"organizations", "permissionGroupsToIdentities": ["users"],
"users" "permissionGroupsToUsers": ["permissionGroups", "users"],
], "reportFiles": ["users", "organizations"],
"permissionGroupsToIdentities": [ "s3Integrations": ["organizations"],
"users" "shortcuts": ["users", "organizations"],
], "slackIntegrations": ["organizations", "users"],
"permissionGroupsToUsers": [ "slackMessageTracking": ["slackIntegrations"],
"permissionGroups", "teams": ["organizations", "users"],
"users" "teamsToUsers": ["teams", "users"],
], "textSearch": ["organizations"],
"reportFiles": [ "userFavorites": ["users"],
"users",
"organizations"
],
"s3Integrations": [
"organizations"
],
"shortcuts": [
"users",
"organizations"
],
"slackIntegrations": [
"organizations",
"users"
],
"slackMessageTracking": [
"slackIntegrations"
],
"teams": [
"organizations",
"users"
],
"teamsToUsers": [
"teams",
"users"
],
"textSearch": [
"organizations"
],
"userFavorites": [
"users"
],
"users": [], "users": [],
"usersToOrganizations": [ "usersToOrganizations": ["organizations", "users"]
"organizations",
"users"
]
} }
} }

View File

@ -43,9 +43,7 @@
}, },
"title": "Broke down your request", "title": "Broke down your request",
"status": "completed", "status": "completed",
"file_ids": [ "file_ids": ["todos-1758311476502-hd3fotv7z1m"],
"todos-1758311476502-hd3fotv7z1m"
],
"secondary_title": "3.9 seconds" "secondary_title": "3.9 seconds"
}, },
{ {
@ -73,9 +71,7 @@
}, },
"title": "Ran 2 validation queries", "title": "Ran 2 validation queries",
"status": "completed", "status": "completed",
"file_ids": [ "file_ids": ["sql-toolu_01Q5bAwXiG9nGmMN9D1gJtzm"],
"sql-toolu_01Q5bAwXiG9nGmMN9D1gJtzm"
],
"secondary_title": "2.5 seconds" "secondary_title": "2.5 seconds"
}, },
{ {
@ -103,9 +99,7 @@
}, },
"title": "Ran 2 validation queries, 1 failed", "title": "Ran 2 validation queries, 1 failed",
"status": "failed", "status": "failed",
"file_ids": [ "file_ids": ["sql-toolu_01NFn7mND7tK8UQg16cH27uq"],
"sql-toolu_01NFn7mND7tK8UQg16cH27uq"
],
"secondary_title": "4.5 seconds" "secondary_title": "4.5 seconds"
}, },
{ {
@ -133,9 +127,7 @@
}, },
"title": "Ran 1 validation query", "title": "Ran 1 validation query",
"status": "completed", "status": "completed",
"file_ids": [ "file_ids": ["sql-toolu_01SkTSCXsVqEbwAZhgYit3r6"],
"sql-toolu_01SkTSCXsVqEbwAZhgYit3r6"
],
"secondary_title": "3.0 seconds" "secondary_title": "3.0 seconds"
}, },
{ {
@ -163,9 +155,7 @@
}, },
"title": "Created 1 metric_file", "title": "Created 1 metric_file",
"status": "completed", "status": "completed",
"file_ids": [ "file_ids": ["8005c5dd-b5fe-4378-b6e4-781167a66faa"],
"8005c5dd-b5fe-4378-b6e4-781167a66faa"
],
"secondary_title": "8.5 seconds" "secondary_title": "8.5 seconds"
} }
], ],
@ -522,9 +512,7 @@
}, },
"title": "Broke down your request", "title": "Broke down your request",
"status": "completed", "status": "completed",
"file_ids": [ "file_ids": ["todos-1758316028374-sy337pwvhj"],
"todos-1758316028374-sy337pwvhj"
],
"secondary_title": "2.6 seconds" "secondary_title": "2.6 seconds"
}, },
{ {
@ -552,9 +540,7 @@
}, },
"title": "Ran 3 validation queries", "title": "Ran 3 validation queries",
"status": "completed", "status": "completed",
"file_ids": [ "file_ids": ["sql-toolu_01WovP2oMwhW6UWFD7TM8mNL"],
"sql-toolu_01WovP2oMwhW6UWFD7TM8mNL"
],
"secondary_title": "2.2 seconds" "secondary_title": "2.2 seconds"
}, },
{ {
@ -582,9 +568,7 @@
}, },
"title": "Created 1 metric_file", "title": "Created 1 metric_file",
"status": "completed", "status": "completed",
"file_ids": [ "file_ids": ["c76d39e5-c1b0-4882-ba99-f3b96039c7c7"],
"c76d39e5-c1b0-4882-ba99-f3b96039c7c7"
],
"secondary_title": "5.5 seconds" "secondary_title": "5.5 seconds"
} }
], ],
@ -828,9 +812,7 @@
}, },
"title": "Broke down your request", "title": "Broke down your request",
"status": "completed", "status": "completed",
"file_ids": [ "file_ids": ["todos-1758315939202-jbd1dtn9t5"],
"todos-1758315939202-jbd1dtn9t5"
],
"secondary_title": "2.5 seconds" "secondary_title": "2.5 seconds"
}, },
{ {
@ -858,9 +840,7 @@
}, },
"title": "Generated 3 validation queries", "title": "Generated 3 validation queries",
"status": "completed", "status": "completed",
"file_ids": [ "file_ids": ["sql-toolu_01BgQm1j8ggahsvqpRZgEKaY"]
"sql-toolu_01BgQm1j8ggahsvqpRZgEKaY"
]
}, },
{ {
"id": "toolu_01S5QUiwN6uy2RNg1MAiwgKR", "id": "toolu_01S5QUiwN6uy2RNg1MAiwgKR",
@ -887,9 +867,7 @@
}, },
"title": "Failed to create 1 metric_file", "title": "Failed to create 1 metric_file",
"status": "failed", "status": "failed",
"file_ids": [ "file_ids": ["6e7ed83e-0232-498c-9657-1147c21163ec"],
"6e7ed83e-0232-498c-9657-1147c21163ec"
],
"secondary_title": "5.1 seconds" "secondary_title": "5.1 seconds"
}, },
{ {
@ -909,9 +887,7 @@
}, },
"title": "Failed to create 1 metric_file", "title": "Failed to create 1 metric_file",
"status": "failed", "status": "failed",
"file_ids": [ "file_ids": ["337ecb09-377a-4179-a0cd-7f98ba16d172"],
"337ecb09-377a-4179-a0cd-7f98ba16d172"
],
"secondary_title": "1.8 seconds" "secondary_title": "1.8 seconds"
} }
], ],

View File

@ -64,10 +64,7 @@
}, },
"disableTooltip": false, "disableTooltip": false,
"metricColumnId": "metric_clv_all_time", "metricColumnId": "metric_clv_all_time",
"scatterDotSize": [ "scatterDotSize": [3, 15],
3,
15
],
"xAxisAxisTitle": null, "xAxisAxisTitle": null,
"yAxisAxisTitle": null, "yAxisAxisTitle": null,
"yAxisScaleType": "linear", "yAxisScaleType": "linear",
@ -238,10 +235,7 @@
}, },
"disableTooltip": false, "disableTooltip": false,
"metricColumnId": "metric_clv_all_time", "metricColumnId": "metric_clv_all_time",
"scatterDotSize": [ "scatterDotSize": [3, 15],
3,
15
],
"xAxisAxisTitle": null, "xAxisAxisTitle": null,
"yAxisAxisTitle": null, "yAxisAxisTitle": null,
"yAxisScaleType": "linear", "yAxisScaleType": "linear",
@ -438,10 +432,7 @@
}, },
"disableTooltip": false, "disableTooltip": false,
"metricColumnId": "total_customers", "metricColumnId": "total_customers",
"scatterDotSize": [ "scatterDotSize": [3, 15],
3,
15
],
"xAxisAxisTitle": null, "xAxisAxisTitle": null,
"yAxisAxisTitle": null, "yAxisAxisTitle": null,
"yAxisScaleType": "linear", "yAxisScaleType": "linear",
@ -570,10 +561,7 @@
}, },
"disableTooltip": false, "disableTooltip": false,
"metricColumnId": "total_customers", "metricColumnId": "total_customers",
"scatterDotSize": [ "scatterDotSize": [3, 15],
3,
15
],
"xAxisAxisTitle": null, "xAxisAxisTitle": null,
"yAxisAxisTitle": null, "yAxisAxisTitle": null,
"yAxisScaleType": "linear", "yAxisScaleType": "linear",

View File

@ -19535,7 +19535,7 @@ snapshots:
magic-string: 0.30.17 magic-string: 0.30.17
sirv: 3.0.1 sirv: 3.0.1
tinyrainbow: 2.0.0 tinyrainbow: 2.0.0
vitest: 3.2.4(@edge-runtime/vm@3.2.0)(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.5.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.11.2(@types/node@24.3.1)(typescript@5.9.2))(sass@1.92.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) vitest: 3.2.4(@edge-runtime/vm@3.2.0)(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.5.1)(jsdom@26.1.0)(lightningcss@1.30.1)(msw@2.11.2(@types/node@24.3.1)(typescript@5.9.2))(sass@1.92.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)
ws: 8.18.3 ws: 8.18.3
optionalDependencies: optionalDependencies:
playwright: 1.55.0 playwright: 1.55.0
@ -19560,7 +19560,7 @@ snapshots:
std-env: 3.9.0 std-env: 3.9.0
test-exclude: 7.0.1 test-exclude: 7.0.1
tinyrainbow: 2.0.0 tinyrainbow: 2.0.0
vitest: 3.2.4(@edge-runtime/vm@3.2.0)(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.5.1)(jsdom@27.0.0(postcss@8.5.6))(lightningcss@1.30.1)(msw@2.11.2(@types/node@24.3.1)(typescript@5.9.2))(sass@1.92.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1) vitest: 3.2.4(@edge-runtime/vm@3.2.0)(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(@vitest/ui@3.2.4)(jiti@2.5.1)(jsdom@26.1.0)(lightningcss@1.30.1)(msw@2.11.2(@types/node@24.3.1)(typescript@5.9.2))(sass@1.92.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1)
optionalDependencies: optionalDependencies:
'@vitest/browser': 3.2.4(msw@2.11.2(@types/node@24.3.1)(typescript@5.9.2))(playwright@1.55.0)(vite@7.1.4(@types/node@24.3.1)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4) '@vitest/browser': 3.2.4(msw@2.11.2(@types/node@24.3.1)(typescript@5.9.2))(playwright@1.55.0)(vite@7.1.4(@types/node@24.3.1)(jiti@2.5.1)(lightningcss@1.30.1)(sass@1.92.1)(terser@5.43.1)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4)
transitivePeerDependencies: transitivePeerDependencies: