From a25c537c40a01e50ade34202f5c5e4e3cd05dd16 Mon Sep 17 00:00:00 2001 From: jsnyder10 Date: Fri, 4 Sep 2026 14:36:08 -0500 Subject: [PATCH 1/3] chore: clear the audit, drop six overrides, remove dead code pnpm audit went from 95 findings to 0. Nearly all of it came from stale transitive resolutions, so the fix is upgrading the direct dependencies rather than pinning transitives: - stack: @aws-sdk/client-* 3.1127, js-yaml 4.3.2, ts-jest 29.4.12, jest 30 - auth: @typescript-eslint 8, prisma 7.10, tsup 8.5.1, vite 7.3.6, drizzle-orm 0.45.2, react-router-dom 7.18.3, @vitejs/plugin-react 5.2 - root: @changesets/cli 3 Overrides drop from 9 to 3. minimatch, hono, @hono/node-server, diff, lodash, flatted, rollup and ajv all reach a patched version on their own now. deepmerge-ts, esbuild and mysql2 stay because prisma and tsup pin them to an exact version no range can reach. The zod override was hiding a real bug. validators.ts, types/hooks.ts and procedures/passkey.ts imported AnyZodObject, which zod 3 exported and zod 4 removed, while peerDependencies has always declared ">=4.3.6 <5". The override forced zod 3 into the workspace, so the build passed and the emitted .d.ts carried zod 3 shapes (z.ZodObject<..., "strip", z.ZodTypeAny, ...>) that break every consumer on zod 4. src/types/zod.ts now defines the zod 4 equivalent, and auth builds against zod 4.5.4. Unused dependencies: libsodium-wrappers and ts-node (stack), better-sqlite3 with its adapter and types (auth, also drops a native build step), and the duplicate @trpc/server devDependency that shadowed the real one and caused a peer warning. Dead code, roughly 3000 lines. Eight .test.js files that jest never ran (testMatch is *.test.ts) and that fail outright when forced, plus the fixtures and mock only they used. Thirteen source files unreachable from bin/stack, src/index.ts or any live test: four orphan barrels, seven modules reachable only through those barrels, and two with no references at all. template-generator.ts goes too; the live .env.example generation lives in factiii/scanfix/env-files.ts and port-convention.ts, and the scanfix tests already cover the PORT slot behaviour its two tests duplicated. src/scripts/index.ts stays. mac/staging.ts generates remote code that deep-requires @factiii/stack/dist/scripts/index.js. Also runs prettier over auth/src. That check had been failing before any of this, against its own pinned prettier. Build, both test suites, both typechecks, auth lint and format, prisma generate and prisma validate all pass. --- package.json | 14 +- packages/auth/package.json | 64 +- packages/auth/src/adapters/database.ts | 18 +- packages/auth/src/adapters/drizzleAdapter.ts | 106 +- packages/auth/src/adapters/oauthAccount.ts | 5 +- packages/auth/src/adapters/passkey.ts | 6 +- packages/auth/src/adapters/prismaAdapter.ts | 37 +- packages/auth/src/drizzle.ts | 10 +- packages/auth/src/index.ts | 5 +- packages/auth/src/middleware/authGuard.ts | 52 +- packages/auth/src/procedures/base.ts | 81 +- packages/auth/src/procedures/magicLink.ts | 7 +- packages/auth/src/procedures/multiAccount.ts | 26 +- packages/auth/src/procedures/oauth.ts | 4 +- packages/auth/src/procedures/passkey.ts | 58 +- packages/auth/src/procedures/twoFa/device.ts | 33 +- packages/auth/src/procedures/twoFa/shared.ts | 48 +- .../auth/src/procedures/twoFa/standard.ts | 4 +- packages/auth/src/router.ts | 5 +- packages/auth/src/types.ts | 1 - packages/auth/src/types/config.ts | 4 +- packages/auth/src/types/hooks.ts | 18 +- packages/auth/src/types/zod.ts | 10 + packages/auth/src/utilities/bundle.ts | 2 +- packages/auth/src/utilities/config.ts | 4 +- packages/auth/src/utilities/cookies.ts | 38 +- packages/auth/src/utilities/index.ts | 5 +- packages/auth/src/utilities/issueCookies.ts | 7 +- packages/auth/src/utilities/jwt.ts | 9 +- packages/auth/src/utilities/loginMethods.ts | 8 +- packages/auth/src/utilities/magicLink.ts | 4 +- packages/auth/src/utilities/session.ts | 9 +- packages/auth/src/utilities/trpc.ts | 12 +- packages/auth/src/validators.ts | 6 +- packages/stack/package.json | 30 +- packages/stack/src/cli/deployer.ts | 26 - packages/stack/src/cli/index.ts | 18 - .../stack/src/plugins/interfaces/index.ts | 11 - .../plugins/pipelines/aws/configs/index.ts | 15 - .../plugins/pipelines/aws/scanfix/aws-cli.ts | 105 - packages/stack/src/utils/config-schema.ts | 115 - packages/stack/src/utils/config-validator.ts | 155 - packages/stack/src/utils/deployment-report.ts | 330 - packages/stack/src/utils/dns-validator.ts | 67 - .../src/utils/github-workflow-monitor.ts | 191 - packages/stack/src/utils/index.ts | 29 - .../stack/src/utils/interactive-prompts.ts | 81 - packages/stack/src/utils/server-check.ts | 498 -- .../stack/src/utils/template-generator.ts | 223 - packages/stack/test/__mocks__/ssh.js | 131 - packages/stack/test/cli.test.js | 366 - packages/stack/test/deployment-report.test.js | 181 - packages/stack/test/deployment.test.js | 191 - packages/stack/test/env-management.test.js | 317 - packages/stack/test/fixtures/repo1.yml | 10 - packages/stack/test/fixtures/repo2.yml | 10 - packages/stack/test/generators.test.js | 234 - packages/stack/test/github-secrets.test.js | 90 - packages/stack/test/port-convention.test.ts | 27 - packages/stack/test/secret-prompts.test.js | 259 - .../stack/test/template-generator.test.js | 113 - pnpm-lock.yaml | 7638 ++++++++--------- 62 files changed, 3813 insertions(+), 8368 deletions(-) create mode 100644 packages/auth/src/types/zod.ts delete mode 100644 packages/stack/src/cli/deployer.ts delete mode 100644 packages/stack/src/cli/index.ts delete mode 100644 packages/stack/src/plugins/interfaces/index.ts delete mode 100644 packages/stack/src/plugins/pipelines/aws/configs/index.ts delete mode 100644 packages/stack/src/plugins/pipelines/aws/scanfix/aws-cli.ts delete mode 100644 packages/stack/src/utils/config-schema.ts delete mode 100644 packages/stack/src/utils/config-validator.ts delete mode 100644 packages/stack/src/utils/deployment-report.ts delete mode 100644 packages/stack/src/utils/dns-validator.ts delete mode 100644 packages/stack/src/utils/github-workflow-monitor.ts delete mode 100644 packages/stack/src/utils/index.ts delete mode 100644 packages/stack/src/utils/interactive-prompts.ts delete mode 100644 packages/stack/src/utils/server-check.ts delete mode 100644 packages/stack/src/utils/template-generator.ts delete mode 100644 packages/stack/test/__mocks__/ssh.js delete mode 100644 packages/stack/test/cli.test.js delete mode 100644 packages/stack/test/deployment-report.test.js delete mode 100644 packages/stack/test/deployment.test.js delete mode 100644 packages/stack/test/env-management.test.js delete mode 100644 packages/stack/test/fixtures/repo1.yml delete mode 100644 packages/stack/test/fixtures/repo2.yml delete mode 100644 packages/stack/test/generators.test.js delete mode 100644 packages/stack/test/github-secrets.test.js delete mode 100644 packages/stack/test/secret-prompts.test.js delete mode 100644 packages/stack/test/template-generator.test.js diff --git a/package.json b/package.json index b2d53d5..903994f 100644 --- a/package.json +++ b/package.json @@ -14,21 +14,15 @@ "release": "pnpm build && changeset publish" }, "devDependencies": { - "@changesets/cli": "^2.30.0", + "@changesets/cli": "^3.0.2", "typescript": "^5.9.3" }, "packageManager": "pnpm@10.32.1", "pnpm": { "overrides": { - "minimatch": ">=10.2.1", - "diff": ">=4.0.4", - "hono": ">=4.12.7", - "@hono/node-server": ">=1.19.10", - "lodash": ">=4.17.23", - "flatted": ">=3.4.0", - "rollup": ">=4.59.0", - "ajv": "^6.14.0", - "zod": "3.25.76" + "deepmerge-ts": ">=8.0.2", + "esbuild": ">=0.28.1", + "mysql2": ">=3.24.3" } } } diff --git a/packages/auth/package.json b/packages/auth/package.json index 2c82c88..ad68e40 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -87,13 +87,13 @@ "e2e:db:down": "docker compose -f e2e/docker-compose.yml down" }, "dependencies": { - "@simplewebauthn/server": "^13.3.2", - "@trpc/server": "^11.8.0", - "apple-signin-auth": "^2.0.0", + "@simplewebauthn/server": "^13.3.3", + "@trpc/server": "^11.18.0", + "apple-signin-auth": "^2.1.0", "bcryptjs": "^2.4.3", - "google-auth-library": "^10.5.0", - "jsonwebtoken": "^9.0.2", - "totp-generator": "^2.0.0" + "google-auth-library": "^10.9.1", + "jsonwebtoken": "^9.0.3", + "totp-generator": "^2.0.1" }, "peerDependencies": { "@prisma/client": ">=5.0.0", @@ -116,37 +116,33 @@ } }, "devDependencies": { - "@playwright/test": "^1.58.1", - "@prisma/adapter-better-sqlite3": "^7.3.0", - "@prisma/adapter-pg": "^7.3.0", - "@prisma/client": "^7.1.0", - "@trpc/client": "^11.8.0", - "@trpc/server": "^11.8.0", + "@playwright/test": "^1.62.1", + "@prisma/adapter-pg": "^7.10.0", + "@prisma/client": "^7.10.0", + "@trpc/client": "^11.18.0", "@types/bcryptjs": "^2.4.6", - "@types/better-sqlite3": "^7.6.13", - "@types/jsonwebtoken": "^9.0.9", - "@types/node": "^20.19.0", - "@types/pg": "^8.16.0", - "@types/react": "^19.2.11", - "@types/react-dom": "^19.2.3", - "@typescript-eslint/eslint-plugin": "^7.18.0", - "@typescript-eslint/parser": "^7.18.0", - "@vitejs/plugin-react": "^5.1.3", - "better-sqlite3": "^12.6.2", - "drizzle-orm": "^0.44.0", - "eslint": "^8.57.0", - "pg": "^8.18.0", - "prettier": "^3.8.1", - "prisma": "^7.1.0", - "react": "^19.2.4", - "react-dom": "^19.2.4", - "react-router-dom": "^7.2.0", + "@types/jsonwebtoken": "^9.0.10", + "@types/node": "^20.19.43", + "@types/pg": "^8.23.1", + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.7", + "@typescript-eslint/eslint-plugin": "^8.69.0", + "@typescript-eslint/parser": "^8.69.0", + "@vitejs/plugin-react": "^5.2.0", + "drizzle-orm": "^0.45.2", + "eslint": "^8.57.1", + "pg": "^8.23.0", + "prettier": "^3.9.6", + "prisma": "^7.10.0", + "react": "^19.2.8", + "react-dom": "^19.2.8", + "react-router-dom": "^7.18.3", "superjson": "^1.13.3", - "tsup": "^8.3.5", - "tsx": "^4.21.0", + "tsup": "^8.5.1", + "tsx": "^4.23.13", "typescript": "5.9.3", - "vite": "^7.3.1", - "vitest": "^4.1.0", + "vite": "^7.3.6", + "vitest": "^4.1.11", "zod": "^4.3.6" }, "engines": { diff --git a/packages/auth/src/adapters/database.ts b/packages/auth/src/adapters/database.ts index a5ff6ca..552a794 100644 --- a/packages/auth/src/adapters/database.ts +++ b/packages/auth/src/adapters/database.ts @@ -103,7 +103,9 @@ export interface DatabaseAdapter { create(data: CreateUserData): Promise; update(id: number, data: Partial>): Promise; /** Read just the standard-mode 2FA secret + backup codes for a user. */ - findTwoFaSecret(id: number): Promise<{ twoFaSecret: string | null; twoFaBackupCodes: string[] }>; + findTwoFaSecret( + id: number + ): Promise<{ twoFaSecret: string | null; twoFaBackupCodes: string[] }>; /** Persist the standard-mode 2FA secret and backup codes. Non-null secret == 2FA on. */ setTwoFaSecret(id: number, secret: string, backupCodes: string[]): Promise; /** Replace the backup codes without touching the TOTP secret. */ @@ -118,13 +120,21 @@ export interface DatabaseAdapter { /** Find session by ID with user status and verifiedHumanAt joined. */ findById(id: number): Promise; create(data: CreateSessionData): Promise; - update(id: number, data: Partial>): Promise; + update( + id: number, + data: Partial> + ): Promise; /** Update lastUsed and return session with user's verifiedHumanAt and updatedAt. */ - updateLastUsed(id: number): Promise; + updateLastUsed( + id: number + ): Promise; /** Set revokedAt on a single session. */ revoke(id: number): Promise; /** Find active (non-revoked) sessions for a user, optionally excluding one. */ - findActiveByUserId(userId: number, excludeSessionId?: number): Promise[]>; + findActiveByUserId( + userId: number, + excludeSessionId?: number + ): Promise[]>; /** Revoke all active sessions for a user, optionally excluding one. */ revokeAllByUserId(userId: number, excludeSessionId?: number): Promise; diff --git a/packages/auth/src/adapters/drizzleAdapter.ts b/packages/auth/src/adapters/drizzleAdapter.ts index 5fca10e..6c566b9 100644 --- a/packages/auth/src/adapters/drizzleAdapter.ts +++ b/packages/auth/src/adapters/drizzleAdapter.ts @@ -123,11 +123,7 @@ export function createDrizzleAdapter( }, async findById(id: number): Promise { - const rows = await db - .select() - .from(users) - .where(eq(users.id, id)) - .limit(1); + const rows = await db.select().from(users).where(eq(users.id, id)).limit(1); return (rows[0] as unknown as AuthUser | undefined) ?? null; }, @@ -141,7 +137,10 @@ export function createDrizzleAdapter( }, async create(data: CreateUserData): Promise { - const rows = await db.insert(users).values(data as unknown as Record).returning(); + const rows = await db + .insert(users) + .values(data as unknown as Record) + .returning(); return rows[0] as unknown as AuthUser; }, @@ -165,18 +164,15 @@ export function createDrizzleAdapter( .from(users) .where(eq(users.id, id)) .limit(1); - const row = rows[0] as { twoFaSecret: string | null; twoFaBackupCodes: string[] | null } | undefined; + const row = rows[0] as + { twoFaSecret: string | null; twoFaBackupCodes: string[] | null } | undefined; return { twoFaSecret: row?.twoFaSecret ?? null, twoFaBackupCodes: row?.twoFaBackupCodes ?? [], }; }, - async setTwoFaSecret( - id: number, - secret: string, - backupCodes: string[] - ): Promise { + async setTwoFaSecret(id: number, secret: string, backupCodes: string[]): Promise { await db .update(users) .set({ twoFaSecret: secret, twoFaBackupCodes: backupCodes }) @@ -184,10 +180,7 @@ export function createDrizzleAdapter( }, async setBackupCodes(id: number, backupCodes: string[]): Promise { - await db - .update(users) - .set({ twoFaBackupCodes: backupCodes }) - .where(eq(users.id, id)); + await db.update(users).set({ twoFaBackupCodes: backupCodes }).where(eq(users.id, id)); }, async clearTwoFaSecret(id: number): Promise { @@ -213,10 +206,7 @@ export function createDrizzleAdapter( const idx = codes.indexOf(code); if (idx === -1) return false; const next = [...codes.slice(0, idx), ...codes.slice(idx + 1)]; - await db - .update(users) - .set({ twoFaBackupCodes: next }) - .where(eq(users.id, id)); + await db.update(users).set({ twoFaBackupCodes: next }).where(eq(users.id, id)); return true; }, }, @@ -246,7 +236,10 @@ export function createDrizzleAdapter( }, async create(data: CreateSessionData): Promise { - const rows = await db.insert(sessions).values(data as unknown as Record).returning(); + const rows = await db + .insert(sessions) + .values(data as unknown as Record) + .returning(); return rows[0] as unknown as AuthSession; }, @@ -265,10 +258,7 @@ export function createDrizzleAdapter( async updateLastUsed( id: number ): Promise { - await db - .update(sessions) - .set({ lastUsed: new Date() }) - .where(eq(sessions.id, id)); + await db.update(sessions).set({ lastUsed: new Date() }).where(eq(sessions.id, id)); const rows = await db .select({ @@ -295,10 +285,7 @@ export function createDrizzleAdapter( }, async revoke(id: number): Promise { - await db - .update(sessions) - .set({ revokedAt: new Date() }) - .where(eq(sessions.id, id)); + await db.update(sessions).set({ revokedAt: new Date() }).where(eq(sessions.id, id)); }, async findManyByIds(ids: number[]): Promise { @@ -362,15 +349,16 @@ export function createDrizzleAdapter( const rows = await db .select() .from(otps) - .where( - and(eq(otps.userId, userId), eq(otps.code, code), gte(otps.expiresAt, new Date())) - ) + .where(and(eq(otps.userId, userId), eq(otps.code, code), gte(otps.expiresAt, new Date()))) .limit(1); return (rows[0] as unknown as AuthOTP | undefined) ?? null; }, async create(data: { userId: number; code: number; expiresAt: Date }): Promise { - const rows = await db.insert(otps).values(data as unknown as Record).returning(); + const rows = await db + .insert(otps) + .values(data as unknown as Record) + .returning(); return rows[0] as unknown as AuthOTP; }, @@ -394,10 +382,7 @@ export function createDrizzleAdapter( }, async create(userId: number): Promise { - const rows = await db - .insert(passwordResets) - .values({ userId }) - .returning(); + const rows = await db.insert(passwordResets).values({ userId }).returning(); return rows[0] as unknown as AuthPasswordReset; }, @@ -440,9 +425,7 @@ export function createDrizzleDeviceAdapter( return { session: { - async findTwoFaSecretsByUserId( - userId: number - ): Promise<{ twoFaSecret: string | null }[]> { + async findTwoFaSecretsByUserId(userId: number): Promise<{ twoFaSecret: string | null }[]> { const secretRows = await db .select({ twoFaSecret: sessions.twoFaSecret }) .from(sessions) @@ -463,16 +446,10 @@ export function createDrizzleDeviceAdapter( }, async setTwoFaSecret(sessionId: number, secret: string | null): Promise { - await db - .update(sessions) - .set({ twoFaSecret: secret }) - .where(eq(sessions.id, sessionId)); + await db.update(sessions).set({ twoFaSecret: secret }).where(eq(sessions.id, sessionId)); }, - async findByIdWithDevice( - id: number, - userId: number - ): Promise { + async findByIdWithDevice(id: number, userId: number): Promise { const rows = await db .select({ twoFaSecret: sessions.twoFaSecret, @@ -584,11 +561,7 @@ export function createDrizzleDeviceAdapter( return { id: rows[0].id }; }, - async upsertByPushToken( - pushToken: string, - sessionId: number, - userId: number - ): Promise { + async upsertByPushToken(pushToken: string, sessionId: number, userId: number): Promise { const existing = (await db .select({ id: devices.id }) .from(devices) @@ -614,36 +587,19 @@ export function createDrizzleDeviceAdapter( .onConflictDoNothing(); } if (tables.devicesToUsers) { - await db - .insert(tables.devicesToUsers) - .values({ deviceId, userId }) - .onConflictDoNothing(); + await db.insert(tables.devicesToUsers).values({ deviceId, userId }).onConflictDoNothing(); } - await db - .update(sessions) - .set({ deviceId }) - .where(eq(sessions.id, sessionId)); + await db.update(sessions).set({ deviceId }).where(eq(sessions.id, sessionId)); }, - async findByUserAndToken( - userId: number, - pushToken: string - ): Promise<{ id: number } | null> { + async findByUserAndToken(userId: number, pushToken: string): Promise<{ id: number } | null> { if (tables.devicesToUsers) { const joinRows = (await db .select({ id: devices.id }) .from(devices) - .innerJoin( - tables.devicesToUsers, - eq(devices.id, tables.devicesToUsers.deviceId) - ) - .where( - and( - eq(devices.pushToken, pushToken), - eq(tables.devicesToUsers.userId, userId) - ) - ) + .innerJoin(tables.devicesToUsers, eq(devices.id, tables.devicesToUsers.deviceId)) + .where(and(eq(devices.pushToken, pushToken), eq(tables.devicesToUsers.userId, userId))) .limit(1)) as { id: number }[]; return joinRows[0] ? { id: joinRows[0].id } : null; } diff --git a/packages/auth/src/adapters/oauthAccount.ts b/packages/auth/src/adapters/oauthAccount.ts index 5bce3dc..dad2a5d 100644 --- a/packages/auth/src/adapters/oauthAccount.ts +++ b/packages/auth/src/adapters/oauthAccount.ts @@ -7,10 +7,7 @@ */ export interface OAuthAccountAdapter { /** Resolve a linked provider identity to its account. Null if not linked. */ - resolve( - provider: 'GOOGLE' | 'APPLE', - subject: string - ): Promise<{ userId: number } | null>; + resolve(provider: 'GOOGLE' | 'APPLE', subject: string): Promise<{ userId: number } | null>; /** Attach a provider identity to a user (idempotent for the same user). */ link( diff --git a/packages/auth/src/adapters/passkey.ts b/packages/auth/src/adapters/passkey.ts index 082d463..547df86 100644 --- a/packages/auth/src/adapters/passkey.ts +++ b/packages/auth/src/adapters/passkey.ts @@ -6,7 +6,11 @@ * the short-lived challenge, the credential, and user creation. See * `prisma/schema.*.prisma` for the reference `Passkey` model. */ -import type { PasskeyChallengeType, PasskeyCredential, StoredPasskeyCredential } from '../types/passkey'; +import type { + PasskeyChallengeType, + PasskeyCredential, + StoredPasskeyCredential, +} from '../types/passkey'; import type { PasskeyRegisterInput, SchemaExtensions } from '../types/hooks'; export interface PasskeyAdapter { diff --git a/packages/auth/src/adapters/prismaAdapter.ts b/packages/auth/src/adapters/prismaAdapter.ts index 7ca6303..4847864 100644 --- a/packages/auth/src/adapters/prismaAdapter.ts +++ b/packages/auth/src/adapters/prismaAdapter.ts @@ -95,11 +95,7 @@ export function createPrismaAdapter(prisma: unknown): DatabaseAdapter { }; }, - async setTwoFaSecret( - id: number, - secret: string, - backupCodes: string[] - ): Promise { + async setTwoFaSecret(id: number, secret: string, backupCodes: string[]): Promise { await db.user.update({ where: { id }, data: { twoFaSecret: secret, twoFaBackupCodes: backupCodes }, @@ -133,7 +129,10 @@ export function createPrismaAdapter(prisma: unknown): DatabaseAdapter { if (!row) return false; const idx = row.twoFaBackupCodes.indexOf(code); if (idx === -1) return false; - const next = [...row.twoFaBackupCodes.slice(0, idx), ...row.twoFaBackupCodes.slice(idx + 1)]; + const next = [ + ...row.twoFaBackupCodes.slice(0, idx), + ...row.twoFaBackupCodes.slice(idx + 1), + ]; await db.user.update({ where: { id }, data: { twoFaBackupCodes: next }, @@ -149,7 +148,10 @@ export function createPrismaAdapter(prisma: unknown): DatabaseAdapter { if (!row) return false; const idx = row.twoFaBackupCodes.indexOf(code); if (idx === -1) return false; - const next = [...row.twoFaBackupCodes.slice(0, idx), ...row.twoFaBackupCodes.slice(idx + 1)]; + const next = [ + ...row.twoFaBackupCodes.slice(0, idx), + ...row.twoFaBackupCodes.slice(idx + 1), + ]; await txDb.user.update({ where: { id }, data: { twoFaBackupCodes: next }, @@ -257,7 +259,6 @@ export function createPrismaAdapter(prisma: unknown): DatabaseAdapter { }); return rows as SessionWithUser[]; }, - }, otp: { @@ -346,9 +347,7 @@ export function createPrismaDeviceAdapter(prisma: unknown): DeviceAuthAdapter { const db = prisma as PrismaModelAccess; return { session: { - async findTwoFaSecretsByUserId( - userId: number - ): Promise<{ twoFaSecret: string | null }[]> { + async findTwoFaSecretsByUserId(userId: number): Promise<{ twoFaSecret: string | null }[]> { return db.session.findMany({ where: { userId, twoFaSecret: { not: null } }, select: { twoFaSecret: true }, @@ -372,10 +371,7 @@ export function createPrismaDeviceAdapter(prisma: unknown): DeviceAuthAdapter { }); }, - async findByIdWithDevice( - id: number, - userId: number - ): Promise { + async findByIdWithDevice(id: number, userId: number): Promise { const session = await db.session.findUnique({ where: { id, userId }, select: { @@ -435,11 +431,7 @@ export function createPrismaDeviceAdapter(prisma: unknown): DeviceAuthAdapter { }) as Promise<{ id: number } | null>; }, - async upsertByPushToken( - pushToken: string, - sessionId: number, - userId: number - ): Promise { + async upsertByPushToken(pushToken: string, sessionId: number, userId: number): Promise { await db.device.upsert({ where: { pushToken }, create: { @@ -454,10 +446,7 @@ export function createPrismaDeviceAdapter(prisma: unknown): DeviceAuthAdapter { }); }, - async findByUserAndToken( - userId: number, - pushToken: string - ): Promise<{ id: number } | null> { + async findByUserAndToken(userId: number, pushToken: string): Promise<{ id: number } | null> { return db.device.findFirst({ where: { users: { some: { id: userId } }, pushToken }, select: { id: true }, diff --git a/packages/auth/src/drizzle.ts b/packages/auth/src/drizzle.ts index bd9d98b..6081bc1 100644 --- a/packages/auth/src/drizzle.ts +++ b/packages/auth/src/drizzle.ts @@ -1,8 +1,2 @@ -export { - createDrizzleAdapter, - createDrizzleDeviceAdapter, -} from './adapters/drizzleAdapter'; -export type { - DrizzleAdapterTables, - DrizzleDeviceAdapterTables, -} from './adapters/drizzleAdapter'; +export { createDrizzleAdapter, createDrizzleDeviceAdapter } from './adapters/drizzleAdapter'; +export type { DrizzleAdapterTables, DrizzleDeviceAdapterTables } from './adapters/drizzleAdapter'; diff --git a/packages/auth/src/index.ts b/packages/auth/src/index.ts index 6e2232f..980e65b 100644 --- a/packages/auth/src/index.ts +++ b/packages/auth/src/index.ts @@ -92,10 +92,7 @@ export { countLoginMethods, resolveLoginMethods, } from './utilities/loginMethods'; -export type { - CreateSessionWithTokenParams, - SessionWithTokenResult, -} from './utilities/session'; +export type { CreateSessionWithTokenParams, SessionWithTokenResult } from './utilities/session'; export { createSessionWithToken, createSessionWithTokenAndCookie } from './utilities/session'; export { cleanBase32String, diff --git a/packages/auth/src/middleware/authGuard.ts b/packages/auth/src/middleware/authGuard.ts index f3ab8db..a8cb544 100644 --- a/packages/auth/src/middleware/authGuard.ts +++ b/packages/auth/src/middleware/authGuard.ts @@ -33,9 +33,7 @@ export function createAuthGuard(config: AuthConfig, t: TrpcBuilder) { const maxAccounts = config.maxAccounts ?? 1; const SLIDE_THRESHOLD_SECONDS = 24 * 60 * 60; // 24 hours - const database: DatabaseAdapter = - config.database ?? - createPrismaAdapter(config.prisma); + const database: DatabaseAdapter = config.database ?? createPrismaAdapter(config.prisma); const revokeSession = async ( ctx: TrpcContext, @@ -66,7 +64,7 @@ export function createAuthGuard(config: AuthConfig, t: TrpcBuilder) { : [], origin: ctx.headers.origin ?? null, referer: ctx.headers.referer ?? null, - timestamp: new Date().toISOString() + timestamp: new Date().toISOString(), }; const combinedStack = [ @@ -126,7 +124,7 @@ export function createAuthGuard(config: AuthConfig, t: TrpcBuilder) { const { kept: requestedIds, dropped: droppedIds } = truncateBundle( payload.sessions, payload.id, - maxAccounts, + maxAccounts ); for (const id of droppedIds) { await database.session.revoke(id).catch(() => {}); @@ -161,11 +159,24 @@ export function createAuthGuard(config: AuthConfig, t: TrpcBuilder) { ? await config.getClientCookiePayload(newActive.userId) : {}), }; - setAuthCookies(ctx.res, newJwt, clientPayload, config.secrets.jwt, cookieSettings, storageKeys); + setAuthCookies( + ctx.res, + newJwt, + clientPayload, + config.secrets.jwt, + cookieSettings, + storageKeys + ); throw new TRPCError({ code: 'UNAUTHORIZED', message: 'ACTIVE_SESSION_SWITCHED' }); } - await revokeSession(ctx, payload.id, !session ? 'Session not found' : 'Session already revoked', undefined, path); + await revokeSession( + ctx, + payload.id, + !session ? 'Session not found' : 'Session already revoked', + undefined, + path + ); throw new TRPCError({ code: 'UNAUTHORIZED', message: 'Unauthorized' }); } @@ -176,9 +187,7 @@ export function createAuthGuard(config: AuthConfig, t: TrpcBuilder) { await revokeSession( ctx, session.id, - session.userId !== payload.userId - ? 'Token userId mismatch' - : 'Token predates session', + session.userId !== payload.userId ? 'Token userId mismatch' : 'Token predates session', undefined, path ); @@ -242,7 +251,14 @@ export function createAuthGuard(config: AuthConfig, t: TrpcBuilder) { ? await config.getClientCookiePayload(session.userId) : {}), }; - setAuthCookies(ctx.res, newJwt, clientPayload, config.secrets.jwt, cookieSettings, storageKeys); + setAuthCookies( + ctx.res, + newJwt, + clientPayload, + config.secrets.jwt, + cookieSettings, + storageKeys + ); } else if (storageKeys.clientToken) { const rawClientCookie = parseClientCookie(ctx.headers.cookie, storageKeys); let needsRefresh = !rawClientCookie; @@ -264,7 +280,13 @@ export function createAuthGuard(config: AuthConfig, t: TrpcBuilder) { ? await config.getClientCookiePayload(session.userId) : {}), }; - setClientCookie(ctx.res, clientPayload, config.secrets.jwt, cookieSettings, storageKeys as { clientToken: string }); + setClientCookie( + ctx.res, + clientPayload, + config.secrets.jwt, + cookieSettings, + storageKeys as { clientToken: string } + ); } } @@ -301,11 +323,9 @@ export function createAuthGuard(config: AuthConfig, t: TrpcBuilder) { await revokeSession( ctx, null, - isTokenInvalidError(err) - ? 'Token invalid' - : 'Token expired', + isTokenInvalidError(err) ? 'Token invalid' : 'Token expired', errorStack, - path, + path ); throw new TRPCError({ message: isTokenInvalidError(err) ? 'Token invalid' : 'Token expired', diff --git a/packages/auth/src/procedures/base.ts b/packages/auth/src/procedures/base.ts index 3aca821..73fdaf5 100644 --- a/packages/auth/src/procedures/base.ts +++ b/packages/auth/src/procedures/base.ts @@ -194,17 +194,13 @@ export class BaseProcedureFactory { ? await this.config.oauthAccounts.list(user.id) : []; if (providers.length > 0) { - const names = providers - .map((p) => (p === 'GOOGLE' ? 'Google' : 'Apple')) - .join(' or '); + const names = providers.map((p) => (p === 'GOOGLE' ? 'Google' : 'Apple')).join(' or '); throw new TRPCError({ code: 'FORBIDDEN', message: `This account uses ${names} sign-in. Please continue with ${names}.`, }); } - const hasPasskey = this.config.passkey - ? await this.config.passkey.has(user.id) - : false; + const hasPasskey = this.config.passkey ? await this.config.passkey.has(user.id) : false; throw new TRPCError({ code: 'FORBIDDEN', message: hasPasskey @@ -226,14 +222,11 @@ export class BaseProcedureFactory { // Push another device to approve instead of asking for a code. Falls // back to the typed-code flow when the hook is absent. if (this.config.hooks?.onLoginApprovalRequired) { - const pending = await this.config.hooks.onLoginApprovalRequired( - user.id, - { - ip: ctx.ip, - browserName: detectBrowser(userAgent), - input: typedInput, - } - ); + const pending = await this.config.hooks.onLoginApprovalRequired(user.id, { + ip: ctx.ip, + browserName: detectBrowser(userAgent), + input: typedInput, + }); if (pending) { return { success: false, @@ -321,7 +314,7 @@ export class BaseProcedureFactory { await this.config.hooks.onSessionRevoked( session.id, session.socketId, - 'User logged out', + 'User logged out' ); } catch { // Don't let a flaky hook abort the rest of the logout. @@ -377,7 +370,7 @@ export class BaseProcedureFactory { clientPayload, this.config.secrets.jwt, this.config.cookieSettings, - this.config.storageKeys, + this.config.storageKeys ); return { success: true }; @@ -471,33 +464,35 @@ export class BaseProcedureFactory { * already the factor, so no current-password prompt; changePassword (which is * current-password gated) covers the case where one already exists. */ private setPassword() { - return this.authProcedure - // .max(72): bcrypt silently truncates past 72 bytes, matching the other - // password schemas (signup/reset/change). - .input(z.object({ password: z.string().min(8).max(72) })) - .mutation(async ({ ctx, input }) => { - const { userId } = ctx; - const user = await this.config.database.user.findById(userId); - if (!user) { - throw new TRPCError({ code: 'NOT_FOUND', message: 'User not found' }); - } - if (user.password) { - throw new TRPCError({ - code: 'BAD_REQUEST', - message: 'This account already has a password. Use change password instead.', - }); - } + return ( + this.authProcedure + // .max(72): bcrypt silently truncates past 72 bytes, matching the other + // password schemas (signup/reset/change). + .input(z.object({ password: z.string().min(8).max(72) })) + .mutation(async ({ ctx, input }) => { + const { userId } = ctx; + const user = await this.config.database.user.findById(userId); + if (!user) { + throw new TRPCError({ code: 'NOT_FOUND', message: 'User not found' }); + } + if (user.password) { + throw new TRPCError({ + code: 'BAD_REQUEST', + message: 'This account already has a password. Use change password instead.', + }); + } - await this.config.database.user.update(userId, { - password: await hashPassword(input.password), - }); + await this.config.database.user.update(userId, { + password: await hashPassword(input.password), + }); - if (this.config.hooks?.onPasswordChanged) { - await this.config.hooks.onPasswordChanged(userId); - } + if (this.config.hooks?.onPasswordChanged) { + await this.config.hooks.onPasswordChanged(userId); + } - return { success: true }; - }); + return { success: true }; + }) + ); } /** @@ -629,11 +624,7 @@ export class BaseProcedureFactory { for (const session of sessionsToRevoke) { if (this.config.hooks?.onSessionRevoked) { - await this.config.hooks.onSessionRevoked( - session.id, - session.socketId, - 'Password reset' - ); + await this.config.hooks.onSessionRevoked(session.id, session.socketId, 'Password reset'); } } diff --git a/packages/auth/src/procedures/magicLink.ts b/packages/auth/src/procedures/magicLink.ts index fa99f1d..4264471 100644 --- a/packages/auth/src/procedures/magicLink.ts +++ b/packages/auth/src/procedures/magicLink.ts @@ -10,7 +10,7 @@ import { createSessionWithTokenAndCookie } from '../utilities/session'; export class MagicLinkProcedureFactory { constructor( private config: ResolvedAuthConfig, - private procedure: BaseProcedure, + private procedure: BaseProcedure ) {} createMagicLinkProcedures() { @@ -61,8 +61,7 @@ export class MagicLinkProcedureFactory { // Mark as used (single-use) await db.markUsed(magicLink.id); - const browserName = - (ctx.headers as Record)?.['user-agent'] ?? 'Unknown'; + const browserName = (ctx.headers as Record)?.['user-agent'] ?? 'Unknown'; // Let the host app inject extra session data (e.g., instanceId) const extraSessionData = this.config.hooks?.onBeforeMagicLinkSession @@ -77,7 +76,7 @@ export class MagicLinkProcedureFactory { socketId: null, extraSessionData, }, - ctx.res, + ctx.res ); return { success: true }; diff --git a/packages/auth/src/procedures/multiAccount.ts b/packages/auth/src/procedures/multiAccount.ts index e222d97..01b61fb 100644 --- a/packages/auth/src/procedures/multiAccount.ts +++ b/packages/auth/src/procedures/multiAccount.ts @@ -20,10 +20,7 @@ export class MultiAccountProcedureFactory { }; } - private async buildClientPayload( - userId: number, - updatedAt: Date - ): Promise { + private async buildClientPayload(userId: number, updatedAt: Date): Promise { const base: ClientCookiePayload = { userId, updatedAt: updatedAt.toISOString(), @@ -35,10 +32,10 @@ export class MultiAccountProcedureFactory { return base; } - private requireBundle(ctx: { - bundleSessionIds?: number[]; - sessionId: number | null; - }): { sessions: number[]; active: number } { + private requireBundle(ctx: { bundleSessionIds?: number[]; sessionId: number | null }): { + sessions: number[]; + active: number; + } { if (!ctx.bundleSessionIds || ctx.sessionId === null) { throw new TRPCError({ code: 'UNAUTHORIZED', @@ -100,10 +97,7 @@ export class MultiAccountProcedureFactory { expiresIn: this.config.tokenSettings.jwtExpiry, } ); - const clientPayload = await this.buildClientPayload( - target.userId, - target.user.updatedAt - ); + const clientPayload = await this.buildClientPayload(target.userId, target.user.updatedAt); setAuthCookies( ctx.res, newJwt, @@ -153,11 +147,7 @@ export class MultiAccountProcedureFactory { const remaining = sessions.filter((id) => id !== targetSessionId); if (remaining.length === 0) { - clearAuthCookies( - ctx.res, - this.config.cookieSettings, - this.config.storageKeys - ); + clearAuthCookies(ctx.res, this.config.cookieSettings, this.config.storageKeys); if (wasLive) { await this.config.database.user.update(target!.userId, { isActive: false }); if (this.config.hooks?.afterLogout) { @@ -166,7 +156,7 @@ export class MultiAccountProcedureFactory { target!.userId, target!.id, target!.socketId, - [], + [] ); } catch { // Don't let a flaky hook abort the removal. diff --git a/packages/auth/src/procedures/oauth.ts b/packages/auth/src/procedures/oauth.ts index 38f0142..04eec11 100644 --- a/packages/auth/src/procedures/oauth.ts +++ b/packages/auth/src/procedures/oauth.ts @@ -77,9 +77,7 @@ export class OAuthLoginProcedureFactory } private registerOptions() { - return this.procedure - .input(z.object({ username: z.string() })) - .mutation(async ({ input }) => { - const { webauthn, passkey } = this.checkConfig(); - - const options = await generateRegistrationOptions({ - rpName: webauthn.rpName, - rpID: webauthn.rpID, - userName: input.username, - attestationType: 'none', - excludeCredentials: [], - authenticatorSelection: { - // Neither is negotiable: sign-in passes an empty allowCredentials so - // a non-discoverable credential could never be offered back, and the - // UV gesture is what makes a sole-factor passkey two-factor. - residentKey: 'required', - userVerification: 'required', - }, - }); + return this.procedure.input(z.object({ username: z.string() })).mutation(async ({ input }) => { + const { webauthn, passkey } = this.checkConfig(); - const { flowId } = await passkey.storeChallenge({ - challenge: options.challenge, - type: 'REGISTER', - username: input.username, - expiresAt: new Date(Date.now() + CHALLENGE_TTL_MS), - }); + const options = await generateRegistrationOptions({ + rpName: webauthn.rpName, + rpID: webauthn.rpID, + userName: input.username, + attestationType: 'none', + excludeCredentials: [], + authenticatorSelection: { + // Neither is negotiable: sign-in passes an empty allowCredentials so + // a non-discoverable credential could never be offered back, and the + // UV gesture is what makes a sole-factor passkey two-factor. + residentKey: 'required', + userVerification: 'required', + }, + }); - return { flowId, options }; + const { flowId } = await passkey.storeChallenge({ + challenge: options.challenge, + type: 'REGISTER', + username: input.username, + expiresAt: new Date(Date.now() + CHALLENGE_TTL_MS), }); + + return { flowId, options }; + }); } private registerVerify(registerMeta: AnyZodObject) { @@ -400,7 +399,10 @@ export class PasskeyProcedureFactory const user = await this.config.database.user.findById(userId); if (!user) { - throw new TRPCError({ code: 'INTERNAL_SERVER_ERROR', message: 'User not found after passkey ceremony.' }); + throw new TRPCError({ + code: 'INTERNAL_SERVER_ERROR', + message: 'User not found after passkey ceremony.', + }); } if (await isUserInBundle(this.config, ctx.headers.cookie, user.id)) { diff --git a/packages/auth/src/procedures/twoFa/device.ts b/packages/auth/src/procedures/twoFa/device.ts index e75ac31..eaa0f41 100644 --- a/packages/auth/src/procedures/twoFa/device.ts +++ b/packages/auth/src/procedures/twoFa/device.ts @@ -126,8 +126,7 @@ export class DeviceTwoFaProcedureFactory { if (!user.password) { throw new TRPCError({ code: 'FORBIDDEN', - message: - 'Two-factor authentication is only available on accounts with a password.', + message: 'Two-factor authentication is only available on accounts with a password.', }); } @@ -258,28 +257,26 @@ export class DeviceTwoFaProcedureFactory { } private deregisterPushToken() { - return this.authProcedure - .input(deregisterPushTokenSchema) - .mutation(async ({ ctx, input }) => { - this.checkConfig(); - const { userId } = ctx; - const { pushToken } = input; + return this.authProcedure.input(deregisterPushTokenSchema).mutation(async ({ ctx, input }) => { + this.checkConfig(); + const { userId } = ctx; + const { pushToken } = input; - const device = await this.deviceAuth.device.findByUserAndToken(userId, pushToken); + const device = await this.deviceAuth.device.findByUserAndToken(userId, pushToken); - if (device) { - await this.deviceAuth.session.clearDeviceId(userId, device.id); + if (device) { + await this.deviceAuth.session.clearDeviceId(userId, device.id); - await this.deviceAuth.device.disconnectUser(device.id, userId); + await this.deviceAuth.device.disconnectUser(device.id, userId); - const hasUsers = await this.deviceAuth.device.hasRemainingUsers(device.id); + const hasUsers = await this.deviceAuth.device.hasRemainingUsers(device.id); - if (!hasUsers) { - await this.deviceAuth.device.delete(device.id); - } + if (!hasUsers) { + await this.deviceAuth.device.delete(device.id); } + } - return { deregistered: true }; - }); + return { deregistered: true }; + }); } } diff --git a/packages/auth/src/procedures/twoFa/shared.ts b/packages/auth/src/procedures/twoFa/shared.ts index 706aebf..321aba0 100644 --- a/packages/auth/src/procedures/twoFa/shared.ts +++ b/packages/auth/src/procedures/twoFa/shared.ts @@ -10,10 +10,7 @@ import { type BaseProcedure } from '../../types/trpc'; import type { ResolvedAuthConfig } from '../../utilities/config'; import { comparePassword } from '../../utilities/password'; import { generateOtp } from '../../utilities/totp'; -import { - twoFaResetSchema, - twoFaResetVerifySchema, -} from '../../validators/twoFa.shared'; +import { twoFaResetSchema, twoFaResetVerifySchema } from '../../validators/twoFa.shared'; import { isTwoFaEnabled } from './verifyChallenge'; /** @@ -67,8 +64,7 @@ export function buildTwoFaResetProcedures( if (!user.email) { throw new TRPCError({ code: 'BAD_REQUEST', - message: - 'This account has no email address. Add one in settings to reset 2FA by email.', + message: 'This account has no email address. Add one in settings to reset 2FA by email.', }); } @@ -84,35 +80,33 @@ export function buildTwoFaResetProcedures( return { success: true }; }); - const twoFaResetVerify = procedure - .input(twoFaResetVerifySchema) - .mutation(async ({ input }) => { - checkConfig(); - const { code, username } = input; + const twoFaResetVerify = procedure.input(twoFaResetVerifySchema).mutation(async ({ input }) => { + checkConfig(); + const { code, username } = input; - const user = await config.database.user.findByEmailOrUsernameInsensitive(username); + const user = await config.database.user.findByEmailOrUsernameInsensitive(username); - if (!user) { - throw new TRPCError({ code: 'NOT_FOUND', message: 'User not found' }); - } + if (!user) { + throw new TRPCError({ code: 'NOT_FOUND', message: 'User not found' }); + } - const otp = await config.database.otp.findValidByUserAndCode(user.id, code); + const otp = await config.database.otp.findValidByUserAndCode(user.id, code); - if (!otp) { - throw new TRPCError({ code: 'FORBIDDEN', message: 'Invalid or expired OTP' }); - } + if (!otp) { + throw new TRPCError({ code: 'FORBIDDEN', message: 'Invalid or expired OTP' }); + } - await config.database.otp.delete(otp.id); + await config.database.otp.delete(otp.id); - // Mode-specific teardown owns clearing material AND any enabled flag. - await clearOnVerify(user.id); + // Mode-specific teardown owns clearing material AND any enabled flag. + await clearOnVerify(user.id); - if (config.hooks?.onTwoFaStatusChanged) { - await config.hooks.onTwoFaStatusChanged(user.id, false); - } + if (config.hooks?.onTwoFaStatusChanged) { + await config.hooks.onTwoFaStatusChanged(user.id, false); + } - return { success: true, message: '2FA has been reset.' }; - }); + return { success: true, message: '2FA has been reset.' }; + }); return { twoFaReset, twoFaResetVerify }; } diff --git a/packages/auth/src/procedures/twoFa/standard.ts b/packages/auth/src/procedures/twoFa/standard.ts index 31a68ac..87a5902 100644 --- a/packages/auth/src/procedures/twoFa/standard.ts +++ b/packages/auth/src/procedures/twoFa/standard.ts @@ -138,8 +138,7 @@ export class StandardTwoFaProcedureFactory { if (!user.password) { throw new TRPCError({ code: 'FORBIDDEN', - message: - 'Two-factor authentication is only available on accounts with a password.', + message: 'Two-factor authentication is only available on accounts with a password.', }); } @@ -234,4 +233,3 @@ export class StandardTwoFaProcedureFactory { }); } } - diff --git a/packages/auth/src/router.ts b/packages/auth/src/router.ts index a93c819..0e1d725 100644 --- a/packages/auth/src/router.ts +++ b/packages/auth/src/router.ts @@ -9,10 +9,7 @@ import { MagicLinkProcedureFactory } from './procedures/magicLink'; import { MultiAccountProcedureFactory } from './procedures/multiAccount'; import { OAuthLoginProcedureFactory } from './procedures/oauth'; import { PasskeyProcedureFactory } from './procedures/passkey'; -import { - DeviceTwoFaProcedureFactory, - StandardTwoFaProcedureFactory, -} from './procedures/twoFa'; +import { DeviceTwoFaProcedureFactory, StandardTwoFaProcedureFactory } from './procedures/twoFa'; import type { AuthFeatures, TwoFaMode } from './types/config'; import type { SchemaExtensions } from './types/hooks'; import { type AuthProcedure, type BaseProcedure, type TrpcContext } from './types/trpc'; diff --git a/packages/auth/src/types.ts b/packages/auth/src/types.ts index 8cd1e0d..ddbe0ea 100644 --- a/packages/auth/src/types.ts +++ b/packages/auth/src/types.ts @@ -55,4 +55,3 @@ export interface ClientCookiePayload { updatedAt: string; // ISO timestamp [key: string]: unknown; } - diff --git a/packages/auth/src/types/config.ts b/packages/auth/src/types/config.ts index 98c992c..fd348c5 100644 --- a/packages/auth/src/types/config.ts +++ b/packages/auth/src/types/config.ts @@ -191,7 +191,9 @@ export interface AuthConfig { * Called on login, register, refresh, and when authGuard detects stale updatedAt. * Return value is merged into the client cookie payload alongside { userId, updatedAt }. */ - getClientCookiePayload?: (userId: number) => Record | Promise>; + getClientCookiePayload?: ( + userId: number + ) => Record | Promise>; /** * Schema extensions for adding custom fields to auth inputs diff --git a/packages/auth/src/types/hooks.ts b/packages/auth/src/types/hooks.ts index 3a5ede1..7dbe3ed 100644 --- a/packages/auth/src/types/hooks.ts +++ b/packages/auth/src/types/hooks.ts @@ -1,7 +1,8 @@ -import { type z, type AnyZodObject } from 'zod'; +import { type z } from 'zod'; import { type loginSchema, type oAuthLoginSchema, type signupSchema } from '../validators'; import type { PasskeyCredential } from './passkey'; +import type { AnyZodObject } from './zod'; /** * Schema extensions for adding custom fields to auth inputs @@ -106,17 +107,12 @@ export interface AuthHooks { * Called to get additional data for session creation * Return an object with extra fields to include in session.create */ - getSessionData?: ( - input: SessionSourceInput - ) => Promise>; + getSessionData?: (input: SessionSourceInput) => Promise>; /** * Called after a new session is created */ - onSessionCreated?: ( - sessionId: number, - input: SessionSourceInput - ) => Promise; + onSessionCreated?: (sessionId: number, input: SessionSourceInput) => Promise; /** * Called when a session is revoked @@ -128,7 +124,7 @@ export interface AuthHooks { userId: number, sessionId: number, socketId: string | null, - otherSessions?: Array<{ userId: number; sessionId: number; socketId: string | null }>, + otherSessions?: Array<{ userId: number; sessionId: number; socketId: string | null }> ) => Promise; /** @@ -160,7 +156,9 @@ export interface AuthHooks { * Called before creating a session from a magic link verification. * Return extra data to include in the session record (e.g., instanceId). */ - onBeforeMagicLinkSession?: (userId: number) => Record | Promise>; + onBeforeMagicLinkSession?: ( + userId: number + ) => Record | Promise>; /** * Custom validation for biometric verification diff --git a/packages/auth/src/types/zod.ts b/packages/auth/src/types/zod.ts new file mode 100644 index 0000000..f3666b9 --- /dev/null +++ b/packages/auth/src/types/zod.ts @@ -0,0 +1,10 @@ +import type { z } from 'zod'; + +/** + * Any object schema, whatever its shape. + * + * zod 3 exported this as `AnyZodObject`; zod 4 removed it, so we name the + * zod 4 equivalent here rather than repeating `z.ZodObject` + * at every use site. + */ +export type AnyZodObject = z.ZodObject; diff --git a/packages/auth/src/utilities/bundle.ts b/packages/auth/src/utilities/bundle.ts index 477569b..2154f5a 100644 --- a/packages/auth/src/utilities/bundle.ts +++ b/packages/auth/src/utilities/bundle.ts @@ -1,7 +1,7 @@ export function truncateBundle( sessions: number[], activeId: number, - maxAccounts: number, + maxAccounts: number ): { kept: number[]; dropped: number[] } { if (sessions.length <= maxAccounts) { return { kept: sessions, dropped: [] }; diff --git a/packages/auth/src/utilities/config.ts b/packages/auth/src/utilities/config.ts index be14a37..868eb8a 100644 --- a/packages/auth/src/utilities/config.ts +++ b/packages/auth/src/utilities/config.ts @@ -100,9 +100,7 @@ export function createAuthConfig(config: AuthConfig): ResolvedAuthConfig { ); } - const database = - config.database ?? - createPrismaAdapter(config.prisma); + const database = config.database ?? createPrismaAdapter(config.prisma); const emailService = config.emailService ?? createNoopEmailAdapter(); diff --git a/packages/auth/src/utilities/cookies.ts b/packages/auth/src/utilities/cookies.ts index f3de519..ab76e03 100644 --- a/packages/auth/src/utilities/cookies.ts +++ b/packages/auth/src/utilities/cookies.ts @@ -20,7 +20,7 @@ export function parseAuthCookie( cookieHeader: string | undefined, storageKeys: { authToken: string } = { authToken: DEFAULT_STORAGE_KEYS.AUTH_TOKEN, - }, + } ): { authToken?: string } { if (!cookieHeader) { return {}; @@ -37,7 +37,7 @@ export function parseAuthCookie( */ export function parseClientCookie( cookieHeader: string | undefined, - storageKeys: { clientToken?: string }, + storageKeys: { clientToken?: string } ): string | undefined { if (!cookieHeader || !storageKeys.clientToken) return undefined; const value = cookieHeader.split(`${storageKeys.clientToken}=`)[1]?.split(';')[0]; @@ -62,7 +62,7 @@ export function signClientCookie(payload: ClientCookiePayload, secret: string): */ export function parseClientCookiePayload( value: string, - secret: string, + secret: string ): ClientCookiePayload | null { const dotIndex = value.indexOf('.'); if (dotIndex === -1) return null; @@ -101,7 +101,7 @@ function buildCookieString( value: string, settings: Partial, domain: string | undefined, - expiresDate?: string, + expiresDate?: string ): string { return [ `${name}=${value}`, @@ -137,7 +137,7 @@ export function setAuthCookie( settings: Partial, storageKeys: { authToken: string } = { authToken: DEFAULT_STORAGE_KEYS.AUTH_TOKEN, - }, + } ): void { const expiresDate = settings.maxAge ? new Date(Date.now() + settings.maxAge * 1000).toUTCString() @@ -148,7 +148,7 @@ export function setAuthCookie( authToken, settings, settings.domain, - expiresDate, + expiresDate ); res.setHeader('Set-Cookie', cookie); } @@ -161,7 +161,7 @@ export function clearAuthCookie( settings: Partial, storageKeys: { authToken: string } = { authToken: DEFAULT_STORAGE_KEYS.AUTH_TOKEN, - }, + } ): void { const expiredDate = new Date(0).toUTCString(); @@ -170,7 +170,7 @@ export function clearAuthCookie( 'destroy', settings, settings.domain, - expiredDate, + expiredDate ); res.setHeader('Set-Cookie', cookie); } @@ -187,7 +187,7 @@ export function setAuthCookies( clientPayload: ClientCookiePayload, secret: string, settings: Partial, - storageKeys: { authToken: string; clientToken?: string }, + storageKeys: { authToken: string; clientToken?: string } ): void { const expiresDate = settings.maxAge ? new Date(Date.now() + settings.maxAge * 1000).toUTCString() @@ -199,7 +199,7 @@ export function setAuthCookies( authToken, settings, settings.domain, - expiresDate, + expiresDate ); if (!storageKeys.clientToken) { @@ -218,7 +218,7 @@ export function setAuthCookies( clientValue, clientSettings, clientCookieDomain(settings), - expiresDate, + expiresDate ); res.setHeader('Set-Cookie', [authCookie, clientCookie]); @@ -233,7 +233,7 @@ export function setClientCookie( clientPayload: ClientCookiePayload, secret: string, settings: Partial, - storageKeys: { clientToken: string }, + storageKeys: { clientToken: string } ): void { // Batched tRPC procedures run concurrently on one shared res. The check and // appendHeader below are synchronous and adjacent (no await between them), so @@ -242,7 +242,11 @@ export function setClientCookie( // overflowing the proxy's header buffer (502). const existing = res.getHeader('Set-Cookie'); const existingCookies = Array.isArray(existing) ? existing : existing ? [existing] : []; - if (existingCookies.some((c) => typeof c === 'string' && c.startsWith(`${storageKeys.clientToken}=`))) { + if ( + existingCookies.some( + (c) => typeof c === 'string' && c.startsWith(`${storageKeys.clientToken}=`) + ) + ) { return; } @@ -257,7 +261,7 @@ export function setClientCookie( clientValue, clientSettings, clientCookieDomain(settings), - expiresDate, + expiresDate ); res.appendHeader('Set-Cookie', clientCookie); @@ -269,7 +273,7 @@ export function setClientCookie( export function clearAuthCookies( res: CreateHTTPContextOptions['res'], settings: Partial, - storageKeys: { authToken: string; clientToken?: string }, + storageKeys: { authToken: string; clientToken?: string } ): void { const expiredDate = new Date(0).toUTCString(); @@ -278,7 +282,7 @@ export function clearAuthCookies( 'destroy', settings, settings.domain, - expiredDate, + expiredDate ); if (!storageKeys.clientToken) { @@ -296,7 +300,7 @@ export function clearAuthCookies( 'destroy', clientSettings, clientCookieDomain(settings), - expiredDate, + expiredDate ); res.setHeader('Set-Cookie', [authCookie, clientCookie]); diff --git a/packages/auth/src/utilities/index.ts b/packages/auth/src/utilities/index.ts index 4a961c3..eceb503 100644 --- a/packages/auth/src/utilities/index.ts +++ b/packages/auth/src/utilities/index.ts @@ -22,10 +22,7 @@ export { issueAuthCookies, isUserInBundle, revokeDeviceSessionsForUser } from '. export type { OAuthKeys, OAuthProvider, OAuthResult } from './oauth'; export { createOAuthVerifier, OAuthVerificationError } from './oauth'; export { comparePassword, hashPassword, validatePasswordStrength } from './password'; -export type { - CreateSessionWithTokenParams, - SessionWithTokenResult, -} from './session'; +export type { CreateSessionWithTokenParams, SessionWithTokenResult } from './session'; export { createSessionWithToken, createSessionWithTokenAndCookie } from './session'; export { cleanBase32String, diff --git a/packages/auth/src/utilities/issueCookies.ts b/packages/auth/src/utilities/issueCookies.ts index e125de0..5c59714 100644 --- a/packages/auth/src/utilities/issueCookies.ts +++ b/packages/auth/src/utilities/issueCookies.ts @@ -4,12 +4,7 @@ import type { CreateHTTPContextOptions } from '@trpc/server/adapters/standalone' import type { ClientCookiePayload } from '../types'; import type { ResolvedAuthConfig } from './config'; import { parseAuthCookie, setAuthCookies } from './cookies'; -import { - createAuthToken, - isTokenExpiredError, - isTokenInvalidError, - verifyAuthToken, -} from './jwt'; +import { createAuthToken, isTokenExpiredError, isTokenInvalidError, verifyAuthToken } from './jwt'; interface IssueCookiesParams { ctx: { headers: { cookie?: string }; res: CreateHTTPContextOptions['res'] }; diff --git a/packages/auth/src/utilities/jwt.ts b/packages/auth/src/utilities/jwt.ts index 479da07..ea48628 100644 --- a/packages/auth/src/utilities/jwt.ts +++ b/packages/auth/src/utilities/jwt.ts @@ -28,11 +28,10 @@ export function createAuthToken( payload: Omit & { sessions?: number[] }, options: CreateTokenOptions ): string { - return jwt.sign( - { ...payload, sessions: payload.sessions ?? [payload.id] }, - options.secret, - { algorithm: 'HS256', expiresIn: options.expiresIn } - ); + return jwt.sign({ ...payload, sessions: payload.sessions ?? [payload.id] }, options.secret, { + algorithm: 'HS256', + expiresIn: options.expiresIn, + }); } /** diff --git a/packages/auth/src/utilities/loginMethods.ts b/packages/auth/src/utilities/loginMethods.ts index d0652f9..f7d2976 100644 --- a/packages/auth/src/utilities/loginMethods.ts +++ b/packages/auth/src/utilities/loginMethods.ts @@ -6,9 +6,7 @@ import type { ResolvedAuthConfig } from './config'; // is never counted here. export type LoginMethodRemoval = - | { kind: 'oauth'; provider: 'GOOGLE' | 'APPLE' } - | { kind: 'passkey' } - | { kind: 'password' }; + { kind: 'oauth'; provider: 'GOOGLE' | 'APPLE' } | { kind: 'passkey' } | { kind: 'password' }; export interface LoginMethodCount { password: boolean; @@ -23,9 +21,7 @@ export async function countLoginMethods( ): Promise { const [user, passkeys, providers] = await Promise.all([ config.database.user.findById(userId), - config.passkey - ? config.passkey.list(userId).then((p) => p.length) - : Promise.resolve(0), + config.passkey ? config.passkey.list(userId).then((p) => p.length) : Promise.resolve(0), config.oauthAccounts ? config.oauthAccounts.list(userId) : Promise.resolve>([]), diff --git a/packages/auth/src/utilities/magicLink.ts b/packages/auth/src/utilities/magicLink.ts index 927d47a..a188366 100644 --- a/packages/auth/src/utilities/magicLink.ts +++ b/packages/auth/src/utilities/magicLink.ts @@ -21,7 +21,7 @@ export interface CreateMagicLinkResult { */ export async function createMagicLink( config: ResolvedAuthConfig, - params: CreateMagicLinkParams, + params: CreateMagicLinkParams ): Promise { if (!config.magicLink) { throw new Error('@factiii/auth: magicLink config is required to create magic links'); @@ -29,7 +29,7 @@ export async function createMagicLink( if (!config.database.magicLink) { throw new Error( - '@factiii/auth: database adapter does not support magicLink — add the MagicLink model to your schema', + '@factiii/auth: database adapter does not support magicLink — add the MagicLink model to your schema' ); } diff --git a/packages/auth/src/utilities/session.ts b/packages/auth/src/utilities/session.ts index 60c2dc3..219da08 100644 --- a/packages/auth/src/utilities/session.ts +++ b/packages/auth/src/utilities/session.ts @@ -42,7 +42,7 @@ export interface SessionWithTokenResult { */ export async function createSessionWithToken( config: ResolvedAuthConfig, - params: CreateSessionWithTokenParams, + params: CreateSessionWithTokenParams ): Promise { const { userId, browserName, socketId, deviceId, extraSessionData } = params; @@ -64,7 +64,7 @@ export async function createSessionWithToken( { secret: config.secrets.jwt, expiresIn: config.tokenSettings.jwtExpiry, - }, + } ); return { accessToken, sessionId: session.id }; @@ -84,14 +84,13 @@ export async function createSessionWithToken( export async function createSessionWithTokenAndCookie( config: ResolvedAuthConfig, params: CreateSessionWithTokenParams, - res: CreateHTTPContextOptions['res'], + res: CreateHTTPContextOptions['res'] ): Promise { const result = await createSessionWithToken(config, params); const user = await config.database.user.findById(params.userId); - const cookieHeader = - (res.req as { headers?: { cookie?: string } } | undefined)?.headers?.cookie; + const cookieHeader = (res.req as { headers?: { cookie?: string } } | undefined)?.headers?.cookie; await issueAuthCookies(config, { ctx: { headers: { cookie: cookieHeader }, res }, diff --git a/packages/auth/src/utilities/trpc.ts b/packages/auth/src/utilities/trpc.ts index f053ebb..45a4446 100644 --- a/packages/auth/src/utilities/trpc.ts +++ b/packages/auth/src/utilities/trpc.ts @@ -8,11 +8,13 @@ import { type Meta, type TrpcBuilder, type TrpcContext } from '../types/trpc'; import { type ResolvedAuthConfig } from './config'; /** Type guard for objects with a specific string property. */ -function hasStringProp( - obj: unknown, - key: K -): obj is Record { - return typeof obj === 'object' && obj !== null && key in obj && typeof (obj as Record)[key] === 'string'; +function hasStringProp(obj: unknown, key: K): obj is Record { + return ( + typeof obj === 'object' && + obj !== null && + key in obj && + typeof (obj as Record)[key] === 'string' + ); } /** diff --git a/packages/auth/src/validators.ts b/packages/auth/src/validators.ts index 66760d5..51296ce 100644 --- a/packages/auth/src/validators.ts +++ b/packages/auth/src/validators.ts @@ -1,6 +1,7 @@ -import { z, type AnyZodObject } from 'zod'; +import { z } from 'zod'; import type { UsernameMode } from './types/config'; +import type { AnyZodObject } from './types/zod'; import type { SchemaExtensions } from './types/hooks'; /** @@ -208,8 +209,7 @@ export function createSchemas( extensions?: TExtensions, usernameMode: UsernameMode = 'optional' ): CreatedSchemas { - const signupBase = - usernameMode === 'optional' ? signupSchemaOptionalUsername : signupSchema; + const signupBase = usernameMode === 'optional' ? signupSchemaOptionalUsername : signupSchema; return { signup: extensions?.signup ? signupBase.merge(extensions.signup) : signupBase, login: extensions?.login ? loginSchema.merge(extensions.login) : loginSchema, diff --git a/packages/stack/package.json b/packages/stack/package.json index 91dfd7a..566d221 100644 --- a/packages/stack/package.json +++ b/packages/stack/package.json @@ -41,29 +41,27 @@ "registry": "https://registry.npmjs.org" }, "dependencies": { - "@aws-sdk/client-ec2": "^3.750.0", - "@aws-sdk/client-ec2-instance-connect": "^3.1001.0", - "@aws-sdk/client-ecr": "^3.750.0", - "@aws-sdk/client-iam": "^3.750.0", - "@aws-sdk/client-rds": "^3.750.0", - "@aws-sdk/client-route-53": "^3.1001.0", - "@aws-sdk/client-s3": "^3.750.0", - "@aws-sdk/client-ses": "^3.750.0", - "@aws-sdk/client-sts": "^3.750.0", + "@aws-sdk/client-ec2": "^3.1127.0", + "@aws-sdk/client-ec2-instance-connect": "^3.1127.0", + "@aws-sdk/client-ecr": "^3.1127.0", + "@aws-sdk/client-iam": "^3.1127.0", + "@aws-sdk/client-rds": "^3.1127.0", + "@aws-sdk/client-route-53": "^3.1127.0", + "@aws-sdk/client-s3": "^3.1127.0", + "@aws-sdk/client-ses": "^3.1127.0", + "@aws-sdk/client-sts": "^3.1127.0", "@factiii/auth": "workspace:^", - "@octokit/rest": "^20.0.2", + "@octokit/rest": "^20.1.2", "ansible-vault": "^1.3.0", "commander": "^11.1.0", - "js-yaml": "^4.1.1", - "libsodium-wrappers": "^0.7.11" + "js-yaml": "^4.3.2" }, "devDependencies": { "@types/jest": "^30.0.0", "@types/js-yaml": "^4.0.9", - "@types/node": "^25.0.3", - "jest": "^29.7.0", - "ts-jest": "^29.4.6", - "ts-node": "^10.9.2", + "@types/node": "^25.9.5", + "jest": "^30.5.1", + "ts-jest": "^29.4.12", "typescript": "^5.9.3" }, "jest": { diff --git a/packages/stack/src/cli/deployer.ts b/packages/stack/src/cli/deployer.ts deleted file mode 100644 index 36451b8..0000000 --- a/packages/stack/src/cli/deployer.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * Deployer Module - * - * Handles the actual deployment logic - */ - -import { deploy } from './deploy.js'; -import type { FactiiiConfig, DeployOptions, DeployResult } from '../types/index.js'; - -export class Deployer { - private _config: FactiiiConfig; - - constructor(config: FactiiiConfig) { - this._config = config; - } - - async deployToEnvironment( - environment: string, - options: DeployOptions = {} - ): Promise { - return deploy(environment, options); - } -} - -export default Deployer; - diff --git a/packages/stack/src/cli/index.ts b/packages/stack/src/cli/index.ts deleted file mode 100644 index 9b3c2cc..0000000 --- a/packages/stack/src/cli/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * CLI Commands Index - * - * Re-exports all CLI command modules. - */ - -export { scan } from './scan.js'; -export { fix } from './fix.js'; -export { deploy } from './deploy.js'; -export { undeploy } from './undeploy.js'; -export { init } from './init.js'; -export { secrets } from './secrets.js'; -export { upgrade } from './upgrade.js'; -export { validate } from './validate.js'; -export { checkConfig } from './check-config.js'; -export { devSync } from './dev-sync.js'; -export { Deployer } from './deployer.js'; - diff --git a/packages/stack/src/plugins/interfaces/index.ts b/packages/stack/src/plugins/interfaces/index.ts deleted file mode 100644 index 1ff83c5..0000000 --- a/packages/stack/src/plugins/interfaces/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Plugin Interfaces Index - * - * Re-exports all plugin base classes. - */ - -export { PipelinePlugin } from './pipeline.js'; -export { ServerPlugin } from './server.js'; -export { FrameworkPlugin } from './framework.js'; -export { AddonPlugin } from './addon.js'; - diff --git a/packages/stack/src/plugins/pipelines/aws/configs/index.ts b/packages/stack/src/plugins/pipelines/aws/configs/index.ts deleted file mode 100644 index 4e0fedb..0000000 --- a/packages/stack/src/plugins/pipelines/aws/configs/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * AWS Configs Index - * - * Exports all available AWS configuration types. - * Configs are selected based on `config.aws.config` value in stack.yml. - * - * Available configs: - * - ec2: Basic EC2 instance - * - free-tier: Complete free tier bundle (EC2 + RDS + S3 + ECR) - */ - -export { default as ec2 } from './ec2.js'; -export { default as freeTier } from './free-tier.js'; -export type { AWSConfigDef } from './types.js'; - diff --git a/packages/stack/src/plugins/pipelines/aws/scanfix/aws-cli.ts b/packages/stack/src/plugins/pipelines/aws/scanfix/aws-cli.ts deleted file mode 100644 index 03546a8..0000000 --- a/packages/stack/src/plugins/pipelines/aws/scanfix/aws-cli.ts +++ /dev/null @@ -1,105 +0,0 @@ -/** - * AWS CLI fixes for AWS plugin - * - * AWS CLI is still needed for ECR Docker login (aws ecr get-login-password). - * All other AWS operations now use the AWS SDK. - */ - -import { execSync } from 'child_process'; -import type { FactiiiConfig, Fix } from '../../../../types/index.js'; - -/** - * Check if any environment uses AWS pipeline - */ -function hasAwsPipeline(config: FactiiiConfig): boolean { - if (config.aws) return true; - // eslint-disable-next-line @typescript-eslint/no-require-imports - const { extractEnvironments } = require('../../../../utils/config-helpers.js'); - const environments = extractEnvironments(config); - return Object.values(environments).some( - (e: unknown) => (e as { pipeline?: string; access_key_id?: string }).pipeline === 'aws' || - (e as { access_key_id?: string }).access_key_id - ); -} - -/** - * Check if AWS CLI is installed - */ -function isAwsCliInstalled(): boolean { - try { - execSync('aws --version', { stdio: 'pipe' }); - return true; - } catch { - return false; - } -} - -/** - * Auto-install AWS CLI based on platform - */ -function installAwsCli(): boolean { - const platform = process.platform; - - try { - if (platform === 'darwin') { - console.log(' Installing AWS CLI via Homebrew...'); - execSync('brew install awscli', { stdio: 'inherit' }); - return true; - } - - if (platform === 'linux') { - try { - execSync('which apt-get', { stdio: 'pipe' }); - console.log(' Installing AWS CLI via apt...'); - execSync('sudo apt-get update && sudo apt-get install -y awscli', { stdio: 'inherit' }); - return true; - } catch { - // Not apt-based, use AWS installer - } - - console.log(' Installing AWS CLI via official installer...'); - execSync( - 'curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "/tmp/awscliv2.zip"' + - ' && unzip -o /tmp/awscliv2.zip -d /tmp/aws-install' + - ' && sudo /tmp/aws-install/aws/install' + - ' && rm -rf /tmp/awscliv2.zip /tmp/aws-install', - { stdio: 'inherit' } - ); - return true; - } - - if (platform === 'win32') { - console.log(' Installing AWS CLI via winget...'); - execSync('winget install Amazon.AWSCLI', { stdio: 'inherit' }); - return true; - } - - console.log(' Unsupported platform: ' + platform); - return false; - } catch (e) { - console.log(' Failed to install AWS CLI: ' + (e instanceof Error ? e.message : String(e))); - return false; - } -} - -export const awsCliFixes: Fix[] = [ - { - id: 'aws-cli-not-installed-dev', - stage: 'dev', - severity: 'warning', - description: '🔧 AWS CLI not installed (needed for ECR Docker login)', - scan: async (config: FactiiiConfig, _rootDir: string): Promise => { - if (!hasAwsPipeline(config)) return false; - return !isAwsCliInstalled(); - }, - fix: async (_config: FactiiiConfig, _rootDir: string): Promise => { - return installAwsCli(); - }, - manualFix: [ - 'Install AWS CLI:', - ' macOS: brew install awscli', - ' Linux: sudo apt-get install awscli (or curl installer from AWS)', - ' Windows: winget install Amazon.AWSCLI', - ].join('\n'), - }, -]; diff --git a/packages/stack/src/utils/config-schema.ts b/packages/stack/src/utils/config-schema.ts deleted file mode 100644 index ebe3479..0000000 --- a/packages/stack/src/utils/config-schema.ts +++ /dev/null @@ -1,115 +0,0 @@ -/** - * Config Schema Validator - * - * Validates stack.yml against schema definitions for each version. - * Detects missing required fields, deprecated fields, and new optional fields. - */ - -import type { - FactiiiConfig, - ConfigVersionSchema, - SchemaValidationResult, -} from '../types/index.js'; -import { extractEnvironments } from './config-helpers.js'; - -export const CURRENT_VERSION = '0.1.0'; - -// Schema definition for config version 0.1.0 -export const SCHEMAS: Record = { - '0.1.0': { - // Environments are top-level keys, not nested - required: ['name', 'config_version'], - optional: [ - 'github_repo', - 'ssl_email', - 'pipeline', // Single pipeline name - 'prisma_schema', - 'prisma_version', - 'container_exclusions', - 'trusted_plugins', - ], - awsFields: { - // AWS fields are per-environment, not global - required: [], - optional: [], - }, - environmentFields: { - // Environment fields - required: ['server', 'domain'], - optional: [ - 'env_file', - 'ssh_user', - 'config', // AWS config type - 'access_key_id', // AWS credentials - 'region', // AWS region - 'plugins', // Plugin configs - ], - }, - }, -}; - -// Field descriptions for user-friendly messages -const FIELD_DESCRIPTIONS: Record = { - config_version: 'Config schema version', - pipeline: 'Pipeline plugin to use for deployments (e.g., factiii for GitHub Actions)', - 'environment.*.plugins': 'Plugin-specific configuration for this environment', - 'environment.*.ssh_user': 'SSH user for connecting to this environment', -}; - - -/** - * Validate config against schema - * @param config - Parsed stack.yml config - * @param targetVersion - Target schema version (defaults to current) - * @returns Validation result - */ -export function validateConfigSchema( - config: FactiiiConfig, - targetVersion: string = CURRENT_VERSION -): SchemaValidationResult { - const result: SchemaValidationResult = { - valid: true, - missing: [], - deprecated: [], - newOptional: [], - needsMigration: false, - configVersion: config.config_version ?? CURRENT_VERSION, - targetVersion, - }; - - // Get appropriate schema - const schema = SCHEMAS[targetVersion]; - if (!schema) { - result.valid = false, - result.error = `Unknown schema version: ${targetVersion}`; - return result; - } - - // Validate required top-level fields - schema.required.forEach((field) => { - if (!(field in config)) { - result.valid = false; - result.missing.push(field); - } - }); - - // Validate environment fields - // Environments are top-level keys - const environments = extractEnvironments(config); - - // Validate each environment - Object.keys(environments).forEach((envName) => { - const env = environments[envName]; - if (env && typeof env === 'object') { - schema.environmentFields.required.forEach((field) => { - if (!(field in env)) { - result.valid = false; - result.missing.push(`${envName}.${field}`); - } - }); - } - }); - - return result; -} - diff --git a/packages/stack/src/utils/config-validator.ts b/packages/stack/src/utils/config-validator.ts deleted file mode 100644 index 69b47b0..0000000 --- a/packages/stack/src/utils/config-validator.ts +++ /dev/null @@ -1,155 +0,0 @@ -/** - * Config Validator - * - * Validates stack.yml configuration and workflow sync. - */ - -import * as fs from 'fs'; -import * as path from 'path'; -import yaml from 'js-yaml'; - -import { getStackConfigPath } from '../constants/config-files.js'; -import type { FactiiiConfig, EnvironmentConfig } from '../types/index.js'; - -interface WorkflowConfig { - environments: Record>; - repoName: string | null; -} - -interface ValidationResult { - valid: boolean; - error?: string; - drift?: boolean; - message?: string; - needsGeneration?: boolean; - needsRegeneration?: boolean; - mismatches?: string[]; -} - -interface WorkflowJob { - steps?: WorkflowStep[]; -} - -interface WorkflowStep { - run?: string; -} - -interface Workflow { - jobs?: { - deploy?: WorkflowJob; - }; -} - -/** - * Extract config values from workflow file - */ -export function extractWorkflowConfig(workflowPath: string): WorkflowConfig | null { - if (!fs.existsSync(workflowPath)) { - return null; - } - - try { - const content = fs.readFileSync(workflowPath, 'utf8'); - const workflow = yaml.load(content) as Workflow | null; - - // Extract relevant config from workflow - // Look for yq commands that read from stack.yml - const config: WorkflowConfig = { - environments: {}, - repoName: null, - }; - - // Parse the workflow to find config reads - // This is a simplified version - you may need to adjust based on actual workflow structure - const jobSteps = workflow?.jobs?.deploy?.steps ?? []; - - for (const step of jobSteps) { - if (step.run && step.run.includes('yq eval')) { - // Extract what config values the workflow expects - // e.g., "yq eval '.staging.host'" - const hostMatch = step.run.match(/\.(\w+)\.host/); - if (hostMatch && hostMatch[1]) { - const envName = hostMatch[1]; - // Skip reserved config keys - if (!['name', 'config_version', 'github_repo', 'ssl_email', 'pipeline', 'prisma_schema', 'prisma_version', 'container_exclusions', 'trusted_plugins'].includes(envName)) { - if (!config.environments[envName]) { - config.environments[envName] = {}; - } - } - } - } - } - - return config; - } catch { - return null; - } -} - -/** - * Compare stack.yml with generated workflows - */ -export function validateConfigSync(rootDir: string): ValidationResult { - const configPath = getStackConfigPath(rootDir); - const workflowPath = path.join(rootDir, '.github/workflows/stack-deploy.yml'); - - if (!fs.existsSync(configPath)) { - return { valid: false, error: 'stack.yml not found' }; - } - - if (!fs.existsSync(workflowPath)) { - return { valid: false, error: 'Workflows not generated', needsGeneration: true }; - } - - try { - const config = yaml.load(fs.readFileSync(configPath, 'utf8')) as FactiiiConfig; - - // Check if workflow file is older than config file - const configStat = fs.statSync(configPath); - const workflowStat = fs.statSync(workflowPath); - - const configNewer = configStat.mtimeMs > workflowStat.mtimeMs; - - if (configNewer) { - return { - valid: false, - drift: true, - message: 'Config modified after workflows were generated', - needsRegeneration: true, - }; - } - - // Additional validation: check if workflow references match config - const workflowContent = fs.readFileSync(workflowPath, 'utf8'); - const mismatches: string[] = []; - - // Extract environments from config (top-level keys) - const { extractEnvironments } = require('./config-helpers.js'); - const environments = extractEnvironments(config); - - // Check if all environments in config have corresponding workflow logic - for (const envName of Object.keys(environments)) { - // Check if workflow mentions this environment - if (!workflowContent.includes(`environment == '${envName}'`)) { - mismatches.push(`Environment '${envName}' not found in workflow`); - } - } - - if (mismatches.length > 0) { - return { - valid: false, - drift: true, - mismatches, - needsRegeneration: true, - }; - } - - return { valid: true }; - } catch (error) { - return { - valid: false, - error: error instanceof Error ? error.message : String(error), - }; - } -} - diff --git a/packages/stack/src/utils/deployment-report.ts b/packages/stack/src/utils/deployment-report.ts deleted file mode 100644 index 26d94eb..0000000 --- a/packages/stack/src/utils/deployment-report.ts +++ /dev/null @@ -1,330 +0,0 @@ -/** - * Deployment Report Generator - * - * Generates formatted deployment readiness reports. - */ - -interface RepoConfig { - environments?: Record; -} - -interface CurrentRepoInfo { - deployed: boolean; - config?: RepoConfig; - comparison?: { - hasChanges: boolean; - changes: Array<{ field: string; old: string; new: string }>; - }; -} - -interface DeployedRepo { - name: string; - domain: string; - port?: number | string; -} - -interface ServerCheck { - environment: string; - user?: string; - host?: string; - error?: string; - connected?: boolean; - infrastructureExists?: boolean; - allDeployedRepos?: DeployedRepo[]; - currentRepo?: CurrentRepoInfo; -} - -interface LocalChecks { - coreYml?: boolean; - dockerfile?: boolean; - git?: boolean; - branch?: string; - workflows?: boolean; - scripts?: boolean; -} - -interface SecretsCheck { - error?: string; - present?: string[]; - missing?: string[]; -} - -interface Summary { - ready: boolean; - warnings: number; - errors: number; - nextSteps: string[]; -} - -interface ReportData { - repoName: string; - localChecks?: LocalChecks; - secretsCheck?: SecretsCheck; - serverChecks?: ServerCheck[]; - summary?: Summary; -} - -interface AuditResults { - coreYml: { - exists: boolean; - parseError?: boolean; - needsCustomization?: boolean; - }; - workflows: { - allExist: boolean; - }; - branches: { - hasGit: boolean; - currentBranch?: string; - }; - repoScripts: { - hasPackageJson: boolean; - requiredScripts: Record; - }; -} - -/** - * Format deployment readiness report - */ -export function formatDeploymentReport(data: ReportData): string { - const { repoName, localChecks, secretsCheck, serverChecks, summary } = data; - - const lines: string[] = []; - const separator = '━'.repeat(60); - - // Header - lines.push(`DEPLOYMENT READINESS REPORT - ${repoName}`); - lines.push(separator); - lines.push(''); - - // Local Configuration - if (localChecks) { - lines.push('LOCAL CONFIGURATION'); - if (localChecks.coreYml) { - lines.push(` [OK] stack.yml valid (${repoName})`); - } - if (localChecks.dockerfile) { - lines.push(' [OK] Dockerfile found'); - } - if (localChecks.git) { - lines.push( - ` [OK] Git configured${localChecks.branch ? ` (${localChecks.branch} branch)` : ''}` - ); - } - if (localChecks.workflows) { - lines.push(' [OK] Workflows exist (factiii-deploy.yml, factiii-undeploy.yml)'); - } - if (localChecks.scripts) { - lines.push(' [OK] Required scripts present'); - } - lines.push(''); - } - - // GitHub Secrets - if (secretsCheck) { - lines.push('GITHUB SECRETS'); - - if (secretsCheck.error) { - lines.push(` [ERROR] ${secretsCheck.error}`); - lines.push(' Cannot verify secrets via API'); - } else { - // Show present secrets - if (secretsCheck.present && secretsCheck.present.length > 0) { - for (const secret of secretsCheck.present) { - lines.push(` [OK] ${secret} exists`); - } - } - - // Show missing secrets - if (secretsCheck.missing && secretsCheck.missing.length > 0) { - for (const secret of secretsCheck.missing) { - lines.push(` [!] ${secret} not found`); - } - } - } - lines.push(''); - } - - // Server Checks - if (serverChecks && serverChecks.length > 0) { - for (const server of serverChecks) { - const envLabel = server.environment === 'staging' ? 'STAGING' : 'PRODUCTION'; - const envName = server.environment.toUpperCase(); - - lines.push(`${envLabel} SERVER (${server.user}@${server.host})`); - - if (server.error) { - lines.push(` [ERROR] ${server.error}`); - } else if (!server.connected) { - lines.push(' [ERROR] SSH connection failed'); - } else { - lines.push(' [OK] SSH connection successful'); - - if (server.infrastructureExists) { - lines.push(' [OK] Infrastructure directory exists'); - } else { - lines.push(' [!] Infrastructure directory not found'); - } - - // Show currently deployed repos - if (server.allDeployedRepos && server.allDeployedRepos.length > 0) { - lines.push(''); - lines.push(` Currently Deployed Repos (${server.allDeployedRepos.length}):`); - for (const repo of server.allDeployedRepos) { - const portInfo = repo.port ? `:${repo.port}` : ''; - lines.push(` - ${repo.name} (${repo.domain}${portInfo}) - running`); - } - } - - // Show current repo status - lines.push(''); - lines.push(` THIS REPO (${repoName}):`); - - if (server.currentRepo && server.currentRepo.deployed) { - const env = server.currentRepo.config?.environments?.[server.environment]; - if (env) { - const currentPort = env.port ?? 'auto'; - lines.push(` Current: ${env.domain}:${currentPort}`); - - // Show changes if any - if ( - server.currentRepo.comparison && - server.currentRepo.comparison.hasChanges - ) { - lines.push(` Changes detected:`); - for (const change of server.currentRepo.comparison.changes) { - lines.push(` -> ${change.field}: ${change.old} -> ${change.new}`); - } - } else { - lines.push(` Status: No changes detected`); - } - } - } else { - lines.push(' Status: NOT DEPLOYED'); - lines.push(' After: NEW deployment'); - } - - lines.push(''); - lines.push(' Note: Deploy will regenerate configs and restart ALL services'); - } - - lines.push(''); - } - } - - // Summary - lines.push(separator); - - if (summary) { - const { ready, warnings, errors } = summary; - - if (ready && warnings === 0 && errors === 0) { - lines.push('[OK] READY TO DEPLOY'); - } else if (errors > 0) { - lines.push( - `[ERROR] NOT READY (${errors} error${errors > 1 ? 's' : ''}, ${warnings} warning${warnings > 1 ? 's' : ''})` - ); - } else if (warnings > 0) { - lines.push(`[!] READY TO DEPLOY (${warnings} warning${warnings > 1 ? 's' : ''})`); - } - } - - lines.push(''); - - // Next Steps - if (summary && summary.nextSteps && summary.nextSteps.length > 0) { - lines.push('Next Steps:'); - for (let i = 0; i < summary.nextSteps.length; i++) { - lines.push(` ${i + 1}. ${summary.nextSteps[i]}`); - } - lines.push(''); - } - - return lines.join('\n'); -} - -/** - * Format report for GitHub workflow summary (supports markdown) - */ -export function formatWorkflowSummary(data: ReportData): string { - const report = formatDeploymentReport(data); - - // Workflow summaries support markdown, so we can enhance it - return `\`\`\` -${report} -\`\`\``; -} - -/** - * Generate summary statistics from check results - */ -export function generateSummary( - _localChecks: LocalChecks | undefined, - secretsCheck: SecretsCheck | undefined, - serverChecks: ServerCheck[] | undefined -): Summary { - const summary: Summary = { - ready: true, - warnings: 0, - errors: 0, - nextSteps: [], - }; - - // Check for missing secrets - if (secretsCheck) { - if (secretsCheck.error) { - summary.errors++; - summary.ready = false; - summary.nextSteps.push('Fix GitHub token permissions to verify secrets'); - } else if (secretsCheck.missing && secretsCheck.missing.length > 0) { - summary.warnings += secretsCheck.missing.length; - for (const secret of secretsCheck.missing) { - summary.nextSteps.push(`Add missing GitHub secret: ${secret}`); - } - } - } - - // Check server connection issues - if (serverChecks) { - for (const server of serverChecks) { - if (server.error || !server.connected) { - summary.errors++; - summary.ready = false; - summary.nextSteps.push(`Fix SSH connection to ${server.environment} server`); - } - } - } - - // If ready, add deployment instructions - if (summary.ready && summary.warnings === 0) { - summary.nextSteps.push('Run: npx stack deploy --environment staging'); - summary.nextSteps.push('Or push to main branch to trigger automatic deployment'); - } else if (summary.ready && summary.warnings > 0) { - summary.nextSteps.push('Review warnings above'); - summary.nextSteps.push('Run: npx stack deploy (deployment will proceed with warnings)'); - } else { - summary.nextSteps.push('Fix errors above'); - summary.nextSteps.push('Run: npx stack (to verify fixes)'); - } - - return summary; -} - -/** - * Format local check results - */ -export function formatLocalChecks(auditResults: AuditResults): LocalChecks { - const { coreYml, workflows, branches, repoScripts } = auditResults; - - return { - coreYml: coreYml.exists && !coreYml.parseError && !coreYml.needsCustomization, - dockerfile: true, // Checked separately in scan - git: branches.hasGit, - branch: branches.currentBranch, - workflows: workflows.allExist, - scripts: - repoScripts.hasPackageJson && - Object.values(repoScripts.requiredScripts).every((v) => v), - }; -} - diff --git a/packages/stack/src/utils/dns-validator.ts b/packages/stack/src/utils/dns-validator.ts deleted file mode 100644 index 3db0c3f..0000000 --- a/packages/stack/src/utils/dns-validator.ts +++ /dev/null @@ -1,67 +0,0 @@ -/** - * DNS Validator - * - * Utilities for validating and resolving hostnames. - */ - -import * as dns from 'dns'; - -const dnsPromises = dns.promises; - -/** - * Check if a hostname is resolvable - */ -export async function isHostnameResolvable(hostname: string): Promise { - try { - await dnsPromises.lookup(hostname); - return true; - } catch { - return false; - } -} - -/** - * Generate common hostname variations to check - * e.g., "staging-api.domain.com" -> ["api-staging.domain.com", "staging.api.domain.com"] - */ -export function generateHostnameVariations(hostname: string): string[] { - const parts = hostname.split('.'); - if (parts.length < 3) return []; - - const subdomain = parts[0]; - const domain = parts.slice(1).join('.'); - - if (!subdomain) return []; - - const variations: string[] = []; - - // Check for hyphenated subdomains - if (subdomain.includes('-')) { - const subParts = subdomain.split('-'); - // Reverse order: "staging-api" -> "api-staging" - const reversed = [...subParts].reverse(); - variations.push(`${reversed.join('-')}.${domain}`); - // Dot notation: "staging-api" -> "staging.api" - variations.push(`${subParts.join('.')}.${domain}`); - } - - return variations; -} - -/** - * Find a resolvable alternative hostname - */ -export async function findResolvableAlternative( - hostname: string -): Promise { - const variations = generateHostnameVariations(hostname); - - for (const variation of variations) { - if (await isHostnameResolvable(variation)) { - return variation; - } - } - - return null; -} - diff --git a/packages/stack/src/utils/github-workflow-monitor.ts b/packages/stack/src/utils/github-workflow-monitor.ts deleted file mode 100644 index e630e29..0000000 --- a/packages/stack/src/utils/github-workflow-monitor.ts +++ /dev/null @@ -1,191 +0,0 @@ -/** - * GitHub Workflow Monitor - * - * Utility for triggering GitHub Actions workflows and monitoring their progress. - * Uses GitHub CLI (gh) for authentication and API access. - */ - -import { execSync, spawn } from 'child_process'; - -interface WorkflowRunStatus { - status: string; - conclusion: string; - url: string; -} - -interface TriggerAndWatchResult { - success: boolean; - url?: string; - runId?: number; - error?: string; -} - -interface StreamLogsResult { - success: boolean; - exitCode?: number; -} - -class GitHubWorkflowMonitor { - constructor() { - this.checkGhCli(); - } - - /** - * Check if GitHub CLI is installed and authenticated - */ - private checkGhCli(): void { - try { - execSync(process.platform === 'win32' ? 'where gh' : 'which gh', { stdio: 'pipe' }); - - // Check if authenticated - const authStatus = execSync('gh auth status', { - stdio: 'pipe', - encoding: 'utf8', - }); - - if (!authStatus.includes('Logged in')) { - throw new Error('GitHub CLI not authenticated. Run: gh auth login'); - } - } catch { - throw new Error('GitHub CLI not available. Install with: ' + (process.platform === 'win32' ? 'winget install GitHub.cli' : 'brew install gh')); - } - } - - /** - * Trigger a workflow and return the run ID - * - * @param workflowFile - The workflow file name (e.g., 'factiii-scan-staging.yml') - * @param environment - Optional environment name (only used for workflows that accept inputs) - */ - async triggerWorkflow(workflowFile: string, environment?: string): Promise { - try { - console.log(`Triggering GitHub Actions workflow...`); - - // Build command - add environment input for workflows that accept it - let command = `gh workflow run "${workflowFile}"`; - - // Add environment input for workflows that accept it (deploy, fix, scan) - if (environment && (workflowFile.includes('deploy') || workflowFile.includes('fix') || workflowFile.includes('scan'))) { - command += ` -f environment="${environment}"`; - } - - // Trigger the workflow - execSync(command, { - encoding: 'utf8', - stdio: 'pipe', - }); - - // Wait a moment for the run to be created - await new Promise((resolve) => setTimeout(resolve, 2000)); - - // Get the latest run ID for this workflow - const runs = execSync( - `gh run list --workflow="${workflowFile}" --limit=1 --json databaseId,status,conclusion`, - { encoding: 'utf8', stdio: 'pipe' } - ); - - const runData = JSON.parse(runs) as Array<{ databaseId: number }>; - if (runData.length === 0) { - throw new Error('Failed to find triggered workflow run'); - } - - const firstRun = runData[0]; - if (!firstRun) { - throw new Error('Failed to find triggered workflow run'); - } - - return firstRun.databaseId; - } catch (error) { - throw new Error( - `Failed to trigger workflow: ${error instanceof Error ? error.message : String(error)}` - ); - } - } - - /** - * Stream logs from a workflow run - */ - async streamLogs(runId: number): Promise { - return new Promise((resolve, reject) => { - console.log(`Monitoring deployment progress...\n`); - - // Use gh run watch to stream logs - const watch = spawn('gh', ['run', 'watch', runId.toString()], { - stdio: 'inherit', - }); - - watch.on('close', (code) => { - if (code === 0) { - resolve({ success: true }); - } else { - resolve({ success: false, exitCode: code ?? undefined }); - } - }); - - watch.on('error', (error) => { - reject(new Error(`Failed to watch workflow: ${error.message}`)); - }); - }); - } - - /** - * Get the status of a workflow run - */ - async getRunStatus(runId: number): Promise { - try { - const result = execSync(`gh run view ${runId} --json status,conclusion,url`, { - encoding: 'utf8', - stdio: 'pipe', - }); - - return JSON.parse(result) as WorkflowRunStatus; - } catch (error) { - throw new Error( - `Failed to get run status: ${error instanceof Error ? error.message : String(error)}` - ); - } - } - - /** - * Trigger a workflow and wait for completion with live logs - */ - async triggerAndWatch( - workflowFile: string, - environment?: string - ): Promise { - try { - // Trigger the workflow - const runId = await this.triggerWorkflow(workflowFile, environment); - - // Stream logs (just for display - gh run watch exits 0 regardless of workflow result) - await this.streamLogs(runId); - - // Get final status - THIS determines actual success based on workflow conclusion - const status = await this.getRunStatus(runId); - const isSuccess = status.conclusion === 'success'; - - console.log(''); - if (isSuccess) { - console.log(`[OK] Deployment successful!`); - } else { - console.log(`[ERROR] Deployment failed! (${status.conclusion})`); - } - console.log(` View full logs: ${status.url}`); - - return { - success: isSuccess, - url: status.url, - runId, - }; - } catch (error) { - console.error(`\n[ERROR] ${error instanceof Error ? error.message : String(error)}`); - return { - success: false, - error: error instanceof Error ? error.message : String(error), - }; - } - } -} - -export default GitHubWorkflowMonitor; - diff --git a/packages/stack/src/utils/index.ts b/packages/stack/src/utils/index.ts deleted file mode 100644 index 01a05cc..0000000 --- a/packages/stack/src/utils/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Utilities Index - * - * Re-exports all utility modules. - */ - -export * from './ssh-helper.js'; -export * from './config-schema.js'; -export * from './env-validator.js'; -export * from './dns-validator.js'; -export * from './ansible-vault-secrets.js'; -// Re-export version-check without conflicting compareVersions -export { - getFactiiiVersion, - parseVersion, - isCompatible, - isBreakingUpgrade, - readFactiiiAutoVersion, - checkVersionCompatibility, - displayVersionWarning, -} from './version-check.js'; -export * from './template-generator.js'; -export * from './secret-prompts.js'; -export * from './server-check.js'; -export * from './config-validator.js'; -export * from './deployment-report.js'; -export { default as GitHubWorkflowMonitor } from './github-workflow-monitor.js'; -// ssl-cert-helper moved to src/scanfix/ssl-cert-helper.ts - diff --git a/packages/stack/src/utils/interactive-prompts.ts b/packages/stack/src/utils/interactive-prompts.ts deleted file mode 100644 index ffdb81f..0000000 --- a/packages/stack/src/utils/interactive-prompts.ts +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Interactive Prompts Utilities - * - * Helper functions for prompting users for input interactively. - */ - -import * as readline from 'readline'; - -/** - * Prompt user for a secret value - * Returns the secret value (not masked in terminal - use with caution) - */ -export async function promptForSecret( - secretName: string, - description?: string -): Promise { - const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout, - }); - - const label = description ? description + ' (' + secretName + ')' : secretName; - - return new Promise((resolve) => { - rl.question(' Enter ' + label + ': ', (answer: string) => { - rl.close(); - resolve(answer.trim()); - }); - }); -} - -/** - * Prompt user for confirmation (y/n) - */ -export async function promptForConfirmation( - message: string, - defaultValue = false -): Promise { - const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout, - }); - - const suffix = defaultValue ? ' [Y/n]: ' : ' [y/N]: '; - - return new Promise((resolve) => { - rl.question(message + suffix, (answer: string) => { - rl.close(); - const normalized = answer.trim().toLowerCase(); - - if (normalized === '') { - resolve(defaultValue); - } else { - resolve(normalized === 'y' || normalized === 'yes'); - } - }); - }); -} - -/** - * Prompt user for a string value - */ -export async function promptForString( - label: string, - defaultValue?: string -): Promise { - const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout, - }); - - const suffix = defaultValue ? ' [' + defaultValue + ']: ' : ': '; - - return new Promise((resolve) => { - rl.question(label + suffix, (answer: string) => { - rl.close(); - const value = answer.trim(); - resolve(value || defaultValue || ''); - }); - }); -} diff --git a/packages/stack/src/utils/server-check.ts b/packages/stack/src/utils/server-check.ts deleted file mode 100644 index 7444cf4..0000000 --- a/packages/stack/src/utils/server-check.ts +++ /dev/null @@ -1,498 +0,0 @@ -/** - * Server Check Utilities - * - * Utilities for checking server connectivity and software. - */ - -import { execSync, spawnSync } from 'child_process'; -import * as fs from 'fs'; -import { writeSecureKeyFile } from './ssh-helper.js'; - -import type { - FactiiiConfig, - EnvironmentConfig, - SSHResult, - ServerSoftwareChecks, - ServerEnvironment, - ConnectivityResult, - RepoCheckResult, - ConfigValidationResult, - ServerScanResult, - ServerBasicsResult, - InstallDependenciesResult, - DependencyInstallResult, -} from '../types/index.js'; - -/** - * SSH to server and run a command, return output - */ -function sshCommand( - sshKey: string, - user: string, - host: string, - command: string -): SSHResult { - const keyPath = (process.platform === 'win32' ? require('os').tmpdir() : '/tmp') + '/factiii-check-key'; - try { - writeSecureKeyFile(keyPath, sshKey); - - const sshResult = spawnSync('ssh', [ - '-i', keyPath, - '-o', 'StrictHostKeyChecking=no', - '-o', 'ConnectTimeout=10', - user + '@' + host, - command, - ], { encoding: 'utf8', stdio: 'pipe' }); - if (sshResult.status !== 0) throw new Error(sshResult.stderr || 'SSH failed'); - const result = sshResult.stdout; - - fs.unlinkSync(keyPath); - return { success: true, output: result.trim() }; - } catch (error) { - try { - fs.unlinkSync(keyPath); - } catch { - // Ignore cleanup errors - } - return { - success: false, - error: error instanceof Error ? error.message : String(error), - }; - } -} - -/** - * Check if server is accessible and get basic info - */ -export async function checkServerConnectivity( - envConfig: EnvironmentConfig, - sshKey: string -): Promise { - const host = envConfig.domain; - const ssh_user = envConfig.ssh_user ?? 'ubuntu'; - - if (!host) { - return { ssh: false, error: 'No host configured' }; - } - - if (!sshKey) { - return { ssh: false, error: 'No SSH key available' }; - } - - const result = sshCommand(sshKey, ssh_user, host, 'echo "connected"'); - return { ssh: result.success, error: result.error }; -} - -/** - * Check if required software is installed on server - */ -export async function checkServerSoftware( - envConfig: EnvironmentConfig, - sshKey: string -): Promise { - const host = envConfig.domain; - const ssh_user = envConfig.ssh_user ?? 'ubuntu'; - - const checks: ServerSoftwareChecks = { - git: false, - docker: false, - dockerCompose: false, - node: false, - }; - - // Check git - const gitResult = sshCommand(sshKey, ssh_user, host, 'which git'); - checks.git = gitResult.success; - - // Check docker - const dockerResult = sshCommand(sshKey, ssh_user, host, 'which docker'); - checks.docker = dockerResult.success; - - // Check docker compose - const composeResult = sshCommand(sshKey, ssh_user, host, 'docker compose version'); - checks.dockerCompose = composeResult.success; - - // Check node - const nodeResult = sshCommand(sshKey, ssh_user, host, 'which node'); - checks.node = nodeResult.success; - - return checks; -} - -/** - * Check if repo exists on server and get current branch - */ -export async function checkServerRepo( - envConfig: EnvironmentConfig, - sshKey: string, - repoName: string -): Promise { - const host = envConfig.domain; - const ssh_user = envConfig.ssh_user ?? 'ubuntu'; - - const repoPath = `~/.factiii/${repoName}`; - - // Check if directory exists - const existsResult = sshCommand( - sshKey, - ssh_user, - host, - `test -d ${repoPath} && echo "exists"` - ); - - if (!existsResult.success || !existsResult.output?.includes('exists')) { - return { exists: false }; - } - - // Get current branch - const branchResult = sshCommand( - sshKey, - ssh_user, - host, - `cd ${repoPath} && git branch --show-current` - ); - - return { - exists: true, - branch: branchResult.success ? branchResult.output : 'unknown', - }; -} - -/** - * Validate deployed configs match source - */ -export async function validateDeployedConfigs( - envConfig: EnvironmentConfig, - sshKey: string, - localConfig: FactiiiConfig -): Promise { - const host = envConfig.domain; - const ssh_user = envConfig.ssh_user ?? 'ubuntu'; - - const validation: ConfigValidationResult = { - expectedServices: 0, - actualServices: 0, - nginxMatches: null, - dockerComposeUpToDate: null, - }; - - try { - // Count expected services from local config - // This would need to scan all repos' configs, for now just count from current repo - if (localConfig.environments) { - for (const _envName of Object.keys(localConfig.environments)) { - // Each environment creates one service per repo - validation.expectedServices++; - } - } - - // Count actual running containers - const psResult = sshCommand( - sshKey, - ssh_user, - host, - 'cd ~/.factiii && docker compose ps --format json 2>/dev/null | wc -l' - ); - - if (psResult.success && psResult.output) { - validation.actualServices = parseInt(psResult.output) || 0; - } - - // Check if docker-compose.yml exists - const composeExists = sshCommand( - sshKey, - ssh_user, - host, - 'test -f ~/.factiii/docker-compose.yml && echo "exists"' - ); - validation.dockerComposeUpToDate = - composeExists.success && (composeExists.output?.includes('exists') ?? false); - - // Check nginx.conf - const nginxExists = sshCommand( - sshKey, - ssh_user, - host, - 'test -f ~/.factiii/nginx.conf && echo "exists"' - ); - validation.nginxMatches = - nginxExists.success && (nginxExists.output?.includes('exists') ?? false); - } catch { - // Validation failed, return what we have - } - - return validation; -} - -/** - * Comprehensive server scan - */ -export async function scanServerAndValidateConfigs( - envName: string, - envConfig: EnvironmentConfig, - config: FactiiiConfig, - sshKey: string -): Promise { - const check: ServerScanResult = { - environment: envName, - ssh: false, - git: false, - docker: false, - dockerCompose: false, - node: false, - repo: false, - branch: null, - repoName: config.name, - configValidation: null, - }; - - // Check connectivity - const connectivity = await checkServerConnectivity(envConfig, sshKey); - check.ssh = connectivity.ssh; - - if (!check.ssh) { - check.error = connectivity.error; - return check; - } - - // Check software - const software = await checkServerSoftware(envConfig, sshKey); - check.git = software.git; - check.docker = software.docker; - check.dockerCompose = software.dockerCompose; - check.node = software.node; - - // Check repo - const repo = await checkServerRepo(envConfig, sshKey, config.name); - check.repo = repo.exists; - check.branch = repo.branch ?? null; - - // Validate configs if repo exists - if (repo.exists) { - check.configValidation = await validateDeployedConfigs(envConfig, sshKey, config); - } - - return check; -} - -/** - * Detect package manager and OS on server - */ -export async function detectServerEnvironment( - envConfig: EnvironmentConfig, - sshKey: string -): Promise { - const host = envConfig.domain; - const ssh_user = envConfig.ssh_user ?? 'ubuntu'; - - const env: ServerEnvironment = { - os: 'unknown', - packageManager: null, - hasHomebrew: false, - hasApt: false, - hasYum: false, - hasDnf: false, - hasChoco: false, - hasApk: false, - }; - - // Check OS - const osResult = sshCommand(sshKey, ssh_user, host, 'uname -s'); - if (osResult.success && osResult.output) { - const os = osResult.output.toLowerCase(); - if (os.includes('darwin')) env.os = 'mac'; - else if (os.includes('linux')) env.os = 'ubuntu'; // Default Linux to ubuntu - } - - // Check package managers - const brewResult = sshCommand(sshKey, ssh_user, host, 'which brew'); - env.hasHomebrew = brewResult.success; - - const aptResult = sshCommand(sshKey, ssh_user, host, 'which apt-get'); - env.hasApt = aptResult.success; - - const yumResult = sshCommand(sshKey, ssh_user, host, 'which yum'); - env.hasYum = yumResult.success; - - const dnfResult = sshCommand(sshKey, ssh_user, host, 'which dnf'); - env.hasDnf = dnfResult.success; - - // Determine primary package manager - if (env.hasHomebrew) env.packageManager = 'brew'; - else if (env.hasApt) env.packageManager = 'apt'; - else if (env.hasDnf) env.packageManager = 'dnf'; - else if (env.hasYum) env.packageManager = 'dnf'; // yum is symlinked to dnf on modern systems - - return env; -} - -interface InstallOptions { - autoConfirm?: boolean; -} - -/** - * Install missing dependencies on server - */ -export async function installServerDependencies( - envConfig: EnvironmentConfig, - sshKey: string, - _options: InstallOptions = {} -): Promise { - const host = envConfig.domain; - const ssh_user = envConfig.ssh_user ?? 'ubuntu'; - - const results: { - node: DependencyInstallResult; - git: DependencyInstallResult; - docker: DependencyInstallResult; - pnpm: DependencyInstallResult; - } = { - node: { needed: false, installed: false, error: null }, - git: { needed: false, installed: false, error: null }, - docker: { needed: false, installed: false, error: null }, - pnpm: { needed: false, installed: false, error: null }, - }; - - // Check what's missing - const software = await checkServerSoftware(envConfig, sshKey); - results.node.needed = !software.node; - results.git.needed = !software.git; - results.docker.needed = !software.docker; - - // Detect server environment - const serverEnv = await detectServerEnvironment(envConfig, sshKey); - - if (!serverEnv.packageManager) { - return { - success: false, - error: 'No supported package manager found (brew, apt, or yum)', - results, - }; - } - - // Install Node.js if needed - if (results.node.needed) { - console.log(` Installing Node.js using ${serverEnv.packageManager}...`); - - let installCmd: string; - if (serverEnv.packageManager === 'brew') { - installCmd = 'brew install node'; - } else if (serverEnv.packageManager === 'apt') { - // Use NodeSource for latest Node.js on Ubuntu/Debian - installCmd = - 'curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - && sudo apt-get install -y nodejs'; - } else { - installCmd = - 'curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash - && sudo yum install -y nodejs'; - } - - const nodeResult = sshCommand(sshKey, ssh_user, host, installCmd); - results.node.installed = nodeResult.success; - results.node.error = nodeResult.error ?? null; - - if (nodeResult.success) { - console.log(' [OK] Node.js installed successfully'); - } else { - console.log(` [ERROR] Failed to install Node.js: ${nodeResult.error}`); - } - } - - // Install git if needed - if (results.git.needed) { - console.log(` Installing git using ${serverEnv.packageManager}...`); - - let installCmd: string; - if (serverEnv.packageManager === 'brew') { - installCmd = 'brew install git'; - } else if (serverEnv.packageManager === 'apt') { - installCmd = 'sudo apt-get update && sudo apt-get install -y git'; - } else { - installCmd = 'sudo yum install -y git'; - } - - const gitResult = sshCommand(sshKey, ssh_user, host, installCmd); - results.git.installed = gitResult.success; - results.git.error = gitResult.error ?? null; - - if (gitResult.success) { - console.log(' [OK] git installed successfully'); - } else { - console.log(` [ERROR] Failed to install git: ${gitResult.error}`); - } - } - - // Install Docker if needed (more complex, provide instructions) - if (results.docker.needed) { - console.log(' [!] Docker not found'); - console.log(' Docker installation requires manual setup.'); - console.log(` Please SSH to server and install Docker:`); - console.log(` ssh ${ssh_user}@${host}`); - if (serverEnv.os === 'mac') { - console.log(' brew install --cask docker'); - } else { - console.log(' curl -fsSL https://get.docker.com | sh'); - console.log(' sudo usermod -aG docker $USER'); - } - } - - // Install pnpm if Node.js is available - if (software.node || results.node.installed) { - const pnpmResult = sshCommand(sshKey, ssh_user, host, 'which pnpm'); - if (!pnpmResult.success) { - console.log(' Installing pnpm...'); - const installPnpm = sshCommand(sshKey, ssh_user, host, 'npm install -g pnpm@9'); - results.pnpm.needed = true; - results.pnpm.installed = installPnpm.success; - - if (installPnpm.success) { - console.log(' [OK] pnpm installed successfully'); - } else { - console.log(` [ERROR] Failed to install pnpm: ${installPnpm.error}`); - } - } - } - - return { - success: true, - serverEnv, - results, - }; -} - -/** - * Setup server basics (clone repo, install software if possible) - */ -export async function setupServerBasics( - envConfig: EnvironmentConfig, - config: FactiiiConfig, - sshKey: string -): Promise { - const repoName = config.name; - - const result: ServerBasicsResult = { - gitInstalled: false, - dockerInstalled: false, - repoCloned: false, - repoExists: false, - configMismatch: false, - }; - - // Check software - const software = await checkServerSoftware(envConfig, sshKey); - result.gitInstalled = software.git; - result.dockerInstalled = software.docker; - - // Check if repo exists - const repo = await checkServerRepo(envConfig, sshKey, repoName); - result.repoExists = repo.exists; - - // Try to clone repo if it doesn't exist and git is installed - if (!repo.exists && software.git) { - // We can't clone without knowing the repo URL - // This would need to be passed in or read from git config - // For now, just report that it needs to be cloned - } - - return result; -} - diff --git a/packages/stack/src/utils/template-generator.ts b/packages/stack/src/utils/template-generator.ts deleted file mode 100644 index 7030eb9..0000000 --- a/packages/stack/src/utils/template-generator.ts +++ /dev/null @@ -1,223 +0,0 @@ -/** - * Template Generator - * - * Generates template files for environment configuration. - */ - -import * as fs from 'fs'; -import * as path from 'path'; - -import { parseEnvFile } from './env-validator.js'; -import type { FactiiiConfig } from '../types/index.js'; - -interface EnvVars { - [key: string]: string; -} - -interface TemplateCreationError { - file: string; - error: string; -} - -interface TemplateCreationResult { - created: string[]; - skipped: string[]; - errors: TemplateCreationError[]; -} - -/** - * Generate .env.example template file content - * @param config - Parsed stack.yml configuration - */ -export function generateEnvExampleTemplate(config: FactiiiConfig): string { - const repoName = config.name ?? 'myapp'; - - const template = `# .env.example - Environment variable template -# This file defines all required environment variables across environments. -# Values are descriptive examples - replace with real values in .env.staging and .env.prod -# This file is committed to git as a template. - -# === Application Settings === -NODE_ENV=development -# Slot number (1-5). Client=3000+PORT, Server=5000+PORT -# Example: PORT=1 → client:3001, server:5001 -PORT=1 - -# === Database === -# PostgreSQL connection string format -DATABASE_URL=postgresql://EXAMPLE_user:EXAMPLE_password@localhost:5432/EXAMPLE_${repoName}-dev - -# === Authentication === -# 256-bit secret key for JWT signing -JWT_SECRET=EXAMPLE_your-256-bit-secret-key-here -JWT_EXPIRES_IN=7d - -# === External APIs (if needed) === -# OPENAI_API_KEY=EXAMPLE_sk-proj-abc123xyz789 -# STRIPE_SECRET_KEY=EXAMPLE_sk_test_51ABC123xyz -# STRIPE_PUBLISHABLE_KEY=EXAMPLE_pk_test_51ABC123xyz - -# === AWS Configuration (if using S3, SES, etc) === -# AWS_ACCESS_KEY_ID=EXAMPLE_AKIAIOSFODNN7EXAMPLE -# AWS_SECRET_ACCESS_KEY=EXAMPLE_wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY -# AWS_REGION=EXAMPLE_us-east-1 -# AWS_BUCKET_NAME=EXAMPLE_${repoName}-assets - -# === Email Configuration (if using SMTP) === -# SMTP_HOST=EXAMPLE_smtp.gmail.com -# SMTP_PORT=587 -# SMTP_USER=EXAMPLE_noreply@yourdomain.com -# SMTP_PASSWORD=EXAMPLE_your-app-password - -# === Application URLs === -# Replace YOUR_IP with your local network IP (start.sh does this automatically) -# FRONTEND_URL=http://YOUR_IP:3001 -# API_URL=http://YOUR_IP:5001 - -# === Application-specific settings === -# Add your custom environment variables below -`; - - return template; -} - -/** - * Generate .env template file content for staging/prod - * Copies structure from .env.example with placeholder values - * @param environment - 'staging' or 'prod' - * @param devEnv - Parsed .env.example key-value pairs - */ -export function generateEnvTemplate(environment: string, devEnv: EnvVars): string { - const envUpper = environment.toUpperCase(); - - let template = `# .env.${environment} - ${envUpper} environment variables -# Fill in all values below. Keys must match .env.example -# This file should ${environment === 'prod' ? 'ALWAYS' : 'optionally'} be in .gitignore - -`; - - // Copy keys from .env.example with placeholder values - for (const key of Object.keys(devEnv)) { - const devValue = devEnv[key]; - - // If dev value is not an example, use it as a guide - if (devValue && !devValue.includes('EXAMPLE')) { - template += `${key}=${devValue}\n`; - } else { - // Use placeholder - template += `${key}=\n`; - } - } - - template += ` -# Instructions: -# 1. Replace all values with real ${environment} values -# 2. Ensure all keys match .env.example -# 3. Run: npx stack (to validate) -`; - - return template; -} - -/** - * Create .env template files if they don't exist - * @param rootDir - Repository root directory - * @param config - Parsed stack.yml configuration - */ -export function createEnvTemplates( - rootDir: string, - config: FactiiiConfig -): TemplateCreationResult { - const result: TemplateCreationResult = { - created: [], - skipped: [], - errors: [], - }; - - // Create .env.example first (template) - const devPath = path.join(rootDir, '.env.example'); - try { - if (fs.existsSync(devPath)) { - result.skipped.push('.env.example'); - } else { - const devTemplate = generateEnvExampleTemplate(config); - fs.writeFileSync(devPath, devTemplate, 'utf8'); - result.created.push('.env.example'); - } - } catch (error) { - result.errors.push({ - file: '.env.example', - error: error instanceof Error ? error.message : String(error), - }); - // Can't create staging/prod without example template - return result; - } - - // Parse .env.example to use as template for staging/prod - const devEnv = parseEnvFile(devPath); - - if (!devEnv) { - result.errors.push({ - file: 'staging/prod', - error: 'Could not parse .env.example to generate templates', - }); - return result; - } - - // Create staging and prod templates based on example - const environments = ['staging', 'prod']; - - for (const env of environments) { - const filename = `.env.${env}`; - const filepath = path.join(rootDir, filename); - - try { - // Check if file already exists - if (fs.existsSync(filepath)) { - result.skipped.push(filename); - continue; - } - - // Generate and write template based on .env.example - const template = generateEnvTemplate(env, devEnv); - fs.writeFileSync(filepath, template, 'utf8'); - result.created.push(filename); - } catch (error) { - result.errors.push({ - file: filename, - error: error instanceof Error ? error.message : String(error), - }); - } - } - - return result; -} - -/** - * Generate secrets checklist for display - */ -export function generateSecretsChecklist(): string { - return ` - REQUIRED GitHub Secrets (minimal): - ─────────────────────────────────────────────────────── - □ STAGING_SSH - SSH private key for staging - □ PROD_SSH - SSH private key for production - □ AWS_SECRET_ACCESS_KEY - AWS secret key (only secret AWS value) - - OPTIONAL GitHub Secrets: - ─────────────────────────────────────────────────────── - □ STAGING_ENVS - Environment vars from .env.staging - □ PROD_ENVS - Environment vars from .env.prod - - NOT SECRETS (in stack.yml): - ─────────────────────────────────────────────────────── - ✓ environments.{env}.host - Server IP/hostname - ✓ aws.access_key_id - AWS access key ID - ✓ aws.region - AWS region (e.g., us-east-1) - - NOT SECRETS (in factiiiAuto.yml): - ─────────────────────────────────────────────────────── - ✓ ssh_user - Defaults to ubuntu -`.trim(); -} - diff --git a/packages/stack/test/__mocks__/ssh.js b/packages/stack/test/__mocks__/ssh.js deleted file mode 100644 index b17f1ca..0000000 --- a/packages/stack/test/__mocks__/ssh.js +++ /dev/null @@ -1,131 +0,0 @@ -/** - * Mock SSH operations for testing CLI commands that require SSH access - * This allows testing deploy/remove/check-config without real servers - */ - -const { execSync } = require('child_process'); -const fs = require('fs'); -const path = require('path'); - -// Mock file system on remote server -const mockRemoteFs = { - configs: {}, - envFiles: {}, - directories: new Set(['~/infrastructure', '~/infrastructure/configs', '~/infrastructure/scripts/generators', '~/infrastructure/nginx']) -}; - -// Helper to normalize paths -function normalizePath(p) { - return p.replace(/^~/, '').replace(/\/+/g, '/'); -} - -// Mock execSync for SSH commands -const originalExecSync = execSync; -const mockExecSync = (command, options) => { - const cmd = command.toString(); - - // Handle SSH commands - if (cmd.includes('ssh -i')) { - // Extract the actual command after the SSH connection - const match = cmd.match(/"([^"]+)"/); - if (!match) return Buffer.from(''); - - const remoteCmd = match[1]; - - // Handle mkdir - if (remoteCmd.includes('mkdir -p')) { - const dirs = remoteCmd.replace('mkdir -p', '').trim().split(' '); - dirs.forEach(dir => mockRemoteFs.directories.add(normalizePath(dir))); - return Buffer.from(''); - } - - // Handle ls (list config files) - if (remoteCmd.includes('ls -1') && remoteCmd.includes('configs')) { - const files = Object.keys(mockRemoteFs.configs); - return Buffer.from(files.map(f => `~/infrastructure/configs/${f}`).join('\n')); - } - - // Handle cat (read config file) - if (remoteCmd.startsWith('cat ') && remoteCmd.includes('configs/')) { - const filePath = remoteCmd.replace('cat ', '').trim(); - const fileName = path.basename(filePath); - if (mockRemoteFs.configs[fileName]) { - return Buffer.from(mockRemoteFs.configs[fileName]); - } - throw new Error(`File not found: ${filePath}`); - } - - // Handle test -f (check if file exists) - if (remoteCmd.includes('test -f')) { - const filePath = remoteCmd.match(/test -f (.+?) &&/)?.[1]; - if (!filePath) return Buffer.from('no'); - const fileName = path.basename(filePath); - return Buffer.from(mockRemoteFs.envFiles[fileName] ? 'yes' : 'no'); - } - - // Handle chmod - if (remoteCmd.startsWith('chmod')) { - return Buffer.from(''); - } - - // Handle docker compose commands - if (remoteCmd.includes('docker compose')) { - return Buffer.from('Services checked'); - } - - // Handle cd and script execution - if (remoteCmd.includes('cd ~/infrastructure') || remoteCmd.includes('INFRA_DIR')) { - // Mock script execution - just return success - return Buffer.from(''); - } - - return Buffer.from(''); - } - - // Handle SCP commands - if (cmd.includes('scp -i')) { - // Extract source and destination - const parts = cmd.split(' '); - const srcIndex = parts.findIndex(p => p.includes('generators') || p.includes('.sh') || p.includes('.yml') || p.includes('.env')); - const destIndex = parts.findIndex((p, i) => i > srcIndex && p.includes('@')); - - if (srcIndex !== -1 && destIndex !== -1) { - const src = parts[srcIndex]; - const dest = parts[destIndex + 1]; - - // If copying a config file, store it in mock filesystem - if (src.endsWith('.yml') || src.endsWith('.yaml')) { - const fileName = path.basename(src); - if (fs.existsSync(src)) { - mockRemoteFs.configs[fileName] = fs.readFileSync(src, 'utf8'); - } - } - - // If copying env file - if (src.includes('.env') || dest.includes('.env')) { - const fileName = path.basename(dest); - if (fs.existsSync(src)) { - mockRemoteFs.envFiles[fileName] = fs.readFileSync(src, 'utf8'); - } - } - } - - return Buffer.from(''); - } - - // Fallback to original execSync for non-SSH commands - return originalExecSync(command, options); -}; - -// Export mock utilities -module.exports = { - mockExecSync, - mockRemoteFs, - resetMockFs: () => { - mockRemoteFs.configs = {}; - mockRemoteFs.envFiles = {}; - mockRemoteFs.directories = new Set(['~/infrastructure', '~/infrastructure/configs', '~/infrastructure/scripts/generators', '~/infrastructure/nginx']); - } -}; - - diff --git a/packages/stack/test/cli.test.js b/packages/stack/test/cli.test.js deleted file mode 100644 index b5c45ae..0000000 --- a/packages/stack/test/cli.test.js +++ /dev/null @@ -1,366 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const scan = require('../src/cli/scan'); -const fix = require('../src/cli/fix'); -const generateWorkflows = require('../src/cli/generate-workflows'); - -// Legacy commands - may not exist -let validate; -try { - validate = require('../src/cli/validate'); -} catch (e) { - // Legacy command not available -} - -describe('CLI Command Tests', () => { - const testDir = path.join(__dirname, 'temp-cli-test'); - const originalCwd = process.cwd(); - const originalExit = process.exit; - const originalConsoleLog = console.log; - const originalConsoleError = console.error; - - let consoleOutput = []; - let exitCode = null; - - beforeEach(() => { - // Create test directory - if (!fs.existsSync(testDir)) { - fs.mkdirSync(testDir, { recursive: true }); - } - process.chdir(testDir); - - // Mock console.log and console.error - consoleOutput = []; - console.log = (...args) => consoleOutput.push(['log', ...args]); - console.error = (...args) => consoleOutput.push(['error', ...args]); - - // Mock process.exit - exitCode = null; - process.exit = (code) => { - exitCode = code; - throw new Error(`process.exit(${code})`); - }; - }); - - afterEach(() => { - // Restore mocks - console.log = originalConsoleLog; - console.error = originalConsoleError; - process.exit = originalExit; - process.chdir(originalCwd); - - // Clean up test directory - if (fs.existsSync(testDir)) { - fs.rmSync(testDir, { recursive: true, force: true }); - } - }); - - describe('scan command', () => { - test('scans and reports no issues when properly configured', async () => { - // Create a minimal valid config - const yaml = require('js-yaml'); - fs.writeFileSync(path.join(testDir, 'stack.yml'), yaml.dump({ - name: 'test-repo', - environments: { - staging: { - domain: 'staging.test.com', - host: '192.168.1.100' - } - } - })); - - // Create necessary env files - fs.writeFileSync(path.join(testDir, '.env.example'), 'DATABASE_URL=test\n'); - fs.writeFileSync(path.join(testDir, '.env'), 'DATABASE_URL=test\n'); - fs.writeFileSync(path.join(testDir, '.env.staging'), 'DATABASE_URL=test\n'); - fs.writeFileSync(path.join(testDir, '.env.prod'), 'DATABASE_URL=test\n'); - - const problems = await scan({ rootDir: testDir, dev: true }); - - expect(problems).toHaveProperty('dev'); - expect(Array.isArray(problems.dev)).toBe(true); - }); - - test('detects missing stack.yml', async () => { - const problems = await scan({ rootDir: testDir, dev: true }); - - // Should detect missing config (stack.yml) - expect(problems.dev.some(p => p.id === 'missing-stack-yml')).toBe(true); - }); - - test('returns problems grouped by stage', async () => { - const problems = await scan({ rootDir: testDir }); - - expect(problems).toHaveProperty('dev'); - expect(problems).toHaveProperty('secrets'); - expect(problems).toHaveProperty('staging'); - expect(problems).toHaveProperty('prod'); - }); - - test('respects stage filters', async () => { - const devProblems = await scan({ rootDir: testDir, dev: true }); - - // When filtering to dev only, other stages should be empty - expect(devProblems.secrets).toHaveLength(0); - expect(devProblems.staging).toHaveLength(0); - expect(devProblems.prod).toHaveLength(0); - }); - }); - - describe('fix command', () => { - test('runs scan then applies fixes', async () => { - // Create minimal setup - fs.writeFileSync(path.join(testDir, '.env.example'), 'TEST=value\n'); - - const results = await fix({ rootDir: testDir, dev: true }); - - expect(results).toHaveProperty('fixed'); - expect(results).toHaveProperty('manual'); - expect(results).toHaveProperty('failed'); - }); - - test('creates .env from .env.example', async () => { - // Create .env.example but not .env - fs.writeFileSync(path.join(testDir, '.env.example'), 'DATABASE_URL=test\n'); - fs.writeFileSync(path.join(testDir, 'package.json'), JSON.stringify({ - dependencies: { prisma: '5.0.0' } - })); - - await fix({ rootDir: testDir, dev: true }); - - // .env should be created from .env.example - expect(fs.existsSync(path.join(testDir, '.env'))).toBe(true); - }); - - test('respects stage filters', async () => { - const results = await fix({ rootDir: testDir, dev: true }); - - // Should only fix dev stage issues - expect(typeof results.fixed).toBe('number'); - }); - }); - - describe('generate-workflows command', () => { - test('generates workflow files in default directory', () => { - const workflowsDir = path.join(testDir, '.github', 'workflows'); - const expectedFiles = [ - 'stack-deploy.yml', - 'stack-undeploy.yml', - 'stack-cicd-staging.yml', - 'stack-cicd-prod.yml' - ]; - - generateWorkflows({}); - - expect(fs.existsSync(workflowsDir)).toBe(true); - expectedFiles.forEach(file => { - const filePath = path.join(workflowsDir, file); - expect(fs.existsSync(filePath)).toBe(true); - }); - }); - - test('generates workflow files in custom directory', () => { - const customDir = path.join(testDir, 'custom-workflows'); - const expectedFiles = [ - 'stack-deploy.yml', - 'stack-undeploy.yml', - 'stack-cicd-staging.yml', - 'stack-cicd-prod.yml' - ]; - - generateWorkflows({ output: 'custom-workflows' }); - - expect(fs.existsSync(customDir)).toBe(true); - expectedFiles.forEach(file => { - const filePath = path.join(customDir, file); - expect(fs.existsSync(filePath)).toBe(true); - }); - }); - - test('outputs success messages', () => { - generateWorkflows({}); - - expect(consoleOutput.some(o => o[1]?.includes('Generating GitHub workflows'))).toBe(true); - expect(consoleOutput.some(o => o[1]?.includes('Workflow generation complete'))).toBe(true); - }); - }); - - // Legacy validate tests - only run if validate exists - if (validate) { - describe('validate command (legacy)', () => { - test('validates a correct config file', () => { - const configPath = path.join(testDir, 'stack.yml'); - const validConfig = { - name: 'test-repo', - environments: { - staging: { - domain: 'staging.test.com' - } - }, - ssl_email: 'test@example.com', - ecr_registry: '123456789.dkr.ecr.us-east-1.amazonaws.com', - ecr_repository: 'apps' - }; - - const yaml = require('js-yaml'); - fs.writeFileSync(configPath, yaml.dump(validConfig)); - - validate({ config: 'stack.yml' }); - - expect(consoleOutput.some(o => o[1]?.includes('Configuration is valid'))).toBe(true); - expect(exitCode).toBeNull(); - }); - - test('fails on missing name field', () => { - const configPath = path.join(testDir, 'stack.yml'); - const invalidConfig = { - environments: { - staging: { - domain: 'staging.test.com' - } - } - }; - - const yaml = require('js-yaml'); - fs.writeFileSync(configPath, yaml.dump(invalidConfig)); - - try { - validate({ config: 'stack.yml' }); - fail('Should have exited'); - } catch (error) { - expect(exitCode).toBe(1); - expect(consoleOutput.some(o => o[1]?.includes('Missing required field: name'))).toBe(true); - } - }); - }); - } -}); - -describe('Plugin Architecture Tests', () => { - const testDir = path.join(__dirname, 'temp-plugin-test'); - - beforeEach(() => { - if (!fs.existsSync(testDir)) { - fs.mkdirSync(testDir, { recursive: true }); - } - }); - - afterEach(() => { - if (fs.existsSync(testDir)) { - fs.rmSync(testDir, { recursive: true, force: true }); - } - }); - - describe('Plugin Loading', () => { - test('loads pipeline plugins', () => { - const { getPluginsByCategory } = require('../src/plugins'); - const pipelines = getPluginsByCategory('pipelines'); - - expect(pipelines).toBeDefined(); - expect(pipelines['factiii']).toBeDefined(); - }); - - test('loads server plugins', () => { - const { getPluginsByCategory } = require('../src/plugins'); - const servers = getPluginsByCategory('servers'); - - expect(servers).toBeDefined(); - expect(servers['mac-mini']).toBeDefined(); - expect(servers['aws']).toBeDefined(); - }); - - test('loads framework plugins', () => { - const { getPluginsByCategory } = require('../src/plugins'); - const frameworks = getPluginsByCategory('frameworks'); - - expect(frameworks).toBeDefined(); - expect(frameworks['prisma-trpc']).toBeDefined(); - }); - }); - - describe('Plugin Structure', () => { - test('pipeline plugin has required static properties', () => { - const FactiiiPipeline = require('../src/plugins/pipelines/factiii'); - - expect(FactiiiPipeline.id).toBe('factiii'); - expect(FactiiiPipeline.category).toBe('pipeline'); - expect(Array.isArray(FactiiiPipeline.fixes)).toBe(true); - }); - - test('server plugin has required static properties', () => { - const MacMiniPlugin = require('../src/plugins/servers/mac-mini'); - - expect(MacMiniPlugin.id).toBe('mac-mini'); - expect(MacMiniPlugin.category).toBe('server'); - expect(Array.isArray(MacMiniPlugin.fixes)).toBe(true); - }); - - test('framework plugin has required static properties', () => { - const PrismaTrpcPlugin = require('../src/plugins/frameworks/prisma-trpc'); - - expect(PrismaTrpcPlugin.id).toBe('prisma-trpc'); - expect(PrismaTrpcPlugin.category).toBe('framework'); - expect(Array.isArray(PrismaTrpcPlugin.fixes)).toBe(true); - expect(Array.isArray(PrismaTrpcPlugin.requiredEnvVars)).toBe(true); - }); - }); - - describe('Fix Structure', () => { - test('pipeline plugin fixes have correct structure', () => { - const FactiiiPipeline = require('../src/plugins/pipelines/factiii'); - - for (const fix of FactiiiPipeline.fixes) { - expect(fix.id).toBeDefined(); - expect(['dev', 'secrets', 'staging', 'prod']).toContain(fix.stage); - expect(['critical', 'warning', 'info']).toContain(fix.severity); - expect(fix.description).toBeDefined(); - expect(typeof fix.scan).toBe('function'); - expect(fix.manualFix).toBeDefined(); - } - }); - - test('server plugin fixes have correct structure', () => { - const MacMiniPlugin = require('../src/plugins/servers/mac-mini'); - - for (const fix of MacMiniPlugin.fixes) { - expect(fix.id).toBeDefined(); - expect(['dev', 'secrets', 'staging', 'prod']).toContain(fix.stage); - expect(['critical', 'warning', 'info']).toContain(fix.severity); - expect(fix.description).toBeDefined(); - expect(typeof fix.scan).toBe('function'); - expect(fix.manualFix).toBeDefined(); - } - }); - - test('framework plugin fixes have correct structure', () => { - const PrismaTrpcPlugin = require('../src/plugins/frameworks/prisma-trpc'); - - for (const fix of PrismaTrpcPlugin.fixes) { - expect(fix.id).toBeDefined(); - expect(['dev', 'secrets', 'staging', 'prod']).toContain(fix.stage); - expect(['critical', 'warning', 'info']).toContain(fix.severity); - expect(fix.description).toBeDefined(); - expect(typeof fix.scan).toBe('function'); - expect(fix.manualFix).toBeDefined(); - } - }); - }); - - describe('Plugin Instances', () => { - test('server plugins can be instantiated and have deploy method', () => { - const MacMiniPlugin = require('../src/plugins/servers/mac-mini'); - const instance = new MacMiniPlugin({}); - - expect(typeof instance.deploy).toBe('function'); - expect(typeof instance.undeploy).toBe('function'); - }); - - test('framework plugins can be instantiated and have deploy method', () => { - const PrismaTrpcPlugin = require('../src/plugins/frameworks/prisma-trpc'); - const instance = new PrismaTrpcPlugin({}); - - expect(typeof instance.deploy).toBe('function'); - expect(typeof instance.undeploy).toBe('function'); - }); - }); -}); diff --git a/packages/stack/test/deployment-report.test.js b/packages/stack/test/deployment-report.test.js deleted file mode 100644 index b5cc158..0000000 --- a/packages/stack/test/deployment-report.test.js +++ /dev/null @@ -1,181 +0,0 @@ -const { - formatDeploymentReport, - formatWorkflowSummary, - generateSummary, - formatLocalChecks -} = require('../src/utils/deployment-report'); - -describe('Deployment Report', () => { - describe('formatDeploymentReport', () => { - it('should format a complete report', () => { - const data = { - repoName: 'test-app', - localChecks: { - coreYml: true, - dockerfile: true, - git: true, - branch: 'main', - workflows: true, - scripts: true - }, - secretsCheck: { - present: ['STAGING_SSH', 'PROD_SSH'], - missing: ['AWS_ACCESS_KEY_ID'], - error: null - }, - serverChecks: [ - { - environment: 'staging', - host: '192.168.1.100', - user: 'admin', - connected: true, - infrastructureExists: true, - allDeployedRepos: [ - { name: 'app1', domain: 'app1.example.com', port: 3001 } - ], - currentRepo: { - deployed: false - } - } - ], - summary: { - ready: true, - warnings: 1, - errors: 0, - nextSteps: ['Add missing secret: AWS_ACCESS_KEY_ID'] - } - }; - - const report = formatDeploymentReport(data); - - expect(report).toContain('DEPLOYMENT READINESS REPORT - test-app'); - expect(report).toContain('✅ LOCAL CONFIGURATION'); - expect(report).toContain('🔑 GITHUB SECRETS'); - expect(report).toContain('✅ STAGING_SSH exists'); - expect(report).toContain('⚠️ AWS_ACCESS_KEY_ID not found'); - expect(report).toContain('📡 STAGING SERVER'); - expect(report).toContain('NOT DEPLOYED'); - }); - - it('should handle errors gracefully', () => { - const data = { - repoName: 'test-app', - secretsCheck: { - error: 'GitHub token is invalid' - }, - serverChecks: [ - { - environment: 'staging', - host: '192.168.1.100', - user: 'admin', - error: 'Connection refused' - } - ], - summary: { - ready: false, - warnings: 0, - errors: 2, - nextSteps: ['Fix GitHub token', 'Fix SSH connection'] - } - }; - - const report = formatDeploymentReport(data); - - expect(report).toContain('❌ GitHub token is invalid'); - expect(report).toContain('❌ Connection refused'); - expect(report).toContain('NOT READY'); - }); - }); - - describe('generateSummary', () => { - it('should generate ready summary with no issues', () => { - const localChecks = { coreYml: true, workflows: true }; - const secretsCheck = { present: ['ALL'], missing: [], error: null }; - const serverChecks = [ - { connected: true, error: null } - ]; - - const summary = generateSummary(localChecks, secretsCheck, serverChecks); - - expect(summary.ready).toBe(true); - expect(summary.warnings).toBe(0); - expect(summary.errors).toBe(0); - expect(summary.nextSteps.length).toBeGreaterThan(0); - }); - - it('should detect missing secrets as warnings', () => { - const localChecks = { coreYml: true }; - const secretsCheck = { - present: ['STAGING_SSH'], - missing: ['PROD_SSH', 'AWS_ACCESS_KEY_ID'], - error: null - }; - const serverChecks = []; - - const summary = generateSummary(localChecks, secretsCheck, serverChecks); - - expect(summary.warnings).toBe(2); - expect(summary.nextSteps).toContain('Add missing GitHub secret: PROD_SSH'); - expect(summary.nextSteps).toContain('Add missing GitHub secret: AWS_ACCESS_KEY_ID'); - }); - - it('should detect connection errors', () => { - const localChecks = { coreYml: true }; - const secretsCheck = { present: [], missing: [], error: null }; - const serverChecks = [ - { environment: 'staging', connected: false, error: 'Connection failed' } - ]; - - const summary = generateSummary(localChecks, secretsCheck, serverChecks); - - expect(summary.ready).toBe(false); - expect(summary.errors).toBeGreaterThan(0); - }); - }); - - describe('formatWorkflowSummary', () => { - it('should wrap report in code block', () => { - const data = { - repoName: 'test-app', - summary: { - ready: true, - warnings: 0, - errors: 0, - nextSteps: [] - } - }; - - const summary = formatWorkflowSummary(data); - - expect(summary).toContain('```'); - expect(summary).toContain('test-app'); - }); - }); - - describe('formatLocalChecks', () => { - it('should format audit results', () => { - const auditResults = { - coreYml: { exists: true, parseError: null, needsCustomization: false }, - workflows: { allExist: true }, - branches: { hasGit: true, currentBranch: 'main' }, - repoScripts: { - hasPackageJson: true, - requiredScripts: { test: true, 'test:server': true } - } - }; - - const checks = formatLocalChecks(auditResults); - - expect(checks.coreYml).toBe(true); - expect(checks.git).toBe(true); - expect(checks.branch).toBe('main'); - expect(checks.workflows).toBe(true); - expect(checks.scripts).toBe(true); - }); - }); -}); - - - - - diff --git a/packages/stack/test/deployment.test.js b/packages/stack/test/deployment.test.js deleted file mode 100644 index d407410..0000000 --- a/packages/stack/test/deployment.test.js +++ /dev/null @@ -1,191 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const yaml = require('js-yaml'); -const { scanRepos, loadConfigs, generateDockerCompose, generateNginx } = require('../src/scripts/generate-all'); - -describe('Deployment Simulation Test', () => { - const testStackDir = path.join(__dirname, 'temp-stack-deployment'); - const fixturesDir = path.join(__dirname, 'fixtures'); - - // Store original env - const originalFactiiiDir = process.env.FACTIII_DIR; - - beforeEach(() => { - // Create temp stack directory structure - if (!fs.existsSync(testStackDir)) { - fs.mkdirSync(testStackDir, { recursive: true }); - } - // Set FACTIII_DIR to use our test directory - process.env.FACTIII_DIR = testStackDir; - }); - - afterEach(() => { - // Clean up - if (fs.existsSync(testStackDir)) { - fs.rmSync(testStackDir, { recursive: true, force: true }); - } - // Restore original env - if (originalFactiiiDir) { - process.env.FACTIII_DIR = originalFactiiiDir; - } else { - delete process.env.FACTIII_DIR; - } - }); - - function createTestRepo(repoName, fixtureName) { - const repoDir = path.join(testStackDir, repoName); - fs.mkdirSync(repoDir, { recursive: true }); - fs.copyFileSync( - path.join(fixturesDir, fixtureName), - path.join(repoDir, 'stack.yml') - ); - return repoDir; - } - - function regenerateConfigs() { - const repos = scanRepos(); - const configs = loadConfigs(repos); - generateDockerCompose(configs); - generateNginx(configs); - return { repos, configs }; - } - - function readGeneratedCompose() { - const composePath = path.join(testStackDir, 'docker-compose.yml'); - if (!fs.existsSync(composePath)) return null; - return fs.readFileSync(composePath, 'utf8'); - } - - function readGeneratedNginx() { - const nginxPath = path.join(testStackDir, 'nginx.conf'); - if (!fs.existsSync(nginxPath)) return null; - return fs.readFileSync(nginxPath, 'utf8'); - } - - function countAppServices(content) { - // Count app service entries (service lines that end with -staging: or -prod:) - const matches = content.match(/^\s+[a-z0-9-]+-(?:staging|prod):$/gm); - return matches ? matches.length : 0; - } - - function countNginxServerBlocks(content) { - // Count server blocks (listen 80 lines, excluding comments) - const matches = content.match(/listen 80;/g); - return matches ? matches.length : 0; - } - - describe('Phase 1: Deploy repo1', () => { - test('deploys single repo and generates correct configs', () => { - createTestRepo('repo1', 'repo1.yml'); - regenerateConfigs(); - - const composeContent = readGeneratedCompose(); - const nginxContent = readGeneratedNginx(); - - expect(composeContent).not.toBeNull(); - expect(nginxContent).not.toBeNull(); - - // Validate docker-compose - expect(composeContent).toContain('nginx:'); - expect(composeContent).toContain('repo1-staging:'); - expect(composeContent).not.toContain('repo2-staging:'); - - // Validate nginx - expect(composeContent).toContain('repo1-staging:'); - expect(nginxContent).toContain('test-repo1.local'); - expect(nginxContent).not.toContain('test-repo2.local'); - }); - }); - - describe('Phase 2: Add repo2', () => { - test('adds second repo and both repos exist', () => { - createTestRepo('repo1', 'repo1.yml'); - createTestRepo('repo2', 'repo2.yml'); - regenerateConfigs(); - - const composeContent = readGeneratedCompose(); - const nginxContent = readGeneratedNginx(); - - // Validate both repos exist - expect(composeContent).toContain('repo1-staging:'); - expect(composeContent).toContain('repo2-staging:'); - - // Validate both domains in nginx - expect(nginxContent).toContain('test-repo1.local'); - expect(nginxContent).toContain('test-repo2.local'); - }); - }); - - describe('Phase 3: Remove repo2', () => { - test('removes repo2 and repo1 remains', () => { - // Start with both repos - createTestRepo('repo1', 'repo1.yml'); - createTestRepo('repo2', 'repo2.yml'); - regenerateConfigs(); - - // Remove repo2 - fs.rmSync(path.join(testStackDir, 'repo2'), { recursive: true, force: true }); - regenerateConfigs(); - - const composeContent = readGeneratedCompose(); - const nginxContent = readGeneratedNginx(); - - // Validate repo1 still exists - expect(composeContent).toContain('repo1-staging:'); - expect(nginxContent).toContain('test-repo1.local'); - - // Validate repo2 is completely removed - expect(composeContent).not.toContain('repo2-staging:'); - expect(nginxContent).not.toContain('test-repo2.local'); - }); - }); - - describe('Phase 4: Remove repo1', () => { - test('removes repo1 and no repos remain', () => { - // Start with repo1 only - createTestRepo('repo1', 'repo1.yml'); - regenerateConfigs(); - - // Remove repo1 - fs.rmSync(path.join(testStackDir, 'repo1'), { recursive: true, force: true }); - - // Verify no repos remain - const repos = scanRepos(); - expect(repos.length).toBe(0); - }); - }); - - describe('Full lifecycle integration', () => { - test('simulates complete deployment lifecycle', () => { - // Phase 1: Deploy repo1 - createTestRepo('repo1', 'repo1.yml'); - regenerateConfigs(); - - let composeContent = readGeneratedCompose(); - expect(countAppServices(composeContent)).toBe(1); - - // Phase 2: Add repo2 - createTestRepo('repo2', 'repo2.yml'); - regenerateConfigs(); - - composeContent = readGeneratedCompose(); - expect(countAppServices(composeContent)).toBe(2); - - // Phase 3: Remove repo2 - fs.rmSync(path.join(testStackDir, 'repo2'), { recursive: true, force: true }); - regenerateConfigs(); - - composeContent = readGeneratedCompose(); - expect(countAppServices(composeContent)).toBe(1); - expect(composeContent).toContain('repo1-staging:'); - expect(composeContent).not.toContain('repo2-staging:'); - - // Phase 4: Remove repo1 - fs.rmSync(path.join(testStackDir, 'repo1'), { recursive: true, force: true }); - - // Verify no repos remain - const repos = scanRepos(); - expect(repos.length).toBe(0); - }); - }); -}); diff --git a/packages/stack/test/env-management.test.js b/packages/stack/test/env-management.test.js deleted file mode 100644 index e415c62..0000000 --- a/packages/stack/test/env-management.test.js +++ /dev/null @@ -1,317 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const os = require('os'); -const { - parseEnvFile, - looksLikePlaceholder, - isGitignored, - compareEnvKeys, - checkValuesNotEmpty, - checkForPlaceholders, - findMatchingValues, - validateEnvFiles -} = require('../src/utils/env-validator'); - -const { - generateEnvExampleTemplate, - generateEnvTemplate, - createEnvTemplates -} = require('../src/utils/template-generator'); - -describe('Environment File Management', () => { - let testDir; - - beforeEach(() => { - // Create a temporary directory for each test - testDir = fs.mkdtempSync(path.join(os.tmpdir(), 'env-test-')); - }); - - afterEach(() => { - // Cleanup temporary directory - if (fs.existsSync(testDir)) { - fs.rmSync(testDir, { recursive: true, force: true }); - } - }); - - describe('parseEnvFile', () => { - test('should parse valid env file', () => { - const envPath = path.join(testDir, '.env.test'); - fs.writeFileSync(envPath, 'KEY1=value1\nKEY2=value2\nKEY3=value3'); - - const result = parseEnvFile(envPath); - - expect(result).toEqual({ - KEY1: 'value1', - KEY2: 'value2', - KEY3: 'value3' - }); - }); - - test('should ignore comments and empty lines', () => { - const envPath = path.join(testDir, '.env.test'); - fs.writeFileSync(envPath, '# Comment\nKEY1=value1\n\nKEY2=value2\n# Another comment'); - - const result = parseEnvFile(envPath); - - expect(result).toEqual({ - KEY1: 'value1', - KEY2: 'value2' - }); - }); - - test('should return null for non-existent file', () => { - const result = parseEnvFile(path.join(testDir, 'nonexistent.env')); - expect(result).toBeNull(); - }); - - test('should handle values with equals signs', () => { - const envPath = path.join(testDir, '.env.test'); - fs.writeFileSync(envPath, 'DATABASE_URL=postgresql://user:pass@host:5432/db?key=value'); - - const result = parseEnvFile(envPath); - - expect(result.DATABASE_URL).toBe('postgresql://user:pass@host:5432/db?key=value'); - }); - }); - - describe('looksLikePlaceholder', () => { - test('should detect EXAMPLE values', () => { - expect(looksLikePlaceholder('EXAMPLE_value')).toBe(true); - expect(looksLikePlaceholder('EXAMPLE.com')).toBe(true); - }); - - test('should detect { - expect(looksLikePlaceholder('')).toBe(true); - }); - - test('should detect empty values', () => { - expect(looksLikePlaceholder('')).toBe(true); - expect(looksLikePlaceholder(null)).toBe(true); - }); - - test('should not flag real values', () => { - expect(looksLikePlaceholder('actual-secret-key-123')).toBe(false); - expect(looksLikePlaceholder('production.com')).toBe(false); - }); - }); - - describe('isGitignored', () => { - test('should detect exact matches', () => { - const gitignorePath = path.join(testDir, '.gitignore'); - fs.writeFileSync(gitignorePath, '.env.prod\nnode_modules/\n'); - - expect(isGitignored(testDir, '.env.prod')).toBe(true); - expect(isGitignored(testDir, '.env.staging')).toBe(false); - }); - - test('should detect pattern matches', () => { - const gitignorePath = path.join(testDir, '.gitignore'); - fs.writeFileSync(gitignorePath, '.env.*\n'); - - expect(isGitignored(testDir, '.env.prod')).toBe(true); - expect(isGitignored(testDir, '.env.staging')).toBe(true); - expect(isGitignored(testDir, '.env.example')).toBe(true); - }); - - test('should return false if .gitignore does not exist', () => { - expect(isGitignored(testDir, '.env.prod')).toBe(false); - }); - }); - - describe('compareEnvKeys', () => { - test('should detect matching keys', () => { - const expected = { KEY1: 'val1', KEY2: 'val2' }; - const actual = { KEY1: 'val1', KEY2: 'val2' }; - - const result = compareEnvKeys(expected, actual); - - expect(result.match).toBe(true); - expect(result.missing).toEqual([]); - expect(result.extra).toEqual([]); - }); - - test('should detect missing keys', () => { - const expected = { KEY1: 'val1', KEY2: 'val2', KEY3: 'val3' }; - const actual = { KEY1: 'val1', KEY2: 'val2' }; - - const result = compareEnvKeys(expected, actual); - - expect(result.match).toBe(false); - expect(result.missing).toEqual(['KEY3']); - }); - - test('should detect extra keys', () => { - const expected = { KEY1: 'val1', KEY2: 'val2' }; - const actual = { KEY1: 'val1', KEY2: 'val2', KEY3: 'val3' }; - - const result = compareEnvKeys(expected, actual); - - expect(result.match).toBe(false); - expect(result.extra).toEqual(['KEY3']); - }); - }); - - describe('checkValuesNotEmpty', () => { - test('should pass for all filled values', () => { - const env = { KEY1: 'value1', KEY2: 'value2' }; - - const result = checkValuesNotEmpty(env); - - expect(result.allFilled).toBe(true); - expect(result.empty).toEqual([]); - }); - - test('should detect empty values', () => { - const env = { KEY1: 'value1', KEY2: '', KEY3: ' ' }; - - const result = checkValuesNotEmpty(env); - - expect(result.allFilled).toBe(false); - expect(result.empty).toContain('KEY2'); - expect(result.empty).toContain('KEY3'); - }); - }); - - describe('validateEnvFiles', () => { - test('should error if .env.example is missing', () => { - const result = validateEnvFiles(testDir, {}); - - expect(result.devExists).toBe(false); - expect(result.errors).toContain('.env.example not found (required as template)'); - }); - - test('should validate complete setup', () => { - // Create .env.example - const devPath = path.join(testDir, '.env.example'); - fs.writeFileSync(devPath, 'KEY1=EXAMPLE\nKEY2=EXAMPLE'); - - // Create .env.staging - const stagingPath = path.join(testDir, '.env.staging'); - fs.writeFileSync(stagingPath, 'KEY1=staging-val1\nKEY2=staging-val2'); - - // Create .env.prod - const prodPath = path.join(testDir, '.env.prod'); - fs.writeFileSync(prodPath, 'KEY1=prod-val1\nKEY2=prod-val2'); - - // Create .gitignore - const gitignorePath = path.join(testDir, '.gitignore'); - fs.writeFileSync(gitignorePath, '.env.prod\n'); - - const result = validateEnvFiles(testDir, {}); - - expect(result.devExists).toBe(true); - expect(result.stagingExists).toBe(true); - expect(result.prodLocal).toBe(true); - expect(result.prodGitignored).toBe(true); - expect(result.keysMatch).toBe(true); - expect(result.allFilled).toBe(true); - expect(result.errors).toEqual([]); - }); - - test('should warn about missing .env.prod if only in GitHub', () => { - // Create .env.example - const devPath = path.join(testDir, '.env.example'); - fs.writeFileSync(devPath, 'KEY1=EXAMPLE\nKEY2=EXAMPLE'); - - // Create .env.staging - const stagingPath = path.join(testDir, '.env.staging'); - fs.writeFileSync(stagingPath, 'KEY1=staging-val1\nKEY2=staging-val2'); - - // Simulate GitHub secrets - const githubSecrets = { - PROD_ENVS: { KEY1: 'prod-val1', KEY2: 'prod-val2' } - }; - - const result = validateEnvFiles(testDir, {}, githubSecrets); - - expect(result.prodLocal).toBe(false); - expect(result.prodGitHub).toBe(true); - expect(result.prodExists).toBe(true); - expect(result.warnings).toContain('.env.prod not local, using GitHub Secrets (OK for security)'); - }); - - test('should error if keys do not match', () => { - // Create .env.example - const devPath = path.join(testDir, '.env.example'); - fs.writeFileSync(devPath, 'KEY1=EXAMPLE\nKEY2=EXAMPLE\nKEY3=EXAMPLE'); - - // Create .env.staging with missing key - const stagingPath = path.join(testDir, '.env.staging'); - fs.writeFileSync(stagingPath, 'KEY1=staging-val1\nKEY2=staging-val2'); - - const result = validateEnvFiles(testDir, {}); - - expect(result.keysMatch).toBe(false); - expect(result.errors.some(e => e.includes('missing keys: KEY3'))).toBe(true); - }); - }); - - describe('generateEnvExampleTemplate', () => { - test('should generate template with EXAMPLE values', () => { - const template = generateEnvExampleTemplate({ name: 'testapp' }); - - expect(template).toContain('.env.example'); - expect(template).toContain('EXAMPLE'); - expect(template).toContain('NODE_ENV=development'); - expect(template).toContain('DATABASE_URL'); - }); - - test('should include repo name in examples', () => { - const template = generateEnvExampleTemplate({ name: 'myapp' }); - - expect(template).toContain('myapp'); - }); - }); - - describe('createEnvTemplates', () => { - test('should create all three env files', () => { - const result = createEnvTemplates(testDir, { name: 'testapp' }); - - expect(result.created).toContain('.env.example'); - expect(result.created).toContain('.env.staging'); - expect(result.created).toContain('.env.prod'); - expect(result.errors).toEqual([]); - - expect(fs.existsSync(path.join(testDir, '.env.example'))).toBe(true); - expect(fs.existsSync(path.join(testDir, '.env.staging'))).toBe(true); - expect(fs.existsSync(path.join(testDir, '.env.prod'))).toBe(true); - }); - - test('should skip existing files', () => { - // Create .env.example first - fs.writeFileSync(path.join(testDir, '.env.example'), 'KEY1=value1'); - - const result = createEnvTemplates(testDir, { name: 'testapp' }); - - expect(result.skipped).toContain('.env.example'); - expect(result.created).toContain('.env.staging'); - expect(result.created).toContain('.env.prod'); - }); - - test('should use .env.example as template for staging/prod', () => { - createEnvTemplates(testDir, { name: 'testapp' }); - - const dev = parseEnvFile(path.join(testDir, '.env.example')); - const staging = parseEnvFile(path.join(testDir, '.env.staging')); - const prod = parseEnvFile(path.join(testDir, '.env.prod')); - - // All should have the same keys - expect(Object.keys(staging).sort()).toEqual(Object.keys(dev).sort()); - expect(Object.keys(prod).sort()).toEqual(Object.keys(dev).sort()); - }); - }); - - describe('findMatchingValues', () => { - test('should find keys with identical values', () => { - const env1 = { KEY1: 'same', KEY2: 'different1', KEY3: 'same' }; - const env2 = { KEY1: 'same', KEY2: 'different2', KEY3: 'same' }; - - const result = findMatchingValues(env1, env2); - - expect(result).toContain('KEY1'); - expect(result).toContain('KEY3'); - expect(result).not.toContain('KEY2'); - }); - }); -}); - diff --git a/packages/stack/test/fixtures/repo1.yml b/packages/stack/test/fixtures/repo1.yml deleted file mode 100644 index c407697..0000000 --- a/packages/stack/test/fixtures/repo1.yml +++ /dev/null @@ -1,10 +0,0 @@ -name: test-repo1 -environments: - staging: - domain: test-repo1.local - health_check: /health -ssl_email: test@example.com -ecr_registry: 123456789.dkr.ecr.us-east-1.amazonaws.com -ecr_repository: test-apps - - diff --git a/packages/stack/test/fixtures/repo2.yml b/packages/stack/test/fixtures/repo2.yml deleted file mode 100644 index 0f15132..0000000 --- a/packages/stack/test/fixtures/repo2.yml +++ /dev/null @@ -1,10 +0,0 @@ -name: test-repo2 -environments: - staging: - domain: test-repo2.local - health_check: /health -ssl_email: test@example.com -ecr_registry: 123456789.dkr.ecr.us-east-1.amazonaws.com -ecr_repository: test-apps - - diff --git a/packages/stack/test/generators.test.js b/packages/stack/test/generators.test.js deleted file mode 100644 index 0939477..0000000 --- a/packages/stack/test/generators.test.js +++ /dev/null @@ -1,234 +0,0 @@ -const fs = require('fs'); -const path = require('path'); -const yaml = require('js-yaml'); -const { scanRepos, loadConfigs, generateDockerCompose, generateNginx } = require('../src/scripts/generate-all'); - -describe('Generator Tests (generate-all.js)', () => { - const testStackDir = path.join(__dirname, 'temp-stack'); - const fixturesDir = path.join(__dirname, 'fixtures'); - - // Store original env - const originalFactiiiDir = process.env.FACTIII_DIR; - - beforeEach(() => { - // Create temp stack directory structure - if (!fs.existsSync(testStackDir)) { - fs.mkdirSync(testStackDir, { recursive: true }); - } - // Set FACTIII_DIR to use our test directory - process.env.FACTIII_DIR = testStackDir; - }); - - afterEach(() => { - // Clean up - if (fs.existsSync(testStackDir)) { - fs.rmSync(testStackDir, { recursive: true, force: true }); - } - // Restore original env - if (originalFactiiiDir) { - process.env.FACTIII_DIR = originalFactiiiDir; - } else { - delete process.env.FACTIII_DIR; - } - }); - - function createTestRepo(repoName, config) { - const repoDir = path.join(testStackDir, repoName); - fs.mkdirSync(repoDir, { recursive: true }); - fs.writeFileSync(path.join(repoDir, 'stack.yml'), yaml.dump(config)); - return repoDir; - } - - function loadFixtureConfig(fixtureName) { - const content = fs.readFileSync(path.join(fixturesDir, fixtureName), 'utf8'); - return yaml.load(content); - } - - describe('scanRepos', () => { - test('finds repos with stack.yml', () => { - createTestRepo('test-repo1', { name: 'test-repo1', environments: {} }); - createTestRepo('test-repo2', { name: 'test-repo2', environments: {} }); - - // Create a directory without stack.yml (should be skipped) - fs.mkdirSync(path.join(testStackDir, 'no-config'), { recursive: true }); - - const repos = scanRepos(); - - expect(repos.length).toBe(2); - expect(repos.map(r => r.name)).toContain('test-repo1'); - expect(repos.map(r => r.name)).toContain('test-repo2'); - }); - - test('skips special directories', () => { - createTestRepo('test-repo', { name: 'test-repo', environments: {} }); - - // Create special directories that should be skipped - fs.mkdirSync(path.join(testStackDir, 'scripts'), { recursive: true }); - fs.mkdirSync(path.join(testStackDir, 'node_modules'), { recursive: true }); - fs.mkdirSync(path.join(testStackDir, '.hidden'), { recursive: true }); - - const repos = scanRepos(); - - expect(repos.length).toBe(1); - expect(repos[0].name).toBe('test-repo'); - }); - }); - - describe('loadConfigs', () => { - test('loads configs from repos', () => { - createTestRepo('repo1', loadFixtureConfig('repo1.yml')); - createTestRepo('repo2', loadFixtureConfig('repo2.yml')); - - const repos = scanRepos(); - const configs = loadConfigs(repos); - - expect(Object.keys(configs)).toContain('repo1'); - expect(Object.keys(configs)).toContain('repo2'); - expect(configs['repo1'].name).toBe('test-repo1'); - expect(configs['repo2'].name).toBe('test-repo2'); - }); - }); - - describe('generateDockerCompose', () => { - test('generates docker-compose.yml with nginx service', () => { - createTestRepo('repo1', loadFixtureConfig('repo1.yml')); - - const repos = scanRepos(); - const configs = loadConfigs(repos); - generateDockerCompose(configs); - - const composePath = path.join(testStackDir, 'docker-compose.yml'); - expect(fs.existsSync(composePath)).toBe(true); - - const content = fs.readFileSync(composePath, 'utf8'); - expect(content).toContain('nginx:'); - expect(content).toContain('image: nginx:alpine'); - }); - - test('generates services for each repo environment', () => { - createTestRepo('repo1', loadFixtureConfig('repo1.yml')); - - const repos = scanRepos(); - const configs = loadConfigs(repos); - generateDockerCompose(configs); - - const composePath = path.join(testStackDir, 'docker-compose.yml'); - const content = fs.readFileSync(composePath, 'utf8'); - - expect(content).toContain('repo1-staging:'); - }); - - test('handles multiple repos', () => { - createTestRepo('repo1', loadFixtureConfig('repo1.yml')); - createTestRepo('repo2', loadFixtureConfig('repo2.yml')); - - const repos = scanRepos(); - const configs = loadConfigs(repos); - const serviceCount = generateDockerCompose(configs); - - expect(serviceCount).toBe(2); // Both repos have staging environment - - const composePath = path.join(testStackDir, 'docker-compose.yml'); - const content = fs.readFileSync(composePath, 'utf8'); - - expect(content).toContain('repo1-staging:'); - expect(content).toContain('repo2-staging:'); - }); - }); - - describe('generateNginx', () => { - test('generates nginx.conf with server blocks', () => { - createTestRepo('repo1', loadFixtureConfig('repo1.yml')); - - const repos = scanRepos(); - const configs = loadConfigs(repos); - generateNginx(configs); - - const nginxPath = path.join(testStackDir, 'nginx.conf'); - expect(fs.existsSync(nginxPath)).toBe(true); - - const content = fs.readFileSync(nginxPath, 'utf8'); - expect(content).toContain('http {'); - expect(content).toContain('server_name test-repo1.local;'); - }); - - test('handles multiple repos with different domains', () => { - createTestRepo('repo1', loadFixtureConfig('repo1.yml')); - createTestRepo('repo2', loadFixtureConfig('repo2.yml')); - - const repos = scanRepos(); - const configs = loadConfigs(repos); - const domainCount = generateNginx(configs); - - expect(domainCount).toBe(2); - - const nginxPath = path.join(testStackDir, 'nginx.conf'); - const content = fs.readFileSync(nginxPath, 'utf8'); - - expect(content).toContain('server_name test-repo1.local;'); - expect(content).toContain('server_name test-repo2.local;'); - }); - - test('skips nginx generation when no domains configured', () => { - createTestRepo('repo1', { - name: 'test-repo', - environments: { - staging: { host: '192.168.1.1' } // No domain - } - }); - - const repos = scanRepos(); - const configs = loadConfigs(repos); - const domainCount = generateNginx(configs); - - expect(domainCount).toBe(0); - }); - }); - - describe('Full lifecycle', () => { - test('deploy repo1, add repo2, remove repo2, remove repo1', () => { - // Phase 1: Deploy repo1 - createTestRepo('repo1', loadFixtureConfig('repo1.yml')); - - let repos = scanRepos(); - let configs = loadConfigs(repos); - generateDockerCompose(configs); - generateNginx(configs); - - let composePath = path.join(testStackDir, 'docker-compose.yml'); - let content = fs.readFileSync(composePath, 'utf8'); - expect(content).toContain('repo1-staging:'); - expect(content).not.toContain('repo2-staging:'); - - // Phase 2: Add repo2 - createTestRepo('repo2', loadFixtureConfig('repo2.yml')); - - repos = scanRepos(); - configs = loadConfigs(repos); - generateDockerCompose(configs); - generateNginx(configs); - - content = fs.readFileSync(composePath, 'utf8'); - expect(content).toContain('repo1-staging:'); - expect(content).toContain('repo2-staging:'); - - // Phase 3: Remove repo2 - fs.rmSync(path.join(testStackDir, 'repo2'), { recursive: true, force: true }); - - repos = scanRepos(); - configs = loadConfigs(repos); - generateDockerCompose(configs); - generateNginx(configs); - - content = fs.readFileSync(composePath, 'utf8'); - expect(content).toContain('repo1-staging:'); - expect(content).not.toContain('repo2-staging:'); - - // Phase 4: Remove repo1 - fs.rmSync(path.join(testStackDir, 'repo1'), { recursive: true, force: true }); - - repos = scanRepos(); - expect(repos.length).toBe(0); - }); - }); -}); diff --git a/packages/stack/test/github-secrets.test.js b/packages/stack/test/github-secrets.test.js deleted file mode 100644 index 0525bea..0000000 --- a/packages/stack/test/github-secrets.test.js +++ /dev/null @@ -1,90 +0,0 @@ -const { - getRequiredSecrets, - checkGitHubSecrets, - formatSecretsReport, - getGitHubRepoInfo -} = require('../src/utils/github-secrets'); - -describe('GitHub Secrets Utilities', () => { - describe('getRequiredSecrets', () => { - it('should return all required secrets', () => { - const config = { name: 'test-repo' }; - const secrets = getRequiredSecrets(config); - - // Updated for simplified secrets (only SSH keys and AWS secret) - expect(secrets).toContain('STAGING_SSH'); - expect(secrets).toContain('PROD_SSH'); - expect(secrets).toContain('AWS_SECRET_ACCESS_KEY'); - expect(secrets).toContain('STAGING_ENVS'); - expect(secrets).toContain('PROD_ENVS'); - }); - }); - - describe('formatSecretsReport', () => { - it('should format present secrets', () => { - const secretsCheck = { - present: ['STAGING_SSH', 'PROD_SSH'], - missing: [], - error: null - }; - - const report = formatSecretsReport(secretsCheck); - - expect(report).toContain('✅ STAGING_SSH exists'); - expect(report).toContain('✅ PROD_SSH exists'); - }); - - it('should format missing secrets', () => { - const secretsCheck = { - present: ['STAGING_SSH'], - missing: ['PROD_SSH', 'AWS_ACCESS_KEY_ID'], - error: null - }; - - const report = formatSecretsReport(secretsCheck); - - expect(report).toContain('✅ STAGING_SSH exists'); - expect(report).toContain('⚠️ PROD_SSH not found'); - expect(report).toContain('⚠️ AWS_ACCESS_KEY_ID not found'); - }); - - it('should format error message', () => { - const secretsCheck = { - present: [], - missing: [], - error: 'GitHub token is invalid' - }; - - const report = formatSecretsReport(secretsCheck); - - expect(report).toContain('❌ GitHub token is invalid'); - expect(report).toContain('Cannot verify secrets via API'); - }); - }); - - describe('checkGitHubSecrets', () => { - it('should return error when no token provided', async () => { - const result = await checkGitHubSecrets('owner', 'repo', null, {}); - - expect(result.error).toBe('No GitHub token provided'); - expect(result.present).toEqual([]); - expect(result.missing).toEqual([]); - }); - - // Note: API tests would require mocking Octokit - }); - - describe('getGitHubRepoInfo', () => { - it('should return null when not in a git repository', () => { - // This test would need to be run outside a git repo or mock execSync - // For now, we'll just check it doesn't throw - const result = getGitHubRepoInfo(); - expect(result === null || typeof result === 'object').toBe(true); - }); - }); -}); - - - - - diff --git a/packages/stack/test/port-convention.test.ts b/packages/stack/test/port-convention.test.ts index ef84e0f..7cab21f 100644 --- a/packages/stack/test/port-convention.test.ts +++ b/packages/stack/test/port-convention.test.ts @@ -6,7 +6,6 @@ * - port-convention.ts scanfixes (PORT slot validation, http/https enforcement) * - start-sh.ts scanfix (start.sh generation and marker detection) * - generate-all.ts (slot-based docker compose + nginx port mapping) - * - template-generator.ts (PORT=1 default in .env.example template) */ import * as fs from 'fs'; @@ -617,32 +616,6 @@ describe('generate-all.ts slot port mapping', () => { }); }); -// ══════════════════════════════════════════════════════════════ -// TEMPLATE GENERATOR -// ══════════════════════════════════════════════════════════════ - -describe('template-generator PORT default', () => { - test('generates PORT=1 (slot) not PORT=3000', async () => { - const { generateEnvExampleTemplate } = await import('../src/utils/template-generator'); - const template = generateEnvExampleTemplate({ name: 'test-app' } as FactiiiConfig); - - // Should have slot-based PORT - expect(template).toContain('PORT=1'); - expect(template).not.toContain('PORT=3000'); - - // Should have slot explanation comment - expect(template).toMatch(/[Ss]lot/); - expect(template).toMatch(/3000\+PORT|3000 \+ PORT|Client.*3000/i); - }); - - test('URL placeholders use YOUR_IP', async () => { - const { generateEnvExampleTemplate } = await import('../src/utils/template-generator'); - const template = generateEnvExampleTemplate({ name: 'test-app' } as FactiiiConfig); - - expect(template).toContain('YOUR_IP'); - }); -}); - // ══════════════════════════════════════════════════════════════ // INTEGRATION: FIXES REGISTERED IN PIPELINE // ══════════════════════════════════════════════════════════════ diff --git a/packages/stack/test/secret-prompts.test.js b/packages/stack/test/secret-prompts.test.js deleted file mode 100644 index eadb48a..0000000 --- a/packages/stack/test/secret-prompts.test.js +++ /dev/null @@ -1,259 +0,0 @@ -const { - getSecretMetadata, - formatSecretHelp, - validateSecretFormat -} = require('../src/utils/secret-prompts'); - -describe('Secret Prompts Utilities', () => { - describe('getSecretMetadata', () => { - it('should return metadata for STAGING_SSH', () => { - const metadata = getSecretMetadata('STAGING_SSH'); - - expect(metadata.type).toBe('ssh_key'); - expect(metadata.description).toContain('SSH private key'); - expect(metadata.helpText).toContain('ssh-keygen'); - expect(metadata.validation).toBeDefined(); - }); - - it('should return metadata for AWS_ACCESS_KEY_ID', () => { - const metadata = getSecretMetadata('AWS_ACCESS_KEY_ID'); - - expect(metadata.type).toBe('aws_key'); - expect(metadata.description).toContain('AWS Access Key'); - expect(metadata.helpText).toContain('AKIA'); - expect(metadata.validation).toBeDefined(); - }); - - it('should return generic metadata for unknown secrets', () => { - const metadata = getSecretMetadata('UNKNOWN_SECRET'); - - expect(metadata.type).toBe('generic'); - expect(metadata.description).toContain('UNKNOWN_SECRET'); - expect(metadata.validation).toBeDefined(); - }); - - it('should have metadata for all required secret types', () => { - // Updated for simplified secrets (SSH keys and AWS secret only in GitHub) - const secretTypes = [ - 'STAGING_SSH', - 'PROD_SSH', - 'AWS_SECRET_ACCESS_KEY' - ]; - - secretTypes.forEach(secret => { - const metadata = getSecretMetadata(secret); - expect(metadata).toBeDefined(); - expect(metadata.type).toBeDefined(); - expect(metadata.description).toBeDefined(); - expect(metadata.helpText).toBeDefined(); - expect(metadata.validation).toBeDefined(); - }); - }); - }); - - describe('formatSecretHelp', () => { - it('should format help text for SSH keys', () => { - const help = formatSecretHelp('STAGING_SSH'); - - expect(help).toContain('🔑 STAGING_SSH'); - expect(help).toContain('ssh-keygen'); - expect(help).toContain('authorized_keys'); - }); - - it('should format help text for AWS credentials', () => { - const help = formatSecretHelp('AWS_ACCESS_KEY_ID'); - - expect(help).toContain('🔑 AWS_ACCESS_KEY_ID'); - expect(help).toContain('AWS'); - expect(help).toContain('AKIA'); - }); - - it('should format help text for hostnames', () => { - const help = formatSecretHelp('STAGING_HOST'); - - expect(help).toContain('🔑 STAGING_HOST'); - expect(help).toContain('hostname'); - }); - }); - - describe('validateSecretFormat', () => { - describe('SSH Keys', () => { - it('should validate valid SSH key', () => { - const validKey = `-----BEGIN OPENSSH PRIVATE KEY----- -b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW ------END OPENSSH PRIVATE KEY-----`; - - const result = validateSecretFormat('STAGING_SSH', validKey); - expect(result.valid).toBe(true); - }); - - it('should reject empty SSH key', () => { - const result = validateSecretFormat('STAGING_SSH', ''); - expect(result.valid).toBe(false); - expect(result.error).toContain('cannot be empty'); - }); - - it('should reject invalid SSH key format', () => { - const result = validateSecretFormat('STAGING_SSH', 'not-a-valid-key'); - expect(result.valid).toBe(false); - expect(result.error).toContain('Invalid SSH key format'); - }); - }); - - describe('AWS Access Key ID', () => { - it('should validate valid AWS key', () => { - const result = validateSecretFormat('AWS_ACCESS_KEY_ID', 'AKIAIOSFODNN7EXAMPLE'); - expect(result.valid).toBe(true); - }); - - it('should reject empty AWS key', () => { - const result = validateSecretFormat('AWS_ACCESS_KEY_ID', ''); - expect(result.valid).toBe(false); - expect(result.error).toContain('cannot be empty'); - }); - - it('should reject AWS key not starting with AKIA', () => { - const result = validateSecretFormat('AWS_ACCESS_KEY_ID', 'WRONGIOSFODNN7EXAMPL'); - expect(result.valid).toBe(false); - expect(result.error).toContain('should start with AKIA'); - }); - - it('should reject AWS key with wrong length', () => { - const result = validateSecretFormat('AWS_ACCESS_KEY_ID', 'AKIA123'); - expect(result.valid).toBe(false); - expect(result.error).toContain('20 characters'); - }); - }); - - describe('AWS Secret Access Key', () => { - it('should validate valid AWS secret', () => { - const validSecret = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'; - const result = validateSecretFormat('AWS_SECRET_ACCESS_KEY', validSecret); - expect(result.valid).toBe(true); - }); - - it('should reject empty AWS secret', () => { - const result = validateSecretFormat('AWS_SECRET_ACCESS_KEY', ''); - expect(result.valid).toBe(false); - expect(result.error).toContain('cannot be empty'); - }); - - it('should reject AWS secret with wrong length', () => { - const result = validateSecretFormat('AWS_SECRET_ACCESS_KEY', 'tooshort'); - expect(result.valid).toBe(false); - expect(result.error).toContain('40 characters'); - }); - }); - - describe('AWS Region', () => { - it('should validate valid regions', () => { - const validRegions = ['us-east-1', 'us-west-2', 'eu-west-1', 'ap-southeast-1']; - - validRegions.forEach(region => { - const result = validateSecretFormat('AWS_REGION', region); - expect(result.valid).toBe(true); - }); - }); - - it('should reject empty region', () => { - const result = validateSecretFormat('AWS_REGION', ''); - expect(result.valid).toBe(false); - expect(result.error).toContain('cannot be empty'); - }); - - it('should reject invalid region format', () => { - const result = validateSecretFormat('AWS_REGION', 'invalid-region'); - expect(result.valid).toBe(false); - expect(result.error).toContain('Invalid AWS region format'); - }); - }); - - describe('Hostnames', () => { - it('should validate valid hostnames', () => { - const validHosts = [ - 'staging.example.com', - '192.168.1.100', - 'ec2-12-34-56-78.compute-1.amazonaws.com' - ]; - - validHosts.forEach(host => { - const result = validateSecretFormat('STAGING_HOST', host); - expect(result.valid).toBe(true); - }); - }); - - it('should reject empty hostname', () => { - const result = validateSecretFormat('STAGING_HOST', ''); - expect(result.valid).toBe(false); - expect(result.error).toContain('cannot be empty'); - }); - - it('should reject hostname with spaces', () => { - const result = validateSecretFormat('STAGING_HOST', 'host with spaces'); - expect(result.valid).toBe(false); - expect(result.error).toContain('cannot contain spaces'); - }); - }); - - describe('Usernames', () => { - it('should validate valid usernames', () => { - const validUsers = ['ubuntu', 'admin', 'deploy', 'ec2-user']; - - validUsers.forEach(user => { - const result = validateSecretFormat('STAGING_USER', user); - expect(result.valid).toBe(true); - }); - }); - - it('should allow empty username with default', () => { - const result = validateSecretFormat('STAGING_USER', ''); - expect(result.valid).toBe(true); - expect(result.defaultValue).toBe('ubuntu'); - }); - - it('should reject username with spaces', () => { - const result = validateSecretFormat('STAGING_USER', 'user name'); - expect(result.valid).toBe(false); - expect(result.error).toContain('cannot contain spaces'); - }); - }); - }); - - describe('Integration - Complete validation flow', () => { - it('should validate all secret types correctly', () => { - const testCases = [ - { - name: 'STAGING_SSH', - valid: '-----BEGIN OPENSSH PRIVATE KEY-----\nkey\n-----END OPENSSH PRIVATE KEY-----', - invalid: 'not-a-key' - }, - { - name: 'AWS_ACCESS_KEY_ID', - valid: 'AKIAIOSFODNN7EXAMPLE', - invalid: 'NOTAKIA123' - }, - { - name: 'AWS_REGION', - valid: 'us-east-1', - invalid: 'invalid' - }, - { - name: 'STAGING_HOST', - valid: '192.168.1.1', - invalid: 'host with spaces' - } - ]; - - testCases.forEach(testCase => { - // Valid case - const validResult = validateSecretFormat(testCase.name, testCase.valid); - expect(validResult.valid).toBe(true); - - // Invalid case - const invalidResult = validateSecretFormat(testCase.name, testCase.invalid); - expect(invalidResult.valid).toBe(false); - expect(invalidResult.error).toBeDefined(); - }); - }); - }); -}); diff --git a/packages/stack/test/template-generator.test.js b/packages/stack/test/template-generator.test.js deleted file mode 100644 index aa08dfb..0000000 --- a/packages/stack/test/template-generator.test.js +++ /dev/null @@ -1,113 +0,0 @@ -const { - generateEnvTemplate, - createEnvTemplates, - generateSecretsChecklist -} = require('../src/utils/template-generator'); -const fs = require('fs'); -const path = require('path'); - -describe('Template Generator', () => { - describe('generateEnvTemplate', () => { - it('should generate staging template from dev env', () => { - const devEnv = { - NODE_ENV: 'development', - DATABASE_URL: 'EXAMPLE_url', - JWT_SECRET: 'EXAMPLE_secret' - }; - const template = generateEnvTemplate('staging', devEnv); - - expect(template).toContain('.env.staging'); - expect(template).toContain('NODE_ENV='); - expect(template).toContain('DATABASE_URL='); - expect(template).toContain('JWT_SECRET='); - // EXAMPLE values are replaced with - expect(template).toContain(' { - const devEnv = { - NODE_ENV: 'development', - DATABASE_URL: 'EXAMPLE_url', - API_KEY: 'EXAMPLE_key' - }; - const template = generateEnvTemplate('prod', devEnv); - - expect(template).toContain('.env.prod'); - expect(template).toContain('ALWAYS be in .gitignore'); - expect(template).toContain(' { - const devEnv = { KEY1: 'value1' }; - const template = generateEnvTemplate('staging', devEnv); - - expect(template).toContain('Instructions:'); - expect(template).toContain('npx stack'); - }); - }); - - describe('generateSecretsChecklist', () => { - it('should return checklist with all required secrets', () => { - const checklist = generateSecretsChecklist(); - - // Updated for simplified secrets - expect(checklist).toContain('STAGING_SSH'); - expect(checklist).toContain('PROD_SSH'); - expect(checklist).toContain('AWS_SECRET_ACCESS_KEY'); - expect(checklist).toContain('STAGING_ENVS'); - expect(checklist).toContain('PROD_ENVS'); - expect(checklist).toContain('SSH (server access)'); - expect(checklist).toContain('AWS (Docker registry)'); - expect(checklist).toContain('Environment (app secrets)'); - }); - }); - - describe('createEnvTemplates', () => { - const testDir = path.join(__dirname, '.temp-test'); - - beforeEach(() => { - // Create test directory - if (!fs.existsSync(testDir)) { - fs.mkdirSync(testDir, { recursive: true }); - } - }); - - afterEach(() => { - // Cleanup test directory - if (fs.existsSync(testDir)) { - fs.rmSync(testDir, { recursive: true, force: true }); - } - }); - - it('should create env templates when they don\'t exist', () => { - const config = { name: 'test-app' }; - const result = createEnvTemplates(testDir, config); - - expect(result.created).toContain('.env.staging'); - expect(result.created).toContain('.env.prod'); - expect(result.skipped).toEqual([]); - expect(result.errors).toEqual([]); - - // Verify files were created - expect(fs.existsSync(path.join(testDir, '.env.staging'))).toBe(true); - expect(fs.existsSync(path.join(testDir, '.env.prod'))).toBe(true); - }); - - it('should skip existing files', () => { - const config = { name: 'test-app' }; - - // Create file first - fs.writeFileSync(path.join(testDir, '.env.staging'), 'existing content'); - - const result = createEnvTemplates(testDir, config); - - expect(result.skipped).toContain('.env.staging'); - expect(result.created).toContain('.env.prod'); - - // Verify existing file wasn't overwritten - const content = fs.readFileSync(path.join(testDir, '.env.staging'), 'utf8'); - expect(content).toBe('existing content'); - }); - }); -}); - diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3e11eef..a7f3364 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,23 +5,17 @@ settings: excludeLinksFromLockfile: false overrides: - minimatch: '>=10.2.1' - diff: '>=4.0.4' - hono: '>=4.12.7' - '@hono/node-server': '>=1.19.10' - lodash: '>=4.17.23' - flatted: '>=3.4.0' - rollup: '>=4.59.0' - ajv: ^6.14.0 - zod: 3.25.76 + deepmerge-ts: '>=8.0.2' + esbuild: '>=0.28.1' + mysql2: '>=3.24.3' importers: .: devDependencies: '@changesets/cli': - specifier: ^2.30.0 - version: 2.30.0(@types/node@25.0.3) + specifier: ^3.0.2 + version: 3.0.2 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -29,155 +23,146 @@ importers: packages/auth: dependencies: '@simplewebauthn/server': - specifier: ^13.3.2 - version: 13.3.2 + specifier: ^13.3.3 + version: 13.3.3 '@trpc/server': - specifier: ^11.8.0 - version: 11.8.0(typescript@5.9.3) + specifier: ^11.18.0 + version: 11.18.0(typescript@5.9.3) apple-signin-auth: - specifier: ^2.0.0 - version: 2.0.0 + specifier: ^2.1.0 + version: 2.1.0 bcryptjs: specifier: ^2.4.3 version: 2.4.3 google-auth-library: - specifier: ^10.5.0 - version: 10.6.2 + specifier: ^10.9.1 + version: 10.9.1 jsonwebtoken: - specifier: ^9.0.2 + specifier: ^9.0.3 version: 9.0.3 totp-generator: - specifier: ^2.0.0 + specifier: ^2.0.1 version: 2.0.1 devDependencies: '@playwright/test': - specifier: ^1.58.1 - version: 1.58.2 - '@prisma/adapter-better-sqlite3': - specifier: ^7.3.0 - version: 7.5.0 + specifier: ^1.62.1 + version: 1.62.1 '@prisma/adapter-pg': - specifier: ^7.3.0 - version: 7.5.0 + specifier: ^7.10.0 + version: 7.10.0 '@prisma/client': - specifier: ^7.1.0 - version: 7.5.0(prisma@7.5.0(@types/react@19.2.14)(better-sqlite3@12.8.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3) + specifier: ^7.10.0 + version: 7.10.0(prisma@7.10.0(@types/node@20.19.43)(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(better-sqlite3@12.11.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.9.3))(typescript@5.9.3) '@trpc/client': - specifier: ^11.8.0 - version: 11.14.1(@trpc/server@11.8.0(typescript@5.9.3))(typescript@5.9.3) + specifier: ^11.18.0 + version: 11.18.0(@trpc/server@11.18.0(typescript@5.9.3))(typescript@5.9.3) '@types/bcryptjs': specifier: ^2.4.6 version: 2.4.6 - '@types/better-sqlite3': - specifier: ^7.6.13 - version: 7.6.13 '@types/jsonwebtoken': - specifier: ^9.0.9 + specifier: ^9.0.10 version: 9.0.10 '@types/node': - specifier: ^20.19.0 - version: 20.19.37 + specifier: ^20.19.43 + version: 20.19.43 '@types/pg': - specifier: ^8.16.0 - version: 8.20.0 + specifier: ^8.23.1 + version: 8.23.1 '@types/react': - specifier: ^19.2.11 - version: 19.2.14 + specifier: ^19.2.18 + version: 19.2.18 '@types/react-dom': - specifier: ^19.2.3 - version: 19.2.3(@types/react@19.2.14) + specifier: ^19.2.7 + version: 19.2.7(@types/react@19.2.18) '@typescript-eslint/eslint-plugin': - specifier: ^7.18.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + specifier: ^8.69.0 + version: 8.69.0(@typescript-eslint/parser@8.69.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': - specifier: ^7.18.0 - version: 7.18.0(eslint@8.57.1)(typescript@5.9.3) + specifier: ^8.69.0 + version: 8.69.0(eslint@8.57.1)(typescript@5.9.3) '@vitejs/plugin-react': - specifier: ^5.1.3 - version: 5.2.0(vite@7.3.1(@types/node@20.19.37)(jiti@2.6.1)(tsx@4.21.0)) - better-sqlite3: - specifier: ^12.6.2 - version: 12.8.0 + specifier: ^5.2.0 + version: 5.2.0(vite@7.3.6(@types/node@20.19.43)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.0)) drizzle-orm: - specifier: ^0.44.0 - version: 0.44.7(@electric-sql/pglite@0.3.15)(@prisma/client@7.5.0(prisma@7.5.0(@types/react@19.2.14)(better-sqlite3@12.8.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.8.0)(mysql2@3.15.3)(pg@8.20.0)(postgres@3.4.7)(prisma@7.5.0(@types/react@19.2.14)(better-sqlite3@12.8.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)) + specifier: ^0.45.2 + version: 0.45.2(@electric-sql/pglite@0.4.3)(@prisma/client@7.10.0(prisma@7.10.0(@types/node@20.19.43)(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(better-sqlite3@12.11.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.23.1)(better-sqlite3@12.11.1)(mysql2@3.24.3(@types/node@20.19.43))(pg@8.23.0)(postgres@3.4.7)(prisma@7.10.0(@types/node@20.19.43)(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(better-sqlite3@12.11.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.9.3)) eslint: - specifier: ^8.57.0 + specifier: ^8.57.1 version: 8.57.1 pg: - specifier: ^8.18.0 - version: 8.20.0 + specifier: ^8.23.0 + version: 8.23.0 prettier: - specifier: ^3.8.1 - version: 3.8.1 + specifier: ^3.9.6 + version: 3.9.6 prisma: - specifier: ^7.1.0 - version: 7.5.0(@types/react@19.2.14)(better-sqlite3@12.8.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + specifier: ^7.10.0 + version: 7.10.0(@types/node@20.19.43)(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(better-sqlite3@12.11.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.9.3) react: - specifier: ^19.2.4 - version: 19.2.4 + specifier: ^19.2.8 + version: 19.2.8 react-dom: - specifier: ^19.2.4 - version: 19.2.4(react@19.2.4) + specifier: ^19.2.8 + version: 19.2.8(react@19.2.8) react-router-dom: - specifier: ^7.2.0 - version: 7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + specifier: ^7.18.3 + version: 7.18.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) superjson: specifier: ^1.13.3 version: 1.13.3 tsup: - specifier: ^8.3.5 - version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3) + specifier: ^8.5.1 + version: 8.5.1(jiti@2.7.0)(postcss@8.5.28)(tsx@4.23.13)(typescript@5.9.3)(yaml@2.9.0) tsx: - specifier: ^4.21.0 - version: 4.21.0 + specifier: ^4.23.13 + version: 4.23.13 typescript: specifier: 5.9.3 version: 5.9.3 vite: - specifier: ^7.3.1 - version: 7.3.1(@types/node@20.19.37)(jiti@2.6.1)(tsx@4.21.0) + specifier: ^7.3.6 + version: 7.3.6(@types/node@20.19.43)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.0) vitest: - specifier: ^4.1.0 - version: 4.1.0(@types/node@20.19.37)(vite@7.3.1(@types/node@20.19.37)(jiti@2.6.1)(tsx@4.21.0)) + specifier: ^4.1.11 + version: 4.1.11(@types/node@20.19.43)(vite@7.3.6(@types/node@20.19.43)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.0)) zod: - specifier: 3.25.76 - version: 3.25.76 + specifier: ^4.3.6 + version: 4.5.4 packages/stack: dependencies: '@aws-sdk/client-ec2': - specifier: ^3.750.0 - version: 3.996.0 + specifier: ^3.1127.0 + version: 3.1127.0 '@aws-sdk/client-ec2-instance-connect': - specifier: ^3.1001.0 - version: 3.1001.0 + specifier: ^3.1127.0 + version: 3.1127.0 '@aws-sdk/client-ecr': - specifier: ^3.750.0 - version: 3.996.0 + specifier: ^3.1127.0 + version: 3.1127.0 '@aws-sdk/client-iam': - specifier: ^3.750.0 - version: 3.996.0 + specifier: ^3.1127.0 + version: 3.1127.0 '@aws-sdk/client-rds': - specifier: ^3.750.0 - version: 3.996.0 + specifier: ^3.1127.0 + version: 3.1127.0 '@aws-sdk/client-route-53': - specifier: ^3.1001.0 - version: 3.1001.0 + specifier: ^3.1127.0 + version: 3.1127.0 '@aws-sdk/client-s3': - specifier: ^3.750.0 - version: 3.996.0 + specifier: ^3.1127.0 + version: 3.1127.0 '@aws-sdk/client-ses': - specifier: ^3.750.0 - version: 3.996.0 + specifier: ^3.1127.0 + version: 3.1127.0 '@aws-sdk/client-sts': - specifier: ^3.750.0 - version: 3.996.0 + specifier: ^3.1127.0 + version: 3.1127.0 '@factiii/auth': specifier: workspace:^ version: link:../auth '@octokit/rest': - specifier: ^20.0.2 + specifier: ^20.1.2 version: 20.1.2 ansible-vault: specifier: ^1.3.0 @@ -186,11 +171,8 @@ importers: specifier: ^11.1.0 version: 11.1.0 js-yaml: - specifier: ^4.1.1 - version: 4.1.1 - libsodium-wrappers: - specifier: ^0.7.11 - version: 0.7.15 + specifier: ^4.3.2 + version: 4.3.2 devDependencies: '@types/jest': specifier: ^30.0.0 @@ -199,295 +181,192 @@ importers: specifier: ^4.0.9 version: 4.0.9 '@types/node': - specifier: ^25.0.3 - version: 25.0.3 + specifier: ^25.9.5 + version: 25.9.5 jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@25.0.3)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3)) + specifier: ^30.5.1 + version: 30.5.1(@types/node@25.9.5)(ts-node@10.9.2(@types/node@25.9.5)(typescript@5.9.3)) ts-jest: - specifier: ^29.4.6 - version: 29.4.6(@babel/core@7.29.0)(@jest/transform@29.7.0)(@jest/types@30.2.0)(babel-jest@29.7.0(@babel/core@7.29.0))(jest-util@30.2.0)(jest@29.7.0(@types/node@25.0.3)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3)))(typescript@5.9.3) - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@types/node@25.0.3)(typescript@5.9.3) + specifier: ^29.4.12 + version: 29.4.12(@babel/core@7.29.7)(@jest/transform@30.5.1)(@jest/types@30.5.1)(babel-jest@30.5.1(@babel/core@7.29.7))(jest-util@30.5.1)(jest@30.5.1(@types/node@25.9.5)(ts-node@10.9.2(@types/node@25.9.5)(typescript@5.9.3)))(typescript@5.9.3) typescript: specifier: ^5.9.3 version: 5.9.3 packages: - '@aws-crypto/crc32@5.2.0': - resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} - engines: {node: '>=16.0.0'} - - '@aws-crypto/crc32c@5.2.0': - resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==} - - '@aws-crypto/sha1-browser@5.2.0': - resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==} - - '@aws-crypto/sha256-browser@5.2.0': - resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} - - '@aws-crypto/sha256-js@5.2.0': - resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} - engines: {node: '>=16.0.0'} - - '@aws-crypto/supports-web-crypto@5.2.0': - resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} - - '@aws-crypto/util@5.2.0': - resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - - '@aws-sdk/client-ec2-instance-connect@3.1001.0': - resolution: {integrity: sha512-xB+oCkyU5nLVN+p/Sw8ogxFYvRh3Inp5Gu89UpgQuyiZpbx2NgECZquDIsmPD/QZ9dGsnOFoNkAzwD7hYNHZlQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/client-ec2@3.996.0': - resolution: {integrity: sha512-pFzPGwlkuZp/U/RcjxZZifogOfbhfifrBUZ3r6veHK7PZjX49h3d8BQlEFla7fR7dkS3zCz5q9Zq71ZfVF8kkg==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/client-ecr@3.996.0': - resolution: {integrity: sha512-CITsfAsEqGT6lA73anPZpI5q0pNk3rNDF+bG3+vZQsqY8PJwBTQCRO7F5T74XFTiBenYd5nei3V3UVL3oJrN2A==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/client-iam@3.996.0': - resolution: {integrity: sha512-YXC+eYVn/Nyg4rpqKKxve1fRWNle8yhzMhJqiJlGBTAfQqy1v+TnJY0y1nIZkzBwy4MonfpWXYoAbb1UUB1MKQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/client-rds@3.996.0': - resolution: {integrity: sha512-2bnLlh6eP//IcbJzHQvtmFXH4rIkhhn17Xc+DwlgQvhbJX9gRpKYt5punFrtvfFuLevIs1/5s6EKiYAvY/q+TQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/client-route-53@3.1001.0': - resolution: {integrity: sha512-jCyFEooFQdGalWpIXszvr8KcOA632qmaToNdqiicKbXpsbi4Jli9SOvRjeaQzO9qbpWahIbLvpjs8/wvrB4Byw==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/client-s3@3.996.0': - resolution: {integrity: sha512-BZsCeq8Sgqbm6xs8VfjyVVwhQZvxDR45P22dcbNNDFaGkkQ/TbJ5KxER19APR9aK+IC7l4KuLxInqeVab2DFfg==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/client-ses@3.996.0': - resolution: {integrity: sha512-zL9acI4eYexyQKJ5mxljifA3FuX3hhif7DJBXtsb3EgalXoTATcrwV1x171cwnsNoqVrgBmZjINZQk4N/QK0Ug==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/client-sts@3.996.0': - resolution: {integrity: sha512-bSglJsc6xFLIDK/GtZ+xshuNz3llQrmwVIx4+fGQe1PlsZSL3qLvM7/wGQeNiEbZ08fmjZc0KpqQudhYjmE4rA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/core@3.973.16': - resolution: {integrity: sha512-Nasoyb5K4jfvncTKQyA13q55xHoz9as01NVYP05B0Kzux/X5UhMn3qXsZDyWOSXkfSCAIrMBKmVVWbI0vUapdQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/crc64-nvme@3.972.0': - resolution: {integrity: sha512-ThlLhTqX68jvoIVv+pryOdb5coP1cX1/MaTbB9xkGDCbWbsqQcLqzPxuSoW1DCnAAIacmXCWpzUNOB9pv+xXQw==} + '@aws-sdk/checksums@3.1000.29': + resolution: {integrity: sha512-Dtu0gr4dnATZAPwEYbpCsG+MpLM7OAliy2gTepEFQwl1vZ6DL3QMH2FveMa3HLvPsOdhJsPRB3KtxVhph9T75A==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-env@3.972.14': - resolution: {integrity: sha512-PvnBY9rwBuLh9MEsAng28DG+WKl+txerKgf4BU9IPAqYI7FBIo1x6q/utLf4KLyQYgSy1TLQnbQuXx5xfBGASg==} + '@aws-sdk/client-ec2-instance-connect@3.1127.0': + resolution: {integrity: sha512-EpBuOmepIffcFeWnQZswVrVDf0WdAk3JGjL4DxRPDmLsptdOFSVpoaQCy4xOqAy1TmakRIFCSAek11KWnLNe9g==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-http@3.972.16': - resolution: {integrity: sha512-m/QAcvw5OahqGPjeAnKtgfWgjLxeWOYj7JSmxKK6PLyKp2S/t2TAHI6EELEzXnIz28RMgbQLukJkVAqPASVAGQ==} + '@aws-sdk/client-ec2@3.1127.0': + resolution: {integrity: sha512-J5ejeB6p5eCvHaJoBjVWPeFHsOn6TeDd6QxLlfnFYJvDvBXijnqNX7PYR6NjaSr1ApNCvhFOAxOROESZCZzGqg==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-ini@3.972.14': - resolution: {integrity: sha512-EGA7ufqNpZKZcD0RwM6gRDEQgwAf19wQ99R1ptdWYDJAnpcMcWiFyT0RIrgiZFLD28CwJmYjnra75hChnEveWA==} + '@aws-sdk/client-ecr@3.1127.0': + resolution: {integrity: sha512-37DvZh4jLVbotCdJnR30lzA/1t4NmXOrfLjECbN8ZmDxNulYwClhs59EmDw9QRqbBdHleasZUzup+5yJnHNNxQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-login@3.972.14': - resolution: {integrity: sha512-P2kujQHAoV7irCTv6EGyReKFofkHCjIK+F0ZYf5UxeLeecrCwtrDkHoO2Vjsv/eRUumaKblD8czuk3CLlzwGDw==} + '@aws-sdk/client-iam@3.1127.0': + resolution: {integrity: sha512-7pJzUCAB1pvFMbv4+tw7feJvKQ+cOYYxFmD46ikvwPvcBX9mTDcRzlE7FF89+Gf5zFjufhyYbuiDJhP0y+97nA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-node@3.972.15': - resolution: {integrity: sha512-59NBJgTcQ2FC94T+SWkN5UQgViFtrLnkswSKhG5xbjPAotOXnkEF2Bf0bfUV1F3VaXzqAPZJoZ3bpg4rr8XD5Q==} + '@aws-sdk/client-rds@3.1127.0': + resolution: {integrity: sha512-7x4nqoOJDX+JipnbU/GD0UbFfTo2iT/t87b9kk15Md+xM+64DMC3yd9TlUnFei5qKKKYAiRe678wqmb4i71elA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-process@3.972.14': - resolution: {integrity: sha512-KAF5LBkJInUPaR9dJDw8LqmbPDRTLyXyRoWVGcJQ+DcN9rxVKBRzAK+O4dTIvQtQ7xaIDZ2kY7zUmDlz6CCXdw==} + '@aws-sdk/client-route-53@3.1127.0': + resolution: {integrity: sha512-+nW9MB43aTRLf4hZ+TLtySfdA2rk/biK5rYl0EWQrQhiUzhcCUDmElLocRoxlMM+54vF1lDubpNHIjy9JFE9pQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-sso@3.972.14': - resolution: {integrity: sha512-LQzIYrNABnZzkyuIguFa3VVOox9UxPpRW6PL+QYtRHaGl1Ux/+Zi54tAVK31VdeBKPKU3cxqeu8dbOgNqy+naw==} + '@aws-sdk/client-s3@3.1127.0': + resolution: {integrity: sha512-0ZSAgmEda33xPqVPt+bx2KzrXV1cUCKRRVPGliLu+V7DzHPa04CqPSi1maGEM4O0LDP0iI6HRSW5ULloNwayNw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-web-identity@3.972.14': - resolution: {integrity: sha512-rOwB3vXHHHnGvAOjTgQETxVAsWjgF61XlbGd/ulvYo7EpdXs8cbIHE3PGih9tTj/65ZOegSqZGFqLaKntaI9Kw==} + '@aws-sdk/client-ses@3.1127.0': + resolution: {integrity: sha512-cCSZDJVb3lK5tadS5OKsI1XGmMeIOyDe1UNOg4q2WTxH+WWP8qjYdJTNCd3fy8nE7Ubgg1Z2lMUL4aIpM679/g==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-bucket-endpoint@3.972.3': - resolution: {integrity: sha512-fmbgWYirF67YF1GfD7cg5N6HHQ96EyRNx/rDIrTF277/zTWVuPI2qS/ZHgofwR1NZPe/NWvoppflQY01LrbVLg==} + '@aws-sdk/client-sts@3.1127.0': + resolution: {integrity: sha512-arSFXe4+sfkKrULGB+mGLpQ4/PddJhjrZTolSOaN6j94vb4S/JoKEQhtS0jLb136KjOF/lNKvWC+tahwBqp+Fw==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-expect-continue@3.972.3': - resolution: {integrity: sha512-4msC33RZsXQpUKR5QR4HnvBSNCPLGHmB55oDiROqqgyOc+TOfVu2xgi5goA7ms6MdZLeEh2905UfWMnMMF4mRg==} + '@aws-sdk/core@3.977.9': + resolution: {integrity: sha512-reqPFEQrZxDZpeGj4PFMepBeR5LGYHRqq/L0motTzgFkCRBA4rFdaVXDSLYyGHhxVz7sT2PDnPN9CluGSfgyJA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.972.10': - resolution: {integrity: sha512-7e6NIL+lay71PdKmkCeSJPQ6xkmc170Kc1wynoulh9iBEpu2jnVIL4zJ95pjvOg+njS6Og7Bmw2fiKCuXzPGrw==} + '@aws-sdk/credential-provider-env@3.972.70': + resolution: {integrity: sha512-H404B7dJl2mCrBqahDEYsanB0xhdDp6tXnXcTUnXmmpy2Q3J0Ho0bUajZ2jr/RdwzCyS59Gi8xXIFwPLGBl6Uw==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-host-header@3.972.6': - resolution: {integrity: sha512-5XHwjPH1lHB+1q4bfC7T8Z5zZrZXfaLcjSMwTd1HPSPrCmPFMbg3UQ5vgNWcVj0xoX4HWqTGkSf2byrjlnRg5w==} + '@aws-sdk/credential-provider-http@3.972.72': + resolution: {integrity: sha512-X98zYOrVOeuosCX+6ktf29FC2N2GHPLia7qv6mzPzTc+RPAuHWCDS++Z6JK7eGYqb/v6uaW7bAXaOvDBfol+0w==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-location-constraint@3.972.3': - resolution: {integrity: sha512-nIg64CVrsXp67vbK0U1/Is8rik3huS3QkRHn2DRDx4NldrEFMgdkZGI/+cZMKD9k4YOS110Dfu21KZLHrFA/1g==} + '@aws-sdk/credential-provider-ini@3.973.15': + resolution: {integrity: sha512-Rykg6s5ceBuynMOGWgoowO4N+27JfnqXAnVaSunZl0hOO1XodSrxGNz6sCEbnmS0lAfQZDKyb3fbr46gSuv6Sg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-logger@3.972.6': - resolution: {integrity: sha512-iFnaMFMQdljAPrvsCVKYltPt2j40LQqukAbXvW7v0aL5I+1GO7bZ/W8m12WxW3gwyK5p5u1WlHg8TSAizC5cZw==} + '@aws-sdk/credential-provider-login@3.972.77': + resolution: {integrity: sha512-Jb59xfEISoN5mmbnA+HYqdtrSX3CgCtJoof+V5D8/TgUI56W63GEEd5Y58WijU3Ou6+WEgaLD1feVzaRXV5IDQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-recursion-detection@3.972.6': - resolution: {integrity: sha512-dY4v3of5EEMvik6+UDwQ96KfUFDk8m1oZDdkSc5lwi4o7rFrjnv0A+yTV+gu230iybQZnKgDLg/rt2P3H+Vscw==} + '@aws-sdk/credential-provider-node@3.972.82': + resolution: {integrity: sha512-znDkEOGXB8W3kG1LJUKP3foBZY/9qLM0eil/DxWXSp37XsdsRLQHE/d/OaCGGVgKpA6znR38h/+INk8do1FjiA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-sdk-ec2@3.972.8': - resolution: {integrity: sha512-wedzfuOKyQTj6iYM2Q3Vqop5ZLFriGzMHXM755gTcF/kZJlJ7OaTlNah70v1SdPBCXzZdT0oGRrXZNOJfe7EMA==} + '@aws-sdk/credential-provider-process@3.972.70': + resolution: {integrity: sha512-2ry03fGRJr4sV3jI+ocjj5JqALnFD6ymM5KiNCDZMvq8bX2GSbE0vji4aM43TVCl2nXqqLRZaUxdq/KeWRAY4Q==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-sdk-rds@3.972.8': - resolution: {integrity: sha512-QX90KpLOepMRHp3QyvoG2eJ4ozPSly3PMmetZi7jkMHoQXxB0oyqxC8d/yKjiQ6RqVM3lceZdJxNKQK8vsh9jg==} + '@aws-sdk/credential-provider-sso@3.973.14': + resolution: {integrity: sha512-jkhg/8ocAAoc0RFyLMhCw+/zZh7gystQgd4F4hznNa8P4Cc501PQmxd+jGLiMHodPJ+7Zv/3znM62gZojyasmA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-sdk-route53@3.972.8': - resolution: {integrity: sha512-cvN2cRJG+Lcs/msjZJJMkF3X9J1Ngm1IAISYTVfVmi2Hfrxp8Af3qaVK6eETIh0hCppt8RJiZgc0ue/Rd6YeMw==} + '@aws-sdk/credential-provider-web-identity@3.972.76': + resolution: {integrity: sha512-d3AGyVu759PGr35mEB2s22xxlNEA5rpdxtSPJthfPFJvoQ8dt357iVPECqWfUxXp1toJAvKmbtcIYVGigaGsCA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-sdk-s3@3.972.12': - resolution: {integrity: sha512-knUtPDxuaFDV7/vhKpzuhF1z8rs7ZZoGXPhu6pet/FmRNgi+vsHjO61mhiAH5ygbId7Nk0sM3G1wxUfSVt0QFA==} + '@aws-sdk/middleware-sdk-ec2@3.972.58': + resolution: {integrity: sha512-k1yW3bEUcy/e9oxIH0zT81sbPCqgERdNf0bOsBZg/tXP75tyEKp8kp8BG9xag64+u9fF8064fLDUdIItWgQxWw==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-ssec@3.972.3': - resolution: {integrity: sha512-dU6kDuULN3o3jEHcjm0c4zWJlY1zWVkjG9NPe9qxYLLpcbdj5kRYBS2DdWYD+1B9f910DezRuws7xDEqKkHQIg==} + '@aws-sdk/middleware-sdk-rds@3.972.58': + resolution: {integrity: sha512-dguHSEXkn8VM+HKpa+f4pfCmoRgUOAIkoktpIc7GRkQJa7Xx0UUyHk6BnH3xV/TujnvV1+1tmBmTlBVMOEnZMw==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-user-agent@3.972.16': - resolution: {integrity: sha512-AmVxtxn8ZkNJbuPu3KKfW9IkJgTgcEtgSwbo0NVcAb31iGvLgHXj2nbbyrUDfh2fx8otXmqL+qw1lRaTi+V3vA==} + '@aws-sdk/middleware-sdk-route53@3.972.26': + resolution: {integrity: sha512-XFUh38GzLnt33fxZcWfdcpUz7gsV7WJVtFA41IDrocSefDjKq/rjsvjwOhX/WTXBDDQlMS7bKav7E7SHEfIPQQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/nested-clients@3.996.4': - resolution: {integrity: sha512-NowB1HfOnWC4kwZOnTg8E8rSL0U+RSjSa++UtEV4ipoH6JOjMLnHyGilqwl+Pe1f0Al6v9yMkSJ/8Ot0f578CQ==} + '@aws-sdk/middleware-sdk-s3@3.972.75': + resolution: {integrity: sha512-wMIsNumRVKaNMKhvU/s9VrdEwE8S6gSzXp4RygFG5BEMnGkkXf8cjh8zf7cKJBpUDpqTWqwbz5isEgp9rH6Lng==} engines: {node: '>=20.0.0'} - '@aws-sdk/region-config-resolver@3.972.6': - resolution: {integrity: sha512-Aa5PusHLXAqLTX1UKDvI3pHQJtIsF7Q+3turCHqfz/1F61/zDMWfbTC8evjhrrYVAtz9Vsv3SJ/waSUeu7B6gw==} + '@aws-sdk/nested-clients@3.997.44': + resolution: {integrity: sha512-NhEgryjlBF9w38ZXqGymQV28IhkYa1mKhlbYnqIis57AYwWGVYfUPgg/qC2rLRqOUfblxx++irvju10kVTa8Vw==} engines: {node: '>=20.0.0'} - '@aws-sdk/signature-v4-multi-region@3.996.0': - resolution: {integrity: sha512-CLSrCdBoyIXSthaUcDzKw3fzRNbbyA/BawEMQBxsybYTZhGeC9P9p2DXuqTqVvla+PtEXBgRq0/Sgz2fEOBKyg==} + '@aws-sdk/signature-v4-multi-region@3.996.46': + resolution: {integrity: sha512-L+2xZTye/2T96f3lwCws0Zw6GG2JHZW9e8FpVgGBeeExSKyeoZ6CWRpBml/7DNiK/O26jrgPM9F+Ay8VkgzUWQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.1001.0': - resolution: {integrity: sha512-09XAq/uIYgeZhohuGRrR/R+ek3+ljFNdzWCXdqb9rlIERDjSfNiLjTtpHgSK1xTPmC5G4yWoEAyMfTXiggS6wA==} + '@aws-sdk/token-providers@3.1116.0': + resolution: {integrity: sha512-ygIivKqh8aHzNkucOCXHyIBgBpLPfrSI0mCqXF+vLBsPTUKqj0VSqAY0GFPe7lQl4HntjOcQ+KSyS7oUV2C54Q==} engines: {node: '>=20.0.0'} - '@aws-sdk/types@3.973.4': - resolution: {integrity: sha512-RW60aH26Bsc016Y9B98hC0Plx6fK5P2v/iQYwMzrSjiDh1qRMUCP6KrXHYEHe3uFvKiOC93Z9zk4BJsUi6Tj1Q==} + '@aws-sdk/types@3.974.5': + resolution: {integrity: sha512-LkwLL2BLbC6wNNm4JaH9mbEqBMdOZCct6VAYqhdN4U1xrWM+fUJQEfbHwQgDypapOWTRtlk25akb5afM0P8CIQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-arn-parser@3.972.2': - resolution: {integrity: sha512-VkykWbqMjlSgBFDyrY3nOSqupMc6ivXuGmvci6Q3NnLq5kC+mKQe2QBZ4nrWRE/jqOxeFP2uYzLtwncYYcvQDg==} + '@aws-sdk/xml-builder@3.972.40': + resolution: {integrity: sha512-wlFmCIGUlwF4zx/kncw+bmxTQh1HeSJq4mYV/V5cZUSJadDP3kXvGW8Rn21cimj/7y9ju+47oYWXi97vF7czaA==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-endpoints@3.996.0': - resolution: {integrity: sha512-EhSBGWSGQ6Jcbt6jRyX1/0EV7rf+6RGbIIskN0MTtHk0k8uj5FAa1FZhLf+1ETfnDTy/BT39t5IUOQiZL5X1jQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/util-endpoints@3.996.3': - resolution: {integrity: sha512-yWIQSNiCjykLL+ezN5A+DfBb1gfXTytBxm57e64lYmwxDHNmInYHRJYYRAGWG1o77vKEiWaw4ui28e3yb1k5aQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/util-format-url@3.972.3': - resolution: {integrity: sha512-n7F2ycckcKFXa01vAsT/SJdjFHfKH9s96QHcs5gn8AaaigASICeME8WdUL9uBp8XV/OVwEt8+6gzn6KFUgQa8g==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/util-locate-window@3.965.4': - resolution: {integrity: sha512-H1onv5SkgPBK2P6JR2MjGgbOnttoNzSPIRoeZTNPZYyaplwGg50zS3amXvXqF0/qfXpWEC9rLWU564QTB9bSog==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/util-user-agent-browser@3.972.6': - resolution: {integrity: sha512-Fwr/llD6GOrFgQnKaI2glhohdGuBDfHfora6iG9qsBBBR8xv1SdCSwbtf5CWlUdCw5X7g76G/9Hf0Inh0EmoxA==} - - '@aws-sdk/util-user-agent-node@3.973.1': - resolution: {integrity: sha512-kmgbDqT7aCBEVrqESM2JUjbf0zhDUQ7wnt3q1RuVS+3mglrcfVb2bwkbmf38npOyyPGtQPV5dWN3m+sSFAVAgQ==} - engines: {node: '>=20.0.0'} - peerDependencies: - aws-crt: '>=1.0.0' - peerDependenciesMeta: - aws-crt: - optional: true - - '@aws-sdk/xml-builder@3.972.9': - resolution: {integrity: sha512-ItnlMgSqkPrUfJs7EsvU/01zw5UeIb2tNPhD09LBLHbg+g+HDiKibSLwpkuz/ZIlz4F2IMn+5XgE4AK/pfPuog==} - engines: {node: '>=20.0.0'} - - '@aws/lambda-invoke-store@0.2.3': - resolution: {integrity: sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==} + '@aws/lambda-invoke-store@0.3.0': + resolution: {integrity: sha512-sl4Bm6yiMNYrZKkqqDFWN0UfnWhlS8ivKxrYl+6t0gCLrqr8y3B2IqZZbFRkfaVVp7C/baApyh71P+LeE1A2sQ==} engines: {node: '>=18.0.0'} - '@babel/code-frame@7.29.0': - resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + '@babel/code-frame@7.29.7': + resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.29.0': - resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} + '@babel/compat-data@7.29.7': + resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} engines: {node: '>=6.9.0'} - '@babel/core@7.29.0': - resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} + '@babel/core@7.29.7': + resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} engines: {node: '>=6.9.0'} - '@babel/generator@7.29.1': - resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + '@babel/generator@7.29.8': + resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.28.6': - resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + '@babel/helper-compilation-targets@7.29.7': + resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} engines: {node: '>=6.9.0'} - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + '@babel/helper-globals@7.29.7': + resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.28.6': - resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + '@babel/helper-module-imports@7.29.7': + resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.28.6': - resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + '@babel/helper-module-transforms@7.29.7': + resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-plugin-utils@7.27.1': - resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + '@babel/helper-plugin-utils@7.29.7': + resolution: {integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + '@babel/helper-validator-option@7.29.7': + resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.29.2': - resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} + '@babel/helpers@7.29.7': + resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.5': - resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/parser@7.29.2': - resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} + '@babel/parser@7.29.8': + resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==} engines: {node: '>=6.0.0'} hasBin: true @@ -512,8 +391,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.27.1': - resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + '@babel/plugin-syntax-import-attributes@7.29.7': + resolution: {integrity: sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -528,8 +407,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.27.1': - resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + '@babel/plugin-syntax-jsx@7.29.7': + resolution: {integrity: sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -576,290 +455,293 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.27.1': - resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + '@babel/plugin-syntax-typescript@7.29.7': + resolution: {integrity: sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-self@7.27.1': - resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + '@babel/plugin-transform-react-jsx-self@7.29.7': + resolution: {integrity: sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.27.1': - resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + '@babel/plugin-transform-react-jsx-source@7.29.7': + resolution: {integrity: sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.29.2': - resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.28.6': - resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.29.0': - resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + '@babel/template@7.29.7': + resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.5': - resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + '@babel/traverse@7.29.8': + resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==} engines: {node: '>=6.9.0'} - '@babel/types@7.29.0': - resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@changesets/apply-release-plan@7.1.0': - resolution: {integrity: sha512-yq8ML3YS7koKQ/9bk1PqO0HMzApIFNwjlwCnwFEXMzNe8NpzeeYYKCmnhWJGkN8g7E51MnWaSbqRcTcdIxUgnQ==} + '@changesets/apply-release-plan@8.1.0': + resolution: {integrity: sha512-M93HOGyX3ssg6He3b5NotaHtQVu6uajHS6UIQ28xKt2RzskCy73ayX4I914qBKjTJmrE4YFlELQjfcqxbmGLJw==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/assemble-release-plan@6.0.9': - resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} + '@changesets/assemble-release-plan@7.0.0': + resolution: {integrity: sha512-oEW8BxdA604kGGtDSCiHr5w9Tv4UWe9I2k61IBNZzCOE1kbYaJj4v+lFQNgcEZFkUc2pV/+hASErGDvpJOZCTg==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/changelog-git@0.2.1': - resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} + '@changesets/changelog-git@1.0.0': + resolution: {integrity: sha512-3Dst2Ime2Op5nd4XmWJLPIgp11ZFqJqSkVug9izK6TDcIV4YlhPS4ECbEVR+eGI0bk0r1ItogD4j2Oli87bJrA==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/cli@2.30.0': - resolution: {integrity: sha512-5D3Nk2JPqMI1wK25pEymeWRSlSMdo5QOGlyfrKg0AOufrUcjEE3RQgaCpHoBiM31CSNrtSgdJ0U6zL1rLDDfBA==} + '@changesets/cli@3.0.2': + resolution: {integrity: sha512-t/omGJj/I+Jv0kmJAkj5cstYEdUQiJnpip2F+2m3F4lQ3kAZ3o8Exep4/Fm1qq4rvw6ovlhJvZNrKdwLJ4lkuQ==} + engines: {node: ^22.11 || ^24 || >=26, npm: '>=10.9.0', pnpm: '>=10.0.0', yarn: '>=4.5.2'} hasBin: true - '@changesets/config@3.1.3': - resolution: {integrity: sha512-vnXjcey8YgBn2L1OPWd3ORs0bGC4LoYcK/ubpgvzNVr53JXV5GiTVj7fWdMRsoKUH7hhhMAQnsJUqLr21EncNw==} - - '@changesets/errors@0.2.0': - resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + '@changesets/config@4.0.0': + resolution: {integrity: sha512-mw95/YrkOuhZZxfnVAA4bSXOFUi+KlhzOBTM8C4x777NhUU6HWIl9Z+K+nME+E4PVsv5NQVQwTfiHihAS1A/ow==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/get-dependents-graph@2.1.3': - resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} + '@changesets/errors@1.0.0': + resolution: {integrity: sha512-ElN/mEzn6zmETgjwf5MclCMa9ef59sAR0lfO8VSYIsiRvbC2FbLB/92EoYw10Sl0kGixxHFiJZUSv7dA+YpR8g==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/get-release-plan@4.0.15': - resolution: {integrity: sha512-Q04ZaRPuEVZtA+auOYgFaVQQSA98dXiVe/yFaZfY7hoSmQICHGvP0TF4u3EDNHWmmCS4ekA/XSpKlSM2PyTS2g==} + '@changesets/format@0.1.2': + resolution: {integrity: sha512-Caez5XtNXCFS/G5bwyav3wuXL0tMxVd2ZGbaumWbzN08tyzO21asCw7JZhNtVsAZDCvDRUzZN+Iit9SyRITSYA==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/get-version-range-type@0.4.0': - resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + '@changesets/get-dependents-graph@3.0.0': + resolution: {integrity: sha512-ji/t5wFA1zREKXRUePE6Qi+Qu2UgxCeSSGQrphezwvQZrp49B7sJ+8+wvM0tA7zPeSxYKCojDy3WWgrl+s+awg==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/git@3.0.4': - resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} + '@changesets/git@4.0.1': + resolution: {integrity: sha512-6vWpIAC4LkpmlqaIu37ViT5enyd9+uBwAiGqCGhASvkSHBgx4PrtTGXWTMFYpDmZbjgyonyVgMciPrW4MqtJsA==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/logger@0.1.1': - resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} + '@changesets/parse@1.0.0': + resolution: {integrity: sha512-P0iaMb9p9CRYZiTgAllEIF9AUMQHIy1G72tKlcIqJp61icZSsKQNiOPdxAMZG8m/DvZwt/oz5xEbTpike//dWg==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/parse@0.4.3': - resolution: {integrity: sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A==} + '@changesets/pre@3.0.0': + resolution: {integrity: sha512-Zm/6YliV/a2oeWTqHJf6KxLrQwgcK1i/BRDl2m0EKZvbnxV5fG9QRhwJJGshjsZTUTS6dkfURQ2K6aAvgNw/3Q==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/pre@2.0.2': - resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} + '@changesets/read@1.0.1': + resolution: {integrity: sha512-nzvSC6RcTiWf/dsuwZFXpLzGGsRHYCL68U3uHV7srsulU93aVWY7u2GEJiDZ+4GIIElfaW5EqtKC0UHroY+LTQ==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/read@0.6.7': - resolution: {integrity: sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA==} + '@changesets/should-skip-package@1.0.0': + resolution: {integrity: sha512-pwqoJmbONn1XgXmZXPEExgAaT+HdZLjALFTDgIm+PnS5KeO2nLtzA2/Q+4aMFY14kFMuXKG30MObhvDzWgzDgg==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/should-skip-package@0.1.2': - resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} + '@changesets/types@7.0.0': + resolution: {integrity: sha512-c5GoiQyt3pxiXjrWSNoP8/GRf4kG+VnKzovx1OQM8dYYALlSwgedmkPmJ+ZqGxqwg9D3Bkj85Uo4KLd5BN3A0w==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/types@4.1.0': - resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + '@changesets/write@1.0.1': + resolution: {integrity: sha512-q/ThtP9gcnEP6xlv7LrY26C2mHqdGBti/MmOVngt/M/oIGYkssmQGxPK9WzBNt2juVcH/vml2WQ+ra8LXYOTaA==} + engines: {node: ^22.11 || ^24 || >=26} - '@changesets/types@6.1.0': - resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} + '@clack/core@1.4.3': + resolution: {integrity: sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ==} + engines: {node: '>= 20.12.0'} - '@changesets/write@0.4.0': - resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} - - '@chevrotain/cst-dts-gen@10.5.0': - resolution: {integrity: sha512-lhmC/FyqQ2o7pGK4Om+hzuDrm9rhFYIJ/AXoQBeongmn870Xeb0L6oGEiuR8nohFNL5sMaQEJWCxr1oIVIVXrw==} - - '@chevrotain/gast@10.5.0': - resolution: {integrity: sha512-pXdMJ9XeDAbgOWKuD1Fldz4ieCs6+nLNmyVhe2gZVqoO7v8HXuHYs5OV2EzUtbuai37TlOAQHrTDvxMnvMJz3A==} - - '@chevrotain/types@10.5.0': - resolution: {integrity: sha512-f1MAia0x/pAVPWH/T73BJVyO2XU5tI4/iE7cnxb7tqdNTNhQI3Uq3XkqcoteTmD4t1aM0LbHCJOhgIDn07kl2A==} - - '@chevrotain/utils@10.5.0': - resolution: {integrity: sha512-hBzuU5+JjB2cqNZyszkDHZgOSrUUT8V3dhgRl8Q9Gp6dAj/H5+KILGjbhDpc3Iy9qmqlm/akuOI2ut9VUtzJxQ==} + '@clack/prompts@1.7.0': + resolution: {integrity: sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==} + engines: {node: '>= 20.12.0'} '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@electric-sql/pglite-socket@0.0.20': - resolution: {integrity: sha512-J5nLGsicnD9wJHnno9r+DGxfcZWh+YJMCe0q/aCgtG6XOm9Z7fKeite8IZSNXgZeGltSigM9U/vAWZQWdgcSFg==} + '@electric-sql/pglite-socket@0.1.3': + resolution: {integrity: sha512-LAciWM0M1dCL8hlsxu2venbVZcdxema0BtDfpWYVqr+Y468UADw0pFWidhKw1M8sfJ8rdLT71tjMmnirf/IZRQ==} hasBin: true peerDependencies: - '@electric-sql/pglite': 0.3.15 + '@electric-sql/pglite': 0.4.3 - '@electric-sql/pglite-tools@0.2.20': - resolution: {integrity: sha512-BK50ZnYa3IG7ztXhtgYf0Q7zijV32Iw1cYS8C+ThdQlwx12V5VZ9KRJ42y82Hyb4PkTxZQklVQA9JHyUlex33A==} + '@electric-sql/pglite-tools@0.3.3': + resolution: {integrity: sha512-AlzLJTRJ8+UFgK8CmxIpyIpJ0+YaFw02IiOSdYrqxwPXdSyeIShz8aa9Tq+tYFXdPwcaMp/Fc80mQZ1dkOQ/wg==} peerDependencies: - '@electric-sql/pglite': 0.3.15 + '@electric-sql/pglite': 0.4.3 - '@electric-sql/pglite@0.3.15': - resolution: {integrity: sha512-Cj++n1Mekf9ETfdc16TlDi+cDDQF0W7EcbyRHYOAeZdsAe8M/FJg18itDTSwyHfar2WIezawM9o0EKaRGVKygQ==} + '@electric-sql/pglite@0.4.3': + resolution: {integrity: sha512-ichuWTgtd4mOM1G4SpyGJa5trT03lWbMypDV0fUXUCXg5hiHqVAz/bZyV68NqmkLB7WcYmj1RMJVSp8HV/v/ZQ==} - '@esbuild/aix-ppc64@0.27.4': - resolution: {integrity: sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==} + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.27.4': - resolution: {integrity: sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==} + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.27.4': - resolution: {integrity: sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==} + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.27.4': - resolution: {integrity: sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==} + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.27.4': - resolution: {integrity: sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==} + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.27.4': - resolution: {integrity: sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==} + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.27.4': - resolution: {integrity: sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==} + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.4': - resolution: {integrity: sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==} + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.27.4': - resolution: {integrity: sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==} + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.27.4': - resolution: {integrity: sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==} + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.27.4': - resolution: {integrity: sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==} + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.27.4': - resolution: {integrity: sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==} + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.27.4': - resolution: {integrity: sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==} + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.27.4': - resolution: {integrity: sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==} + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.27.4': - resolution: {integrity: sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==} + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.27.4': - resolution: {integrity: sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==} + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.27.4': - resolution: {integrity: sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==} + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.27.4': - resolution: {integrity: sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==} + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.4': - resolution: {integrity: sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==} + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.27.4': - resolution: {integrity: sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==} + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.4': - resolution: {integrity: sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==} + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.27.4': - resolution: {integrity: sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==} + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.27.4': - resolution: {integrity: sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==} + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.27.4': - resolution: {integrity: sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==} + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.27.4': - resolution: {integrity: sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==} + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.27.4': - resolution: {integrity: sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==} + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.9.1': - resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + '@eslint-community/eslint-utils@4.10.1': + resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -879,12 +761,6 @@ packages: '@hexagon/base64@1.1.28': resolution: {integrity: sha512-lhqDEAvWixy3bZ+UOYbPwUbBkwBq5C1LAJ/xPC8Oi+lL54oyakv/npbA0aU2hgCsx/1NUd4IBvV03+aUBWxerw==} - '@hono/node-server@1.19.11': - resolution: {integrity: sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==} - engines: {node: '>=18.14.1'} - peerDependencies: - hono: '>=4.12.7' - '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} @@ -898,111 +774,98 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead - '@inquirer/external-editor@1.0.3': - resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} - engines: {node: '>=18'} - peerDependencies: - '@types/node': '>=18' - peerDependenciesMeta: - '@types/node': - optional: true + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} '@istanbuljs/load-nyc-config@1.1.0': resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + '@istanbuljs/schema@0.1.6': + resolution: {integrity: sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==} engines: {node: '>=8'} - '@jest/console@29.7.0': - resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/console@30.5.1': + resolution: {integrity: sha512-u5Ncuc+gXVUwjNMFQOnphHo2Qx2DxyC8Dvpmf4HCx4y0kvSkRRNiQYRixrvOP4V7y52JcSuNxqochCt0PpdHVg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/core@29.7.0': - resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/core@30.5.1': + resolution: {integrity: sha512-BL9g6CJUUhIbdoAflz/Va658erSSXUIvU8XUYiWNTbZljJjZ5yaC9EJ9/dQ19rpbYV3ZOK4sBACqhPaTyhoUIA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: node-notifier: optional: true - '@jest/diff-sequences@30.0.1': - resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} + '@jest/diff-sequences@30.5.0': + resolution: {integrity: sha512-OsqBjHXCn8cadasoAZBP6nWYvMsRhpMzGXTpxJ5aO04NlbdhIz+FVe3q49l0AwVhsz/cEmIpBes6gAFl1/dWQg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/environment@29.7.0': - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/expect-utils@29.7.0': - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/environment@30.5.1': + resolution: {integrity: sha512-eYJAkOsrpwDXPcoLNEG6lN9Zo3Cy35pxnVQD74vyIfsi/Q8wB/lZFsEjU4wrecOgT4ZviQDZaX/cFIJyMdMxTw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/expect-utils@30.2.0': - resolution: {integrity: sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==} + '@jest/expect-utils@30.5.1': + resolution: {integrity: sha512-WcRWhHQdTMRDpyWKZ/6MINBmovI7zeD+bL8wFjCncRV3NQOwKy1X45IfyblfHR4k/XciIlNEdFL9QjFO+HNKOg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/expect@29.7.0': - resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/expect@30.5.1': + resolution: {integrity: sha512-uOGd40P/COyUp9xHf5jeGiGJC2/ANg+2+Tk9/xN5/LxmlY/r/gxsPrx3DTEtaRZsLAX4wgNSLEDELZ5bmVs2bA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/fake-timers@29.7.0': - resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/fake-timers@30.5.1': + resolution: {integrity: sha512-rEkV6YzpBXo/L9cnj2ibyuYZuyGiNWaPUsyCu3HYJbqCV4jnEiKmf7hId20z8eKjZ0JQ9jtIYKxRSmYB/OYSsA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/get-type@30.1.0': - resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==} + '@jest/get-type@30.5.0': + resolution: {integrity: sha512-9/2VUPitAjmBzbvDvqrxmvB7BzWsBW0WmkkojX1ODuxX1NLGxx9gfaZpHB0z8DtJ9uhGNmZG/VXBhf8uO0OV8Q==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/globals@29.7.0': - resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/globals@30.5.1': + resolution: {integrity: sha512-VhqvQ251XIC7pk46YymI3HCeBLOdvriDw9zibekodAHEwoVvbVVgpU5H13GvmyOAzxtZCfsm1uvzqkaqJf2I+g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/pattern@30.0.1': - resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==} + '@jest/pattern@30.5.0': + resolution: {integrity: sha512-HdNQYSdRTEBNrginaqzQtTjG0HRMfrra/z6Ok7uL3S87vSlarIVohEsJsSj5edu3MiHoHjAkvPROz5ZjoKai+w==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/reporters@29.7.0': - resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/reporters@30.5.1': + resolution: {integrity: sha512-RbUXIfv85KxitJn4l3MpAoMilkvXe2QCO5lXxHWftywo/VdZ5vkEoHRDgphcxP6qmoIkUaN8/UZj6NhdkIFdJg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: node-notifier: optional: true - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/schemas@30.0.5': - resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} + '@jest/schemas@30.5.0': + resolution: {integrity: sha512-/hunigyNpc4RCjC0VaW3f5RCUZVM2+WQ65qP7z083Gmvac7or2LI50XVNOtE4YPgBpV0yxYiAgorAPGniCoJmg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/source-map@29.6.3': - resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/snapshot-utils@30.5.1': + resolution: {integrity: sha512-V3wnxNtiVmw5PPVg433Cn3VdXnsOeu/ofLw3KC04Bn2y1wIlU5kozXQn48rhrgj/02LrCVtntTEF1yBha0XSUw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/test-result@29.7.0': - resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/source-map@30.5.0': + resolution: {integrity: sha512-xWpTJP9D0bDFGbPGT8XuWSwwha/iHADyyKzUnMx4UbdgnHugxrDaQFO4RZ8x4ZsFzRP6pNii8uvlgKCDxCIuDg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/test-sequencer@29.7.0': - resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/test-result@30.5.1': + resolution: {integrity: sha512-A/1S6ZBdpic50E0pxLgvaB9XNPL4k7AksmG69OO2oiotxciWZwHkbOec+qbIi+uUtIIByOVlXJUl97oZUsz+Jw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/transform@29.7.0': - resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/test-sequencer@30.5.1': + resolution: {integrity: sha512-SHcPnrjdVRYJv6y6l4JUTy4Jccu7zmO6BmiOfOA34UiVBto22s19WiDC0A/2qfM7MWB/qdcoqfSIRMitpjTT4A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/types@29.6.3': - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/transform@30.5.1': + resolution: {integrity: sha512-EDnDhn0jleU9ZhpVoA4gvqw+Ev0iw/r5upNT2b79RiwiaTiYAMMhvNJP3lmocjIe5J2ZkoNr0B3K/J6O5GIm4Q==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/types@30.2.0': - resolution: {integrity: sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==} + '@jest/types@30.5.1': + resolution: {integrity: sha512-LvVYn83nnXPl+Rg98nvcFgjx6nRMTArhSn6RAX/w3ELn54S8A42TYZvsCMdGUqTM8S0wyXbtlQdU6Hi6dykj9g==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jridgewell/gen-mapping@0.3.13': @@ -1015,8 +878,8 @@ packages: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} @@ -1027,15 +890,31 @@ packages: '@levischuck/tiny-cbor@0.2.11': resolution: {integrity: sha512-llBRm4dT4Z89aRsm6u2oEZ8tfwL/2l6BwpZ7JcyieouniDECM5AqNgr/y08zalEIvW3RSK4upYyybDcmjXqAow==} - '@manypkg/find-root@1.1.0': - resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + '@manypkg/find-root@3.1.0': + resolution: {integrity: sha512-BcSqCyKhBVZ5YkSzOiheMCV41kqAFptW6xGqYSTjkVTl9XQpr+pqHhwgGCOHQtjDCv7Is6EFyA14Sm5GVbVABA==} + engines: {node: '>=20.0.0'} - '@manypkg/get-packages@1.1.3': - resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@manypkg/get-packages@3.1.0': + resolution: {integrity: sha512-0TbBVyvPrP7xGYBI/cP8UP+yl/z+HtbTttAD7FMAJgn/kXOTwh5/60TsqP9ZYY710forNfyV0N8P/IE/ujGZJg==} + engines: {node: '>=20.0.0'} - '@mrleebo/prisma-ast@0.13.1': - resolution: {integrity: sha512-XyroGQXcHrZdvmrGJvsA9KNeOOgGMg1Vg9OlheUsBOSKznLMDl+YChxbkboRHvtFYJEMRYmlV3uoo/njCw05iw==} - engines: {node: '>=16'} + '@manypkg/tools@2.1.2': + resolution: {integrity: sha512-6QEf6yqFbETdwGITKq57aYoPfX/3K8XFNwsAlx0C1M7o8cb79sv1M3w+tWuWvIcSbNqrLF7OD7YpZMVVz335hQ==} + engines: {node: '>=20.0.0'} + + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} + engines: {node: ^22.20 || ^24.12 || >=25} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@napi-rs/wasm-runtime@1.2.3': + resolution: {integrity: sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} + peerDependencies: + '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4 + '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4 '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -1101,38 +980,131 @@ packages: '@octokit/types@13.10.0': resolution: {integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==} - '@peculiar/asn1-android@2.8.0': - resolution: {integrity: sha512-skLbS+IOGv1lUgDqtChr8xvtvEr3HMse/JGBaL2r1J1o/n7a8wqOrovMtlRq/UXLhxvmLaONP67hwtshgzwfzA==} + '@parcel/watcher-android-arm64@2.6.0': + resolution: {integrity: sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.6.0': + resolution: {integrity: sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.6.0': + resolution: {integrity: sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.6.0': + resolution: {integrity: sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.6.0': + resolution: {integrity: sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm-musl@2.6.0': + resolution: {integrity: sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-arm64-glibc@2.6.0': + resolution: {integrity: sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm64-musl@2.6.0': + resolution: {integrity: sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-x64-glibc@2.6.0': + resolution: {integrity: sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-x64-musl@2.6.0': + resolution: {integrity: sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@parcel/watcher-win32-arm64@2.6.0': + resolution: {integrity: sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-x64@2.6.0': + resolution: {integrity: sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.6.0': + resolution: {integrity: sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==} + engines: {node: '>= 10.0.0'} + + '@peculiar/asn1-android@2.9.4': + resolution: {integrity: sha512-SYHm4SoWSI0nRCoos6jpGusIqhPH9bbGBqv7ohlZ+H6BunrDzzQPk2ePgDuEUzV82OdvbLgtW4twUDwhU9P3YQ==} + engines: {node: '>=14'} - '@peculiar/asn1-cms@2.8.0': - resolution: {integrity: sha512-NgekZOrSJFSBFLFoLfwePguAWAx7z1+f2TEsWFUMyiqqfntZ4+S/S5hzqME3q4pCA0iOsFKdwiQ35dwY24eVqA==} + '@peculiar/asn1-cms@2.9.4': + resolution: {integrity: sha512-cben7oxmQsUGZqotus7yt0srYdncOT6RNWcTQ77T2RFOXejYVYkXadrfePdRcrVpO9K95IRLKKglG2k38jKXuw==} + engines: {node: '>=14'} - '@peculiar/asn1-csr@2.8.0': - resolution: {integrity: sha512-akbF8+uvleHs8sejNPQxwmVFuInAg6FMNHOwMILXfP518YfFJwdR3jr6oNUPOaEJfuEhn/vkNOCIT6ASUd4mbg==} + '@peculiar/asn1-csr@2.9.4': + resolution: {integrity: sha512-xd4YN4vpRjkDAQWVfZZkeu12IEND7DOpkqaHSIHxZl1uggUNa9Ju0QxY2jHvDAS9pP0zhRBytg8ifsnGo3V0jw==} + engines: {node: '>=14'} - '@peculiar/asn1-ecc@2.8.0': - resolution: {integrity: sha512-ohwlk+u9Rv2NOAY1c6MfHj45ATVF8R1DUN/WCgABiRtLi2ZftlZWZX7KvpAbU8v9xPcmoILfELeEABj/rn18AQ==} + '@peculiar/asn1-ecc@2.9.4': + resolution: {integrity: sha512-JJXefFshRAuVAjWQo/39bkg1ywc1VaiO44S8RRC+Ykvf/u2KDmYffoDb0ZBPCR5uJy4AGKQhl8mX+Q8ShcWaXQ==} + engines: {node: '>=14'} - '@peculiar/asn1-pfx@2.8.0': - resolution: {integrity: sha512-5yof1ytoB++RQtaFbqSUJ8pxDJtZT6vbVqZ8XoJ61ph7UjNVvfFwAilnCodqkNsAodpy13gDhoxZXw00pghnyg==} + '@peculiar/asn1-pfx@2.9.4': + resolution: {integrity: sha512-khuGzHTzNzk4GDlIBEILyIs6Lce0yn0ZBdoI9v93kmNncfZRhD+AQ5ODFqdhvoE8cMJF/JMTQ8yA+t1D14kqCw==} + engines: {node: '>=14'} - '@peculiar/asn1-pkcs8@2.8.0': - resolution: {integrity: sha512-qAKXtLpBEw9LqhKpjw3ajZSXlBur+ipW+y2ivVBQAG6F6qRx94yO+1ZR4mvw+YaCfKSaOzLeYEzsPaBp4SJELA==} + '@peculiar/asn1-pkcs8@2.9.4': + resolution: {integrity: sha512-duRdotlUx9eDZe6QrQpQKl61RbWykCHBCkKayP8V8XdEFwlKHZ8qGGDMyS6Pye7OX7nLFttTTpRkJeet78ckwQ==} + engines: {node: '>=14'} - '@peculiar/asn1-pkcs9@2.8.0': - resolution: {integrity: sha512-b5nDWCnkV60+cQ141D6sVVwK9nz64R5n3zSVnklGd+ECdkW2Ol3U1a6yYFlalpSOaD557yuJB64A+q42jG7lUQ==} + '@peculiar/asn1-pkcs9@2.9.4': + resolution: {integrity: sha512-kaL4cNxBpdQE2dKlyZBqz4ygCrwffO+8wfoxTEqM1Z8RadvCeELBRzcv0dzM8aY9azHMwODO5nxU65zXmhToOQ==} + engines: {node: '>=14'} - '@peculiar/asn1-rsa@2.8.0': - resolution: {integrity: sha512-zHEUlCqB2mk7x2lxDwHHJy7hWZOPdGHVlsmITWKB5/PbQo61atbu9PJ/0r9dQNMwFzbKPXZ8uK8/91eUhRznSg==} + '@peculiar/asn1-rsa@2.9.4': + resolution: {integrity: sha512-pZ96eD1PptovcWQ/GSmuNFXd/7EQJNlKfDaNCyE2rx3W0v6QFelkzquVqRSRyyDXXCYD69ZXJDzZ8GhIiQzKoA==} + engines: {node: '>=14'} - '@peculiar/asn1-schema@2.8.0': - resolution: {integrity: sha512-7YT0U/ze0tF2QOBbE15gKZwy5tvgGyLRiRHLzhlbOpf7BT032oBSd0haZqXn5W6l26WLlu3dyxzjM+2638/z2Q==} + '@peculiar/asn1-schema@2.9.4': + resolution: {integrity: sha512-GjzePcT9Iw8NzeOPf73iNS9xM+TBhd/FilAfP+RQGkTMQJTVWtytN3JHJACCjf/ABNau5S7mS3g+DcuxmRgYEg==} + engines: {node: '>=14'} - '@peculiar/asn1-x509-attr@2.8.0': - resolution: {integrity: sha512-tHjkfS/qhMnmrlB2J9NhflQlQ7In3khO3CfmVrriOlpTeErY9ZIKOso1hQ5JQiyrJ7ShvqVPk7E5fQmbclkSKA==} + '@peculiar/asn1-x509-attr@2.9.4': + resolution: {integrity: sha512-ehQXbpQaQYycgu8OrvigwSPTFfVRcu0ECNYCWw+yzBp02Lw5paRqzzhUpfOgO2K38+WfFZuEz/0RPtam5g0OMg==} + engines: {node: '>=14'} - '@peculiar/asn1-x509@2.8.0': - resolution: {integrity: sha512-N0CMuhWUzsWEVq6F1q9X6+VKUnWzSW+cSVg+aPaGGwDdbFoFWTYgin5MHwXgpWd6y9COMBxnfy/Qc+Xc7F0Zwg==} + '@peculiar/asn1-x509@2.9.4': + resolution: {integrity: sha512-CxhBo/RdEbMMob7T31ZdQjGuoyRFLVwrDzTn25bihzBasRg9kRm/0IxIPvhgQtcK/9dNcO1XQL2fuPugwELL0Q==} + engines: {node: '>=14'} '@peculiar/utils@2.0.3': resolution: {integrity: sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==} @@ -1141,22 +1113,31 @@ packages: resolution: {integrity: sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==} engines: {node: '>=20.0.0'} - '@playwright/test@1.58.2': - resolution: {integrity: sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==} - engines: {node: '>=18'} + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.3.6': + resolution: {integrity: sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==} + engines: {node: ^14.18.0 || >=16.0.0} + + '@playwright/test@1.62.1': + resolution: {integrity: sha512-DTcUc8qii+cpHvtOwggMtBRMjKZHXYWdw8syRYu2vtzuq4Wxphqq4NfCs5Zt44L6mA8rfDfj+PHnxFc/FeK6mQ==} + engines: {node: '>=20'} hasBin: true - '@prisma/adapter-better-sqlite3@7.5.0': - resolution: {integrity: sha512-ThP6y1cAZW/BdHuuTKzO+j8vzEzXDMZaDPmboJyrkdbJvO9LRiHdnG5LNKAht8YYwjHgQoq7G7NtKbaW7NebVQ==} + '@pnpm/deps.graph-sequencer@1100.0.1': + resolution: {integrity: sha512-pOr5+q1fLYKwFN3LAJuGZEnfXDcQ73zqgDHMtGy+K+uIoUqyY+6MeDCWFwfu+4EFuq76I5EPFofoNAI+Bmmq4A==} + engines: {node: '>=22.13'} - '@prisma/adapter-pg@7.5.0': - resolution: {integrity: sha512-EJx7OLULahcC3IjJgdx2qRDNCT+ToY2v66UkeETMCLhNOTgqVzRzYvOEphY7Zp0eHyzfkC33Edd/qqeadf9R4A==} + '@prisma/adapter-pg@7.10.0': + resolution: {integrity: sha512-N7nwSor0HO1Kz6xBv0TPAjAPysKK0fac6p4fVN3ensLOuzc/83Fgmln5k92eK/cvzqdkSR/2kkAqlbcdwVrwpw==} - '@prisma/client-runtime-utils@7.5.0': - resolution: {integrity: sha512-KnJ2b4Si/pcWEtK68uM+h0h1oh80CZt2suhLTVuLaSKg4n58Q9jBF/A42Kw6Ma+aThy1yAhfDeTC0JvEmeZnFQ==} + '@prisma/client-runtime-utils@7.10.0': + resolution: {integrity: sha512-cnCy7lUV8/CctgKVEmqAbSLAmwqJdE/qAlqTBk/0NDk59zEb2cZ0M0M0E4vVPnqbSEYudRroQDvOWfUZH6RIfw==} - '@prisma/client@7.5.0': - resolution: {integrity: sha512-h4hF9ctp+kSRs7ENHGsFQmHAgHcfkOCxbYt6Ti9Xi8x7D+kP4tTi9x51UKmiTH/OqdyJAO+8V+r+JA5AWdav7w==} + '@prisma/client@7.10.0': + resolution: {integrity: sha512-Ubw/QS9JGIBSBUsyxAUQuK/Jcu0Tsva7le7QbLd91Kix9yJvYDdj5QkwgEbbZniH80dd+sziQcALPc+HnvQC8Q==} engines: {node: ^20.19 || ^22.12 || >=24.0} peerDependencies: prisma: '*' @@ -1167,590 +1148,663 @@ packages: typescript: optional: true - '@prisma/config@7.5.0': - resolution: {integrity: sha512-1J/9YEX7A889xM46PYg9e8VAuSL1IUmXJW3tEhMv7XQHDWlfC9YSkIw9sTYRaq5GswGlxZ+GnnyiNsUZ9JJhSQ==} + '@prisma/config@7.10.0': + resolution: {integrity: sha512-Rcg828gIRE3HOQ3pOATFjV5d/P0U9OIobxhd/IMxlfWjA4vru0eGwb0AIwFw0rmcLMVShohZYWPixVxkBHsxUA==} + + '@prisma/debug@7.10.0': + resolution: {integrity: sha512-caygJKtltmRIgdJ3jRpkOr7yM4DW6zxo5uOmojKWFb3asnxWoRkQOwZmXBgD8FZp4htrX+nMpcWqDwzlQ1+Y4g==} '@prisma/debug@7.2.0': resolution: {integrity: sha512-YSGTiSlBAVJPzX4ONZmMotL+ozJwQjRmZweQNIq/ER0tQJKJynNkRB3kyvt37eOfsbMCXk3gnLF6J9OJ4QWftw==} - '@prisma/debug@7.5.0': - resolution: {integrity: sha512-163+nffny0JoPEkDhfNco0vcuT3ymIJc9+WX7MHSQhfkeKUmKe9/wqvGk5SjppT93DtBjVwr5HPJYlXbzm6qtg==} + '@prisma/dev@0.24.17': + resolution: {integrity: sha512-UvdZzmpFwknnfreh6Jije84ekkYGPYEJhXG1tFzCsCfQyzJifrOo38eZc0qajzvaC6OLUOrN9ML5XfCnEZL9DA==} - '@prisma/dev@0.20.0': - resolution: {integrity: sha512-ovlBYwWor0OzG+yH4J3Ot+AneD818BttLA+Ii7wjbcLHUrnC4tbUPVGyNd3c/+71KETPKZfjhkTSpdS15dmXNQ==} + '@prisma/driver-adapter-utils@7.10.0': + resolution: {integrity: sha512-u8zkcRLlaryO652T4qavBg0HmzNW5tSKdsCn6hc1PhWAp/J6k0vrxLuUs+b9o+HcjsK7Dfa01o4OFSn0frauJA==} - '@prisma/driver-adapter-utils@7.5.0': - resolution: {integrity: sha512-B79N/amgV677mFesFDBAdrW0OIaqawap9E0sjgLBtzIz2R3hIMS1QB8mLZuUEiS4q5Y8Oh3I25Kw4SLxMypk9Q==} + '@prisma/engines-version@7.10.0-4.0edf323efd1d98336f3f0a68684b56f689b900d3': + resolution: {integrity: sha512-8OJ6RuZTZ06eFUOtBwxVmv8XMmOW6HWN5F+uxUbZkGxR0Bfab1dfAdXaHPmR5mb59E+fmUo8IOzXlbLY1SClbw==} - '@prisma/engines-version@7.5.0-15.280c870be64f457428992c43c1f6d557fab6e29e': - resolution: {integrity: sha512-E+iRV/vbJLl8iGjVr6g/TEWokA+gjkV/doZkaQN1i/ULVdDwGnPJDfLUIFGS3BVwlG/m6L8T4x1x5isl8hGMxA==} + '@prisma/engines@7.10.0': + resolution: {integrity: sha512-KNumN6NHFwybvfdYzTee9pqwx5PvknpWAaHn6L5NsbrKdl+SQrsVZs9opKs6U6SAsvB26HDt3WybRjOhgoWOYQ==} - '@prisma/engines@7.5.0': - resolution: {integrity: sha512-ondGRhzoaVpRWvFaQ5wH5zS1BIbhzbKqczKjCn6j3L0Zfe/LInjcEg8+xtB49AuZBX30qyx1ZtGoootUohz2pw==} + '@prisma/fetch-engine@7.10.0': + resolution: {integrity: sha512-Zqyu8DY14t6W/xwmAxUYWCXtHrvQnSvT644EAZSsdM8NSmCS74vJJbBKdVsK3ucFpnUWkEpbO1a0CxJXrg130g==} - '@prisma/fetch-engine@7.5.0': - resolution: {integrity: sha512-kZCl2FV54qnyrVdnII8MI6qvt7HfU6Cbiz8dZ8PXz4f4lbSw45jEB9/gEMK2SGdiNhBKyk/Wv95uthoLhGMLYA==} + '@prisma/get-platform@7.10.0': + resolution: {integrity: sha512-0bra1LFYi8xNw0yqV62bHJNQk4BKleOngZiqPWIQc7a3+9q6rqsnqJ15BuepP8943PFMvtmgnP52juZsyYkA6w==} '@prisma/get-platform@7.2.0': resolution: {integrity: sha512-k1V0l0Td1732EHpAfi2eySTezyllok9dXb6UQanajkJQzPUGi3vO2z7jdkz67SypFTdmbnyGYxvEvYZdZsMAVA==} - '@prisma/get-platform@7.5.0': - resolution: {integrity: sha512-7I+2y1nu/gkEKSiHHbcZ1HPe/euGdEqJZxEEMT0246q4De1+hla0ZzlTgvaT9dHcVCgLSuCG8v39db5qUUWNgw==} - '@prisma/query-plan-executor@7.2.0': resolution: {integrity: sha512-EOZmNzcV8uJ0mae3DhTsiHgoNCuu1J9mULQpGCh62zN3PxPTd+qI9tJvk5jOst8WHKQNwJWR3b39t0XvfBB0WQ==} - '@prisma/studio-core@0.21.1': - resolution: {integrity: sha512-bOGqG/eMQtKC0XVvcVLRmhWWzm/I+0QUWqAEhEBtetpuS3k3V4IWqKGUONkAIT223DNXJMxMtZp36b1FmcdPeg==} - engines: {node: ^20.19 || ^22.12 || ^24.0, pnpm: '8'} + '@prisma/streams-local@0.1.11': + resolution: {integrity: sha512-0TcebL559MByKqTJ+SsrFIEg228iw8UCVRFckzgfRSiJqczhs+MuAgWOF9lnOIV/IVqvu+KMnFTH0eDeTQMpUg==} + engines: {bun: '>=1.2.0', node: '>=22.0.0'} + + '@prisma/studio-core@0.33.0': + resolution: {integrity: sha512-V2fX/nKEymNTrHXwfP26PGjoLStO35Ogu+ex7CFJbLrMYEcZxxZpiSNOs7px23Hk5mzLWvM5RsqG6Ka+rha+wg==} + engines: {node: ^20.19 || ^22.12 || >=24.0, pnpm: '8'} peerDependencies: '@types/react': ^18.0.0 || ^19.0.0 react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 + '@radix-ui/primitive@1.1.3': + resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} + + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-primitive@2.1.3': + resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.2.3': + resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-toggle@1.1.10': + resolution: {integrity: sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-use-controllable-state@1.2.2': + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-effect-event@0.0.2': + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.1': + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@rolldown/pluginutils@1.0.0-rc.3': resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==} - '@rollup/rollup-android-arm-eabi@4.60.0': - resolution: {integrity: sha512-WOhNW9K8bR3kf4zLxbfg6Pxu2ybOUbB2AjMDHSQx86LIF4rH4Ft7vmMwNt0loO0eonglSNy4cpD3MKXXKQu0/A==} + '@rollup/rollup-android-arm-eabi@4.63.1': + resolution: {integrity: sha512-UZ8sUxPTiHWYX9QNdJedb1kDZSpS1t/VPWBWGSgqHNi9w3Cu6IXvu2mzbhiTiPvtrqgTQJ+zqiAq2iPIPilpaQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.60.0': - resolution: {integrity: sha512-u6JHLll5QKRvjciE78bQXDmqRqNs5M/3GVqZeMwvmjaNODJih/WIrJlFVEihvV0MiYFmd+ZyPr9wxOVbPAG2Iw==} + '@rollup/rollup-android-arm64@4.63.1': + resolution: {integrity: sha512-cQ4nFQABN5cDvDpbvJ7bMStCpnaVxynZrRMfUJYgxcIk9Sh54FIO1vtfkg0B69REjER77ioZ/ov+eAApx/KmLQ==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.60.0': - resolution: {integrity: sha512-qEF7CsKKzSRc20Ciu2Zw1wRrBz4g56F7r/vRwY430UPp/nt1x21Q/fpJ9N5l47WWvJlkNCPJz3QRVw008fi7yA==} + '@rollup/rollup-darwin-arm64@4.63.1': + resolution: {integrity: sha512-FQNqd1lRy/0QhDk3xeRIkSBiCpXCiDnZO3YLVdcDKN1UBiKToNftCzcXYNLshmPDUMlu2TdeS8tGcsU6f3YF1Q==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.60.0': - resolution: {integrity: sha512-WADYozJ4QCnXCH4wPB+3FuGmDPoFseVCUrANmA5LWwGmC6FL14BWC7pcq+FstOZv3baGX65tZ378uT6WG8ynTw==} + '@rollup/rollup-darwin-x64@4.63.1': + resolution: {integrity: sha512-pvD16V939D3CloK0+qikpGaxiPrDUXTe7Y5cWOMkMSy7m1cawa8EGy/kXYi/G/cKAC4HDAbSnzCIk1WmsoOKXg==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.60.0': - resolution: {integrity: sha512-6b8wGHJlDrGeSE3aH5mGNHBjA0TTkxdoNHik5EkvPHCt351XnigA4pS7Wsj/Eo9Y8RBU6f35cjN9SYmCFBtzxw==} + '@rollup/rollup-freebsd-arm64@4.63.1': + resolution: {integrity: sha512-pcFGeL2345VwdTnJhA6zLbew+YgWB0qBG2+dMtXjCicf6+rm6kO6cOoh5VnTe0ZMrMRgRyuHmCJxZWrIdzYuOw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.60.0': - resolution: {integrity: sha512-h25Ga0t4jaylMB8M/JKAyrvvfxGRjnPQIR8lnCayyzEjEOx2EJIlIiMbhpWxDRKGKF8jbNH01NnN663dH638mA==} + '@rollup/rollup-freebsd-x64@4.63.1': + resolution: {integrity: sha512-mRJlqSRulVzcKq/LKA6ICSIc3K/l4fzlVn/gePn2nXIHy8seRi5z/eeRE0d/XMBxcMldiXtQTSpRj0tkkC3g8Q==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.60.0': - resolution: {integrity: sha512-RzeBwv0B3qtVBWtcuABtSuCzToo2IEAIQrcyB/b2zMvBWVbjo8bZDjACUpnaafaxhTw2W+imQbP2BD1usasK4g==} + '@rollup/rollup-linux-arm-gnueabihf@4.63.1': + resolution: {integrity: sha512-YDUNvVM85TI3g/1OpnqKP1h4NeW/j64DfWMf+G3M809xNk1bJSnpFp4sh83NpmVE5DXnkh8ULor4LTVZKoYLHw==} cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.60.0': - resolution: {integrity: sha512-Sf7zusNI2CIU1HLzuu9Tc5YGAHEZs5Lu7N1ssJG4Tkw6e0MEsN7NdjUDDfGNHy2IU+ENyWT+L2obgWiguWibWQ==} + '@rollup/rollup-linux-arm-musleabihf@4.63.1': + resolution: {integrity: sha512-7Mcn71p9ZuQFAj+h+dhQXy/yeLePRS2yKRnmW1DijA9thKO5qap0GNOIQK4yQ6iP3SU0Mrb/yWo8h8vgRba8lw==} cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.60.0': - resolution: {integrity: sha512-DX2x7CMcrJzsE91q7/O02IJQ5/aLkVtYFryqCjduJhUfGKG6yJV8hxaw8pZa93lLEpPTP/ohdN4wFz7yp/ry9A==} + '@rollup/rollup-linux-arm64-gnu@4.63.1': + resolution: {integrity: sha512-4YiLQTX6U4CSl0L9cluep9A9W6UmTfqBDc2/CH6wlu54pl4E7Jn3cOD8oxzvBDEGk/JMKgJ47C8g+radF7mwvg==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.60.0': - resolution: {integrity: sha512-09EL+yFVbJZlhcQfShpswwRZ0Rg+z/CsSELFCnPt3iK+iqwGsI4zht3secj5vLEs957QvFFXnzAT0FFPIxSrkQ==} + '@rollup/rollup-linux-arm64-musl@4.63.1': + resolution: {integrity: sha512-2ra8F7w8OquwZN9z2/fKFnli69wa8PLwaVzRMIPGb13ByMJwC28Fbp8YcVGoUhlYMTt7j5j9bNgpysrN2UM+vw==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.60.0': - resolution: {integrity: sha512-i9IcCMPr3EXm8EQg5jnja0Zyc1iFxJjZWlb4wr7U2Wx/GrddOuEafxRdMPRYVaXjgbhvqalp6np07hN1w9kAKw==} + '@rollup/rollup-linux-loong64-gnu@4.63.1': + resolution: {integrity: sha512-Sy20ncyhjmBP0Ml+UvQbimjlk6VFgjW5uNP+qqwHB00mTE8Bl2C1TuHTlRwK2YoXeZbee5lP2XevBWVkAQAtSQ==} cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.60.0': - resolution: {integrity: sha512-DGzdJK9kyJ+B78MCkWeGnpXJ91tK/iKA6HwHxF4TAlPIY7GXEvMe8hBFRgdrR9Ly4qebR/7gfUs9y2IoaVEyog==} + '@rollup/rollup-linux-loong64-musl@4.63.1': + resolution: {integrity: sha512-noITLp8oNjYliPnGWmLyelIHwULGqbHloQHGw1rtxbWhTuWooRpnZarZQJ1y9EUC4szuCusCc+HEpUtxpIwYvA==} cpu: [loong64] os: [linux] libc: [musl] - '@rollup/rollup-linux-ppc64-gnu@4.60.0': - resolution: {integrity: sha512-RwpnLsqC8qbS8z1H1AxBA1H6qknR4YpPR9w2XX0vo2Sz10miu57PkNcnHVaZkbqyw/kUWfKMI73jhmfi9BRMUQ==} + '@rollup/rollup-linux-ppc64-gnu@4.63.1': + resolution: {integrity: sha512-hlxxXd+F1mWiAcaFR7Sv9ZQT6m6UfI8+Vy/kFJzztq2pDMU/0wZ9sish0iszNZvsQDo8Gc0i5yuFEOz5dDf6fA==} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.60.0': - resolution: {integrity: sha512-Z8pPf54Ly3aqtdWC3G4rFigZgNvd+qJlOE52fmko3KST9SoGfAdSRCwyoyG05q1HrrAblLbk1/PSIV+80/pxLg==} + '@rollup/rollup-linux-ppc64-musl@4.63.1': + resolution: {integrity: sha512-EF7OpqQTQ/BvGqLzUi4rEHuagCV9MugAUXSHemwPW5vxZ75RR+jxO/2j95Ph2dalMpFHSVECjRoioHZgA9zOYA==} cpu: [ppc64] os: [linux] libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.60.0': - resolution: {integrity: sha512-3a3qQustp3COCGvnP4SvrMHnPQ9d1vzCakQVRTliaz8cIp/wULGjiGpbcqrkv0WrHTEp8bQD/B3HBjzujVWLOA==} + '@rollup/rollup-linux-riscv64-gnu@4.63.1': + resolution: {integrity: sha512-wQO3JesW9PRkwlabQ27y7sPfVOOTLRG73I4F2UYHG5PXun3J9U3y+b7ezVKSYbsvSKGQ1k1cq8Qlun4C9kLt3w==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.60.0': - resolution: {integrity: sha512-pjZDsVH/1VsghMJ2/kAaxt6dL0psT6ZexQVrijczOf+PeP2BUqTHYejk3l6TlPRydggINOeNRhvpLa0AYpCWSQ==} + '@rollup/rollup-linux-riscv64-musl@4.63.1': + resolution: {integrity: sha512-ouAGwhO6wHRXdnOVCOsB0tRFkA7nhNB2Nwax6oECXN0YiN8EYUTBAOudADOB1PI+yDL61TeNx/u7MVCzksNbkQ==} cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.60.0': - resolution: {integrity: sha512-3ObQs0BhvPgiUVZrN7gqCSvmFuMWvWvsjG5ayJ3Lraqv+2KhOsp+pUbigqbeWqueGIsnn+09HBw27rJ+gYK4VQ==} + '@rollup/rollup-linux-s390x-gnu@4.63.1': + resolution: {integrity: sha512-q2R38Sn+1J8RxhfJ+T54wSWmyKXWec+9jgDfqO2AtArEqHO5R2aeayp5H5OYLr5UYDVGsVaZPEFUooMhYCdz5A==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.60.0': - resolution: {integrity: sha512-EtylprDtQPdS5rXvAayrNDYoJhIz1/vzN2fEubo3yLE7tfAw+948dO0g4M0vkTVFhKojnF+n6C8bDNe+gDRdTg==} + '@rollup/rollup-linux-x64-gnu@4.63.1': + resolution: {integrity: sha512-gfI5T24WLLuFfSKw7Go/zDXjAAV0fny0swTaDv+WjK7vqcw4cRhFfdsyKL1n+ukI+ooBxn3bVQnyrn06WpI50w==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.60.0': - resolution: {integrity: sha512-k09oiRCi/bHU9UVFqD17r3eJR9bn03TyKraCrlz5ULFJGdJGi7VOmm9jl44vOJvRJ6P7WuBi/s2A97LxxHGIdw==} + '@rollup/rollup-linux-x64-musl@4.63.1': + resolution: {integrity: sha512-4h6XqthmB4Hspji84wvgk+ElodTsGj+dbZqHJHHtKxj4mYq0ANSEEPX9ys3moJueqsRjwpaJYH7874Itwnj2ow==} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.60.0': - resolution: {integrity: sha512-1o/0/pIhozoSaDJoDcec+IVLbnRtQmHwPV730+AOD29lHEEo4F5BEUB24H0OBdhbBBDwIOSuf7vgg0Ywxdfiiw==} + '@rollup/rollup-openbsd-x64@4.63.1': + resolution: {integrity: sha512-dlfCOa87o1VAYegLQ9EKilx2JCeRofiyPGhTCmqnuXZ6bMPiycO1rq1+sKoulAp7pGLIsTIw+1x5R+zgh5LhhA==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.60.0': - resolution: {integrity: sha512-pESDkos/PDzYwtyzB5p/UoNU/8fJo68vcXM9ZW2V0kjYayj1KaaUfi1NmTUTUpMn4UhU4gTuK8gIaFO4UGuMbA==} + '@rollup/rollup-openharmony-arm64@4.63.1': + resolution: {integrity: sha512-cjkLbOlfcm3QGhMM1J5zaZjsw1GggbN6rw9UTSSRrPrR1KkcXnN7Uq9rPw34xImQ9VOY9GN+6u2Zj80B9ptkcw==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.60.0': - resolution: {integrity: sha512-hj1wFStD7B1YBeYmvY+lWXZ7ey73YGPcViMShYikqKT1GtstIKQAtfUI6yrzPjAy/O7pO0VLXGmUVWXQMaYgTQ==} + '@rollup/rollup-win32-arm64-msvc@4.63.1': + resolution: {integrity: sha512-Li1KdUnWGE4N3e1F/B4RTB1ms+nG4WBgjByO46pkeBVX/2UBsY53xf5vK9WygVmnH3RwncIST7lkSdLSY6P9lg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.60.0': - resolution: {integrity: sha512-SyaIPFoxmUPlNDq5EHkTbiKzmSEmq/gOYFI/3HHJ8iS/v1mbugVa7dXUzcJGQfoytp9DJFLhHH4U3/eTy2Bq4w==} + '@rollup/rollup-win32-ia32-msvc@4.63.1': + resolution: {integrity: sha512-t4ZYOSoLTgwhuFMrmTMLx/+i1DQVK7HYqMc6kY46EApwi8X0nIVphzdNoThU3xt6n+N5urG1/gxBdCaKDLavfg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.60.0': - resolution: {integrity: sha512-RdcryEfzZr+lAr5kRm2ucN9aVlCCa2QNq4hXelZxb8GG0NJSazq44Z3PCCc8wISRuCVnGs0lQJVX5Vp6fKA+IA==} + '@rollup/rollup-win32-x64-gnu@4.63.1': + resolution: {integrity: sha512-RgroPfMmKlD1RzSDxvwgcPiy2HNQKoYV7OmwIXDsk73uKW5t6B/V8KIy27SMv/FNXFo/oSBtWc9J0X7t91ezZg==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.60.0': - resolution: {integrity: sha512-PrsWNQ8BuE00O3Xsx3ALh2Df8fAj9+cvvX9AIA6o4KpATR98c9mud4XtDWVvsEuyia5U4tVSTKygawyJkjm60w==} + '@rollup/rollup-win32-x64-msvc@4.63.1': + resolution: {integrity: sha512-at8QVep6S3h5Y6gSbdGU06bRY5WJkf6WUduM9YtvYMbYhB1MOFfUgc6kehitQXzOtMSaT70q7f9ydPhpqu821w==} cpu: [x64] os: [win32] - '@simplewebauthn/server@13.3.2': - resolution: {integrity: sha512-KEDhfcGP1PAKRVSDjA3npTQFqS2b/srm+ipoNBNHdkzrHAlaRQUTE+a5f4ywsx6thxAw1NU2rYcLEY1949RGbQ==} + '@simplewebauthn/server@13.3.3': + resolution: {integrity: sha512-LelX/lcy5cjc15A86i/aNxHhB5eU7dd20QsbP0VLAf9e38+SLlsnqCCyecx3xqfGofhmX05h1J9fKRYWxw+luA==} engines: {node: '>=20.0.0'} - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - - '@sinclair/typebox@0.34.41': - resolution: {integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==} + '@sinclair/typebox@0.34.52': + resolution: {integrity: sha512-XiMQh7qqVlxZzcVD+kkGMNGMzcTrDMLWI7S4x7z1MkCkbDPrekpZXEUK0eZqZFMuHQg2a2DZOcDIh9o5v3Gonw==} '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} - '@sinonjs/fake-timers@10.3.0': - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + '@sinonjs/fake-timers@15.4.0': + resolution: {integrity: sha512-DsG+8/LscQIQg68J6Ef3dv10u6nVyetYn923s3/sus5eaGfTo1of5WMZSLf0UJc9KDuKPilPH0UDJCjvNbDNCA==} - '@smithy/abort-controller@4.2.10': - resolution: {integrity: sha512-qocxM/X4XGATqQtUkbE9SPUB6wekBi+FyJOMbPj0AhvyvFGYEmOlz6VB22iMePCQsFmMIvFSeViDvA7mZJG47g==} + '@smithy/core@3.33.3': + resolution: {integrity: sha512-CsOeKq/9kA3y6VJHt+/+VTCtBaxJ4OTFpgrjIUhPpDIKxBci1k2bJaQASF2h/ELWrulGp+t97DZ0mevfAD8idg==} engines: {node: '>=18.0.0'} - '@smithy/chunked-blob-reader-native@4.2.2': - resolution: {integrity: sha512-QzzYIlf4yg0w5TQaC9VId3B3ugSk1MI/wb7tgcHtd7CBV9gNRKZrhc2EPSxSZuDy10zUZ0lomNMgkc6/VVe8xg==} + '@smithy/credential-provider-imds@4.5.2': + resolution: {integrity: sha512-A9uSdn72ozbRUSit0eib0TW7nXuNPlaeM0zcGkJ+nE6tFcSDbnmtwoxbTCFBukVQcszDAyvsd7+rTduPTXpygg==} engines: {node: '>=18.0.0'} - '@smithy/chunked-blob-reader@5.2.1': - resolution: {integrity: sha512-y5d4xRiD6TzeP5BWlb+Ig/VFqF+t9oANNhGeMqyzU7obw7FYgTgVi50i5JqBTeKp+TABeDIeeXFZdz65RipNtA==} + '@smithy/fetch-http-handler@5.8.0': + resolution: {integrity: sha512-ycSJu3tFAQ4v04CBB0agqFMVsSQ1iG3yw+SpgxRqKfaURpQD4CZ8Wn0zPMmSnOuTpTh65Vz+EA0rMrw089wvkA==} engines: {node: '>=18.0.0'} - '@smithy/config-resolver@4.4.9': - resolution: {integrity: sha512-ejQvXqlcU30h7liR9fXtj7PIAau1t/sFbJpgWPfiYDs7zd16jpH0IsSXKcba2jF6ChTXvIjACs27kNMc5xxE2Q==} + '@smithy/node-http-handler@4.12.1': + resolution: {integrity: sha512-ThMkboGeONWXAelq9FvGsuJC4rOi+qyC4/zhUF58xYpxUg5sQKx2VXZYJmtNjr4dSuBJ1HeJXETQILCz3wOHvw==} engines: {node: '>=18.0.0'} - '@smithy/core@3.23.7': - resolution: {integrity: sha512-/+ldRdtiO5Cb26afAZOG1FZM0x7D4AYdjpyOv2OScJw+4C7X+OLdRnNKF5UyUE0VpPgSKr3rnF/kvprRA4h2kg==} + '@smithy/signature-v4@5.7.3': + resolution: {integrity: sha512-7ImGm+FkHRLcBaRttIAMZ6bzJZWb2cJGoYjq46F2UjycujWzrL9GEN9h4w7eQyXJYnltrUhxbbieBAIRrdqpow==} engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@4.2.10': - resolution: {integrity: sha512-3bsMLJJLTZGZqVGGeBVFfLzuRulVsGTj12BzRKODTHqUABpIr0jMN1vN3+u6r2OfyhAQ2pXaMZWX/swBK5I6PQ==} + '@smithy/types@4.18.0': + resolution: {integrity: sha512-CgB6HHWer/vrKps24ulRIbpcpb7K4xAU7SkZ7YHzBPlwHsvsrCJFEXK421s+cJzX+ZrqtA/TuU5w1HzI7k9N8A==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-codec@4.2.9': - resolution: {integrity: sha512-8/wOb1wm/joXCj6SNHRFnfcNBR4xmumw869UnM+RrjoWeliNcTnOTw2WZXBWoKfszbL/v/AxdijIilqRMst+vA==} - engines: {node: '>=18.0.0'} + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@smithy/eventstream-serde-browser@4.2.9': - resolution: {integrity: sha512-HbD4ptlSKHVfF84F77oqy2kswQR5H9basFILtCvnhtgzvRntiQtqstT1XFENzI7dQzrGD0HfhMjziSCs6EZEFA==} - engines: {node: '>=18.0.0'} + '@trpc/client@11.18.0': + resolution: {integrity: sha512-wOqeg3Fvl25V1ZisQhUD3K8G60ZJDlSGJNSyeXrLH24xAo5w6GSR2Kzb1cSNY9Y+IQ2YZvYGZstBU+V/ulo/ow==} + hasBin: true + peerDependencies: + '@trpc/server': 11.18.0 + typescript: '>=5.7.2' - '@smithy/eventstream-serde-config-resolver@4.3.9': - resolution: {integrity: sha512-W2KlYzjD1V7jCUsTxy/HWrWDa9RdnzqY8Aeskaoakrj+9aiZ53YzEC7lNb3JJ0zKFjWoLbXdaSXmftBBR8Wjsw==} - engines: {node: '>=18.0.0'} + '@trpc/server@11.18.0': + resolution: {integrity: sha512-JAvXOuNTxgXjIDfQaOvDq1j66LMNfDJUH1IU7Slfn8EvRv2EkH6ehu3A7zpYhjO0syHHiYg77v2lG2JFJgvw7Q==} + hasBin: true + peerDependencies: + typescript: '>=5.7.2' - '@smithy/eventstream-serde-node@4.2.9': - resolution: {integrity: sha512-6nMJG2KJJ5cjmPmySomEdpqhGsfneanKCjb5uBJJIM2D6rZhemEpYBtes6zr910LkxWseWTIbWrif0vaOB9NTA==} - engines: {node: '>=18.0.0'} + '@tsconfig/node10@1.0.13': + resolution: {integrity: sha512-gcLdvR9HO1ZJBypsOGqaP6TFEzb6vIta0KSTLt9NAQ6pXQO3cRgSVyCN6pzYqI9DlJgY71XKO0dpDhCf08b3pg==} - '@smithy/eventstream-serde-universal@4.2.9': - resolution: {integrity: sha512-RgkumJugvbFVcifYCFeYaFpMOuLiIAcvzKe21EeaM6/KKU/4XYyf8hs/So9GSN6SDe4bqZbwB4g/rr/pIxUZmA==} - engines: {node: '>=18.0.0'} + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - '@smithy/fetch-http-handler@5.3.12': - resolution: {integrity: sha512-muS5tFw+A/uo+U+yig06vk1776UFM+aAp9hFM8efI4ZcHhTcgv6NTeK4x7ltHeMPBwnhEjcf0MULTyxNkSNxDw==} - engines: {node: '>=18.0.0'} + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - '@smithy/hash-blob-browser@4.2.10': - resolution: {integrity: sha512-2lZvvcwTaXq6cGOcX72Ej9WU+z3T/C5NOuqIm+zLD3MlExRp9kW/Qa/p66NbBM74X0BdrdvpsMYwlkhtvHrxaQ==} - engines: {node: '>=18.0.0'} + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@smithy/hash-node@4.2.10': - resolution: {integrity: sha512-1VzIOI5CcsvMDvP3iv1vG/RfLJVVVc67dCRyLSB2Hn9SWCZrDO3zvcIzj3BfEtqRW5kcMg5KAeVf1K3dR6nD3w==} - engines: {node: '>=18.0.0'} + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} - '@smithy/hash-stream-node@4.2.9': - resolution: {integrity: sha512-WFPbY/TysowQuoWR0xOCPT3RH1KMpThUWjx75RAMLkDlTYTANzyPHZiDRslf2e5bTmCYcqCshN7up70Ic/Zqug==} - engines: {node: '>=18.0.0'} + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - '@smithy/invalid-dependency@4.2.10': - resolution: {integrity: sha512-vy9KPNSFUU0ajFYk0sDZIYiUlAWGEAhRfehIr5ZkdFrRFTAuXEPUd41USuqHU6vvLX4r6Q9X7MKBco5+Il0Org==} - engines: {node: '>=18.0.0'} + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} - '@smithy/is-array-buffer@2.2.0': - resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} - engines: {node: '>=14.0.0'} + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@smithy/is-array-buffer@4.2.1': - resolution: {integrity: sha512-Yfu664Qbf1B4IYIsYgKoABt010daZjkaCRvdU/sPnZG6TtHOB0md0RjNdLGzxe5UIdn9js4ftPICzmkRa9RJ4Q==} - engines: {node: '>=18.0.0'} + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} - '@smithy/md5-js@4.2.9': - resolution: {integrity: sha512-ZCCWfGj4wvqV+5OS9e/GvR5jlR7j1mMB1UkGE+V7P1USFMwcL4Z4j5mO9nGvQGkfe20KM87ymbvZIcU9tHNlIg==} - engines: {node: '>=18.0.0'} + '@types/bcryptjs@2.4.6': + resolution: {integrity: sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==} - '@smithy/middleware-content-length@4.2.10': - resolution: {integrity: sha512-TQZ9kX5c6XbjhaEBpvhSvMEZ0klBs1CFtOdPFwATZSbC9UeQfKHPLPN9Y+I6wZGMOavlYTOlHEPDrt42PMSH9w==} - engines: {node: '>=18.0.0'} + '@types/better-sqlite3@7.6.13': + resolution: {integrity: sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==} - '@smithy/middleware-endpoint@4.4.21': - resolution: {integrity: sha512-CoVGZaqIC0tEjz0ga3ciwCMA5fd/4lIOwO2wx0fH+cTi1zxSFZnMJbIiIF9G1d4vRSDyTupDrpS3FKBBJGkRZg==} - engines: {node: '>=18.0.0'} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} - '@smithy/middleware-retry@4.4.38': - resolution: {integrity: sha512-WdHvdhjE6Fj78vxFwDKFDwlqGOGRUWrwGeuENUbTVE46Su9mnQM+dXHtbnCaQvwuSYrRsjpe8zUsFpwUp/azlA==} - engines: {node: '>=18.0.0'} + '@types/d3-array@3.0.3': + resolution: {integrity: sha512-Reoy+pKnvsksN0lQUlcH6dOGjRZ/3WRwXR//m+/8lt1BXeI4xyaUZoqULNjyXXRuh0Mj4LNpkCvhUpQlY3X5xQ==} - '@smithy/middleware-serde@4.2.11': - resolution: {integrity: sha512-STQdONGPwbbC7cusL60s7vOa6He6A9w2jWhoapL0mgVjmR19pr26slV+yoSP76SIssMTX/95e5nOZ6UQv6jolg==} - engines: {node: '>=18.0.0'} + '@types/d3-color@3.1.0': + resolution: {integrity: sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==} - '@smithy/middleware-stack@4.2.10': - resolution: {integrity: sha512-pmts/WovNcE/tlyHa8z/groPeOtqtEpp61q3W0nW1nDJuMq/x+hWa/OVQBtgU0tBqupeXq0VBOLA4UZwE8I0YA==} - engines: {node: '>=18.0.0'} + '@types/d3-delaunay@6.0.1': + resolution: {integrity: sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==} - '@smithy/node-config-provider@4.3.10': - resolution: {integrity: sha512-UALRbJtVX34AdP2VECKVlnNgidLHA2A7YgcJzwSBg1hzmnO/bZBHl/LDQQyYifzUwp1UOODnl9JJ3KNawpUJ9w==} - engines: {node: '>=18.0.0'} + '@types/d3-format@3.0.1': + resolution: {integrity: sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==} - '@smithy/node-http-handler@4.4.13': - resolution: {integrity: sha512-o8CP8w6tlUA0lk+Qfwm6Ed0jCWk3bEY6iBOJjdBaowbXKCSClk8zIHQvUL6RUZMvuNafF27cbRCMYqw6O1v4aA==} - engines: {node: '>=18.0.0'} + '@types/d3-geo@3.1.0': + resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} - '@smithy/property-provider@4.2.10': - resolution: {integrity: sha512-5jm60P0CU7tom0eNrZ7YrkgBaoLFXzmqB0wVS+4uK8PPGmosSrLNf6rRd50UBvukztawZ7zyA8TxlrKpF5z9jw==} - engines: {node: '>=18.0.0'} + '@types/d3-interpolate@3.0.1': + resolution: {integrity: sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==} - '@smithy/protocol-http@5.3.10': - resolution: {integrity: sha512-2NzVWpYY0tRdfeCJLsgrR89KE3NTWT2wGulhNUxYlRmtRmPwLQwKzhrfVaiNlA9ZpJvbW7cjTVChYKgnkqXj1A==} - engines: {node: '>=18.0.0'} + '@types/d3-path@3.1.1': + resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} - '@smithy/querystring-builder@4.2.10': - resolution: {integrity: sha512-HeN7kEvuzO2DmAzLukE9UryiUvejD3tMp9a1D1NJETerIfKobBUCLfviP6QEk500166eD2IATaXM59qgUI+YDA==} - engines: {node: '>=18.0.0'} + '@types/d3-scale@4.0.2': + resolution: {integrity: sha512-Yk4htunhPAwN0XGlIwArRomOjdoBFXC3+kCxK2Ubg7I9shQlVSJy/pG/Ht5ASN+gdMIalpk8TJ5xV74jFsetLA==} - '@smithy/querystring-parser@4.2.10': - resolution: {integrity: sha512-4Mh18J26+ao1oX5wXJfWlTT+Q1OpDR8ssiC9PDOuEgVBGloqg18Fw7h5Ct8DyT9NBYwJgtJ2nLjKKFU6RP1G1Q==} - engines: {node: '>=18.0.0'} + '@types/d3-shape@3.1.7': + resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==} - '@smithy/service-error-classification@4.2.10': - resolution: {integrity: sha512-0R/+/Il5y8nB/By90o8hy/bWVYptbIfvoTYad0igYQO5RefhNCDmNzqxaMx7K1t/QWo0d6UynqpqN5cCQt1MCg==} - engines: {node: '>=18.0.0'} + '@types/d3-time-format@2.1.0': + resolution: {integrity: sha512-/myT3I7EwlukNOX2xVdMzb8FRgNzRMpsZddwst9Ld/VFe6LyJyRp0s32l/V9XoUzk+Gqu56F/oGk6507+8BxrA==} - '@smithy/shared-ini-file-loader@4.4.5': - resolution: {integrity: sha512-pHgASxl50rrtOztgQCPmOXFjRW+mCd7ALr/3uXNzRrRoGV5G2+78GOsQ3HlQuBVHCh9o6xqMNvlIKZjWn4Euug==} - engines: {node: '>=18.0.0'} + '@types/d3-time@3.0.0': + resolution: {integrity: sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==} - '@smithy/signature-v4@5.3.10': - resolution: {integrity: sha512-Wab3wW8468WqTKIxI+aZe3JYO52/RYT/8sDOdzkUhjnLakLe9qoQqIcfih/qxcF4qWEFoWBszY0mj5uxffaVXA==} - engines: {node: '>=18.0.0'} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - '@smithy/smithy-client@4.12.1': - resolution: {integrity: sha512-Xf9UFHlAihewfkmLNZ6I/Ek6kcYBKoU3cbRS9Z4q++9GWoW0YFbAHs7wMbuXm+nGuKHZ5OKheZMuDdaWPv8DJw==} - engines: {node: '>=18.0.0'} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - '@smithy/types@4.13.0': - resolution: {integrity: sha512-COuLsZILbbQsdrwKQpkkpyep7lCsByxwj7m0Mg5v66/ZTyenlfBc40/QFQ5chO0YN/PNEH1Bi3fGtfXPnYNeDw==} - engines: {node: '>=18.0.0'} + '@types/geojson@7946.0.16': + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} - '@smithy/url-parser@4.2.10': - resolution: {integrity: sha512-uypjF7fCDsRk26u3qHmFI/ePL7bxxB9vKkE+2WKEciHhz+4QtbzWiHRVNRJwU3cKhrYDYQE3b0MRFtqfLYdA4A==} - engines: {node: '>=18.0.0'} + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - '@smithy/util-base64@4.3.1': - resolution: {integrity: sha512-BKGuawX4Doq/bI/uEmg+Zyc36rJKWuin3py89PquXBIBqmbnJwBBsmKhdHfNEp0+A4TDgLmT/3MSKZ1SxHcR6w==} - engines: {node: '>=18.0.0'} + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - '@smithy/util-body-length-browser@4.2.1': - resolution: {integrity: sha512-SiJeLiozrAoCrgDBUgsVbmqHmMgg/2bA15AzcbcW+zan7SuyAVHN4xTSbq0GlebAIwlcaX32xacnrG488/J/6g==} - engines: {node: '>=18.0.0'} + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - '@smithy/util-body-length-node@4.2.2': - resolution: {integrity: sha512-4rHqBvxtJEBvsZcFQSPQqXP2b/yy/YlB66KlcEgcH2WNoOKCKB03DSLzXmOsXjbl8dJ4OEYTn31knhdznwk7zw==} - engines: {node: '>=18.0.0'} + '@types/jest@30.0.0': + resolution: {integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==} - '@smithy/util-buffer-from@2.2.0': - resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} - engines: {node: '>=14.0.0'} + '@types/js-yaml@4.0.9': + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} - '@smithy/util-buffer-from@4.2.1': - resolution: {integrity: sha512-/swhmt1qTiVkaejlmMPPDgZhEaWb/HWMGRBheaxwuVkusp/z+ErJyQxO6kaXumOciZSWlmq6Z5mNylCd33X7Ig==} - engines: {node: '>=18.0.0'} + '@types/jsonwebtoken@9.0.10': + resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==} - '@smithy/util-config-provider@4.2.1': - resolution: {integrity: sha512-462id/00U8JWFw6qBuTSWfN5TxOHvDu4WliI97qOIOnuC/g+NDAknTU8eoGXEPlLkRVgWEr03jJBLV4o2FL8+A==} - engines: {node: '>=18.0.0'} + '@types/lodash@4.17.25': + resolution: {integrity: sha512-+K1NIO8I+F9/wNulfVvu23QYd0Pe9/OCqRrim4NoYIf1VoEDL90Ve4ClzpyqBLc7NpGGWRvYNCKZ1BE/Jpf8dQ==} - '@smithy/util-defaults-mode-browser@4.3.37': - resolution: {integrity: sha512-JlPZhV1kQCGNJgofRTU6E8kHrjCKsb6cps8gco8QDVaFl7biFYzHg0p1x89ytIWyVyCkY3nOpO8tJPM47Vqlww==} - engines: {node: '>=18.0.0'} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@smithy/util-defaults-mode-node@4.2.40': - resolution: {integrity: sha512-BM5cPEsyxHdYYO4Da77E94lenhaVPNUzBTyCGDkcw/n/mE8Q1cfHwr+n/w2bNPuUsPC30WaW5/hGKWOTKqw8kw==} - engines: {node: '>=18.0.0'} + '@types/node@20.19.43': + resolution: {integrity: sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==} - '@smithy/util-endpoints@3.3.1': - resolution: {integrity: sha512-xyctc4klmjmieQiF9I1wssBWleRV0RhJ2DpO8+8yzi2LO1Z+4IWOZNGZGNj4+hq9kdo+nyfrRLmQTzc16Op2Vg==} - engines: {node: '>=18.0.0'} + '@types/node@25.9.5': + resolution: {integrity: sha512-OScDchr2fwuUmWdf4kZ9h7PcJiYDVInhJizG/biAq3cAvqwYktuy/TYGGdZNMtNTFUP7rnb0NU4TUdm82kt4Rg==} - '@smithy/util-hex-encoding@4.2.1': - resolution: {integrity: sha512-c1hHtkgAWmE35/50gmdKajgGAKV3ePJ7t6UtEmpfCWJmQE9BQAQPz0URUVI89eSkcDqCtzqllxzG28IQoZPvwA==} - engines: {node: '>=18.0.0'} + '@types/pg@8.23.1': + resolution: {integrity: sha512-fKVHpikPdg4GKks3JuLEhvwSyvwzF23hnabPy6DD8ljVbC7+6J5dQzdv4arV6jqq57djnMgs1HKBxX4P8aBI3A==} - '@smithy/util-middleware@4.2.10': - resolution: {integrity: sha512-LxaQIWLp4y0r72eA8mwPNQ9va4h5KeLM0I3M/HV9klmFaY2kN766wf5vsTzmaOpNNb7GgXAd9a25P3h8T49PSA==} - engines: {node: '>=18.0.0'} + '@types/react-dom@19.2.7': + resolution: {integrity: sha512-I8bPpDLcHBv1qiIiXDCy71Rt8eQDKJP0sMSWJphDdAcdqiJ1sGpZamavoEIRZmYzjia9LuEb2HlYdDpmoENpvQ==} + peerDependencies: + '@types/react': ^19.2.0 - '@smithy/util-retry@4.2.10': - resolution: {integrity: sha512-HrBzistfpyE5uqTwiyLsFHscgnwB0kgv8vySp7q5kZ0Eltn/tjosaSGGDj/jJ9ys7pWzIP/icE2d+7vMKXLv7A==} - engines: {node: '>=18.0.0'} + '@types/react@19.2.18': + resolution: {integrity: sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==} - '@smithy/util-stream@4.5.16': - resolution: {integrity: sha512-c7awZV6cxY0czgDDSr+Bz0XfRtg8AwW2BWhrHhLJISrpmwv8QzA2qzTllWyMVNdy1+UJr9vCm29hzuh3l8TTFw==} - engines: {node: '>=18.0.0'} + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - '@smithy/util-uri-escape@4.2.1': - resolution: {integrity: sha512-YmiUDn2eo2IOiWYYvGQkgX5ZkBSiTQu4FlDo5jNPpAxng2t6Sjb6WutnZV9l6VR4eJul1ABmCrnWBC9hKHQa6Q==} - engines: {node: '>=18.0.0'} + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - '@smithy/util-utf8@2.3.0': - resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} - engines: {node: '>=14.0.0'} + '@types/yargs@17.0.35': + resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} - '@smithy/util-utf8@4.2.1': - resolution: {integrity: sha512-DSIwNaWtmzrNQHv8g7DBGR9mulSit65KSj5ymGEIAknmIN8IpbZefEep10LaMG/P/xquwbmJ1h9ectz8z6mV6g==} - engines: {node: '>=18.0.0'} + '@typescript-eslint/eslint-plugin@8.69.0': + resolution: {integrity: sha512-t5jQTKPIgVW1PE6dR6H6Qz5gm8zjMlX5/2gRaOGd9eO6V7J+tQc6iWKukEe7dY8u9HyYasQ0yfF0/FSSTEO2gA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.69.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@smithy/util-waiter@4.2.10': - resolution: {integrity: sha512-4eTWph/Lkg1wZEDAyObwme0kmhEb7J/JjibY2znJdrYRgKbKqB7YoEhhJVJ4R1g/SYih4zuwX7LpJaM8RsnTVg==} - engines: {node: '>=18.0.0'} + '@typescript-eslint/parser@8.69.0': + resolution: {integrity: sha512-l4b0DhWioGg6Gt2ebGlvfkFMOjRsauxtsnDRwUSRX1qHq3HdTfQHV8wW9zEXeciai6HfeaKOedQn2Zoofx3WBw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@smithy/uuid@1.1.1': - resolution: {integrity: sha512-dSfDCeihDmZlV2oyr0yWPTUfh07suS+R5OB+FZGiv/hHyK3hrFBW5rR1UYjfa57vBsrP9lciFkRPzebaV1Qujw==} - engines: {node: '>=18.0.0'} + '@typescript-eslint/project-service@8.69.0': + resolution: {integrity: sha512-yi4obFrHMmnsesWehHbkg9zMA7Jt8cXT+mKM08G999pH1yT6nqgsHx7MYm0uY1wAj8CqiBXYRJ7WAT0QdQHQXg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' - '@standard-schema/spec@1.1.0': - resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@typescript-eslint/scope-manager@8.69.0': + resolution: {integrity: sha512-ewfspqWvSxKSOaplqAUNbaSFO0eB6w1EtQ+esfYFRm3614Ty4uNtExkcbgd6nWsXphbqKyf9ZYdbZdv2xEoWEQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@trpc/client@11.14.1': - resolution: {integrity: sha512-zjIq7JGm50/hIfo7/WR2BQEyngB0SDVlHJi9J3o5cLrOhUAxArYC6F8xpch1a1vatsN9rkayc6hJ3OXHDUOWow==} - hasBin: true + '@typescript-eslint/tsconfig-utils@8.69.0': + resolution: {integrity: sha512-xNqK7YTDZsLniQMV/4rpFR8Z5JlqeRvVjuG1YgF/mdPVH84HSD19L8CczMA0qg2RfwEV231GHH3VnToJDo4MfQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@trpc/server': 11.14.1 - typescript: '>=5.7.2' + typescript: '>=4.8.4 <6.1.0' - '@trpc/server@11.8.0': - resolution: {integrity: sha512-DphyQnLuyX2nwJCQGWQ9zYz4hZGvRhSBqDhQ0SH3tDhQ3PU4u68xofA0pJ741Ir4InEAFD+TtJVLAQy+wVOkiQ==} + '@typescript-eslint/type-utils@8.69.0': + resolution: {integrity: sha512-ZfoJAVg3JZndQEpEl9petVlxau3lRuElc4HRMuAlLCf8to04/iHz692RUSNmXKDjEuJmIL+KZ2/BsOcBc16dsA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=5.7.2' - - '@tsconfig/node10@1.0.12': - resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} - - '@tsconfig/node12@1.0.11': - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@tsconfig/node14@1.0.3': - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + '@typescript-eslint/types@8.69.0': + resolution: {integrity: sha512-K3VrubUPhlo9VDBS6QdI8YB5j7ClpqLRdefcz6PFrhnwicehBweqQ9Evhl4l+FYz0HdDmMqIiSX0aldGRYtDCA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@tsconfig/node16@1.0.4': - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@typescript-eslint/typescript-estree@8.69.0': + resolution: {integrity: sha512-AdFkgqck3Vudb/kWnxlyafU/4aBhHrbQ9locP2N4psXTy5mOBg0SHJumnLvx7r6g1gV4DKvUFwV2nJZBoqOD8w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + '@typescript-eslint/utils@8.69.0': + resolution: {integrity: sha512-tUbx60BBqQa31kXF5MCsOOLL5E/WzUuxIn7YpAvq+eaUlqvk8/NXnXMBNAdLCr0icjkzem7iUA5QqWHe/hJ1aw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@types/babel__generator@7.27.0': - resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + '@typescript-eslint/visitor-keys@8.69.0': + resolution: {integrity: sha512-+rmdgPA+EXkNgKYvHvFfhrs35utXbwaC5PGpDquSXcoXQDKUA5UjV0LmTucG/4JXkM31BTu4TilHtrN8IVBe8w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + '@ungap/structured-clone@1.4.0': + resolution: {integrity: sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==} - '@types/babel__traverse@7.28.0': - resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + '@unrs/resolver-binding-android-arm-eabi@1.12.2': + resolution: {integrity: sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==} + cpu: [arm] + os: [android] - '@types/bcryptjs@2.4.6': - resolution: {integrity: sha512-9xlo6R2qDs5uixm0bcIqCeMCE6HiQsIyel9KQySStiyqNl2tnj2mP3DX1Nf56MD6KMenNNlBBsy3LJ7gUEQPXQ==} + '@unrs/resolver-binding-android-arm64@1.12.2': + resolution: {integrity: sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==} + cpu: [arm64] + os: [android] - '@types/better-sqlite3@7.6.13': - resolution: {integrity: sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==} + '@unrs/resolver-binding-darwin-arm64@1.12.2': + resolution: {integrity: sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==} + cpu: [arm64] + os: [darwin] - '@types/chai@5.2.3': - resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@unrs/resolver-binding-darwin-x64@1.12.2': + resolution: {integrity: sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==} + cpu: [x64] + os: [darwin] - '@types/deep-eql@4.0.2': - resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@unrs/resolver-binding-freebsd-x64@1.12.2': + resolution: {integrity: sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==} + cpu: [x64] + os: [freebsd] - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2': + resolution: {integrity: sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==} + cpu: [arm] + os: [linux] - '@types/graceful-fs@4.1.9': - resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + '@unrs/resolver-binding-linux-arm-musleabihf@1.12.2': + resolution: {integrity: sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==} + cpu: [arm] + os: [linux] - '@types/istanbul-lib-coverage@2.0.6': - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + '@unrs/resolver-binding-linux-arm64-gnu@1.12.2': + resolution: {integrity: sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==} + cpu: [arm64] + os: [linux] + libc: [glibc] - '@types/istanbul-lib-report@3.0.3': - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + '@unrs/resolver-binding-linux-arm64-musl@1.12.2': + resolution: {integrity: sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==} + cpu: [arm64] + os: [linux] + libc: [musl] - '@types/istanbul-reports@3.0.4': - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + '@unrs/resolver-binding-linux-loong64-gnu@1.12.2': + resolution: {integrity: sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==} + cpu: [loong64] + os: [linux] + libc: [glibc] - '@types/jest@30.0.0': - resolution: {integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==} + '@unrs/resolver-binding-linux-loong64-musl@1.12.2': + resolution: {integrity: sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==} + cpu: [loong64] + os: [linux] + libc: [musl] - '@types/js-yaml@4.0.9': - resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + '@unrs/resolver-binding-linux-ppc64-gnu@1.12.2': + resolution: {integrity: sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==} + cpu: [ppc64] + os: [linux] + libc: [glibc] - '@types/jsonwebtoken@9.0.10': - resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==} + '@unrs/resolver-binding-linux-riscv64-gnu@1.12.2': + resolution: {integrity: sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==} + cpu: [riscv64] + os: [linux] + libc: [glibc] - '@types/ms@2.1.0': - resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@unrs/resolver-binding-linux-riscv64-musl@1.12.2': + resolution: {integrity: sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==} + cpu: [riscv64] + os: [linux] + libc: [musl] - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + '@unrs/resolver-binding-linux-s390x-gnu@1.12.2': + resolution: {integrity: sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==} + cpu: [s390x] + os: [linux] + libc: [glibc] - '@types/node@20.19.37': - resolution: {integrity: sha512-8kzdPJ3FsNsVIurqBs7oodNnCEVbni9yUEkaHbgptDACOPW04jimGagZ51E6+lXUwJjgnBw+hyko/lkFWCldqw==} + '@unrs/resolver-binding-linux-x64-gnu@1.12.2': + resolution: {integrity: sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==} + cpu: [x64] + os: [linux] + libc: [glibc] - '@types/node@25.0.3': - resolution: {integrity: sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==} + '@unrs/resolver-binding-linux-x64-musl@1.12.2': + resolution: {integrity: sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==} + cpu: [x64] + os: [linux] + libc: [musl] - '@types/pg@8.11.11': - resolution: {integrity: sha512-kGT1qKM8wJQ5qlawUrEkXgvMSXoV213KfMGXcwfDwUIfUHXqXYXOfS1nE1LINRJVVVx5wCm70XnFlMHaIcQAfw==} + '@unrs/resolver-binding-openharmony-arm64@1.12.2': + resolution: {integrity: sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==} + cpu: [arm64] + os: [openharmony] - '@types/pg@8.20.0': - resolution: {integrity: sha512-bEPFOaMAHTEP1EzpvHTbmwR8UsFyHSKsRisLIHVMXnpNefSbGA1bD6CVy+qKjGSqmZqNqBDV2azOBo8TgkcVow==} + '@unrs/resolver-binding-wasm32-wasi@1.12.2': + resolution: {integrity: sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] - '@types/react-dom@19.2.3': - resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} - peerDependencies: - '@types/react': ^19.2.0 + '@unrs/resolver-binding-win32-arm64-msvc@1.12.2': + resolution: {integrity: sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==} + cpu: [arm64] + os: [win32] - '@types/react@19.2.14': - resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} + '@unrs/resolver-binding-win32-ia32-msvc@1.12.2': + resolution: {integrity: sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==} + cpu: [ia32] + os: [win32] - '@types/stack-utils@2.0.3': - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + '@unrs/resolver-binding-win32-x64-msvc@1.12.2': + resolution: {integrity: sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==} + cpu: [x64] + os: [win32] - '@types/yargs-parser@21.0.3': - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + '@visx/curve@4.0.1-alpha.0': + resolution: {integrity: sha512-jRu61Uz274pV1zyioXmboyrLutYbnKsgjj4njSGCnhdXj5GkZvZbg+ThDb6oOzoAnJOBRLz4rzPlWvNJOzuVMg==} - '@types/yargs@17.0.35': - resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} + '@visx/event@4.0.1-alpha.0': + resolution: {integrity: sha512-EQqCMSv/s8NbFjo+hz3FKsvvYfP+2QslsFJ/24/O5l/W+7UC6J6aAvO0ujVwrTwdYbuQ+vhxKi1xdPdKR/qj1g==} - '@typescript-eslint/eslint-plugin@7.18.0': - resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} - engines: {node: ^18.18.0 || >=20.0.0} + '@visx/grid@4.0.1-alpha.0': + resolution: {integrity: sha512-rycutGmTHO+znNdPumheWMglm7YfpffvRwUkVy5zy4WoORIuKTMkDxwnOzHG2xMxU3EE/YCd37xFV5AxA30yeg==} peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + react: ^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0 - '@typescript-eslint/parser@7.18.0': - resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} - engines: {node: ^18.18.0 || >=20.0.0} + '@visx/group@4.0.1-alpha.0': + resolution: {integrity: sha512-V19l7iQ7jccBv8kao/EByuI6o4xtxzzLV9nqVI1hRvmdzTVsuLpqlwzYCZUXJaTVvUWf8s4D2SQFjGkj/Nw+0w==} peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + react: ^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0 - '@typescript-eslint/scope-manager@7.18.0': - resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} - engines: {node: ^18.18.0 || >=20.0.0} + '@visx/point@4.0.1-alpha.0': + resolution: {integrity: sha512-ijTfr/Nx09f03vIj9nyTr3z4Xth4Y75427UaogJh6dnIRLMEFHQOwNu791sbfiNj0a+ZXuaE32h0vKrFe4/8Qg==} - '@typescript-eslint/type-utils@7.18.0': - resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} - engines: {node: ^18.18.0 || >=20.0.0} + '@visx/responsive@4.0.1-alpha.0': + resolution: {integrity: sha512-o+1zGywQZY0+yOx3Iw87wc4bbPJRr/HnIukTwfOz4UVyj9pB1OQNVHB7OORO1+LBHJceWpB31co/ZV9KHncKrA==} peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/types@7.18.0': - resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} - engines: {node: ^18.18.0 || >=20.0.0} + react: ^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0 - '@typescript-eslint/typescript-estree@7.18.0': - resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@visx/scale@4.0.1-alpha.0': + resolution: {integrity: sha512-nzjeE87vFSAXGWFiiNfBpNLAf0Q8Qmf6syvKLjqNi4kGZkdhbUll3E/59YsgWXmjM8+llPLWzGsP+JPvo5eq1A==} - '@typescript-eslint/utils@7.18.0': - resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} - engines: {node: ^18.18.0 || >=20.0.0} + '@visx/shape@4.0.1-alpha.0': + resolution: {integrity: sha512-62QeiVNmPlterQGwhkEDcbq7M0MqY0lBsK5QKXtM9ZoPZWkuGV3aykA3+Xu20B2FAvyJq4LqJzBc7Sxr+EAdbA==} peerDependencies: - eslint: ^8.56.0 + react: ^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0 - '@typescript-eslint/visitor-keys@7.18.0': - resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + '@visx/vendor@4.0.0-alpha.0': + resolution: {integrity: sha512-6I+MuqXBcv9jnlcVowHoHKSdk9gXTWkHLKyqBwRWg7LY6A3Ei8SHfubpqGV5rBUSppxMq2RszPJUS6w+H0YgmQ==} '@vitejs/plugin-react@5.2.0': resolution: {integrity: sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw==} @@ -1758,51 +1812,46 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 - '@vitest/expect@4.1.0': - resolution: {integrity: sha512-EIxG7k4wlWweuCLG9Y5InKFwpMEOyrMb6ZJ1ihYu02LVj/bzUwn2VMU+13PinsjRW75XnITeFrQBMH5+dLvCDA==} + '@vitest/expect@4.1.11': + resolution: {integrity: sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==} - '@vitest/mocker@4.1.0': - resolution: {integrity: sha512-evxREh+Hork43+Y4IOhTo+h5lGmVRyjqI739Rz4RlUPqwrkFFDF6EMvOOYjTx4E8Tl6gyCLRL8Mu7Ry12a13Tw==} + '@vitest/mocker@4.1.11': + resolution: {integrity: sha512-2XJVD55d1o5AZous5CCGKS74g/riOj9odEt2bQpCVZeblHyHdnMeFl4jl0XjU21stf4mbjUkew2eXQZt65g5CQ==} peerDependencies: msw: ^2.4.9 - vite: ^6.0.0 || ^7.0.0 || ^8.0.0-0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@4.1.0': - resolution: {integrity: sha512-3RZLZlh88Ib0J7NQTRATfc/3ZPOnSUn2uDBUoGNn5T36+bALixmzphN26OUD3LRXWkJu4H0s5vvUeqBiw+kS0A==} + '@vitest/pretty-format@4.1.11': + resolution: {integrity: sha512-yiZzPbGTS9Sr/JpFl8zHrcIkAofNbFV6k21vIgQN/cY/oxZeXhJv5sc/MBJ5jFKWmWs+oJHw0UXLZjmf931+Vw==} - '@vitest/runner@4.1.0': - resolution: {integrity: sha512-Duvx2OzQ7d6OjchL+trw+aSrb9idh7pnNfxrklo14p3zmNL4qPCDeIJAK+eBKYjkIwG96Bc6vYuxhqDXQOWpoQ==} + '@vitest/runner@4.1.11': + resolution: {integrity: sha512-LztvUgdwMNJMIkj3hQnnxiC2Xy1zNxq928W/xhjCLaNCzqTZOudjwbQf6v9IntZGPw132i2Lq2rgTRZHD3JHNw==} - '@vitest/snapshot@4.1.0': - resolution: {integrity: sha512-0Vy9euT1kgsnj1CHttwi9i9o+4rRLEaPRSOJ5gyv579GJkNpgJK+B4HSv/rAWixx2wdAFci1X4CEPjiu2bXIMg==} + '@vitest/snapshot@4.1.11': + resolution: {integrity: sha512-pN7ikn1ON7h8ee4gIAp4AzyK+zBtJPzVbqOgu5LCEh4VaJVbPQcgYQYJIMGQPXVeJJq1fnfazis7a5pFNPahog==} - '@vitest/spy@4.1.0': - resolution: {integrity: sha512-pz77k+PgNpyMDv2FV6qmk5ZVau6c3R8HC8v342T2xlFxQKTrSeYw9waIJG8KgV9fFwAtTu4ceRzMivPTH6wSxw==} + '@vitest/spy@4.1.11': + resolution: {integrity: sha512-apNa/prQy2qCeywhnixOHPRCgGNhvg7T4Dapfl1GahLp/R+uhBm5cPyFoNVyqsNd2h1nJxL6BqqdIjiABL60YA==} - '@vitest/utils@4.1.0': - resolution: {integrity: sha512-XfPXT6a8TZY3dcGY8EdwsBulFCIw+BeeX0RZn2x/BtiY/75YGh8FeWGG8QISN/WhaqSrE2OrlDgtF8q5uhOTmw==} + '@vitest/utils@4.1.11': + resolution: {integrity: sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} - engines: {node: '>=0.4.0'} - - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + acorn-walk@8.3.5: + resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} engines: {node: '>=0.4.0'} - hasBin: true - acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + acorn@8.18.0: + resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} engines: {node: '>=0.4.0'} hasBin: true @@ -1810,12 +1859,11 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} - ajv@6.14.0: - resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} @@ -1825,6 +1873,10 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + ansi-regex@6.3.0: + resolution: {integrity: sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==} + engines: {node: '>=12'} + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -1833,6 +1885,10 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + ansible-vault@1.3.0: resolution: {integrity: sha512-LPqmE+ZJX4cY+fMfGc6ooXzmkPga/oYn05xJ7DQqDgZUYX/JBCB8GIEPHHRsTcCqq8YQddEpt/SWwALNNbeyyg==} engines: {node: '>=18.0.0'} @@ -1844,8 +1900,8 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - apple-signin-auth@2.0.0: - resolution: {integrity: sha512-/O5gvAby7OU2K7baYQCzY0e0tCiHzhFkzt9L2v3bMd2I2w0ckCZ/4hdVUOrbolRGMppME+Zo8TAKPVru8aYnzg==} + apple-signin-auth@2.1.0: + resolution: {integrity: sha512-2ZWK88Cf3d2+HauqxZB8IjkAFnpgLbcw9NmxYtkcYsseSc74klYXog62fxfjVuhwtxkYhZycogXJC9GyhcTI8w==} engines: {node: '>=18.0.0'} arg@4.1.3: @@ -1857,13 +1913,6 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - asn1@0.2.6: - resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} - asn1js@3.0.10: resolution: {integrity: sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==} engines: {node: '>=12.0.0'} @@ -1876,40 +1925,44 @@ packages: resolution: {integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==} engines: {node: '>= 6.0.0'} - babel-jest@29.7.0: - resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + babel-jest@30.5.1: + resolution: {integrity: sha512-ge1xUVZS91ml09YRMgRGgeKJ4YJpcOiuwteAxFBYLugQyp7cRw+hHej6Ho0vPjvLrjq60bb7JPHH9LAMA1/krA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: - '@babel/core': ^7.8.0 + '@babel/core': ^7.11.0 || ^8.0.0-0 - babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} + babel-plugin-istanbul@8.0.0: + resolution: {integrity: sha512-18wCskrN3DgbuBmp1gr7LBGT8xdz5xhQQqFvFhVxbkl8VBCrMKQ2YtqBWtUal1Zrc1HTuX0011+Brjw78TCFkg==} + engines: {node: '>=18'} - babel-plugin-jest-hoist@29.6.3: - resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + babel-plugin-jest-hoist@30.5.0: + resolution: {integrity: sha512-gtGo1B+u14jrZQv6TdSWIWkTqclboo7Qn+dFAGUOIuXLFuJKAdg3U5MIWzZnW4vfUb4dX9skmAMiby86e/SF4A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} babel-preset-current-node-syntax@1.2.0: resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} peerDependencies: '@babel/core': ^7.0.0 || ^8.0.0-0 - babel-preset-jest@29.6.3: - resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + babel-preset-jest@30.5.0: + resolution: {integrity: sha512-ZGPn5ClP4lBDpuOK8W1yQIOy359HmbnZv3suucAlIe+SEE9yDsxV4S2PjSbH2Vc97U+WmzYD7vw3kr8NsQ/i6w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.11.0 || ^8.0.0-beta.1 || ^8.0.0 - balanced-match@4.0.3: - resolution: {integrity: sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g==} - engines: {node: 20 || >=22} + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.9.6: - resolution: {integrity: sha512-v9BVVpOTLB59C9E7aSnmIF8h7qRsFpx+A2nugVMTszEOMcfjlZMsXRm4LF23I3Z9AJxc8ANpIvzbzONoX9VJlg==} + baseline-browser-mapping@2.11.21: + resolution: {integrity: sha512-uh8vpY/1/YyFkunIDFH/12p7/7VdPKA1hejMVEbdkEaWnUz0Hesvx5EbiU6XxjyHZIOju+ZMbQJkRh+es3/spQ==} + engines: {node: '>=6.0.0'} hasBin: true bcryptjs@2.4.3: @@ -1918,13 +1971,12 @@ packages: before-after-hook@2.2.3: resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} - better-path-resolve@1.0.0: - resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} - engines: {node: '>=4'} + better-result@2.10.0: + resolution: {integrity: sha512-oQhh0y1qo2/ZKdAAEvHZAqKKiHOFU5k/bW96fE2ScgQOVkJRiHwB+nOS1SgFsYqRlxMDWvefXi9Q3px7QvgNDw==} - better-sqlite3@12.8.0: - resolution: {integrity: sha512-RxD2Vd96sQDjQr20kdP+F+dK/1OUNiVOl200vKBZY8u0vTwysfolF6Hq+3ZK2+h8My9YvZhHsF+RSGZW2VYrPQ==} - engines: {node: 20.x || 22.x || 23.x || 24.x || 25.x} + better-sqlite3@12.11.1: + resolution: {integrity: sha512-dq9AtApgg5PGFtBzPFSBl3HZQjHok5gaQCM6zh2Yk0aSmDCs1CbnVI8/HgASQkNKsWFpseIO9beg5xxpYhbIfA==} + engines: {node: 20.x || 22.x || 23.x || 24.x || 25.x || 26.x} bignumber.js@9.3.1: resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} @@ -1938,16 +1990,18 @@ packages: bowser@2.14.1: resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} - brace-expansion@5.0.2: - resolution: {integrity: sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==} - engines: {node: 20 || >=22} + brace-expansion@1.1.18: + resolution: {integrity: sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==} - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} + brace-expansion@2.1.4: + resolution: {integrity: sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==} - browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + brace-expansion@5.0.9: + resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} + engines: {node: 20 || >=22} + + browserslist@4.28.9: + resolution: {integrity: sha512-EWazOblFYUvlGZcfGhPUPmYh3nikUxBVb+y9MJun5f3hBi812X+8MSQTujLBtgK3cf51fJWbWfOjyeO954d+Eg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1961,9 +2015,6 @@ packages: buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} @@ -1971,12 +2022,12 @@ packages: resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: - esbuild: '>=0.18' + esbuild: '>=0.28.1' - c12@3.1.0: - resolution: {integrity: sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==} + c12@3.3.4: + resolution: {integrity: sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA==} peerDependencies: - magicast: ^0.3.5 + magicast: '*' peerDependenciesMeta: magicast: optional: true @@ -1985,6 +2036,10 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + cac@7.0.0: + resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} + engines: {node: '>=20.19.0'} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -1997,8 +2052,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001760: - resolution: {integrity: sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==} + caniuse-lite@1.0.30001810: + resolution: {integrity: sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==} chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} @@ -2012,35 +2067,26 @@ packages: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} - chardet@2.1.1: - resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} - - chevrotain@10.5.0: - resolution: {integrity: sha512-Pkv5rBY3+CsHOYfV5g/Vs5JY9WTHHDEKOlohI2XeygaZhUeqhAlldZ8Hz9cRmxu709bvS08YzxHdTPHhffc13A==} - chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - - ci-info@4.3.1: - resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} - citty@0.1.6: - resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} - - citty@0.2.1: - resolution: {integrity: sha512-kEV95lFBhQgtogAPlQfJJ0WGVSokvLr/UEoFPiKKOXF7pl98HfUVUD0ejsuTCld/9xH9vogSywZ5KqHzXrZpqg==} + cjs-module-lexer@2.2.1: + resolution: {integrity: sha512-Ca8swihM+/4yKecYHY52kgJd300hi2lADU/a1RxNTRe+RJ9jvqQlESpbz9DnG9mowez8qwXHB8qYdIUw9e+F5Q==} - cjs-module-lexer@1.4.3: - resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} @@ -2068,12 +2114,18 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} confbox@0.2.4: resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} + confbox@0.3.1: + resolution: {integrity: sha512-cKUSoKa8YxFZZSmraVi7onONx3amu77ngK3kGpsYHDH7drPwCRkQE1RYMPlLRrMtnciRj274XNRxcHxnKmDSnA==} + consola@3.4.2: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} @@ -2089,11 +2141,6 @@ packages: resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} engines: {node: '>=12.13'} - create-jest@29.7.0: - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -2104,6 +2151,54 @@ packages: csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + d3-array@3.2.1: + resolution: {integrity: sha512-gUY/qeHq/yNqqoCKNq4vtpFLdoCdvyNpWoC/KNjhGbhDuQpAM9sIQQKkXSNpXa9h5KySs/gzm7R88WkUutgwWQ==} + engines: {node: '>=12'} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.2: + resolution: {integrity: sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==} + engines: {node: '>=12'} + + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + d3-geo@3.1.0: + resolution: {integrity: sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + data-uri-to-buffer@4.0.1: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} @@ -2121,8 +2216,8 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - dedent@1.7.0: - resolution: {integrity: sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==} + dedent@1.7.2: + resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -2136,20 +2231,19 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - deepmerge-ts@7.1.5: - resolution: {integrity: sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==} - engines: {node: '>=16.0.0'} + deepmerge-ts@8.0.2: + resolution: {integrity: sha512-uqbvqLUMrc6p0MO+WBRtTxY55hmyh94WRwI5a++PZe54X+bfVh59FSN7uWCBCW1CCVjzjnrwzfI8zidE2obMMw==} + engines: {node: '>=16.9.0'} deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} - defu@6.1.4: - resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} - denque@2.1.0: - resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} - engines: {node: '>=0.10'} + delaunator@5.1.0: + resolution: {integrity: sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==} deprecation@2.3.1: resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} @@ -2157,10 +2251,6 @@ packages: destr@2.0.5: resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} - detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -2169,28 +2259,20 @@ packages: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - diff@8.0.3: - resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} + diff@4.0.4: + resolution: {integrity: sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==} engines: {node: '>=0.3.1'} - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} - dotenv@16.6.1: - resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + dotenv@17.4.2: + resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} engines: {node: '>=12'} - drizzle-orm@0.44.7: - resolution: {integrity: sha512-quIpnYznjU9lHshEOAYLoZ9s3jweleHlZIAWR/jX9gAWNg/JhQ1wj0KGRf7/Zm+obRrYd9GjPVJg790QY9N5AQ==} + drizzle-orm@0.45.2: + resolution: {integrity: sha512-kY0BSaTNYWnoDMVoyY8uxmyHjpJW1geOmBMdSSicKo9CIIWkSxMIj2rkeSR51b8KAPB7m+qysjuHme5nKP+E5Q==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' '@cloudflare/workers-types': '>=4' @@ -2215,7 +2297,7 @@ packages: gel: '>=2' knex: '*' kysely: '*' - mysql2: '>=2' + mysql2: '>=3.24.3' pg: '>=8' postgres: '>=3' prisma: '*' @@ -2281,14 +2363,20 @@ packages: sqlite3: optional: true + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - effect@3.18.4: - resolution: {integrity: sha512-b1LXQJLe9D11wfnOKAk3PKxuqYshQ0Heez+y5pnkd3jLj1yx9QhM72zZ9uUrOQyNvrs2GZZd/3maL0ZV18YuDA==} + effect@3.20.0: + resolution: {integrity: sha512-qMLfDJscrNG8p/aw+IkT9W7fgj50Z4wG5bLBy0Txsxz8iUHjDIkOgO3SV0WZfnQbNG2VJYb0b+rDLMrhM4+Krw==} + + electron-to-chromium@1.5.422: + resolution: {integrity: sha512-UvA/32XqrLDdZSn7Jllo1AYNcWji/G0d5M0GTViE7KoGBiMunw3a34Sb2KO4ZZyrSEhqsxFoVhWWJshdyfKqJA==} - electron-to-chromium@1.5.267: - resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} + elkjs@0.11.1: + resolution: {integrity: sha512-zxxR9k+rx5ktMwT/FwyLdPCrq7xN6e4VGGHH8hA01vVYKjTFik7nHOxBnAYtrgYUB1RpAiLvA1/U2YraWxyKKg==} emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -2297,6 +2385,9 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + empathic@2.0.0: resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} engines: {node: '>=14'} @@ -2304,18 +2395,18 @@ packages: end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} + env-paths@3.0.0: + resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - es-module-lexer@2.0.0: - resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} + es-module-lexer@2.3.2: + resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} - esbuild@0.27.4: - resolution: {integrity: sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==} + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} engines: {node: '>=18'} hasBin: true @@ -2339,6 +2430,10 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + eslint@8.57.1: resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2377,61 +2472,61 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} - exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + exit-x@0.2.2: + resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} engines: {node: '>= 0.8.0'} expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} - expect-type@1.3.0: - resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} + expect-type@1.4.0: + resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} - expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - expect@30.2.0: - resolution: {integrity: sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==} + expect@30.5.1: + resolution: {integrity: sha512-m8YrYgvKe9+9gEnWEuKz+qCGfHqkrff7PPfyDnOFkjsfYRKqiYyOxDFMFieCGAuhtk/VNm63tvNgKZVzVy+Hvg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - exsolve@1.0.8: - resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + exsolve@1.1.1: + resolution: {integrity: sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==} extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - extendable-error@0.1.7: - resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - fast-check@3.23.2: resolution: {integrity: sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==} engines: {node: '>=8.0.0'} + fast-decode-uri-component@1.0.1: + resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-xml-builder@1.0.0: - resolution: {integrity: sha512-fpZuDogrAgnyt9oDDz+5DBz0zgPdPZz6D4IR7iESxRXElrlGTRkHJ9eEt+SACRJwT0FNFrt71DFQIUFBJfX/uQ==} + fast-querystring@1.1.2: + resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} - fast-xml-parser@5.4.1: - resolution: {integrity: sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A==} - hasBin: true + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + + fast-uri@3.1.7: + resolution: {integrity: sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg==} + + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} - fastq@1.20.1: - resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + fastq@1.20.3: + resolution: {integrity: sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==} fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} @@ -2456,9 +2551,9 @@ packages: file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} + find-my-way@9.7.0: + resolution: {integrity: sha512-f2JHn75x2JlwUwLenZypgczR7YWMb/uO9BvUXtus+JMgkbIkLADd38cI4EiV+OQqrGo1Zlq6V8wnqMJ8e62wUQ==} + engines: {node: '>=20'} find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} @@ -2475,8 +2570,8 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} - flatted@3.4.2: - resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + flatted@3.4.4: + resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} @@ -2489,14 +2584,6 @@ packages: fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} - - fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} - fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -2510,11 +2597,8 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - gaxios@7.1.4: - resolution: {integrity: sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==} + gaxios@7.3.1: + resolution: {integrity: sha512-kB3rzJV7d9juLZh8/56QTXCwQfxyhdOMdyYk1HdQKFtF8TJTDTZQJtixWIwXdE9Jji91mC41DUNpjleo4L4eAQ==} engines: {node: '>=18'} gcp-metadata@8.1.2: @@ -2543,38 +2627,36 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - get-tsconfig@4.13.7: - resolution: {integrity: sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==} - - giget@2.0.0: - resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} + giget@3.3.1: + resolution: {integrity: sha512-r+mvuDjrjMpsdw46Kmeydb8bdHm7wOKw8wNBtTndkjbPjgAp5oUJUxRE76wZFknxIPokfWvep2qSXK37aXE6zg==} hasBin: true github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@7.2.3: + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + hasBin: true + + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} + + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - - google-auth-library@10.6.2: - resolution: {integrity: sha512-e27Z6EThmVNNvtYASwQxose/G57rkRuaRbQyxM2bvYLLX/GqWZ5chWq2EBoUchJbCc57eC9ArzO5wMsEmWftCw==} + google-auth-library@10.9.1: + resolution: {integrity: sha512-i1ydyHrqcIxXkWh/uBmVkzCvIuq5yiK2ATndIe5XxKholrG/MTYP9xGYka4sQhrbIAgGjL2B6NOE7rFaiF3fXw==} engines: {node: '>=18'} google-logging-utils@1.1.3: @@ -2584,8 +2666,8 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - grammex@3.1.12: - resolution: {integrity: sha512-6ufJOsSA7LcQehIJNCO7HIBykfM7DXQual0Ny780/DEcJIpBlHRvcqEBWGPYd7hrXL2GJ3oJI1MIhaXjWmLQOQ==} + grammex@3.1.13: + resolution: {integrity: sha512-LnPnhOBLEJEVKS8WFDVaA397L9Kq55Q9oSITJiVLHVdhAclfUkWzQv74KhvZHKL2Q09Pb1XdsrOsZ4LfTFFTEg==} graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} @@ -2593,8 +2675,8 @@ packages: graphmatch@1.1.1: resolution: {integrity: sha512-5ykVn/EXM1hF0XCaWh05VbYvEiOL2lY1kBxZtaYsyvjp7cmWOU1XsAdfQBwClraEofXDT197lFbXOEVMHpvQOg==} - handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + handlebars@4.7.9: + resolution: {integrity: sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==} engines: {node: '>=0.4.7'} hasBin: true @@ -2602,34 +2684,23 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - hono@4.12.8: - resolution: {integrity: sha512-VJCEvtrezO1IAR+kqEYnxUOoStaQPGrCmX3j4wDTNOcD1uRPFpGlwQUIW8niPuvHXaTUxeOUl5MMDGrl+tmO9A==} - engines: {node: '>=16.9.0'} - html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - http-status-codes@2.3.0: - resolution: {integrity: sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==} - https-proxy-agent@7.0.6: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} - human-id@4.1.3: - resolution: {integrity: sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q==} + human-id@4.2.1: + resolution: {integrity: sha512-zPGsiS+dWoTZtZ4AtpA9Y+BdSFSNWvnouNlWNoUFyAM6xHOHmdCvqO3k8AIbdamCOv4gUFUVNPf6rJFfc4UiJw==} hasBin: true human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} - iconv-lite@0.7.2: - resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} engines: {node: '>=0.10.0'} ieee754@1.2.1: @@ -2639,6 +2710,10 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + ignore@7.0.8: + resolution: {integrity: sha512-YYNsSlXBjMk92SKnkwvB5LOVSa6OznlFUGcsvrFgNJbJCd0M1XKeFVRc8ZByeCqz32FivYNHJVooLmdqrmvp/Q==} + engines: {node: '>= 4'} + import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -2648,6 +2723,9 @@ packages: engines: {node: '>=8'} hasBin: true + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -2662,13 +2740,13 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} - engines: {node: '>= 0.4'} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -2685,10 +2763,6 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} @@ -2700,18 +2774,10 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - is-subdir@1.2.0: - resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} - engines: {node: '>=4'} - is-what@4.1.16: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} - is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -2719,10 +2785,6 @@ packages: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} - istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} - istanbul-lib-instrument@6.0.3: resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} engines: {node: '>=10'} @@ -2731,25 +2793,28 @@ packages: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} - istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} engines: {node: '>=10'} istanbul-reports@3.2.0: resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} - jest-changed-files@29.7.0: - resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jest-changed-files@30.5.1: + resolution: {integrity: sha512-0+bvMM/ENhDI29Z8q1r4HxiDIi4G5tnBmSw4esfPQoj9q8Nik7KIyuxHkTVnnniJQf05SxpGaKDQ+4h28ynGPg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-circus@29.7.0: - resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-circus@30.5.1: + resolution: {integrity: sha512-NgliezXQ6yznqR4W5Gqw++0cZSbBZlF0NknNIAE5VmSJKWOtmWJmWnBq3TSkUOVBTPrT7FGGhVdA8DLWnxo2Sw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-cli@29.7.0: - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-cli@30.5.1: + resolution: {integrity: sha512-uwNYepWgaNBCplm42fCIUZTf/tIEHIy5AYvx7eL1BrwIgyjPt+2poouR23UO2yopIP+kV8oZFHfv+l4pg/8prQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -2757,134 +2822,100 @@ packages: node-notifier: optional: true - jest-config@29.7.0: - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-config@30.5.1: + resolution: {integrity: sha512-L8PKM2X/ngG8PxfLMqglKGZjylPgw84bVPUlMY9W/o76TnLqPWrmQgsaT0HrheGdRtpGE5FbmREA0Kvb+Qx5gQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: '@types/node': '*' + esbuild-register: '>=3.4.0' ts-node: '>=9.0.0' peerDependenciesMeta: '@types/node': optional: true + esbuild-register: + optional: true ts-node: optional: true - jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-diff@30.2.0: - resolution: {integrity: sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==} + jest-diff@30.5.1: + resolution: {integrity: sha512-e3cNNMpv8Kh20MjjphTXs+3Vz7DQyLM1nft7KJhnh46atFhjVJRa+0Hq0beywuwsACtMQUBihQkFl8zxb7gt1Q==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-docblock@29.7.0: - resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-each@29.7.0: - resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-environment-node@29.7.0: - resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-haste-map@29.7.0: - resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-leak-detector@29.7.0: - resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-matcher-utils@30.2.0: - resolution: {integrity: sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==} + jest-docblock@30.5.0: + resolution: {integrity: sha512-NwDqcxtoZi33RhuW+zJS/RVA3rmheQ8BnwpYZuc/Eruaz6seQb7+aoCeDZu/3X7W2XmD8DbSo9Pn72DbKsBFYw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-each@30.5.1: + resolution: {integrity: sha512-S1af0TU4v1EZ/AUlkFs/sxf/5KGsbAT9kRgdyoMX/x72y7C8ZEgETE5o1TPnbKRnrbprc5FR/moYLfdRmqEjsQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-message-util@30.2.0: - resolution: {integrity: sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==} + jest-environment-node@30.5.1: + resolution: {integrity: sha512-LrPj3sPMjsQoOB3jrb8p/sa+XkSFNKo60TTsyc+EB2kxQJHgbwElpXnx1yX25fdFn5958FIObRtcLSHyV8VIAw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-haste-map@30.5.1: + resolution: {integrity: sha512-VIFgt67jW480YDxKfEv9IYQKrFpYt7bOCMn3VsnjK7AK9qo7p6acpnA1DHwsVOULE3dTaYew/6JaTD/d0VDHoQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-mock@30.2.0: - resolution: {integrity: sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==} + jest-leak-detector@30.5.1: + resolution: {integrity: sha512-gt4GT2aWgEoCNTcBe4rqS74xTIUJxi+UD9SNSu9aOk5LmTEd6fS5KSTmAKAfitCCktQHNN+upUuL6EkBfFbMDQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-pnp-resolver@1.2.3: - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true + jest-matcher-utils@30.5.1: + resolution: {integrity: sha512-aroZVqwOz/wC2y6pC+obgFWKV9viaQWQTTSB6W5H55+egtUczIfXR/rxExTv92xD/ADYwpqaYfVWx1aqwKg7FA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-regex-util@29.6.3: - resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-message-util@30.5.1: + resolution: {integrity: sha512-UdQlLdd9wL/Ys7xRErckqwD6wPlSZYueosSWuHc1r2ztGLwlgPvtSJq2+BPEgaEY13WLvfFbmhTj8pba0Sd1jg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-regex-util@30.0.1: - resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==} + jest-mock@30.5.1: + resolution: {integrity: sha512-9fVjc3leUpGID2/by/LU4Dvdcp7PFh9LlxS3QRWK3ABm+KtvEVsG/AEGeLY3gKOZsjkBxyfwGltoAVlW7dygHg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-resolve-dependencies@29.7.0: - resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-regex-util@30.5.0: + resolution: {integrity: sha512-Mg0WK7A6xRHLSA1udJ8y9f3lM0uUhFTBnLKzwPmqB9AylvpleJ6BLemR8K9dK27DY+cesDryoA7yLZCAHsPG1A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-resolve@29.7.0: - resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-resolve-dependencies@30.5.1: + resolution: {integrity: sha512-JKpXGONDcTaunrNVn8KCl6qAnwl06jIkvv70lhq0Ze47lsPx9sH5HoeEUiXX6iFGnliHN/qpIbQ0l38wrVmXaw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-runner@29.7.0: - resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-resolve@30.5.1: + resolution: {integrity: sha512-wprhLejRtwN6h8ZgaqC0eYjGJ1uMdGPT/+b3eFncbG4NWuuP9QL+vWwRinu9waw7hkOLcpMJGVJAMgBwsPssMQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-runtime@29.7.0: - resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-runner@30.5.1: + resolution: {integrity: sha512-FPlQE4+mwnFxXmpPrSi836KV2ZzvK1g6/nPCT8o5BcoDUUNJQeHo1/Qdkoe/QeoL4M7OeJpbnGUhYKhC1VMdaQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-snapshot@29.7.0: - resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-runtime@30.5.1: + resolution: {integrity: sha512-UB88+NRkK2Tw/OqV7dofYcyiUGrVZtD41k/N0xQOs9fG//57XHK7JLWG52HD1UYpUAhjK4xm6DBvFX3yWudsMA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-snapshot@30.5.1: + resolution: {integrity: sha512-cNWFdSb5xuDGl8hKkAZJ3YtI/PzHpAPFV+HUXWIOG8rMhpDTLVbvAc2d2wRicoYw2wGsJGLaurJT6BLC97bLXQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-util@30.2.0: - resolution: {integrity: sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==} + jest-util@30.5.1: + resolution: {integrity: sha512-yKuxmNy2rSbTXw+3SIPanJo+nV4/BS1p26v44IYBFMsswSQySfMMcPHErnOncda7i9HEz0q605rIhSTBVgrZTg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-validate@29.7.0: - resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-validate@30.5.1: + resolution: {integrity: sha512-i/buJ56wTpxihE93hQYNMfdOThS87+HGvLZzZJmU4xggPcdTYQq051iwALLCHp3q+SkCGH+EFejQZz5EbBSkkg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-watcher@29.7.0: - resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-watcher@30.5.1: + resolution: {integrity: sha512-+FHJ7C+S7b3ySfhA1aFmoa6TztsnwZVv84ycPRn0tVN93np2EU4b8C/KadqA3l6igdjgLBTnUotab9ER0HLG8A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-worker@30.5.1: + resolution: {integrity: sha512-Cbxh5v7AoLuFRmFJSM4/aHdQ68rjXvUWr716EE0Dh3I7T+T/3FgFKhOERGXHcU2Meftq9+9zxPM3TSNyI9D+HA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest@29.7.0: - resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest@30.5.1: + resolution: {integrity: sha512-3qrR8+ZXFnn7y0H2yjWQNkGGBLBY4zTRoTMAq9zJcgwLLtlyonfsCLviIXK9xuE2KgIyM+M36AFcoK2DgFR36w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -2892,10 +2923,13 @@ packages: node-notifier: optional: true - jiti@2.6.1: - resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} @@ -2903,12 +2937,12 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@3.14.2: - resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} + js-yaml@3.15.2: + resolution: {integrity: sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==} hasBin: true - js-yaml@4.1.1: - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + js-yaml@4.3.2: + resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} hasBin: true jsesc@3.1.0: @@ -2928,6 +2962,9 @@ packages: json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -2936,15 +2973,15 @@ packages: engines: {node: '>=6'} hasBin: true - jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} jsonwebtoken@9.0.3: resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} engines: {node: '>=12', npm: '>=6'} - jssha@3.3.1: - resolution: {integrity: sha512-VCMZj12FCFMQYcFLPRm/0lOBbLi8uM2BhXPTqw3U4YAfs4AZfiApOoBLoN8cQE60Z50m1MYMTQVCfgF/KaCVhQ==} + jssha@3.3.2: + resolution: {integrity: sha512-0RhFxzijV4W0qTXa97D5b6twAWXX7SEOpw8qzAZyZ+oeGOP9e84PnDSLjl7SBB1vBQ+chSUwsZR06i1AzA+nEA==} jwa@2.0.1: resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} @@ -2955,9 +2992,8 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} + launch-editor@2.14.1: + resolution: {integrity: sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==} leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} @@ -2967,16 +3003,6 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - libsodium-wrappers@0.7.15: - resolution: {integrity: sha512-E4anqJQwcfiC6+Yrl01C1m8p99wEhLmJSs0VQqST66SbQXXBoaJY0pF4BNjRYa/sOQAxx6lXAaAFIlx+15tXJQ==} - - libsodium@0.7.15: - resolution: {integrity: sha512-sZwRknt/tUpE2AwzHq3jEyUU5uvIZHtSssktXq7owd++3CSgn8RGrv6UZJJBpP7+iBghBqe7Z06/2M31rI2NKw==} - - lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} - lilconfig@3.1.3: resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} @@ -3023,20 +3049,24 @@ packages: lodash.once@4.1.1: resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - - lodash@4.17.23: - resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} long@5.3.2: resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@11.5.2: + resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lru.min@1.1.4: - resolution: {integrity: sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==} + lru.min@1.1.5: + resolution: {integrity: sha512-5J9ysMYUpYIg9RF2vJpy9SinEmSviFSe0GyPpCQ4L5QSkLAgeLXlTAOu2ZwWUU5m+0SBl6gUU1R1ZQB3aKypfA==} engines: {bun: '>=1.0.0', deno: '>=1.30.0', node: '>=8.0.0'} magic-string@0.30.21: @@ -3049,20 +3079,9 @@ packages: make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -3071,29 +3090,38 @@ packages: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - minimatch@10.2.1: - resolution: {integrity: sha512-MClCe8IL5nRRmawL6ib/eT4oLyeKMGCghibcDWK+J0hh0Q8kqSdia6BvbRMVk6mPa6WqUa5uR2oxt6C5jd533A==} - engines: {node: 20 || >=22} + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} + engines: {node: 18 || 20 || >=22} + + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} + mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} mlly@1.8.2: resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} - mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - mysql2@3.15.3: - resolution: {integrity: sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==} + mysql2@3.24.3: + resolution: {integrity: sha512-OKfWHkMAg9v06neq8FmSyhbxPQKABN9PAW5G9/bDTXzJBO5xXtkKL0V27vju7HQWk9UD4Od5BZsvCtBTB1CPEw==} engines: {node: '>= 8.0'} + peerDependencies: + '@types/node': '>= 8' mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -3102,32 +3130,37 @@ packages: resolution: {integrity: sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==} engines: {node: '>=8.0.0'} - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + nanoid@3.3.18: + resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true napi-build-utils@2.0.0: resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + napi-postinstall@0.3.4: + resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - node-abi@3.89.0: - resolution: {integrity: sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==} + node-abi@3.96.0: + resolution: {integrity: sha512-rebQ/lz7i0EkoLzUVSrKRzA69zMkwLp95kKMWoMDkkM00Suxz0D7zEQPwRml5fQum24mj7bPvmlgLAmu2JCiYg==} engines: {node: '>=10'} + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} deprecated: Use your platform's native DOMException instead - node-fetch-native@1.6.7: - resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} - node-fetch@3.3.2: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3135,11 +3168,9 @@ packages: node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - node-releases@2.0.27: - resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} - - node-rsa@1.1.1: - resolution: {integrity: sha512-Jd4cvbJMryN21r5HgxQOpMEqv+ooke/korixNNK3mGqfGJmy0M77WDDzo/05969+OkMy3XW1UuZsSmW9KQm7Fw==} + node-releases@2.0.54: + resolution: {integrity: sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==} + engines: {node: '>=18'} normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} @@ -3149,23 +3180,16 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} - nypm@0.6.5: - resolution: {integrity: sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ==} - engines: {node: '>=18'} - hasBin: true - object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - obuf@1.1.2: - resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - - obug@2.1.1: - resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + obug@2.1.4: + resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} + engines: {node: '>=12.20.0'} - ohash@2.0.11: - resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + ohash@2.0.12: + resolution: {integrity: sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==} once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -3178,13 +3202,6 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - outdent@0.5.0: - resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - - p-filter@2.1.0: - resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} - engines: {node: '>=8'} - p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -3201,16 +3218,15 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} - p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - package-manager-detector@0.2.11: - resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-manager-detector@1.8.0: + resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==} parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} @@ -3232,51 +3248,44 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - perfect-debounce@1.0.0: - resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + perfect-debounce@2.1.0: + resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} - pg-cloudflare@1.3.0: - resolution: {integrity: sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==} + pg-cloudflare@1.4.0: + resolution: {integrity: sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A==} - pg-connection-string@2.12.0: - resolution: {integrity: sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ==} + pg-connection-string@2.14.0: + resolution: {integrity: sha512-XwWDGcLRGCXAR8F/AM5bG7Q+A3Wm2s6QeEjlOKZLlH3UYcguiqCWKyWXVag5TLTIjR7oOJUY8kcADaZgWPyLeg==} pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} - pg-numeric@1.0.2: - resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==} - engines: {node: '>=4'} - - pg-pool@3.13.0: - resolution: {integrity: sha512-gB+R+Xud1gLFuRD/QgOIgGOBE2KCQPaPwkzBBGC9oG69pHTkhQeIuejVIk3/cnDyX39av2AxomQiyPT13WKHQA==} + pg-pool@3.14.0: + resolution: {integrity: sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw==} peerDependencies: pg: '>=8.0' - pg-protocol@1.13.0: - resolution: {integrity: sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w==} + pg-protocol@1.16.0: + resolution: {integrity: sha512-sILXutLVjCLjcDuOmvhX5e2Z4cS5qG/6Bu3VkpFwdf/633ElGLpEh9bgmuI5I4sqKqkifQiGyiCcx1HdtrK7tg==} pg-types@2.2.0: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} engines: {node: '>=4'} - pg-types@4.1.0: - resolution: {integrity: sha512-o2XFanIMy/3+mThw69O8d4n1E5zsLhdO+OPqswezu7Z5ekP4hYDqlDjlmOpYMbzY2Br0ufCwJLdDIXeNVwcWFg==} - engines: {node: '>=10'} - - pg@8.20.0: - resolution: {integrity: sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA==} + pg@8.23.0: + resolution: {integrity: sha512-Ip2EQCngowJLGOfCwkFhPXU7/ljlhn6Rxlmy4XYfL2Y+vyRM59+8uR2xqRWKdYmbXmxCFOAmKxBuSUCdF34qLg==} engines: {node: '>= 16.0.0'} peerDependencies: pg-native: '>=3.0.1' @@ -3290,18 +3299,14 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} engines: {node: '>=12'} - pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - pirates@4.0.7: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} @@ -3313,17 +3318,17 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - pkg-types@2.3.0: - resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + pkg-types@2.3.2: + resolution: {integrity: sha512-v0sVXzj7oPGysr543YYZLYbcJNJsKikSsp/fFzoxQ12ewY3ZZr7oCPC8y7OlmxfYB3QPvriXmuPD8KZggE1vqg==} - playwright-core@1.58.2: - resolution: {integrity: sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==} - engines: {node: '>=18'} + playwright-core@1.62.1: + resolution: {integrity: sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==} + engines: {node: '>=20'} hasBin: true - playwright@1.58.2: - resolution: {integrity: sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==} - engines: {node: '>=18'} + playwright@1.62.1: + resolution: {integrity: sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==} + engines: {node: '>=20'} hasBin: true postcss-load-config@6.0.1: @@ -3344,8 +3349,8 @@ packages: yaml: optional: true - postcss@8.5.8: - resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} + postcss@8.5.28: + resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==} engines: {node: ^10 || ^12 || >=14} postgres-array@2.0.0: @@ -3360,29 +3365,14 @@ packages: resolution: {integrity: sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==} engines: {node: '>=0.10.0'} - postgres-bytea@3.0.0: - resolution: {integrity: sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==} - engines: {node: '>= 6'} - postgres-date@1.0.7: resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} engines: {node: '>=0.10.0'} - postgres-date@2.1.0: - resolution: {integrity: sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==} - engines: {node: '>=12'} - postgres-interval@1.2.0: resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} engines: {node: '>=0.10.0'} - postgres-interval@3.0.0: - resolution: {integrity: sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==} - engines: {node: '>=12'} - - postgres-range@1.1.4: - resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==} - postgres@3.4.7: resolution: {integrity: sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==} engines: {node: '>=12'} @@ -3397,26 +3387,17 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - - prettier@3.8.1: - resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + prettier@3.9.6: + resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==} engines: {node: '>=14'} hasBin: true - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - pretty-format@30.2.0: - resolution: {integrity: sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==} + pretty-format@30.5.1: + resolution: {integrity: sha512-byhRAPguVKMQIj4kjJwJ5lAskVhfuiSdiYl/aLTWpgkGEmic2jYhJh1yE9ih8Ox44Xg9ccCT11/S6QrzSJuNrg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - prisma@7.5.0: - resolution: {integrity: sha512-n30qZpWehaYQzigLjmuPisyEsvOzHt7bZeRyg8gZ5DvJo9FGjD+gNaY59Ns3hlLD5/jZH5GBeftIss0jDbUoLg==} + prisma@7.10.0: + resolution: {integrity: sha512-o0ornyJOWgygVAzGCpr8PdXV8EJLHyVGDDUr/voBQt8Azzw8cYTByzzPGcA/m4tCkPcnJA8raEOv2CslsKhPEw==} engines: {node: ^20.19 || ^22.12 || >=24.0} hasBin: true peerDependencies: @@ -3428,10 +3409,6 @@ packages: typescript: optional: true - prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - proper-lockfile@4.1.2: resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} @@ -3445,47 +3422,50 @@ packages: pure-rand@6.1.0: resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + pure-rand@7.0.1: + resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} + pvtsutils@1.3.6: resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} - pvutils@1.1.5: - resolution: {integrity: sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==} + pvutils@1.2.0: + resolution: {integrity: sha512-BbubeCEyTuQjVMakvJQ/Sxbc93F2pwmbsxONT/ZRrwU7Ua38d8unYTwXpTVLAKJ4BDuH9IGztCjQcd/N/39Dvg==} engines: {node: '>=16.0.0'} - quansync@0.2.11: - resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - rc9@2.1.2: - resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} + rc9@3.1.0: + resolution: {integrity: sha512-ufjkNVzbRHKcCOmTahZkmVsyc3W+MSk3jY03m+a7tGHkIsdVMG9l10/3HvFbWkkKzY5VFp3pkRsIo/UYgmFL7Q==} rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-dom@19.2.4: - resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} + react-dom@19.2.8: + resolution: {integrity: sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==} peerDependencies: - react: ^19.2.4 + react: ^19.2.8 react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react-is@19.2.8: + resolution: {integrity: sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==} + react-refresh@0.18.0: resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} engines: {node: '>=0.10.0'} - react-router-dom@7.13.1: - resolution: {integrity: sha512-UJnV3Rxc5TgUPJt2KJpo1Jpy0OKQr0AjgbZzBFjaPJcFOb2Y8jA5H3LT8HUJAiRLlWrEXWHbF1Z4SCZaQjWDHw==} + react-router-dom@7.18.3: + resolution: {integrity: sha512-ytVbyBBM7vMfRCam25r0WMhSVSom909A8p+8m0/f1w853dz/xfFu6etAT2SEbVoSnI+ZoPRDqIsQXVT89gp7kg==} engines: {node: '>=20.0.0'} peerDependencies: react: '>=18' react-dom: '>=18' - react-router@7.13.1: - resolution: {integrity: sha512-td+xP4X2/6BJvZoX6xw++A2DdEi++YypA69bJUV5oVvqf6/9/9nNlD70YO1e9d3MyamJEBQFEzk6mbfDYbqrSA==} + react-router@7.18.3: + resolution: {integrity: sha512-gyXgtdr5uACJ5b1Q4udzjVV+tb/rlHIMJKuJ0e89R4Kzgz47z/rgP0dIKxktqIEUhDHluGTPJJH/wRha7CyqsA==} engines: {node: '>=20.0.0'} peerDependencies: react: '>=18' @@ -3494,14 +3474,10 @@ packages: react-dom: optional: true - react@19.2.4: - resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} + react@19.2.8: + resolution: {integrity: sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==} engines: {node: '>=0.10.0'} - read-yaml-file@1.1.0: - resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} - engines: {node: '>=6'} - readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -3510,12 +3486,13 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} + readdirp@5.1.1: + resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} + engines: {node: '>= 20.19.0'} + reflect-metadata@0.2.2: resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} - regexp-to-ast@0.5.0: - resolution: {integrity: sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==} - remeda@2.33.4: resolution: {integrity: sha512-ygHswjlc/opg2VrtiYvUOPLjxjtdKvjGz1/plDhkG66hjNjFr1xmfrs2ClNFo/E6TyUFiwYNh53bKV26oBoMGQ==} @@ -3523,6 +3500,10 @@ packages: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} @@ -3535,18 +3516,10 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - - resolve.exports@2.0.3: - resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} + ret@0.5.0: + resolution: {integrity: sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==} engines: {node: '>=10'} - resolve@1.22.11: - resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} - engines: {node: '>= 0.4'} - hasBin: true - retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} @@ -3560,8 +3533,11 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rollup@4.60.0: - resolution: {integrity: sha512-yqjxruMGBQJ2gG4HtjZtAfXArHomazDHoFwFFmZZl0r7Pdo7qCIXKqKHZc8yeoMgzJJ+pO6pEEHa+V7uzWlrAQ==} + robust-predicates@3.0.3: + resolution: {integrity: sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==} + + rollup@4.63.1: + resolution: {integrity: sha512-3Df9jsstwhccuEfmAMi9l8XUh/GOkVObmFTU7CCVBysEbcOZLl84jCtaAZMcPiMz2EGKsATzQcU+Xr3n/wU6cg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3571,6 +3547,10 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-regex2@5.1.1: + resolution: {integrity: sha512-mOSBvHGDZMuIEZMdOz/aCEYDCv0E7nfcNsIhUF+/P+xC7Hyf3FkvymqgPbg9D1EdSGu+uKbJgy09K/RKKc7kJA==} + hasBin: true + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -3581,14 +3561,11 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.3: - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} hasBin: true - seq-queue@0.0.5: - resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} - set-cookie-parser@2.7.2: resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} @@ -3600,6 +3577,10 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shell-quote@1.10.0: + resolution: {integrity: sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==} + engines: {node: '>= 0.4'} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -3627,9 +3608,6 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} - source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -3638,9 +3616,6 @@ packages: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} - spawndamnit@3.0.1: - resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} - split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -3648,9 +3623,9 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - sqlstring@2.3.3: - resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} - engines: {node: '>= 0.6'} + sql-escaper@1.5.1: + resolution: {integrity: sha512-4toX5E1fQbBrpfXidaHnF0669nkAdETeIPTs2SUjxxD7RRIs9ICG4gtpmfc68JCEKehsdwLFqBu9VlQqZ1P1gg==} + engines: {bun: '>=1.0.0', deno: '>=2.0.0', node: '>=12.0.0'} stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} @@ -3662,8 +3637,8 @@ packages: std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} - std-env@4.0.0: - resolution: {integrity: sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==} + std-env@4.2.0: + resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} @@ -3673,6 +3648,10 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -3680,9 +3659,9 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} strip-bom@4.0.0: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} @@ -3700,9 +3679,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strnum@2.1.2: - resolution: {integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==} - sucrase@3.35.1: resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} engines: {node: '>=16 || 14 >=14.17'} @@ -3720,24 +3696,20 @@ packages: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + synckit@0.11.13: + resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==} + engines: {node: ^14.18.0 || >=16.0.0} - tar-fs@2.1.4: - resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} + tar-fs@2.1.5: + resolution: {integrity: sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw==} tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} - term-size@2.2.1: - resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} - engines: {node: '>=8'} - - test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} + test-exclude@7.0.2: + resolution: {integrity: sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==} + engines: {node: '>=18'} text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -3755,25 +3727,18 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyexec@1.0.4: - resolution: {integrity: sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==} + tinyexec@1.3.1: + resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} engines: {node: '>=18'} - tinyglobby@0.2.15: - resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} - tinyrainbow@3.1.0: - resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} + tinyrainbow@3.1.1: + resolution: {integrity: sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==} engines: {node: '>=14.0.0'} - tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - totp-generator@2.0.1: resolution: {integrity: sha512-50DiKmv9zKTPzCgWOqQYVBMvxh+tpL9O3IUFIqzGUlFXzJyb/IQZac8bonXudvLbfuDY8laZ9qTDX+yAvTBNSQ==} @@ -3781,17 +3746,17 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true - ts-api-utils@1.4.3: - resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} - engines: {node: '>=16'} + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} peerDependencies: - typescript: '>=4.2.0' + typescript: '>=4.8.4' ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - ts-jest@29.4.6: - resolution: {integrity: sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==} + ts-jest@29.4.12: + resolution: {integrity: sha512-Ov6ClY53Fflh6BGAnY2DlTq1hYDrTycz2PVTXBWFW2CU+9zrEqAp9fWdGXl42EXO5RLSFAcAZ2JFKbP+zBTFfw==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -3802,7 +3767,7 @@ packages: esbuild: '*' jest: ^29.0.0 || ^30.0.0 jest-util: ^29.0.0 || ^30.0.0 - typescript: '>=4.3 <6' + typescript: '>=4.3 <7' peerDependenciesMeta: '@babel/core': optional: true @@ -3856,8 +3821,8 @@ packages: typescript: optional: true - tsx@4.21.0: - resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + tsx@4.23.13: + resolution: {integrity: sha512-BL5MGkRln6aDYhb0xbQlEAGw743BaZYWdbWtdJOBriYJboKgUUYCadFp2/FpBBZquBC/ezNBn7wMMPx7FDZUDw==} engines: {node: '>=18.0.0'} hasBin: true @@ -3893,8 +3858,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - ufo@1.6.3: - resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} uglify-js@3.19.3: resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} @@ -3904,18 +3869,17 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici-types@7.16.0: - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} universal-user-agent@6.0.1: resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} - universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} + unrs-resolver@1.12.2: + resolution: {integrity: sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==} - update-browserslist-db@1.2.2: - resolution: {integrity: sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==} + update-browserslist-db@1.3.2: + resolution: {integrity: sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -3933,16 +3897,16 @@ packages: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} - valibot@1.2.0: - resolution: {integrity: sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==} + valibot@1.4.2: + resolution: {integrity: sha512-gjdCvJ6d3RyHAneqxMYMW9QMCwYMb3jpOO0IyHZV1bnRHFBHrX3VkIILt5XYR0WhwHiH7Mty8ovuPZ/O3gamrg==} peerDependencies: typescript: '>=5' peerDependenciesMeta: typescript: optional: true - vite@7.3.1: - resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + vite@7.3.6: + resolution: {integrity: sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -3981,21 +3945,23 @@ packages: yaml: optional: true - vitest@4.1.0: - resolution: {integrity: sha512-YbDrMF9jM2Lqc++2530UourxZHmkKLxrs4+mYhEwqWS97WJ7wOYEkcr+QfRgJ3PW9wz3odRijLZjHEaRLTNbqw==} + vitest@4.1.11: + resolution: {integrity: sha512-fhACrNXUidIbGSBr5FlbuBkO7VWC1ZyLl0DO4CU2DrQoAPxX84Ysxs+HeGQpii5lZWV1Q4gBZTTu49mF+A6Edw==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.0 - '@vitest/browser-preview': 4.1.0 - '@vitest/browser-webdriverio': 4.1.0 - '@vitest/ui': 4.1.0 + '@vitest/browser-playwright': 4.1.11 + '@vitest/browser-preview': 4.1.11 + '@vitest/browser-webdriverio': 4.1.11 + '@vitest/coverage-istanbul': 4.1.11 + '@vitest/coverage-v8': 4.1.11 + '@vitest/ui': 4.1.11 happy-dom: '*' jsdom: '*' - vite: ^6.0.0 || ^7.0.0 || ^8.0.0-0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@edge-runtime/vm': optional: true @@ -4009,6 +3975,10 @@ packages: optional: true '@vitest/browser-webdriverio': optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true '@vitest/ui': optional: true happy-dom: @@ -4016,9 +3986,6 @@ packages: jsdom: optional: true - walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - web-streams-polyfill@3.3.3: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} @@ -4044,12 +4011,16 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} @@ -4062,12 +4033,17 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + yargs@17.7.3: + resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} engines: {node: '>=12'} yn@3.1.1: @@ -4081,875 +4057,311 @@ packages: zeptomatch@2.1.0: resolution: {integrity: sha512-KiGErG2J0G82LSpniV0CtIzjlJ10E04j02VOudJsPyPwNZgGnRKQy7I1R7GMyg/QswnE4l7ohSGrQbQbjXPPDA==} - zod@3.25.76: - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zod@4.5.4: + resolution: {integrity: sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==} snapshots: - '@aws-crypto/crc32@5.2.0': - dependencies: - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.4 - tslib: 2.8.1 - - '@aws-crypto/crc32c@5.2.0': - dependencies: - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.4 - tslib: 2.8.1 - - '@aws-crypto/sha1-browser@5.2.0': - dependencies: - '@aws-crypto/supports-web-crypto': 5.2.0 - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.4 - '@aws-sdk/util-locate-window': 3.965.4 - '@smithy/util-utf8': 2.3.0 - tslib: 2.8.1 - - '@aws-crypto/sha256-browser@5.2.0': - dependencies: - '@aws-crypto/sha256-js': 5.2.0 - '@aws-crypto/supports-web-crypto': 5.2.0 - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.4 - '@aws-sdk/util-locate-window': 3.965.4 - '@smithy/util-utf8': 2.3.0 - tslib: 2.8.1 - - '@aws-crypto/sha256-js@5.2.0': - dependencies: - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.4 - tslib: 2.8.1 - - '@aws-crypto/supports-web-crypto@5.2.0': - dependencies: - tslib: 2.8.1 - - '@aws-crypto/util@5.2.0': - dependencies: - '@aws-sdk/types': 3.973.4 - '@smithy/util-utf8': 2.3.0 - tslib: 2.8.1 - - '@aws-sdk/client-ec2-instance-connect@3.1001.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.16 - '@aws-sdk/credential-provider-node': 3.972.15 - '@aws-sdk/middleware-host-header': 3.972.6 - '@aws-sdk/middleware-logger': 3.972.6 - '@aws-sdk/middleware-recursion-detection': 3.972.6 - '@aws-sdk/middleware-user-agent': 3.972.16 - '@aws-sdk/region-config-resolver': 3.972.6 - '@aws-sdk/types': 3.973.4 - '@aws-sdk/util-endpoints': 3.996.3 - '@aws-sdk/util-user-agent-browser': 3.972.6 - '@aws-sdk/util-user-agent-node': 3.973.1 - '@smithy/config-resolver': 4.4.9 - '@smithy/core': 3.23.7 - '@smithy/fetch-http-handler': 5.3.12 - '@smithy/hash-node': 4.2.10 - '@smithy/invalid-dependency': 4.2.10 - '@smithy/middleware-content-length': 4.2.10 - '@smithy/middleware-endpoint': 4.4.21 - '@smithy/middleware-retry': 4.4.38 - '@smithy/middleware-serde': 4.2.11 - '@smithy/middleware-stack': 4.2.10 - '@smithy/node-config-provider': 4.3.10 - '@smithy/node-http-handler': 4.4.13 - '@smithy/protocol-http': 5.3.10 - '@smithy/smithy-client': 4.12.1 - '@smithy/types': 4.13.0 - '@smithy/url-parser': 4.2.10 - '@smithy/util-base64': 4.3.1 - '@smithy/util-body-length-browser': 4.2.1 - '@smithy/util-body-length-node': 4.2.2 - '@smithy/util-defaults-mode-browser': 4.3.37 - '@smithy/util-defaults-mode-node': 4.2.40 - '@smithy/util-endpoints': 3.3.1 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-retry': 4.2.10 - '@smithy/util-utf8': 4.2.1 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-ec2@3.996.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.16 - '@aws-sdk/credential-provider-node': 3.972.15 - '@aws-sdk/middleware-host-header': 3.972.6 - '@aws-sdk/middleware-logger': 3.972.6 - '@aws-sdk/middleware-recursion-detection': 3.972.6 - '@aws-sdk/middleware-sdk-ec2': 3.972.8 - '@aws-sdk/middleware-user-agent': 3.972.16 - '@aws-sdk/region-config-resolver': 3.972.6 - '@aws-sdk/types': 3.973.4 - '@aws-sdk/util-endpoints': 3.996.0 - '@aws-sdk/util-user-agent-browser': 3.972.6 - '@aws-sdk/util-user-agent-node': 3.973.1 - '@smithy/config-resolver': 4.4.9 - '@smithy/core': 3.23.7 - '@smithy/fetch-http-handler': 5.3.12 - '@smithy/hash-node': 4.2.10 - '@smithy/invalid-dependency': 4.2.10 - '@smithy/middleware-content-length': 4.2.10 - '@smithy/middleware-endpoint': 4.4.21 - '@smithy/middleware-retry': 4.4.38 - '@smithy/middleware-serde': 4.2.11 - '@smithy/middleware-stack': 4.2.10 - '@smithy/node-config-provider': 4.3.10 - '@smithy/node-http-handler': 4.4.13 - '@smithy/protocol-http': 5.3.10 - '@smithy/smithy-client': 4.12.1 - '@smithy/types': 4.13.0 - '@smithy/url-parser': 4.2.10 - '@smithy/util-base64': 4.3.1 - '@smithy/util-body-length-browser': 4.2.1 - '@smithy/util-body-length-node': 4.2.2 - '@smithy/util-defaults-mode-browser': 4.3.37 - '@smithy/util-defaults-mode-node': 4.2.40 - '@smithy/util-endpoints': 3.3.1 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-retry': 4.2.10 - '@smithy/util-utf8': 4.2.1 - '@smithy/util-waiter': 4.2.10 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-ecr@3.996.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.16 - '@aws-sdk/credential-provider-node': 3.972.15 - '@aws-sdk/middleware-host-header': 3.972.6 - '@aws-sdk/middleware-logger': 3.972.6 - '@aws-sdk/middleware-recursion-detection': 3.972.6 - '@aws-sdk/middleware-user-agent': 3.972.16 - '@aws-sdk/region-config-resolver': 3.972.6 - '@aws-sdk/types': 3.973.4 - '@aws-sdk/util-endpoints': 3.996.0 - '@aws-sdk/util-user-agent-browser': 3.972.6 - '@aws-sdk/util-user-agent-node': 3.973.1 - '@smithy/config-resolver': 4.4.9 - '@smithy/core': 3.23.7 - '@smithy/fetch-http-handler': 5.3.12 - '@smithy/hash-node': 4.2.10 - '@smithy/invalid-dependency': 4.2.10 - '@smithy/middleware-content-length': 4.2.10 - '@smithy/middleware-endpoint': 4.4.21 - '@smithy/middleware-retry': 4.4.38 - '@smithy/middleware-serde': 4.2.11 - '@smithy/middleware-stack': 4.2.10 - '@smithy/node-config-provider': 4.3.10 - '@smithy/node-http-handler': 4.4.13 - '@smithy/protocol-http': 5.3.10 - '@smithy/smithy-client': 4.12.1 - '@smithy/types': 4.13.0 - '@smithy/url-parser': 4.2.10 - '@smithy/util-base64': 4.3.1 - '@smithy/util-body-length-browser': 4.2.1 - '@smithy/util-body-length-node': 4.2.2 - '@smithy/util-defaults-mode-browser': 4.3.37 - '@smithy/util-defaults-mode-node': 4.2.40 - '@smithy/util-endpoints': 3.3.1 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-retry': 4.2.10 - '@smithy/util-utf8': 4.2.1 - '@smithy/util-waiter': 4.2.10 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-iam@3.996.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.16 - '@aws-sdk/credential-provider-node': 3.972.15 - '@aws-sdk/middleware-host-header': 3.972.6 - '@aws-sdk/middleware-logger': 3.972.6 - '@aws-sdk/middleware-recursion-detection': 3.972.6 - '@aws-sdk/middleware-user-agent': 3.972.16 - '@aws-sdk/region-config-resolver': 3.972.6 - '@aws-sdk/types': 3.973.4 - '@aws-sdk/util-endpoints': 3.996.0 - '@aws-sdk/util-user-agent-browser': 3.972.6 - '@aws-sdk/util-user-agent-node': 3.973.1 - '@smithy/config-resolver': 4.4.9 - '@smithy/core': 3.23.7 - '@smithy/fetch-http-handler': 5.3.12 - '@smithy/hash-node': 4.2.10 - '@smithy/invalid-dependency': 4.2.10 - '@smithy/middleware-content-length': 4.2.10 - '@smithy/middleware-endpoint': 4.4.21 - '@smithy/middleware-retry': 4.4.38 - '@smithy/middleware-serde': 4.2.11 - '@smithy/middleware-stack': 4.2.10 - '@smithy/node-config-provider': 4.3.10 - '@smithy/node-http-handler': 4.4.13 - '@smithy/protocol-http': 5.3.10 - '@smithy/smithy-client': 4.12.1 - '@smithy/types': 4.13.0 - '@smithy/url-parser': 4.2.10 - '@smithy/util-base64': 4.3.1 - '@smithy/util-body-length-browser': 4.2.1 - '@smithy/util-body-length-node': 4.2.2 - '@smithy/util-defaults-mode-browser': 4.3.37 - '@smithy/util-defaults-mode-node': 4.2.40 - '@smithy/util-endpoints': 3.3.1 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-retry': 4.2.10 - '@smithy/util-utf8': 4.2.1 - '@smithy/util-waiter': 4.2.10 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-rds@3.996.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.16 - '@aws-sdk/credential-provider-node': 3.972.15 - '@aws-sdk/middleware-host-header': 3.972.6 - '@aws-sdk/middleware-logger': 3.972.6 - '@aws-sdk/middleware-recursion-detection': 3.972.6 - '@aws-sdk/middleware-sdk-rds': 3.972.8 - '@aws-sdk/middleware-user-agent': 3.972.16 - '@aws-sdk/region-config-resolver': 3.972.6 - '@aws-sdk/types': 3.973.4 - '@aws-sdk/util-endpoints': 3.996.0 - '@aws-sdk/util-user-agent-browser': 3.972.6 - '@aws-sdk/util-user-agent-node': 3.973.1 - '@smithy/config-resolver': 4.4.9 - '@smithy/core': 3.23.7 - '@smithy/fetch-http-handler': 5.3.12 - '@smithy/hash-node': 4.2.10 - '@smithy/invalid-dependency': 4.2.10 - '@smithy/middleware-content-length': 4.2.10 - '@smithy/middleware-endpoint': 4.4.21 - '@smithy/middleware-retry': 4.4.38 - '@smithy/middleware-serde': 4.2.11 - '@smithy/middleware-stack': 4.2.10 - '@smithy/node-config-provider': 4.3.10 - '@smithy/node-http-handler': 4.4.13 - '@smithy/protocol-http': 5.3.10 - '@smithy/smithy-client': 4.12.1 - '@smithy/types': 4.13.0 - '@smithy/url-parser': 4.2.10 - '@smithy/util-base64': 4.3.1 - '@smithy/util-body-length-browser': 4.2.1 - '@smithy/util-body-length-node': 4.2.2 - '@smithy/util-defaults-mode-browser': 4.3.37 - '@smithy/util-defaults-mode-node': 4.2.40 - '@smithy/util-endpoints': 3.3.1 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-retry': 4.2.10 - '@smithy/util-utf8': 4.2.1 - '@smithy/util-waiter': 4.2.10 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-route-53@3.1001.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.16 - '@aws-sdk/credential-provider-node': 3.972.15 - '@aws-sdk/middleware-host-header': 3.972.6 - '@aws-sdk/middleware-logger': 3.972.6 - '@aws-sdk/middleware-recursion-detection': 3.972.6 - '@aws-sdk/middleware-sdk-route53': 3.972.8 - '@aws-sdk/middleware-user-agent': 3.972.16 - '@aws-sdk/region-config-resolver': 3.972.6 - '@aws-sdk/types': 3.973.4 - '@aws-sdk/util-endpoints': 3.996.3 - '@aws-sdk/util-user-agent-browser': 3.972.6 - '@aws-sdk/util-user-agent-node': 3.973.1 - '@smithy/config-resolver': 4.4.9 - '@smithy/core': 3.23.7 - '@smithy/fetch-http-handler': 5.3.12 - '@smithy/hash-node': 4.2.10 - '@smithy/invalid-dependency': 4.2.10 - '@smithy/middleware-content-length': 4.2.10 - '@smithy/middleware-endpoint': 4.4.21 - '@smithy/middleware-retry': 4.4.38 - '@smithy/middleware-serde': 4.2.11 - '@smithy/middleware-stack': 4.2.10 - '@smithy/node-config-provider': 4.3.10 - '@smithy/node-http-handler': 4.4.13 - '@smithy/protocol-http': 5.3.10 - '@smithy/smithy-client': 4.12.1 - '@smithy/types': 4.13.0 - '@smithy/url-parser': 4.2.10 - '@smithy/util-base64': 4.3.1 - '@smithy/util-body-length-browser': 4.2.1 - '@smithy/util-body-length-node': 4.2.2 - '@smithy/util-defaults-mode-browser': 4.3.37 - '@smithy/util-defaults-mode-node': 4.2.40 - '@smithy/util-endpoints': 3.3.1 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-retry': 4.2.10 - '@smithy/util-utf8': 4.2.1 - '@smithy/util-waiter': 4.2.10 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-s3@3.996.0': - dependencies: - '@aws-crypto/sha1-browser': 5.2.0 - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.16 - '@aws-sdk/credential-provider-node': 3.972.15 - '@aws-sdk/middleware-bucket-endpoint': 3.972.3 - '@aws-sdk/middleware-expect-continue': 3.972.3 - '@aws-sdk/middleware-flexible-checksums': 3.972.10 - '@aws-sdk/middleware-host-header': 3.972.6 - '@aws-sdk/middleware-location-constraint': 3.972.3 - '@aws-sdk/middleware-logger': 3.972.6 - '@aws-sdk/middleware-recursion-detection': 3.972.6 - '@aws-sdk/middleware-sdk-s3': 3.972.12 - '@aws-sdk/middleware-ssec': 3.972.3 - '@aws-sdk/middleware-user-agent': 3.972.16 - '@aws-sdk/region-config-resolver': 3.972.6 - '@aws-sdk/signature-v4-multi-region': 3.996.0 - '@aws-sdk/types': 3.973.4 - '@aws-sdk/util-endpoints': 3.996.0 - '@aws-sdk/util-user-agent-browser': 3.972.6 - '@aws-sdk/util-user-agent-node': 3.973.1 - '@smithy/config-resolver': 4.4.9 - '@smithy/core': 3.23.7 - '@smithy/eventstream-serde-browser': 4.2.9 - '@smithy/eventstream-serde-config-resolver': 4.3.9 - '@smithy/eventstream-serde-node': 4.2.9 - '@smithy/fetch-http-handler': 5.3.12 - '@smithy/hash-blob-browser': 4.2.10 - '@smithy/hash-node': 4.2.10 - '@smithy/hash-stream-node': 4.2.9 - '@smithy/invalid-dependency': 4.2.10 - '@smithy/md5-js': 4.2.9 - '@smithy/middleware-content-length': 4.2.10 - '@smithy/middleware-endpoint': 4.4.21 - '@smithy/middleware-retry': 4.4.38 - '@smithy/middleware-serde': 4.2.11 - '@smithy/middleware-stack': 4.2.10 - '@smithy/node-config-provider': 4.3.10 - '@smithy/node-http-handler': 4.4.13 - '@smithy/protocol-http': 5.3.10 - '@smithy/smithy-client': 4.12.1 - '@smithy/types': 4.13.0 - '@smithy/url-parser': 4.2.10 - '@smithy/util-base64': 4.3.1 - '@smithy/util-body-length-browser': 4.2.1 - '@smithy/util-body-length-node': 4.2.2 - '@smithy/util-defaults-mode-browser': 4.3.37 - '@smithy/util-defaults-mode-node': 4.2.40 - '@smithy/util-endpoints': 3.3.1 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-retry': 4.2.10 - '@smithy/util-stream': 4.5.16 - '@smithy/util-utf8': 4.2.1 - '@smithy/util-waiter': 4.2.10 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-ses@3.996.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.16 - '@aws-sdk/credential-provider-node': 3.972.15 - '@aws-sdk/middleware-host-header': 3.972.6 - '@aws-sdk/middleware-logger': 3.972.6 - '@aws-sdk/middleware-recursion-detection': 3.972.6 - '@aws-sdk/middleware-user-agent': 3.972.16 - '@aws-sdk/region-config-resolver': 3.972.6 - '@aws-sdk/types': 3.973.4 - '@aws-sdk/util-endpoints': 3.996.0 - '@aws-sdk/util-user-agent-browser': 3.972.6 - '@aws-sdk/util-user-agent-node': 3.973.1 - '@smithy/config-resolver': 4.4.9 - '@smithy/core': 3.23.7 - '@smithy/fetch-http-handler': 5.3.12 - '@smithy/hash-node': 4.2.10 - '@smithy/invalid-dependency': 4.2.10 - '@smithy/middleware-content-length': 4.2.10 - '@smithy/middleware-endpoint': 4.4.21 - '@smithy/middleware-retry': 4.4.38 - '@smithy/middleware-serde': 4.2.11 - '@smithy/middleware-stack': 4.2.10 - '@smithy/node-config-provider': 4.3.10 - '@smithy/node-http-handler': 4.4.13 - '@smithy/protocol-http': 5.3.10 - '@smithy/smithy-client': 4.12.1 - '@smithy/types': 4.13.0 - '@smithy/url-parser': 4.2.10 - '@smithy/util-base64': 4.3.1 - '@smithy/util-body-length-browser': 4.2.1 - '@smithy/util-body-length-node': 4.2.2 - '@smithy/util-defaults-mode-browser': 4.3.37 - '@smithy/util-defaults-mode-node': 4.2.40 - '@smithy/util-endpoints': 3.3.1 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-retry': 4.2.10 - '@smithy/util-utf8': 4.2.1 - '@smithy/util-waiter': 4.2.10 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sts@3.996.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.16 - '@aws-sdk/credential-provider-node': 3.972.15 - '@aws-sdk/middleware-host-header': 3.972.6 - '@aws-sdk/middleware-logger': 3.972.6 - '@aws-sdk/middleware-recursion-detection': 3.972.6 - '@aws-sdk/middleware-user-agent': 3.972.16 - '@aws-sdk/region-config-resolver': 3.972.6 - '@aws-sdk/types': 3.973.4 - '@aws-sdk/util-endpoints': 3.996.0 - '@aws-sdk/util-user-agent-browser': 3.972.6 - '@aws-sdk/util-user-agent-node': 3.973.1 - '@smithy/config-resolver': 4.4.9 - '@smithy/core': 3.23.7 - '@smithy/fetch-http-handler': 5.3.12 - '@smithy/hash-node': 4.2.10 - '@smithy/invalid-dependency': 4.2.10 - '@smithy/middleware-content-length': 4.2.10 - '@smithy/middleware-endpoint': 4.4.21 - '@smithy/middleware-retry': 4.4.38 - '@smithy/middleware-serde': 4.2.11 - '@smithy/middleware-stack': 4.2.10 - '@smithy/node-config-provider': 4.3.10 - '@smithy/node-http-handler': 4.4.13 - '@smithy/protocol-http': 5.3.10 - '@smithy/smithy-client': 4.12.1 - '@smithy/types': 4.13.0 - '@smithy/url-parser': 4.2.10 - '@smithy/util-base64': 4.3.1 - '@smithy/util-body-length-browser': 4.2.1 - '@smithy/util-body-length-node': 4.2.2 - '@smithy/util-defaults-mode-browser': 4.3.37 - '@smithy/util-defaults-mode-node': 4.2.40 - '@smithy/util-endpoints': 3.3.1 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-retry': 4.2.10 - '@smithy/util-utf8': 4.2.1 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/core@3.973.16': - dependencies: - '@aws-sdk/types': 3.973.4 - '@aws-sdk/xml-builder': 3.972.9 - '@smithy/core': 3.23.7 - '@smithy/node-config-provider': 4.3.10 - '@smithy/property-provider': 4.2.10 - '@smithy/protocol-http': 5.3.10 - '@smithy/signature-v4': 5.3.10 - '@smithy/smithy-client': 4.12.1 - '@smithy/types': 4.13.0 - '@smithy/util-base64': 4.3.1 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-utf8': 4.2.1 - tslib: 2.8.1 - - '@aws-sdk/crc64-nvme@3.972.0': - dependencies: - '@smithy/types': 4.13.0 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-env@3.972.14': - dependencies: - '@aws-sdk/core': 3.973.16 - '@aws-sdk/types': 3.973.4 - '@smithy/property-provider': 4.2.10 - '@smithy/types': 4.13.0 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-http@3.972.16': - dependencies: - '@aws-sdk/core': 3.973.16 - '@aws-sdk/types': 3.973.4 - '@smithy/fetch-http-handler': 5.3.12 - '@smithy/node-http-handler': 4.4.13 - '@smithy/property-provider': 4.2.10 - '@smithy/protocol-http': 5.3.10 - '@smithy/smithy-client': 4.12.1 - '@smithy/types': 4.13.0 - '@smithy/util-stream': 4.5.16 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-ini@3.972.14': - dependencies: - '@aws-sdk/core': 3.973.16 - '@aws-sdk/credential-provider-env': 3.972.14 - '@aws-sdk/credential-provider-http': 3.972.16 - '@aws-sdk/credential-provider-login': 3.972.14 - '@aws-sdk/credential-provider-process': 3.972.14 - '@aws-sdk/credential-provider-sso': 3.972.14 - '@aws-sdk/credential-provider-web-identity': 3.972.14 - '@aws-sdk/nested-clients': 3.996.4 - '@aws-sdk/types': 3.973.4 - '@smithy/credential-provider-imds': 4.2.10 - '@smithy/property-provider': 4.2.10 - '@smithy/shared-ini-file-loader': 4.4.5 - '@smithy/types': 4.13.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-provider-login@3.972.14': + '@aws-sdk/checksums@3.1000.29': dependencies: - '@aws-sdk/core': 3.973.16 - '@aws-sdk/nested-clients': 3.996.4 - '@aws-sdk/types': 3.973.4 - '@smithy/property-provider': 4.2.10 - '@smithy/protocol-http': 5.3.10 - '@smithy/shared-ini-file-loader': 4.4.5 - '@smithy/types': 4.13.0 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-provider-node@3.972.15': - dependencies: - '@aws-sdk/credential-provider-env': 3.972.14 - '@aws-sdk/credential-provider-http': 3.972.16 - '@aws-sdk/credential-provider-ini': 3.972.14 - '@aws-sdk/credential-provider-process': 3.972.14 - '@aws-sdk/credential-provider-sso': 3.972.14 - '@aws-sdk/credential-provider-web-identity': 3.972.14 - '@aws-sdk/types': 3.973.4 - '@smithy/credential-provider-imds': 4.2.10 - '@smithy/property-provider': 4.2.10 - '@smithy/shared-ini-file-loader': 4.4.5 - '@smithy/types': 4.13.0 + '@aws-sdk/core': 3.977.9 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.33.3 + '@smithy/types': 4.18.0 tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/credential-provider-process@3.972.14': + '@aws-sdk/client-ec2-instance-connect@3.1127.0': dependencies: - '@aws-sdk/core': 3.973.16 - '@aws-sdk/types': 3.973.4 - '@smithy/property-provider': 4.2.10 - '@smithy/shared-ini-file-loader': 4.4.5 - '@smithy/types': 4.13.0 + '@aws-sdk/core': 3.977.9 + '@aws-sdk/credential-provider-node': 3.972.82 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.33.3 + '@smithy/fetch-http-handler': 5.8.0 + '@smithy/node-http-handler': 4.12.1 + '@smithy/types': 4.18.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.972.14': + '@aws-sdk/client-ec2@3.1127.0': dependencies: - '@aws-sdk/core': 3.973.16 - '@aws-sdk/nested-clients': 3.996.4 - '@aws-sdk/token-providers': 3.1001.0 - '@aws-sdk/types': 3.973.4 - '@smithy/property-provider': 4.2.10 - '@smithy/shared-ini-file-loader': 4.4.5 - '@smithy/types': 4.13.0 + '@aws-sdk/core': 3.977.9 + '@aws-sdk/credential-provider-node': 3.972.82 + '@aws-sdk/middleware-sdk-ec2': 3.972.58 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.33.3 + '@smithy/fetch-http-handler': 5.8.0 + '@smithy/node-http-handler': 4.12.1 + '@smithy/types': 4.18.0 tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/credential-provider-web-identity@3.972.14': + '@aws-sdk/client-ecr@3.1127.0': dependencies: - '@aws-sdk/core': 3.973.16 - '@aws-sdk/nested-clients': 3.996.4 - '@aws-sdk/types': 3.973.4 - '@smithy/property-provider': 4.2.10 - '@smithy/shared-ini-file-loader': 4.4.5 - '@smithy/types': 4.13.0 + '@aws-sdk/core': 3.977.9 + '@aws-sdk/credential-provider-node': 3.972.82 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.33.3 + '@smithy/fetch-http-handler': 5.8.0 + '@smithy/node-http-handler': 4.12.1 + '@smithy/types': 4.18.0 tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/middleware-bucket-endpoint@3.972.3': + '@aws-sdk/client-iam@3.1127.0': dependencies: - '@aws-sdk/types': 3.973.4 - '@aws-sdk/util-arn-parser': 3.972.2 - '@smithy/node-config-provider': 4.3.10 - '@smithy/protocol-http': 5.3.10 - '@smithy/types': 4.13.0 - '@smithy/util-config-provider': 4.2.1 + '@aws-sdk/core': 3.977.9 + '@aws-sdk/credential-provider-node': 3.972.82 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.33.3 + '@smithy/fetch-http-handler': 5.8.0 + '@smithy/node-http-handler': 4.12.1 + '@smithy/types': 4.18.0 tslib: 2.8.1 - '@aws-sdk/middleware-expect-continue@3.972.3': + '@aws-sdk/client-rds@3.1127.0': dependencies: - '@aws-sdk/types': 3.973.4 - '@smithy/protocol-http': 5.3.10 - '@smithy/types': 4.13.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-flexible-checksums@3.972.10': - dependencies: - '@aws-crypto/crc32': 5.2.0 - '@aws-crypto/crc32c': 5.2.0 - '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.973.16 - '@aws-sdk/crc64-nvme': 3.972.0 - '@aws-sdk/types': 3.973.4 - '@smithy/is-array-buffer': 4.2.1 - '@smithy/node-config-provider': 4.3.10 - '@smithy/protocol-http': 5.3.10 - '@smithy/types': 4.13.0 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-stream': 4.5.16 - '@smithy/util-utf8': 4.2.1 + '@aws-sdk/core': 3.977.9 + '@aws-sdk/credential-provider-node': 3.972.82 + '@aws-sdk/middleware-sdk-rds': 3.972.58 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.33.3 + '@smithy/fetch-http-handler': 5.8.0 + '@smithy/node-http-handler': 4.12.1 + '@smithy/types': 4.18.0 tslib: 2.8.1 - '@aws-sdk/middleware-host-header@3.972.6': + '@aws-sdk/client-route-53@3.1127.0': dependencies: - '@aws-sdk/types': 3.973.4 - '@smithy/protocol-http': 5.3.10 - '@smithy/types': 4.13.0 + '@aws-sdk/core': 3.977.9 + '@aws-sdk/credential-provider-node': 3.972.82 + '@aws-sdk/middleware-sdk-route53': 3.972.26 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.33.3 + '@smithy/fetch-http-handler': 5.8.0 + '@smithy/node-http-handler': 4.12.1 + '@smithy/types': 4.18.0 tslib: 2.8.1 - '@aws-sdk/middleware-location-constraint@3.972.3': - dependencies: - '@aws-sdk/types': 3.973.4 - '@smithy/types': 4.13.0 + '@aws-sdk/client-s3@3.1127.0': + dependencies: + '@aws-sdk/checksums': 3.1000.29 + '@aws-sdk/core': 3.977.9 + '@aws-sdk/credential-provider-node': 3.972.82 + '@aws-sdk/middleware-sdk-s3': 3.972.75 + '@aws-sdk/signature-v4-multi-region': 3.996.46 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.33.3 + '@smithy/fetch-http-handler': 5.8.0 + '@smithy/node-http-handler': 4.12.1 + '@smithy/types': 4.18.0 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.972.6': + '@aws-sdk/client-ses@3.1127.0': dependencies: - '@aws-sdk/types': 3.973.4 - '@smithy/types': 4.13.0 + '@aws-sdk/core': 3.977.9 + '@aws-sdk/credential-provider-node': 3.972.82 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.33.3 + '@smithy/fetch-http-handler': 5.8.0 + '@smithy/node-http-handler': 4.12.1 + '@smithy/types': 4.18.0 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.972.6': + '@aws-sdk/client-sts@3.1127.0': dependencies: - '@aws-sdk/types': 3.973.4 - '@aws/lambda-invoke-store': 0.2.3 - '@smithy/protocol-http': 5.3.10 - '@smithy/types': 4.13.0 + '@aws-sdk/core': 3.977.9 + '@aws-sdk/credential-provider-node': 3.972.82 + '@aws-sdk/signature-v4-multi-region': 3.996.46 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.33.3 + '@smithy/fetch-http-handler': 5.8.0 + '@smithy/node-http-handler': 4.12.1 + '@smithy/types': 4.18.0 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-ec2@3.972.8': + '@aws-sdk/core@3.977.9': dependencies: - '@aws-sdk/types': 3.973.4 - '@aws-sdk/util-format-url': 3.972.3 - '@smithy/middleware-endpoint': 4.4.21 - '@smithy/protocol-http': 5.3.10 - '@smithy/signature-v4': 5.3.10 - '@smithy/smithy-client': 4.12.1 - '@smithy/types': 4.13.0 + '@aws-sdk/types': 3.974.5 + '@aws-sdk/xml-builder': 3.972.40 + '@aws/lambda-invoke-store': 0.3.0 + '@smithy/core': 3.33.3 + '@smithy/signature-v4': 5.7.3 + '@smithy/types': 4.18.0 + bowser: 2.14.1 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-rds@3.972.8': + '@aws-sdk/credential-provider-env@3.972.70': dependencies: - '@aws-sdk/types': 3.973.4 - '@aws-sdk/util-format-url': 3.972.3 - '@smithy/middleware-endpoint': 4.4.21 - '@smithy/protocol-http': 5.3.10 - '@smithy/signature-v4': 5.3.10 - '@smithy/types': 4.13.0 + '@aws-sdk/core': 3.977.9 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.33.3 + '@smithy/types': 4.18.0 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-route53@3.972.8': + '@aws-sdk/credential-provider-http@3.972.72': dependencies: - '@aws-sdk/types': 3.973.4 - '@smithy/types': 4.13.0 - tslib: 2.8.1 - - '@aws-sdk/middleware-sdk-s3@3.972.12': - dependencies: - '@aws-sdk/core': 3.973.16 - '@aws-sdk/types': 3.973.4 - '@aws-sdk/util-arn-parser': 3.972.2 - '@smithy/core': 3.23.7 - '@smithy/node-config-provider': 4.3.10 - '@smithy/protocol-http': 5.3.10 - '@smithy/signature-v4': 5.3.10 - '@smithy/smithy-client': 4.12.1 - '@smithy/types': 4.13.0 - '@smithy/util-config-provider': 4.2.1 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-stream': 4.5.16 - '@smithy/util-utf8': 4.2.1 + '@aws-sdk/core': 3.977.9 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.33.3 + '@smithy/fetch-http-handler': 5.8.0 + '@smithy/node-http-handler': 4.12.1 + '@smithy/types': 4.18.0 tslib: 2.8.1 - '@aws-sdk/middleware-ssec@3.972.3': - dependencies: - '@aws-sdk/types': 3.973.4 - '@smithy/types': 4.13.0 + '@aws-sdk/credential-provider-ini@3.973.15': + dependencies: + '@aws-sdk/core': 3.977.9 + '@aws-sdk/credential-provider-env': 3.972.70 + '@aws-sdk/credential-provider-http': 3.972.72 + '@aws-sdk/credential-provider-login': 3.972.77 + '@aws-sdk/credential-provider-process': 3.972.70 + '@aws-sdk/credential-provider-sso': 3.973.14 + '@aws-sdk/credential-provider-web-identity': 3.972.76 + '@aws-sdk/nested-clients': 3.997.44 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.33.3 + '@smithy/credential-provider-imds': 4.5.2 + '@smithy/types': 4.18.0 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.972.16': + '@aws-sdk/credential-provider-login@3.972.77': dependencies: - '@aws-sdk/core': 3.973.16 - '@aws-sdk/types': 3.973.4 - '@aws-sdk/util-endpoints': 3.996.3 - '@smithy/core': 3.23.7 - '@smithy/protocol-http': 5.3.10 - '@smithy/types': 4.13.0 + '@aws-sdk/core': 3.977.9 + '@aws-sdk/nested-clients': 3.997.44 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.33.3 + '@smithy/types': 4.18.0 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.996.4': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.16 - '@aws-sdk/middleware-host-header': 3.972.6 - '@aws-sdk/middleware-logger': 3.972.6 - '@aws-sdk/middleware-recursion-detection': 3.972.6 - '@aws-sdk/middleware-user-agent': 3.972.16 - '@aws-sdk/region-config-resolver': 3.972.6 - '@aws-sdk/types': 3.973.4 - '@aws-sdk/util-endpoints': 3.996.3 - '@aws-sdk/util-user-agent-browser': 3.972.6 - '@aws-sdk/util-user-agent-node': 3.973.1 - '@smithy/config-resolver': 4.4.9 - '@smithy/core': 3.23.7 - '@smithy/fetch-http-handler': 5.3.12 - '@smithy/hash-node': 4.2.10 - '@smithy/invalid-dependency': 4.2.10 - '@smithy/middleware-content-length': 4.2.10 - '@smithy/middleware-endpoint': 4.4.21 - '@smithy/middleware-retry': 4.4.38 - '@smithy/middleware-serde': 4.2.11 - '@smithy/middleware-stack': 4.2.10 - '@smithy/node-config-provider': 4.3.10 - '@smithy/node-http-handler': 4.4.13 - '@smithy/protocol-http': 5.3.10 - '@smithy/smithy-client': 4.12.1 - '@smithy/types': 4.13.0 - '@smithy/url-parser': 4.2.10 - '@smithy/util-base64': 4.3.1 - '@smithy/util-body-length-browser': 4.2.1 - '@smithy/util-body-length-node': 4.2.2 - '@smithy/util-defaults-mode-browser': 4.3.37 - '@smithy/util-defaults-mode-node': 4.2.40 - '@smithy/util-endpoints': 3.3.1 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-retry': 4.2.10 - '@smithy/util-utf8': 4.2.1 + '@aws-sdk/credential-provider-node@3.972.82': + dependencies: + '@aws-sdk/credential-provider-env': 3.972.70 + '@aws-sdk/credential-provider-http': 3.972.72 + '@aws-sdk/credential-provider-ini': 3.973.15 + '@aws-sdk/credential-provider-process': 3.972.70 + '@aws-sdk/credential-provider-sso': 3.973.14 + '@aws-sdk/credential-provider-web-identity': 3.972.76 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.33.3 + '@smithy/credential-provider-imds': 4.5.2 + '@smithy/types': 4.18.0 tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/region-config-resolver@3.972.6': + '@aws-sdk/credential-provider-process@3.972.70': dependencies: - '@aws-sdk/types': 3.973.4 - '@smithy/config-resolver': 4.4.9 - '@smithy/node-config-provider': 4.3.10 - '@smithy/types': 4.13.0 + '@aws-sdk/core': 3.977.9 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.33.3 + '@smithy/types': 4.18.0 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.996.0': + '@aws-sdk/credential-provider-sso@3.973.14': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.972.12 - '@aws-sdk/types': 3.973.4 - '@smithy/protocol-http': 5.3.10 - '@smithy/signature-v4': 5.3.10 - '@smithy/types': 4.13.0 + '@aws-sdk/core': 3.977.9 + '@aws-sdk/nested-clients': 3.997.44 + '@aws-sdk/token-providers': 3.1116.0 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.33.3 + '@smithy/types': 4.18.0 tslib: 2.8.1 - '@aws-sdk/token-providers@3.1001.0': + '@aws-sdk/credential-provider-web-identity@3.972.76': dependencies: - '@aws-sdk/core': 3.973.16 - '@aws-sdk/nested-clients': 3.996.4 - '@aws-sdk/types': 3.973.4 - '@smithy/property-provider': 4.2.10 - '@smithy/shared-ini-file-loader': 4.4.5 - '@smithy/types': 4.13.0 + '@aws-sdk/core': 3.977.9 + '@aws-sdk/nested-clients': 3.997.44 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.33.3 + '@smithy/types': 4.18.0 tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/types@3.973.4': + '@aws-sdk/middleware-sdk-ec2@3.972.58': dependencies: - '@smithy/types': 4.13.0 + '@aws-sdk/core': 3.977.9 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.33.3 + '@smithy/signature-v4': 5.7.3 + '@smithy/types': 4.18.0 tslib: 2.8.1 - '@aws-sdk/util-arn-parser@3.972.2': + '@aws-sdk/middleware-sdk-rds@3.972.58': dependencies: + '@aws-sdk/core': 3.977.9 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.33.3 + '@smithy/signature-v4': 5.7.3 + '@smithy/types': 4.18.0 tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.996.0': + '@aws-sdk/middleware-sdk-route53@3.972.26': dependencies: - '@aws-sdk/types': 3.973.4 - '@smithy/types': 4.13.0 - '@smithy/url-parser': 4.2.10 - '@smithy/util-endpoints': 3.3.1 + '@aws-sdk/types': 3.974.5 + '@smithy/types': 4.18.0 tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.996.3': + '@aws-sdk/middleware-sdk-s3@3.972.75': dependencies: - '@aws-sdk/types': 3.973.4 - '@smithy/types': 4.13.0 - '@smithy/url-parser': 4.2.10 - '@smithy/util-endpoints': 3.3.1 + '@aws-sdk/core': 3.977.9 + '@aws-sdk/signature-v4-multi-region': 3.996.46 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.33.3 + '@smithy/types': 4.18.0 tslib: 2.8.1 - '@aws-sdk/util-format-url@3.972.3': + '@aws-sdk/nested-clients@3.997.44': dependencies: - '@aws-sdk/types': 3.973.4 - '@smithy/querystring-builder': 4.2.10 - '@smithy/types': 4.13.0 + '@aws-sdk/core': 3.977.9 + '@aws-sdk/signature-v4-multi-region': 3.996.46 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.33.3 + '@smithy/fetch-http-handler': 5.8.0 + '@smithy/node-http-handler': 4.12.1 + '@smithy/types': 4.18.0 tslib: 2.8.1 - '@aws-sdk/util-locate-window@3.965.4': + '@aws-sdk/signature-v4-multi-region@3.996.46': dependencies: + '@aws-sdk/types': 3.974.5 + '@smithy/signature-v4': 5.7.3 + '@smithy/types': 4.18.0 tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.972.6': + '@aws-sdk/token-providers@3.1116.0': dependencies: - '@aws-sdk/types': 3.973.4 - '@smithy/types': 4.13.0 - bowser: 2.14.1 + '@aws-sdk/core': 3.977.9 + '@aws-sdk/nested-clients': 3.997.44 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.33.3 + '@smithy/types': 4.18.0 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.973.1': + '@aws-sdk/types@3.974.5': dependencies: - '@aws-sdk/middleware-user-agent': 3.972.16 - '@aws-sdk/types': 3.973.4 - '@smithy/node-config-provider': 4.3.10 - '@smithy/types': 4.13.0 + '@smithy/types': 4.18.0 tslib: 2.8.1 - '@aws-sdk/xml-builder@3.972.9': + '@aws-sdk/xml-builder@3.972.40': dependencies: - '@smithy/types': 4.13.0 - fast-xml-parser: 5.4.1 + '@smithy/types': 4.18.0 tslib: 2.8.1 - '@aws/lambda-invoke-store@0.2.3': {} + '@aws/lambda-invoke-store@0.3.0': {} - '@babel/code-frame@7.29.0': + '@babel/code-frame@7.29.7': dependencies: - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-validator-identifier': 7.29.7 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.29.0': {} + '@babel/compat-data@7.29.7': {} - '@babel/core@7.29.0': + '@babel/core@7.29.7': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helpers': 7.29.2 - '@babel/parser': 7.29.2 - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-compilation-targets': 7.29.7 + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helpers': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/template': 7.29.7 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3 @@ -4959,440 +4371,404 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.29.1': + '@babel/generator@7.29.8': dependencies: - '@babel/parser': 7.29.2 - '@babel/types': 7.29.0 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/helper-compilation-targets@7.28.6': + '@babel/helper-compilation-targets@7.29.7': dependencies: - '@babel/compat-data': 7.29.0 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.1 + '@babel/compat-data': 7.29.7 + '@babel/helper-validator-option': 7.29.7 + browserslist: 4.28.9 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-globals@7.28.0': {} + '@babel/helper-globals@7.29.7': {} - '@babel/helper-module-imports@7.28.6': + '@babel/helper-module-imports@7.29.7': dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 + '@babel/traverse': 7.29.8 + '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 + '@babel/core': 7.29.7 + '@babel/helper-module-imports': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + '@babel/traverse': 7.29.8 transitivePeerDependencies: - supports-color - '@babel/helper-plugin-utils@7.27.1': {} - - '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-plugin-utils@7.29.7': {} - '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-string-parser@7.29.7': {} - '@babel/helper-validator-option@7.27.1': {} + '@babel/helper-validator-identifier@7.29.7': {} - '@babel/helpers@7.29.2': - dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/helper-validator-option@7.29.7': {} - '@babel/parser@7.28.5': + '@babel/helpers@7.29.7': dependencies: - '@babel/types': 7.28.5 + '@babel/template': 7.29.7 + '@babel/types': 7.29.8 - '@babel/parser@7.29.2': + '@babel/parser@7.29.8': dependencies: - '@babel/types': 7.29.0 + '@babel/types': 7.29.8 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.0)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.0)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.0)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.0)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-syntax-import-attributes@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.0)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.0)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.0)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.0)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.0)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.0)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.0)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.0)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.0)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.0)': + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.29.0)': + '@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7)': dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/runtime@7.29.2': {} + '@babel/core': 7.29.7 + '@babel/helper-plugin-utils': 7.29.7 - '@babel/template@7.28.6': + '@babel/template@7.29.7': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.2 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 - '@babel/traverse@7.29.0': + '@babel/traverse@7.29.8': dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.2 - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 + '@babel/code-frame': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/helper-globals': 7.29.7 + '@babel/parser': 7.29.8 + '@babel/template': 7.29.7 + '@babel/types': 7.29.8 debug: 4.4.3 transitivePeerDependencies: - supports-color - '@babel/types@7.28.5': + '@babel/types@7.29.8': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - - '@babel/types@7.29.0': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 '@bcoe/v8-coverage@0.2.3': {} - '@changesets/apply-release-plan@7.1.0': - dependencies: - '@changesets/config': 3.1.3 - '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.4 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - detect-indent: 6.1.0 - fs-extra: 7.0.1 - lodash.startcase: 4.4.0 - outdent: 0.5.0 - prettier: 2.8.8 - resolve-from: 5.0.0 - semver: 7.7.3 - - '@changesets/assemble-release-plan@6.0.9': - dependencies: - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - semver: 7.7.3 - - '@changesets/changelog-git@0.2.1': - dependencies: - '@changesets/types': 6.1.0 - - '@changesets/cli@2.30.0(@types/node@25.0.3)': - dependencies: - '@changesets/apply-release-plan': 7.1.0 - '@changesets/assemble-release-plan': 6.0.9 - '@changesets/changelog-git': 0.2.1 - '@changesets/config': 3.1.3 - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 - '@changesets/get-release-plan': 4.0.15 - '@changesets/git': 3.0.4 - '@changesets/logger': 0.1.1 - '@changesets/pre': 2.0.2 - '@changesets/read': 0.6.7 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.3(@types/node@25.0.3) - '@manypkg/get-packages': 1.1.3 - ansi-colors: 4.1.3 - enquirer: 2.4.1 - fs-extra: 7.0.1 - mri: 1.2.0 - package-manager-detector: 0.2.11 - picocolors: 1.1.1 - resolve-from: 5.0.0 - semver: 7.7.3 - spawndamnit: 3.0.1 - term-size: 2.2.1 - transitivePeerDependencies: - - '@types/node' + '@changesets/apply-release-plan@8.1.0': + dependencies: + '@changesets/config': 4.0.0 + '@changesets/format': 0.1.2 + '@changesets/git': 4.0.1 + '@changesets/should-skip-package': 1.0.0 + '@changesets/types': 7.0.0 + import-meta-resolve: 4.2.0 + jsonc-parser: 3.3.1 + semver: 7.8.5 - '@changesets/config@3.1.3': + '@changesets/assemble-release-plan@7.0.0': dependencies: - '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 - '@changesets/logger': 0.1.1 - '@changesets/should-skip-package': 0.1.2 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 - micromatch: 4.0.8 + '@changesets/errors': 1.0.0 + '@changesets/get-dependents-graph': 3.0.0 + '@changesets/should-skip-package': 1.0.0 + '@changesets/types': 7.0.0 + semver: 7.8.5 - '@changesets/errors@0.2.0': + '@changesets/changelog-git@1.0.0': dependencies: - extendable-error: 0.1.7 + '@changesets/types': 7.0.0 - '@changesets/get-dependents-graph@2.1.3': + '@changesets/cli@3.0.2': dependencies: - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - picocolors: 1.1.1 - semver: 7.7.3 + '@changesets/apply-release-plan': 8.1.0 + '@changesets/assemble-release-plan': 7.0.0 + '@changesets/changelog-git': 1.0.0 + '@changesets/config': 4.0.0 + '@changesets/errors': 1.0.0 + '@changesets/get-dependents-graph': 3.0.0 + '@changesets/git': 4.0.1 + '@changesets/pre': 3.0.0 + '@changesets/read': 1.0.1 + '@changesets/should-skip-package': 1.0.0 + '@changesets/types': 7.0.0 + '@changesets/write': 1.0.1 + '@clack/prompts': 1.7.0 + '@manypkg/get-packages': 3.1.0 + '@pnpm/deps.graph-sequencer': 1100.0.1 + cac: 7.0.0 + import-meta-resolve: 4.2.0 + launch-editor: 2.14.1 + package-manager-detector: 1.8.0 + semver: 7.8.5 + tinyexec: 1.3.1 - '@changesets/get-release-plan@4.0.15': + '@changesets/config@4.0.0': dependencies: - '@changesets/assemble-release-plan': 6.0.9 - '@changesets/config': 3.1.3 - '@changesets/pre': 2.0.2 - '@changesets/read': 0.6.7 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 + '@changesets/get-dependents-graph': 3.0.0 + '@changesets/should-skip-package': 1.0.0 + '@changesets/types': 7.0.0 + '@manypkg/get-packages': 3.1.0 + picomatch: 4.0.7 - '@changesets/get-version-range-type@0.4.0': {} + '@changesets/errors@1.0.0': {} - '@changesets/git@3.0.4': + '@changesets/format@0.1.2': dependencies: - '@changesets/errors': 0.2.0 - '@manypkg/get-packages': 1.1.3 - is-subdir: 1.2.0 - micromatch: 4.0.8 - spawndamnit: 3.0.1 + package-manager-detector: 1.8.0 + tinyexec: 1.3.1 - '@changesets/logger@0.1.1': + '@changesets/get-dependents-graph@3.0.0': dependencies: - picocolors: 1.1.1 + '@changesets/types': 7.0.0 + semver: 7.8.5 - '@changesets/parse@0.4.3': + '@changesets/git@4.0.1': dependencies: - '@changesets/types': 6.1.0 - js-yaml: 4.1.1 + '@changesets/errors': 1.0.0 + '@changesets/types': 7.0.0 + '@manypkg/get-packages': 3.1.0 + picomatch: 4.0.7 + tinyexec: 1.3.1 - '@changesets/pre@2.0.2': + '@changesets/parse@1.0.0': dependencies: - '@changesets/errors': 0.2.0 - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 - fs-extra: 7.0.1 + '@changesets/types': 7.0.0 + yaml: 2.9.0 - '@changesets/read@0.6.7': + '@changesets/pre@3.0.0': dependencies: - '@changesets/git': 3.0.4 - '@changesets/logger': 0.1.1 - '@changesets/parse': 0.4.3 - '@changesets/types': 6.1.0 - fs-extra: 7.0.1 - p-filter: 2.1.0 - picocolors: 1.1.1 + '@changesets/errors': 1.0.0 + '@changesets/types': 7.0.0 + '@manypkg/get-packages': 3.1.0 - '@changesets/should-skip-package@0.1.2': + '@changesets/read@1.0.1': dependencies: - '@changesets/types': 6.1.0 - '@manypkg/get-packages': 1.1.3 + '@changesets/git': 4.0.1 + '@changesets/parse': 1.0.0 + '@changesets/types': 7.0.0 - '@changesets/types@4.1.0': {} + '@changesets/should-skip-package@1.0.0': + dependencies: + '@changesets/types': 7.0.0 - '@changesets/types@6.1.0': {} + '@changesets/types@7.0.0': {} - '@changesets/write@0.4.0': + '@changesets/write@1.0.1': dependencies: - '@changesets/types': 6.1.0 - fs-extra: 7.0.1 - human-id: 4.1.3 - prettier: 2.8.8 + '@changesets/format': 0.1.2 + '@changesets/types': 7.0.0 + human-id: 4.2.1 - '@chevrotain/cst-dts-gen@10.5.0': + '@clack/core@1.4.3': dependencies: - '@chevrotain/gast': 10.5.0 - '@chevrotain/types': 10.5.0 - lodash: 4.17.23 + fast-wrap-ansi: 0.2.2 + sisteransi: 1.0.5 - '@chevrotain/gast@10.5.0': + '@clack/prompts@1.7.0': dependencies: - '@chevrotain/types': 10.5.0 - lodash: 4.17.23 - - '@chevrotain/types@10.5.0': {} - - '@chevrotain/utils@10.5.0': {} + '@clack/core': 1.4.3 + fast-string-width: 3.0.2 + fast-wrap-ansi: 0.2.2 + sisteransi: 1.0.5 '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 + optional: true - '@electric-sql/pglite-socket@0.0.20(@electric-sql/pglite@0.3.15)': + '@electric-sql/pglite-socket@0.1.3(@electric-sql/pglite@0.4.3)': dependencies: - '@electric-sql/pglite': 0.3.15 + '@electric-sql/pglite': 0.4.3 - '@electric-sql/pglite-tools@0.2.20(@electric-sql/pglite@0.3.15)': + '@electric-sql/pglite-tools@0.3.3(@electric-sql/pglite@0.4.3)': dependencies: - '@electric-sql/pglite': 0.3.15 + '@electric-sql/pglite': 0.4.3 - '@electric-sql/pglite@0.3.15': {} + '@electric-sql/pglite@0.4.3': {} - '@esbuild/aix-ppc64@0.27.4': + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 optional: true - '@esbuild/android-arm64@0.27.4': + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 optional: true - '@esbuild/android-arm@0.27.4': + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 optional: true - '@esbuild/android-x64@0.27.4': + '@esbuild/aix-ppc64@0.28.2': optional: true - '@esbuild/darwin-arm64@0.27.4': + '@esbuild/android-arm64@0.28.2': optional: true - '@esbuild/darwin-x64@0.27.4': + '@esbuild/android-arm@0.28.2': optional: true - '@esbuild/freebsd-arm64@0.27.4': + '@esbuild/android-x64@0.28.2': optional: true - '@esbuild/freebsd-x64@0.27.4': + '@esbuild/darwin-arm64@0.28.2': optional: true - '@esbuild/linux-arm64@0.27.4': + '@esbuild/darwin-x64@0.28.2': optional: true - '@esbuild/linux-arm@0.27.4': + '@esbuild/freebsd-arm64@0.28.2': optional: true - '@esbuild/linux-ia32@0.27.4': + '@esbuild/freebsd-x64@0.28.2': optional: true - '@esbuild/linux-loong64@0.27.4': + '@esbuild/linux-arm64@0.28.2': optional: true - '@esbuild/linux-mips64el@0.27.4': + '@esbuild/linux-arm@0.28.2': optional: true - '@esbuild/linux-ppc64@0.27.4': + '@esbuild/linux-ia32@0.28.2': optional: true - '@esbuild/linux-riscv64@0.27.4': + '@esbuild/linux-loong64@0.28.2': optional: true - '@esbuild/linux-s390x@0.27.4': + '@esbuild/linux-mips64el@0.28.2': optional: true - '@esbuild/linux-x64@0.27.4': + '@esbuild/linux-ppc64@0.28.2': optional: true - '@esbuild/netbsd-arm64@0.27.4': + '@esbuild/linux-riscv64@0.28.2': optional: true - '@esbuild/netbsd-x64@0.27.4': + '@esbuild/linux-s390x@0.28.2': optional: true - '@esbuild/openbsd-arm64@0.27.4': + '@esbuild/linux-x64@0.28.2': optional: true - '@esbuild/openbsd-x64@0.27.4': + '@esbuild/netbsd-arm64@0.28.2': optional: true - '@esbuild/openharmony-arm64@0.27.4': + '@esbuild/netbsd-x64@0.28.2': optional: true - '@esbuild/sunos-x64@0.27.4': + '@esbuild/openbsd-arm64@0.28.2': optional: true - '@esbuild/win32-arm64@0.27.4': + '@esbuild/openbsd-x64@0.28.2': optional: true - '@esbuild/win32-ia32@0.27.4': + '@esbuild/openharmony-arm64@0.28.2': optional: true - '@esbuild/win32-x64@0.27.4': + '@esbuild/sunos-x64@0.28.2': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1)': - dependencies: + '@esbuild/win32-arm64@0.28.2': + optional: true + + '@esbuild/win32-ia32@0.28.2': + optional: true + + '@esbuild/win32-x64@0.28.2': + optional: true + + '@eslint-community/eslint-utils@4.10.1(eslint@8.57.1)': + dependencies: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 @@ -5400,14 +4776,14 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: - ajv: 6.14.0 + ajv: 6.15.0 debug: 4.4.3 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 import-fresh: 3.3.1 - js-yaml: 4.1.1 - minimatch: 10.2.1 + js-yaml: 4.3.2 + minimatch: 3.1.5 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color @@ -5416,15 +4792,11 @@ snapshots: '@hexagon/base64@1.1.28': {} - '@hono/node-server@1.19.11(hono@4.12.8)': - dependencies: - hono: 4.12.8 - '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 debug: 4.4.3 - minimatch: 10.2.1 + minimatch: 3.1.5 transitivePeerDependencies: - supports-color @@ -5432,215 +4804,207 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} - '@inquirer/external-editor@1.0.3(@types/node@25.0.3)': + '@isaacs/cliui@8.0.2': dependencies: - chardet: 2.1.1 - iconv-lite: 0.7.2 - optionalDependencies: - '@types/node': 25.0.3 + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.2.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 '@istanbuljs/load-nyc-config@1.1.0': dependencies: camelcase: 5.3.1 find-up: 4.1.0 get-package-type: 0.1.0 - js-yaml: 3.14.2 + js-yaml: 3.15.2 resolve-from: 5.0.0 - '@istanbuljs/schema@0.1.3': {} + '@istanbuljs/schema@0.1.6': {} - '@jest/console@29.7.0': + '@jest/console@30.5.1': dependencies: - '@jest/types': 29.6.3 - '@types/node': 25.0.3 + '@jest/types': 30.5.1 + '@types/node': 25.9.5 chalk: 4.1.2 - jest-message-util: 29.7.0 - jest-util: 29.7.0 + jest-message-util: 30.5.1 + jest-util: 30.5.1 slash: 3.0.0 - '@jest/core@29.7.0(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3))': + '@jest/core@30.5.1(ts-node@10.9.2(@types/node@25.9.5)(typescript@5.9.3))': dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 25.0.3 + '@jest/console': 30.5.1 + '@jest/pattern': 30.5.0 + '@jest/reporters': 30.5.1 + '@jest/test-result': 30.5.1 + '@jest/transform': 30.5.1 + '@jest/types': 30.5.1 + '@types/node': 25.9.5 ansi-escapes: 4.3.2 chalk: 4.1.2 - ci-info: 3.9.0 - exit: 0.1.2 + ci-info: 4.4.0 + exit-x: 0.2.2 + fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@25.0.3)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3)) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.8 - pretty-format: 29.7.0 + jest-changed-files: 30.5.1 + jest-config: 30.5.1(@types/node@25.9.5)(ts-node@10.9.2(@types/node@25.9.5)(typescript@5.9.3)) + jest-haste-map: 30.5.1 + jest-message-util: 30.5.1 + jest-regex-util: 30.5.0 + jest-resolve: 30.5.1 + jest-resolve-dependencies: 30.5.1 + jest-runner: 30.5.1 + jest-runtime: 30.5.1 + jest-snapshot: 30.5.1 + jest-util: 30.5.1 + jest-validate: 30.5.1 + jest-watcher: 30.5.1 + pretty-format: 30.5.1 slash: 3.0.0 - strip-ansi: 6.0.1 transitivePeerDependencies: - babel-plugin-macros + - esbuild-register - supports-color - ts-node - '@jest/diff-sequences@30.0.1': {} + '@jest/diff-sequences@30.5.0': {} - '@jest/environment@29.7.0': + '@jest/environment@30.5.1': dependencies: - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 25.0.3 - jest-mock: 29.7.0 + '@jest/fake-timers': 30.5.1 + '@jest/types': 30.5.1 + '@types/node': 25.9.5 + jest-mock: 30.5.1 - '@jest/expect-utils@29.7.0': + '@jest/expect-utils@30.5.1': dependencies: - jest-get-type: 29.6.3 + '@jest/get-type': 30.5.0 - '@jest/expect-utils@30.2.0': + '@jest/expect@30.5.1': dependencies: - '@jest/get-type': 30.1.0 - - '@jest/expect@29.7.0': - dependencies: - expect: 29.7.0 - jest-snapshot: 29.7.0 + expect: 30.5.1 + jest-snapshot: 30.5.1 transitivePeerDependencies: - supports-color - '@jest/fake-timers@29.7.0': + '@jest/fake-timers@30.5.1': dependencies: - '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 25.0.3 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-util: 29.7.0 + '@jest/types': 30.5.1 + '@sinonjs/fake-timers': 15.4.0 + '@types/node': 25.9.5 + jest-message-util: 30.5.1 + jest-mock: 30.5.1 + jest-util: 30.5.1 - '@jest/get-type@30.1.0': {} + '@jest/get-type@30.5.0': {} - '@jest/globals@29.7.0': + '@jest/globals@30.5.1': dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/types': 29.6.3 - jest-mock: 29.7.0 + '@jest/environment': 30.5.1 + '@jest/expect': 30.5.1 + '@jest/types': 30.5.1 + jest-mock: 30.5.1 transitivePeerDependencies: - supports-color - '@jest/pattern@30.0.1': + '@jest/pattern@30.5.0': dependencies: - '@types/node': 25.0.3 - jest-regex-util: 30.0.1 + '@types/node': 25.9.5 + jest-regex-util: 30.5.0 - '@jest/reporters@29.7.0': + '@jest/reporters@30.5.1': dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 + '@jest/console': 30.5.1 + '@jest/test-result': 30.5.1 + '@jest/transform': 30.5.1 + '@jest/types': 30.5.1 '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 25.0.3 + '@types/node': 25.9.5 chalk: 4.1.2 collect-v8-coverage: 1.0.3 - exit: 0.1.2 - glob: 7.2.3 + exit-x: 0.2.2 + glob: 13.0.6 graceful-fs: 4.2.11 istanbul-lib-coverage: 3.2.2 istanbul-lib-instrument: 6.0.3 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 + istanbul-lib-source-maps: 5.0.6 istanbul-reports: 3.2.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - jest-worker: 29.7.0 + jest-message-util: 30.5.1 + jest-util: 30.5.1 + jest-worker: 30.5.1 slash: 3.0.0 string-length: 4.0.2 - strip-ansi: 6.0.1 v8-to-istanbul: 9.3.0 transitivePeerDependencies: - supports-color - '@jest/schemas@29.6.3': + '@jest/schemas@30.5.0': dependencies: - '@sinclair/typebox': 0.27.8 + '@sinclair/typebox': 0.34.52 - '@jest/schemas@30.0.5': + '@jest/snapshot-utils@30.5.1': dependencies: - '@sinclair/typebox': 0.34.41 + '@jest/types': 30.5.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + natural-compare: 1.4.0 - '@jest/source-map@29.6.3': + '@jest/source-map@30.5.0': dependencies: '@jridgewell/trace-mapping': 0.3.31 callsites: 3.1.0 + convert-source-map: 2.0.0 graceful-fs: 4.2.11 - '@jest/test-result@29.7.0': + '@jest/test-result@30.5.1': dependencies: - '@jest/console': 29.7.0 - '@jest/types': 29.6.3 + '@jest/console': 30.5.1 + '@jest/types': 30.5.1 '@types/istanbul-lib-coverage': 2.0.6 collect-v8-coverage: 1.0.3 - '@jest/test-sequencer@29.7.0': + '@jest/test-sequencer@30.5.1': dependencies: - '@jest/test-result': 29.7.0 + '@jest/test-result': 30.5.1 graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 + jest-haste-map: 30.5.1 slash: 3.0.0 - '@jest/transform@29.7.0': + '@jest/transform@30.5.1': dependencies: - '@babel/core': 7.29.0 - '@jest/types': 29.6.3 + '@babel/core': 7.29.7 + '@jest/types': 30.5.1 '@jridgewell/trace-mapping': 0.3.31 - babel-plugin-istanbul: 6.1.1 + babel-plugin-istanbul: 8.0.0 chalk: 4.1.2 convert-source-map: 2.0.0 fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - micromatch: 4.0.8 + jest-haste-map: 30.5.1 + jest-regex-util: 30.5.0 + jest-util: 30.5.1 pirates: 4.0.7 slash: 3.0.0 - write-file-atomic: 4.0.2 + write-file-atomic: 5.0.1 transitivePeerDependencies: - supports-color - '@jest/types@29.6.3': - dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 25.0.3 - '@types/yargs': 17.0.35 - chalk: 4.1.2 - - '@jest/types@30.2.0': + '@jest/types@30.5.1': dependencies: - '@jest/pattern': 30.0.1 - '@jest/schemas': 30.0.5 + '@jest/pattern': 30.5.0 + '@jest/schemas': 30.5.0 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 25.0.3 + '@types/node': 25.9.5 '@types/yargs': 17.0.35 chalk: 4.1.2 '@jridgewell/gen-mapping@0.3.13': dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/remapping@2.3.5': @@ -5650,40 +5014,45 @@ snapshots: '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/sourcemap-codec@1.6.0': {} '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 + optional: true '@levischuck/tiny-cbor@0.2.11': {} - '@manypkg/find-root@1.1.0': + '@manypkg/find-root@3.1.0': dependencies: - '@babel/runtime': 7.29.2 - '@types/node': 12.20.55 - find-up: 4.1.0 - fs-extra: 8.1.0 + '@manypkg/tools': 2.1.2 - '@manypkg/get-packages@1.1.3': + '@manypkg/get-packages@3.1.0': dependencies: - '@babel/runtime': 7.29.2 - '@changesets/types': 4.1.0 - '@manypkg/find-root': 1.1.0 - fs-extra: 8.1.0 - globby: 11.1.0 - read-yaml-file: 1.1.0 + '@manypkg/find-root': 3.1.0 + '@manypkg/tools': 2.1.2 - '@mrleebo/prisma-ast@0.13.1': + '@manypkg/tools@2.1.2': dependencies: - chevrotain: 10.5.0 - lilconfig: 2.1.0 + jju: 1.4.0 + tinyglobby: 0.2.17 + yaml: 2.9.0 + + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + optional: true + + '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.3 + optional: true '@nodelib/fs.scandir@2.1.5': dependencies: @@ -5695,7 +5064,7 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.20.1 + fastq: 1.20.3 '@octokit/auth-token@4.0.0': {} @@ -5760,84 +5129,140 @@ snapshots: dependencies: '@octokit/openapi-types': 24.2.0 - '@peculiar/asn1-android@2.8.0': + '@parcel/watcher-android-arm64@2.6.0': + optional: true + + '@parcel/watcher-darwin-arm64@2.6.0': + optional: true + + '@parcel/watcher-darwin-x64@2.6.0': + optional: true + + '@parcel/watcher-freebsd-x64@2.6.0': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.6.0': + optional: true + + '@parcel/watcher-linux-arm-musl@2.6.0': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.6.0': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.6.0': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.6.0': + optional: true + + '@parcel/watcher-linux-x64-musl@2.6.0': + optional: true + + '@parcel/watcher-win32-arm64@2.6.0': + optional: true + + '@parcel/watcher-win32-x64@2.6.0': + optional: true + + '@parcel/watcher@2.6.0': dependencies: - '@peculiar/asn1-schema': 2.8.0 + detect-libc: 2.1.2 + is-glob: 4.0.3 + node-addon-api: 7.1.1 + picomatch: 4.0.7 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.6.0 + '@parcel/watcher-darwin-arm64': 2.6.0 + '@parcel/watcher-darwin-x64': 2.6.0 + '@parcel/watcher-freebsd-x64': 2.6.0 + '@parcel/watcher-linux-arm-glibc': 2.6.0 + '@parcel/watcher-linux-arm-musl': 2.6.0 + '@parcel/watcher-linux-arm64-glibc': 2.6.0 + '@parcel/watcher-linux-arm64-musl': 2.6.0 + '@parcel/watcher-linux-x64-glibc': 2.6.0 + '@parcel/watcher-linux-x64-musl': 2.6.0 + '@parcel/watcher-win32-arm64': 2.6.0 + '@parcel/watcher-win32-x64': 2.6.0 + + '@peculiar/asn1-android@2.9.4': + dependencies: + '@peculiar/asn1-schema': 2.9.4 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-cms@2.8.0': + '@peculiar/asn1-cms@2.9.4': dependencies: - '@peculiar/asn1-schema': 2.8.0 - '@peculiar/asn1-x509': 2.8.0 - '@peculiar/asn1-x509-attr': 2.8.0 + '@peculiar/asn1-schema': 2.9.4 + '@peculiar/asn1-x509': 2.9.4 + '@peculiar/asn1-x509-attr': 2.9.4 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-csr@2.8.0': + '@peculiar/asn1-csr@2.9.4': dependencies: - '@peculiar/asn1-schema': 2.8.0 - '@peculiar/asn1-x509': 2.8.0 + '@peculiar/asn1-schema': 2.9.4 + '@peculiar/asn1-x509': 2.9.4 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-ecc@2.8.0': + '@peculiar/asn1-ecc@2.9.4': dependencies: - '@peculiar/asn1-schema': 2.8.0 - '@peculiar/asn1-x509': 2.8.0 + '@peculiar/asn1-schema': 2.9.4 + '@peculiar/asn1-x509': 2.9.4 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-pfx@2.8.0': + '@peculiar/asn1-pfx@2.9.4': dependencies: - '@peculiar/asn1-cms': 2.8.0 - '@peculiar/asn1-pkcs8': 2.8.0 - '@peculiar/asn1-rsa': 2.8.0 - '@peculiar/asn1-schema': 2.8.0 + '@peculiar/asn1-cms': 2.9.4 + '@peculiar/asn1-pkcs8': 2.9.4 + '@peculiar/asn1-rsa': 2.9.4 + '@peculiar/asn1-schema': 2.9.4 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-pkcs8@2.8.0': + '@peculiar/asn1-pkcs8@2.9.4': dependencies: - '@peculiar/asn1-schema': 2.8.0 - '@peculiar/asn1-x509': 2.8.0 + '@peculiar/asn1-schema': 2.9.4 + '@peculiar/asn1-x509': 2.9.4 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-pkcs9@2.8.0': + '@peculiar/asn1-pkcs9@2.9.4': dependencies: - '@peculiar/asn1-cms': 2.8.0 - '@peculiar/asn1-pfx': 2.8.0 - '@peculiar/asn1-pkcs8': 2.8.0 - '@peculiar/asn1-schema': 2.8.0 - '@peculiar/asn1-x509': 2.8.0 - '@peculiar/asn1-x509-attr': 2.8.0 + '@peculiar/asn1-cms': 2.9.4 + '@peculiar/asn1-pfx': 2.9.4 + '@peculiar/asn1-pkcs8': 2.9.4 + '@peculiar/asn1-schema': 2.9.4 + '@peculiar/asn1-x509': 2.9.4 + '@peculiar/asn1-x509-attr': 2.9.4 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-rsa@2.8.0': + '@peculiar/asn1-rsa@2.9.4': dependencies: - '@peculiar/asn1-schema': 2.8.0 - '@peculiar/asn1-x509': 2.8.0 + '@peculiar/asn1-schema': 2.9.4 + '@peculiar/asn1-x509': 2.9.4 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-schema@2.8.0': + '@peculiar/asn1-schema@2.9.4': dependencies: '@peculiar/utils': 2.0.3 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-x509-attr@2.8.0': + '@peculiar/asn1-x509-attr@2.9.4': dependencies: - '@peculiar/asn1-schema': 2.8.0 - '@peculiar/asn1-x509': 2.8.0 + '@peculiar/asn1-schema': 2.9.4 + '@peculiar/asn1-x509': 2.9.4 asn1js: 3.0.10 tslib: 2.8.1 - '@peculiar/asn1-x509@2.8.0': + '@peculiar/asn1-x509@2.9.4': dependencies: - '@peculiar/asn1-schema': 2.8.0 + '@peculiar/asn1-schema': 2.9.4 '@peculiar/utils': 2.0.3 asn1js: 3.0.10 tslib: 2.8.1 @@ -5848,611 +5273,418 @@ snapshots: '@peculiar/x509@1.14.3': dependencies: - '@peculiar/asn1-cms': 2.8.0 - '@peculiar/asn1-csr': 2.8.0 - '@peculiar/asn1-ecc': 2.8.0 - '@peculiar/asn1-pkcs9': 2.8.0 - '@peculiar/asn1-rsa': 2.8.0 - '@peculiar/asn1-schema': 2.8.0 - '@peculiar/asn1-x509': 2.8.0 + '@peculiar/asn1-cms': 2.9.4 + '@peculiar/asn1-csr': 2.9.4 + '@peculiar/asn1-ecc': 2.9.4 + '@peculiar/asn1-pkcs9': 2.9.4 + '@peculiar/asn1-rsa': 2.9.4 + '@peculiar/asn1-schema': 2.9.4 + '@peculiar/asn1-x509': 2.9.4 pvtsutils: 1.3.6 reflect-metadata: 0.2.2 tslib: 2.8.1 tsyringe: 4.10.0 - '@playwright/test@1.58.2': - dependencies: - playwright: 1.58.2 + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.3.6': {} - '@prisma/adapter-better-sqlite3@7.5.0': + '@playwright/test@1.62.1': dependencies: - '@prisma/driver-adapter-utils': 7.5.0 - better-sqlite3: 12.8.0 + playwright: 1.62.1 - '@prisma/adapter-pg@7.5.0': + '@pnpm/deps.graph-sequencer@1100.0.1': {} + + '@prisma/adapter-pg@7.10.0': dependencies: - '@prisma/driver-adapter-utils': 7.5.0 - '@types/pg': 8.11.11 - pg: 8.20.0 + '@prisma/driver-adapter-utils': 7.10.0 + '@types/pg': 8.23.1 + pg: 8.23.0 postgres-array: 3.0.4 transitivePeerDependencies: - pg-native - '@prisma/client-runtime-utils@7.5.0': {} + '@prisma/client-runtime-utils@7.10.0': {} - '@prisma/client@7.5.0(prisma@7.5.0(@types/react@19.2.14)(better-sqlite3@12.8.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3)': + '@prisma/client@7.10.0(prisma@7.10.0(@types/node@20.19.43)(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(better-sqlite3@12.11.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.9.3))(typescript@5.9.3)': dependencies: - '@prisma/client-runtime-utils': 7.5.0 + '@prisma/client-runtime-utils': 7.10.0 optionalDependencies: - prisma: 7.5.0(@types/react@19.2.14)(better-sqlite3@12.8.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + prisma: 7.10.0(@types/node@20.19.43)(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(better-sqlite3@12.11.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.9.3) typescript: 5.9.3 - '@prisma/config@7.5.0': + '@prisma/config@7.10.0': dependencies: - c12: 3.1.0 - deepmerge-ts: 7.1.5 - effect: 3.18.4 + c12: 3.3.4 + deepmerge-ts: 8.0.2 + effect: 3.20.0 empathic: 2.0.0 transitivePeerDependencies: - magicast - '@prisma/debug@7.2.0': {} + '@prisma/debug@7.10.0': {} - '@prisma/debug@7.5.0': {} + '@prisma/debug@7.2.0': {} - '@prisma/dev@0.20.0(typescript@5.9.3)': + '@prisma/dev@0.24.17(typescript@5.9.3)': dependencies: - '@electric-sql/pglite': 0.3.15 - '@electric-sql/pglite-socket': 0.0.20(@electric-sql/pglite@0.3.15) - '@electric-sql/pglite-tools': 0.2.20(@electric-sql/pglite@0.3.15) - '@hono/node-server': 1.19.11(hono@4.12.8) - '@mrleebo/prisma-ast': 0.13.1 + '@electric-sql/pglite': 0.4.3 + '@electric-sql/pglite-socket': 0.1.3(@electric-sql/pglite@0.4.3) + '@electric-sql/pglite-tools': 0.3.3(@electric-sql/pglite@0.4.3) '@prisma/get-platform': 7.2.0 '@prisma/query-plan-executor': 7.2.0 + '@prisma/streams-local': 0.1.11 + find-my-way: 9.7.0 foreground-child: 3.3.1 get-port-please: 3.2.0 - hono: 4.12.8 - http-status-codes: 2.3.0 pathe: 2.0.3 proper-lockfile: 4.1.2 remeda: 2.33.4 std-env: 3.10.0 - valibot: 1.2.0(typescript@5.9.3) + valibot: 1.4.2(typescript@5.9.3) zeptomatch: 2.1.0 transitivePeerDependencies: - typescript - '@prisma/driver-adapter-utils@7.5.0': + '@prisma/driver-adapter-utils@7.10.0': dependencies: - '@prisma/debug': 7.5.0 + '@prisma/debug': 7.10.0 - '@prisma/engines-version@7.5.0-15.280c870be64f457428992c43c1f6d557fab6e29e': {} + '@prisma/engines-version@7.10.0-4.0edf323efd1d98336f3f0a68684b56f689b900d3': {} - '@prisma/engines@7.5.0': + '@prisma/engines@7.10.0': dependencies: - '@prisma/debug': 7.5.0 - '@prisma/engines-version': 7.5.0-15.280c870be64f457428992c43c1f6d557fab6e29e - '@prisma/fetch-engine': 7.5.0 - '@prisma/get-platform': 7.5.0 + '@prisma/debug': 7.10.0 + '@prisma/engines-version': 7.10.0-4.0edf323efd1d98336f3f0a68684b56f689b900d3 + '@prisma/fetch-engine': 7.10.0 + '@prisma/get-platform': 7.10.0 - '@prisma/fetch-engine@7.5.0': + '@prisma/fetch-engine@7.10.0': dependencies: - '@prisma/debug': 7.5.0 - '@prisma/engines-version': 7.5.0-15.280c870be64f457428992c43c1f6d557fab6e29e - '@prisma/get-platform': 7.5.0 + '@prisma/debug': 7.10.0 + '@prisma/engines-version': 7.10.0-4.0edf323efd1d98336f3f0a68684b56f689b900d3 + '@prisma/get-platform': 7.10.0 + + '@prisma/get-platform@7.10.0': + dependencies: + '@prisma/debug': 7.10.0 '@prisma/get-platform@7.2.0': dependencies: '@prisma/debug': 7.2.0 - '@prisma/get-platform@7.5.0': + '@prisma/query-plan-executor@7.2.0': {} + + '@prisma/streams-local@0.1.11': dependencies: - '@prisma/debug': 7.5.0 + ajv: 8.20.0 + better-result: 2.10.0 + env-paths: 3.0.0 + proper-lockfile: 4.1.2 - '@prisma/query-plan-executor@7.2.0': {} + '@prisma/studio-core@0.33.0(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@types/react': 19.2.18 + '@visx/curve': 4.0.1-alpha.0 + '@visx/event': 4.0.1-alpha.0 + '@visx/grid': 4.0.1-alpha.0(react@19.2.8) + '@visx/group': 4.0.1-alpha.0(react@19.2.8) + '@visx/responsive': 4.0.1-alpha.0(react@19.2.8) + '@visx/scale': 4.0.1-alpha.0 + '@visx/shape': 4.0.1-alpha.0(react@19.2.8) + d3-array: 3.2.4 + d3-shape: 3.2.0 + elkjs: 0.11.1 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + transitivePeerDependencies: + - '@types/react-dom' + + '@radix-ui/primitive@1.1.3': {} - '@prisma/studio-core@0.21.1(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.18)(react@19.2.8)': dependencies: - '@types/react': 19.2.14 - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) + react: 19.2.8 + optionalDependencies: + '@types/react': 19.2.18 + + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.18)(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + optionalDependencies: + '@types/react': 19.2.18 + '@types/react-dom': 19.2.7(@types/react@19.2.18) + + '@radix-ui/react-slot@1.2.3(@types/react@19.2.18)(react@19.2.8)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.18)(react@19.2.8) + react: 19.2.8 + optionalDependencies: + '@types/react': 19.2.18 + + '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.18)(react@19.2.8) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + optionalDependencies: + '@types/react': 19.2.18 + '@types/react-dom': 19.2.7(@types/react@19.2.18) + + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.18)(react@19.2.8)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.18)(react@19.2.8) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.18)(react@19.2.8) + react: 19.2.8 + optionalDependencies: + '@types/react': 19.2.18 + + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.18)(react@19.2.8)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.18)(react@19.2.8) + react: 19.2.8 + optionalDependencies: + '@types/react': 19.2.18 + + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.18)(react@19.2.8)': + dependencies: + react: 19.2.8 + optionalDependencies: + '@types/react': 19.2.18 '@rolldown/pluginutils@1.0.0-rc.3': {} - '@rollup/rollup-android-arm-eabi@4.60.0': + '@rollup/rollup-android-arm-eabi@4.63.1': optional: true - '@rollup/rollup-android-arm64@4.60.0': + '@rollup/rollup-android-arm64@4.63.1': optional: true - '@rollup/rollup-darwin-arm64@4.60.0': + '@rollup/rollup-darwin-arm64@4.63.1': optional: true - '@rollup/rollup-darwin-x64@4.60.0': + '@rollup/rollup-darwin-x64@4.63.1': optional: true - '@rollup/rollup-freebsd-arm64@4.60.0': + '@rollup/rollup-freebsd-arm64@4.63.1': optional: true - '@rollup/rollup-freebsd-x64@4.60.0': + '@rollup/rollup-freebsd-x64@4.63.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.60.0': + '@rollup/rollup-linux-arm-gnueabihf@4.63.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.60.0': + '@rollup/rollup-linux-arm-musleabihf@4.63.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.60.0': + '@rollup/rollup-linux-arm64-gnu@4.63.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.60.0': + '@rollup/rollup-linux-arm64-musl@4.63.1': optional: true - '@rollup/rollup-linux-loong64-gnu@4.60.0': + '@rollup/rollup-linux-loong64-gnu@4.63.1': optional: true - '@rollup/rollup-linux-loong64-musl@4.60.0': + '@rollup/rollup-linux-loong64-musl@4.63.1': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.60.0': + '@rollup/rollup-linux-ppc64-gnu@4.63.1': optional: true - '@rollup/rollup-linux-ppc64-musl@4.60.0': + '@rollup/rollup-linux-ppc64-musl@4.63.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.60.0': + '@rollup/rollup-linux-riscv64-gnu@4.63.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.60.0': + '@rollup/rollup-linux-riscv64-musl@4.63.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.60.0': + '@rollup/rollup-linux-s390x-gnu@4.63.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.60.0': + '@rollup/rollup-linux-x64-gnu@4.63.1': optional: true - '@rollup/rollup-linux-x64-musl@4.60.0': + '@rollup/rollup-linux-x64-musl@4.63.1': optional: true - '@rollup/rollup-openbsd-x64@4.60.0': + '@rollup/rollup-openbsd-x64@4.63.1': optional: true - '@rollup/rollup-openharmony-arm64@4.60.0': + '@rollup/rollup-openharmony-arm64@4.63.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.60.0': + '@rollup/rollup-win32-arm64-msvc@4.63.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.60.0': + '@rollup/rollup-win32-ia32-msvc@4.63.1': optional: true - '@rollup/rollup-win32-x64-gnu@4.60.0': + '@rollup/rollup-win32-x64-gnu@4.63.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.60.0': + '@rollup/rollup-win32-x64-msvc@4.63.1': optional: true - '@simplewebauthn/server@13.3.2': + '@simplewebauthn/server@13.3.3': dependencies: '@hexagon/base64': 1.1.28 '@levischuck/tiny-cbor': 0.2.11 - '@peculiar/asn1-android': 2.8.0 - '@peculiar/asn1-ecc': 2.8.0 - '@peculiar/asn1-rsa': 2.8.0 - '@peculiar/asn1-schema': 2.8.0 - '@peculiar/asn1-x509': 2.8.0 + '@peculiar/asn1-android': 2.9.4 + '@peculiar/asn1-ecc': 2.9.4 + '@peculiar/asn1-rsa': 2.9.4 + '@peculiar/asn1-schema': 2.9.4 + '@peculiar/asn1-x509': 2.9.4 '@peculiar/x509': 1.14.3 - '@sinclair/typebox@0.27.8': {} - - '@sinclair/typebox@0.34.41': {} + '@sinclair/typebox@0.34.52': {} '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 - '@sinonjs/fake-timers@10.3.0': + '@sinonjs/fake-timers@15.4.0': dependencies: '@sinonjs/commons': 3.0.1 - '@smithy/abort-controller@4.2.10': - dependencies: - '@smithy/types': 4.13.0 - tslib: 2.8.1 - - '@smithy/chunked-blob-reader-native@4.2.2': + '@smithy/core@3.33.3': dependencies: - '@smithy/util-base64': 4.3.1 + '@smithy/types': 4.18.0 tslib: 2.8.1 - '@smithy/chunked-blob-reader@5.2.1': + '@smithy/credential-provider-imds@4.5.2': dependencies: + '@smithy/core': 3.33.3 + '@smithy/types': 4.18.0 tslib: 2.8.1 - '@smithy/config-resolver@4.4.9': + '@smithy/fetch-http-handler@5.8.0': dependencies: - '@smithy/node-config-provider': 4.3.10 - '@smithy/types': 4.13.0 - '@smithy/util-config-provider': 4.2.1 - '@smithy/util-endpoints': 3.3.1 - '@smithy/util-middleware': 4.2.10 - tslib: 2.8.1 - - '@smithy/core@3.23.7': - dependencies: - '@smithy/middleware-serde': 4.2.11 - '@smithy/protocol-http': 5.3.10 - '@smithy/types': 4.13.0 - '@smithy/util-base64': 4.3.1 - '@smithy/util-body-length-browser': 4.2.1 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-stream': 4.5.16 - '@smithy/util-utf8': 4.2.1 - '@smithy/uuid': 1.1.1 + '@smithy/core': 3.33.3 + '@smithy/types': 4.18.0 tslib: 2.8.1 - '@smithy/credential-provider-imds@4.2.10': + '@smithy/node-http-handler@4.12.1': dependencies: - '@smithy/node-config-provider': 4.3.10 - '@smithy/property-provider': 4.2.10 - '@smithy/types': 4.13.0 - '@smithy/url-parser': 4.2.10 + '@smithy/core': 3.33.3 + '@smithy/types': 4.18.0 tslib: 2.8.1 - '@smithy/eventstream-codec@4.2.9': + '@smithy/signature-v4@5.7.3': dependencies: - '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.13.0 - '@smithy/util-hex-encoding': 4.2.1 + '@smithy/core': 3.33.3 + '@smithy/types': 4.18.0 tslib: 2.8.1 - '@smithy/eventstream-serde-browser@4.2.9': + '@smithy/types@4.18.0': dependencies: - '@smithy/eventstream-serde-universal': 4.2.9 - '@smithy/types': 4.13.0 tslib: 2.8.1 - '@smithy/eventstream-serde-config-resolver@4.3.9': - dependencies: - '@smithy/types': 4.13.0 - tslib: 2.8.1 - - '@smithy/eventstream-serde-node@4.2.9': - dependencies: - '@smithy/eventstream-serde-universal': 4.2.9 - '@smithy/types': 4.13.0 - tslib: 2.8.1 - - '@smithy/eventstream-serde-universal@4.2.9': - dependencies: - '@smithy/eventstream-codec': 4.2.9 - '@smithy/types': 4.13.0 - tslib: 2.8.1 - - '@smithy/fetch-http-handler@5.3.12': - dependencies: - '@smithy/protocol-http': 5.3.10 - '@smithy/querystring-builder': 4.2.10 - '@smithy/types': 4.13.0 - '@smithy/util-base64': 4.3.1 - tslib: 2.8.1 - - '@smithy/hash-blob-browser@4.2.10': - dependencies: - '@smithy/chunked-blob-reader': 5.2.1 - '@smithy/chunked-blob-reader-native': 4.2.2 - '@smithy/types': 4.13.0 - tslib: 2.8.1 - - '@smithy/hash-node@4.2.10': - dependencies: - '@smithy/types': 4.13.0 - '@smithy/util-buffer-from': 4.2.1 - '@smithy/util-utf8': 4.2.1 - tslib: 2.8.1 - - '@smithy/hash-stream-node@4.2.9': - dependencies: - '@smithy/types': 4.13.0 - '@smithy/util-utf8': 4.2.1 - tslib: 2.8.1 - - '@smithy/invalid-dependency@4.2.10': - dependencies: - '@smithy/types': 4.13.0 - tslib: 2.8.1 - - '@smithy/is-array-buffer@2.2.0': - dependencies: - tslib: 2.8.1 - - '@smithy/is-array-buffer@4.2.1': - dependencies: - tslib: 2.8.1 - - '@smithy/md5-js@4.2.9': - dependencies: - '@smithy/types': 4.13.0 - '@smithy/util-utf8': 4.2.1 - tslib: 2.8.1 - - '@smithy/middleware-content-length@4.2.10': - dependencies: - '@smithy/protocol-http': 5.3.10 - '@smithy/types': 4.13.0 - tslib: 2.8.1 - - '@smithy/middleware-endpoint@4.4.21': - dependencies: - '@smithy/core': 3.23.7 - '@smithy/middleware-serde': 4.2.11 - '@smithy/node-config-provider': 4.3.10 - '@smithy/shared-ini-file-loader': 4.4.5 - '@smithy/types': 4.13.0 - '@smithy/url-parser': 4.2.10 - '@smithy/util-middleware': 4.2.10 - tslib: 2.8.1 - - '@smithy/middleware-retry@4.4.38': - dependencies: - '@smithy/node-config-provider': 4.3.10 - '@smithy/protocol-http': 5.3.10 - '@smithy/service-error-classification': 4.2.10 - '@smithy/smithy-client': 4.12.1 - '@smithy/types': 4.13.0 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-retry': 4.2.10 - '@smithy/uuid': 1.1.1 - tslib: 2.8.1 - - '@smithy/middleware-serde@4.2.11': - dependencies: - '@smithy/protocol-http': 5.3.10 - '@smithy/types': 4.13.0 - tslib: 2.8.1 - - '@smithy/middleware-stack@4.2.10': - dependencies: - '@smithy/types': 4.13.0 - tslib: 2.8.1 - - '@smithy/node-config-provider@4.3.10': - dependencies: - '@smithy/property-provider': 4.2.10 - '@smithy/shared-ini-file-loader': 4.4.5 - '@smithy/types': 4.13.0 - tslib: 2.8.1 - - '@smithy/node-http-handler@4.4.13': - dependencies: - '@smithy/abort-controller': 4.2.10 - '@smithy/protocol-http': 5.3.10 - '@smithy/querystring-builder': 4.2.10 - '@smithy/types': 4.13.0 - tslib: 2.8.1 - - '@smithy/property-provider@4.2.10': - dependencies: - '@smithy/types': 4.13.0 - tslib: 2.8.1 - - '@smithy/protocol-http@5.3.10': - dependencies: - '@smithy/types': 4.13.0 - tslib: 2.8.1 - - '@smithy/querystring-builder@4.2.10': - dependencies: - '@smithy/types': 4.13.0 - '@smithy/util-uri-escape': 4.2.1 - tslib: 2.8.1 - - '@smithy/querystring-parser@4.2.10': - dependencies: - '@smithy/types': 4.13.0 - tslib: 2.8.1 - - '@smithy/service-error-classification@4.2.10': - dependencies: - '@smithy/types': 4.13.0 - - '@smithy/shared-ini-file-loader@4.4.5': - dependencies: - '@smithy/types': 4.13.0 - tslib: 2.8.1 - - '@smithy/signature-v4@5.3.10': - dependencies: - '@smithy/is-array-buffer': 4.2.1 - '@smithy/protocol-http': 5.3.10 - '@smithy/types': 4.13.0 - '@smithy/util-hex-encoding': 4.2.1 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-uri-escape': 4.2.1 - '@smithy/util-utf8': 4.2.1 - tslib: 2.8.1 - - '@smithy/smithy-client@4.12.1': - dependencies: - '@smithy/core': 3.23.7 - '@smithy/middleware-endpoint': 4.4.21 - '@smithy/middleware-stack': 4.2.10 - '@smithy/protocol-http': 5.3.10 - '@smithy/types': 4.13.0 - '@smithy/util-stream': 4.5.16 - tslib: 2.8.1 - - '@smithy/types@4.13.0': - dependencies: - tslib: 2.8.1 - - '@smithy/url-parser@4.2.10': - dependencies: - '@smithy/querystring-parser': 4.2.10 - '@smithy/types': 4.13.0 - tslib: 2.8.1 - - '@smithy/util-base64@4.3.1': - dependencies: - '@smithy/util-buffer-from': 4.2.1 - '@smithy/util-utf8': 4.2.1 - tslib: 2.8.1 - - '@smithy/util-body-length-browser@4.2.1': - dependencies: - tslib: 2.8.1 + '@standard-schema/spec@1.1.0': {} - '@smithy/util-body-length-node@4.2.2': + '@trpc/client@11.18.0(@trpc/server@11.18.0(typescript@5.9.3))(typescript@5.9.3)': dependencies: - tslib: 2.8.1 + '@trpc/server': 11.18.0(typescript@5.9.3) + typescript: 5.9.3 - '@smithy/util-buffer-from@2.2.0': + '@trpc/server@11.18.0(typescript@5.9.3)': dependencies: - '@smithy/is-array-buffer': 2.2.0 - tslib: 2.8.1 + typescript: 5.9.3 - '@smithy/util-buffer-from@4.2.1': - dependencies: - '@smithy/is-array-buffer': 4.2.1 - tslib: 2.8.1 + '@tsconfig/node10@1.0.13': + optional: true - '@smithy/util-config-provider@4.2.1': - dependencies: - tslib: 2.8.1 + '@tsconfig/node12@1.0.11': + optional: true - '@smithy/util-defaults-mode-browser@4.3.37': - dependencies: - '@smithy/property-provider': 4.2.10 - '@smithy/smithy-client': 4.12.1 - '@smithy/types': 4.13.0 - tslib: 2.8.1 + '@tsconfig/node14@1.0.3': + optional: true - '@smithy/util-defaults-mode-node@4.2.40': - dependencies: - '@smithy/config-resolver': 4.4.9 - '@smithy/credential-provider-imds': 4.2.10 - '@smithy/node-config-provider': 4.3.10 - '@smithy/property-provider': 4.2.10 - '@smithy/smithy-client': 4.12.1 - '@smithy/types': 4.13.0 - tslib: 2.8.1 + '@tsconfig/node16@1.0.4': + optional: true - '@smithy/util-endpoints@3.3.1': + '@tybys/wasm-util@0.10.3': dependencies: - '@smithy/node-config-provider': 4.3.10 - '@smithy/types': 4.13.0 tslib: 2.8.1 + optional: true - '@smithy/util-hex-encoding@4.2.1': + '@types/babel__core@7.20.5': dependencies: - tslib: 2.8.1 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 - '@smithy/util-middleware@4.2.10': + '@types/babel__generator@7.27.0': dependencies: - '@smithy/types': 4.13.0 - tslib: 2.8.1 + '@babel/types': 7.29.8 - '@smithy/util-retry@4.2.10': + '@types/babel__template@7.4.4': dependencies: - '@smithy/service-error-classification': 4.2.10 - '@smithy/types': 4.13.0 - tslib: 2.8.1 + '@babel/parser': 7.29.8 + '@babel/types': 7.29.8 - '@smithy/util-stream@4.5.16': + '@types/babel__traverse@7.28.0': dependencies: - '@smithy/fetch-http-handler': 5.3.12 - '@smithy/node-http-handler': 4.4.13 - '@smithy/types': 4.13.0 - '@smithy/util-base64': 4.3.1 - '@smithy/util-buffer-from': 4.2.1 - '@smithy/util-hex-encoding': 4.2.1 - '@smithy/util-utf8': 4.2.1 - tslib: 2.8.1 + '@babel/types': 7.29.8 - '@smithy/util-uri-escape@4.2.1': - dependencies: - tslib: 2.8.1 + '@types/bcryptjs@2.4.6': {} - '@smithy/util-utf8@2.3.0': + '@types/better-sqlite3@7.6.13': dependencies: - '@smithy/util-buffer-from': 2.2.0 - tslib: 2.8.1 + '@types/node': 25.9.5 + optional: true - '@smithy/util-utf8@4.2.1': + '@types/chai@5.2.3': dependencies: - '@smithy/util-buffer-from': 4.2.1 - tslib: 2.8.1 + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 - '@smithy/util-waiter@4.2.10': - dependencies: - '@smithy/abort-controller': 4.2.10 - '@smithy/types': 4.13.0 - tslib: 2.8.1 + '@types/d3-array@3.0.3': {} - '@smithy/uuid@1.1.1': - dependencies: - tslib: 2.8.1 + '@types/d3-color@3.1.0': {} - '@standard-schema/spec@1.1.0': {} + '@types/d3-delaunay@6.0.1': {} - '@trpc/client@11.14.1(@trpc/server@11.8.0(typescript@5.9.3))(typescript@5.9.3)': - dependencies: - '@trpc/server': 11.8.0(typescript@5.9.3) - typescript: 5.9.3 + '@types/d3-format@3.0.1': {} - '@trpc/server@11.8.0(typescript@5.9.3)': + '@types/d3-geo@3.1.0': dependencies: - typescript: 5.9.3 - - '@tsconfig/node10@1.0.12': {} - - '@tsconfig/node12@1.0.11': {} - - '@tsconfig/node14@1.0.3': {} + '@types/geojson': 7946.0.16 - '@tsconfig/node16@1.0.4': {} - - '@types/babel__core@7.20.5': + '@types/d3-interpolate@3.0.1': dependencies: - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 - '@types/babel__generator': 7.27.0 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.28.0 + '@types/d3-color': 3.1.0 - '@types/babel__generator@7.27.0': - dependencies: - '@babel/types': 7.28.5 + '@types/d3-path@3.1.1': {} - '@types/babel__template@7.4.4': + '@types/d3-scale@4.0.2': dependencies: - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@types/d3-time': 3.0.0 - '@types/babel__traverse@7.28.0': + '@types/d3-shape@3.1.7': dependencies: - '@babel/types': 7.28.5 + '@types/d3-path': 3.1.1 - '@types/bcryptjs@2.4.6': {} + '@types/d3-time-format@2.1.0': {} - '@types/better-sqlite3@7.6.13': - dependencies: - '@types/node': 20.19.37 - - '@types/chai@5.2.3': - dependencies: - '@types/deep-eql': 4.0.2 - assertion-error: 2.0.1 + '@types/d3-time@3.0.0': {} '@types/deep-eql@4.0.2': {} - '@types/estree@1.0.8': {} + '@types/estree@1.0.9': {} - '@types/graceful-fs@4.1.9': - dependencies: - '@types/node': 25.0.3 + '@types/geojson@7946.0.16': {} '@types/istanbul-lib-coverage@2.0.6': {} @@ -6466,45 +5698,39 @@ snapshots: '@types/jest@30.0.0': dependencies: - expect: 30.2.0 - pretty-format: 30.2.0 + expect: 30.5.1 + pretty-format: 30.5.1 '@types/js-yaml@4.0.9': {} '@types/jsonwebtoken@9.0.10': dependencies: '@types/ms': 2.1.0 - '@types/node': 20.19.37 + '@types/node': 20.19.43 - '@types/ms@2.1.0': {} + '@types/lodash@4.17.25': {} - '@types/node@12.20.55': {} + '@types/ms@2.1.0': {} - '@types/node@20.19.37': + '@types/node@20.19.43': dependencies: undici-types: 6.21.0 - '@types/node@25.0.3': - dependencies: - undici-types: 7.16.0 - - '@types/pg@8.11.11': + '@types/node@25.9.5': dependencies: - '@types/node': 25.0.3 - pg-protocol: 1.13.0 - pg-types: 4.1.0 + undici-types: 7.24.6 - '@types/pg@8.20.0': + '@types/pg@8.23.1': dependencies: - '@types/node': 20.19.37 - pg-protocol: 1.13.0 + '@types/node': 20.19.43 + pg-protocol: 1.16.0 pg-types: 2.2.0 - '@types/react-dom@19.2.3(@types/react@19.2.14)': + '@types/react-dom@19.2.7(@types/react@19.2.18)': dependencies: - '@types/react': 19.2.14 + '@types/react': 19.2.18 - '@types/react@19.2.14': + '@types/react@19.2.18': dependencies: csstype: 3.2.3 @@ -6516,164 +5742,325 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.69.0(@typescript-eslint/parser@8.69.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 7.18.0 + '@typescript-eslint/parser': 8.69.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.69.0 + '@typescript-eslint/type-utils': 8.69.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.69.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.69.0 eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.2 + ignore: 7.0.8 natural-compare: 1.4.0 - ts-api-utils: 1.4.3(typescript@5.9.3) - optionalDependencies: + ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/parser@8.69.0(eslint@8.57.1)(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 7.18.0 + '@typescript-eslint/scope-manager': 8.69.0 + '@typescript-eslint/types': 8.69.0 + '@typescript-eslint/typescript-estree': 8.69.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.69.0 debug: 4.4.3 eslint: 8.57.1 - optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@7.18.0': + '@typescript-eslint/project-service@8.69.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 + '@typescript-eslint/tsconfig-utils': 8.69.0(typescript@5.9.3) + '@typescript-eslint/types': 8.69.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color - '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/scope-manager@8.69.0': dependencies: - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.3) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/types': 8.69.0 + '@typescript-eslint/visitor-keys': 8.69.0 + + '@typescript-eslint/tsconfig-utils@8.69.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.69.0(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.69.0 + '@typescript-eslint/typescript-estree': 8.69.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.69.0(eslint@8.57.1)(typescript@5.9.3) debug: 4.4.3 eslint: 8.57.1 - ts-api-utils: 1.4.3(typescript@5.9.3) - optionalDependencies: + ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@7.18.0': {} + '@typescript-eslint/types@8.69.0': {} - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.69.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 + '@typescript-eslint/project-service': 8.69.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.69.0(typescript@5.9.3) + '@typescript-eslint/types': 8.69.0 + '@typescript-eslint/visitor-keys': 8.69.0 debug: 4.4.3 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 10.2.1 - semver: 7.7.3 - ts-api-utils: 1.4.3(typescript@5.9.3) - optionalDependencies: + minimatch: 10.2.6 + semver: 7.8.5 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.9.3)': + '@typescript-eslint/utils@8.69.0(eslint@8.57.1)(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.3) + '@eslint-community/eslint-utils': 4.10.1(eslint@8.57.1) + '@typescript-eslint/scope-manager': 8.69.0 + '@typescript-eslint/types': 8.69.0 + '@typescript-eslint/typescript-estree': 8.69.0(typescript@5.9.3) eslint: 8.57.1 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - - typescript - '@typescript-eslint/visitor-keys@7.18.0': + '@typescript-eslint/visitor-keys@8.69.0': dependencies: - '@typescript-eslint/types': 7.18.0 - eslint-visitor-keys: 3.4.3 + '@typescript-eslint/types': 8.69.0 + eslint-visitor-keys: 5.0.1 + + '@ungap/structured-clone@1.4.0': {} + + '@unrs/resolver-binding-android-arm-eabi@1.12.2': + optional: true + + '@unrs/resolver-binding-android-arm64@1.12.2': + optional: true + + '@unrs/resolver-binding-darwin-arm64@1.12.2': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.12.2': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.12.2': + optional: true - '@ungap/structured-clone@1.3.0': {} + '@unrs/resolver-binding-linux-arm64-musl@1.12.2': + optional: true - '@vitejs/plugin-react@5.2.0(vite@7.3.1(@types/node@20.19.37)(jiti@2.6.1)(tsx@4.21.0))': + '@unrs/resolver-binding-linux-loong64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-loong64-musl@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.12.2': + optional: true + + '@unrs/resolver-binding-openharmony-arm64@1.12.2': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.12.2': dependencies: - '@babel/core': 7.29.0 - '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.29.0) + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.12.2': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.12.2': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.12.2': + optional: true + + '@visx/curve@4.0.1-alpha.0': + dependencies: + '@visx/vendor': 4.0.0-alpha.0 + + '@visx/event@4.0.1-alpha.0': + dependencies: + '@types/react': 19.2.18 + '@visx/point': 4.0.1-alpha.0 + + '@visx/grid@4.0.1-alpha.0(react@19.2.8)': + dependencies: + '@types/react': 19.2.18 + '@visx/curve': 4.0.1-alpha.0 + '@visx/group': 4.0.1-alpha.0(react@19.2.8) + '@visx/point': 4.0.1-alpha.0 + '@visx/scale': 4.0.1-alpha.0 + '@visx/shape': 4.0.1-alpha.0(react@19.2.8) + classnames: 2.5.1 + react: 19.2.8 + + '@visx/group@4.0.1-alpha.0(react@19.2.8)': + dependencies: + '@types/react': 19.2.18 + classnames: 2.5.1 + react: 19.2.8 + + '@visx/point@4.0.1-alpha.0': {} + + '@visx/responsive@4.0.1-alpha.0(react@19.2.8)': + dependencies: + '@types/lodash': 4.17.25 + '@types/react': 19.2.18 + lodash: 4.18.1 + react: 19.2.8 + + '@visx/scale@4.0.1-alpha.0': + dependencies: + '@visx/vendor': 4.0.0-alpha.0 + + '@visx/shape@4.0.1-alpha.0(react@19.2.8)': + dependencies: + '@types/lodash': 4.17.25 + '@types/react': 19.2.18 + '@visx/curve': 4.0.1-alpha.0 + '@visx/group': 4.0.1-alpha.0(react@19.2.8) + '@visx/scale': 4.0.1-alpha.0 + '@visx/vendor': 4.0.0-alpha.0 + classnames: 2.5.1 + lodash: 4.18.1 + react: 19.2.8 + + '@visx/vendor@4.0.0-alpha.0': + dependencies: + '@types/d3-array': 3.0.3 + '@types/d3-color': 3.1.0 + '@types/d3-delaunay': 6.0.1 + '@types/d3-format': 3.0.1 + '@types/d3-geo': 3.1.0 + '@types/d3-interpolate': 3.0.1 + '@types/d3-path': 3.1.1 + '@types/d3-scale': 4.0.2 + '@types/d3-shape': 3.1.7 + '@types/d3-time': 3.0.0 + '@types/d3-time-format': 2.1.0 + d3-array: 3.2.1 + d3-color: 3.1.0 + d3-delaunay: 6.0.2 + d3-format: 3.1.0 + d3-geo: 3.1.0 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-scale: 4.0.2 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + internmap: 2.0.3 + + '@vitejs/plugin-react@5.2.0(vite@7.3.6(@types/node@20.19.43)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.0))': + dependencies: + '@babel/core': 7.29.7 + '@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-react-jsx-source': 7.29.7(@babel/core@7.29.7) '@rolldown/pluginutils': 1.0.0-rc.3 '@types/babel__core': 7.20.5 react-refresh: 0.18.0 - vite: 7.3.1(@types/node@20.19.37)(jiti@2.6.1)(tsx@4.21.0) + vite: 7.3.6(@types/node@20.19.43)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.0) transitivePeerDependencies: - supports-color - '@vitest/expect@4.1.0': + '@vitest/expect@4.1.11': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.0 - '@vitest/utils': 4.1.0 + '@vitest/spy': 4.1.11 + '@vitest/utils': 4.1.11 chai: 6.2.2 - tinyrainbow: 3.1.0 + tinyrainbow: 3.1.1 - '@vitest/mocker@4.1.0(vite@7.3.1(@types/node@20.19.37)(jiti@2.6.1)(tsx@4.21.0))': + '@vitest/mocker@4.1.11(vite@7.3.6(@types/node@20.19.43)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.0))': dependencies: - '@vitest/spy': 4.1.0 + '@vitest/spy': 4.1.11 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@20.19.37)(jiti@2.6.1)(tsx@4.21.0) + vite: 7.3.6(@types/node@20.19.43)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.0) - '@vitest/pretty-format@4.1.0': + '@vitest/pretty-format@4.1.11': dependencies: - tinyrainbow: 3.1.0 + tinyrainbow: 3.1.1 - '@vitest/runner@4.1.0': + '@vitest/runner@4.1.11': dependencies: - '@vitest/utils': 4.1.0 + '@vitest/utils': 4.1.11 pathe: 2.0.3 - '@vitest/snapshot@4.1.0': + '@vitest/snapshot@4.1.11': dependencies: - '@vitest/pretty-format': 4.1.0 - '@vitest/utils': 4.1.0 + '@vitest/pretty-format': 4.1.11 + '@vitest/utils': 4.1.11 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.0': {} + '@vitest/spy@4.1.11': {} - '@vitest/utils@4.1.0': + '@vitest/utils@4.1.11': dependencies: - '@vitest/pretty-format': 4.1.0 + '@vitest/pretty-format': 4.1.11 convert-source-map: 2.0.0 - tinyrainbow: 3.1.0 + tinyrainbow: 3.1.1 - acorn-jsx@5.3.2(acorn@8.15.0): + acorn-jsx@5.3.2(acorn@8.18.0): dependencies: - acorn: 8.15.0 + acorn: 8.18.0 - acorn-walk@8.3.4: + acorn-walk@8.3.5: dependencies: - acorn: 8.16.0 - - acorn@8.15.0: {} + acorn: 8.18.0 + optional: true - acorn@8.16.0: {} + acorn@8.18.0: {} agent-base@7.1.4: {} - ajv@6.14.0: + ajv@6.15.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ansi-colors@4.1.3: {} + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.7 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 ansi-escapes@4.3.2: dependencies: @@ -6681,12 +6068,16 @@ snapshots: ansi-regex@5.0.1: {} + ansi-regex@6.3.0: {} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 ansi-styles@5.2.0: {} + ansi-styles@6.2.3: {} + ansible-vault@1.3.0: {} any-promise@1.3.0: {} @@ -6694,14 +6085,14 @@ snapshots: anymatch@3.1.3: dependencies: normalize-path: 3.0.0 - picomatch: 2.3.1 + picomatch: 2.3.2 - apple-signin-auth@2.0.0: + apple-signin-auth@2.1.0: dependencies: jsonwebtoken: 9.0.3 - node-rsa: 1.1.1 - arg@4.1.3: {} + arg@4.1.3: + optional: true argparse@1.0.10: dependencies: @@ -6709,125 +6100,124 @@ snapshots: argparse@2.0.1: {} - array-union@2.1.0: {} - - asn1@0.2.6: - dependencies: - safer-buffer: 2.1.2 - asn1js@3.0.10: dependencies: pvtsutils: 1.3.6 - pvutils: 1.1.5 + pvutils: 1.2.0 tslib: 2.8.1 assertion-error@2.0.1: {} aws-ssl-profiles@1.1.2: {} - babel-jest@29.7.0(@babel/core@7.29.0): + babel-jest@30.5.1(@babel/core@7.29.7): dependencies: - '@babel/core': 7.29.0 - '@jest/transform': 29.7.0 + '@babel/core': 7.29.7 + '@jest/transform': 30.5.1 '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.29.0) + babel-plugin-istanbul: 8.0.0 + babel-preset-jest: 30.5.0(@babel/core@7.29.7) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 transitivePeerDependencies: - supports-color - babel-plugin-istanbul@6.1.1: + babel-plugin-istanbul@8.0.0: dependencies: - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.29.7 '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 + '@istanbuljs/schema': 0.1.6 + istanbul-lib-instrument: 6.0.3 + test-exclude: 7.0.2 transitivePeerDependencies: - supports-color - babel-plugin-jest-hoist@29.6.3: + babel-plugin-jest-hoist@30.5.0: dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.28.0 - babel-preset-current-node-syntax@1.2.0(@babel/core@7.29.0): - dependencies: - '@babel/core': 7.29.0 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.0) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.0) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.29.0) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.0) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.0) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.0) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.0) - - babel-preset-jest@29.6.3(@babel/core@7.29.0): - dependencies: - '@babel/core': 7.29.0 - babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) - - balanced-match@4.0.3: {} + babel-preset-current-node-syntax@1.2.0(@babel/core@7.29.7): + dependencies: + '@babel/core': 7.29.7 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.29.7) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.29.7) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.29.7) + '@babel/plugin-syntax-import-attributes': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.7) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.29.7) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.29.7) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.29.7) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.29.7) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.29.7) + + babel-preset-jest@30.5.0(@babel/core@7.29.7): + dependencies: + '@babel/core': 7.29.7 + babel-plugin-jest-hoist: 30.5.0 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7) + + balanced-match@1.0.2: {} + + balanced-match@4.0.4: {} base64-js@1.5.1: {} - baseline-browser-mapping@2.9.6: {} + baseline-browser-mapping@2.11.21: {} bcryptjs@2.4.3: {} before-after-hook@2.2.3: {} - better-path-resolve@1.0.0: - dependencies: - is-windows: 1.0.2 + better-result@2.10.0: {} - better-sqlite3@12.8.0: + better-sqlite3@12.11.1: dependencies: bindings: 1.5.0 prebuild-install: 7.1.3 + optional: true bignumber.js@9.3.1: {} bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 + optional: true bl@4.1.0: dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 + optional: true bowser@2.14.1: {} - brace-expansion@5.0.2: + brace-expansion@1.1.18: dependencies: - balanced-match: 4.0.3 + balanced-match: 1.0.2 + concat-map: 0.0.1 - braces@3.0.3: + brace-expansion@2.1.4: dependencies: - fill-range: 7.1.1 + balanced-match: 1.0.2 - browserslist@4.28.1: + brace-expansion@5.0.9: dependencies: - baseline-browser-mapping: 2.9.6 - caniuse-lite: 1.0.30001760 - electron-to-chromium: 1.5.267 - node-releases: 2.0.27 - update-browserslist-db: 1.2.2(browserslist@4.28.1) + balanced-match: 4.0.4 + + browserslist@4.28.9: + dependencies: + baseline-browser-mapping: 2.11.21 + caniuse-lite: 1.0.30001810 + electron-to-chromium: 1.5.422 + node-releases: 2.0.54 + update-browserslist-db: 1.3.2(browserslist@4.28.9) bs-logger@0.2.6: dependencies: @@ -6839,42 +6229,43 @@ snapshots: buffer-equal-constant-time@1.0.1: {} - buffer-from@1.1.2: {} - buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 + optional: true - bundle-require@5.1.0(esbuild@0.27.4): + bundle-require@5.1.0(esbuild@0.28.2): dependencies: - esbuild: 0.27.4 + esbuild: 0.28.2 load-tsconfig: 0.2.5 - c12@3.1.0: + c12@3.3.4: dependencies: - chokidar: 4.0.3 + chokidar: 5.0.0 confbox: 0.2.4 - defu: 6.1.4 - dotenv: 16.6.1 - exsolve: 1.0.8 - giget: 2.0.0 - jiti: 2.6.1 - ohash: 2.0.11 + defu: 6.1.7 + dotenv: 17.4.2 + exsolve: 1.1.1 + giget: 3.3.1 + jiti: 2.7.0 + ohash: 2.0.12 pathe: 2.0.3 - perfect-debounce: 1.0.0 - pkg-types: 2.3.0 - rc9: 2.1.2 + perfect-debounce: 2.1.0 + pkg-types: 2.3.2 + rc9: 3.1.0 cac@6.7.14: {} + cac@7.0.0: {} + callsites@3.1.0: {} camelcase@5.3.1: {} camelcase@6.3.0: {} - caniuse-lite@1.0.30001760: {} + caniuse-lite@1.0.30001810: {} chai@6.2.2: {} @@ -6885,34 +6276,22 @@ snapshots: char-regex@1.0.2: {} - chardet@2.1.1: {} - - chevrotain@10.5.0: - dependencies: - '@chevrotain/cst-dts-gen': 10.5.0 - '@chevrotain/gast': 10.5.0 - '@chevrotain/types': 10.5.0 - '@chevrotain/utils': 10.5.0 - lodash: 4.17.23 - regexp-to-ast: 0.5.0 - chokidar@4.0.3: dependencies: readdirp: 4.1.2 - chownr@1.1.4: {} - - ci-info@3.9.0: {} + chokidar@5.0.0: + dependencies: + readdirp: 5.1.1 - ci-info@4.3.1: {} + chownr@1.1.4: + optional: true - citty@0.1.6: - dependencies: - consola: 3.4.2 + ci-info@4.4.0: {} - citty@0.2.1: {} + cjs-module-lexer@2.2.1: {} - cjs-module-lexer@1.4.3: {} + classnames@2.5.1: {} cliui@8.0.1: dependencies: @@ -6934,10 +6313,14 @@ snapshots: commander@4.1.1: {} + concat-map@0.0.1: {} + confbox@0.1.8: {} confbox@0.2.4: {} + confbox@0.3.1: {} + consola@3.4.2: {} convert-source-map@2.0.0: {} @@ -6948,30 +6331,62 @@ snapshots: dependencies: is-what: 4.1.16 - create-jest@29.7.0(@types/node@25.0.3)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3)): + create-require@1.1.1: + optional: true + + cross-spawn@7.0.6: dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@25.0.3)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3)) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + csstype@3.2.3: {} + + d3-array@3.2.1: + dependencies: + internmap: 2.0.3 + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-color@3.1.0: {} + + d3-delaunay@6.0.2: + dependencies: + delaunator: 5.1.0 + + d3-format@3.1.0: {} + + d3-geo@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 - create-require@1.1.1: {} + d3-path@3.1.0: {} - cross-spawn@7.0.6: + d3-scale@4.0.2: dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 - csstype@3.2.3: {} + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 data-uri-to-buffer@4.0.1: {} @@ -6982,117 +6397,118 @@ snapshots: decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 + optional: true - dedent@1.7.0: {} + dedent@1.7.2: {} - deep-extend@0.6.0: {} + deep-extend@0.6.0: + optional: true deep-is@0.1.4: {} - deepmerge-ts@7.1.5: {} + deepmerge-ts@8.0.2: {} deepmerge@4.3.1: {} - defu@6.1.4: {} + defu@6.1.7: {} - denque@2.1.0: {} + delaunator@5.1.0: + dependencies: + robust-predicates: 3.0.3 deprecation@2.3.1: {} destr@2.0.5: {} - detect-indent@6.1.0: {} - detect-libc@2.1.2: {} detect-newline@3.1.0: {} - diff-sequences@29.6.3: {} - - diff@8.0.3: {} - - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 + diff@4.0.4: + optional: true doctrine@3.0.0: dependencies: esutils: 2.0.3 - dotenv@16.6.1: {} + dotenv@17.4.2: {} - drizzle-orm@0.44.7(@electric-sql/pglite@0.3.15)(@prisma/client@7.5.0(prisma@7.5.0(@types/react@19.2.14)(better-sqlite3@12.8.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.20.0)(better-sqlite3@12.8.0)(mysql2@3.15.3)(pg@8.20.0)(postgres@3.4.7)(prisma@7.5.0(@types/react@19.2.14)(better-sqlite3@12.8.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3)): + drizzle-orm@0.45.2(@electric-sql/pglite@0.4.3)(@prisma/client@7.10.0(prisma@7.10.0(@types/node@20.19.43)(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(better-sqlite3@12.11.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.9.3))(typescript@5.9.3))(@types/better-sqlite3@7.6.13)(@types/pg@8.23.1)(better-sqlite3@12.11.1)(mysql2@3.24.3(@types/node@20.19.43))(pg@8.23.0)(postgres@3.4.7)(prisma@7.10.0(@types/node@20.19.43)(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(better-sqlite3@12.11.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.9.3)): optionalDependencies: - '@electric-sql/pglite': 0.3.15 - '@prisma/client': 7.5.0(prisma@7.5.0(@types/react@19.2.14)(better-sqlite3@12.8.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3) + '@electric-sql/pglite': 0.4.3 + '@prisma/client': 7.10.0(prisma@7.10.0(@types/node@20.19.43)(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(better-sqlite3@12.11.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.9.3))(typescript@5.9.3) '@types/better-sqlite3': 7.6.13 - '@types/pg': 8.20.0 - better-sqlite3: 12.8.0 - mysql2: 3.15.3 - pg: 8.20.0 + '@types/pg': 8.23.1 + better-sqlite3: 12.11.1 + mysql2: 3.24.3(@types/node@20.19.43) + pg: 8.23.0 postgres: 3.4.7 - prisma: 7.5.0(@types/react@19.2.14)(better-sqlite3@12.8.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + prisma: 7.10.0(@types/node@20.19.43)(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(better-sqlite3@12.11.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.9.3) + + eastasianwidth@0.2.0: {} ecdsa-sig-formatter@1.0.11: dependencies: safe-buffer: 5.2.1 - effect@3.18.4: + effect@3.20.0: dependencies: '@standard-schema/spec': 1.1.0 fast-check: 3.23.2 - electron-to-chromium@1.5.267: {} + electron-to-chromium@1.5.422: {} + + elkjs@0.11.1: {} emittery@0.13.1: {} emoji-regex@8.0.0: {} + emoji-regex@9.2.2: {} + empathic@2.0.0: {} end-of-stream@1.4.5: dependencies: once: 1.4.0 + optional: true - enquirer@2.4.1: - dependencies: - ansi-colors: 4.1.3 - strip-ansi: 6.0.1 + env-paths@3.0.0: {} error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 - es-module-lexer@2.0.0: {} + es-module-lexer@2.3.2: {} - esbuild@0.27.4: + esbuild@0.28.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.27.4 - '@esbuild/android-arm': 0.27.4 - '@esbuild/android-arm64': 0.27.4 - '@esbuild/android-x64': 0.27.4 - '@esbuild/darwin-arm64': 0.27.4 - '@esbuild/darwin-x64': 0.27.4 - '@esbuild/freebsd-arm64': 0.27.4 - '@esbuild/freebsd-x64': 0.27.4 - '@esbuild/linux-arm': 0.27.4 - '@esbuild/linux-arm64': 0.27.4 - '@esbuild/linux-ia32': 0.27.4 - '@esbuild/linux-loong64': 0.27.4 - '@esbuild/linux-mips64el': 0.27.4 - '@esbuild/linux-ppc64': 0.27.4 - '@esbuild/linux-riscv64': 0.27.4 - '@esbuild/linux-s390x': 0.27.4 - '@esbuild/linux-x64': 0.27.4 - '@esbuild/netbsd-arm64': 0.27.4 - '@esbuild/netbsd-x64': 0.27.4 - '@esbuild/openbsd-arm64': 0.27.4 - '@esbuild/openbsd-x64': 0.27.4 - '@esbuild/openharmony-arm64': 0.27.4 - '@esbuild/sunos-x64': 0.27.4 - '@esbuild/win32-arm64': 0.27.4 - '@esbuild/win32-ia32': 0.27.4 - '@esbuild/win32-x64': 0.27.4 + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 escalade@3.2.0: {} @@ -7107,17 +6523,19 @@ snapshots: eslint-visitor-keys@3.4.3: {} + eslint-visitor-keys@5.0.1: {} + eslint@8.57.1: dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.10.1(eslint@8.57.1) '@eslint-community/regexpp': 4.12.2 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.1 '@humanwhocodes/config-array': 0.13.0 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.3.0 - ajv: 6.14.0 + '@ungap/structured-clone': 1.4.0 + ajv: 6.15.0 chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.3 @@ -7138,11 +6556,11 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 - js-yaml: 4.1.1 + js-yaml: 4.3.2 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 lodash.merge: 4.6.2 - minimatch: 10.2.1 + minimatch: 3.1.5 natural-compare: 1.4.0 optionator: 0.9.4 strip-ansi: 6.0.1 @@ -7152,8 +6570,8 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn: 8.18.0 + acorn-jsx: 5.3.2(acorn@8.18.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -7170,7 +6588,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 esutils@2.0.3: {} @@ -7186,61 +6604,55 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - exit@0.1.2: {} + exit-x@0.2.2: {} - expand-template@2.0.3: {} - - expect-type@1.3.0: {} + expand-template@2.0.3: + optional: true - expect@29.7.0: - dependencies: - '@jest/expect-utils': 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 + expect-type@1.4.0: {} - expect@30.2.0: + expect@30.5.1: dependencies: - '@jest/expect-utils': 30.2.0 - '@jest/get-type': 30.1.0 - jest-matcher-utils: 30.2.0 - jest-message-util: 30.2.0 - jest-mock: 30.2.0 - jest-util: 30.2.0 + '@jest/expect-utils': 30.5.1 + '@jest/get-type': 30.5.0 + jest-matcher-utils: 30.5.1 + jest-message-util: 30.5.1 + jest-mock: 30.5.1 + jest-util: 30.5.1 - exsolve@1.0.8: {} + exsolve@1.1.1: {} extend@3.0.2: {} - extendable-error@0.1.7: {} - fast-check@3.23.2: dependencies: pure-rand: 6.1.0 - fast-deep-equal@3.1.3: {} + fast-decode-uri-component@1.0.1: {} - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 + fast-deep-equal@3.1.3: {} fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} - fast-xml-builder@1.0.0: {} + fast-querystring@1.1.2: + dependencies: + fast-decode-uri-component: 1.0.1 + + fast-string-truncated-width@3.0.3: {} + + fast-string-width@3.0.2: + dependencies: + fast-string-truncated-width: 3.0.3 + + fast-uri@3.1.7: {} - fast-xml-parser@5.4.1: + fast-wrap-ansi@0.2.2: dependencies: - fast-xml-builder: 1.0.0 - strnum: 2.1.2 + fast-string-width: 3.0.2 - fastq@1.20.1: + fastq@1.20.3: dependencies: reusify: 1.1.0 @@ -7248,9 +6660,9 @@ snapshots: dependencies: bser: 2.1.1 - fdir@6.5.0(picomatch@4.0.3): + fdir@6.5.0(picomatch@4.0.7): optionalDependencies: - picomatch: 4.0.3 + picomatch: 4.0.7 fetch-blob@3.2.0: dependencies: @@ -7261,11 +6673,14 @@ snapshots: dependencies: flat-cache: 3.2.0 - file-uri-to-path@1.0.0: {} + file-uri-to-path@1.0.0: + optional: true - fill-range@7.1.1: + find-my-way@9.7.0: dependencies: - to-regex-range: 5.0.1 + fast-deep-equal: 3.1.3 + fast-querystring: 1.1.2 + safe-regex2: 5.1.1 find-up@4.1.0: dependencies: @@ -7281,15 +6696,15 @@ snapshots: dependencies: magic-string: 0.30.21 mlly: 1.8.2 - rollup: 4.60.0 + rollup: 4.63.1 flat-cache@3.2.0: dependencies: - flatted: 3.4.2 + flatted: 3.4.4 keyv: 4.5.4 rimraf: 3.0.2 - flatted@3.4.2: {} + flatted@3.4.4: {} foreground-child@3.3.1: dependencies: @@ -7300,19 +6715,8 @@ snapshots: dependencies: fetch-blob: 3.2.0 - fs-constants@1.0.0: {} - - fs-extra@7.0.1: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - - fs-extra@8.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 + fs-constants@1.0.0: + optional: true fs.realpath@1.0.0: {} @@ -7322,9 +6726,7 @@ snapshots: fsevents@2.3.3: optional: true - function-bind@1.1.2: {} - - gaxios@7.1.4: + gaxios@7.3.1: dependencies: extend: 3.0.2 https-proxy-agent: 7.0.6 @@ -7334,7 +6736,7 @@ snapshots: gcp-metadata@8.1.2: dependencies: - gaxios: 7.1.4 + gaxios: 7.3.1 google-logging-utils: 1.1.3 json-bigint: 1.0.0 transitivePeerDependencies: @@ -7354,35 +6756,36 @@ snapshots: get-stream@6.0.1: {} - get-tsconfig@4.13.7: - dependencies: - resolve-pkg-maps: 1.0.0 - - giget@2.0.0: - dependencies: - citty: 0.1.6 - consola: 3.4.2 - defu: 6.1.4 - node-fetch-native: 1.6.7 - nypm: 0.6.5 - pathe: 2.0.3 + giget@3.3.1: {} - github-from-package@0.0.0: {} + github-from-package@0.0.0: + optional: true - glob-parent@5.1.2: + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - glob-parent@6.0.2: + glob@10.5.0: dependencies: - is-glob: 4.0.3 + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.9 + minipass: 7.1.3 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@13.0.6: + dependencies: + minimatch: 10.2.6 + minipass: 7.1.3 + path-scurry: 2.0.2 glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 10.2.1 + minimatch: 3.1.5 once: 1.4.0 path-is-absolute: 1.0.1 @@ -7390,20 +6793,11 @@ snapshots: dependencies: type-fest: 0.20.2 - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - - google-auth-library@10.6.2: + google-auth-library@10.9.1: dependencies: base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 - gaxios: 7.1.4 + gaxios: 7.3.1 gcp-metadata: 8.1.2 google-logging-utils: 1.1.3 jws: 4.0.1 @@ -7414,13 +6808,13 @@ snapshots: graceful-fs@4.2.11: {} - grammex@3.1.12: {} + grammex@3.1.13: {} graphemer@1.4.0: {} graphmatch@1.1.1: {} - handlebars@4.7.8: + handlebars@4.7.9: dependencies: minimist: 1.2.8 neo-async: 2.6.2 @@ -7431,16 +6825,8 @@ snapshots: has-flag@4.0.0: {} - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - hono@4.12.8: {} - html-escaper@2.0.2: {} - http-status-codes@2.3.0: {} - https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 @@ -7448,18 +6834,21 @@ snapshots: transitivePeerDependencies: - supports-color - human-id@4.1.3: {} + human-id@4.2.1: {} human-signals@2.1.0: {} - iconv-lite@0.7.2: + iconv-lite@0.7.3: dependencies: safer-buffer: 2.1.2 - ieee754@1.2.1: {} + ieee754@1.2.1: + optional: true ignore@5.3.2: {} + ignore@7.0.8: {} + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 @@ -7470,6 +6859,8 @@ snapshots: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 + import-meta-resolve@4.2.0: {} + imurmurhash@0.1.4: {} inflight@1.0.6: @@ -7479,14 +6870,13 @@ snapshots: inherits@2.0.4: {} - ini@1.3.8: {} + ini@1.3.8: + optional: true + + internmap@2.0.3: {} is-arrayish@0.2.1: {} - is-core-module@2.16.1: - dependencies: - hasown: 2.0.2 - is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -7497,43 +6887,25 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-number@7.0.0: {} - is-path-inside@3.0.3: {} is-property@1.0.2: {} is-stream@2.0.1: {} - is-subdir@1.2.0: - dependencies: - better-path-resolve: 1.0.0 - is-what@4.1.16: {} - is-windows@1.0.2: {} - isexe@2.0.0: {} istanbul-lib-coverage@3.2.2: {} - istanbul-lib-instrument@5.2.1: - dependencies: - '@babel/core': 7.29.0 - '@babel/parser': 7.29.2 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - istanbul-lib-instrument@6.0.3: dependencies: - '@babel/core': 7.29.0 - '@babel/parser': 7.29.2 - '@istanbuljs/schema': 0.1.3 + '@babel/core': 7.29.7 + '@babel/parser': 7.29.8 + '@istanbuljs/schema': 0.1.6 istanbul-lib-coverage: 3.2.2 - semver: 7.7.3 + semver: 7.8.5 transitivePeerDependencies: - supports-color @@ -7543,11 +6915,11 @@ snapshots: make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-lib-source-maps@4.0.1: + istanbul-lib-source-maps@5.0.6: dependencies: + '@jridgewell/trace-mapping': 0.3.31 debug: 4.4.3 istanbul-lib-coverage: 3.2.2 - source-map: 0.6.1 transitivePeerDependencies: - supports-color @@ -7556,370 +6928,334 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - jest-changed-files@29.7.0: + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jest-changed-files@30.5.1: dependencies: execa: 5.1.1 - jest-util: 29.7.0 + jest-util: 30.5.1 p-limit: 3.1.0 - jest-circus@29.7.0: + jest-circus@30.5.1: dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 25.0.3 + '@jest/environment': 30.5.1 + '@jest/expect': 30.5.1 + '@jest/test-result': 30.5.1 + '@jest/types': 30.5.1 + '@types/node': 25.9.5 chalk: 4.1.2 co: 4.6.0 - dedent: 1.7.0 + dedent: 1.7.2 is-generator-fn: 2.1.0 - jest-each: 29.7.0 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 + jest-each: 30.5.1 + jest-matcher-utils: 30.5.1 + jest-message-util: 30.5.1 + jest-runtime: 30.5.1 + jest-snapshot: 30.5.1 + jest-util: 30.5.1 p-limit: 3.1.0 - pretty-format: 29.7.0 - pure-rand: 6.1.0 + pretty-format: 30.5.1 + pure-rand: 7.0.1 slash: 3.0.0 stack-utils: 2.0.6 transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@25.0.3)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3)): + jest-cli@30.5.1(@types/node@25.9.5)(ts-node@10.9.2(@types/node@25.9.5)(typescript@5.9.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3)) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 + '@jest/core': 30.5.1(ts-node@10.9.2(@types/node@25.9.5)(typescript@5.9.3)) + '@jest/test-result': 30.5.1 + '@jest/types': 30.5.1 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@25.0.3)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3)) - exit: 0.1.2 + exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@25.0.3)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3)) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 + jest-config: 30.5.1(@types/node@25.9.5)(ts-node@10.9.2(@types/node@25.9.5)(typescript@5.9.3)) + jest-util: 30.5.1 + jest-validate: 30.5.1 + yargs: 17.7.3 transitivePeerDependencies: - '@types/node' - babel-plugin-macros + - esbuild-register - supports-color - ts-node - jest-config@29.7.0(@types/node@25.0.3)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3)): + jest-config@30.5.1(@types/node@25.9.5)(ts-node@10.9.2(@types/node@25.9.5)(typescript@5.9.3)): dependencies: - '@babel/core': 7.29.0 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.29.0) + '@babel/core': 7.29.7 + '@jest/get-type': 30.5.0 + '@jest/pattern': 30.5.0 + '@jest/test-sequencer': 30.5.1 + '@jest/types': 30.5.1 + babel-jest: 30.5.1(@babel/core@7.29.7) chalk: 4.1.2 - ci-info: 3.9.0 + ci-info: 4.4.0 deepmerge: 4.3.1 - glob: 7.2.3 + glob: 13.0.6 graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.8 + jest-circus: 30.5.1 + jest-docblock: 30.5.0 + jest-environment-node: 30.5.1 + jest-regex-util: 30.5.0 + jest-resolve: 30.5.1 + jest-runner: 30.5.1 + jest-util: 30.5.1 + jest-validate: 30.5.1 parse-json: 5.2.0 - pretty-format: 29.7.0 + pretty-format: 30.5.1 slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 25.0.3 - ts-node: 10.9.2(@types/node@25.0.3)(typescript@5.9.3) + '@types/node': 25.9.5 + ts-node: 10.9.2(@types/node@25.9.5)(typescript@5.9.3) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-diff@29.7.0: + jest-diff@30.5.1: dependencies: + '@jest/diff-sequences': 30.5.0 + '@jest/get-type': 30.5.0 chalk: 4.1.2 - diff-sequences: 29.6.3 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 + pretty-format: 30.5.1 - jest-diff@30.2.0: - dependencies: - '@jest/diff-sequences': 30.0.1 - '@jest/get-type': 30.1.0 - chalk: 4.1.2 - pretty-format: 30.2.0 - - jest-docblock@29.7.0: + jest-docblock@30.5.0: dependencies: detect-newline: 3.1.0 - jest-each@29.7.0: + jest-each@30.5.1: dependencies: - '@jest/types': 29.6.3 + '@jest/get-type': 30.5.0 + '@jest/types': 30.5.1 chalk: 4.1.2 - jest-get-type: 29.6.3 - jest-util: 29.7.0 - pretty-format: 29.7.0 + jest-util: 30.5.1 + pretty-format: 30.5.1 - jest-environment-node@29.7.0: + jest-environment-node@30.5.1: dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 25.0.3 - jest-mock: 29.7.0 - jest-util: 29.7.0 - - jest-get-type@29.6.3: {} + '@jest/environment': 30.5.1 + '@jest/fake-timers': 30.5.1 + '@jest/types': 30.5.1 + '@types/node': 25.9.5 + jest-mock: 30.5.1 + jest-util: 30.5.1 + jest-validate: 30.5.1 - jest-haste-map@29.7.0: + jest-haste-map@30.5.1: dependencies: - '@jest/types': 29.6.3 - '@types/graceful-fs': 4.1.9 - '@types/node': 25.0.3 + '@jest/types': 30.5.1 + '@parcel/watcher': 2.6.0 + '@types/node': 25.9.5 anymatch: 3.1.3 fb-watchman: 2.0.2 + fdir: 6.5.0(picomatch@4.0.7) graceful-fs: 4.2.11 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - jest-worker: 29.7.0 - micromatch: 4.0.8 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.3 - - jest-leak-detector@29.7.0: - dependencies: - jest-get-type: 29.6.3 - pretty-format: 29.7.0 + jest-regex-util: 30.5.0 + jest-util: 30.5.1 + jest-worker: 30.5.1 + picomatch: 4.0.7 - jest-matcher-utils@29.7.0: + jest-leak-detector@30.5.1: dependencies: - chalk: 4.1.2 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - - jest-matcher-utils@30.2.0: - dependencies: - '@jest/get-type': 30.1.0 - chalk: 4.1.2 - jest-diff: 30.2.0 - pretty-format: 30.2.0 + '@jest/get-type': 30.5.0 + pretty-format: 30.5.1 - jest-message-util@29.7.0: + jest-matcher-utils@30.5.1: dependencies: - '@babel/code-frame': 7.29.0 - '@jest/types': 29.6.3 - '@types/stack-utils': 2.0.3 + '@jest/get-type': 30.5.0 chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.8 - pretty-format: 29.7.0 - slash: 3.0.0 - stack-utils: 2.0.6 + jest-diff: 30.5.1 + pretty-format: 30.5.1 - jest-message-util@30.2.0: + jest-message-util@30.5.1: dependencies: - '@babel/code-frame': 7.29.0 - '@jest/types': 30.2.0 + '@babel/code-frame': 7.29.7 + '@jest/types': 30.5.1 '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 - micromatch: 4.0.8 - pretty-format: 30.2.0 + jest-util: 30.5.1 + picomatch: 4.0.7 + pretty-format: 30.5.1 slash: 3.0.0 stack-utils: 2.0.6 - jest-mock@29.7.0: + jest-mock@30.5.1: dependencies: - '@jest/types': 29.6.3 - '@types/node': 25.0.3 - jest-util: 29.7.0 - - jest-mock@30.2.0: - dependencies: - '@jest/types': 30.2.0 - '@types/node': 25.0.3 - jest-util: 30.2.0 - - jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - optionalDependencies: - jest-resolve: 29.7.0 + '@jest/expect-utils': 30.5.1 + '@jest/types': 30.5.1 + '@types/node': 25.9.5 + jest-util: 30.5.1 - jest-regex-util@29.6.3: {} + jest-regex-util@30.5.0: {} - jest-regex-util@30.0.1: {} - - jest-resolve-dependencies@29.7.0: + jest-resolve-dependencies@30.5.1: dependencies: - jest-regex-util: 29.6.3 - jest-snapshot: 29.7.0 + jest-regex-util: 30.5.0 + jest-snapshot: 30.5.1 transitivePeerDependencies: - supports-color - jest-resolve@29.7.0: + jest-resolve@30.5.1: dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) - jest-util: 29.7.0 - jest-validate: 29.7.0 - resolve: 1.22.11 - resolve.exports: 2.0.3 + jest-haste-map: 30.5.1 + jest-util: 30.5.1 + jest-validate: 30.5.1 slash: 3.0.0 + unrs-resolver: 1.12.2 - jest-runner@29.7.0: + jest-runner@30.5.1: dependencies: - '@jest/console': 29.7.0 - '@jest/environment': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 25.0.3 + '@jest/console': 30.5.1 + '@jest/environment': 30.5.1 + '@jest/source-map': 30.5.0 + '@jest/test-result': 30.5.1 + '@jest/transform': 30.5.1 + '@jest/types': 30.5.1 + '@types/node': 25.9.5 chalk: 4.1.2 emittery: 0.13.1 + exit-x: 0.2.2 graceful-fs: 4.2.11 - jest-docblock: 29.7.0 - jest-environment-node: 29.7.0 - jest-haste-map: 29.7.0 - jest-leak-detector: 29.7.0 - jest-message-util: 29.7.0 - jest-resolve: 29.7.0 - jest-runtime: 29.7.0 - jest-util: 29.7.0 - jest-watcher: 29.7.0 - jest-worker: 29.7.0 + jest-docblock: 30.5.0 + jest-environment-node: 30.5.1 + jest-haste-map: 30.5.1 + jest-leak-detector: 30.5.1 + jest-message-util: 30.5.1 + jest-resolve: 30.5.1 + jest-runtime: 30.5.1 + jest-util: 30.5.1 + jest-watcher: 30.5.1 + jest-worker: 30.5.1 p-limit: 3.1.0 - source-map-support: 0.5.13 transitivePeerDependencies: - supports-color - jest-runtime@29.7.0: + jest-runtime@30.5.1: dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/globals': 29.7.0 - '@jest/source-map': 29.6.3 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 25.0.3 + '@jest/environment': 30.5.1 + '@jest/fake-timers': 30.5.1 + '@jest/globals': 30.5.1 + '@jest/source-map': 30.5.0 + '@jest/test-result': 30.5.1 + '@jest/transform': 30.5.1 + '@jest/types': 30.5.1 + '@types/node': 25.9.5 chalk: 4.1.2 - cjs-module-lexer: 1.4.3 + cjs-module-lexer: 2.2.1 collect-v8-coverage: 1.0.3 - glob: 7.2.3 + es-module-lexer: 2.3.2 + glob: 13.0.6 graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 + jest-haste-map: 30.5.1 + jest-message-util: 30.5.1 + jest-mock: 30.5.1 + jest-regex-util: 30.5.0 + jest-resolve: 30.5.1 + jest-snapshot: 30.5.1 + jest-util: 30.5.1 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: - supports-color - jest-snapshot@29.7.0: - dependencies: - '@babel/core': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.29.0) - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.29.0) - '@babel/types': 7.29.0 - '@jest/expect-utils': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.0) + jest-snapshot@30.5.1: + dependencies: + '@babel/core': 7.29.7 + '@babel/generator': 7.29.8 + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/types': 7.29.8 + '@jest/expect-utils': 30.5.1 + '@jest/get-type': 30.5.0 + '@jest/snapshot-utils': 30.5.1 + '@jest/transform': 30.5.1 + '@jest/types': 30.5.1 + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.29.7) chalk: 4.1.2 - expect: 29.7.0 + expect: 30.5.1 graceful-fs: 4.2.11 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - natural-compare: 1.4.0 - pretty-format: 29.7.0 - semver: 7.7.3 + jest-diff: 30.5.1 + jest-matcher-utils: 30.5.1 + jest-message-util: 30.5.1 + jest-util: 30.5.1 + pretty-format: 30.5.1 + semver: 7.8.5 + synckit: 0.11.13 transitivePeerDependencies: - supports-color - jest-util@29.7.0: - dependencies: - '@jest/types': 29.6.3 - '@types/node': 25.0.3 - chalk: 4.1.2 - ci-info: 3.9.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - - jest-util@30.2.0: + jest-util@30.5.1: dependencies: - '@jest/types': 30.2.0 - '@types/node': 25.0.3 + '@jest/types': 30.5.1 + '@types/node': 25.9.5 chalk: 4.1.2 - ci-info: 4.3.1 + ci-info: 4.4.0 graceful-fs: 4.2.11 - picomatch: 4.0.3 + picomatch: 4.0.7 - jest-validate@29.7.0: + jest-validate@30.5.1: dependencies: - '@jest/types': 29.6.3 + '@jest/get-type': 30.5.0 + '@jest/types': 30.5.1 camelcase: 6.3.0 chalk: 4.1.2 - jest-get-type: 29.6.3 leven: 3.1.0 - pretty-format: 29.7.0 + pretty-format: 30.5.1 - jest-watcher@29.7.0: + jest-watcher@30.5.1: dependencies: - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 25.0.3 + '@jest/test-result': 30.5.1 + '@jest/types': 30.5.1 + '@types/node': 25.9.5 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 - jest-util: 29.7.0 + jest-util: 30.5.1 string-length: 4.0.2 - jest-worker@29.7.0: + jest-worker@30.5.1: dependencies: - '@types/node': 25.0.3 - jest-util: 29.7.0 + '@types/node': 25.9.5 + '@ungap/structured-clone': 1.4.0 + jest-util: 30.5.1 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@25.0.3)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3)): + jest@30.5.1(@types/node@25.9.5)(ts-node@10.9.2(@types/node@25.9.5)(typescript@5.9.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3)) - '@jest/types': 29.6.3 + '@jest/core': 30.5.1(ts-node@10.9.2(@types/node@25.9.5)(typescript@5.9.3)) + '@jest/types': 30.5.1 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@25.0.3)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3)) + jest-cli: 30.5.1(@types/node@25.9.5)(ts-node@10.9.2(@types/node@25.9.5)(typescript@5.9.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros + - esbuild-register - supports-color - ts-node - jiti@2.6.1: {} + jiti@2.7.0: {} + + jju@1.4.0: {} joycon@3.1.1: {} js-tokens@4.0.0: {} - js-yaml@3.14.2: + js-yaml@3.15.2: dependencies: argparse: 1.0.10 esprima: 4.0.1 - js-yaml@4.1.1: + js-yaml@4.3.2: dependencies: argparse: 2.0.1 @@ -7935,13 +7271,13 @@ snapshots: json-schema-traverse@0.4.1: {} + json-schema-traverse@1.0.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} json5@2.2.3: {} - jsonfile@4.0.0: - optionalDependencies: - graceful-fs: 4.2.11 + jsonc-parser@3.3.1: {} jsonwebtoken@9.0.3: dependencies: @@ -7954,9 +7290,9 @@ snapshots: lodash.isstring: 4.0.1 lodash.once: 4.1.1 ms: 2.1.3 - semver: 7.7.3 + semver: 7.8.5 - jssha@3.3.1: {} + jssha@3.3.2: {} jwa@2.0.1: dependencies: @@ -7973,7 +7309,10 @@ snapshots: dependencies: json-buffer: 3.0.1 - kleur@3.0.3: {} + launch-editor@2.14.1: + dependencies: + picocolors: 1.1.1 + shell-quote: 1.10.0 leven@3.1.0: {} @@ -7982,14 +7321,6 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - libsodium-wrappers@0.7.15: - dependencies: - libsodium: 0.7.15 - - libsodium@0.7.15: {} - - lilconfig@2.1.0: {} - lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -8022,75 +7353,75 @@ snapshots: lodash.once@4.1.1: {} - lodash.startcase@4.4.0: {} - - lodash@4.17.23: {} + lodash@4.18.1: {} long@5.3.2: {} + lru-cache@10.4.3: {} + + lru-cache@11.5.2: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 - lru.min@1.1.4: {} + lru.min@1.1.5: {} magic-string@0.30.21: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.6.0 make-dir@4.0.0: dependencies: - semver: 7.7.3 + semver: 7.8.5 make-error@1.3.6: {} - makeerror@1.0.12: - dependencies: - tmpl: 1.0.5 - merge-stream@2.0.0: {} - merge2@1.4.1: {} + mimic-fn@2.1.0: {} - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 + mimic-response@3.1.0: + optional: true - mimic-fn@2.1.0: {} + minimatch@10.2.6: + dependencies: + brace-expansion: 5.0.9 - mimic-response@3.1.0: {} + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.18 - minimatch@10.2.1: + minimatch@9.0.9: dependencies: - brace-expansion: 5.0.2 + brace-expansion: 2.1.4 minimist@1.2.8: {} - mkdirp-classic@0.5.3: {} + minipass@7.1.3: {} + + mkdirp-classic@0.5.3: + optional: true mlly@1.8.2: dependencies: - acorn: 8.16.0 + acorn: 8.18.0 pathe: 2.0.3 pkg-types: 1.3.1 - ufo: 1.6.3 - - mri@1.2.0: {} + ufo: 1.6.4 ms@2.1.3: {} - mysql2@3.15.3: + mysql2@3.24.3(@types/node@20.19.43): dependencies: + '@types/node': 20.19.43 aws-ssl-profiles: 1.1.2 - denque: 2.1.0 generate-function: 2.3.1 - iconv-lite: 0.7.2 + iconv-lite: 0.7.3 long: 5.3.2 - lru.min: 1.1.4 + lru.min: 1.1.5 named-placeholders: 1.1.6 - seq-queue: 0.0.5 - sqlstring: 2.3.3 + sql-escaper: 1.5.1 mz@2.7.0: dependencies: @@ -8100,23 +7431,27 @@ snapshots: named-placeholders@1.1.6: dependencies: - lru.min: 1.1.4 + lru.min: 1.1.5 + + nanoid@3.3.18: {} - nanoid@3.3.11: {} + napi-build-utils@2.0.0: + optional: true - napi-build-utils@2.0.0: {} + napi-postinstall@0.3.4: {} natural-compare@1.4.0: {} neo-async@2.6.2: {} - node-abi@3.89.0: + node-abi@3.96.0: dependencies: - semver: 7.7.3 + semver: 7.8.5 + optional: true - node-domexception@1.0.0: {} + node-addon-api@7.1.1: {} - node-fetch-native@1.6.7: {} + node-domexception@1.0.0: {} node-fetch@3.3.2: dependencies: @@ -8126,11 +7461,7 @@ snapshots: node-int64@0.4.0: {} - node-releases@2.0.27: {} - - node-rsa@1.1.1: - dependencies: - asn1: 0.2.6 + node-releases@2.0.54: {} normalize-path@3.0.0: {} @@ -8138,19 +7469,11 @@ snapshots: dependencies: path-key: 3.1.1 - nypm@0.6.5: - dependencies: - citty: 0.2.1 - pathe: 2.0.3 - tinyexec: 1.0.4 - object-assign@4.1.1: {} - obuf@1.1.2: {} + obug@2.1.4: {} - obug@2.1.1: {} - - ohash@2.0.11: {} + ohash@2.0.12: {} once@1.4.0: dependencies: @@ -8169,12 +7492,6 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - outdent@0.5.0: {} - - p-filter@2.1.0: - dependencies: - p-map: 2.1.0 - p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -8191,13 +7508,11 @@ snapshots: dependencies: p-limit: 3.1.0 - p-map@2.1.0: {} - p-try@2.2.0: {} - package-manager-detector@0.2.11: - dependencies: - quansync: 0.2.11 + package-json-from-dist@1.0.1: {} + + package-manager-detector@1.8.0: {} parent-module@1.0.1: dependencies: @@ -8205,7 +7520,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.29.0 + '@babel/code-frame': 7.29.7 error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -8216,28 +7531,32 @@ snapshots: path-key@3.1.1: {} - path-parse@1.0.7: {} + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.3 - path-type@4.0.0: {} + path-scurry@2.0.2: + dependencies: + lru-cache: 11.5.2 + minipass: 7.1.3 pathe@2.0.3: {} - perfect-debounce@1.0.0: {} + perfect-debounce@2.1.0: {} - pg-cloudflare@1.3.0: + pg-cloudflare@1.4.0: optional: true - pg-connection-string@2.12.0: {} + pg-connection-string@2.14.0: {} pg-int8@1.0.1: {} - pg-numeric@1.0.2: {} - - pg-pool@3.13.0(pg@8.20.0): + pg-pool@3.14.0(pg@8.23.0): dependencies: - pg: 8.20.0 + pg: 8.23.0 - pg-protocol@1.13.0: {} + pg-protocol@1.16.0: {} pg-types@2.2.0: dependencies: @@ -8247,25 +7566,15 @@ snapshots: postgres-date: 1.0.7 postgres-interval: 1.2.0 - pg-types@4.1.0: - dependencies: - pg-int8: 1.0.1 - pg-numeric: 1.0.2 - postgres-array: 3.0.4 - postgres-bytea: 3.0.0 - postgres-date: 2.1.0 - postgres-interval: 3.0.0 - postgres-range: 1.1.4 - - pg@8.20.0: + pg@8.23.0: dependencies: - pg-connection-string: 2.12.0 - pg-pool: 3.13.0(pg@8.20.0) - pg-protocol: 1.13.0 + pg-connection-string: 2.14.0 + pg-pool: 3.14.0(pg@8.23.0) + pg-protocol: 1.16.0 pg-types: 2.2.0 pgpass: 1.0.5 optionalDependencies: - pg-cloudflare: 1.3.0 + pg-cloudflare: 1.4.0 pgpass@1.0.5: dependencies: @@ -8273,11 +7582,9 @@ snapshots: picocolors@1.1.1: {} - picomatch@2.3.1: {} + picomatch@2.3.2: {} - picomatch@4.0.3: {} - - pify@4.0.1: {} + picomatch@4.0.7: {} pirates@4.0.7: {} @@ -8291,31 +7598,32 @@ snapshots: mlly: 1.8.2 pathe: 2.0.3 - pkg-types@2.3.0: + pkg-types@2.3.2: dependencies: - confbox: 0.2.4 - exsolve: 1.0.8 + confbox: 0.3.1 + exsolve: 1.1.1 pathe: 2.0.3 - playwright-core@1.58.2: {} + playwright-core@1.62.1: {} - playwright@1.58.2: + playwright@1.62.1: dependencies: - playwright-core: 1.58.2 + playwright-core: 1.62.1 optionalDependencies: fsevents: 2.3.2 - postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0): + postcss-load-config@6.0.1(jiti@2.7.0)(postcss@8.5.28)(tsx@4.23.13)(yaml@2.9.0): dependencies: lilconfig: 3.1.3 optionalDependencies: - jiti: 2.6.1 - postcss: 8.5.8 - tsx: 4.21.0 + jiti: 2.7.0 + postcss: 8.5.28 + tsx: 4.23.13 + yaml: 2.9.0 - postcss@8.5.8: + postcss@8.5.28: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.18 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -8325,22 +7633,12 @@ snapshots: postgres-bytea@1.0.1: {} - postgres-bytea@3.0.0: - dependencies: - obuf: 1.1.2 - postgres-date@1.0.7: {} - postgres-date@2.1.0: {} - postgres-interval@1.2.0: dependencies: xtend: 4.0.2 - postgres-interval@3.0.0: {} - - postgres-range@1.1.4: {} - postgres@3.4.7: {} prebuild-install@7.1.3: @@ -8351,53 +7649,44 @@ snapshots: minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 2.0.0 - node-abi: 3.89.0 + node-abi: 3.96.0 pump: 3.0.4 rc: 1.2.8 simple-get: 4.0.1 - tar-fs: 2.1.4 + tar-fs: 2.1.5 tunnel-agent: 0.6.0 + optional: true prelude-ls@1.2.1: {} - prettier@2.8.8: {} - - prettier@3.8.1: {} - - pretty-format@29.7.0: - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.3.1 + prettier@3.9.6: {} - pretty-format@30.2.0: + pretty-format@30.5.1: dependencies: - '@jest/schemas': 30.0.5 + '@jest/react-is-18': react-is@18.3.1 + '@jest/react-is-19': react-is@19.2.8 + '@jest/schemas': 30.5.0 ansi-styles: 5.2.0 - react-is: 18.3.1 - prisma@7.5.0(@types/react@19.2.14)(better-sqlite3@12.8.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3): + prisma@7.10.0(@types/node@20.19.43)(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(better-sqlite3@12.11.1)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@5.9.3): dependencies: - '@prisma/config': 7.5.0 - '@prisma/dev': 0.20.0(typescript@5.9.3) - '@prisma/engines': 7.5.0 - '@prisma/studio-core': 0.21.1(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - mysql2: 3.15.3 + '@prisma/config': 7.10.0 + '@prisma/dev': 0.24.17(typescript@5.9.3) + '@prisma/engines': 7.10.0 + '@prisma/studio-core': 0.33.0(@types/react-dom@19.2.7(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + mysql2: 3.24.3(@types/node@20.19.43) postgres: 3.4.7 optionalDependencies: - better-sqlite3: 12.8.0 + better-sqlite3: 12.11.1 typescript: 5.9.3 transitivePeerDependencies: + - '@types/node' - '@types/react' + - '@types/react-dom' - magicast - react - react-dom - prompts@2.4.2: - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - proper-lockfile@4.1.2: dependencies: graceful-fs: 4.2.11 @@ -8408,24 +7697,25 @@ snapshots: dependencies: end-of-stream: 1.4.5 once: 1.4.0 + optional: true punycode@2.3.1: {} pure-rand@6.1.0: {} + pure-rand@7.0.1: {} + pvtsutils@1.3.6: dependencies: tslib: 2.8.1 - pvutils@1.1.5: {} - - quansync@0.2.11: {} + pvutils@1.2.0: {} queue-microtask@1.2.3: {} - rc9@2.1.2: + rc9@3.1.0: dependencies: - defu: 6.1.4 + defu: 6.1.7 destr: 2.0.5 rc@1.2.8: @@ -8434,55 +7724,54 @@ snapshots: ini: 1.3.8 minimist: 1.2.8 strip-json-comments: 2.0.1 + optional: true - react-dom@19.2.4(react@19.2.4): + react-dom@19.2.8(react@19.2.8): dependencies: - react: 19.2.4 + react: 19.2.8 scheduler: 0.27.0 react-is@18.3.1: {} + react-is@19.2.8: {} + react-refresh@0.18.0: {} - react-router-dom@7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + react-router-dom@7.18.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8): dependencies: - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - react-router: 7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + react-router: 7.18.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - react-router@7.13.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + react-router@7.18.3(react-dom@19.2.8(react@19.2.8))(react@19.2.8): dependencies: cookie: 1.1.1 - react: 19.2.4 + react: 19.2.8 set-cookie-parser: 2.7.2 optionalDependencies: - react-dom: 19.2.4(react@19.2.4) - - react@19.2.4: {} + react-dom: 19.2.8(react@19.2.8) - read-yaml-file@1.1.0: - dependencies: - graceful-fs: 4.2.11 - js-yaml: 3.14.2 - pify: 4.0.1 - strip-bom: 3.0.0 + react@19.2.8: {} readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 + optional: true readdirp@4.1.2: {} - reflect-metadata@0.2.2: {} + readdirp@5.1.1: {} - regexp-to-ast@0.5.0: {} + reflect-metadata@0.2.2: {} remeda@2.33.4: {} require-directory@2.1.1: {} + require-from-string@2.0.2: {} + resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 @@ -8491,15 +7780,7 @@ snapshots: resolve-from@5.0.0: {} - resolve-pkg-maps@1.0.0: {} - - resolve.exports@2.0.3: {} - - resolve@1.22.11: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 + ret@0.5.0: {} retry@0.12.0: {} @@ -8509,35 +7790,38 @@ snapshots: dependencies: glob: 7.2.3 - rollup@4.60.0: + robust-predicates@3.0.3: {} + + rollup@4.63.1: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.60.0 - '@rollup/rollup-android-arm64': 4.60.0 - '@rollup/rollup-darwin-arm64': 4.60.0 - '@rollup/rollup-darwin-x64': 4.60.0 - '@rollup/rollup-freebsd-arm64': 4.60.0 - '@rollup/rollup-freebsd-x64': 4.60.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.60.0 - '@rollup/rollup-linux-arm-musleabihf': 4.60.0 - '@rollup/rollup-linux-arm64-gnu': 4.60.0 - '@rollup/rollup-linux-arm64-musl': 4.60.0 - '@rollup/rollup-linux-loong64-gnu': 4.60.0 - '@rollup/rollup-linux-loong64-musl': 4.60.0 - '@rollup/rollup-linux-ppc64-gnu': 4.60.0 - '@rollup/rollup-linux-ppc64-musl': 4.60.0 - '@rollup/rollup-linux-riscv64-gnu': 4.60.0 - '@rollup/rollup-linux-riscv64-musl': 4.60.0 - '@rollup/rollup-linux-s390x-gnu': 4.60.0 - '@rollup/rollup-linux-x64-gnu': 4.60.0 - '@rollup/rollup-linux-x64-musl': 4.60.0 - '@rollup/rollup-openbsd-x64': 4.60.0 - '@rollup/rollup-openharmony-arm64': 4.60.0 - '@rollup/rollup-win32-arm64-msvc': 4.60.0 - '@rollup/rollup-win32-ia32-msvc': 4.60.0 - '@rollup/rollup-win32-x64-gnu': 4.60.0 - '@rollup/rollup-win32-x64-msvc': 4.60.0 + '@napi-rs/lzma-linux-x64-gnu': 1.5.1 + '@rollup/rollup-android-arm-eabi': 4.63.1 + '@rollup/rollup-android-arm64': 4.63.1 + '@rollup/rollup-darwin-arm64': 4.63.1 + '@rollup/rollup-darwin-x64': 4.63.1 + '@rollup/rollup-freebsd-arm64': 4.63.1 + '@rollup/rollup-freebsd-x64': 4.63.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.63.1 + '@rollup/rollup-linux-arm-musleabihf': 4.63.1 + '@rollup/rollup-linux-arm64-gnu': 4.63.1 + '@rollup/rollup-linux-arm64-musl': 4.63.1 + '@rollup/rollup-linux-loong64-gnu': 4.63.1 + '@rollup/rollup-linux-loong64-musl': 4.63.1 + '@rollup/rollup-linux-ppc64-gnu': 4.63.1 + '@rollup/rollup-linux-ppc64-musl': 4.63.1 + '@rollup/rollup-linux-riscv64-gnu': 4.63.1 + '@rollup/rollup-linux-riscv64-musl': 4.63.1 + '@rollup/rollup-linux-s390x-gnu': 4.63.1 + '@rollup/rollup-linux-x64-gnu': 4.63.1 + '@rollup/rollup-linux-x64-musl': 4.63.1 + '@rollup/rollup-openbsd-x64': 4.63.1 + '@rollup/rollup-openharmony-arm64': 4.63.1 + '@rollup/rollup-win32-arm64-msvc': 4.63.1 + '@rollup/rollup-win32-ia32-msvc': 4.63.1 + '@rollup/rollup-win32-x64-gnu': 4.63.1 + '@rollup/rollup-win32-x64-msvc': 4.63.1 fsevents: 2.3.3 run-parallel@1.2.0: @@ -8546,15 +7830,17 @@ snapshots: safe-buffer@5.2.1: {} + safe-regex2@5.1.1: + dependencies: + ret: 0.5.0 + safer-buffer@2.1.2: {} scheduler@0.27.0: {} semver@6.3.1: {} - semver@7.7.3: {} - - seq-queue@0.0.5: {} + semver@7.8.5: {} set-cookie-parser@2.7.2: {} @@ -8564,19 +7850,23 @@ snapshots: shebang-regex@3.0.0: {} + shell-quote@1.10.0: {} + siginfo@2.0.0: {} signal-exit@3.0.7: {} signal-exit@4.1.0: {} - simple-concat@1.0.1: {} + simple-concat@1.0.1: + optional: true simple-get@4.0.1: dependencies: decompress-response: 6.0.0 once: 1.4.0 simple-concat: 1.0.1 + optional: true sisteransi@1.0.5: {} @@ -8584,25 +7874,15 @@ snapshots: source-map-js@1.2.1: {} - source-map-support@0.5.13: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - source-map@0.6.1: {} source-map@0.7.6: {} - spawndamnit@3.0.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - split2@4.2.0: {} sprintf-js@1.0.3: {} - sqlstring@2.3.3: {} + sql-escaper@1.5.1: {} stack-utils@2.0.6: dependencies: @@ -8612,7 +7892,7 @@ snapshots: std-env@3.10.0: {} - std-env@4.0.0: {} + std-env@4.2.0: {} string-length@4.0.2: dependencies: @@ -8625,26 +7905,34 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.2.0 + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 + optional: true strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - strip-bom@3.0.0: {} + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.3.0 strip-bom@4.0.0: {} strip-final-newline@2.0.0: {} - strip-json-comments@2.0.1: {} + strip-json-comments@2.0.1: + optional: true strip-json-comments@3.1.1: {} - strnum@2.1.2: {} - sucrase@3.35.1: dependencies: '@jridgewell/gen-mapping': 0.3.13 @@ -8652,7 +7940,7 @@ snapshots: lines-and-columns: 1.2.4 mz: 2.7.0 pirates: 4.0.7 - tinyglobby: 0.2.15 + tinyglobby: 0.2.17 ts-interface-checker: 0.1.13 superjson@1.13.3: @@ -8667,14 +7955,17 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-preserve-symlinks-flag@1.0.0: {} + synckit@0.11.13: + dependencies: + '@pkgr/core': 0.3.6 - tar-fs@2.1.4: + tar-fs@2.1.5: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 pump: 3.0.4 tar-stream: 2.2.0 + optional: true tar-stream@2.2.0: dependencies: @@ -8683,14 +7974,13 @@ snapshots: fs-constants: 1.0.0 inherits: 2.0.4 readable-stream: 3.6.2 + optional: true - term-size@2.2.1: {} - - test-exclude@6.0.0: + test-exclude@7.0.2: dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 10.2.1 + '@istanbuljs/schema': 0.1.6 + glob: 10.5.0 + minimatch: 10.2.6 text-table@0.2.0: {} @@ -8706,96 +7996,91 @@ snapshots: tinyexec@0.3.2: {} - tinyexec@1.0.4: {} + tinyexec@1.3.1: {} - tinyglobby@0.2.15: + tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 - tinyrainbow@3.1.0: {} - - tmpl@1.0.5: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 + tinyrainbow@3.1.1: {} totp-generator@2.0.1: dependencies: - jssha: 3.3.1 + jssha: 3.3.2 tree-kill@1.2.2: {} - ts-api-utils@1.4.3(typescript@5.9.3): + ts-api-utils@2.5.0(typescript@5.9.3): dependencies: typescript: 5.9.3 ts-interface-checker@0.1.13: {} - ts-jest@29.4.6(@babel/core@7.29.0)(@jest/transform@29.7.0)(@jest/types@30.2.0)(babel-jest@29.7.0(@babel/core@7.29.0))(jest-util@30.2.0)(jest@29.7.0(@types/node@25.0.3)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3)))(typescript@5.9.3): + ts-jest@29.4.12(@babel/core@7.29.7)(@jest/transform@30.5.1)(@jest/types@30.5.1)(babel-jest@30.5.1(@babel/core@7.29.7))(jest-util@30.5.1)(jest@30.5.1(@types/node@25.9.5)(ts-node@10.9.2(@types/node@25.9.5)(typescript@5.9.3)))(typescript@5.9.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - handlebars: 4.7.8 - jest: 29.7.0(@types/node@25.0.3)(ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3)) + handlebars: 4.7.9 + jest: 30.5.1(@types/node@25.9.5)(ts-node@10.9.2(@types/node@25.9.5)(typescript@5.9.3)) json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.7.3 + semver: 7.8.5 type-fest: 4.41.0 typescript: 5.9.3 yargs-parser: 21.1.1 optionalDependencies: - '@babel/core': 7.29.0 - '@jest/transform': 29.7.0 - '@jest/types': 30.2.0 - babel-jest: 29.7.0(@babel/core@7.29.0) - jest-util: 30.2.0 + '@babel/core': 7.29.7 + '@jest/transform': 30.5.1 + '@jest/types': 30.5.1 + babel-jest: 30.5.1(@babel/core@7.29.7) + jest-util: 30.5.1 - ts-node@10.9.2(@types/node@25.0.3)(typescript@5.9.3): + ts-node@10.9.2(@types/node@25.9.5)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.12 + '@tsconfig/node10': 1.0.13 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 25.0.3 - acorn: 8.16.0 - acorn-walk: 8.3.4 + '@types/node': 25.9.5 + acorn: 8.18.0 + acorn-walk: 8.3.5 arg: 4.1.3 create-require: 1.1.1 - diff: 8.0.3 + diff: 4.0.4 make-error: 1.3.6 typescript: 5.9.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + optional: true tslib@1.14.1: {} tslib@2.8.1: {} - tsup@8.5.1(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0)(typescript@5.9.3): + tsup@8.5.1(jiti@2.7.0)(postcss@8.5.28)(tsx@4.23.13)(typescript@5.9.3)(yaml@2.9.0): dependencies: - bundle-require: 5.1.0(esbuild@0.27.4) + bundle-require: 5.1.0(esbuild@0.28.2) cac: 6.7.14 chokidar: 4.0.3 consola: 3.4.2 debug: 4.4.3 - esbuild: 0.27.4 + esbuild: 0.28.2 fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.8)(tsx@4.21.0) + postcss-load-config: 6.0.1(jiti@2.7.0)(postcss@8.5.28)(tsx@4.23.13)(yaml@2.9.0) resolve-from: 5.0.0 - rollup: 4.60.0 + rollup: 4.63.1 source-map: 0.7.6 sucrase: 3.35.1 tinyexec: 0.3.2 - tinyglobby: 0.2.15 + tinyglobby: 0.2.17 tree-kill: 1.2.2 optionalDependencies: - postcss: 8.5.8 + postcss: 8.5.28 typescript: 5.9.3 transitivePeerDependencies: - jiti @@ -8803,10 +8088,9 @@ snapshots: - tsx - yaml - tsx@4.21.0: + tsx@4.23.13: dependencies: - esbuild: 0.27.4 - get-tsconfig: 4.13.7 + esbuild: 0.28.2 optionalDependencies: fsevents: 2.3.3 @@ -8817,6 +8101,7 @@ snapshots: tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 + optional: true type-check@0.4.0: dependencies: @@ -8832,22 +8117,47 @@ snapshots: typescript@5.9.3: {} - ufo@1.6.3: {} + ufo@1.6.4: {} uglify-js@3.19.3: optional: true undici-types@6.21.0: {} - undici-types@7.16.0: {} + undici-types@7.24.6: {} universal-user-agent@6.0.1: {} - universalify@0.1.2: {} - - update-browserslist-db@1.2.2(browserslist@4.28.1): + unrs-resolver@1.12.2: dependencies: - browserslist: 4.28.1 + napi-postinstall: 0.3.4 + optionalDependencies: + '@unrs/resolver-binding-android-arm-eabi': 1.12.2 + '@unrs/resolver-binding-android-arm64': 1.12.2 + '@unrs/resolver-binding-darwin-arm64': 1.12.2 + '@unrs/resolver-binding-darwin-x64': 1.12.2 + '@unrs/resolver-binding-freebsd-x64': 1.12.2 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.12.2 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.12.2 + '@unrs/resolver-binding-linux-arm64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-arm64-musl': 1.12.2 + '@unrs/resolver-binding-linux-loong64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-loong64-musl': 1.12.2 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-riscv64-musl': 1.12.2 + '@unrs/resolver-binding-linux-s390x-gnu': 1.12.2 + '@unrs/resolver-binding-linux-x64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-x64-musl': 1.12.2 + '@unrs/resolver-binding-openharmony-arm64': 1.12.2 + '@unrs/resolver-binding-wasm32-wasi': 1.12.2 + '@unrs/resolver-binding-win32-arm64-msvc': 1.12.2 + '@unrs/resolver-binding-win32-ia32-msvc': 1.12.2 + '@unrs/resolver-binding-win32-x64-msvc': 1.12.2 + + update-browserslist-db@1.3.2(browserslist@4.28.9): + dependencies: + browserslist: 4.28.9 escalade: 3.2.0 picocolors: 1.1.1 @@ -8855,9 +8165,11 @@ snapshots: dependencies: punycode: 2.3.1 - util-deprecate@1.0.2: {} + util-deprecate@1.0.2: + optional: true - v8-compile-cache-lib@3.0.1: {} + v8-compile-cache-lib@3.0.1: + optional: true v8-to-istanbul@9.3.0: dependencies: @@ -8865,55 +8177,52 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - valibot@1.2.0(typescript@5.9.3): + valibot@1.4.2(typescript@5.9.3): optionalDependencies: typescript: 5.9.3 - vite@7.3.1(@types/node@20.19.37)(jiti@2.6.1)(tsx@4.21.0): + vite@7.3.6(@types/node@20.19.43)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.0): dependencies: - esbuild: 0.27.4 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.8 - rollup: 4.60.0 - tinyglobby: 0.2.15 + esbuild: 0.28.2 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 + postcss: 8.5.28 + rollup: 4.63.1 + tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 20.19.37 + '@types/node': 20.19.43 fsevents: 2.3.3 - jiti: 2.6.1 - tsx: 4.21.0 - - vitest@4.1.0(@types/node@20.19.37)(vite@7.3.1(@types/node@20.19.37)(jiti@2.6.1)(tsx@4.21.0)): - dependencies: - '@vitest/expect': 4.1.0 - '@vitest/mocker': 4.1.0(vite@7.3.1(@types/node@20.19.37)(jiti@2.6.1)(tsx@4.21.0)) - '@vitest/pretty-format': 4.1.0 - '@vitest/runner': 4.1.0 - '@vitest/snapshot': 4.1.0 - '@vitest/spy': 4.1.0 - '@vitest/utils': 4.1.0 - es-module-lexer: 2.0.0 - expect-type: 1.3.0 + jiti: 2.7.0 + tsx: 4.23.13 + yaml: 2.9.0 + + vitest@4.1.11(@types/node@20.19.43)(vite@7.3.6(@types/node@20.19.43)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.0)): + dependencies: + '@vitest/expect': 4.1.11 + '@vitest/mocker': 4.1.11(vite@7.3.6(@types/node@20.19.43)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.11 + '@vitest/runner': 4.1.11 + '@vitest/snapshot': 4.1.11 + '@vitest/spy': 4.1.11 + '@vitest/utils': 4.1.11 + es-module-lexer: 2.3.2 + expect-type: 1.4.0 magic-string: 0.30.21 - obug: 2.1.1 + obug: 2.1.4 pathe: 2.0.3 - picomatch: 4.0.3 - std-env: 4.0.0 + picomatch: 4.0.7 + std-env: 4.2.0 tinybench: 2.9.0 - tinyexec: 1.0.4 - tinyglobby: 0.2.15 - tinyrainbow: 3.1.0 - vite: 7.3.1(@types/node@20.19.37)(jiti@2.6.1)(tsx@4.21.0) + tinyexec: 1.3.1 + tinyglobby: 0.2.17 + tinyrainbow: 3.1.1 + vite: 7.3.6(@types/node@20.19.43)(jiti@2.7.0)(tsx@4.23.13)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.19.37 + '@types/node': 20.19.43 transitivePeerDependencies: - msw - walker@1.0.8: - dependencies: - makeerror: 1.0.12 - web-streams-polyfill@3.3.3: {} which@2.0.2: @@ -8935,12 +8244,18 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.2.0 + wrappy@1.0.2: {} - write-file-atomic@4.0.2: + write-file-atomic@5.0.1: dependencies: imurmurhash: 0.1.4 - signal-exit: 3.0.7 + signal-exit: 4.1.0 xtend@4.0.2: {} @@ -8948,9 +8263,11 @@ snapshots: yallist@3.1.1: {} + yaml@2.9.0: {} + yargs-parser@21.1.1: {} - yargs@17.7.2: + yargs@17.7.3: dependencies: cliui: 8.0.1 escalade: 3.2.0 @@ -8960,13 +8277,14 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 - yn@3.1.1: {} + yn@3.1.1: + optional: true yocto-queue@0.1.0: {} zeptomatch@2.1.0: dependencies: - grammex: 3.1.12 + grammex: 3.1.13 graphmatch: 1.1.1 - zod@3.25.76: {} + zod@4.5.4: {} From a1a3f0a5a73c99c5a276d22196fa0fa79d795ea0 Mon Sep 17 00:00:00 2001 From: jsnyder10 Date: Fri, 4 Sep 2026 14:52:09 -0500 Subject: [PATCH 2/3] perf(stack): load the AWS SDK only when an AWS code path runs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit aws-helpers.ts imported all nine @aws-sdk/client-* packages at module scope. Every AWS scanfix file imports that helper, and factiii/index.ts imports those scanfix files to build its fixes array, so requiring any CLI command pulled the whole SDK in. Measured, that was 112 ms of a 118 ms module load — including on --help, ops, db and backup, which never touch AWS. The SDK types are now `import type`, which TypeScript erases, and nine *Sdk() accessors require the real packages on first use and cache them. Call sites construct commands through the accessor: `new (ec2Sdk().CreateVpcCommand)({...})`. The aws-helpers re-export block for SDK command classes is gone, since re-exporting them forced the eager load it existed to hide. Results: `node bin/stack --help` 140 ms -> 50 ms, module load 126 ms -> 43 ms, AWS SDK modules resolved at startup 24 -> 0. All nine packages still load on demand, verified by constructing one command from each. Typecheck clean, stack 151 tests and auth 186 tests pass. --- .changeset/quiet-moons-invent.md | 19 + .../src/plugins/addons/vercel/scanfix/dns.ts | 8 +- .../stack/src/plugins/pipelines/aws/prod.ts | 5 +- .../plugins/pipelines/aws/scanfix/config.ts | 4 +- .../pipelines/aws/scanfix/credentials.ts | 10 +- .../plugins/pipelines/aws/scanfix/docker.ts | 4 +- .../src/plugins/pipelines/aws/scanfix/ec2.ts | 22 +- .../src/plugins/pipelines/aws/scanfix/ecr.ts | 10 +- .../src/plugins/pipelines/aws/scanfix/iam.ts | 16 +- .../src/plugins/pipelines/aws/scanfix/rds.ts | 7 +- .../plugins/pipelines/aws/scanfix/route53.ts | 28 +- .../src/plugins/pipelines/aws/scanfix/s3.ts | 15 +- .../pipelines/aws/scanfix/security-groups.ts | 20 +- .../src/plugins/pipelines/aws/scanfix/ses.ts | 13 +- .../src/plugins/pipelines/aws/scanfix/vpc.ts | 39 +-- .../pipelines/aws/utils/aws-helpers.ts | 325 ++++++------------ .../pipelines/factiii/scanfix/secrets.ts | 40 +-- packages/stack/src/utils/ssh-helper.ts | 9 +- 18 files changed, 242 insertions(+), 352 deletions(-) create mode 100644 .changeset/quiet-moons-invent.md diff --git a/.changeset/quiet-moons-invent.md b/.changeset/quiet-moons-invent.md new file mode 100644 index 0000000..aafa6d4 --- /dev/null +++ b/.changeset/quiet-moons-invent.md @@ -0,0 +1,19 @@ +--- +'@factiii/stack': patch +--- + +Load the AWS SDK only when an AWS code path runs. + +`aws-helpers.ts` imported all nine `@aws-sdk/client-*` packages at module +scope. Every AWS scanfix file imports that helper, and `factiii/index.ts` +imports those scanfix files to build its `fixes` array, so requiring any CLI +command pulled the whole SDK in. That cost about 100 ms on every invocation, +including `--help`, `ops`, `db` and `backup`, which never touch AWS. + +The SDK types are now `import type` — TypeScript erases those — and nine +`*Sdk()` accessors require the real packages on first use and cache them. Call +sites construct commands through the accessor, so the SDK loads only when a fix +actually provisions infrastructure. + +`node bin/stack --help` drops from 140 ms to 50 ms, and the AWS SDK module +count at startup drops from 24 to 0. diff --git a/packages/stack/src/plugins/addons/vercel/scanfix/dns.ts b/packages/stack/src/plugins/addons/vercel/scanfix/dns.ts index 17bb21b..ad6c87f 100644 --- a/packages/stack/src/plugins/addons/vercel/scanfix/dns.ts +++ b/packages/stack/src/plugins/addons/vercel/scanfix/dns.ts @@ -65,7 +65,7 @@ export const dnsFixes: Fix[] = [ // Need AWS configured for Route53 try { - const { isAwsConfigured, getAwsConfig, findHostedZone, findARecord } = + const { isAwsConfigured, getAwsConfig, findHostedZone, findARecord, route53Sdk } = await import('../../../pipelines/aws/utils/aws-helpers.js'); if (!isAwsConfigured(config)) return false; @@ -92,7 +92,7 @@ export const dnsFixes: Fix[] = [ } try { - const { isAwsConfigured, getAwsConfig, findHostedZone, getRoute53Client, ChangeResourceRecordSetsCommand } = + const { isAwsConfigured, getAwsConfig, findHostedZone, getRoute53Client, route53Sdk } = await import('../../../pipelines/aws/utils/aws-helpers.js'); if (!isAwsConfigured(config)) { console.log(' AWS not configured — cannot manage Route53 DNS'); @@ -109,7 +109,7 @@ export const dnsFixes: Fix[] = [ const r53 = getRoute53Client(region); // Create A record: root domain → Vercel anycast IP - await r53.send(new ChangeResourceRecordSetsCommand({ + await r53.send(new (route53Sdk().ChangeResourceRecordSetsCommand)({ HostedZoneId: zoneId, ChangeBatch: { Changes: [ @@ -129,7 +129,7 @@ export const dnsFixes: Fix[] = [ console.log(' Created A record: ' + domain + ' → ' + VERCEL_ANYCAST_IP + ' (Vercel)'); // Create CNAME record: www → Vercel - await r53.send(new ChangeResourceRecordSetsCommand({ + await r53.send(new (route53Sdk().ChangeResourceRecordSetsCommand)({ HostedZoneId: zoneId, ChangeBatch: { Changes: [ diff --git a/packages/stack/src/plugins/pipelines/aws/prod.ts b/packages/stack/src/plugins/pipelines/aws/prod.ts index 78ca36a..553ff26 100644 --- a/packages/stack/src/plugins/pipelines/aws/prod.ts +++ b/packages/stack/src/plugins/pipelines/aws/prod.ts @@ -11,7 +11,10 @@ import yaml from 'js-yaml'; import { sshExec } from '../../../utils/ssh-helper.js'; import { extractEnvironments } from '../../../utils/config-helpers.js'; import { generateProdCompose, generateProdNginx, prodComposeServiceName } from '../../../generators/index.js'; -import { getAwsAccountId, getEcrAuthToken } from './utils/aws-helpers.js'; +import { + getAwsAccountId, + getEcrAuthToken, +} from './utils/aws-helpers.js'; import { AnsibleVaultSecrets } from '../../../utils/ansible-vault-secrets.js'; import type { FactiiiConfig, diff --git a/packages/stack/src/plugins/pipelines/aws/scanfix/config.ts b/packages/stack/src/plugins/pipelines/aws/scanfix/config.ts index e49945e..7a3334f 100644 --- a/packages/stack/src/plugins/pipelines/aws/scanfix/config.ts +++ b/packages/stack/src/plugins/pipelines/aws/scanfix/config.ts @@ -5,7 +5,9 @@ import { execSync } from 'child_process'; import type { FactiiiConfig, Fix } from '../../../../types/index.js'; -import { isOnServer } from '../utils/aws-helpers.js'; +import { + isOnServer, +} from '../utils/aws-helpers.js'; export const configFixes: Fix[] = [ // PROD STAGE FIXES diff --git a/packages/stack/src/plugins/pipelines/aws/scanfix/credentials.ts b/packages/stack/src/plugins/pipelines/aws/scanfix/credentials.ts index b418e10..1d38cb9 100644 --- a/packages/stack/src/plugins/pipelines/aws/scanfix/credentials.ts +++ b/packages/stack/src/plugins/pipelines/aws/scanfix/credentials.ts @@ -30,9 +30,7 @@ import { setCredentialsSyncFailed, setLoadedCredentials, verifyCredentialsWithSts, - CreateUserCommand, - PutUserPolicyCommand, - CreateAccessKeyCommand, + iamSdk, } from '../utils/aws-helpers.js'; /** @@ -168,12 +166,12 @@ async function bootstrapAwsAccount(config: FactiiiConfig, rootDir: string): Prom const iam = getIAMClient(region); // Create IAM user - await iam.send(new CreateUserCommand({ UserName: userName })); + await iam.send(new (iamSdk().CreateUserCommand)({ UserName: userName })); console.log(' [OK] Created IAM user: ' + userName); // Read and attach bootstrap policy const policy = getBootstrapPolicy(); - await iam.send(new PutUserPolicyCommand({ + await iam.send(new (iamSdk().PutUserPolicyCommand)({ UserName: userName, PolicyName: 'factiii-bootstrap', PolicyDocument: policy, @@ -181,7 +179,7 @@ async function bootstrapAwsAccount(config: FactiiiConfig, rootDir: string): Prom console.log(' [OK] Attached bootstrap policy (EC2, RDS, S3, ECR, SES, IAM, STS)'); // Create access key - const keyResult = await iam.send(new CreateAccessKeyCommand({ UserName: userName })); + const keyResult = await iam.send(new (iamSdk().CreateAccessKeyCommand)({ UserName: userName })); const newAccessKeyId = keyResult.AccessKey?.AccessKeyId; const newSecretKey = keyResult.AccessKey?.SecretAccessKey; diff --git a/packages/stack/src/plugins/pipelines/aws/scanfix/docker.ts b/packages/stack/src/plugins/pipelines/aws/scanfix/docker.ts index bffdbeb..14b4124 100644 --- a/packages/stack/src/plugins/pipelines/aws/scanfix/docker.ts +++ b/packages/stack/src/plugins/pipelines/aws/scanfix/docker.ts @@ -9,7 +9,9 @@ */ import type { FactiiiConfig, Fix } from '../../../../types/index.js'; -import { isOnServer } from '../utils/aws-helpers.js'; +import { + isOnServer, +} from '../utils/aws-helpers.js'; import { extractEnvironments } from '../../../../utils/config-helpers.js'; import { sshExec, findSshKeyForStage } from '../../../../utils/ssh-helper.js'; diff --git a/packages/stack/src/plugins/pipelines/aws/scanfix/ec2.ts b/packages/stack/src/plugins/pipelines/aws/scanfix/ec2.ts index e118e62..37f9177 100644 --- a/packages/stack/src/plugins/pipelines/aws/scanfix/ec2.ts +++ b/packages/stack/src/plugins/pipelines/aws/scanfix/ec2.ts @@ -23,13 +23,7 @@ import { tagSpec, getEC2Client, confirmAwsAction, - CreateKeyPairCommand, - DescribeImagesCommand, - RunInstancesCommand, - waitUntilInstanceRunning, - DescribeInstancesCommand, - AllocateAddressCommand, - AssociateAddressCommand, + ec2Sdk, } from '../utils/aws-helpers.js'; export const ec2Fixes: Fix[] = [ @@ -63,7 +57,7 @@ export const ec2Fixes: Fix[] = [ const ec2 = getEC2Client(region); // Create key pair — AWS returns the private key material - const result = await ec2.send(new CreateKeyPairCommand({ + const result = await ec2.send(new (ec2Sdk().CreateKeyPairCommand)({ KeyName: keyName, KeyType: 'ed25519', })); @@ -154,7 +148,7 @@ export const ec2Fixes: Fix[] = [ const ec2 = getEC2Client(region); // Get latest Ubuntu 22.04 AMI - const amiResult = await ec2.send(new DescribeImagesCommand({ + const amiResult = await ec2.send(new (ec2Sdk().DescribeImagesCommand)({ Owners: ['099720109477'], Filters: [ { Name: 'name', Values: ['ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-*'] }, @@ -172,7 +166,7 @@ export const ec2Fixes: Fix[] = [ console.log(' Using AMI: ' + amiId); // Launch instance - const instanceResult = await ec2.send(new RunInstancesCommand({ + const instanceResult = await ec2.send(new (ec2Sdk().RunInstancesCommand)({ ImageId: amiId, InstanceType: 't3.micro', KeyName: keyName, @@ -188,13 +182,13 @@ export const ec2Fixes: Fix[] = [ console.log(' Waiting for instance to be running...'); // Wait for instance to be running - await waitUntilInstanceRunning( + await ec2Sdk().waitUntilInstanceRunning( { client: ec2, maxWaitTime: 300 }, { InstanceIds: [instanceId!] } ); // Get public IP - const descResult = await ec2.send(new DescribeInstancesCommand({ + const descResult = await ec2.send(new (ec2Sdk().DescribeInstancesCommand)({ InstanceIds: [instanceId!], })); const publicIp = descResult.Reservations?.[0]?.Instances?.[0]?.PublicIpAddress; @@ -247,7 +241,7 @@ export const ec2Fixes: Fix[] = [ const ec2 = getEC2Client(region); // Allocate Elastic IP - const eipResult = await ec2.send(new AllocateAddressCommand({ + const eipResult = await ec2.send(new (ec2Sdk().AllocateAddressCommand)({ Domain: 'vpc', TagSpecifications: [tagSpec('elastic-ip', projectName)], })); @@ -256,7 +250,7 @@ export const ec2Fixes: Fix[] = [ console.log(' Allocated Elastic IP: ' + publicIp); // Associate with instance - await ec2.send(new AssociateAddressCommand({ + await ec2.send(new (ec2Sdk().AssociateAddressCommand)({ AllocationId: allocationId, InstanceId: instanceId, })); diff --git a/packages/stack/src/plugins/pipelines/aws/scanfix/ecr.ts b/packages/stack/src/plugins/pipelines/aws/scanfix/ecr.ts index 2abd249..4946945 100644 --- a/packages/stack/src/plugins/pipelines/aws/scanfix/ecr.ts +++ b/packages/stack/src/plugins/pipelines/aws/scanfix/ecr.ts @@ -14,9 +14,7 @@ import { findEcrRepo, getECRClient, confirmAwsAction, - CreateRepositoryCommand, - PutLifecyclePolicyCommand, - GetAuthorizationTokenCommand, + ecrSdk, } from '../utils/aws-helpers.js'; export const ecrFixes: Fix[] = [ @@ -49,7 +47,7 @@ export const ecrFixes: Fix[] = [ const ecr = getECRClient(region); // Create ECR repository - const result = await ecr.send(new CreateRepositoryCommand({ + const result = await ecr.send(new (ecrSdk().CreateRepositoryCommand)({ repositoryName: repoName, imageScanningConfiguration: { scanOnPush: true }, })); @@ -73,7 +71,7 @@ export const ecrFixes: Fix[] = [ }], }); - await ecr.send(new PutLifecyclePolicyCommand({ + await ecr.send(new (ecrSdk().PutLifecyclePolicyCommand)({ repositoryName: repoName, lifecyclePolicyText: lifecyclePolicy, })); @@ -101,7 +99,7 @@ export const ecrFixes: Fix[] = [ // Test ECR authorization token try { const ecr = getECRClient(region); - const result = await ecr.send(new GetAuthorizationTokenCommand({})); + const result = await ecr.send(new (ecrSdk().GetAuthorizationTokenCommand)({})); return !(result.authorizationData?.length); } catch { return true; diff --git a/packages/stack/src/plugins/pipelines/aws/scanfix/iam.ts b/packages/stack/src/plugins/pipelines/aws/scanfix/iam.ts index a6edd27..2d36f7a 100644 --- a/packages/stack/src/plugins/pipelines/aws/scanfix/iam.ts +++ b/packages/stack/src/plugins/pipelines/aws/scanfix/iam.ts @@ -20,9 +20,7 @@ import { canManageIam, getIAMClient, setLoadedCredentials, - CreateUserCommand, - PutUserPolicyCommand, - CreateAccessKeyCommand, + iamSdk, } from '../utils/aws-helpers.js'; /** @@ -347,12 +345,12 @@ export const iamFixes: Fix[] = [ } // Create IAM user - await iam.send(new CreateUserCommand({ UserName: userName })); + await iam.send(new (iamSdk().CreateUserCommand)({ UserName: userName })); console.log(' Created IAM user: ' + userName); // Create and attach inline policy const policy = getDevPolicy(projectName, region, accountId); - await iam.send(new PutUserPolicyCommand({ + await iam.send(new (iamSdk().PutUserPolicyCommand)({ UserName: userName, PolicyName: 'factiii-' + projectName + '-admin-policy', PolicyDocument: policy, @@ -360,7 +358,7 @@ export const iamFixes: Fix[] = [ console.log(' Attached admin policy (ECR, S3, EC2, RDS)'); // Create access key - const keyResult = await iam.send(new CreateAccessKeyCommand({ UserName: userName })); + const keyResult = await iam.send(new (iamSdk().CreateAccessKeyCommand)({ UserName: userName })); const accessKeyId = keyResult.AccessKey?.AccessKeyId; const secretKey = keyResult.AccessKey?.SecretAccessKey; @@ -469,12 +467,12 @@ export const iamFixes: Fix[] = [ } // Create IAM user - await iam.send(new CreateUserCommand({ UserName: userName })); + await iam.send(new (iamSdk().CreateUserCommand)({ UserName: userName })); console.log(' Created IAM user: ' + userName); // Create and attach inline policy const policy = getProdPolicy(projectName, region, accountId); - await iam.send(new PutUserPolicyCommand({ + await iam.send(new (iamSdk().PutUserPolicyCommand)({ UserName: userName, PolicyName: 'factiii-' + projectName + '-prod-policy', PolicyDocument: policy, @@ -482,7 +480,7 @@ export const iamFixes: Fix[] = [ console.log(' Attached prod policy (full ECR, S3, EC2, RDS, SES)'); // Create access key - const keyResult = await iam.send(new CreateAccessKeyCommand({ UserName: userName })); + const keyResult = await iam.send(new (iamSdk().CreateAccessKeyCommand)({ UserName: userName })); const accessKeyId = keyResult.AccessKey?.AccessKeyId; const secretKey = keyResult.AccessKey?.SecretAccessKey; diff --git a/packages/stack/src/plugins/pipelines/aws/scanfix/rds.ts b/packages/stack/src/plugins/pipelines/aws/scanfix/rds.ts index 2b05b8a..9d7961a 100644 --- a/packages/stack/src/plugins/pipelines/aws/scanfix/rds.ts +++ b/packages/stack/src/plugins/pipelines/aws/scanfix/rds.ts @@ -20,8 +20,7 @@ import { findRdsInstance, getRDSClient, confirmAwsAction, - CreateDBSubnetGroupCommand, - CreateDBInstanceCommand, + rdsSdk, } from '../utils/aws-helpers.js'; /** @@ -74,7 +73,7 @@ export const rdsFixes: Fix[] = [ try { const rds = getRDSClient(region); - await rds.send(new CreateDBSubnetGroupCommand({ + await rds.send(new (rdsSdk().CreateDBSubnetGroupCommand)({ DBSubnetGroupName: groupName, DBSubnetGroupDescription: 'Factiii DB subnet group for ' + projectName, SubnetIds: privateSubnets, @@ -142,7 +141,7 @@ export const rdsFixes: Fix[] = [ const masterUser = 'factiii'; const masterPassword = generateRdsPassword(); - await rds.send(new CreateDBInstanceCommand({ + await rds.send(new (rdsSdk().CreateDBInstanceCommand)({ DBInstanceIdentifier: dbId, DBInstanceClass: 'db.t3.micro', Engine: 'postgres', diff --git a/packages/stack/src/plugins/pipelines/aws/scanfix/route53.ts b/packages/stack/src/plugins/pipelines/aws/scanfix/route53.ts index 98b3fa4..18a9433 100644 --- a/packages/stack/src/plugins/pipelines/aws/scanfix/route53.ts +++ b/packages/stack/src/plugins/pipelines/aws/scanfix/route53.ts @@ -8,18 +8,16 @@ import type { FactiiiConfig, Fix } from '../../../../types/index.js'; import { - getAwsConfig, - getProjectName, - isAwsConfigured, - findInstance, - findElasticIp, - findHostedZone, - findARecord, - getRoute53Client, - confirmAwsAction, - CreateHostedZoneCommand, - ChangeResourceRecordSetsCommand, - GetHostedZoneCommand, + getAwsConfig, + getProjectName, + isAwsConfigured, + findInstance, + findElasticIp, + findHostedZone, + findARecord, + getRoute53Client, + confirmAwsAction, + route53Sdk, } from '../utils/aws-helpers.js'; import { extractEnvironments } from '../../../../utils/config-helpers.js'; @@ -81,7 +79,7 @@ export const route53Fixes: Fix[] = [ // Create hosted zone with a unique caller reference const callerRef = 'factiii-' + Date.now(); - const result = await r53.send(new CreateHostedZoneCommand({ + const result = await r53.send(new (route53Sdk().CreateHostedZoneCommand)({ Name: domain, CallerReference: callerRef, })); @@ -92,7 +90,7 @@ export const route53Fixes: Fix[] = [ // Get the NS records to show the user if (zoneId) { - const zoneDetail = await r53.send(new GetHostedZoneCommand({ + const zoneDetail = await r53.send(new (route53Sdk().GetHostedZoneCommand)({ Id: zoneId, })); const nameServers = zoneDetail.DelegationSet?.NameServers ?? []; @@ -189,7 +187,7 @@ export const route53Fixes: Fix[] = [ const r53 = getRoute53Client(region); // Create/update A record (UPSERT) - await r53.send(new ChangeResourceRecordSetsCommand({ + await r53.send(new (route53Sdk().ChangeResourceRecordSetsCommand)({ HostedZoneId: zoneId, ChangeBatch: { Changes: [ diff --git a/packages/stack/src/plugins/pipelines/aws/scanfix/s3.ts b/packages/stack/src/plugins/pipelines/aws/scanfix/s3.ts index f34f963..13cac44 100644 --- a/packages/stack/src/plugins/pipelines/aws/scanfix/s3.ts +++ b/packages/stack/src/plugins/pipelines/aws/scanfix/s3.ts @@ -17,10 +17,7 @@ import { hasCors, getS3Client, confirmAwsAction, - CreateBucketCommand, - PutPublicAccessBlockCommand, - PutBucketEncryptionCommand, - PutBucketCorsCommand, + s3Sdk, } from '../utils/aws-helpers.js'; /** @@ -72,9 +69,9 @@ export const s3Fixes: Fix[] = [ // Create bucket (us-east-1 doesn't need LocationConstraint) if (region === 'us-east-1') { - await s3.send(new CreateBucketCommand({ Bucket: bucketName })); + await s3.send(new (s3Sdk().CreateBucketCommand)({ Bucket: bucketName })); } else { - await s3.send(new CreateBucketCommand({ + await s3.send(new (s3Sdk().CreateBucketCommand)({ Bucket: bucketName, CreateBucketConfiguration: { LocationConstraint: region as any }, })); @@ -82,7 +79,7 @@ export const s3Fixes: Fix[] = [ console.log(' Created S3 bucket: ' + bucketName); // Block all public access - await s3.send(new PutPublicAccessBlockCommand({ + await s3.send(new (s3Sdk().PutPublicAccessBlockCommand)({ Bucket: bucketName, PublicAccessBlockConfiguration: { BlockPublicAcls: true, @@ -94,7 +91,7 @@ export const s3Fixes: Fix[] = [ console.log(' Blocked all public access'); // Enable server-side encryption (AES-256) - await s3.send(new PutBucketEncryptionCommand({ + await s3.send(new (s3Sdk().PutBucketEncryptionCommand)({ Bucket: bucketName, ServerSideEncryptionConfiguration: { Rules: [{ @@ -156,7 +153,7 @@ export const s3Fixes: Fix[] = [ try { const s3 = getS3Client(region); - await s3.send(new PutBucketCorsCommand({ + await s3.send(new (s3Sdk().PutBucketCorsCommand)({ Bucket: bucketName, CORSConfiguration: { CORSRules: [{ diff --git a/packages/stack/src/plugins/pipelines/aws/scanfix/security-groups.ts b/packages/stack/src/plugins/pipelines/aws/scanfix/security-groups.ts index 651f68f..e6b528c 100644 --- a/packages/stack/src/plugins/pipelines/aws/scanfix/security-groups.ts +++ b/packages/stack/src/plugins/pipelines/aws/scanfix/security-groups.ts @@ -18,9 +18,7 @@ import { tagSpec, getEC2Client, confirmAwsAction, - CreateSecurityGroupCommand, - AuthorizeSecurityGroupIngressCommand, - DescribeSecurityGroupsCommand, + ec2Sdk, } from '../utils/aws-helpers.js'; export const securityGroupFixes: Fix[] = [ @@ -61,7 +59,7 @@ export const securityGroupFixes: Fix[] = [ const ec2 = getEC2Client(region); // Create security group - const sgResult = await ec2.send(new CreateSecurityGroupCommand({ + const sgResult = await ec2.send(new (ec2Sdk().CreateSecurityGroupCommand)({ GroupName: groupName, Description: 'EC2 security group for ' + projectName, VpcId: vpcId, @@ -71,7 +69,7 @@ export const securityGroupFixes: Fix[] = [ console.log(' Created EC2 security group: ' + sgId); // Allow SSH (port 22) - await ec2.send(new AuthorizeSecurityGroupIngressCommand({ + await ec2.send(new (ec2Sdk().AuthorizeSecurityGroupIngressCommand)({ GroupId: sgId, IpProtocol: 'tcp', FromPort: 22, @@ -80,7 +78,7 @@ export const securityGroupFixes: Fix[] = [ })); // Allow HTTP (port 80) - await ec2.send(new AuthorizeSecurityGroupIngressCommand({ + await ec2.send(new (ec2Sdk().AuthorizeSecurityGroupIngressCommand)({ GroupId: sgId, IpProtocol: 'tcp', FromPort: 80, @@ -89,7 +87,7 @@ export const securityGroupFixes: Fix[] = [ })); // Allow HTTPS (port 443) - await ec2.send(new AuthorizeSecurityGroupIngressCommand({ + await ec2.send(new (ec2Sdk().AuthorizeSecurityGroupIngressCommand)({ GroupId: sgId, IpProtocol: 'tcp', FromPort: 443, @@ -149,7 +147,7 @@ export const securityGroupFixes: Fix[] = [ const ec2 = getEC2Client(region); // Create RDS security group - const sgResult = await ec2.send(new CreateSecurityGroupCommand({ + const sgResult = await ec2.send(new (ec2Sdk().CreateSecurityGroupCommand)({ GroupName: groupName, Description: 'RDS security group for ' + projectName, VpcId: vpcId, @@ -159,7 +157,7 @@ export const securityGroupFixes: Fix[] = [ console.log(' Created RDS security group: ' + sgId); // Allow PostgreSQL (port 5432) from EC2 security group ONLY - await ec2.send(new AuthorizeSecurityGroupIngressCommand({ + await ec2.send(new (ec2Sdk().AuthorizeSecurityGroupIngressCommand)({ GroupId: sgId, IpPermissions: [{ IpProtocol: 'tcp', @@ -222,7 +220,7 @@ export const securityGroupFixes: Fix[] = [ // Check if RDS SG has an inbound rule for the staging IP try { const ec2 = getEC2Client(region); - const rulesResult = await ec2.send(new DescribeSecurityGroupsCommand({ + const rulesResult = await ec2.send(new (ec2Sdk().DescribeSecurityGroupsCommand)({ GroupIds: [rdsSgId], })); const rules = rulesResult.SecurityGroups?.[0]?.IpPermissions ?? []; @@ -302,7 +300,7 @@ export const securityGroupFixes: Fix[] = [ return false; } - await ec2.send(new AuthorizeSecurityGroupIngressCommand({ + await ec2.send(new (ec2Sdk().AuthorizeSecurityGroupIngressCommand)({ GroupId: rdsSgId, IpProtocol: 'tcp', FromPort: 5432, diff --git a/packages/stack/src/plugins/pipelines/aws/scanfix/ses.ts b/packages/stack/src/plugins/pipelines/aws/scanfix/ses.ts index 9a06498..ca21a93 100644 --- a/packages/stack/src/plugins/pipelines/aws/scanfix/ses.ts +++ b/packages/stack/src/plugins/pipelines/aws/scanfix/ses.ts @@ -14,10 +14,7 @@ import { hasDkim, getSESClient, confirmAwsAction, - VerifyDomainIdentityCommand, - GetIdentityVerificationAttributesCommand, - VerifyDomainDkimCommand, - GetSendQuotaCommand, + sesSdk, } from '../utils/aws-helpers.js'; /** @@ -68,10 +65,10 @@ export const sesFixes: Fix[] = [ const ses = getSESClient(region); // Start domain verification - await ses.send(new VerifyDomainIdentityCommand({ Domain: domain })); + await ses.send(new (sesSdk().VerifyDomainIdentityCommand)({ Domain: domain })); // Get the verification token - const tokenResult = await ses.send(new GetIdentityVerificationAttributesCommand({ + const tokenResult = await ses.send(new (sesSdk().GetIdentityVerificationAttributesCommand)({ Identities: [domain], })); const token = tokenResult.VerificationAttributes?.[domain]?.VerificationToken ?? ''; @@ -124,7 +121,7 @@ export const sesFixes: Fix[] = [ const ses = getSESClient(region); // Generate DKIM tokens - const result = await ses.send(new VerifyDomainDkimCommand({ Domain: domain })); + const result = await ses.send(new (sesSdk().VerifyDomainDkimCommand)({ Domain: domain })); const tokens: string[] = result.DkimTokens ?? []; console.log(' Generated DKIM tokens for: ' + domain); @@ -161,7 +158,7 @@ export const sesFixes: Fix[] = [ // Check sending quota — sandbox has max 200/day try { const ses = getSESClient(region); - const result = await ses.send(new GetSendQuotaCommand({})); + const result = await ses.send(new (sesSdk().GetSendQuotaCommand)({})); const maxSend = result.Max24HourSend ?? 0; return maxSend <= 200; } catch { diff --git a/packages/stack/src/plugins/pipelines/aws/scanfix/vpc.ts b/packages/stack/src/plugins/pipelines/aws/scanfix/vpc.ts index c7acbef..d5b454f 100644 --- a/packages/stack/src/plugins/pipelines/aws/scanfix/vpc.ts +++ b/packages/stack/src/plugins/pipelines/aws/scanfix/vpc.ts @@ -18,16 +18,7 @@ import { tagSpec, getEC2Client, confirmAwsAction, - CreateVpcCommand, - ModifyVpcAttributeCommand, - DescribeAvailabilityZonesCommand, - CreateSubnetCommand, - ModifySubnetAttributeCommand, - CreateInternetGatewayCommand, - AttachInternetGatewayCommand, - CreateRouteTableCommand, - CreateRouteCommand, - AssociateRouteTableCommand, + ec2Sdk, } from '../utils/aws-helpers.js'; export const vpcFixes: Fix[] = [ @@ -60,7 +51,7 @@ export const vpcFixes: Fix[] = [ const ec2 = getEC2Client(region); // Create VPC - const vpcResult = await ec2.send(new CreateVpcCommand({ + const vpcResult = await ec2.send(new (ec2Sdk().CreateVpcCommand)({ CidrBlock: '10.0.0.0/16', TagSpecifications: [tagSpec('vpc', projectName)], })); @@ -68,13 +59,13 @@ export const vpcFixes: Fix[] = [ console.log(' Created VPC: ' + vpcId); // Enable DNS hostnames - await ec2.send(new ModifyVpcAttributeCommand({ + await ec2.send(new (ec2Sdk().ModifyVpcAttributeCommand)({ VpcId: vpcId, EnableDnsHostnames: { Value: true }, })); // Enable DNS support - await ec2.send(new ModifyVpcAttributeCommand({ + await ec2.send(new (ec2Sdk().ModifyVpcAttributeCommand)({ VpcId: vpcId, EnableDnsSupport: { Value: true }, })); @@ -123,7 +114,7 @@ export const vpcFixes: Fix[] = [ const ec2 = getEC2Client(region); // Get first AZ - const azResult = await ec2.send(new DescribeAvailabilityZonesCommand({})); + const azResult = await ec2.send(new (ec2Sdk().DescribeAvailabilityZonesCommand)({})); const az = azResult.AvailabilityZones?.[0]?.ZoneName; if (!az) { console.log(' No availability zones found'); @@ -131,7 +122,7 @@ export const vpcFixes: Fix[] = [ } // Create public subnet - const subnetResult = await ec2.send(new CreateSubnetCommand({ + const subnetResult = await ec2.send(new (ec2Sdk().CreateSubnetCommand)({ VpcId: vpcId, CidrBlock: '10.0.1.0/24', AvailabilityZone: az, @@ -140,7 +131,7 @@ export const vpcFixes: Fix[] = [ const subnetId = subnetResult.Subnet?.SubnetId; // Enable auto-assign public IP - await ec2.send(new ModifySubnetAttributeCommand({ + await ec2.send(new (ec2Sdk().ModifySubnetAttributeCommand)({ SubnetId: subnetId, MapPublicIpOnLaunch: { Value: true }, })); @@ -190,7 +181,7 @@ export const vpcFixes: Fix[] = [ const ec2 = getEC2Client(region); // Get first two AZs - const azResult = await ec2.send(new DescribeAvailabilityZonesCommand({})); + const azResult = await ec2.send(new (ec2Sdk().DescribeAvailabilityZonesCommand)({})); const azs = (azResult.AvailabilityZones ?? []).map(az => az.ZoneName!).filter(Boolean); if (azs.length < 2) { console.log(' Need at least 2 availability zones'); @@ -198,7 +189,7 @@ export const vpcFixes: Fix[] = [ } // Create private subnet 1 - const sub1Result = await ec2.send(new CreateSubnetCommand({ + const sub1Result = await ec2.send(new (ec2Sdk().CreateSubnetCommand)({ VpcId: vpcId, CidrBlock: '10.0.2.0/24', AvailabilityZone: azs[0], @@ -208,7 +199,7 @@ export const vpcFixes: Fix[] = [ console.log(' Created private subnet 1: ' + sub1Id + ' in ' + azs[0]); // Create private subnet 2 - const sub2Result = await ec2.send(new CreateSubnetCommand({ + const sub2Result = await ec2.send(new (ec2Sdk().CreateSubnetCommand)({ VpcId: vpcId, CidrBlock: '10.0.3.0/24', AvailabilityZone: azs[1], @@ -262,28 +253,28 @@ export const vpcFixes: Fix[] = [ const ec2 = getEC2Client(region); // Create IGW - const igwResult = await ec2.send(new CreateInternetGatewayCommand({ + const igwResult = await ec2.send(new (ec2Sdk().CreateInternetGatewayCommand)({ TagSpecifications: [tagSpec('internet-gateway', projectName)], })); const igwId = igwResult.InternetGateway?.InternetGatewayId; console.log(' Created Internet Gateway: ' + igwId); // Attach to VPC - await ec2.send(new AttachInternetGatewayCommand({ + await ec2.send(new (ec2Sdk().AttachInternetGatewayCommand)({ InternetGatewayId: igwId, VpcId: vpcId, })); console.log(' Attached to VPC'); // Create route table - const rtResult = await ec2.send(new CreateRouteTableCommand({ + const rtResult = await ec2.send(new (ec2Sdk().CreateRouteTableCommand)({ VpcId: vpcId, TagSpecifications: [tagSpec('route-table', projectName)], })); const rtId = rtResult.RouteTable?.RouteTableId; // Add route: 0.0.0.0/0 -> IGW - await ec2.send(new CreateRouteCommand({ + await ec2.send(new (ec2Sdk().CreateRouteCommand)({ RouteTableId: rtId, DestinationCidrBlock: '0.0.0.0/0', GatewayId: igwId, @@ -292,7 +283,7 @@ export const vpcFixes: Fix[] = [ // Associate route table with public subnet const publicSubnetId = await findSubnet(projectName, region, 'public', config); if (publicSubnetId) { - await ec2.send(new AssociateRouteTableCommand({ + await ec2.send(new (ec2Sdk().AssociateRouteTableCommand)({ RouteTableId: rtId, SubnetId: publicSubnetId, })); diff --git a/packages/stack/src/plugins/pipelines/aws/utils/aws-helpers.ts b/packages/stack/src/plugins/pipelines/aws/utils/aws-helpers.ts index 1330c27..0f5d38b 100644 --- a/packages/stack/src/plugins/pipelines/aws/utils/aws-helpers.ts +++ b/packages/stack/src/plugins/pipelines/aws/utils/aws-helpers.ts @@ -5,89 +5,66 @@ * Uses AWS SDK v3 clients instead of AWS CLI. */ -import { - EC2Client, - DescribeVpcsCommand, - DescribeSubnetsCommand, - DescribeSecurityGroupsCommand, - DescribeInstancesCommand, - DescribeKeyPairsCommand, - DescribeAddressesCommand, - DescribeInternetGatewaysCommand, - DescribeAvailabilityZonesCommand, - DescribeImagesCommand, - CreateVpcCommand, - ModifyVpcAttributeCommand, - CreateSubnetCommand, - ModifySubnetAttributeCommand, - CreateInternetGatewayCommand, - AttachInternetGatewayCommand, - CreateRouteTableCommand, - CreateRouteCommand, - AssociateRouteTableCommand, - CreateSecurityGroupCommand, - AuthorizeSecurityGroupIngressCommand, - CreateKeyPairCommand, - RunInstancesCommand, - AllocateAddressCommand, - AssociateAddressCommand, - type Tag, - type TagSpecification, - type Filter, - waitUntilInstanceRunning, -} from '@aws-sdk/client-ec2'; -import { STSClient, GetCallerIdentityCommand } from '@aws-sdk/client-sts'; -import { - IAMClient, - GetUserCommand, - ListUsersCommand, - CreateUserCommand, - PutUserPolicyCommand, - CreateAccessKeyCommand, -} from '@aws-sdk/client-iam'; -import { - RDSClient, - DescribeDBSubnetGroupsCommand, - CreateDBSubnetGroupCommand, - DescribeDBInstancesCommand, - CreateDBInstanceCommand, -} from '@aws-sdk/client-rds'; -import { - S3Client, - HeadBucketCommand, - CreateBucketCommand, - PutPublicAccessBlockCommand, - PutBucketEncryptionCommand, - GetBucketCorsCommand, - PutBucketCorsCommand, -} from '@aws-sdk/client-s3'; -import { - ECRClient, - DescribeRepositoriesCommand, - CreateRepositoryCommand, - PutLifecyclePolicyCommand, - GetAuthorizationTokenCommand, -} from '@aws-sdk/client-ecr'; -import { - SESClient, - VerifyDomainIdentityCommand, - GetIdentityVerificationAttributesCommand, - VerifyDomainDkimCommand, - GetIdentityDkimAttributesCommand, - GetSendQuotaCommand, -} from '@aws-sdk/client-ses'; -import { - Route53Client, - ListHostedZonesByNameCommand, - CreateHostedZoneCommand, - ChangeResourceRecordSetsCommand, - ListResourceRecordSetsCommand, - GetHostedZoneCommand, -} from '@aws-sdk/client-route-53'; -import { - EC2InstanceConnectClient, - SendSSHPublicKeyCommand, -} from '@aws-sdk/client-ec2-instance-connect'; +// CRITICAL: lazy SDK loading. +// Why: the nine @aws-sdk/client-* packages cost ~100 ms to require, which was +// most of `npx stack` startup. Every AWS scanfix module imports this file, and +// factiii/index.ts imports those to build its `fixes` array, so a plain +// `import { EC2Client } from '@aws-sdk/client-ec2'` here loads the whole SDK on +// every command — including `--help`, `ops`, `db` and `backup`, which never +// touch AWS. The type imports below are erased by TypeScript and cost nothing; +// the `*Sdk()` accessors require the real package on first use and cache it. +// Breaks-if-changed: reintroducing a value import from '@aws-sdk/*' anywhere in +// this file, or in any scanfix file, puts the SDK back on the startup path. +import type * as Ec2 from '@aws-sdk/client-ec2'; +import type * as Sts from '@aws-sdk/client-sts'; +import type * as Iam from '@aws-sdk/client-iam'; +import type * as Rds from '@aws-sdk/client-rds'; +import type * as S3 from '@aws-sdk/client-s3'; +import type * as Ecr from '@aws-sdk/client-ecr'; +import type * as Ses from '@aws-sdk/client-ses'; +import type * as Route53 from '@aws-sdk/client-route-53'; +import type * as Ec2Ic from '@aws-sdk/client-ec2-instance-connect'; + +let _ec2Sdk: typeof Ec2 | undefined; +let _stsSdk: typeof Sts | undefined; +let _iamSdk: typeof Iam | undefined; +let _rdsSdk: typeof Rds | undefined; +let _s3Sdk: typeof S3 | undefined; +let _ecrSdk: typeof Ecr | undefined; +let _sesSdk: typeof Ses | undefined; +let _route53Sdk: typeof Route53 | undefined; +let _ec2IcSdk: typeof Ec2Ic | undefined; + +/* eslint-disable @typescript-eslint/no-require-imports */ +export function ec2Sdk(): typeof Ec2 { + return (_ec2Sdk ??= require('@aws-sdk/client-ec2') as typeof Ec2); +} +export function stsSdk(): typeof Sts { + return (_stsSdk ??= require('@aws-sdk/client-sts') as typeof Sts); +} +export function iamSdk(): typeof Iam { + return (_iamSdk ??= require('@aws-sdk/client-iam') as typeof Iam); +} +export function rdsSdk(): typeof Rds { + return (_rdsSdk ??= require('@aws-sdk/client-rds') as typeof Rds); +} +export function s3Sdk(): typeof S3 { + return (_s3Sdk ??= require('@aws-sdk/client-s3') as typeof S3); +} +export function ecrSdk(): typeof Ecr { + return (_ecrSdk ??= require('@aws-sdk/client-ecr') as typeof Ecr); +} +export function sesSdk(): typeof Ses { + return (_sesSdk ??= require('@aws-sdk/client-ses') as typeof Ses); +} +export function route53Sdk(): typeof Route53 { + return (_route53Sdk ??= require('@aws-sdk/client-route-53') as typeof Route53); +} +export function ec2IcSdk(): typeof Ec2Ic { + return (_ec2IcSdk ??= require('@aws-sdk/client-ec2-instance-connect') as typeof Ec2Ic); +} +/* eslint-enable @typescript-eslint/no-require-imports */ + import type { FactiiiConfig, EnvironmentConfig } from '../../../../types/index.js'; import { AnsibleVaultSecrets } from '../../../../utils/ansible-vault-secrets.js'; @@ -149,11 +126,11 @@ export async function verifyCredentialsWithSts( region: string ): Promise { try { - const sts = new STSClient({ + const sts = new (stsSdk().STSClient)({ region, credentials: { accessKeyId, secretAccessKey }, }); - const result = await sts.send(new GetCallerIdentityCommand({})); + const result = await sts.send(new (stsSdk().GetCallerIdentityCommand)({})); return result.Account ?? null; } catch { return null; @@ -240,40 +217,40 @@ function getCachedClient( return clientCache[key] as T; } -export function getEC2Client(region: string): EC2Client { - return getCachedClient(EC2Client, region); +export function getEC2Client(region: string): Ec2.EC2Client { + return getCachedClient(ec2Sdk().EC2Client, region); } -export function getSTSClient(region: string): STSClient { - return getCachedClient(STSClient, region); +export function getSTSClient(region: string): Sts.STSClient { + return getCachedClient(stsSdk().STSClient, region); } -export function getIAMClient(region: string): IAMClient { - return getCachedClient(IAMClient, region); +export function getIAMClient(region: string): Iam.IAMClient { + return getCachedClient(iamSdk().IAMClient, region); } -export function getRDSClient(region: string): RDSClient { - return getCachedClient(RDSClient, region); +export function getRDSClient(region: string): Rds.RDSClient { + return getCachedClient(rdsSdk().RDSClient, region); } -export function getS3Client(region: string): S3Client { - return getCachedClient(S3Client, region); +export function getS3Client(region: string): S3.S3Client { + return getCachedClient(s3Sdk().S3Client, region); } -export function getECRClient(region: string): ECRClient { - return getCachedClient(ECRClient, region); +export function getECRClient(region: string): Ecr.ECRClient { + return getCachedClient(ecrSdk().ECRClient, region); } -export function getSESClient(region: string): SESClient { - return getCachedClient(SESClient, region); +export function getSESClient(region: string): Ses.SESClient { + return getCachedClient(sesSdk().SESClient, region); } -export function getRoute53Client(region: string): Route53Client { - return getCachedClient(Route53Client, region); +export function getRoute53Client(region: string): Route53.Route53Client { + return getCachedClient(route53Sdk().Route53Client, region); } -export function getEC2ICClient(region: string): EC2InstanceConnectClient { - return getCachedClient(EC2InstanceConnectClient, region); +export function getEC2ICClient(region: string): Ec2Ic.EC2InstanceConnectClient { + return getCachedClient(ec2IcSdk().EC2InstanceConnectClient, region); } // ============================================================ @@ -283,8 +260,8 @@ export function getEC2ICClient(region: string): EC2InstanceConnectClient { /** * Build standard tags array for AWS resources */ -export function buildTags(projectName: string, extraTags?: Record): Tag[] { - const tags: Tag[] = [ +export function buildTags(projectName: string, extraTags?: Record): Ec2.Tag[] { + const tags: Ec2.Tag[] = [ { Key: 'factiii:project', Value: projectName }, { Key: 'factiii:managed', Value: 'true' }, { Key: 'Name', Value: 'factiii-' + projectName }, @@ -300,9 +277,9 @@ export function buildTags(projectName: string, extraTags?: Record): TagSpecification { +export function tagSpec(resourceType: string, projectName: string, extraTags?: Record): Ec2.TagSpecification { return { - ResourceType: resourceType as TagSpecification['ResourceType'], + ResourceType: resourceType as Ec2.TagSpecification['ResourceType'], Tags: buildTags(projectName, extraTags), }; } @@ -310,7 +287,7 @@ export function tagSpec(resourceType: string, projectName: string, extraTags?: R /** * Build a filter for factiii:project tag */ -export function projectFilter(projectName: string): Filter { +export function projectFilter(projectName: string): Ec2.Filter { return { Name: 'tag:factiii:project', Values: [projectName] }; } @@ -432,7 +409,7 @@ export function getResourceNames(config: FactiiiConfig): ResourceNames { export async function getAwsAccountId(region: string): Promise { try { const sts = getSTSClient(region); - const result = await sts.send(new GetCallerIdentityCommand({})); + const result = await sts.send(new (stsSdk().GetCallerIdentityCommand)({})); return result.Account ?? null; } catch { return null; @@ -447,7 +424,7 @@ export async function getAwsAccountId(region: string): Promise { export async function getCallerArn(region: string): Promise { try { const sts = getSTSClient(region); - const result = await sts.send(new GetCallerIdentityCommand({})); + const result = await sts.send(new (stsSdk().GetCallerIdentityCommand)({})); const arn = result.Arn ?? ''; const userName = arn.includes('/') ? arn.split('/').pop() : null; let accessKeyId: string | null = null; @@ -469,7 +446,7 @@ export async function getCallerArn(region: string): Promise { export async function canManageIam(region: string): Promise { try { const iam = getIAMClient(region); - await iam.send(new ListUsersCommand({ MaxItems: 1 })); + await iam.send(new (iamSdk().ListUsersCommand)({ MaxItems: 1 })); return true; } catch { return false; @@ -488,7 +465,7 @@ export async function getEcrAuthToken(region: string): Promise<{ } | null> { try { const ecr = getECRClient(region); - const result = await ecr.send(new GetAuthorizationTokenCommand({})); + const result = await ecr.send(new (ecrSdk().GetAuthorizationTokenCommand)({})); const authData = result.authorizationData?.[0]; if (!authData?.authorizationToken || !authData?.proxyEndpoint) return null; @@ -518,7 +495,7 @@ export async function findVpc(projectName: string, region: string, config?: Fact if (config?.aws?.vpc_id) return config.aws.vpc_id; try { const ec2 = getEC2Client(region); - const result = await ec2.send(new DescribeVpcsCommand({ + const result = await ec2.send(new (ec2Sdk().DescribeVpcsCommand)({ Filters: [projectFilter(projectName)], })); return result.Vpcs?.[0]?.VpcId ?? null; @@ -535,7 +512,7 @@ export async function findSubnet(projectName: string, region: string, type: stri if (type === 'public' && config?.aws?.subnet_public_id) return config.aws.subnet_public_id; try { const ec2 = getEC2Client(region); - const result = await ec2.send(new DescribeSubnetsCommand({ + const result = await ec2.send(new (ec2Sdk().DescribeSubnetsCommand)({ Filters: [ projectFilter(projectName), { Name: 'tag:factiii:subnet-type', Values: [type] }, @@ -554,7 +531,7 @@ export async function findPrivateSubnets(projectName: string, region: string, co if (config?.aws?.subnet_private_ids?.length) return config.aws.subnet_private_ids; try { const ec2 = getEC2Client(region); - const result = await ec2.send(new DescribeSubnetsCommand({ + const result = await ec2.send(new (ec2Sdk().DescribeSubnetsCommand)({ Filters: [ projectFilter(projectName), { Name: 'tag:factiii:subnet-type', Values: ['private'] }, @@ -572,7 +549,7 @@ export async function findPrivateSubnets(projectName: string, region: string, co export async function findSecurityGroup(groupName: string, vpcId: string, region: string): Promise { try { const ec2 = getEC2Client(region); - const result = await ec2.send(new DescribeSecurityGroupsCommand({ + const result = await ec2.send(new (ec2Sdk().DescribeSecurityGroupsCommand)({ Filters: [ { Name: 'group-name', Values: [groupName] }, { Name: 'vpc-id', Values: [vpcId] }, @@ -590,7 +567,7 @@ export async function findSecurityGroup(groupName: string, vpcId: string, region export async function findKeyPair(keyName: string, region: string): Promise { try { const ec2 = getEC2Client(region); - const result = await ec2.send(new DescribeKeyPairsCommand({ + const result = await ec2.send(new (ec2Sdk().DescribeKeyPairsCommand)({ KeyNames: [keyName], })); return (result.KeyPairs?.length ?? 0) > 0; @@ -605,7 +582,7 @@ export async function findKeyPair(keyName: string, region: string): Promise { try { const ec2 = getEC2Client(region); - const result = await ec2.send(new DescribeInstancesCommand({ + const result = await ec2.send(new (ec2Sdk().DescribeInstancesCommand)({ Filters: [ projectFilter(projectName), { Name: 'instance-state-name', Values: ['running', 'stopped'] }, @@ -624,7 +601,7 @@ export async function findInstance(projectName: string, region: string): Promise export async function findInstancePublicIp(projectName: string, region: string): Promise { try { const ec2 = getEC2Client(region); - const result = await ec2.send(new DescribeInstancesCommand({ + const result = await ec2.send(new (ec2Sdk().DescribeInstancesCommand)({ Filters: [ projectFilter(projectName), { Name: 'instance-state-name', Values: ['running'] }, @@ -663,7 +640,7 @@ export async function pushSshPublicKey( let az = availabilityZone; if (!az) { const ec2 = getEC2Client(region); - const desc = await ec2.send(new DescribeInstancesCommand({ + const desc = await ec2.send(new (ec2Sdk().DescribeInstancesCommand)({ InstanceIds: [instanceId], })); az = desc.Reservations?.[0]?.Instances?.[0]?.Placement?.AvailabilityZone; @@ -671,7 +648,7 @@ export async function pushSshPublicKey( if (!az) return false; const ic = getEC2ICClient(region); - const result = await ic.send(new SendSSHPublicKeyCommand({ + const result = await ic.send(new (ec2IcSdk().SendSSHPublicKeyCommand)({ InstanceId: instanceId, InstanceOSUser: osUser, SSHPublicKey: sshPublicKey, @@ -689,7 +666,7 @@ export async function pushSshPublicKey( export async function findElasticIp(instanceId: string, region: string): Promise { try { const ec2 = getEC2Client(region); - const result = await ec2.send(new DescribeAddressesCommand({ + const result = await ec2.send(new (ec2Sdk().DescribeAddressesCommand)({ Filters: [{ Name: 'instance-id', Values: [instanceId] }], })); return result.Addresses?.[0]?.PublicIp ?? null; @@ -704,7 +681,7 @@ export async function findElasticIp(instanceId: string, region: string): Promise export async function findIgw(vpcId: string, region: string): Promise { try { const ec2 = getEC2Client(region); - const result = await ec2.send(new DescribeInternetGatewaysCommand({ + const result = await ec2.send(new (ec2Sdk().DescribeInternetGatewaysCommand)({ Filters: [{ Name: 'attachment.vpc-id', Values: [vpcId] }], })); return result.InternetGateways?.[0]?.InternetGatewayId ?? null; @@ -719,7 +696,7 @@ export async function findIgw(vpcId: string, region: string): Promise { try { const rds = getRDSClient(region); - const result = await rds.send(new DescribeDBSubnetGroupsCommand({ + const result = await rds.send(new (rdsSdk().DescribeDBSubnetGroupsCommand)({ DBSubnetGroupName: groupName, })); return (result.DBSubnetGroups?.length ?? 0) > 0; @@ -734,7 +711,7 @@ export async function findDbSubnetGroup(groupName: string, region: string): Prom export async function findRdsInstance(dbInstanceId: string, region: string): Promise<{ status: string; endpoint: string | null } | null> { try { const rds = getRDSClient(region); - const result = await rds.send(new DescribeDBInstancesCommand({ + const result = await rds.send(new (rdsSdk().DescribeDBInstancesCommand)({ DBInstanceIdentifier: dbInstanceId, })); const instance = result.DBInstances?.[0]; @@ -763,7 +740,7 @@ export async function findRdsEndpoint(projectName: string, region: string): Prom export async function findEcrRepo(repoName: string, region: string): Promise { try { const ecr = getECRClient(region); - await ecr.send(new DescribeRepositoriesCommand({ + await ecr.send(new (ecrSdk().DescribeRepositoriesCommand)({ repositoryNames: [repoName], })); return true; @@ -778,7 +755,7 @@ export async function findEcrRepo(repoName: string, region: string): Promise { try { const s3 = getS3Client(region); - await s3.send(new HeadBucketCommand({ Bucket: bucketName })); + await s3.send(new (s3Sdk().HeadBucketCommand)({ Bucket: bucketName })); return true; } catch { return false; @@ -791,7 +768,7 @@ export async function findBucket(bucketName: string, region: string): Promise { try { const iam = getIAMClient(region); - await iam.send(new GetUserCommand({ UserName: userName })); + await iam.send(new (iamSdk().GetUserCommand)({ UserName: userName })); return true; } catch { return false; @@ -804,7 +781,7 @@ export async function findIamUser(userName: string, region: string): Promise { try { const ses = getSESClient(region); - const result = await ses.send(new GetIdentityVerificationAttributesCommand({ + const result = await ses.send(new (sesSdk().GetIdentityVerificationAttributesCommand)({ Identities: [domain], })); return result.VerificationAttributes?.[domain]?.VerificationStatus === 'Success'; @@ -819,7 +796,7 @@ export async function isDomainVerified(domain: string, region: string): Promise< export async function hasDkim(domain: string, region: string): Promise { try { const ses = getSESClient(region); - const result = await ses.send(new GetIdentityDkimAttributesCommand({ + const result = await ses.send(new (sesSdk().GetIdentityDkimAttributesCommand)({ Identities: [domain], })); return result.DkimAttributes?.[domain]?.DkimEnabled === true; @@ -834,7 +811,7 @@ export async function hasDkim(domain: string, region: string): Promise export async function hasCors(bucketName: string, region: string): Promise { try { const s3 = getS3Client(region); - const result = await s3.send(new GetBucketCorsCommand({ Bucket: bucketName })); + const result = await s3.send(new (s3Sdk().GetBucketCorsCommand)({ Bucket: bucketName })); return (result.CORSRules?.length ?? 0) > 0; } catch { return false; @@ -866,7 +843,7 @@ export async function findHostedZone(domain: string, region: string): Promise { try { - const { isAwsConfigured, getAwsConfig, getProjectName, findInstance, findInstancePublicIp, - getEC2Client, getEC2ICClient, DescribeInstancesCommand, SendSSHPublicKeyCommand } = + const { isAwsConfigured, getAwsConfig, getProjectName, findInstance, findInstancePublicIp, getEC2Client, getEC2ICClient, ec2Sdk, ec2IcSdk } = await import('../../aws/utils/aws-helpers.js'); if (!isAwsConfigured(config)) return { added: false }; @@ -127,7 +126,7 @@ async function tryEc2InstanceConnect( if (!instanceId) { try { const keyPairName = 'factiii-' + projectName; - const desc = await ec2.send(new DescribeInstancesCommand({ + const desc = await ec2.send(new (ec2Sdk().DescribeInstancesCommand)({ Filters: [ { Name: 'key-name', Values: [keyPairName] }, { Name: 'instance-state-name', Values: ['running', 'stopped'] }, @@ -162,7 +161,7 @@ async function tryEc2InstanceConnect( if (matchIps.size > 0) { try { - const desc = await ec2.send(new DescribeInstancesCommand({ + const desc = await ec2.send(new (ec2Sdk().DescribeInstancesCommand)({ Filters: [{ Name: 'instance-state-name', Values: ['running'] }], })); for (const reservation of desc.Reservations ?? []) { @@ -190,7 +189,7 @@ async function tryEc2InstanceConnect( } // Get instance details for AZ and public IP - const desc = await ec2.send(new DescribeInstancesCommand({ + const desc = await ec2.send(new (ec2Sdk().DescribeInstancesCommand)({ InstanceIds: [instanceId], })); const instance = desc.Reservations?.[0]?.Instances?.[0]; @@ -223,7 +222,7 @@ async function tryEc2InstanceConnect( for (const target of targets) { // Push fresh temporary key via EC2 Instance Connect before each attempt (60s window per push) const eicClient = getEC2ICClient(region); - const sendResult = await eicClient.send(new SendSSHPublicKeyCommand({ + const sendResult = await eicClient.send(new (ec2IcSdk().SendSSHPublicKeyCommand)({ InstanceId: instanceId, InstanceOSUser: user, SSHPublicKey: pubKey, @@ -290,9 +289,7 @@ async function autoGenerateAndDeploySshKey( if (!host || host.toUpperCase().startsWith('EXAMPLE')) { // Try to auto-detect host from EC2 instance (Elastic IP or public IP) try { - const { isAwsConfigured, getAwsConfig, getProjectName, findInstancePublicIp, - findInstance: findInst, findElasticIp: findEip, getEC2Client: getEc2, - DescribeInstancesCommand: DescInst } = + const { isAwsConfigured, getAwsConfig, getProjectName, findInstancePublicIp, findInstance: findInst, findElasticIp: findEip, getEC2Client: getEc2, ec2Sdk } = await import('../../aws/utils/aws-helpers.js'); if (isAwsConfigured(config)) { @@ -307,7 +304,7 @@ async function autoGenerateAndDeploySshKey( try { const ec2 = getEc2(region); const keyPairName = 'factiii-' + projectName; - const descResult = await ec2.send(new DescInst({ + const descResult = await ec2.send(new (ec2Sdk().DescribeInstancesCommand)({ Filters: [ { Name: 'key-name', Values: [keyPairName] }, { Name: 'instance-state-name', Values: ['running'] }, @@ -382,9 +379,7 @@ async function autoGenerateAndDeploySshKey( if (isAwsStage) { try { - const { getAwsConfig: getAws, getProjectName: getProjName, - findInstancePublicIp: findIp, findElasticIp: findEip2, - getEC2Client: getEc2b, DescribeInstancesCommand: DescInst2 } = + const { getAwsConfig: getAws, getProjectName: getProjName, findInstancePublicIp: findIp, findElasticIp: findEip2, getEC2Client: getEc2b, ec2Sdk } = await import('../../aws/utils/aws-helpers.js'); const { region } = getAws(config); const projName = getProjName(config); @@ -394,7 +389,7 @@ async function autoGenerateAndDeploySshKey( if (!ec2PublicIp) { try { const ec2b = getEc2b(region); - const descResult = await ec2b.send(new DescInst2({ + const descResult = await ec2b.send(new (ec2Sdk().DescribeInstancesCommand)({ Filters: [ { Name: 'key-name', Values: ['factiii-' + projName] }, { Name: 'instance-state-name', Values: ['running'] }, @@ -731,7 +726,7 @@ export const secretsFixes: Fix[] = [ try { // Check if AWS is configured for this project - const { isAwsConfigured, getAwsConfig, getAwsAccountId, getProjectName, findKeyPair, getEC2Client, CreateKeyPairCommand } = + const { isAwsConfigured, getAwsConfig, getAwsAccountId, getProjectName, findKeyPair, getEC2Client, ec2Sdk } = await import('../../aws/utils/aws-helpers.js'); if (isAwsConfigured(config)) { @@ -777,8 +772,7 @@ export const secretsFixes: Fix[] = [ console.log(''); // Import additional helpers for instance discovery - const { findInstance, findElasticIp, findInstancePublicIp, - DescribeInstancesCommand, getEC2ICClient, SendSSHPublicKeyCommand } = + const { findInstance, findElasticIp, findInstancePublicIp, getEC2ICClient, ec2Sdk, ec2IcSdk } = await import('../../aws/utils/aws-helpers.js'); // Find the EC2 instance using multiple strategies @@ -788,7 +782,7 @@ export const secretsFixes: Fix[] = [ // Try by key pair name if tag lookup fails if (!instanceId) { try { - const desc = await ec2.send(new DescribeInstancesCommand({ + const desc = await ec2.send(new (ec2Sdk().DescribeInstancesCommand)({ Filters: [ { Name: 'key-name', Values: [keyName] }, { Name: 'instance-state-name', Values: ['running', 'stopped'] }, @@ -815,7 +809,7 @@ export const secretsFixes: Fix[] = [ }); }); if (resolved.length > 0) { - const desc = await ec2.send(new DescribeInstancesCommand({ + const desc = await ec2.send(new (ec2Sdk().DescribeInstancesCommand)({ Filters: [{ Name: 'instance-state-name', Values: ['running'] }], })); for (const r of desc.Reservations ?? []) { @@ -838,7 +832,7 @@ export const secretsFixes: Fix[] = [ // List ALL running instances as last resort — prefer newest (most recently launched) if (!instanceId) { try { - const desc = await ec2.send(new DescribeInstancesCommand({ + const desc = await ec2.send(new (ec2Sdk().DescribeInstancesCommand)({ Filters: [{ Name: 'instance-state-name', Values: ['running'] }], })); const allInstances: { id: string; ip?: string; name?: string; launchTime?: Date }[] = []; @@ -913,7 +907,7 @@ export const secretsFixes: Fix[] = [ } // Instance found — get its details - const instDesc = await ec2.send(new DescribeInstancesCommand({ + const instDesc = await ec2.send(new (ec2Sdk().DescribeInstancesCommand)({ InstanceIds: [instanceId], })); const instance = instDesc.Reservations?.[0]?.Instances?.[0]; @@ -974,7 +968,7 @@ export const secretsFixes: Fix[] = [ console.log(' [2/4] Pushing key via EC2 Instance Connect...'); const eicClient = getEC2ICClient(region); - const sendResult = await eicClient.send(new SendSSHPublicKeyCommand({ + const sendResult = await eicClient.send(new (ec2IcSdk().SendSSHPublicKeyCommand)({ InstanceId: instanceId, InstanceOSUser: sshUser, SSHPublicKey: pubKey, @@ -1059,7 +1053,7 @@ export const secretsFixes: Fix[] = [ // Create new key pair — AWS returns the private key material console.log(' Creating EC2 key pair: ' + keyName); const ec2 = getEC2Client(region); - const keyResult = await ec2.send(new CreateKeyPairCommand({ + const keyResult = await ec2.send(new (ec2Sdk().CreateKeyPairCommand)({ KeyName: keyName, KeyType: 'ed25519', })); diff --git a/packages/stack/src/utils/ssh-helper.ts b/packages/stack/src/utils/ssh-helper.ts index a292218..aa0404c 100644 --- a/packages/stack/src/utils/ssh-helper.ts +++ b/packages/stack/src/utils/ssh-helper.ts @@ -684,8 +684,7 @@ export async function sshExec( const errMsg = result.stderr ?? ''; if (errMsg.includes('Permission denied') && config?.aws && stage === 'prod') { try { - const { isAwsConfigured, getAwsConfig, getProjectName, findInstance, findInstancePublicIp, - getEC2Client, getEC2ICClient, DescribeInstancesCommand, SendSSHPublicKeyCommand } = + const { isAwsConfigured, getAwsConfig, getProjectName, findInstance, findInstancePublicIp, getEC2Client, getEC2ICClient, ec2Sdk, ec2IcSdk } = await import('../plugins/pipelines/aws/utils/aws-helpers.js'); if (isAwsConfigured(config)) { @@ -696,7 +695,7 @@ export async function sshExec( let instId = await findInstance(projectName, region); if (!instId) { const ec2 = getEC2Client(region); - const kpDesc = await ec2.send(new DescribeInstancesCommand({ + const kpDesc = await ec2.send(new (ec2Sdk().DescribeInstancesCommand)({ Filters: [ { Name: 'key-name', Values: ['factiii-' + projectName] }, { Name: 'instance-state-name', Values: ['running'] }, @@ -707,7 +706,7 @@ export async function sshExec( if (instId) { const ec2 = getEC2Client(region); - const instDesc = await ec2.send(new DescribeInstancesCommand({ InstanceIds: [instId] })); + const instDesc = await ec2.send(new (ec2Sdk().DescribeInstancesCommand)({ InstanceIds: [instId] })); const inst = instDesc.Reservations?.[0]?.Instances?.[0]; const az = inst?.Placement?.AvailabilityZone; const connectIp = (await findInstancePublicIp(projectName, region)) ?? inst?.PublicIpAddress; @@ -721,7 +720,7 @@ export async function sshExec( if (fs.existsSync(pubPath)) { const pubKey = fs.readFileSync(pubPath, 'utf8').trim(); const eic = getEC2ICClient(region); - const pushResult = await eic.send(new SendSSHPublicKeyCommand({ + const pushResult = await eic.send(new (ec2IcSdk().SendSSHPublicKeyCommand)({ InstanceId: instId, InstanceOSUser: user, SSHPublicKey: pubKey, AvailabilityZone: az, })); From 5424ce56c30536801620265ea0d7268ac5590ee9 Mon Sep 17 00:00:00 2001 From: jsnyder10 Date: Fri, 4 Sep 2026 16:47:08 -0500 Subject: [PATCH 3/3] chore(auth): add the changeset for the zod 4 build MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Covers a25c537, which dropped the zod override that was forcing zod 3 into the auth build. Patch, not minor: peerDependencies has always declared ">=4.3.6 <5", so a consumer on the declared zod 4 sees a fix rather than a break. Verified in all three consumers before release. link3d and factiii pass unchanged. Chop-Shop needed a zod 4 migration of its own, since it ran zod 3.24.1 with a zodv4 alias only for the auth schema extensions — that combination already fails on the published 0.20.1, so this release does not regress it. --- .changeset/olive-pandas-repeat.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .changeset/olive-pandas-repeat.md diff --git a/.changeset/olive-pandas-repeat.md b/.changeset/olive-pandas-repeat.md new file mode 100644 index 0000000..73e1f7c --- /dev/null +++ b/.changeset/olive-pandas-repeat.md @@ -0,0 +1,24 @@ +--- +'@factiii/auth': patch +--- + +Build against zod 4, so the emitted types match the declared peer range. + +`peerDependencies` has always said `zod >=4.3.6 <5`, but a `zod: 3.25.76` +override in the workspace forced zod 3 into the build. The package compiled and +tested green while emitting zod 3 shapes — `z.ZodObject<..., "strip", +z.ZodTypeAny, ...>` — into the published `.d.ts`, which do not typecheck for a +consumer on zod 4. + +`validators.ts`, `types/hooks.ts` and `procedures/passkey.ts` imported +`AnyZodObject`, which zod 3 exported and zod 4 removed. `src/types/zod.ts` now +defines the zod 4 equivalent, the override is gone, and auth builds against zod +4.5.4 with a clean `.d.ts`. + +Consumers already on the declared zod 4 get a fix. A consumer whose `zod` +resolves to v3 was outside the peer range already and needs to move to zod 4 — +`createAuthRouter` throws `merging._def.shape is not a function` at startup when +it merges `schemaExtensions` built by a different zod major. + +Also drops the unused `better-sqlite3` dependency, its adapter and its types, +which removes a native build step from install.