diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 000000000..907fe7cd1 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,125 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Build & Development Commands + +```bash +# Install dependencies +pnpm install + +# Build all packages +pnpm build + +# Build all packages (dev mode - faster, no optimizations) +pnpm build:dev + +# Lint all packages (auto-fix enabled) +pnpm lint + +# Clean build artifacts +pnpm clean + +# Update dependencies interactively +pnpm deps +``` + +### Per-Package Commands + +Navigate to any package directory (e.g., `cd pgpm/cli`) and run: + +```bash +pnpm build # Build the package +pnpm lint # Lint with auto-fix +pnpm test # Run tests +pnpm test:watch # Run tests in watch mode +pnpm dev # Run in development mode (where available) +``` + +### Running a Single Test File + +```bash +cd packages/cli +pnpm test -- path/to/test.test.ts +# or with pattern matching: +pnpm test -- --testNamePattern="test name pattern" +``` + +## Project Architecture + +This is a **pnpm monorepo** using Lerna for versioning/publishing. The workspace is organized into domain-specific directories: + +### Core Package Groups + +| Directory | Purpose | +|-----------|---------| +| `pgpm/` | PostgreSQL Package Manager - CLI, core engine, types | +| `graphql/` | GraphQL layer - server, codegen, React hooks, testing | +| `graphile/` | PostGraphile plugins - filters, i18n, meta-schema, PostGIS | +| `postgres/` | PostgreSQL utilities - introspection, testing, seeding, AST | +| `packages/` | Shared utilities - CLI, ORM, query builder | +| `uploads/` | File streaming - S3, ETags, content-type detection | +| `jobs/` | Job scheduling and worker infrastructure | + +### Key Packages + +**pgpm (PostgreSQL Package Manager)** +- `pgpm/cli` - Main CLI tool (`pgpm` command) +- `pgpm/core` - Migration engine, dependency resolution, deployment + +**GraphQL Stack** +- `graphql/server` - Express + PostGraphile API server +- `graphql/codegen` - SDK generator (React Query hooks or Prisma-like ORM) +- `graphql/query` - Fluent GraphQL query builder + +**Testing Infrastructure** +- `postgres/pgsql-test` - Isolated PostgreSQL test environments with transaction rollback +- `graphile/graphile-test` - GraphQL testing utilities + +### Testing Pattern + +Tests use `pgsql-test` for database testing with per-test transaction rollback: + +```typescript +import { getConnections } from 'pgsql-test'; + +let db, teardown; + +beforeAll(async () => { + ({ db, teardown } = await getConnections()); +}); + +beforeEach(() => db.beforeEach()); +afterEach(() => db.afterEach()); +afterAll(() => teardown()); + +test('example', async () => { + db.setContext({ role: 'authenticated', 'jwt.claims.user_id': '123' }); + const result = await db.query('SELECT current_user_id()'); + expect(result.rows[0].current_user_id).toBe('123'); +}); +``` + +### Database Configuration + +Tests require PostgreSQL. Standard PG environment variables: +- `PGHOST` (default: localhost) +- `PGPORT` (default: 5432) +- `PGUSER` (default: postgres) +- `PGPASSWORD` (default: password) + +For S3/MinIO tests: `MINIO_ENDPOINT`, `AWS_ACCESS_KEY`, `AWS_SECRET_KEY`, `AWS_REGION` + +### Build System + +- Uses `makage` for TypeScript compilation (handles both CJS and ESM output) +- Jest with ts-jest for testing +- ESLint with TypeScript support +- Each package has its own `tsconfig.json` extending root config + +### Code Conventions + +- TypeScript with `strict: true` (but `strictNullChecks: false`) +- Target: ES2022, Module: CommonJS +- Packages publish to npm from `dist/` directory +- Workspace dependencies use `workspace:^` protocol diff --git a/graphql/codegen/README.md b/graphql/codegen/README.md index 95f5d54d1..d88cf7ad1 100644 --- a/graphql/codegen/README.md +++ b/graphql/codegen/README.md @@ -837,12 +837,12 @@ import { useCreateCarMutation, useCarsQuery } from './generated/hooks'; function CreateCarWithInvalidation() { const queryClient = useQueryClient(); - + const createCar = useCreateCarMutation({ onSuccess: () => { // Invalidate all car queries to refetch queryClient.invalidateQueries({ queryKey: ['cars'] }); - + // Or invalidate specific queries queryClient.invalidateQueries({ queryKey: ['cars', { first: 10 }] }); }, @@ -852,6 +852,151 @@ function CreateCarWithInvalidation() { } ``` +### Centralized Query Keys + +The codegen generates a centralized query key factory following the [lukemorales query-key-factory](https://tanstack.com/query/docs/framework/react/community/lukemorales-query-key-factory) pattern. This provides type-safe cache management with autocomplete support. + +#### Generated Files + +| File | Purpose | +|------|---------| +| `query-keys.ts` | Query key factories for all entities | +| `mutation-keys.ts` | Mutation key factories for tracking in-flight mutations | +| `invalidation.ts` | Type-safe cache invalidation helpers | + +#### Using Query Keys + +```tsx +import { userKeys, invalidate } from './generated/hooks'; +import { useQueryClient } from '@tanstack/react-query'; + +// Query key structure +userKeys.all // ['user'] +userKeys.lists() // ['user', 'list'] +userKeys.list({ first: 10 }) // ['user', 'list', { first: 10 }] +userKeys.details() // ['user', 'detail'] +userKeys.detail('user-123') // ['user', 'detail', 'user-123'] + +// Granular cache invalidation +const queryClient = useQueryClient(); + +// Invalidate ALL user queries +queryClient.invalidateQueries({ queryKey: userKeys.all }); + +// Invalidate only list queries +queryClient.invalidateQueries({ queryKey: userKeys.lists() }); + +// Invalidate a specific user +queryClient.invalidateQueries({ queryKey: userKeys.detail(userId) }); +``` + +#### Invalidation Helpers + +Type-safe invalidation utilities: + +```tsx +import { invalidate, remove } from './generated/hooks'; + +// Invalidate queries (triggers refetch) +invalidate.user.all(queryClient); +invalidate.user.lists(queryClient); +invalidate.user.detail(queryClient, userId); + +// Remove from cache (for delete operations) +remove.user(queryClient, userId); +``` + +#### Mutation Key Tracking + +Track in-flight mutations with `useIsMutating`: + +```tsx +import { useIsMutating } from '@tanstack/react-query'; +import { userMutationKeys } from './generated/hooks'; + +function UserList() { + // Check if any user mutations are in progress + const isMutating = useIsMutating({ mutationKey: userMutationKeys.all }); + + // Check if a specific user is being deleted + const isDeleting = useIsMutating({ + mutationKey: userMutationKeys.delete(userId) + }); + + return ( +
+ {isMutating > 0 && } + +
+ ); +} +``` + +#### Optimistic Updates with Query Keys + +```tsx +import { useCreateUserMutation, userKeys } from './generated/hooks'; + +const createUser = useCreateUserMutation({ + onMutate: async (newUser) => { + // Cancel outgoing refetches + await queryClient.cancelQueries({ queryKey: userKeys.lists() }); + + // Snapshot previous value + const previous = queryClient.getQueryData(userKeys.list()); + + // Optimistically update cache + queryClient.setQueryData(userKeys.list(), (old) => ({ + ...old, + users: { + ...old.users, + nodes: [...old.users.nodes, { id: 'temp', ...newUser.input.user }] + }, + })); + + return { previous }; + }, + onError: (err, variables, context) => { + // Rollback on error + queryClient.setQueryData(userKeys.list(), context.previous); + }, + onSettled: () => { + // Refetch after mutation + queryClient.invalidateQueries({ queryKey: userKeys.lists() }); + }, +}); +``` + +#### Configuration + +Query key generation is enabled by default. Configure in your config file: + +```typescript +// graphql-sdk.config.ts +export default defineConfig({ + endpoint: 'https://api.example.com/graphql', + + queryKeys: { + // Generate scope-aware keys (default: true) + generateScopedKeys: true, + + // Generate mutation keys (default: true) + generateMutationKeys: true, + + // Generate invalidation helpers (default: true) + generateCascadeHelpers: true, + + // Define entity relationships for cascade invalidation + relationships: { + table: { parent: 'database', foreignKey: 'databaseId' }, + field: { parent: 'table', foreignKey: 'tableId' }, + }, + }, +}); +``` + +For detailed documentation on query key factory design and implementation, see [docs/QUERY-KEY-FACTORY.md](./docs/QUERY-KEY-FACTORY.md). + ### Prefetching ```tsx diff --git a/graphql/codegen/docs/QUERY-KEY-FACTORY.md b/graphql/codegen/docs/QUERY-KEY-FACTORY.md new file mode 100644 index 000000000..390927bdf --- /dev/null +++ b/graphql/codegen/docs/QUERY-KEY-FACTORY.md @@ -0,0 +1,420 @@ +# Query Key Factory Design Document + +This document describes the centralized query key factory feature for `@constructive-io/graphql-codegen`, following the [lukemorales query-key-factory](https://tanstack.com/query/docs/framework/react/community/lukemorales-query-key-factory) pattern. + +## Overview + +The query key factory provides: + +- **Centralized query keys** - Single source of truth for all React Query cache keys +- **Type-safe key access** - Full TypeScript autocomplete support +- **Hierarchical invalidation** - Invalidate all queries for an entity with one call +- **Mutation key tracking** - Track in-flight mutations for optimistic updates +- **Cache invalidation helpers** - Type-safe utilities for cache management + +## Generated Files + +When `queryKeys.generateScopedKeys` is enabled (default), the following files are generated: + +| File | Purpose | +|------|---------| +| `query-keys.ts` | Centralized query key factories for all entities | +| `mutation-keys.ts` | Mutation key factories for tracking mutations | +| `invalidation.ts` | Type-safe cache invalidation helpers | + +## Architecture + +### Query Key Structure + +Query keys follow a hierarchical pattern: + +```typescript +// Entity key factory +export const userKeys = { + all: ['user'] as const, + lists: () => [...userKeys.all, 'list'] as const, + list: (variables?: object) => [...userKeys.lists(), variables] as const, + details: () => [...userKeys.all, 'detail'] as const, + detail: (id: string | number) => [...userKeys.details(), id] as const, +} as const; +``` + +This enables granular cache invalidation: + +```typescript +// Invalidate ALL user queries +queryClient.invalidateQueries({ queryKey: userKeys.all }); + +// Invalidate only user list queries +queryClient.invalidateQueries({ queryKey: userKeys.lists() }); + +// Invalidate a specific user +queryClient.invalidateQueries({ queryKey: userKeys.detail(userId) }); +``` + +### Mutation Key Structure + +Mutation keys track in-flight mutations: + +```typescript +export const userMutationKeys = { + all: ['mutation', 'user'] as const, + create: () => ['mutation', 'user', 'create'] as const, + update: (id: string | number) => ['mutation', 'user', 'update', id] as const, + delete: (id: string | number) => ['mutation', 'user', 'delete', id] as const, +} as const; +``` + +Usage with `useIsMutating`: + +```typescript +import { useIsMutating } from '@tanstack/react-query'; + +// Check if any user mutations are in progress +const isMutating = useIsMutating({ mutationKey: userMutationKeys.all }); + +// Check if a specific user is being updated +const isUpdating = useIsMutating({ mutationKey: userMutationKeys.update(userId) }); +``` + +### Invalidation Helpers + +Type-safe cache invalidation utilities: + +```typescript +export const invalidate = { + user: { + all: (queryClient: QueryClient) => + queryClient.invalidateQueries({ queryKey: userKeys.all }), + lists: (queryClient: QueryClient) => + queryClient.invalidateQueries({ queryKey: userKeys.lists() }), + detail: (queryClient: QueryClient, id: string | number) => + queryClient.invalidateQueries({ queryKey: userKeys.detail(id) }), + }, +}; + +// Usage +invalidate.user.all(queryClient); +invalidate.user.detail(queryClient, userId); +``` + +## Configuration + +### Config Options + +```typescript +// graphql-codegen.config.ts +export default defineConfig({ + queryKeys: { + // Key structure style (default: 'hierarchical') + style: 'hierarchical', + + // Entity relationships for cascade invalidation + relationships: { + table: { parent: 'database', foreignKey: 'databaseId' }, + field: { parent: 'table', foreignKey: 'tableId' }, + }, + + // Generate scope-aware keys (default: true) + generateScopedKeys: true, + + // Generate cascade invalidation helpers (default: true) + generateCascadeHelpers: true, + + // Generate mutation keys (default: true) + generateMutationKeys: true, + }, +}); +``` + +### Relationship Configuration + +For parent-child entity relationships, configure the `relationships` option to enable scoped queries and cascade invalidation: + +```typescript +relationships: { + // Child entity -> parent relationship + database: { parent: 'organization', foreignKey: 'organizationId' }, + table: { parent: 'database', foreignKey: 'databaseId' }, + field: { + parent: 'table', + foreignKey: 'tableId', + ancestors: ['database', 'organization'], // For deep cascade + }, +} +``` + +This generates scoped key factories: + +```typescript +export const tableKeys = { + all: ['table'] as const, + + // Scoped by parent + byDatabase: (databaseId: string) => ['table', { databaseId }] as const, + + // Scope-aware helpers + lists: (scope?: TableScope) => [...tableKeys.scoped(scope), 'list'] as const, + detail: (id: string | number, scope?: TableScope) => + [...tableKeys.details(scope), id] as const, +} as const; +``` + +## Hook Integration + +Generated hooks automatically use centralized keys: + +```typescript +// Generated useUsersQuery hook +export function useUsersQuery(variables?: UsersQueryVariables, options?: ...) { + return useQuery({ + queryKey: userKeys.list(variables), // Uses centralized key + queryFn: () => execute(...), + ...options, + }); +} + +// Generated useCreateUserMutation hook +export function useCreateUserMutation(options?: ...) { + const queryClient = useQueryClient(); + + return useMutation({ + mutationKey: userMutationKeys.all, // Uses centralized key + mutationFn: (variables) => execute(...), + onSuccess: () => { + // Auto-invalidates list queries + queryClient.invalidateQueries({ queryKey: userKeys.lists() }); + }, + ...options, + }); +} +``` + +## Type Design Decisions + +### Variables Type: `object` vs `Record` + +Query key functions use `object` for variables: + +```typescript +list: (variables?: object) => [...userKeys.lists(), variables] as const, +``` + +**Why not `Record`?** + +TypeScript interfaces don't satisfy `Record` because they lack an index signature: + +```typescript +interface UserFilter { name?: string; } + +// Error: Index signature missing +const fn = (vars: Record) => {}; +fn({ name: 'test' } as UserFilter); // Type error! + +// Works with 'object' +const fn2 = (vars: object) => {}; +fn2({ name: 'test' } as UserFilter); // OK +``` + +### ID Type: `string | number` + +Detail key functions accept both string and number IDs: + +```typescript +detail: (id: string | number) => [...userKeys.details(), id] as const, +``` + +This supports both UUID primary keys (`string`) and serial/integer primary keys (`number`). + +### Mutation Keys: Static vs Dynamic + +Mutation hooks use static keys (`mutationKeys.all`) rather than per-mutation keys: + +```typescript +// Generated hook uses static key +return useMutation({ + mutationKey: userMutationKeys.all, // Not: userMutationKeys.create() + mutationFn: (variables) => execute(...), +}); +``` + +**Why?** + +React Query's `mutationKey` is evaluated when `useMutation` is called, not per-mutation. The `variables` parameter is only available inside `mutationFn`, so dynamic keys like `mutationKeys.delete(variables.id)` would fail. + +Users who need per-mutation tracking can: +1. Use `onMutate` callbacks to track specific mutations +2. Override `mutationKey` in options when calling the hook + +## Scalar Type Handling + +### Why Hardcoded Mappings? + +GraphQL introspection only provides scalar **names**, not TypeScript type mappings: + +```json +{ + "kind": "SCALAR", + "name": "UUID", + "description": "A universally unique identifier as defined by RFC 4122." +} +``` + +There's no field indicating `UUID` → `string` or `JSON` → `unknown`. The GraphQL spec leaves scalar implementation to the server. + +### Current Approach + +Scalars are mapped in `src/cli/codegen/scalars.ts`: + +```typescript +export const SCALAR_TS_MAP: Record = { + // Standard GraphQL + String: 'string', + Int: 'number', + Float: 'number', + Boolean: 'boolean', + ID: 'string', + + // PostGraphile + UUID: 'string', + Datetime: 'string', + JSON: 'unknown', + BigInt: 'string', + + // Geometry (PostGIS) + GeoJSON: 'unknown', + GeometryPoint: 'unknown', + + // ... more scalars +}; +``` + +Unknown scalars default to `unknown` (type-safe fallback). + +### Adding Custom Scalars + +To add a new scalar, update `SCALAR_TS_MAP` in `scalars.ts`: + +```typescript +// Add custom scalar mapping +MyCustomScalar: 'string', +GeometryPolygon: '{ type: string; coordinates: number[][] }', +``` + +## File Structure + +``` +generated/ +├── index.ts # Main barrel export +├── client.ts # GraphQL client with configure() and execute() +├── types.ts # Entity interfaces and filter types +├── schema-types.ts # Input/payload/enum types from schema +├── query-keys.ts # Centralized query key factories +├── mutation-keys.ts # Mutation key factories +├── invalidation.ts # Cache invalidation helpers +├── queries/ +│ ├── index.ts # Query hooks barrel +│ ├── useUsersQuery.ts # List query hook +│ ├── useUserQuery.ts # Single item query hook +│ └── ... +└── mutations/ + ├── index.ts # Mutation hooks barrel + ├── useCreateUserMutation.ts + ├── useUpdateUserMutation.ts + ├── useDeleteUserMutation.ts + └── ... +``` + +## Usage Examples + +### Basic Query with Cache Key + +```typescript +import { useUsersQuery, userKeys } from './generated'; + +function UserList() { + const { data } = useUsersQuery({ first: 10 }); + + // Manual cache access using same key + const cachedData = queryClient.getQueryData(userKeys.list({ first: 10 })); +} +``` + +### Prefetching + +```typescript +import { prefetchUsersQuery, userKeys } from './generated'; + +// In a route loader or server component +await prefetchUsersQuery(queryClient, { first: 10 }); +``` + +### Optimistic Updates + +```typescript +import { useCreateUserMutation, userKeys } from './generated'; + +const mutation = useCreateUserMutation({ + onMutate: async (newUser) => { + // Cancel outgoing refetches + await queryClient.cancelQueries({ queryKey: userKeys.lists() }); + + // Snapshot previous value + const previous = queryClient.getQueryData(userKeys.list()); + + // Optimistically update + queryClient.setQueryData(userKeys.list(), (old) => ({ + ...old, + users: { ...old.users, nodes: [...old.users.nodes, newUser] }, + })); + + return { previous }; + }, + onError: (err, variables, context) => { + // Rollback on error + queryClient.setQueryData(userKeys.list(), context.previous); + }, +}); +``` + +### Cascade Invalidation (with relationships configured) + +```typescript +import { invalidate, tableKeys } from './generated'; + +// When a database is updated, invalidate all its tables +function onDatabaseUpdate(databaseId: string) { + // Invalidate tables scoped to this database + queryClient.invalidateQueries({ + queryKey: tableKeys.byDatabase(databaseId) + }); +} +``` + +## Implementation Files + +| Source File | Purpose | +|-------------|---------| +| `src/cli/codegen/query-keys.ts` | Query key factory generator | +| `src/cli/codegen/mutation-keys.ts` | Mutation key factory generator | +| `src/cli/codegen/invalidation.ts` | Invalidation helpers generator | +| `src/cli/codegen/queries.ts` | Query hook generator (uses centralized keys) | +| `src/cli/codegen/mutations.ts` | Mutation hook generator (uses centralized keys) | +| `src/cli/codegen/scalars.ts` | Scalar type mappings | +| `src/types/config.ts` | Configuration types (`QueryKeyConfig`) | + +## Testing + +Run the test suite: + +```bash +pnpm test +``` + +Generate example SDK and verify TypeScript: + +```bash +pnpm example:codegen:sdk +cd examples/output/generated-sdk +npx tsc --noEmit +``` diff --git a/graphql/codegen/examples/react-query-sdk.ts b/graphql/codegen/examples/react-query-sdk.ts index 48c66780d..e13a7ee07 100644 --- a/graphql/codegen/examples/react-query-sdk.ts +++ b/graphql/codegen/examples/react-query-sdk.ts @@ -183,7 +183,7 @@ async function main() { TablesQueryResult, TablesQueryVariables >(tablesQueryDocument, { - first: 5, + first: 10, filter: tableFilter, orderBy: ['NAME_ASC'], }); diff --git a/graphql/codegen/package.json b/graphql/codegen/package.json index 39ee1421e..ce147cc23 100644 --- a/graphql/codegen/package.json +++ b/graphql/codegen/package.json @@ -49,14 +49,15 @@ "example:orm": "tsx examples/orm-sdk.ts" }, "dependencies": { + "@babel/generator": "^7.28.5", + "@babel/types": "^7.28.5", "ajv": "^8.17.1", "commander": "^12.1.0", "gql-ast": "workspace:^", "graphql": "15.10.1", "inflekt": "^0.2.0", "jiti": "^2.6.1", - "prettier": "^3.7.4", - "ts-morph": "^27.0.2" + "prettier": "^3.7.4" }, "peerDependencies": { "@tanstack/react-query": "^5.0.0", @@ -72,6 +73,7 @@ }, "devDependencies": { "@tanstack/react-query": "^5.90.16", + "@types/babel__generator": "^7.27.0", "@types/jest": "^29.5.14", "@types/node": "^20.19.27", "@types/react": "^19.2.7", diff --git a/graphql/codegen/src/__tests__/codegen/__snapshots__/input-types-generator.test.ts.snap b/graphql/codegen/src/__tests__/codegen/__snapshots__/input-types-generator.test.ts.snap index 4f4fac804..f0d630e95 100644 --- a/graphql/codegen/src/__tests__/codegen/__snapshots__/input-types-generator.test.ts.snap +++ b/graphql/codegen/src/__tests__/codegen/__snapshots__/input-types-generator.test.ts.snap @@ -2,15 +2,11 @@ exports[`generateInputTypesFile generates complete types file for multiple tables with relations 1`] = ` "/** -* GraphQL types for ORM client -* @generated by @constructive-io/graphql-codegen -* DO NOT EDIT - changes will be overwritten -*/ - -// ============================================================================ -// Scalar Filter Types -// ============================================================================ - + * GraphQL types for ORM client + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ +// ============ Scalar Filter Types ============ export interface StringFilter { isNull?: boolean; equalTo?: string; @@ -40,7 +36,6 @@ export interface StringFilter { likeInsensitive?: string; notLikeInsensitive?: string; } - export interface IntFilter { isNull?: boolean; equalTo?: number; @@ -54,7 +49,6 @@ export interface IntFilter { greaterThan?: number; greaterThanOrEqualTo?: number; } - export interface FloatFilter { isNull?: boolean; equalTo?: number; @@ -68,13 +62,11 @@ export interface FloatFilter { greaterThan?: number; greaterThanOrEqualTo?: number; } - export interface BooleanFilter { isNull?: boolean; equalTo?: boolean; notEqualTo?: boolean; } - export interface UUIDFilter { isNull?: boolean; equalTo?: string; @@ -84,7 +76,6 @@ export interface UUIDFilter { in?: string[]; notIn?: string[]; } - export interface DatetimeFilter { isNull?: boolean; equalTo?: string; @@ -98,7 +89,6 @@ export interface DatetimeFilter { greaterThan?: string; greaterThanOrEqualTo?: string; } - export interface DateFilter { isNull?: boolean; equalTo?: string; @@ -112,7 +102,6 @@ export interface DateFilter { greaterThan?: string; greaterThanOrEqualTo?: string; } - export interface JSONFilter { isNull?: boolean; equalTo?: Record; @@ -125,7 +114,6 @@ export interface JSONFilter { containsAllKeys?: string[]; containsAnyKeys?: string[]; } - export interface BigIntFilter { isNull?: boolean; equalTo?: string; @@ -139,7 +127,6 @@ export interface BigIntFilter { greaterThan?: string; greaterThanOrEqualTo?: string; } - export interface BigFloatFilter { isNull?: boolean; equalTo?: string; @@ -153,13 +140,11 @@ export interface BigFloatFilter { greaterThan?: string; greaterThanOrEqualTo?: string; } - export interface BitStringFilter { isNull?: boolean; equalTo?: string; notEqualTo?: string; } - export interface InternetAddressFilter { isNull?: boolean; equalTo?: string; @@ -178,15 +163,10 @@ export interface InternetAddressFilter { containedByOrEqualTo?: string; containsOrContainedBy?: string; } - export interface FullTextFilter { matches?: string; } - -// ============================================================================ -// Entity Types -// ============================================================================ - +// ============ Entity Types ============ export interface User { id: string; email?: string | null; @@ -196,7 +176,6 @@ export interface User { createdAt?: string | null; metadata?: Record | null; } - export interface Post { id: string; title?: string | null; @@ -205,7 +184,6 @@ export interface Post { publishedAt?: string | null; tags?: string | null; } - export interface Comment { id: string; body?: string | null; @@ -213,57 +191,36 @@ export interface Comment { authorId?: string | null; createdAt?: string | null; } - -// ============================================================================ -// Relation Helper Types -// ============================================================================ - +// ============ Relation Helper Types ============ export interface ConnectionResult { nodes: T[]; totalCount: number; pageInfo: PageInfo; } - export interface PageInfo { hasNextPage: boolean; hasPreviousPage: boolean; startCursor?: string | null; endCursor?: string | null; } - -// ============================================================================ -// Entity Relation Types -// ============================================================================ - +// ============ Entity Relation Types ============ export interface UserRelations { posts?: ConnectionResult; comments?: ConnectionResult; } - export interface PostRelations { author?: User | null; comments?: ConnectionResult; } - export interface CommentRelations { post?: Post | null; author?: User | null; } - -// ============================================================================ -// Entity Types With Relations -// ============================================================================ - +// ============ Entity Types With Relations ============ export type UserWithRelations = User & UserRelations; - export type PostWithRelations = Post & PostRelations; - export type CommentWithRelations = Comment & CommentRelations; - -// ============================================================================ -// Entity Select Types -// ============================================================================ - +// ============ Entity Select Types ============ export type UserSelect = { id?: boolean; email?: boolean; @@ -273,19 +230,18 @@ export type UserSelect = { createdAt?: boolean; metadata?: boolean; posts?: boolean | { - select?: PostSelect; - first?: number; - filter?: PostFilter; - orderBy?: PostsOrderBy[]; + select?: PostSelect; + first?: number; + filter?: PostFilter; + orderBy?: PostsOrderBy[]; }; comments?: boolean | { - select?: CommentSelect; - first?: number; - filter?: CommentFilter; - orderBy?: CommentsOrderBy[]; - }; + select?: CommentSelect; + first?: number; + filter?: CommentFilter; + orderBy?: CommentsOrderBy[]; }; - +}; export type PostSelect = { id?: boolean; title?: boolean; @@ -293,29 +249,30 @@ export type PostSelect = { authorId?: boolean; publishedAt?: boolean; tags?: boolean; - author?: boolean | { select?: UserSelect }; - comments?: boolean | { - select?: CommentSelect; - first?: number; - filter?: CommentFilter; - orderBy?: CommentsOrderBy[]; + author?: boolean | { + select?: UserSelect; }; + comments?: boolean | { + select?: CommentSelect; + first?: number; + filter?: CommentFilter; + orderBy?: CommentsOrderBy[]; }; - +}; export type CommentSelect = { id?: boolean; body?: boolean; postId?: boolean; authorId?: boolean; createdAt?: boolean; - post?: boolean | { select?: PostSelect }; - author?: boolean | { select?: UserSelect }; + post?: boolean | { + select?: PostSelect; }; - -// ============================================================================ -// Table Filter Types -// ============================================================================ - + author?: boolean | { + select?: UserSelect; + }; +}; +// ============ Table Filter Types ============ export interface UserFilter { id?: UUIDFilter; email?: StringFilter; @@ -328,7 +285,6 @@ export interface UserFilter { or?: UserFilter[]; not?: UserFilter; } - export interface PostFilter { id?: UUIDFilter; title?: StringFilter; @@ -340,7 +296,6 @@ export interface PostFilter { or?: PostFilter[]; not?: PostFilter; } - export interface CommentFilter { id?: UUIDFilter; body?: StringFilter; @@ -351,11 +306,7 @@ export interface CommentFilter { or?: CommentFilter[]; not?: CommentFilter; } - -// ============================================================================ -// Table Condition Types -// ============================================================================ - +// ============ Table Condition Types ============ export interface UserCondition { id?: string | null; email?: string | null; @@ -365,7 +316,6 @@ export interface UserCondition { createdAt?: string | null; metadata?: unknown | null; } - export interface PostCondition { id?: string | null; title?: string | null; @@ -374,7 +324,6 @@ export interface PostCondition { publishedAt?: string | null; tags?: string | null; } - export interface CommentCondition { id?: string | null; body?: string | null; @@ -382,21 +331,11 @@ export interface CommentCondition { authorId?: string | null; createdAt?: string | null; } - -// ============================================================================ -// OrderBy Types -// ============================================================================ - -export type UsersOrderBy = 'PRIMARY_KEY_ASC' | 'PRIMARY_KEY_DESC' | 'NATURAL' | 'ID_ASC' | 'ID_DESC' | 'EMAIL_ASC' | 'EMAIL_DESC' | 'NAME_ASC' | 'NAME_DESC' | 'AGE_ASC' | 'AGE_DESC' | 'IS_ACTIVE_ASC' | 'IS_ACTIVE_DESC' | 'CREATED_AT_ASC' | 'CREATED_AT_DESC' | 'METADATA_ASC' | 'METADATA_DESC'; - -export type PostsOrderBy = 'PRIMARY_KEY_ASC' | 'PRIMARY_KEY_DESC' | 'NATURAL' | 'ID_ASC' | 'ID_DESC' | 'TITLE_ASC' | 'TITLE_DESC' | 'CONTENT_ASC' | 'CONTENT_DESC' | 'AUTHOR_ID_ASC' | 'AUTHOR_ID_DESC' | 'PUBLISHED_AT_ASC' | 'PUBLISHED_AT_DESC' | 'TAGS_ASC' | 'TAGS_DESC'; - -export type CommentsOrderBy = 'PRIMARY_KEY_ASC' | 'PRIMARY_KEY_DESC' | 'NATURAL' | 'ID_ASC' | 'ID_DESC' | 'BODY_ASC' | 'BODY_DESC' | 'POST_ID_ASC' | 'POST_ID_DESC' | 'AUTHOR_ID_ASC' | 'AUTHOR_ID_DESC' | 'CREATED_AT_ASC' | 'CREATED_AT_DESC'; - -// ============================================================================ -// CRUD Input Types -// ============================================================================ - +// ============ OrderBy Types ============ +export type UsersOrderBy = "PRIMARY_KEY_ASC" | "PRIMARY_KEY_DESC" | "NATURAL" | "ID_ASC" | "ID_DESC" | "EMAIL_ASC" | "EMAIL_DESC" | "NAME_ASC" | "NAME_DESC" | "AGE_ASC" | "AGE_DESC" | "IS_ACTIVE_ASC" | "IS_ACTIVE_DESC" | "CREATED_AT_ASC" | "CREATED_AT_DESC" | "METADATA_ASC" | "METADATA_DESC"; +export type PostsOrderBy = "PRIMARY_KEY_ASC" | "PRIMARY_KEY_DESC" | "NATURAL" | "ID_ASC" | "ID_DESC" | "TITLE_ASC" | "TITLE_DESC" | "CONTENT_ASC" | "CONTENT_DESC" | "AUTHOR_ID_ASC" | "AUTHOR_ID_DESC" | "PUBLISHED_AT_ASC" | "PUBLISHED_AT_DESC" | "TAGS_ASC" | "TAGS_DESC"; +export type CommentsOrderBy = "PRIMARY_KEY_ASC" | "PRIMARY_KEY_DESC" | "NATURAL" | "ID_ASC" | "ID_DESC" | "BODY_ASC" | "BODY_DESC" | "POST_ID_ASC" | "POST_ID_DESC" | "AUTHOR_ID_ASC" | "AUTHOR_ID_DESC" | "CREATED_AT_ASC" | "CREATED_AT_DESC"; +// ============ CRUD Input Types ============ export interface CreateUserInput { clientMutationId?: string; user: { @@ -407,7 +346,6 @@ export interface CreateUserInput { metadata?: Record; }; } - export interface UserPatch { email?: string | null; name?: string | null; @@ -415,18 +353,15 @@ export interface UserPatch { isActive?: boolean | null; metadata?: Record | null; } - export interface UpdateUserInput { clientMutationId?: string; id: string; patch: UserPatch; } - export interface DeleteUserInput { clientMutationId?: string; id: string; } - export interface CreatePostInput { clientMutationId?: string; post: { @@ -437,7 +372,6 @@ export interface CreatePostInput { tags?: string; }; } - export interface PostPatch { title?: string | null; content?: string | null; @@ -445,18 +379,15 @@ export interface PostPatch { publishedAt?: string | null; tags?: string | null; } - export interface UpdatePostInput { clientMutationId?: string; id: string; patch: PostPatch; } - export interface DeletePostInput { clientMutationId?: string; id: string; } - export interface CreateCommentInput { clientMutationId?: string; comment: { @@ -465,41 +396,29 @@ export interface CreateCommentInput { authorId: string; }; } - export interface CommentPatch { body?: string | null; postId?: string | null; authorId?: string | null; } - export interface UpdateCommentInput { clientMutationId?: string; id: string; patch: CommentPatch; } - export interface DeleteCommentInput { clientMutationId?: string; id: string; -} - -// ============================================================================ -// Custom Input Types (from schema) -// ============================================================================ -" +}" `; exports[`generateInputTypesFile generates complete types file for single table 1`] = ` "/** -* GraphQL types for ORM client -* @generated by @constructive-io/graphql-codegen -* DO NOT EDIT - changes will be overwritten -*/ - -// ============================================================================ -// Scalar Filter Types -// ============================================================================ - + * GraphQL types for ORM client + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ +// ============ Scalar Filter Types ============ export interface StringFilter { isNull?: boolean; equalTo?: string; @@ -529,7 +448,6 @@ export interface StringFilter { likeInsensitive?: string; notLikeInsensitive?: string; } - export interface IntFilter { isNull?: boolean; equalTo?: number; @@ -543,7 +461,6 @@ export interface IntFilter { greaterThan?: number; greaterThanOrEqualTo?: number; } - export interface FloatFilter { isNull?: boolean; equalTo?: number; @@ -557,13 +474,11 @@ export interface FloatFilter { greaterThan?: number; greaterThanOrEqualTo?: number; } - export interface BooleanFilter { isNull?: boolean; equalTo?: boolean; notEqualTo?: boolean; } - export interface UUIDFilter { isNull?: boolean; equalTo?: string; @@ -573,7 +488,6 @@ export interface UUIDFilter { in?: string[]; notIn?: string[]; } - export interface DatetimeFilter { isNull?: boolean; equalTo?: string; @@ -587,7 +501,6 @@ export interface DatetimeFilter { greaterThan?: string; greaterThanOrEqualTo?: string; } - export interface DateFilter { isNull?: boolean; equalTo?: string; @@ -601,7 +514,6 @@ export interface DateFilter { greaterThan?: string; greaterThanOrEqualTo?: string; } - export interface JSONFilter { isNull?: boolean; equalTo?: Record; @@ -614,7 +526,6 @@ export interface JSONFilter { containsAllKeys?: string[]; containsAnyKeys?: string[]; } - export interface BigIntFilter { isNull?: boolean; equalTo?: string; @@ -628,7 +539,6 @@ export interface BigIntFilter { greaterThan?: string; greaterThanOrEqualTo?: string; } - export interface BigFloatFilter { isNull?: boolean; equalTo?: string; @@ -642,13 +552,11 @@ export interface BigFloatFilter { greaterThan?: string; greaterThanOrEqualTo?: string; } - export interface BitStringFilter { isNull?: boolean; equalTo?: string; notEqualTo?: string; } - export interface InternetAddressFilter { isNull?: boolean; equalTo?: string; @@ -667,15 +575,10 @@ export interface InternetAddressFilter { containedByOrEqualTo?: string; containsOrContainedBy?: string; } - export interface FullTextFilter { matches?: string; } - -// ============================================================================ -// Entity Types -// ============================================================================ - +// ============ Entity Types ============ export interface User { id: string; email?: string | null; @@ -685,41 +588,23 @@ export interface User { createdAt?: string | null; metadata?: Record | null; } - -// ============================================================================ -// Relation Helper Types -// ============================================================================ - +// ============ Relation Helper Types ============ export interface ConnectionResult { nodes: T[]; totalCount: number; pageInfo: PageInfo; } - export interface PageInfo { hasNextPage: boolean; hasPreviousPage: boolean; startCursor?: string | null; endCursor?: string | null; } - -// ============================================================================ -// Entity Relation Types -// ============================================================================ - -export interface UserRelations { -} - -// ============================================================================ -// Entity Types With Relations -// ============================================================================ - +// ============ Entity Relation Types ============ +export interface UserRelations {} +// ============ Entity Types With Relations ============ export type UserWithRelations = User & UserRelations; - -// ============================================================================ -// Entity Select Types -// ============================================================================ - +// ============ Entity Select Types ============ export type UserSelect = { id?: boolean; email?: boolean; @@ -728,12 +613,8 @@ export type UserSelect = { isActive?: boolean; createdAt?: boolean; metadata?: boolean; - }; - -// ============================================================================ -// Table Filter Types -// ============================================================================ - +}; +// ============ Table Filter Types ============ export interface UserFilter { id?: UUIDFilter; email?: StringFilter; @@ -746,11 +627,7 @@ export interface UserFilter { or?: UserFilter[]; not?: UserFilter; } - -// ============================================================================ -// Table Condition Types -// ============================================================================ - +// ============ Table Condition Types ============ export interface UserCondition { id?: string | null; email?: string | null; @@ -760,17 +637,9 @@ export interface UserCondition { createdAt?: string | null; metadata?: unknown | null; } - -// ============================================================================ -// OrderBy Types -// ============================================================================ - -export type UsersOrderBy = 'PRIMARY_KEY_ASC' | 'PRIMARY_KEY_DESC' | 'NATURAL' | 'ID_ASC' | 'ID_DESC' | 'EMAIL_ASC' | 'EMAIL_DESC' | 'NAME_ASC' | 'NAME_DESC' | 'AGE_ASC' | 'AGE_DESC' | 'IS_ACTIVE_ASC' | 'IS_ACTIVE_DESC' | 'CREATED_AT_ASC' | 'CREATED_AT_DESC' | 'METADATA_ASC' | 'METADATA_DESC'; - -// ============================================================================ -// CRUD Input Types -// ============================================================================ - +// ============ OrderBy Types ============ +export type UsersOrderBy = "PRIMARY_KEY_ASC" | "PRIMARY_KEY_DESC" | "NATURAL" | "ID_ASC" | "ID_DESC" | "EMAIL_ASC" | "EMAIL_DESC" | "NAME_ASC" | "NAME_DESC" | "AGE_ASC" | "AGE_DESC" | "IS_ACTIVE_ASC" | "IS_ACTIVE_DESC" | "CREATED_AT_ASC" | "CREATED_AT_DESC" | "METADATA_ASC" | "METADATA_DESC"; +// ============ CRUD Input Types ============ export interface CreateUserInput { clientMutationId?: string; user: { @@ -781,7 +650,6 @@ export interface CreateUserInput { metadata?: Record; }; } - export interface UserPatch { email?: string | null; name?: string | null; @@ -789,35 +657,24 @@ export interface UserPatch { isActive?: boolean | null; metadata?: Record | null; } - export interface UpdateUserInput { clientMutationId?: string; id: string; patch: UserPatch; } - export interface DeleteUserInput { clientMutationId?: string; id: string; -} - -// ============================================================================ -// Custom Input Types (from schema) -// ============================================================================ -" +}" `; exports[`generateInputTypesFile generates custom input types from TypeRegistry 1`] = ` "/** -* GraphQL types for ORM client -* @generated by @constructive-io/graphql-codegen -* DO NOT EDIT - changes will be overwritten -*/ - -// ============================================================================ -// Scalar Filter Types -// ============================================================================ - + * GraphQL types for ORM client + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ +// ============ Scalar Filter Types ============ export interface StringFilter { isNull?: boolean; equalTo?: string; @@ -847,7 +704,6 @@ export interface StringFilter { likeInsensitive?: string; notLikeInsensitive?: string; } - export interface IntFilter { isNull?: boolean; equalTo?: number; @@ -861,7 +717,6 @@ export interface IntFilter { greaterThan?: number; greaterThanOrEqualTo?: number; } - export interface FloatFilter { isNull?: boolean; equalTo?: number; @@ -875,13 +730,11 @@ export interface FloatFilter { greaterThan?: number; greaterThanOrEqualTo?: number; } - export interface BooleanFilter { isNull?: boolean; equalTo?: boolean; notEqualTo?: boolean; } - export interface UUIDFilter { isNull?: boolean; equalTo?: string; @@ -891,7 +744,6 @@ export interface UUIDFilter { in?: string[]; notIn?: string[]; } - export interface DatetimeFilter { isNull?: boolean; equalTo?: string; @@ -905,7 +757,6 @@ export interface DatetimeFilter { greaterThan?: string; greaterThanOrEqualTo?: string; } - export interface DateFilter { isNull?: boolean; equalTo?: string; @@ -919,7 +770,6 @@ export interface DateFilter { greaterThan?: string; greaterThanOrEqualTo?: string; } - export interface JSONFilter { isNull?: boolean; equalTo?: Record; @@ -932,7 +782,6 @@ export interface JSONFilter { containsAllKeys?: string[]; containsAnyKeys?: string[]; } - export interface BigIntFilter { isNull?: boolean; equalTo?: string; @@ -946,7 +795,6 @@ export interface BigIntFilter { greaterThan?: string; greaterThanOrEqualTo?: string; } - export interface BigFloatFilter { isNull?: boolean; equalTo?: string; @@ -960,13 +808,11 @@ export interface BigFloatFilter { greaterThan?: string; greaterThanOrEqualTo?: string; } - export interface BitStringFilter { isNull?: boolean; equalTo?: string; notEqualTo?: string; } - export interface InternetAddressFilter { isNull?: boolean; equalTo?: string; @@ -985,15 +831,10 @@ export interface InternetAddressFilter { containedByOrEqualTo?: string; containsOrContainedBy?: string; } - export interface FullTextFilter { matches?: string; } - -// ============================================================================ -// Entity Types -// ============================================================================ - +// ============ Entity Types ============ export interface User { id: string; email?: string | null; @@ -1003,41 +844,23 @@ export interface User { createdAt?: string | null; metadata?: Record | null; } - -// ============================================================================ -// Relation Helper Types -// ============================================================================ - +// ============ Relation Helper Types ============ export interface ConnectionResult { nodes: T[]; totalCount: number; pageInfo: PageInfo; } - export interface PageInfo { hasNextPage: boolean; hasPreviousPage: boolean; startCursor?: string | null; endCursor?: string | null; } - -// ============================================================================ -// Entity Relation Types -// ============================================================================ - -export interface UserRelations { -} - -// ============================================================================ -// Entity Types With Relations -// ============================================================================ - +// ============ Entity Relation Types ============ +export interface UserRelations {} +// ============ Entity Types With Relations ============ export type UserWithRelations = User & UserRelations; - -// ============================================================================ -// Entity Select Types -// ============================================================================ - +// ============ Entity Select Types ============ export type UserSelect = { id?: boolean; email?: boolean; @@ -1046,12 +869,8 @@ export type UserSelect = { isActive?: boolean; createdAt?: boolean; metadata?: boolean; - }; - -// ============================================================================ -// Table Filter Types -// ============================================================================ - +}; +// ============ Table Filter Types ============ export interface UserFilter { id?: UUIDFilter; email?: StringFilter; @@ -1064,11 +883,7 @@ export interface UserFilter { or?: UserFilter[]; not?: UserFilter; } - -// ============================================================================ -// Table Condition Types -// ============================================================================ - +// ============ Table Condition Types ============ export interface UserCondition { id?: string | null; email?: string | null; @@ -1078,17 +893,9 @@ export interface UserCondition { createdAt?: string | null; metadata?: unknown | null; } - -// ============================================================================ -// OrderBy Types -// ============================================================================ - -export type UsersOrderBy = 'PRIMARY_KEY_ASC' | 'PRIMARY_KEY_DESC' | 'NATURAL' | 'ID_ASC' | 'ID_DESC' | 'EMAIL_ASC' | 'EMAIL_DESC' | 'NAME_ASC' | 'NAME_DESC' | 'AGE_ASC' | 'AGE_DESC' | 'IS_ACTIVE_ASC' | 'IS_ACTIVE_DESC' | 'CREATED_AT_ASC' | 'CREATED_AT_DESC' | 'METADATA_ASC' | 'METADATA_DESC'; - -// ============================================================================ -// CRUD Input Types -// ============================================================================ - +// ============ OrderBy Types ============ +export type UsersOrderBy = "PRIMARY_KEY_ASC" | "PRIMARY_KEY_DESC" | "NATURAL" | "ID_ASC" | "ID_DESC" | "EMAIL_ASC" | "EMAIL_DESC" | "NAME_ASC" | "NAME_DESC" | "AGE_ASC" | "AGE_DESC" | "IS_ACTIVE_ASC" | "IS_ACTIVE_DESC" | "CREATED_AT_ASC" | "CREATED_AT_DESC" | "METADATA_ASC" | "METADATA_DESC"; +// ============ CRUD Input Types ============ export interface CreateUserInput { clientMutationId?: string; user: { @@ -1099,7 +906,6 @@ export interface CreateUserInput { metadata?: Record; }; } - export interface UserPatch { email?: string | null; name?: string | null; @@ -1107,49 +913,36 @@ export interface UserPatch { isActive?: boolean | null; metadata?: Record | null; } - export interface UpdateUserInput { clientMutationId?: string; id: string; patch: UserPatch; } - export interface DeleteUserInput { clientMutationId?: string; id: string; } - -// ============================================================================ -// Custom Input Types (from schema) -// ============================================================================ - +// ============ Custom Input Types (from schema) ============ export interface LoginInput { email: string; password: string; rememberMe?: boolean; } - export interface RegisterInput { email: string; password: string; name?: string; } - -export type UserRole = 'ADMIN' | 'USER' | 'GUEST'; -" +export type UserRole = "ADMIN" | "USER" | "GUEST";" `; exports[`generateInputTypesFile generates payload types for custom operations 1`] = ` "/** -* GraphQL types for ORM client -* @generated by @constructive-io/graphql-codegen -* DO NOT EDIT - changes will be overwritten -*/ - -// ============================================================================ -// Scalar Filter Types -// ============================================================================ - + * GraphQL types for ORM client + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ +// ============ Scalar Filter Types ============ export interface StringFilter { isNull?: boolean; equalTo?: string; @@ -1179,7 +972,6 @@ export interface StringFilter { likeInsensitive?: string; notLikeInsensitive?: string; } - export interface IntFilter { isNull?: boolean; equalTo?: number; @@ -1193,7 +985,6 @@ export interface IntFilter { greaterThan?: number; greaterThanOrEqualTo?: number; } - export interface FloatFilter { isNull?: boolean; equalTo?: number; @@ -1207,13 +998,11 @@ export interface FloatFilter { greaterThan?: number; greaterThanOrEqualTo?: number; } - export interface BooleanFilter { isNull?: boolean; equalTo?: boolean; notEqualTo?: boolean; } - export interface UUIDFilter { isNull?: boolean; equalTo?: string; @@ -1223,7 +1012,6 @@ export interface UUIDFilter { in?: string[]; notIn?: string[]; } - export interface DatetimeFilter { isNull?: boolean; equalTo?: string; @@ -1237,7 +1025,6 @@ export interface DatetimeFilter { greaterThan?: string; greaterThanOrEqualTo?: string; } - export interface DateFilter { isNull?: boolean; equalTo?: string; @@ -1251,7 +1038,6 @@ export interface DateFilter { greaterThan?: string; greaterThanOrEqualTo?: string; } - export interface JSONFilter { isNull?: boolean; equalTo?: Record; @@ -1264,7 +1050,6 @@ export interface JSONFilter { containsAllKeys?: string[]; containsAnyKeys?: string[]; } - export interface BigIntFilter { isNull?: boolean; equalTo?: string; @@ -1278,7 +1063,6 @@ export interface BigIntFilter { greaterThan?: string; greaterThanOrEqualTo?: string; } - export interface BigFloatFilter { isNull?: boolean; equalTo?: string; @@ -1292,13 +1076,11 @@ export interface BigFloatFilter { greaterThan?: string; greaterThanOrEqualTo?: string; } - export interface BitStringFilter { isNull?: boolean; equalTo?: string; notEqualTo?: string; } - export interface InternetAddressFilter { isNull?: boolean; equalTo?: string; @@ -1317,15 +1099,10 @@ export interface InternetAddressFilter { containedByOrEqualTo?: string; containsOrContainedBy?: string; } - export interface FullTextFilter { matches?: string; } - -// ============================================================================ -// Entity Types -// ============================================================================ - +// ============ Entity Types ============ export interface User { id: string; email?: string | null; @@ -1335,41 +1112,23 @@ export interface User { createdAt?: string | null; metadata?: Record | null; } - -// ============================================================================ -// Relation Helper Types -// ============================================================================ - +// ============ Relation Helper Types ============ export interface ConnectionResult { nodes: T[]; totalCount: number; pageInfo: PageInfo; } - export interface PageInfo { hasNextPage: boolean; hasPreviousPage: boolean; startCursor?: string | null; endCursor?: string | null; } - -// ============================================================================ -// Entity Relation Types -// ============================================================================ - -export interface UserRelations { -} - -// ============================================================================ -// Entity Types With Relations -// ============================================================================ - +// ============ Entity Relation Types ============ +export interface UserRelations {} +// ============ Entity Types With Relations ============ export type UserWithRelations = User & UserRelations; - -// ============================================================================ -// Entity Select Types -// ============================================================================ - +// ============ Entity Select Types ============ export type UserSelect = { id?: boolean; email?: boolean; @@ -1378,12 +1137,8 @@ export type UserSelect = { isActive?: boolean; createdAt?: boolean; metadata?: boolean; - }; - -// ============================================================================ -// Table Filter Types -// ============================================================================ - +}; +// ============ Table Filter Types ============ export interface UserFilter { id?: UUIDFilter; email?: StringFilter; @@ -1396,11 +1151,7 @@ export interface UserFilter { or?: UserFilter[]; not?: UserFilter; } - -// ============================================================================ -// Table Condition Types -// ============================================================================ - +// ============ Table Condition Types ============ export interface UserCondition { id?: string | null; email?: string | null; @@ -1410,17 +1161,9 @@ export interface UserCondition { createdAt?: string | null; metadata?: unknown | null; } - -// ============================================================================ -// OrderBy Types -// ============================================================================ - -export type UsersOrderBy = 'PRIMARY_KEY_ASC' | 'PRIMARY_KEY_DESC' | 'NATURAL' | 'ID_ASC' | 'ID_DESC' | 'EMAIL_ASC' | 'EMAIL_DESC' | 'NAME_ASC' | 'NAME_DESC' | 'AGE_ASC' | 'AGE_DESC' | 'IS_ACTIVE_ASC' | 'IS_ACTIVE_DESC' | 'CREATED_AT_ASC' | 'CREATED_AT_DESC' | 'METADATA_ASC' | 'METADATA_DESC'; - -// ============================================================================ -// CRUD Input Types -// ============================================================================ - +// ============ OrderBy Types ============ +export type UsersOrderBy = "PRIMARY_KEY_ASC" | "PRIMARY_KEY_DESC" | "NATURAL" | "ID_ASC" | "ID_DESC" | "EMAIL_ASC" | "EMAIL_DESC" | "NAME_ASC" | "NAME_DESC" | "AGE_ASC" | "AGE_DESC" | "IS_ACTIVE_ASC" | "IS_ACTIVE_DESC" | "CREATED_AT_ASC" | "CREATED_AT_DESC" | "METADATA_ASC" | "METADATA_DESC"; +// ============ CRUD Input Types ============ export interface CreateUserInput { clientMutationId?: string; user: { @@ -1431,7 +1174,6 @@ export interface CreateUserInput { metadata?: Record; }; } - export interface UserPatch { email?: string | null; name?: string | null; @@ -1439,57 +1181,41 @@ export interface UserPatch { isActive?: boolean | null; metadata?: Record | null; } - export interface UpdateUserInput { clientMutationId?: string; id: string; patch: UserPatch; } - export interface DeleteUserInput { clientMutationId?: string; id: string; } - -// ============================================================================ -// Custom Input Types (from schema) -// ============================================================================ - +// ============ Custom Input Types (from schema) ============ export interface LoginInput { email: string; password: string; rememberMe?: boolean; } - -// ============================================================================ -// Payload/Return Types (for custom operations) -// ============================================================================ - +// ============ Payload/Return Types (for custom operations) ============ export interface LoginPayload { token?: string | null; user?: User | null; expiresAt?: string | null; } - export type LoginPayloadSelect = { token?: boolean; user?: boolean; expiresAt?: boolean; - }; -" +};" `; exports[`generateInputTypesFile generates types with hasOne relations 1`] = ` "/** -* GraphQL types for ORM client -* @generated by @constructive-io/graphql-codegen -* DO NOT EDIT - changes will be overwritten -*/ - -// ============================================================================ -// Scalar Filter Types -// ============================================================================ - + * GraphQL types for ORM client + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ +// ============ Scalar Filter Types ============ export interface StringFilter { isNull?: boolean; equalTo?: string; @@ -1519,7 +1245,6 @@ export interface StringFilter { likeInsensitive?: string; notLikeInsensitive?: string; } - export interface IntFilter { isNull?: boolean; equalTo?: number; @@ -1533,7 +1258,6 @@ export interface IntFilter { greaterThan?: number; greaterThanOrEqualTo?: number; } - export interface FloatFilter { isNull?: boolean; equalTo?: number; @@ -1547,13 +1271,11 @@ export interface FloatFilter { greaterThan?: number; greaterThanOrEqualTo?: number; } - export interface BooleanFilter { isNull?: boolean; equalTo?: boolean; notEqualTo?: boolean; } - export interface UUIDFilter { isNull?: boolean; equalTo?: string; @@ -1563,7 +1285,6 @@ export interface UUIDFilter { in?: string[]; notIn?: string[]; } - export interface DatetimeFilter { isNull?: boolean; equalTo?: string; @@ -1577,7 +1298,6 @@ export interface DatetimeFilter { greaterThan?: string; greaterThanOrEqualTo?: string; } - export interface DateFilter { isNull?: boolean; equalTo?: string; @@ -1591,7 +1311,6 @@ export interface DateFilter { greaterThan?: string; greaterThanOrEqualTo?: string; } - export interface JSONFilter { isNull?: boolean; equalTo?: Record; @@ -1604,7 +1323,6 @@ export interface JSONFilter { containsAllKeys?: string[]; containsAnyKeys?: string[]; } - export interface BigIntFilter { isNull?: boolean; equalTo?: string; @@ -1618,7 +1336,6 @@ export interface BigIntFilter { greaterThan?: string; greaterThanOrEqualTo?: string; } - export interface BigFloatFilter { isNull?: boolean; equalTo?: string; @@ -1632,13 +1349,11 @@ export interface BigFloatFilter { greaterThan?: string; greaterThanOrEqualTo?: string; } - export interface BitStringFilter { isNull?: boolean; equalTo?: string; notEqualTo?: string; } - export interface InternetAddressFilter { isNull?: boolean; equalTo?: string; @@ -1657,15 +1372,10 @@ export interface InternetAddressFilter { containedByOrEqualTo?: string; containsOrContainedBy?: string; } - export interface FullTextFilter { matches?: string; } - -// ============================================================================ -// Entity Types -// ============================================================================ - +// ============ Entity Types ============ export interface User { id: string; email?: string | null; @@ -1675,56 +1385,36 @@ export interface User { createdAt?: string | null; metadata?: Record | null; } - export interface Profile { id: string; bio?: string | null; userId?: string | null; avatarUrl?: string | null; } - -// ============================================================================ -// Relation Helper Types -// ============================================================================ - +// ============ Relation Helper Types ============ export interface ConnectionResult { nodes: T[]; totalCount: number; pageInfo: PageInfo; } - export interface PageInfo { hasNextPage: boolean; hasPreviousPage: boolean; startCursor?: string | null; endCursor?: string | null; } - -// ============================================================================ -// Entity Relation Types -// ============================================================================ - +// ============ Entity Relation Types ============ export interface UserRelations { profile?: Profile | null; posts?: ConnectionResult; } - export interface ProfileRelations { user?: User | null; } - -// ============================================================================ -// Entity Types With Relations -// ============================================================================ - +// ============ Entity Types With Relations ============ export type UserWithRelations = User & UserRelations; - export type ProfileWithRelations = Profile & ProfileRelations; - -// ============================================================================ -// Entity Select Types -// ============================================================================ - +// ============ Entity Select Types ============ export type UserSelect = { id?: boolean; email?: boolean; @@ -1734,26 +1424,25 @@ export type UserSelect = { createdAt?: boolean; metadata?: boolean; posts?: boolean | { - select?: PostSelect; - first?: number; - filter?: PostFilter; - orderBy?: PostsOrderBy[]; + select?: PostSelect; + first?: number; + filter?: PostFilter; + orderBy?: PostsOrderBy[]; }; - profile?: boolean | { select?: ProfileSelect }; + profile?: boolean | { + select?: ProfileSelect; }; - +}; export type ProfileSelect = { id?: boolean; bio?: boolean; userId?: boolean; avatarUrl?: boolean; - user?: boolean | { select?: UserSelect }; + user?: boolean | { + select?: UserSelect; }; - -// ============================================================================ -// Table Filter Types -// ============================================================================ - +}; +// ============ Table Filter Types ============ export interface UserFilter { id?: UUIDFilter; email?: StringFilter; @@ -1766,7 +1455,6 @@ export interface UserFilter { or?: UserFilter[]; not?: UserFilter; } - export interface ProfileFilter { id?: UUIDFilter; bio?: StringFilter; @@ -1776,11 +1464,7 @@ export interface ProfileFilter { or?: ProfileFilter[]; not?: ProfileFilter; } - -// ============================================================================ -// Table Condition Types -// ============================================================================ - +// ============ Table Condition Types ============ export interface UserCondition { id?: string | null; email?: string | null; @@ -1790,26 +1474,16 @@ export interface UserCondition { createdAt?: string | null; metadata?: unknown | null; } - export interface ProfileCondition { id?: string | null; bio?: string | null; userId?: string | null; avatarUrl?: string | null; } - -// ============================================================================ -// OrderBy Types -// ============================================================================ - -export type UsersOrderBy = 'PRIMARY_KEY_ASC' | 'PRIMARY_KEY_DESC' | 'NATURAL' | 'ID_ASC' | 'ID_DESC' | 'EMAIL_ASC' | 'EMAIL_DESC' | 'NAME_ASC' | 'NAME_DESC' | 'AGE_ASC' | 'AGE_DESC' | 'IS_ACTIVE_ASC' | 'IS_ACTIVE_DESC' | 'CREATED_AT_ASC' | 'CREATED_AT_DESC' | 'METADATA_ASC' | 'METADATA_DESC'; - -export type ProfilesOrderBy = 'PRIMARY_KEY_ASC' | 'PRIMARY_KEY_DESC' | 'NATURAL' | 'ID_ASC' | 'ID_DESC' | 'BIO_ASC' | 'BIO_DESC' | 'USER_ID_ASC' | 'USER_ID_DESC' | 'AVATAR_URL_ASC' | 'AVATAR_URL_DESC'; - -// ============================================================================ -// CRUD Input Types -// ============================================================================ - +// ============ OrderBy Types ============ +export type UsersOrderBy = "PRIMARY_KEY_ASC" | "PRIMARY_KEY_DESC" | "NATURAL" | "ID_ASC" | "ID_DESC" | "EMAIL_ASC" | "EMAIL_DESC" | "NAME_ASC" | "NAME_DESC" | "AGE_ASC" | "AGE_DESC" | "IS_ACTIVE_ASC" | "IS_ACTIVE_DESC" | "CREATED_AT_ASC" | "CREATED_AT_DESC" | "METADATA_ASC" | "METADATA_DESC"; +export type ProfilesOrderBy = "PRIMARY_KEY_ASC" | "PRIMARY_KEY_DESC" | "NATURAL" | "ID_ASC" | "ID_DESC" | "BIO_ASC" | "BIO_DESC" | "USER_ID_ASC" | "USER_ID_DESC" | "AVATAR_URL_ASC" | "AVATAR_URL_DESC"; +// ============ CRUD Input Types ============ export interface CreateUserInput { clientMutationId?: string; user: { @@ -1820,7 +1494,6 @@ export interface CreateUserInput { metadata?: Record; }; } - export interface UserPatch { email?: string | null; name?: string | null; @@ -1828,18 +1501,15 @@ export interface UserPatch { isActive?: boolean | null; metadata?: Record | null; } - export interface UpdateUserInput { clientMutationId?: string; id: string; patch: UserPatch; } - export interface DeleteUserInput { clientMutationId?: string; id: string; } - export interface CreateProfileInput { clientMutationId?: string; profile: { @@ -1848,41 +1518,29 @@ export interface CreateProfileInput { avatarUrl?: string; }; } - export interface ProfilePatch { bio?: string | null; userId?: string | null; avatarUrl?: string | null; } - export interface UpdateProfileInput { clientMutationId?: string; id: string; patch: ProfilePatch; } - export interface DeleteProfileInput { clientMutationId?: string; id: string; -} - -// ============================================================================ -// Custom Input Types (from schema) -// ============================================================================ -" +}" `; exports[`generateInputTypesFile generates types with manyToMany relations 1`] = ` "/** -* GraphQL types for ORM client -* @generated by @constructive-io/graphql-codegen -* DO NOT EDIT - changes will be overwritten -*/ - -// ============================================================================ -// Scalar Filter Types -// ============================================================================ - + * GraphQL types for ORM client + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ +// ============ Scalar Filter Types ============ export interface StringFilter { isNull?: boolean; equalTo?: string; @@ -1912,7 +1570,6 @@ export interface StringFilter { likeInsensitive?: string; notLikeInsensitive?: string; } - export interface IntFilter { isNull?: boolean; equalTo?: number; @@ -1926,7 +1583,6 @@ export interface IntFilter { greaterThan?: number; greaterThanOrEqualTo?: number; } - export interface FloatFilter { isNull?: boolean; equalTo?: number; @@ -1940,13 +1596,11 @@ export interface FloatFilter { greaterThan?: number; greaterThanOrEqualTo?: number; } - export interface BooleanFilter { isNull?: boolean; equalTo?: boolean; notEqualTo?: boolean; } - export interface UUIDFilter { isNull?: boolean; equalTo?: string; @@ -1956,7 +1610,6 @@ export interface UUIDFilter { in?: string[]; notIn?: string[]; } - export interface DatetimeFilter { isNull?: boolean; equalTo?: string; @@ -1970,7 +1623,6 @@ export interface DatetimeFilter { greaterThan?: string; greaterThanOrEqualTo?: string; } - export interface DateFilter { isNull?: boolean; equalTo?: string; @@ -1984,7 +1636,6 @@ export interface DateFilter { greaterThan?: string; greaterThanOrEqualTo?: string; } - export interface JSONFilter { isNull?: boolean; equalTo?: Record; @@ -1997,7 +1648,6 @@ export interface JSONFilter { containsAllKeys?: string[]; containsAnyKeys?: string[]; } - export interface BigIntFilter { isNull?: boolean; equalTo?: string; @@ -2011,7 +1661,6 @@ export interface BigIntFilter { greaterThan?: string; greaterThanOrEqualTo?: string; } - export interface BigFloatFilter { isNull?: boolean; equalTo?: string; @@ -2025,13 +1674,11 @@ export interface BigFloatFilter { greaterThan?: string; greaterThanOrEqualTo?: string; } - export interface BitStringFilter { isNull?: boolean; equalTo?: string; notEqualTo?: string; } - export interface InternetAddressFilter { isNull?: boolean; equalTo?: string; @@ -2050,15 +1697,10 @@ export interface InternetAddressFilter { containedByOrEqualTo?: string; containsOrContainedBy?: string; } - export interface FullTextFilter { matches?: string; } - -// ============================================================================ -// Entity Types -// ============================================================================ - +// ============ Entity Types ============ export interface Post { id: string; title?: string | null; @@ -2067,55 +1709,35 @@ export interface Post { publishedAt?: string | null; tags?: string | null; } - export interface Category { id: string; name?: string | null; slug?: string | null; } - -// ============================================================================ -// Relation Helper Types -// ============================================================================ - +// ============ Relation Helper Types ============ export interface ConnectionResult { nodes: T[]; totalCount: number; pageInfo: PageInfo; } - export interface PageInfo { hasNextPage: boolean; hasPreviousPage: boolean; startCursor?: string | null; endCursor?: string | null; } - -// ============================================================================ -// Entity Relation Types -// ============================================================================ - +// ============ Entity Relation Types ============ export interface PostRelations { author?: User | null; comments?: ConnectionResult; } - export interface CategoryRelations { posts?: ConnectionResult; } - -// ============================================================================ -// Entity Types With Relations -// ============================================================================ - +// ============ Entity Types With Relations ============ export type PostWithRelations = Post & PostRelations; - export type CategoryWithRelations = Category & CategoryRelations; - -// ============================================================================ -// Entity Select Types -// ============================================================================ - +// ============ Entity Select Types ============ export type PostSelect = { id?: boolean; title?: boolean; @@ -2123,31 +1745,28 @@ export type PostSelect = { authorId?: boolean; publishedAt?: boolean; tags?: boolean; - author?: boolean | { select?: UserSelect }; - comments?: boolean | { - select?: CommentSelect; - first?: number; - filter?: CommentFilter; - orderBy?: CommentsOrderBy[]; + author?: boolean | { + select?: UserSelect; }; + comments?: boolean | { + select?: CommentSelect; + first?: number; + filter?: CommentFilter; + orderBy?: CommentsOrderBy[]; }; - +}; export type CategorySelect = { id?: boolean; name?: boolean; slug?: boolean; posts?: boolean | { - select?: PostSelect; - first?: number; - filter?: PostFilter; - orderBy?: PostsOrderBy[]; - }; + select?: PostSelect; + first?: number; + filter?: PostFilter; + orderBy?: PostsOrderBy[]; }; - -// ============================================================================ -// Table Filter Types -// ============================================================================ - +}; +// ============ Table Filter Types ============ export interface PostFilter { id?: UUIDFilter; title?: StringFilter; @@ -2159,7 +1778,6 @@ export interface PostFilter { or?: PostFilter[]; not?: PostFilter; } - export interface CategoryFilter { id?: UUIDFilter; name?: StringFilter; @@ -2168,11 +1786,7 @@ export interface CategoryFilter { or?: CategoryFilter[]; not?: CategoryFilter; } - -// ============================================================================ -// Table Condition Types -// ============================================================================ - +// ============ Table Condition Types ============ export interface PostCondition { id?: string | null; title?: string | null; @@ -2181,25 +1795,15 @@ export interface PostCondition { publishedAt?: string | null; tags?: string | null; } - export interface CategoryCondition { id?: string | null; name?: string | null; slug?: string | null; } - -// ============================================================================ -// OrderBy Types -// ============================================================================ - -export type PostsOrderBy = 'PRIMARY_KEY_ASC' | 'PRIMARY_KEY_DESC' | 'NATURAL' | 'ID_ASC' | 'ID_DESC' | 'TITLE_ASC' | 'TITLE_DESC' | 'CONTENT_ASC' | 'CONTENT_DESC' | 'AUTHOR_ID_ASC' | 'AUTHOR_ID_DESC' | 'PUBLISHED_AT_ASC' | 'PUBLISHED_AT_DESC' | 'TAGS_ASC' | 'TAGS_DESC'; - -export type CategoriesOrderBy = 'PRIMARY_KEY_ASC' | 'PRIMARY_KEY_DESC' | 'NATURAL' | 'ID_ASC' | 'ID_DESC' | 'NAME_ASC' | 'NAME_DESC' | 'SLUG_ASC' | 'SLUG_DESC'; - -// ============================================================================ -// CRUD Input Types -// ============================================================================ - +// ============ OrderBy Types ============ +export type PostsOrderBy = "PRIMARY_KEY_ASC" | "PRIMARY_KEY_DESC" | "NATURAL" | "ID_ASC" | "ID_DESC" | "TITLE_ASC" | "TITLE_DESC" | "CONTENT_ASC" | "CONTENT_DESC" | "AUTHOR_ID_ASC" | "AUTHOR_ID_DESC" | "PUBLISHED_AT_ASC" | "PUBLISHED_AT_DESC" | "TAGS_ASC" | "TAGS_DESC"; +export type CategoriesOrderBy = "PRIMARY_KEY_ASC" | "PRIMARY_KEY_DESC" | "NATURAL" | "ID_ASC" | "ID_DESC" | "NAME_ASC" | "NAME_DESC" | "SLUG_ASC" | "SLUG_DESC"; +// ============ CRUD Input Types ============ export interface CreatePostInput { clientMutationId?: string; post: { @@ -2210,7 +1814,6 @@ export interface CreatePostInput { tags?: string; }; } - export interface PostPatch { title?: string | null; content?: string | null; @@ -2218,18 +1821,15 @@ export interface PostPatch { publishedAt?: string | null; tags?: string | null; } - export interface UpdatePostInput { clientMutationId?: string; id: string; patch: PostPatch; } - export interface DeletePostInput { clientMutationId?: string; id: string; } - export interface CreateCategoryInput { clientMutationId?: string; category: { @@ -2237,40 +1837,28 @@ export interface CreateCategoryInput { slug?: string; }; } - export interface CategoryPatch { name?: string | null; slug?: string | null; } - export interface UpdateCategoryInput { clientMutationId?: string; id: string; patch: CategoryPatch; } - export interface DeleteCategoryInput { clientMutationId?: string; id: string; -} - -// ============================================================================ -// Custom Input Types (from schema) -// ============================================================================ -" +}" `; exports[`generateInputTypesFile handles empty tables array 1`] = ` "/** -* GraphQL types for ORM client -* @generated by @constructive-io/graphql-codegen -* DO NOT EDIT - changes will be overwritten -*/ - -// ============================================================================ -// Scalar Filter Types -// ============================================================================ - + * GraphQL types for ORM client + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ +// ============ Scalar Filter Types ============ export interface StringFilter { isNull?: boolean; equalTo?: string; @@ -2300,7 +1888,6 @@ export interface StringFilter { likeInsensitive?: string; notLikeInsensitive?: string; } - export interface IntFilter { isNull?: boolean; equalTo?: number; @@ -2314,7 +1901,6 @@ export interface IntFilter { greaterThan?: number; greaterThanOrEqualTo?: number; } - export interface FloatFilter { isNull?: boolean; equalTo?: number; @@ -2328,13 +1914,11 @@ export interface FloatFilter { greaterThan?: number; greaterThanOrEqualTo?: number; } - export interface BooleanFilter { isNull?: boolean; equalTo?: boolean; notEqualTo?: boolean; } - export interface UUIDFilter { isNull?: boolean; equalTo?: string; @@ -2344,7 +1928,6 @@ export interface UUIDFilter { in?: string[]; notIn?: string[]; } - export interface DatetimeFilter { isNull?: boolean; equalTo?: string; @@ -2358,7 +1941,6 @@ export interface DatetimeFilter { greaterThan?: string; greaterThanOrEqualTo?: string; } - export interface DateFilter { isNull?: boolean; equalTo?: string; @@ -2372,7 +1954,6 @@ export interface DateFilter { greaterThan?: string; greaterThanOrEqualTo?: string; } - export interface JSONFilter { isNull?: boolean; equalTo?: Record; @@ -2385,7 +1966,6 @@ export interface JSONFilter { containsAllKeys?: string[]; containsAnyKeys?: string[]; } - export interface BigIntFilter { isNull?: boolean; equalTo?: string; @@ -2399,7 +1979,6 @@ export interface BigIntFilter { greaterThan?: string; greaterThanOrEqualTo?: string; } - export interface BigFloatFilter { isNull?: boolean; equalTo?: string; @@ -2413,13 +1992,11 @@ export interface BigFloatFilter { greaterThan?: string; greaterThanOrEqualTo?: string; } - export interface BitStringFilter { isNull?: boolean; equalTo?: string; notEqualTo?: string; } - export interface InternetAddressFilter { isNull?: boolean; equalTo?: string; @@ -2438,13 +2015,7 @@ export interface InternetAddressFilter { containedByOrEqualTo?: string; containsOrContainedBy?: string; } - export interface FullTextFilter { matches?: string; -} - -// ============================================================================ -// Custom Input Types (from schema) -// ============================================================================ -" +}" `; diff --git a/graphql/codegen/src/__tests__/codegen/__snapshots__/query-keys-factory.test.ts.snap b/graphql/codegen/src/__tests__/codegen/__snapshots__/query-keys-factory.test.ts.snap new file mode 100644 index 000000000..9d6e45077 --- /dev/null +++ b/graphql/codegen/src/__tests__/codegen/__snapshots__/query-keys-factory.test.ts.snap @@ -0,0 +1,1386 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`generateInvalidationFile generates invalidation helpers for a single table without relationships 1`] = ` +"/** + * Cache invalidation helpers + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +// ============================================================================ +// Type-safe cache invalidation utilities +// +// Features: +// - Simple invalidation helpers per entity +// - Cascade invalidation for parent-child relationships +// - Remove helpers for delete operations +// ============================================================================ + +import type { QueryClient } from "@tanstack/react-query"; +import { userKeys } from "./query-keys"; +/** +// ============================================================================ +// Invalidation Helpers +// ============================================================================ + + * Type-safe query invalidation helpers + * + * @example + * \`\`\`ts + * // Invalidate all user queries + * invalidate.user.all(queryClient); + * + * // Invalidate user lists + * invalidate.user.lists(queryClient); + * + * // Invalidate specific user + * invalidate.user.detail(queryClient, userId); + * \`\`\` + */ +export const invalidate = { + /** Invalidate user queries */user: { + /** Invalidate all user queries */all: (queryClient: QueryClient) => queryClient.invalidateQueries({ + queryKey: userKeys.all + }), + /** Invalidate user list queries */lists: (queryClient: QueryClient) => queryClient.invalidateQueries({ + queryKey: userKeys.lists() + }), + /** Invalidate a specific user */detail: (queryClient: QueryClient, id: string | number) => queryClient.invalidateQueries({ + queryKey: userKeys.detail(id) + }) + } +} as const; +/** + +// ============================================================================ +// Remove Helpers (for delete operations) +// ============================================================================ + + * Remove queries from cache (for delete operations) + * + * Use these when an entity is deleted to remove it from cache + * instead of just invalidating (which would trigger a refetch). + */ +export const remove = { + /** Remove user from cache */user: (queryClient: QueryClient, id: string | number) => { + queryClient.removeQueries({ + queryKey: userKeys.detail(id) + }); + } +} as const; +" +`; + +exports[`generateInvalidationFile generates invalidation helpers for multiple tables 1`] = ` +"/** + * Cache invalidation helpers + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +// ============================================================================ +// Type-safe cache invalidation utilities +// +// Features: +// - Simple invalidation helpers per entity +// - Cascade invalidation for parent-child relationships +// - Remove helpers for delete operations +// ============================================================================ + +import type { QueryClient } from "@tanstack/react-query"; +import { userKeys, postKeys } from "./query-keys"; +/** +// ============================================================================ +// Invalidation Helpers +// ============================================================================ + + * Type-safe query invalidation helpers + * + * @example + * \`\`\`ts + * // Invalidate all user queries + * invalidate.user.all(queryClient); + * + * // Invalidate user lists + * invalidate.user.lists(queryClient); + * + * // Invalidate specific user + * invalidate.user.detail(queryClient, userId); + * \`\`\` + */ +export const invalidate = { + /** Invalidate user queries */user: { + /** Invalidate all user queries */all: (queryClient: QueryClient) => queryClient.invalidateQueries({ + queryKey: userKeys.all + }), + /** Invalidate user list queries */lists: (queryClient: QueryClient) => queryClient.invalidateQueries({ + queryKey: userKeys.lists() + }), + /** Invalidate a specific user */detail: (queryClient: QueryClient, id: string | number) => queryClient.invalidateQueries({ + queryKey: userKeys.detail(id) + }) + }, + /** Invalidate post queries */post: { + /** Invalidate all post queries */all: (queryClient: QueryClient) => queryClient.invalidateQueries({ + queryKey: postKeys.all + }), + /** Invalidate post list queries */lists: (queryClient: QueryClient) => queryClient.invalidateQueries({ + queryKey: postKeys.lists() + }), + /** Invalidate a specific post */detail: (queryClient: QueryClient, id: string | number) => queryClient.invalidateQueries({ + queryKey: postKeys.detail(id) + }) + } +} as const; +/** + +// ============================================================================ +// Remove Helpers (for delete operations) +// ============================================================================ + + * Remove queries from cache (for delete operations) + * + * Use these when an entity is deleted to remove it from cache + * instead of just invalidating (which would trigger a refetch). + */ +export const remove = { + /** Remove user from cache */user: (queryClient: QueryClient, id: string | number) => { + queryClient.removeQueries({ + queryKey: userKeys.detail(id) + }); + }, + /** Remove post from cache */post: (queryClient: QueryClient, id: string | number) => { + queryClient.removeQueries({ + queryKey: postKeys.detail(id) + }); + } +} as const; +" +`; + +exports[`generateInvalidationFile generates invalidation helpers with cascade support for hierarchical relationships 1`] = ` +"/** + * Cache invalidation helpers + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +// ============================================================================ +// Type-safe cache invalidation utilities +// +// Features: +// - Simple invalidation helpers per entity +// - Cascade invalidation for parent-child relationships +// - Remove helpers for delete operations +// ============================================================================ + +import type { QueryClient } from "@tanstack/react-query"; +import { organizationKeys, databaseKeys, tableKeys, fieldKeys } from "./query-keys"; +import type { DatabaseScope, TableScope, FieldScope } from "./query-keys"; +/** +// ============================================================================ +// Invalidation Helpers +// ============================================================================ + + * Type-safe query invalidation helpers + * + * @example + * \`\`\`ts + * // Invalidate all user queries + * invalidate.user.all(queryClient); + * + * // Invalidate user lists + * invalidate.user.lists(queryClient); + * + * // Invalidate specific user + * invalidate.user.detail(queryClient, userId); + * + * // Cascade invalidate (entity + all children) + * invalidate.database.withChildren(queryClient, databaseId); + * \`\`\` + */ +export const invalidate = { + /** Invalidate organization queries */organization: { + /** Invalidate all organization queries */all: (queryClient: QueryClient) => queryClient.invalidateQueries({ + queryKey: organizationKeys.all + }), + /** Invalidate organization list queries */lists: (queryClient: QueryClient) => queryClient.invalidateQueries({ + queryKey: organizationKeys.lists() + }), + /** Invalidate a specific organization */detail: (queryClient: QueryClient, id: string | number) => queryClient.invalidateQueries({ + queryKey: organizationKeys.detail(id) + }), + /** + * Invalidate organization and all child entities + * Cascades to: database, table, field + */ + withChildren: (queryClient: QueryClient, id: string | number) => { + // Invalidate this organization + queryClient.invalidateQueries({ + queryKey: organizationKeys.detail(id) + }); + queryClient.invalidateQueries({ + queryKey: organizationKeys.lists() + }); + // Cascade to child entities + queryClient.invalidateQueries({ + queryKey: databaseKeys.byOrganization(id) + }); + queryClient.invalidateQueries({ + queryKey: tableKeys.byOrganization(id) + }); + queryClient.invalidateQueries({ + queryKey: fieldKeys.byOrganization(id) + }); + } + }, + /** Invalidate database queries */database: { + /** Invalidate all database queries */all: (queryClient: QueryClient) => queryClient.invalidateQueries({ + queryKey: databaseKeys.all + }), + /** Invalidate database list queries */lists: (queryClient: QueryClient, scope?: DatabaseScope) => queryClient.invalidateQueries({ + queryKey: databaseKeys.lists(scope) + }), + /** Invalidate a specific database */detail: (queryClient: QueryClient, id: string | number, scope?: DatabaseScope) => queryClient.invalidateQueries({ + queryKey: databaseKeys.detail(id, scope) + }), + /** + * Invalidate database and all child entities + * Cascades to: table, field + */ + withChildren: (queryClient: QueryClient, id: string | number) => { + // Invalidate this database + queryClient.invalidateQueries({ + queryKey: databaseKeys.detail(id) + }); + queryClient.invalidateQueries({ + queryKey: databaseKeys.lists() + }); + // Cascade to child entities + queryClient.invalidateQueries({ + queryKey: tableKeys.byDatabase(id) + }); + queryClient.invalidateQueries({ + queryKey: fieldKeys.byDatabase(id) + }); + } + }, + /** Invalidate table queries */table: { + /** Invalidate all table queries */all: (queryClient: QueryClient) => queryClient.invalidateQueries({ + queryKey: tableKeys.all + }), + /** Invalidate table list queries */lists: (queryClient: QueryClient, scope?: TableScope) => queryClient.invalidateQueries({ + queryKey: tableKeys.lists(scope) + }), + /** Invalidate a specific table */detail: (queryClient: QueryClient, id: string | number, scope?: TableScope) => queryClient.invalidateQueries({ + queryKey: tableKeys.detail(id, scope) + }), + /** + * Invalidate table and all child entities + * Cascades to: field + */ + withChildren: (queryClient: QueryClient, id: string | number) => { + // Invalidate this table + queryClient.invalidateQueries({ + queryKey: tableKeys.detail(id) + }); + queryClient.invalidateQueries({ + queryKey: tableKeys.lists() + }); + // Cascade to child entities + queryClient.invalidateQueries({ + queryKey: fieldKeys.byTable(id) + }); + } + }, + /** Invalidate field queries */field: { + /** Invalidate all field queries */all: (queryClient: QueryClient) => queryClient.invalidateQueries({ + queryKey: fieldKeys.all + }), + /** Invalidate field list queries */lists: (queryClient: QueryClient, scope?: FieldScope) => queryClient.invalidateQueries({ + queryKey: fieldKeys.lists(scope) + }), + /** Invalidate a specific field */detail: (queryClient: QueryClient, id: string | number, scope?: FieldScope) => queryClient.invalidateQueries({ + queryKey: fieldKeys.detail(id, scope) + }) + } +} as const; +/** + +// ============================================================================ +// Remove Helpers (for delete operations) +// ============================================================================ + + * Remove queries from cache (for delete operations) + * + * Use these when an entity is deleted to remove it from cache + * instead of just invalidating (which would trigger a refetch). + */ +export const remove = { + /** Remove organization from cache */organization: (queryClient: QueryClient, id: string | number) => { + queryClient.removeQueries({ + queryKey: organizationKeys.detail(id) + }); + }, + /** Remove database from cache */database: (queryClient: QueryClient, id: string | number, scope?: DatabaseScope) => { + queryClient.removeQueries({ + queryKey: databaseKeys.detail(id, scope) + }); + }, + /** Remove table from cache */table: (queryClient: QueryClient, id: string | number, scope?: TableScope) => { + queryClient.removeQueries({ + queryKey: tableKeys.detail(id, scope) + }); + }, + /** Remove field from cache */field: (queryClient: QueryClient, id: string | number, scope?: FieldScope) => { + queryClient.removeQueries({ + queryKey: fieldKeys.detail(id, scope) + }); + } +} as const; +" +`; + +exports[`generateInvalidationFile generates invalidation helpers with cascade support for parent-child relationship 1`] = ` +"/** + * Cache invalidation helpers + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +// ============================================================================ +// Type-safe cache invalidation utilities +// +// Features: +// - Simple invalidation helpers per entity +// - Cascade invalidation for parent-child relationships +// - Remove helpers for delete operations +// ============================================================================ + +import type { QueryClient } from "@tanstack/react-query"; +import { userKeys, postKeys } from "./query-keys"; +import type { PostScope } from "./query-keys"; +/** +// ============================================================================ +// Invalidation Helpers +// ============================================================================ + + * Type-safe query invalidation helpers + * + * @example + * \`\`\`ts + * // Invalidate all user queries + * invalidate.user.all(queryClient); + * + * // Invalidate user lists + * invalidate.user.lists(queryClient); + * + * // Invalidate specific user + * invalidate.user.detail(queryClient, userId); + * + * // Cascade invalidate (entity + all children) + * invalidate.database.withChildren(queryClient, databaseId); + * \`\`\` + */ +export const invalidate = { + /** Invalidate user queries */user: { + /** Invalidate all user queries */all: (queryClient: QueryClient) => queryClient.invalidateQueries({ + queryKey: userKeys.all + }), + /** Invalidate user list queries */lists: (queryClient: QueryClient) => queryClient.invalidateQueries({ + queryKey: userKeys.lists() + }), + /** Invalidate a specific user */detail: (queryClient: QueryClient, id: string | number) => queryClient.invalidateQueries({ + queryKey: userKeys.detail(id) + }), + /** + * Invalidate user and all child entities + * Cascades to: post + */ + withChildren: (queryClient: QueryClient, id: string | number) => { + // Invalidate this user + queryClient.invalidateQueries({ + queryKey: userKeys.detail(id) + }); + queryClient.invalidateQueries({ + queryKey: userKeys.lists() + }); + // Cascade to child entities + queryClient.invalidateQueries({ + queryKey: postKeys.byUser(id) + }); + } + }, + /** Invalidate post queries */post: { + /** Invalidate all post queries */all: (queryClient: QueryClient) => queryClient.invalidateQueries({ + queryKey: postKeys.all + }), + /** Invalidate post list queries */lists: (queryClient: QueryClient, scope?: PostScope) => queryClient.invalidateQueries({ + queryKey: postKeys.lists(scope) + }), + /** Invalidate a specific post */detail: (queryClient: QueryClient, id: string | number, scope?: PostScope) => queryClient.invalidateQueries({ + queryKey: postKeys.detail(id, scope) + }) + } +} as const; +/** + +// ============================================================================ +// Remove Helpers (for delete operations) +// ============================================================================ + + * Remove queries from cache (for delete operations) + * + * Use these when an entity is deleted to remove it from cache + * instead of just invalidating (which would trigger a refetch). + */ +export const remove = { + /** Remove user from cache */user: (queryClient: QueryClient, id: string | number) => { + queryClient.removeQueries({ + queryKey: userKeys.detail(id) + }); + }, + /** Remove post from cache */post: (queryClient: QueryClient, id: string | number, scope?: PostScope) => { + queryClient.removeQueries({ + queryKey: postKeys.detail(id, scope) + }); + } +} as const; +" +`; + +exports[`generateInvalidationFile generates invalidation helpers without cascade when disabled 1`] = ` +"/** + * Cache invalidation helpers + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +// ============================================================================ +// Type-safe cache invalidation utilities +// +// Features: +// - Simple invalidation helpers per entity +// - Cascade invalidation for parent-child relationships +// - Remove helpers for delete operations +// ============================================================================ + +import type { QueryClient } from "@tanstack/react-query"; +import { userKeys, postKeys } from "./query-keys"; +import type { PostScope } from "./query-keys"; +/** +// ============================================================================ +// Invalidation Helpers +// ============================================================================ + + * Type-safe query invalidation helpers + * + * @example + * \`\`\`ts + * // Invalidate all user queries + * invalidate.user.all(queryClient); + * + * // Invalidate user lists + * invalidate.user.lists(queryClient); + * + * // Invalidate specific user + * invalidate.user.detail(queryClient, userId); + * \`\`\` + */ +export const invalidate = { + /** Invalidate user queries */user: { + /** Invalidate all user queries */all: (queryClient: QueryClient) => queryClient.invalidateQueries({ + queryKey: userKeys.all + }), + /** Invalidate user list queries */lists: (queryClient: QueryClient) => queryClient.invalidateQueries({ + queryKey: userKeys.lists() + }), + /** Invalidate a specific user */detail: (queryClient: QueryClient, id: string | number) => queryClient.invalidateQueries({ + queryKey: userKeys.detail(id) + }), + /** + * Invalidate user and all child entities + * Cascades to: post + */ + withChildren: (queryClient: QueryClient, id: string | number) => { + // Invalidate this user + queryClient.invalidateQueries({ + queryKey: userKeys.detail(id) + }); + queryClient.invalidateQueries({ + queryKey: userKeys.lists() + }); + // Cascade to child entities + queryClient.invalidateQueries({ + queryKey: postKeys.byUser(id) + }); + } + }, + /** Invalidate post queries */post: { + /** Invalidate all post queries */all: (queryClient: QueryClient) => queryClient.invalidateQueries({ + queryKey: postKeys.all + }), + /** Invalidate post list queries */lists: (queryClient: QueryClient, scope?: PostScope) => queryClient.invalidateQueries({ + queryKey: postKeys.lists(scope) + }), + /** Invalidate a specific post */detail: (queryClient: QueryClient, id: string | number, scope?: PostScope) => queryClient.invalidateQueries({ + queryKey: postKeys.detail(id, scope) + }) + } +} as const; +/** + +// ============================================================================ +// Remove Helpers (for delete operations) +// ============================================================================ + + * Remove queries from cache (for delete operations) + * + * Use these when an entity is deleted to remove it from cache + * instead of just invalidating (which would trigger a refetch). + */ +export const remove = { + /** Remove user from cache */user: (queryClient: QueryClient, id: string | number) => { + queryClient.removeQueries({ + queryKey: userKeys.detail(id) + }); + }, + /** Remove post from cache */post: (queryClient: QueryClient, id: string | number, scope?: PostScope) => { + queryClient.removeQueries({ + queryKey: postKeys.detail(id, scope) + }); + } +} as const; +" +`; + +exports[`generateMutationKeysFile generates mutation keys for a single table without relationships 1`] = ` +"/** + * Centralized mutation key factory + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +// ============================================================================ +// Mutation keys for tracking in-flight mutations +// +// Benefits: +// - Track mutation state with useIsMutating +// - Implement optimistic updates with proper rollback +// - Deduplicate identical mutations +// - Coordinate related mutations +// ============================================================================ + +// ============================================================================ +// Entity Mutation Keys +// ============================================================================ + +export const userMutationKeys = { + /** All user mutation keys */all: ["mutation", "user"] as const, + /** Create user mutation key */create: () => ["mutation", "user", "create"] as const, + /** Update user mutation key */update: (id: string | number) => ["mutation", "user", "update", id] as const, + /** Delete user mutation key */delete: (id: string | number) => ["mutation", "user", "delete", id] as const +} as const; +/** + +// ============================================================================ +// Unified Mutation Key Store +// ============================================================================ + + * Unified mutation key store + * + * Use this for tracking in-flight mutations with useIsMutating. + * + * @example + * \`\`\`ts + * import { useIsMutating } from '@tanstack/react-query'; + * import { mutationKeys } from './generated'; + * + * // Check if any user mutations are in progress + * const isMutatingUser = useIsMutating({ mutationKey: mutationKeys.user.all }); + * + * // Check if a specific user is being updated + * const isUpdating = useIsMutating({ mutationKey: mutationKeys.user.update(userId) }); + * \`\`\` + */ +export const mutationKeys = { + user: userMutationKeys +} as const; +" +`; + +exports[`generateMutationKeysFile generates mutation keys for hierarchical relationships 1`] = ` +"/** + * Centralized mutation key factory + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +// ============================================================================ +// Mutation keys for tracking in-flight mutations +// +// Benefits: +// - Track mutation state with useIsMutating +// - Implement optimistic updates with proper rollback +// - Deduplicate identical mutations +// - Coordinate related mutations +// ============================================================================ + +// ============================================================================ +// Entity Mutation Keys +// ============================================================================ + +export const organizationMutationKeys = { + /** All organization mutation keys */all: ["mutation", "organization"] as const, + /** Create organization mutation key */create: () => ["mutation", "organization", "create"] as const, + /** Update organization mutation key */update: (id: string | number) => ["mutation", "organization", "update", id] as const, + /** Delete organization mutation key */delete: (id: string | number) => ["mutation", "organization", "delete", id] as const +} as const; +export const databaseMutationKeys = { + /** All database mutation keys */all: ["mutation", "database"] as const, + /** Create database mutation key */create: (organizationId?: string) => organizationId ? ["mutation", "database", "create", { + organizationId + }] as const : ["mutation", "database", "create"] as const, + /** Update database mutation key */update: (id: string | number) => ["mutation", "database", "update", id] as const, + /** Delete database mutation key */delete: (id: string | number) => ["mutation", "database", "delete", id] as const +} as const; +export const tableMutationKeys = { + /** All table mutation keys */all: ["mutation", "table"] as const, + /** Create table mutation key */create: (databaseId?: string) => databaseId ? ["mutation", "table", "create", { + databaseId + }] as const : ["mutation", "table", "create"] as const, + /** Update table mutation key */update: (id: string | number) => ["mutation", "table", "update", id] as const, + /** Delete table mutation key */delete: (id: string | number) => ["mutation", "table", "delete", id] as const +} as const; +export const fieldMutationKeys = { + /** All field mutation keys */all: ["mutation", "field"] as const, + /** Create field mutation key */create: (tableId?: string) => tableId ? ["mutation", "field", "create", { + tableId + }] as const : ["mutation", "field", "create"] as const, + /** Update field mutation key */update: (id: string | number) => ["mutation", "field", "update", id] as const, + /** Delete field mutation key */delete: (id: string | number) => ["mutation", "field", "delete", id] as const +} as const; +/** + +// ============================================================================ +// Unified Mutation Key Store +// ============================================================================ + + * Unified mutation key store + * + * Use this for tracking in-flight mutations with useIsMutating. + * + * @example + * \`\`\`ts + * import { useIsMutating } from '@tanstack/react-query'; + * import { mutationKeys } from './generated'; + * + * // Check if any user mutations are in progress + * const isMutatingUser = useIsMutating({ mutationKey: mutationKeys.user.all }); + * + * // Check if a specific user is being updated + * const isUpdating = useIsMutating({ mutationKey: mutationKeys.user.update(userId) }); + * \`\`\` + */ +export const mutationKeys = { + organization: organizationMutationKeys, + database: databaseMutationKeys, + table: tableMutationKeys, + field: fieldMutationKeys +} as const; +" +`; + +exports[`generateMutationKeysFile generates mutation keys for multiple tables 1`] = ` +"/** + * Centralized mutation key factory + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +// ============================================================================ +// Mutation keys for tracking in-flight mutations +// +// Benefits: +// - Track mutation state with useIsMutating +// - Implement optimistic updates with proper rollback +// - Deduplicate identical mutations +// - Coordinate related mutations +// ============================================================================ + +// ============================================================================ +// Entity Mutation Keys +// ============================================================================ + +export const userMutationKeys = { + /** All user mutation keys */all: ["mutation", "user"] as const, + /** Create user mutation key */create: () => ["mutation", "user", "create"] as const, + /** Update user mutation key */update: (id: string | number) => ["mutation", "user", "update", id] as const, + /** Delete user mutation key */delete: (id: string | number) => ["mutation", "user", "delete", id] as const +} as const; +export const postMutationKeys = { + /** All post mutation keys */all: ["mutation", "post"] as const, + /** Create post mutation key */create: () => ["mutation", "post", "create"] as const, + /** Update post mutation key */update: (id: string | number) => ["mutation", "post", "update", id] as const, + /** Delete post mutation key */delete: (id: string | number) => ["mutation", "post", "delete", id] as const +} as const; +/** + +// ============================================================================ +// Unified Mutation Key Store +// ============================================================================ + + * Unified mutation key store + * + * Use this for tracking in-flight mutations with useIsMutating. + * + * @example + * \`\`\`ts + * import { useIsMutating } from '@tanstack/react-query'; + * import { mutationKeys } from './generated'; + * + * // Check if any user mutations are in progress + * const isMutatingUser = useIsMutating({ mutationKey: mutationKeys.user.all }); + * + * // Check if a specific user is being updated + * const isUpdating = useIsMutating({ mutationKey: mutationKeys.user.update(userId) }); + * \`\`\` + */ +export const mutationKeys = { + user: userMutationKeys, + post: postMutationKeys +} as const; +" +`; + +exports[`generateMutationKeysFile generates mutation keys with custom mutations 1`] = ` +"/** + * Centralized mutation key factory + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +// ============================================================================ +// Mutation keys for tracking in-flight mutations +// +// Benefits: +// - Track mutation state with useIsMutating +// - Implement optimistic updates with proper rollback +// - Deduplicate identical mutations +// - Coordinate related mutations +// ============================================================================ + +// ============================================================================ +// Entity Mutation Keys +// ============================================================================ + +export const userMutationKeys = { + /** All user mutation keys */all: ["mutation", "user"] as const, + /** Create user mutation key */create: () => ["mutation", "user", "create"] as const, + /** Update user mutation key */update: (id: string | number) => ["mutation", "user", "update", id] as const, + /** Delete user mutation key */delete: (id: string | number) => ["mutation", "user", "delete", id] as const +} as const; + +// ============================================================================ +// Custom Mutation Keys +// ============================================================================ + +export const customMutationKeys = { + /** Mutation key for login */login: (identifier?: string) => identifier ? ["mutation", "login", identifier] as const : ["mutation", "login"] as const, + /** Mutation key for logout */logout: () => ["mutation", "logout"] as const +} as const; +/** + +// ============================================================================ +// Unified Mutation Key Store +// ============================================================================ + + * Unified mutation key store + * + * Use this for tracking in-flight mutations with useIsMutating. + * + * @example + * \`\`\`ts + * import { useIsMutating } from '@tanstack/react-query'; + * import { mutationKeys } from './generated'; + * + * // Check if any user mutations are in progress + * const isMutatingUser = useIsMutating({ mutationKey: mutationKeys.user.all }); + * + * // Check if a specific user is being updated + * const isUpdating = useIsMutating({ mutationKey: mutationKeys.user.update(userId) }); + * \`\`\` + */ +export const mutationKeys = { + user: userMutationKeys, + custom: customMutationKeys +} as const; +" +`; + +exports[`generateMutationKeysFile generates mutation keys with parent-child relationship 1`] = ` +"/** + * Centralized mutation key factory + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +// ============================================================================ +// Mutation keys for tracking in-flight mutations +// +// Benefits: +// - Track mutation state with useIsMutating +// - Implement optimistic updates with proper rollback +// - Deduplicate identical mutations +// - Coordinate related mutations +// ============================================================================ + +// ============================================================================ +// Entity Mutation Keys +// ============================================================================ + +export const userMutationKeys = { + /** All user mutation keys */all: ["mutation", "user"] as const, + /** Create user mutation key */create: () => ["mutation", "user", "create"] as const, + /** Update user mutation key */update: (id: string | number) => ["mutation", "user", "update", id] as const, + /** Delete user mutation key */delete: (id: string | number) => ["mutation", "user", "delete", id] as const +} as const; +export const postMutationKeys = { + /** All post mutation keys */all: ["mutation", "post"] as const, + /** Create post mutation key */create: (authorId?: string) => authorId ? ["mutation", "post", "create", { + authorId + }] as const : ["mutation", "post", "create"] as const, + /** Update post mutation key */update: (id: string | number) => ["mutation", "post", "update", id] as const, + /** Delete post mutation key */delete: (id: string | number) => ["mutation", "post", "delete", id] as const +} as const; +/** + +// ============================================================================ +// Unified Mutation Key Store +// ============================================================================ + + * Unified mutation key store + * + * Use this for tracking in-flight mutations with useIsMutating. + * + * @example + * \`\`\`ts + * import { useIsMutating } from '@tanstack/react-query'; + * import { mutationKeys } from './generated'; + * + * // Check if any user mutations are in progress + * const isMutatingUser = useIsMutating({ mutationKey: mutationKeys.user.all }); + * + * // Check if a specific user is being updated + * const isUpdating = useIsMutating({ mutationKey: mutationKeys.user.update(userId) }); + * \`\`\` + */ +export const mutationKeys = { + user: userMutationKeys, + post: postMutationKeys +} as const; +" +`; + +exports[`generateQueryKeysFile generates query keys for a single table without relationships 1`] = ` +"/** + * Centralized query key factory + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +// ============================================================================ +// This file provides a centralized, type-safe query key factory following +// the lukemorales query-key-factory pattern for React Query. +// +// Benefits: +// - Single source of truth for all query keys +// - Type-safe key access with autocomplete +// - Hierarchical invalidation (invalidate all 'user.*' queries) +// - Scoped keys for parent-child relationships +// ============================================================================ + +// ============================================================================ +// Entity Query Keys +// ============================================================================ + +export const userKeys = { + /** All user queries */all: ["user"] as const, + /** List query keys */lists: () => [...userKeys.all, "list"] as const, + /** List query key with variables */list: (variables?: object) => [...userKeys.lists(), variables] as const, + /** Detail query keys */details: () => [...userKeys.all, "detail"] as const, + /** Detail query key for specific item */detail: (id: string | number) => [...userKeys.details(), id] as const +} as const; +/** + +// ============================================================================ +// Unified Query Key Store +// ============================================================================ + + * Unified query key store + * + * Use this for type-safe query key access across your application. + * + * @example + * \`\`\`ts + * // Invalidate all user queries + * queryClient.invalidateQueries({ queryKey: queryKeys.user.all }); + * + * // Invalidate user list queries + * queryClient.invalidateQueries({ queryKey: queryKeys.user.lists() }); + * + * // Invalidate specific user + * queryClient.invalidateQueries({ queryKey: queryKeys.user.detail(userId) }); + * \`\`\` + */ +export const queryKeys = { + user: userKeys +} as const; +/** Type representing all available query key scopes */ +export type QueryKeyScope = keyof typeof queryKeys; +" +`; + +exports[`generateQueryKeysFile generates query keys for multiple tables without relationships 1`] = ` +"/** + * Centralized query key factory + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +// ============================================================================ +// This file provides a centralized, type-safe query key factory following +// the lukemorales query-key-factory pattern for React Query. +// +// Benefits: +// - Single source of truth for all query keys +// - Type-safe key access with autocomplete +// - Hierarchical invalidation (invalidate all 'user.*' queries) +// - Scoped keys for parent-child relationships +// ============================================================================ + +// ============================================================================ +// Entity Query Keys +// ============================================================================ + +export const userKeys = { + /** All user queries */all: ["user"] as const, + /** List query keys */lists: () => [...userKeys.all, "list"] as const, + /** List query key with variables */list: (variables?: object) => [...userKeys.lists(), variables] as const, + /** Detail query keys */details: () => [...userKeys.all, "detail"] as const, + /** Detail query key for specific item */detail: (id: string | number) => [...userKeys.details(), id] as const +} as const; +export const postKeys = { + /** All post queries */all: ["post"] as const, + /** List query keys */lists: () => [...postKeys.all, "list"] as const, + /** List query key with variables */list: (variables?: object) => [...postKeys.lists(), variables] as const, + /** Detail query keys */details: () => [...postKeys.all, "detail"] as const, + /** Detail query key for specific item */detail: (id: string | number) => [...postKeys.details(), id] as const +} as const; +/** + +// ============================================================================ +// Unified Query Key Store +// ============================================================================ + + * Unified query key store + * + * Use this for type-safe query key access across your application. + * + * @example + * \`\`\`ts + * // Invalidate all user queries + * queryClient.invalidateQueries({ queryKey: queryKeys.user.all }); + * + * // Invalidate user list queries + * queryClient.invalidateQueries({ queryKey: queryKeys.user.lists() }); + * + * // Invalidate specific user + * queryClient.invalidateQueries({ queryKey: queryKeys.user.detail(userId) }); + * \`\`\` + */ +export const queryKeys = { + user: userKeys, + post: postKeys +} as const; +/** Type representing all available query key scopes */ +export type QueryKeyScope = keyof typeof queryKeys; +" +`; + +exports[`generateQueryKeysFile generates query keys with custom queries 1`] = ` +"/** + * Centralized query key factory + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +// ============================================================================ +// This file provides a centralized, type-safe query key factory following +// the lukemorales query-key-factory pattern for React Query. +// +// Benefits: +// - Single source of truth for all query keys +// - Type-safe key access with autocomplete +// - Hierarchical invalidation (invalidate all 'user.*' queries) +// - Scoped keys for parent-child relationships +// ============================================================================ + +// ============================================================================ +// Entity Query Keys +// ============================================================================ + +export const userKeys = { + /** All user queries */all: ["user"] as const, + /** List query keys */lists: () => [...userKeys.all, "list"] as const, + /** List query key with variables */list: (variables?: object) => [...userKeys.lists(), variables] as const, + /** Detail query keys */details: () => [...userKeys.all, "detail"] as const, + /** Detail query key for specific item */detail: (id: string | number) => [...userKeys.details(), id] as const +} as const; + +// ============================================================================ +// Custom Query Keys +// ============================================================================ + +export const customQueryKeys = { + /** Query key for currentUser */currentUser: () => ["currentUser"] as const, + /** Query key for searchUsers */searchUsers: (variables: object) => ["searchUsers", variables] as const +} as const; +/** + +// ============================================================================ +// Unified Query Key Store +// ============================================================================ + + * Unified query key store + * + * Use this for type-safe query key access across your application. + * + * @example + * \`\`\`ts + * // Invalidate all user queries + * queryClient.invalidateQueries({ queryKey: queryKeys.user.all }); + * + * // Invalidate user list queries + * queryClient.invalidateQueries({ queryKey: queryKeys.user.lists() }); + * + * // Invalidate specific user + * queryClient.invalidateQueries({ queryKey: queryKeys.user.detail(userId) }); + * \`\`\` + */ +export const queryKeys = { + user: userKeys, + custom: customQueryKeys +} as const; +/** Type representing all available query key scopes */ +export type QueryKeyScope = keyof typeof queryKeys; +" +`; + +exports[`generateQueryKeysFile generates query keys with hierarchical relationships (org -> db -> table -> field) 1`] = ` +"/** + * Centralized query key factory + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +// ============================================================================ +// This file provides a centralized, type-safe query key factory following +// the lukemorales query-key-factory pattern for React Query. +// +// Benefits: +// - Single source of truth for all query keys +// - Type-safe key access with autocomplete +// - Hierarchical invalidation (invalidate all 'user.*' queries) +// - Scoped keys for parent-child relationships +// ============================================================================ + +// ============================================================================ +// Scope Types +// ============================================================================ + +export type DatabaseScope = { + organizationId?: string; + organizationId?: string; +}; +export type TableScope = { + databaseId?: string; + organizationId?: string; +}; +export type FieldScope = { + tableId?: string; + databaseId?: string; + organizationId?: string; +}; +// ============================================================================ +// Entity Query Keys +// ============================================================================ + +export const organizationKeys = { + /** All organization queries */all: ["organization"] as const, + /** List query keys */lists: () => [...organizationKeys.all, "list"] as const, + /** List query key with variables */list: (variables?: object) => [...organizationKeys.lists(), variables] as const, + /** Detail query keys */details: () => [...organizationKeys.all, "detail"] as const, + /** Detail query key for specific item */detail: (id: string | number) => [...organizationKeys.details(), id] as const +} as const; +export const databaseKeys = { + /** All database queries */all: ["database"] as const, + /** Database queries scoped to a specific organization */byOrganization: (organizationId: string) => ["database", { + organizationId + }] as const, + /** Database queries scoped to a specific organization */byOrganization: (organizationId: string) => ["database", { + organizationId + }] as const, + /** Get scope-aware base key */scoped: (scope?: DatabaseScope) => { + if (scope?.organizationId) { + return databaseKeys.byOrganization(scope.organizationId); + } + if (scope?.organizationId) { + return databaseKeys.byOrganization(scope.organizationId); + } + return databaseKeys.all; + }, + /** List query keys (optionally scoped) */lists: (scope?: DatabaseScope) => [...databaseKeys.scoped(scope), "list"] as const, + /** List query key with variables */list: (variables?: object, scope?: DatabaseScope) => [...databaseKeys.lists(scope), variables] as const, + /** Detail query keys (optionally scoped) */details: (scope?: DatabaseScope) => [...databaseKeys.scoped(scope), "detail"] as const, + /** Detail query key for specific item */detail: (id: string | number, scope?: DatabaseScope) => [...databaseKeys.details(scope), id] as const +} as const; +export const tableKeys = { + /** All table queries */all: ["table"] as const, + /** Table queries scoped to a specific database */byDatabase: (databaseId: string) => ["table", { + databaseId + }] as const, + /** Table queries scoped to a specific organization */byOrganization: (organizationId: string) => ["table", { + organizationId + }] as const, + /** Get scope-aware base key */scoped: (scope?: TableScope) => { + if (scope?.databaseId) { + return tableKeys.byDatabase(scope.databaseId); + } + if (scope?.organizationId) { + return tableKeys.byOrganization(scope.organizationId); + } + return tableKeys.all; + }, + /** List query keys (optionally scoped) */lists: (scope?: TableScope) => [...tableKeys.scoped(scope), "list"] as const, + /** List query key with variables */list: (variables?: object, scope?: TableScope) => [...tableKeys.lists(scope), variables] as const, + /** Detail query keys (optionally scoped) */details: (scope?: TableScope) => [...tableKeys.scoped(scope), "detail"] as const, + /** Detail query key for specific item */detail: (id: string | number, scope?: TableScope) => [...tableKeys.details(scope), id] as const +} as const; +export const fieldKeys = { + /** All field queries */all: ["field"] as const, + /** Field queries scoped to a specific table */byTable: (tableId: string) => ["field", { + tableId + }] as const, + /** Field queries scoped to a specific database */byDatabase: (databaseId: string) => ["field", { + databaseId + }] as const, + /** Field queries scoped to a specific organization */byOrganization: (organizationId: string) => ["field", { + organizationId + }] as const, + /** Get scope-aware base key */scoped: (scope?: FieldScope) => { + if (scope?.tableId) { + return fieldKeys.byTable(scope.tableId); + } + if (scope?.databaseId) { + return fieldKeys.byDatabase(scope.databaseId); + } + if (scope?.organizationId) { + return fieldKeys.byOrganization(scope.organizationId); + } + return fieldKeys.all; + }, + /** List query keys (optionally scoped) */lists: (scope?: FieldScope) => [...fieldKeys.scoped(scope), "list"] as const, + /** List query key with variables */list: (variables?: object, scope?: FieldScope) => [...fieldKeys.lists(scope), variables] as const, + /** Detail query keys (optionally scoped) */details: (scope?: FieldScope) => [...fieldKeys.scoped(scope), "detail"] as const, + /** Detail query key for specific item */detail: (id: string | number, scope?: FieldScope) => [...fieldKeys.details(scope), id] as const +} as const; +/** + +// ============================================================================ +// Unified Query Key Store +// ============================================================================ + + * Unified query key store + * + * Use this for type-safe query key access across your application. + * + * @example + * \`\`\`ts + * // Invalidate all user queries + * queryClient.invalidateQueries({ queryKey: queryKeys.user.all }); + * + * // Invalidate user list queries + * queryClient.invalidateQueries({ queryKey: queryKeys.user.lists() }); + * + * // Invalidate specific user + * queryClient.invalidateQueries({ queryKey: queryKeys.user.detail(userId) }); + * \`\`\` + */ +export const queryKeys = { + organization: organizationKeys, + database: databaseKeys, + table: tableKeys, + field: fieldKeys +} as const; +/** Type representing all available query key scopes */ +export type QueryKeyScope = keyof typeof queryKeys; +" +`; + +exports[`generateQueryKeysFile generates query keys with simple parent-child relationship 1`] = ` +"/** + * Centralized query key factory + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +// ============================================================================ +// This file provides a centralized, type-safe query key factory following +// the lukemorales query-key-factory pattern for React Query. +// +// Benefits: +// - Single source of truth for all query keys +// - Type-safe key access with autocomplete +// - Hierarchical invalidation (invalidate all 'user.*' queries) +// - Scoped keys for parent-child relationships +// ============================================================================ + +// ============================================================================ +// Scope Types +// ============================================================================ + +export type PostScope = { + authorId?: string; + authorId?: string; +}; +// ============================================================================ +// Entity Query Keys +// ============================================================================ + +export const userKeys = { + /** All user queries */all: ["user"] as const, + /** List query keys */lists: () => [...userKeys.all, "list"] as const, + /** List query key with variables */list: (variables?: object) => [...userKeys.lists(), variables] as const, + /** Detail query keys */details: () => [...userKeys.all, "detail"] as const, + /** Detail query key for specific item */detail: (id: string | number) => [...userKeys.details(), id] as const +} as const; +export const postKeys = { + /** All post queries */all: ["post"] as const, + /** Post queries scoped to a specific user */byUser: (authorId: string) => ["post", { + authorId + }] as const, + /** Post queries scoped to a specific user */byUser: (authorId: string) => ["post", { + authorId + }] as const, + /** Get scope-aware base key */scoped: (scope?: PostScope) => { + if (scope?.authorId) { + return postKeys.byUser(scope.authorId); + } + if (scope?.userId) { + return postKeys.byUser(scope.userId); + } + return postKeys.all; + }, + /** List query keys (optionally scoped) */lists: (scope?: PostScope) => [...postKeys.scoped(scope), "list"] as const, + /** List query key with variables */list: (variables?: object, scope?: PostScope) => [...postKeys.lists(scope), variables] as const, + /** Detail query keys (optionally scoped) */details: (scope?: PostScope) => [...postKeys.scoped(scope), "detail"] as const, + /** Detail query key for specific item */detail: (id: string | number, scope?: PostScope) => [...postKeys.details(scope), id] as const +} as const; +/** + +// ============================================================================ +// Unified Query Key Store +// ============================================================================ + + * Unified query key store + * + * Use this for type-safe query key access across your application. + * + * @example + * \`\`\`ts + * // Invalidate all user queries + * queryClient.invalidateQueries({ queryKey: queryKeys.user.all }); + * + * // Invalidate user list queries + * queryClient.invalidateQueries({ queryKey: queryKeys.user.lists() }); + * + * // Invalidate specific user + * queryClient.invalidateQueries({ queryKey: queryKeys.user.detail(userId) }); + * \`\`\` + */ +export const queryKeys = { + user: userKeys, + post: postKeys +} as const; +/** Type representing all available query key scopes */ +export type QueryKeyScope = keyof typeof queryKeys; +" +`; + +exports[`generateQueryKeysFile generates query keys without scoped keys when disabled 1`] = ` +"/** + * Centralized query key factory + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +// ============================================================================ +// This file provides a centralized, type-safe query key factory following +// the lukemorales query-key-factory pattern for React Query. +// +// Benefits: +// - Single source of truth for all query keys +// - Type-safe key access with autocomplete +// - Hierarchical invalidation (invalidate all 'user.*' queries) +// - Scoped keys for parent-child relationships +// ============================================================================ + +// ============================================================================ +// Entity Query Keys +// ============================================================================ + +export const userKeys = { + /** All user queries */all: ["user"] as const, + /** List query keys */lists: () => [...userKeys.all, "list"] as const, + /** List query key with variables */list: (variables?: object) => [...userKeys.lists(), variables] as const, + /** Detail query keys */details: () => [...userKeys.all, "detail"] as const, + /** Detail query key for specific item */detail: (id: string | number) => [...userKeys.details(), id] as const +} as const; +export const postKeys = { + /** All post queries */all: ["post"] as const, + /** List query keys */lists: () => [...postKeys.all, "list"] as const, + /** List query key with variables */list: (variables?: object) => [...postKeys.lists(), variables] as const, + /** Detail query keys */details: () => [...postKeys.all, "detail"] as const, + /** Detail query key for specific item */detail: (id: string | number) => [...postKeys.details(), id] as const +} as const; +/** + +// ============================================================================ +// Unified Query Key Store +// ============================================================================ + + * Unified query key store + * + * Use this for type-safe query key access across your application. + * + * @example + * \`\`\`ts + * // Invalidate all user queries + * queryClient.invalidateQueries({ queryKey: queryKeys.user.all }); + * + * // Invalidate user list queries + * queryClient.invalidateQueries({ queryKey: queryKeys.user.lists() }); + * + * // Invalidate specific user + * queryClient.invalidateQueries({ queryKey: queryKeys.user.detail(userId) }); + * \`\`\` + */ +export const queryKeys = { + user: userKeys, + post: postKeys +} as const; +/** Type representing all available query key scopes */ +export type QueryKeyScope = keyof typeof queryKeys; +" +`; diff --git a/graphql/codegen/src/__tests__/codegen/__snapshots__/react-query-hooks.test.ts.snap b/graphql/codegen/src/__tests__/codegen/__snapshots__/react-query-hooks.test.ts.snap new file mode 100644 index 000000000..b5b055b2d --- /dev/null +++ b/graphql/codegen/src/__tests__/codegen/__snapshots__/react-query-hooks.test.ts.snap @@ -0,0 +1,1830 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Barrel File Generators generateCustomMutationsBarrel generates custom mutations barrel 1`] = ` +"/** + * Mutation hooks barrel export + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ +export * from "./useCreateUserMutation"; +export * from "./useUpdateUserMutation"; +export * from "./useDeleteUserMutation"; +export * from "./useLoginMutation"; +export * from "./useLogoutMutation"; +export * from "./useRegisterMutation";" +`; + +exports[`Barrel File Generators generateCustomQueriesBarrel generates custom queries barrel 1`] = ` +"/** + * Query hooks barrel export + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ +export * from "./useUsersQuery"; +export * from "./useUserQuery"; +export * from "./useCurrentUserQuery"; +export * from "./useSearchUsersQuery";" +`; + +exports[`Barrel File Generators generateMainBarrel generates main barrel with all options enabled 1`] = ` +"/** + * Auto-generated GraphQL SDK + * @generated by @constructive-io/graphql-codegen + * + * Tables: User, Post + * + * Usage: + * + * 1. Configure the client: + * \`\`\`ts + * import { configure } from './generated'; + * + * configure({ + * endpoint: 'https://api.example.com/graphql', + * headers: { Authorization: 'Bearer ' }, + * }); + * \`\`\` + * + * 2. Use the hooks: + * \`\`\`tsx + * import { useCarsQuery, useCreateCarMutation } from './generated'; + * + * function MyComponent() { + * const { data, isLoading } = useCarsQuery({ first: 10 }); + * const { mutate } = useCreateCarMutation(); + * // ... + * } + * \`\`\` + */ +export * from "./client"; +export * from "./types"; +export * from "./schema-types"; +export * from "./query-keys"; +export * from "./mutation-keys"; +export * from "./invalidation"; +export * from "./queries"; +export * from "./mutations";" +`; + +exports[`Barrel File Generators generateMainBarrel generates main barrel without custom operations 1`] = ` +"/** + * Auto-generated GraphQL SDK + * @generated by @constructive-io/graphql-codegen + * + * Tables: User + * + * Usage: + * + * 1. Configure the client: + * \`\`\`ts + * import { configure } from './generated'; + * + * configure({ + * endpoint: 'https://api.example.com/graphql', + * headers: { Authorization: 'Bearer ' }, + * }); + * \`\`\` + * + * 2. Use the hooks: + * \`\`\`tsx + * import { useCarsQuery, useCreateCarMutation } from './generated'; + * + * function MyComponent() { + * const { data, isLoading } = useCarsQuery({ first: 10 }); + * const { mutate } = useCreateCarMutation(); + * // ... + * } + * \`\`\` + */ +export * from "./client"; +export * from "./types"; +export * from "./queries"; +export * from "./mutations";" +`; + +exports[`Barrel File Generators generateMainBarrel generates main barrel without mutations 1`] = ` +"/** + * Auto-generated GraphQL SDK + * @generated by @constructive-io/graphql-codegen + * + * Tables: User, Post + * + * Usage: + * + * 1. Configure the client: + * \`\`\`ts + * import { configure } from './generated'; + * + * configure({ + * endpoint: 'https://api.example.com/graphql', + * headers: { Authorization: 'Bearer ' }, + * }); + * \`\`\` + * + * 2. Use the hooks: + * \`\`\`tsx + * import { useCarsQuery, useCreateCarMutation } from './generated'; + * + * function MyComponent() { + * const { data, isLoading } = useCarsQuery({ first: 10 }); + * const { mutate } = useCreateCarMutation(); + * // ... + * } + * \`\`\` + */ +export * from "./client"; +export * from "./types"; +export * from "./schema-types"; +export * from "./queries";" +`; + +exports[`Barrel File Generators generateMutationsBarrel generates mutations barrel for multiple tables 1`] = ` +"/** + * Mutation hooks barrel export + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ +export * from "./useCreateUserMutation"; +export * from "./useUpdateUserMutation"; +export * from "./useDeleteUserMutation"; +export * from "./useCreatePostMutation"; +export * from "./useUpdatePostMutation"; +export * from "./useDeletePostMutation";" +`; + +exports[`Barrel File Generators generateMutationsBarrel generates mutations barrel for single table 1`] = ` +"/** + * Mutation hooks barrel export + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ +export * from "./useCreateUserMutation"; +export * from "./useUpdateUserMutation"; +export * from "./useDeleteUserMutation";" +`; + +exports[`Barrel File Generators generateQueriesBarrel generates queries barrel for multiple tables 1`] = ` +"/** + * Query hooks barrel export + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ +export * from "./useUsersQuery"; +export * from "./useUserQuery"; +export * from "./usePostsQuery"; +export * from "./usePostQuery";" +`; + +exports[`Barrel File Generators generateQueriesBarrel generates queries barrel for single table 1`] = ` +"/** + * Query hooks barrel export + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ +export * from "./useUsersQuery"; +export * from "./useUserQuery";" +`; + +exports[`Custom Mutation Hook Generators generateCustomMutationHook generates custom mutation hook with arguments 1`] = ` +"/** + * Custom mutation hook for login + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +import { useMutation } from "@tanstack/react-query"; +import type { UseMutationOptions } from "@tanstack/react-query"; +import { execute } from "../client"; +import type { LoginPayload } from "../schema-types"; +import { customMutationKeys } from "../mutation-keys"; +/** GraphQL mutation document */ +export const loginMutationDocument = \` +mutation LoginMutation($email: String!, $password: String!) { + login(email: $email, password: $password) { + token + } +} +\`; +export interface LoginMutationVariables { + email: string; + password: string; +} +export interface LoginMutationResult { + login: LoginPayload; +} +export function useLoginMutation(options?: Omit, 'mutationFn'>) { + return useMutation({ + mutationKey: customMutationKeys.login(), + mutationFn: (variables: LoginMutationVariables) => execute(loginMutationDocument, variables), + ...options + }); +}" +`; + +exports[`Custom Mutation Hook Generators generateCustomMutationHook generates custom mutation hook with input object argument 1`] = ` +"/** + * Custom mutation hook for register + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +import { useMutation } from "@tanstack/react-query"; +import type { UseMutationOptions } from "@tanstack/react-query"; +import { execute } from "../client"; +import type { RegisterInput, RegisterPayload } from "../schema-types"; +import { customMutationKeys } from "../mutation-keys"; +/** GraphQL mutation document */ +export const registerMutationDocument = \` +mutation RegisterMutation($input: RegisterInput!) { + register(input: $input) { + token + } +} +\`; +export interface RegisterMutationVariables { + input: RegisterInput; +} +export interface RegisterMutationResult { + register: RegisterPayload; +} +export function useRegisterMutation(options?: Omit, 'mutationFn'>) { + return useMutation({ + mutationKey: customMutationKeys.register(), + mutationFn: (variables: RegisterMutationVariables) => execute(registerMutationDocument, variables), + ...options + }); +}" +`; + +exports[`Custom Mutation Hook Generators generateCustomMutationHook generates custom mutation hook without arguments 1`] = ` +"/** + * Custom mutation hook for logout + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +import { useMutation } from "@tanstack/react-query"; +import type { UseMutationOptions } from "@tanstack/react-query"; +import { execute } from "../client"; +import type { LogoutPayload } from "../schema-types"; +import { customMutationKeys } from "../mutation-keys"; +/** GraphQL mutation document */ +export const logoutMutationDocument = \` +mutation LogoutMutation { + logout { + success + } +} +\`; +export interface LogoutMutationResult { + logout: LogoutPayload; +} +export function useLogoutMutation(options?: Omit, 'mutationFn'>) { + return useMutation({ + mutationKey: customMutationKeys.logout(), + mutationFn: () => execute(logoutMutationDocument), + ...options + }); +}" +`; + +exports[`Custom Mutation Hook Generators generateCustomMutationHook generates custom mutation hook without centralized keys 1`] = ` +"/** + * Custom mutation hook for login + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +import { useMutation } from "@tanstack/react-query"; +import type { UseMutationOptions } from "@tanstack/react-query"; +import { execute } from "../client"; +import type { LoginPayload } from "../schema-types"; +/** GraphQL mutation document */ +export const loginMutationDocument = \` +mutation LoginMutation($email: String!, $password: String!) { + login(email: $email, password: $password) { + token + } +} +\`; +export interface LoginMutationVariables { + email: string; + password: string; +} +export interface LoginMutationResult { + login: LoginPayload; +} +export function useLoginMutation(options?: Omit, 'mutationFn'>) { + return useMutation({ + mutationFn: (variables: LoginMutationVariables) => execute(loginMutationDocument, variables), + ...options + }); +}" +`; + +exports[`Custom Query Hook Generators generateCustomQueryHook generates custom query hook with arguments 1`] = ` +"/** + * Custom query hook for searchUsers + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +import { useQuery } from "@tanstack/react-query"; +import type { UseQueryOptions, QueryClient } from "@tanstack/react-query"; +import { execute } from "../client"; +import type { ExecuteOptions } from "../client"; +import type { User } from "../schema-types"; +import { customQueryKeys } from "../query-keys"; +/** GraphQL query document */ +export const searchUsersQueryDocument = \` +query SearchUsersQuery($query: String!, $limit: Int) { + searchUsers(query: $query, limit: $limit) +} +\`; +export interface SearchUsersQueryVariables { + query: string; + limit?: number; +} +export interface SearchUsersQueryResult { + searchUsers: User[]; +} +/** Query key factory - re-exported from query-keys.ts */ +export const searchUsersQueryKey = customQueryKeys.searchUsers; +/** + * Search users by name or email + * + * @example + * \`\`\`tsx + * const { data, isLoading } = useSearchUsersQuery({ query, limit }); + * + * if (data?.searchUsers) { + * console.log(data.searchUsers); + * } + * \`\`\` + */ +export function useSearchUsersQuery(variables: SearchUsersQueryVariables, options?: Omit, 'queryKey' | 'queryFn'>) { + return useQuery({ + queryKey: searchUsersQueryKey(variables), + queryFn: () => execute(searchUsersQueryDocument, variables), + enabled: !!variables && options?.enabled !== false, + ...options + }); +} +/** + * Fetch searchUsers without React hooks + * + * @example + * \`\`\`ts + * const data = await fetchSearchUsersQuery({ query, limit }); + * \`\`\` + */ +export async function fetchSearchUsersQuery(variables: SearchUsersQueryVariables, options?: ExecuteOptions): Promise { + return execute(searchUsersQueryDocument, variables, options); +} +/** + * Prefetch searchUsers for SSR or cache warming + * + * @example + * \`\`\`ts + * await prefetchSearchUsersQuery(queryClient, { query, limit }); + * \`\`\` + */ +export async function prefetchSearchUsersQuery(queryClient: QueryClient, variables: SearchUsersQueryVariables, options?: ExecuteOptions): Promise { + await queryClient.prefetchQuery({ + queryKey: searchUsersQueryKey(variables), + queryFn: () => execute(searchUsersQueryDocument, variables, options) + }); +}" +`; + +exports[`Custom Query Hook Generators generateCustomQueryHook generates custom query hook without arguments 1`] = ` +"/** + * Custom query hook for currentUser + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +import { useQuery } from "@tanstack/react-query"; +import type { UseQueryOptions, QueryClient } from "@tanstack/react-query"; +import { execute } from "../client"; +import type { ExecuteOptions } from "../client"; +import type { User } from "../schema-types"; +import { customQueryKeys } from "../query-keys"; +/** GraphQL query document */ +export const currentUserQueryDocument = \` +query CurrentUserQuery { + currentUser +} +\`; +export interface CurrentUserQueryResult { + currentUser: User; +} +/** Query key factory - re-exported from query-keys.ts */ +export const currentUserQueryKey = customQueryKeys.currentUser; +/** + * Get the current authenticated user + * + * @example + * \`\`\`tsx + * const { data, isLoading } = useCurrentUserQuery(); + * + * if (data?.currentUser) { + * console.log(data.currentUser); + * } + * \`\`\` + */ +export function useCurrentUserQuery(options?: Omit, 'queryKey' | 'queryFn'>) { + return useQuery({ + queryKey: currentUserQueryKey(), + queryFn: () => execute(currentUserQueryDocument), + ...options + }); +} +/** + * Fetch currentUser without React hooks + * + * @example + * \`\`\`ts + * const data = await fetchCurrentUserQuery(); + * \`\`\` + */ +export async function fetchCurrentUserQuery(options?: ExecuteOptions): Promise { + return execute(currentUserQueryDocument, undefined, options); +} +/** + * Prefetch currentUser for SSR or cache warming + * + * @example + * \`\`\`ts + * await prefetchCurrentUserQuery(queryClient); + * \`\`\` + */ +export async function prefetchCurrentUserQuery(queryClient: QueryClient, options?: ExecuteOptions): Promise { + await queryClient.prefetchQuery({ + queryKey: currentUserQueryKey(), + queryFn: () => execute(currentUserQueryDocument, undefined, options) + }); +}" +`; + +exports[`Custom Query Hook Generators generateCustomQueryHook generates custom query hook without centralized keys 1`] = ` +"/** + * Custom query hook for currentUser + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +import { useQuery } from "@tanstack/react-query"; +import type { UseQueryOptions, QueryClient } from "@tanstack/react-query"; +import { execute } from "../client"; +import type { ExecuteOptions } from "../client"; +import type { User } from "../schema-types"; +/** GraphQL query document */ +export const currentUserQueryDocument = \` +query CurrentUserQuery { + currentUser +} +\`; +export interface CurrentUserQueryResult { + currentUser: User; +} +/** Query key factory for caching */ +export const currentUserQueryKey = () => ["currentUser"] as const; +/** + * Get the current authenticated user + * + * @example + * \`\`\`tsx + * const { data, isLoading } = useCurrentUserQuery(); + * + * if (data?.currentUser) { + * console.log(data.currentUser); + * } + * \`\`\` + */ +export function useCurrentUserQuery(options?: Omit, 'queryKey' | 'queryFn'>) { + return useQuery({ + queryKey: currentUserQueryKey(), + queryFn: () => execute(currentUserQueryDocument), + ...options + }); +} +/** + * Fetch currentUser without React hooks + * + * @example + * \`\`\`ts + * const data = await fetchCurrentUserQuery(); + * \`\`\` + */ +export async function fetchCurrentUserQuery(options?: ExecuteOptions): Promise { + return execute(currentUserQueryDocument, undefined, options); +} +/** + * Prefetch currentUser for SSR or cache warming + * + * @example + * \`\`\`ts + * await prefetchCurrentUserQuery(queryClient); + * \`\`\` + */ +export async function prefetchCurrentUserQuery(queryClient: QueryClient, options?: ExecuteOptions): Promise { + await queryClient.prefetchQuery({ + queryKey: currentUserQueryKey(), + queryFn: () => execute(currentUserQueryDocument, undefined, options) + }); +}" +`; + +exports[`Mutation Hook Generators generateCreateMutationHook generates create mutation hook for simple table 1`] = ` +"/** + * Create mutation hook for User + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import type { UseMutationOptions } from "@tanstack/react-query"; +import { execute } from "../client"; +import type { User } from "../types"; +import { userKeys } from "../query-keys"; +import { userMutationKeys } from "../mutation-keys"; +export type { User } from "../types"; +export const createUserMutationDocument = \` +mutation CreateUserMutation($input: CreateUserInput!) { + createUser(input: $input) { + user { + id + email + name + createdAt + } + } +} +\`; +/** Input type for creating a User */ +interface UserCreateInput { + email?: string | null; + name?: string | null; +} +export interface CreateUserMutationVariables { + input: { + user: UserCreateInput; + }; +} +export interface CreateUserMutationResult { + createUser: { + user: User; + }; +} +/** + * Mutation hook for creating a User + * + * @example + * \`\`\`tsx + * const { mutate, isPending } = useCreateUserMutation(); + * + * mutate({ + * input: { + * user: { + * // ... fields + * }, + * }, + * }); + * \`\`\` + */ +export function useCreateUserMutation(options?: Omit, 'mutationFn'>) { + const queryClient = useQueryClient(); + return useMutation({ + mutationKey: userMutationKeys.create(), + mutationFn: (variables: CreateUserMutationVariables) => execute(createUserMutationDocument, variables), + onSuccess: () => { + queryClient.invalidateQueries({ + queryKey: userKeys.lists() + }); + }, + ...options + }); +}" +`; + +exports[`Mutation Hook Generators generateCreateMutationHook generates create mutation hook for table with relationships 1`] = ` +"/** + * Create mutation hook for Post + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import type { UseMutationOptions } from "@tanstack/react-query"; +import { execute } from "../client"; +import type { Post } from "../types"; +import { postKeys } from "../query-keys"; +import type { PostScope } from "../query-keys"; +import { postMutationKeys } from "../mutation-keys"; +export type { Post } from "../types"; +export const createPostMutationDocument = \` +mutation CreatePostMutation($input: CreatePostInput!) { + createPost(input: $input) { + post { + id + title + content + authorId + published + createdAt + } + } +} +\`; +/** Input type for creating a Post */ +interface PostCreateInput { + title?: string | null; + content?: string | null; + authorId?: string | null; + published?: boolean | null; +} +export interface CreatePostMutationVariables { + input: { + post: PostCreateInput; + }; +} +export interface CreatePostMutationResult { + createPost: { + post: Post; + }; +} +/** + * Mutation hook for creating a Post + * + * @example + * \`\`\`tsx + * const { mutate, isPending } = useCreatePostMutation(); + * + * mutate({ + * input: { + * post: { + * // ... fields + * }, + * }, + * }); + * \`\`\` + */ +export function useCreatePostMutation(options?: Omit, 'mutationFn'>) { + const queryClient = useQueryClient(); + return useMutation({ + mutationKey: postMutationKeys.create(), + mutationFn: (variables: CreatePostMutationVariables) => execute(createPostMutationDocument, variables), + onSuccess: () => { + queryClient.invalidateQueries({ + queryKey: postKeys.lists() + }); + }, + ...options + }); +}" +`; + +exports[`Mutation Hook Generators generateCreateMutationHook generates create mutation hook without centralized keys 1`] = ` +"/** + * Create mutation hook for User + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import type { UseMutationOptions } from "@tanstack/react-query"; +import { execute } from "../client"; +import type { User } from "../types"; +export type { User } from "../types"; +export const createUserMutationDocument = \` +mutation CreateUserMutation($input: CreateUserInput!) { + createUser(input: $input) { + user { + id + email + name + createdAt + } + } +} +\`; +/** Input type for creating a User */ +interface UserCreateInput { + email?: string | null; + name?: string | null; +} +export interface CreateUserMutationVariables { + input: { + user: UserCreateInput; + }; +} +export interface CreateUserMutationResult { + createUser: { + user: User; + }; +} +/** + * Mutation hook for creating a User + * + * @example + * \`\`\`tsx + * const { mutate, isPending } = useCreateUserMutation(); + * + * mutate({ + * input: { + * user: { + * // ... fields + * }, + * }, + * }); + * \`\`\` + */ +export function useCreateUserMutation(options?: Omit, 'mutationFn'>) { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: (variables: CreateUserMutationVariables) => execute(createUserMutationDocument, variables), + onSuccess: () => { + queryClient.invalidateQueries({ + queryKey: ["user", "list"] + }); + }, + ...options + }); +}" +`; + +exports[`Mutation Hook Generators generateDeleteMutationHook generates delete mutation hook for simple table 1`] = ` +"/** + * Delete mutation hook for User + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import type { UseMutationOptions } from "@tanstack/react-query"; +import { execute } from "../client"; +import { userKeys } from "../query-keys"; +import { userMutationKeys } from "../mutation-keys"; +export const deleteUserMutationDocument = \` +mutation DeleteUserMutation($input: DeleteUserInput!) { + deleteUser(input: $input) { + clientMutationId + deletedId + } +} +\`; +export interface DeleteUserMutationVariables { + input: { + id: string; + }; +} +export interface DeleteUserMutationResult { + deleteUser: { + clientMutationId: string | null; + deletedId: string | null; + }; +} +/** + * Mutation hook for deleting a User + * + * @example + * \`\`\`tsx + * const { mutate, isPending } = useDeleteUserMutation(); + * + * mutate({ + * input: { + * id: 'value-to-delete', + * }, + * }); + * \`\`\` + */ +export function useDeleteUserMutation(options?: Omit, 'mutationFn'>) { + const queryClient = useQueryClient(); + return useMutation({ + mutationKey: userMutationKeys.all, + mutationFn: (variables: DeleteUserMutationVariables) => execute(deleteUserMutationDocument, variables), + onSuccess: (_, variables) => { + queryClient.removeQueries({ + queryKey: userKeys.detail(variables.input.id) + }); + queryClient.invalidateQueries({ + queryKey: userKeys.lists() + }); + }, + ...options + }); +}" +`; + +exports[`Mutation Hook Generators generateDeleteMutationHook generates delete mutation hook for table with relationships 1`] = ` +"/** + * Delete mutation hook for Post + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import type { UseMutationOptions } from "@tanstack/react-query"; +import { execute } from "../client"; +import { postKeys } from "../query-keys"; +import type { PostScope } from "../query-keys"; +import { postMutationKeys } from "../mutation-keys"; +export const deletePostMutationDocument = \` +mutation DeletePostMutation($input: DeletePostInput!) { + deletePost(input: $input) { + clientMutationId + deletedId + } +} +\`; +export interface DeletePostMutationVariables { + input: { + id: string; + }; +} +export interface DeletePostMutationResult { + deletePost: { + clientMutationId: string | null; + deletedId: string | null; + }; +} +/** + * Mutation hook for deleting a Post + * + * @example + * \`\`\`tsx + * const { mutate, isPending } = useDeletePostMutation(); + * + * mutate({ + * input: { + * id: 'value-to-delete', + * }, + * }); + * \`\`\` + */ +export function useDeletePostMutation(options?: Omit, 'mutationFn'>) { + const queryClient = useQueryClient(); + return useMutation({ + mutationKey: postMutationKeys.all, + mutationFn: (variables: DeletePostMutationVariables) => execute(deletePostMutationDocument, variables), + onSuccess: (_, variables) => { + queryClient.removeQueries({ + queryKey: postKeys.detail(variables.input.id) + }); + queryClient.invalidateQueries({ + queryKey: postKeys.lists() + }); + }, + ...options + }); +}" +`; + +exports[`Mutation Hook Generators generateDeleteMutationHook generates delete mutation hook without centralized keys 1`] = ` +"/** + * Delete mutation hook for User + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import type { UseMutationOptions } from "@tanstack/react-query"; +import { execute } from "../client"; +export const deleteUserMutationDocument = \` +mutation DeleteUserMutation($input: DeleteUserInput!) { + deleteUser(input: $input) { + clientMutationId + deletedId + } +} +\`; +export interface DeleteUserMutationVariables { + input: { + id: string; + }; +} +export interface DeleteUserMutationResult { + deleteUser: { + clientMutationId: string | null; + deletedId: string | null; + }; +} +/** + * Mutation hook for deleting a User + * + * @example + * \`\`\`tsx + * const { mutate, isPending } = useDeleteUserMutation(); + * + * mutate({ + * input: { + * id: 'value-to-delete', + * }, + * }); + * \`\`\` + */ +export function useDeleteUserMutation(options?: Omit, 'mutationFn'>) { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: (variables: DeleteUserMutationVariables) => execute(deleteUserMutationDocument, variables), + onSuccess: (_, variables) => { + queryClient.removeQueries({ + queryKey: ["user", "detail", variables.input.id] + }); + queryClient.invalidateQueries({ + queryKey: ["user", "list"] + }); + }, + ...options + }); +}" +`; + +exports[`Mutation Hook Generators generateUpdateMutationHook generates update mutation hook for simple table 1`] = ` +"/** + * Update mutation hook for User + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import type { UseMutationOptions } from "@tanstack/react-query"; +import { execute } from "../client"; +import type { User } from "../types"; +import { userKeys } from "../query-keys"; +import { userMutationKeys } from "../mutation-keys"; +export type { User } from "../types"; +export const updateUserMutationDocument = \` +mutation UpdateUserMutation($input: UpdateUserInput!) { + updateUser(input: $input) { + user { + id + email + name + createdAt + } + } +} +\`; +/** Patch type for updating a User - all fields optional */ +interface UserPatch { + email?: string | null; + name?: string | null; + createdAt?: string | null; +} +export interface UpdateUserMutationVariables { + input: { + id: string; + patch: UserPatch; + }; +} +export interface UpdateUserMutationResult { + updateUser: { + user: User; + }; +} +/** + * Mutation hook for updating a User + * + * @example + * \`\`\`tsx + * const { mutate, isPending } = useUpdateUserMutation(); + * + * mutate({ + * input: { + * id: 'value-here', + * patch: { + * // ... fields to update + * }, + * }, + * }); + * \`\`\` + */ +export function useUpdateUserMutation(options?: Omit, 'mutationFn'>) { + const queryClient = useQueryClient(); + return useMutation({ + mutationKey: userMutationKeys.all, + mutationFn: (variables: UpdateUserMutationVariables) => execute(updateUserMutationDocument, variables), + onSuccess: (_, variables) => { + queryClient.invalidateQueries({ + queryKey: userKeys.detail(variables.input.id) + }); + queryClient.invalidateQueries({ + queryKey: userKeys.lists() + }); + }, + ...options + }); +}" +`; + +exports[`Mutation Hook Generators generateUpdateMutationHook generates update mutation hook for table with relationships 1`] = ` +"/** + * Update mutation hook for Post + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import type { UseMutationOptions } from "@tanstack/react-query"; +import { execute } from "../client"; +import type { Post } from "../types"; +import { postKeys } from "../query-keys"; +import type { PostScope } from "../query-keys"; +import { postMutationKeys } from "../mutation-keys"; +export type { Post } from "../types"; +export const updatePostMutationDocument = \` +mutation UpdatePostMutation($input: UpdatePostInput!) { + updatePost(input: $input) { + post { + id + title + content + authorId + published + createdAt + } + } +} +\`; +/** Patch type for updating a Post - all fields optional */ +interface PostPatch { + title?: string | null; + content?: string | null; + authorId?: string | null; + published?: boolean | null; + createdAt?: string | null; +} +export interface UpdatePostMutationVariables { + input: { + id: string; + patch: PostPatch; + }; +} +export interface UpdatePostMutationResult { + updatePost: { + post: Post; + }; +} +/** + * Mutation hook for updating a Post + * + * @example + * \`\`\`tsx + * const { mutate, isPending } = useUpdatePostMutation(); + * + * mutate({ + * input: { + * id: 'value-here', + * patch: { + * // ... fields to update + * }, + * }, + * }); + * \`\`\` + */ +export function useUpdatePostMutation(options?: Omit, 'mutationFn'>) { + const queryClient = useQueryClient(); + return useMutation({ + mutationKey: postMutationKeys.all, + mutationFn: (variables: UpdatePostMutationVariables) => execute(updatePostMutationDocument, variables), + onSuccess: (_, variables) => { + queryClient.invalidateQueries({ + queryKey: postKeys.detail(variables.input.id) + }); + queryClient.invalidateQueries({ + queryKey: postKeys.lists() + }); + }, + ...options + }); +}" +`; + +exports[`Mutation Hook Generators generateUpdateMutationHook generates update mutation hook without centralized keys 1`] = ` +"/** + * Update mutation hook for User + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +import { useMutation, useQueryClient } from "@tanstack/react-query"; +import type { UseMutationOptions } from "@tanstack/react-query"; +import { execute } from "../client"; +import type { User } from "../types"; +export type { User } from "../types"; +export const updateUserMutationDocument = \` +mutation UpdateUserMutation($input: UpdateUserInput!) { + updateUser(input: $input) { + user { + id + email + name + createdAt + } + } +} +\`; +/** Patch type for updating a User - all fields optional */ +interface UserPatch { + email?: string | null; + name?: string | null; + createdAt?: string | null; +} +export interface UpdateUserMutationVariables { + input: { + id: string; + patch: UserPatch; + }; +} +export interface UpdateUserMutationResult { + updateUser: { + user: User; + }; +} +/** + * Mutation hook for updating a User + * + * @example + * \`\`\`tsx + * const { mutate, isPending } = useUpdateUserMutation(); + * + * mutate({ + * input: { + * id: 'value-here', + * patch: { + * // ... fields to update + * }, + * }, + * }); + * \`\`\` + */ +export function useUpdateUserMutation(options?: Omit, 'mutationFn'>) { + const queryClient = useQueryClient(); + return useMutation({ + mutationFn: (variables: UpdateUserMutationVariables) => execute(updateUserMutationDocument, variables), + onSuccess: (_, variables) => { + queryClient.invalidateQueries({ + queryKey: ["user", "detail", variables.input.id] + }); + queryClient.invalidateQueries({ + queryKey: ["user", "list"] + }); + }, + ...options + }); +}" +`; + +exports[`Query Hook Generators generateListQueryHook generates list query hook for simple table 1`] = ` +"/** + * List query hook for User + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +import { useQuery } from "@tanstack/react-query"; +import type { UseQueryOptions, QueryClient } from "@tanstack/react-query"; +import { execute } from "../client"; +import type { ExecuteOptions } from "../client"; +import type { User, UUIDFilter, StringFilter, DatetimeFilter } from "../types"; +import { userKeys } from "../query-keys"; +export type { User } from "../types"; +export const usersQueryDocument = \` +query UsersQuery($first: Int, $offset: Int, $filter: UserFilter, $orderBy: [UsersOrderBy!]) { + users(first: $first, offset: $offset, filter: $filter, orderBy: $orderBy) { + totalCount + nodes { + id + email + name + createdAt + } + pageInfo { + hasNextPage + hasPreviousPage + startCursor + endCursor + } + } +} +\`; +interface UserFilter { + id?: UUIDFilter; + email?: StringFilter; + name?: StringFilter; + createdAt?: DatetimeFilter; + and?: UserFilter[]; + or?: UserFilter[]; + not?: UserFilter; +} +type UsersOrderBy = "ID_ASC" | "ID_DESC" | "EMAIL_ASC" | "EMAIL_DESC" | "NAME_ASC" | "NAME_DESC" | "CREATED_AT_ASC" | "CREATED_AT_DESC" | "NATURAL" | "PRIMARY_KEY_ASC" | "PRIMARY_KEY_DESC"; +export interface UsersQueryVariables { + first?: number; + offset?: number; + filter?: UserFilter; + orderBy?: UsersOrderBy[]; +} +export interface UsersQueryResult { + users: { + totalCount: number; + nodes: User[]; + pageInfo: { + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; + endCursor: string | null; + }; + }; +} +/** Query key factory - re-exported from query-keys.ts */ +export const usersQueryKey = userKeys.list; +/** + * Query hook for fetching User list + * + * @example + * \`\`\`tsx + * const { data, isLoading } = useUsersQuery({ + * first: 10, + * filter: { name: { equalTo: "example" } }, + * orderBy: ['CREATED_AT_DESC'], + * }); + * \`\`\` + */ +export function useUsersQuery(variables?: UsersQueryVariables, options?: Omit, 'queryKey' | 'queryFn'>) { + return useQuery({ + queryKey: userKeys.list(variables), + queryFn: () => execute(usersQueryDocument, variables), + ...options + }); +} +/** + * Fetch User list without React hooks + * + * @example + * \`\`\`ts + * // Direct fetch + * const data = await fetchUsersQuery({ first: 10 }); + * + * // With QueryClient + * const data = await queryClient.fetchQuery({ + * queryKey: usersQueryKey(variables), + * queryFn: () => fetchUsersQuery(variables), + * }); + * \`\`\` + */ +export async function fetchUsersQuery(variables?: UsersQueryVariables, options?: ExecuteOptions): Promise { + return execute(usersQueryDocument, variables, options); +} +/** + * Prefetch User list for SSR or cache warming + * + * @example + * \`\`\`ts + * await prefetchUsersQuery(queryClient, { first: 10 }); + * \`\`\` + */ +export async function prefetchUsersQuery(queryClient: QueryClient, variables?: UsersQueryVariables, options?: ExecuteOptions): Promise { + await queryClient.prefetchQuery({ + queryKey: userKeys.list(variables), + queryFn: () => execute(usersQueryDocument, variables, options) + }); +}" +`; + +exports[`Query Hook Generators generateListQueryHook generates list query hook for table with relationships 1`] = ` +"/** + * List query hook for Post + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +import { useQuery } from "@tanstack/react-query"; +import type { UseQueryOptions, QueryClient } from "@tanstack/react-query"; +import { execute } from "../client"; +import type { ExecuteOptions } from "../client"; +import type { Post, UUIDFilter, StringFilter, BooleanFilter, DatetimeFilter } from "../types"; +import { postKeys } from "../query-keys"; +import type { PostScope } from "../query-keys"; +export type { Post } from "../types"; +export const postsQueryDocument = \` +query PostsQuery($first: Int, $offset: Int, $filter: PostFilter, $orderBy: [PostsOrderBy!]) { + posts(first: $first, offset: $offset, filter: $filter, orderBy: $orderBy) { + totalCount + nodes { + id + title + content + authorId + published + createdAt + } + pageInfo { + hasNextPage + hasPreviousPage + startCursor + endCursor + } + } +} +\`; +interface PostFilter { + id?: UUIDFilter; + title?: StringFilter; + content?: StringFilter; + authorId?: UUIDFilter; + published?: BooleanFilter; + createdAt?: DatetimeFilter; + and?: PostFilter[]; + or?: PostFilter[]; + not?: PostFilter; +} +type PostsOrderBy = "ID_ASC" | "ID_DESC" | "TITLE_ASC" | "TITLE_DESC" | "CONTENT_ASC" | "CONTENT_DESC" | "AUTHOR_ID_ASC" | "AUTHOR_ID_DESC" | "PUBLISHED_ASC" | "PUBLISHED_DESC" | "CREATED_AT_ASC" | "CREATED_AT_DESC" | "NATURAL" | "PRIMARY_KEY_ASC" | "PRIMARY_KEY_DESC"; +export interface PostsQueryVariables { + first?: number; + offset?: number; + filter?: PostFilter; + orderBy?: PostsOrderBy[]; +} +export interface PostsQueryResult { + posts: { + totalCount: number; + nodes: Post[]; + pageInfo: { + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; + endCursor: string | null; + }; + }; +} +/** Query key factory - re-exported from query-keys.ts */ +export const postsQueryKey = postKeys.list; +/** + * Query hook for fetching Post list + * + * @example + * \`\`\`tsx + * const { data, isLoading } = usePostsQuery({ + * first: 10, + * filter: { name: { equalTo: "example" } }, + * orderBy: ['CREATED_AT_DESC'], + * }); + * \`\`\` + * + * @example With scope for hierarchical cache invalidation + * \`\`\`tsx + * const { data } = usePostsQuery( + * { first: 10 }, + * { scope: { parentId: 'parent-id' } } + * ); + * \`\`\` + */ +export function usePostsQuery(variables?: PostsQueryVariables, options?: Omit, 'queryKey' | 'queryFn'> & { scope?: PostScope }) { + const { + scope, + ...queryOptions + } = options ?? {}; + return useQuery({ + queryKey: postKeys.list(variables, scope), + queryFn: () => execute(postsQueryDocument, variables), + ...queryOptions + }); +} +/** + * Fetch Post list without React hooks + * + * @example + * \`\`\`ts + * // Direct fetch + * const data = await fetchPostsQuery({ first: 10 }); + * + * // With QueryClient + * const data = await queryClient.fetchQuery({ + * queryKey: postsQueryKey(variables), + * queryFn: () => fetchPostsQuery(variables), + * }); + * \`\`\` + */ +export async function fetchPostsQuery(variables?: PostsQueryVariables, options?: ExecuteOptions): Promise { + return execute(postsQueryDocument, variables, options); +} +/** + * Prefetch Post list for SSR or cache warming + * + * @example + * \`\`\`ts + * await prefetchPostsQuery(queryClient, { first: 10 }); + * \`\`\` + */ +export async function prefetchPostsQuery(queryClient: QueryClient, variables?: PostsQueryVariables, scope?: PostScope, options?: ExecuteOptions): Promise { + await queryClient.prefetchQuery({ + queryKey: postKeys.list(variables, scope), + queryFn: () => execute(postsQueryDocument, variables, options) + }); +}" +`; + +exports[`Query Hook Generators generateListQueryHook generates list query hook without centralized keys 1`] = ` +"/** + * List query hook for User + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +import { useQuery } from "@tanstack/react-query"; +import type { UseQueryOptions, QueryClient } from "@tanstack/react-query"; +import { execute } from "../client"; +import type { ExecuteOptions } from "../client"; +import type { User, UUIDFilter, StringFilter, DatetimeFilter } from "../types"; +export type { User } from "../types"; +export const usersQueryDocument = \` +query UsersQuery($first: Int, $offset: Int, $filter: UserFilter, $orderBy: [UsersOrderBy!]) { + users(first: $first, offset: $offset, filter: $filter, orderBy: $orderBy) { + totalCount + nodes { + id + email + name + createdAt + } + pageInfo { + hasNextPage + hasPreviousPage + startCursor + endCursor + } + } +} +\`; +interface UserFilter { + id?: UUIDFilter; + email?: StringFilter; + name?: StringFilter; + createdAt?: DatetimeFilter; + and?: UserFilter[]; + or?: UserFilter[]; + not?: UserFilter; +} +type UsersOrderBy = "ID_ASC" | "ID_DESC" | "EMAIL_ASC" | "EMAIL_DESC" | "NAME_ASC" | "NAME_DESC" | "CREATED_AT_ASC" | "CREATED_AT_DESC" | "NATURAL" | "PRIMARY_KEY_ASC" | "PRIMARY_KEY_DESC"; +export interface UsersQueryVariables { + first?: number; + offset?: number; + filter?: UserFilter; + orderBy?: UsersOrderBy[]; +} +export interface UsersQueryResult { + users: { + totalCount: number; + nodes: User[]; + pageInfo: { + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; + endCursor: string | null; + }; + }; +} +export const usersQueryKey = (variables?: UsersQueryVariables) => ["user", "list", variables] as const; +/** + * Query hook for fetching User list + * + * @example + * \`\`\`tsx + * const { data, isLoading } = useUsersQuery({ + * first: 10, + * filter: { name: { equalTo: "example" } }, + * orderBy: ['CREATED_AT_DESC'], + * }); + * \`\`\` + */ +export function useUsersQuery(variables?: UsersQueryVariables, options?: Omit, 'queryKey' | 'queryFn'>) { + return useQuery({ + queryKey: usersQueryKey(variables), + queryFn: () => execute(usersQueryDocument, variables), + ...options + }); +} +/** + * Fetch User list without React hooks + * + * @example + * \`\`\`ts + * // Direct fetch + * const data = await fetchUsersQuery({ first: 10 }); + * + * // With QueryClient + * const data = await queryClient.fetchQuery({ + * queryKey: usersQueryKey(variables), + * queryFn: () => fetchUsersQuery(variables), + * }); + * \`\`\` + */ +export async function fetchUsersQuery(variables?: UsersQueryVariables, options?: ExecuteOptions): Promise { + return execute(usersQueryDocument, variables, options); +} +/** + * Prefetch User list for SSR or cache warming + * + * @example + * \`\`\`ts + * await prefetchUsersQuery(queryClient, { first: 10 }); + * \`\`\` + */ +export async function prefetchUsersQuery(queryClient: QueryClient, variables?: UsersQueryVariables, options?: ExecuteOptions): Promise { + await queryClient.prefetchQuery({ + queryKey: usersQueryKey(variables), + queryFn: () => execute(usersQueryDocument, variables, options) + }); +}" +`; + +exports[`Query Hook Generators generateSingleQueryHook generates single query hook for simple table 1`] = ` +"/** + * Single item query hook for User + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +import { useQuery } from "@tanstack/react-query"; +import type { UseQueryOptions, QueryClient } from "@tanstack/react-query"; +import { execute } from "../client"; +import type { ExecuteOptions } from "../client"; +import type { User } from "../types"; +import { userKeys } from "../query-keys"; +export type { User } from "../types"; +export const userQueryDocument = \` +query UserQuery($id: UUID!) { + user(id: $id) { + id + email + name + createdAt + } +} +\`; +export interface UserQueryVariables { + id: string; +} +export interface UserQueryResult { + user: User | null; +} +/** Query key factory - re-exported from query-keys.ts */ +export const userQueryKey = userKeys.detail; +/** + * Query hook for fetching a single User + * + * @example + * \`\`\`tsx + * const { data, isLoading } = useUserQuery({ id: 'some-id' }); + * \`\`\` + */ +export function useUserQuery(variables: UserQueryVariables, options?: Omit, 'queryKey' | 'queryFn'>) { + return useQuery({ + queryKey: userKeys.detail(variables.id), + queryFn: () => execute(userQueryDocument, variables), + ...options + }); +} +/** + * Fetch a single User without React hooks + * + * @example + * \`\`\`ts + * const data = await fetchUserQuery({ id: 'some-id' }); + * \`\`\` + */ +export async function fetchUserQuery(variables: UserQueryVariables, options?: ExecuteOptions): Promise { + return execute(userQueryDocument, variables, options); +} +/** + * Prefetch a single User for SSR or cache warming + * + * @example + * \`\`\`ts + * await prefetchUserQuery(queryClient, { id: 'some-id' }); + * \`\`\` + */ +export async function prefetchUserQuery(queryClient: QueryClient, variables: UserQueryVariables, options?: ExecuteOptions): Promise { + await queryClient.prefetchQuery({ + queryKey: userKeys.detail(variables.id), + queryFn: () => execute(userQueryDocument, variables, options) + }); +}" +`; + +exports[`Query Hook Generators generateSingleQueryHook generates single query hook for table with relationships 1`] = ` +"/** + * Single item query hook for Post + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +import { useQuery } from "@tanstack/react-query"; +import type { UseQueryOptions, QueryClient } from "@tanstack/react-query"; +import { execute } from "../client"; +import type { ExecuteOptions } from "../client"; +import type { Post } from "../types"; +import { postKeys } from "../query-keys"; +import type { PostScope } from "../query-keys"; +export type { Post } from "../types"; +export const postQueryDocument = \` +query PostQuery($id: UUID!) { + post(id: $id) { + id + title + content + authorId + published + createdAt + } +} +\`; +export interface PostQueryVariables { + id: string; +} +export interface PostQueryResult { + post: Post | null; +} +/** Query key factory - re-exported from query-keys.ts */ +export const postQueryKey = postKeys.detail; +/** + * Query hook for fetching a single Post + * + * @example + * \`\`\`tsx + * const { data, isLoading } = usePostQuery({ id: 'some-id' }); + * \`\`\` + * + * @example With scope for hierarchical cache invalidation + * \`\`\`tsx + * const { data } = usePostQuery( + * { id: 'some-id' }, + * { scope: { parentId: 'parent-id' } } + * ); + * \`\`\` + */ +export function usePostQuery(variables: PostQueryVariables, options?: Omit, 'queryKey' | 'queryFn'> & { scope?: PostScope }) { + const { + scope, + ...queryOptions + } = options ?? {}; + return useQuery({ + queryKey: postKeys.detail(variables.id, scope), + queryFn: () => execute(postQueryDocument, variables), + ...queryOptions + }); +} +/** + * Fetch a single Post without React hooks + * + * @example + * \`\`\`ts + * const data = await fetchPostQuery({ id: 'some-id' }); + * \`\`\` + */ +export async function fetchPostQuery(variables: PostQueryVariables, options?: ExecuteOptions): Promise { + return execute(postQueryDocument, variables, options); +} +/** + * Prefetch a single Post for SSR or cache warming + * + * @example + * \`\`\`ts + * await prefetchPostQuery(queryClient, { id: 'some-id' }); + * \`\`\` + */ +export async function prefetchPostQuery(queryClient: QueryClient, variables: PostQueryVariables, scope?: PostScope, options?: ExecuteOptions): Promise { + await queryClient.prefetchQuery({ + queryKey: postKeys.detail(variables.id, scope), + queryFn: () => execute(postQueryDocument, variables, options) + }); +}" +`; + +exports[`Query Hook Generators generateSingleQueryHook generates single query hook without centralized keys 1`] = ` +"/** + * Single item query hook for User + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +import { useQuery } from "@tanstack/react-query"; +import type { UseQueryOptions, QueryClient } from "@tanstack/react-query"; +import { execute } from "../client"; +import type { ExecuteOptions } from "../client"; +import type { User } from "../types"; +export type { User } from "../types"; +export const userQueryDocument = \` +query UserQuery($id: UUID!) { + user(id: $id) { + id + email + name + createdAt + } +} +\`; +export interface UserQueryVariables { + id: string; +} +export interface UserQueryResult { + user: User | null; +} +export const userQueryKey = (id: string) => ["user", "detail", id] as const; +/** + * Query hook for fetching a single User + * + * @example + * \`\`\`tsx + * const { data, isLoading } = useUserQuery({ id: 'some-id' }); + * \`\`\` + */ +export function useUserQuery(variables: UserQueryVariables, options?: Omit, 'queryKey' | 'queryFn'>) { + return useQuery({ + queryKey: userQueryKey(variables.id), + queryFn: () => execute(userQueryDocument, variables), + ...options + }); +} +/** + * Fetch a single User without React hooks + * + * @example + * \`\`\`ts + * const data = await fetchUserQuery({ id: 'some-id' }); + * \`\`\` + */ +export async function fetchUserQuery(variables: UserQueryVariables, options?: ExecuteOptions): Promise { + return execute(userQueryDocument, variables, options); +} +/** + * Prefetch a single User for SSR or cache warming + * + * @example + * \`\`\`ts + * await prefetchUserQuery(queryClient, { id: 'some-id' }); + * \`\`\` + */ +export async function prefetchUserQuery(queryClient: QueryClient, variables: UserQueryVariables, options?: ExecuteOptions): Promise { + await queryClient.prefetchQuery({ + queryKey: userQueryKey(variables.id), + queryFn: () => execute(userQueryDocument, variables, options) + }); +}" +`; + +exports[`Schema Types Generator generateSchemaTypesFile generates schema types file with empty table types 1`] = ` +"/** + * GraphQL schema types for custom operations + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +import type { BigFloatFilter, BigIntFilter, BitStringFilter, BooleanFilter, DateFilter, DatetimeFilter, FloatFilter, FullTextFilter, IntFilter, IntListFilter, InternetAddressFilter, JSONFilter, StringFilter, StringListFilter, UUIDFilter, UUIDListFilter } from "./types"; +export type UserRole = "ADMIN" | "USER" | "GUEST"; +export interface RegisterInput { + email: string; + password: string; + name?: string; +} +export interface LoginPayload { + token?: string | null; + user?: User | null; +} +export interface LogoutPayload { + success?: boolean | null; +} +export interface RegisterPayload { + token?: string | null; + user?: User | null; +}" +`; + +exports[`Schema Types Generator generateSchemaTypesFile generates schema types file with enums and input objects 1`] = ` +"/** + * GraphQL schema types for custom operations + * @generated by @constructive-io/graphql-codegen + * DO NOT EDIT - changes will be overwritten + */ + +import type { User, BigFloatFilter, BigIntFilter, BitStringFilter, BooleanFilter, DateFilter, DatetimeFilter, FloatFilter, FullTextFilter, IntFilter, IntListFilter, InternetAddressFilter, JSONFilter, StringFilter, StringListFilter, UUIDFilter, UUIDListFilter } from "./types"; +export type UserRole = "ADMIN" | "USER" | "GUEST"; +export interface RegisterInput { + email: string; + password: string; + name?: string; +} +export interface LoginPayload { + token?: string | null; + user?: User | null; +} +export interface LogoutPayload { + success?: boolean | null; +} +export interface RegisterPayload { + token?: string | null; + user?: User | null; +}" +`; diff --git a/graphql/codegen/src/__tests__/codegen/input-types-generator.test.ts b/graphql/codegen/src/__tests__/codegen/input-types-generator.test.ts index 520ea4ef3..982ad96b4 100644 --- a/graphql/codegen/src/__tests__/codegen/input-types-generator.test.ts +++ b/graphql/codegen/src/__tests__/codegen/input-types-generator.test.ts @@ -482,7 +482,9 @@ describe('entity select types', () => { const result = generateInputTypesFile(new Map(), new Set(), [postTable, userTable]); expect(result.content).toContain('export type PostSelect = {'); - expect(result.content).toContain('author?: boolean | { select?: UserSelect };'); + // Babel generates multi-line format for object types + expect(result.content).toContain('author?: boolean | {'); + expect(result.content).toContain('select?: UserSelect;'); }); it('generates select type with hasMany relation options', () => { @@ -536,13 +538,14 @@ describe('orderBy types', () => { const result = generateInputTypesFile(new Map(), new Set(), [userTable]); expect(result.content).toContain('export type UsersOrderBy ='); - expect(result.content).toContain("'PRIMARY_KEY_ASC'"); - expect(result.content).toContain("'PRIMARY_KEY_DESC'"); - expect(result.content).toContain("'NATURAL'"); - expect(result.content).toContain("'ID_ASC'"); - expect(result.content).toContain("'ID_DESC'"); - expect(result.content).toContain("'EMAIL_ASC'"); - expect(result.content).toContain("'NAME_DESC'"); + // Babel generates double quotes for string literals + expect(result.content).toContain('"PRIMARY_KEY_ASC"'); + expect(result.content).toContain('"PRIMARY_KEY_DESC"'); + expect(result.content).toContain('"NATURAL"'); + expect(result.content).toContain('"ID_ASC"'); + expect(result.content).toContain('"ID_DESC"'); + expect(result.content).toContain('"EMAIL_ASC"'); + expect(result.content).toContain('"NAME_DESC"'); }); }); @@ -603,7 +606,8 @@ describe('custom input types', () => { const usedInputTypes = new Set(['UserRole']); const result = generateInputTypesFile(sampleTypeRegistry, usedInputTypes, []); - expect(result.content).toContain("export type UserRole = 'ADMIN' | 'USER' | 'GUEST';"); + // Babel generates double quotes for string literals + expect(result.content).toContain('export type UserRole = "ADMIN" | "USER" | "GUEST";'); }); }); @@ -736,7 +740,8 @@ describe('edge cases', () => { const result = generateInputTypesFile(new Map(), usedInputTypes, []); // Should generate a fallback type - expect(result.content).toContain("// Type 'UnknownType' not found in schema"); + // Babel comment format may have slight differences + expect(result.content).toContain("Type 'UnknownType' not found in schema"); expect(result.content).toContain('export type UnknownType = Record;'); }); }); diff --git a/graphql/codegen/src/__tests__/codegen/query-keys-factory.test.ts b/graphql/codegen/src/__tests__/codegen/query-keys-factory.test.ts new file mode 100644 index 000000000..177cc2dc1 --- /dev/null +++ b/graphql/codegen/src/__tests__/codegen/query-keys-factory.test.ts @@ -0,0 +1,374 @@ +/** + * Tests for query key factory pattern generators + * + * Uses snapshot testing to validate generated TypeScript output for: + * - Query keys factory (query-keys.ts) + * - Mutation keys factory (mutation-keys.ts) + * - Cache invalidation helpers (invalidation.ts) + */ +import { generateQueryKeysFile } from '../../cli/codegen/query-keys'; +import { generateMutationKeysFile } from '../../cli/codegen/mutation-keys'; +import { generateInvalidationFile } from '../../cli/codegen/invalidation'; +import type { CleanTable, CleanFieldType, CleanRelations, CleanOperation, CleanTypeRef } from '../../types/schema'; +import type { ResolvedQueryKeyConfig, EntityRelationship } from '../../types/config'; + +const fieldTypes = { + uuid: { gqlType: 'UUID', isArray: false } as CleanFieldType, + string: { gqlType: 'String', isArray: false } as CleanFieldType, + int: { gqlType: 'Int', isArray: false } as CleanFieldType, + datetime: { gqlType: 'Datetime', isArray: false } as CleanFieldType, +}; + +const emptyRelations: CleanRelations = { + belongsTo: [], + hasOne: [], + hasMany: [], + manyToMany: [], +}; + +function createTable(partial: Partial & { name: string }): CleanTable { + return { + name: partial.name, + fields: partial.fields ?? [], + relations: partial.relations ?? emptyRelations, + query: partial.query, + inflection: partial.inflection, + constraints: partial.constraints, + }; +} + +function createTypeRef(kind: CleanTypeRef['kind'], name: string | null, ofType?: CleanTypeRef): CleanTypeRef { + return { kind, name, ofType }; +} + +const simpleUserTable = createTable({ + name: 'User', + fields: [ + { name: 'id', type: fieldTypes.uuid }, + { name: 'email', type: fieldTypes.string }, + { name: 'name', type: fieldTypes.string }, + { name: 'createdAt', type: fieldTypes.datetime }, + ], + query: { + all: 'users', + one: 'user', + create: 'createUser', + update: 'updateUser', + delete: 'deleteUser', + }, +}); + +const postTable = createTable({ + name: 'Post', + fields: [ + { name: 'id', type: fieldTypes.uuid }, + { name: 'title', type: fieldTypes.string }, + { name: 'content', type: fieldTypes.string }, + { name: 'authorId', type: fieldTypes.uuid }, + { name: 'createdAt', type: fieldTypes.datetime }, + ], + query: { + all: 'posts', + one: 'post', + create: 'createPost', + update: 'updatePost', + delete: 'deletePost', + }, +}); + +const organizationTable = createTable({ + name: 'Organization', + fields: [ + { name: 'id', type: fieldTypes.uuid }, + { name: 'name', type: fieldTypes.string }, + { name: 'slug', type: fieldTypes.string }, + ], + query: { + all: 'organizations', + one: 'organization', + create: 'createOrganization', + update: 'updateOrganization', + delete: 'deleteOrganization', + }, +}); + +const databaseTable = createTable({ + name: 'Database', + fields: [ + { name: 'id', type: fieldTypes.uuid }, + { name: 'name', type: fieldTypes.string }, + { name: 'organizationId', type: fieldTypes.uuid }, + ], + query: { + all: 'databases', + one: 'database', + create: 'createDatabase', + update: 'updateDatabase', + delete: 'deleteDatabase', + }, +}); + +const tableEntityTable = createTable({ + name: 'Table', + fields: [ + { name: 'id', type: fieldTypes.uuid }, + { name: 'name', type: fieldTypes.string }, + { name: 'databaseId', type: fieldTypes.uuid }, + ], + query: { + all: 'tables', + one: 'table', + create: 'createTable', + update: 'updateTable', + delete: 'deleteTable', + }, +}); + +const fieldTable = createTable({ + name: 'Field', + fields: [ + { name: 'id', type: fieldTypes.uuid }, + { name: 'name', type: fieldTypes.string }, + { name: 'tableId', type: fieldTypes.uuid }, + { name: 'type', type: fieldTypes.string }, + ], + query: { + all: 'fields', + one: 'field', + create: 'createField', + update: 'updateField', + delete: 'deleteField', + }, +}); + +const simpleConfig: ResolvedQueryKeyConfig = { + style: 'hierarchical', + relationships: {}, + generateScopedKeys: true, + generateCascadeHelpers: true, + generateMutationKeys: true, +}; + +const simpleRelationships: Record = { + post: { parent: 'User', foreignKey: 'authorId' }, +}; + +const hierarchicalRelationships: Record = { + database: { parent: 'Organization', foreignKey: 'organizationId' }, + table: { parent: 'Database', foreignKey: 'databaseId', ancestors: ['organization'] }, + field: { parent: 'Table', foreignKey: 'tableId', ancestors: ['database', 'organization'] }, +}; + +const sampleCustomQueries: CleanOperation[] = [ + { + name: 'currentUser', + kind: 'query', + args: [], + returnType: createTypeRef('OBJECT', 'User'), + description: 'Get the current authenticated user', + }, + { + name: 'searchUsers', + kind: 'query', + args: [ + { name: 'query', type: createTypeRef('NON_NULL', null, createTypeRef('SCALAR', 'String')) }, + { name: 'limit', type: createTypeRef('SCALAR', 'Int') }, + ], + returnType: createTypeRef('LIST', null, createTypeRef('OBJECT', 'User')), + description: 'Search users by name or email', + }, +]; + +const sampleCustomMutations: CleanOperation[] = [ + { + name: 'login', + kind: 'mutation', + args: [ + { name: 'email', type: createTypeRef('NON_NULL', null, createTypeRef('SCALAR', 'String')) }, + { name: 'password', type: createTypeRef('NON_NULL', null, createTypeRef('SCALAR', 'String')) }, + ], + returnType: createTypeRef('OBJECT', 'LoginPayload'), + description: 'Authenticate user', + }, + { + name: 'logout', + kind: 'mutation', + args: [], + returnType: createTypeRef('OBJECT', 'LogoutPayload'), + description: 'Log out current user', + }, +]; + +describe('generateQueryKeysFile', () => { + it('generates query keys for a single table without relationships', () => { + const result = generateQueryKeysFile({ + tables: [simpleUserTable], + customQueries: [], + config: simpleConfig, + }); + expect(result.fileName).toBe('query-keys.ts'); + expect(result.content).toMatchSnapshot(); + }); + + it('generates query keys for multiple tables without relationships', () => { + const result = generateQueryKeysFile({ + tables: [simpleUserTable, postTable], + customQueries: [], + config: simpleConfig, + }); + expect(result.content).toMatchSnapshot(); + }); + + it('generates query keys with simple parent-child relationship', () => { + const result = generateQueryKeysFile({ + tables: [simpleUserTable, postTable], + customQueries: [], + config: { + ...simpleConfig, + relationships: simpleRelationships, + }, + }); + expect(result.content).toMatchSnapshot(); + }); + + it('generates query keys with hierarchical relationships (org -> db -> table -> field)', () => { + const result = generateQueryKeysFile({ + tables: [organizationTable, databaseTable, tableEntityTable, fieldTable], + customQueries: [], + config: { + ...simpleConfig, + relationships: hierarchicalRelationships, + }, + }); + expect(result.content).toMatchSnapshot(); + }); + + it('generates query keys with custom queries', () => { + const result = generateQueryKeysFile({ + tables: [simpleUserTable], + customQueries: sampleCustomQueries, + config: simpleConfig, + }); + expect(result.content).toMatchSnapshot(); + }); + + it('generates query keys without scoped keys when disabled', () => { + const result = generateQueryKeysFile({ + tables: [simpleUserTable, postTable], + customQueries: [], + config: { + ...simpleConfig, + relationships: simpleRelationships, + generateScopedKeys: false, + }, + }); + expect(result.content).toMatchSnapshot(); + }); +}); + +describe('generateMutationKeysFile', () => { + it('generates mutation keys for a single table without relationships', () => { + const result = generateMutationKeysFile({ + tables: [simpleUserTable], + customMutations: [], + config: simpleConfig, + }); + expect(result.fileName).toBe('mutation-keys.ts'); + expect(result.content).toMatchSnapshot(); + }); + + it('generates mutation keys for multiple tables', () => { + const result = generateMutationKeysFile({ + tables: [simpleUserTable, postTable], + customMutations: [], + config: simpleConfig, + }); + expect(result.content).toMatchSnapshot(); + }); + + it('generates mutation keys with parent-child relationship', () => { + const result = generateMutationKeysFile({ + tables: [simpleUserTable, postTable], + customMutations: [], + config: { + ...simpleConfig, + relationships: simpleRelationships, + }, + }); + expect(result.content).toMatchSnapshot(); + }); + + it('generates mutation keys with custom mutations', () => { + const result = generateMutationKeysFile({ + tables: [simpleUserTable], + customMutations: sampleCustomMutations, + config: simpleConfig, + }); + expect(result.content).toMatchSnapshot(); + }); + + it('generates mutation keys for hierarchical relationships', () => { + const result = generateMutationKeysFile({ + tables: [organizationTable, databaseTable, tableEntityTable, fieldTable], + customMutations: [], + config: { + ...simpleConfig, + relationships: hierarchicalRelationships, + }, + }); + expect(result.content).toMatchSnapshot(); + }); +}); + +describe('generateInvalidationFile', () => { + it('generates invalidation helpers for a single table without relationships', () => { + const result = generateInvalidationFile({ + tables: [simpleUserTable], + config: simpleConfig, + }); + expect(result.fileName).toBe('invalidation.ts'); + expect(result.content).toMatchSnapshot(); + }); + + it('generates invalidation helpers for multiple tables', () => { + const result = generateInvalidationFile({ + tables: [simpleUserTable, postTable], + config: simpleConfig, + }); + expect(result.content).toMatchSnapshot(); + }); + + it('generates invalidation helpers with cascade support for parent-child relationship', () => { + const result = generateInvalidationFile({ + tables: [simpleUserTable, postTable], + config: { + ...simpleConfig, + relationships: simpleRelationships, + }, + }); + expect(result.content).toMatchSnapshot(); + }); + + it('generates invalidation helpers with cascade support for hierarchical relationships', () => { + const result = generateInvalidationFile({ + tables: [organizationTable, databaseTable, tableEntityTable, fieldTable], + config: { + ...simpleConfig, + relationships: hierarchicalRelationships, + }, + }); + expect(result.content).toMatchSnapshot(); + }); + + it('generates invalidation helpers without cascade when disabled', () => { + const result = generateInvalidationFile({ + tables: [simpleUserTable, postTable], + config: { + ...simpleConfig, + relationships: simpleRelationships, + generateCascadeHelpers: false, + }, + }); + expect(result.content).toMatchSnapshot(); + }); +}); diff --git a/graphql/codegen/src/__tests__/codegen/react-query-hooks.test.ts b/graphql/codegen/src/__tests__/codegen/react-query-hooks.test.ts new file mode 100644 index 000000000..507ab13f4 --- /dev/null +++ b/graphql/codegen/src/__tests__/codegen/react-query-hooks.test.ts @@ -0,0 +1,547 @@ +/** + * Snapshot tests for React Query hook generators + * + * Tests the actual generated hook code for: + * - Query hooks (list/single) + * - Mutation hooks (create/update/delete) + * - Custom query hooks + * - Custom mutation hooks + * - Schema types + * - Barrel files + */ +import { generateListQueryHook, generateSingleQueryHook } from '../../cli/codegen/queries'; +import { generateCreateMutationHook, generateUpdateMutationHook, generateDeleteMutationHook } from '../../cli/codegen/mutations'; +import { generateCustomQueryHook } from '../../cli/codegen/custom-queries'; +import { generateCustomMutationHook } from '../../cli/codegen/custom-mutations'; +import { generateSchemaTypesFile } from '../../cli/codegen/schema-types-generator'; +import { + generateQueriesBarrel, + generateMutationsBarrel, + generateMainBarrel, + generateCustomQueriesBarrel, + generateCustomMutationsBarrel, +} from '../../cli/codegen/barrel'; +import type { + CleanTable, + CleanFieldType, + CleanRelations, + CleanOperation, + CleanTypeRef, + TypeRegistry, + ResolvedType, +} from '../../types/schema'; + +const fieldTypes = { + uuid: { gqlType: 'UUID', isArray: false } as CleanFieldType, + string: { gqlType: 'String', isArray: false } as CleanFieldType, + int: { gqlType: 'Int', isArray: false } as CleanFieldType, + datetime: { gqlType: 'Datetime', isArray: false } as CleanFieldType, + boolean: { gqlType: 'Boolean', isArray: false } as CleanFieldType, +}; + +const emptyRelations: CleanRelations = { + belongsTo: [], + hasOne: [], + hasMany: [], + manyToMany: [], +}; + +function createTable(partial: Partial & { name: string }): CleanTable { + return { + name: partial.name, + fields: partial.fields ?? [], + relations: partial.relations ?? emptyRelations, + query: partial.query, + inflection: partial.inflection, + constraints: partial.constraints, + }; +} + +function createTypeRef(kind: CleanTypeRef['kind'], name: string | null, ofType?: CleanTypeRef): CleanTypeRef { + return { kind, name, ofType }; +} + +const simpleUserTable = createTable({ + name: 'User', + fields: [ + { name: 'id', type: fieldTypes.uuid }, + { name: 'email', type: fieldTypes.string }, + { name: 'name', type: fieldTypes.string }, + { name: 'createdAt', type: fieldTypes.datetime }, + ], + query: { + all: 'users', + one: 'user', + create: 'createUser', + update: 'updateUser', + delete: 'deleteUser', + }, +}); + +const postTable = createTable({ + name: 'Post', + fields: [ + { name: 'id', type: fieldTypes.uuid }, + { name: 'title', type: fieldTypes.string }, + { name: 'content', type: fieldTypes.string }, + { name: 'authorId', type: fieldTypes.uuid }, + { name: 'published', type: fieldTypes.boolean }, + { name: 'createdAt', type: fieldTypes.datetime }, + ], + query: { + all: 'posts', + one: 'post', + create: 'createPost', + update: 'updatePost', + delete: 'deletePost', + }, +}); + +const simpleCustomQueries: CleanOperation[] = [ + { + name: 'currentUser', + kind: 'query', + args: [], + returnType: createTypeRef('OBJECT', 'User'), + description: 'Get the current authenticated user', + }, + { + name: 'searchUsers', + kind: 'query', + args: [ + { name: 'query', type: createTypeRef('NON_NULL', null, createTypeRef('SCALAR', 'String')) }, + { name: 'limit', type: createTypeRef('SCALAR', 'Int') }, + ], + returnType: createTypeRef('LIST', null, createTypeRef('OBJECT', 'User')), + description: 'Search users by name or email', + }, +]; + +const simpleCustomMutations: CleanOperation[] = [ + { + name: 'login', + kind: 'mutation', + args: [ + { name: 'email', type: createTypeRef('NON_NULL', null, createTypeRef('SCALAR', 'String')) }, + { name: 'password', type: createTypeRef('NON_NULL', null, createTypeRef('SCALAR', 'String')) }, + ], + returnType: createTypeRef('OBJECT', 'LoginPayload'), + description: 'Authenticate user', + }, + { + name: 'logout', + kind: 'mutation', + args: [], + returnType: createTypeRef('OBJECT', 'LogoutPayload'), + description: 'Log out current user', + }, + { + name: 'register', + kind: 'mutation', + args: [ + { name: 'input', type: createTypeRef('NON_NULL', null, createTypeRef('INPUT_OBJECT', 'RegisterInput')) }, + ], + returnType: createTypeRef('OBJECT', 'RegisterPayload'), + description: 'Register a new user', + }, +]; + +function createTypeRegistry(): TypeRegistry { + const registry: TypeRegistry = new Map(); + + registry.set('LoginPayload', { + kind: 'OBJECT', + name: 'LoginPayload', + fields: [ + { name: 'token', type: createTypeRef('SCALAR', 'String') }, + { name: 'user', type: createTypeRef('OBJECT', 'User') }, + ], + } as ResolvedType); + + registry.set('LogoutPayload', { + kind: 'OBJECT', + name: 'LogoutPayload', + fields: [ + { name: 'success', type: createTypeRef('SCALAR', 'Boolean') }, + ], + } as ResolvedType); + + registry.set('RegisterPayload', { + kind: 'OBJECT', + name: 'RegisterPayload', + fields: [ + { name: 'token', type: createTypeRef('SCALAR', 'String') }, + { name: 'user', type: createTypeRef('OBJECT', 'User') }, + ], + } as ResolvedType); + + registry.set('RegisterInput', { + kind: 'INPUT_OBJECT', + name: 'RegisterInput', + inputFields: [ + { name: 'email', type: createTypeRef('NON_NULL', null, createTypeRef('SCALAR', 'String')) }, + { name: 'password', type: createTypeRef('NON_NULL', null, createTypeRef('SCALAR', 'String')) }, + { name: 'name', type: createTypeRef('SCALAR', 'String') }, + ], + } as ResolvedType); + + registry.set('UserRole', { + kind: 'ENUM', + name: 'UserRole', + enumValues: ['ADMIN', 'USER', 'GUEST'], + } as ResolvedType); + + registry.set('Query', { + kind: 'OBJECT', + name: 'Query', + fields: [ + { name: 'currentUser', type: createTypeRef('OBJECT', 'User') }, + ], + } as ResolvedType); + + registry.set('Mutation', { + kind: 'OBJECT', + name: 'Mutation', + fields: [ + { name: 'login', type: createTypeRef('OBJECT', 'LoginPayload') }, + { name: 'logout', type: createTypeRef('OBJECT', 'LogoutPayload') }, + { name: 'register', type: createTypeRef('OBJECT', 'RegisterPayload') }, + ], + } as ResolvedType); + + return registry; +} + +describe('Query Hook Generators', () => { + describe('generateListQueryHook', () => { + it('generates list query hook for simple table', () => { + const result = generateListQueryHook(simpleUserTable, { + reactQueryEnabled: true, + useCentralizedKeys: true, + }); + expect(result).not.toBeNull(); + expect(result.fileName).toBe('useUsersQuery.ts'); + expect(result.content).toMatchSnapshot(); + }); + + it('generates list query hook without centralized keys', () => { + const result = generateListQueryHook(simpleUserTable, { + reactQueryEnabled: true, + useCentralizedKeys: false, + }); + expect(result).not.toBeNull(); + expect(result.content).toMatchSnapshot(); + }); + + it('generates list query hook for table with relationships', () => { + const result = generateListQueryHook(postTable, { + reactQueryEnabled: true, + useCentralizedKeys: true, + hasRelationships: true, + }); + expect(result).not.toBeNull(); + expect(result.content).toMatchSnapshot(); + }); + }); + + describe('generateSingleQueryHook', () => { + it('generates single query hook for simple table', () => { + const result = generateSingleQueryHook(simpleUserTable, { + reactQueryEnabled: true, + useCentralizedKeys: true, + }); + expect(result).not.toBeNull(); + expect(result.fileName).toBe('useUserQuery.ts'); + expect(result.content).toMatchSnapshot(); + }); + + it('generates single query hook without centralized keys', () => { + const result = generateSingleQueryHook(simpleUserTable, { + reactQueryEnabled: true, + useCentralizedKeys: false, + }); + expect(result).not.toBeNull(); + expect(result.content).toMatchSnapshot(); + }); + + it('generates single query hook for table with relationships', () => { + const result = generateSingleQueryHook(postTable, { + reactQueryEnabled: true, + useCentralizedKeys: true, + hasRelationships: true, + }); + expect(result).not.toBeNull(); + expect(result.content).toMatchSnapshot(); + }); + }); +}); + +describe('Mutation Hook Generators', () => { + describe('generateCreateMutationHook', () => { + it('generates create mutation hook for simple table', () => { + const result = generateCreateMutationHook(simpleUserTable, { + reactQueryEnabled: true, + useCentralizedKeys: true, + }); + expect(result).not.toBeNull(); + expect(result!.fileName).toBe('useCreateUserMutation.ts'); + expect(result!.content).toMatchSnapshot(); + }); + + it('generates create mutation hook without centralized keys', () => { + const result = generateCreateMutationHook(simpleUserTable, { + reactQueryEnabled: true, + useCentralizedKeys: false, + }); + expect(result).not.toBeNull(); + expect(result!.content).toMatchSnapshot(); + }); + + it('generates create mutation hook for table with relationships', () => { + const result = generateCreateMutationHook(postTable, { + reactQueryEnabled: true, + useCentralizedKeys: true, + hasRelationships: true, + }); + expect(result).not.toBeNull(); + expect(result!.content).toMatchSnapshot(); + }); + }); + + describe('generateUpdateMutationHook', () => { + it('generates update mutation hook for simple table', () => { + const result = generateUpdateMutationHook(simpleUserTable, { + reactQueryEnabled: true, + useCentralizedKeys: true, + }); + expect(result).not.toBeNull(); + expect(result!.fileName).toBe('useUpdateUserMutation.ts'); + expect(result!.content).toMatchSnapshot(); + }); + + it('generates update mutation hook without centralized keys', () => { + const result = generateUpdateMutationHook(simpleUserTable, { + reactQueryEnabled: true, + useCentralizedKeys: false, + }); + expect(result).not.toBeNull(); + expect(result!.content).toMatchSnapshot(); + }); + + it('generates update mutation hook for table with relationships', () => { + const result = generateUpdateMutationHook(postTable, { + reactQueryEnabled: true, + useCentralizedKeys: true, + hasRelationships: true, + }); + expect(result).not.toBeNull(); + expect(result!.content).toMatchSnapshot(); + }); + }); + + describe('generateDeleteMutationHook', () => { + it('generates delete mutation hook for simple table', () => { + const result = generateDeleteMutationHook(simpleUserTable, { + reactQueryEnabled: true, + useCentralizedKeys: true, + }); + expect(result).not.toBeNull(); + expect(result!.fileName).toBe('useDeleteUserMutation.ts'); + expect(result!.content).toMatchSnapshot(); + }); + + it('generates delete mutation hook without centralized keys', () => { + const result = generateDeleteMutationHook(simpleUserTable, { + reactQueryEnabled: true, + useCentralizedKeys: false, + }); + expect(result).not.toBeNull(); + expect(result!.content).toMatchSnapshot(); + }); + + it('generates delete mutation hook for table with relationships', () => { + const result = generateDeleteMutationHook(postTable, { + reactQueryEnabled: true, + useCentralizedKeys: true, + hasRelationships: true, + }); + expect(result).not.toBeNull(); + expect(result!.content).toMatchSnapshot(); + }); + }); +}); + +describe('Custom Query Hook Generators', () => { + describe('generateCustomQueryHook', () => { + it('generates custom query hook without arguments', () => { + const result = generateCustomQueryHook({ + operation: simpleCustomQueries[0], + typeRegistry: createTypeRegistry(), + useCentralizedKeys: true, + }); + expect(result).not.toBeNull(); + expect(result!.fileName).toBe('useCurrentUserQuery.ts'); + expect(result!.content).toMatchSnapshot(); + }); + + it('generates custom query hook with arguments', () => { + const result = generateCustomQueryHook({ + operation: simpleCustomQueries[1], + typeRegistry: createTypeRegistry(), + useCentralizedKeys: true, + }); + expect(result).not.toBeNull(); + expect(result!.fileName).toBe('useSearchUsersQuery.ts'); + expect(result!.content).toMatchSnapshot(); + }); + + it('generates custom query hook without centralized keys', () => { + const result = generateCustomQueryHook({ + operation: simpleCustomQueries[0], + typeRegistry: createTypeRegistry(), + useCentralizedKeys: false, + }); + expect(result).not.toBeNull(); + expect(result!.content).toMatchSnapshot(); + }); + }); +}); + +describe('Custom Mutation Hook Generators', () => { + describe('generateCustomMutationHook', () => { + it('generates custom mutation hook with arguments', () => { + const result = generateCustomMutationHook({ + operation: simpleCustomMutations[0], + typeRegistry: createTypeRegistry(), + useCentralizedKeys: true, + }); + expect(result).not.toBeNull(); + expect(result!.fileName).toBe('useLoginMutation.ts'); + expect(result!.content).toMatchSnapshot(); + }); + + it('generates custom mutation hook without arguments', () => { + const result = generateCustomMutationHook({ + operation: simpleCustomMutations[1], + typeRegistry: createTypeRegistry(), + useCentralizedKeys: true, + }); + expect(result).not.toBeNull(); + expect(result!.fileName).toBe('useLogoutMutation.ts'); + expect(result!.content).toMatchSnapshot(); + }); + + it('generates custom mutation hook with input object argument', () => { + const result = generateCustomMutationHook({ + operation: simpleCustomMutations[2], + typeRegistry: createTypeRegistry(), + useCentralizedKeys: true, + }); + expect(result).not.toBeNull(); + expect(result!.fileName).toBe('useRegisterMutation.ts'); + expect(result!.content).toMatchSnapshot(); + }); + + it('generates custom mutation hook without centralized keys', () => { + const result = generateCustomMutationHook({ + operation: simpleCustomMutations[0], + typeRegistry: createTypeRegistry(), + useCentralizedKeys: false, + }); + expect(result).not.toBeNull(); + expect(result!.content).toMatchSnapshot(); + }); + }); +}); + +describe('Schema Types Generator', () => { + describe('generateSchemaTypesFile', () => { + it('generates schema types file with enums and input objects', () => { + const result = generateSchemaTypesFile({ + typeRegistry: createTypeRegistry(), + tableTypeNames: new Set(['User', 'Post']), + }); + expect(result.fileName).toBe('schema-types.ts'); + expect(result.content).toMatchSnapshot(); + }); + + it('generates schema types file with empty table types', () => { + const result = generateSchemaTypesFile({ + typeRegistry: createTypeRegistry(), + tableTypeNames: new Set(), + }); + expect(result.content).toMatchSnapshot(); + }); + }); +}); + +describe('Barrel File Generators', () => { + describe('generateQueriesBarrel', () => { + it('generates queries barrel for single table', () => { + const result = generateQueriesBarrel([simpleUserTable]); + expect(result).toMatchSnapshot(); + }); + + it('generates queries barrel for multiple tables', () => { + const result = generateQueriesBarrel([simpleUserTable, postTable]); + expect(result).toMatchSnapshot(); + }); + }); + + describe('generateMutationsBarrel', () => { + it('generates mutations barrel for single table', () => { + const result = generateMutationsBarrel([simpleUserTable]); + expect(result).toMatchSnapshot(); + }); + + it('generates mutations barrel for multiple tables', () => { + const result = generateMutationsBarrel([simpleUserTable, postTable]); + expect(result).toMatchSnapshot(); + }); + }); + + describe('generateMainBarrel', () => { + it('generates main barrel with all options enabled', () => { + const result = generateMainBarrel([simpleUserTable, postTable], { + hasSchemaTypes: true, + hasMutations: true, + hasQueryKeys: true, + hasMutationKeys: true, + hasInvalidation: true, + }); + expect(result).toMatchSnapshot(); + }); + + it('generates main barrel without custom operations', () => { + const result = generateMainBarrel([simpleUserTable], { + hasSchemaTypes: false, + hasMutations: true, + }); + expect(result).toMatchSnapshot(); + }); + + it('generates main barrel without mutations', () => { + const result = generateMainBarrel([simpleUserTable, postTable], { + hasSchemaTypes: true, + hasMutations: false, + }); + expect(result).toMatchSnapshot(); + }); + }); + + describe('generateCustomQueriesBarrel', () => { + it('generates custom queries barrel', () => { + const customQueryNames = simpleCustomQueries.map((q) => q.name); + const result = generateCustomQueriesBarrel([simpleUserTable], customQueryNames); + expect(result).toMatchSnapshot(); + }); + }); + + describe('generateCustomMutationsBarrel', () => { + it('generates custom mutations barrel', () => { + const customMutationNames = simpleCustomMutations.map((m) => m.name); + const result = generateCustomMutationsBarrel([simpleUserTable], customMutationNames); + expect(result).toMatchSnapshot(); + }); + }); +}); diff --git a/graphql/codegen/src/cli/codegen/babel-ast.ts b/graphql/codegen/src/cli/codegen/babel-ast.ts new file mode 100644 index 000000000..ccdae6ede --- /dev/null +++ b/graphql/codegen/src/cli/codegen/babel-ast.ts @@ -0,0 +1,117 @@ +/** + * Babel AST utilities for code generation + * + * Provides minimal helper functions for building TypeScript AST nodes. + * Use raw t.* calls for most operations - only helpers that provide + * real value beyond simple wrapping are included here. + */ +import generate from '@babel/generator'; +import * as t from '@babel/types'; + +// Re-export for convenience +export { t, generate }; + +/** + * Generate code from an array of statements + */ +export function generateCode(statements: t.Statement[]): string { + const program = t.program(statements); + // @ts-ignore - Babel types mismatch + return generate(program).code; +} + +/** + * Create a block comment + */ +export const commentBlock = (value: string): t.CommentBlock => { + return { + type: 'CommentBlock', + value, + start: null, + end: null, + loc: null, + }; +}; + +/** + * Create a line comment + */ +export const commentLine = (value: string): t.CommentLine => { + return { + type: 'CommentLine', + value, + start: null, + end: null, + loc: null, + }; +}; + +/** + * Add a leading JSDoc comment to a node + */ +export function addJSDocComment(node: T, lines: string[]): T { + const commentText = lines.length === 1 + ? `* ${lines[0]} ` + : `*\n${lines.map(line => ` * ${line}`).join('\n')}\n `; + + if (!node.leadingComments) { + node.leadingComments = []; + } + node.leadingComments.push(commentBlock(commentText)); + return node; +} + +/** + * Add a leading single-line comment to a node + */ +export function addLineComment(node: T, text: string): T { + if (!node.leadingComments) { + node.leadingComments = []; + } + node.leadingComments.push(commentLine(` ${text}`)); + return node; +} + +/** + * Create an 'as const' assertion - common pattern worth abstracting + */ +export function asConst(expression: t.Expression): t.TSAsExpression { + return t.tsAsExpression( + expression, + t.tsTypeReference(t.identifier('const')) + ); +} + +/** + * Create an array expression with 'as const' - very common pattern + */ +export function constArray(elements: (t.Expression | t.SpreadElement)[]): t.TSAsExpression { + return asConst(t.arrayExpression(elements)); +} + +/** + * Create a typed parameter - saves boilerplate for type annotations + */ +export function typedParam( + name: string, + typeAnnotation: t.TSType, + optional: boolean = false +): t.Identifier { + const param = t.identifier(name); + param.typeAnnotation = t.tsTypeAnnotation(typeAnnotation); + param.optional = optional; + return param; +} + +/** + * Create keyof typeof expression - complex nested type operators + */ +export function keyofTypeof(name: string): t.TSTypeOperator { + const typeofOp = t.tsTypeOperator(t.tsTypeReference(t.identifier(name))); + typeofOp.operator = 'typeof'; + + const keyofOp = t.tsTypeOperator(typeofOp); + keyofOp.operator = 'keyof'; + + return keyofOp; +} diff --git a/graphql/codegen/src/cli/codegen/barrel.ts b/graphql/codegen/src/cli/codegen/barrel.ts index bc85b4625..b5d89b591 100644 --- a/graphql/codegen/src/cli/codegen/barrel.ts +++ b/graphql/codegen/src/cli/codegen/barrel.ts @@ -1,11 +1,11 @@ /** * Barrel file generators - creates index.ts files for exports * - * Using simple string generation for barrel files since they're straightforward - * and ts-morph has issues with insertText + addStatements combination. + * Using Babel AST for generating barrel (index.ts) files with re-exports. */ import type { CleanTable } from '../../types/schema'; -import { createFileHeader } from './ts-ast'; +import * as t from '@babel/types'; +import { generateCode, addJSDocComment } from './babel-ast'; import { getListQueryHookName, getSingleQueryHookName, @@ -15,32 +15,45 @@ import { } from './utils'; import { getOperationHookName } from './type-resolver'; +/** + * Helper to create export * from './module' statement + */ +function exportAllFrom(modulePath: string): t.ExportAllDeclaration { + return t.exportAllDeclaration(t.stringLiteral(modulePath)); +} + /** * Generate the queries/index.ts barrel file */ export function generateQueriesBarrel(tables: CleanTable[]): string { - const lines: string[] = [createFileHeader('Query hooks barrel export'), '']; + const statements: t.Statement[] = []; // Export all query hooks for (const table of tables) { const listHookName = getListQueryHookName(table); const singleHookName = getSingleQueryHookName(table); - lines.push(`export * from './${listHookName}';`); - lines.push(`export * from './${singleHookName}';`); + statements.push(exportAllFrom(`./${listHookName}`)); + statements.push(exportAllFrom(`./${singleHookName}`)); } - return lines.join('\n') + '\n'; + // Add file header as leading comment on first statement + if (statements.length > 0) { + addJSDocComment(statements[0], [ + 'Query hooks barrel export', + '@generated by @constructive-io/graphql-codegen', + 'DO NOT EDIT - changes will be overwritten', + ]); + } + + return generateCode(statements); } /** * Generate the mutations/index.ts barrel file */ export function generateMutationsBarrel(tables: CleanTable[]): string { - const lines: string[] = [ - createFileHeader('Mutation hooks barrel export'), - '', - ]; + const statements: t.Statement[] = []; // Export all mutation hooks for (const table of tables) { @@ -48,18 +61,27 @@ export function generateMutationsBarrel(tables: CleanTable[]): string { const updateHookName = getUpdateMutationHookName(table); const deleteHookName = getDeleteMutationHookName(table); - lines.push(`export * from './${createHookName}';`); + statements.push(exportAllFrom(`./${createHookName}`)); // Only add update/delete if they exist if (table.query?.update !== null) { - lines.push(`export * from './${updateHookName}';`); + statements.push(exportAllFrom(`./${updateHookName}`)); } if (table.query?.delete !== null) { - lines.push(`export * from './${deleteHookName}';`); + statements.push(exportAllFrom(`./${deleteHookName}`)); } } - return lines.join('\n') + '\n'; + // Add file header as leading comment on first statement + if (statements.length > 0) { + addJSDocComment(statements[0], [ + 'Mutation hooks barrel export', + '@generated by @constructive-io/graphql-codegen', + 'DO NOT EDIT - changes will be overwritten', + ]); + } + + return generateCode(statements); } /** @@ -71,6 +93,12 @@ export function generateMutationsBarrel(tables: CleanTable[]): string { export interface MainBarrelOptions { hasSchemaTypes?: boolean; hasMutations?: boolean; + /** Whether query-keys.ts was generated */ + hasQueryKeys?: boolean; + /** Whether mutation-keys.ts was generated */ + hasMutationKeys?: boolean; + /** Whether invalidation.ts was generated */ + hasInvalidation?: boolean; } export function generateMainBarrel( @@ -83,62 +111,85 @@ export function generateMainBarrel( ? { hasSchemaTypes: options, hasMutations: true } : options; - const { hasSchemaTypes = false, hasMutations = true } = opts; - const tableNames = tables.map((t) => t.name).join(', '); - - const schemaTypesExport = hasSchemaTypes - ? ` -// Schema types (input, payload, enum types) -export * from './schema-types'; -` - : ''; - - const mutationsExport = hasMutations - ? ` -// Mutation hooks -export * from './mutations'; -` - : ''; - - return `/** - * Auto-generated GraphQL SDK - * @generated by @constructive-io/graphql-codegen - * - * Tables: ${tableNames} - * - * Usage: - * - * 1. Configure the client: - * \`\`\`ts - * import { configure } from './generated'; - * - * configure({ - * endpoint: 'https://api.example.com/graphql', - * headers: { Authorization: 'Bearer ' }, - * }); - * \`\`\` - * - * 2. Use the hooks: - * \`\`\`tsx - * import { useCarsQuery, useCreateCarMutation } from './generated'; - * - * function MyComponent() { - * const { data, isLoading } = useCarsQuery({ first: 10 }); - * const { mutate } = useCreateCarMutation(); - * // ... - * } - * \`\`\` - */ + const { + hasSchemaTypes = false, + hasMutations = true, + hasQueryKeys = false, + hasMutationKeys = false, + hasInvalidation = false, + } = opts; + const tableNames = tables.map((tbl) => tbl.name).join(', '); + + const statements: t.Statement[] = []; + + // Client configuration + statements.push(exportAllFrom('./client')); + + // Entity and filter types + statements.push(exportAllFrom('./types')); -// Client configuration -export * from './client'; + // Schema types (input, payload, enum types) + if (hasSchemaTypes) { + statements.push(exportAllFrom('./schema-types')); + } + + // Centralized query keys (for cache management) + if (hasQueryKeys) { + statements.push(exportAllFrom('./query-keys')); + } + + // Centralized mutation keys (for tracking in-flight mutations) + if (hasMutationKeys) { + statements.push(exportAllFrom('./mutation-keys')); + } + + // Cache invalidation helpers + if (hasInvalidation) { + statements.push(exportAllFrom('./invalidation')); + } + + // Query hooks + statements.push(exportAllFrom('./queries')); + + // Mutation hooks + if (hasMutations) { + statements.push(exportAllFrom('./mutations')); + } + + // Add file header as leading comment on first statement + if (statements.length > 0) { + addJSDocComment(statements[0], [ + 'Auto-generated GraphQL SDK', + '@generated by @constructive-io/graphql-codegen', + '', + `Tables: ${tableNames}`, + '', + 'Usage:', + '', + '1. Configure the client:', + '```ts', + "import { configure } from './generated';", + '', + 'configure({', + " endpoint: 'https://api.example.com/graphql',", + " headers: { Authorization: 'Bearer ' },", + '});', + '```', + '', + '2. Use the hooks:', + '```tsx', + "import { useCarsQuery, useCreateCarMutation } from './generated';", + '', + 'function MyComponent() {', + ' const { data, isLoading } = useCarsQuery({ first: 10 });', + ' const { mutate } = useCreateCarMutation();', + ' // ...', + '}', + '```', + ]); + } -// Entity and filter types -export * from './types'; -${schemaTypesExport} -// Query hooks -export * from './queries'; -${mutationsExport}`; + return generateCode(statements); } // ============================================================================ @@ -152,32 +203,33 @@ export function generateCustomQueriesBarrel( tables: CleanTable[], customQueryNames: string[] ): string { - const lines: string[] = [ - createFileHeader('Query hooks barrel export'), - '', - '// Table-based query hooks', - ]; + const statements: t.Statement[] = []; // Export all table query hooks for (const table of tables) { const listHookName = getListQueryHookName(table); const singleHookName = getSingleQueryHookName(table); - lines.push(`export * from './${listHookName}';`); - lines.push(`export * from './${singleHookName}';`); + statements.push(exportAllFrom(`./${listHookName}`)); + statements.push(exportAllFrom(`./${singleHookName}`)); } // Add custom query hooks - if (customQueryNames.length > 0) { - lines.push(''); - lines.push('// Custom query hooks'); - for (const name of customQueryNames) { - const hookName = getOperationHookName(name, 'query'); - lines.push(`export * from './${hookName}';`); - } + for (const name of customQueryNames) { + const hookName = getOperationHookName(name, 'query'); + statements.push(exportAllFrom(`./${hookName}`)); } - return lines.join('\n') + '\n'; + // Add file header as leading comment on first statement + if (statements.length > 0) { + addJSDocComment(statements[0], [ + 'Query hooks barrel export', + '@generated by @constructive-io/graphql-codegen', + 'DO NOT EDIT - changes will be overwritten', + ]); + } + + return generateCode(statements); } /** @@ -187,11 +239,7 @@ export function generateCustomMutationsBarrel( tables: CleanTable[], customMutationNames: string[] ): string { - const lines: string[] = [ - createFileHeader('Mutation hooks barrel export'), - '', - '// Table-based mutation hooks', - ]; + const statements: t.Statement[] = []; // Export all table mutation hooks for (const table of tables) { @@ -199,26 +247,31 @@ export function generateCustomMutationsBarrel( const updateHookName = getUpdateMutationHookName(table); const deleteHookName = getDeleteMutationHookName(table); - lines.push(`export * from './${createHookName}';`); + statements.push(exportAllFrom(`./${createHookName}`)); // Only add update/delete if they exist if (table.query?.update !== null) { - lines.push(`export * from './${updateHookName}';`); + statements.push(exportAllFrom(`./${updateHookName}`)); } if (table.query?.delete !== null) { - lines.push(`export * from './${deleteHookName}';`); + statements.push(exportAllFrom(`./${deleteHookName}`)); } } // Add custom mutation hooks - if (customMutationNames.length > 0) { - lines.push(''); - lines.push('// Custom mutation hooks'); - for (const name of customMutationNames) { - const hookName = getOperationHookName(name, 'mutation'); - lines.push(`export * from './${hookName}';`); - } + for (const name of customMutationNames) { + const hookName = getOperationHookName(name, 'mutation'); + statements.push(exportAllFrom(`./${hookName}`)); + } + + // Add file header as leading comment on first statement + if (statements.length > 0) { + addJSDocComment(statements[0], [ + 'Mutation hooks barrel export', + '@generated by @constructive-io/graphql-codegen', + 'DO NOT EDIT - changes will be overwritten', + ]); } - return lines.join('\n') + '\n'; + return generateCode(statements); } diff --git a/graphql/codegen/src/cli/codegen/client.ts b/graphql/codegen/src/cli/codegen/client.ts index dd572f883..5db32717d 100644 --- a/graphql/codegen/src/cli/codegen/client.ts +++ b/graphql/codegen/src/cli/codegen/client.ts @@ -197,5 +197,66 @@ export async function executeWithErrors number); + }; + mutations?: { + retry?: number | boolean; + retryDelay?: number | ((attemptIndex: number) => number); + }; + }; +} + +// Note: createQueryClient is available when using with @tanstack/react-query +// Import QueryClient from '@tanstack/react-query' and use these options: +// +// import { QueryClient } from '@tanstack/react-query'; +// const queryClient = new QueryClient(defaultQueryClientOptions); +// +// Or merge with your own options: +// const queryClient = new QueryClient({ +// ...defaultQueryClientOptions, +// defaultOptions: { +// ...defaultQueryClientOptions.defaultOptions, +// queries: { +// ...defaultQueryClientOptions.defaultOptions.queries, +// staleTime: 30000, // Override specific options +// }, +// }, +// }); `; } diff --git a/graphql/codegen/src/cli/codegen/custom-mutations.ts b/graphql/codegen/src/cli/codegen/custom-mutations.ts index 46c73b933..f9156cadb 100644 --- a/graphql/codegen/src/cli/codegen/custom-mutations.ts +++ b/graphql/codegen/src/cli/codegen/custom-mutations.ts @@ -15,16 +15,8 @@ import type { CleanArgument, TypeRegistry, } from '../../types/schema'; -import { - createProject, - createSourceFile, - getFormattedOutput, - createFileHeader, - createImport, - createInterface, - createConst, - type InterfaceProperty, -} from './ts-ast'; +import * as t from '@babel/types'; +import { generateCode, addJSDocComment, typedParam } from './babel-ast'; import { buildCustomMutationString } from './schema-gql-ast'; import { typeRefToTsType, @@ -37,6 +29,7 @@ import { createTypeTracker, type TypeTracker, } from './type-resolver'; +import { getGeneratedFileHeader } from './utils'; export interface GeneratedCustomMutationFile { fileName: string; @@ -44,31 +37,40 @@ export interface GeneratedCustomMutationFile { operationName: string; } -// ============================================================================ -// Single custom mutation hook generator -// ============================================================================ - export interface GenerateCustomMutationHookOptions { operation: CleanOperation; typeRegistry: TypeRegistry; maxDepth?: number; skipQueryField?: boolean; - /** Whether to generate React Query hooks (default: true for backwards compatibility) */ reactQueryEnabled?: boolean; - /** Table entity type names (for import path resolution) */ tableTypeNames?: Set; + useCentralizedKeys?: boolean; +} + +interface VariablesProp { + name: string; + type: string; + optional: boolean; + docs?: string[]; +} + +function generateVariablesProperties( + args: CleanArgument[], + tracker?: TypeTracker +): VariablesProp[] { + return args.map((arg) => ({ + name: arg.name, + type: typeRefToTsType(arg.type, tracker), + optional: !isTypeRequired(arg.type), + docs: arg.description ? [arg.description] : undefined, + })); } -/** - * Generate a custom mutation hook file - * When reactQueryEnabled is false, returns null since mutations require React Query - */ export function generateCustomMutationHook( options: GenerateCustomMutationHookOptions ): GeneratedCustomMutationFile | null { const { operation, reactQueryEnabled = true } = options; - // Mutations require React Query - skip generation when disabled if (!reactQueryEnabled) { return null; } @@ -85,19 +87,23 @@ export function generateCustomMutationHook( function generateCustomMutationHookInternal( options: GenerateCustomMutationHookOptions ): GeneratedCustomMutationFile { - const { operation, typeRegistry, maxDepth = 2, skipQueryField = true, tableTypeNames } = options; + const { + operation, + typeRegistry, + maxDepth = 2, + skipQueryField = true, + tableTypeNames, + useCentralizedKeys = true, + } = options; - const project = createProject(); const hookName = getOperationHookName(operation.name, 'mutation'); const fileName = getOperationFileName(operation.name, 'mutation'); const variablesTypeName = getOperationVariablesTypeName(operation.name, 'mutation'); const resultTypeName = getOperationResultTypeName(operation.name, 'mutation'); const documentConstName = getDocumentConstName(operation.name, 'mutation'); - // Create type tracker to collect referenced types (with table type awareness) const tracker = createTypeTracker({ tableTypeNames }); - // Generate GraphQL document const mutationDocument = buildCustomMutationString({ operation, typeRegistry, @@ -105,195 +111,206 @@ function generateCustomMutationHookInternal( skipQueryField, }); - const sourceFile = createSourceFile(project, fileName); + const statements: t.Statement[] = []; + + const variablesProps = + operation.args.length > 0 + ? generateVariablesProperties(operation.args, tracker) + : []; + + const resultType = typeRefToTsType(operation.returnType, tracker); - // Add file header - sourceFile.insertText( - 0, - createFileHeader(`Custom mutation hook for ${operation.name}`) + '\n\n' + const schemaTypes = tracker.getImportableTypes(); + const tableTypes = tracker.getTableTypes(); + + const reactQueryImport = t.importDeclaration( + [t.importSpecifier(t.identifier('useMutation'), t.identifier('useMutation'))], + t.stringLiteral('@tanstack/react-query') ); + statements.push(reactQueryImport); - // Generate variables interface if there are arguments (with tracking) - let variablesProps: InterfaceProperty[] = []; - if (operation.args.length > 0) { - variablesProps = generateVariablesProperties(operation.args, tracker); - } + const reactQueryTypeImport = t.importDeclaration( + [t.importSpecifier(t.identifier('UseMutationOptions'), t.identifier('UseMutationOptions'))], + t.stringLiteral('@tanstack/react-query') + ); + reactQueryTypeImport.importKind = 'type'; + statements.push(reactQueryTypeImport); + + const clientImport = t.importDeclaration( + [t.importSpecifier(t.identifier('execute'), t.identifier('execute'))], + t.stringLiteral('../client') + ); + statements.push(clientImport); - // Generate result interface (with tracking) - const resultType = typeRefToTsType(operation.returnType, tracker); - const resultProps: InterfaceProperty[] = [ - { name: operation.name, type: resultType }, - ]; - - // Get importable types from tracker (separated by source) - const schemaTypes = tracker.getImportableTypes(); // From schema-types.ts - const tableTypes = tracker.getTableTypes(); // From types.ts - - // Add imports - const imports = [ - createImport({ - moduleSpecifier: '@tanstack/react-query', - namedImports: ['useMutation'], - typeOnlyNamedImports: ['UseMutationOptions'], - }), - createImport({ - moduleSpecifier: '../client', - namedImports: ['execute'], - }), - ]; - - // Add types.ts import for table entity types if (tableTypes.length > 0) { - imports.push( - createImport({ - moduleSpecifier: '../types', - typeOnlyNamedImports: tableTypes, - }) + const typesImport = t.importDeclaration( + tableTypes.map((tt) => t.importSpecifier(t.identifier(tt), t.identifier(tt))), + t.stringLiteral('../types') ); + typesImport.importKind = 'type'; + statements.push(typesImport); } - // Add schema-types import for Input/Payload/Enum types if (schemaTypes.length > 0) { - imports.push( - createImport({ - moduleSpecifier: '../schema-types', - typeOnlyNamedImports: schemaTypes, - }) + const schemaTypesImport = t.importDeclaration( + schemaTypes.map((st) => t.importSpecifier(t.identifier(st), t.identifier(st))), + t.stringLiteral('../schema-types') ); + schemaTypesImport.importKind = 'type'; + statements.push(schemaTypesImport); } - sourceFile.addImportDeclarations(imports); + if (useCentralizedKeys) { + const mutationKeyImport = t.importDeclaration( + [t.importSpecifier(t.identifier('customMutationKeys'), t.identifier('customMutationKeys'))], + t.stringLiteral('../mutation-keys') + ); + statements.push(mutationKeyImport); + } - // Add mutation document constant - sourceFile.addVariableStatement( - createConst(documentConstName, '`\n' + mutationDocument + '`', { - docs: ['GraphQL mutation document'], - }) - ); + const mutationDocConst = t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier(documentConstName), + t.templateLiteral( + [t.templateElement({ raw: '\n' + mutationDocument, cooked: '\n' + mutationDocument }, true)], + [] + ) + ), + ]); + const mutationDocExport = t.exportNamedDeclaration(mutationDocConst); + addJSDocComment(mutationDocExport, ['GraphQL mutation document']); + statements.push(mutationDocExport); - // Add variables interface if (operation.args.length > 0) { - sourceFile.addInterface(createInterface(variablesTypeName, variablesProps)); + const variablesInterfaceProps = variablesProps.map((vp) => { + const prop = t.tsPropertySignature( + t.identifier(vp.name), + t.tsTypeAnnotation(t.tsTypeReference(t.identifier(vp.type))) + ); + prop.optional = vp.optional; + return prop; + }); + const variablesInterface = t.tsInterfaceDeclaration( + t.identifier(variablesTypeName), + null, + null, + t.tsInterfaceBody(variablesInterfaceProps) + ); + statements.push(t.exportNamedDeclaration(variablesInterface)); } - // Add result interface - sourceFile.addInterface(createInterface(resultTypeName, resultProps)); - - // Generate hook function - const hookParams = generateHookParameters(operation, variablesTypeName, resultTypeName); - const hookBody = generateHookBody(operation, documentConstName, variablesTypeName, resultTypeName); + const resultInterfaceBody = t.tsInterfaceBody([ + t.tsPropertySignature( + t.identifier(operation.name), + t.tsTypeAnnotation(t.tsTypeReference(t.identifier(resultType))) + ), + ]); + const resultInterface = t.tsInterfaceDeclaration( + t.identifier(resultTypeName), + null, + null, + resultInterfaceBody + ); + statements.push(t.exportNamedDeclaration(resultInterface)); - // Note: docs can cause ts-morph issues with certain content, so we skip them - sourceFile.addFunction({ - name: hookName, - isExported: true, - parameters: hookParams, - statements: hookBody, - }); + const hasArgs = operation.args.length > 0; - return { - fileName, - content: getFormattedOutput(sourceFile), - operationName: operation.name, - }; -} + const hookBodyStatements: t.Statement[] = []; + const mutationOptions: (t.ObjectProperty | t.SpreadElement)[] = []; + + if (useCentralizedKeys) { + mutationOptions.push( + t.objectProperty( + t.identifier('mutationKey'), + t.callExpression( + t.memberExpression(t.identifier('customMutationKeys'), t.identifier(operation.name)), + [] + ) + ) + ); + } -// ============================================================================ -// Helper functions -// ============================================================================ + if (hasArgs) { + mutationOptions.push( + t.objectProperty( + t.identifier('mutationFn'), + t.arrowFunctionExpression( + [typedParam('variables', t.tsTypeReference(t.identifier(variablesTypeName)))], + t.callExpression(t.identifier('execute'), [ + t.identifier(documentConstName), + t.identifier('variables'), + ]) + ) + ) + ); + } else { + mutationOptions.push( + t.objectProperty( + t.identifier('mutationFn'), + t.arrowFunctionExpression( + [], + t.callExpression(t.identifier('execute'), [t.identifier(documentConstName)]) + ) + ) + ); + } -/** - * Generate interface properties from CleanArguments - */ -function generateVariablesProperties( - args: CleanArgument[], - tracker?: TypeTracker -): InterfaceProperty[] { - return args.map((arg) => ({ - name: arg.name, - type: typeRefToTsType(arg.type, tracker), - optional: !isTypeRequired(arg.type), - docs: arg.description ? [arg.description] : undefined, - })); -} + mutationOptions.push(t.spreadElement(t.identifier('options'))); -/** - * Generate hook function parameters - */ -function generateHookParameters( - operation: CleanOperation, - variablesTypeName: string, - resultTypeName: string -): Array<{ name: string; type: string; hasQuestionToken?: boolean }> { - const hasArgs = operation.args.length > 0; + hookBodyStatements.push( + t.returnStatement( + t.callExpression(t.identifier('useMutation'), [t.objectExpression(mutationOptions)]) + ) + ); - // Mutation hooks use UseMutationOptions with variables as the second type param const optionsType = hasArgs ? `Omit, 'mutationFn'>` : `Omit, 'mutationFn'>`; - return [ - { - name: 'options', - type: optionsType, - hasQuestionToken: true, - }, - ]; -} + const optionsParam = t.identifier('options'); + optionsParam.optional = true; + optionsParam.typeAnnotation = t.tsTypeAnnotation(t.tsTypeReference(t.identifier(optionsType))); -/** - * Generate hook function body - */ -function generateHookBody( - operation: CleanOperation, - documentConstName: string, - variablesTypeName: string, - resultTypeName: string -): string { - const hasArgs = operation.args.length > 0; - - if (hasArgs) { - return `return useMutation({ - mutationFn: (variables: ${variablesTypeName}) => - execute<${resultTypeName}, ${variablesTypeName}>( - ${documentConstName}, - variables - ), - ...options, - });`; - } else { - return `return useMutation({ - mutationFn: () => execute<${resultTypeName}>(${documentConstName}), - ...options, - });`; - } -} + const hookFunc = t.functionDeclaration( + t.identifier(hookName), + [optionsParam], + t.blockStatement(hookBodyStatements) + ); + const hookExport = t.exportNamedDeclaration(hookFunc); + statements.push(hookExport); -// NOTE: JSDoc generation removed due to ts-morph issues with certain content + const code = generateCode(statements); + const content = getGeneratedFileHeader(`Custom mutation hook for ${operation.name}`) + '\n\n' + code; -// ============================================================================ -// Batch generator -// ============================================================================ + return { + fileName, + content, + operationName: operation.name, + }; +} export interface GenerateAllCustomMutationHooksOptions { operations: CleanOperation[]; typeRegistry: TypeRegistry; maxDepth?: number; skipQueryField?: boolean; - /** Whether to generate React Query hooks (default: true for backwards compatibility) */ reactQueryEnabled?: boolean; - /** Table entity type names (for import path resolution) */ tableTypeNames?: Set; + useCentralizedKeys?: boolean; } -/** - * Generate all custom mutation hook files - * When reactQueryEnabled is false, returns empty array since mutations require React Query - */ export function generateAllCustomMutationHooks( options: GenerateAllCustomMutationHooksOptions ): GeneratedCustomMutationFile[] { - const { operations, typeRegistry, maxDepth = 2, skipQueryField = true, reactQueryEnabled = true, tableTypeNames } = options; + const { + operations, + typeRegistry, + maxDepth = 2, + skipQueryField = true, + reactQueryEnabled = true, + tableTypeNames, + useCentralizedKeys = true, + } = options; return operations .filter((op) => op.kind === 'mutation') @@ -305,6 +322,7 @@ export function generateAllCustomMutationHooks( skipQueryField, reactQueryEnabled, tableTypeNames, + useCentralizedKeys, }) ) .filter((result): result is GeneratedCustomMutationFile => result !== null); diff --git a/graphql/codegen/src/cli/codegen/custom-queries.ts b/graphql/codegen/src/cli/codegen/custom-queries.ts index 286cb4381..4bcbd2d9f 100644 --- a/graphql/codegen/src/cli/codegen/custom-queries.ts +++ b/graphql/codegen/src/cli/codegen/custom-queries.ts @@ -15,16 +15,8 @@ import type { CleanArgument, TypeRegistry, } from '../../types/schema'; -import { - createProject, - createSourceFile, - getFormattedOutput, - createFileHeader, - createImport, - createInterface, - createConst, - type InterfaceProperty, -} from './ts-ast'; +import * as t from '@babel/types'; +import { generateCode, addJSDocComment, typedParam } from './babel-ast'; import { buildCustomQueryString } from './schema-gql-ast'; import { typeRefToTsType, @@ -38,7 +30,7 @@ import { createTypeTracker, type TypeTracker, } from './type-resolver'; -import { ucFirst } from './utils'; +import { ucFirst, getGeneratedFileHeader } from './utils'; export interface GeneratedCustomQueryFile { fileName: string; @@ -46,30 +38,48 @@ export interface GeneratedCustomQueryFile { operationName: string; } -// ============================================================================ -// Single custom query hook generator -// ============================================================================ - export interface GenerateCustomQueryHookOptions { operation: CleanOperation; typeRegistry: TypeRegistry; maxDepth?: number; skipQueryField?: boolean; - /** Whether to generate React Query hooks (default: true for backwards compatibility) */ reactQueryEnabled?: boolean; - /** Table entity type names (for import path resolution) */ tableTypeNames?: Set; + useCentralizedKeys?: boolean; +} + +interface VariablesProp { + name: string; + type: string; + optional: boolean; + docs?: string[]; +} + +function generateVariablesProperties( + args: CleanArgument[], + tracker?: TypeTracker +): VariablesProp[] { + return args.map((arg) => ({ + name: arg.name, + type: typeRefToTsType(arg.type, tracker), + optional: !isTypeRequired(arg.type), + docs: arg.description ? [arg.description] : undefined, + })); } -/** - * Generate a custom query hook file - */ export function generateCustomQueryHook( options: GenerateCustomQueryHookOptions ): GeneratedCustomQueryFile { - const { operation, typeRegistry, maxDepth = 2, skipQueryField = true, reactQueryEnabled = true, tableTypeNames } = options; + const { + operation, + typeRegistry, + maxDepth = 2, + skipQueryField = true, + reactQueryEnabled = true, + tableTypeNames, + useCentralizedKeys = true, + } = options; - const project = createProject(); const hookName = getOperationHookName(operation.name, 'query'); const fileName = getOperationFileName(operation.name, 'query'); const variablesTypeName = getOperationVariablesTypeName(operation.name, 'query'); @@ -77,10 +87,8 @@ export function generateCustomQueryHook( const documentConstName = getDocumentConstName(operation.name, 'query'); const queryKeyName = getQueryKeyName(operation.name); - // Create type tracker to collect referenced types (with table type awareness) const tracker = createTypeTracker({ tableTypeNames }); - // Generate GraphQL document const queryDocument = buildCustomQueryString({ operation, typeRegistry, @@ -88,467 +96,460 @@ export function generateCustomQueryHook( skipQueryField, }); - const sourceFile = createSourceFile(project, fileName); + const statements: t.Statement[] = []; - // Add file header - const headerText = reactQueryEnabled - ? `Custom query hook for ${operation.name}` - : `Custom query functions for ${operation.name}`; - sourceFile.insertText(0, createFileHeader(headerText) + '\n\n'); + const variablesProps = + operation.args.length > 0 + ? generateVariablesProperties(operation.args, tracker) + : []; - // Generate variables interface if there are arguments (with tracking) - let variablesProps: InterfaceProperty[] = []; - if (operation.args.length > 0) { - variablesProps = generateVariablesProperties(operation.args, tracker); - } - - // Generate result interface (with tracking) const resultType = typeRefToTsType(operation.returnType, tracker); - const resultProps: InterfaceProperty[] = [ - { name: operation.name, type: resultType }, - ]; - // Get importable types from tracker (separated by source) - const schemaTypes = tracker.getImportableTypes(); // From schema-types.ts - const tableTypes = tracker.getTableTypes(); // From types.ts + const schemaTypes = tracker.getImportableTypes(); + const tableTypes = tracker.getTableTypes(); - // Add imports - conditionally include React Query imports - const imports = []; if (reactQueryEnabled) { - imports.push( - createImport({ - moduleSpecifier: '@tanstack/react-query', - namedImports: ['useQuery'], - typeOnlyNamedImports: ['UseQueryOptions', 'QueryClient'], - }) + const reactQueryImport = t.importDeclaration( + [t.importSpecifier(t.identifier('useQuery'), t.identifier('useQuery'))], + t.stringLiteral('@tanstack/react-query') + ); + statements.push(reactQueryImport); + const reactQueryTypeImport = t.importDeclaration( + [ + t.importSpecifier(t.identifier('UseQueryOptions'), t.identifier('UseQueryOptions')), + t.importSpecifier(t.identifier('QueryClient'), t.identifier('QueryClient')), + ], + t.stringLiteral('@tanstack/react-query') ); + reactQueryTypeImport.importKind = 'type'; + statements.push(reactQueryTypeImport); } - imports.push( - createImport({ - moduleSpecifier: '../client', - namedImports: ['execute'], - typeOnlyNamedImports: ['ExecuteOptions'], - }) + + const clientImport = t.importDeclaration( + [t.importSpecifier(t.identifier('execute'), t.identifier('execute'))], + t.stringLiteral('../client') + ); + statements.push(clientImport); + const clientTypeImport = t.importDeclaration( + [t.importSpecifier(t.identifier('ExecuteOptions'), t.identifier('ExecuteOptions'))], + t.stringLiteral('../client') ); + clientTypeImport.importKind = 'type'; + statements.push(clientTypeImport); - // Add types.ts import for table entity types if (tableTypes.length > 0) { - imports.push( - createImport({ - moduleSpecifier: '../types', - typeOnlyNamedImports: tableTypes, - }) + const typesImport = t.importDeclaration( + tableTypes.map((tt) => t.importSpecifier(t.identifier(tt), t.identifier(tt))), + t.stringLiteral('../types') ); + typesImport.importKind = 'type'; + statements.push(typesImport); } - // Add schema-types import for Input/Payload/Enum types if (schemaTypes.length > 0) { - imports.push( - createImport({ - moduleSpecifier: '../schema-types', - typeOnlyNamedImports: schemaTypes, - }) + const schemaTypesImport = t.importDeclaration( + schemaTypes.map((st) => t.importSpecifier(t.identifier(st), t.identifier(st))), + t.stringLiteral('../schema-types') ); + schemaTypesImport.importKind = 'type'; + statements.push(schemaTypesImport); } - sourceFile.addImportDeclarations(imports); + if (useCentralizedKeys) { + const queryKeyImport = t.importDeclaration( + [t.importSpecifier(t.identifier('customQueryKeys'), t.identifier('customQueryKeys'))], + t.stringLiteral('../query-keys') + ); + statements.push(queryKeyImport); + } - // Add query document constant - sourceFile.addVariableStatement( - createConst(documentConstName, '`\n' + queryDocument + '`', { - docs: ['GraphQL query document'], - }) - ); + const queryDocConst = t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier(documentConstName), + t.templateLiteral( + [t.templateElement({ raw: '\n' + queryDocument, cooked: '\n' + queryDocument }, true)], + [] + ) + ), + ]); + const queryDocExport = t.exportNamedDeclaration(queryDocConst); + addJSDocComment(queryDocExport, ['GraphQL query document']); + statements.push(queryDocExport); - // Add variables interface if (operation.args.length > 0) { - sourceFile.addInterface(createInterface(variablesTypeName, variablesProps)); + const variablesInterfaceProps = variablesProps.map((vp) => { + const prop = t.tsPropertySignature( + t.identifier(vp.name), + t.tsTypeAnnotation(t.tsTypeReference(t.identifier(vp.type))) + ); + prop.optional = vp.optional; + return prop; + }); + const variablesInterface = t.tsInterfaceDeclaration( + t.identifier(variablesTypeName), + null, + null, + t.tsInterfaceBody(variablesInterfaceProps) + ); + statements.push(t.exportNamedDeclaration(variablesInterface)); } - // Add result interface - sourceFile.addInterface(createInterface(resultTypeName, resultProps)); - - // Query key factory - if (operation.args.length > 0) { - sourceFile.addVariableStatement( - createConst( - queryKeyName, - `(variables?: ${variablesTypeName}) => - ['${operation.name}', variables] as const`, - { docs: ['Query key factory for caching'] } + const resultInterfaceBody = t.tsInterfaceBody([ + t.tsPropertySignature( + t.identifier(operation.name), + t.tsTypeAnnotation(t.tsTypeReference(t.identifier(resultType))) + ), + ]); + const resultInterface = t.tsInterfaceDeclaration( + t.identifier(resultTypeName), + null, + null, + resultInterfaceBody + ); + statements.push(t.exportNamedDeclaration(resultInterface)); + + if (useCentralizedKeys) { + const queryKeyConst = t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier(queryKeyName), + t.memberExpression(t.identifier('customQueryKeys'), t.identifier(operation.name)) + ), + ]); + const queryKeyExport = t.exportNamedDeclaration(queryKeyConst); + addJSDocComment(queryKeyExport, ['Query key factory - re-exported from query-keys.ts']); + statements.push(queryKeyExport); + } else if (operation.args.length > 0) { + const queryKeyArrow = t.arrowFunctionExpression( + [typedParam('variables', t.tsTypeReference(t.identifier(variablesTypeName)), true)], + t.tsAsExpression( + t.arrayExpression([t.stringLiteral(operation.name), t.identifier('variables')]), + t.tsTypeReference(t.identifier('const')) ) ); + const queryKeyConst = t.variableDeclaration('const', [ + t.variableDeclarator(t.identifier(queryKeyName), queryKeyArrow), + ]); + const queryKeyExport = t.exportNamedDeclaration(queryKeyConst); + addJSDocComment(queryKeyExport, ['Query key factory for caching']); + statements.push(queryKeyExport); } else { - sourceFile.addVariableStatement( - createConst(queryKeyName, `() => ['${operation.name}'] as const`, { - docs: ['Query key factory for caching'], - }) + const queryKeyArrow = t.arrowFunctionExpression( + [], + t.tsAsExpression( + t.arrayExpression([t.stringLiteral(operation.name)]), + t.tsTypeReference(t.identifier('const')) + ) ); + const queryKeyConst = t.variableDeclaration('const', [ + t.variableDeclarator(t.identifier(queryKeyName), queryKeyArrow), + ]); + const queryKeyExport = t.exportNamedDeclaration(queryKeyConst); + addJSDocComment(queryKeyExport, ['Query key factory for caching']); + statements.push(queryKeyExport); } - // Generate hook function (only if React Query is enabled) if (reactQueryEnabled) { - const hookParams = generateHookParameters(operation, variablesTypeName, resultTypeName); - const hookBody = generateHookBody(operation, documentConstName, queryKeyName, variablesTypeName, resultTypeName); - const hookDoc = generateHookDoc(operation, hookName); - - sourceFile.addFunction({ - name: hookName, - isExported: true, - parameters: hookParams, - statements: hookBody, - docs: [{ description: hookDoc }], - }); - } - - // Add standalone functions section - sourceFile.addStatements('\n// ============================================================================'); - sourceFile.addStatements('// Standalone Functions (non-React)'); - sourceFile.addStatements('// ============================================================================\n'); - - // Generate standalone fetch function - const fetchFnName = `fetch${ucFirst(operation.name)}Query`; - const fetchParams = generateFetchParameters(operation, variablesTypeName); - const fetchBody = generateFetchBody(operation, documentConstName, variablesTypeName, resultTypeName); - const fetchDoc = generateFetchDoc(operation, fetchFnName); - - sourceFile.addFunction({ - name: fetchFnName, - isExported: true, - isAsync: true, - parameters: fetchParams, - returnType: `Promise<${resultTypeName}>`, - statements: fetchBody, - docs: [{ description: fetchDoc }], - }); - - // Generate prefetch function (only if React Query is enabled) - if (reactQueryEnabled) { - const prefetchFnName = `prefetch${ucFirst(operation.name)}Query`; - const prefetchParams = generatePrefetchParameters(operation, variablesTypeName); - const prefetchBody = generatePrefetchBody(operation, documentConstName, queryKeyName, variablesTypeName, resultTypeName); - const prefetchDoc = generatePrefetchDoc(operation, prefetchFnName); - - sourceFile.addFunction({ - name: prefetchFnName, - isExported: true, - isAsync: true, - parameters: prefetchParams, - returnType: 'Promise', - statements: prefetchBody, - docs: [{ description: prefetchDoc }], - }); - } - - return { - fileName, - content: getFormattedOutput(sourceFile), - operationName: operation.name, - }; -} - -// ============================================================================ -// Helper functions -// ============================================================================ + const hasArgs = operation.args.length > 0; + const hasRequiredArgs = operation.args.some((arg) => isTypeRequired(arg.type)); -/** - * Generate interface properties from CleanArguments - */ -function generateVariablesProperties( - args: CleanArgument[], - tracker?: TypeTracker -): InterfaceProperty[] { - return args.map((arg) => ({ - name: arg.name, - type: typeRefToTsType(arg.type, tracker), - optional: !isTypeRequired(arg.type), - docs: arg.description ? [arg.description] : undefined, - })); -} + const hookBodyStatements: t.Statement[] = []; + const useQueryOptions: (t.ObjectProperty | t.SpreadElement)[] = []; + + if (hasArgs) { + useQueryOptions.push( + t.objectProperty( + t.identifier('queryKey'), + t.callExpression(t.identifier(queryKeyName), [t.identifier('variables')]) + ) + ); + useQueryOptions.push( + t.objectProperty( + t.identifier('queryFn'), + t.arrowFunctionExpression( + [], + t.callExpression(t.identifier('execute'), [ + t.identifier(documentConstName), + t.identifier('variables'), + ]) + ) + ) + ); + if (hasRequiredArgs) { + useQueryOptions.push( + t.objectProperty( + t.identifier('enabled'), + t.logicalExpression( + '&&', + t.unaryExpression('!', t.unaryExpression('!', t.identifier('variables'))), + t.binaryExpression( + '!==', + t.optionalMemberExpression( + t.identifier('options'), + t.identifier('enabled'), + false, + true + ), + t.booleanLiteral(false) + ) + ) + ) + ); + } + } else { + useQueryOptions.push( + t.objectProperty( + t.identifier('queryKey'), + t.callExpression(t.identifier(queryKeyName), []) + ) + ); + useQueryOptions.push( + t.objectProperty( + t.identifier('queryFn'), + t.arrowFunctionExpression( + [], + t.callExpression(t.identifier('execute'), [t.identifier(documentConstName)]) + ) + ) + ); + } + useQueryOptions.push(t.spreadElement(t.identifier('options'))); + + hookBodyStatements.push( + t.returnStatement( + t.callExpression(t.identifier('useQuery'), [t.objectExpression(useQueryOptions)]) + ) + ); -/** - * Generate hook function parameters - */ -function generateHookParameters( - operation: CleanOperation, - variablesTypeName: string, - resultTypeName: string -): Array<{ name: string; type: string; hasQuestionToken?: boolean }> { - const params: Array<{ name: string; type: string; hasQuestionToken?: boolean }> = []; - - // Add variables parameter if there are required args - const hasRequiredArgs = operation.args.some((arg) => isTypeRequired(arg.type)); + const hookParams: t.Identifier[] = []; + if (hasArgs) { + hookParams.push( + typedParam('variables', t.tsTypeReference(t.identifier(variablesTypeName)), !hasRequiredArgs) + ); + } + const optionsTypeStr = `Omit, 'queryKey' | 'queryFn'>`; + const optionsParam = t.identifier('options'); + optionsParam.optional = true; + optionsParam.typeAnnotation = t.tsTypeAnnotation(t.tsTypeReference(t.identifier(optionsTypeStr))); + hookParams.push(optionsParam); + + const hookFunc = t.functionDeclaration( + t.identifier(hookName), + hookParams, + t.blockStatement(hookBodyStatements) + ); + const hookExport = t.exportNamedDeclaration(hookFunc); - if (operation.args.length > 0) { - params.push({ - name: 'variables', - type: variablesTypeName, - hasQuestionToken: !hasRequiredArgs, - }); + const description = operation.description || `Query hook for ${operation.name}`; + const argNames = operation.args.map((a) => a.name).join(', '); + const exampleCall = hasArgs ? `${hookName}({ ${argNames} })` : `${hookName}()`; + addJSDocComment(hookExport, [ + description, + '', + '@example', + '```tsx', + `const { data, isLoading } = ${exampleCall};`, + '', + `if (data?.${operation.name}) {`, + ` console.log(data.${operation.name});`, + '}', + '```', + ]); + statements.push(hookExport); } - // Add options parameter - params.push({ - name: 'options', - type: `Omit, 'queryKey' | 'queryFn'>`, - hasQuestionToken: true, - }); - - return params; -} - -/** - * Generate hook function body - */ -function generateHookBody( - operation: CleanOperation, - documentConstName: string, - queryKeyName: string, - variablesTypeName: string, - resultTypeName: string -): string { + const fetchFnName = `fetch${ucFirst(operation.name)}Query`; const hasArgs = operation.args.length > 0; const hasRequiredArgs = operation.args.some((arg) => isTypeRequired(arg.type)); + const fetchBodyStatements: t.Statement[] = []; if (hasArgs) { - // With variables - const enabledCondition = hasRequiredArgs - ? `enabled: !!variables && (options?.enabled !== false),` - : ''; - - return `return useQuery({ - queryKey: ${queryKeyName}(variables), - queryFn: () => execute<${resultTypeName}, ${variablesTypeName}>( - ${documentConstName}, - variables - ), - ${enabledCondition} - ...options, - });`; + fetchBodyStatements.push( + t.returnStatement( + t.callExpression(t.identifier('execute'), [ + t.identifier(documentConstName), + t.identifier('variables'), + t.identifier('options'), + ]) + ) + ); } else { - // No variables - return `return useQuery({ - queryKey: ${queryKeyName}(), - queryFn: () => execute<${resultTypeName}>(${documentConstName}), - ...options, - });`; + fetchBodyStatements.push( + t.returnStatement( + t.callExpression(t.identifier('execute'), [ + t.identifier(documentConstName), + t.identifier('undefined'), + t.identifier('options'), + ]) + ) + ); } -} - -/** - * Generate hook JSDoc documentation - */ -function generateHookDoc(operation: CleanOperation, hookName: string): string { - const description = operation.description - ? operation.description - : `Query hook for ${operation.name}`; - - const hasArgs = operation.args.length > 0; - let example: string; + const fetchParams: t.Identifier[] = []; if (hasArgs) { - const argNames = operation.args.map((a) => a.name).join(', '); - example = ` -@example -\`\`\`tsx -const { data, isLoading } = ${hookName}({ ${argNames} }); - -if (data?.${operation.name}) { - console.log(data.${operation.name}); -} -\`\`\``; - } else { - example = ` -@example -\`\`\`tsx -const { data, isLoading } = ${hookName}(); - -if (data?.${operation.name}) { - console.log(data.${operation.name}); -} -\`\`\``; - } - - return description + '\n' + example; -} - -// ============================================================================ -// Standalone function generators -// ============================================================================ - -/** - * Generate fetch function parameters - */ -function generateFetchParameters( - operation: CleanOperation, - variablesTypeName: string -): Array<{ name: string; type: string; hasQuestionToken?: boolean }> { - const params: Array<{ name: string; type: string; hasQuestionToken?: boolean }> = []; - - if (operation.args.length > 0) { - const hasRequiredArgs = operation.args.some((arg) => isTypeRequired(arg.type)); - params.push({ - name: 'variables', - type: variablesTypeName, - hasQuestionToken: !hasRequiredArgs, - }); - } - - params.push({ - name: 'options', - type: 'ExecuteOptions', - hasQuestionToken: true, - }); - - return params; -} - -/** - * Generate fetch function body - */ -function generateFetchBody( - operation: CleanOperation, - documentConstName: string, - variablesTypeName: string, - resultTypeName: string -): string { - if (operation.args.length > 0) { - return `return execute<${resultTypeName}, ${variablesTypeName}>( - ${documentConstName}, - variables, - options - );`; - } else { - return `return execute<${resultTypeName}>(${documentConstName}, undefined, options);`; - } -} - -/** - * Generate fetch function documentation - */ -function generateFetchDoc(operation: CleanOperation, fnName: string): string { - const description = `Fetch ${operation.name} without React hooks`; - - if (operation.args.length > 0) { - const argNames = operation.args.map((a) => a.name).join(', '); - return `${description} - -@example -\`\`\`ts -const data = await ${fnName}({ ${argNames} }); -\`\`\``; - } else { - return `${description} - -@example -\`\`\`ts -const data = await ${fnName}(); -\`\`\``; + fetchParams.push( + typedParam('variables', t.tsTypeReference(t.identifier(variablesTypeName)), !hasRequiredArgs) + ); } -} - -/** - * Generate prefetch function parameters - */ -function generatePrefetchParameters( - operation: CleanOperation, - variablesTypeName: string -): Array<{ name: string; type: string; hasQuestionToken?: boolean }> { - const params: Array<{ name: string; type: string; hasQuestionToken?: boolean }> = [ - { name: 'queryClient', type: 'QueryClient' }, - ]; + fetchParams.push(typedParam('options', t.tsTypeReference(t.identifier('ExecuteOptions')), true)); - if (operation.args.length > 0) { - const hasRequiredArgs = operation.args.some((arg) => isTypeRequired(arg.type)); - params.push({ - name: 'variables', - type: variablesTypeName, - hasQuestionToken: !hasRequiredArgs, - }); - } + const fetchFunc = t.functionDeclaration( + t.identifier(fetchFnName), + fetchParams, + t.blockStatement(fetchBodyStatements) + ); + fetchFunc.async = true; + fetchFunc.returnType = t.tsTypeAnnotation( + t.tsTypeReference( + t.identifier('Promise'), + t.tsTypeParameterInstantiation([t.tsTypeReference(t.identifier(resultTypeName))]) + ) + ); + const fetchExport = t.exportNamedDeclaration(fetchFunc); + + const argNames = operation.args.map((a) => a.name).join(', '); + const fetchExampleCall = hasArgs ? `${fetchFnName}({ ${argNames} })` : `${fetchFnName}()`; + addJSDocComment(fetchExport, [ + `Fetch ${operation.name} without React hooks`, + '', + '@example', + '```ts', + `const data = await ${fetchExampleCall};`, + '```', + ]); + statements.push(fetchExport); - params.push({ - name: 'options', - type: 'ExecuteOptions', - hasQuestionToken: true, - }); + if (reactQueryEnabled) { + const prefetchFnName = `prefetch${ucFirst(operation.name)}Query`; - return params; -} + const prefetchBodyStatements: t.Statement[] = []; + const prefetchQueryOptions: t.ObjectProperty[] = []; + + if (hasArgs) { + prefetchQueryOptions.push( + t.objectProperty( + t.identifier('queryKey'), + t.callExpression(t.identifier(queryKeyName), [t.identifier('variables')]) + ) + ); + prefetchQueryOptions.push( + t.objectProperty( + t.identifier('queryFn'), + t.arrowFunctionExpression( + [], + t.callExpression(t.identifier('execute'), [ + t.identifier(documentConstName), + t.identifier('variables'), + t.identifier('options'), + ]) + ) + ) + ); + } else { + prefetchQueryOptions.push( + t.objectProperty( + t.identifier('queryKey'), + t.callExpression(t.identifier(queryKeyName), []) + ) + ); + prefetchQueryOptions.push( + t.objectProperty( + t.identifier('queryFn'), + t.arrowFunctionExpression( + [], + t.callExpression(t.identifier('execute'), [ + t.identifier(documentConstName), + t.identifier('undefined'), + t.identifier('options'), + ]) + ) + ) + ); + } + + prefetchBodyStatements.push( + t.expressionStatement( + t.awaitExpression( + t.callExpression( + t.memberExpression(t.identifier('queryClient'), t.identifier('prefetchQuery')), + [t.objectExpression(prefetchQueryOptions)] + ) + ) + ) + ); -/** - * Generate prefetch function body - */ -function generatePrefetchBody( - operation: CleanOperation, - documentConstName: string, - queryKeyName: string, - variablesTypeName: string, - resultTypeName: string -): string { - if (operation.args.length > 0) { - return `await queryClient.prefetchQuery({ - queryKey: ${queryKeyName}(variables), - queryFn: () => execute<${resultTypeName}, ${variablesTypeName}>( - ${documentConstName}, - variables, - options - ), - });`; - } else { - return `await queryClient.prefetchQuery({ - queryKey: ${queryKeyName}(), - queryFn: () => execute<${resultTypeName}>(${documentConstName}, undefined, options), - });`; + const prefetchParams: t.Identifier[] = [ + typedParam('queryClient', t.tsTypeReference(t.identifier('QueryClient'))), + ]; + if (hasArgs) { + prefetchParams.push( + typedParam('variables', t.tsTypeReference(t.identifier(variablesTypeName)), !hasRequiredArgs) + ); + } + prefetchParams.push(typedParam('options', t.tsTypeReference(t.identifier('ExecuteOptions')), true)); + + const prefetchFunc = t.functionDeclaration( + t.identifier(prefetchFnName), + prefetchParams, + t.blockStatement(prefetchBodyStatements) + ); + prefetchFunc.async = true; + prefetchFunc.returnType = t.tsTypeAnnotation( + t.tsTypeReference( + t.identifier('Promise'), + t.tsTypeParameterInstantiation([t.tsVoidKeyword()]) + ) + ); + const prefetchExport = t.exportNamedDeclaration(prefetchFunc); + + const prefetchExampleCall = hasArgs + ? `${prefetchFnName}(queryClient, { ${argNames} })` + : `${prefetchFnName}(queryClient)`; + addJSDocComment(prefetchExport, [ + `Prefetch ${operation.name} for SSR or cache warming`, + '', + '@example', + '```ts', + `await ${prefetchExampleCall};`, + '```', + ]); + statements.push(prefetchExport); } -} - -/** - * Generate prefetch function documentation - */ -function generatePrefetchDoc(operation: CleanOperation, fnName: string): string { - const description = `Prefetch ${operation.name} for SSR or cache warming`; - - if (operation.args.length > 0) { - const argNames = operation.args.map((a) => a.name).join(', '); - return `${description} -@example -\`\`\`ts -await ${fnName}(queryClient, { ${argNames} }); -\`\`\``; - } else { - return `${description} + const code = generateCode(statements); + const headerText = reactQueryEnabled + ? `Custom query hook for ${operation.name}` + : `Custom query functions for ${operation.name}`; + const content = getGeneratedFileHeader(headerText) + '\n\n' + code; -@example -\`\`\`ts -await ${fnName}(queryClient); -\`\`\``; - } + return { + fileName, + content, + operationName: operation.name, + }; } -// ============================================================================ -// Batch generator -// ============================================================================ - export interface GenerateAllCustomQueryHooksOptions { operations: CleanOperation[]; typeRegistry: TypeRegistry; maxDepth?: number; skipQueryField?: boolean; - /** Whether to generate React Query hooks (default: true for backwards compatibility) */ reactQueryEnabled?: boolean; - /** Table entity type names (for import path resolution) */ tableTypeNames?: Set; + useCentralizedKeys?: boolean; } -/** - * Generate all custom query hook files - */ export function generateAllCustomQueryHooks( options: GenerateAllCustomQueryHooksOptions ): GeneratedCustomQueryFile[] { - const { operations, typeRegistry, maxDepth = 2, skipQueryField = true, reactQueryEnabled = true, tableTypeNames } = options; + const { + operations, + typeRegistry, + maxDepth = 2, + skipQueryField = true, + reactQueryEnabled = true, + tableTypeNames, + useCentralizedKeys = true, + } = options; return operations .filter((op) => op.kind === 'query') @@ -560,6 +561,7 @@ export function generateAllCustomQueryHooks( skipQueryField, reactQueryEnabled, tableTypeNames, + useCentralizedKeys, }) ); } diff --git a/graphql/codegen/src/cli/codegen/index.ts b/graphql/codegen/src/cli/codegen/index.ts index 4d4b65629..163a5acd8 100644 --- a/graphql/codegen/src/cli/codegen/index.ts +++ b/graphql/codegen/src/cli/codegen/index.ts @@ -28,7 +28,8 @@ import type { CleanOperation, TypeRegistry, } from '../../types/schema'; -import type { ResolvedConfig } from '../../types/config'; +import type { ResolvedConfig, ResolvedQueryKeyConfig } from '../../types/config'; +import { DEFAULT_QUERY_KEY_CONFIG } from '../../types/config'; import { generateClientFile } from './client'; import { generateTypesFile } from './types'; @@ -37,6 +38,9 @@ import { generateAllQueryHooks } from './queries'; import { generateAllMutationHooks } from './mutations'; import { generateAllCustomQueryHooks } from './custom-queries'; import { generateAllCustomMutationHooks } from './custom-mutations'; +import { generateQueryKeysFile } from './query-keys'; +import { generateMutationKeysFile } from './mutation-keys'; +import { generateInvalidationFile } from './invalidation'; import { generateQueriesBarrel, generateMutationsBarrel, @@ -108,6 +112,11 @@ export function generate(options: GenerateOptions): GenerateResult { const skipQueryField = config.codegen.skipQueryField; const reactQueryEnabled = config.reactQuery.enabled; + // Query key configuration (use defaults if not provided) + const queryKeyConfig: ResolvedQueryKeyConfig = config.queryKeys ?? DEFAULT_QUERY_KEY_CONFIG; + const useCentralizedKeys = queryKeyConfig.generateScopedKeys; + const hasRelationships = Object.keys(queryKeyConfig.relationships).length > 0; + // 1. Generate client.ts files.push({ path: 'client.ts', @@ -146,8 +155,56 @@ export function generate(options: GenerateOptions): GenerateResult { }), }); + // 3b. Generate centralized query keys (query-keys.ts) + let hasQueryKeys = false; + if (useCentralizedKeys) { + const queryKeysResult = generateQueryKeysFile({ + tables, + customQueries: customOperations?.queries ?? [], + config: queryKeyConfig, + }); + files.push({ + path: queryKeysResult.fileName, + content: queryKeysResult.content, + }); + hasQueryKeys = true; + } + + // 3c. Generate centralized mutation keys (mutation-keys.ts) + let hasMutationKeys = false; + if (useCentralizedKeys && queryKeyConfig.generateMutationKeys) { + const mutationKeysResult = generateMutationKeysFile({ + tables, + customMutations: customOperations?.mutations ?? [], + config: queryKeyConfig, + }); + files.push({ + path: mutationKeysResult.fileName, + content: mutationKeysResult.content, + }); + hasMutationKeys = true; + } + + // 3d. Generate cache invalidation helpers (invalidation.ts) + let hasInvalidation = false; + if (useCentralizedKeys && queryKeyConfig.generateCascadeHelpers) { + const invalidationResult = generateInvalidationFile({ + tables, + config: queryKeyConfig, + }); + files.push({ + path: invalidationResult.fileName, + content: invalidationResult.content, + }); + hasInvalidation = true; + } + // 4. Generate table-based query hooks (queries/*.ts) - const queryHooks = generateAllQueryHooks(tables, { reactQueryEnabled }); + const queryHooks = generateAllQueryHooks(tables, { + reactQueryEnabled, + useCentralizedKeys, + hasRelationships, + }); for (const hook of queryHooks) { files.push({ path: `queries/${hook.fileName}`, @@ -169,6 +226,7 @@ export function generate(options: GenerateOptions): GenerateResult { skipQueryField, reactQueryEnabled, tableTypeNames, + useCentralizedKeys, }); for (const hook of customQueryHooks) { @@ -195,6 +253,8 @@ export function generate(options: GenerateOptions): GenerateResult { const mutationHooks = generateAllMutationHooks(tables, { reactQueryEnabled, enumsFromSchemaTypes: generatedEnumNames, + useCentralizedKeys, + hasRelationships, }); for (const hook of mutationHooks) { files.push({ @@ -217,6 +277,7 @@ export function generate(options: GenerateOptions): GenerateResult { skipQueryField, reactQueryEnabled, tableTypeNames, + useCentralizedKeys, }); for (const hook of customMutationHooks) { @@ -247,7 +308,13 @@ export function generate(options: GenerateOptions): GenerateResult { // 9. Generate main index.ts barrel (with schema-types if present) files.push({ path: 'index.ts', - content: generateMainBarrel(tables, { hasSchemaTypes, hasMutations }), + content: generateMainBarrel(tables, { + hasSchemaTypes, + hasMutations, + hasQueryKeys, + hasMutationKeys, + hasInvalidation, + }), }); return { @@ -295,3 +362,6 @@ export { generateCustomQueriesBarrel, generateCustomMutationsBarrel, } from './barrel'; +export { generateQueryKeysFile } from './query-keys'; +export { generateMutationKeysFile } from './mutation-keys'; +export { generateInvalidationFile } from './invalidation'; diff --git a/graphql/codegen/src/cli/codegen/invalidation.ts b/graphql/codegen/src/cli/codegen/invalidation.ts new file mode 100644 index 000000000..e7f07add6 --- /dev/null +++ b/graphql/codegen/src/cli/codegen/invalidation.ts @@ -0,0 +1,489 @@ +/** + * Cache invalidation helpers generator + * + * Generates type-safe cache invalidation utilities with cascade support + * for parent-child entity relationships. + */ +import type { CleanTable } from '../../types/schema'; +import type { ResolvedQueryKeyConfig, EntityRelationship } from '../../types/config'; +import { getTableNames, getGeneratedFileHeader, ucFirst, lcFirst } from './utils'; +import * as t from '@babel/types'; +import { + generateCode, + addJSDocComment, + asConst, + typedParam, + addLineComment, +} from './babel-ast'; + +export interface InvalidationGeneratorOptions { + tables: CleanTable[]; + config: ResolvedQueryKeyConfig; +} + +export interface GeneratedInvalidationFile { + fileName: string; + content: string; +} + +/** + * Build a map of parent -> children for cascade invalidation + */ +function buildChildrenMap( + relationships: Record +): Map { + const childrenMap = new Map(); + + for (const [child, rel] of Object.entries(relationships)) { + const parent = rel.parent.toLowerCase(); + if (!childrenMap.has(parent)) { + childrenMap.set(parent, []); + } + childrenMap.get(parent)!.push(child); + } + + return childrenMap; +} + +/** + * Get all descendants (children, grandchildren, etc.) of an entity + */ +function getAllDescendants( + entity: string, + childrenMap: Map +): string[] { + const descendants: string[] = []; + const queue = [entity.toLowerCase()]; + + while (queue.length > 0) { + const current = queue.shift()!; + const children = childrenMap.get(current) ?? []; + for (const child of children) { + descendants.push(child); + queue.push(child); + } + } + + return descendants; +} + +/** + * Build the invalidate object property for a single entity + */ +function buildEntityInvalidateProperty( + table: CleanTable, + relationships: Record, + childrenMap: Map, + allTables: CleanTable[] +): t.ObjectProperty { + const { typeName, singularName } = getTableNames(table); + const entityKey = typeName.toLowerCase(); + const keysName = `${lcFirst(typeName)}Keys`; + + const descendants = getAllDescendants(entityKey, childrenMap); + const hasDescendants = descendants.length > 0; + const relationship = relationships[entityKey]; + const hasParent = !!relationship; + + const innerProperties: t.ObjectProperty[] = []; + + // Helper to create QueryClient type reference + const queryClientTypeRef = () => t.tsTypeReference(t.identifier('QueryClient')); + const stringOrNumberType = () => t.tsUnionType([t.tsStringKeyword(), t.tsNumberKeyword()]); + + // Helper to create queryClient.invalidateQueries({ queryKey: ... }) + const invalidateCall = (queryKeyExpr: t.Expression) => + t.callExpression( + t.memberExpression(t.identifier('queryClient'), t.identifier('invalidateQueries')), + [t.objectExpression([t.objectProperty(t.identifier('queryKey'), queryKeyExpr)])] + ); + + // all property + const allArrowFn = t.arrowFunctionExpression( + [typedParam('queryClient', queryClientTypeRef())], + invalidateCall(t.memberExpression(t.identifier(keysName), t.identifier('all'))) + ); + const allProp = t.objectProperty(t.identifier('all'), allArrowFn); + addJSDocComment(allProp, [`Invalidate all ${singularName} queries`]); + innerProperties.push(allProp); + + // lists property + let listsProp: t.ObjectProperty; + if (hasParent) { + const scopeTypeName = `${typeName}Scope`; + const scopeParam = typedParam('scope', t.tsTypeReference(t.identifier(scopeTypeName)), true); + const listsArrowFn = t.arrowFunctionExpression( + [typedParam('queryClient', queryClientTypeRef()), scopeParam], + invalidateCall( + t.callExpression( + t.memberExpression(t.identifier(keysName), t.identifier('lists')), + [t.identifier('scope')] + ) + ) + ); + listsProp = t.objectProperty(t.identifier('lists'), listsArrowFn); + } else { + const listsArrowFn = t.arrowFunctionExpression( + [typedParam('queryClient', queryClientTypeRef())], + invalidateCall( + t.callExpression( + t.memberExpression(t.identifier(keysName), t.identifier('lists')), + [] + ) + ) + ); + listsProp = t.objectProperty(t.identifier('lists'), listsArrowFn); + } + addJSDocComment(listsProp, [`Invalidate ${singularName} list queries`]); + innerProperties.push(listsProp); + + // detail property + let detailProp: t.ObjectProperty; + if (hasParent) { + const scopeTypeName = `${typeName}Scope`; + const scopeParam = typedParam('scope', t.tsTypeReference(t.identifier(scopeTypeName)), true); + const detailArrowFn = t.arrowFunctionExpression( + [typedParam('queryClient', queryClientTypeRef()), typedParam('id', stringOrNumberType()), scopeParam], + invalidateCall( + t.callExpression( + t.memberExpression(t.identifier(keysName), t.identifier('detail')), + [t.identifier('id'), t.identifier('scope')] + ) + ) + ); + detailProp = t.objectProperty(t.identifier('detail'), detailArrowFn); + } else { + const detailArrowFn = t.arrowFunctionExpression( + [typedParam('queryClient', queryClientTypeRef()), typedParam('id', stringOrNumberType())], + invalidateCall( + t.callExpression( + t.memberExpression(t.identifier(keysName), t.identifier('detail')), + [t.identifier('id')] + ) + ) + ); + detailProp = t.objectProperty(t.identifier('detail'), detailArrowFn); + } + addJSDocComment(detailProp, [`Invalidate a specific ${singularName}`]); + innerProperties.push(detailProp); + + // withChildren property (cascade) + if (hasDescendants) { + const cascadeStatements: t.Statement[] = []; + + // Comment: Invalidate this entity + const selfDetailStmt = t.expressionStatement( + invalidateCall( + t.callExpression( + t.memberExpression(t.identifier(keysName), t.identifier('detail')), + [t.identifier('id')] + ) + ) + ); + addLineComment(selfDetailStmt, `Invalidate this ${singularName}`); + cascadeStatements.push(selfDetailStmt); + + cascadeStatements.push( + t.expressionStatement( + invalidateCall( + t.callExpression( + t.memberExpression(t.identifier(keysName), t.identifier('lists')), + [] + ) + ) + ) + ); + + // Comment: Cascade to child entities + let firstCascade = true; + for (const descendant of descendants) { + const descendantTable = allTables.find( + (tbl) => getTableNames(tbl).typeName.toLowerCase() === descendant + ); + if (descendantTable) { + const { typeName: descTypeName } = getTableNames(descendantTable); + const descRel = relationships[descendant]; + + if (descRel) { + let fkField: string | null = null; + if (descRel.parent.toLowerCase() === entityKey) { + fkField = descRel.foreignKey; + } else if (descRel.ancestors?.includes(typeName.toLowerCase())) { + fkField = `${lcFirst(typeName)}Id`; + } + + const descKeysName = `${lcFirst(descTypeName)}Keys`; + let cascadeStmt: t.Statement; + if (fkField) { + cascadeStmt = t.expressionStatement( + invalidateCall( + t.callExpression( + t.memberExpression(t.identifier(descKeysName), t.identifier(`by${ucFirst(typeName)}`)), + [t.identifier('id')] + ) + ) + ); + } else { + cascadeStmt = t.expressionStatement( + invalidateCall( + t.memberExpression(t.identifier(descKeysName), t.identifier('all')) + ) + ); + } + + if (firstCascade) { + addLineComment(cascadeStmt, 'Cascade to child entities'); + firstCascade = false; + } + cascadeStatements.push(cascadeStmt); + } + } + } + + const withChildrenArrowFn = t.arrowFunctionExpression( + [typedParam('queryClient', queryClientTypeRef()), typedParam('id', stringOrNumberType())], + t.blockStatement(cascadeStatements) + ); + const withChildrenProp = t.objectProperty(t.identifier('withChildren'), withChildrenArrowFn); + addJSDocComment(withChildrenProp, [ + `Invalidate ${singularName} and all child entities`, + `Cascades to: ${descendants.join(', ')}`, + ]); + innerProperties.push(withChildrenProp); + } + + const entityProp = t.objectProperty(t.identifier(singularName), t.objectExpression(innerProperties)); + addJSDocComment(entityProp, [`Invalidate ${singularName} queries`]); + return entityProp; +} + +/** + * Build the remove object property for a single entity + */ +function buildEntityRemoveProperty( + table: CleanTable, + relationships: Record +): t.ObjectProperty { + const { typeName, singularName } = getTableNames(table); + const keysName = `${lcFirst(typeName)}Keys`; + const relationship = relationships[typeName.toLowerCase()]; + + // Helper types + const queryClientTypeRef = () => t.tsTypeReference(t.identifier('QueryClient')); + const stringOrNumberType = () => t.tsUnionType([t.tsStringKeyword(), t.tsNumberKeyword()]); + + // Helper to create queryClient.removeQueries({ queryKey: ... }) + const removeCall = (queryKeyExpr: t.Expression) => + t.callExpression( + t.memberExpression(t.identifier('queryClient'), t.identifier('removeQueries')), + [t.objectExpression([t.objectProperty(t.identifier('queryKey'), queryKeyExpr)])] + ); + + let removeProp: t.ObjectProperty; + if (relationship) { + const scopeTypeName = `${typeName}Scope`; + const scopeParam = typedParam('scope', t.tsTypeReference(t.identifier(scopeTypeName)), true); + const removeArrowFn = t.arrowFunctionExpression( + [typedParam('queryClient', queryClientTypeRef()), typedParam('id', stringOrNumberType()), scopeParam], + t.blockStatement([ + t.expressionStatement( + removeCall( + t.callExpression( + t.memberExpression(t.identifier(keysName), t.identifier('detail')), + [t.identifier('id'), t.identifier('scope')] + ) + ) + ) + ]) + ); + removeProp = t.objectProperty(t.identifier(singularName), removeArrowFn); + } else { + const removeArrowFn = t.arrowFunctionExpression( + [typedParam('queryClient', queryClientTypeRef()), typedParam('id', stringOrNumberType())], + t.blockStatement([ + t.expressionStatement( + removeCall( + t.callExpression( + t.memberExpression(t.identifier(keysName), t.identifier('detail')), + [t.identifier('id')] + ) + ) + ) + ]) + ); + removeProp = t.objectProperty(t.identifier(singularName), removeArrowFn); + } + + addJSDocComment(removeProp, [`Remove ${singularName} from cache`]); + return removeProp; +} + +/** + * Generate the complete invalidation.ts file + */ +export function generateInvalidationFile( + options: InvalidationGeneratorOptions +): GeneratedInvalidationFile { + const { tables, config } = options; + const { relationships, generateCascadeHelpers } = config; + + const childrenMap = buildChildrenMap(relationships); + + const statements: t.Statement[] = []; + + // Import QueryClient type + const queryClientImport = t.importDeclaration( + [t.importSpecifier(t.identifier('QueryClient'), t.identifier('QueryClient'))], + t.stringLiteral('@tanstack/react-query') + ); + queryClientImport.importKind = 'type'; + statements.push(queryClientImport); + + // Import query keys + const keyImports: string[] = []; + for (const table of tables) { + const { typeName } = getTableNames(table); + keyImports.push(`${lcFirst(typeName)}Keys`); + } + statements.push( + t.importDeclaration( + keyImports.map(name => t.importSpecifier(t.identifier(name), t.identifier(name))), + t.stringLiteral('./query-keys') + ) + ); + + // Import scope types if needed + const scopeTypes: string[] = []; + for (const table of tables) { + const { typeName } = getTableNames(table); + if (relationships[typeName.toLowerCase()]) { + scopeTypes.push(`${typeName}Scope`); + } + } + if (scopeTypes.length > 0) { + const scopeImport = t.importDeclaration( + scopeTypes.map(name => t.importSpecifier(t.identifier(name), t.identifier(name))), + t.stringLiteral('./query-keys') + ); + scopeImport.importKind = 'type'; + statements.push(scopeImport); + } + + // Generate invalidate object + const invalidateProperties: t.ObjectProperty[] = []; + for (const table of tables) { + invalidateProperties.push(buildEntityInvalidateProperty(table, relationships, childrenMap, tables)); + } + + const invalidateDecl = t.exportNamedDeclaration( + t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier('invalidate'), + asConst(t.objectExpression(invalidateProperties)) + ) + ]) + ); + + // Build JSDoc for invalidate + const invalidateDocLines = [ + 'Type-safe query invalidation helpers', + '', + '@example', + '```ts', + '// Invalidate all user queries', + 'invalidate.user.all(queryClient);', + '', + '// Invalidate user lists', + 'invalidate.user.lists(queryClient);', + '', + '// Invalidate specific user', + 'invalidate.user.detail(queryClient, userId);', + ]; + if (generateCascadeHelpers && Object.keys(relationships).length > 0) { + invalidateDocLines.push(''); + invalidateDocLines.push('// Cascade invalidate (entity + all children)'); + invalidateDocLines.push('invalidate.database.withChildren(queryClient, databaseId);'); + } + invalidateDocLines.push('```'); + addJSDocComment(invalidateDecl, invalidateDocLines); + statements.push(invalidateDecl); + + // Generate remove object + const removeProperties: t.ObjectProperty[] = []; + for (const table of tables) { + removeProperties.push(buildEntityRemoveProperty(table, relationships)); + } + + const removeDecl = t.exportNamedDeclaration( + t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier('remove'), + asConst(t.objectExpression(removeProperties)) + ) + ]) + ); + addJSDocComment(removeDecl, [ + 'Remove queries from cache (for delete operations)', + '', + 'Use these when an entity is deleted to remove it from cache', + 'instead of just invalidating (which would trigger a refetch).', + ]); + statements.push(removeDecl); + + // Generate code from AST + const code = generateCode(statements); + + // Build final content with header and section comments + const header = getGeneratedFileHeader('Cache invalidation helpers'); + const description = `// ============================================================================ +// Type-safe cache invalidation utilities +// +// Features: +// - Simple invalidation helpers per entity +// - Cascade invalidation for parent-child relationships +// - Remove helpers for delete operations +// ============================================================================`; + + let content = `${header} + +${description} + +`; + + // Insert section comments into the generated code + const codeLines = code.split('\n'); + let addedInvalidationSection = false; + let addedRemoveSection = false; + + for (let i = 0; i < codeLines.length; i++) { + const line = codeLines[i]; + + // Detect invalidation section (after imports) + if (!addedInvalidationSection && line.includes('* Type-safe query invalidation helpers')) { + content += `// ============================================================================ +// Invalidation Helpers +// ============================================================================ + +`; + addedInvalidationSection = true; + } + + // Detect remove section + if (!addedRemoveSection && line.includes('* Remove queries from cache')) { + content += ` +// ============================================================================ +// Remove Helpers (for delete operations) +// ============================================================================ + +`; + addedRemoveSection = true; + } + + content += line + '\n'; + } + + return { + fileName: 'invalidation.ts', + content, + }; +} diff --git a/graphql/codegen/src/cli/codegen/mutation-keys.ts b/graphql/codegen/src/cli/codegen/mutation-keys.ts new file mode 100644 index 000000000..657e1fb5a --- /dev/null +++ b/graphql/codegen/src/cli/codegen/mutation-keys.ts @@ -0,0 +1,340 @@ +/** + * Mutation key factory generator + * + * Generates centralized mutation keys for tracking in-flight mutations. + * Useful for: + * - Optimistic updates with rollback + * - Mutation deduplication + * - Tracking mutation state with useIsMutating + */ +import type { CleanTable, CleanOperation } from '../../types/schema'; +import type { ResolvedQueryKeyConfig, EntityRelationship } from '../../types/config'; +import { getTableNames, getGeneratedFileHeader, lcFirst } from './utils'; +import * as t from '@babel/types'; +import { + generateCode, + addJSDocComment, + asConst, + constArray, + typedParam, +} from './babel-ast'; + +export interface MutationKeyGeneratorOptions { + tables: CleanTable[]; + customMutations: CleanOperation[]; + config: ResolvedQueryKeyConfig; +} + +export interface GeneratedMutationKeysFile { + fileName: string; + content: string; +} + +/** + * Generate mutation keys declaration for a single table entity + */ +function generateEntityMutationKeysDeclaration( + table: CleanTable, + relationships: Record +): t.ExportNamedDeclaration { + const { typeName, singularName } = getTableNames(table); + const entityKey = typeName.toLowerCase(); + const keysName = `${lcFirst(typeName)}MutationKeys`; + + const relationship = relationships[entityKey]; + + const properties: t.ObjectProperty[] = []; + + // all property + const allProp = t.objectProperty( + t.identifier('all'), + constArray([t.stringLiteral('mutation'), t.stringLiteral(entityKey)]) + ); + addJSDocComment(allProp, [`All ${singularName} mutation keys`]); + properties.push(allProp); + + // create property + let createProp: t.ObjectProperty; + if (relationship) { + const fkParam = t.identifier(relationship.foreignKey); + fkParam.optional = true; + fkParam.typeAnnotation = t.tsTypeAnnotation(t.tsStringKeyword()); + + const arrowFn = t.arrowFunctionExpression( + [fkParam], + t.conditionalExpression( + t.identifier(relationship.foreignKey), + constArray([ + t.stringLiteral('mutation'), + t.stringLiteral(entityKey), + t.stringLiteral('create'), + t.objectExpression([ + t.objectProperty( + t.identifier(relationship.foreignKey), + t.identifier(relationship.foreignKey), + false, + true + ) + ]), + ]), + constArray([ + t.stringLiteral('mutation'), + t.stringLiteral(entityKey), + t.stringLiteral('create'), + ]) + ) + ); + + createProp = t.objectProperty(t.identifier('create'), arrowFn); + } else { + const arrowFn = t.arrowFunctionExpression( + [], + constArray([ + t.stringLiteral('mutation'), + t.stringLiteral(entityKey), + t.stringLiteral('create'), + ]) + ); + + createProp = t.objectProperty(t.identifier('create'), arrowFn); + } + addJSDocComment(createProp, [`Create ${singularName} mutation key`]); + properties.push(createProp); + + // update property + const updateArrowFn = t.arrowFunctionExpression( + [typedParam('id', t.tsUnionType([t.tsStringKeyword(), t.tsNumberKeyword()]))], + constArray([ + t.stringLiteral('mutation'), + t.stringLiteral(entityKey), + t.stringLiteral('update'), + t.identifier('id'), + ]) + ); + const updateProp = t.objectProperty(t.identifier('update'), updateArrowFn); + addJSDocComment(updateProp, [`Update ${singularName} mutation key`]); + properties.push(updateProp); + + // delete property + const deleteArrowFn = t.arrowFunctionExpression( + [typedParam('id', t.tsUnionType([t.tsStringKeyword(), t.tsNumberKeyword()]))], + constArray([ + t.stringLiteral('mutation'), + t.stringLiteral(entityKey), + t.stringLiteral('delete'), + t.identifier('id'), + ]) + ); + const deleteProp = t.objectProperty(t.identifier('delete'), deleteArrowFn); + addJSDocComment(deleteProp, [`Delete ${singularName} mutation key`]); + properties.push(deleteProp); + + return t.exportNamedDeclaration( + t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier(keysName), + asConst(t.objectExpression(properties)) + ) + ]) + ); +} + +/** + * Generate custom mutation keys declaration + */ +function generateCustomMutationKeysDeclaration( + operations: CleanOperation[] +): t.ExportNamedDeclaration | null { + if (operations.length === 0) return null; + + const properties: t.ObjectProperty[] = []; + + for (const op of operations) { + const hasArgs = op.args.length > 0; + + let prop: t.ObjectProperty; + + if (hasArgs) { + const identifierParam = t.identifier('identifier'); + identifierParam.optional = true; + identifierParam.typeAnnotation = t.tsTypeAnnotation(t.tsStringKeyword()); + + const arrowFn = t.arrowFunctionExpression( + [identifierParam], + t.conditionalExpression( + t.identifier('identifier'), + constArray([ + t.stringLiteral('mutation'), + t.stringLiteral(op.name), + t.identifier('identifier'), + ]), + constArray([t.stringLiteral('mutation'), t.stringLiteral(op.name)]) + ) + ); + + prop = t.objectProperty(t.identifier(op.name), arrowFn); + } else { + const arrowFn = t.arrowFunctionExpression( + [], + constArray([t.stringLiteral('mutation'), t.stringLiteral(op.name)]) + ); + + prop = t.objectProperty(t.identifier(op.name), arrowFn); + } + + addJSDocComment(prop, [`Mutation key for ${op.name}`]); + properties.push(prop); + } + + return t.exportNamedDeclaration( + t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier('customMutationKeys'), + asConst(t.objectExpression(properties)) + ) + ]) + ); +} + +/** + * Generate the unified mutation keys store declaration + */ +function generateUnifiedMutationStoreDeclaration( + tables: CleanTable[], + hasCustomMutations: boolean +): t.ExportNamedDeclaration { + const properties: t.ObjectProperty[] = []; + + for (const table of tables) { + const { typeName } = getTableNames(table); + const keysName = `${lcFirst(typeName)}MutationKeys`; + properties.push( + t.objectProperty(t.identifier(lcFirst(typeName)), t.identifier(keysName)) + ); + } + + if (hasCustomMutations) { + properties.push( + t.objectProperty(t.identifier('custom'), t.identifier('customMutationKeys')) + ); + } + + const decl = t.exportNamedDeclaration( + t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier('mutationKeys'), + asConst(t.objectExpression(properties)) + ) + ]) + ); + + addJSDocComment(decl, [ + 'Unified mutation key store', + '', + 'Use this for tracking in-flight mutations with useIsMutating.', + '', + '@example', + '```ts', + "import { useIsMutating } from '@tanstack/react-query';", + "import { mutationKeys } from './generated';", + '', + '// Check if any user mutations are in progress', + 'const isMutatingUser = useIsMutating({ mutationKey: mutationKeys.user.all });', + '', + '// Check if a specific user is being updated', + 'const isUpdating = useIsMutating({ mutationKey: mutationKeys.user.update(userId) });', + '```', + ]); + + return decl; +} + +/** + * Generate the complete mutation-keys.ts file + */ +export function generateMutationKeysFile( + options: MutationKeyGeneratorOptions +): GeneratedMutationKeysFile { + const { tables, customMutations, config } = options; + const { relationships } = config; + + const statements: t.Statement[] = []; + + // Generate entity mutation keys + for (const table of tables) { + statements.push(generateEntityMutationKeysDeclaration(table, relationships)); + } + + // Generate custom mutation keys + const mutationOperations = customMutations.filter((op) => op.kind === 'mutation'); + const customKeysDecl = generateCustomMutationKeysDeclaration(mutationOperations); + if (customKeysDecl) { + statements.push(customKeysDecl); + } + + // Generate unified store + statements.push(generateUnifiedMutationStoreDeclaration(tables, mutationOperations.length > 0)); + + // Generate code from AST + const code = generateCode(statements); + + // Build final content with header and section comments + const header = getGeneratedFileHeader('Centralized mutation key factory'); + const description = `// ============================================================================ +// Mutation keys for tracking in-flight mutations +// +// Benefits: +// - Track mutation state with useIsMutating +// - Implement optimistic updates with proper rollback +// - Deduplicate identical mutations +// - Coordinate related mutations +// ============================================================================`; + + let content = `${header} + +${description} + +// ============================================================================ +// Entity Mutation Keys +// ============================================================================ + +`; + + // Insert section comments into the generated code + const codeLines = code.split('\n'); + let addedCustomSection = false; + let addedUnifiedSection = false; + + for (let i = 0; i < codeLines.length; i++) { + const line = codeLines[i]; + + // Detect custom mutation keys section + if (!addedCustomSection && line.startsWith('export const customMutationKeys')) { + content += ` +// ============================================================================ +// Custom Mutation Keys +// ============================================================================ + +`; + addedCustomSection = true; + } + + // Detect unified store section + if (!addedUnifiedSection && line.includes('* Unified mutation key store')) { + content += ` +// ============================================================================ +// Unified Mutation Key Store +// ============================================================================ + +`; + addedUnifiedSection = true; + } + + content += line + '\n'; + } + + return { + fileName: 'mutation-keys.ts', + content, + }; +} diff --git a/graphql/codegen/src/cli/codegen/mutations.ts b/graphql/codegen/src/cli/codegen/mutations.ts index f302ecfdc..d0f5f4fce 100644 --- a/graphql/codegen/src/cli/codegen/mutations.ts +++ b/graphql/codegen/src/cli/codegen/mutations.ts @@ -1,5 +1,5 @@ /** - * Mutation hook generators using AST-based code generation + * Mutation hook generators using Babel AST-based code generation * * Output structure: * mutations/ @@ -8,16 +8,8 @@ * useDeleteCarMutation.ts */ import type { CleanTable } from '../../types/schema'; -import { - createProject, - createSourceFile, - getFormattedOutput, - createFileHeader, - createImport, - createInterface, - createConst, - type InterfaceProperty, -} from './ts-ast'; +import * as t from '@babel/types'; +import { generateCode, addJSDocComment, typedParam } from './babel-ast'; import { buildCreateMutationAST, buildUpdateMutationAST, @@ -40,26 +32,17 @@ import { fieldTypeToTs, ucFirst, lcFirst, + getGeneratedFileHeader, } from './utils'; -/** - * Check if a field is auto-generated and should be excluded from create inputs - * Uses primary key from constraints and common timestamp patterns - */ function isAutoGeneratedField(fieldName: string, pkFieldNames: Set): boolean { const name = fieldName.toLowerCase(); - - // Exclude primary key fields (from constraints) if (pkFieldNames.has(fieldName)) return true; - - // Exclude common timestamp patterns (case-insensitive) - // These are typically auto-set by database triggers or defaults const timestampPatterns = [ 'createdat', 'created_at', 'createddate', 'created_date', 'updatedat', 'updated_at', 'updateddate', 'updated_date', - 'deletedat', 'deleted_at', // soft delete timestamps + 'deletedat', 'deleted_at', ]; - return timestampPatterns.includes(name); } @@ -69,43 +52,38 @@ export interface GeneratedMutationFile { } export interface MutationGeneratorOptions { - /** Whether to generate React Query hooks (default: true for backwards compatibility) */ reactQueryEnabled?: boolean; - /** Enum type names that are available from schema-types.ts */ enumsFromSchemaTypes?: string[]; + useCentralizedKeys?: boolean; + hasRelationships?: boolean; } -// ============================================================================ -// Create mutation hook generator -// ============================================================================ - -/** - * Generate create mutation hook file content using AST - * When reactQueryEnabled is false, returns null since mutations require React Query - */ export function generateCreateMutationHook( table: CleanTable, options: MutationGeneratorOptions = {} ): GeneratedMutationFile | null { - const { reactQueryEnabled = true, enumsFromSchemaTypes = [] } = options; + const { + reactQueryEnabled = true, + enumsFromSchemaTypes = [], + useCentralizedKeys = true, + hasRelationships = false, + } = options; - // Mutations require React Query - skip generation when disabled if (!reactQueryEnabled) { return null; } const enumSet = new Set(enumsFromSchemaTypes); - - const project = createProject(); const { typeName, singularName } = getTableNames(table); const hookName = getCreateMutationHookName(table); + const keysName = `${lcFirst(typeName)}Keys`; + const mutationKeysName = `${lcFirst(typeName)}MutationKeys`; + const scopeTypeName = `${typeName}Scope`; const mutationName = getCreateMutationName(table); const scalarFields = getScalarFields(table); - // Get primary key field names dynamically from table constraints - const pkFieldNames = new Set(getPrimaryKeyInfo(table).map(pk => pk.name)); + const pkFieldNames = new Set(getPrimaryKeyInfo(table).map((pk) => pk.name)); - // Collect which enums are used by this table's fields const usedEnums = new Set(); for (const field of scalarFields) { const cleanType = field.type.gqlType.replace(/!/g, ''); @@ -114,198 +92,289 @@ export function generateCreateMutationHook( } } - // Generate GraphQL document via AST const mutationAST = buildCreateMutationAST({ table }); const mutationDocument = printGraphQL(mutationAST); - const sourceFile = createSourceFile(project, getCreateMutationFileName(table)); - - // Add file header - sourceFile.insertText(0, createFileHeader(`Create mutation hook for ${typeName}`) + '\n\n'); - - // Build import declarations - const imports = [ - createImport({ - moduleSpecifier: '@tanstack/react-query', - namedImports: ['useMutation', 'useQueryClient'], - typeOnlyNamedImports: ['UseMutationOptions'], - }), - createImport({ - moduleSpecifier: '../client', - namedImports: ['execute'], - }), - createImport({ - moduleSpecifier: '../types', - typeOnlyNamedImports: [typeName], - }), - ]; + const statements: t.Statement[] = []; + + const reactQueryImport = t.importDeclaration( + [ + t.importSpecifier(t.identifier('useMutation'), t.identifier('useMutation')), + t.importSpecifier(t.identifier('useQueryClient'), t.identifier('useQueryClient')), + ], + t.stringLiteral('@tanstack/react-query') + ); + statements.push(reactQueryImport); + + const reactQueryTypeImport = t.importDeclaration( + [t.importSpecifier(t.identifier('UseMutationOptions'), t.identifier('UseMutationOptions'))], + t.stringLiteral('@tanstack/react-query') + ); + reactQueryTypeImport.importKind = 'type'; + statements.push(reactQueryTypeImport); + + const clientImport = t.importDeclaration( + [t.importSpecifier(t.identifier('execute'), t.identifier('execute'))], + t.stringLiteral('../client') + ); + statements.push(clientImport); + + const typesImport = t.importDeclaration( + [t.importSpecifier(t.identifier(typeName), t.identifier(typeName))], + t.stringLiteral('../types') + ); + typesImport.importKind = 'type'; + statements.push(typesImport); - // Add import for enum types from schema-types if any are used if (usedEnums.size > 0) { - imports.push( - createImport({ - moduleSpecifier: '../schema-types', - typeOnlyNamedImports: Array.from(usedEnums).sort(), - }) + const enumImport = t.importDeclaration( + Array.from(usedEnums).sort().map((e) => t.importSpecifier(t.identifier(e), t.identifier(e))), + t.stringLiteral('../schema-types') ); + enumImport.importKind = 'type'; + statements.push(enumImport); } - // Add imports - sourceFile.addImportDeclarations(imports); - - // Re-export entity type - sourceFile.addStatements(`\n// Re-export entity type for convenience\nexport type { ${typeName} };\n`); - - // Add section comment - sourceFile.addStatements('\n// ============================================================================'); - sourceFile.addStatements('// GraphQL Document'); - sourceFile.addStatements('// ============================================================================\n'); + if (useCentralizedKeys) { + const queryKeyImport = t.importDeclaration( + [t.importSpecifier(t.identifier(keysName), t.identifier(keysName))], + t.stringLiteral('../query-keys') + ); + statements.push(queryKeyImport); + if (hasRelationships) { + const scopeTypeImport = t.importDeclaration( + [t.importSpecifier(t.identifier(scopeTypeName), t.identifier(scopeTypeName))], + t.stringLiteral('../query-keys') + ); + scopeTypeImport.importKind = 'type'; + statements.push(scopeTypeImport); + } + const mutationKeyImport = t.importDeclaration( + [t.importSpecifier(t.identifier(mutationKeysName), t.identifier(mutationKeysName))], + t.stringLiteral('../mutation-keys') + ); + statements.push(mutationKeyImport); + } - // Add mutation document constant - sourceFile.addVariableStatement( - createConst(`${mutationName}MutationDocument`, '`\n' + mutationDocument + '`') + const reExportDecl = t.exportNamedDeclaration( + null, + [t.exportSpecifier(t.identifier(typeName), t.identifier(typeName))], + t.stringLiteral('../types') ); + reExportDecl.exportKind = 'type'; + statements.push(reExportDecl); + + const mutationDocConst = t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier(`${mutationName}MutationDocument`), + t.templateLiteral( + [t.templateElement({ raw: '\n' + mutationDocument, cooked: '\n' + mutationDocument }, true)], + [] + ) + ), + ]); + statements.push(t.exportNamedDeclaration(mutationDocConst)); - // Add section comment - sourceFile.addStatements('\n// ============================================================================'); - sourceFile.addStatements('// Types'); - sourceFile.addStatements('// ============================================================================\n'); - - // Generate CreateInput type - exclude auto-generated fields - // Note: Not exported to avoid conflicts with schema-types - const inputFields: InterfaceProperty[] = scalarFields + const inputFields = scalarFields .filter((f) => !isAutoGeneratedField(f.name, pkFieldNames)) - .map((f) => ({ - name: f.name, - type: `${fieldTypeToTs(f.type)} | null`, - optional: true, - })); - - sourceFile.addInterface( - createInterface(`${typeName}CreateInput`, inputFields, { - docs: [`Input type for creating a ${typeName}`], - isExported: false, - }) - ); - - // Variables interface - sourceFile.addInterface( - createInterface(`${ucFirst(mutationName)}MutationVariables`, [ - { - name: 'input', - type: `{ - ${lcFirst(typeName)}: ${typeName}CreateInput; - }`, - }, + .map((f) => { + const prop = t.tsPropertySignature( + t.identifier(f.name), + t.tsTypeAnnotation( + t.tsUnionType([ + t.tsTypeReference(t.identifier(fieldTypeToTs(f.type))), + t.tsNullKeyword(), + ]) + ) + ); + prop.optional = true; + return prop; + }); + + const createInputInterface = t.tsInterfaceDeclaration( + t.identifier(`${typeName}CreateInput`), + null, + null, + t.tsInterfaceBody(inputFields) + ); + addJSDocComment(createInputInterface, [`Input type for creating a ${typeName}`]); + statements.push(createInputInterface); + + const variablesInterfaceBody = t.tsInterfaceBody([ + t.tsPropertySignature( + t.identifier('input'), + t.tsTypeAnnotation( + t.tsTypeLiteral([ + t.tsPropertySignature( + t.identifier(lcFirst(typeName)), + t.tsTypeAnnotation(t.tsTypeReference(t.identifier(`${typeName}CreateInput`))) + ), + ]) + ) + ), + ]); + const variablesInterface = t.tsInterfaceDeclaration( + t.identifier(`${ucFirst(mutationName)}MutationVariables`), + null, + null, + variablesInterfaceBody + ); + statements.push(t.exportNamedDeclaration(variablesInterface)); + + const resultInterfaceBody = t.tsInterfaceBody([ + t.tsPropertySignature( + t.identifier(mutationName), + t.tsTypeAnnotation( + t.tsTypeLiteral([ + t.tsPropertySignature( + t.identifier(singularName), + t.tsTypeAnnotation(t.tsTypeReference(t.identifier(typeName))) + ), + ]) + ) + ), + ]); + const resultInterface = t.tsInterfaceDeclaration( + t.identifier(`${ucFirst(mutationName)}MutationResult`), + null, + null, + resultInterfaceBody + ); + statements.push(t.exportNamedDeclaration(resultInterface)); + + const hookBodyStatements: t.Statement[] = []; + hookBodyStatements.push( + t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier('queryClient'), + t.callExpression(t.identifier('useQueryClient'), []) + ), ]) ); - // Result interface - sourceFile.addInterface( - createInterface(`${ucFirst(mutationName)}MutationResult`, [ - { - name: mutationName, - type: `{ - ${singularName}: ${typeName}; - }`, - }, - ]) + const mutationOptions: (t.ObjectProperty | t.SpreadElement)[] = []; + if (useCentralizedKeys) { + mutationOptions.push( + t.objectProperty( + t.identifier('mutationKey'), + t.callExpression( + t.memberExpression(t.identifier(mutationKeysName), t.identifier('create')), + [] + ) + ) + ); + } + mutationOptions.push( + t.objectProperty( + t.identifier('mutationFn'), + t.arrowFunctionExpression( + [typedParam('variables', t.tsTypeReference(t.identifier(`${ucFirst(mutationName)}MutationVariables`)))], + t.callExpression(t.identifier('execute'), [ + t.identifier(`${mutationName}MutationDocument`), + t.identifier('variables'), + ]) + ) + ) + ); + + const invalidateQueryKey = useCentralizedKeys + ? t.callExpression(t.memberExpression(t.identifier(keysName), t.identifier('lists')), []) + : t.arrayExpression([t.stringLiteral(typeName.toLowerCase()), t.stringLiteral('list')]); + + mutationOptions.push( + t.objectProperty( + t.identifier('onSuccess'), + t.arrowFunctionExpression( + [], + t.blockStatement([ + t.expressionStatement( + t.callExpression( + t.memberExpression(t.identifier('queryClient'), t.identifier('invalidateQueries')), + [t.objectExpression([t.objectProperty(t.identifier('queryKey'), invalidateQueryKey)])] + ) + ), + ]) + ) + ) ); + mutationOptions.push(t.spreadElement(t.identifier('options'))); - // Add section comment - sourceFile.addStatements('\n// ============================================================================'); - sourceFile.addStatements('// Hook'); - sourceFile.addStatements('// ============================================================================\n'); - - // Hook function - sourceFile.addFunction({ - name: hookName, - isExported: true, - parameters: [ - { - name: 'options', - type: `Omit, 'mutationFn'>`, - hasQuestionToken: true, - }, - ], - statements: `const queryClient = useQueryClient(); + hookBodyStatements.push( + t.returnStatement( + t.callExpression(t.identifier('useMutation'), [t.objectExpression(mutationOptions)]) + ) + ); - return useMutation({ - mutationFn: (variables: ${ucFirst(mutationName)}MutationVariables) => - execute<${ucFirst(mutationName)}MutationResult, ${ucFirst(mutationName)}MutationVariables>( - ${mutationName}MutationDocument, - variables - ), - onSuccess: () => { - // Invalidate list queries to refetch - queryClient.invalidateQueries({ queryKey: ['${typeName.toLowerCase()}', 'list'] }); - }, - ...options, - });`, - docs: [ - { - description: `Mutation hook for creating a ${typeName} - -@example -\`\`\`tsx -const { mutate, isPending } = ${hookName}(); - -mutate({ - input: { - ${lcFirst(typeName)}: { - // ... fields - }, - }, -}); -\`\`\``, - }, - ], - }); + const optionsTypeStr = `Omit, 'mutationFn'>`; + const optionsParam = t.identifier('options'); + optionsParam.optional = true; + optionsParam.typeAnnotation = t.tsTypeAnnotation(t.tsTypeReference(t.identifier(optionsTypeStr))); + + const hookFunc = t.functionDeclaration( + t.identifier(hookName), + [optionsParam], + t.blockStatement(hookBodyStatements) + ); + const hookExport = t.exportNamedDeclaration(hookFunc); + addJSDocComment(hookExport, [ + `Mutation hook for creating a ${typeName}`, + '', + '@example', + '```tsx', + `const { mutate, isPending } = ${hookName}();`, + '', + 'mutate({', + ' input: {', + ` ${lcFirst(typeName)}: {`, + ' // ... fields', + ' },', + ' },', + '});', + '```', + ]); + statements.push(hookExport); + + const code = generateCode(statements); + const content = getGeneratedFileHeader(`Create mutation hook for ${typeName}`) + '\n\n' + code; return { fileName: getCreateMutationFileName(table), - content: getFormattedOutput(sourceFile), + content, }; } -// ============================================================================ -// Update mutation hook generator -// ============================================================================ - -/** - * Generate update mutation hook file content using AST - * When reactQueryEnabled is false, returns null since mutations require React Query - */ export function generateUpdateMutationHook( table: CleanTable, options: MutationGeneratorOptions = {} ): GeneratedMutationFile | null { - const { reactQueryEnabled = true, enumsFromSchemaTypes = [] } = options; + const { + reactQueryEnabled = true, + enumsFromSchemaTypes = [], + useCentralizedKeys = true, + hasRelationships = false, + } = options; - // Mutations require React Query - skip generation when disabled if (!reactQueryEnabled) { return null; } - // Check if update mutation exists if (table.query?.update === null) { return null; } const enumSet = new Set(enumsFromSchemaTypes); - - const project = createProject(); const { typeName, singularName } = getTableNames(table); const hookName = getUpdateMutationHookName(table); const mutationName = getUpdateMutationName(table); const scalarFields = getScalarFields(table); + const keysName = `${lcFirst(typeName)}Keys`; + const mutationKeysName = `${lcFirst(typeName)}MutationKeys`; + const scopeTypeName = `${typeName}Scope`; - // Get primary key info dynamically from table constraints const pkFields = getPrimaryKeyInfo(table); - const pkField = pkFields[0]; // Use first PK field - const pkFieldNames = new Set(pkFields.map(pk => pk.name)); + const pkField = pkFields[0]; + const pkFieldNames = new Set(pkFields.map((pk) => pk.name)); - // Collect which enums are used by this table's fields const usedEnums = new Set(); for (const field of scalarFields) { const cleanType = field.type.gqlType.replace(/!/g, ''); @@ -314,321 +383,528 @@ export function generateUpdateMutationHook( } } - // Generate GraphQL document via AST const mutationAST = buildUpdateMutationAST({ table }); const mutationDocument = printGraphQL(mutationAST); - const sourceFile = createSourceFile(project, getUpdateMutationFileName(table)); - - // Add file header - sourceFile.insertText(0, createFileHeader(`Update mutation hook for ${typeName}`) + '\n\n'); - - // Build import declarations - const imports = [ - createImport({ - moduleSpecifier: '@tanstack/react-query', - namedImports: ['useMutation', 'useQueryClient'], - typeOnlyNamedImports: ['UseMutationOptions'], - }), - createImport({ - moduleSpecifier: '../client', - namedImports: ['execute'], - }), - createImport({ - moduleSpecifier: '../types', - typeOnlyNamedImports: [typeName], - }), - ]; + const statements: t.Statement[] = []; + + const reactQueryImport = t.importDeclaration( + [ + t.importSpecifier(t.identifier('useMutation'), t.identifier('useMutation')), + t.importSpecifier(t.identifier('useQueryClient'), t.identifier('useQueryClient')), + ], + t.stringLiteral('@tanstack/react-query') + ); + statements.push(reactQueryImport); + + const reactQueryTypeImport = t.importDeclaration( + [t.importSpecifier(t.identifier('UseMutationOptions'), t.identifier('UseMutationOptions'))], + t.stringLiteral('@tanstack/react-query') + ); + reactQueryTypeImport.importKind = 'type'; + statements.push(reactQueryTypeImport); + + const clientImport = t.importDeclaration( + [t.importSpecifier(t.identifier('execute'), t.identifier('execute'))], + t.stringLiteral('../client') + ); + statements.push(clientImport); + + const typesImport = t.importDeclaration( + [t.importSpecifier(t.identifier(typeName), t.identifier(typeName))], + t.stringLiteral('../types') + ); + typesImport.importKind = 'type'; + statements.push(typesImport); - // Add import for enum types from schema-types if any are used if (usedEnums.size > 0) { - imports.push( - createImport({ - moduleSpecifier: '../schema-types', - typeOnlyNamedImports: Array.from(usedEnums).sort(), - }) + const enumImport = t.importDeclaration( + Array.from(usedEnums).sort().map((e) => t.importSpecifier(t.identifier(e), t.identifier(e))), + t.stringLiteral('../schema-types') ); + enumImport.importKind = 'type'; + statements.push(enumImport); } - // Add imports - sourceFile.addImportDeclarations(imports); - - // Re-export entity type - sourceFile.addStatements(`\n// Re-export entity type for convenience\nexport type { ${typeName} };\n`); - - // Add section comment - sourceFile.addStatements('\n// ============================================================================'); - sourceFile.addStatements('// GraphQL Document'); - sourceFile.addStatements('// ============================================================================\n'); + if (useCentralizedKeys) { + const queryKeyImport = t.importDeclaration( + [t.importSpecifier(t.identifier(keysName), t.identifier(keysName))], + t.stringLiteral('../query-keys') + ); + statements.push(queryKeyImport); + if (hasRelationships) { + const scopeTypeImport = t.importDeclaration( + [t.importSpecifier(t.identifier(scopeTypeName), t.identifier(scopeTypeName))], + t.stringLiteral('../query-keys') + ); + scopeTypeImport.importKind = 'type'; + statements.push(scopeTypeImport); + } + const mutationKeyImport = t.importDeclaration( + [t.importSpecifier(t.identifier(mutationKeysName), t.identifier(mutationKeysName))], + t.stringLiteral('../mutation-keys') + ); + statements.push(mutationKeyImport); + } - // Add mutation document constant - sourceFile.addVariableStatement( - createConst(`${mutationName}MutationDocument`, '`\n' + mutationDocument + '`') + const reExportDecl = t.exportNamedDeclaration( + null, + [t.exportSpecifier(t.identifier(typeName), t.identifier(typeName))], + t.stringLiteral('../types') ); + reExportDecl.exportKind = 'type'; + statements.push(reExportDecl); + + const mutationDocConst = t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier(`${mutationName}MutationDocument`), + t.templateLiteral( + [t.templateElement({ raw: '\n' + mutationDocument, cooked: '\n' + mutationDocument }, true)], + [] + ) + ), + ]); + statements.push(t.exportNamedDeclaration(mutationDocConst)); - // Add section comment - sourceFile.addStatements('\n// ============================================================================'); - sourceFile.addStatements('// Types'); - sourceFile.addStatements('// ============================================================================\n'); - - // Generate Patch type - all fields optional, exclude primary key - // Note: Not exported to avoid conflicts with schema-types - const patchFields: InterfaceProperty[] = scalarFields + const patchFields = scalarFields .filter((f) => !pkFieldNames.has(f.name)) - .map((f) => ({ - name: f.name, - type: `${fieldTypeToTs(f.type)} | null`, - optional: true, - })); - - sourceFile.addInterface( - createInterface(`${typeName}Patch`, patchFields, { - docs: [`Patch type for updating a ${typeName} - all fields optional`], - isExported: false, - }) - ); - - // Variables interface - use dynamic PK field name and type - sourceFile.addInterface( - createInterface(`${ucFirst(mutationName)}MutationVariables`, [ - { - name: 'input', - type: `{ - ${pkField.name}: ${pkField.tsType}; - patch: ${typeName}Patch; - }`, - }, + .map((f) => { + const prop = t.tsPropertySignature( + t.identifier(f.name), + t.tsTypeAnnotation( + t.tsUnionType([ + t.tsTypeReference(t.identifier(fieldTypeToTs(f.type))), + t.tsNullKeyword(), + ]) + ) + ); + prop.optional = true; + return prop; + }); + + const patchInterface = t.tsInterfaceDeclaration( + t.identifier(`${typeName}Patch`), + null, + null, + t.tsInterfaceBody(patchFields) + ); + addJSDocComment(patchInterface, [`Patch type for updating a ${typeName} - all fields optional`]); + statements.push(patchInterface); + + const pkTypeAnnotation = + pkField.tsType === 'string' + ? t.tsStringKeyword() + : pkField.tsType === 'number' + ? t.tsNumberKeyword() + : t.tsTypeReference(t.identifier(pkField.tsType)); + + const variablesInterfaceBody = t.tsInterfaceBody([ + t.tsPropertySignature( + t.identifier('input'), + t.tsTypeAnnotation( + t.tsTypeLiteral([ + t.tsPropertySignature(t.identifier(pkField.name), t.tsTypeAnnotation(pkTypeAnnotation)), + t.tsPropertySignature( + t.identifier('patch'), + t.tsTypeAnnotation(t.tsTypeReference(t.identifier(`${typeName}Patch`))) + ), + ]) + ) + ), + ]); + const variablesInterface = t.tsInterfaceDeclaration( + t.identifier(`${ucFirst(mutationName)}MutationVariables`), + null, + null, + variablesInterfaceBody + ); + statements.push(t.exportNamedDeclaration(variablesInterface)); + + const resultInterfaceBody = t.tsInterfaceBody([ + t.tsPropertySignature( + t.identifier(mutationName), + t.tsTypeAnnotation( + t.tsTypeLiteral([ + t.tsPropertySignature( + t.identifier(singularName), + t.tsTypeAnnotation(t.tsTypeReference(t.identifier(typeName))) + ), + ]) + ) + ), + ]); + const resultInterface = t.tsInterfaceDeclaration( + t.identifier(`${ucFirst(mutationName)}MutationResult`), + null, + null, + resultInterfaceBody + ); + statements.push(t.exportNamedDeclaration(resultInterface)); + + const hookBodyStatements: t.Statement[] = []; + hookBodyStatements.push( + t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier('queryClient'), + t.callExpression(t.identifier('useQueryClient'), []) + ), ]) ); - // Result interface - sourceFile.addInterface( - createInterface(`${ucFirst(mutationName)}MutationResult`, [ - { - name: mutationName, - type: `{ - ${singularName}: ${typeName}; - }`, - }, - ]) + const mutationOptions: (t.ObjectProperty | t.SpreadElement)[] = []; + if (useCentralizedKeys) { + mutationOptions.push( + t.objectProperty( + t.identifier('mutationKey'), + t.memberExpression(t.identifier(mutationKeysName), t.identifier('all')) + ) + ); + } + mutationOptions.push( + t.objectProperty( + t.identifier('mutationFn'), + t.arrowFunctionExpression( + [typedParam('variables', t.tsTypeReference(t.identifier(`${ucFirst(mutationName)}MutationVariables`)))], + t.callExpression(t.identifier('execute'), [ + t.identifier(`${mutationName}MutationDocument`), + t.identifier('variables'), + ]) + ) + ) ); - // Add section comment - sourceFile.addStatements('\n// ============================================================================'); - sourceFile.addStatements('// Hook'); - sourceFile.addStatements('// ============================================================================\n'); - - // Hook function - sourceFile.addFunction({ - name: hookName, - isExported: true, - parameters: [ - { - name: 'options', - type: `Omit, 'mutationFn'>`, - hasQuestionToken: true, - }, - ], - statements: `const queryClient = useQueryClient(); + const detailQueryKey = useCentralizedKeys + ? t.callExpression( + t.memberExpression(t.identifier(keysName), t.identifier('detail')), + [t.memberExpression(t.memberExpression(t.identifier('variables'), t.identifier('input')), t.identifier(pkField.name))] + ) + : t.arrayExpression([ + t.stringLiteral(typeName.toLowerCase()), + t.stringLiteral('detail'), + t.memberExpression(t.memberExpression(t.identifier('variables'), t.identifier('input')), t.identifier(pkField.name)), + ]); + + const listQueryKey = useCentralizedKeys + ? t.callExpression(t.memberExpression(t.identifier(keysName), t.identifier('lists')), []) + : t.arrayExpression([t.stringLiteral(typeName.toLowerCase()), t.stringLiteral('list')]); + + mutationOptions.push( + t.objectProperty( + t.identifier('onSuccess'), + t.arrowFunctionExpression( + [t.identifier('_'), t.identifier('variables')], + t.blockStatement([ + t.expressionStatement( + t.callExpression( + t.memberExpression(t.identifier('queryClient'), t.identifier('invalidateQueries')), + [t.objectExpression([t.objectProperty(t.identifier('queryKey'), detailQueryKey)])] + ) + ), + t.expressionStatement( + t.callExpression( + t.memberExpression(t.identifier('queryClient'), t.identifier('invalidateQueries')), + [t.objectExpression([t.objectProperty(t.identifier('queryKey'), listQueryKey)])] + ) + ), + ]) + ) + ) + ); + mutationOptions.push(t.spreadElement(t.identifier('options'))); - return useMutation({ - mutationFn: (variables: ${ucFirst(mutationName)}MutationVariables) => - execute<${ucFirst(mutationName)}MutationResult, ${ucFirst(mutationName)}MutationVariables>( - ${mutationName}MutationDocument, - variables - ), - onSuccess: (_, variables) => { - // Invalidate specific item and list queries - queryClient.invalidateQueries({ queryKey: ['${typeName.toLowerCase()}', 'detail', variables.input.${pkField.name}] }); - queryClient.invalidateQueries({ queryKey: ['${typeName.toLowerCase()}', 'list'] }); - }, - ...options, - });`, - docs: [ - { - description: `Mutation hook for updating a ${typeName} - -@example -\`\`\`tsx -const { mutate, isPending } = ${hookName}(); - -mutate({ - input: { - ${pkField.name}: ${pkField.tsType === 'string' ? "'value-here'" : '123'}, - patch: { - // ... fields to update - }, - }, -}); -\`\`\``, - }, - ], - }); + hookBodyStatements.push( + t.returnStatement( + t.callExpression(t.identifier('useMutation'), [t.objectExpression(mutationOptions)]) + ) + ); + + const optionsTypeStr = `Omit, 'mutationFn'>`; + const optionsParam = t.identifier('options'); + optionsParam.optional = true; + optionsParam.typeAnnotation = t.tsTypeAnnotation(t.tsTypeReference(t.identifier(optionsTypeStr))); + + const hookFunc = t.functionDeclaration( + t.identifier(hookName), + [optionsParam], + t.blockStatement(hookBodyStatements) + ); + const hookExport = t.exportNamedDeclaration(hookFunc); + addJSDocComment(hookExport, [ + `Mutation hook for updating a ${typeName}`, + '', + '@example', + '```tsx', + `const { mutate, isPending } = ${hookName}();`, + '', + 'mutate({', + ' input: {', + ` ${pkField.name}: ${pkField.tsType === 'string' ? "'value-here'" : '123'},`, + ' patch: {', + ' // ... fields to update', + ' },', + ' },', + '});', + '```', + ]); + statements.push(hookExport); + + const code = generateCode(statements); + const content = getGeneratedFileHeader(`Update mutation hook for ${typeName}`) + '\n\n' + code; return { fileName: getUpdateMutationFileName(table), - content: getFormattedOutput(sourceFile), + content, }; } -// ============================================================================ -// Delete mutation hook generator -// ============================================================================ - -/** - * Generate delete mutation hook file content using AST - * When reactQueryEnabled is false, returns null since mutations require React Query - */ export function generateDeleteMutationHook( table: CleanTable, options: MutationGeneratorOptions = {} ): GeneratedMutationFile | null { - const { reactQueryEnabled = true } = options; + const { + reactQueryEnabled = true, + useCentralizedKeys = true, + hasRelationships = false, + } = options; - // Mutations require React Query - skip generation when disabled if (!reactQueryEnabled) { return null; } - // Check if delete mutation exists if (table.query?.delete === null) { return null; } - const project = createProject(); const { typeName } = getTableNames(table); const hookName = getDeleteMutationHookName(table); const mutationName = getDeleteMutationName(table); + const keysName = `${lcFirst(typeName)}Keys`; + const mutationKeysName = `${lcFirst(typeName)}MutationKeys`; + const scopeTypeName = `${typeName}Scope`; - // Get primary key info dynamically from table constraints const pkFields = getPrimaryKeyInfo(table); - const pkField = pkFields[0]; // Use first PK field + const pkField = pkFields[0]; - // Generate GraphQL document via AST const mutationAST = buildDeleteMutationAST({ table }); const mutationDocument = printGraphQL(mutationAST); - const sourceFile = createSourceFile(project, getDeleteMutationFileName(table)); - - // Add file header - sourceFile.insertText(0, createFileHeader(`Delete mutation hook for ${typeName}`) + '\n\n'); - - // Add imports - sourceFile.addImportDeclarations([ - createImport({ - moduleSpecifier: '@tanstack/react-query', - namedImports: ['useMutation', 'useQueryClient'], - typeOnlyNamedImports: ['UseMutationOptions'], - }), - createImport({ - moduleSpecifier: '../client', - namedImports: ['execute'], - }), + const statements: t.Statement[] = []; + + const reactQueryImport = t.importDeclaration( + [ + t.importSpecifier(t.identifier('useMutation'), t.identifier('useMutation')), + t.importSpecifier(t.identifier('useQueryClient'), t.identifier('useQueryClient')), + ], + t.stringLiteral('@tanstack/react-query') + ); + statements.push(reactQueryImport); + + const reactQueryTypeImport = t.importDeclaration( + [t.importSpecifier(t.identifier('UseMutationOptions'), t.identifier('UseMutationOptions'))], + t.stringLiteral('@tanstack/react-query') + ); + reactQueryTypeImport.importKind = 'type'; + statements.push(reactQueryTypeImport); + + const clientImport = t.importDeclaration( + [t.importSpecifier(t.identifier('execute'), t.identifier('execute'))], + t.stringLiteral('../client') + ); + statements.push(clientImport); + + if (useCentralizedKeys) { + const queryKeyImport = t.importDeclaration( + [t.importSpecifier(t.identifier(keysName), t.identifier(keysName))], + t.stringLiteral('../query-keys') + ); + statements.push(queryKeyImport); + if (hasRelationships) { + const scopeTypeImport = t.importDeclaration( + [t.importSpecifier(t.identifier(scopeTypeName), t.identifier(scopeTypeName))], + t.stringLiteral('../query-keys') + ); + scopeTypeImport.importKind = 'type'; + statements.push(scopeTypeImport); + } + const mutationKeyImport = t.importDeclaration( + [t.importSpecifier(t.identifier(mutationKeysName), t.identifier(mutationKeysName))], + t.stringLiteral('../mutation-keys') + ); + statements.push(mutationKeyImport); + } + + const mutationDocConst = t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier(`${mutationName}MutationDocument`), + t.templateLiteral( + [t.templateElement({ raw: '\n' + mutationDocument, cooked: '\n' + mutationDocument }, true)], + [] + ) + ), + ]); + statements.push(t.exportNamedDeclaration(mutationDocConst)); + + const pkTypeAnnotation = + pkField.tsType === 'string' + ? t.tsStringKeyword() + : pkField.tsType === 'number' + ? t.tsNumberKeyword() + : t.tsTypeReference(t.identifier(pkField.tsType)); + + const variablesInterfaceBody = t.tsInterfaceBody([ + t.tsPropertySignature( + t.identifier('input'), + t.tsTypeAnnotation( + t.tsTypeLiteral([ + t.tsPropertySignature(t.identifier(pkField.name), t.tsTypeAnnotation(pkTypeAnnotation)), + ]) + ) + ), ]); + const variablesInterface = t.tsInterfaceDeclaration( + t.identifier(`${ucFirst(mutationName)}MutationVariables`), + null, + null, + variablesInterfaceBody + ); + statements.push(t.exportNamedDeclaration(variablesInterface)); - // Add section comment - sourceFile.addStatements('\n// ============================================================================'); - sourceFile.addStatements('// GraphQL Document'); - sourceFile.addStatements('// ============================================================================\n'); - - // Add mutation document constant - sourceFile.addVariableStatement( - createConst(`${mutationName}MutationDocument`, '`\n' + mutationDocument + '`') - ); - - // Add section comment - sourceFile.addStatements('\n// ============================================================================'); - sourceFile.addStatements('// Types'); - sourceFile.addStatements('// ============================================================================\n'); - - // Variables interface - use dynamic PK field name and type - sourceFile.addInterface( - createInterface(`${ucFirst(mutationName)}MutationVariables`, [ - { - name: 'input', - type: `{ - ${pkField.name}: ${pkField.tsType}; - }`, - }, - ]) + const deletedPkProp = t.tsPropertySignature( + t.identifier(`deleted${ucFirst(pkField.name)}`), + t.tsTypeAnnotation(t.tsUnionType([pkTypeAnnotation, t.tsNullKeyword()])) + ); + const clientMutationIdProp = t.tsPropertySignature( + t.identifier('clientMutationId'), + t.tsTypeAnnotation(t.tsUnionType([t.tsStringKeyword(), t.tsNullKeyword()])) ); - // Result interface - sourceFile.addInterface( - createInterface(`${ucFirst(mutationName)}MutationResult`, [ - { - name: mutationName, - type: `{ - clientMutationId: string | null; - deleted${ucFirst(pkField.name)}: ${pkField.tsType} | null; - }`, - }, + const resultInterfaceBody = t.tsInterfaceBody([ + t.tsPropertySignature( + t.identifier(mutationName), + t.tsTypeAnnotation(t.tsTypeLiteral([clientMutationIdProp, deletedPkProp])) + ), + ]); + const resultInterface = t.tsInterfaceDeclaration( + t.identifier(`${ucFirst(mutationName)}MutationResult`), + null, + null, + resultInterfaceBody + ); + statements.push(t.exportNamedDeclaration(resultInterface)); + + const hookBodyStatements: t.Statement[] = []; + hookBodyStatements.push( + t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier('queryClient'), + t.callExpression(t.identifier('useQueryClient'), []) + ), ]) ); - // Add section comment - sourceFile.addStatements('\n// ============================================================================'); - sourceFile.addStatements('// Hook'); - sourceFile.addStatements('// ============================================================================\n'); - - // Hook function - sourceFile.addFunction({ - name: hookName, - isExported: true, - parameters: [ - { - name: 'options', - type: `Omit, 'mutationFn'>`, - hasQuestionToken: true, - }, - ], - statements: `const queryClient = useQueryClient(); + const mutationOptions: (t.ObjectProperty | t.SpreadElement)[] = []; + if (useCentralizedKeys) { + mutationOptions.push( + t.objectProperty( + t.identifier('mutationKey'), + t.memberExpression(t.identifier(mutationKeysName), t.identifier('all')) + ) + ); + } + mutationOptions.push( + t.objectProperty( + t.identifier('mutationFn'), + t.arrowFunctionExpression( + [typedParam('variables', t.tsTypeReference(t.identifier(`${ucFirst(mutationName)}MutationVariables`)))], + t.callExpression(t.identifier('execute'), [ + t.identifier(`${mutationName}MutationDocument`), + t.identifier('variables'), + ]) + ) + ) + ); - return useMutation({ - mutationFn: (variables: ${ucFirst(mutationName)}MutationVariables) => - execute<${ucFirst(mutationName)}MutationResult, ${ucFirst(mutationName)}MutationVariables>( - ${mutationName}MutationDocument, - variables - ), - onSuccess: (_, variables) => { - // Remove from cache and invalidate list - queryClient.removeQueries({ queryKey: ['${typeName.toLowerCase()}', 'detail', variables.input.${pkField.name}] }); - queryClient.invalidateQueries({ queryKey: ['${typeName.toLowerCase()}', 'list'] }); - }, - ...options, - });`, - docs: [ - { - description: `Mutation hook for deleting a ${typeName} - -@example -\`\`\`tsx -const { mutate, isPending } = ${hookName}(); - -mutate({ - input: { - ${pkField.name}: ${pkField.tsType === 'string' ? "'value-to-delete'" : '123'}, - }, -}); -\`\`\``, - }, - ], - }); + const detailQueryKey = useCentralizedKeys + ? t.callExpression( + t.memberExpression(t.identifier(keysName), t.identifier('detail')), + [t.memberExpression(t.memberExpression(t.identifier('variables'), t.identifier('input')), t.identifier(pkField.name))] + ) + : t.arrayExpression([ + t.stringLiteral(typeName.toLowerCase()), + t.stringLiteral('detail'), + t.memberExpression(t.memberExpression(t.identifier('variables'), t.identifier('input')), t.identifier(pkField.name)), + ]); + + const listQueryKey = useCentralizedKeys + ? t.callExpression(t.memberExpression(t.identifier(keysName), t.identifier('lists')), []) + : t.arrayExpression([t.stringLiteral(typeName.toLowerCase()), t.stringLiteral('list')]); + + mutationOptions.push( + t.objectProperty( + t.identifier('onSuccess'), + t.arrowFunctionExpression( + [t.identifier('_'), t.identifier('variables')], + t.blockStatement([ + t.expressionStatement( + t.callExpression( + t.memberExpression(t.identifier('queryClient'), t.identifier('removeQueries')), + [t.objectExpression([t.objectProperty(t.identifier('queryKey'), detailQueryKey)])] + ) + ), + t.expressionStatement( + t.callExpression( + t.memberExpression(t.identifier('queryClient'), t.identifier('invalidateQueries')), + [t.objectExpression([t.objectProperty(t.identifier('queryKey'), listQueryKey)])] + ) + ), + ]) + ) + ) + ); + mutationOptions.push(t.spreadElement(t.identifier('options'))); + + hookBodyStatements.push( + t.returnStatement( + t.callExpression(t.identifier('useMutation'), [t.objectExpression(mutationOptions)]) + ) + ); + + const optionsTypeStr = `Omit, 'mutationFn'>`; + const optionsParam = t.identifier('options'); + optionsParam.optional = true; + optionsParam.typeAnnotation = t.tsTypeAnnotation(t.tsTypeReference(t.identifier(optionsTypeStr))); + + const hookFunc = t.functionDeclaration( + t.identifier(hookName), + [optionsParam], + t.blockStatement(hookBodyStatements) + ); + const hookExport = t.exportNamedDeclaration(hookFunc); + addJSDocComment(hookExport, [ + `Mutation hook for deleting a ${typeName}`, + '', + '@example', + '```tsx', + `const { mutate, isPending } = ${hookName}();`, + '', + 'mutate({', + ' input: {', + ` ${pkField.name}: ${pkField.tsType === 'string' ? "'value-to-delete'" : '123'},`, + ' },', + '});', + '```', + ]); + statements.push(hookExport); + + const code = generateCode(statements); + const content = getGeneratedFileHeader(`Delete mutation hook for ${typeName}`) + '\n\n' + code; return { fileName: getDeleteMutationFileName(table), - content: getFormattedOutput(sourceFile), + content, }; } -// ============================================================================ -// Batch generator -// ============================================================================ - -/** - * Generate all mutation hook files for all tables - * When reactQueryEnabled is false, returns empty array since mutations require React Query - */ export function generateAllMutationHooks( tables: CleanTable[], options: MutationGeneratorOptions = {} diff --git a/graphql/codegen/src/cli/codegen/orm/barrel.ts b/graphql/codegen/src/cli/codegen/orm/barrel.ts index f3d03eaf5..fda3b5b15 100644 --- a/graphql/codegen/src/cli/codegen/orm/barrel.ts +++ b/graphql/codegen/src/cli/codegen/orm/barrel.ts @@ -1,16 +1,12 @@ /** - * Barrel file generators for ORM client + * Barrel file generators for ORM client (Babel AST-based) * * Generates index.ts files that re-export all models and operations. */ import type { CleanTable } from '../../../types/schema'; -import { - createProject, - createSourceFile, - getFormattedOutput, - createFileHeader, -} from '../ts-ast'; -import { getTableNames, lcFirst } from '../utils'; +import * as t from '@babel/types'; +import { generateCode } from '../babel-ast'; +import { getTableNames, lcFirst, getGeneratedFileHeader } from '../utils'; export interface GeneratedBarrelFile { fileName: string; @@ -21,14 +17,7 @@ export interface GeneratedBarrelFile { * Generate the models/index.ts barrel file */ export function generateModelsBarrel(tables: CleanTable[]): GeneratedBarrelFile { - const project = createProject(); - const sourceFile = createSourceFile(project, 'index.ts'); - - // Add file header - sourceFile.insertText( - 0, - createFileHeader('Models barrel export') + '\n\n' - ); + const statements: t.Statement[] = []; // Export all model classes (Select types are now in input-types.ts) for (const table of tables) { @@ -38,15 +27,21 @@ export function generateModelsBarrel(tables: CleanTable[]): GeneratedBarrelFile const baseFileName = lcFirst(typeName); const moduleFileName = baseFileName === 'index' ? `${baseFileName}Model` : baseFileName; - sourceFile.addExportDeclaration({ - moduleSpecifier: `./${moduleFileName}`, - namedExports: [modelName], - }); + // Create: export { ModelName } from './moduleName'; + const exportDecl = t.exportNamedDeclaration( + null, + [t.exportSpecifier(t.identifier(modelName), t.identifier(modelName))], + t.stringLiteral(`./${moduleFileName}`) + ); + statements.push(exportDecl); } + const header = getGeneratedFileHeader('Models barrel export'); + const code = generateCode(statements); + return { fileName: 'models/index.ts', - content: getFormattedOutput(sourceFile), + content: header + '\n' + code, }; } diff --git a/graphql/codegen/src/cli/codegen/orm/client-generator.ts b/graphql/codegen/src/cli/codegen/orm/client-generator.ts index 7c078e2d1..d38a1a7dd 100644 --- a/graphql/codegen/src/cli/codegen/orm/client-generator.ts +++ b/graphql/codegen/src/cli/codegen/orm/client-generator.ts @@ -1,35 +1,12 @@ /** - * ORM Client generator + * ORM Client generator (Babel AST-based) * * Generates the createClient() factory function and main client file. - * - * Example output: - * ```typescript - * import { OrmClient, OrmClientConfig } from './client'; - * import { UserModel } from './models/user'; - * import { queryOperations } from './query'; - * import { mutationOperations } from './mutation'; - * - * export function createClient(config: OrmClientConfig) { - * const client = new OrmClient(config); - * return { - * user: new UserModel(client), - * post: new PostModel(client), - * query: queryOperations(client), - * mutation: mutationOperations(client), - * }; - * } - * ``` */ import type { CleanTable } from '../../../types/schema'; -import { - createProject, - createSourceFile, - getFormattedOutput, - createFileHeader, - createImport, -} from '../ts-ast'; -import { getTableNames, lcFirst } from '../utils'; +import * as t from '@babel/types'; +import { generateCode, commentBlock } from '../babel-ast'; +import { getTableNames, lcFirst, getGeneratedFileHeader } from '../utils'; export interface GeneratedClientFile { fileName: string; @@ -579,6 +556,19 @@ export type InferSelectResult = TSelect extends undefined }; } +function createImportDeclaration( + moduleSpecifier: string, + namedImports: string[], + typeOnly: boolean = false +): t.ImportDeclaration { + const specifiers = namedImports.map((name) => + t.importSpecifier(t.identifier(name), t.identifier(name)) + ); + const decl = t.importDeclaration(specifiers, t.stringLiteral(moduleSpecifier)); + decl.importKind = typeOnly ? 'type' : 'value'; + return decl; +} + /** * Generate the main index.ts with createClient factory */ @@ -587,127 +577,149 @@ export function generateCreateClientFile( hasCustomQueries: boolean, hasCustomMutations: boolean ): GeneratedClientFile { - const project = createProject(); - const sourceFile = createSourceFile(project, 'index.ts'); - - // Add file header - sourceFile.insertText( - 0, - createFileHeader('ORM Client - createClient factory') + '\n\n' - ); + const statements: t.Statement[] = []; // Add imports - const imports = [ - createImport({ - moduleSpecifier: './client', - namedImports: ['OrmClient'], - typeOnlyNamedImports: ['OrmClientConfig'], - }), - ]; + // Import OrmClient (value) and OrmClientConfig (type) separately + statements.push(createImportDeclaration('./client', ['OrmClient'])); + statements.push(createImportDeclaration('./client', ['OrmClientConfig'], true)); // Import models for (const table of tables) { const { typeName } = getTableNames(table); const modelName = `${typeName}Model`; const fileName = lcFirst(typeName); - imports.push( - createImport({ - moduleSpecifier: `./models/${fileName}`, - namedImports: [modelName], - }) - ); + statements.push(createImportDeclaration(`./models/${fileName}`, [modelName])); } // Import custom operations if (hasCustomQueries) { - imports.push( - createImport({ - moduleSpecifier: './query', - namedImports: ['createQueryOperations'], - }) - ); + statements.push(createImportDeclaration('./query', ['createQueryOperations'])); } if (hasCustomMutations) { - imports.push( - createImport({ - moduleSpecifier: './mutation', - namedImports: ['createMutationOperations'], - }) - ); + statements.push(createImportDeclaration('./mutation', ['createMutationOperations'])); } - sourceFile.addImportDeclarations(imports); - // Re-export types and classes - sourceFile.addStatements('\n// Re-export types and classes'); - sourceFile.addStatements( - "export type { OrmClientConfig, QueryResult, GraphQLError } from './client';" + // export type { OrmClientConfig, QueryResult, GraphQLError } from './client'; + const typeExportDecl = t.exportNamedDeclaration( + null, + [ + t.exportSpecifier(t.identifier('OrmClientConfig'), t.identifier('OrmClientConfig')), + t.exportSpecifier(t.identifier('QueryResult'), t.identifier('QueryResult')), + t.exportSpecifier(t.identifier('GraphQLError'), t.identifier('GraphQLError')), + ], + t.stringLiteral('./client') ); - sourceFile.addStatements("export { GraphQLRequestError } from './client';"); - sourceFile.addStatements("export { QueryBuilder } from './query-builder';"); - sourceFile.addStatements("export * from './select-types';"); - - // Generate createClient function - sourceFile.addStatements( - '\n// ============================================================================' + typeExportDecl.exportKind = 'type'; + statements.push(typeExportDecl); + + // export { GraphQLRequestError } from './client'; + statements.push( + t.exportNamedDeclaration( + null, + [t.exportSpecifier(t.identifier('GraphQLRequestError'), t.identifier('GraphQLRequestError'))], + t.stringLiteral('./client') + ) ); - sourceFile.addStatements('// Client Factory'); - sourceFile.addStatements( - '// ============================================================================\n' + + // export { QueryBuilder } from './query-builder'; + statements.push( + t.exportNamedDeclaration( + null, + [t.exportSpecifier(t.identifier('QueryBuilder'), t.identifier('QueryBuilder'))], + t.stringLiteral('./query-builder') + ) ); - // Build the return object - const modelEntries = tables.map((table) => { + // export * from './select-types'; + statements.push(t.exportAllDeclaration(t.stringLiteral('./select-types'))); + + // Build the return object properties + const returnProperties: t.ObjectProperty[] = []; + + for (const table of tables) { const { typeName, singularName } = getTableNames(table); - return `${singularName}: new ${typeName}Model(client)`; - }); + const modelName = `${typeName}Model`; + returnProperties.push( + t.objectProperty( + t.identifier(singularName), + t.newExpression(t.identifier(modelName), [t.identifier('client')]) + ) + ); + } - let returnObject = modelEntries.join(',\n '); if (hasCustomQueries) { - returnObject += ',\n query: createQueryOperations(client)'; + returnProperties.push( + t.objectProperty( + t.identifier('query'), + t.callExpression(t.identifier('createQueryOperations'), [t.identifier('client')]) + ) + ); } + if (hasCustomMutations) { - returnObject += ',\n mutation: createMutationOperations(client)'; + returnProperties.push( + t.objectProperty( + t.identifier('mutation'), + t.callExpression(t.identifier('createMutationOperations'), [t.identifier('client')]) + ) + ); } - sourceFile.addFunction({ - name: 'createClient', - isExported: true, - parameters: [{ name: 'config', type: 'OrmClientConfig' }], - statements: `const client = new OrmClient(config); - - return { - ${returnObject}, - };`, - docs: [ - { - description: `Create an ORM client instance - -@example -\`\`\`typescript -const db = createClient({ - endpoint: 'https://api.example.com/graphql', - headers: { Authorization: 'Bearer token' }, -}); - -// Query users -const users = await db.user.findMany({ - select: { id: true, name: true }, - first: 10, -}).execute(); - -// Create a user -const newUser = await db.user.create({ - data: { name: 'John', email: 'john@example.com' }, - select: { id: true }, -}).execute(); -\`\`\``, - }, - ], - }); + // Build the createClient function body + const clientDecl = t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier('client'), + t.newExpression(t.identifier('OrmClient'), [t.identifier('config')]) + ), + ]); + + const returnStmt = t.returnStatement(t.objectExpression(returnProperties)); + + const configParam = t.identifier('config'); + configParam.typeAnnotation = t.tsTypeAnnotation(t.tsTypeReference(t.identifier('OrmClientConfig'))); + + const createClientFunc = t.functionDeclaration( + t.identifier('createClient'), + [configParam], + t.blockStatement([clientDecl, returnStmt]) + ); + + // Add JSDoc comment + const jsdocComment = commentBlock(`* + * Create an ORM client instance + * + * @example + * \`\`\`typescript + * const db = createClient({ + * endpoint: 'https://api.example.com/graphql', + * headers: { Authorization: 'Bearer token' }, + * }); + * + * // Query users + * const users = await db.user.findMany({ + * select: { id: true, name: true }, + * first: 10, + * }).execute(); + * + * // Create a user + * const newUser = await db.user.create({ + * data: { name: 'John', email: 'john@example.com' }, + * select: { id: true }, + * }).execute(); + * \`\`\` + `); + + const exportedFunc = t.exportNamedDeclaration(createClientFunc); + exportedFunc.leadingComments = [jsdocComment]; + statements.push(exportedFunc); + + const header = getGeneratedFileHeader('ORM Client - createClient factory'); + const code = generateCode(statements); return { fileName: 'index.ts', - content: getFormattedOutput(sourceFile), + content: header + '\n' + code, }; } diff --git a/graphql/codegen/src/cli/codegen/orm/custom-ops-generator.ts b/graphql/codegen/src/cli/codegen/orm/custom-ops-generator.ts index de96429e9..0c9942968 100644 --- a/graphql/codegen/src/cli/codegen/orm/custom-ops-generator.ts +++ b/graphql/codegen/src/cli/codegen/orm/custom-ops-generator.ts @@ -1,29 +1,13 @@ /** - * Custom operations generator for ORM client + * Custom operations generator for ORM client (Babel AST-based) * * Generates db.query.* and db.mutation.* namespaces for non-table operations * like login, register, currentUser, etc. - * - * Example output: - * ```typescript - * // query/index.ts - * export function createQueryOperations(client: OrmClient) { - * return { - * currentUser: (args?: { select?: CurrentUserSelect }) => - * new QueryBuilder({ ... }), - * }; - * } - * ``` */ import type { CleanOperation, CleanArgument } from '../../../types/schema'; -import { - createProject, - createSourceFile, - getFormattedOutput, - createFileHeader, - createImport, -} from '../ts-ast'; -import { ucFirst } from '../utils'; +import * as t from '@babel/types'; +import { generateCode } from '../babel-ast'; +import { ucFirst, getGeneratedFileHeader } from '../utils'; import { typeRefToTsType, isTypeRequired, @@ -111,167 +95,237 @@ function getSelectTypeName(returnType: CleanArgument['type']): string | null { return null; } +function createImportDeclaration( + moduleSpecifier: string, + namedImports: string[], + typeOnly: boolean = false +): t.ImportDeclaration { + const specifiers = namedImports.map((name) => + t.importSpecifier(t.identifier(name), t.identifier(name)) + ); + const decl = t.importDeclaration(specifiers, t.stringLiteral(moduleSpecifier)); + decl.importKind = typeOnly ? 'type' : 'value'; + return decl; +} + +function createVariablesInterface( + op: CleanOperation +): t.ExportNamedDeclaration | null { + if (op.args.length === 0) return null; + + const varTypeName = `${ucFirst(op.name)}Variables`; + const props = op.args.map((arg) => { + const optional = !isTypeRequired(arg.type); + const prop = t.tsPropertySignature( + t.identifier(arg.name), + t.tsTypeAnnotation(parseTypeAnnotation(typeRefToTsType(arg.type))) + ); + prop.optional = optional; + return prop; + }); + + const interfaceDecl = t.tsInterfaceDeclaration( + t.identifier(varTypeName), + null, + null, + t.tsInterfaceBody(props) + ); + return t.exportNamedDeclaration(interfaceDecl); +} + +function parseTypeAnnotation(typeStr: string): t.TSType { + if (typeStr === 'string') return t.tsStringKeyword(); + if (typeStr === 'number') return t.tsNumberKeyword(); + if (typeStr === 'boolean') return t.tsBooleanKeyword(); + if (typeStr === 'null') return t.tsNullKeyword(); + if (typeStr === 'undefined') return t.tsUndefinedKeyword(); + if (typeStr === 'unknown') return t.tsUnknownKeyword(); + + if (typeStr.includes(' | ')) { + const parts = typeStr.split(' | ').map((p) => parseTypeAnnotation(p.trim())); + return t.tsUnionType(parts); + } + + if (typeStr.endsWith('[]')) { + return t.tsArrayType(parseTypeAnnotation(typeStr.slice(0, -2))); + } + + return t.tsTypeReference(t.identifier(typeStr)); +} + +function buildOperationMethod( + op: CleanOperation, + operationType: 'query' | 'mutation' +): t.ObjectProperty { + const hasArgs = op.args.length > 0; + const varTypeName = `${ucFirst(op.name)}Variables`; + const varDefs = op.args.map((arg) => ({ + name: arg.name, + type: formatGraphQLType(arg.type), + })); + + const selectTypeName = getSelectTypeName(op.returnType); + const payloadTypeName = getTypeBaseName(op.returnType); + + // Build the arrow function parameters + const params: t.Identifier[] = []; + + if (hasArgs) { + const argsParam = t.identifier('args'); + argsParam.typeAnnotation = t.tsTypeAnnotation(t.tsTypeReference(t.identifier(varTypeName))); + params.push(argsParam); + } + + const optionsParam = t.identifier('options'); + optionsParam.optional = true; + if (selectTypeName) { + optionsParam.typeAnnotation = t.tsTypeAnnotation( + t.tsTypeLiteral([ + (() => { + const prop = t.tsPropertySignature( + t.identifier('select'), + t.tsTypeAnnotation(t.tsTypeReference(t.identifier('S'))) + ); + prop.optional = true; + return prop; + })(), + ]) + ); + } else { + optionsParam.typeAnnotation = t.tsTypeAnnotation( + t.tsTypeLiteral([ + (() => { + const prop = t.tsPropertySignature( + t.identifier('select'), + t.tsTypeAnnotation( + t.tsTypeReference( + t.identifier('Record'), + t.tsTypeParameterInstantiation([t.tsStringKeyword(), t.tsUnknownKeyword()]) + ) + ) + ); + prop.optional = true; + return prop; + })(), + ]) + ); + } + params.push(optionsParam); + + // Build the QueryBuilder call + const queryBuilderArgs = t.objectExpression([ + t.objectProperty(t.identifier('client'), t.identifier('client'), false, true), + t.objectProperty(t.identifier('operation'), t.stringLiteral(operationType)), + t.objectProperty(t.identifier('operationName'), t.stringLiteral(ucFirst(op.name))), + t.objectProperty(t.identifier('fieldName'), t.stringLiteral(op.name)), + t.spreadElement( + t.callExpression(t.identifier('buildCustomDocument'), [ + t.stringLiteral(operationType), + t.stringLiteral(ucFirst(op.name)), + t.stringLiteral(op.name), + t.optionalMemberExpression(t.identifier('options'), t.identifier('select'), false, true), + hasArgs ? t.identifier('args') : t.identifier('undefined'), + t.arrayExpression( + varDefs.map((v) => + t.objectExpression([ + t.objectProperty(t.identifier('name'), t.stringLiteral(v.name)), + t.objectProperty(t.identifier('type'), t.stringLiteral(v.type)), + ]) + ) + ), + ]) + ), + ]); + + const newExpr = t.newExpression(t.identifier('QueryBuilder'), [queryBuilderArgs]); + + // Add type parameter if we have a select type + if (selectTypeName && payloadTypeName) { + (newExpr as any).typeParameters = t.tsTypeParameterInstantiation([ + t.tsTypeLiteral([ + t.tsPropertySignature( + t.identifier(op.name), + t.tsTypeAnnotation( + t.tsTypeReference( + t.identifier('InferSelectResult'), + t.tsTypeParameterInstantiation([ + t.tsTypeReference(t.identifier(payloadTypeName)), + t.tsTypeReference(t.identifier('S')), + ]) + ) + ) + ), + ]), + ]); + } + + const arrowFunc = t.arrowFunctionExpression(params, newExpr); + + // Add type parameters to arrow function if we have a select type + if (selectTypeName) { + const typeParam = t.tsTypeParameter( + t.tsTypeReference(t.identifier(selectTypeName)), + null, + 'S' + ); + (typeParam as any).const = true; + arrowFunc.typeParameters = t.tsTypeParameterDeclaration([typeParam]); + } + + return t.objectProperty(t.identifier(op.name), arrowFunc); +} + /** * Generate the query/index.ts file for custom query operations */ export function generateCustomQueryOpsFile( operations: CleanOperation[] ): GeneratedCustomOpsFile { - const project = createProject(); - const sourceFile = createSourceFile(project, 'index.ts'); + const statements: t.Statement[] = []; // Collect all input type names and payload type names const inputTypeNames = collectInputTypeNamesFromOps(operations); const payloadTypeNames = collectPayloadTypeNamesFromOps(operations); - - // Generate Select type names for payloads const selectTypeNames = payloadTypeNames.map((p) => `${p}Select`); - - // Combine all type imports - const allTypeImports = [ - ...new Set([...inputTypeNames, ...payloadTypeNames, ...selectTypeNames]), - ]; - - // Add file header - sourceFile.insertText( - 0, - createFileHeader('Custom query operations') + '\n\n' - ); + const allTypeImports = [...new Set([...inputTypeNames, ...payloadTypeNames, ...selectTypeNames])]; // Add imports - sourceFile.addImportDeclarations([ - createImport({ - moduleSpecifier: '../client', - namedImports: ['OrmClient'], - }), - createImport({ - moduleSpecifier: '../query-builder', - namedImports: ['QueryBuilder', 'buildCustomDocument'], - }), - createImport({ - moduleSpecifier: '../select-types', - typeOnlyNamedImports: ['InferSelectResult'], - }), - ]); + statements.push(createImportDeclaration('../client', ['OrmClient'])); + statements.push(createImportDeclaration('../query-builder', ['QueryBuilder', 'buildCustomDocument'])); + statements.push(createImportDeclaration('../select-types', ['InferSelectResult'], true)); - // Import types from input-types if we have any if (allTypeImports.length > 0) { - sourceFile.addImportDeclarations([ - createImport({ - moduleSpecifier: '../input-types', - typeOnlyNamedImports: allTypeImports, - }), - ]); + statements.push(createImportDeclaration('../input-types', allTypeImports, true)); } - // Generate variable definitions type for each operation - sourceFile.addStatements( - '\n// ============================================================================' - ); - sourceFile.addStatements('// Variable Types'); - sourceFile.addStatements( - '// ============================================================================\n' - ); - + // Generate variable interfaces for (const op of operations) { - if (op.args.length > 0) { - const varTypeName = `${ucFirst(op.name)}Variables`; - const props = op.args.map((arg) => { - const optional = !isTypeRequired(arg.type); - return `${arg.name}${optional ? '?' : ''}: ${typeRefToTsType(arg.type)};`; - }); - sourceFile.addStatements( - `export interface ${varTypeName} {\n ${props.join('\n ')}\n}\n` - ); - } + const varInterface = createVariablesInterface(op); + if (varInterface) statements.push(varInterface); } // Generate factory function - sourceFile.addStatements( - '\n// ============================================================================' - ); - sourceFile.addStatements('// Query Operations Factory'); - sourceFile.addStatements( - '// ============================================================================\n' - ); + const operationProperties = operations.map((op) => buildOperationMethod(op, 'query')); - // Build the operations object - const operationMethods = operations.map((op) => { - const hasArgs = op.args.length > 0; - const varTypeName = `${ucFirst(op.name)}Variables`; - const varDefs = op.args.map((arg) => ({ - name: arg.name, - type: formatGraphQLType(arg.type), - })); - const varDefsJson = JSON.stringify(varDefs); - - // Get Select type for return type - const selectTypeName = getSelectTypeName(op.returnType); - const payloadTypeName = getTypeBaseName(op.returnType); - - // Use typed select if available, otherwise fall back to Record - const selectType = selectTypeName ?? 'Record'; - const returnTypePart = - selectTypeName && payloadTypeName - ? `{ ${op.name}: InferSelectResult<${payloadTypeName}, S> }` - : 'unknown'; - - if (hasArgs) { - if (selectTypeName) { - return `${op.name}: (args: ${varTypeName}, options?: { select?: S }) => - new QueryBuilder<${returnTypePart}>({ - client, - operation: 'query', - operationName: '${ucFirst(op.name)}', - fieldName: '${op.name}', - ...buildCustomDocument('query', '${ucFirst(op.name)}', '${op.name}', options?.select, args, ${varDefsJson}), - })`; - } else { - return `${op.name}: (args: ${varTypeName}, options?: { select?: Record }) => - new QueryBuilder({ - client, - operation: 'query', - operationName: '${ucFirst(op.name)}', - fieldName: '${op.name}', - ...buildCustomDocument('query', '${ucFirst(op.name)}', '${op.name}', options?.select, args, ${varDefsJson}), - })`; - } - } else { - // No args - still provide typed select - if (selectTypeName) { - return `${op.name}: (options?: { select?: S }) => - new QueryBuilder<${returnTypePart}>({ - client, - operation: 'query', - operationName: '${ucFirst(op.name)}', - fieldName: '${op.name}', - ...buildCustomDocument('query', '${ucFirst(op.name)}', '${op.name}', options?.select, undefined, []), - })`; - } else { - return `${op.name}: (options?: { select?: Record }) => - new QueryBuilder({ - client, - operation: 'query', - operationName: '${ucFirst(op.name)}', - fieldName: '${op.name}', - ...buildCustomDocument('query', '${ucFirst(op.name)}', '${op.name}', options?.select, undefined, []), - })`; - } - } - }); + const returnObj = t.objectExpression(operationProperties); + const returnStmt = t.returnStatement(returnObj); - sourceFile.addFunction({ - name: 'createQueryOperations', - isExported: true, - parameters: [{ name: 'client', type: 'OrmClient' }], - statements: `return { - ${operationMethods.join(',\n ')}, - };`, - }); + const clientParam = t.identifier('client'); + clientParam.typeAnnotation = t.tsTypeAnnotation(t.tsTypeReference(t.identifier('OrmClient'))); + + const factoryFunc = t.functionDeclaration( + t.identifier('createQueryOperations'), + [clientParam], + t.blockStatement([returnStmt]) + ); + statements.push(t.exportNamedDeclaration(factoryFunc)); + + const header = getGeneratedFileHeader('Custom query operations'); + const code = generateCode(statements); return { fileName: 'query/index.ts', - content: getFormattedOutput(sourceFile), + content: header + '\n' + code, }; } @@ -281,161 +335,51 @@ export function generateCustomQueryOpsFile( export function generateCustomMutationOpsFile( operations: CleanOperation[] ): GeneratedCustomOpsFile { - const project = createProject(); - const sourceFile = createSourceFile(project, 'index.ts'); + const statements: t.Statement[] = []; // Collect all input type names and payload type names const inputTypeNames = collectInputTypeNamesFromOps(operations); const payloadTypeNames = collectPayloadTypeNamesFromOps(operations); - - // Generate Select type names for payloads const selectTypeNames = payloadTypeNames.map((p) => `${p}Select`); - - // Combine all type imports - const allTypeImports = [ - ...new Set([...inputTypeNames, ...payloadTypeNames, ...selectTypeNames]), - ]; - - // Add file header - sourceFile.insertText( - 0, - createFileHeader('Custom mutation operations') + '\n\n' - ); + const allTypeImports = [...new Set([...inputTypeNames, ...payloadTypeNames, ...selectTypeNames])]; // Add imports - sourceFile.addImportDeclarations([ - createImport({ - moduleSpecifier: '../client', - namedImports: ['OrmClient'], - }), - createImport({ - moduleSpecifier: '../query-builder', - namedImports: ['QueryBuilder', 'buildCustomDocument'], - }), - createImport({ - moduleSpecifier: '../select-types', - typeOnlyNamedImports: ['InferSelectResult'], - }), - ]); + statements.push(createImportDeclaration('../client', ['OrmClient'])); + statements.push(createImportDeclaration('../query-builder', ['QueryBuilder', 'buildCustomDocument'])); + statements.push(createImportDeclaration('../select-types', ['InferSelectResult'], true)); - // Import types from input-types if we have any if (allTypeImports.length > 0) { - sourceFile.addImportDeclarations([ - createImport({ - moduleSpecifier: '../input-types', - typeOnlyNamedImports: allTypeImports, - }), - ]); + statements.push(createImportDeclaration('../input-types', allTypeImports, true)); } - // Generate variable definitions type for each operation - sourceFile.addStatements( - '\n// ============================================================================' - ); - sourceFile.addStatements('// Variable Types'); - sourceFile.addStatements( - '// ============================================================================\n' - ); - + // Generate variable interfaces for (const op of operations) { - if (op.args.length > 0) { - const varTypeName = `${ucFirst(op.name)}Variables`; - const props = op.args.map((arg) => { - const optional = !isTypeRequired(arg.type); - return `${arg.name}${optional ? '?' : ''}: ${typeRefToTsType(arg.type)};`; - }); - sourceFile.addStatements( - `export interface ${varTypeName} {\n ${props.join('\n ')}\n}\n` - ); - } + const varInterface = createVariablesInterface(op); + if (varInterface) statements.push(varInterface); } // Generate factory function - sourceFile.addStatements( - '\n// ============================================================================' - ); - sourceFile.addStatements('// Mutation Operations Factory'); - sourceFile.addStatements( - '// ============================================================================\n' - ); + const operationProperties = operations.map((op) => buildOperationMethod(op, 'mutation')); - // Build the operations object - const operationMethods = operations.map((op) => { - const hasArgs = op.args.length > 0; - const varTypeName = `${ucFirst(op.name)}Variables`; - const varDefs = op.args.map((arg) => ({ - name: arg.name, - type: formatGraphQLType(arg.type), - })); - const varDefsJson = JSON.stringify(varDefs); - - // Get Select type for return type - const selectTypeName = getSelectTypeName(op.returnType); - const payloadTypeName = getTypeBaseName(op.returnType); - - // Use typed select if available, otherwise fall back to Record - const selectType = selectTypeName ?? 'Record'; - const returnTypePart = - selectTypeName && payloadTypeName - ? `{ ${op.name}: InferSelectResult<${payloadTypeName}, S> }` - : 'unknown'; - - if (hasArgs) { - if (selectTypeName) { - return `${op.name}: (args: ${varTypeName}, options?: { select?: S }) => - new QueryBuilder<${returnTypePart}>({ - client, - operation: 'mutation', - operationName: '${ucFirst(op.name)}', - fieldName: '${op.name}', - ...buildCustomDocument('mutation', '${ucFirst(op.name)}', '${op.name}', options?.select, args, ${varDefsJson}), - })`; - } else { - return `${op.name}: (args: ${varTypeName}, options?: { select?: Record }) => - new QueryBuilder({ - client, - operation: 'mutation', - operationName: '${ucFirst(op.name)}', - fieldName: '${op.name}', - ...buildCustomDocument('mutation', '${ucFirst(op.name)}', '${op.name}', options?.select, args, ${varDefsJson}), - })`; - } - } else { - // No args - still provide typed select - if (selectTypeName) { - return `${op.name}: (options?: { select?: S }) => - new QueryBuilder<${returnTypePart}>({ - client, - operation: 'mutation', - operationName: '${ucFirst(op.name)}', - fieldName: '${op.name}', - ...buildCustomDocument('mutation', '${ucFirst(op.name)}', '${op.name}', options?.select, undefined, []), - })`; - } else { - return `${op.name}: (options?: { select?: Record }) => - new QueryBuilder({ - client, - operation: 'mutation', - operationName: '${ucFirst(op.name)}', - fieldName: '${op.name}', - ...buildCustomDocument('mutation', '${ucFirst(op.name)}', '${op.name}', options?.select, undefined, []), - })`; - } - } - }); + const returnObj = t.objectExpression(operationProperties); + const returnStmt = t.returnStatement(returnObj); - sourceFile.addFunction({ - name: 'createMutationOperations', - isExported: true, - parameters: [{ name: 'client', type: 'OrmClient' }], - statements: `return { - ${operationMethods.join(',\n ')}, - };`, - }); + const clientParam = t.identifier('client'); + clientParam.typeAnnotation = t.tsTypeAnnotation(t.tsTypeReference(t.identifier('OrmClient'))); + + const factoryFunc = t.functionDeclaration( + t.identifier('createMutationOperations'), + [clientParam], + t.blockStatement([returnStmt]) + ); + statements.push(t.exportNamedDeclaration(factoryFunc)); + + const header = getGeneratedFileHeader('Custom mutation operations'); + const code = generateCode(statements); return { fileName: 'mutation/index.ts', - content: getFormattedOutput(sourceFile), + content: header + '\n' + code, }; } diff --git a/graphql/codegen/src/cli/codegen/orm/input-types-generator.ts b/graphql/codegen/src/cli/codegen/orm/input-types-generator.ts index ebd0a53a5..f5d0246c3 100644 --- a/graphql/codegen/src/cli/codegen/orm/input-types-generator.ts +++ b/graphql/codegen/src/cli/codegen/orm/input-types-generator.ts @@ -1,5 +1,5 @@ /** - * Input types generator for ORM client (AST-based) + * Input types generator for ORM client (Babel AST-based) * * Generates TypeScript interfaces for: * 1. Scalar filter types (StringFilter, IntFilter, UUIDFilter, etc.) @@ -8,30 +8,22 @@ * 4. OrderBy enums (UsersOrderBy, OrdersOrderBy, etc.) * 5. Input types (LoginInput, CreateUserInput, etc.) * - * Uses ts-morph for robust AST-based code generation. + * Uses Babel AST for robust code generation. */ -import type { SourceFile } from 'ts-morph'; import type { TypeRegistry, CleanArgument, CleanTable, } from '../../../types/schema'; -import { - createProject, - createSourceFile, - getMinimalFormattedOutput, - createFileHeader, - createInterface, - createTypeAlias, - addSectionComment, - type InterfaceProperty, -} from '../ts-ast'; +import * as t from '@babel/types'; +import { generateCode, addLineComment } from '../babel-ast'; import { getTableNames, getFilterTypeName, getConditionTypeName, getOrderByTypeName, isRelationField, + getGeneratedFileHeader, } from '../utils'; import { pluralize } from 'inflekt'; import { getTypeBaseName } from '../type-resolver'; @@ -105,6 +97,138 @@ function isRequired(typeRef: CleanArgument['type']): boolean { return typeRef.kind === 'NON_NULL'; } +// ============================================================================ +// Babel AST Helper Functions +// ============================================================================ + +/** + * Parse a type string into a TSType node + */ +function parseTypeString(typeStr: string): t.TSType { + // Handle union types like "string | null" + if (typeStr.includes(' | ')) { + const parts = typeStr.split(' | ').map((p) => p.trim()); + return t.tsUnionType(parts.map((p) => parseTypeString(p))); + } + + // Handle array types like "string[]" + if (typeStr.endsWith('[]')) { + const elementType = typeStr.slice(0, -2); + return t.tsArrayType(parseTypeString(elementType)); + } + + // Handle generic types like "Record" + if (typeStr.includes('<')) { + const match = typeStr.match(/^([^<]+)<(.+)>$/); + if (match) { + const [, baseName, params] = match; + const typeParams = params.split(',').map((p) => parseTypeString(p.trim())); + return t.tsTypeReference( + t.identifier(baseName), + t.tsTypeParameterInstantiation(typeParams) + ); + } + } + + // Handle primitive types + switch (typeStr) { + case 'string': + return t.tsStringKeyword(); + case 'number': + return t.tsNumberKeyword(); + case 'boolean': + return t.tsBooleanKeyword(); + case 'null': + return t.tsNullKeyword(); + case 'unknown': + return t.tsUnknownKeyword(); + default: + return t.tsTypeReference(t.identifier(typeStr)); + } +} + +/** + * Create an interface property signature + */ +function createPropertySignature( + name: string, + typeStr: string, + optional: boolean +): t.TSPropertySignature { + const prop = t.tsPropertySignature( + t.identifier(name), + t.tsTypeAnnotation(parseTypeString(typeStr)) + ); + prop.optional = optional; + return prop; +} + +/** + * Create an exported interface declaration + */ +function createExportedInterface( + name: string, + properties: Array<{ name: string; type: string; optional: boolean }> +): t.ExportNamedDeclaration { + const props = properties.map((p) => + createPropertySignature(p.name, p.type, p.optional) + ); + const body = t.tsInterfaceBody(props); + const interfaceDecl = t.tsInterfaceDeclaration( + t.identifier(name), + null, + null, + body + ); + return t.exportNamedDeclaration(interfaceDecl); +} + +/** + * Create an exported type alias declaration + */ +function createExportedTypeAlias( + name: string, + typeStr: string +): t.ExportNamedDeclaration { + const typeAlias = t.tsTypeAliasDeclaration( + t.identifier(name), + null, + parseTypeString(typeStr) + ); + return t.exportNamedDeclaration(typeAlias); +} + +/** + * Create a union type from string literals + */ +function createStringLiteralUnion(values: string[]): t.TSUnionType { + return t.tsUnionType( + values.map((v) => t.tsLiteralType(t.stringLiteral(v))) + ); +} + +/** + * Add a section comment to the first statement in an array + */ +function addSectionComment( + statements: t.Statement[], + sectionName: string +): void { + if (statements.length > 0) { + addLineComment(statements[0], `============ ${sectionName} ============`); + } +} + +// ============================================================================ +// Interface Property Type +// ============================================================================ + +interface InterfaceProperty { + name: string; + type: string; + optional: boolean; +} + // ============================================================================ // Scalar Filter Types Generator (AST-based) // ============================================================================ @@ -280,16 +404,19 @@ function buildScalarFilterProperties( } /** - * Add scalar filter types to source file using ts-morph + * Generate scalar filter type statements */ -function addScalarFilterTypes(sourceFile: SourceFile): void { - addSectionComment(sourceFile, 'Scalar Filter Types'); +function generateScalarFilterTypes(): t.Statement[] { + const statements: t.Statement[] = []; for (const config of SCALAR_FILTER_CONFIGS) { - sourceFile.addInterface( - createInterface(config.name, buildScalarFilterProperties(config)) + statements.push( + createExportedInterface(config.name, buildScalarFilterProperties(config)) ); } + + addSectionComment(statements, 'Scalar Filter Types'); + return statements; } // ============================================================================ @@ -331,24 +458,33 @@ function collectEnumTypesFromTables( } /** - * Add enum types to source file + * Generate enum type statements */ -function addEnumTypes( - sourceFile: SourceFile, +function generateEnumTypes( typeRegistry: TypeRegistry, enumTypeNames: Set -): void { - if (enumTypeNames.size === 0) return; +): t.Statement[] { + if (enumTypeNames.size === 0) return []; - addSectionComment(sourceFile, 'Enum Types'); + const statements: t.Statement[] = []; for (const typeName of Array.from(enumTypeNames).sort()) { const typeInfo = typeRegistry.get(typeName); if (!typeInfo || typeInfo.kind !== 'ENUM' || !typeInfo.enumValues) continue; - const values = typeInfo.enumValues.map((v) => `'${v}'`).join(' | '); - sourceFile.addTypeAlias(createTypeAlias(typeName, values)); + const unionType = createStringLiteralUnion(typeInfo.enumValues); + const typeAlias = t.tsTypeAliasDeclaration( + t.identifier(typeName), + null, + unionType + ); + statements.push(t.exportNamedDeclaration(typeAlias)); + } + + if (statements.length > 0) { + addSectionComment(statements, 'Enum Types'); } + return statements; } // ============================================================================ @@ -380,23 +516,22 @@ function buildEntityProperties(table: CleanTable): InterfaceProperty[] { } /** - * Add entity type interface for a table + * Generate entity type statements */ -function addEntityType(sourceFile: SourceFile, table: CleanTable): void { - const { typeName } = getTableNames(table); - sourceFile.addInterface( - createInterface(typeName, buildEntityProperties(table)) - ); -} +function generateEntityTypes(tables: CleanTable[]): t.Statement[] { + const statements: t.Statement[] = []; -/** - * Add all entity types - */ -function addEntityTypes(sourceFile: SourceFile, tables: CleanTable[]): void { - addSectionComment(sourceFile, 'Entity Types'); for (const table of tables) { - addEntityType(sourceFile, table); + const { typeName } = getTableNames(table); + statements.push( + createExportedInterface(typeName, buildEntityProperties(table)) + ); + } + + if (statements.length > 0) { + addSectionComment(statements, 'Entity Types'); } + return statements; } // ============================================================================ @@ -404,27 +539,40 @@ function addEntityTypes(sourceFile: SourceFile, tables: CleanTable[]): void { // ============================================================================ /** - * Add relation helper types (ConnectionResult, PageInfo) + * Generate relation helper type statements (ConnectionResult, PageInfo) */ -function addRelationHelperTypes(sourceFile: SourceFile): void { - addSectionComment(sourceFile, 'Relation Helper Types'); - - sourceFile.addInterface( - createInterface('ConnectionResult', [ - { name: 'nodes', type: 'T[]', optional: false }, - { name: 'totalCount', type: 'number', optional: false }, - { name: 'pageInfo', type: 'PageInfo', optional: false }, - ]) +function generateRelationHelperTypes(): t.Statement[] { + const statements: t.Statement[] = []; + + // ConnectionResult interface with type parameter + const connectionResultProps: t.TSPropertySignature[] = [ + createPropertySignature('nodes', 'T[]', false), + createPropertySignature('totalCount', 'number', false), + createPropertySignature('pageInfo', 'PageInfo', false), + ]; + const connectionResultBody = t.tsInterfaceBody(connectionResultProps); + const connectionResultDecl = t.tsInterfaceDeclaration( + t.identifier('ConnectionResult'), + t.tsTypeParameterDeclaration([ + t.tsTypeParameter(null, null, 'T'), + ]), + null, + connectionResultBody ); + statements.push(t.exportNamedDeclaration(connectionResultDecl)); - sourceFile.addInterface( - createInterface('PageInfo', [ + // PageInfo interface + statements.push( + createExportedInterface('PageInfo', [ { name: 'hasNextPage', type: 'boolean', optional: false }, { name: 'hasPreviousPage', type: 'boolean', optional: false }, { name: 'startCursor', type: 'string | null', optional: true }, { name: 'endCursor', type: 'string | null', optional: true }, ]) ); + + addSectionComment(statements, 'Relation Helper Types'); + return statements; } // ============================================================================ @@ -528,44 +676,50 @@ function buildEntityRelationProperties( } /** - * Add entity relation types + * Generate entity relation type statements */ -function addEntityRelationTypes( - sourceFile: SourceFile, +function generateEntityRelationTypes( tables: CleanTable[], tableByName: Map -): void { - addSectionComment(sourceFile, 'Entity Relation Types'); +): t.Statement[] { + const statements: t.Statement[] = []; for (const table of tables) { const { typeName } = getTableNames(table); - sourceFile.addInterface( - createInterface( + statements.push( + createExportedInterface( `${typeName}Relations`, buildEntityRelationProperties(table, tableByName) ) ); } + + if (statements.length > 0) { + addSectionComment(statements, 'Entity Relation Types'); + } + return statements; } /** - * Add entity types with relations (intersection types) + * Generate entity types with relations (intersection types) */ -function addEntityWithRelations( - sourceFile: SourceFile, - tables: CleanTable[] -): void { - addSectionComment(sourceFile, 'Entity Types With Relations'); +function generateEntityWithRelations(tables: CleanTable[]): t.Statement[] { + const statements: t.Statement[] = []; for (const table of tables) { const { typeName } = getTableNames(table); - sourceFile.addTypeAlias( - createTypeAlias( + statements.push( + createExportedTypeAlias( `${typeName}WithRelations`, `${typeName} & ${typeName}Relations` ) ); } + + if (statements.length > 0) { + addSectionComment(statements, 'Entity Types With Relations'); + } + return statements; } // ============================================================================ @@ -573,18 +727,23 @@ function addEntityWithRelations( // ============================================================================ /** - * Build the type string for a Select type (as object type literal) + * Build the Select type as a TSTypeLiteral */ -function buildSelectTypeBody( +function buildSelectTypeLiteral( table: CleanTable, tableByName: Map -): string { - const lines: string[] = ['{']; +): t.TSTypeLiteral { + const members: t.TSTypeElement[] = []; // Add scalar fields for (const field of table.fields) { if (!isRelationField(field.name, table)) { - lines.push(`${field.name}?: boolean;`); + const prop = t.tsPropertySignature( + t.identifier(field.name), + t.tsTypeAnnotation(t.tsBooleanKeyword()) + ); + prop.optional = true; + members.push(prop); } } @@ -595,9 +754,28 @@ function buildSelectTypeBody( relation.referencesTable, tableByName ); - lines.push( - `${relation.fieldName}?: boolean | { select?: ${relatedTypeName}Select };` + const prop = t.tsPropertySignature( + t.identifier(relation.fieldName), + t.tsTypeAnnotation( + t.tsUnionType([ + t.tsBooleanKeyword(), + t.tsTypeLiteral([ + (() => { + const selectProp = t.tsPropertySignature( + t.identifier('select'), + t.tsTypeAnnotation( + t.tsTypeReference(t.identifier(`${relatedTypeName}Select`)) + ) + ); + selectProp.optional = true; + return selectProp; + })(), + ]), + ]) + ) ); + prop.optional = true; + members.push(prop); } } @@ -616,12 +794,54 @@ function buildSelectTypeBody( relation.referencedByTable, tableByName ); - lines.push(`${relation.fieldName}?: boolean | {`); - lines.push(` select?: ${relatedTypeName}Select;`); - lines.push(` first?: number;`); - lines.push(` filter?: ${filterName};`); - lines.push(` orderBy?: ${orderByName}[];`); - lines.push(`};`); + const prop = t.tsPropertySignature( + t.identifier(relation.fieldName), + t.tsTypeAnnotation( + t.tsUnionType([ + t.tsBooleanKeyword(), + t.tsTypeLiteral([ + (() => { + const p = t.tsPropertySignature( + t.identifier('select'), + t.tsTypeAnnotation( + t.tsTypeReference(t.identifier(`${relatedTypeName}Select`)) + ) + ); + p.optional = true; + return p; + })(), + (() => { + const p = t.tsPropertySignature( + t.identifier('first'), + t.tsTypeAnnotation(t.tsNumberKeyword()) + ); + p.optional = true; + return p; + })(), + (() => { + const p = t.tsPropertySignature( + t.identifier('filter'), + t.tsTypeAnnotation(t.tsTypeReference(t.identifier(filterName))) + ); + p.optional = true; + return p; + })(), + (() => { + const p = t.tsPropertySignature( + t.identifier('orderBy'), + t.tsTypeAnnotation( + t.tsArrayType(t.tsTypeReference(t.identifier(orderByName))) + ) + ); + p.optional = true; + return p; + })(), + ]), + ]) + ) + ); + prop.optional = true; + members.push(prop); } } @@ -637,12 +857,54 @@ function buildSelectTypeBody( relation.rightTable, tableByName ); - lines.push(`${relation.fieldName}?: boolean | {`); - lines.push(` select?: ${relatedTypeName}Select;`); - lines.push(` first?: number;`); - lines.push(` filter?: ${filterName};`); - lines.push(` orderBy?: ${orderByName}[];`); - lines.push(`};`); + const prop = t.tsPropertySignature( + t.identifier(relation.fieldName), + t.tsTypeAnnotation( + t.tsUnionType([ + t.tsBooleanKeyword(), + t.tsTypeLiteral([ + (() => { + const p = t.tsPropertySignature( + t.identifier('select'), + t.tsTypeAnnotation( + t.tsTypeReference(t.identifier(`${relatedTypeName}Select`)) + ) + ); + p.optional = true; + return p; + })(), + (() => { + const p = t.tsPropertySignature( + t.identifier('first'), + t.tsTypeAnnotation(t.tsNumberKeyword()) + ); + p.optional = true; + return p; + })(), + (() => { + const p = t.tsPropertySignature( + t.identifier('filter'), + t.tsTypeAnnotation(t.tsTypeReference(t.identifier(filterName))) + ); + p.optional = true; + return p; + })(), + (() => { + const p = t.tsPropertySignature( + t.identifier('orderBy'), + t.tsTypeAnnotation( + t.tsArrayType(t.tsTypeReference(t.identifier(orderByName))) + ) + ); + p.optional = true; + return p; + })(), + ]), + ]) + ) + ); + prop.optional = true; + members.push(prop); } } @@ -653,35 +915,57 @@ function buildSelectTypeBody( relation.referencedByTable, tableByName ); - lines.push( - `${relation.fieldName}?: boolean | { select?: ${relatedTypeName}Select };` + const prop = t.tsPropertySignature( + t.identifier(relation.fieldName), + t.tsTypeAnnotation( + t.tsUnionType([ + t.tsBooleanKeyword(), + t.tsTypeLiteral([ + (() => { + const selectProp = t.tsPropertySignature( + t.identifier('select'), + t.tsTypeAnnotation( + t.tsTypeReference(t.identifier(`${relatedTypeName}Select`)) + ) + ); + selectProp.optional = true; + return selectProp; + })(), + ]), + ]) + ) ); + prop.optional = true; + members.push(prop); } } - lines.push('}'); - return lines.join('\n'); + return t.tsTypeLiteral(members); } /** - * Add entity Select types + * Generate entity Select type statements */ -function addEntitySelectTypes( - sourceFile: SourceFile, +function generateEntitySelectTypes( tables: CleanTable[], tableByName: Map -): void { - addSectionComment(sourceFile, 'Entity Select Types'); +): t.Statement[] { + const statements: t.Statement[] = []; for (const table of tables) { const { typeName } = getTableNames(table); - sourceFile.addTypeAlias( - createTypeAlias( - `${typeName}Select`, - buildSelectTypeBody(table, tableByName) - ) + const typeAlias = t.tsTypeAliasDeclaration( + t.identifier(`${typeName}Select`), + null, + buildSelectTypeLiteral(table, tableByName) ); + statements.push(t.exportNamedDeclaration(typeAlias)); + } + + if (statements.length > 0) { + addSectionComment(statements, 'Entity Select Types'); } + return statements; } // ============================================================================ @@ -720,20 +1004,22 @@ function buildTableFilterProperties(table: CleanTable): InterfaceProperty[] { } /** - * Add table filter types + * Generate table filter type statements */ -function addTableFilterTypes( - sourceFile: SourceFile, - tables: CleanTable[] -): void { - addSectionComment(sourceFile, 'Table Filter Types'); +function generateTableFilterTypes(tables: CleanTable[]): t.Statement[] { + const statements: t.Statement[] = []; for (const table of tables) { const filterName = getFilterTypeName(table); - sourceFile.addInterface( - createInterface(filterName, buildTableFilterProperties(table)) + statements.push( + createExportedInterface(filterName, buildTableFilterProperties(table)) ); } + + if (statements.length > 0) { + addSectionComment(statements, 'Table Filter Types'); + } + return statements; } // ============================================================================ @@ -765,20 +1051,25 @@ function buildTableConditionProperties(table: CleanTable): InterfaceProperty[] { } /** - * Add table condition types + * Generate table condition type statements */ -function addTableConditionTypes( - sourceFile: SourceFile, - tables: CleanTable[] -): void { - addSectionComment(sourceFile, 'Table Condition Types'); +function generateTableConditionTypes(tables: CleanTable[]): t.Statement[] { + const statements: t.Statement[] = []; for (const table of tables) { const conditionName = getConditionTypeName(table); - sourceFile.addInterface( - createInterface(conditionName, buildTableConditionProperties(table)) + statements.push( + createExportedInterface( + conditionName, + buildTableConditionProperties(table) + ) ); } + + if (statements.length > 0) { + addSectionComment(statements, 'Table Condition Types'); + } + return statements; } // ============================================================================ @@ -786,9 +1077,9 @@ function addTableConditionTypes( // ============================================================================ /** - * Build OrderBy union type string + * Build OrderBy union type values */ -function buildOrderByUnion(table: CleanTable): string { +function buildOrderByValues(table: CleanTable): string[] { const values: string[] = ['PRIMARY_KEY_ASC', 'PRIMARY_KEY_DESC', 'NATURAL']; for (const field of table.fields) { @@ -798,23 +1089,31 @@ function buildOrderByUnion(table: CleanTable): string { values.push(`${upperSnake}_DESC`); } - return values.map((v) => `'${v}'`).join(' | '); + return values; } /** - * Add OrderBy types - * Uses inflection from table metadata for correct pluralization + * Generate OrderBy type statements */ -function addOrderByTypes(sourceFile: SourceFile, tables: CleanTable[]): void { - addSectionComment(sourceFile, 'OrderBy Types'); +function generateOrderByTypes(tables: CleanTable[]): t.Statement[] { + const statements: t.Statement[] = []; for (const table of tables) { - // Use getOrderByTypeName which respects table.inflection.orderByType const enumName = getOrderByTypeName(table); - sourceFile.addTypeAlias( - createTypeAlias(enumName, buildOrderByUnion(table)) + const values = buildOrderByValues(table); + const unionType = createStringLiteralUnion(values); + const typeAlias = t.tsTypeAliasDeclaration( + t.identifier(enumName), + null, + unionType ); + statements.push(t.exportNamedDeclaration(typeAlias)); } + + if (statements.length > 0) { + addSectionComment(statements, 'OrderBy Types'); + } + return statements; } // ============================================================================ @@ -850,31 +1149,48 @@ function buildCreateDataFields( } /** - * Generate Create input interface as formatted string. - * - * ts-morph doesn't handle nested object types in interface properties well, - * so we build this manually with pre-doubled indentation (4→2, 8→4) since - * getMinimalFormattedOutput halves all indentation. + * Build Create input interface as AST */ -function buildCreateInputInterface(table: CleanTable): string { +function buildCreateInputInterface(table: CleanTable): t.ExportNamedDeclaration { const { typeName, singularName } = getTableNames(table); const fields = buildCreateDataFields(table); - const lines = [ - `export interface Create${typeName}Input {`, - ` clientMutationId?: string;`, - ` ${singularName}: {`, - ]; + // Build the nested object type for the entity data + const nestedProps: t.TSPropertySignature[] = fields.map((field) => { + const prop = t.tsPropertySignature( + t.identifier(field.name), + t.tsTypeAnnotation(parseTypeString(field.type)) + ); + prop.optional = field.optional; + return prop; + }); - for (const field of fields) { - const opt = field.optional ? '?' : ''; - lines.push(` ${field.name}${opt}: ${field.type};`); - } + const nestedObjectType = t.tsTypeLiteral(nestedProps); - lines.push(' };'); - lines.push('}'); + // Build the main interface properties + const mainProps: t.TSPropertySignature[] = [ + (() => { + const prop = t.tsPropertySignature( + t.identifier('clientMutationId'), + t.tsTypeAnnotation(t.tsStringKeyword()) + ); + prop.optional = true; + return prop; + })(), + t.tsPropertySignature( + t.identifier(singularName), + t.tsTypeAnnotation(nestedObjectType) + ), + ]; - return lines.join('\n'); + const body = t.tsInterfaceBody(mainProps); + const interfaceDecl = t.tsInterfaceDeclaration( + t.identifier(`Create${typeName}Input`), + null, + null, + body + ); + return t.exportNamedDeclaration(interfaceDecl); } /** @@ -907,23 +1223,24 @@ function buildPatchProperties(table: CleanTable): InterfaceProperty[] { } /** - * Add CRUD input types for a table + * Generate CRUD input type statements for a table */ -function addCrudInputTypes(sourceFile: SourceFile, table: CleanTable): void { +function generateCrudInputTypes(table: CleanTable): t.Statement[] { + const statements: t.Statement[] = []; const { typeName } = getTableNames(table); const patchName = `${typeName}Patch`; - // Create input - build as raw statement due to nested object type formatting - sourceFile.addStatements(buildCreateInputInterface(table)); + // Create input + statements.push(buildCreateInputInterface(table)); // Patch interface - sourceFile.addInterface( - createInterface(patchName, buildPatchProperties(table)) + statements.push( + createExportedInterface(patchName, buildPatchProperties(table)) ); // Update input - sourceFile.addInterface( - createInterface(`Update${typeName}Input`, [ + statements.push( + createExportedInterface(`Update${typeName}Input`, [ { name: 'clientMutationId', type: 'string', optional: true }, { name: 'id', type: 'string', optional: false }, { name: 'patch', type: patchName, optional: false }, @@ -931,26 +1248,30 @@ function addCrudInputTypes(sourceFile: SourceFile, table: CleanTable): void { ); // Delete input - sourceFile.addInterface( - createInterface(`Delete${typeName}Input`, [ + statements.push( + createExportedInterface(`Delete${typeName}Input`, [ { name: 'clientMutationId', type: 'string', optional: true }, { name: 'id', type: 'string', optional: false }, ]) ); + + return statements; } /** - * Add all CRUD input types + * Generate all CRUD input type statements */ -function addAllCrudInputTypes( - sourceFile: SourceFile, - tables: CleanTable[] -): void { - addSectionComment(sourceFile, 'CRUD Input Types'); +function generateAllCrudInputTypes(tables: CleanTable[]): t.Statement[] { + const statements: t.Statement[] = []; for (const table of tables) { - addCrudInputTypes(sourceFile, table); + statements.push(...generateCrudInputTypes(table)); } + + if (statements.length > 0) { + addSectionComment(statements, 'CRUD Input Types'); + } + return statements; } // ============================================================================ @@ -986,7 +1307,7 @@ export function collectInputTypeNames( /** * Build a set of exact table CRUD input type names to skip - * These are generated by addAllCrudInputTypes, so we don't need to regenerate them + * These are generated by generateAllCrudInputTypes, so we don't need to regenerate them */ function buildTableCrudTypeNames(tables: CleanTable[]): Set { const crudTypes = new Set(); @@ -1002,16 +1323,14 @@ function buildTableCrudTypeNames(tables: CleanTable[]): Set { } /** - * Add custom input types from TypeRegistry + * Generate custom input type statements from TypeRegistry */ -function addCustomInputTypes( - sourceFile: SourceFile, +function generateCustomInputTypes( typeRegistry: TypeRegistry, usedInputTypes: Set, tableCrudTypes?: Set -): void { - addSectionComment(sourceFile, 'Custom Input Types (from schema)'); - +): t.Statement[] { + const statements: t.Statement[] = []; const generatedTypes = new Set(); const typesToGenerate = new Set(Array.from(usedInputTypes)); @@ -1036,9 +1355,12 @@ function addCustomInputTypes( const typeInfo = typeRegistry.get(typeName); if (!typeInfo) { - sourceFile.addStatements(`// Type '${typeName}' not found in schema`); - sourceFile.addTypeAlias( - createTypeAlias(typeName, 'Record') + // Add comment for missing type + const commentStmt = t.emptyStatement(); + addLineComment(commentStmt, ` Type '${typeName}' not found in schema`); + statements.push(commentStmt); + statements.push( + createExportedTypeAlias(typeName, 'Record') ); continue; } @@ -1062,15 +1384,28 @@ function addCustomInputTypes( } } - sourceFile.addInterface(createInterface(typeName, properties)); + statements.push(createExportedInterface(typeName, properties)); } else if (typeInfo.kind === 'ENUM' && typeInfo.enumValues) { - const values = typeInfo.enumValues.map((v) => `'${v}'`).join(' | '); - sourceFile.addTypeAlias(createTypeAlias(typeName, values)); + const unionType = createStringLiteralUnion(typeInfo.enumValues); + const typeAlias = t.tsTypeAliasDeclaration( + t.identifier(typeName), + null, + unionType + ); + statements.push(t.exportNamedDeclaration(typeAlias)); } else { - sourceFile.addStatements(`// Type '${typeName}' is ${typeInfo.kind}`); - sourceFile.addTypeAlias(createTypeAlias(typeName, 'unknown')); + // Add comment for unsupported type kind + const commentStmt = t.emptyStatement(); + addLineComment(commentStmt, ` Type '${typeName}' is ${typeInfo.kind}`); + statements.push(commentStmt); + statements.push(createExportedTypeAlias(typeName, 'unknown')); } } + + if (statements.length > 0) { + addSectionComment(statements, 'Custom Input Types (from schema)'); + } + return statements; } // ============================================================================ @@ -1099,16 +1434,14 @@ export function collectPayloadTypeNames( } /** - * Add payload/return types + * Generate payload/return type statements */ -function addPayloadTypes( - sourceFile: SourceFile, +function generatePayloadTypes( typeRegistry: TypeRegistry, usedPayloadTypes: Set, alreadyGeneratedTypes: Set -): void { - addSectionComment(sourceFile, 'Payload/Return Types (for custom operations)'); - +): t.Statement[] { + const statements: t.Statement[] = []; const generatedTypes = new Set(alreadyGeneratedTypes); const typesToGenerate = new Set(Array.from(usedPayloadTypes)); @@ -1173,29 +1506,56 @@ function addPayloadTypes( } } - sourceFile.addInterface(createInterface(typeName, interfaceProps)); + statements.push(createExportedInterface(typeName, interfaceProps)); - // Build Select type (no indentation - ts-morph adds it) - const selectLines: string[] = ['{']; + // Build Select type + const selectMembers: t.TSTypeElement[] = []; for (const field of typeInfo.fields) { const baseType = getTypeBaseName(field.type); if (baseType === 'Query' || baseType === 'Mutation') continue; const nestedType = baseType ? typeRegistry.get(baseType) : null; + let propType: t.TSType; if (nestedType?.kind === 'OBJECT') { - selectLines.push( - `${field.name}?: boolean | { select?: ${baseType}Select };` - ); + propType = t.tsUnionType([ + t.tsBooleanKeyword(), + t.tsTypeLiteral([ + (() => { + const p = t.tsPropertySignature( + t.identifier('select'), + t.tsTypeAnnotation( + t.tsTypeReference(t.identifier(`${baseType}Select`)) + ) + ); + p.optional = true; + return p; + })(), + ]), + ]); } else { - selectLines.push(`${field.name}?: boolean;`); + propType = t.tsBooleanKeyword(); } + + const prop = t.tsPropertySignature( + t.identifier(field.name), + t.tsTypeAnnotation(propType) + ); + prop.optional = true; + selectMembers.push(prop); } - selectLines.push('}'); - sourceFile.addTypeAlias( - createTypeAlias(`${typeName}Select`, selectLines.join('\n')) + const selectTypeAlias = t.tsTypeAliasDeclaration( + t.identifier(`${typeName}Select`), + null, + t.tsTypeLiteral(selectMembers) ); + statements.push(t.exportNamedDeclaration(selectTypeAlias)); } + + if (statements.length > 0) { + addSectionComment(statements, 'Payload/Return Types (for custom operations)'); + } + return statements; } // ============================================================================ @@ -1203,7 +1563,7 @@ function addPayloadTypes( // ============================================================================ /** - * Generate comprehensive input-types.ts file using ts-morph AST + * Generate comprehensive input-types.ts file using Babel AST */ export function generateInputTypesFile( typeRegistry: TypeRegistry, @@ -1211,50 +1571,45 @@ export function generateInputTypesFile( tables?: CleanTable[], usedPayloadTypes?: Set ): GeneratedInputTypesFile { - const project = createProject(); - const sourceFile = createSourceFile(project, 'input-types.ts'); - - // Add file header - sourceFile.insertText( - 0, - createFileHeader('GraphQL types for ORM client') + '\n' - ); + const statements: t.Statement[] = []; // 1. Scalar filter types - addScalarFilterTypes(sourceFile); + statements.push(...generateScalarFilterTypes()); // 2. Enum types used by table fields if (tables && tables.length > 0) { const enumTypes = collectEnumTypesFromTables(tables, typeRegistry); - addEnumTypes(sourceFile, typeRegistry, enumTypes); + statements.push(...generateEnumTypes(typeRegistry, enumTypes)); } // 3. Entity and relation types (if tables provided) if (tables && tables.length > 0) { const tableByName = new Map(tables.map((table) => [table.name, table])); - addEntityTypes(sourceFile, tables); - addRelationHelperTypes(sourceFile); - addEntityRelationTypes(sourceFile, tables, tableByName); - addEntityWithRelations(sourceFile, tables); - addEntitySelectTypes(sourceFile, tables, tableByName); + statements.push(...generateEntityTypes(tables)); + statements.push(...generateRelationHelperTypes()); + statements.push(...generateEntityRelationTypes(tables, tableByName)); + statements.push(...generateEntityWithRelations(tables)); + statements.push(...generateEntitySelectTypes(tables, tableByName)); // 4. Table filter types - addTableFilterTypes(sourceFile, tables); + statements.push(...generateTableFilterTypes(tables)); // 4b. Table condition types (simple equality filter) - addTableConditionTypes(sourceFile, tables); + statements.push(...generateTableConditionTypes(tables)); // 5. OrderBy types - addOrderByTypes(sourceFile, tables); + statements.push(...generateOrderByTypes(tables)); // 6. CRUD input types - addAllCrudInputTypes(sourceFile, tables); + statements.push(...generateAllCrudInputTypes(tables)); } // 7. Custom input types from TypeRegistry const tableCrudTypes = tables ? buildTableCrudTypeNames(tables) : undefined; - addCustomInputTypes(sourceFile, typeRegistry, usedInputTypes, tableCrudTypes); + statements.push( + ...generateCustomInputTypes(typeRegistry, usedInputTypes, tableCrudTypes) + ); // 8. Payload/return types for custom operations if (usedPayloadTypes && usedPayloadTypes.size > 0) { @@ -1265,16 +1620,21 @@ export function generateInputTypesFile( alreadyGeneratedTypes.add(typeName); } } - addPayloadTypes( - sourceFile, - typeRegistry, - usedPayloadTypes, - alreadyGeneratedTypes + statements.push( + ...generatePayloadTypes( + typeRegistry, + usedPayloadTypes, + alreadyGeneratedTypes + ) ); } + // Generate code with file header + const header = getGeneratedFileHeader('GraphQL types for ORM client'); + const code = generateCode(statements); + return { fileName: 'input-types.ts', - content: getMinimalFormattedOutput(sourceFile), + content: header + '\n' + code, }; } diff --git a/graphql/codegen/src/cli/codegen/orm/model-generator.ts b/graphql/codegen/src/cli/codegen/orm/model-generator.ts index b61f37d1e..f5661f6f4 100644 --- a/graphql/codegen/src/cli/codegen/orm/model-generator.ts +++ b/graphql/codegen/src/cli/codegen/orm/model-generator.ts @@ -1,33 +1,17 @@ /** - * Model class generator for ORM client + * Model class generator for ORM client (Babel AST-based) * * Generates per-table model classes with findMany, findFirst, create, update, delete methods. - * - * Example output: - * ```typescript - * export class UserModel { - * constructor(private client: OrmClient) {} - * - * findMany(args?: FindManyArgs) { - * return new QueryBuilder<...>({ ... }); - * } - * // ... - * } - * ``` */ import type { CleanTable } from '../../../types/schema'; -import { - createProject, - createSourceFile, - getFormattedOutput, - createFileHeader, - createImport, -} from '../ts-ast'; +import * as t from '@babel/types'; +import { generateCode } from '../babel-ast'; import { getTableNames, getOrderByTypeName, getFilterTypeName, lcFirst, + getGeneratedFileHeader, } from '../utils'; export interface GeneratedModelFile { @@ -37,23 +21,85 @@ export interface GeneratedModelFile { tableName: string; } -/** - * Generate a model class file for a table - */ +function createImportDeclaration( + moduleSpecifier: string, + namedImports: string[], + typeOnly: boolean = false +): t.ImportDeclaration { + const specifiers = namedImports.map((name) => + t.importSpecifier(t.identifier(name), t.identifier(name)) + ); + const decl = t.importDeclaration(specifiers, t.stringLiteral(moduleSpecifier)); + decl.importKind = typeOnly ? 'type' : 'value'; + return decl; +} + +function buildMethodBody( + builderFn: string, + args: t.Expression[], + operation: string, + typeName: string, + fieldName: string +): t.Statement[] { + const destructureDecl = t.variableDeclaration('const', [ + t.variableDeclarator( + t.objectPattern([ + t.objectProperty(t.identifier('document'), t.identifier('document'), false, true), + t.objectProperty(t.identifier('variables'), t.identifier('variables'), false, true), + ]), + t.callExpression(t.identifier(builderFn), args) + ), + ]); + + const returnStmt = t.returnStatement( + t.newExpression(t.identifier('QueryBuilder'), [ + t.objectExpression([ + t.objectProperty(t.identifier('client'), t.memberExpression(t.thisExpression(), t.identifier('client'))), + t.objectProperty(t.identifier('operation'), t.stringLiteral(operation)), + t.objectProperty(t.identifier('operationName'), t.stringLiteral(typeName)), + t.objectProperty(t.identifier('fieldName'), t.stringLiteral(fieldName)), + t.objectProperty(t.identifier('document'), t.identifier('document'), false, true), + t.objectProperty(t.identifier('variables'), t.identifier('variables'), false, true), + ]), + ]) + ); + + return [destructureDecl, returnStmt]; +} + +function createClassMethod( + name: string, + typeParameters: t.TSTypeParameterDeclaration | null, + params: (t.Identifier | t.TSParameterProperty)[], + returnType: t.TSTypeAnnotation | null, + body: t.Statement[] +): t.ClassMethod { + const method = t.classMethod('method', t.identifier(name), params, t.blockStatement(body)); + method.typeParameters = typeParameters; + method.returnType = returnType; + return method; +} + +function createConstTypeParam(constraintTypeName: string): t.TSTypeParameterDeclaration { + const param = t.tsTypeParameter( + t.tsTypeReference(t.identifier(constraintTypeName)), + null, + 'S' + ); + (param as any).const = true; + return t.tsTypeParameterDeclaration([param]); +} + export function generateModelFile( table: CleanTable, _useSharedTypes: boolean ): GeneratedModelFile { - const project = createProject(); const { typeName, singularName, pluralName } = getTableNames(table); const modelName = `${typeName}Model`; - // Avoid "index.ts" which clashes with barrel file const baseFileName = lcFirst(typeName); - const fileName = - baseFileName === 'index' ? `${baseFileName}Model.ts` : `${baseFileName}.ts`; + const fileName = baseFileName === 'index' ? `${baseFileName}Model.ts` : `${baseFileName}.ts`; const entityLower = singularName; - // Type names for this entity - use inflection from table metadata const selectTypeName = `${typeName}Select`; const relationTypeName = `${typeName}WithRelations`; const whereTypeName = getFilterTypeName(table); @@ -62,270 +108,235 @@ export function generateModelFile( const updateInputTypeName = `Update${typeName}Input`; const deleteInputTypeName = `Delete${typeName}Input`; const patchTypeName = `${typeName}Patch`; - const createDataType = `${createInputTypeName}['${singularName}']`; - // Query names from PostGraphile const pluralQueryName = table.query?.all ?? pluralName; const createMutationName = table.query?.create ?? `create${typeName}`; const updateMutationName = table.query?.update; const deleteMutationName = table.query?.delete; - const sourceFile = createSourceFile(project, fileName); + const statements: t.Statement[] = []; - // Add file header - sourceFile.insertText( - 0, - createFileHeader(`${typeName} model for ORM client`) + '\n\n' - ); + statements.push(createImportDeclaration('../client', ['OrmClient'])); + statements.push(createImportDeclaration('../query-builder', [ + 'QueryBuilder', 'buildFindManyDocument', 'buildFindFirstDocument', + 'buildCreateDocument', 'buildUpdateDocument', 'buildDeleteDocument', + ])); + statements.push(createImportDeclaration('../select-types', [ + 'ConnectionResult', 'FindManyArgs', 'FindFirstArgs', 'CreateArgs', + 'UpdateArgs', 'DeleteArgs', 'InferSelectResult', + ], true)); + statements.push(createImportDeclaration('../input-types', [ + typeName, relationTypeName, selectTypeName, whereTypeName, orderByTypeName, + createInputTypeName, updateInputTypeName, patchTypeName, + ], true)); - // Add imports - import types from respective modules - sourceFile.addImportDeclarations([ - createImport({ - moduleSpecifier: '../client', - namedImports: ['OrmClient'], - }), - createImport({ - moduleSpecifier: '../query-builder', - namedImports: [ - 'QueryBuilder', - 'buildFindManyDocument', - 'buildFindFirstDocument', - 'buildCreateDocument', - 'buildUpdateDocument', - 'buildDeleteDocument', - ], - }), - createImport({ - moduleSpecifier: '../select-types', - typeOnlyNamedImports: [ - 'ConnectionResult', - 'FindManyArgs', - 'FindFirstArgs', - 'CreateArgs', - 'UpdateArgs', - 'DeleteArgs', - 'InferSelectResult', - ], - }), - ]); + const classBody: t.ClassBody['body'] = []; - // Build complete set of input-types imports - // Select types are now centralized in input-types.ts with relations included - const inputTypeImports = new Set([ - typeName, - relationTypeName, - selectTypeName, - whereTypeName, - orderByTypeName, - createInputTypeName, - updateInputTypeName, - patchTypeName, - ]); + // Constructor + const constructorParam = t.identifier('client'); + constructorParam.typeAnnotation = t.tsTypeAnnotation(t.tsTypeReference(t.identifier('OrmClient'))); + const paramProp = t.tsParameterProperty(constructorParam); + paramProp.accessibility = 'private'; + classBody.push(t.classMethod('constructor', t.identifier('constructor'), [paramProp], t.blockStatement([]))); - // Add single combined import from input-types - sourceFile.addImportDeclaration( - createImport({ - moduleSpecifier: '../input-types', - typeOnlyNamedImports: Array.from(inputTypeImports), - }) + // findMany method + const findManyParam = t.identifier('args'); + findManyParam.optional = true; + findManyParam.typeAnnotation = t.tsTypeAnnotation( + t.tsTypeReference(t.identifier('FindManyArgs'), t.tsTypeParameterInstantiation([ + t.tsTypeReference(t.identifier('S')), + t.tsTypeReference(t.identifier(whereTypeName)), + t.tsTypeReference(t.identifier(orderByTypeName)), + ])) + ); + const findManyReturnType = t.tsTypeAnnotation( + t.tsTypeReference(t.identifier('QueryBuilder'), t.tsTypeParameterInstantiation([ + t.tsTypeLiteral([ + t.tsPropertySignature(t.identifier(pluralQueryName), t.tsTypeAnnotation( + t.tsTypeReference(t.identifier('ConnectionResult'), t.tsTypeParameterInstantiation([ + t.tsTypeReference(t.identifier('InferSelectResult'), t.tsTypeParameterInstantiation([ + t.tsTypeReference(t.identifier(relationTypeName)), + t.tsTypeReference(t.identifier('S')), + ])), + ])) + )), + ]), + ])) ); + const findManyArgs = [ + t.stringLiteral(typeName), + t.stringLiteral(pluralQueryName), + t.optionalMemberExpression(t.identifier('args'), t.identifier('select'), false, true), + t.objectExpression([ + t.objectProperty(t.identifier('where'), t.optionalMemberExpression(t.identifier('args'), t.identifier('where'), false, true)), + t.objectProperty(t.identifier('orderBy'), t.tsAsExpression( + t.optionalMemberExpression(t.identifier('args'), t.identifier('orderBy'), false, true), + t.tsUnionType([t.tsArrayType(t.tsStringKeyword()), t.tsUndefinedKeyword()]) + )), + t.objectProperty(t.identifier('first'), t.optionalMemberExpression(t.identifier('args'), t.identifier('first'), false, true)), + t.objectProperty(t.identifier('last'), t.optionalMemberExpression(t.identifier('args'), t.identifier('last'), false, true)), + t.objectProperty(t.identifier('after'), t.optionalMemberExpression(t.identifier('args'), t.identifier('after'), false, true)), + t.objectProperty(t.identifier('before'), t.optionalMemberExpression(t.identifier('args'), t.identifier('before'), false, true)), + t.objectProperty(t.identifier('offset'), t.optionalMemberExpression(t.identifier('args'), t.identifier('offset'), false, true)), + ]), + t.stringLiteral(whereTypeName), + t.stringLiteral(orderByTypeName), + ]; + classBody.push(createClassMethod('findMany', createConstTypeParam(selectTypeName), [findManyParam], findManyReturnType, + buildMethodBody('buildFindManyDocument', findManyArgs, 'query', typeName, pluralQueryName))); - // Add Model class - sourceFile.addStatements( - '\n// ============================================================================' + // findFirst method + const findFirstParam = t.identifier('args'); + findFirstParam.optional = true; + findFirstParam.typeAnnotation = t.tsTypeAnnotation( + t.tsTypeReference(t.identifier('FindFirstArgs'), t.tsTypeParameterInstantiation([ + t.tsTypeReference(t.identifier('S')), + t.tsTypeReference(t.identifier(whereTypeName)), + ])) ); - sourceFile.addStatements('// Model Class'); - sourceFile.addStatements( - '// ============================================================================\n' + const findFirstReturnType = t.tsTypeAnnotation( + t.tsTypeReference(t.identifier('QueryBuilder'), t.tsTypeParameterInstantiation([ + t.tsTypeLiteral([ + t.tsPropertySignature(t.identifier(pluralQueryName), t.tsTypeAnnotation( + t.tsTypeLiteral([ + t.tsPropertySignature(t.identifier('nodes'), t.tsTypeAnnotation( + t.tsArrayType(t.tsTypeReference(t.identifier('InferSelectResult'), t.tsTypeParameterInstantiation([ + t.tsTypeReference(t.identifier(relationTypeName)), + t.tsTypeReference(t.identifier('S')), + ]))) + )), + ]) + )), + ]), + ])) ); + const findFirstArgs = [ + t.stringLiteral(typeName), + t.stringLiteral(pluralQueryName), + t.optionalMemberExpression(t.identifier('args'), t.identifier('select'), false, true), + t.objectExpression([ + t.objectProperty(t.identifier('where'), t.optionalMemberExpression(t.identifier('args'), t.identifier('where'), false, true)), + ]), + t.stringLiteral(whereTypeName), + ]; + classBody.push(createClassMethod('findFirst', createConstTypeParam(selectTypeName), [findFirstParam], findFirstReturnType, + buildMethodBody('buildFindFirstDocument', findFirstArgs, 'query', typeName, pluralQueryName))); - // Generate the model class - const classDeclaration = sourceFile.addClass({ - name: modelName, - isExported: true, - }); - - // Constructor - classDeclaration.addConstructor({ - parameters: [ - { - name: 'client', - type: 'OrmClient', - scope: 'private' as any, - }, - ], - }); - - // findMany method - uses const generic for proper literal type inference - classDeclaration.addMethod({ - name: 'findMany', - typeParameters: [`const S extends ${selectTypeName}`], - parameters: [ - { - name: 'args', - type: `FindManyArgs`, - hasQuestionToken: true, - }, - ], - returnType: `QueryBuilder<{ ${pluralQueryName}: ConnectionResult> }>`, - statements: `const { document, variables } = buildFindManyDocument( - '${typeName}', - '${pluralQueryName}', - args?.select, - { - where: args?.where, - orderBy: args?.orderBy as string[] | undefined, - first: args?.first, - last: args?.last, - after: args?.after, - before: args?.before, - offset: args?.offset, - }, - '${whereTypeName}', - '${orderByTypeName}' - ); - return new QueryBuilder({ - client: this.client, - operation: 'query', - operationName: '${typeName}', - fieldName: '${pluralQueryName}', - document, - variables, - });`, - }); - - // findFirst method - uses const generic for proper literal type inference - classDeclaration.addMethod({ - name: 'findFirst', - typeParameters: [`const S extends ${selectTypeName}`], - parameters: [ - { - name: 'args', - type: `FindFirstArgs`, - hasQuestionToken: true, - }, - ], - returnType: `QueryBuilder<{ ${pluralQueryName}: { nodes: InferSelectResult<${relationTypeName}, S>[] } }>`, - statements: `const { document, variables } = buildFindFirstDocument( - '${typeName}', - '${pluralQueryName}', - args?.select, - { where: args?.where }, - '${whereTypeName}' - ); - return new QueryBuilder({ - client: this.client, - operation: 'query', - operationName: '${typeName}', - fieldName: '${pluralQueryName}', - document, - variables, - });`, - }); - - // create method - uses const generic for proper literal type inference - classDeclaration.addMethod({ - name: 'create', - typeParameters: [`const S extends ${selectTypeName}`], - parameters: [ - { - name: 'args', - type: `CreateArgs`, - }, - ], - returnType: `QueryBuilder<{ ${createMutationName}: { ${entityLower}: InferSelectResult<${relationTypeName}, S> } }>`, - statements: `const { document, variables } = buildCreateDocument( - '${typeName}', - '${createMutationName}', - '${entityLower}', - args.select, - args.data, - '${createInputTypeName}' - ); - return new QueryBuilder({ - client: this.client, - operation: 'mutation', - operationName: '${typeName}', - fieldName: '${createMutationName}', - document, - variables, - });`, - }); + // create method + const createParam = t.identifier('args'); + createParam.typeAnnotation = t.tsTypeAnnotation( + t.tsTypeReference(t.identifier('CreateArgs'), t.tsTypeParameterInstantiation([ + t.tsTypeReference(t.identifier('S')), + t.tsIndexedAccessType(t.tsTypeReference(t.identifier(createInputTypeName)), t.tsLiteralType(t.stringLiteral(singularName))), + ])) + ); + const createReturnType = t.tsTypeAnnotation( + t.tsTypeReference(t.identifier('QueryBuilder'), t.tsTypeParameterInstantiation([ + t.tsTypeLiteral([ + t.tsPropertySignature(t.identifier(createMutationName), t.tsTypeAnnotation( + t.tsTypeLiteral([ + t.tsPropertySignature(t.identifier(entityLower), t.tsTypeAnnotation( + t.tsTypeReference(t.identifier('InferSelectResult'), t.tsTypeParameterInstantiation([ + t.tsTypeReference(t.identifier(relationTypeName)), + t.tsTypeReference(t.identifier('S')), + ])) + )), + ]) + )), + ]), + ])) + ); + const createArgs = [ + t.stringLiteral(typeName), + t.stringLiteral(createMutationName), + t.stringLiteral(entityLower), + t.memberExpression(t.identifier('args'), t.identifier('select')), + t.memberExpression(t.identifier('args'), t.identifier('data')), + t.stringLiteral(createInputTypeName), + ]; + classBody.push(createClassMethod('create', createConstTypeParam(selectTypeName), [createParam], createReturnType, + buildMethodBody('buildCreateDocument', createArgs, 'mutation', typeName, createMutationName))); - // update method (if available) - uses const generic for proper literal type inference + // update method (if available) if (updateMutationName) { - classDeclaration.addMethod({ - name: 'update', - typeParameters: [`const S extends ${selectTypeName}`], - parameters: [ - { - name: 'args', - type: `UpdateArgs`, - }, - ], - returnType: `QueryBuilder<{ ${updateMutationName}: { ${entityLower}: InferSelectResult<${relationTypeName}, S> } }>`, - statements: `const { document, variables } = buildUpdateDocument( - '${typeName}', - '${updateMutationName}', - '${entityLower}', - args.select, - args.where, - args.data, - '${updateInputTypeName}' + const updateParam = t.identifier('args'); + updateParam.typeAnnotation = t.tsTypeAnnotation( + t.tsTypeReference(t.identifier('UpdateArgs'), t.tsTypeParameterInstantiation([ + t.tsTypeReference(t.identifier('S')), + t.tsTypeLiteral([t.tsPropertySignature(t.identifier('id'), t.tsTypeAnnotation(t.tsStringKeyword()))]), + t.tsTypeReference(t.identifier(patchTypeName)), + ])) ); - return new QueryBuilder({ - client: this.client, - operation: 'mutation', - operationName: '${typeName}', - fieldName: '${updateMutationName}', - document, - variables, - });`, - }); + const updateReturnType = t.tsTypeAnnotation( + t.tsTypeReference(t.identifier('QueryBuilder'), t.tsTypeParameterInstantiation([ + t.tsTypeLiteral([ + t.tsPropertySignature(t.identifier(updateMutationName), t.tsTypeAnnotation( + t.tsTypeLiteral([ + t.tsPropertySignature(t.identifier(entityLower), t.tsTypeAnnotation( + t.tsTypeReference(t.identifier('InferSelectResult'), t.tsTypeParameterInstantiation([ + t.tsTypeReference(t.identifier(relationTypeName)), + t.tsTypeReference(t.identifier('S')), + ])) + )), + ]) + )), + ]), + ])) + ); + const updateArgs = [ + t.stringLiteral(typeName), + t.stringLiteral(updateMutationName), + t.stringLiteral(entityLower), + t.memberExpression(t.identifier('args'), t.identifier('select')), + t.memberExpression(t.identifier('args'), t.identifier('where')), + t.memberExpression(t.identifier('args'), t.identifier('data')), + t.stringLiteral(updateInputTypeName), + ]; + classBody.push(createClassMethod('update', createConstTypeParam(selectTypeName), [updateParam], updateReturnType, + buildMethodBody('buildUpdateDocument', updateArgs, 'mutation', typeName, updateMutationName))); } // delete method (if available) if (deleteMutationName) { - classDeclaration.addMethod({ - name: 'delete', - parameters: [ - { - name: 'args', - type: `DeleteArgs<{ id: string }>`, - }, - ], - returnType: `QueryBuilder<{ ${deleteMutationName}: { ${entityLower}: { id: string } } }>`, - statements: `const { document, variables } = buildDeleteDocument( - '${typeName}', - '${deleteMutationName}', - '${entityLower}', - args.where, - '${deleteInputTypeName}' + const deleteParam = t.identifier('args'); + deleteParam.typeAnnotation = t.tsTypeAnnotation( + t.tsTypeReference(t.identifier('DeleteArgs'), t.tsTypeParameterInstantiation([ + t.tsTypeLiteral([t.tsPropertySignature(t.identifier('id'), t.tsTypeAnnotation(t.tsStringKeyword()))]), + ])) + ); + const deleteReturnType = t.tsTypeAnnotation( + t.tsTypeReference(t.identifier('QueryBuilder'), t.tsTypeParameterInstantiation([ + t.tsTypeLiteral([ + t.tsPropertySignature(t.identifier(deleteMutationName), t.tsTypeAnnotation( + t.tsTypeLiteral([ + t.tsPropertySignature(t.identifier(entityLower), t.tsTypeAnnotation( + t.tsTypeLiteral([t.tsPropertySignature(t.identifier('id'), t.tsTypeAnnotation(t.tsStringKeyword()))]) + )), + ]) + )), + ]), + ])) ); - return new QueryBuilder({ - client: this.client, - operation: 'mutation', - operationName: '${typeName}', - fieldName: '${deleteMutationName}', - document, - variables, - });`, - }); + const deleteArgs = [ + t.stringLiteral(typeName), + t.stringLiteral(deleteMutationName), + t.stringLiteral(entityLower), + t.memberExpression(t.identifier('args'), t.identifier('where')), + t.stringLiteral(deleteInputTypeName), + ]; + classBody.push(createClassMethod('delete', null, [deleteParam], deleteReturnType, + buildMethodBody('buildDeleteDocument', deleteArgs, 'mutation', typeName, deleteMutationName))); } - return { - fileName, - content: getFormattedOutput(sourceFile), - modelName, - tableName: table.name, - }; -} + const classDecl = t.classDeclaration(t.identifier(modelName), null, t.classBody(classBody)); + statements.push(t.exportNamedDeclaration(classDecl)); -// Select types with relations are now generated in input-types.ts + const header = getGeneratedFileHeader(`${typeName} model for ORM client`); + const code = generateCode(statements); + + return { fileName, content: header + '\n' + code, modelName, tableName: table.name }; +} -/** - * Generate all model files for a list of tables - */ export function generateAllModelFiles( tables: CleanTable[], useSharedTypes: boolean diff --git a/graphql/codegen/src/cli/codegen/queries.ts b/graphql/codegen/src/cli/codegen/queries.ts index bc83baffc..3e4ae2775 100644 --- a/graphql/codegen/src/cli/codegen/queries.ts +++ b/graphql/codegen/src/cli/codegen/queries.ts @@ -1,5 +1,5 @@ /** - * Query hook generators using AST-based code generation + * Query hook generators using Babel AST-based code generation * * Output structure: * queries/ @@ -7,19 +7,8 @@ * useCarQuery.ts - Single item query hook */ import type { CleanTable } from '../../types/schema'; -import { - createProject, - createSourceFile, - getFormattedOutput, - createFileHeader, - createImport, - createInterface, - createConst, - createTypeAlias, - createUnionType, - createFilterInterface, - type InterfaceProperty, -} from './ts-ast'; +import * as t from '@babel/types'; +import { generateCode, addJSDocComment, typedParam } from './babel-ast'; import { buildListQueryAST, buildSingleQueryAST, @@ -40,6 +29,8 @@ import { getPrimaryKeyInfo, toScreamingSnake, ucFirst, + lcFirst, + getGeneratedFileHeader, } from './utils'; export interface GeneratedQueryFile { @@ -48,43 +39,83 @@ export interface GeneratedQueryFile { } export interface QueryGeneratorOptions { - /** Whether to generate React Query hooks (default: true for backwards compatibility) */ reactQueryEnabled?: boolean; + useCentralizedKeys?: boolean; + hasRelationships?: boolean; } -// ============================================================================ -// List query hook generator -// ============================================================================ +function createUnionType(values: string[]): t.TSUnionType { + return t.tsUnionType(values.map((v) => t.tsLiteralType(t.stringLiteral(v)))); +} + +function createFilterInterfaceDeclaration( + name: string, + fieldFilters: Array<{ fieldName: string; filterType: string }>, + isExported: boolean = true +): t.Statement { + const properties: t.TSPropertySignature[] = []; + for (const filter of fieldFilters) { + const prop = t.tsPropertySignature( + t.identifier(filter.fieldName), + t.tsTypeAnnotation(t.tsTypeReference(t.identifier(filter.filterType))) + ); + prop.optional = true; + properties.push(prop); + } + const andProp = t.tsPropertySignature( + t.identifier('and'), + t.tsTypeAnnotation(t.tsArrayType(t.tsTypeReference(t.identifier(name)))) + ); + andProp.optional = true; + properties.push(andProp); + const orProp = t.tsPropertySignature( + t.identifier('or'), + t.tsTypeAnnotation(t.tsArrayType(t.tsTypeReference(t.identifier(name)))) + ); + orProp.optional = true; + properties.push(orProp); + const notProp = t.tsPropertySignature( + t.identifier('not'), + t.tsTypeAnnotation(t.tsTypeReference(t.identifier(name))) + ); + notProp.optional = true; + properties.push(notProp); + const body = t.tsInterfaceBody(properties); + const interfaceDecl = t.tsInterfaceDeclaration( + t.identifier(name), + null, + null, + body + ); + if (isExported) { + return t.exportNamedDeclaration(interfaceDecl); + } + return interfaceDecl; +} -/** - * Generate list query hook file content using AST - */ export function generateListQueryHook( table: CleanTable, options: QueryGeneratorOptions = {} ): GeneratedQueryFile { - const { reactQueryEnabled = true } = options; - const project = createProject(); + const { + reactQueryEnabled = true, + useCentralizedKeys = true, + hasRelationships = false, + } = options; const { typeName, pluralName } = getTableNames(table); const hookName = getListQueryHookName(table); const queryName = getAllRowsQueryName(table); const filterTypeName = getFilterTypeName(table); const orderByTypeName = getOrderByTypeName(table); const scalarFields = getScalarFields(table); + const keysName = `${lcFirst(typeName)}Keys`; + const scopeTypeName = `${typeName}Scope`; - // Generate GraphQL document via AST const queryAST = buildListQueryAST({ table }); const queryDocument = printGraphQL(queryAST); - const sourceFile = createSourceFile(project, getListQueryFileName(table)); - - // Add file header as leading comment - const headerText = reactQueryEnabled - ? `List query hook for ${typeName}` - : `List query functions for ${typeName}`; - sourceFile.insertText(0, createFileHeader(headerText) + '\n\n'); + const statements: t.Statement[] = []; - // Collect all filter types used by this table's fields const filterTypesUsed = new Set(); for (const field of scalarFields) { const filterType = getScalarFilterType(field.type.gqlType, field.type.isArray); @@ -93,49 +124,103 @@ export function generateListQueryHook( } } - // Add imports - conditionally include React Query imports - const imports = []; if (reactQueryEnabled) { - imports.push( - createImport({ - moduleSpecifier: '@tanstack/react-query', - namedImports: ['useQuery'], - typeOnlyNamedImports: ['UseQueryOptions', 'QueryClient'], - }) + const reactQueryImport = t.importDeclaration( + [t.importSpecifier(t.identifier('useQuery'), t.identifier('useQuery'))], + t.stringLiteral('@tanstack/react-query') ); + statements.push(reactQueryImport); + const reactQueryTypeImport = t.importDeclaration( + [ + t.importSpecifier( + t.identifier('UseQueryOptions'), + t.identifier('UseQueryOptions') + ), + t.importSpecifier( + t.identifier('QueryClient'), + t.identifier('QueryClient') + ), + ], + t.stringLiteral('@tanstack/react-query') + ); + reactQueryTypeImport.importKind = 'type'; + statements.push(reactQueryTypeImport); } - imports.push( - createImport({ - moduleSpecifier: '../client', - namedImports: ['execute'], - typeOnlyNamedImports: ['ExecuteOptions'], - }), - createImport({ - moduleSpecifier: '../types', - typeOnlyNamedImports: [typeName, ...Array.from(filterTypesUsed)], - }) + + const clientImport = t.importDeclaration( + [t.importSpecifier(t.identifier('execute'), t.identifier('execute'))], + t.stringLiteral('../client') ); - sourceFile.addImportDeclarations(imports); + statements.push(clientImport); + const clientTypeImport = t.importDeclaration( + [ + t.importSpecifier( + t.identifier('ExecuteOptions'), + t.identifier('ExecuteOptions') + ), + ], + t.stringLiteral('../client') + ); + clientTypeImport.importKind = 'type'; + statements.push(clientTypeImport); - // Re-export entity type - sourceFile.addStatements(`\n// Re-export entity type for convenience\nexport type { ${typeName} };\n`); + const typesImport = t.importDeclaration( + [ + t.importSpecifier(t.identifier(typeName), t.identifier(typeName)), + ...Array.from(filterTypesUsed).map((ft) => + t.importSpecifier(t.identifier(ft), t.identifier(ft)) + ), + ], + t.stringLiteral('../types') + ); + typesImport.importKind = 'type'; + statements.push(typesImport); - // Add section comment - sourceFile.addStatements('\n// ============================================================================'); - sourceFile.addStatements('// GraphQL Document'); - sourceFile.addStatements('// ============================================================================\n'); + if (useCentralizedKeys) { + const queryKeyImport = t.importDeclaration( + [t.importSpecifier(t.identifier(keysName), t.identifier(keysName))], + t.stringLiteral('../query-keys') + ); + statements.push(queryKeyImport); + if (hasRelationships) { + const scopeTypeImport = t.importDeclaration( + [ + t.importSpecifier( + t.identifier(scopeTypeName), + t.identifier(scopeTypeName) + ), + ], + t.stringLiteral('../query-keys') + ); + scopeTypeImport.importKind = 'type'; + statements.push(scopeTypeImport); + } + } - // Add query document constant - sourceFile.addVariableStatement( - createConst(`${queryName}QueryDocument`, '`\n' + queryDocument + '`') + const reExportDecl = t.exportNamedDeclaration( + null, + [t.exportSpecifier(t.identifier(typeName), t.identifier(typeName))], + t.stringLiteral('../types') ); + reExportDecl.exportKind = 'type'; + statements.push(reExportDecl); - // Add section comment - sourceFile.addStatements('\n// ============================================================================'); - sourceFile.addStatements('// Types'); - sourceFile.addStatements('// ============================================================================\n'); + const queryDocConst = t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier(`${queryName}QueryDocument`), + t.templateLiteral( + [ + t.templateElement( + { raw: '\n' + queryDocument, cooked: '\n' + queryDocument }, + true + ), + ], + [] + ) + ), + ]); + statements.push(t.exportNamedDeclaration(queryDocConst)); - // Generate filter interface const fieldFilters = scalarFields .map((field) => { const filterType = getScalarFilterType(field.type.gqlType, field.type.isArray); @@ -143,11 +228,10 @@ export function generateListQueryHook( }) .filter((f): f is { fieldName: string; filterType: string } => f !== null); - // Note: Not exported to avoid conflicts with schema-types - sourceFile.addInterface(createFilterInterface(filterTypeName, fieldFilters, { isExported: false })); + statements.push( + createFilterInterfaceDeclaration(filterTypeName, fieldFilters, false) + ); - // Generate OrderBy type - // Note: Not exported to avoid conflicts with schema-types const orderByValues = [ ...scalarFields.flatMap((f) => [ `${toScreamingSnake(f.name)}_ASC`, @@ -157,446 +241,1009 @@ export function generateListQueryHook( 'PRIMARY_KEY_ASC', 'PRIMARY_KEY_DESC', ]; - sourceFile.addTypeAlias( - createTypeAlias(orderByTypeName, createUnionType(orderByValues), { isExported: false }) + const orderByTypeAlias = t.tsTypeAliasDeclaration( + t.identifier(orderByTypeName), + null, + createUnionType(orderByValues) ); + statements.push(orderByTypeAlias); - // Variables interface - const variablesProps: InterfaceProperty[] = [ - { name: 'first', type: 'number', optional: true }, - { name: 'offset', type: 'number', optional: true }, - { name: 'filter', type: filterTypeName, optional: true }, - { name: 'orderBy', type: `${orderByTypeName}[]`, optional: true }, - ]; - sourceFile.addInterface( - createInterface(`${ucFirst(pluralName)}QueryVariables`, variablesProps) + const variablesInterfaceBody = t.tsInterfaceBody([ + (() => { + const p = t.tsPropertySignature( + t.identifier('first'), + t.tsTypeAnnotation(t.tsNumberKeyword()) + ); + p.optional = true; + return p; + })(), + (() => { + const p = t.tsPropertySignature( + t.identifier('offset'), + t.tsTypeAnnotation(t.tsNumberKeyword()) + ); + p.optional = true; + return p; + })(), + (() => { + const p = t.tsPropertySignature( + t.identifier('filter'), + t.tsTypeAnnotation(t.tsTypeReference(t.identifier(filterTypeName))) + ); + p.optional = true; + return p; + })(), + (() => { + const p = t.tsPropertySignature( + t.identifier('orderBy'), + t.tsTypeAnnotation( + t.tsArrayType(t.tsTypeReference(t.identifier(orderByTypeName))) + ) + ); + p.optional = true; + return p; + })(), + ]); + const variablesInterface = t.tsInterfaceDeclaration( + t.identifier(`${ucFirst(pluralName)}QueryVariables`), + null, + null, + variablesInterfaceBody ); + statements.push(t.exportNamedDeclaration(variablesInterface)); - // Result interface - const resultProps: InterfaceProperty[] = [ - { - name: queryName, - type: `{ - totalCount: number; - nodes: ${typeName}[]; - pageInfo: { - hasNextPage: boolean; - hasPreviousPage: boolean; - startCursor: string | null; - endCursor: string | null; - }; - }`, - }, - ]; - sourceFile.addInterface( - createInterface(`${ucFirst(pluralName)}QueryResult`, resultProps) + const pageInfoType = t.tsTypeLiteral([ + t.tsPropertySignature( + t.identifier('hasNextPage'), + t.tsTypeAnnotation(t.tsBooleanKeyword()) + ), + t.tsPropertySignature( + t.identifier('hasPreviousPage'), + t.tsTypeAnnotation(t.tsBooleanKeyword()) + ), + t.tsPropertySignature( + t.identifier('startCursor'), + t.tsTypeAnnotation( + t.tsUnionType([t.tsStringKeyword(), t.tsNullKeyword()]) + ) + ), + t.tsPropertySignature( + t.identifier('endCursor'), + t.tsTypeAnnotation( + t.tsUnionType([t.tsStringKeyword(), t.tsNullKeyword()]) + ) + ), + ]); + const resultType = t.tsTypeLiteral([ + t.tsPropertySignature( + t.identifier('totalCount'), + t.tsTypeAnnotation(t.tsNumberKeyword()) + ), + t.tsPropertySignature( + t.identifier('nodes'), + t.tsTypeAnnotation( + t.tsArrayType(t.tsTypeReference(t.identifier(typeName))) + ) + ), + t.tsPropertySignature( + t.identifier('pageInfo'), + t.tsTypeAnnotation(pageInfoType) + ), + ]); + const resultInterfaceBody = t.tsInterfaceBody([ + t.tsPropertySignature( + t.identifier(queryName), + t.tsTypeAnnotation(resultType) + ), + ]); + const resultInterface = t.tsInterfaceDeclaration( + t.identifier(`${ucFirst(pluralName)}QueryResult`), + null, + null, + resultInterfaceBody ); + statements.push(t.exportNamedDeclaration(resultInterface)); - // Add section comment - sourceFile.addStatements('\n// ============================================================================'); - sourceFile.addStatements('// Query Key'); - sourceFile.addStatements('// ============================================================================\n'); - - // Query key factory - sourceFile.addVariableStatement( - createConst( - `${queryName}QueryKey`, - `(variables?: ${ucFirst(pluralName)}QueryVariables) => - ['${typeName.toLowerCase()}', 'list', variables] as const` - ) - ); + if (useCentralizedKeys) { + const queryKeyConst = t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier(`${queryName}QueryKey`), + t.memberExpression(t.identifier(keysName), t.identifier('list')) + ), + ]); + const queryKeyExport = t.exportNamedDeclaration(queryKeyConst); + addJSDocComment(queryKeyExport, [ + 'Query key factory - re-exported from query-keys.ts', + ]); + statements.push(queryKeyExport); + } else { + const queryKeyArrow = t.arrowFunctionExpression( + [ + typedParam( + 'variables', + t.tsTypeReference( + t.identifier(`${ucFirst(pluralName)}QueryVariables`) + ), + true + ), + ], + t.tsAsExpression( + t.arrayExpression([ + t.stringLiteral(typeName.toLowerCase()), + t.stringLiteral('list'), + t.identifier('variables'), + ]), + t.tsTypeReference(t.identifier('const')) + ) + ); + const queryKeyConst = t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier(`${queryName}QueryKey`), + queryKeyArrow + ), + ]); + statements.push(t.exportNamedDeclaration(queryKeyConst)); + } - // Add React Query hook section (only if enabled) if (reactQueryEnabled) { - sourceFile.addStatements('\n// ============================================================================'); - sourceFile.addStatements('// Hook'); - sourceFile.addStatements('// ============================================================================\n'); - - // Hook function - sourceFile.addFunction({ - name: hookName, - isExported: true, - parameters: [ - { - name: 'variables', - type: `${ucFirst(pluralName)}QueryVariables`, - hasQuestionToken: true, - }, - { - name: 'options', - type: `Omit, 'queryKey' | 'queryFn'>`, - hasQuestionToken: true, - }, - ], - statements: `return useQuery({ - queryKey: ${queryName}QueryKey(variables), - queryFn: () => execute<${ucFirst(pluralName)}QueryResult, ${ucFirst(pluralName)}QueryVariables>( - ${queryName}QueryDocument, - variables - ), - ...options, - });`, - docs: [ - { - description: `Query hook for fetching ${typeName} list - -@example -\`\`\`tsx -const { data, isLoading } = ${hookName}({ - first: 10, - filter: { name: { equalTo: "example" } }, - orderBy: ['CREATED_AT_DESC'], -}); -\`\`\``, - }, - ], - }); + const hookBodyStatements: t.Statement[] = []; + if (hasRelationships && useCentralizedKeys) { + hookBodyStatements.push( + t.variableDeclaration('const', [ + t.variableDeclarator( + t.objectPattern([ + t.objectProperty( + t.identifier('scope'), + t.identifier('scope'), + false, + true + ), + t.restElement(t.identifier('queryOptions')), + ]), + t.logicalExpression( + '??', + t.identifier('options'), + t.objectExpression([]) + ) + ), + ]) + ); + hookBodyStatements.push( + t.returnStatement( + t.callExpression(t.identifier('useQuery'), [ + t.objectExpression([ + t.objectProperty( + t.identifier('queryKey'), + t.callExpression( + t.memberExpression( + t.identifier(keysName), + t.identifier('list') + ), + [t.identifier('variables'), t.identifier('scope')] + ) + ), + t.objectProperty( + t.identifier('queryFn'), + t.arrowFunctionExpression( + [], + t.callExpression(t.identifier('execute'), [ + t.identifier(`${queryName}QueryDocument`), + t.identifier('variables'), + ]) + ) + ), + t.spreadElement(t.identifier('queryOptions')), + ]), + ]) + ) + ); + } else if (useCentralizedKeys) { + hookBodyStatements.push( + t.returnStatement( + t.callExpression(t.identifier('useQuery'), [ + t.objectExpression([ + t.objectProperty( + t.identifier('queryKey'), + t.callExpression( + t.memberExpression( + t.identifier(keysName), + t.identifier('list') + ), + [t.identifier('variables')] + ) + ), + t.objectProperty( + t.identifier('queryFn'), + t.arrowFunctionExpression( + [], + t.callExpression(t.identifier('execute'), [ + t.identifier(`${queryName}QueryDocument`), + t.identifier('variables'), + ]) + ) + ), + t.spreadElement(t.identifier('options')), + ]), + ]) + ) + ); + } else { + hookBodyStatements.push( + t.returnStatement( + t.callExpression(t.identifier('useQuery'), [ + t.objectExpression([ + t.objectProperty( + t.identifier('queryKey'), + t.callExpression(t.identifier(`${queryName}QueryKey`), [ + t.identifier('variables'), + ]) + ), + t.objectProperty( + t.identifier('queryFn'), + t.arrowFunctionExpression( + [], + t.callExpression(t.identifier('execute'), [ + t.identifier(`${queryName}QueryDocument`), + t.identifier('variables'), + ]) + ) + ), + t.spreadElement(t.identifier('options')), + ]), + ]) + ) + ); + } + + const hookParams: t.Identifier[] = [ + typedParam( + 'variables', + t.tsTypeReference(t.identifier(`${ucFirst(pluralName)}QueryVariables`)), + true + ), + ]; + let optionsTypeStr: string; + if (hasRelationships && useCentralizedKeys) { + optionsTypeStr = `Omit, 'queryKey' | 'queryFn'> & { scope?: ${scopeTypeName} }`; + } else { + optionsTypeStr = `Omit, 'queryKey' | 'queryFn'>`; + } + const optionsParam = t.identifier('options'); + optionsParam.optional = true; + optionsParam.typeAnnotation = t.tsTypeAnnotation( + t.tsTypeReference(t.identifier(optionsTypeStr)) + ); + hookParams.push(optionsParam); + + const hookFunc = t.functionDeclaration( + t.identifier(hookName), + hookParams, + t.blockStatement(hookBodyStatements) + ); + const hookExport = t.exportNamedDeclaration(hookFunc); + const docLines = [ + `Query hook for fetching ${typeName} list`, + '', + '@example', + '```tsx', + `const { data, isLoading } = ${hookName}({`, + ' first: 10,', + ' filter: { name: { equalTo: "example" } },', + " orderBy: ['CREATED_AT_DESC'],", + '});', + '```', + ]; + if (hasRelationships && useCentralizedKeys) { + docLines.push(''); + docLines.push('@example With scope for hierarchical cache invalidation'); + docLines.push('```tsx'); + docLines.push(`const { data } = ${hookName}(`); + docLines.push(' { first: 10 },'); + docLines.push(" { scope: { parentId: 'parent-id' } }"); + docLines.push(');'); + docLines.push('```'); + } + addJSDocComment(hookExport, docLines); + statements.push(hookExport); } - // Add section comment for standalone functions - sourceFile.addStatements('\n// ============================================================================'); - sourceFile.addStatements('// Standalone Functions (non-React)'); - sourceFile.addStatements('// ============================================================================\n'); - - // Fetch function (standalone, no React) - sourceFile.addFunction({ - name: `fetch${ucFirst(pluralName)}Query`, - isExported: true, - isAsync: true, - parameters: [ - { - name: 'variables', - type: `${ucFirst(pluralName)}QueryVariables`, - hasQuestionToken: true, - }, - { - name: 'options', - type: 'ExecuteOptions', - hasQuestionToken: true, - }, - ], - returnType: `Promise<${ucFirst(pluralName)}QueryResult>`, - statements: `return execute<${ucFirst(pluralName)}QueryResult, ${ucFirst(pluralName)}QueryVariables>( - ${queryName}QueryDocument, - variables, - options - );`, - docs: [ - { - description: `Fetch ${typeName} list without React hooks - -@example -\`\`\`ts -// Direct fetch -const data = await fetch${ucFirst(pluralName)}Query({ first: 10 }); - -// With QueryClient -const data = await queryClient.fetchQuery({ - queryKey: ${queryName}QueryKey(variables), - queryFn: () => fetch${ucFirst(pluralName)}Query(variables), -}); -\`\`\``, - }, + const fetchFuncBody = t.blockStatement([ + t.returnStatement( + t.callExpression(t.identifier('execute'), [ + t.identifier(`${queryName}QueryDocument`), + t.identifier('variables'), + t.identifier('options'), + ]) + ), + ]); + const fetchFunc = t.functionDeclaration( + t.identifier(`fetch${ucFirst(pluralName)}Query`), + [ + typedParam( + 'variables', + t.tsTypeReference(t.identifier(`${ucFirst(pluralName)}QueryVariables`)), + true + ), + typedParam( + 'options', + t.tsTypeReference(t.identifier('ExecuteOptions')), + true + ), ], - }); + fetchFuncBody + ); + fetchFunc.async = true; + fetchFunc.returnType = t.tsTypeAnnotation( + t.tsTypeReference( + t.identifier('Promise'), + t.tsTypeParameterInstantiation([ + t.tsTypeReference(t.identifier(`${ucFirst(pluralName)}QueryResult`)), + ]) + ) + ); + const fetchExport = t.exportNamedDeclaration(fetchFunc); + addJSDocComment(fetchExport, [ + `Fetch ${typeName} list without React hooks`, + '', + '@example', + '```ts', + '// Direct fetch', + `const data = await fetch${ucFirst(pluralName)}Query({ first: 10 });`, + '', + '// With QueryClient', + 'const data = await queryClient.fetchQuery({', + ` queryKey: ${queryName}QueryKey(variables),`, + ` queryFn: () => fetch${ucFirst(pluralName)}Query(variables),`, + '});', + '```', + ]); + statements.push(fetchExport); - // Prefetch function (for SSR/QueryClient) - only if React Query is enabled if (reactQueryEnabled) { - sourceFile.addFunction({ - name: `prefetch${ucFirst(pluralName)}Query`, - isExported: true, - isAsync: true, - parameters: [ - { - name: 'queryClient', - type: 'QueryClient', - }, - { - name: 'variables', - type: `${ucFirst(pluralName)}QueryVariables`, - hasQuestionToken: true, - }, - { - name: 'options', - type: 'ExecuteOptions', - hasQuestionToken: true, - }, - ], - returnType: 'Promise', - statements: `await queryClient.prefetchQuery({ - queryKey: ${queryName}QueryKey(variables), - queryFn: () => execute<${ucFirst(pluralName)}QueryResult, ${ucFirst(pluralName)}QueryVariables>( - ${queryName}QueryDocument, - variables, - options - ), - });`, - docs: [ - { - description: `Prefetch ${typeName} list for SSR or cache warming - -@example -\`\`\`ts -await prefetch${ucFirst(pluralName)}Query(queryClient, { first: 10 }); -\`\`\``, - }, - ], - }); + const prefetchParams: t.Identifier[] = [ + typedParam( + 'queryClient', + t.tsTypeReference(t.identifier('QueryClient')) + ), + typedParam( + 'variables', + t.tsTypeReference(t.identifier(`${ucFirst(pluralName)}QueryVariables`)), + true + ), + ]; + if (hasRelationships && useCentralizedKeys) { + prefetchParams.push( + typedParam( + 'scope', + t.tsTypeReference(t.identifier(scopeTypeName)), + true + ) + ); + } + prefetchParams.push( + typedParam( + 'options', + t.tsTypeReference(t.identifier('ExecuteOptions')), + true + ) + ); + + let prefetchQueryKeyExpr: t.Expression; + if (hasRelationships && useCentralizedKeys) { + prefetchQueryKeyExpr = t.callExpression( + t.memberExpression(t.identifier(keysName), t.identifier('list')), + [t.identifier('variables'), t.identifier('scope')] + ); + } else if (useCentralizedKeys) { + prefetchQueryKeyExpr = t.callExpression( + t.memberExpression(t.identifier(keysName), t.identifier('list')), + [t.identifier('variables')] + ); + } else { + prefetchQueryKeyExpr = t.callExpression( + t.identifier(`${queryName}QueryKey`), + [t.identifier('variables')] + ); + } + + const prefetchFuncBody = t.blockStatement([ + t.expressionStatement( + t.awaitExpression( + t.callExpression( + t.memberExpression( + t.identifier('queryClient'), + t.identifier('prefetchQuery') + ), + [ + t.objectExpression([ + t.objectProperty( + t.identifier('queryKey'), + prefetchQueryKeyExpr + ), + t.objectProperty( + t.identifier('queryFn'), + t.arrowFunctionExpression( + [], + t.callExpression(t.identifier('execute'), [ + t.identifier(`${queryName}QueryDocument`), + t.identifier('variables'), + t.identifier('options'), + ]) + ) + ), + ]), + ] + ) + ) + ), + ]); + + const prefetchFunc = t.functionDeclaration( + t.identifier(`prefetch${ucFirst(pluralName)}Query`), + prefetchParams, + prefetchFuncBody + ); + prefetchFunc.async = true; + prefetchFunc.returnType = t.tsTypeAnnotation( + t.tsTypeReference( + t.identifier('Promise'), + t.tsTypeParameterInstantiation([t.tsVoidKeyword()]) + ) + ); + const prefetchExport = t.exportNamedDeclaration(prefetchFunc); + addJSDocComment(prefetchExport, [ + `Prefetch ${typeName} list for SSR or cache warming`, + '', + '@example', + '```ts', + `await prefetch${ucFirst(pluralName)}Query(queryClient, { first: 10 });`, + '```', + ]); + statements.push(prefetchExport); } + const code = generateCode(statements); + const headerText = reactQueryEnabled + ? `List query hook for ${typeName}` + : `List query functions for ${typeName}`; + const content = getGeneratedFileHeader(headerText) + '\n\n' + code; + return { fileName: getListQueryFileName(table), - content: getFormattedOutput(sourceFile), + content, }; } -// ============================================================================ -// Single item query hook generator -// ============================================================================ - -/** - * Generate single item query hook file content using AST - */ export function generateSingleQueryHook( table: CleanTable, options: QueryGeneratorOptions = {} ): GeneratedQueryFile { - const { reactQueryEnabled = true } = options; - const project = createProject(); + const { + reactQueryEnabled = true, + useCentralizedKeys = true, + hasRelationships = false, + } = options; const { typeName, singularName } = getTableNames(table); const hookName = getSingleQueryHookName(table); const queryName = getSingleRowQueryName(table); + const keysName = `${lcFirst(typeName)}Keys`; + const scopeTypeName = `${typeName}Scope`; - // Get primary key info dynamically from table constraints const pkFields = getPrimaryKeyInfo(table); - // For simplicity, use first PK field (most common case) - // Composite PKs would need more complex handling const pkField = pkFields[0]; const pkName = pkField.name; const pkTsType = pkField.tsType; - // Generate GraphQL document via AST const queryAST = buildSingleQueryAST({ table }); const queryDocument = printGraphQL(queryAST); - const sourceFile = createSourceFile(project, getSingleQueryFileName(table)); - - // Add file header - const headerText = reactQueryEnabled - ? `Single item query hook for ${typeName}` - : `Single item query functions for ${typeName}`; - sourceFile.insertText(0, createFileHeader(headerText) + '\n\n'); + const statements: t.Statement[] = []; - // Add imports - conditionally include React Query imports - const imports = []; if (reactQueryEnabled) { - imports.push( - createImport({ - moduleSpecifier: '@tanstack/react-query', - namedImports: ['useQuery'], - typeOnlyNamedImports: ['UseQueryOptions', 'QueryClient'], - }) + const reactQueryImport = t.importDeclaration( + [t.importSpecifier(t.identifier('useQuery'), t.identifier('useQuery'))], + t.stringLiteral('@tanstack/react-query') + ); + statements.push(reactQueryImport); + const reactQueryTypeImport = t.importDeclaration( + [ + t.importSpecifier( + t.identifier('UseQueryOptions'), + t.identifier('UseQueryOptions') + ), + t.importSpecifier( + t.identifier('QueryClient'), + t.identifier('QueryClient') + ), + ], + t.stringLiteral('@tanstack/react-query') ); + reactQueryTypeImport.importKind = 'type'; + statements.push(reactQueryTypeImport); } - imports.push( - createImport({ - moduleSpecifier: '../client', - namedImports: ['execute'], - typeOnlyNamedImports: ['ExecuteOptions'], - }), - createImport({ - moduleSpecifier: '../types', - typeOnlyNamedImports: [typeName], - }) + + const clientImport = t.importDeclaration( + [t.importSpecifier(t.identifier('execute'), t.identifier('execute'))], + t.stringLiteral('../client') + ); + statements.push(clientImport); + const clientTypeImport = t.importDeclaration( + [ + t.importSpecifier( + t.identifier('ExecuteOptions'), + t.identifier('ExecuteOptions') + ), + ], + t.stringLiteral('../client') ); - sourceFile.addImportDeclarations(imports); + clientTypeImport.importKind = 'type'; + statements.push(clientTypeImport); - // Re-export entity type - sourceFile.addStatements(`\n// Re-export entity type for convenience\nexport type { ${typeName} };\n`); + const typesImport = t.importDeclaration( + [t.importSpecifier(t.identifier(typeName), t.identifier(typeName))], + t.stringLiteral('../types') + ); + typesImport.importKind = 'type'; + statements.push(typesImport); - // Add section comment - sourceFile.addStatements('\n// ============================================================================'); - sourceFile.addStatements('// GraphQL Document'); - sourceFile.addStatements('// ============================================================================\n'); + if (useCentralizedKeys) { + const queryKeyImport = t.importDeclaration( + [t.importSpecifier(t.identifier(keysName), t.identifier(keysName))], + t.stringLiteral('../query-keys') + ); + statements.push(queryKeyImport); + if (hasRelationships) { + const scopeTypeImport = t.importDeclaration( + [ + t.importSpecifier( + t.identifier(scopeTypeName), + t.identifier(scopeTypeName) + ), + ], + t.stringLiteral('../query-keys') + ); + scopeTypeImport.importKind = 'type'; + statements.push(scopeTypeImport); + } + } - // Add query document constant - sourceFile.addVariableStatement( - createConst(`${queryName}QueryDocument`, '`\n' + queryDocument + '`') + const reExportDecl = t.exportNamedDeclaration( + null, + [t.exportSpecifier(t.identifier(typeName), t.identifier(typeName))], + t.stringLiteral('../types') ); + reExportDecl.exportKind = 'type'; + statements.push(reExportDecl); - // Add section comment - sourceFile.addStatements('\n// ============================================================================'); - sourceFile.addStatements('// Types'); - sourceFile.addStatements('// ============================================================================\n'); + const queryDocConst = t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier(`${queryName}QueryDocument`), + t.templateLiteral( + [ + t.templateElement( + { raw: '\n' + queryDocument, cooked: '\n' + queryDocument }, + true + ), + ], + [] + ) + ), + ]); + statements.push(t.exportNamedDeclaration(queryDocConst)); - // Variables interface - use dynamic PK field name and type - sourceFile.addInterface( - createInterface(`${ucFirst(singularName)}QueryVariables`, [ - { name: pkName, type: pkTsType }, - ]) - ); + const pkTypeAnnotation = + pkTsType === 'string' + ? t.tsStringKeyword() + : pkTsType === 'number' + ? t.tsNumberKeyword() + : t.tsTypeReference(t.identifier(pkTsType)); - // Result interface - sourceFile.addInterface( - createInterface(`${ucFirst(singularName)}QueryResult`, [ - { name: queryName, type: `${typeName} | null` }, - ]) + const variablesInterfaceBody = t.tsInterfaceBody([ + t.tsPropertySignature( + t.identifier(pkName), + t.tsTypeAnnotation(pkTypeAnnotation) + ), + ]); + const variablesInterface = t.tsInterfaceDeclaration( + t.identifier(`${ucFirst(singularName)}QueryVariables`), + null, + null, + variablesInterfaceBody ); + statements.push(t.exportNamedDeclaration(variablesInterface)); - // Add section comment - sourceFile.addStatements('\n// ============================================================================'); - sourceFile.addStatements('// Query Key'); - sourceFile.addStatements('// ============================================================================\n'); - - // Query key factory - use dynamic PK field name and type - sourceFile.addVariableStatement( - createConst( - `${queryName}QueryKey`, - `(${pkName}: ${pkTsType}) => - ['${typeName.toLowerCase()}', 'detail', ${pkName}] as const` - ) + const resultInterfaceBody = t.tsInterfaceBody([ + t.tsPropertySignature( + t.identifier(queryName), + t.tsTypeAnnotation( + t.tsUnionType([ + t.tsTypeReference(t.identifier(typeName)), + t.tsNullKeyword(), + ]) + ) + ), + ]); + const resultInterface = t.tsInterfaceDeclaration( + t.identifier(`${ucFirst(singularName)}QueryResult`), + null, + null, + resultInterfaceBody ); + statements.push(t.exportNamedDeclaration(resultInterface)); + + if (useCentralizedKeys) { + const queryKeyConst = t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier(`${queryName}QueryKey`), + t.memberExpression(t.identifier(keysName), t.identifier('detail')) + ), + ]); + const queryKeyExport = t.exportNamedDeclaration(queryKeyConst); + addJSDocComment(queryKeyExport, [ + 'Query key factory - re-exported from query-keys.ts', + ]); + statements.push(queryKeyExport); + } else { + const queryKeyArrow = t.arrowFunctionExpression( + [typedParam(pkName, pkTypeAnnotation)], + t.tsAsExpression( + t.arrayExpression([ + t.stringLiteral(typeName.toLowerCase()), + t.stringLiteral('detail'), + t.identifier(pkName), + ]), + t.tsTypeReference(t.identifier('const')) + ) + ); + const queryKeyConst = t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier(`${queryName}QueryKey`), + queryKeyArrow + ), + ]); + statements.push(t.exportNamedDeclaration(queryKeyConst)); + } - // Add React Query hook section (only if enabled) if (reactQueryEnabled) { - sourceFile.addStatements('\n// ============================================================================'); - sourceFile.addStatements('// Hook'); - sourceFile.addStatements('// ============================================================================\n'); - - // Hook function - use dynamic PK field name and type - sourceFile.addFunction({ - name: hookName, - isExported: true, - parameters: [ - { name: pkName, type: pkTsType }, - { - name: 'options', - type: `Omit, 'queryKey' | 'queryFn'>`, - hasQuestionToken: true, - }, - ], - statements: `return useQuery({ - queryKey: ${queryName}QueryKey(${pkName}), - queryFn: () => execute<${ucFirst(singularName)}QueryResult, ${ucFirst(singularName)}QueryVariables>( - ${queryName}QueryDocument, - { ${pkName} } - ), - enabled: !!${pkName} && (options?.enabled !== false), - ...options, - });`, - docs: [ - { - description: `Query hook for fetching a single ${typeName} by primary key - -@example -\`\`\`tsx -const { data, isLoading } = ${hookName}(${pkTsType === 'string' ? "'value-here'" : '123'}); - -if (data?.${queryName}) { - console.log(data.${queryName}.${pkName}); -} -\`\`\``, - }, - ], - }); + const hookBodyStatements: t.Statement[] = []; + if (hasRelationships && useCentralizedKeys) { + hookBodyStatements.push( + t.variableDeclaration('const', [ + t.variableDeclarator( + t.objectPattern([ + t.objectProperty( + t.identifier('scope'), + t.identifier('scope'), + false, + true + ), + t.restElement(t.identifier('queryOptions')), + ]), + t.logicalExpression( + '??', + t.identifier('options'), + t.objectExpression([]) + ) + ), + ]) + ); + hookBodyStatements.push( + t.returnStatement( + t.callExpression(t.identifier('useQuery'), [ + t.objectExpression([ + t.objectProperty( + t.identifier('queryKey'), + t.callExpression( + t.memberExpression( + t.identifier(keysName), + t.identifier('detail') + ), + [ + t.memberExpression( + t.identifier('variables'), + t.identifier(pkName) + ), + t.identifier('scope'), + ] + ) + ), + t.objectProperty( + t.identifier('queryFn'), + t.arrowFunctionExpression( + [], + t.callExpression(t.identifier('execute'), [ + t.identifier(`${queryName}QueryDocument`), + t.identifier('variables'), + ]) + ) + ), + t.spreadElement(t.identifier('queryOptions')), + ]), + ]) + ) + ); + } else if (useCentralizedKeys) { + hookBodyStatements.push( + t.returnStatement( + t.callExpression(t.identifier('useQuery'), [ + t.objectExpression([ + t.objectProperty( + t.identifier('queryKey'), + t.callExpression( + t.memberExpression( + t.identifier(keysName), + t.identifier('detail') + ), + [ + t.memberExpression( + t.identifier('variables'), + t.identifier(pkName) + ), + ] + ) + ), + t.objectProperty( + t.identifier('queryFn'), + t.arrowFunctionExpression( + [], + t.callExpression(t.identifier('execute'), [ + t.identifier(`${queryName}QueryDocument`), + t.identifier('variables'), + ]) + ) + ), + t.spreadElement(t.identifier('options')), + ]), + ]) + ) + ); + } else { + hookBodyStatements.push( + t.returnStatement( + t.callExpression(t.identifier('useQuery'), [ + t.objectExpression([ + t.objectProperty( + t.identifier('queryKey'), + t.callExpression(t.identifier(`${queryName}QueryKey`), [ + t.memberExpression( + t.identifier('variables'), + t.identifier(pkName) + ), + ]) + ), + t.objectProperty( + t.identifier('queryFn'), + t.arrowFunctionExpression( + [], + t.callExpression(t.identifier('execute'), [ + t.identifier(`${queryName}QueryDocument`), + t.identifier('variables'), + ]) + ) + ), + t.spreadElement(t.identifier('options')), + ]), + ]) + ) + ); + } + + const hookParams: t.Identifier[] = [ + typedParam( + 'variables', + t.tsTypeReference(t.identifier(`${ucFirst(singularName)}QueryVariables`)) + ), + ]; + let optionsTypeStr: string; + if (hasRelationships && useCentralizedKeys) { + optionsTypeStr = `Omit, 'queryKey' | 'queryFn'> & { scope?: ${scopeTypeName} }`; + } else { + optionsTypeStr = `Omit, 'queryKey' | 'queryFn'>`; + } + const optionsParam = t.identifier('options'); + optionsParam.optional = true; + optionsParam.typeAnnotation = t.tsTypeAnnotation( + t.tsTypeReference(t.identifier(optionsTypeStr)) + ); + hookParams.push(optionsParam); + + const hookFunc = t.functionDeclaration( + t.identifier(hookName), + hookParams, + t.blockStatement(hookBodyStatements) + ); + const hookExport = t.exportNamedDeclaration(hookFunc); + const docLines = [ + `Query hook for fetching a single ${typeName}`, + '', + '@example', + '```tsx', + `const { data, isLoading } = ${hookName}({ ${pkName}: 'some-id' });`, + '```', + ]; + if (hasRelationships && useCentralizedKeys) { + docLines.push(''); + docLines.push('@example With scope for hierarchical cache invalidation'); + docLines.push('```tsx'); + docLines.push(`const { data } = ${hookName}(`); + docLines.push(` { ${pkName}: 'some-id' },`); + docLines.push(" { scope: { parentId: 'parent-id' } }"); + docLines.push(');'); + docLines.push('```'); + } + addJSDocComment(hookExport, docLines); + statements.push(hookExport); } - // Add section comment for standalone functions - sourceFile.addStatements('\n// ============================================================================'); - sourceFile.addStatements('// Standalone Functions (non-React)'); - sourceFile.addStatements('// ============================================================================\n'); - - // Fetch function (standalone, no React) - use dynamic PK - sourceFile.addFunction({ - name: `fetch${ucFirst(singularName)}Query`, - isExported: true, - isAsync: true, - parameters: [ - { name: pkName, type: pkTsType }, - { - name: 'options', - type: 'ExecuteOptions', - hasQuestionToken: true, - }, - ], - returnType: `Promise<${ucFirst(singularName)}QueryResult>`, - statements: `return execute<${ucFirst(singularName)}QueryResult, ${ucFirst(singularName)}QueryVariables>( - ${queryName}QueryDocument, - { ${pkName} }, - options - );`, - docs: [ - { - description: `Fetch a single ${typeName} by primary key without React hooks - -@example -\`\`\`ts -const data = await fetch${ucFirst(singularName)}Query(${pkTsType === 'string' ? "'value-here'" : '123'}); -\`\`\``, - }, + const fetchFuncBody = t.blockStatement([ + t.returnStatement( + t.callExpression(t.identifier('execute'), [ + t.identifier(`${queryName}QueryDocument`), + t.identifier('variables'), + t.identifier('options'), + ]) + ), + ]); + const fetchFunc = t.functionDeclaration( + t.identifier(`fetch${ucFirst(singularName)}Query`), + [ + typedParam( + 'variables', + t.tsTypeReference(t.identifier(`${ucFirst(singularName)}QueryVariables`)) + ), + typedParam( + 'options', + t.tsTypeReference(t.identifier('ExecuteOptions')), + true + ), ], - }); + fetchFuncBody + ); + fetchFunc.async = true; + fetchFunc.returnType = t.tsTypeAnnotation( + t.tsTypeReference( + t.identifier('Promise'), + t.tsTypeParameterInstantiation([ + t.tsTypeReference(t.identifier(`${ucFirst(singularName)}QueryResult`)), + ]) + ) + ); + const fetchExport = t.exportNamedDeclaration(fetchFunc); + addJSDocComment(fetchExport, [ + `Fetch a single ${typeName} without React hooks`, + '', + '@example', + '```ts', + `const data = await fetch${ucFirst(singularName)}Query({ ${pkName}: 'some-id' });`, + '```', + ]); + statements.push(fetchExport); - // Prefetch function (for SSR/QueryClient) - only if React Query is enabled, use dynamic PK if (reactQueryEnabled) { - sourceFile.addFunction({ - name: `prefetch${ucFirst(singularName)}Query`, - isExported: true, - isAsync: true, - parameters: [ - { name: 'queryClient', type: 'QueryClient' }, - { name: pkName, type: pkTsType }, - { - name: 'options', - type: 'ExecuteOptions', - hasQuestionToken: true, - }, - ], - returnType: 'Promise', - statements: `await queryClient.prefetchQuery({ - queryKey: ${queryName}QueryKey(${pkName}), - queryFn: () => execute<${ucFirst(singularName)}QueryResult, ${ucFirst(singularName)}QueryVariables>( - ${queryName}QueryDocument, - { ${pkName} }, - options - ), - });`, - docs: [ - { - description: `Prefetch a single ${typeName} for SSR or cache warming - -@example -\`\`\`ts -await prefetch${ucFirst(singularName)}Query(queryClient, ${pkTsType === 'string' ? "'value-here'" : '123'}); -\`\`\``, - }, - ], - }); + const prefetchParams: t.Identifier[] = [ + typedParam( + 'queryClient', + t.tsTypeReference(t.identifier('QueryClient')) + ), + typedParam( + 'variables', + t.tsTypeReference(t.identifier(`${ucFirst(singularName)}QueryVariables`)) + ), + ]; + if (hasRelationships && useCentralizedKeys) { + prefetchParams.push( + typedParam( + 'scope', + t.tsTypeReference(t.identifier(scopeTypeName)), + true + ) + ); + } + prefetchParams.push( + typedParam( + 'options', + t.tsTypeReference(t.identifier('ExecuteOptions')), + true + ) + ); + + let prefetchQueryKeyExpr: t.Expression; + if (hasRelationships && useCentralizedKeys) { + prefetchQueryKeyExpr = t.callExpression( + t.memberExpression(t.identifier(keysName), t.identifier('detail')), + [ + t.memberExpression(t.identifier('variables'), t.identifier(pkName)), + t.identifier('scope'), + ] + ); + } else if (useCentralizedKeys) { + prefetchQueryKeyExpr = t.callExpression( + t.memberExpression(t.identifier(keysName), t.identifier('detail')), + [t.memberExpression(t.identifier('variables'), t.identifier(pkName))] + ); + } else { + prefetchQueryKeyExpr = t.callExpression( + t.identifier(`${queryName}QueryKey`), + [t.memberExpression(t.identifier('variables'), t.identifier(pkName))] + ); + } + + const prefetchFuncBody = t.blockStatement([ + t.expressionStatement( + t.awaitExpression( + t.callExpression( + t.memberExpression( + t.identifier('queryClient'), + t.identifier('prefetchQuery') + ), + [ + t.objectExpression([ + t.objectProperty( + t.identifier('queryKey'), + prefetchQueryKeyExpr + ), + t.objectProperty( + t.identifier('queryFn'), + t.arrowFunctionExpression( + [], + t.callExpression(t.identifier('execute'), [ + t.identifier(`${queryName}QueryDocument`), + t.identifier('variables'), + t.identifier('options'), + ]) + ) + ), + ]), + ] + ) + ) + ), + ]); + + const prefetchFunc = t.functionDeclaration( + t.identifier(`prefetch${ucFirst(singularName)}Query`), + prefetchParams, + prefetchFuncBody + ); + prefetchFunc.async = true; + prefetchFunc.returnType = t.tsTypeAnnotation( + t.tsTypeReference( + t.identifier('Promise'), + t.tsTypeParameterInstantiation([t.tsVoidKeyword()]) + ) + ); + const prefetchExport = t.exportNamedDeclaration(prefetchFunc); + addJSDocComment(prefetchExport, [ + `Prefetch a single ${typeName} for SSR or cache warming`, + '', + '@example', + '```ts', + `await prefetch${ucFirst(singularName)}Query(queryClient, { ${pkName}: 'some-id' });`, + '```', + ]); + statements.push(prefetchExport); } + const code = generateCode(statements); + const headerText = reactQueryEnabled + ? `Single item query hook for ${typeName}` + : `Single item query functions for ${typeName}`; + const content = getGeneratedFileHeader(headerText) + '\n\n' + code; + return { fileName: getSingleQueryFileName(table), - content: getFormattedOutput(sourceFile), + content, }; } -// ============================================================================ -// Batch generator -// ============================================================================ - -/** - * Generate all query hook files for all tables - */ export function generateAllQueryHooks( tables: CleanTable[], options: QueryGeneratorOptions = {} ): GeneratedQueryFile[] { const files: GeneratedQueryFile[] = []; - for (const table of tables) { files.push(generateListQueryHook(table, options)); files.push(generateSingleQueryHook(table, options)); } - return files; } diff --git a/graphql/codegen/src/cli/codegen/query-keys.ts b/graphql/codegen/src/cli/codegen/query-keys.ts new file mode 100644 index 000000000..ba32cff8c --- /dev/null +++ b/graphql/codegen/src/cli/codegen/query-keys.ts @@ -0,0 +1,719 @@ +/** + * Query key factory generator + * + * Generates centralized query keys following the lukemorales query-key-factory pattern. + * Supports hierarchical scoped keys for parent-child entity relationships. + * + * Uses Babel AST for code generation - no string concatenation. + * + * @see https://tanstack.com/query/docs/framework/react/community/lukemorales-query-key-factory + */ +import * as t from '@babel/types'; + +import type { CleanTable, CleanOperation } from '../../types/schema'; +import type { ResolvedQueryKeyConfig, EntityRelationship } from '../../types/config'; +import { getTableNames, getGeneratedFileHeader, ucFirst, lcFirst } from './utils'; +import { + generateCode, + addJSDocComment, + asConst, + constArray, + typedParam, + keyofTypeof, +} from './babel-ast'; + +export interface QueryKeyGeneratorOptions { + tables: CleanTable[]; + customQueries: CleanOperation[]; + config: ResolvedQueryKeyConfig; +} + +export interface GeneratedQueryKeysFile { + fileName: string; + content: string; +} + +/** + * Get all ancestor entities for a given entity based on relationships + */ +function getAncestors( + entityName: string, + relationships: Record +): string[] { + const relationship = relationships[entityName.toLowerCase()]; + if (!relationship) return []; + + if (relationship.ancestors && relationship.ancestors.length > 0) { + return relationship.ancestors; + } + + const ancestors: string[] = []; + let current = relationship.parent; + while (current) { + ancestors.push(current); + const parentRel = relationships[current.toLowerCase()]; + current = parentRel?.parent ?? null; + } + return ancestors; +} + +/** + * Generate scope type declaration for an entity + */ +function generateScopeTypeDeclaration( + entityName: string, + relationships: Record +): t.ExportNamedDeclaration | null { + const relationship = relationships[entityName.toLowerCase()]; + if (!relationship) return null; + + const ancestors = getAncestors(entityName, relationships); + const allParents = [relationship.parent, ...ancestors]; + + const typeName = `${ucFirst(entityName)}Scope`; + const members: t.TSPropertySignature[] = []; + + for (const parent of allParents) { + const rel = relationships[entityName.toLowerCase()]; + let fkField = `${lcFirst(parent)}Id`; + if (rel && rel.parent === parent) { + fkField = rel.foreignKey; + } else { + const directRel = Object.entries(relationships).find( + ([, r]) => r.parent === parent + ); + if (directRel) { + fkField = directRel[1].foreignKey; + } + } + + const signature = t.tsPropertySignature( + t.identifier(fkField), + t.tsTypeAnnotation(t.tsStringKeyword()) + ); + signature.optional = true; + members.push(signature); + } + + return t.exportNamedDeclaration( + t.tsTypeAliasDeclaration( + t.identifier(typeName), + null, + t.tsTypeLiteral(members) + ) + ); +} + +/** + * Build the 'all' property: all: ['entityKey'] as const + */ +function buildAllProperty(entityKey: string, singularName: string): t.ObjectProperty { + const prop = t.objectProperty( + t.identifier('all'), + constArray([t.stringLiteral(entityKey)]) + ); + addJSDocComment(prop, [`All ${singularName} queries`]); + return prop; +} + +/** + * Build a byParent property for scoped keys + */ +function buildByParentProperty( + entityKey: string, + typeName: string, + parent: string, + fkField: string +): t.ObjectProperty { + const parentUpper = ucFirst(parent); + const parentLower = lcFirst(parent); + + const arrowFn = t.arrowFunctionExpression( + [typedParam(fkField, t.tsStringKeyword())], + constArray([ + t.stringLiteral(entityKey), + t.objectExpression([ + t.objectProperty(t.identifier(fkField), t.identifier(fkField), false, true) + ]) + ]) + ); + + const prop = t.objectProperty( + t.identifier(`by${parentUpper}`), + arrowFn + ); + addJSDocComment(prop, [`${typeName} queries scoped to a specific ${parentLower}`]); + return prop; +} + +/** + * Build the scoped helper function property + */ +function buildScopedProperty( + keysName: string, + typeName: string, + relationship: EntityRelationship, + ancestors: string[] +): t.ObjectProperty { + const scopeTypeName = `${typeName}Scope`; + const scopeParam = typedParam('scope', t.tsTypeReference(t.identifier(scopeTypeName)), true); + + const statements: t.Statement[] = []; + + if (relationship.parent) { + statements.push( + t.ifStatement( + t.optionalMemberExpression( + t.identifier('scope'), + t.identifier(relationship.foreignKey), + false, + true + ), + t.blockStatement([ + t.returnStatement( + t.callExpression( + t.memberExpression( + t.identifier(keysName), + t.identifier(`by${ucFirst(relationship.parent)}`) + ), + [t.memberExpression(t.identifier('scope'), t.identifier(relationship.foreignKey))] + ) + ) + ]) + ) + ); + } + + for (const ancestor of ancestors) { + const ancestorLower = lcFirst(ancestor); + const fkField = `${ancestorLower}Id`; + statements.push( + t.ifStatement( + t.optionalMemberExpression( + t.identifier('scope'), + t.identifier(fkField), + false, + true + ), + t.blockStatement([ + t.returnStatement( + t.callExpression( + t.memberExpression( + t.identifier(keysName), + t.identifier(`by${ucFirst(ancestor)}`) + ), + [t.memberExpression(t.identifier('scope'), t.identifier(fkField))] + ) + ) + ]) + ) + ); + } + + statements.push( + t.returnStatement( + t.memberExpression(t.identifier(keysName), t.identifier('all')) + ) + ); + + const arrowFn = t.arrowFunctionExpression( + [scopeParam], + t.blockStatement(statements) + ); + + const prop = t.objectProperty(t.identifier('scoped'), arrowFn); + addJSDocComment(prop, ['Get scope-aware base key']); + return prop; +} + +/** + * Build lists property (scoped version) + */ +function buildScopedListsProperty(keysName: string, scopeTypeName: string): t.ObjectProperty { + const scopeParam = typedParam('scope', t.tsTypeReference(t.identifier(scopeTypeName)), true); + + const arrowFn = t.arrowFunctionExpression( + [scopeParam], + constArray([ + t.spreadElement( + t.callExpression( + t.memberExpression(t.identifier(keysName), t.identifier('scoped')), + [t.identifier('scope')] + ) + ), + t.stringLiteral('list') + ]) + ); + + const prop = t.objectProperty(t.identifier('lists'), arrowFn); + addJSDocComment(prop, ['List query keys (optionally scoped)']); + return prop; +} + +/** + * Build list property (scoped version) + */ +function buildScopedListProperty(keysName: string, scopeTypeName: string): t.ObjectProperty { + const variablesParam = typedParam('variables', t.tsTypeReference(t.identifier('object')), true); + const scopeParam = typedParam('scope', t.tsTypeReference(t.identifier(scopeTypeName)), true); + + const arrowFn = t.arrowFunctionExpression( + [variablesParam, scopeParam], + constArray([ + t.spreadElement( + t.callExpression( + t.memberExpression(t.identifier(keysName), t.identifier('lists')), + [t.identifier('scope')] + ) + ), + t.identifier('variables') + ]) + ); + + const prop = t.objectProperty(t.identifier('list'), arrowFn); + addJSDocComment(prop, ['List query key with variables']); + return prop; +} + +/** + * Build details property (scoped version) + */ +function buildScopedDetailsProperty(keysName: string, scopeTypeName: string): t.ObjectProperty { + const scopeParam = typedParam('scope', t.tsTypeReference(t.identifier(scopeTypeName)), true); + + const arrowFn = t.arrowFunctionExpression( + [scopeParam], + constArray([ + t.spreadElement( + t.callExpression( + t.memberExpression(t.identifier(keysName), t.identifier('scoped')), + [t.identifier('scope')] + ) + ), + t.stringLiteral('detail') + ]) + ); + + const prop = t.objectProperty(t.identifier('details'), arrowFn); + addJSDocComment(prop, ['Detail query keys (optionally scoped)']); + return prop; +} + +/** + * Build detail property (scoped version) + */ +function buildScopedDetailProperty(keysName: string, scopeTypeName: string): t.ObjectProperty { + const idParam = typedParam('id', t.tsUnionType([t.tsStringKeyword(), t.tsNumberKeyword()])); + const scopeParam = typedParam('scope', t.tsTypeReference(t.identifier(scopeTypeName)), true); + + const arrowFn = t.arrowFunctionExpression( + [idParam, scopeParam], + constArray([ + t.spreadElement( + t.callExpression( + t.memberExpression(t.identifier(keysName), t.identifier('details')), + [t.identifier('scope')] + ) + ), + t.identifier('id') + ]) + ); + + const prop = t.objectProperty(t.identifier('detail'), arrowFn); + addJSDocComment(prop, ['Detail query key for specific item']); + return prop; +} + +/** + * Build simple (non-scoped) lists property + */ +function buildSimpleListsProperty(keysName: string): t.ObjectProperty { + const arrowFn = t.arrowFunctionExpression( + [], + constArray([ + t.spreadElement(t.memberExpression(t.identifier(keysName), t.identifier('all'))), + t.stringLiteral('list') + ]) + ); + + const prop = t.objectProperty(t.identifier('lists'), arrowFn); + addJSDocComment(prop, ['List query keys']); + return prop; +} + +/** + * Build simple (non-scoped) list property + */ +function buildSimpleListProperty(keysName: string): t.ObjectProperty { + const variablesParam = typedParam('variables', t.tsTypeReference(t.identifier('object')), true); + + const arrowFn = t.arrowFunctionExpression( + [variablesParam], + constArray([ + t.spreadElement( + t.callExpression( + t.memberExpression(t.identifier(keysName), t.identifier('lists')), + [] + ) + ), + t.identifier('variables') + ]) + ); + + const prop = t.objectProperty(t.identifier('list'), arrowFn); + addJSDocComment(prop, ['List query key with variables']); + return prop; +} + +/** + * Build simple (non-scoped) details property + */ +function buildSimpleDetailsProperty(keysName: string): t.ObjectProperty { + const arrowFn = t.arrowFunctionExpression( + [], + constArray([ + t.spreadElement(t.memberExpression(t.identifier(keysName), t.identifier('all'))), + t.stringLiteral('detail') + ]) + ); + + const prop = t.objectProperty(t.identifier('details'), arrowFn); + addJSDocComment(prop, ['Detail query keys']); + return prop; +} + +/** + * Build simple (non-scoped) detail property + */ +function buildSimpleDetailProperty(keysName: string): t.ObjectProperty { + const idParam = typedParam('id', t.tsUnionType([t.tsStringKeyword(), t.tsNumberKeyword()])); + + const arrowFn = t.arrowFunctionExpression( + [idParam], + constArray([ + t.spreadElement( + t.callExpression( + t.memberExpression(t.identifier(keysName), t.identifier('details')), + [] + ) + ), + t.identifier('id') + ]) + ); + + const prop = t.objectProperty(t.identifier('detail'), arrowFn); + addJSDocComment(prop, ['Detail query key for specific item']); + return prop; +} + +/** + * Generate query keys declaration for a single table entity + */ +function generateEntityKeysDeclaration( + table: CleanTable, + relationships: Record, + generateScopedKeys: boolean +): t.ExportNamedDeclaration { + const { typeName, singularName } = getTableNames(table); + const entityKey = typeName.toLowerCase(); + const keysName = `${lcFirst(typeName)}Keys`; + + const relationship = relationships[entityKey]; + const hasRelationship = !!relationship && generateScopedKeys; + + const properties: t.ObjectProperty[] = []; + + properties.push(buildAllProperty(entityKey, singularName)); + + if (hasRelationship) { + const ancestors = getAncestors(typeName, relationships); + const allParents = [relationship.parent, ...ancestors]; + + for (const parent of allParents) { + let fkField = `${lcFirst(parent)}Id`; + if (relationship.parent === parent) { + fkField = relationship.foreignKey; + } + properties.push(buildByParentProperty(entityKey, typeName, parent, fkField)); + } + + properties.push(buildScopedProperty(keysName, typeName, relationship, ancestors)); + + const scopeTypeName = `${typeName}Scope`; + properties.push(buildScopedListsProperty(keysName, scopeTypeName)); + properties.push(buildScopedListProperty(keysName, scopeTypeName)); + properties.push(buildScopedDetailsProperty(keysName, scopeTypeName)); + properties.push(buildScopedDetailProperty(keysName, scopeTypeName)); + } else { + properties.push(buildSimpleListsProperty(keysName)); + properties.push(buildSimpleListProperty(keysName)); + properties.push(buildSimpleDetailsProperty(keysName)); + properties.push(buildSimpleDetailProperty(keysName)); + } + + return t.exportNamedDeclaration( + t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier(keysName), + asConst(t.objectExpression(properties)) + ) + ]) + ); +} + +/** + * Generate query keys declaration for custom operations + */ +function generateCustomQueryKeysDeclaration( + operations: CleanOperation[] +): t.ExportNamedDeclaration | null { + if (operations.length === 0) return null; + + const properties: t.ObjectProperty[] = []; + + for (const op of operations) { + const hasArgs = op.args.length > 0; + const hasRequiredArgs = op.args.some( + (arg) => arg.type.kind === 'NON_NULL' + ); + + let prop: t.ObjectProperty; + + if (hasArgs) { + const variablesParam = typedParam('variables', t.tsTypeReference(t.identifier('object')), !hasRequiredArgs); + + const arrowFn = t.arrowFunctionExpression( + [variablesParam], + constArray([t.stringLiteral(op.name), t.identifier('variables')]) + ); + + prop = t.objectProperty(t.identifier(op.name), arrowFn); + } else { + const arrowFn = t.arrowFunctionExpression( + [], + constArray([t.stringLiteral(op.name)]) + ); + + prop = t.objectProperty(t.identifier(op.name), arrowFn); + } + + addJSDocComment(prop, [`Query key for ${op.name}`]); + properties.push(prop); + } + + return t.exportNamedDeclaration( + t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier('customQueryKeys'), + asConst(t.objectExpression(properties)) + ) + ]) + ); +} + +/** + * Generate the unified query keys store declaration + */ +function generateUnifiedStoreDeclaration( + tables: CleanTable[], + hasCustomQueries: boolean +): t.ExportNamedDeclaration { + const properties: t.ObjectProperty[] = []; + + for (const table of tables) { + const { typeName } = getTableNames(table); + const keysName = `${lcFirst(typeName)}Keys`; + properties.push( + t.objectProperty(t.identifier(lcFirst(typeName)), t.identifier(keysName)) + ); + } + + if (hasCustomQueries) { + properties.push( + t.objectProperty(t.identifier('custom'), t.identifier('customQueryKeys')) + ); + } + + const decl = t.exportNamedDeclaration( + t.variableDeclaration('const', [ + t.variableDeclarator( + t.identifier('queryKeys'), + asConst(t.objectExpression(properties)) + ) + ]) + ); + + addJSDocComment(decl, [ + 'Unified query key store', + '', + 'Use this for type-safe query key access across your application.', + '', + '@example', + '```ts', + '// Invalidate all user queries', + 'queryClient.invalidateQueries({ queryKey: queryKeys.user.all });', + '', + '// Invalidate user list queries', + 'queryClient.invalidateQueries({ queryKey: queryKeys.user.lists() });', + '', + '// Invalidate specific user', + 'queryClient.invalidateQueries({ queryKey: queryKeys.user.detail(userId) });', + '```', + ]); + + return decl; +} + +/** + * Generate the complete query-keys.ts file + */ +export function generateQueryKeysFile( + options: QueryKeyGeneratorOptions +): GeneratedQueryKeysFile { + const { tables, customQueries, config } = options; + const { relationships, generateScopedKeys } = config; + + const statements: t.Statement[] = []; + + // Generate scope types for entities with relationships + if (generateScopedKeys && Object.keys(relationships).length > 0) { + const generatedScopes = new Set(); + for (const table of tables) { + const { typeName } = getTableNames(table); + const scopeTypeName = `${typeName}Scope`; + if (!generatedScopes.has(scopeTypeName)) { + const scopeType = generateScopeTypeDeclaration(typeName, relationships); + if (scopeType) { + statements.push(scopeType); + generatedScopes.add(scopeTypeName); + } + } + } + } + + // Generate entity keys + for (const table of tables) { + statements.push(generateEntityKeysDeclaration(table, relationships, generateScopedKeys)); + } + + // Generate custom query keys + const queryOperations = customQueries.filter((op) => op.kind === 'query'); + const customKeysDecl = generateCustomQueryKeysDeclaration(queryOperations); + if (customKeysDecl) { + statements.push(customKeysDecl); + } + + // Generate unified store + statements.push(generateUnifiedStoreDeclaration(tables, queryOperations.length > 0)); + + // Generate QueryKeyScope type + const scopeTypeDecl = t.exportNamedDeclaration( + t.tsTypeAliasDeclaration( + t.identifier('QueryKeyScope'), + null, + keyofTypeof('queryKeys') + ) + ); + addJSDocComment(scopeTypeDecl, ['Type representing all available query key scopes']); + statements.push(scopeTypeDecl); + + // Generate code from AST + const code = generateCode(statements); + + // Build final content with header and section comments + const header = getGeneratedFileHeader('Centralized query key factory'); + const description = `// ============================================================================ +// This file provides a centralized, type-safe query key factory following +// the lukemorales query-key-factory pattern for React Query. +// +// Benefits: +// - Single source of truth for all query keys +// - Type-safe key access with autocomplete +// - Hierarchical invalidation (invalidate all 'user.*' queries) +// - Scoped keys for parent-child relationships +// ============================================================================`; + + let content = `${header} + +${description} + +`; + + // Add scope types section if present + if (generateScopedKeys && Object.keys(relationships).length > 0) { + const hasScopes = tables.some(table => { + const { typeName } = getTableNames(table); + return !!relationships[typeName.toLowerCase()]; + }); + if (hasScopes) { + content += `// ============================================================================ +// Scope Types +// ============================================================================ + +`; + } + } + + // Insert section comments into the generated code + const codeLines = code.split('\n'); + let inScopeTypes = generateScopedKeys && Object.keys(relationships).length > 0; + let addedEntitySection = false; + let addedCustomSection = false; + let addedUnifiedSection = false; + + for (let i = 0; i < codeLines.length; i++) { + const line = codeLines[i]; + + // Detect transition from scope types to entity keys + if (inScopeTypes && line.startsWith('export const') && line.includes('Keys =')) { + content += `// ============================================================================ +// Entity Query Keys +// ============================================================================ + +`; + inScopeTypes = false; + addedEntitySection = true; + } + + // Detect custom query keys section + if (!addedCustomSection && line.startsWith('export const customQueryKeys')) { + content += ` +// ============================================================================ +// Custom Query Keys +// ============================================================================ + +`; + addedCustomSection = true; + } + + // Detect unified store section + if (!addedUnifiedSection && line.includes('* Unified query key store')) { + content += ` +// ============================================================================ +// Unified Query Key Store +// ============================================================================ + +`; + addedUnifiedSection = true; + } + + content += line + '\n'; + } + + // If no scope types, add entity section at the beginning + if (!addedEntitySection && !inScopeTypes) { + const firstExportIndex = content.indexOf('\nexport const'); + if (firstExportIndex !== -1) { + content = content.slice(0, firstExportIndex) + ` +// ============================================================================ +// Entity Query Keys +// ============================================================================ +` + content.slice(firstExportIndex); + } + } + + return { + fileName: 'query-keys.ts', + content, + }; +} diff --git a/graphql/codegen/src/cli/codegen/scalars.ts b/graphql/codegen/src/cli/codegen/scalars.ts index 36f59bed9..f659cb095 100644 --- a/graphql/codegen/src/cli/codegen/scalars.ts +++ b/graphql/codegen/src/cli/codegen/scalars.ts @@ -23,6 +23,7 @@ export const SCALAR_TS_MAP: Record = { // Geometry types GeoJSON: 'unknown', Geometry: 'unknown', + GeometryPoint: 'unknown', Point: 'unknown', // Interval diff --git a/graphql/codegen/src/cli/codegen/schema-types-generator.ts b/graphql/codegen/src/cli/codegen/schema-types-generator.ts index 38fddf63f..b4bc6a655 100644 --- a/graphql/codegen/src/cli/codegen/schema-types-generator.ts +++ b/graphql/codegen/src/cli/codegen/schema-types-generator.ts @@ -9,57 +9,37 @@ * These types are referenced by custom mutation/query hooks but not generated * elsewhere in non-ORM mode. * - * Uses ts-morph for robust AST-based code generation. + * Uses Babel AST for robust code generation. */ -import type { SourceFile } from 'ts-morph'; import type { TypeRegistry, CleanArgument, ResolvedType, } from '../../types/schema'; -import { - createProject, - createSourceFile, - getMinimalFormattedOutput, - createFileHeader, - createInterface, - createTypeAlias, - addSectionComment, - type InterfaceProperty, -} from './ts-ast'; +import * as t from '@babel/types'; +import { generateCode } from './babel-ast'; import { getTypeBaseName } from './type-resolver'; import { scalarToTsType, SCALAR_NAMES, BASE_FILTER_TYPE_NAMES, } from './scalars'; +import { getGeneratedFileHeader } from './utils'; export interface GeneratedSchemaTypesFile { fileName: string; content: string; - /** List of enum type names that were generated */ generatedEnums: string[]; - /** List of table entity types that are referenced */ referencedTableTypes: string[]; } export interface GenerateSchemaTypesOptions { - /** The TypeRegistry containing all GraphQL types */ typeRegistry: TypeRegistry; - /** Type names that already exist in types.ts (table entity types) */ tableTypeNames: Set; } -// ============================================================================ -// Constants -// ============================================================================ - -/** - * Types that should not be generated (scalars, built-ins, types generated elsewhere) - */ const SKIP_TYPES = new Set([ ...SCALAR_NAMES, - // GraphQL built-ins 'Query', 'Mutation', 'Subscription', @@ -69,30 +49,11 @@ const SKIP_TYPES = new Set([ '__InputValue', '__EnumValue', '__Directive', - // Note: PageInfo and Cursor are NOT skipped - they're needed by Connection types - // Base filter types (generated in types.ts via filters.ts) ...BASE_FILTER_TYPE_NAMES, ]); -/** - * Type name patterns to skip (regex patterns) - * - * Note: We intentionally DO NOT skip Connection, Edge, Filter, Patch, Condition, - * or OrderBy types because they may be referenced by custom operations. - * Previously Condition and OrderBy were skipped but they ARE needed for - * custom queries like `schemata`, `apiSchemata`, etc. - */ -const SKIP_TYPE_PATTERNS: RegExp[] = [ - // Currently no patterns are skipped - all types may be needed by custom operations -]; +const SKIP_TYPE_PATTERNS: RegExp[] = []; -// ============================================================================ -// Type Conversion Utilities -// ============================================================================ - -/** - * Convert a CleanTypeRef to TypeScript type string - */ function typeRefToTs(typeRef: CleanArgument['type']): string { if (typeRef.kind === 'NON_NULL') { if (typeRef.ofType) { @@ -108,93 +69,64 @@ function typeRefToTs(typeRef: CleanArgument['type']): string { return 'unknown[]'; } - // Scalar or named type const name = typeRef.name ?? 'unknown'; return scalarToTsType(name, { unknownScalar: 'name' }); } -/** - * Check if a type is required (NON_NULL) - */ function isRequired(typeRef: CleanArgument['type']): boolean { return typeRef.kind === 'NON_NULL'; } -/** - * Check if a type should be skipped - */ function shouldSkipType( typeName: string, tableTypeNames: Set ): boolean { - // Skip scalars and built-ins if (SKIP_TYPES.has(typeName)) return true; - - // Skip table entity types (already in types.ts) if (tableTypeNames.has(typeName)) return true; - // Skip types matching patterns for (const pattern of SKIP_TYPE_PATTERNS) { if (pattern.test(typeName)) return true; } - // Skip table-specific types that would conflict with inline types in table-based hooks. - // Note: Patch and CreateInput are now NOT exported from hooks (isExported: false), - // so we only skip Filter types here. - // The Filter and OrderBy types are generated inline (non-exported) by table query hooks, - // but schema-types should still generate them for custom operations that need them. - // Actually, we don't skip any table-based types now since hooks don't export them. - return false; } -// ============================================================================ -// ENUM Types Generator -// ============================================================================ - -/** - * Add ENUM types to source file - */ -function addEnumTypes( - sourceFile: SourceFile, +function generateEnumTypes( typeRegistry: TypeRegistry, tableTypeNames: Set -): Set { +): { statements: t.Statement[]; generatedTypes: Set } { + const statements: t.Statement[] = []; const generatedTypes = new Set(); - addSectionComment(sourceFile, 'Enum Types'); - for (const [typeName, typeInfo] of typeRegistry) { if (typeInfo.kind !== 'ENUM') continue; if (shouldSkipType(typeName, tableTypeNames)) continue; if (!typeInfo.enumValues || typeInfo.enumValues.length === 0) continue; - const values = typeInfo.enumValues.map((v) => `'${v}'`).join(' | '); - sourceFile.addTypeAlias(createTypeAlias(typeName, values)); + const unionType = t.tsUnionType( + typeInfo.enumValues.map((v) => t.tsLiteralType(t.stringLiteral(v))) + ); + const typeAlias = t.tsTypeAliasDeclaration( + t.identifier(typeName), + null, + unionType + ); + statements.push(t.exportNamedDeclaration(typeAlias)); generatedTypes.add(typeName); } - return generatedTypes; + return { statements, generatedTypes }; } -// ============================================================================ -// INPUT_OBJECT Types Generator -// ============================================================================ - -/** - * Add INPUT_OBJECT types to source file - * Uses iteration to handle nested input types - */ -function addInputObjectTypes( - sourceFile: SourceFile, +function generateInputObjectTypes( typeRegistry: TypeRegistry, tableTypeNames: Set, alreadyGenerated: Set -): Set { +): { statements: t.Statement[]; generatedTypes: Set } { + const statements: t.Statement[] = []; const generatedTypes = new Set(alreadyGenerated); const typesToGenerate = new Set(); - // Collect all INPUT_OBJECT types for (const [typeName, typeInfo] of typeRegistry) { if (typeInfo.kind !== 'INPUT_OBJECT') continue; if (shouldSkipType(typeName, tableTypeNames)) continue; @@ -202,11 +134,6 @@ function addInputObjectTypes( typesToGenerate.add(typeName); } - if (typesToGenerate.size === 0) return generatedTypes; - - addSectionComment(sourceFile, 'Input Object Types'); - - // Process all types - no artificial limit while (typesToGenerate.size > 0) { const typeNameResult = typesToGenerate.values().next(); if (typeNameResult.done) break; @@ -220,20 +147,20 @@ function addInputObjectTypes( generatedTypes.add(typeName); - if (typeInfo.inputFields && typeInfo.inputFields.length > 0) { - const properties: InterfaceProperty[] = []; + const properties: t.TSPropertySignature[] = []; + if (typeInfo.inputFields && typeInfo.inputFields.length > 0) { for (const field of typeInfo.inputFields) { const optional = !isRequired(field.type); const tsType = typeRefToTs(field.type); - properties.push({ - name: field.name, - type: tsType, - optional, - docs: field.description ? [field.description] : undefined, - }); - - // Follow nested Input types + + const prop = t.tsPropertySignature( + t.identifier(field.name), + t.tsTypeAnnotation(t.tsTypeReference(t.identifier(tsType))) + ); + prop.optional = optional; + properties.push(prop); + const baseType = getTypeBaseName(field.type); if ( baseType && @@ -246,81 +173,61 @@ function addInputObjectTypes( } } } - - sourceFile.addInterface(createInterface(typeName, properties)); - } else { - // Empty input object - sourceFile.addInterface(createInterface(typeName, [])); } + + const interfaceDecl = t.tsInterfaceDeclaration( + t.identifier(typeName), + null, + null, + t.tsInterfaceBody(properties) + ); + statements.push(t.exportNamedDeclaration(interfaceDecl)); } - return generatedTypes; + return { statements, generatedTypes }; } -// ============================================================================ -// UNION Types Generator -// ============================================================================ - -/** - * Add UNION types to source file - */ -function addUnionTypes( - sourceFile: SourceFile, +function generateUnionTypes( typeRegistry: TypeRegistry, tableTypeNames: Set, alreadyGenerated: Set -): Set { +): { statements: t.Statement[]; generatedTypes: Set } { + const statements: t.Statement[] = []; const generatedTypes = new Set(alreadyGenerated); - const unionTypesToGenerate = new Set(); - // Collect all UNION types for (const [typeName, typeInfo] of typeRegistry) { if (typeInfo.kind !== 'UNION') continue; if (shouldSkipType(typeName, tableTypeNames)) continue; if (generatedTypes.has(typeName)) continue; - unionTypesToGenerate.add(typeName); - } - - if (unionTypesToGenerate.size === 0) return generatedTypes; - - addSectionComment(sourceFile, 'Union Types'); - - for (const typeName of unionTypesToGenerate) { - const typeInfo = typeRegistry.get(typeName); - if (!typeInfo || typeInfo.kind !== 'UNION') continue; - if (!typeInfo.possibleTypes || typeInfo.possibleTypes.length === 0) - continue; - - // Generate union type as TypeScript union - const unionMembers = typeInfo.possibleTypes.join(' | '); - sourceFile.addTypeAlias(createTypeAlias(typeName, unionMembers)); + if (!typeInfo.possibleTypes || typeInfo.possibleTypes.length === 0) continue; + + const unionType = t.tsUnionType( + typeInfo.possibleTypes.map((pt) => t.tsTypeReference(t.identifier(pt))) + ); + const typeAlias = t.tsTypeAliasDeclaration( + t.identifier(typeName), + null, + unionType + ); + statements.push(t.exportNamedDeclaration(typeAlias)); generatedTypes.add(typeName); } - return generatedTypes; + return { statements, generatedTypes }; } -// ============================================================================ -// Payload/Return OBJECT Types Generator -// ============================================================================ - export interface PayloadTypesResult { + statements: t.Statement[]; generatedTypes: Set; referencedTableTypes: Set; } -/** - * Collect return types from Query and Mutation root types - * This dynamically discovers what OBJECT types need to be generated - * based on actual schema structure, not pattern matching - */ function collectReturnTypesFromRootTypes( typeRegistry: TypeRegistry, tableTypeNames: Set ): Set { const returnTypes = new Set(); - // Get Query and Mutation root types const queryType = typeRegistry.get('Query'); const mutationType = typeRegistry.get('Mutation'); @@ -343,43 +250,26 @@ function collectReturnTypesFromRootTypes( return returnTypes; } -/** - * Add Payload OBJECT types to source file - * These are return types from mutations (e.g., LoginPayload, BootstrapUserPayload) - * - * Also tracks which table entity types are referenced so they can be imported. - * - * Uses dynamic type discovery from Query/Mutation return types instead of pattern matching. - */ -function addPayloadObjectTypes( - sourceFile: SourceFile, +function generatePayloadObjectTypes( typeRegistry: TypeRegistry, tableTypeNames: Set, alreadyGenerated: Set ): PayloadTypesResult { + const statements: t.Statement[] = []; const generatedTypes = new Set(alreadyGenerated); const referencedTableTypes = new Set(); - // Dynamically collect return types from Query and Mutation const typesToGenerate = collectReturnTypesFromRootTypes( typeRegistry, tableTypeNames ); - // Filter out already generated types for (const typeName of Array.from(typesToGenerate)) { if (generatedTypes.has(typeName)) { typesToGenerate.delete(typeName); } } - if (typesToGenerate.size === 0) { - return { generatedTypes, referencedTableTypes }; - } - - addSectionComment(sourceFile, 'Payload/Return Object Types'); - - // Process all types - no artificial limit while (typesToGenerate.size > 0) { const typeNameResult = typesToGenerate.values().next(); if (typeNameResult.done) break; @@ -393,31 +283,30 @@ function addPayloadObjectTypes( generatedTypes.add(typeName); - if (typeInfo.fields && typeInfo.fields.length > 0) { - const properties: InterfaceProperty[] = []; + const properties: t.TSPropertySignature[] = []; + if (typeInfo.fields && typeInfo.fields.length > 0) { for (const field of typeInfo.fields) { const baseType = getTypeBaseName(field.type); - // Skip Query and Mutation fields if (baseType === 'Query' || baseType === 'Mutation') continue; const tsType = typeRefToTs(field.type); const isNullable = !isRequired(field.type); - properties.push({ - name: field.name, - type: isNullable ? `${tsType} | null` : tsType, - optional: isNullable, - docs: field.description ? [field.description] : undefined, - }); + const finalType = isNullable ? `${tsType} | null` : tsType; + + const prop = t.tsPropertySignature( + t.identifier(field.name), + t.tsTypeAnnotation(t.tsTypeReference(t.identifier(finalType))) + ); + prop.optional = isNullable; + properties.push(prop); - // Track table entity types that are referenced if (baseType && tableTypeNames.has(baseType)) { referencedTableTypes.add(baseType); } - // Follow nested OBJECT types that aren't table types if ( baseType && !generatedTypes.has(baseType) && @@ -429,94 +318,78 @@ function addPayloadObjectTypes( } } } - - sourceFile.addInterface(createInterface(typeName, properties)); - } else { - // Empty payload object - sourceFile.addInterface(createInterface(typeName, [])); } + + const interfaceDecl = t.tsInterfaceDeclaration( + t.identifier(typeName), + null, + null, + t.tsInterfaceBody(properties) + ); + statements.push(t.exportNamedDeclaration(interfaceDecl)); } - return { generatedTypes, referencedTableTypes }; + return { statements, generatedTypes, referencedTableTypes }; } -// ============================================================================ -// Main Generator -// ============================================================================ - -/** - * Generate comprehensive schema-types.ts file using ts-morph AST - * - * This generates all Input/Payload/Enum types from the TypeRegistry - * that are needed by custom mutation/query hooks. - */ export function generateSchemaTypesFile( options: GenerateSchemaTypesOptions ): GeneratedSchemaTypesFile { const { typeRegistry, tableTypeNames } = options; - const project = createProject(); - const sourceFile = createSourceFile(project, 'schema-types.ts'); - - // Add file header - sourceFile.insertText( - 0, - createFileHeader('GraphQL schema types for custom operations') + '\n' - ); - - // Track all generated types + const allStatements: t.Statement[] = []; let generatedTypes = new Set(); - // 1. Generate ENUM types - const enumTypes = addEnumTypes(sourceFile, typeRegistry, tableTypeNames); - generatedTypes = new Set([...generatedTypes, ...enumTypes]); + const enumResult = generateEnumTypes(typeRegistry, tableTypeNames); + generatedTypes = new Set([...generatedTypes, ...enumResult.generatedTypes]); - // 2. Generate UNION types - const unionTypes = addUnionTypes( - sourceFile, + const unionResult = generateUnionTypes( typeRegistry, tableTypeNames, generatedTypes ); - generatedTypes = new Set([...generatedTypes, ...unionTypes]); + generatedTypes = new Set([...generatedTypes, ...unionResult.generatedTypes]); - // 3. Generate INPUT_OBJECT types - const inputTypes = addInputObjectTypes( - sourceFile, + const inputResult = generateInputObjectTypes( typeRegistry, tableTypeNames, generatedTypes ); - generatedTypes = new Set([...generatedTypes, ...inputTypes]); + generatedTypes = new Set([...generatedTypes, ...inputResult.generatedTypes]); - // 4. Generate Payload OBJECT types - const payloadResult = addPayloadObjectTypes( - sourceFile, + const payloadResult = generatePayloadObjectTypes( typeRegistry, tableTypeNames, generatedTypes ); - // 5. Add imports from types.ts (table entity types + base filter types) const referencedTableTypes = Array.from( payloadResult.referencedTableTypes ).sort(); - // Always import base filter types since generated Filter interfaces reference them const baseFilterImports = Array.from(BASE_FILTER_TYPE_NAMES).sort(); const allTypesImports = [...referencedTableTypes, ...baseFilterImports]; if (allTypesImports.length > 0) { - // Insert import after the file header comment - const importStatement = `import type { ${allTypesImports.join(', ')} } from './types';\n\n`; - // Find position after header (after first */ + newlines) - const headerEndIndex = sourceFile.getFullText().indexOf('*/') + 3; - sourceFile.insertText(headerEndIndex, '\n' + importStatement); + const typesImport = t.importDeclaration( + allTypesImports.map((ti) => t.importSpecifier(t.identifier(ti), t.identifier(ti))), + t.stringLiteral('./types') + ); + typesImport.importKind = 'type'; + allStatements.push(typesImport); } + allStatements.push(...enumResult.statements); + allStatements.push(...unionResult.statements); + allStatements.push(...inputResult.statements); + allStatements.push(...payloadResult.statements); + + const code = generateCode(allStatements); + const content = getGeneratedFileHeader('GraphQL schema types for custom operations') + '\n\n' + code; + return { fileName: 'schema-types.ts', - content: getMinimalFormattedOutput(sourceFile), - generatedEnums: Array.from(enumTypes).sort(), + content, + generatedEnums: Array.from(enumResult.generatedTypes).sort(), referencedTableTypes, }; } diff --git a/graphql/codegen/src/cli/codegen/ts-ast.ts b/graphql/codegen/src/cli/codegen/ts-ast.ts deleted file mode 100644 index 358f4447d..000000000 --- a/graphql/codegen/src/cli/codegen/ts-ast.ts +++ /dev/null @@ -1,390 +0,0 @@ -/** - * TypeScript AST builders using ts-morph - * - * Provides utilities for generating TypeScript code via AST manipulation - * instead of string concatenation. - */ -import { - Project, - SourceFile, - StructureKind, - VariableDeclarationKind, - ScriptTarget, - ModuleKind, - type InterfaceDeclarationStructure, - type PropertySignatureStructure, - type FunctionDeclarationStructure, - type VariableStatementStructure, - type ImportDeclarationStructure, - type TypeAliasDeclarationStructure, -} from 'ts-morph'; - -// ============================================================================ -// Project management -// ============================================================================ - -/** - * Create a new ts-morph project for code generation - */ -export function createProject(): Project { - return new Project({ - useInMemoryFileSystem: true, - compilerOptions: { - declaration: true, - strict: true, - target: ScriptTarget.ESNext, - module: ModuleKind.ESNext, - }, - }); -} - -/** - * Create a source file in the project - */ -export function createSourceFile(project: Project, fileName: string): SourceFile { - return project.createSourceFile(fileName, '', { overwrite: true }); -} - -/** - * Get formatted output from source file - */ -export function getFormattedOutput(sourceFile: SourceFile): string { - sourceFile.formatText({ - indentSize: 2, - convertTabsToSpaces: true, - }); - return sourceFile.getFullText(); -} - -/** - * Get output with minimal formatting (preserves intentional blank lines) - * Post-processes to fix indentation and section comment spacing - * - * ts-morph generates type alias bodies with extra indentation: - * - Properties get 6 spaces (we want 2) - * - Closing brace gets 4 spaces (we want 0) - * - * For interfaces it uses 4 spaces which we convert to 2. - */ -export function getMinimalFormattedOutput(sourceFile: SourceFile): string { - let text = sourceFile.getFullText(); - - // Process each line to fix indentation - // ts-morph uses inconsistent indentation for type alias bodies - // We halve all indentation: 4->2, 6->3 (rounds to 2), 8->4, etc. - text = text.split('\n').map(line => { - // Match leading whitespace - const match = line.match(/^(\s*)/); - if (!match) return line; - - const spaces = match[1].length; - const content = line.slice(spaces); - - // Skip empty lines - if (content === '') return line; - - // No indentation - keep as-is - if (spaces === 0) return line; - - // Halve the indentation (minimum 0) - const newSpaces = Math.floor(spaces / 2); - return ' '.repeat(newSpaces) + content; - }).join('\n'); - - // Ensure blank line after section comment blocks - text = text.replace( - /(\/\/ =+\n\/\/ .+\n\/\/ =+)\n(export|\/\/)/g, - '$1\n\n$2' - ); - - // Add blank line between consecutive export declarations (type aliases, interfaces) - // Pattern: "}\nexport" or ";\nexport" should become "}\n\nexport" or ";\n\nexport" - text = text.replace(/(\}|\;)\n(export )/g, '$1\n\n$2'); - - // Remove trailing extra blank lines at end of file - text = text.replace(/\n\n+$/, '\n'); - - return text; -} - -// ============================================================================ -// Comment helpers -// ============================================================================ - -/** - * Create a file header comment - */ -export function createFileHeader(description: string): string { - return [ - '/**', - ` * ${description}`, - ' * @generated by @constructive-io/graphql-codegen', - ' * DO NOT EDIT - changes will be overwritten', - ' */', - ].join('\n'); -} - -/** - * Create JSDoc comment for a declaration - */ -export function createJsDoc(lines: string[]): string { - if (lines.length === 1) { - return `/** ${lines[0]} */`; - } - return ['/**', ...lines.map((l) => ` * ${l}`), ' */'].join('\n'); -} - -// ============================================================================ -// Import builders -// ============================================================================ - -export interface ImportSpec { - moduleSpecifier: string; - namedImports?: string[]; - typeOnlyNamedImports?: string[]; - defaultImport?: string; -} - -/** - * Create import declaration structure - */ -export function createImport(spec: ImportSpec): ImportDeclarationStructure { - const namedImports: Array<{ name: string; isTypeOnly?: boolean }> = []; - - if (spec.namedImports) { - namedImports.push(...spec.namedImports.map((name) => ({ name }))); - } - - if (spec.typeOnlyNamedImports) { - namedImports.push( - ...spec.typeOnlyNamedImports.map((name) => ({ name, isTypeOnly: true })) - ); - } - - return { - kind: StructureKind.ImportDeclaration, - moduleSpecifier: spec.moduleSpecifier, - defaultImport: spec.defaultImport, - namedImports: namedImports.length > 0 ? namedImports : undefined, - }; -} - -// ============================================================================ -// Interface builders -// ============================================================================ - -export interface InterfaceProperty { - name: string; - type: string; - optional?: boolean; - docs?: string[]; -} - -/** - * Create interface declaration structure - */ -export function createInterface( - name: string, - properties: InterfaceProperty[], - options?: { - docs?: string[]; - isExported?: boolean; - extends?: string[]; - } -): InterfaceDeclarationStructure { - return { - kind: StructureKind.Interface, - name, - isExported: options?.isExported ?? true, - extends: options?.extends, - docs: options?.docs ? [{ description: options.docs.join('\n') }] : undefined, - properties: properties.map( - (prop): PropertySignatureStructure => ({ - kind: StructureKind.PropertySignature, - name: prop.name, - type: prop.type, - hasQuestionToken: prop.optional, - docs: prop.docs ? [{ description: prop.docs.join('\n') }] : undefined, - }) - ), - }; -} - -/** - * Create filter interface with standard PostGraphile operators - */ -export function createFilterInterface( - name: string, - fieldFilters: Array<{ fieldName: string; filterType: string }>, - options?: { isExported?: boolean } -): InterfaceDeclarationStructure { - const properties: InterfaceProperty[] = [ - ...fieldFilters.map((f) => ({ - name: f.fieldName, - type: f.filterType, - optional: true, - })), - { name: 'and', type: `${name}[]`, optional: true, docs: ['Logical AND'] }, - { name: 'or', type: `${name}[]`, optional: true, docs: ['Logical OR'] }, - { name: 'not', type: name, optional: true, docs: ['Logical NOT'] }, - ]; - - return createInterface(name, properties, { isExported: options?.isExported ?? true }); -} - -// ============================================================================ -// Type alias builders -// ============================================================================ - -/** - * Create type alias declaration structure - */ -export function createTypeAlias( - name: string, - type: string, - options?: { - docs?: string[]; - isExported?: boolean; - } -): TypeAliasDeclarationStructure { - return { - kind: StructureKind.TypeAlias, - name, - type, - isExported: options?.isExported ?? true, - docs: options?.docs ? [{ description: options.docs.join('\n') }] : undefined, - }; -} - -/** - * Create union type from string literals - */ -export function createUnionType(values: string[]): string { - return values.map((v) => `'${v}'`).join(' | '); -} - -// ============================================================================ -// Variable/constant builders -// ============================================================================ - -/** - * Create const variable statement structure - */ -export function createConst( - name: string, - initializer: string, - options?: { - docs?: string[]; - isExported?: boolean; - type?: string; - } -): VariableStatementStructure { - return { - kind: StructureKind.VariableStatement, - declarationKind: VariableDeclarationKind.Const, - isExported: options?.isExported ?? true, - docs: options?.docs ? [{ description: options.docs.join('\n') }] : undefined, - declarations: [ - { - name, - type: options?.type, - initializer, - }, - ], - }; -} - -/** - * Create a template literal string (for GraphQL documents) - */ -export function createTemplateLiteral(content: string): string { - return '`\n' + content + '\n`'; -} - -// ============================================================================ -// Function builders -// ============================================================================ - -export interface FunctionParameter { - name: string; - type: string; - optional?: boolean; - initializer?: string; -} - -/** - * Create function declaration structure - */ -export function createFunction( - name: string, - parameters: FunctionParameter[], - returnType: string, - body: string, - options?: { - docs?: string[]; - isExported?: boolean; - isAsync?: boolean; - } -): FunctionDeclarationStructure { - return { - kind: StructureKind.Function, - name, - isExported: options?.isExported ?? true, - isAsync: options?.isAsync, - parameters: parameters.map((p) => ({ - name: p.name, - type: p.type, - hasQuestionToken: p.optional, - initializer: p.initializer, - })), - returnType, - statements: body, - }; -} - -// ============================================================================ -// Export builders -// ============================================================================ - -/** - * Create re-export statement - */ -export function createReExport( - names: string[], - moduleSpecifier: string, - isTypeOnly: boolean = false -): string { - const typePrefix = isTypeOnly ? 'type ' : ''; - return `export ${typePrefix}{ ${names.join(', ')} } from '${moduleSpecifier}';`; -} - -/** - * Create barrel export statement - */ -export function createBarrelExport(moduleSpecifier: string): string { - return `export * from '${moduleSpecifier}';`; -} - -// ============================================================================ -// Section comment helpers -// ============================================================================ - -/** - * Create a section divider comment for generated code - */ -export function createSectionComment(title: string): string { - return [ - '// ============================================================================', - `// ${title}`, - '// ============================================================================', - ].join('\n'); -} - -/** - * Add a section comment to source file with proper spacing - */ -export function addSectionComment(sourceFile: SourceFile, title: string): void { - sourceFile.addStatements(`\n${createSectionComment(title)}\n\n`); -} - - diff --git a/graphql/codegen/src/cli/codegen/type-resolver.ts b/graphql/codegen/src/cli/codegen/type-resolver.ts index cc8a213c1..f358cff12 100644 --- a/graphql/codegen/src/cli/codegen/type-resolver.ts +++ b/graphql/codegen/src/cli/codegen/type-resolver.ts @@ -9,7 +9,6 @@ import type { CleanArgument, CleanObjectField, } from '../../types/schema'; -import type { InterfaceProperty } from './ts-ast'; import { scalarToTsType as resolveScalarToTs, SCALAR_NAMES } from './scalars'; // ============================================================================ @@ -214,60 +213,6 @@ export function getBaseTypeKind(typeRef: CleanTypeRef): CleanTypeRef['kind'] { return typeRef.kind; } -// ============================================================================ -// Interface Property Generation -// ============================================================================ - -/** - * Convert CleanArgument to InterfaceProperty for ts-morph - * - * @param arg - The GraphQL argument - * @param tracker - Optional TypeTracker to collect referenced types - */ -export function argumentToInterfaceProperty(arg: CleanArgument, tracker?: TypeTracker): InterfaceProperty { - return { - name: arg.name, - type: typeRefToTsType(arg.type, tracker), - optional: !isTypeRequired(arg.type), - docs: arg.description ? [arg.description] : undefined, - }; -} - -/** - * Convert CleanObjectField to InterfaceProperty for ts-morph - * - * @param field - The GraphQL object field - * @param tracker - Optional TypeTracker to collect referenced types - */ -export function fieldToInterfaceProperty(field: CleanObjectField, tracker?: TypeTracker): InterfaceProperty { - return { - name: field.name, - type: typeRefToNullableTsType(field.type, tracker), - optional: false, // Fields are always present, just potentially null - docs: field.description ? [field.description] : undefined, - }; -} - -/** - * Convert an array of CleanArguments to InterfaceProperty array - * - * @param args - The GraphQL arguments - * @param tracker - Optional TypeTracker to collect referenced types - */ -export function argumentsToInterfaceProperties(args: CleanArgument[], tracker?: TypeTracker): InterfaceProperty[] { - return args.map((arg) => argumentToInterfaceProperty(arg, tracker)); -} - -/** - * Convert an array of CleanObjectFields to InterfaceProperty array - * - * @param fields - The GraphQL object fields - * @param tracker - Optional TypeTracker to collect referenced types - */ -export function fieldsToInterfaceProperties(fields: CleanObjectField[], tracker?: TypeTracker): InterfaceProperty[] { - return fields.map((field) => fieldToInterfaceProperty(field, tracker)); -} - // ============================================================================ // Type Filtering // ============================================================================ diff --git a/graphql/codegen/src/cli/codegen/types.ts b/graphql/codegen/src/cli/codegen/types.ts index cec801dd6..4491ed972 100644 --- a/graphql/codegen/src/cli/codegen/types.ts +++ b/graphql/codegen/src/cli/codegen/types.ts @@ -1,17 +1,16 @@ /** - * Types generator - generates types.ts with entity interfaces using AST + * Types generator - generates types.ts with entity interfaces using Babel AST */ import type { CleanTable } from '../../types/schema'; -import { - createProject, - createSourceFile, - getFormattedOutput, - createFileHeader, - createImport, - createInterface, - type InterfaceProperty, -} from './ts-ast'; -import { getScalarFields, fieldTypeToTs } from './utils'; +import * as t from '@babel/types'; +import { generateCode } from './babel-ast'; +import { getScalarFields, fieldTypeToTs, getGeneratedFileHeader } from './utils'; + +interface InterfaceProperty { + name: string; + type: string; + optional?: boolean; +} // ============================================================================ // Filter Types Configuration @@ -155,6 +154,48 @@ export interface GenerateTypesOptions { enumsFromSchemaTypes?: string[]; } +function parseTypeAnnotation(typeStr: string): t.TSType { + if (typeStr === 'string') return t.tsStringKeyword(); + if (typeStr === 'number') return t.tsNumberKeyword(); + if (typeStr === 'boolean') return t.tsBooleanKeyword(); + if (typeStr === 'unknown') return t.tsUnknownKeyword(); + + if (typeStr.includes(' | ')) { + const parts = typeStr.split(' | ').map((p) => parseTypeAnnotation(p.trim())); + return t.tsUnionType(parts); + } + + if (typeStr.endsWith('[]')) { + return t.tsArrayType(parseTypeAnnotation(typeStr.slice(0, -2))); + } + + if (typeStr === 'null') return t.tsNullKeyword(); + + return t.tsTypeReference(t.identifier(typeStr)); +} + +function createInterfaceDeclaration( + name: string, + properties: InterfaceProperty[] +): t.ExportNamedDeclaration { + const props = properties.map((prop) => { + const propSig = t.tsPropertySignature( + t.identifier(prop.name), + t.tsTypeAnnotation(parseTypeAnnotation(prop.type)) + ); + propSig.optional = prop.optional ?? false; + return propSig; + }); + + const interfaceDecl = t.tsInterfaceDeclaration( + t.identifier(name), + null, + null, + t.tsInterfaceBody(props) + ); + return t.exportNamedDeclaration(interfaceDecl); +} + /** * Generate types.ts content with all entity interfaces and base filter types */ @@ -165,11 +206,7 @@ export function generateTypesFile( const { enumsFromSchemaTypes = [] } = options; const enumSet = new Set(enumsFromSchemaTypes); - const project = createProject(); - const sourceFile = createSourceFile(project, 'types.ts'); - - // Add file header - sourceFile.insertText(0, createFileHeader('Entity types and filter types') + '\n\n'); + const statements: t.Statement[] = []; // Collect which enums are actually used by entity fields const usedEnums = new Set(); @@ -186,20 +223,14 @@ export function generateTypesFile( // Add import for enum types from schema-types if any are used if (usedEnums.size > 0) { - sourceFile.addImportDeclaration( - createImport({ - moduleSpecifier: './schema-types', - typeOnlyNamedImports: Array.from(usedEnums).sort(), - }) - ); - sourceFile.addStatements(''); + const specifiers = Array.from(usedEnums) + .sort() + .map((name) => t.importSpecifier(t.identifier(name), t.identifier(name))); + const importDecl = t.importDeclaration(specifiers, t.stringLiteral('./schema-types')); + importDecl.importKind = 'type'; + statements.push(importDecl); } - // Add section comment for entity types - sourceFile.addStatements('// ============================================================================'); - sourceFile.addStatements('// Entity types'); - sourceFile.addStatements('// ============================================================================\n'); - // Generate entity interfaces for (const table of tables) { const scalarFields = getScalarFields(table); @@ -209,18 +240,16 @@ export function generateTypesFile( type: `${fieldTypeToTs(field.type)} | null`, })); - sourceFile.addInterface(createInterface(table.name, properties)); + statements.push(createInterfaceDeclaration(table.name, properties)); } - // Add section comment for filter types - sourceFile.addStatements('\n// ============================================================================'); - sourceFile.addStatements('// Filter types (shared PostGraphile filter interfaces)'); - sourceFile.addStatements('// ============================================================================\n'); - // Generate all filter types for (const { name, tsType, operators } of FILTER_CONFIGS) { - sourceFile.addInterface(createInterface(name, buildFilterProperties(tsType, operators))); + statements.push(createInterfaceDeclaration(name, buildFilterProperties(tsType, operators))); } - return getFormattedOutput(sourceFile); + const header = getGeneratedFileHeader('Entity types and filter types'); + const code = generateCode(statements); + + return header + '\n' + code; } diff --git a/graphql/codegen/src/types/config.ts b/graphql/codegen/src/types/config.ts index 412c39af0..68da99efb 100644 --- a/graphql/codegen/src/types/config.ts +++ b/graphql/codegen/src/types/config.ts @@ -2,6 +2,67 @@ * SDK Configuration types */ +/** + * Entity relationship definition for cascade invalidation + */ +export interface EntityRelationship { + /** Parent entity name (e.g., 'database' for a table) */ + parent: string; + /** Foreign key field name that references the parent (e.g., 'databaseId') */ + foreignKey: string; + /** Optional transitive ancestors for deep invalidation (e.g., ['database', 'organization']) */ + ancestors?: string[]; +} + +/** + * Query key generation configuration + */ +export interface QueryKeyConfig { + /** + * Key structure style + * - 'flat': Simple ['entity', 'scope', data] structure + * - 'hierarchical': Nested factory pattern with scope support (lukemorales-style) + * @default 'hierarchical' + */ + style?: 'flat' | 'hierarchical'; + + /** + * Define entity relationships for cascade invalidation and scoped keys + * Key: child entity name (lowercase), Value: relationship definition + * + * @example + * ```ts + * relationships: { + * database: { parent: 'organization', foreignKey: 'organizationId' }, + * table: { parent: 'database', foreignKey: 'databaseId', ancestors: ['organization'] }, + * field: { parent: 'table', foreignKey: 'tableId', ancestors: ['database', 'organization'] }, + * } + * ``` + */ + relationships?: Record; + + /** + * Generate scope-aware query keys for entities with relationships + * When true, keys include optional scope parameters for hierarchical invalidation + * @default true + */ + generateScopedKeys?: boolean; + + /** + * Generate cascade invalidation helpers + * Creates helpers that invalidate parent entities and all their children + * @default true + */ + generateCascadeHelpers?: boolean; + + /** + * Generate mutation keys for tracking in-flight mutations + * Useful for optimistic updates and mutation deduplication + * @default true + */ + generateMutationKeys?: boolean; +} + /** * Main configuration for graphql-codegen */ @@ -127,6 +188,12 @@ export interface GraphQLSDKConfig { enabled?: boolean; }; + /** + * Query key generation configuration + * Controls how query keys are structured for cache management + */ + queryKeys?: QueryKeyConfig; + /** * Watch mode configuration (dev-only feature) * When enabled via CLI --watch flag, the CLI will poll the endpoint for schema changes @@ -177,6 +244,17 @@ export interface ResolvedWatchConfig { clearScreen: boolean; } +/** + * Resolved query key configuration with defaults applied + */ +export interface ResolvedQueryKeyConfig { + style: 'flat' | 'hierarchical'; + relationships: Record; + generateScopedKeys: boolean; + generateCascadeHelpers: boolean; + generateMutationKeys: boolean; +} + /** * Resolved configuration with defaults applied */ @@ -223,6 +301,7 @@ export interface ResolvedConfig { reactQuery: { enabled: boolean; }; + queryKeys: ResolvedQueryKeyConfig; watch: ResolvedWatchConfig; } @@ -236,6 +315,17 @@ export const DEFAULT_WATCH_CONFIG: ResolvedWatchConfig = { clearScreen: true, }; +/** + * Default query key configuration values + */ +export const DEFAULT_QUERY_KEY_CONFIG: ResolvedQueryKeyConfig = { + style: 'hierarchical', + relationships: {}, + generateScopedKeys: true, + generateCascadeHelpers: true, + generateMutationKeys: true, +}; + /** * Default configuration values */ @@ -271,6 +361,7 @@ export const DEFAULT_CONFIG: Omit = { reactQuery: { enabled: true, // React Query hooks enabled by default for generate command }, + queryKeys: DEFAULT_QUERY_KEY_CONFIG, watch: DEFAULT_WATCH_CONFIG, }; @@ -336,6 +427,13 @@ export function resolveConfig(config: GraphQLSDKConfig): ResolvedConfig { reactQuery: { enabled: config.reactQuery?.enabled ?? DEFAULT_CONFIG.reactQuery.enabled, }, + queryKeys: { + style: config.queryKeys?.style ?? DEFAULT_QUERY_KEY_CONFIG.style, + relationships: config.queryKeys?.relationships ?? DEFAULT_QUERY_KEY_CONFIG.relationships, + generateScopedKeys: config.queryKeys?.generateScopedKeys ?? DEFAULT_QUERY_KEY_CONFIG.generateScopedKeys, + generateCascadeHelpers: config.queryKeys?.generateCascadeHelpers ?? DEFAULT_QUERY_KEY_CONFIG.generateCascadeHelpers, + generateMutationKeys: config.queryKeys?.generateMutationKeys ?? DEFAULT_QUERY_KEY_CONFIG.generateMutationKeys, + }, watch: { pollInterval: config.watch?.pollInterval ?? DEFAULT_WATCH_CONFIG.pollInterval, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b5aec3b24..4f0ad85be 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,6 +7,7 @@ settings: packageExtensionsChecksum: sha256-x8B4zkJ4KLRX+yspUWxuggXWlz6zrBLSIh72pNhpPiE= importers: + .: devDependencies: '@jest/test-sequencer': @@ -695,6 +696,12 @@ importers: graphql/codegen: dependencies: + '@babel/generator': + specifier: ^7.28.5 + version: 7.28.5 + '@babel/types': + specifier: ^7.28.5 + version: 7.28.5 ajv: specifier: ^8.17.1 version: 8.17.1 @@ -716,13 +723,13 @@ importers: prettier: specifier: ^3.7.4 version: 3.7.4 - ts-morph: - specifier: ^27.0.2 - version: 27.0.2 devDependencies: '@tanstack/react-query': specifier: ^5.90.16 version: 5.90.16(react@19.2.3) + '@types/babel__generator': + specifier: ^7.27.0 + version: 7.27.0 '@types/jest': specifier: ^29.5.14 version: 29.5.14 @@ -2107,287 +2114,165 @@ importers: publishDirectory: dist packages: + 12factor-env@0.1.0: - resolution: - { - integrity: sha512-4SaHhlxwOSizIK5P/14r7V7HxcHmip1fpX2HEToV7NpLWVDkI+eb+nskkq5F0XzC5bq2vhzpIAHQwZVeEibZLg==, - } + resolution: {integrity: sha512-4SaHhlxwOSizIK5P/14r7V7HxcHmip1fpX2HEToV7NpLWVDkI+eb+nskkq5F0XzC5bq2vhzpIAHQwZVeEibZLg==} '@aws-crypto/crc32@5.2.0': - resolution: - { - integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==, - } - engines: { node: '>=16.0.0' } + resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} + engines: {node: '>=16.0.0'} '@aws-crypto/crc32c@5.2.0': - resolution: - { - integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==, - } + resolution: {integrity: sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==} '@aws-crypto/sha1-browser@5.2.0': - resolution: - { - integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==, - } + resolution: {integrity: sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==} '@aws-crypto/sha256-browser@5.2.0': - resolution: - { - integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==, - } + 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' } + 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==, - } + resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} '@aws-crypto/util@5.2.0': - resolution: - { - integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==, - } + resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} '@aws-sdk/client-s3@3.958.0': - resolution: - { - integrity: sha512-ol8Sw37AToBWb6PjRuT/Wu40SrrZSA0N4F7U3yTkjUNX0lirfO1VFLZ0hZtZplVJv8GNPITbiczxQ8VjxESXxg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-ol8Sw37AToBWb6PjRuT/Wu40SrrZSA0N4F7U3yTkjUNX0lirfO1VFLZ0hZtZplVJv8GNPITbiczxQ8VjxESXxg==} + engines: {node: '>=18.0.0'} '@aws-sdk/client-sso@3.958.0': - resolution: - { - integrity: sha512-6qNCIeaMzKzfqasy2nNRuYnMuaMebCcCPP4J2CVGkA8QYMbIVKPlkn9bpB20Vxe6H/r3jtCCLQaOJjVTx/6dXg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-6qNCIeaMzKzfqasy2nNRuYnMuaMebCcCPP4J2CVGkA8QYMbIVKPlkn9bpB20Vxe6H/r3jtCCLQaOJjVTx/6dXg==} + engines: {node: '>=18.0.0'} '@aws-sdk/core@3.957.0': - resolution: - { - integrity: sha512-DrZgDnF1lQZv75a52nFWs6MExihJF2GZB6ETZRqr6jMwhrk2kbJPUtvgbifwcL7AYmVqHQDJBrR/MqkwwFCpiw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-DrZgDnF1lQZv75a52nFWs6MExihJF2GZB6ETZRqr6jMwhrk2kbJPUtvgbifwcL7AYmVqHQDJBrR/MqkwwFCpiw==} + engines: {node: '>=18.0.0'} '@aws-sdk/crc64-nvme@3.957.0': - resolution: - { - integrity: sha512-qSwSfI+qBU9HDsd6/4fM9faCxYJx2yDuHtj+NVOQ6XYDWQzFab/hUdwuKZ77Pi6goLF1pBZhJ2azaC2w7LbnTA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-qSwSfI+qBU9HDsd6/4fM9faCxYJx2yDuHtj+NVOQ6XYDWQzFab/hUdwuKZ77Pi6goLF1pBZhJ2azaC2w7LbnTA==} + engines: {node: '>=18.0.0'} '@aws-sdk/credential-provider-env@3.957.0': - resolution: - { - integrity: sha512-475mkhGaWCr+Z52fOOVb/q2VHuNvqEDixlYIkeaO6xJ6t9qR0wpLt4hOQaR6zR1wfZV0SlE7d8RErdYq/PByog==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-475mkhGaWCr+Z52fOOVb/q2VHuNvqEDixlYIkeaO6xJ6t9qR0wpLt4hOQaR6zR1wfZV0SlE7d8RErdYq/PByog==} + engines: {node: '>=18.0.0'} '@aws-sdk/credential-provider-http@3.957.0': - resolution: - { - integrity: sha512-8dS55QHRxXgJlHkEYaCGZIhieCs9NU1HU1BcqQ4RfUdSsfRdxxktqUKgCnBnOOn0oD3PPA8cQOCAVgIyRb3Rfw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-8dS55QHRxXgJlHkEYaCGZIhieCs9NU1HU1BcqQ4RfUdSsfRdxxktqUKgCnBnOOn0oD3PPA8cQOCAVgIyRb3Rfw==} + engines: {node: '>=18.0.0'} '@aws-sdk/credential-provider-ini@3.958.0': - resolution: - { - integrity: sha512-u7twvZa1/6GWmPBZs6DbjlegCoNzNjBsMS/6fvh5quByYrcJr/uLd8YEr7S3UIq4kR/gSnHqcae7y2nL2bqZdg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-u7twvZa1/6GWmPBZs6DbjlegCoNzNjBsMS/6fvh5quByYrcJr/uLd8YEr7S3UIq4kR/gSnHqcae7y2nL2bqZdg==} + engines: {node: '>=18.0.0'} '@aws-sdk/credential-provider-login@3.958.0': - resolution: - { - integrity: sha512-sDwtDnBSszUIbzbOORGh5gmXGl9aK25+BHb4gb1aVlqB+nNL2+IUEJA62+CE55lXSH8qXF90paivjK8tOHTwPA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-sDwtDnBSszUIbzbOORGh5gmXGl9aK25+BHb4gb1aVlqB+nNL2+IUEJA62+CE55lXSH8qXF90paivjK8tOHTwPA==} + engines: {node: '>=18.0.0'} '@aws-sdk/credential-provider-node@3.958.0': - resolution: - { - integrity: sha512-vdoZbNG2dt66I7EpN3fKCzi6fp9xjIiwEA/vVVgqO4wXCGw8rKPIdDUus4e13VvTr330uQs2W0UNg/7AgtquEQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-vdoZbNG2dt66I7EpN3fKCzi6fp9xjIiwEA/vVVgqO4wXCGw8rKPIdDUus4e13VvTr330uQs2W0UNg/7AgtquEQ==} + engines: {node: '>=18.0.0'} '@aws-sdk/credential-provider-process@3.957.0': - resolution: - { - integrity: sha512-/KIz9kadwbeLy6SKvT79W81Y+hb/8LMDyeloA2zhouE28hmne+hLn0wNCQXAAupFFlYOAtZR2NTBs7HBAReJlg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-/KIz9kadwbeLy6SKvT79W81Y+hb/8LMDyeloA2zhouE28hmne+hLn0wNCQXAAupFFlYOAtZR2NTBs7HBAReJlg==} + engines: {node: '>=18.0.0'} '@aws-sdk/credential-provider-sso@3.958.0': - resolution: - { - integrity: sha512-CBYHJ5ufp8HC4q+o7IJejCUctJXWaksgpmoFpXerbjAso7/Fg7LLUu9inXVOxlHKLlvYekDXjIUBXDJS2WYdgg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-CBYHJ5ufp8HC4q+o7IJejCUctJXWaksgpmoFpXerbjAso7/Fg7LLUu9inXVOxlHKLlvYekDXjIUBXDJS2WYdgg==} + engines: {node: '>=18.0.0'} '@aws-sdk/credential-provider-web-identity@3.958.0': - resolution: - { - integrity: sha512-dgnvwjMq5Y66WozzUzxNkCFap+umHUtqMMKlr8z/vl9NYMLem/WUbWNpFFOVFWquXikc+ewtpBMR4KEDXfZ+KA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-dgnvwjMq5Y66WozzUzxNkCFap+umHUtqMMKlr8z/vl9NYMLem/WUbWNpFFOVFWquXikc+ewtpBMR4KEDXfZ+KA==} + engines: {node: '>=18.0.0'} '@aws-sdk/lib-storage@3.958.0': - resolution: - { - integrity: sha512-cd8CTiJ165ep2DKTc2PHHhVCxDn3byv10BXMGn+lkDY3KwMoatcgZ1uhFWCBuJvsCUnSExqGouJN/Q0qgjkWtg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-cd8CTiJ165ep2DKTc2PHHhVCxDn3byv10BXMGn+lkDY3KwMoatcgZ1uhFWCBuJvsCUnSExqGouJN/Q0qgjkWtg==} + engines: {node: '>=18.0.0'} peerDependencies: '@aws-sdk/client-s3': ^3.958.0 '@aws-sdk/middleware-bucket-endpoint@3.957.0': - resolution: - { - integrity: sha512-iczcn/QRIBSpvsdAS/rbzmoBpleX1JBjXvCynMbDceVLBIcVrwT1hXECrhtIC2cjh4HaLo9ClAbiOiWuqt+6MA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-iczcn/QRIBSpvsdAS/rbzmoBpleX1JBjXvCynMbDceVLBIcVrwT1hXECrhtIC2cjh4HaLo9ClAbiOiWuqt+6MA==} + engines: {node: '>=18.0.0'} '@aws-sdk/middleware-expect-continue@3.957.0': - resolution: - { - integrity: sha512-AlbK3OeVNwZZil0wlClgeI/ISlOt/SPUxBsIns876IFaVu/Pj3DgImnYhpcJuFRek4r4XM51xzIaGQXM6GDHGg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-AlbK3OeVNwZZil0wlClgeI/ISlOt/SPUxBsIns876IFaVu/Pj3DgImnYhpcJuFRek4r4XM51xzIaGQXM6GDHGg==} + engines: {node: '>=18.0.0'} '@aws-sdk/middleware-flexible-checksums@3.957.0': - resolution: - { - integrity: sha512-iJpeVR5V8se1hl2pt+k8bF/e9JO4KWgPCMjg8BtRspNtKIUGy7j6msYvbDixaKZaF2Veg9+HoYcOhwnZumjXSA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-iJpeVR5V8se1hl2pt+k8bF/e9JO4KWgPCMjg8BtRspNtKIUGy7j6msYvbDixaKZaF2Veg9+HoYcOhwnZumjXSA==} + engines: {node: '>=18.0.0'} '@aws-sdk/middleware-host-header@3.957.0': - resolution: - { - integrity: sha512-BBgKawVyfQZglEkNTuBBdC3azlyqNXsvvN4jPkWAiNYcY0x1BasaJFl+7u/HisfULstryweJq/dAvIZIxzlZaA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-BBgKawVyfQZglEkNTuBBdC3azlyqNXsvvN4jPkWAiNYcY0x1BasaJFl+7u/HisfULstryweJq/dAvIZIxzlZaA==} + engines: {node: '>=18.0.0'} '@aws-sdk/middleware-location-constraint@3.957.0': - resolution: - { - integrity: sha512-y8/W7TOQpmDJg/fPYlqAhwA4+I15LrS7TwgUEoxogtkD8gfur9wFMRLT8LCyc9o4NMEcAnK50hSb4+wB0qv6tQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-y8/W7TOQpmDJg/fPYlqAhwA4+I15LrS7TwgUEoxogtkD8gfur9wFMRLT8LCyc9o4NMEcAnK50hSb4+wB0qv6tQ==} + engines: {node: '>=18.0.0'} '@aws-sdk/middleware-logger@3.957.0': - resolution: - { - integrity: sha512-w1qfKrSKHf9b5a8O76yQ1t69u6NWuBjr5kBX+jRWFx/5mu6RLpqERXRpVJxfosbep7k3B+DSB5tZMZ82GKcJtQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-w1qfKrSKHf9b5a8O76yQ1t69u6NWuBjr5kBX+jRWFx/5mu6RLpqERXRpVJxfosbep7k3B+DSB5tZMZ82GKcJtQ==} + engines: {node: '>=18.0.0'} '@aws-sdk/middleware-recursion-detection@3.957.0': - resolution: - { - integrity: sha512-D2H/WoxhAZNYX+IjkKTdOhOkWQaK0jjJrDBj56hKjU5c9ltQiaX/1PqJ4dfjHntEshJfu0w+E6XJ+/6A6ILBBA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-D2H/WoxhAZNYX+IjkKTdOhOkWQaK0jjJrDBj56hKjU5c9ltQiaX/1PqJ4dfjHntEshJfu0w+E6XJ+/6A6ILBBA==} + engines: {node: '>=18.0.0'} '@aws-sdk/middleware-sdk-s3@3.957.0': - resolution: - { - integrity: sha512-5B2qY2nR2LYpxoQP0xUum5A1UNvH2JQpLHDH1nWFNF/XetV7ipFHksMxPNhtJJ6ARaWhQIDXfOUj0jcnkJxXUg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-5B2qY2nR2LYpxoQP0xUum5A1UNvH2JQpLHDH1nWFNF/XetV7ipFHksMxPNhtJJ6ARaWhQIDXfOUj0jcnkJxXUg==} + engines: {node: '>=18.0.0'} '@aws-sdk/middleware-ssec@3.957.0': - resolution: - { - integrity: sha512-qwkmrK0lizdjNt5qxl4tHYfASh8DFpHXM1iDVo+qHe+zuslfMqQEGRkzxS8tJq/I+8F0c6v3IKOveKJAfIvfqQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-qwkmrK0lizdjNt5qxl4tHYfASh8DFpHXM1iDVo+qHe+zuslfMqQEGRkzxS8tJq/I+8F0c6v3IKOveKJAfIvfqQ==} + engines: {node: '>=18.0.0'} '@aws-sdk/middleware-user-agent@3.957.0': - resolution: - { - integrity: sha512-50vcHu96XakQnIvlKJ1UoltrFODjsq2KvtTgHiPFteUS884lQnK5VC/8xd1Msz/1ONpLMzdCVproCQqhDTtMPQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-50vcHu96XakQnIvlKJ1UoltrFODjsq2KvtTgHiPFteUS884lQnK5VC/8xd1Msz/1ONpLMzdCVproCQqhDTtMPQ==} + engines: {node: '>=18.0.0'} '@aws-sdk/nested-clients@3.958.0': - resolution: - { - integrity: sha512-/KuCcS8b5TpQXkYOrPLYytrgxBhv81+5pChkOlhegbeHttjM69pyUpQVJqyfDM/A7wPLnDrzCAnk4zaAOkY0Nw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-/KuCcS8b5TpQXkYOrPLYytrgxBhv81+5pChkOlhegbeHttjM69pyUpQVJqyfDM/A7wPLnDrzCAnk4zaAOkY0Nw==} + engines: {node: '>=18.0.0'} '@aws-sdk/region-config-resolver@3.957.0': - resolution: - { - integrity: sha512-V8iY3blh8l2iaOqXWW88HbkY5jDoWjH56jonprG/cpyqqCnprvpMUZWPWYJoI8rHRf2bqzZeql1slxG6EnKI7A==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-V8iY3blh8l2iaOqXWW88HbkY5jDoWjH56jonprG/cpyqqCnprvpMUZWPWYJoI8rHRf2bqzZeql1slxG6EnKI7A==} + engines: {node: '>=18.0.0'} '@aws-sdk/signature-v4-multi-region@3.957.0': - resolution: - { - integrity: sha512-t6UfP1xMUigMMzHcb7vaZcjv7dA2DQkk9C/OAP1dKyrE0vb4lFGDaTApi17GN6Km9zFxJthEMUbBc7DL0hq1Bg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-t6UfP1xMUigMMzHcb7vaZcjv7dA2DQkk9C/OAP1dKyrE0vb4lFGDaTApi17GN6Km9zFxJthEMUbBc7DL0hq1Bg==} + engines: {node: '>=18.0.0'} '@aws-sdk/token-providers@3.958.0': - resolution: - { - integrity: sha512-UCj7lQXODduD1myNJQkV+LYcGYJ9iiMggR8ow8Hva1g3A/Na5imNXzz6O67k7DAee0TYpy+gkNw+SizC6min8Q==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-UCj7lQXODduD1myNJQkV+LYcGYJ9iiMggR8ow8Hva1g3A/Na5imNXzz6O67k7DAee0TYpy+gkNw+SizC6min8Q==} + engines: {node: '>=18.0.0'} '@aws-sdk/types@3.957.0': - resolution: - { - integrity: sha512-wzWC2Nrt859ABk6UCAVY/WYEbAd7FjkdrQL6m24+tfmWYDNRByTJ9uOgU/kw9zqLCAwb//CPvrJdhqjTznWXAg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-wzWC2Nrt859ABk6UCAVY/WYEbAd7FjkdrQL6m24+tfmWYDNRByTJ9uOgU/kw9zqLCAwb//CPvrJdhqjTznWXAg==} + engines: {node: '>=18.0.0'} '@aws-sdk/util-arn-parser@3.957.0': - resolution: - { - integrity: sha512-Aj6m+AyrhWyg8YQ4LDPg2/gIfGHCEcoQdBt5DeSFogN5k9mmJPOJ+IAmNSWmWRjpOxEy6eY813RNDI6qS97M0g==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-Aj6m+AyrhWyg8YQ4LDPg2/gIfGHCEcoQdBt5DeSFogN5k9mmJPOJ+IAmNSWmWRjpOxEy6eY813RNDI6qS97M0g==} + engines: {node: '>=18.0.0'} '@aws-sdk/util-endpoints@3.957.0': - resolution: - { - integrity: sha512-xwF9K24mZSxcxKS3UKQFeX/dPYkEps9wF1b+MGON7EvnbcucrJGyQyK1v1xFPn1aqXkBTFi+SZaMRx5E5YCVFw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-xwF9K24mZSxcxKS3UKQFeX/dPYkEps9wF1b+MGON7EvnbcucrJGyQyK1v1xFPn1aqXkBTFi+SZaMRx5E5YCVFw==} + engines: {node: '>=18.0.0'} '@aws-sdk/util-locate-window@3.957.0': - resolution: - { - integrity: sha512-nhmgKHnNV9K+i9daumaIz8JTLsIIML9PE/HUks5liyrjUzenjW/aHoc7WJ9/Td/gPZtayxFnXQSJRb/fDlBuJw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-nhmgKHnNV9K+i9daumaIz8JTLsIIML9PE/HUks5liyrjUzenjW/aHoc7WJ9/Td/gPZtayxFnXQSJRb/fDlBuJw==} + engines: {node: '>=18.0.0'} '@aws-sdk/util-user-agent-browser@3.957.0': - resolution: - { - integrity: sha512-exueuwxef0lUJRnGaVkNSC674eAiWU07ORhxBnevFFZEKisln+09Qrtw823iyv5I1N8T+wKfh95xvtWQrNKNQw==, - } + resolution: {integrity: sha512-exueuwxef0lUJRnGaVkNSC674eAiWU07ORhxBnevFFZEKisln+09Qrtw823iyv5I1N8T+wKfh95xvtWQrNKNQw==} '@aws-sdk/util-user-agent-node@3.957.0': - resolution: - { - integrity: sha512-ycbYCwqXk4gJGp0Oxkzf2KBeeGBdTxz559D41NJP8FlzSej1Gh7Rk40Zo6AyTfsNWkrl/kVi1t937OIzC5t+9Q==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-ycbYCwqXk4gJGp0Oxkzf2KBeeGBdTxz559D41NJP8FlzSej1Gh7Rk40Zo6AyTfsNWkrl/kVi1t937OIzC5t+9Q==} + engines: {node: '>=18.0.0'} peerDependencies: aws-crt: '>=1.0.0' peerDependenciesMeta: @@ -2395,726 +2280,447 @@ packages: optional: true '@aws-sdk/xml-builder@3.957.0': - resolution: - { - integrity: sha512-Ai5iiQqS8kJ5PjzMhWcLKN0G2yasAkvpnPlq2EnqlIMdB48HsizElt62qcktdxp4neRMyGkFq4NzgmDbXnhRiA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-Ai5iiQqS8kJ5PjzMhWcLKN0G2yasAkvpnPlq2EnqlIMdB48HsizElt62qcktdxp4neRMyGkFq4NzgmDbXnhRiA==} + engines: {node: '>=18.0.0'} '@aws/lambda-invoke-store@0.2.2': - resolution: - { - integrity: sha512-C0NBLsIqzDIae8HFw9YIrIBsbc0xTiOtt7fAukGPnqQ/+zZNaq+4jhuccltK0QuWHBnNm/a6kLIRA6GFiM10eg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-C0NBLsIqzDIae8HFw9YIrIBsbc0xTiOtt7fAukGPnqQ/+zZNaq+4jhuccltK0QuWHBnNm/a6kLIRA6GFiM10eg==} + engines: {node: '>=18.0.0'} '@babel/code-frame@7.27.1': - resolution: - { - integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} '@babel/compat-data@7.28.5': - resolution: - { - integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} + engines: {node: '>=6.9.0'} '@babel/core@7.28.5': - resolution: - { - integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} + engines: {node: '>=6.9.0'} '@babel/generator@7.28.5': - resolution: - { - integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} + engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.27.3': - resolution: - { - integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} '@babel/helper-compilation-targets@7.27.2': - resolution: - { - integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} '@babel/helper-globals@7.28.0': - resolution: - { - integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} '@babel/helper-module-imports@7.27.1': - resolution: - { - integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} '@babel/helper-module-transforms@7.28.3': - resolution: - { - integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 '@babel/helper-plugin-utils@7.27.1': - resolution: - { - integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} '@babel/helper-string-parser@7.27.1': - resolution: - { - integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} '@babel/helper-validator-identifier@7.28.5': - resolution: - { - integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} '@babel/helper-validator-option@7.27.1': - resolution: - { - integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} '@babel/helpers@7.28.4': - resolution: - { - integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + engines: {node: '>=6.9.0'} '@babel/parser@7.28.5': - resolution: - { - integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} hasBin: true '@babel/plugin-syntax-async-generators@7.8.4': - resolution: - { - integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==, - } + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-bigint@7.8.3': - resolution: - { - integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==, - } + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-class-properties@7.12.13': - resolution: - { - integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==, - } + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-class-static-block@7.14.5': - resolution: - { - integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-import-attributes@7.27.1': - resolution: - { - integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-import-meta@7.10.4': - resolution: - { - integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, - } + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-json-strings@7.8.3': - resolution: - { - integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==, - } + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-jsx@7.27.1': - resolution: - { - integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-logical-assignment-operators@7.10.4': - resolution: - { - integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==, - } + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': - resolution: - { - integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==, - } + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-numeric-separator@7.10.4': - resolution: - { - integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==, - } + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-object-rest-spread@7.8.3': - resolution: - { - integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==, - } + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-optional-catch-binding@7.8.3': - resolution: - { - integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==, - } + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-optional-chaining@7.8.3': - resolution: - { - integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==, - } + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-private-property-in-object@7.14.5': - resolution: - { - integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-top-level-await@7.14.5': - resolution: - { - integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-syntax-typescript@7.27.1': - resolution: - { - integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/runtime-corejs3@7.28.4': - resolution: - { - integrity: sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ==} + engines: {node: '>=6.9.0'} '@babel/runtime@7.28.4': - resolution: - { - integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + engines: {node: '>=6.9.0'} '@babel/template@7.27.2': - resolution: - { - integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} '@babel/traverse@7.28.5': - resolution: - { - integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} + engines: {node: '>=6.9.0'} '@babel/types@7.28.5': - resolution: - { - integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@0.2.3': - resolution: - { - integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==, - } + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} '@cspotcode/source-map-support@0.8.1': - resolution: - { - integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} '@emnapi/core@1.7.1': - resolution: - { - integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==, - } + resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} '@emnapi/runtime@1.7.1': - resolution: - { - integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==, - } + resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} '@emnapi/wasi-threads@1.1.0': - resolution: - { - integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==, - } + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} '@emotion/is-prop-valid@1.4.0': - resolution: - { - integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==, - } + resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==} '@emotion/memoize@0.9.0': - resolution: - { - integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==, - } + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} '@emotion/stylis@0.8.5': - resolution: - { - integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==, - } + resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==} '@emotion/unitless@0.7.5': - resolution: - { - integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==, - } + resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} '@esbuild/aix-ppc64@0.27.2': - resolution: - { - integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] '@esbuild/android-arm64@0.27.2': - resolution: - { - integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} + engines: {node: '>=18'} cpu: [arm64] os: [android] '@esbuild/android-arm@0.27.2': - resolution: - { - integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} + engines: {node: '>=18'} cpu: [arm] os: [android] '@esbuild/android-x64@0.27.2': - resolution: - { - integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} + engines: {node: '>=18'} cpu: [x64] os: [android] '@esbuild/darwin-arm64@0.27.2': - resolution: - { - integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] '@esbuild/darwin-x64@0.27.2': - resolution: - { - integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] '@esbuild/freebsd-arm64@0.27.2': - resolution: - { - integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] '@esbuild/freebsd-x64@0.27.2': - resolution: - { - integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] '@esbuild/linux-arm64@0.27.2': - resolution: - { - integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] '@esbuild/linux-arm@0.27.2': - resolution: - { - integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} + engines: {node: '>=18'} cpu: [arm] os: [linux] '@esbuild/linux-ia32@0.27.2': - resolution: - { - integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] '@esbuild/linux-loong64@0.27.2': - resolution: - { - integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] '@esbuild/linux-mips64el@0.27.2': - resolution: - { - integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] '@esbuild/linux-ppc64@0.27.2': - resolution: - { - integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] '@esbuild/linux-riscv64@0.27.2': - resolution: - { - integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] '@esbuild/linux-s390x@0.27.2': - resolution: - { - integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] '@esbuild/linux-x64@0.27.2': - resolution: - { - integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} + engines: {node: '>=18'} cpu: [x64] os: [linux] '@esbuild/netbsd-arm64@0.27.2': - resolution: - { - integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} + engines: {node: '>=18'} cpu: [arm64] os: [netbsd] '@esbuild/netbsd-x64@0.27.2': - resolution: - { - integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] '@esbuild/openbsd-arm64@0.27.2': - resolution: - { - integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} + engines: {node: '>=18'} cpu: [arm64] os: [openbsd] '@esbuild/openbsd-x64@0.27.2': - resolution: - { - integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] '@esbuild/openharmony-arm64@0.27.2': - resolution: - { - integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} + engines: {node: '>=18'} cpu: [arm64] os: [openharmony] '@esbuild/sunos-x64@0.27.2': - resolution: - { - integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] '@esbuild/win32-arm64@0.27.2': - resolution: - { - integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] '@esbuild/win32-ia32@0.27.2': - resolution: - { - integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] '@esbuild/win32-x64@0.27.2': - resolution: - { - integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} + engines: {node: '>=18'} cpu: [x64] os: [win32] '@eslint-community/eslint-utils@4.9.0': - resolution: - { - integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 '@eslint-community/regexpp@4.12.2': - resolution: - { - integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==, - } - engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/config-array@0.21.1': - resolution: - { - integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/config-helpers@0.4.2': - resolution: - { - integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/core@0.17.0': - resolution: - { - integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.3.3': - resolution: - { - integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/js@9.39.2': - resolution: - { - integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.7': - resolution: - { - integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/plugin-kit@0.4.1': - resolution: - { - integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@graphile-contrib/pg-many-to-many@1.0.2': - resolution: - { - integrity: sha512-ChSaSU7/n99Crdlink62cCGqlEYmjUJKizz2Nx0tdGgqSMkf6KTk00D3ILGybScywMcJGjJE2cc6FXYIHVlxCg==, - } + resolution: {integrity: sha512-ChSaSU7/n99Crdlink62cCGqlEYmjUJKizz2Nx0tdGgqSMkf6KTk00D3ILGybScywMcJGjJE2cc6FXYIHVlxCg==} '@graphile-contrib/pg-simplify-inflector@6.1.0': - resolution: - { - integrity: sha512-3eI2FP4ulu/fxwkJBNXhR6XEzqVz4wJWFr4LfeyUNNArUtLFx0DpP6YdcARCYgwLExFcIQNE8fnul3JKiciYIw==, - } + resolution: {integrity: sha512-3eI2FP4ulu/fxwkJBNXhR6XEzqVz4wJWFr4LfeyUNNArUtLFx0DpP6YdcARCYgwLExFcIQNE8fnul3JKiciYIw==} '@graphile/lru@4.11.0': - resolution: - { - integrity: sha512-Fakuk190EAKxWSa9YQyr/87g8mvAv8HBvk6yPCPuIoA3bYXF7n6kl0XSqKjSd5VfjEqhtnzQ6zJGzDf1Gv/tJg==, - } - engines: { node: '>=8.6' } + resolution: {integrity: sha512-Fakuk190EAKxWSa9YQyr/87g8mvAv8HBvk6yPCPuIoA3bYXF7n6kl0XSqKjSd5VfjEqhtnzQ6zJGzDf1Gv/tJg==} + engines: {node: '>=8.6'} '@graphql-typed-document-node/core@3.2.0': - resolution: - { - integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==, - } + resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 '@humanfs/core@0.19.1': - resolution: - { - integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==, - } - engines: { node: '>=18.18.0' } + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} '@humanfs/node@0.16.7': - resolution: - { - integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==, - } - engines: { node: '>=18.18.0' } + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': - resolution: - { - integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==, - } - engines: { node: '>=12.22' } + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} '@humanwhocodes/retry@0.4.3': - resolution: - { - integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==, - } - engines: { node: '>=18.18' } + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} '@hutson/parse-repository-url@3.0.2': - resolution: - { - integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} + engines: {node: '>=6.9.0'} '@inquirer/external-editor@1.0.3': - resolution: - { - integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: @@ -3122,10 +2728,7 @@ packages: optional: true '@inquirerer/test@1.2.5': - resolution: - { - integrity: sha512-KbYVzo/hquctlPuA2uRb0fPbMP6SWpmU8VlLQQuUYoBsAYmQ32QzlEZzbYqSM/4fjr6TqCkqsLrfpNiTnK3+cg==, - } + resolution: {integrity: sha512-KbYVzo/hquctlPuA2uRb0fPbMP6SWpmU8VlLQQuUYoBsAYmQ32QzlEZzbYqSM/4fjr6TqCkqsLrfpNiTnK3+cg==} peerDependencies: jest: '>=29.0.0' peerDependenciesMeta: @@ -3133,72 +2736,42 @@ packages: optional: true '@inquirerer/utils@3.1.3': - resolution: - { - integrity: sha512-aEw6nBfbVVv77pwNT0LJNHZiEwN/2rE8jiXLzeY+93cHgt4rPs0QY2A+/CPq6ryzAfXGnI5C79o6HbwZcODZMA==, - } + resolution: {integrity: sha512-aEw6nBfbVVv77pwNT0LJNHZiEwN/2rE8jiXLzeY+93cHgt4rPs0QY2A+/CPq6ryzAfXGnI5C79o6HbwZcODZMA==} '@isaacs/balanced-match@4.0.1': - resolution: - { - integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} '@isaacs/brace-expansion@5.0.0': - resolution: - { - integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} '@isaacs/cliui@8.0.2': - resolution: - { - integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} '@isaacs/string-locale-compare@1.1.0': - resolution: - { - integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==, - } + resolution: {integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==} '@istanbuljs/load-nyc-config@1.1.0': - resolution: - { - integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} '@istanbuljs/schema@0.1.3': - resolution: - { - integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} '@jest/console@29.7.0': - resolution: - { - integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} '@jest/console@30.2.0': - resolution: - { - integrity: sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==} + 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 } + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -3206,11 +2779,8 @@ packages: optional: true '@jest/core@30.2.0': - resolution: - { - integrity: sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==} + 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: @@ -3218,102 +2788,60 @@ packages: optional: true '@jest/diff-sequences@30.0.1': - resolution: - { - integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} + 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 } + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} '@jest/environment@30.2.0': - resolution: - { - integrity: sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/expect-utils@29.7.0': - resolution: - { - integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} '@jest/expect-utils@30.2.0': - resolution: - { - integrity: sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==} + 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 } + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} '@jest/expect@30.2.0': - resolution: - { - integrity: sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==} + 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 } + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} '@jest/fake-timers@30.2.0': - resolution: - { - integrity: sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==} + 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==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==} + 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 } + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} '@jest/globals@30.2.0': - resolution: - { - integrity: sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==} + 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==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==} + 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 } + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 peerDependenciesMeta: @@ -3321,11 +2849,8 @@ packages: optional: true '@jest/reporters@30.2.0': - resolution: - { - integrity: sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==} + 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: @@ -3333,2950 +2858,1648 @@ packages: 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 } + 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==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/snapshot-utils@30.2.0': - resolution: - { - integrity: sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==} + 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 } + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} '@jest/source-map@30.0.1': - resolution: - { - integrity: sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==} + 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 } + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} '@jest/test-result@30.2.0': - resolution: - { - integrity: sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==} + 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 } + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} '@jest/test-sequencer@30.2.0': - resolution: - { - integrity: sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==} + 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 } + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} '@jest/transform@30.2.0': - resolution: - { - integrity: sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/types@26.6.2': - resolution: - { - integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==, - } - engines: { node: '>= 10.14.2' } + resolution: {integrity: sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==} + engines: {node: '>= 10.14.2'} '@jest/types@29.6.3': - resolution: - { - integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} '@jest/types@30.2.0': - resolution: - { - integrity: sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jridgewell/gen-mapping@0.3.13': - resolution: - { - integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==, - } + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} '@jridgewell/remapping@2.3.5': - resolution: - { - integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==, - } + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} '@jridgewell/resolve-uri@3.1.2': - resolution: - { - integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} '@jridgewell/sourcemap-codec@1.5.5': - resolution: - { - integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==, - } + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} '@jridgewell/trace-mapping@0.3.31': - resolution: - { - integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==, - } + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@jridgewell/trace-mapping@0.3.9': - resolution: - { - integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==, - } + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} '@launchql/mjml@0.1.1': - resolution: - { - integrity: sha512-6+OEmECuu5atRZ43ovsMfFs+T4NWNaKbzNG0uA8HYaBSn3kWR7GH3QnmL3lCIeymLtvgua8aZChYvg6SxrQdnw==, - } + resolution: {integrity: sha512-6+OEmECuu5atRZ43ovsMfFs+T4NWNaKbzNG0uA8HYaBSn3kWR7GH3QnmL3lCIeymLtvgua8aZChYvg6SxrQdnw==} peerDependencies: react: '>=16' react-dom: '>=16' '@launchql/postmaster@0.1.4': - resolution: - { - integrity: sha512-TIWqKLd0Lb15lLdzMYeBk43VGOM4G3wm4cLdN9KHKYG/yho+gt9P1Zs23OewJfb0a0rKyhNWYewdHbEJ6Y/sYQ==, - } + resolution: {integrity: sha512-TIWqKLd0Lb15lLdzMYeBk43VGOM4G3wm4cLdN9KHKYG/yho+gt9P1Zs23OewJfb0a0rKyhNWYewdHbEJ6Y/sYQ==} '@launchql/protobufjs@7.2.6': - resolution: - { - integrity: sha512-vwi1nG2/heVFsIMHQU1KxTjUp5c757CTtRAZn/jutApCkFlle1iv8tzM/DHlSZJKDldxaYqnNYTg0pTyp8Bbtg==, - } - engines: { node: '>=12.0.0' } + resolution: {integrity: sha512-vwi1nG2/heVFsIMHQU1KxTjUp5c757CTtRAZn/jutApCkFlle1iv8tzM/DHlSZJKDldxaYqnNYTg0pTyp8Bbtg==} + engines: {node: '>=12.0.0'} '@launchql/styled-email@0.1.0': - resolution: - { - integrity: sha512-ISjzsY+3EOH/qAKHPq3evw9QmmEyA8Vw+0pUf+Zf8l4/rAHJJKrSa/uPiaUf2Abi8yAZKyx2uyaZq4ExNNkD+w==, - } + resolution: {integrity: sha512-ISjzsY+3EOH/qAKHPq3evw9QmmEyA8Vw+0pUf+Zf8l4/rAHJJKrSa/uPiaUf2Abi8yAZKyx2uyaZq4ExNNkD+w==} peerDependencies: react: '>=16' react-dom: '>=16' '@lerna/create@8.2.4': - resolution: - { - integrity: sha512-A8AlzetnS2WIuhijdAzKUyFpR5YbLLfV3luQ4lzBgIBgRfuoBDZeF+RSZPhra+7A6/zTUlrbhKZIOi/MNhqgvQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-A8AlzetnS2WIuhijdAzKUyFpR5YbLLfV3luQ4lzBgIBgRfuoBDZeF+RSZPhra+7A6/zTUlrbhKZIOi/MNhqgvQ==} + engines: {node: '>=18.0.0'} '@napi-rs/wasm-runtime@0.2.12': - resolution: - { - integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==, - } + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} '@napi-rs/wasm-runtime@0.2.4': - resolution: - { - integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==, - } + resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==} '@nodelib/fs.scandir@2.1.5': - resolution: - { - integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} '@nodelib/fs.stat@2.0.5': - resolution: - { - integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} '@nodelib/fs.walk@1.2.8': - resolution: - { - integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} '@npmcli/agent@2.2.2': - resolution: - { - integrity: sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==} + engines: {node: ^16.14.0 || >=18.0.0} '@npmcli/arborist@7.5.4': - resolution: - { - integrity: sha512-nWtIc6QwwoUORCRNzKx4ypHqCk3drI+5aeYdMTQQiRCcn4lOOgfQh7WyZobGYTxXPSq1VwV53lkpN/BRlRk08g==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-nWtIc6QwwoUORCRNzKx4ypHqCk3drI+5aeYdMTQQiRCcn4lOOgfQh7WyZobGYTxXPSq1VwV53lkpN/BRlRk08g==} + engines: {node: ^16.14.0 || >=18.0.0} hasBin: true '@npmcli/fs@3.1.1': - resolution: - { - integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} '@npmcli/git@5.0.8': - resolution: - { - integrity: sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==} + engines: {node: ^16.14.0 || >=18.0.0} '@npmcli/installed-package-contents@2.1.0': - resolution: - { - integrity: sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true '@npmcli/map-workspaces@3.0.6': - resolution: - { - integrity: sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} '@npmcli/metavuln-calculator@7.1.1': - resolution: - { - integrity: sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g==} + engines: {node: ^16.14.0 || >=18.0.0} '@npmcli/name-from-folder@2.0.0': - resolution: - { - integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} '@npmcli/node-gyp@3.0.0': - resolution: - { - integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} '@npmcli/package-json@5.2.0': - resolution: - { - integrity: sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ==} + engines: {node: ^16.14.0 || >=18.0.0} '@npmcli/promise-spawn@7.0.2': - resolution: - { - integrity: sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==} + engines: {node: ^16.14.0 || >=18.0.0} '@npmcli/query@3.1.0': - resolution: - { - integrity: sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} '@npmcli/redact@2.0.1': - resolution: - { - integrity: sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==} + engines: {node: ^16.14.0 || >=18.0.0} '@npmcli/run-script@8.1.0': - resolution: - { - integrity: sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==} + engines: {node: ^16.14.0 || >=18.0.0} '@nx/devkit@20.8.3': - resolution: - { - integrity: sha512-5lbfJ6ICFOiGeirldQOU5fQ/W/VQ8L3dfWnmHG4UgpWSLoK/YFdRf4lTB4rS0aDXsBL0gyWABz3sZGLPGNYnPA==, - } + resolution: {integrity: sha512-5lbfJ6ICFOiGeirldQOU5fQ/W/VQ8L3dfWnmHG4UgpWSLoK/YFdRf4lTB4rS0aDXsBL0gyWABz3sZGLPGNYnPA==} peerDependencies: nx: '>= 19 <= 21' '@nx/nx-darwin-arm64@20.8.3': - resolution: - { - integrity: sha512-BeYnPAcnaerg6q+qR0bAb0nebwwrsvm4STSVqqVlaqLmmQpU3Bfpx44CEa5d6T9b0V11ZqVE/bkmRhMqhUcrhw==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-BeYnPAcnaerg6q+qR0bAb0nebwwrsvm4STSVqqVlaqLmmQpU3Bfpx44CEa5d6T9b0V11ZqVE/bkmRhMqhUcrhw==} + engines: {node: '>= 10'} cpu: [arm64] os: [darwin] '@nx/nx-darwin-x64@20.8.3': - resolution: - { - integrity: sha512-RIFg1VkQ4jhI+ErqEZuIeGBcJGD8t+u9J5CdQBDIASd8QRhtudBkiYLYCJb+qaQly09G7nVfxuyItlS2uRW3qA==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-RIFg1VkQ4jhI+ErqEZuIeGBcJGD8t+u9J5CdQBDIASd8QRhtudBkiYLYCJb+qaQly09G7nVfxuyItlS2uRW3qA==} + engines: {node: '>= 10'} cpu: [x64] os: [darwin] '@nx/nx-freebsd-x64@20.8.3': - resolution: - { - integrity: sha512-boQTgMUdnqpZhHMrV/xgnp/dTg5dfxw8I4d16NBwmW4j+Sez7zi/dydgsJpfZsj8TicOHvPu6KK4W5wzp82NPw==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-boQTgMUdnqpZhHMrV/xgnp/dTg5dfxw8I4d16NBwmW4j+Sez7zi/dydgsJpfZsj8TicOHvPu6KK4W5wzp82NPw==} + engines: {node: '>= 10'} cpu: [x64] os: [freebsd] '@nx/nx-linux-arm-gnueabihf@20.8.3': - resolution: - { - integrity: sha512-wpiNyY1igx1rLN3EsTLum2lDtblFijdBZB9/9u/6UDub4z9CaQ4yaC4h9n5v7yFYILwfL44YTsQKzrE+iv0y1Q==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-wpiNyY1igx1rLN3EsTLum2lDtblFijdBZB9/9u/6UDub4z9CaQ4yaC4h9n5v7yFYILwfL44YTsQKzrE+iv0y1Q==} + engines: {node: '>= 10'} cpu: [arm] os: [linux] '@nx/nx-linux-arm64-gnu@20.8.3': - resolution: - { - integrity: sha512-nbi/eZtJfWxuDwdUCiP+VJolFubtrz6XxVtB26eMAkODnREOKELHZtMOrlm8JBZCdtWCvTqibq9Az74XsqSfdA==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-nbi/eZtJfWxuDwdUCiP+VJolFubtrz6XxVtB26eMAkODnREOKELHZtMOrlm8JBZCdtWCvTqibq9Az74XsqSfdA==} + engines: {node: '>= 10'} cpu: [arm64] os: [linux] '@nx/nx-linux-arm64-musl@20.8.3': - resolution: - { - integrity: sha512-LTTGzI8YVPlF1v0YlVf+exM+1q7rpsiUbjTTHJcfHFRU5t4BsiZD54K19Y1UBg1XFx5cwhEaIomSmJ88RwPPVQ==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-LTTGzI8YVPlF1v0YlVf+exM+1q7rpsiUbjTTHJcfHFRU5t4BsiZD54K19Y1UBg1XFx5cwhEaIomSmJ88RwPPVQ==} + engines: {node: '>= 10'} cpu: [arm64] os: [linux] '@nx/nx-linux-x64-gnu@20.8.3': - resolution: - { - integrity: sha512-SlA4GtXvQbSzSIWLgiIiLBOjdINPOUR/im+TUbaEMZ8wiGrOY8cnk0PVt95TIQJVBeXBCeb5HnoY0lHJpMOODg==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-SlA4GtXvQbSzSIWLgiIiLBOjdINPOUR/im+TUbaEMZ8wiGrOY8cnk0PVt95TIQJVBeXBCeb5HnoY0lHJpMOODg==} + engines: {node: '>= 10'} cpu: [x64] os: [linux] '@nx/nx-linux-x64-musl@20.8.3': - resolution: - { - integrity: sha512-MNzkEwPktp5SQH9dJDH2wP9hgG9LsBDhKJXJfKw6sUI/6qz5+/aAjFziKy+zBnhU4AO1yXt5qEWzR8lDcIriVQ==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-MNzkEwPktp5SQH9dJDH2wP9hgG9LsBDhKJXJfKw6sUI/6qz5+/aAjFziKy+zBnhU4AO1yXt5qEWzR8lDcIriVQ==} + engines: {node: '>= 10'} cpu: [x64] os: [linux] '@nx/nx-win32-arm64-msvc@20.8.3': - resolution: - { - integrity: sha512-qUV7CyXKwRCM/lkvyS6Xa1MqgAuK5da6w27RAehh7LATBUKn1I4/M7DGn6L7ERCxpZuh1TrDz9pUzEy0R+Ekkg==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-qUV7CyXKwRCM/lkvyS6Xa1MqgAuK5da6w27RAehh7LATBUKn1I4/M7DGn6L7ERCxpZuh1TrDz9pUzEy0R+Ekkg==} + engines: {node: '>= 10'} cpu: [arm64] os: [win32] '@nx/nx-win32-x64-msvc@20.8.3': - resolution: - { - integrity: sha512-gX1G8u6W6EPX6PO/wv07+B++UHyCHBXyVWXITA3Kv6HoSajOxIa2Kk1rv1iDQGmX1WWxBaj3bUyYJAFBDITe4w==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-gX1G8u6W6EPX6PO/wv07+B++UHyCHBXyVWXITA3Kv6HoSajOxIa2Kk1rv1iDQGmX1WWxBaj3bUyYJAFBDITe4w==} + engines: {node: '>= 10'} cpu: [x64] os: [win32] '@octokit/auth-token@4.0.0': - resolution: - { - integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==, - } - engines: { node: '>= 18' } + resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} + engines: {node: '>= 18'} '@octokit/core@5.2.2': - resolution: - { - integrity: sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==, - } - engines: { node: '>= 18' } + resolution: {integrity: sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==} + engines: {node: '>= 18'} '@octokit/endpoint@9.0.6': - resolution: - { - integrity: sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==, - } - engines: { node: '>= 18' } + resolution: {integrity: sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==} + engines: {node: '>= 18'} '@octokit/graphql@7.1.1': - resolution: - { - integrity: sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==, - } - engines: { node: '>= 18' } + resolution: {integrity: sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==} + engines: {node: '>= 18'} '@octokit/openapi-types@24.2.0': - resolution: - { - integrity: sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==, - } + resolution: {integrity: sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==} '@octokit/plugin-enterprise-rest@6.0.1': - resolution: - { - integrity: sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==, - } + resolution: {integrity: sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==} '@octokit/plugin-paginate-rest@11.4.4-cjs.2': - resolution: - { - integrity: sha512-2dK6z8fhs8lla5PaOTgqfCGBxgAv/le+EhPs27KklPhm1bKObpu6lXzwfUEQ16ajXzqNrKMujsFyo9K2eaoISw==, - } - engines: { node: '>= 18' } + resolution: {integrity: sha512-2dK6z8fhs8lla5PaOTgqfCGBxgAv/le+EhPs27KklPhm1bKObpu6lXzwfUEQ16ajXzqNrKMujsFyo9K2eaoISw==} + engines: {node: '>= 18'} peerDependencies: '@octokit/core': '5' '@octokit/plugin-request-log@4.0.1': - resolution: - { - integrity: sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==, - } - engines: { node: '>= 18' } + resolution: {integrity: sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==} + engines: {node: '>= 18'} peerDependencies: '@octokit/core': '5' '@octokit/plugin-rest-endpoint-methods@13.3.2-cjs.1': - resolution: - { - integrity: sha512-VUjIjOOvF2oELQmiFpWA1aOPdawpyaCUqcEBc/UOUnj3Xp6DJGrJ1+bjUIIDzdHjnFNO6q57ODMfdEZnoBkCwQ==, - } - engines: { node: '>= 18' } + resolution: {integrity: sha512-VUjIjOOvF2oELQmiFpWA1aOPdawpyaCUqcEBc/UOUnj3Xp6DJGrJ1+bjUIIDzdHjnFNO6q57ODMfdEZnoBkCwQ==} + engines: {node: '>= 18'} peerDependencies: '@octokit/core': ^5 '@octokit/request-error@5.1.1': - resolution: - { - integrity: sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==, - } - engines: { node: '>= 18' } + resolution: {integrity: sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==} + engines: {node: '>= 18'} '@octokit/request@8.4.1': - resolution: - { - integrity: sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==, - } - engines: { node: '>= 18' } + resolution: {integrity: sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==} + engines: {node: '>= 18'} '@octokit/rest@20.1.2': - resolution: - { - integrity: sha512-GmYiltypkHHtihFwPRxlaorG5R9VAHuk/vbszVoRTGXnAsY60wYLkh/E2XiFmdZmqrisw+9FaazS1i5SbdWYgA==, - } - engines: { node: '>= 18' } + resolution: {integrity: sha512-GmYiltypkHHtihFwPRxlaorG5R9VAHuk/vbszVoRTGXnAsY60wYLkh/E2XiFmdZmqrisw+9FaazS1i5SbdWYgA==} + engines: {node: '>= 18'} '@octokit/types@13.10.0': - resolution: - { - integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==, - } + resolution: {integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==} '@one-ini/wasm@0.1.1': - resolution: - { - integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==, - } + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} '@pgsql/types@17.6.2': - resolution: - { - integrity: sha512-1UtbELdbqNdyOShhrVfSz3a1gDi0s9XXiQemx+6QqtsrXe62a6zOGU+vjb2GRfG5jeEokI1zBBcfD42enRv0Rw==, - } + resolution: {integrity: sha512-1UtbELdbqNdyOShhrVfSz3a1gDi0s9XXiQemx+6QqtsrXe62a6zOGU+vjb2GRfG5jeEokI1zBBcfD42enRv0Rw==} '@pgsql/utils@17.8.11': - resolution: - { - integrity: sha512-gcaS9ATilQyGSIq8596tq+6rcb7TX54sdjOvOzGa9lu9NjqkptEKLbBae5UTjfkFGfH50duDFD1EpFogMnZToA==, - } + resolution: {integrity: sha512-gcaS9ATilQyGSIq8596tq+6rcb7TX54sdjOvOzGa9lu9NjqkptEKLbBae5UTjfkFGfH50duDFD1EpFogMnZToA==} '@pkgjs/parseargs@0.11.0': - resolution: - { - integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} '@pkgr/core@0.2.9': - resolution: - { - integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==, - } - engines: { node: ^12.20.0 || ^14.18.0 || >=16.0.0 } + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} '@playwright/test@1.57.0': - resolution: - { - integrity: sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-6TyEnHgd6SArQO8UO2OMTxshln3QMWBtPGrOCgs3wVEmQmwyuNtB10IZMfmYDE0riwNR1cu4q+pPcxMVtaG3TA==} + engines: {node: '>=18'} hasBin: true '@protobufjs/aspromise@1.1.2': - resolution: - { - integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==, - } + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} '@protobufjs/base64@1.1.2': - resolution: - { - integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==, - } + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} '@protobufjs/codegen@2.0.4': - resolution: - { - integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==, - } + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} '@protobufjs/eventemitter@1.1.0': - resolution: - { - integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==, - } + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} '@protobufjs/fetch@1.1.0': - resolution: - { - integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==, - } + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} '@protobufjs/float@1.0.2': - resolution: - { - integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==, - } + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} '@protobufjs/inquire@1.1.0': - resolution: - { - integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==, - } + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} '@protobufjs/path@1.1.2': - resolution: - { - integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==, - } + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} '@protobufjs/pool@1.1.0': - resolution: - { - integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==, - } + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} '@protobufjs/utf8@1.1.0': - resolution: - { - integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==, - } + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} '@sigstore/bundle@2.3.2': - resolution: - { - integrity: sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==} + engines: {node: ^16.14.0 || >=18.0.0} '@sigstore/core@1.1.0': - resolution: - { - integrity: sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==} + engines: {node: ^16.14.0 || >=18.0.0} '@sigstore/protobuf-specs@0.3.3': - resolution: - { - integrity: sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ==, - } - engines: { node: ^18.17.0 || >=20.5.0 } + resolution: {integrity: sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ==} + engines: {node: ^18.17.0 || >=20.5.0} '@sigstore/sign@2.3.2': - resolution: - { - integrity: sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==} + engines: {node: ^16.14.0 || >=18.0.0} '@sigstore/tuf@2.3.4': - resolution: - { - integrity: sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==} + engines: {node: ^16.14.0 || >=18.0.0} '@sigstore/verify@1.2.1': - resolution: - { - integrity: sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==} + engines: {node: ^16.14.0 || >=18.0.0} '@sinclair/typebox@0.27.8': - resolution: - { - integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==, - } + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} '@sinclair/typebox@0.34.45': - resolution: - { - integrity: sha512-qJcFVfCa5jxBFSuv7S5WYbA8XdeCPmhnaVVfX/2Y6L8WYg8sk3XY2+6W0zH+3mq1Cz+YC7Ki66HfqX6IHAwnkg==, - } + resolution: {integrity: sha512-qJcFVfCa5jxBFSuv7S5WYbA8XdeCPmhnaVVfX/2Y6L8WYg8sk3XY2+6W0zH+3mq1Cz+YC7Ki66HfqX6IHAwnkg==} '@sinonjs/commons@3.0.1': - resolution: - { - integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==, - } + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} '@sinonjs/fake-timers@10.3.0': - resolution: - { - integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==, - } + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} '@sinonjs/fake-timers@13.0.5': - resolution: - { - integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==, - } + resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==} '@smithy/abort-controller@4.2.7': - resolution: - { - integrity: sha512-rzMY6CaKx2qxrbYbqjXWS0plqEy7LOdKHS0bg4ixJ6aoGDPNUcLWk/FRNuCILh7GKLG9TFUXYYeQQldMBBwuyw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-rzMY6CaKx2qxrbYbqjXWS0plqEy7LOdKHS0bg4ixJ6aoGDPNUcLWk/FRNuCILh7GKLG9TFUXYYeQQldMBBwuyw==} + engines: {node: '>=18.0.0'} '@smithy/chunked-blob-reader-native@4.2.1': - resolution: - { - integrity: sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==} + engines: {node: '>=18.0.0'} '@smithy/chunked-blob-reader@5.2.0': - resolution: - { - integrity: sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==} + engines: {node: '>=18.0.0'} '@smithy/config-resolver@4.4.5': - resolution: - { - integrity: sha512-HAGoUAFYsUkoSckuKbCPayECeMim8pOu+yLy1zOxt1sifzEbrsRpYa+mKcMdiHKMeiqOibyPG0sFJnmaV/OGEg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-HAGoUAFYsUkoSckuKbCPayECeMim8pOu+yLy1zOxt1sifzEbrsRpYa+mKcMdiHKMeiqOibyPG0sFJnmaV/OGEg==} + engines: {node: '>=18.0.0'} '@smithy/core@3.20.0': - resolution: - { - integrity: sha512-WsSHCPq/neD5G/MkK4csLI5Y5Pkd9c1NMfpYEKeghSGaD4Ja1qLIohRQf2D5c1Uy5aXp76DeKHkzWZ9KAlHroQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-WsSHCPq/neD5G/MkK4csLI5Y5Pkd9c1NMfpYEKeghSGaD4Ja1qLIohRQf2D5c1Uy5aXp76DeKHkzWZ9KAlHroQ==} + engines: {node: '>=18.0.0'} '@smithy/credential-provider-imds@4.2.7': - resolution: - { - integrity: sha512-CmduWdCiILCRNbQWFR0OcZlUPVtyE49Sr8yYL0rZQ4D/wKxiNzBNS/YHemvnbkIWj623fplgkexUd/c9CAKdoA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-CmduWdCiILCRNbQWFR0OcZlUPVtyE49Sr8yYL0rZQ4D/wKxiNzBNS/YHemvnbkIWj623fplgkexUd/c9CAKdoA==} + engines: {node: '>=18.0.0'} '@smithy/eventstream-codec@4.2.7': - resolution: - { - integrity: sha512-DrpkEoM3j9cBBWhufqBwnbbn+3nf1N9FP6xuVJ+e220jbactKuQgaZwjwP5CP1t+O94brm2JgVMD2atMGX3xIQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-DrpkEoM3j9cBBWhufqBwnbbn+3nf1N9FP6xuVJ+e220jbactKuQgaZwjwP5CP1t+O94brm2JgVMD2atMGX3xIQ==} + engines: {node: '>=18.0.0'} '@smithy/eventstream-serde-browser@4.2.7': - resolution: - { - integrity: sha512-ujzPk8seYoDBmABDE5YqlhQZAXLOrtxtJLrbhHMKjBoG5b4dK4i6/mEU+6/7yXIAkqOO8sJ6YxZl+h0QQ1IJ7g==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-ujzPk8seYoDBmABDE5YqlhQZAXLOrtxtJLrbhHMKjBoG5b4dK4i6/mEU+6/7yXIAkqOO8sJ6YxZl+h0QQ1IJ7g==} + engines: {node: '>=18.0.0'} '@smithy/eventstream-serde-config-resolver@4.3.7': - resolution: - { - integrity: sha512-x7BtAiIPSaNaWuzm24Q/mtSkv+BrISO/fmheiJ39PKRNH3RmH2Hph/bUKSOBOBC9unqfIYDhKTHwpyZycLGPVQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-x7BtAiIPSaNaWuzm24Q/mtSkv+BrISO/fmheiJ39PKRNH3RmH2Hph/bUKSOBOBC9unqfIYDhKTHwpyZycLGPVQ==} + engines: {node: '>=18.0.0'} '@smithy/eventstream-serde-node@4.2.7': - resolution: - { - integrity: sha512-roySCtHC5+pQq5lK4be1fZ/WR6s/AxnPaLfCODIPArtN2du8s5Ot4mKVK3pPtijL/L654ws592JHJ1PbZFF6+A==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-roySCtHC5+pQq5lK4be1fZ/WR6s/AxnPaLfCODIPArtN2du8s5Ot4mKVK3pPtijL/L654ws592JHJ1PbZFF6+A==} + engines: {node: '>=18.0.0'} '@smithy/eventstream-serde-universal@4.2.7': - resolution: - { - integrity: sha512-QVD+g3+icFkThoy4r8wVFZMsIP08taHVKjE6Jpmz8h5CgX/kk6pTODq5cht0OMtcapUx+xrPzUTQdA+TmO0m1g==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-QVD+g3+icFkThoy4r8wVFZMsIP08taHVKjE6Jpmz8h5CgX/kk6pTODq5cht0OMtcapUx+xrPzUTQdA+TmO0m1g==} + engines: {node: '>=18.0.0'} '@smithy/fetch-http-handler@5.3.8': - resolution: - { - integrity: sha512-h/Fi+o7mti4n8wx1SR6UHWLaakwHRx29sizvp8OOm7iqwKGFneT06GCSFhml6Bha5BT6ot5pj3CYZnCHhGC2Rg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-h/Fi+o7mti4n8wx1SR6UHWLaakwHRx29sizvp8OOm7iqwKGFneT06GCSFhml6Bha5BT6ot5pj3CYZnCHhGC2Rg==} + engines: {node: '>=18.0.0'} '@smithy/hash-blob-browser@4.2.8': - resolution: - { - integrity: sha512-07InZontqsM1ggTCPSRgI7d8DirqRrnpL7nIACT4PW0AWrgDiHhjGZzbAE5UtRSiU0NISGUYe7/rri9ZeWyDpw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-07InZontqsM1ggTCPSRgI7d8DirqRrnpL7nIACT4PW0AWrgDiHhjGZzbAE5UtRSiU0NISGUYe7/rri9ZeWyDpw==} + engines: {node: '>=18.0.0'} '@smithy/hash-node@4.2.7': - resolution: - { - integrity: sha512-PU/JWLTBCV1c8FtB8tEFnY4eV1tSfBc7bDBADHfn1K+uRbPgSJ9jnJp0hyjiFN2PMdPzxsf1Fdu0eo9fJ760Xw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-PU/JWLTBCV1c8FtB8tEFnY4eV1tSfBc7bDBADHfn1K+uRbPgSJ9jnJp0hyjiFN2PMdPzxsf1Fdu0eo9fJ760Xw==} + engines: {node: '>=18.0.0'} '@smithy/hash-stream-node@4.2.7': - resolution: - { - integrity: sha512-ZQVoAwNYnFMIbd4DUc517HuwNelJUY6YOzwqrbcAgCnVn+79/OK7UjwA93SPpdTOpKDVkLIzavWm/Ck7SmnDPQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-ZQVoAwNYnFMIbd4DUc517HuwNelJUY6YOzwqrbcAgCnVn+79/OK7UjwA93SPpdTOpKDVkLIzavWm/Ck7SmnDPQ==} + engines: {node: '>=18.0.0'} '@smithy/invalid-dependency@4.2.7': - resolution: - { - integrity: sha512-ncvgCr9a15nPlkhIUx3CU4d7E7WEuVJOV7fS7nnK2hLtPK9tYRBkMHQbhXU1VvvKeBm/O0x26OEoBq+ngFpOEQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-ncvgCr9a15nPlkhIUx3CU4d7E7WEuVJOV7fS7nnK2hLtPK9tYRBkMHQbhXU1VvvKeBm/O0x26OEoBq+ngFpOEQ==} + engines: {node: '>=18.0.0'} '@smithy/is-array-buffer@2.2.0': - resolution: - { - integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==, - } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} + engines: {node: '>=14.0.0'} '@smithy/is-array-buffer@4.2.0': - resolution: - { - integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} + engines: {node: '>=18.0.0'} '@smithy/md5-js@4.2.7': - resolution: - { - integrity: sha512-Wv6JcUxtOLTnxvNjDnAiATUsk8gvA6EeS8zzHig07dotpByYsLot+m0AaQEniUBjx97AC41MQR4hW0baraD1Xw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-Wv6JcUxtOLTnxvNjDnAiATUsk8gvA6EeS8zzHig07dotpByYsLot+m0AaQEniUBjx97AC41MQR4hW0baraD1Xw==} + engines: {node: '>=18.0.0'} '@smithy/middleware-content-length@4.2.7': - resolution: - { - integrity: sha512-GszfBfCcvt7kIbJ41LuNa5f0wvQCHhnGx/aDaZJCCT05Ld6x6U2s0xsc/0mBFONBZjQJp2U/0uSJ178OXOwbhg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-GszfBfCcvt7kIbJ41LuNa5f0wvQCHhnGx/aDaZJCCT05Ld6x6U2s0xsc/0mBFONBZjQJp2U/0uSJ178OXOwbhg==} + engines: {node: '>=18.0.0'} '@smithy/middleware-endpoint@4.4.1': - resolution: - { - integrity: sha512-gpLspUAoe6f1M6H0u4cVuFzxZBrsGZmjx2O9SigurTx4PbntYa4AJ+o0G0oGm1L2oSX6oBhcGHwrfJHup2JnJg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-gpLspUAoe6f1M6H0u4cVuFzxZBrsGZmjx2O9SigurTx4PbntYa4AJ+o0G0oGm1L2oSX6oBhcGHwrfJHup2JnJg==} + engines: {node: '>=18.0.0'} '@smithy/middleware-retry@4.4.17': - resolution: - { - integrity: sha512-MqbXK6Y9uq17h+4r0ogu/sBT6V/rdV+5NvYL7ZV444BKfQygYe8wAhDrVXagVebN6w2RE0Fm245l69mOsPGZzg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-MqbXK6Y9uq17h+4r0ogu/sBT6V/rdV+5NvYL7ZV444BKfQygYe8wAhDrVXagVebN6w2RE0Fm245l69mOsPGZzg==} + engines: {node: '>=18.0.0'} '@smithy/middleware-serde@4.2.8': - resolution: - { - integrity: sha512-8rDGYen5m5+NV9eHv9ry0sqm2gI6W7mc1VSFMtn6Igo25S507/HaOX9LTHAS2/J32VXD0xSzrY0H5FJtOMS4/w==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-8rDGYen5m5+NV9eHv9ry0sqm2gI6W7mc1VSFMtn6Igo25S507/HaOX9LTHAS2/J32VXD0xSzrY0H5FJtOMS4/w==} + engines: {node: '>=18.0.0'} '@smithy/middleware-stack@4.2.7': - resolution: - { - integrity: sha512-bsOT0rJ+HHlZd9crHoS37mt8qRRN/h9jRve1SXUhVbkRzu0QaNYZp1i1jha4n098tsvROjcwfLlfvcFuJSXEsw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-bsOT0rJ+HHlZd9crHoS37mt8qRRN/h9jRve1SXUhVbkRzu0QaNYZp1i1jha4n098tsvROjcwfLlfvcFuJSXEsw==} + engines: {node: '>=18.0.0'} '@smithy/node-config-provider@4.3.7': - resolution: - { - integrity: sha512-7r58wq8sdOcrwWe+klL9y3bc4GW1gnlfnFOuL7CXa7UzfhzhxKuzNdtqgzmTV+53lEp9NXh5hY/S4UgjLOzPfw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-7r58wq8sdOcrwWe+klL9y3bc4GW1gnlfnFOuL7CXa7UzfhzhxKuzNdtqgzmTV+53lEp9NXh5hY/S4UgjLOzPfw==} + engines: {node: '>=18.0.0'} '@smithy/node-http-handler@4.4.7': - resolution: - { - integrity: sha512-NELpdmBOO6EpZtWgQiHjoShs1kmweaiNuETUpuup+cmm/xJYjT4eUjfhrXRP4jCOaAsS3c3yPsP3B+K+/fyPCQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-NELpdmBOO6EpZtWgQiHjoShs1kmweaiNuETUpuup+cmm/xJYjT4eUjfhrXRP4jCOaAsS3c3yPsP3B+K+/fyPCQ==} + engines: {node: '>=18.0.0'} '@smithy/property-provider@4.2.7': - resolution: - { - integrity: sha512-jmNYKe9MGGPoSl/D7JDDs1C8b3dC8f/w78LbaVfoTtWy4xAd5dfjaFG9c9PWPihY4ggMQNQSMtzU77CNgAJwmA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-jmNYKe9MGGPoSl/D7JDDs1C8b3dC8f/w78LbaVfoTtWy4xAd5dfjaFG9c9PWPihY4ggMQNQSMtzU77CNgAJwmA==} + engines: {node: '>=18.0.0'} '@smithy/protocol-http@5.3.7': - resolution: - { - integrity: sha512-1r07pb994I20dD/c2seaZhoCuNYm0rWrvBxhCQ70brNh11M5Ml2ew6qJVo0lclB3jMIXirD4s2XRXRe7QEi0xA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-1r07pb994I20dD/c2seaZhoCuNYm0rWrvBxhCQ70brNh11M5Ml2ew6qJVo0lclB3jMIXirD4s2XRXRe7QEi0xA==} + engines: {node: '>=18.0.0'} '@smithy/querystring-builder@4.2.7': - resolution: - { - integrity: sha512-eKONSywHZxK4tBxe2lXEysh8wbBdvDWiA+RIuaxZSgCMmA0zMgoDpGLJhnyj+c0leOQprVnXOmcB4m+W9Rw7sg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-eKONSywHZxK4tBxe2lXEysh8wbBdvDWiA+RIuaxZSgCMmA0zMgoDpGLJhnyj+c0leOQprVnXOmcB4m+W9Rw7sg==} + engines: {node: '>=18.0.0'} '@smithy/querystring-parser@4.2.7': - resolution: - { - integrity: sha512-3X5ZvzUHmlSTHAXFlswrS6EGt8fMSIxX/c3Rm1Pni3+wYWB6cjGocmRIoqcQF9nU5OgGmL0u7l9m44tSUpfj9w==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-3X5ZvzUHmlSTHAXFlswrS6EGt8fMSIxX/c3Rm1Pni3+wYWB6cjGocmRIoqcQF9nU5OgGmL0u7l9m44tSUpfj9w==} + engines: {node: '>=18.0.0'} '@smithy/service-error-classification@4.2.7': - resolution: - { - integrity: sha512-YB7oCbukqEb2Dlh3340/8g8vNGbs/QsNNRms+gv3N2AtZz9/1vSBx6/6tpwQpZMEJFs7Uq8h4mmOn48ZZ72MkA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-YB7oCbukqEb2Dlh3340/8g8vNGbs/QsNNRms+gv3N2AtZz9/1vSBx6/6tpwQpZMEJFs7Uq8h4mmOn48ZZ72MkA==} + engines: {node: '>=18.0.0'} '@smithy/shared-ini-file-loader@4.4.2': - resolution: - { - integrity: sha512-M7iUUff/KwfNunmrgtqBfvZSzh3bmFgv/j/t1Y1dQ+8dNo34br1cqVEqy6v0mYEgi0DkGO7Xig0AnuOaEGVlcg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-M7iUUff/KwfNunmrgtqBfvZSzh3bmFgv/j/t1Y1dQ+8dNo34br1cqVEqy6v0mYEgi0DkGO7Xig0AnuOaEGVlcg==} + engines: {node: '>=18.0.0'} '@smithy/signature-v4@5.3.7': - resolution: - { - integrity: sha512-9oNUlqBlFZFOSdxgImA6X5GFuzE7V2H7VG/7E70cdLhidFbdtvxxt81EHgykGK5vq5D3FafH//X+Oy31j3CKOg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-9oNUlqBlFZFOSdxgImA6X5GFuzE7V2H7VG/7E70cdLhidFbdtvxxt81EHgykGK5vq5D3FafH//X+Oy31j3CKOg==} + engines: {node: '>=18.0.0'} '@smithy/smithy-client@4.10.2': - resolution: - { - integrity: sha512-D5z79xQWpgrGpAHb054Fn2CCTQZpog7JELbVQ6XAvXs5MNKWf28U9gzSBlJkOyMl9LA1TZEjRtwvGXfP0Sl90g==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-D5z79xQWpgrGpAHb054Fn2CCTQZpog7JELbVQ6XAvXs5MNKWf28U9gzSBlJkOyMl9LA1TZEjRtwvGXfP0Sl90g==} + engines: {node: '>=18.0.0'} '@smithy/types@4.11.0': - resolution: - { - integrity: sha512-mlrmL0DRDVe3mNrjTcVcZEgkFmufITfUAPBEA+AHYiIeYyJebso/He1qLbP3PssRe22KUzLRpQSdBPbXdgZ2VA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-mlrmL0DRDVe3mNrjTcVcZEgkFmufITfUAPBEA+AHYiIeYyJebso/He1qLbP3PssRe22KUzLRpQSdBPbXdgZ2VA==} + engines: {node: '>=18.0.0'} '@smithy/url-parser@4.2.7': - resolution: - { - integrity: sha512-/RLtVsRV4uY3qPWhBDsjwahAtt3x2IsMGnP5W1b2VZIe+qgCqkLxI1UOHDZp1Q1QSOrdOR32MF3Ph2JfWT1VHg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-/RLtVsRV4uY3qPWhBDsjwahAtt3x2IsMGnP5W1b2VZIe+qgCqkLxI1UOHDZp1Q1QSOrdOR32MF3Ph2JfWT1VHg==} + engines: {node: '>=18.0.0'} '@smithy/util-base64@4.3.0': - resolution: - { - integrity: sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==} + engines: {node: '>=18.0.0'} '@smithy/util-body-length-browser@4.2.0': - resolution: - { - integrity: sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==} + engines: {node: '>=18.0.0'} '@smithy/util-body-length-node@4.2.1': - resolution: - { - integrity: sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==} + engines: {node: '>=18.0.0'} '@smithy/util-buffer-from@2.2.0': - resolution: - { - integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==, - } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} + engines: {node: '>=14.0.0'} '@smithy/util-buffer-from@4.2.0': - resolution: - { - integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==} + engines: {node: '>=18.0.0'} '@smithy/util-config-provider@4.2.0': - resolution: - { - integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} + engines: {node: '>=18.0.0'} '@smithy/util-defaults-mode-browser@4.3.16': - resolution: - { - integrity: sha512-/eiSP3mzY3TsvUOYMeL4EqUX6fgUOj2eUOU4rMMgVbq67TiRLyxT7Xsjxq0bW3OwuzK009qOwF0L2OgJqperAQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-/eiSP3mzY3TsvUOYMeL4EqUX6fgUOj2eUOU4rMMgVbq67TiRLyxT7Xsjxq0bW3OwuzK009qOwF0L2OgJqperAQ==} + engines: {node: '>=18.0.0'} '@smithy/util-defaults-mode-node@4.2.19': - resolution: - { - integrity: sha512-3a4+4mhf6VycEJyHIQLypRbiwG6aJvbQAeRAVXydMmfweEPnLLabRbdyo/Pjw8Rew9vjsh5WCdhmDaHkQnhhhA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-3a4+4mhf6VycEJyHIQLypRbiwG6aJvbQAeRAVXydMmfweEPnLLabRbdyo/Pjw8Rew9vjsh5WCdhmDaHkQnhhhA==} + engines: {node: '>=18.0.0'} '@smithy/util-endpoints@3.2.7': - resolution: - { - integrity: sha512-s4ILhyAvVqhMDYREeTS68R43B1V5aenV5q/V1QpRQJkCXib5BPRo4s7uNdzGtIKxaPHCfU/8YkvPAEvTpxgspg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-s4ILhyAvVqhMDYREeTS68R43B1V5aenV5q/V1QpRQJkCXib5BPRo4s7uNdzGtIKxaPHCfU/8YkvPAEvTpxgspg==} + engines: {node: '>=18.0.0'} '@smithy/util-hex-encoding@4.2.0': - resolution: - { - integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} + engines: {node: '>=18.0.0'} '@smithy/util-middleware@4.2.7': - resolution: - { - integrity: sha512-i1IkpbOae6NvIKsEeLLM9/2q4X+M90KV3oCFgWQI4q0Qz+yUZvsr+gZPdAEAtFhWQhAHpTsJO8DRJPuwVyln+w==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-i1IkpbOae6NvIKsEeLLM9/2q4X+M90KV3oCFgWQI4q0Qz+yUZvsr+gZPdAEAtFhWQhAHpTsJO8DRJPuwVyln+w==} + engines: {node: '>=18.0.0'} '@smithy/util-retry@4.2.7': - resolution: - { - integrity: sha512-SvDdsQyF5CIASa4EYVT02LukPHVzAgUA4kMAuZ97QJc2BpAqZfA4PINB8/KOoCXEw9tsuv/jQjMeaHFvxdLNGg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-SvDdsQyF5CIASa4EYVT02LukPHVzAgUA4kMAuZ97QJc2BpAqZfA4PINB8/KOoCXEw9tsuv/jQjMeaHFvxdLNGg==} + engines: {node: '>=18.0.0'} '@smithy/util-stream@4.5.8': - resolution: - { - integrity: sha512-ZnnBhTapjM0YPGUSmOs0Mcg/Gg87k503qG4zU2v/+Js2Gu+daKOJMeqcQns8ajepY8tgzzfYxl6kQyZKml6O2w==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-ZnnBhTapjM0YPGUSmOs0Mcg/Gg87k503qG4zU2v/+Js2Gu+daKOJMeqcQns8ajepY8tgzzfYxl6kQyZKml6O2w==} + engines: {node: '>=18.0.0'} '@smithy/util-uri-escape@4.2.0': - resolution: - { - integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==} + engines: {node: '>=18.0.0'} '@smithy/util-utf8@2.3.0': - resolution: - { - integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==, - } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} + engines: {node: '>=14.0.0'} '@smithy/util-utf8@4.2.0': - resolution: - { - integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} + engines: {node: '>=18.0.0'} '@smithy/util-waiter@4.2.7': - resolution: - { - integrity: sha512-vHJFXi9b7kUEpHWUCY3Twl+9NPOZvQ0SAi+Ewtn48mbiJk4JY9MZmKQjGB4SCvVb9WPiSphZJYY6RIbs+grrzw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-vHJFXi9b7kUEpHWUCY3Twl+9NPOZvQ0SAi+Ewtn48mbiJk4JY9MZmKQjGB4SCvVb9WPiSphZJYY6RIbs+grrzw==} + engines: {node: '>=18.0.0'} '@smithy/uuid@1.1.0': - resolution: - { - integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==} + engines: {node: '>=18.0.0'} '@styled-system/background@5.1.2': - resolution: - { - integrity: sha512-jtwH2C/U6ssuGSvwTN3ri/IyjdHb8W9X/g8Y0JLcrH02G+BW3OS8kZdHphF1/YyRklnrKrBT2ngwGUK6aqqV3A==, - } + resolution: {integrity: sha512-jtwH2C/U6ssuGSvwTN3ri/IyjdHb8W9X/g8Y0JLcrH02G+BW3OS8kZdHphF1/YyRklnrKrBT2ngwGUK6aqqV3A==} '@styled-system/border@5.1.5': - resolution: - { - integrity: sha512-JvddhNrnhGigtzWRCVuAHepniyVi6hBlimxWDVAdcTuk7aRn9BYJUwfHslURtwYFsF5FoEs8Zmr1oZq2M1AP0A==, - } + resolution: {integrity: sha512-JvddhNrnhGigtzWRCVuAHepniyVi6hBlimxWDVAdcTuk7aRn9BYJUwfHslURtwYFsF5FoEs8Zmr1oZq2M1AP0A==} '@styled-system/color@5.1.2': - resolution: - { - integrity: sha512-1kCkeKDZkt4GYkuFNKc7vJQMcOmTl3bJY3YBUs7fCNM6mMYJeT1pViQ2LwBSBJytj3AB0o4IdLBoepgSgGl5MA==, - } + resolution: {integrity: sha512-1kCkeKDZkt4GYkuFNKc7vJQMcOmTl3bJY3YBUs7fCNM6mMYJeT1pViQ2LwBSBJytj3AB0o4IdLBoepgSgGl5MA==} '@styled-system/core@5.1.2': - resolution: - { - integrity: sha512-XclBDdNIy7OPOsN4HBsawG2eiWfCcuFt6gxKn1x4QfMIgeO6TOlA2pZZ5GWZtIhCUqEPTgIBta6JXsGyCkLBYw==, - } + resolution: {integrity: sha512-XclBDdNIy7OPOsN4HBsawG2eiWfCcuFt6gxKn1x4QfMIgeO6TOlA2pZZ5GWZtIhCUqEPTgIBta6JXsGyCkLBYw==} '@styled-system/css@5.1.5': - resolution: - { - integrity: sha512-XkORZdS5kypzcBotAMPBoeckDs9aSZVkvrAlq5K3xP8IMAUek+x2O4NtwoSgkYkWWzVBu6DGdFZLR790QWGG+A==, - } + resolution: {integrity: sha512-XkORZdS5kypzcBotAMPBoeckDs9aSZVkvrAlq5K3xP8IMAUek+x2O4NtwoSgkYkWWzVBu6DGdFZLR790QWGG+A==} '@styled-system/flexbox@5.1.2': - resolution: - { - integrity: sha512-6hHV52+eUk654Y1J2v77B8iLeBNtc+SA3R4necsu2VVinSD7+XY5PCCEzBFaWs42dtOEDIa2lMrgL0YBC01mDQ==, - } + resolution: {integrity: sha512-6hHV52+eUk654Y1J2v77B8iLeBNtc+SA3R4necsu2VVinSD7+XY5PCCEzBFaWs42dtOEDIa2lMrgL0YBC01mDQ==} '@styled-system/grid@5.1.2': - resolution: - { - integrity: sha512-K3YiV1KyHHzgdNuNlaw8oW2ktMuGga99o1e/NAfTEi5Zsa7JXxzwEnVSDSBdJC+z6R8WYTCYRQC6bkVFcvdTeg==, - } + resolution: {integrity: sha512-K3YiV1KyHHzgdNuNlaw8oW2ktMuGga99o1e/NAfTEi5Zsa7JXxzwEnVSDSBdJC+z6R8WYTCYRQC6bkVFcvdTeg==} '@styled-system/layout@5.1.2': - resolution: - { - integrity: sha512-wUhkMBqSeacPFhoE9S6UF3fsMEKFv91gF4AdDWp0Aym1yeMPpqz9l9qS/6vjSsDPF7zOb5cOKC3tcKKOMuDCPw==, - } + resolution: {integrity: sha512-wUhkMBqSeacPFhoE9S6UF3fsMEKFv91gF4AdDWp0Aym1yeMPpqz9l9qS/6vjSsDPF7zOb5cOKC3tcKKOMuDCPw==} '@styled-system/position@5.1.2': - resolution: - { - integrity: sha512-60IZfMXEOOZe3l1mCu6sj/2NAyUmES2kR9Kzp7s2D3P4qKsZWxD1Se1+wJvevb+1TP+ZMkGPEYYXRyU8M1aF5A==, - } + resolution: {integrity: sha512-60IZfMXEOOZe3l1mCu6sj/2NAyUmES2kR9Kzp7s2D3P4qKsZWxD1Se1+wJvevb+1TP+ZMkGPEYYXRyU8M1aF5A==} '@styled-system/shadow@5.1.2': - resolution: - { - integrity: sha512-wqniqYb7XuZM7K7C0d1Euxc4eGtqEe/lvM0WjuAFsQVImiq6KGT7s7is+0bNI8O4Dwg27jyu4Lfqo/oIQXNzAg==, - } + resolution: {integrity: sha512-wqniqYb7XuZM7K7C0d1Euxc4eGtqEe/lvM0WjuAFsQVImiq6KGT7s7is+0bNI8O4Dwg27jyu4Lfqo/oIQXNzAg==} '@styled-system/space@5.1.2': - resolution: - { - integrity: sha512-+zzYpR8uvfhcAbaPXhH8QgDAV//flxqxSjHiS9cDFQQUSznXMQmxJegbhcdEF7/eNnJgHeIXv1jmny78kipgBA==, - } + resolution: {integrity: sha512-+zzYpR8uvfhcAbaPXhH8QgDAV//flxqxSjHiS9cDFQQUSznXMQmxJegbhcdEF7/eNnJgHeIXv1jmny78kipgBA==} '@styled-system/typography@5.1.2': - resolution: - { - integrity: sha512-BxbVUnN8N7hJ4aaPOd7wEsudeT7CxarR+2hns8XCX1zp0DFfbWw4xYa/olA0oQaqx7F1hzDg+eRaGzAJbF+jOg==, - } + resolution: {integrity: sha512-BxbVUnN8N7hJ4aaPOd7wEsudeT7CxarR+2hns8XCX1zp0DFfbWw4xYa/olA0oQaqx7F1hzDg+eRaGzAJbF+jOg==} '@styled-system/variant@5.1.5': - resolution: - { - integrity: sha512-Yn8hXAFoWIro8+Q5J8YJd/mP85Teiut3fsGVR9CAxwgNfIAiqlYxsk5iHU7VHJks/0KjL4ATSjmbtCDC/4l1qw==, - } + resolution: {integrity: sha512-Yn8hXAFoWIro8+Q5J8YJd/mP85Teiut3fsGVR9CAxwgNfIAiqlYxsk5iHU7VHJks/0KjL4ATSjmbtCDC/4l1qw==} '@tanstack/query-core@5.90.16': - resolution: - { - integrity: sha512-MvtWckSVufs/ja463/K4PyJeqT+HMlJWtw6PrCpywznd2NSgO3m4KwO9RqbFqGg6iDE8vVMFWMeQI4Io3eEYww==, - } + resolution: {integrity: sha512-MvtWckSVufs/ja463/K4PyJeqT+HMlJWtw6PrCpywznd2NSgO3m4KwO9RqbFqGg6iDE8vVMFWMeQI4Io3eEYww==} '@tanstack/react-query@5.90.16': - resolution: - { - integrity: sha512-bpMGOmV4OPmif7TNMteU/Ehf/hoC0Kf98PDc0F4BZkFrEapRMEqI/V6YS0lyzwSV6PQpY1y4xxArUIfBW5LVxQ==, - } + resolution: {integrity: sha512-bpMGOmV4OPmif7TNMteU/Ehf/hoC0Kf98PDc0F4BZkFrEapRMEqI/V6YS0lyzwSV6PQpY1y4xxArUIfBW5LVxQ==} peerDependencies: react: ^18 || ^19 '@testing-library/dom@7.31.2': - resolution: - { - integrity: sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ==} + engines: {node: '>=10'} '@testing-library/jest-dom@5.11.10': - resolution: - { - integrity: sha512-FuKiq5xuk44Fqm0000Z9w0hjOdwZRNzgx7xGGxQYepWFZy+OYUMOT/wPI4nLYXCaVltNVpU1W/qmD88wLWDsqQ==, - } - engines: { node: '>=8', npm: '>=6', yarn: '>=1' } + resolution: {integrity: sha512-FuKiq5xuk44Fqm0000Z9w0hjOdwZRNzgx7xGGxQYepWFZy+OYUMOT/wPI4nLYXCaVltNVpU1W/qmD88wLWDsqQ==} + engines: {node: '>=8', npm: '>=6', yarn: '>=1'} '@testing-library/react@11.2.5': - resolution: - { - integrity: sha512-yEx7oIa/UWLe2F2dqK0FtMF9sJWNXD+2PPtp39BvE0Kh9MJ9Kl0HrZAgEuhUJR+Lx8Di6Xz+rKwSdEPY2UV8ZQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-yEx7oIa/UWLe2F2dqK0FtMF9sJWNXD+2PPtp39BvE0Kh9MJ9Kl0HrZAgEuhUJR+Lx8Di6Xz+rKwSdEPY2UV8ZQ==} + engines: {node: '>=10'} peerDependencies: react: '*' react-dom: '*' - '@ts-morph/common@0.28.1': - resolution: - { - integrity: sha512-W74iWf7ILp1ZKNYXY5qbddNaml7e9Sedv5lvU1V8lftlitkc9Pq1A+jlH23ltDgWYeZFFEqGCD1Ies9hqu3O+g==, - } - '@tsconfig/node10@1.0.12': - resolution: - { - integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==, - } + resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} '@tsconfig/node12@1.0.11': - resolution: - { - integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==, - } + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} '@tsconfig/node14@1.0.3': - resolution: - { - integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==, - } + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} '@tsconfig/node16@1.0.4': - resolution: - { - integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==, - } + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} '@tufjs/canonical-json@2.0.0': - resolution: - { - integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} + engines: {node: ^16.14.0 || >=18.0.0} '@tufjs/models@2.0.1': - resolution: - { - integrity: sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==} + engines: {node: ^16.14.0 || >=18.0.0} '@tybys/wasm-util@0.10.1': - resolution: - { - integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==, - } + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} '@tybys/wasm-util@0.9.0': - resolution: - { - integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==, - } + resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} '@types/accept-language-parser@1.5.8': - resolution: - { - integrity: sha512-6+dKdh9q/I8xDBnKQKddCBKaWBWLmJ97HTiSbAXVpL7LEgDfOkKF98UVCaZ5KJrtdN5Wa5ndXUiqD3XR9XGqWQ==, - } + resolution: {integrity: sha512-6+dKdh9q/I8xDBnKQKddCBKaWBWLmJ97HTiSbAXVpL7LEgDfOkKF98UVCaZ5KJrtdN5Wa5ndXUiqD3XR9XGqWQ==} '@types/accepts@1.3.7': - resolution: - { - integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==, - } + resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} '@types/aria-query@4.2.2': - resolution: - { - integrity: sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==, - } + resolution: {integrity: sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==} '@types/babel__core@7.20.5': - resolution: - { - integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==, - } + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} '@types/babel__generator@7.27.0': - resolution: - { - integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==, - } + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} '@types/babel__template@7.4.4': - resolution: - { - integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==, - } + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} '@types/babel__traverse@7.28.0': - resolution: - { - integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==, - } + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} '@types/body-parser@1.19.6': - resolution: - { - integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==, - } + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} '@types/connect@3.4.38': - resolution: - { - integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==, - } + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} '@types/content-disposition@0.5.9': - resolution: - { - integrity: sha512-8uYXI3Gw35MhiVYhG3s295oihrxRyytcRHjSjqnqZVDDy/xcGBRny7+Xj1Wgfhv5QzRtN2hB2dVRBUX9XW3UcQ==, - } + resolution: {integrity: sha512-8uYXI3Gw35MhiVYhG3s295oihrxRyytcRHjSjqnqZVDDy/xcGBRny7+Xj1Wgfhv5QzRtN2hB2dVRBUX9XW3UcQ==} '@types/cookies@0.9.2': - resolution: - { - integrity: sha512-1AvkDdZM2dbyFybL4fxpuNCaWyv//0AwsuUk2DWeXyM1/5ZKm6W3z6mQi24RZ4l2ucY+bkSHzbDVpySqPGuV8A==, - } + resolution: {integrity: sha512-1AvkDdZM2dbyFybL4fxpuNCaWyv//0AwsuUk2DWeXyM1/5ZKm6W3z6mQi24RZ4l2ucY+bkSHzbDVpySqPGuV8A==} '@types/cors@2.8.19': - resolution: - { - integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==, - } + resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} '@types/estree@1.0.8': - resolution: - { - integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==, - } + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/express-serve-static-core@5.1.0': - resolution: - { - integrity: sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==, - } + resolution: {integrity: sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==} '@types/express@5.0.6': - resolution: - { - integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==, - } + resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==} '@types/geojson@7946.0.16': - resolution: - { - integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==, - } + resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} '@types/graceful-fs@4.1.9': - resolution: - { - integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==, - } + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} '@types/graphql-upload@8.0.12': - resolution: - { - integrity: sha512-M0ZPZqNUzKNB16q5woEzgG/Q8DjICV80K7JvDSRnDmDFfrRdfFX/n6PbmqAN7gCzECcHVnw1gk6N4Cg0FwxCqA==, - } + resolution: {integrity: sha512-M0ZPZqNUzKNB16q5woEzgG/Q8DjICV80K7JvDSRnDmDFfrRdfFX/n6PbmqAN7gCzECcHVnw1gk6N4Cg0FwxCqA==} '@types/http-assert@1.5.6': - resolution: - { - integrity: sha512-TTEwmtjgVbYAzZYWyeHPrrtWnfVkm8tQkP8P21uQifPgMRgjrow3XDEYqucuC8SKZJT7pUnhU/JymvjggxO9vw==, - } + resolution: {integrity: sha512-TTEwmtjgVbYAzZYWyeHPrrtWnfVkm8tQkP8P21uQifPgMRgjrow3XDEYqucuC8SKZJT7pUnhU/JymvjggxO9vw==} '@types/http-errors@2.0.5': - resolution: - { - integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==, - } + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} '@types/istanbul-lib-coverage@2.0.6': - resolution: - { - integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==, - } + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} '@types/istanbul-lib-report@3.0.3': - resolution: - { - integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==, - } + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} '@types/istanbul-reports@3.0.4': - resolution: - { - integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==, - } + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} '@types/jest-in-case@1.0.9': - resolution: - { - integrity: sha512-tapHpzWGjCC/hxYJyzbJ/5ZV6rA2153Sve5lGJUAIA1Jzrphfp27TznAWfGeXf+d8TLN7zMujaC0UwNQwSJaQg==, - } + resolution: {integrity: sha512-tapHpzWGjCC/hxYJyzbJ/5ZV6rA2153Sve5lGJUAIA1Jzrphfp27TznAWfGeXf+d8TLN7zMujaC0UwNQwSJaQg==} '@types/jest@29.5.14': - resolution: - { - integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==, - } + resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} '@types/jest@30.0.0': - resolution: - { - integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==, - } + resolution: {integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==} '@types/js-yaml@4.0.9': - resolution: - { - integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==, - } + resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} '@types/json-schema@7.0.15': - resolution: - { - integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==, - } + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} '@types/json5@0.0.30': - resolution: - { - integrity: sha512-sqm9g7mHlPY/43fcSNrCYfOeX9zkTTK+euO5E6+CVijSMm5tTjkVdwdqRkY3ljjIAf8679vps5jKUoJBCLsMDA==, - } + resolution: {integrity: sha512-sqm9g7mHlPY/43fcSNrCYfOeX9zkTTK+euO5E6+CVijSMm5tTjkVdwdqRkY3ljjIAf8679vps5jKUoJBCLsMDA==} '@types/jsonwebtoken@9.0.10': - resolution: - { - integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==, - } + resolution: {integrity: sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==} '@types/keygrip@1.0.6': - resolution: - { - integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==, - } + resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==} '@types/koa-compose@3.2.9': - resolution: - { - integrity: sha512-BroAZ9FTvPiCy0Pi8tjD1OfJ7bgU1gQf0eR6e1Vm+JJATy9eKOG3hQMFtMciMawiSOVnLMdmUOC46s7HBhSTsA==, - } + resolution: {integrity: sha512-BroAZ9FTvPiCy0Pi8tjD1OfJ7bgU1gQf0eR6e1Vm+JJATy9eKOG3hQMFtMciMawiSOVnLMdmUOC46s7HBhSTsA==} '@types/koa@3.0.1': - resolution: - { - integrity: sha512-VkB6WJUQSe0zBpR+Q7/YIUESGp5wPHcaXr0xueU5W0EOUWtlSbblsl+Kl31lyRQ63nIILh0e/7gXjQ09JXJIHw==, - } + resolution: {integrity: sha512-VkB6WJUQSe0zBpR+Q7/YIUESGp5wPHcaXr0xueU5W0EOUWtlSbblsl+Kl31lyRQ63nIILh0e/7gXjQ09JXJIHw==} '@types/minimatch@3.0.5': - resolution: - { - integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==, - } + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} '@types/minimist@1.2.5': - resolution: - { - integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==, - } + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} '@types/ms@2.1.0': - resolution: - { - integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==, - } + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} '@types/node@18.19.130': - resolution: - { - integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==, - } + resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} '@types/node@20.19.27': - resolution: - { - integrity: sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==, - } + resolution: {integrity: sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==} '@types/normalize-package-data@2.4.4': - resolution: - { - integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==, - } + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} '@types/pg-copy-streams@1.2.5': - resolution: - { - integrity: sha512-7D6/GYW2uHIaVU6S/5omI+6RZnwlZBpLQDZAH83xX1rjxAOK0f6/deKyyUTewxqts145VIGn6XWYz1YGf50G5g==, - } + resolution: {integrity: sha512-7D6/GYW2uHIaVU6S/5omI+6RZnwlZBpLQDZAH83xX1rjxAOK0f6/deKyyUTewxqts145VIGn6XWYz1YGf50G5g==} '@types/pg@8.16.0': - resolution: - { - integrity: sha512-RmhMd/wD+CF8Dfo+cVIy3RR5cl8CyfXQ0tGgW6XBL8L4LM/UTEbNXYRbLwU6w+CgrKBNbrQWt4FUtTfaU5jSYQ==, - } + resolution: {integrity: sha512-RmhMd/wD+CF8Dfo+cVIy3RR5cl8CyfXQ0tGgW6XBL8L4LM/UTEbNXYRbLwU6w+CgrKBNbrQWt4FUtTfaU5jSYQ==} '@types/qs@6.14.0': - resolution: - { - integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==, - } + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} '@types/range-parser@1.2.7': - resolution: - { - integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==, - } + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} '@types/react@19.2.7': - resolution: - { - integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==, - } + resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==} '@types/request-ip@0.0.41': - resolution: - { - integrity: sha512-Qzz0PM2nSZej4lsLzzNfADIORZhhxO7PED0fXpg4FjXiHuJ/lMyUg+YFF5q8x9HPZH3Gl6N+NOM8QZjItNgGKg==, - } + resolution: {integrity: sha512-Qzz0PM2nSZej4lsLzzNfADIORZhhxO7PED0fXpg4FjXiHuJ/lMyUg+YFF5q8x9HPZH3Gl6N+NOM8QZjItNgGKg==} '@types/semver@7.7.1': - resolution: - { - integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==, - } + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} '@types/send@1.2.1': - resolution: - { - integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==, - } + resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} '@types/serve-static@2.2.0': - resolution: - { - integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==, - } + resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==} '@types/shelljs@0.8.17': - resolution: - { - integrity: sha512-IDksKYmQA2W9MkQjiyptbMmcQx+8+Ol6b7h6dPU5S05JyiQDSb/nZKnrMrZqGwgV6VkVdl6/SPCKPDlMRvqECg==, - } + resolution: {integrity: sha512-IDksKYmQA2W9MkQjiyptbMmcQx+8+Ol6b7h6dPU5S05JyiQDSb/nZKnrMrZqGwgV6VkVdl6/SPCKPDlMRvqECg==} '@types/stack-utils@2.0.3': - resolution: - { - integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==, - } + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} '@types/testing-library__jest-dom@5.14.9': - resolution: - { - integrity: sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==, - } + resolution: {integrity: sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==} '@types/ws@7.4.7': - resolution: - { - integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==, - } + resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} '@types/yargs-parser@21.0.3': - resolution: - { - integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==, - } + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} '@types/yargs@15.0.20': - resolution: - { - integrity: sha512-KIkX+/GgfFitlASYCGoSF+T4XRXhOubJLhkLVtSfsRTe9jWMmuM2g28zQ41BtPTG7TRBb2xHW+LCNVE9QR/vsg==, - } + resolution: {integrity: sha512-KIkX+/GgfFitlASYCGoSF+T4XRXhOubJLhkLVtSfsRTe9jWMmuM2g28zQ41BtPTG7TRBb2xHW+LCNVE9QR/vsg==} '@types/yargs@17.0.35': - resolution: - { - integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==, - } + resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} '@typescript-eslint/eslint-plugin@8.50.1': - resolution: - { - integrity: sha512-PKhLGDq3JAg0Jk/aK890knnqduuI/Qj+udH7wCf0217IGi4gt+acgCyPVe79qoT+qKUvHMDQkwJeKW9fwl8Cyw==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-PKhLGDq3JAg0Jk/aK890knnqduuI/Qj+udH7wCf0217IGi4gt+acgCyPVe79qoT+qKUvHMDQkwJeKW9fwl8Cyw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.50.1 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/parser@8.50.1': - resolution: - { - integrity: sha512-hM5faZwg7aVNa819m/5r7D0h0c9yC4DUlWAOvHAtISdFTc8xB86VmX5Xqabrama3wIPJ/q9RbGS1worb6JfnMg==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-hM5faZwg7aVNa819m/5r7D0h0c9yC4DUlWAOvHAtISdFTc8xB86VmX5Xqabrama3wIPJ/q9RbGS1worb6JfnMg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/project-service@8.50.1': - resolution: - { - integrity: sha512-E1ur1MCVf+YiP89+o4Les/oBAVzmSbeRB0MQLfSlYtbWU17HPxZ6Bhs5iYmKZRALvEuBoXIZMOIRRc/P++Ortg==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-E1ur1MCVf+YiP89+o4Les/oBAVzmSbeRB0MQLfSlYtbWU17HPxZ6Bhs5iYmKZRALvEuBoXIZMOIRRc/P++Ortg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/scope-manager@8.50.1': - resolution: - { - integrity: sha512-mfRx06Myt3T4vuoHaKi8ZWNTPdzKPNBhiblze5N50//TSHOAQQevl/aolqA/BcqqbJ88GUnLqjjcBc8EWdBcVw==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-mfRx06Myt3T4vuoHaKi8ZWNTPdzKPNBhiblze5N50//TSHOAQQevl/aolqA/BcqqbJ88GUnLqjjcBc8EWdBcVw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/tsconfig-utils@8.50.1': - resolution: - { - integrity: sha512-ooHmotT/lCWLXi55G4mvaUF60aJa012QzvLK0Y+Mp4WdSt17QhMhWOaBWeGTFVkb2gDgBe19Cxy1elPXylslDw==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-ooHmotT/lCWLXi55G4mvaUF60aJa012QzvLK0Y+Mp4WdSt17QhMhWOaBWeGTFVkb2gDgBe19Cxy1elPXylslDw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/type-utils@8.50.1': - resolution: - { - integrity: sha512-7J3bf022QZE42tYMO6SL+6lTPKFk/WphhRPe9Tw/el+cEwzLz1Jjz2PX3GtGQVxooLDKeMVmMt7fWpYRdG5Etg==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-7J3bf022QZE42tYMO6SL+6lTPKFk/WphhRPe9Tw/el+cEwzLz1Jjz2PX3GtGQVxooLDKeMVmMt7fWpYRdG5Etg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/types@8.50.1': - resolution: - { - integrity: sha512-v5lFIS2feTkNyMhd7AucE/9j/4V9v5iIbpVRncjk/K0sQ6Sb+Np9fgYS/63n6nwqahHQvbmujeBL7mp07Q9mlA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-v5lFIS2feTkNyMhd7AucE/9j/4V9v5iIbpVRncjk/K0sQ6Sb+Np9fgYS/63n6nwqahHQvbmujeBL7mp07Q9mlA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@8.50.1': - resolution: - { - integrity: sha512-woHPdW+0gj53aM+cxchymJCrh0cyS7BTIdcDxWUNsclr9VDkOSbqC13juHzxOmQ22dDkMZEpZB+3X1WpUvzgVQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-woHPdW+0gj53aM+cxchymJCrh0cyS7BTIdcDxWUNsclr9VDkOSbqC13juHzxOmQ22dDkMZEpZB+3X1WpUvzgVQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/utils@8.50.1': - resolution: - { - integrity: sha512-lCLp8H1T9T7gPbEuJSnHwnSuO9mDf8mfK/Nion5mZmiEaQD9sWf9W4dfeFqRyqRjF06/kBuTmAqcs9sewM2NbQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-lCLp8H1T9T7gPbEuJSnHwnSuO9mDf8mfK/Nion5mZmiEaQD9sWf9W4dfeFqRyqRjF06/kBuTmAqcs9sewM2NbQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/visitor-keys@8.50.1': - resolution: - { - integrity: sha512-IrDKrw7pCRUR94zeuCSUWQ+w8JEf5ZX5jl/e6AHGSLi1/zIr0lgutfn/7JpfCey+urpgQEdrZVYzCaVVKiTwhQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-IrDKrw7pCRUR94zeuCSUWQ+w8JEf5ZX5jl/e6AHGSLi1/zIr0lgutfn/7JpfCey+urpgQEdrZVYzCaVVKiTwhQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.0': - resolution: - { - integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==, - } + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} '@unrs/resolver-binding-android-arm-eabi@1.11.1': - resolution: - { - integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==, - } + resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} cpu: [arm] os: [android] '@unrs/resolver-binding-android-arm64@1.11.1': - resolution: - { - integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==, - } + resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} cpu: [arm64] os: [android] '@unrs/resolver-binding-darwin-arm64@1.11.1': - resolution: - { - integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==, - } + resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} cpu: [arm64] os: [darwin] '@unrs/resolver-binding-darwin-x64@1.11.1': - resolution: - { - integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==, - } + resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} cpu: [x64] os: [darwin] '@unrs/resolver-binding-freebsd-x64@1.11.1': - resolution: - { - integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==, - } + resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} cpu: [x64] os: [freebsd] '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': - resolution: - { - integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==, - } + resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} cpu: [arm] os: [linux] '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': - resolution: - { - integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==, - } + resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} cpu: [arm] os: [linux] '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': - resolution: - { - integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==, - } + resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} cpu: [arm64] os: [linux] '@unrs/resolver-binding-linux-arm64-musl@1.11.1': - resolution: - { - integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==, - } + resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} cpu: [arm64] os: [linux] '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': - resolution: - { - integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==, - } + resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} cpu: [ppc64] os: [linux] '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': - resolution: - { - integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==, - } + resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} cpu: [riscv64] os: [linux] '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': - resolution: - { - integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==, - } + resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} cpu: [riscv64] os: [linux] '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': - resolution: - { - integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==, - } + resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} cpu: [s390x] os: [linux] '@unrs/resolver-binding-linux-x64-gnu@1.11.1': - resolution: - { - integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==, - } + resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} cpu: [x64] os: [linux] '@unrs/resolver-binding-linux-x64-musl@1.11.1': - resolution: - { - integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==, - } + resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} cpu: [x64] os: [linux] '@unrs/resolver-binding-wasm32-wasi@1.11.1': - resolution: - { - integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==, - } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} + engines: {node: '>=14.0.0'} cpu: [wasm32] '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': - resolution: - { - integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==, - } + resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} cpu: [arm64] os: [win32] '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': - resolution: - { - integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==, - } + resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} cpu: [ia32] os: [win32] '@unrs/resolver-binding-win32-x64-msvc@1.11.1': - resolution: - { - integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==, - } + resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} cpu: [x64] os: [win32] '@yarnpkg/lockfile@1.1.0': - resolution: - { - integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==, - } + resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} '@yarnpkg/parsers@3.0.2': - resolution: - { - integrity: sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==, - } - engines: { node: '>=18.12.0' } + resolution: {integrity: sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==} + engines: {node: '>=18.12.0'} '@zkochan/js-yaml@0.0.7': - resolution: - { - integrity: sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==, - } + resolution: {integrity: sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==} hasBin: true JSONStream@1.3.5: - resolution: - { - integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==, - } + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true abbrev@2.0.0: - resolution: - { - integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} accept-language-parser@1.5.0: - resolution: - { - integrity: sha512-QhyTbMLYo0BBGg1aWbeMG4ekWtds/31BrEU+DONOg/7ax23vxpL03Pb7/zBmha2v7vdD3AyzZVWBVGEZxKOXWw==, - } + resolution: {integrity: sha512-QhyTbMLYo0BBGg1aWbeMG4ekWtds/31BrEU+DONOg/7ax23vxpL03Pb7/zBmha2v7vdD3AyzZVWBVGEZxKOXWw==} accepts@2.0.0: - resolution: - { - integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} acorn-jsx@5.3.2: - resolution: - { - integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==, - } + 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' } + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} acorn@8.15.0: - resolution: - { - integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==, - } - engines: { node: '>=0.4.0' } + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} hasBin: true add-stream@1.0.0: - resolution: - { - integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==, - } + resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} agent-base@4.2.1: - resolution: - { - integrity: sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==, - } - engines: { node: '>= 4.0.0' } + resolution: {integrity: sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==} + engines: {node: '>= 4.0.0'} agent-base@4.3.0: - resolution: - { - integrity: sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==, - } - engines: { node: '>= 4.0.0' } + resolution: {integrity: sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==} + engines: {node: '>= 4.0.0'} agent-base@7.1.4: - resolution: - { - integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==, - } - engines: { node: '>= 14' } + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} aggregate-error@3.1.0: - resolution: - { - integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} ajv@6.12.6: - resolution: - { - integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==, - } + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} ajv@7.2.4: - resolution: - { - integrity: sha512-nBeQgg/ZZA3u3SYxyaDvpvDtgZ/EZPF547ARgZBrG9Bhu1vKDwAIjtIf+sDtJUKa2zOcEbmRLBRSyMraS/Oy1A==, - } + resolution: {integrity: sha512-nBeQgg/ZZA3u3SYxyaDvpvDtgZ/EZPF547ARgZBrG9Bhu1vKDwAIjtIf+sDtJUKa2zOcEbmRLBRSyMraS/Oy1A==} ajv@8.17.1: - resolution: - { - integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==, - } + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} ansi-colors@4.1.3: - resolution: - { - integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} ansi-escapes@4.3.2: - resolution: - { - integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} ansi-regex@5.0.1: - resolution: - { - integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} ansi-regex@6.2.2: - resolution: - { - integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} ansi-styles@3.2.1: - resolution: - { - integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} ansi-styles@4.3.0: - resolution: - { - integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} ansi-styles@5.2.0: - resolution: - { - integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} ansi-styles@6.2.3: - resolution: - { - integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} anymatch@3.1.3: - resolution: - { - integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} appstash@0.2.8: - resolution: - { - integrity: sha512-SLeV3iy7ygE7TNiU6AgDMQVhS6xVfO4ps3NDMUK3UcvZKOddykHuEtSuJr6wKzTu9yRnEeK/yisgztSARt/YJA==, - } + resolution: {integrity: sha512-SLeV3iy7ygE7TNiU6AgDMQVhS6xVfO4ps3NDMUK3UcvZKOddykHuEtSuJr6wKzTu9yRnEeK/yisgztSARt/YJA==} aproba@2.0.0: - resolution: - { - integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==, - } + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} arg@4.1.3: - resolution: - { - integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==, - } + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} argparse@1.0.10: - resolution: - { - integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, - } + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} argparse@2.0.1: - resolution: - { - integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, - } + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} aria-query@4.2.2: - resolution: - { - integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==, - } - engines: { node: '>=6.0' } + resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==} + engines: {node: '>=6.0'} array-differ@3.0.0: - resolution: - { - integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} + engines: {node: '>=8'} array-ify@1.0.0: - resolution: - { - integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==, - } + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} array-union@2.1.0: - resolution: - { - integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} arrify@1.0.1: - resolution: - { - integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} arrify@2.0.1: - resolution: - { - integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} + engines: {node: '>=8'} asn1@0.2.6: - resolution: - { - integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==, - } + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} assert-plus@1.0.0: - resolution: - { - integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==, - } - engines: { node: '>=0.8' } + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} ast-types@0.14.2: - resolution: - { - integrity: sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==} + engines: {node: '>=4'} async-retry@1.3.1: - resolution: - { - integrity: sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA==, - } + resolution: {integrity: sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA==} async@2.6.4: - resolution: - { - integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==, - } + resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} async@3.2.6: - resolution: - { - integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==, - } + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} asynckit@0.4.0: - resolution: - { - integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==, - } + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} atob@2.1.2: - resolution: - { - integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==, - } - engines: { node: '>= 4.5.0' } + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} hasBin: true aws-sign2@0.7.0: - resolution: - { - integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==, - } + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} aws4@1.13.2: - resolution: - { - integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==, - } + resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} axios@1.13.2: - resolution: - { - integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==, - } + resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==} babel-jest@29.7.0: - resolution: - { - integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 babel-jest@30.2.0: - resolution: - { - integrity: sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: '@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' } + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} babel-plugin-istanbul@7.0.1: - resolution: - { - integrity: sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==} + engines: {node: '>=12'} 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 } + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} babel-plugin-jest-hoist@30.2.0: - resolution: - { - integrity: sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} babel-plugin-styled-components@2.1.4: - resolution: - { - integrity: sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==, - } + resolution: {integrity: sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==} peerDependencies: styled-components: '>= 2' babel-preset-current-node-syntax@1.2.0: - resolution: - { - integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==, - } + 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 } + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 babel-preset-jest@30.2.0: - resolution: - { - integrity: sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: '@babel/core': ^7.11.0 || ^8.0.0-beta.1 babel-runtime@6.25.0: - resolution: - { - integrity: sha512-zeCYxDePWYAT/DfmQWIHsMSFW2vv45UIwIAMjGvQVsTd47RwsiRH0uK1yzyWZ7LDBKdhnGDPM6NYEO5CZyhPrg==, - } + resolution: {integrity: sha512-zeCYxDePWYAT/DfmQWIHsMSFW2vv45UIwIAMjGvQVsTd47RwsiRH0uK1yzyWZ7LDBKdhnGDPM6NYEO5CZyhPrg==} backo2@1.0.2: - resolution: - { - integrity: sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==, - } + resolution: {integrity: sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==} balanced-match@1.0.2: - resolution: - { - integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, - } + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} base64-js@1.5.1: - resolution: - { - integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, - } + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} baseline-browser-mapping@2.9.11: - resolution: - { - integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==, - } + resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==} hasBin: true bcrypt-pbkdf@1.0.2: - resolution: - { - integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==, - } + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} before-after-hook@2.2.3: - resolution: - { - integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==, - } + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} big-integer@1.6.52: - resolution: - { - integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==, - } - engines: { node: '>=0.6' } + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} bin-links@4.0.4: - resolution: - { - integrity: sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} binary-extensions@2.3.0: - resolution: - { - integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} bl@4.1.0: - resolution: - { - integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==, - } + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} body-parser@1.19.0: - resolution: - { - integrity: sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==} + engines: {node: '>= 0.8'} body-parser@2.2.1: - resolution: - { - integrity: sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==} + engines: {node: '>=18'} boolbase@1.0.0: - resolution: - { - integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==, - } + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} bowser@2.13.1: - resolution: - { - integrity: sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==, - } + resolution: {integrity: sha512-OHawaAbjwx6rqICCKgSG0SAnT05bzd7ppyKLVUITZpANBaaMFBAsaNkto3LoQ31tyFP5kNujE8Cdx85G9VzOkw==} brace-expansion@1.1.12: - resolution: - { - integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==, - } + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} brace-expansion@2.0.2: - resolution: - { - integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==, - } + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} braces@3.0.3: - resolution: - { - integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} broadcast-channel@3.7.0: - resolution: - { - integrity: sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==, - } + resolution: {integrity: sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==} browserslist@4.28.1: - resolution: - { - integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==, - } - engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true bs-logger@0.2.6: - resolution: - { - integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} bser@2.1.1: - resolution: - { - integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==, - } + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} buffer-equal-constant-time@1.0.1: - resolution: - { - integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==, - } + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} buffer-from@1.1.2: - resolution: - { - integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==, - } + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} buffer@5.6.0: - resolution: - { - integrity: sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==, - } + resolution: {integrity: sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==} buffer@5.7.1: - resolution: - { - integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, - } + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} busboy@0.3.1: - resolution: - { - integrity: sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==, - } - engines: { node: '>=4.5.0' } + resolution: {integrity: sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==} + engines: {node: '>=4.5.0'} byte-size@8.1.1: - resolution: - { - integrity: sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==, - } - engines: { node: '>=12.17' } + resolution: {integrity: sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==} + engines: {node: '>=12.17'} bytes@3.1.0: - resolution: - { - integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==} + engines: {node: '>= 0.8'} bytes@3.1.2: - resolution: - { - integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} cacache@18.0.4: - resolution: - { - integrity: sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==} + engines: {node: ^16.14.0 || >=18.0.0} call-bind-apply-helpers@1.0.2: - resolution: - { - integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} call-bind@1.0.8: - resolution: - { - integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} call-bound@1.0.4: - resolution: - { - integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} callsites@3.1.0: - resolution: - { - integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} camel-case@3.0.0: - resolution: - { - integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==, - } + resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} camelcase-keys@6.2.2: - resolution: - { - integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} camelcase@5.3.1: - resolution: - { - integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} camelcase@6.3.0: - resolution: - { - integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} camelize@1.0.1: - resolution: - { - integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==, - } + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} caniuse-lite@1.0.30001761: - resolution: - { - integrity: sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==, - } + resolution: {integrity: sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g==} case@1.6.3: - resolution: - { - integrity: sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==} + engines: {node: '>= 0.8.0'} caseless@0.12.0: - resolution: - { - integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==, - } + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} chalk@2.4.2: - resolution: - { - integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} chalk@3.0.0: - resolution: - { - integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} chalk@4.1.0: - resolution: - { - integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==} + engines: {node: '>=10'} chalk@4.1.2: - resolution: - { - integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} char-regex@1.0.2: - resolution: - { - integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} chardet@2.1.1: - resolution: - { - integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==, - } + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} cheerio-select@2.1.0: - resolution: - { - integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==, - } + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} cheerio@1.0.0-rc.3: - resolution: - { - integrity: sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==} + engines: {node: '>= 0.6'} cheerio@1.1.2: - resolution: - { - integrity: sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==, - } - engines: { node: '>=20.18.1' } + resolution: {integrity: sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==} + engines: {node: '>=20.18.1'} chokidar@3.6.0: - resolution: - { - integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==, - } - engines: { node: '>= 8.10.0' } + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} chownr@2.0.0: - resolution: - { - integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} ci-info@3.9.0: - resolution: - { - integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} ci-info@4.3.1: - resolution: - { - integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} + engines: {node: '>=8'} cjs-module-lexer@1.4.3: - resolution: - { - integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==, - } + resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} cjs-module-lexer@2.1.1: - resolution: - { - integrity: sha512-+CmxIZ/L2vNcEfvNtLdU0ZQ6mbq3FZnwAP2PPTiKP+1QOoKwlKlPgb8UKV0Dds7QVaMnHm+FwSft2VB0s/SLjQ==, - } + resolution: {integrity: sha512-+CmxIZ/L2vNcEfvNtLdU0ZQ6mbq3FZnwAP2PPTiKP+1QOoKwlKlPgb8UKV0Dds7QVaMnHm+FwSft2VB0s/SLjQ==} clean-ansi@0.1.8: - resolution: - { - integrity: sha512-JrOtrYKUm/BLQdhKDRIBQEH8hLhQIHZCckNI+lc5fXlssfbOJFEFEsuBs0/UpQaY/Hf8eJ3CHto+C0JRo6Z79w==, - } + resolution: {integrity: sha512-JrOtrYKUm/BLQdhKDRIBQEH8hLhQIHZCckNI+lc5fXlssfbOJFEFEsuBs0/UpQaY/Hf8eJ3CHto+C0JRo6Z79w==} clean-css@4.2.4: - resolution: - { - integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==, - } - engines: { node: '>= 4.0' } + resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} + engines: {node: '>= 4.0'} clean-stack@2.2.0: - resolution: - { - integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} cli-cursor@3.1.0: - resolution: - { - integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} cli-spinners@2.6.1: - resolution: - { - integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} + engines: {node: '>=6'} cli-spinners@2.9.2: - resolution: - { - integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} cli-width@3.0.0: - resolution: - { - integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} cliui@6.0.0: - resolution: - { - integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==, - } + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} cliui@7.0.4: - resolution: - { - integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==, - } + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} cliui@8.0.1: - resolution: - { - integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} clone-deep@4.0.1: - resolution: - { - integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} clone@1.0.4: - resolution: - { - integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==, - } - engines: { node: '>=0.8' } + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} cmd-shim@6.0.3: - resolution: - { - integrity: sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} co@4.6.0: - resolution: - { - integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==, - } - engines: { iojs: '>= 1.0.0', node: '>= 0.12.0' } - - code-block-writer@13.0.3: - resolution: - { - integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==, - } + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} collect-v8-coverage@1.0.3: - resolution: - { - integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==, - } + resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==} color-convert@1.9.3: - resolution: - { - integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, - } + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} color-convert@2.0.1: - resolution: - { - integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, - } - engines: { node: '>=7.0.0' } + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} color-name@1.1.3: - resolution: - { - integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, - } + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} color-name@1.1.4: - resolution: - { - integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, - } + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} color-support@1.1.3: - resolution: - { - integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==, - } + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true columnify@1.6.0: - resolution: - { - integrity: sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==, - } - engines: { node: '>=8.0.0' } + resolution: {integrity: sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==} + engines: {node: '>=8.0.0'} combined-stream@1.0.8: - resolution: - { - integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} commander@10.0.1: - resolution: - { - integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} commander@12.1.0: - resolution: - { - integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} commander@2.17.1: - resolution: - { - integrity: sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==, - } + resolution: {integrity: sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==} commander@2.19.0: - resolution: - { - integrity: sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==, - } + resolution: {integrity: sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==} commander@2.20.3: - resolution: - { - integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, - } + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} commander@5.1.0: - resolution: - { - integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} common-ancestor-path@1.0.1: - resolution: - { - integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==, - } + resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} compare-func@2.0.0: - resolution: - { - integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==, - } + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} concat-map@0.0.1: - resolution: - { - integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, - } + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} concat-stream@2.0.0: - resolution: - { - integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==, - } - engines: { '0': node >= 6.0 } + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} config-chain@1.1.13: - resolution: - { - integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==, - } + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} console-control-strings@1.1.0: - resolution: - { - integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==, - } + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} content-disposition@1.0.1: - resolution: - { - integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} + engines: {node: '>=18'} content-type@1.0.5: - resolution: - { - integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} conventional-changelog-angular@7.0.0: - resolution: - { - integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==, - } - engines: { node: '>=16' } + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} conventional-changelog-core@5.0.1: - resolution: - { - integrity: sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A==} + engines: {node: '>=14'} conventional-changelog-preset-loader@3.0.0: - resolution: - { - integrity: sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==} + engines: {node: '>=14'} conventional-changelog-writer@6.0.1: - resolution: - { - integrity: sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==} + engines: {node: '>=14'} hasBin: true conventional-commits-filter@3.0.0: - resolution: - { - integrity: sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==} + engines: {node: '>=14'} conventional-commits-parser@4.0.0: - resolution: - { - integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==} + engines: {node: '>=14'} hasBin: true conventional-recommended-bump@7.0.1: - resolution: - { - integrity: sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA==} + engines: {node: '>=14'} hasBin: true convert-source-map@2.0.0: - resolution: - { - integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, - } + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} cookie-signature@1.2.2: - resolution: - { - integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==, - } - engines: { node: '>=6.6.0' } + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} cookie@0.7.2: - resolution: - { - integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} copyfiles@2.4.1: - resolution: - { - integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==, - } + resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} hasBin: true core-js-pure@3.47.0: - resolution: - { - integrity: sha512-BcxeDbzUrRnXGYIVAGFtcGQVNpFcUhVjr6W7F8XktvQW2iJP9e66GP6xdKotCRFlrxBvNIBrhwKteRXqMV86Nw==, - } + resolution: {integrity: sha512-BcxeDbzUrRnXGYIVAGFtcGQVNpFcUhVjr6W7F8XktvQW2iJP9e66GP6xdKotCRFlrxBvNIBrhwKteRXqMV86Nw==} core-js@2.6.12: - resolution: - { - integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==, - } + resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. core-util-is@1.0.2: - resolution: - { - integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==, - } + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} core-util-is@1.0.3: - resolution: - { - integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, - } + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} cors@2.8.5: - resolution: - { - integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==, - } - engines: { node: '>= 0.10' } + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} cosmiconfig@9.0.0: - resolution: - { - integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} peerDependencies: typescript: '>=4.9.5' peerDependenciesMeta: @@ -6284,148 +4507,82 @@ packages: optional: true create-jest@29.7.0: - resolution: - { - integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.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==, - } + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} cron-parser@2.18.0: - resolution: - { - integrity: sha512-s4odpheTyydAbTBQepsqd2rNWGa2iV3cyo8g7zbI2QQYGLVsfbhmwukayS1XHppe02Oy1fg7mg6xoaraVJeEcg==, - } - engines: { node: '>=0.8' } + resolution: {integrity: sha512-s4odpheTyydAbTBQepsqd2rNWGa2iV3cyo8g7zbI2QQYGLVsfbhmwukayS1XHppe02Oy1fg7mg6xoaraVJeEcg==} + engines: {node: '>=0.8'} cross-spawn@7.0.6: - resolution: - { - integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} css-color-keywords@1.0.0: - resolution: - { - integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} css-select@1.2.0: - resolution: - { - integrity: sha512-dUQOBoqdR7QwV90WysXPLXG5LO7nhYBgiWVfxF80DKPF8zx1t/pUd2FYy73emg3zrjtM6dzmYgbHKfV2rxiHQA==, - } + resolution: {integrity: sha512-dUQOBoqdR7QwV90WysXPLXG5LO7nhYBgiWVfxF80DKPF8zx1t/pUd2FYy73emg3zrjtM6dzmYgbHKfV2rxiHQA==} css-select@5.2.2: - resolution: - { - integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==, - } + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} css-to-react-native@3.2.0: - resolution: - { - integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==, - } + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} css-what@2.1.3: - resolution: - { - integrity: sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==, - } + resolution: {integrity: sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==} css-what@6.2.2: - resolution: - { - integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} css.escape@1.5.1: - resolution: - { - integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==, - } + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} css@3.0.0: - resolution: - { - integrity: sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==, - } + resolution: {integrity: sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==} cssesc@3.0.0: - resolution: - { - integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} hasBin: true csstype@3.2.3: - resolution: - { - integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==, - } + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} csv-parse@6.1.0: - resolution: - { - integrity: sha512-CEE+jwpgLn+MmtCpVcPtiCZpVtB6Z2OKPTr34pycYYoL7sxdOkXDdQ4lRiw6ioC0q6BLqhc6cKweCVvral8yhw==, - } + resolution: {integrity: sha512-CEE+jwpgLn+MmtCpVcPtiCZpVtB6Z2OKPTr34pycYYoL7sxdOkXDdQ4lRiw6ioC0q6BLqhc6cKweCVvral8yhw==} csv-parser@2.3.5: - resolution: - { - integrity: sha512-LCHolC4AlNwL+5EuD5LH2VVNKpD8QixZW2zzK1XmrVYUaslFY4c5BooERHOCIubG9iv/DAyFjs4x0HvWNZuyWg==, - } - engines: { node: '>= 8.16.0' } + resolution: {integrity: sha512-LCHolC4AlNwL+5EuD5LH2VVNKpD8QixZW2zzK1XmrVYUaslFY4c5BooERHOCIubG9iv/DAyFjs4x0HvWNZuyWg==} + engines: {node: '>= 8.16.0'} hasBin: true dargs@7.0.0: - resolution: - { - integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} dashdash@1.14.1: - resolution: - { - integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==, - } - engines: { node: '>=0.10' } + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} data-uri-to-buffer@1.2.0: - resolution: - { - integrity: sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==, - } + resolution: {integrity: sha512-vKQ9DTQPN1FLYiiEEOQ6IBGFqvjCa5rSK3cWMy/Nespm5d/x3dGFT9UBZnkLxCwua/IXBi2TYnwTEpsOvhC4UQ==} dataloader@2.2.3: - resolution: - { - integrity: sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==, - } + resolution: {integrity: sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA==} dateformat@3.0.3: - resolution: - { - integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==, - } + resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} debug@2.6.9: - resolution: - { - integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==, - } + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -6433,10 +4590,7 @@ packages: optional: true debug@3.1.0: - resolution: - { - integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==, - } + resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -6444,10 +4598,7 @@ packages: optional: true debug@3.2.7: - resolution: - { - integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==, - } + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -6455,11 +4606,8 @@ packages: optional: true debug@4.4.3: - resolution: - { - integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==, - } - engines: { node: '>=6.0' } + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -6467,31 +4615,19 @@ packages: optional: true decamelize-keys@1.1.1: - resolution: - { - integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} decamelize@1.2.0: - resolution: - { - integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} decode-uri-component@0.2.2: - resolution: - { - integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==, - } - engines: { node: '>=0.10' } + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} dedent@1.5.3: - resolution: - { - integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==, - } + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -6499,10 +4635,7 @@ packages: optional: true dedent@1.7.1: - resolution: - { - integrity: sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==, - } + resolution: {integrity: sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -6510,245 +4643,134 @@ packages: optional: true deep-is@0.1.4: - resolution: - { - integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==, - } + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} deepmerge@4.3.1: - resolution: - { - integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} defaults@1.0.4: - resolution: - { - integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==, - } + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} define-data-property@1.1.4: - resolution: - { - integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} define-lazy-prop@2.0.0: - resolution: - { - integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} define-properties@1.2.1: - resolution: - { - integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} degenerator@1.0.4: - resolution: - { - integrity: sha512-EMAC+riLSC64jKfOs1jp8J7M4ZXstUUwTdwFBEv6HOzL/Ae+eAzMKEK0nJnpof2fnw9IOjmE6u6qXFejVyk8AA==, - } + resolution: {integrity: sha512-EMAC+riLSC64jKfOs1jp8J7M4ZXstUUwTdwFBEv6HOzL/Ae+eAzMKEK0nJnpof2fnw9IOjmE6u6qXFejVyk8AA==} delayed-stream@1.0.0: - resolution: - { - integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==, - } - engines: { node: '>=0.4.0' } + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} depd@1.1.2: - resolution: - { - integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} depd@2.0.0: - resolution: - { - integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} deprecation@2.3.1: - resolution: - { - integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==, - } + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} detect-indent@5.0.0: - resolution: - { - integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==} + engines: {node: '>=4'} detect-newline@3.1.0: - resolution: - { - integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} detect-node@2.1.0: - resolution: - { - integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==, - } + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} dicer@0.3.0: - resolution: - { - integrity: sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==, - } - engines: { node: '>=4.5.0' } + resolution: {integrity: sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==} + engines: {node: '>=4.5.0'} diff-sequences@29.6.3: - resolution: - { - integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} diff@4.0.2: - resolution: - { - integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==, - } - engines: { node: '>=0.3.1' } + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} dom-accessibility-api@0.5.16: - resolution: - { - integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==, - } + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} dom-serializer@0.1.1: - resolution: - { - integrity: sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==, - } + resolution: {integrity: sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==} dom-serializer@0.2.2: - resolution: - { - integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==, - } + resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} dom-serializer@1.4.1: - resolution: - { - integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==, - } + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} dom-serializer@2.0.0: - resolution: - { - integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==, - } + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} domelementtype@1.3.1: - resolution: - { - integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==, - } + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} domelementtype@2.3.0: - resolution: - { - integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==, - } + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} domhandler@2.4.2: - resolution: - { - integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==, - } + resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==} domhandler@3.3.0: - resolution: - { - integrity: sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==, - } - engines: { node: '>= 4' } + resolution: {integrity: sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==} + engines: {node: '>= 4'} domhandler@4.3.1: - resolution: - { - integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==, - } - engines: { node: '>= 4' } + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} domhandler@5.0.3: - resolution: - { - integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==, - } - engines: { node: '>= 4' } + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} domutils@1.5.1: - resolution: - { - integrity: sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==, - } + resolution: {integrity: sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==} domutils@1.7.0: - resolution: - { - integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==, - } + resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} domutils@2.8.0: - resolution: - { - integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==, - } + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} domutils@3.2.2: - resolution: - { - integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==, - } + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} dot-prop@5.3.0: - resolution: - { - integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} dotenv-expand@11.0.7: - resolution: - { - integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} + engines: {node: '>=12'} dotenv@16.4.7: - resolution: - { - integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} + engines: {node: '>=12'} dotenv@8.6.0: - resolution: - { - integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} + engines: {node: '>=10'} drizzle-orm@0.45.1: - resolution: - { - integrity: sha512-Te0FOdKIistGNPMq2jscdqngBRfBpC8uMFVwqjf6gtTVJHIQ/dosgV/CLBU2N4ZJBsXL5savCba9b0YJskKdcA==, - } + resolution: {integrity: sha512-Te0FOdKIistGNPMq2jscdqngBRfBpC8uMFVwqjf6gtTVJHIQ/dosgV/CLBU2N4ZJBsXL5savCba9b0YJskKdcA==} peerDependencies: '@aws-sdk/client-rds-data': '>=3' '@cloudflare/workers-types': '>=4' @@ -6840,295 +4862,166 @@ packages: optional: true dunder-proto@1.0.1: - resolution: - { - integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} eastasianwidth@0.2.0: - resolution: - { - integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, - } + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} ecc-jsbn@0.1.2: - resolution: - { - integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==, - } + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} ecdsa-sig-formatter@1.0.11: - resolution: - { - integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==, - } + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} editorconfig@1.0.4: - resolution: - { - integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} hasBin: true ee-first@1.1.1: - resolution: - { - integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, - } + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} ejs@3.1.10: - resolution: - { - integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} hasBin: true electron-to-chromium@1.5.267: - resolution: - { - integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==, - } + resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} emittery@0.13.1: - resolution: - { - integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} emoji-regex@8.0.0: - resolution: - { - integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, - } + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} emoji-regex@9.2.2: - resolution: - { - integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, - } + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} encodeurl@2.0.0: - resolution: - { - integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} encoding-sniffer@0.2.1: - resolution: - { - integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==, - } + resolution: {integrity: sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==} encoding@0.1.13: - resolution: - { - integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==, - } + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} end-of-stream@1.4.5: - resolution: - { - integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==, - } + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} enquirer@2.3.6: - resolution: - { - integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==, - } - engines: { node: '>=8.6' } + resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} + engines: {node: '>=8.6'} entities@1.1.2: - resolution: - { - integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==, - } + resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} entities@2.2.0: - resolution: - { - integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==, - } + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} entities@4.5.0: - resolution: - { - integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, - } - engines: { node: '>=0.12' } + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} entities@6.0.1: - resolution: - { - integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==, - } - engines: { node: '>=0.12' } + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} env-paths@2.2.1: - resolution: - { - integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} envalid@6.0.2: - resolution: - { - integrity: sha512-ChJb9a5rjwZ/NkcXfBrzEl5cFZaGLg38N7MlWJkv5qsmSypX2WJe28LkoAWcklC60nKZXYKRlBbsjuJSjYw0Xg==, - } - engines: { node: '>=8.12' } + resolution: {integrity: sha512-ChJb9a5rjwZ/NkcXfBrzEl5cFZaGLg38N7MlWJkv5qsmSypX2WJe28LkoAWcklC60nKZXYKRlBbsjuJSjYw0Xg==} + engines: {node: '>=8.12'} envalid@8.1.1: - resolution: - { - integrity: sha512-vOUfHxAFFvkBjbVQbBfgnCO9d3GcNfMMTtVfgqSU2rQGMFEVqWy9GBuoSfHnwGu7EqR0/GeukQcL3KjFBaga9w==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-vOUfHxAFFvkBjbVQbBfgnCO9d3GcNfMMTtVfgqSU2rQGMFEVqWy9GBuoSfHnwGu7EqR0/GeukQcL3KjFBaga9w==} + engines: {node: '>=18'} envinfo@7.13.0: - resolution: - { - integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==} + engines: {node: '>=4'} hasBin: true err-code@2.0.3: - resolution: - { - integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==, - } + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} error-ex@1.3.4: - resolution: - { - integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==, - } + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} es-define-property@1.0.1: - resolution: - { - integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} es-errors@1.3.0: - resolution: - { - integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} es-object-atoms@1.1.1: - resolution: - { - integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} es-set-tostringtag@2.1.0: - resolution: - { - integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} es6-promise@4.2.8: - resolution: - { - integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==, - } + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} es6-promisify@5.0.0: - resolution: - { - integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==, - } + resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} esbuild@0.27.2: - resolution: - { - integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} + engines: {node: '>=18'} hasBin: true escalade@3.2.0: - resolution: - { - integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} escape-goat@3.0.0: - resolution: - { - integrity: sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==} + engines: {node: '>=10'} escape-html@1.0.3: - resolution: - { - integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==, - } + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} escape-string-regexp@1.0.5: - resolution: - { - integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, - } - engines: { node: '>=0.8.0' } + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} escape-string-regexp@2.0.0: - resolution: - { - integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} escape-string-regexp@4.0.0: - resolution: - { - integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} escodegen@1.14.3: - resolution: - { - integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==, - } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} + engines: {node: '>=4.0'} hasBin: true eslint-config-prettier@10.1.8: - resolution: - { - integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==, - } + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} hasBin: true peerDependencies: eslint: '>=7.0.0' eslint-plugin-simple-import-sort@12.1.1: - resolution: - { - integrity: sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==, - } + resolution: {integrity: sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==} peerDependencies: eslint: '>=5.0.0' eslint-plugin-unused-imports@4.3.0: - resolution: - { - integrity: sha512-ZFBmXMGBYfHttdRtOG9nFFpmUvMtbHSjsKrS20vdWdbfiVYsO3yA2SGYy9i9XmZJDfMGBflZGBCm70SEnFQtOA==, - } + resolution: {integrity: sha512-ZFBmXMGBYfHttdRtOG9nFFpmUvMtbHSjsKrS20vdWdbfiVYsO3yA2SGYy9i9XmZJDfMGBflZGBCm70SEnFQtOA==} peerDependencies: '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 eslint: ^9.0.0 || ^8.0.0 @@ -7137,32 +5030,20 @@ packages: optional: true eslint-scope@8.4.0: - resolution: - { - integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: - resolution: - { - integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} eslint-visitor-keys@4.2.1: - resolution: - { - integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint@9.39.2: - resolution: - { - integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: jiti: '*' @@ -7171,213 +5052,120 @@ packages: optional: true espree@10.4.0: - resolution: - { - integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} esprima@3.1.3: - resolution: - { - integrity: sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==} + engines: {node: '>=4'} hasBin: true esprima@4.0.1: - resolution: - { - integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} hasBin: true esquery@1.6.0: - resolution: - { - integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==, - } - engines: { node: '>=0.10' } + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} esrecurse@4.3.0: - resolution: - { - integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==, - } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} estraverse@4.3.0: - resolution: - { - integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==, - } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} estraverse@5.3.0: - resolution: - { - integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==, - } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} esutils@2.0.3: - resolution: - { - integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} etag@1.8.1: - resolution: - { - integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} eventemitter3@3.1.2: - resolution: - { - integrity: sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==, - } + resolution: {integrity: sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==} eventemitter3@4.0.7: - resolution: - { - integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==, - } + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} events@3.3.0: - resolution: - { - integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==, - } - engines: { node: '>=0.8.x' } + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} execa@5.0.0: - resolution: - { - integrity: sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==} + engines: {node: '>=10'} execa@5.1.1: - resolution: - { - integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} exit-x@0.2.2: - resolution: - { - integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} + engines: {node: '>= 0.8.0'} exit@0.1.2: - resolution: - { - integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} expect@29.7.0: - resolution: - { - integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.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==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} exponential-backoff@3.1.3: - resolution: - { - integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==, - } + resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} express@5.2.1: - resolution: - { - integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==, - } - engines: { node: '>= 18' } + resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} + engines: {node: '>= 18'} extend@3.0.2: - resolution: - { - integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==, - } + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} extsprintf@1.3.0: - resolution: - { - integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==, - } - engines: { '0': node >=0.6.0 } + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} fast-deep-equal@3.1.3: - resolution: - { - integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, - } + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} fast-glob@3.3.3: - resolution: - { - integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==, - } - engines: { node: '>=8.6.0' } + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: - resolution: - { - integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==, - } + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} fast-levenshtein@2.0.6: - resolution: - { - integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==, - } + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} fast-uri@3.1.0: - resolution: - { - integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==, - } + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} fast-xml-parser@5.2.5: - resolution: - { - integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==, - } + resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} hasBin: true fastq@1.20.1: - resolution: - { - integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==, - } + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} fb-watchman@2.0.2: - resolution: - { - integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==, - } + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} fdir@6.5.0: - resolution: - { - integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==, - } - engines: { node: '>=12.0.0' } + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -7385,105 +5173,60 @@ packages: optional: true figures@3.2.0: - resolution: - { - integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} file-entry-cache@8.0.0: - resolution: - { - integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==, - } - engines: { node: '>=16.0.0' } + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} file-uri-to-path@1.0.0: - resolution: - { - integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==, - } + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} filelist@1.0.4: - resolution: - { - integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==, - } + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} fill-range@7.1.1: - resolution: - { - integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} finalhandler@1.3.2: - resolution: - { - integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==} + engines: {node: '>= 0.8'} finalhandler@2.1.1: - resolution: - { - integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==, - } - engines: { node: '>= 18.0.0' } + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} find-and-require-package-json@0.8.6: - resolution: - { - integrity: sha512-N+funttvcGC9h7JxCs089fAyNhEpKzFnP0nUYOS+V2RWvI40rtVhANPozc72pJl9lMzqoPFTimlfqZg6zZGPRQ==, - } + resolution: {integrity: sha512-N+funttvcGC9h7JxCs089fAyNhEpKzFnP0nUYOS+V2RWvI40rtVhANPozc72pJl9lMzqoPFTimlfqZg6zZGPRQ==} find-up@2.1.0: - resolution: - { - integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} find-up@4.1.0: - resolution: - { - integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} find-up@5.0.0: - resolution: - { - integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} flat-cache@4.0.1: - resolution: - { - integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==, - } - engines: { node: '>=16' } + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} flat@5.0.2: - resolution: - { - integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==, - } + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true flatted@3.3.3: - resolution: - { - integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==, - } + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} follow-redirects@1.15.11: - resolution: - { - integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==, - } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} peerDependencies: debug: '*' peerDependenciesMeta: @@ -7491,1139 +5234,647 @@ packages: optional: true foreground-child@3.3.1: - resolution: - { - integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} forever-agent@0.6.1: - resolution: - { - integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==, - } + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} form-data@2.3.3: - resolution: - { - integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==, - } - engines: { node: '>= 0.12' } + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} form-data@2.5.5: - resolution: - { - integrity: sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==, - } - engines: { node: '>= 0.12' } + resolution: {integrity: sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==} + engines: {node: '>= 0.12'} form-data@4.0.5: - resolution: - { - integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} forwarded@0.2.0: - resolution: - { - integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} fresh@2.0.0: - resolution: - { - integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} front-matter@4.0.2: - resolution: - { - integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==, - } + resolution: {integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==} fs-capacitor@6.2.0: - resolution: - { - integrity: sha512-nKcE1UduoSKX27NSZlg879LdQc94OtbOsEmKMN2MBNudXREvijRKx2GEBsTMTfws+BrbkJoEuynbGSVRSpauvw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-nKcE1UduoSKX27NSZlg879LdQc94OtbOsEmKMN2MBNudXREvijRKx2GEBsTMTfws+BrbkJoEuynbGSVRSpauvw==} + engines: {node: '>=10'} fs-capacitor@8.0.0: - resolution: - { - integrity: sha512-+Lk6iSKajdGw+7XYxUkwIzreJ2G1JFlYOdnKJv5PzwFLVsoJYBpCuS7WPIUSNT1IbQaEWT1nhYU63Ud03DyzLA==, - } - engines: { node: ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-+Lk6iSKajdGw+7XYxUkwIzreJ2G1JFlYOdnKJv5PzwFLVsoJYBpCuS7WPIUSNT1IbQaEWT1nhYU63Ud03DyzLA==} + engines: {node: ^14.17.0 || >=16.0.0} fs-constants@1.0.0: - resolution: - { - integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==, - } + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} fs-extra@11.3.3: - resolution: - { - integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==, - } - engines: { node: '>=14.14' } + resolution: {integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==} + engines: {node: '>=14.14'} fs-minipass@2.1.0: - resolution: - { - integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} fs-minipass@3.0.3: - resolution: - { - integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} fs.realpath@1.0.0: - resolution: - { - integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==, - } + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} fsevents@2.3.2: - resolution: - { - integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, - } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] fsevents@2.3.3: - resolution: - { - integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==, - } - engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] ftp@0.3.10: - resolution: - { - integrity: sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==, - } - engines: { node: '>=0.8.0' } + resolution: {integrity: sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==} + engines: {node: '>=0.8.0'} function-bind@1.1.2: - resolution: - { - integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, - } + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} genomic@5.2.3: - resolution: - { - integrity: sha512-h93BqFC0gZgnInrAhozkYFV1UT1Pf/ffU8kh6JgF8Cqm0ypY8Iol5AvINVsgGXcQtcA00xcBOlJ5xc4tOXXZBA==, - } + resolution: {integrity: sha512-h93BqFC0gZgnInrAhozkYFV1UT1Pf/ffU8kh6JgF8Cqm0ypY8Iol5AvINVsgGXcQtcA00xcBOlJ5xc4tOXXZBA==} gensync@1.0.0-beta.2: - resolution: - { - integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} get-caller-file@2.0.5: - resolution: - { - integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==, - } - engines: { node: 6.* || 8.* || >= 10.* } + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} get-intrinsic@1.3.0: - resolution: - { - integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} get-package-type@0.1.0: - resolution: - { - integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==, - } - engines: { node: '>=8.0.0' } + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} get-pkg-repo@4.2.1: - resolution: - { - integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} + engines: {node: '>=6.9.0'} hasBin: true get-port@5.1.1: - resolution: - { - integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} + engines: {node: '>=8'} get-proto@1.0.1: - resolution: - { - integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} get-stream@6.0.0: - resolution: - { - integrity: sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==} + engines: {node: '>=10'} get-stream@6.0.1: - resolution: - { - integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} get-tsconfig@4.13.0: - resolution: - { - integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==, - } + resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} get-uri@2.0.4: - resolution: - { - integrity: sha512-v7LT/s8kVjs+Tx0ykk1I+H/rbpzkHvuIq87LmeXptcf5sNWm9uQiwjNAt94SJPA1zOlCntmnOlJvVWKmzsxG8Q==, - } + resolution: {integrity: sha512-v7LT/s8kVjs+Tx0ykk1I+H/rbpzkHvuIq87LmeXptcf5sNWm9uQiwjNAt94SJPA1zOlCntmnOlJvVWKmzsxG8Q==} getpass@0.1.7: - resolution: - { - integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==, - } + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} git-raw-commits@3.0.0: - resolution: - { - integrity: sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==} + engines: {node: '>=14'} hasBin: true git-remote-origin-url@2.0.0: - resolution: - { - integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} + engines: {node: '>=4'} git-semver-tags@5.0.1: - resolution: - { - integrity: sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA==} + engines: {node: '>=14'} hasBin: true git-up@7.0.0: - resolution: - { - integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==, - } + resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} git-url-parse@14.0.0: - resolution: - { - integrity: sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ==, - } + resolution: {integrity: sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ==} gitconfiglocal@1.0.0: - resolution: - { - integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==, - } + resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} glob-parent@5.1.2: - resolution: - { - integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, - } - engines: { node: '>= 6' } + 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' } + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} glob@10.5.0: - resolution: - { - integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==, - } + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} hasBin: true glob@11.1.0: - resolution: - { - integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} + engines: {node: 20 || >=22} hasBin: true glob@13.0.0: - resolution: - { - integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} + engines: {node: 20 || >=22} glob@7.2.3: - resolution: - { - integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, - } + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported glob@9.3.5: - resolution: - { - integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==, - } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} + engines: {node: '>=16 || 14 >=14.17'} globals@14.0.0: - resolution: - { - integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} gopd@1.2.0: - resolution: - { - integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} graceful-fs@4.2.11: - resolution: - { - integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, - } + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} graphile-build-pg@4.14.1: - resolution: - { - integrity: sha512-7DIVbcfMU5lXNkGnAeobqm29AvjFYw4/xOlKNQk3NE/mfFDcyPuXYboypmtxzglg1hGXkyONLYnas9vzL+SunQ==, - } - engines: { node: '>=8.6' } + resolution: {integrity: sha512-7DIVbcfMU5lXNkGnAeobqm29AvjFYw4/xOlKNQk3NE/mfFDcyPuXYboypmtxzglg1hGXkyONLYnas9vzL+SunQ==} + engines: {node: '>=8.6'} peerDependencies: pg: '>=6.1.0 <9' graphile-build@4.14.1: - resolution: - { - integrity: sha512-l/ylyMK0vl5LCOScpTsTedNZUqwBgafXS7RPDW1YiQofeioVtTDMdV9k3zRkXdMKtKqJsvOBvjXn64WGLaLInQ==, - } - engines: { node: '>=8.6' } + resolution: {integrity: sha512-l/ylyMK0vl5LCOScpTsTedNZUqwBgafXS7RPDW1YiQofeioVtTDMdV9k3zRkXdMKtKqJsvOBvjXn64WGLaLInQ==} + engines: {node: '>=8.6'} peerDependencies: graphql: '>=0.9 <0.14 || ^14.0.2 || ^15.4.0' graphile-utils@4.14.1: - resolution: - { - integrity: sha512-FgviZVKO3NS8va2inqUVQQFSnFLEG7FiH64BqSVRHSF8jwSXKcpx5NiRibErNvvIdnuzgVAXQ3W4jcXvMSx0Tg==, - } - engines: { node: '>=8.6' } + resolution: {integrity: sha512-FgviZVKO3NS8va2inqUVQQFSnFLEG7FiH64BqSVRHSF8jwSXKcpx5NiRibErNvvIdnuzgVAXQ3W4jcXvMSx0Tg==} + engines: {node: '>=8.6'} peerDependencies: graphile-build: ^4.5.0 graphile-build-pg: ^4.5.0 graphql-parse-resolve-info@4.14.1: - resolution: - { - integrity: sha512-WKHukfEuZamP1ZONR84b8iT+4sJgEhtXMDArm1jpXEsU2vTb5EgkCZ4Obfl+v09oNTKXm0CJjPfBUZ5jcJ2Ykg==, - } - engines: { node: '>=8.6' } + resolution: {integrity: sha512-WKHukfEuZamP1ZONR84b8iT+4sJgEhtXMDArm1jpXEsU2vTb5EgkCZ4Obfl+v09oNTKXm0CJjPfBUZ5jcJ2Ykg==} + engines: {node: '>=8.6'} peerDependencies: graphql: '>=0.9 <0.14 || ^14.0.2 || ^15.4.0 || ^16.3.0' graphql-request@7.4.0: - resolution: - { - integrity: sha512-xfr+zFb/QYbs4l4ty0dltqiXIp07U6sl+tOKAb0t50/EnQek6CVVBLjETXi+FghElytvgaAWtIOt3EV7zLzIAQ==, - } + resolution: {integrity: sha512-xfr+zFb/QYbs4l4ty0dltqiXIp07U6sl+tOKAb0t50/EnQek6CVVBLjETXi+FghElytvgaAWtIOt3EV7zLzIAQ==} peerDependencies: graphql: 14 - 16 graphql-tag@2.12.6: - resolution: - { - integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} + engines: {node: '>=10'} peerDependencies: graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 graphql-upload@13.0.0: - resolution: - { - integrity: sha512-YKhx8m/uOtKu4Y1UzBFJhbBGJTlk7k4CydlUUiNrtxnwZv0WigbRHP+DVhRNKt7u7DXOtcKZeYJlGtnMXvreXA==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >= 16.0.0 } + resolution: {integrity: sha512-YKhx8m/uOtKu4Y1UzBFJhbBGJTlk7k4CydlUUiNrtxnwZv0WigbRHP+DVhRNKt7u7DXOtcKZeYJlGtnMXvreXA==} + engines: {node: ^12.22.0 || ^14.17.0 || >= 16.0.0} peerDependencies: graphql: 0.13.1 - 16 graphql-ws@5.16.2: - resolution: - { - integrity: sha512-E1uccsZxt/96jH/OwmLPuXMACILs76pKF2i3W861LpKBCYtGIyPQGtWLuBLkND4ox1KHns70e83PS4te50nvPQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-E1uccsZxt/96jH/OwmLPuXMACILs76pKF2i3W861LpKBCYtGIyPQGtWLuBLkND4ox1KHns70e83PS4te50nvPQ==} + engines: {node: '>=10'} peerDependencies: graphql: '>=0.11 <=16' graphql@15.10.1: - resolution: - { - integrity: sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==, - } - engines: { node: '>= 10.x' } + resolution: {integrity: sha512-BL/Xd/T9baO6NFzoMpiMD7YUZ62R6viR5tp/MULVEnbYJXZA//kRNW7J0j1w/wXArgL0sCxhDfK5dczSKn3+cg==} + engines: {node: '>= 10.x'} handlebars@4.7.8: - resolution: - { - integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==, - } - engines: { node: '>=0.4.7' } + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} hasBin: true har-schema@2.0.0: - resolution: - { - integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} har-validator@5.1.5: - resolution: - { - integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} deprecated: this library is no longer supported hard-rejection@2.1.0: - resolution: - { - integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} has-flag@3.0.0: - resolution: - { - integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} has-flag@4.0.0: - resolution: - { - integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} has-property-descriptors@1.0.2: - resolution: - { - integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==, - } + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} has-symbols@1.1.0: - resolution: - { - integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} has-tostringtag@1.0.2: - resolution: - { - integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} has-unicode@2.0.1: - resolution: - { - integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==, - } + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} hasown@2.0.2: - resolution: - { - integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} he@1.2.0: - resolution: - { - integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==, - } + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true hoist-non-react-statics@3.3.2: - resolution: - { - integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==, - } + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} hosted-git-info@2.8.9: - resolution: - { - integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==, - } + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} hosted-git-info@4.1.0: - resolution: - { - integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} hosted-git-info@7.0.2: - resolution: - { - integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} html-escaper@2.0.2: - resolution: - { - integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==, - } + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} html-minifier@3.5.21: - resolution: - { - integrity: sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==} + engines: {node: '>=4'} hasBin: true htmlparser2@10.0.0: - resolution: - { - integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==, - } + resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} htmlparser2@3.10.1: - resolution: - { - integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==, - } + resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==} htmlparser2@4.1.0: - resolution: - { - integrity: sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==, - } + resolution: {integrity: sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==} http-cache-semantics@4.2.0: - resolution: - { - integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==, - } + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} http-errors@1.7.2: - resolution: - { - integrity: sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==} + engines: {node: '>= 0.6'} http-errors@1.8.1: - resolution: - { - integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} http-errors@2.0.1: - resolution: - { - integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} + engines: {node: '>= 0.8'} http-proxy-agent@2.1.0: - resolution: - { - integrity: sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==, - } - engines: { node: '>= 4.5.0' } + resolution: {integrity: sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==} + engines: {node: '>= 4.5.0'} http-proxy-agent@7.0.2: - resolution: - { - integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==, - } - engines: { node: '>= 14' } + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} http-signature@1.2.0: - resolution: - { - integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==, - } - engines: { node: '>=0.8', npm: '>=1.3.7' } + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} https-proxy-agent@3.0.1: - resolution: - { - integrity: sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==, - } - engines: { node: '>= 4.5.0' } + resolution: {integrity: sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==} + engines: {node: '>= 4.5.0'} https-proxy-agent@7.0.6: - resolution: - { - integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==, - } - engines: { node: '>= 14' } + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} human-signals@2.1.0: - resolution: - { - integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==, - } - engines: { node: '>=10.17.0' } + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} iconv-lite@0.4.24: - resolution: - { - integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} iconv-lite@0.6.3: - resolution: - { - integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} iconv-lite@0.7.1: - resolution: - { - integrity: sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==} + engines: {node: '>=0.10.0'} ieee754@1.2.1: - resolution: - { - integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==, - } + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} ignore-by-default@1.0.1: - resolution: - { - integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==, - } + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} ignore-walk@6.0.5: - resolution: - { - integrity: sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} ignore@5.3.2: - resolution: - { - integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==, - } - engines: { node: '>= 4' } + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} ignore@7.0.5: - resolution: - { - integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==, - } - engines: { node: '>= 4' } + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} import-fresh@3.3.1: - resolution: - { - integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} import-local@3.1.0: - resolution: - { - integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} hasBin: true import-local@3.2.0: - resolution: - { - integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} + engines: {node: '>=8'} hasBin: true imurmurhash@0.1.4: - resolution: - { - integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==, - } - engines: { node: '>=0.8.19' } + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} indent-string@4.0.0: - resolution: - { - integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} inflection@1.12.0: - resolution: - { - integrity: sha512-lRy4DxuIFWXlJU7ed8UiTJOSTqStqYdEb4CEbtXfNbkdj3nH1L+reUWiE10VWcJS2yR7tge8Z74pJjtBjNwj0w==, - } - engines: { '0': node >= 0.4.0 } + resolution: {integrity: sha512-lRy4DxuIFWXlJU7ed8UiTJOSTqStqYdEb4CEbtXfNbkdj3nH1L+reUWiE10VWcJS2yR7tge8Z74pJjtBjNwj0w==} + engines: {'0': node >= 0.4.0} inflection@1.3.8: - resolution: - { - integrity: sha512-xRvG6XhAkbneGO5BXP0uKyGkzmZ2bBbrFkx4ZVNx2TmsECbiq/pJapbbx/NECh+E85IfZwW5+IeVNJfkQgavag==, - } - engines: { '0': node >= 0.4.0 } + resolution: {integrity: sha512-xRvG6XhAkbneGO5BXP0uKyGkzmZ2bBbrFkx4ZVNx2TmsECbiq/pJapbbx/NECh+E85IfZwW5+IeVNJfkQgavag==} + engines: {'0': node >= 0.4.0} inflection@3.0.2: - resolution: - { - integrity: sha512-+Bg3+kg+J6JUWn8J6bzFmOWkTQ6L/NHfDRSYU+EVvuKHDxUDHAXgqixHfVlzuBQaPOTac8hn43aPhMNk6rMe3g==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-+Bg3+kg+J6JUWn8J6bzFmOWkTQ6L/NHfDRSYU+EVvuKHDxUDHAXgqixHfVlzuBQaPOTac8hn43aPhMNk6rMe3g==} + engines: {node: '>=18.0.0'} inflekt@0.2.0: - resolution: - { - integrity: sha512-eznjYm6FOl6sX2fgDGe48WiCPO0db+BQhirptPBS1BhIAwqnbCgWHHCgmuzk1ldwQTKx8ot/v1ecJrFjVAe3xg==, - } + resolution: {integrity: sha512-eznjYm6FOl6sX2fgDGe48WiCPO0db+BQhirptPBS1BhIAwqnbCgWHHCgmuzk1ldwQTKx8ot/v1ecJrFjVAe3xg==} inflight@1.0.6: - resolution: - { - integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==, - } + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.3: - resolution: - { - integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==, - } + resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} inherits@2.0.4: - resolution: - { - integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, - } + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} ini@1.3.8: - resolution: - { - integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==, - } + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} ini@4.1.3: - resolution: - { - integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} init-package-json@6.0.3: - resolution: - { - integrity: sha512-Zfeb5ol+H+eqJWHTaGca9BovufyGeIfr4zaaBorPmJBMrJ+KBnN+kQx2ZtXdsotUTgldHmHQV44xvUWOUA7E2w==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-Zfeb5ol+H+eqJWHTaGca9BovufyGeIfr4zaaBorPmJBMrJ+KBnN+kQx2ZtXdsotUTgldHmHQV44xvUWOUA7E2w==} + engines: {node: ^16.14.0 || >=18.0.0} inquirer@8.2.7: - resolution: - { - integrity: sha512-UjOaSel/iddGZJ5xP/Eixh6dY1XghiBw4XK13rCCIJcJfyhhoul/7KhLLUGtebEj6GDYM6Vnx/mVsjx2L/mFIA==, - } - engines: { node: '>=12.0.0' } + resolution: {integrity: sha512-UjOaSel/iddGZJ5xP/Eixh6dY1XghiBw4XK13rCCIJcJfyhhoul/7KhLLUGtebEj6GDYM6Vnx/mVsjx2L/mFIA==} + engines: {node: '>=12.0.0'} inquirerer@4.3.1: - resolution: - { - integrity: sha512-CKbqcGXT1zdFaJrkTLuTxdEe0yplUSmm1JbmJDDm2v6LuRaS34BE85rmnX0v8HQrli98Y4iFP99f6V0ny3RkDg==, - } + resolution: {integrity: sha512-CKbqcGXT1zdFaJrkTLuTxdEe0yplUSmm1JbmJDDm2v6LuRaS34BE85rmnX0v8HQrli98Y4iFP99f6V0ny3RkDg==} ip-address@10.1.0: - resolution: - { - integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==, - } - engines: { node: '>= 12' } + resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} + engines: {node: '>= 12'} ip@1.1.5: - resolution: - { - integrity: sha512-rBtCAQAJm8A110nbwn6YdveUnuZH3WrC36IwkRXxDnq53JvXA2NVQvB7IHyKomxK1MJ4VDNw3UtFDdXQ+AvLYA==, - } + resolution: {integrity: sha512-rBtCAQAJm8A110nbwn6YdveUnuZH3WrC36IwkRXxDnq53JvXA2NVQvB7IHyKomxK1MJ4VDNw3UtFDdXQ+AvLYA==} ip@1.1.9: - resolution: - { - integrity: sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==, - } + resolution: {integrity: sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==} ipaddr.js@1.9.1: - resolution: - { - integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==, - } - engines: { node: '>= 0.10' } + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} is-arrayish@0.2.1: - resolution: - { - integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, - } + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} is-binary-path@2.1.0: - resolution: - { - integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} is-ci@3.0.1: - resolution: - { - integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==, - } + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} hasBin: true is-core-module@2.16.1: - resolution: - { - integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} is-docker@2.2.1: - resolution: - { - integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} hasBin: true is-extglob@2.1.1: - resolution: - { - integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} is-fullwidth-code-point@3.0.0: - resolution: - { - integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} is-generator-fn@2.1.0: - resolution: - { - integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} is-glob@4.0.3: - resolution: - { - integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} is-interactive@1.0.0: - resolution: - { - integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} is-lambda@1.0.1: - resolution: - { - integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==, - } + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} is-nan@1.3.2: - resolution: - { - integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} is-number@7.0.0: - resolution: - { - integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, - } - engines: { node: '>=0.12.0' } + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} is-obj@2.0.0: - resolution: - { - integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} is-plain-obj@1.1.0: - resolution: - { - integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} is-plain-object@2.0.4: - resolution: - { - integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} is-promise@4.0.0: - resolution: - { - integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==, - } + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} is-ssh@1.4.1: - resolution: - { - integrity: sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==, - } + resolution: {integrity: sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==} is-stream@1.1.0: - resolution: - { - integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} is-stream@2.0.0: - resolution: - { - integrity: sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==} + engines: {node: '>=8'} is-stream@2.0.1: - resolution: - { - integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} is-text-path@1.0.1: - resolution: - { - integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} is-typedarray@1.0.0: - resolution: - { - integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==, - } + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} is-unicode-supported@0.1.0: - resolution: - { - integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} is-wsl@2.2.0: - resolution: - { - integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} isarray@0.0.1: - resolution: - { - integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==, - } + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} isarray@1.0.0: - resolution: - { - integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, - } + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} isexe@2.0.0: - resolution: - { - integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, - } + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} isexe@3.1.1: - resolution: - { - integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==, - } - engines: { node: '>=16' } + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} isobject@3.0.1: - resolution: - { - integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} isstream@0.1.2: - resolution: - { - integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==, - } + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} istanbul-lib-coverage@3.2.2: - resolution: - { - integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==, - } - engines: { node: '>=8' } + 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' } + 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' } + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} istanbul-lib-report@3.0.1: - resolution: - { - integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} istanbul-lib-source-maps@4.0.1: - resolution: - { - integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} istanbul-lib-source-maps@5.0.6: - resolution: - { - integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==, - } - engines: { node: '>=10' } + 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' } + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} + engines: {node: '>=8'} iterall@1.3.0: - resolution: - { - integrity: sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==, - } + resolution: {integrity: sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==} jackspeak@3.4.3: - resolution: - { - integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==, - } + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} jackspeak@4.1.1: - resolution: - { - integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==} + engines: {node: 20 || >=22} jake@10.9.4: - resolution: - { - integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} + engines: {node: '>=10'} hasBin: true jest-changed-files@29.7.0: - resolution: - { - integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-changed-files@30.2.0: - resolution: - { - integrity: sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==} + 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 } + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-circus@30.2.0: - resolution: - { - integrity: sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==} + 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 } + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -8632,11 +5883,8 @@ packages: optional: true jest-cli@30.2.0: - resolution: - { - integrity: sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==} + 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 @@ -8645,11 +5893,8 @@ packages: optional: true jest-config@29.7.0: - resolution: - { - integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@types/node': '*' ts-node: '>=9.0.0' @@ -8660,11 +5905,8 @@ packages: optional: true jest-config@30.2.0: - resolution: - { - integrity: sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} peerDependencies: '@types/node': '*' esbuild-register: '>=3.4.0' @@ -8678,151 +5920,88 @@ packages: optional: true jest-diff@29.7.0: - resolution: - { - integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.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==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==} + 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 } + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-docblock@30.2.0: - resolution: - { - integrity: sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.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 } + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-each@30.2.0: - resolution: - { - integrity: sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-environment-node@29.7.0: - resolution: - { - integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-environment-node@30.2.0: - resolution: - { - integrity: sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-get-type@29.6.3: - resolution: - { - integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + 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 } + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-haste-map@30.2.0: - resolution: - { - integrity: sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-in-case@1.0.2: - resolution: - { - integrity: sha512-2DE6Gdwnh5jkCYTePWoQinF+zne3lCADibXoYJEt8PS84JaRug0CyAOrEgzMxbzln3YcSY2PBeru7ct4tbflYA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-2DE6Gdwnh5jkCYTePWoQinF+zne3lCADibXoYJEt8PS84JaRug0CyAOrEgzMxbzln3YcSY2PBeru7ct4tbflYA==} + engines: {node: '>=4'} jest-leak-detector@29.7.0: - resolution: - { - integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-leak-detector@30.2.0: - resolution: - { - integrity: sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.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 } + 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==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==} + 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 } + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-message-util@30.2.0: - resolution: - { - integrity: sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==} + 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 } + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-mock@30.2.0: - resolution: - { - integrity: sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==} + 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' } + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} peerDependencies: jest-resolve: '*' peerDependenciesMeta: @@ -8830,151 +6009,88 @@ packages: optional: true jest-regex-util@29.6.3: - resolution: - { - integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.0 } + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-regex-util@30.0.1: - resolution: - { - integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==} + 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 } + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-resolve-dependencies@30.2.0: - resolution: - { - integrity: sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==} + 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 } + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-resolve@30.2.0: - resolution: - { - integrity: sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==} + 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 } + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-runner@30.2.0: - resolution: - { - integrity: sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==} + 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 } + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-runtime@30.2.0: - resolution: - { - integrity: sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==} + 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 } + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-snapshot@30.2.0: - resolution: - { - integrity: sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==} + 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 } + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-util@30.2.0: - resolution: - { - integrity: sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==} + 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 } + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-validate@30.2.0: - resolution: - { - integrity: sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==} + 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 } + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-watcher@30.2.0: - resolution: - { - integrity: sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==} + 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 } + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} jest-worker@30.2.0: - resolution: - { - integrity: sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==} + 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 } + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -8983,11 +6099,8 @@ packages: optional: true jest@30.2.0: - resolution: - { - integrity: sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==} + 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 @@ -8996,1131 +6109,615 @@ packages: optional: true jiti@2.6.1: - resolution: - { - integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==, - } + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true js-beautify@1.15.4: - resolution: - { - integrity: sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==} + engines: {node: '>=14'} hasBin: true js-cookie@3.0.5: - resolution: - { - integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} js-sha3@0.8.0: - resolution: - { - integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==, - } + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} js-tokens@4.0.0: - resolution: - { - integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, - } + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} js-yaml@3.14.2: - resolution: - { - integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==, - } + resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} hasBin: true js-yaml@4.1.0: - resolution: - { - integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, - } + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true js-yaml@4.1.1: - resolution: - { - integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==, - } + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true jsbn@0.1.1: - resolution: - { - integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==, - } + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} jsesc@3.1.0: - resolution: - { - integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} hasBin: true json-buffer@3.0.1: - resolution: - { - integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==, - } + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} json-parse-better-errors@1.0.2: - resolution: - { - integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==, - } + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} json-parse-even-better-errors@2.3.1: - resolution: - { - integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==, - } + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} json-parse-even-better-errors@3.0.2: - resolution: - { - integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} json-schema-traverse@0.4.1: - resolution: - { - integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==, - } + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} json-schema-traverse@1.0.0: - resolution: - { - integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==, - } + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} json-schema@0.4.0: - resolution: - { - integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==, - } + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} json-stable-stringify-without-jsonify@1.0.1: - resolution: - { - integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==, - } + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} json-stringify-nice@1.1.4: - resolution: - { - integrity: sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==, - } + resolution: {integrity: sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==} json-stringify-safe@5.0.1: - resolution: - { - integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==, - } + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} json5@2.2.3: - resolution: - { - integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} hasBin: true jsonc-parser@3.2.0: - resolution: - { - integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==, - } + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} jsonfile@6.2.0: - resolution: - { - integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==, - } + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} jsonparse@1.3.1: - resolution: - { - integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==, - } - engines: { '0': node >= 0.2.0 } + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} jsonwebtoken@9.0.3: - resolution: - { - integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==, - } - engines: { node: '>=12', npm: '>=6' } + resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} + engines: {node: '>=12', npm: '>=6'} jsprim@1.4.2: - resolution: - { - integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==, - } - engines: { node: '>=0.6.0' } + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} juice@7.0.0: - resolution: - { - integrity: sha512-AjKQX31KKN+uJs+zaf+GW8mBO/f/0NqSh2moTMyvwBY+4/lXIYTU8D8I2h6BAV3Xnz6GGsbalUyFqbYMe+Vh+Q==, - } - engines: { node: '>=10.0.0' } + resolution: {integrity: sha512-AjKQX31KKN+uJs+zaf+GW8mBO/f/0NqSh2moTMyvwBY+4/lXIYTU8D8I2h6BAV3Xnz6GGsbalUyFqbYMe+Vh+Q==} + engines: {node: '>=10.0.0'} hasBin: true just-diff-apply@5.5.0: - resolution: - { - integrity: sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==, - } + resolution: {integrity: sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==} just-diff@6.0.2: - resolution: - { - integrity: sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==, - } + resolution: {integrity: sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==} jwa@2.0.1: - resolution: - { - integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==, - } + resolution: {integrity: sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==} jws@4.0.1: - resolution: - { - integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==, - } + resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} keyv@4.5.4: - resolution: - { - integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==, - } + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} kind-of@6.0.3: - resolution: - { - integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} kleur@3.0.3: - resolution: - { - integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} komoji@0.7.14: - resolution: - { - integrity: sha512-iJlRccr/DTKcSumEHiTbvyt3V6GYmA762FmjhBAFlIKhoO87BPo7V0eHxSUgsILH8eYHHguk9KCmZ8xMIDPbHw==, - } + resolution: {integrity: sha512-iJlRccr/DTKcSumEHiTbvyt3V6GYmA762FmjhBAFlIKhoO87BPo7V0eHxSUgsILH8eYHHguk9KCmZ8xMIDPbHw==} lerna@8.2.4: - resolution: - { - integrity: sha512-0gaVWDIVT7fLfprfwpYcQajb7dBJv3EGavjG7zvJ+TmGx3/wovl5GklnSwM2/WeE0Z2wrIz7ndWhBcDUHVjOcQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-0gaVWDIVT7fLfprfwpYcQajb7dBJv3EGavjG7zvJ+TmGx3/wovl5GklnSwM2/WeE0Z2wrIz7ndWhBcDUHVjOcQ==} + engines: {node: '>=18.0.0'} hasBin: true leven@3.1.0: - resolution: - { - integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} levn@0.3.0: - resolution: - { - integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} levn@0.4.1: - resolution: - { - integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} libnpmaccess@8.0.6: - resolution: - { - integrity: sha512-uM8DHDEfYG6G5gVivVl+yQd4pH3uRclHC59lzIbSvy7b5FEwR+mU49Zq1jEyRtRFv7+M99mUW9S0wL/4laT4lw==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-uM8DHDEfYG6G5gVivVl+yQd4pH3uRclHC59lzIbSvy7b5FEwR+mU49Zq1jEyRtRFv7+M99mUW9S0wL/4laT4lw==} + engines: {node: ^16.14.0 || >=18.0.0} libnpmpublish@9.0.9: - resolution: - { - integrity: sha512-26zzwoBNAvX9AWOPiqqF6FG4HrSCPsHFkQm7nT+xU1ggAujL/eae81RnCv4CJ2In9q9fh10B88sYSzKCUh/Ghg==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-26zzwoBNAvX9AWOPiqqF6FG4HrSCPsHFkQm7nT+xU1ggAujL/eae81RnCv4CJ2In9q9fh10B88sYSzKCUh/Ghg==} + engines: {node: ^16.14.0 || >=18.0.0} libpg-query@17.7.3: - resolution: - { - integrity: sha512-lHKBvoWRsXt/9bJxpAeFxkLu0CA6tELusqy3o1z6/DwGXSETxhKJDaNlNdrNV8msvXDLBhpg/4RE/fKKs5rYFA==, - } + resolution: {integrity: sha512-lHKBvoWRsXt/9bJxpAeFxkLu0CA6tELusqy3o1z6/DwGXSETxhKJDaNlNdrNV8msvXDLBhpg/4RE/fKKs5rYFA==} lines-and-columns@1.2.4: - resolution: - { - integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, - } + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} lines-and-columns@2.0.3: - resolution: - { - integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==, - } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} load-json-file@4.0.0: - resolution: - { - integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} load-json-file@6.2.0: - resolution: - { - integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==} + engines: {node: '>=8'} locate-path@2.0.0: - resolution: - { - integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} locate-path@5.0.0: - resolution: - { - integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} locate-path@6.0.0: - resolution: - { - integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} lodash.includes@4.3.0: - resolution: - { - integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==, - } + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} lodash.isboolean@3.0.3: - resolution: - { - integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==, - } + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} lodash.isinteger@4.0.4: - resolution: - { - integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==, - } + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} lodash.ismatch@4.4.0: - resolution: - { - integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==, - } + resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} lodash.isnumber@3.0.3: - resolution: - { - integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==, - } + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} lodash.isplainobject@4.0.6: - resolution: - { - integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==, - } + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} lodash.isstring@4.0.1: - resolution: - { - integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==, - } + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} lodash.memoize@4.1.2: - resolution: - { - integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==, - } + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} lodash.merge@4.6.2: - resolution: - { - integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, - } + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} lodash.once@4.1.1: - resolution: - { - integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==, - } + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} lodash@4.17.21: - resolution: - { - integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, - } + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} log-symbols@4.1.0: - resolution: - { - integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} long-timeout@0.1.1: - resolution: - { - integrity: sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==, - } + resolution: {integrity: sha512-BFRuQUqc7x2NWxfJBCyUrN8iYUYznzL9JROmRz1gZ6KlOIgmoD+njPVbb+VNn2nGMKggMsK79iUNErillsrx7w==} long@5.3.2: - resolution: - { - integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==, - } + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} loose-envify@1.4.0: - resolution: - { - integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==, - } + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true lower-case@1.1.4: - resolution: - { - integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==, - } + resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} lru-cache@10.4.3: - resolution: - { - integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==, - } + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} lru-cache@11.2.4: - resolution: - { - integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} + engines: {node: 20 || >=22} lru-cache@4.1.5: - resolution: - { - integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==, - } + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} lru-cache@5.1.1: - resolution: - { - integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, - } + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} lru-cache@6.0.0: - resolution: - { - integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} lz-string@1.5.0: - resolution: - { - integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==, - } + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true mailgun-js@0.22.0: - resolution: - { - integrity: sha512-a2alg5nuTZA9Psa1pSEIEsbxr1Zrmqx4VkgGCQ30xVh0kIH7Bu57AYILo+0v8QLSdXtCyLaS+KVmdCrQo0uWFA==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-a2alg5nuTZA9Psa1pSEIEsbxr1Zrmqx4VkgGCQ30xVh0kIH7Bu57AYILo+0v8QLSdXtCyLaS+KVmdCrQo0uWFA==} + engines: {node: '>=6.0.0'} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. makage@0.1.10: - resolution: - { - integrity: sha512-IQKuRbHOrDgVNlydle+XRO5iMyaozBq4Bb9vhEzwxtvzyk08JkQo5qpfFRep0dSum53gECdX2gBoTmkWDHIfJA==, - } + resolution: {integrity: sha512-IQKuRbHOrDgVNlydle+XRO5iMyaozBq4Bb9vhEzwxtvzyk08JkQo5qpfFRep0dSum53gECdX2gBoTmkWDHIfJA==} hasBin: true make-dir@2.1.0: - resolution: - { - integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} make-dir@4.0.0: - resolution: - { - integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} make-error@1.3.6: - resolution: - { - integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==, - } + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} make-fetch-happen@13.0.1: - resolution: - { - integrity: sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==} + engines: {node: ^16.14.0 || >=18.0.0} makeerror@1.0.12: - resolution: - { - integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==, - } + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} map-obj@1.0.1: - resolution: - { - integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} map-obj@4.3.0: - resolution: - { - integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} match-sorter@6.3.4: - resolution: - { - integrity: sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==, - } + resolution: {integrity: sha512-jfZW7cWS5y/1xswZo8VBOdudUiSd9nifYRWphc9M5D/ee4w4AoXLgBEdRbgVaxbMuagBPeUC5y2Hi8DO6o9aDg==} math-intrinsics@1.1.0: - resolution: - { - integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} meant@1.0.3: - resolution: - { - integrity: sha512-88ZRGcNxAq4EH38cQ4D85PM57pikCwS8Z99EWHODxN7KBY+UuPiqzRTtZzS8KTXO/ywSWbdjjJST2Hly/EQxLw==, - } + resolution: {integrity: sha512-88ZRGcNxAq4EH38cQ4D85PM57pikCwS8Z99EWHODxN7KBY+UuPiqzRTtZzS8KTXO/ywSWbdjjJST2Hly/EQxLw==} media-typer@0.3.0: - resolution: - { - integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} media-typer@1.1.0: - resolution: - { - integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} mensch@0.3.4: - resolution: - { - integrity: sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==, - } + resolution: {integrity: sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==} meow@8.1.2: - resolution: - { - integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} merge-descriptors@2.0.0: - resolution: - { - integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} merge-stream@2.0.0: - resolution: - { - integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, - } + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} merge2@1.4.1: - resolution: - { - integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} micromatch@4.0.8: - resolution: - { - integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==, - } - engines: { node: '>=8.6' } + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} microseconds@0.2.0: - resolution: - { - integrity: sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==, - } + resolution: {integrity: sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==} mime-db@1.52.0: - resolution: - { - integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} mime-db@1.54.0: - resolution: - { - integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} mime-types@2.1.35: - resolution: - { - integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} mime-types@3.0.2: - resolution: - { - integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} mime@2.6.0: - resolution: - { - integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==, - } - engines: { node: '>=4.0.0' } + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} hasBin: true mimic-fn@2.1.0: - resolution: - { - integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} min-indent@1.0.1: - resolution: - { - integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} minimatch@10.1.1: - resolution: - { - integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} + engines: {node: 20 || >=22} minimatch@3.0.5: - resolution: - { - integrity: sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==, - } + resolution: {integrity: sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==} minimatch@3.1.2: - resolution: - { - integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, - } + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} minimatch@5.1.6: - resolution: - { - integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} minimatch@8.0.4: - resolution: - { - integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==, - } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} + engines: {node: '>=16 || 14 >=14.17'} minimatch@9.0.1: - resolution: - { - integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==, - } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} minimatch@9.0.3: - resolution: - { - integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==, - } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} minimatch@9.0.5: - resolution: - { - integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==, - } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} minimist-options@4.1.0: - resolution: - { - integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} minimist@1.2.8: - resolution: - { - integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==, - } + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} minipass-collect@2.0.1: - resolution: - { - integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==, - } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} + engines: {node: '>=16 || 14 >=14.17'} minipass-fetch@3.0.5: - resolution: - { - integrity: sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} minipass-flush@1.0.5: - resolution: - { - integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} minipass-pipeline@1.2.4: - resolution: - { - integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} minipass-sized@1.0.3: - resolution: - { - integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} minipass@3.3.6: - resolution: - { - integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} minipass@4.2.8: - resolution: - { - integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} minipass@5.0.0: - resolution: - { - integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} minipass@7.1.2: - resolution: - { - integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==, - } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} minizlib@2.1.2: - resolution: - { - integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} mjml-accordion@4.7.1: - resolution: - { - integrity: sha512-oYwC/CLOUWJ6pRt2saDHj/HytGOHO5B5lKNqUAhKPye5HFNZykKEV5ChmZ2NfGsGU+9BhQ7H5DaCafp4fDmPAg==, - } + resolution: {integrity: sha512-oYwC/CLOUWJ6pRt2saDHj/HytGOHO5B5lKNqUAhKPye5HFNZykKEV5ChmZ2NfGsGU+9BhQ7H5DaCafp4fDmPAg==} mjml-body@4.7.1: - resolution: - { - integrity: sha512-JCrkit+kjCfQyKuVyWSOonM2LGs/o3+63R9l2SleFeXf3+0CaKWaZr/Exzvaeo28c+1o3yRqXbJIpD22SEtJfQ==, - } + resolution: {integrity: sha512-JCrkit+kjCfQyKuVyWSOonM2LGs/o3+63R9l2SleFeXf3+0CaKWaZr/Exzvaeo28c+1o3yRqXbJIpD22SEtJfQ==} mjml-button@4.7.1: - resolution: - { - integrity: sha512-N3WkTMPOvKw2y6sakt1YfYDbOB8apumm1OApPG6J18CHcrX03BwhHPrdfu1JwlRNGwx4kCDdb6zNCGPwuZxkCg==, - } + resolution: {integrity: sha512-N3WkTMPOvKw2y6sakt1YfYDbOB8apumm1OApPG6J18CHcrX03BwhHPrdfu1JwlRNGwx4kCDdb6zNCGPwuZxkCg==} mjml-carousel@4.7.1: - resolution: - { - integrity: sha512-eH3rRyX23ES0BKOn+UUV39+yGNmZVApBVVV0A5znDaNWskCg6/g6ZhEHi4nkWpj+aP2lJKI0HX1nrMfJg0Mxhg==, - } + resolution: {integrity: sha512-eH3rRyX23ES0BKOn+UUV39+yGNmZVApBVVV0A5znDaNWskCg6/g6ZhEHi4nkWpj+aP2lJKI0HX1nrMfJg0Mxhg==} mjml-cli@4.7.1: - resolution: - { - integrity: sha512-xzCtJVKYVhGorvTmnbcMUfZlmJdBnu1UBD9A1H8UUBGMNE/Hs9QpHs9PLCMp8JR/uhSu15IgVjhFN0oSVndMRQ==, - } + resolution: {integrity: sha512-xzCtJVKYVhGorvTmnbcMUfZlmJdBnu1UBD9A1H8UUBGMNE/Hs9QpHs9PLCMp8JR/uhSu15IgVjhFN0oSVndMRQ==} hasBin: true mjml-column@4.7.1: - resolution: - { - integrity: sha512-CGw81TnGiuPR1GblLOez8xeoeAz1SEFjMpqapazjgXUuF5xUxg3qH55Wt4frpXe3VypeZWVYeumr6CwoNaPbKg==, - } + resolution: {integrity: sha512-CGw81TnGiuPR1GblLOez8xeoeAz1SEFjMpqapazjgXUuF5xUxg3qH55Wt4frpXe3VypeZWVYeumr6CwoNaPbKg==} mjml-core@4.7.1: - resolution: - { - integrity: sha512-AMACoq/h440m7SM86As8knW0bNQgjNIzsP/cMF6X9RO07GfszgbaWUq/XCaRNi+q8bWvBJSCXbngDJySVc5ALw==, - } + resolution: {integrity: sha512-AMACoq/h440m7SM86As8knW0bNQgjNIzsP/cMF6X9RO07GfszgbaWUq/XCaRNi+q8bWvBJSCXbngDJySVc5ALw==} mjml-divider@4.7.1: - resolution: - { - integrity: sha512-7+uCUJdqEr6w8AzpF8lhRheelYEgOwiK0KJGlAQN3LF+h2S1rTPEzEB67qL2x5cU+80kPlxtxoQWImDBy0vXqg==, - } + resolution: {integrity: sha512-7+uCUJdqEr6w8AzpF8lhRheelYEgOwiK0KJGlAQN3LF+h2S1rTPEzEB67qL2x5cU+80kPlxtxoQWImDBy0vXqg==} mjml-group@4.7.1: - resolution: - { - integrity: sha512-mAYdhocCzetdhPSws/9/sQ4hcz4kQPX2dNitQmbxNVwoMFYXjp/WcLEfGc5u13Ue7dPfcV6c9lB/Uu5o3NmRvw==, - } + resolution: {integrity: sha512-mAYdhocCzetdhPSws/9/sQ4hcz4kQPX2dNitQmbxNVwoMFYXjp/WcLEfGc5u13Ue7dPfcV6c9lB/Uu5o3NmRvw==} mjml-head-attributes@4.7.1: - resolution: - { - integrity: sha512-nB/bQ3I98Dvy/IkI4nqxTCnLonULkIKc8KrieRTrtPkUV3wskBzngpCgnjKvFPbHWiGlwjHDzcFJc7G0uWeqog==, - } + resolution: {integrity: sha512-nB/bQ3I98Dvy/IkI4nqxTCnLonULkIKc8KrieRTrtPkUV3wskBzngpCgnjKvFPbHWiGlwjHDzcFJc7G0uWeqog==} mjml-head-breakpoint@4.7.1: - resolution: - { - integrity: sha512-0KB5SweIWDvwHkn4VCUsEhCQgfY/0wkNUnSXNoftaRujv0NQFQfOOH4eINy0NZYfDfrE4WYe08z+olHprp+T2A==, - } + resolution: {integrity: sha512-0KB5SweIWDvwHkn4VCUsEhCQgfY/0wkNUnSXNoftaRujv0NQFQfOOH4eINy0NZYfDfrE4WYe08z+olHprp+T2A==} mjml-head-font@4.7.1: - resolution: - { - integrity: sha512-9YGzBcQ2htZ6j266fiLLfzcxqDEDLTvfKtypTjaeRb1w3N8S5wL+/zJA5ZjRL6r39Ij5ZPQSlSDC32KPiwhGkA==, - } + resolution: {integrity: sha512-9YGzBcQ2htZ6j266fiLLfzcxqDEDLTvfKtypTjaeRb1w3N8S5wL+/zJA5ZjRL6r39Ij5ZPQSlSDC32KPiwhGkA==} mjml-head-html-attributes@4.7.1: - resolution: - { - integrity: sha512-2TK2nGpq4rGaghbVx2UNm5TXeZ5BTGYEvtSPoYPNu02KRCj6tb+uedAgFXwJpX+ogRfIfPK50ih+9ZMoHwf2IQ==, - } + resolution: {integrity: sha512-2TK2nGpq4rGaghbVx2UNm5TXeZ5BTGYEvtSPoYPNu02KRCj6tb+uedAgFXwJpX+ogRfIfPK50ih+9ZMoHwf2IQ==} mjml-head-preview@4.7.1: - resolution: - { - integrity: sha512-UHlvvgldiPDODq/5zKMsmXgRb/ZyKygKDUVQSM5bm3HvpKXeyYxJZazcIGmlGICEqv1ced1WGINhCg72dSfN+Q==, - } + resolution: {integrity: sha512-UHlvvgldiPDODq/5zKMsmXgRb/ZyKygKDUVQSM5bm3HvpKXeyYxJZazcIGmlGICEqv1ced1WGINhCg72dSfN+Q==} mjml-head-style@4.7.1: - resolution: - { - integrity: sha512-8Gij99puN1SoOx5tGBjgkh4iCpI+zbwGBiB2Y8VwJrwXQxdJ1Qa902dQP5djoFFG39Bthii/48cS/d1bHigGPQ==, - } + resolution: {integrity: sha512-8Gij99puN1SoOx5tGBjgkh4iCpI+zbwGBiB2Y8VwJrwXQxdJ1Qa902dQP5djoFFG39Bthii/48cS/d1bHigGPQ==} mjml-head-title@4.7.1: - resolution: - { - integrity: sha512-vK3r+DApTXw2EoK/fh8dQOsO438Z7Ksy6iBIb7h04x33d4Z41r6+jtgxGXoKFXnjgr8MyLX5HZyyie5obW+hZg==, - } + resolution: {integrity: sha512-vK3r+DApTXw2EoK/fh8dQOsO438Z7Ksy6iBIb7h04x33d4Z41r6+jtgxGXoKFXnjgr8MyLX5HZyyie5obW+hZg==} mjml-head@4.7.1: - resolution: - { - integrity: sha512-jUcJ674CT1oT8NTQWTjQQBFZu4yklK0oppfGFJ1cq76ze3isMiyhSnGnOHw6FkjLnZtb3gXXaGKX7UZM+UMk/w==, - } + resolution: {integrity: sha512-jUcJ674CT1oT8NTQWTjQQBFZu4yklK0oppfGFJ1cq76ze3isMiyhSnGnOHw6FkjLnZtb3gXXaGKX7UZM+UMk/w==} mjml-hero@4.7.1: - resolution: - { - integrity: sha512-x+29V8zJAs8EV/eTtGbR921pCpitMQOAkyvNANW/3JLDTL2Oio1OYvGPVC3z1wOT9LKuRTxVzNHVt/bBw02CSQ==, - } + resolution: {integrity: sha512-x+29V8zJAs8EV/eTtGbR921pCpitMQOAkyvNANW/3JLDTL2Oio1OYvGPVC3z1wOT9LKuRTxVzNHVt/bBw02CSQ==} mjml-image@4.7.1: - resolution: - { - integrity: sha512-l3uRR2jaM0Bpz4ctdWuxQUFgg+ol6Nt+ODOrnHsGMwpmFOh4hTPTky6KaF0LCXxYmGbI0FoGBna+hVNnkBsQCA==, - } + resolution: {integrity: sha512-l3uRR2jaM0Bpz4ctdWuxQUFgg+ol6Nt+ODOrnHsGMwpmFOh4hTPTky6KaF0LCXxYmGbI0FoGBna+hVNnkBsQCA==} mjml-migrate@4.7.1: - resolution: - { - integrity: sha512-RgrJ9fHg6iRHC2H4pjRDWilBQ1eTH2jRu1ayDplbnepGoql83vLZaYaWc5Q+J+NsaNI16x+bgNB3fQdBiK+mng==, - } + resolution: {integrity: sha512-RgrJ9fHg6iRHC2H4pjRDWilBQ1eTH2jRu1ayDplbnepGoql83vLZaYaWc5Q+J+NsaNI16x+bgNB3fQdBiK+mng==} hasBin: true mjml-navbar@4.7.1: - resolution: - { - integrity: sha512-awdu8zT7xhS+9aCVunqtocUs8KA2xb+UhJ8UGbxVBpYbTNj3rCL9aWUXqWVwMk1la+3ypCkFuDuTl6dIoWPWlA==, - } + resolution: {integrity: sha512-awdu8zT7xhS+9aCVunqtocUs8KA2xb+UhJ8UGbxVBpYbTNj3rCL9aWUXqWVwMk1la+3ypCkFuDuTl6dIoWPWlA==} mjml-parser-xml@4.7.1: - resolution: - { - integrity: sha512-UWfuRpN45k3GUEv2yl8n5Uf98Tg6FyCsyRnqZGo83mgZzlJRDYTdKII9RjZM646/S8+Q8e9qxi3AsL00j6sZsQ==, - } + resolution: {integrity: sha512-UWfuRpN45k3GUEv2yl8n5Uf98Tg6FyCsyRnqZGo83mgZzlJRDYTdKII9RjZM646/S8+Q8e9qxi3AsL00j6sZsQ==} mjml-raw@4.7.1: - resolution: - { - integrity: sha512-mCQFEXINTkC8i7ydP1Km99e0FaZTeu79AoYnTBAILd4QO+RuD3n/PimBGrcGrOUex0JIKa2jyVQOcSCBuG4WpA==, - } + resolution: {integrity: sha512-mCQFEXINTkC8i7ydP1Km99e0FaZTeu79AoYnTBAILd4QO+RuD3n/PimBGrcGrOUex0JIKa2jyVQOcSCBuG4WpA==} mjml-react@1.0.59: - resolution: - { - integrity: sha512-W1ULnMlxJHE0kNpInu+u3CHr6+QcvhoLJ2ov93Pzt2A1wXAv4CJ9T/P5h/BhZn8vvCXgGizcwHv8sfANfQONVw==, - } + resolution: {integrity: sha512-W1ULnMlxJHE0kNpInu+u3CHr6+QcvhoLJ2ov93Pzt2A1wXAv4CJ9T/P5h/BhZn8vvCXgGizcwHv8sfANfQONVw==} peerDependencies: mjml: ^4.1.2 react: ^16.4.0 react-dom: ^16.4.0 mjml-section@4.7.1: - resolution: - { - integrity: sha512-PlhCMsl/bpFwwgQGUopi9OgOGWgRPpEJVKE8hk4He8GXzbfIuDj4DZ9QJSkwIoZ0fZtcgz11Wwb19i9BZcozVw==, - } + resolution: {integrity: sha512-PlhCMsl/bpFwwgQGUopi9OgOGWgRPpEJVKE8hk4He8GXzbfIuDj4DZ9QJSkwIoZ0fZtcgz11Wwb19i9BZcozVw==} mjml-social@4.7.1: - resolution: - { - integrity: sha512-tN/6V3m59izO9rqWpUokHxhwkk2GHkltzIlhI936hAJHh8hFyEO6+ZwQBZm738G00qgfICmQvX5FNq4upkCYjw==, - } + resolution: {integrity: sha512-tN/6V3m59izO9rqWpUokHxhwkk2GHkltzIlhI936hAJHh8hFyEO6+ZwQBZm738G00qgfICmQvX5FNq4upkCYjw==} mjml-spacer@4.7.1: - resolution: - { - integrity: sha512-gQu1+nA9YGnoolfNPvzfVe/RJ8WqS8ho0hthlhiLOC2RnEnmqH7HHSzCFXm4OeN0VgvDQsM7mfYQGl82O58Y+g==, - } + resolution: {integrity: sha512-gQu1+nA9YGnoolfNPvzfVe/RJ8WqS8ho0hthlhiLOC2RnEnmqH7HHSzCFXm4OeN0VgvDQsM7mfYQGl82O58Y+g==} mjml-table@4.7.1: - resolution: - { - integrity: sha512-rPkOtufMiVreb7I7vXk6rDm9i1DXncODnM5JJNhA9Z1dAQwXiz6V5904gAi2cEYfe0M2m0XQ8P5ZCtvqxGkfGA==, - } + resolution: {integrity: sha512-rPkOtufMiVreb7I7vXk6rDm9i1DXncODnM5JJNhA9Z1dAQwXiz6V5904gAi2cEYfe0M2m0XQ8P5ZCtvqxGkfGA==} mjml-text@4.7.1: - resolution: - { - integrity: sha512-hrjxbY59v6hu/Pn0NO+6TMlrdAlRa3M7GVALx/YWYV3hi59zjYfot8Au7Xq64XdcbcI4eiBVbP/AVr8w03HsOw==, - } + resolution: {integrity: sha512-hrjxbY59v6hu/Pn0NO+6TMlrdAlRa3M7GVALx/YWYV3hi59zjYfot8Au7Xq64XdcbcI4eiBVbP/AVr8w03HsOw==} mjml-validator@4.7.1: - resolution: - { - integrity: sha512-Qxubbz5WE182iLSTd/XRuezMr6UE7/u73grDCw0bTIcQsaTAIkWQn2tBI3jj0chWOw+sxwK2C6zPm9B0Cv7BGA==, - } + resolution: {integrity: sha512-Qxubbz5WE182iLSTd/XRuezMr6UE7/u73grDCw0bTIcQsaTAIkWQn2tBI3jj0chWOw+sxwK2C6zPm9B0Cv7BGA==} mjml-wrapper@4.7.1: - resolution: - { - integrity: sha512-6i+ZATUyqIO5YBnx+RFKZ3+6mg3iOCS/EdXGYZSonZ/EHqlt+RJa3fG2BB4dacXqAjghfl6Lk+bLoR47P3xYIQ==, - } + resolution: {integrity: sha512-6i+ZATUyqIO5YBnx+RFKZ3+6mg3iOCS/EdXGYZSonZ/EHqlt+RJa3fG2BB4dacXqAjghfl6Lk+bLoR47P3xYIQ==} mjml@4.7.1: - resolution: - { - integrity: sha512-nwMrmhTI+Aeh9Gav9LHX/i8k8yDi/QpX5h535BlT5oP4NaAUmyxP/UeYUn9yxtPcIzDlM5ullFnRv/71jyHpkQ==, - } + resolution: {integrity: sha512-nwMrmhTI+Aeh9Gav9LHX/i8k8yDi/QpX5h535BlT5oP4NaAUmyxP/UeYUn9yxtPcIzDlM5ullFnRv/71jyHpkQ==} hasBin: true mkdirp@1.0.4: - resolution: - { - integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} hasBin: true mock-req@0.2.0: - resolution: - { - integrity: sha512-IUuwS0W5GjoPyjhuXPQJXpaHfHW7UYFRia8Cchm/xRuyDDclpSQdEoakt3krOpSYvgVlQsbnf0ePDsTRDfp7Dg==, - } + resolution: {integrity: sha512-IUuwS0W5GjoPyjhuXPQJXpaHfHW7UYFRia8Cchm/xRuyDDclpSQdEoakt3krOpSYvgVlQsbnf0ePDsTRDfp7Dg==} modify-values@1.0.1: - resolution: - { - integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} + engines: {node: '>=0.10.0'} moment-timezone@0.5.48: - resolution: - { - integrity: sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==, - } + resolution: {integrity: sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==} moment@2.30.1: - resolution: - { - integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==, - } + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} ms@2.0.0: - resolution: - { - integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==, - } + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} ms@2.1.3: - resolution: - { - integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, - } + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} multimatch@5.0.0: - resolution: - { - integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==} + engines: {node: '>=10'} mute-stream@0.0.8: - resolution: - { - integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==, - } + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} mute-stream@1.0.0: - resolution: - { - integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} nano-time@1.0.0: - resolution: - { - integrity: sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==, - } + resolution: {integrity: sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==} napi-postinstall@0.3.4: - resolution: - { - integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==, - } - engines: { node: ^12.20.0 || ^14.18.0 || >=16.0.0 } + 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==, - } + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} negotiator@0.6.4: - resolution: - { - integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} negotiator@1.0.0: - resolution: - { - integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} neo-async@2.6.2: - resolution: - { - integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==, - } + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} nested-obj@0.1.10: - resolution: - { - integrity: sha512-5V2kUPrBee/tmoS2p0IJ35BcaJuW1p1yXF5GP8JpXIkDoPbaYeYypAHizUeZkAUxcC7Rago7izWmEq7qa8+Mhw==, - } + resolution: {integrity: sha512-5V2kUPrBee/tmoS2p0IJ35BcaJuW1p1yXF5GP8JpXIkDoPbaYeYypAHizUeZkAUxcC7Rago7izWmEq7qa8+Mhw==} nested-obj@0.1.5: - resolution: - { - integrity: sha512-04Y7qDMlI8RbYTn0cJAKaw/mLrO9UmLj3xbrjTZKDfOn9f3b/RXEQFIIpveJlwn8KfPwdVFWLZUaL5gNuQ7G0w==, - } + resolution: {integrity: sha512-04Y7qDMlI8RbYTn0cJAKaw/mLrO9UmLj3xbrjTZKDfOn9f3b/RXEQFIIpveJlwn8KfPwdVFWLZUaL5gNuQ7G0w==} netmask@1.0.6: - resolution: - { - integrity: sha512-3DWDqAtIiPSkBXZyYEjwebfK56nrlQfRGt642fu8RPaL+ePu750+HCMHxjJCG3iEHq/0aeMvX6KIzlv7nuhfrA==, - } - engines: { node: '>= 0.4.0' } + resolution: {integrity: sha512-3DWDqAtIiPSkBXZyYEjwebfK56nrlQfRGt642fu8RPaL+ePu750+HCMHxjJCG3iEHq/0aeMvX6KIzlv7nuhfrA==} + engines: {node: '>= 0.4.0'} no-case@2.3.2: - resolution: - { - integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==, - } + resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} node-fetch@2.6.7: - resolution: - { - integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==, - } - engines: { node: 4.x || >=6.0.0 } + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} peerDependencies: encoding: ^0.1.0 peerDependenciesMeta: @@ -10128,11 +6725,8 @@ packages: optional: true node-fetch@2.7.0: - resolution: - { - integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==, - } - engines: { node: 4.x || >=6.0.0 } + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} peerDependencies: encoding: ^0.1.0 peerDependenciesMeta: @@ -10140,159 +6734,90 @@ packages: optional: true node-gyp@10.3.1: - resolution: - { - integrity: sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ==} + engines: {node: ^16.14.0 || >=18.0.0} hasBin: true node-int64@0.4.0: - resolution: - { - integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==, - } + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} node-machine-id@1.1.12: - resolution: - { - integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==, - } + resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} node-releases@2.0.27: - resolution: - { - integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==, - } + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} node-schedule@1.3.2: - resolution: - { - integrity: sha512-GIND2pHMHiReSZSvS6dpZcDH7pGPGFfWBIEud6S00Q8zEIzAs9ommdyRK1ZbQt8y1LyZsJYZgPnyi7gpU2lcdw==, - } + resolution: {integrity: sha512-GIND2pHMHiReSZSvS6dpZcDH7pGPGFfWBIEud6S00Q8zEIzAs9ommdyRK1ZbQt8y1LyZsJYZgPnyi7gpU2lcdw==} nodemon@3.1.11: - resolution: - { - integrity: sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g==} + engines: {node: '>=10'} hasBin: true noms@0.0.0: - resolution: - { - integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==, - } + resolution: {integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==} nopt@7.2.1: - resolution: - { - integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true normalize-package-data@2.5.0: - resolution: - { - integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==, - } + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} normalize-package-data@3.0.3: - resolution: - { - integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} normalize-package-data@6.0.2: - resolution: - { - integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} + engines: {node: ^16.14.0 || >=18.0.0} normalize-path@3.0.0: - resolution: - { - integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} npm-bundled@3.0.1: - resolution: - { - integrity: sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} npm-install-checks@6.3.0: - resolution: - { - integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} npm-normalize-package-bin@3.0.1: - resolution: - { - integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} npm-package-arg@11.0.2: - resolution: - { - integrity: sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==} + engines: {node: ^16.14.0 || >=18.0.0} npm-packlist@8.0.2: - resolution: - { - integrity: sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} npm-pick-manifest@9.1.0: - resolution: - { - integrity: sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==} + engines: {node: ^16.14.0 || >=18.0.0} npm-registry-fetch@17.1.0: - resolution: - { - integrity: sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==} + engines: {node: ^16.14.0 || >=18.0.0} npm-run-path@4.0.1: - resolution: - { - integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} nth-check@1.0.2: - resolution: - { - integrity: sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==, - } + resolution: {integrity: sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==} nth-check@2.1.1: - resolution: - { - integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==, - } + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} nx@20.8.3: - resolution: - { - integrity: sha512-8w815WSMWar3A/LFzwtmEY+E8cVW62lMiFuPDXje+C8O8hFndfvscP56QHNMn2Zdhz3q0+BZUe+se4Em1BKYdA==, - } + resolution: {integrity: sha512-8w815WSMWar3A/LFzwtmEY+E8cVW62lMiFuPDXje+C8O8hFndfvscP56QHNMn2Zdhz3q0+BZUe+se4Em1BKYdA==} hasBin: true peerDependencies: '@swc-node/register': ^1.8.0 @@ -10304,481 +6829,265 @@ packages: optional: true oauth-sign@0.9.0: - resolution: - { - integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==, - } + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} object-assign@4.1.1: - resolution: - { - integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} object-inspect@1.13.4: - resolution: - { - integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} object-keys@1.1.1: - resolution: - { - integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} object-path@0.11.8: - resolution: - { - integrity: sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==, - } - engines: { node: '>= 10.12.0' } + resolution: {integrity: sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==} + engines: {node: '>= 10.12.0'} oblivious-set@1.0.0: - resolution: - { - integrity: sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==, - } + resolution: {integrity: sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==} on-finished@2.3.0: - resolution: - { - integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} on-finished@2.4.1: - resolution: - { - integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} once@1.4.0: - resolution: - { - integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, - } + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} onetime@5.1.2: - resolution: - { - integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} open@8.4.2: - resolution: - { - integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} optionator@0.8.3: - resolution: - { - integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} optionator@0.9.4: - resolution: - { - integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} ora@5.3.0: - resolution: - { - integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==} + engines: {node: '>=10'} ora@5.4.1: - resolution: - { - integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} p-finally@1.0.0: - resolution: - { - integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} p-limit@1.3.0: - resolution: - { - integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} p-limit@2.3.0: - resolution: - { - integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} p-limit@3.1.0: - resolution: - { - integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} p-locate@2.0.0: - resolution: - { - integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} p-locate@4.1.0: - resolution: - { - integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} p-locate@5.0.0: - resolution: - { - integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} p-map-series@2.1.0: - resolution: - { - integrity: sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==} + engines: {node: '>=8'} p-map@4.0.0: - resolution: - { - integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} p-pipe@3.1.0: - resolution: - { - integrity: sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==} + engines: {node: '>=8'} p-queue@6.6.2: - resolution: - { - integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} p-reduce@2.1.0: - resolution: - { - integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==} + engines: {node: '>=8'} p-timeout@3.2.0: - resolution: - { - integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} p-try@1.0.0: - resolution: - { - integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} p-try@2.2.0: - resolution: - { - integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} p-waterfall@2.1.1: - resolution: - { - integrity: sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==} + engines: {node: '>=8'} pac-proxy-agent@3.0.1: - resolution: - { - integrity: sha512-44DUg21G/liUZ48dJpUSjZnFfZro/0K5JTyFYLBcmh9+T6Ooi4/i4efwUiEy0+4oQusCBqWdhv16XohIj1GqnQ==, - } + resolution: {integrity: sha512-44DUg21G/liUZ48dJpUSjZnFfZro/0K5JTyFYLBcmh9+T6Ooi4/i4efwUiEy0+4oQusCBqWdhv16XohIj1GqnQ==} pac-resolver@3.0.0: - resolution: - { - integrity: sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==, - } + resolution: {integrity: sha512-tcc38bsjuE3XZ5+4vP96OfhOugrX+JcnpUbhfuc4LuXBLQhoTthOstZeoQJBDnQUDYzYmdImKsbz0xSl1/9qeA==} package-json-from-dist@1.0.1: - resolution: - { - integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==, - } + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} pacote@18.0.6: - resolution: - { - integrity: sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==} + engines: {node: ^16.14.0 || >=18.0.0} hasBin: true param-case@2.1.1: - resolution: - { - integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==, - } + resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} parent-module@1.0.1: - resolution: - { - integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} parse-conflict-json@3.0.1: - resolution: - { - integrity: sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} parse-json@4.0.0: - resolution: - { - integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} parse-json@5.2.0: - resolution: - { - integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} parse-package-name@1.0.0: - resolution: - { - integrity: sha512-kBeTUtcj+SkyfaW4+KBe0HtsloBJ/mKTPoxpVdA57GZiPerREsUWJOhVj9anXweFiJkm5y8FG1sxFZkZ0SN6wg==, - } + resolution: {integrity: sha512-kBeTUtcj+SkyfaW4+KBe0HtsloBJ/mKTPoxpVdA57GZiPerREsUWJOhVj9anXweFiJkm5y8FG1sxFZkZ0SN6wg==} parse-path@7.1.0: - resolution: - { - integrity: sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==, - } + resolution: {integrity: sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==} parse-url@8.1.0: - resolution: - { - integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==, - } + resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} parse5-htmlparser2-tree-adapter@7.1.0: - resolution: - { - integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==, - } + resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} parse5-parser-stream@7.1.2: - resolution: - { - integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==, - } + resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} parse5@3.0.3: - resolution: - { - integrity: sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==, - } + resolution: {integrity: sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==} parse5@7.3.0: - resolution: - { - integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==, - } + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} parseurl@1.3.3: - resolution: - { - integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==, - } - engines: { node: '>= 0.8' } - - path-browserify@1.0.1: - resolution: - { - integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==, - } + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} path-exists@3.0.0: - resolution: - { - integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} path-exists@4.0.0: - resolution: - { - integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} path-is-absolute@1.0.1: - resolution: - { - integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} path-key@3.1.1: - resolution: - { - integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} path-parse@1.0.7: - resolution: - { - integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, - } + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} path-proxy@1.0.0: - resolution: - { - integrity: sha512-p9IuY9FRY1nU59RDW+tnLL6qMxmBnY03WGYxzy1FcqE5OMO5ggz7ahmOBH0JBS+9f95Yc7V5TZ+kHpTeFWaLQA==, - } + resolution: {integrity: sha512-p9IuY9FRY1nU59RDW+tnLL6qMxmBnY03WGYxzy1FcqE5OMO5ggz7ahmOBH0JBS+9f95Yc7V5TZ+kHpTeFWaLQA==} path-scurry@1.11.1: - resolution: - { - integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==, - } - engines: { node: '>=16 || 14 >=14.18' } + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} path-scurry@2.0.1: - resolution: - { - integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} + engines: {node: 20 || >=22} path-to-regexp@8.3.0: - resolution: - { - integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==, - } + resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} path-type@3.0.0: - resolution: - { - integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} performance-now@2.1.0: - resolution: - { - integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==, - } + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} pg-cloudflare@1.2.7: - resolution: - { - integrity: sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==, - } + resolution: {integrity: sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==} pg-connection-string@2.9.1: - resolution: - { - integrity: sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==, - } + resolution: {integrity: sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==} pg-copy-streams@7.0.0: - resolution: - { - integrity: sha512-zBvnY6wtaBRE2ae2xXWOOGMaNVPkXh1vhypAkNSKgMdciJeTyIQAHZaEeRAxUjs/p1El5jgzYmwG5u871Zj3dQ==, - } + resolution: {integrity: sha512-zBvnY6wtaBRE2ae2xXWOOGMaNVPkXh1vhypAkNSKgMdciJeTyIQAHZaEeRAxUjs/p1El5jgzYmwG5u871Zj3dQ==} pg-int8@1.0.1: - resolution: - { - integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==, - } - engines: { node: '>=4.0.0' } + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} pg-pool@3.10.1: - resolution: - { - integrity: sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==, - } + resolution: {integrity: sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==} peerDependencies: pg: '>=8.0' pg-proto-parser@1.30.4: - resolution: - { - integrity: sha512-+9/n8zfYQVNRc8KGhxxNXO8NA5OKni01IPtit6+C3sLMtcRVVFCj4W0XtrEGFivNjz2qwUtFmRhG8OGMTxs6hg==, - } + resolution: {integrity: sha512-+9/n8zfYQVNRc8KGhxxNXO8NA5OKni01IPtit6+C3sLMtcRVVFCj4W0XtrEGFivNjz2qwUtFmRhG8OGMTxs6hg==} pg-protocol@1.10.3: - resolution: - { - integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==, - } + resolution: {integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==} pg-sql2@4.14.1: - resolution: - { - integrity: sha512-DvL0K9Pqz47EFq+BaQlGpzsXJnArKoAbxBxtHLy2/p3ey1X7ZwUF79UwFoDSTxQQCIbR4Z5D8CBI0nPfpw9Tmw==, - } - engines: { node: '>=8.6' } + resolution: {integrity: sha512-DvL0K9Pqz47EFq+BaQlGpzsXJnArKoAbxBxtHLy2/p3ey1X7ZwUF79UwFoDSTxQQCIbR4Z5D8CBI0nPfpw9Tmw==} + engines: {node: '>=8.6'} peerDependencies: pg: '>=6.1.0 <9' pg-tsquery@8.4.2: - resolution: - { - integrity: sha512-waJSlBIKE+shDhuDpuQglTH6dG5zakDhnrnxu8XB8V5c7yoDSuy4pOxY6t2dyoxTjaKMcMmlByJN7n9jx9eqMA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-waJSlBIKE+shDhuDpuQglTH6dG5zakDhnrnxu8XB8V5c7yoDSuy4pOxY6t2dyoxTjaKMcMmlByJN7n9jx9eqMA==} + engines: {node: '>=10'} pg-types@2.2.0: - resolution: - { - integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} pg@8.16.3: - resolution: - { - integrity: sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==, - } - engines: { node: '>= 16.0.0' } + resolution: {integrity: sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==} + engines: {node: '>= 16.0.0'} peerDependencies: pg-native: '>=3.0.1' peerDependenciesMeta: @@ -10786,247 +7095,142 @@ packages: optional: true pgpass@1.0.5: - resolution: - { - integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==, - } + resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} pgsql-deparser@17.17.2: - resolution: - { - integrity: sha512-FCjqKY3Sdmce3VUd3CxCXF0kqaZ0s4a6yIMT5UJ9vETh0cF54A8Tpqjn0qBKaPUD8xqTKeLdS+SfiwjAC64wrA==, - } + resolution: {integrity: sha512-FCjqKY3Sdmce3VUd3CxCXF0kqaZ0s4a6yIMT5UJ9vETh0cF54A8Tpqjn0qBKaPUD8xqTKeLdS+SfiwjAC64wrA==} pgsql-parser@17.9.11: - resolution: - { - integrity: sha512-Bqp9uLvJK0Qht9PXzI6eC/Fn+lFRL+2eMvXss4D4qt7lxPLIHS8FMKYOHUQNTI3m6ylExSOdNXhx/DL5UGm3xg==, - } + resolution: {integrity: sha512-Bqp9uLvJK0Qht9PXzI6eC/Fn+lFRL+2eMvXss4D4qt7lxPLIHS8FMKYOHUQNTI3m6ylExSOdNXhx/DL5UGm3xg==} picocolors@1.1.1: - resolution: - { - integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, - } + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: - resolution: - { - integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, - } - engines: { node: '>=8.6' } + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} picomatch@4.0.3: - resolution: - { - integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} pify@2.3.0: - resolution: - { - integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} pify@3.0.0: - resolution: - { - integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} pify@4.0.1: - resolution: - { - integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} pify@5.0.0: - resolution: - { - integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} + engines: {node: '>=10'} pirates@4.0.7: - resolution: - { - integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} pkg-dir@4.2.0: - resolution: - { - integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} playwright-core@1.57.0: - resolution: - { - integrity: sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-agTcKlMw/mjBWOnD6kFZttAAGHgi/Nw0CZ2o6JqWSbMlI219lAFLZZCyqByTsvVAJq5XA5H8cA6PrvBRpBWEuQ==} + engines: {node: '>=18'} hasBin: true playwright@1.57.0: - resolution: - { - integrity: sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-ilYQj1s8sr2ppEJ2YVadYBN0Mb3mdo9J0wQ+UuDhzYqURwSoW4n1Xs5vs7ORwgDGmyEh33tRMeS8KhdkMoLXQw==} + engines: {node: '>=18'} hasBin: true pluralize@7.0.0: - resolution: - { - integrity: sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==} + engines: {node: '>=4'} postcss-selector-parser@6.1.2: - resolution: - { - integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} postcss-value-parser@4.2.0: - resolution: - { - integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==, - } + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} postgraphile-core@4.14.1: - resolution: - { - integrity: sha512-3U6DAoGUmOikl9dVQhSJcw4cLeG0vQQnvEFw7MR0rvn125c1xdv6UBvamvX0pOzSfz5oBrFRQkZ2LvclAXKyBQ==, - } - engines: { node: '>=8.6' } + resolution: {integrity: sha512-3U6DAoGUmOikl9dVQhSJcw4cLeG0vQQnvEFw7MR0rvn125c1xdv6UBvamvX0pOzSfz5oBrFRQkZ2LvclAXKyBQ==} + engines: {node: '>=8.6'} peerDependencies: graphql: '>=0.9 <0.14 || ^14.0.2 || ^15.4.0' pg: '>=6.1.0 <9' postgraphile@4.14.1: - resolution: - { - integrity: sha512-4Rz//TtnjyZk6CbrcypWJNFRwXupHK+bHvaYaX2RrtxMJ2lTaoMDYOdEFESdo/POie3CAEbsC8ZBqb9eR/EyVw==, - } - engines: { node: '>=8.6' } + resolution: {integrity: sha512-4Rz//TtnjyZk6CbrcypWJNFRwXupHK+bHvaYaX2RrtxMJ2lTaoMDYOdEFESdo/POie3CAEbsC8ZBqb9eR/EyVw==} + engines: {node: '>=8.6'} hasBin: true postgres-array@2.0.0: - resolution: - { - integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} postgres-bytea@1.0.1: - resolution: - { - integrity: sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==} + engines: {node: '>=0.10.0'} postgres-date@1.0.7: - resolution: - { - integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} postgres-interval@1.2.0: - resolution: - { - integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} prelude-ls@1.1.2: - resolution: - { - integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} prelude-ls@1.2.1: - resolution: - { - integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} prettier@3.7.4: - resolution: - { - integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==} + engines: {node: '>=14'} hasBin: true pretty-format@26.6.2: - resolution: - { - integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==} + engines: {node: '>= 10'} pretty-format@29.7.0: - resolution: - { - integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==, - } - engines: { node: ^14.15.0 || ^16.10.0 || >=18.0.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==, - } - engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + resolution: {integrity: sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} proc-log@4.2.0: - resolution: - { - integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} process-nextick-args@2.0.1: - resolution: - { - integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, - } + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} proggy@2.0.0: - resolution: - { - integrity: sha512-69agxLtnI8xBs9gUGqEnK26UfiexpHy+KUpBQWabiytQjnn5wFY8rklAi7GRfABIuPNnQ/ik48+LGLkYYJcy4A==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-69agxLtnI8xBs9gUGqEnK26UfiexpHy+KUpBQWabiytQjnn5wFY8rklAi7GRfABIuPNnQ/ik48+LGLkYYJcy4A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} promise-all-reject-late@1.0.1: - resolution: - { - integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==, - } + resolution: {integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==} promise-call-limit@3.0.2: - resolution: - { - integrity: sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw==, - } + resolution: {integrity: sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw==} promise-inflight@1.0.1: - resolution: - { - integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==, - } + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} peerDependencies: bluebird: '*' peerDependenciesMeta: @@ -11034,195 +7238,108 @@ packages: optional: true promise-retry@2.0.1: - resolution: - { - integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} promisify-call@2.0.4: - resolution: - { - integrity: sha512-ZX68J1+1Pe0I8NC0P6Ji3fDDcJceVfpoygfDLgdb1fp5vW9IRlwSpDaxe1T5HgwchyHV2DsL/pWzWikUiWEbLQ==, - } - engines: { node: '>=4.0' } + resolution: {integrity: sha512-ZX68J1+1Pe0I8NC0P6Ji3fDDcJceVfpoygfDLgdb1fp5vW9IRlwSpDaxe1T5HgwchyHV2DsL/pWzWikUiWEbLQ==} + engines: {node: '>=4.0'} prompts@2.4.2: - resolution: - { - integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} promzard@1.0.2: - resolution: - { - integrity: sha512-2FPputGL+mP3jJ3UZg/Dl9YOkovB7DX0oOr+ck5QbZ5MtORtds8k/BZdn+02peDLI8/YWbmzx34k5fA+fHvCVQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-2FPputGL+mP3jJ3UZg/Dl9YOkovB7DX0oOr+ck5QbZ5MtORtds8k/BZdn+02peDLI8/YWbmzx34k5fA+fHvCVQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} proto-list@1.2.4: - resolution: - { - integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==, - } + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} protocols@2.0.2: - resolution: - { - integrity: sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==, - } + resolution: {integrity: sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==} proxy-addr@2.0.7: - resolution: - { - integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==, - } - engines: { node: '>= 0.10' } + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} proxy-agent@3.1.1: - resolution: - { - integrity: sha512-WudaR0eTsDx33O3EJE16PjBRZWcX8GqCEeERw1W3hZJgH/F2a46g7jty6UGty6NeJ4CKQy8ds2CJPMiyeqaTvw==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-WudaR0eTsDx33O3EJE16PjBRZWcX8GqCEeERw1W3hZJgH/F2a46g7jty6UGty6NeJ4CKQy8ds2CJPMiyeqaTvw==} + engines: {node: '>=6'} proxy-from-env@1.1.0: - resolution: - { - integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, - } + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} pseudomap@1.0.2: - resolution: - { - integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==, - } + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} psl@1.15.0: - resolution: - { - integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==, - } + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} pstree.remy@1.1.8: - resolution: - { - integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==, - } + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} punycode@2.3.1: - resolution: - { - integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} pure-rand@6.1.0: - resolution: - { - integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==, - } + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} pure-rand@7.0.1: - resolution: - { - integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==, - } + resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} qs@6.14.0: - resolution: - { - integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==, - } - engines: { node: '>=0.6' } + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} qs@6.5.3: - resolution: - { - integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==, - } - engines: { node: '>=0.6' } + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} qs@6.7.0: - resolution: - { - integrity: sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==, - } - engines: { node: '>=0.6' } + resolution: {integrity: sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==} + engines: {node: '>=0.6'} queue-microtask@1.2.3: - resolution: - { - integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, - } + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} quick-lru@4.0.1: - resolution: - { - integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} range-parser@1.2.1: - resolution: - { - integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} raw-body@2.4.0: - resolution: - { - integrity: sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==} + engines: {node: '>= 0.8'} raw-body@2.5.3: - resolution: - { - integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} + engines: {node: '>= 0.8'} raw-body@3.0.2: - resolution: - { - integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==, - } - engines: { node: '>= 0.10' } + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} react-dom@19.2.3: - resolution: - { - integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==, - } + resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==} peerDependencies: react: ^19.2.3 react-is@16.13.1: - resolution: - { - integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==, - } + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} react-is@17.0.2: - resolution: - { - integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==, - } + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} react-is@18.3.1: - resolution: - { - integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==, - } + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} react-query@3.39.3: - resolution: - { - integrity: sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==, - } + resolution: {integrity: sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: '*' @@ -11234,941 +7351,527 @@ packages: optional: true react@19.2.3: - resolution: - { - integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} + engines: {node: '>=0.10.0'} read-cmd-shim@4.0.0: - resolution: - { - integrity: sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} read-package-json-fast@3.0.2: - resolution: - { - integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} read-pkg-up@3.0.0: - resolution: - { - integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} + engines: {node: '>=4'} read-pkg-up@7.0.1: - resolution: - { - integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} read-pkg@3.0.0: - resolution: - { - integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} read-pkg@5.2.0: - resolution: - { - integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} read@3.0.1: - resolution: - { - integrity: sha512-SLBrDU/Srs/9EoWhU5GdbAoxG1GzpQHo/6qiGItaoLJ1thmYpcNIM1qISEUvyHBzfGlWIyd6p2DNi1oV1VmAuw==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-SLBrDU/Srs/9EoWhU5GdbAoxG1GzpQHo/6qiGItaoLJ1thmYpcNIM1qISEUvyHBzfGlWIyd6p2DNi1oV1VmAuw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} readable-stream@1.0.34: - resolution: - { - integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==, - } + resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} readable-stream@1.1.14: - resolution: - { - integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==, - } + resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} readable-stream@2.3.8: - resolution: - { - integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, - } + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} readable-stream@3.6.2: - resolution: - { - integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} readdirp@3.6.0: - resolution: - { - integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, - } - engines: { node: '>=8.10.0' } + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} redent@3.0.0: - resolution: - { - integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} regenerator-runtime@0.10.5: - resolution: - { - integrity: sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==, - } + resolution: {integrity: sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==} relateurl@0.2.7: - resolution: - { - integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==, - } - engines: { node: '>= 0.10' } + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} remove-accents@0.5.0: - resolution: - { - integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==, - } + resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} request-ip@3.3.0: - resolution: - { - integrity: sha512-cA6Xh6e0fDBBBwH77SLJaJPBmD3nWVAcF9/XAcsrIHdjhFzFiB5aNQFytdjCGPezU3ROwrR11IddKAM08vohxA==, - } + resolution: {integrity: sha512-cA6Xh6e0fDBBBwH77SLJaJPBmD3nWVAcF9/XAcsrIHdjhFzFiB5aNQFytdjCGPezU3ROwrR11IddKAM08vohxA==} request@2.88.2: - resolution: - { - integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 require-directory@2.1.1: - resolution: - { - integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, - } - engines: { node: '>=0.10.0' } + 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' } + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} require-main-filename@2.0.0: - resolution: - { - integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==, - } + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} resolve-cwd@3.0.0: - resolution: - { - integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} resolve-from@4.0.0: - resolution: - { - integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} resolve-from@5.0.0: - resolution: - { - integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} resolve-pkg-maps@1.0.0: - resolution: - { - integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, - } + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} resolve.exports@2.0.3: - resolution: - { - integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} + engines: {node: '>=10'} resolve@1.22.11: - resolution: - { - integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} hasBin: true restore-cursor@3.1.0: - resolution: - { - integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} retry@0.12.0: - resolution: - { - integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==, - } - engines: { node: '>= 4' } + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} reusify@1.1.0: - resolution: - { - integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==, - } - engines: { iojs: '>=1.0.0', node: '>=0.10.0' } + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} rimraf@3.0.2: - resolution: - { - integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==, - } + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rimraf@4.4.1: - resolution: - { - integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} + engines: {node: '>=14'} hasBin: true router@2.2.0: - resolution: - { - integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==, - } - engines: { node: '>= 18' } + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} run-async@2.4.1: - resolution: - { - integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==, - } - engines: { node: '>=0.12.0' } + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} run-parallel@1.2.0: - resolution: - { - integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, - } + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} rxjs@7.8.2: - resolution: - { - integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==, - } + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} safe-buffer@5.1.2: - resolution: - { - integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, - } + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} safe-buffer@5.2.1: - resolution: - { - integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, - } + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} safer-buffer@2.1.2: - resolution: - { - integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==, - } + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} scheduler@0.27.0: - resolution: - { - integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==, - } + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} semver@5.7.2: - resolution: - { - integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==, - } + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true semver@6.3.1: - resolution: - { - integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, - } + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true semver@7.7.3: - resolution: - { - integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} hasBin: true send@1.2.1: - resolution: - { - integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==, - } - engines: { node: '>= 18' } + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} serve-static@2.2.1: - resolution: - { - integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==, - } - engines: { node: '>= 18' } + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + engines: {node: '>= 18'} set-blocking@2.0.0: - resolution: - { - integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==, - } + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} set-function-length@1.2.2: - resolution: - { - integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} setprototypeof@1.1.1: - resolution: - { - integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==, - } + resolution: {integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==} setprototypeof@1.2.0: - resolution: - { - integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==, - } + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} shallow-clone@3.0.1: - resolution: - { - integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} shallowequal@1.1.0: - resolution: - { - integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==, - } + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} shebang-command@2.0.0: - resolution: - { - integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} shebang-regex@3.0.0: - resolution: - { - integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} shelljs@0.10.0: - resolution: - { - integrity: sha512-Jex+xw5Mg2qMZL3qnzXIfaxEtBaC4n7xifqaqtrZDdlheR70OGkydrPJWT0V1cA1k3nanC86x9FwAmQl6w3Klw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-Jex+xw5Mg2qMZL3qnzXIfaxEtBaC4n7xifqaqtrZDdlheR70OGkydrPJWT0V1cA1k3nanC86x9FwAmQl6w3Klw==} + engines: {node: '>=18'} side-channel-list@1.0.0: - resolution: - { - integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} side-channel-map@1.0.1: - resolution: - { - integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} side-channel-weakmap@1.0.2: - resolution: - { - integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} side-channel@1.1.0: - resolution: - { - integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} signal-exit@3.0.7: - resolution: - { - integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, - } + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} signal-exit@4.1.0: - resolution: - { - integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} sigstore@2.3.1: - resolution: - { - integrity: sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==} + engines: {node: ^16.14.0 || >=18.0.0} simple-update-notifier@2.0.0: - resolution: - { - integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} sisteransi@1.0.5: - resolution: - { - integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, - } + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} slash@3.0.0: - resolution: - { - integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} slick@1.12.2: - resolution: - { - integrity: sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==, - } + resolution: {integrity: sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==} smart-buffer@4.2.0: - resolution: - { - integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==, - } - engines: { node: '>= 6.0.0', npm: '>= 3.0.0' } + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} socks-proxy-agent@4.0.2: - resolution: - { - integrity: sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==} + engines: {node: '>= 6'} socks-proxy-agent@8.0.5: - resolution: - { - integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==, - } - engines: { node: '>= 14' } + resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} + engines: {node: '>= 14'} socks@2.3.3: - resolution: - { - integrity: sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==, - } - engines: { node: '>= 6.0.0', npm: '>= 3.0.0' } + resolution: {integrity: sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} socks@2.8.7: - resolution: - { - integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==, - } - engines: { node: '>= 10.0.0', npm: '>= 3.0.0' } + resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} sort-keys@2.0.0: - resolution: - { - integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==} + engines: {node: '>=4'} sorted-array-functions@1.3.0: - resolution: - { - integrity: sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==, - } + resolution: {integrity: sha512-2sqgzeFlid6N4Z2fUQ1cvFmTOLRi/sEDzSQ0OKYchqgoPmQBVyM3959qYx3fpS6Esef80KjmpgPeEr028dP3OA==} source-map-resolve@0.6.0: - resolution: - { - integrity: sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==, - } + resolution: {integrity: sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==} deprecated: See https://github.com/lydell/source-map-resolve#deprecated source-map-support@0.5.13: - resolution: - { - integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==, - } + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} source-map@0.6.1: - resolution: - { - integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} spdx-correct@3.2.0: - resolution: - { - integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==, - } + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} spdx-exceptions@2.5.0: - resolution: - { - integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==, - } + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} spdx-expression-parse@3.0.1: - resolution: - { - integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==, - } + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} spdx-license-ids@3.0.22: - resolution: - { - integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==, - } + resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} split2@3.2.2: - resolution: - { - integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==, - } + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} split2@4.2.0: - resolution: - { - integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==, - } - engines: { node: '>= 10.x' } + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} split@1.0.1: - resolution: - { - integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==, - } + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} sprintf-js@1.0.3: - resolution: - { - integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, - } + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} sshpk@1.18.0: - resolution: - { - integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} hasBin: true ssri@10.0.6: - resolution: - { - integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} stack-utils@2.0.6: - resolution: - { - integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} statuses@1.5.0: - resolution: - { - integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} statuses@2.0.2: - resolution: - { - integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} stream-browserify@3.0.0: - resolution: - { - integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==, - } + resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} streamsearch@0.1.2: - resolution: - { - integrity: sha512-jos8u++JKm0ARcSUTAZXOVC0mSox7Bhn6sBgty73P1f3JGf7yG2clTbBNHUdde/kdvP2FESam+vM6l8jBrNxHA==, - } - engines: { node: '>=0.8.0' } + resolution: {integrity: sha512-jos8u++JKm0ARcSUTAZXOVC0mSox7Bhn6sBgty73P1f3JGf7yG2clTbBNHUdde/kdvP2FESam+vM6l8jBrNxHA==} + engines: {node: '>=0.8.0'} strfy-js@3.1.10: - resolution: - { - integrity: sha512-KQXNrvhnWpn4ya25WSG6EvJC6oqdeXlwMoitGl3qEJ2wnELV/sQO6uBy6CsIWTsVOMAt0B7/xvM40ucu5c8AuA==, - } + resolution: {integrity: sha512-KQXNrvhnWpn4ya25WSG6EvJC6oqdeXlwMoitGl3qEJ2wnELV/sQO6uBy6CsIWTsVOMAt0B7/xvM40ucu5c8AuA==} string-length@4.0.2: - resolution: - { - integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} string-width@4.2.3: - resolution: - { - integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, - } - engines: { node: '>=8' } + 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' } + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} string_decoder@0.10.31: - resolution: - { - integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==, - } + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} string_decoder@1.1.1: - resolution: - { - integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, - } + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} string_decoder@1.3.0: - resolution: - { - integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, - } + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} strip-ansi@6.0.1: - resolution: - { - integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} strip-ansi@7.1.2: - resolution: - { - integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} + engines: {node: '>=12'} strip-bom@3.0.0: - resolution: - { - integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} strip-bom@4.0.0: - resolution: - { - integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} strip-final-newline@2.0.0: - resolution: - { - integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} strip-indent@3.0.0: - resolution: - { - integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} strip-json-comments@3.1.1: - resolution: - { - integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} strnum@2.1.2: - resolution: - { - integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==, - } + resolution: {integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==} styled-components@5.3.11: - resolution: - { - integrity: sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==} + engines: {node: '>=10'} peerDependencies: react: '>= 16.8.0' react-dom: '>= 16.8.0' react-is: '>= 16.8.0' styled-system@5.1.5: - resolution: - { - integrity: sha512-7VoD0o2R3RKzOzPK0jYrVnS8iJdfkKsQJNiLRDjikOpQVqQHns/DXWaPZOH4tIKkhAT7I6wIsy9FWTWh2X3q+A==, - } + resolution: {integrity: sha512-7VoD0o2R3RKzOzPK0jYrVnS8iJdfkKsQJNiLRDjikOpQVqQHns/DXWaPZOH4tIKkhAT7I6wIsy9FWTWh2X3q+A==} subscriptions-transport-ws@0.9.19: - resolution: - { - integrity: sha512-dxdemxFFB0ppCLg10FTtRqH/31FNRL1y1BQv8209MK5I4CwALb7iihQg+7p65lFcIl8MHatINWBLOqpgU4Kyyw==, - } + resolution: {integrity: sha512-dxdemxFFB0ppCLg10FTtRqH/31FNRL1y1BQv8209MK5I4CwALb7iihQg+7p65lFcIl8MHatINWBLOqpgU4Kyyw==} deprecated: The `subscriptions-transport-ws` package is no longer maintained. We recommend you use `graphql-ws` instead. For help migrating Apollo software to `graphql-ws`, see https://www.apollographql.com/docs/apollo-server/data/subscriptions/#switching-from-subscriptions-transport-ws For general help using `graphql-ws`, see https://github.com/enisdenjo/graphql-ws/blob/master/README.md peerDependencies: graphql: '>=0.10.0' supports-color@5.5.0: - resolution: - { - integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} supports-color@7.2.0: - resolution: - { - integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} supports-color@8.1.1: - resolution: - { - integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} supports-preserve-symlinks-flag@1.0.0: - resolution: - { - integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, - } - engines: { node: '>= 0.4' } + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} symbol-observable@1.2.0: - resolution: - { - integrity: sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==} + engines: {node: '>=0.10.0'} synckit@0.11.11: - resolution: - { - integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==, - } - engines: { node: ^14.18.0 || >=16.0.0 } + resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} + engines: {node: ^14.18.0 || >=16.0.0} tar-stream@2.2.0: - resolution: - { - integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} tar@6.2.1: - resolution: - { - integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} temp-dir@1.0.0: - resolution: - { - integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==} + engines: {node: '>=4'} test-exclude@6.0.0: - resolution: - { - integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} text-extensions@1.9.0: - resolution: - { - integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==, - } - engines: { node: '>=0.10' } + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} through2@2.0.5: - resolution: - { - integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==, - } + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} through2@3.0.2: - resolution: - { - integrity: sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==, - } + resolution: {integrity: sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==} through@2.3.8: - resolution: - { - integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, - } + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} thunkify@2.1.2: - resolution: - { - integrity: sha512-w9foI80XcGImrhMQ19pxunaEC5Rp2uzxZZg4XBAFRfiLOplk3F0l7wo+bO16vC2/nlQfR/mXZxcduo0MF2GWLg==, - } + resolution: {integrity: sha512-w9foI80XcGImrhMQ19pxunaEC5Rp2uzxZZg4XBAFRfiLOplk3F0l7wo+bO16vC2/nlQfR/mXZxcduo0MF2GWLg==} tinyglobby@0.2.12: - resolution: - { - integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==, - } - engines: { node: '>=12.0.0' } + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + engines: {node: '>=12.0.0'} tinyglobby@0.2.15: - resolution: - { - integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==, - } - engines: { node: '>=12.0.0' } + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} tmp@0.2.5: - resolution: - { - integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==, - } - engines: { node: '>=14.14' } + resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} + engines: {node: '>=14.14'} tmpl@1.0.5: - resolution: - { - integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==, - } + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} to-regex-range@5.0.1: - resolution: - { - integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, - } - engines: { node: '>=8.0' } + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} toidentifier@1.0.0: - resolution: - { - integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==, - } - engines: { node: '>=0.6' } + resolution: {integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==} + engines: {node: '>=0.6'} toidentifier@1.0.1: - resolution: - { - integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==, - } - engines: { node: '>=0.6' } + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} touch@3.1.1: - resolution: - { - integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==, - } + resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} hasBin: true tough-cookie@2.5.0: - resolution: - { - integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==, - } - engines: { node: '>=0.8' } + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} tr46@0.0.3: - resolution: - { - integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, - } + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} treeverse@3.0.0: - resolution: - { - integrity: sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} trim-newlines@3.0.1: - resolution: - { - integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} ts-api-utils@2.1.0: - resolution: - { - integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==, - } - engines: { node: '>=18.12' } + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' ts-jest@29.4.6: - resolution: - { - integrity: sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==, - } - engines: { node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0 } + resolution: {integrity: sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@babel/core': '>=7.0.0-beta.0 <8' @@ -12193,17 +7896,8 @@ packages: jest-util: optional: true - ts-morph@27.0.2: - resolution: - { - integrity: sha512-fhUhgeljcrdZ+9DZND1De1029PrE+cMkIP7ooqkLRTrRLTqcki2AstsyJm0vRNbTbVCNJ0idGlbBrfqc7/nA8w==, - } - ts-node@10.9.2: - resolution: - { - integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==, - } + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: '@swc/core': '>=1.2.50' @@ -12217,513 +7911,288 @@ packages: optional: true tsconfig-paths@4.2.0: - resolution: - { - integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} tslib@2.8.1: - resolution: - { - integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, - } + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} tsscmp@1.0.6: - resolution: - { - integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==, - } - engines: { node: '>=0.6.x' } + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} tsx@4.21.0: - resolution: - { - integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} hasBin: true tuf-js@2.2.1: - resolution: - { - integrity: sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==, - } - engines: { node: ^16.14.0 || >=18.0.0 } + resolution: {integrity: sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==} + engines: {node: ^16.14.0 || >=18.0.0} tunnel-agent@0.6.0: - resolution: - { - integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==, - } + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} tweetnacl@0.14.5: - resolution: - { - integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==, - } + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} type-check@0.3.2: - resolution: - { - integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} type-check@0.4.0: - resolution: - { - integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} type-detect@4.0.8: - resolution: - { - integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} type-fest@0.18.1: - resolution: - { - integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} type-fest@0.21.3: - resolution: - { - integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} type-fest@0.4.1: - resolution: - { - integrity: sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==} + engines: {node: '>=6'} type-fest@0.6.0: - resolution: - { - integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} type-fest@0.8.1: - resolution: - { - integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} type-fest@4.41.0: - resolution: - { - integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==, - } - engines: { node: '>=16' } + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} type-is@1.6.18: - resolution: - { - integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} type-is@2.0.1: - resolution: - { - integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} typedarray@0.0.6: - resolution: - { - integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==, - } + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} typescript@5.9.3: - resolution: - { - integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==, - } - engines: { node: '>=14.17' } + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} hasBin: true uglify-js@3.19.3: - resolution: - { - integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==, - } - engines: { node: '>=0.8.0' } + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} hasBin: true uglify-js@3.4.10: - resolution: - { - integrity: sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==, - } - engines: { node: '>=0.8.0' } + resolution: {integrity: sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==} + engines: {node: '>=0.8.0'} hasBin: true undefsafe@2.0.5: - resolution: - { - integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==, - } + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} undici-types@5.26.5: - resolution: - { - integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==, - } + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} undici-types@6.21.0: - resolution: - { - integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==, - } + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} undici@7.16.0: - resolution: - { - integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==, - } - engines: { node: '>=20.18.1' } + resolution: {integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==} + engines: {node: '>=20.18.1'} unique-filename@3.0.0: - resolution: - { - integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} unique-slug@4.0.0: - resolution: - { - integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} universal-user-agent@6.0.1: - resolution: - { - integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==, - } + resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} universalify@2.0.1: - resolution: - { - integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, - } - engines: { node: '>= 10.0.0' } + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} unload@2.2.0: - resolution: - { - integrity: sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==, - } + resolution: {integrity: sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==} unpipe@1.0.0: - resolution: - { - integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} unrs-resolver@1.11.1: - resolution: - { - integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==, - } + resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} untildify@4.0.0: - resolution: - { - integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} upath@2.0.1: - resolution: - { - integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} + engines: {node: '>=4'} update-browserslist-db@1.2.3: - resolution: - { - integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==, - } + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' upper-case@1.1.3: - resolution: - { - integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==, - } + resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==} uri-js@4.4.1: - resolution: - { - integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==, - } + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} util-deprecate@1.0.2: - resolution: - { - integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, - } + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} uuid@10.0.0: - resolution: - { - integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==, - } + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} hasBin: true uuid@3.4.0: - resolution: - { - integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==, - } + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. hasBin: true v8-compile-cache-lib@3.0.1: - resolution: - { - integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==, - } + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} v8-to-istanbul@9.3.0: - resolution: - { - integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==, - } - engines: { node: '>=10.12.0' } + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} valid-data-url@3.0.1: - resolution: - { - integrity: sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA==} + engines: {node: '>=10'} validate-npm-package-license@3.0.4: - resolution: - { - integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==, - } + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} validate-npm-package-name@5.0.1: - resolution: - { - integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==, - } - engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} validator@13.15.26: - resolution: - { - integrity: sha512-spH26xU080ydGggxRyR1Yhcbgx+j3y5jbNXk/8L+iRvdIEQ4uTRH2Sgf2dokud6Q4oAtsbNvJ1Ft+9xmm6IZcA==, - } - engines: { node: '>= 0.10' } + resolution: {integrity: sha512-spH26xU080ydGggxRyR1Yhcbgx+j3y5jbNXk/8L+iRvdIEQ4uTRH2Sgf2dokud6Q4oAtsbNvJ1Ft+9xmm6IZcA==} + engines: {node: '>= 0.10'} vary@1.1.2: - resolution: - { - integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==, - } - engines: { node: '>= 0.8' } + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} verror@1.10.0: - resolution: - { - integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==, - } - engines: { '0': node >=0.6.0 } + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} walk-up-path@3.0.1: - resolution: - { - integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==, - } + resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} walker@1.0.8: - resolution: - { - integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==, - } + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} warning@3.0.0: - resolution: - { - integrity: sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ==, - } + resolution: {integrity: sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ==} wcwidth@1.0.1: - resolution: - { - integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==, - } + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} web-resource-inliner@5.0.0: - resolution: - { - integrity: sha512-AIihwH+ZmdHfkJm7BjSXiEClVt4zUFqX4YlFAzjL13wLtDuUneSaFvDBTbdYRecs35SiU7iNKbMnN+++wVfb6A==, - } - engines: { node: '>=10.0.0' } + resolution: {integrity: sha512-AIihwH+ZmdHfkJm7BjSXiEClVt4zUFqX4YlFAzjL13wLtDuUneSaFvDBTbdYRecs35SiU7iNKbMnN+++wVfb6A==} + engines: {node: '>=10.0.0'} webidl-conversions@3.0.1: - resolution: - { - integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==, - } + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} whatwg-encoding@3.1.1: - resolution: - { - integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation whatwg-mimetype@4.0.0: - resolution: - { - integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} whatwg-url@5.0.0: - resolution: - { - integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==, - } + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} which-module@2.0.1: - resolution: - { - integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==, - } + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} which@2.0.2: - resolution: - { - integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, - } - engines: { node: '>= 8' } + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} hasBin: true which@4.0.0: - resolution: - { - integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==, - } - engines: { node: ^16.13.0 || >=18.0.0 } + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} hasBin: true wide-align@1.1.5: - resolution: - { - integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==, - } + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} with-callback@1.0.2: - resolution: - { - integrity: sha512-zaUhn7OWgikdqWlPYpZ4rTX/6IAV0czMVyd+C6QLVrif2tATF28CYUnHBmHs2a5EaZo7bB1+plBUPHto+HW8uA==, - } - engines: { node: '>=4' } + resolution: {integrity: sha512-zaUhn7OWgikdqWlPYpZ4rTX/6IAV0czMVyd+C6QLVrif2tATF28CYUnHBmHs2a5EaZo7bB1+plBUPHto+HW8uA==} + engines: {node: '>=4'} word-wrap@1.2.5: - resolution: - { - integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} wordwrap@1.0.0: - resolution: - { - integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==, - } + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} wrap-ansi@6.2.0: - resolution: - { - integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} wrap-ansi@7.0.0: - resolution: - { - integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} wrap-ansi@8.1.0: - resolution: - { - integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} wrappy@1.0.2: - resolution: - { - integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, - } + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} write-file-atomic@2.4.3: - resolution: - { - integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==, - } + resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} 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 } + 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 } + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} write-json-file@3.2.0: - resolution: - { - integrity: sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==} + engines: {node: '>=6'} write-pkg@4.0.0: - resolution: - { - integrity: sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==} + engines: {node: '>=8'} ws@7.5.10: - resolution: - { - integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==, - } - engines: { node: '>=8.3.0' } + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ^5.0.2 @@ -12734,120 +8203,70 @@ packages: optional: true xregexp@2.0.0: - resolution: - { - integrity: sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==, - } + resolution: {integrity: sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==} xtend@4.0.2: - resolution: - { - integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==, - } - engines: { node: '>=0.4' } + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} y18n@4.0.3: - resolution: - { - integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==, - } + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} y18n@5.0.8: - resolution: - { - integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} yallist@2.1.2: - resolution: - { - integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==, - } + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} yallist@3.1.1: - resolution: - { - integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, - } + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} yallist@4.0.0: - resolution: - { - integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==, - } + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} yaml@2.8.2: - resolution: - { - integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==, - } - engines: { node: '>= 14.6' } + resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + engines: {node: '>= 14.6'} hasBin: true yanse@0.1.11: - resolution: - { - integrity: sha512-70QlVdqwpLdQH1ZqFk5HSAFk6puptS7Q6y79umsucED+uvmbSSVvKMJVDmc4Yt+89JMkf7n4gaR/Ftz6wUZKeA==, - } + resolution: {integrity: sha512-70QlVdqwpLdQH1ZqFk5HSAFk6puptS7Q6y79umsucED+uvmbSSVvKMJVDmc4Yt+89JMkf7n4gaR/Ftz6wUZKeA==} yargs-parser@18.1.3: - resolution: - { - integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} yargs-parser@20.2.9: - resolution: - { - integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} yargs-parser@21.1.1: - resolution: - { - integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} yargs@15.4.1: - resolution: - { - integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} yargs@16.2.0: - resolution: - { - integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} yargs@17.7.2: - resolution: - { - integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} yn@3.1.1: - resolution: - { - integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} yocto-queue@0.1.0: - resolution: - { - integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} snapshots: + 12factor-env@0.1.0: dependencies: '@babel/runtime': 7.28.4 @@ -15052,12 +10471,6 @@ snapshots: react: 19.2.3 react-dom: 19.2.3(react@19.2.3) - '@ts-morph/common@0.28.1': - dependencies: - minimatch: 10.1.1 - path-browserify: 1.0.1 - tinyglobby: 0.2.15 - '@tsconfig/node10@1.0.12': {} '@tsconfig/node12@1.0.11': {} @@ -16025,8 +11438,6 @@ snapshots: co@4.6.0: {} - code-block-writer@13.0.3: {} - collect-v8-coverage@1.0.3: {} color-convert@1.9.3: @@ -19481,8 +14892,6 @@ snapshots: parseurl@1.3.3: {} - path-browserify@1.0.1: {} - path-exists@3.0.0: {} path-exists@4.0.0: {} @@ -20459,11 +15868,6 @@ snapshots: babel-jest: 30.2.0(@babel/core@7.28.5) jest-util: 30.2.0 - ts-morph@27.0.2: - dependencies: - '@ts-morph/common': 0.28.1 - code-block-writer: 13.0.3 - ts-node@10.9.2(@types/node@20.19.27)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1