diff --git a/.changeset/neat-tigers-yawn.md b/.changeset/neat-tigers-yawn.md new file mode 100644 index 000000000..b1b915ed4 --- /dev/null +++ b/.changeset/neat-tigers-yawn.md @@ -0,0 +1,5 @@ +--- +'@gqty/cli': minor +--- + +Support Pylon-compatible schema generation diff --git a/examples/gnt/gqty/schema.generated.ts b/examples/gnt/gqty/schema.generated.ts index ec868660f..863f99e62 100644 --- a/examples/gnt/gqty/schema.generated.ts +++ b/examples/gnt/gqty/schema.generated.ts @@ -2,6 +2,8 @@ * GQty AUTO-GENERATED CODE: PLEASE DO NOT MODIFY MANUALLY */ +import { type ScalarsEnumsHash } from 'gqty'; + export type Maybe = T | null; export type InputMaybe = Maybe; export type Exact = { @@ -13,15 +15,24 @@ export type MakeOptional = Omit & { export type MakeMaybe = Omit & { [SubKey in K]: Maybe; }; +export type MakeEmpty< + T extends { [key: string]: unknown }, + K extends keyof T, +> = { [_ in K]?: never }; +export type Incremental = + | T + | { + [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never; + }; /** All built-in and custom scalars, mapped to their actual values */ export interface Scalars { - ID: string; - String: string; - Boolean: boolean; - Int: number; - Float: number; + ID: { input: string; output: string }; + String: { input: string; output: string }; + Boolean: { input: boolean; output: boolean }; + Int: { input: number; output: number }; + Float: { input: number; output: number }; /** The `Upload` scalar type represents a file upload. */ - Upload: any; + Upload: { input: any; output: any }; } export enum CacheControlScope { @@ -30,25 +41,25 @@ export enum CacheControlScope { } export interface FilterCharacter { - gender?: InputMaybe; - name?: InputMaybe; - species?: InputMaybe; - status?: InputMaybe; - type?: InputMaybe; + gender?: InputMaybe; + name?: InputMaybe; + species?: InputMaybe; + status?: InputMaybe; + type?: InputMaybe; } export interface FilterEpisode { - episode?: InputMaybe; - name?: InputMaybe; + episode?: InputMaybe; + name?: InputMaybe; } export interface FilterLocation { - dimension?: InputMaybe; - name?: InputMaybe; - type?: InputMaybe; + dimension?: InputMaybe; + name?: InputMaybe; + type?: InputMaybe; } -export const scalarsEnumsHash: import('gqty').ScalarsEnumsHash = { +export const scalarsEnumsHash: ScalarsEnumsHash = { Boolean: true, CacheControlScope: true, ID: true, @@ -301,53 +312,53 @@ export interface Query { /** * Get a specific character by ID */ - character: (args: { id: Scalars['ID'] }) => Maybe; + character: (args: { id: ScalarsEnums['ID'] }) => Maybe; /** * Get the list of all characters */ characters: (args?: { filter?: Maybe; - page?: Maybe; + page?: Maybe; }) => Maybe; /** * Get a list of characters selected by ids */ charactersByIds: (args: { - ids: Array; + ids: Array; }) => Maybe>>; /** * Get a specific episode by ID */ - episode: (args: { id: Scalars['ID'] }) => Maybe; + episode: (args: { id: ScalarsEnums['ID'] }) => Maybe; /** * Get the list of all episodes */ episodes: (args?: { filter?: Maybe; - page?: Maybe; + page?: Maybe; }) => Maybe; /** * Get a list of episodes selected by ids */ episodesByIds: (args: { - ids: Array; + ids: Array; }) => Maybe>>; /** * Get a specific locations by ID */ - location: (args: { id: Scalars['ID'] }) => Maybe; + location: (args: { id: ScalarsEnums['ID'] }) => Maybe; /** * Get the list of all locations */ locations: (args?: { filter?: Maybe; - page?: Maybe; + page?: Maybe; }) => Maybe; /** * Get a list of locations selected by ids */ locationsByIds: (args: { - ids: Array; + ids: Array; }) => Maybe>>; } @@ -361,10 +372,10 @@ export interface GeneratedSchema { subscription: Subscription; } -export type MakeNullable = { - [K in keyof T]: T[K] | undefined; +export type ScalarsEnums = { + [Key in keyof Scalars]: Scalars[Key] extends { output: unknown } + ? Scalars[Key]['output'] + : never; +} & { + CacheControlScope: CacheControlScope; }; - -export interface ScalarsEnums extends MakeNullable { - CacheControlScope: CacheControlScope | undefined; -} diff --git a/examples/solid/package.json b/examples/solid/package.json index d1fa701a7..9ff038972 100644 --- a/examples/solid/package.json +++ b/examples/solid/package.json @@ -17,6 +17,7 @@ "solid-js": "^1.9.4" }, "devDependencies": { + "@gqty/cli": "workspace:^", "@tailwindcss/postcss": "^4.0.7", "@tailwindcss/typography": "^0.5.16", "graphql": "^16.10.0", diff --git a/examples/solid/src/gqty/index.ts b/examples/solid/src/gqty/index.ts index 31f6eb741..52a69190a 100644 --- a/examples/solid/src/gqty/index.ts +++ b/examples/solid/src/gqty/index.ts @@ -7,13 +7,12 @@ import { Cache, createClient, defaultResponseHandler, - GQtyError, type QueryFetcher, } from 'gqty'; import { - type GeneratedSchema, generatedSchema, scalarsEnumsHash, + type GeneratedSchema, } from './schema.generated'; const queryFetcher: QueryFetcher = async function ( @@ -35,12 +34,6 @@ const queryFetcher: QueryFetcher = async function ( ...fetchOptions, }); - if (response.status >= 400) { - throw new GQtyError( - `GraphQL endpoint responded with HTTP status ${response.status}.` - ); - } - return await defaultResponseHandler(response); }; @@ -51,8 +44,8 @@ const cache = new Cache( * allowing soft refetches in background. */ { - maxAge: 5 * 1000, - staleWhileRevalidate: 30 * 60 * 1000, + maxAge: 0, + staleWhileRevalidate: 5 * 60 * 1000, normalization: true, } ); @@ -66,8 +59,6 @@ export const client = createClient({ }, }); -export const { createQuery } = createSolidClient(client); - // Core functions export const { resolve, subscribe, schema } = client; @@ -82,4 +73,6 @@ export const { track, } = client; +export const { createQuery } = createSolidClient(client); + export * from './schema.generated'; diff --git a/examples/solid/src/gqty/schema.generated.ts b/examples/solid/src/gqty/schema.generated.ts index ec868660f..863f99e62 100644 --- a/examples/solid/src/gqty/schema.generated.ts +++ b/examples/solid/src/gqty/schema.generated.ts @@ -2,6 +2,8 @@ * GQty AUTO-GENERATED CODE: PLEASE DO NOT MODIFY MANUALLY */ +import { type ScalarsEnumsHash } from 'gqty'; + export type Maybe = T | null; export type InputMaybe = Maybe; export type Exact = { @@ -13,15 +15,24 @@ export type MakeOptional = Omit & { export type MakeMaybe = Omit & { [SubKey in K]: Maybe; }; +export type MakeEmpty< + T extends { [key: string]: unknown }, + K extends keyof T, +> = { [_ in K]?: never }; +export type Incremental = + | T + | { + [P in keyof T]?: P extends ' $fragmentName' | '__typename' ? T[P] : never; + }; /** All built-in and custom scalars, mapped to their actual values */ export interface Scalars { - ID: string; - String: string; - Boolean: boolean; - Int: number; - Float: number; + ID: { input: string; output: string }; + String: { input: string; output: string }; + Boolean: { input: boolean; output: boolean }; + Int: { input: number; output: number }; + Float: { input: number; output: number }; /** The `Upload` scalar type represents a file upload. */ - Upload: any; + Upload: { input: any; output: any }; } export enum CacheControlScope { @@ -30,25 +41,25 @@ export enum CacheControlScope { } export interface FilterCharacter { - gender?: InputMaybe; - name?: InputMaybe; - species?: InputMaybe; - status?: InputMaybe; - type?: InputMaybe; + gender?: InputMaybe; + name?: InputMaybe; + species?: InputMaybe; + status?: InputMaybe; + type?: InputMaybe; } export interface FilterEpisode { - episode?: InputMaybe; - name?: InputMaybe; + episode?: InputMaybe; + name?: InputMaybe; } export interface FilterLocation { - dimension?: InputMaybe; - name?: InputMaybe; - type?: InputMaybe; + dimension?: InputMaybe; + name?: InputMaybe; + type?: InputMaybe; } -export const scalarsEnumsHash: import('gqty').ScalarsEnumsHash = { +export const scalarsEnumsHash: ScalarsEnumsHash = { Boolean: true, CacheControlScope: true, ID: true, @@ -301,53 +312,53 @@ export interface Query { /** * Get a specific character by ID */ - character: (args: { id: Scalars['ID'] }) => Maybe; + character: (args: { id: ScalarsEnums['ID'] }) => Maybe; /** * Get the list of all characters */ characters: (args?: { filter?: Maybe; - page?: Maybe; + page?: Maybe; }) => Maybe; /** * Get a list of characters selected by ids */ charactersByIds: (args: { - ids: Array; + ids: Array; }) => Maybe>>; /** * Get a specific episode by ID */ - episode: (args: { id: Scalars['ID'] }) => Maybe; + episode: (args: { id: ScalarsEnums['ID'] }) => Maybe; /** * Get the list of all episodes */ episodes: (args?: { filter?: Maybe; - page?: Maybe; + page?: Maybe; }) => Maybe; /** * Get a list of episodes selected by ids */ episodesByIds: (args: { - ids: Array; + ids: Array; }) => Maybe>>; /** * Get a specific locations by ID */ - location: (args: { id: Scalars['ID'] }) => Maybe; + location: (args: { id: ScalarsEnums['ID'] }) => Maybe; /** * Get the list of all locations */ locations: (args?: { filter?: Maybe; - page?: Maybe; + page?: Maybe; }) => Maybe; /** * Get a list of locations selected by ids */ locationsByIds: (args: { - ids: Array; + ids: Array; }) => Maybe>>; } @@ -361,10 +372,10 @@ export interface GeneratedSchema { subscription: Subscription; } -export type MakeNullable = { - [K in keyof T]: T[K] | undefined; +export type ScalarsEnums = { + [Key in keyof Scalars]: Scalars[Key] extends { output: unknown } + ? Scalars[Key]['output'] + : never; +} & { + CacheControlScope: CacheControlScope; }; - -export interface ScalarsEnums extends MakeNullable { - CacheControlScope: CacheControlScope | undefined; -} diff --git a/packages/cli/package.json b/packages/cli/package.json index 5a9a9925a..b091b0ad5 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -85,13 +85,12 @@ "fast-glob": "^3.3.3", "gqty": "workspace:^", "graphql": "^16.10.0", - "lodash-es": "^4.17.21", + "just-throttle": "^4.2.0", "micromatch": "^4.0.8", "prettier": "^2.8.8" }, "devDependencies": { "@pnpm/types": "^1000.1.1", - "@types/lodash-es": "^4.17.12", "@types/micromatch": "^4.0.9", "@types/node": "^22.13.4", "@types/prettier": "^2.7.3", diff --git a/packages/cli/src/commands/default.ts b/packages/cli/src/commands/default.ts index 92e050fd7..3b4ecd1c9 100644 --- a/packages/cli/src/commands/default.ts +++ b/packages/cli/src/commands/default.ts @@ -41,6 +41,11 @@ export const addCommand = (command: Command) => { .option('--no-react') .option('--solid', 'Include SolidJS signals in the generated client.') .option('--no-solid') + .option( + '--pylon', + 'Generate an unsorted schema compatible with Pylon GraphQL.' + ) + .option('--no-pylon') .option( '--subscriptions [client]', 'Includes specified package as subscription client, must be graphql-ws compatible.' @@ -107,6 +112,7 @@ export const addCommand = (command: Command) => { { if (config.frameworks?.length === 0) { config.frameworks = [ + options.pylon && 'pylon', options.react && 'react', options.solid && 'solid-js', ].filter((v): v is SupportedFrameworks => !!v); @@ -140,6 +146,7 @@ export const addCommand = (command: Command) => { // Detect React and TypeScript from package.json. if (manifest) { config.frameworks ??= [ + manifest.dependencies?.['@getcronit/pylon'] && 'pylon', manifest.dependencies?.['react'] && 'react', manifest.dependencies?.['solid-js'] && 'solid-js', ].filter((v): v is SupportedFrameworks => !!v); @@ -200,7 +207,7 @@ export const addCommand = (command: Command) => { const { default: { isMatch }, } = await import('micromatch'); - const { default: throttle } = await import('lodash-es/throttle.js'); + const { default: throttle } = await import('just-throttle'); const { FasterSMA: SMA } = await import('trading-signals'); const { printSchema } = await import('graphql'); @@ -288,9 +295,11 @@ export const addCommand = (command: Command) => { (async () => { // micromatch does not understand relative patterns, normalize them // ahead of time. - const matchPatterns = endpoints.map((endpoint) => - path.resolve(endpoint) - ); + const matchPatterns = endpoints + .filter((endpoint) => !isURL(endpoint)) + .map((endpoint) => path.resolve(endpoint)); + + if (matchPatterns.length === 0) return; // Find common path prefix const watchTarget = await fg(matchPatterns, { absolute: true }).then( @@ -308,7 +317,7 @@ export const addCommand = (command: Command) => { } return prev.slice(0, lastIndex); - }) + }, []) // Intentionally combining roots and unresolveable parents here, // because roots are probably too noisy. .join(path.sep) || undefined @@ -369,7 +378,7 @@ const promptFrameworks = async () => { const frameworks = await inquirer .checkbox({ message: `Pick the frontend frameworks in use:`, - choices: [{ value: 'react' }, { value: 'solid-js' }], + choices: [{ value: 'react' }, { value: 'solid-js' }, { value: 'pylon' }], }) .catch(terminateOnInterrupt); diff --git a/packages/cli/src/deps.ts b/packages/cli/src/deps.ts index 07c6b4201..9cd9df10e 100644 --- a/packages/cli/src/deps.ts +++ b/packages/cli/src/deps.ts @@ -8,5 +8,14 @@ export { cosmiconfig, type Loader } from 'cosmiconfig'; export { fetch } from 'cross-fetch'; export { default as fg } from 'fast-glob'; export { buildSchema, printSchema } from 'graphql'; -export { default as sortBy } from 'lodash-es/sortBy.js'; export { default as prettier, type Options as PrettierOptions } from 'prettier'; + +export function sortBy( + key: string +): >(a: T, b: T) => number; +export function sortBy( + key: number +): >(a: T, b: T) => number; +export function sortBy(key: string | number) { + return (a: any, b: any) => (a[key] > b[key] ? 1 : b[key] > a[key] ? -1 : 0); +} diff --git a/packages/cli/src/generate.ts b/packages/cli/src/generate.ts index dc343fbce..1f33753d7 100644 --- a/packages/cli/src/generate.ts +++ b/packages/cli/src/generate.ts @@ -3,6 +3,7 @@ import { parseSchemaType, type ArgsDescriptions, type FieldDescription, + type ParsedSchemaType, type ScalarsEnumsHash, type Schema, type Type, @@ -36,7 +37,7 @@ const { assertSchema, } = graphql; -export type SupportedFrameworks = 'react' | 'solid-js'; +export type SupportedFrameworks = 'react' | 'solid-js' | 'pylon'; export interface GenerateOptions { /** @@ -173,7 +174,15 @@ export async function generate( parser: 'typescript', }); - schema = lexicographicSortSchema(assertSchema(schema)); + react ??= frameworks.includes('react'); + const solid = frameworks.includes('solid-js'); + const pylon = frameworks.includes('pylon'); + + schema = assertSchema(schema); + + if (!pylon) { + schema = lexicographicSortSchema(schema); + } if (transformSchema) { schema = await transformSchema(schema, graphql); @@ -183,9 +192,6 @@ export async function generate( } } - react ??= frameworks.includes('react'); - const solid = frameworks.includes('solid-js'); - const codegenResultPromise = deps.codegen({ schema: parse(deps.printSchemaWithDirectives(schema)), config: {} satisfies deps.typescriptPlugin.TypeScriptPluginConfig, @@ -214,7 +220,7 @@ export async function generate( const scalarsEnumsHash: ScalarsEnumsHash = {}; - const enumsNames: string[] = []; + const enumsNames = new Set(); const inputTypeNames = new Set(); @@ -224,28 +230,23 @@ export async function generate( subscription: {}, }; - const queryType = config.query; - const mutationType = config.mutation; - const subscriptionType = config.subscription; - const descriptions = new Map(); - const fieldsDescriptions = new Map< + const inputsDescription = new Map(); + + const outputsDescription = new Map< string, Record >(); - const fieldsArgsDescriptions = new Map(); - function addDescription( - typeName: string | [parent: string, field: string, arg?: string] + typeName: string | [source: string, field: string, args?: string] ) { if (Array.isArray(typeName)) { - const data = typeName[2] - ? /* istanbul ignore next */ - fieldsArgsDescriptions.get(typeName[0])?.[typeName[1]]?.[typeName[2]] - : /* istanbul ignore next */ - fieldsDescriptions.get(typeName[0])?.[typeName[1]]; + const [source, field, args] = typeName; + const data = args + ? inputsDescription.get(source)?.[field]?.[args] + : outputsDescription.get(source)?.[field]; let comment = ``; @@ -266,7 +267,7 @@ export async function generate( } if (data?.defaultValue) { - comment += '\n* @defaultValue ' + '`' + data.defaultValue.trim() + '`'; + comment += '\n* @default ' + '`' + data.defaultValue.trim() + '`'; } return comment @@ -289,23 +290,26 @@ export async function generate( const parseEnumType = (type: GraphQLEnumType) => { scalarsEnumsHash[type.name] = true; - enumsNames.push(type.name); - const values = type.getValues(); - - const enumValuesDescriptions: Record = {}; - - for (const value of values) { - if (value.deprecationReason || value.description) { - enumValuesDescriptions[value.name] = { - description: value.description, - deprecated: value.deprecationReason, - }; - } - } + enumsNames.add(type.name); + + outputsDescription.set( + type.name, + type + .getValues() + .reduce>((acum, value) => { + if (value.deprecationReason || value.description) { + acum[value.name] = { + description: value.description, + deprecated: value.deprecationReason, + }; + } - fieldsDescriptions.set(type.name, enumValuesDescriptions); + return acum; + }, {}) + ); }; + const parseScalarType = (type: GraphQLScalarType) => { scalarsEnumsHash[type.name] = true; }; @@ -372,32 +376,34 @@ export async function generate( } objectFieldsArgsDescriptions[fieldName] ||= {}; - schemaType[fieldName].__args = gqlType.args.reduce( - (acum, arg) => { - acum[arg.name] = arg.type.toString(); - if ( - arg.description || - arg.deprecationReason || - arg.defaultValue != null - ) { - objectFieldsArgsDescriptions[fieldName][arg.name] = { - defaultValue: - arg.defaultValue != null - ? JSON.stringify(arg.defaultValue) - : null, - deprecated: arg.deprecationReason, - description: arg.description, - }; - } - return acum; - }, - {} as Record - ); + schemaType[fieldName].__args = gqlType.args.reduce< + Record + >((acum, arg) => { + acum[arg.name] = arg.type.toString(); + + if ( + arg.description || + arg.deprecationReason || + arg.defaultValue != null + ) { + objectFieldsArgsDescriptions[fieldName][arg.name] = { + defaultValue: + arg.defaultValue != null + ? JSON.stringify(arg.defaultValue) + : null, + deprecated: arg.deprecationReason, + description: arg.description, + }; + } + + return acum; + }, {}); } }); - fieldsDescriptions.set(type.name, objectFieldsDescriptions); - fieldsArgsDescriptions.set(type.name, objectFieldsArgsDescriptions); + inputsDescription.set(type.name, objectFieldsArgsDescriptions); + + outputsDescription.set(type.name, objectFieldsDescriptions); generatedSchema[typeName] = schemaType; }; @@ -457,28 +463,28 @@ export async function generate( const fields = type.getFields(); - const interfaceFieldDescriptions: Record = {}; + const inputDescription: ArgsDescriptions = {}; - const objectFieldsArgsDescriptions: ArgsDescriptions = {}; + const outputDescription: Record = {}; - Object.entries(fields).forEach(([fieldName, gqlType]) => { + Object.entries(fields).forEach(([fieldName, fieldType]) => { const interfaceValue: InterfaceMapValue = { fieldName, - __type: gqlType.type.toString(), + __type: fieldType.type.toString(), }; schemaType[fieldName] = { - __type: gqlType.type.toString(), + __type: fieldType.type.toString(), }; let hasArgs = true; - if (gqlType.args.length) { + if (fieldType.args.length) { if (ignoreArgs) { - const isEveryArgOptional = gqlType.args.every(({ type }) => { - return isNullableType(type); - }); + const isEveryArgOptional = fieldType.args.every(({ type }) => + isNullableType(type) + ); if (isEveryArgOptional) { - const shouldIgnore = ignoreArgs(gqlType); + const shouldIgnore = ignoreArgs(fieldType); if (shouldIgnore) { hasArgs = false; @@ -490,42 +496,42 @@ export async function generate( } if (hasArgs) { - objectFieldsArgsDescriptions[fieldName] ||= {}; + inputDescription[fieldName] ||= {}; schemaType[fieldName].__args = interfaceValue.__args = - gqlType.args.reduce( - (acum, arg) => { - acum[arg.name] = arg.type.toString(); - if ( - arg.description || - arg.deprecationReason || - arg.defaultValue != null - ) { - objectFieldsArgsDescriptions[fieldName][arg.name] = { - defaultValue: - arg.defaultValue != null - ? JSON.stringify(arg.defaultValue) - : null, - deprecated: arg.deprecationReason, - description: arg.description, - }; - } - return acum; - }, - {} as Record - ); + fieldType.args.reduce>((acum, arg) => { + acum[arg.name] = arg.type.toString(); + + if ( + arg.description || + arg.deprecationReason || + arg.defaultValue != null + ) { + inputDescription[fieldName][arg.name] = { + defaultValue: + arg.defaultValue != null + ? JSON.stringify(arg.defaultValue) + : null, + deprecated: arg.deprecationReason, + description: arg.description, + }; + } + + return acum; + }, {}); } - if (gqlType.description || gqlType.deprecationReason) { - interfaceFieldDescriptions[fieldName] = { - description: gqlType.description, - deprecated: gqlType.deprecationReason, + if (fieldType.description || fieldType.deprecationReason) { + outputDescription[fieldName] = { + description: fieldType.description, + deprecated: fieldType.deprecationReason, }; } }); - fieldsDescriptions.set(type.name, interfaceFieldDescriptions); - fieldsArgsDescriptions.set(type.name, objectFieldsArgsDescriptions); + inputsDescription.set(type.name, inputDescription); + + outputsDescription.set(type.name, outputDescription); generatedSchema[type.name] = schemaType; }; @@ -534,16 +540,16 @@ export async function generate( if (type.description) { descriptions.set(type.name, type.description); } + if ( type.name.startsWith('__') || - type === queryType || - type === mutationType || - type === subscriptionType + type === config.query || + type === config.mutation || + type === config.subscription ) { return; } - /* istanbul ignore else */ if (isScalarType(type)) { parseScalarType(type); } else if (isObjectType(type)) { @@ -559,30 +565,27 @@ export async function generate( } }); - /* istanbul ignore else */ - if (queryType) { - parseObjectType(queryType, 'query'); + if (config.query) { + parseObjectType(config.query, 'query'); } - if (mutationType) { - parseObjectType(mutationType, 'mutation'); + if (config.mutation) { + parseObjectType(config.mutation, 'mutation'); } - if (subscriptionType) { - parseObjectType(subscriptionType, 'subscription'); + if (config.subscription) { + parseObjectType(config.subscription, 'subscription'); } const unionsMapObj = Array.from( unionsAndInterfacesObjectTypesMap.entries() - ).reduce( - (acum, [key, value]) => { - generatedSchema[key]!.$on = { __type: `$${key}!` }; + ).reduce>((acum, [key, value]) => { + generatedSchema[key]!.$on = { __type: `$${key}!` }; - acum[key] = value; - return acum; - }, - {} as Record - ); + acum[key] = value; + + return acum; + }, {}); if (unionsAndInterfacesObjectTypesMap.size) { generatedSchema[SchemaUnionsKey] = unionsMapObj; @@ -594,28 +597,21 @@ export async function generate( nullableItems, isNullable, hasDefaultValue, - }: ReturnType) { - let typeToReturn: string[] = [ - scalarsEnumsHash[pureType] - ? enumsNames.includes(pureType) - ? pureType - : `ScalarsEnums["${pureType}"]` - : pureType, - ]; + }: ParsedSchemaType) { + let type = + scalarsEnumsHash[pureType] && !enumsNames.has(pureType) + ? `ScalarsEnums["${pureType}"]` + : pureType; if (isArray) { - typeToReturn = [ - 'Array<', - ...(nullableItems ? ['Maybe<', ...typeToReturn, '>'] : typeToReturn), - '>', - ]; + type = `Array<${nullableItems ? `Maybe<${type}>` : type}>`; } if (isNullable || hasDefaultValue) { - typeToReturn = ['Maybe<', ...typeToReturn, '>']; + type = `Maybe<${type}>`; } - return typeToReturn.join(``); + return type; } function parseFinalType({ @@ -623,7 +619,7 @@ export async function generate( isArray, nullableItems, isNullable, - }: ReturnType) { + }: ParsedSchemaType) { let typeToReturn: string[] = [ scalarsEnumsHash[pureType] ? `ScalarsEnums["${pureType}"]` : pureType, ]; @@ -643,36 +639,21 @@ export async function generate( return typeToReturn.join(``); } - const objectTypeTSTypes = new Map>(); + const typeNames: Record = { + query: 'Query', + mutation: 'Mutation', + subscription: 'Subscription', + }; - let typescriptTypes = deps - .sortBy(Object.entries(generatedSchema), (v) => v[0]) + let typescriptTypes = Object.entries(generatedSchema) + .sort(deps.sortBy(0)) .reduce((acum, [typeKey, typeValue]) => { - const typeName = (() => { - switch (typeKey) { - case 'query': { - return 'Query'; - } - case 'mutation': { - return 'Mutation'; - } - case 'subscription': { - return 'Subscription'; - } - default: { - return typeKey; - } - } - })(); + const typeName = typeNames[typeKey] ?? typeKey; if (inputTypeNames.has(typeName)) return acum; const objectTypeMap = new Map(); - if (!unionsAndInterfacesObjectTypesMap.has(typeName)) { - objectTypeTSTypes.set(typeName, objectTypeMap); - } - const interfaceOrUnionsObjectTypes = unionsAndInterfacesObjectTypesMap.get(typeName); @@ -690,53 +671,40 @@ export async function generate( return acum; } - const typeFieldArgDescriptions = fieldsArgsDescriptions.has( - typeName - ) - ? fieldsArgsDescriptions.get(typeName) - : undefined; - const argDescriptions = - typeFieldArgDescriptions && typeFieldArgDescriptions[fieldKey] - ? typeFieldArgDescriptions[fieldKey] - : {}; - const fieldValueProps = parseSchemaType(fieldValue.__type); - const typeToReturn = parseFinalType(fieldValueProps); + const field = parseSchemaType(fieldValue.__type); + const returnType = parseFinalType(field); let finalType: string; + if (fieldValue.__args) { - const argsEntries = Object.entries(fieldValue.__args); - let onlyNullableArgs = true; - const argTypes = argsEntries.reduce( - (acum, [argKey, argValue]) => { - const argValueProps = parseSchemaType( - argValue, - argDescriptions[argKey] + let isArgsOptional = true; + + const argsType = Object.entries(fieldValue.__args).reduce( + (acum, [key, value]) => { + const arg = parseSchemaType( + value, + inputsDescription.get(typeName)?.[fieldKey]?.[key] ); - const connector = - argValueProps.isNullable || argValueProps.hasDefaultValue - ? '?:' - : ':'; + const isOptional = arg.isNullable || arg.hasDefaultValue; - if (!argValueProps.isNullable) { - onlyNullableArgs = false; - } + isArgsOptional &&= isOptional; - const argTypeValue = parseArgType(argValueProps); + const description = addDescription([typeName, fieldKey, key]); + const operator = isOptional ? '?:' : ':'; + const operand = parseArgType(arg); - acum += `${addDescription([ - typeName, - fieldKey, - argKey, - ])}${argKey}${connector} ${argTypeValue};\n`; + acum += `${description}${key}${operator} ${operand};\n`; return acum; }, '' ); - const argsConnector = onlyNullableArgs ? '?:' : ':'; - finalType = `: (args${argsConnector} {${argTypes}}) => ${typeToReturn}`; + + const operator = isArgsOptional ? '?:' : ':'; + + finalType = `: (args${operator} {${argsType}}) => ${returnType}`; } else { - const connector = fieldValueProps.isNullable ? '?:' : ':'; - finalType = `${connector} ${typeToReturn}`; + const operator = field.isNullable ? '?:' : ':'; + finalType = `${operator} ${returnType}`; } objectTypeMap.set(fieldKey, finalType); @@ -759,11 +727,8 @@ export async function generate( if (unionsAndInterfacesObjectTypesMap.size) { typescriptTypes += ` - ${deps - .sortBy( - Array.from(unionsAndInterfacesObjectTypesMap.entries()), - (v) => v[0] - ) + ${Array.from(unionsAndInterfacesObjectTypesMap) + .sort(deps.sortBy(0)) .reduce((acum, [unionInterfaceName, objectTypes]) => { acum += ` export interface $${unionInterfaceName} { @@ -788,10 +753,10 @@ export async function generate( ? Scalars[Key]['output'] : never; } & { - ${deps.sortBy(enumsNames).reduce((acum, enumName) => { - acum += `${enumName}: ${enumName};`; - return acum; - }, ``)} + ${Array.from(enumsNames) + .sort() + .map((enumName) => `${enumName}: ${enumName};`) + .join('\n')} } `; @@ -824,7 +789,7 @@ export async function generate( }; `; - const hasUnions = !!unionsAndInterfacesObjectTypesMap.size; + const hasUnions = unionsAndInterfacesObjectTypesMap.size > 0; const scalarsEnumsHashString = JSON.stringify( Object.keys(scalarsEnumsHash) @@ -835,12 +800,11 @@ export async function generate( }, {}) ); - const generatedSchemaCodeString = deps - .sortBy(Object.entries(generatedSchema), (v) => v[0]) + const generatedSchemaCodeString = Object.entries(generatedSchema) + .sort(deps.sortBy(0)) .reduceRight( - (acum, [key, value]) => { - return `${JSON.stringify(key)}:${JSON.stringify(value)}, ${acum}`; - }, + (acum, [key, value]) => + `${JSON.stringify(key)}:${JSON.stringify(value)}, ${acum}`, hasUnions ? `[SchemaUnionsKey]: ${JSON.stringify(unionsMapObj)}` : `` ); @@ -879,6 +843,7 @@ export async function generate( } const scalarsEnumsHash: ScalarsEnumsHash${ isJavascriptOutput ? ';' : ` = ${scalarsEnumsHashString};` } + export${isJavascriptOutput ? ' declare' : ''} const generatedSchema ${ isJavascriptOutput ? ':' : '=' } {${generatedSchemaCodeString}}${isJavascriptOutput ? '' : ' as const'}; diff --git a/packages/cli/test/generate.test.ts b/packages/cli/test/generate.test.ts index 3585cf46b..bfe65335a 100644 --- a/packages/cli/test/generate.test.ts +++ b/packages/cli/test/generate.test.ts @@ -80,6 +80,7 @@ test('basic functionality works', async () => { Int: true, String: true, }; + export const generatedSchema = { mutation: {}, query: { @@ -104,7 +105,7 @@ test('basic functionality works', async () => { */ deprecatedArg: (args?: { /** - * @defaultValue \`123\` + * @default \`123\` */ arg?: Maybe; }) => Maybe; @@ -454,6 +455,7 @@ test('custom scalars works', async () => { Custom: true, String: true, }; + export const generatedSchema = { mutation: {}, query: { __typename: { __type: 'String!' }, hello: { __type: 'Custom!' } }, @@ -667,6 +669,7 @@ describe('feature complete app', () => { OtherEnum: true, String: true, }; + export const generatedSchema = { GreetingsInput: { language: { __type: 'String!' }, @@ -794,7 +797,7 @@ describe('feature complete app', () => { __typename?: 'Query'; arrayObjectArgs: (args?: { /** - * @defaultValue \`10\` + * @default \`10\` */ limit?: Maybe; }) => Array; @@ -822,11 +825,11 @@ describe('feature complete app', () => { stringNullableWithArgs: (args: { hello: ScalarsEnums['String']; /** - * @defaultValue \`"Hi"\` + * @default \`"Hi"\` */ helloThree?: Maybe; /** - * @defaultValue \`"Hi"\` + * @default \`"Hi"\` */ helloTwo?: Maybe; }) => Maybe; @@ -1162,6 +1165,7 @@ describe('mutation', () => { Boolean: true, String: true, }; + export const generatedSchema = { mutation: { __typename: { __type: 'String!' }, @@ -1304,6 +1308,7 @@ describe('subscription', () => { Boolean: true, String: true, }; + export const generatedSchema = { mutation: {}, query: { __typename: { __type: 'String!' }, hello: { __type: 'String!' } }, @@ -1645,6 +1650,7 @@ test('javascript output works', async () => { } export declare const scalarsEnumsHash: ScalarsEnumsHash; + export declare const generatedSchema: { A: { __typename: { __type: 'String!' }; a: { __type: 'String' } }; B: { __typename: { __type: 'String!' }; b: { __type: 'Int' } }; @@ -1927,6 +1933,7 @@ test('ignoreArgs transform', async () => { Int: true, String: true, }; + export const generatedSchema = { mutation: {}, query: { @@ -2155,6 +2162,7 @@ test('fields with default value works', async () => { Boolean: true, String: true, }; + export const generatedSchema = { mutation: {}, query: { @@ -2173,9 +2181,9 @@ test('fields with default value works', async () => { */ export interface Query { __typename?: 'Query'; - hello: (args: { + hello: (args?: { /** - * @defaultValue \`"world"\` + * @default \`"world"\` */ world?: Maybe; }) => ScalarsEnums['String']; diff --git a/packages/cli/test/inspectWriteGenerate.test.ts b/packages/cli/test/inspectWriteGenerate.test.ts index a4946f0e2..c8f384175 100644 --- a/packages/cli/test/inspectWriteGenerate.test.ts +++ b/packages/cli/test/inspectWriteGenerate.test.ts @@ -155,11 +155,8 @@ test('basic inspectWriteGenerate functionality', async () => { " `); - expect( - await readFile(tempDir.schemaPath, { - encoding: 'utf-8', - }) - ).toMatchInlineSnapshot(` + expect(await readFile(tempDir.schemaPath, { encoding: 'utf-8' })) + .toMatchInlineSnapshot(` "/** * GQty AUTO-GENERATED CODE: PLEASE DO NOT MODIFY MANUALLY */ @@ -199,6 +196,7 @@ test('basic inspectWriteGenerate functionality', async () => { Boolean: true, String: true, }; + export const generatedSchema = { mutation: {}, query: { __typename: { __type: 'String!' }, hello: { __type: 'String!' } }, @@ -414,6 +412,7 @@ describe('from file', () => { Int: true, String: true, }; + export const generatedSchema = { mutation: {}, query: { __typename: { __type: 'String!' }, hello: { __type: 'Int!' } }, @@ -630,6 +629,7 @@ describe('from file', () => { Boolean: true, String: true, }; + export const generatedSchema = { mutation: {}, query: { __typename: { __type: 'String!' }, hello: { __type: 'String!' } }, @@ -846,6 +846,7 @@ describe('from file', () => { Boolean: true, String: true, }; + export const generatedSchema = { mutation: {}, query: { __typename: { __type: 'String!' }, hello: { __type: 'String!' } }, @@ -1107,6 +1108,7 @@ describe('from multiple files', () => { Int: true, String: true, }; + export const generatedSchema = { mutation: {}, query: { @@ -1384,6 +1386,7 @@ test('specify generateOptions to inspectWriteGenerate', async () => { Boolean: true, String: true, }; + export const generatedSchema = { mutation: {}, query: { __typename: { __type: 'String!' }, hello: { __type: 'String!' } }, @@ -1522,6 +1525,7 @@ describe('inspect headers', () => { Boolean: true, String: true, }; + export const generatedSchema = { mutation: {}, query: { __typename: { __type: 'String!' }, hello: { __type: 'String!' } }, @@ -1719,11 +1723,8 @@ describe('CLI behavior', () => { " `); - expect( - await readFile(tempDir.schemaPath, { - encoding: 'utf-8', - }) - ).toMatchInlineSnapshot(` + expect(await readFile(tempDir.schemaPath, { encoding: 'utf-8' })) + .toMatchInlineSnapshot(` "/** * GQty AUTO-GENERATED CODE: PLEASE DO NOT MODIFY MANUALLY */ @@ -1763,6 +1764,7 @@ describe('CLI behavior', () => { Boolean: true, String: true, }; + export const generatedSchema = { mutation: {}, query: { __typename: { __type: 'String!' }, hello: { __type: 'String!' } }, diff --git a/packages/cli/test/writeGenerate.test.ts b/packages/cli/test/writeGenerate.test.ts index d7e302690..0f201f054 100644 --- a/packages/cli/test/writeGenerate.test.ts +++ b/packages/cli/test/writeGenerate.test.ts @@ -109,6 +109,7 @@ test('generates code and writes existing file', async () => { Boolean: true, String: true, }; + export const generatedSchema = { mutation: {}, query: { __typename: { __type: 'String!' }, hello: { __type: 'String!' } }, @@ -218,6 +219,7 @@ test('creates dir, generates code and writes new file', async () => { Boolean: true, String: true, }; + export const generatedSchema = { mutation: {}, query: { __typename: { __type: 'String!' }, hello: { __type: 'String!' } }, diff --git a/packages/gqty/package.json b/packages/gqty/package.json index 0a35e9f8d..ef7797513 100644 --- a/packages/gqty/package.json +++ b/packages/gqty/package.json @@ -73,7 +73,6 @@ "flatted": "^3.3.3", "frail-map": "^1.0.10", "just-extend": "^6.2.0", - "just-has": "^2.3.0", "just-memoize": "^2.2.0", "just-safe-get": "^4.2.0", "just-safe-set": "^4.2.1", @@ -94,8 +93,7 @@ "graphql": "^16.10.0", "graphql-sse": "^2.5.4", "graphql-ws": "^5.16.2", - "jest": "^30.0.0-alpha.7", - "just-memoize": "^2.2.0", + "jest": "^29.7.0", "p-lazy": "^3.1.0", "test-utils": "workspace:^", "tsc-watch": "^6.2.1", diff --git a/packages/gqty/src/Schema.ts b/packages/gqty/src/Schema.ts index 4f2102a94..a4df4b829 100644 --- a/packages/gqty/src/Schema.ts +++ b/packages/gqty/src/Schema.ts @@ -38,7 +38,7 @@ export type QueryPayload< readonly extensions?: TExtension; }; -export interface ParseSchemaTypeInfo { +export interface ParsedSchemaType { pureType: string; isNullable: boolean; hasDefaultValue: boolean; @@ -57,14 +57,15 @@ export type ArgsDescriptions = Record< Record >; +// [ ] Rewrite generatedSchema from text representations to bit patterns export const parseSchemaType = memoize( ( type: string, fieldDesc: FieldDescription | undefined = undefined - ): ParseSchemaTypeInfo => { + ): ParsedSchemaType => { let isArray = false; let isNullable = true; - const hasDefaultValue = !!(fieldDesc && fieldDesc.defaultValue !== null); + const hasDefaultValue = fieldDesc?.defaultValue != null; let pureType = type; let nullableItems = true; if (pureType.endsWith('!')) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1d2a07c17..6193b71b0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -302,6 +302,9 @@ importers: specifier: ^1.9.4 version: 1.9.4 devDependencies: + '@gqty/cli': + specifier: workspace:^ + version: link:../../packages/cli/dist '@tailwindcss/postcss': specifier: ^4.0.7 version: 4.0.7 @@ -478,9 +481,9 @@ importers: graphql: specifier: ^16.10.0 version: 16.10.0 - lodash-es: - specifier: ^4.17.21 - version: 4.17.21 + just-throttle: + specifier: ^4.2.0 + version: 4.2.0 micromatch: specifier: ^4.0.8 version: 4.0.8 @@ -494,9 +497,6 @@ importers: '@pnpm/types': specifier: ^1000.1.1 version: 1000.1.1 - '@types/lodash-es': - specifier: ^4.17.12 - version: 4.17.12 '@types/micromatch': specifier: ^4.0.9 version: 4.0.9 @@ -543,9 +543,6 @@ importers: just-extend: specifier: ^6.2.0 version: 6.2.0 - just-has: - specifier: ^2.3.0 - version: 2.3.0 just-memoize: specifier: ^2.2.0 version: 2.2.0 @@ -602,8 +599,8 @@ importers: specifier: ^5.16.2 version: 5.16.2(graphql@16.10.0) jest: - specifier: ^30.0.0-alpha.7 - version: 30.0.0-alpha.7(@types/node@22.13.4)(ts-node@10.9.2) + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.13.4)(ts-node@10.9.2) p-lazy: specifier: ^3.1.0 version: 3.1.0 @@ -4563,18 +4560,6 @@ packages: jest-util: 29.7.0 slash: 3.0.0 - /@jest/console@30.0.0-alpha.7: - resolution: {integrity: sha512-6tNcZwg3dJeww2Ne9Y+x0Au4OPtbWwYzOfwh2ecK/Yp3/KNkULp5oNvx0qJUvvGgQWSBbYvLRrgLnoRlRhpZew==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - '@jest/types': 30.0.0-alpha.7 - '@types/node': 22.13.4 - chalk: 4.1.2 - jest-message-util: 30.0.0-alpha.7 - jest-util: 30.0.0-alpha.7 - slash: 3.0.0 - dev: true - /@jest/core@29.7.0(ts-node@10.9.2): resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4617,51 +4602,6 @@ packages: - supports-color - ts-node - /@jest/core@30.0.0-alpha.7(ts-node@10.9.2): - resolution: {integrity: sha512-c+062gpdgytcBlIucMtjWxQ6ETgkFeVeP+TwTyP9DNtM8iNAO/UhOGIgO95Cd3nSZqH/nPN/PFWfuLwOZ55GOg==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/console': 30.0.0-alpha.7 - '@jest/pattern': 30.0.0-alpha.7 - '@jest/reporters': 30.0.0-alpha.7 - '@jest/test-result': 30.0.0-alpha.7 - '@jest/transform': 30.0.0-alpha.7 - '@jest/types': 30.0.0-alpha.7 - '@types/node': 22.13.4 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 4.1.0 - exit-x: 0.2.2 - graceful-fs: 4.2.11 - jest-changed-files: 30.0.0-alpha.7 - jest-config: 30.0.0-alpha.7(@types/node@22.13.4)(ts-node@10.9.2) - jest-haste-map: 30.0.0-alpha.7 - jest-message-util: 30.0.0-alpha.7 - jest-regex-util: 30.0.0-alpha.7 - jest-resolve: 30.0.0-alpha.7 - jest-resolve-dependencies: 30.0.0-alpha.7 - jest-runner: 30.0.0-alpha.7 - jest-runtime: 30.0.0-alpha.7 - jest-snapshot: 30.0.0-alpha.7 - jest-util: 30.0.0-alpha.7 - jest-validate: 30.0.0-alpha.7 - jest-watcher: 30.0.0-alpha.7 - micromatch: 4.0.8 - pretty-format: 30.0.0-alpha.7 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - babel-plugin-macros - - esbuild-register - - supports-color - - ts-node - dev: true - /@jest/environment@29.7.0: resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4671,29 +4611,12 @@ packages: '@types/node': 22.13.4 jest-mock: 29.7.0 - /@jest/environment@30.0.0-alpha.7: - resolution: {integrity: sha512-sEszhsMrT7Jh0ngVjR8q36payUT2NU0kYwd5rdxUzlVha8gZg2FTq1VMjgETEnYyGXrEmnk7MmBUxTbT7dYrUw==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - '@jest/fake-timers': 30.0.0-alpha.7 - '@jest/types': 30.0.0-alpha.7 - '@types/node': 22.13.4 - jest-mock: 30.0.0-alpha.7 - dev: true - /@jest/expect-utils@29.7.0: resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-get-type: 29.6.3 - /@jest/expect-utils@30.0.0-alpha.7: - resolution: {integrity: sha512-lr711aEHiXWM9X0BC/fH+HID5eatdCjluh2PKxKHPZbjmtWA5RiHXC/s16cPFI6voSnofOjDICvzNVxSO87ZrQ==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - jest-get-type: 30.0.0-alpha.7 - dev: true - /@jest/expect@29.7.0: resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4703,16 +4626,6 @@ packages: transitivePeerDependencies: - supports-color - /@jest/expect@30.0.0-alpha.7: - resolution: {integrity: sha512-YevyfPQaCyG1SPv+9Zu05Qfds73nxv/exKrfPj0oVzDGaJEBPXAuUYqt0uKu17q8OWCNYaYcAY0szTqa7GnVnQ==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - expect: 30.0.0-alpha.7 - jest-snapshot: 30.0.0-alpha.7 - transitivePeerDependencies: - - supports-color - dev: true - /@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} @@ -4724,18 +4637,6 @@ packages: jest-mock: 29.7.0 jest-util: 29.7.0 - /@jest/fake-timers@30.0.0-alpha.7: - resolution: {integrity: sha512-ct29bG+ebuRk1Re8nzxcMJIul1sE1Se0/PRwQwqbrLbInOw5H31q9DnqrhVhqgUgXosx7dyt1dJD8UvBfHBc4A==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - '@jest/types': 30.0.0-alpha.7 - '@sinonjs/fake-timers': 13.0.5 - '@types/node': 22.13.4 - jest-message-util: 30.0.0-alpha.7 - jest-mock: 30.0.0-alpha.7 - jest-util: 30.0.0-alpha.7 - dev: true - /@jest/globals@29.7.0: resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4747,26 +4648,6 @@ packages: transitivePeerDependencies: - supports-color - /@jest/globals@30.0.0-alpha.7: - resolution: {integrity: sha512-y5CKO76wPQfoqMVN+8DlYCU08mqhvfMDGV58j0XYYQIRWYOeIqvvveVBaq47ePknubsOBQeS0Z0zflQccZUnCg==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - '@jest/environment': 30.0.0-alpha.7 - '@jest/expect': 30.0.0-alpha.7 - '@jest/types': 30.0.0-alpha.7 - jest-mock: 30.0.0-alpha.7 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/pattern@30.0.0-alpha.7: - resolution: {integrity: sha512-PpuWkTJwcFJlyo6YOuMLi96doaaDfz90gOAU+cuyIZyr6wjbjKjdMkHlt7rE6gNaZNEUEA9sSJzKsg8oXfLW0w==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - '@types/node': 22.13.4 - jest-regex-util: 30.0.0-alpha.7 - dev: true - /@jest/reporters@29.7.0: resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4803,66 +4684,12 @@ packages: transitivePeerDependencies: - supports-color - /@jest/reporters@30.0.0-alpha.7: - resolution: {integrity: sha512-DUDi4oV6Vk0aQEGJCKRZVVxpuCBZkBD/wzV2fXz2X3IVBq1lO27EJzv8BKDqdi3Fwr2J4vocynIp/aPb+XxXlQ==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 30.0.0-alpha.7 - '@jest/test-result': 30.0.0-alpha.7 - '@jest/transform': 30.0.0-alpha.7 - '@jest/types': 30.0.0-alpha.7 - '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 22.13.4 - chalk: 4.1.2 - collect-v8-coverage: 1.0.2 - exit-x: 0.2.2 - glob: 10.4.5 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 6.0.3 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 5.0.6 - istanbul-reports: 3.1.7 - jest-message-util: 30.0.0-alpha.7 - jest-util: 30.0.0-alpha.7 - jest-worker: 30.0.0-alpha.7 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - v8-to-istanbul: 9.3.0 - transitivePeerDependencies: - - supports-color - dev: 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} dependencies: '@sinclair/typebox': 0.27.8 - /@jest/schemas@30.0.0-alpha.7: - resolution: {integrity: sha512-fzJDwdg3E8Gq+Aqo/h+JQc1ZD+Mqbkz7OVqpoUa0A2Btd70zdgu1Hza8AyhJjr83paRQ+ZCHnHepp4/+tpqDFQ==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - '@sinclair/typebox': 0.34.15 - dev: true - - /@jest/snapshot-utils@30.0.0-alpha.7: - resolution: {integrity: sha512-mXfMgNqHdiuWXavhZPaH+EfASKp5DUqfr9ISvcl+YO0HxtOvQH2Ulttwsq9MYkhbKpiwTTk17Tt6NTBogmRlGw==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - '@jest/types': 30.0.0-alpha.7 - chalk: 4.1.2 - graceful-fs: 4.2.11 - natural-compare: 1.4.0 - dev: true - /@jest/source-map@29.6.3: resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4871,15 +4698,6 @@ packages: callsites: 3.1.0 graceful-fs: 4.2.11 - /@jest/source-map@30.0.0-alpha.7: - resolution: {integrity: sha512-zWk0ZjV2tOBhERTJagxjrRfCxb/X5SecekXJIm0U9vWNuKNKDmK1TQJcQP0SdtqM2aa5bNdjub3lg29l7E8EIw==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - callsites: 3.1.0 - graceful-fs: 4.2.11 - dev: true - /@jest/test-result@29.7.0: resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4889,16 +4707,6 @@ packages: '@types/istanbul-lib-coverage': 2.0.6 collect-v8-coverage: 1.0.2 - /@jest/test-result@30.0.0-alpha.7: - resolution: {integrity: sha512-+GUXXq5LocMv3FXddg9MxXcApaX4Jno6qFAz+pL/m3pxTy7nGPQPuEUXZelEEQevMrLP5ds2PxLGd6OVoV565Q==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - '@jest/console': 30.0.0-alpha.7 - '@jest/types': 30.0.0-alpha.7 - '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.2 - dev: true - /@jest/test-sequencer@29.7.0: resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4908,16 +4716,6 @@ packages: jest-haste-map: 29.7.0 slash: 3.0.0 - /@jest/test-sequencer@30.0.0-alpha.7: - resolution: {integrity: sha512-X4uXuY0nqg3/4SYrzIwScFs2KBGa0yIr/r4LLmakdrP0BzTOHOXZG+i3nqVlLFCjHwJQInuxDx79dI3UsJOt2A==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - '@jest/test-result': 30.0.0-alpha.7 - graceful-fs: 4.2.11 - jest-haste-map: 30.0.0-alpha.7 - slash: 3.0.0 - dev: true - /@jest/transform@29.7.0: resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4940,29 +4738,6 @@ packages: transitivePeerDependencies: - supports-color - /@jest/transform@30.0.0-alpha.7: - resolution: {integrity: sha512-uv/gA0QdtnSHJLoQngSzJGXCjTDykJpQFUUuuYN/G9GVPM/aORyNb3ybkkozgjHSV9eC1hJCoQRuraEDJa1pSg==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - '@babel/core': 7.26.9 - '@jest/types': 30.0.0-alpha.7 - '@jridgewell/trace-mapping': 0.3.25 - babel-plugin-istanbul: 7.0.0 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 30.0.0-alpha.7 - jest-regex-util: 30.0.0-alpha.7 - jest-util: 30.0.0-alpha.7 - micromatch: 4.0.8 - pirates: 4.0.6 - slash: 3.0.0 - write-file-atomic: 5.0.1 - transitivePeerDependencies: - - supports-color - dev: true - /@jest/types@29.6.3: resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4974,19 +4749,6 @@ packages: '@types/yargs': 17.0.33 chalk: 4.1.2 - /@jest/types@30.0.0-alpha.7: - resolution: {integrity: sha512-hrdUqtIjUMpoNlpmo4DQfe6fvD0Rk02kdOv0+AsAbO689llpzNmb+kLcojzKp/H2jVGqcYrUb0wNSRgn4KcuqA==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - '@jest/pattern': 30.0.0-alpha.7 - '@jest/schemas': 30.0.0-alpha.7 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 22.13.4 - '@types/yargs': 17.0.33 - chalk: 4.1.2 - dev: true - /@jridgewell/gen-mapping@0.3.8: resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} @@ -5252,11 +5014,6 @@ packages: dev: true optional: true - /@pkgr/core@0.1.1: - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - dev: true - /@pnpm/types@1000.1.1: resolution: {integrity: sha512-5zrv7B+4mW/6iiYS/BrFZWbMqLHjKmaBrMcw+F8LcuMQ7p4SQX4ANoycpr1VIQpn4+xQ0ckyuadfxBttpzicbg==} engines: {node: '>=18.12'} @@ -5544,10 +5301,6 @@ packages: /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - /@sinclair/typebox@0.34.15: - resolution: {integrity: sha512-xeIzl3h1Znn9w/LTITqpiwag0gXjA+ldi2ZkXIBxGEppGCW211Tza+eL6D4pKqs10bj5z2umBWk5WL6spQ2OCQ==} - dev: true - /@sinonjs/commons@3.0.1: resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} dependencies: @@ -5558,12 +5311,6 @@ packages: dependencies: '@sinonjs/commons': 3.0.1 - /@sinonjs/fake-timers@13.0.5: - resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==} - dependencies: - '@sinonjs/commons': 3.0.1 - dev: true - /@solid-devtools/debugger@0.26.0(solid-js@1.9.4): resolution: {integrity: sha512-36QxZ+s/lY60E+Pb9q0eTsdqgaog4c823WIj5dC2LFdGrGXbVGBQEj6k7CgvMnEETdwndrd0Fm72fQyYPlZrVA==} peerDependencies: @@ -6493,10 +6240,6 @@ packages: eslint-visitor-keys: 4.2.0 dev: true - /@ungap/structured-clone@1.3.0: - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - dev: true - /@vitejs/plugin-react@4.3.4(vite@6.1.1): resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} engines: {node: ^14.18.0 || >=16.0.0} @@ -7007,24 +6750,6 @@ packages: transitivePeerDependencies: - supports-color - /babel-jest@30.0.0-alpha.7(@babel/core@7.26.9): - resolution: {integrity: sha512-EGY3n/zQcuR88leKdFAt67DmUSEpc+0xqMhMuYMfT9H1rhVAIJD9hc3JId+vzOnKyhn/iQsDxKoRkNcGDAe0WQ==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - peerDependencies: - '@babel/core': ^7.11.0 - dependencies: - '@babel/core': 7.26.9 - '@jest/transform': 30.0.0-alpha.7 - '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 7.0.0 - babel-preset-jest: 30.0.0-alpha.7(@babel/core@7.26.9) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - /babel-plugin-istanbul@6.1.1: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} @@ -7037,19 +6762,6 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-istanbul@7.0.0: - resolution: {integrity: sha512-C5OzENSx/A+gt7t4VH1I2XsflxyPUmXRFPKBxt33xncdOmq7oROVM3bZv9Ysjjkv8OJYDMa+tKuKMvqU/H3xdw==} - engines: {node: '>=12'} - dependencies: - '@babel/helper-plugin-utils': 7.26.5 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 6.0.3 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - dev: true - /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} @@ -7059,15 +6771,6 @@ packages: '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.6 - /babel-plugin-jest-hoist@30.0.0-alpha.7: - resolution: {integrity: sha512-1EGEprSFBDxHdQvnkkklxdcmb6+WssLMTQU3FyzrBVUuzXOg5+D+Z909gGPZ4bhZ9VkrDGcNg08m6OjL2jh6Bg==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - '@babel/template': 7.26.8 - '@babel/types': 7.26.8 - '@types/babel__core': 7.20.5 - dev: true - /babel-plugin-jsx-dom-expressions@0.39.6(@babel/core@7.26.9): resolution: {integrity: sha512-HMkTn5A3NyydEgG7HKmm48YcnsQQyqeT6SKNWh2TrS6nn5rOLeHDfg5hPbrRUCFUqaT9WGn5NInQfMc3qne3Dg==} peerDependencies: @@ -7200,17 +6903,6 @@ packages: babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.9) - /babel-preset-jest@30.0.0-alpha.7(@babel/core@7.26.9): - resolution: {integrity: sha512-LUWdMJ6mIJhXv56hVe+t3/lxokSd0geN8+TT1FHjJAEdHXi+ye6TRqVggn6fdrL/mxXXg9QusAzHJVjF4vxWEA==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - peerDependencies: - '@babel/core': ^7.11.0 - dependencies: - '@babel/core': 7.26.9 - babel-plugin-jest-hoist: 30.0.0-alpha.7 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.9) - dev: true - /babel-preset-solid@1.9.3(@babel/core@7.26.9): resolution: {integrity: sha512-jvlx5wDp8s+bEF9sGFw/84SInXOA51ttkUEroQziKMbxplXThVKt83qB6bDTa1HuLNatdU9FHpFOiQWs1tLQIg==} peerDependencies: @@ -7546,11 +7238,6 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - /ci-info@4.1.0: - resolution: {integrity: sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==} - engines: {node: '>=8'} - dev: true - /cjs-module-lexer@1.4.3: resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} @@ -8033,11 +7720,6 @@ packages: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - /diff-sequences@30.0.0-alpha.7: - resolution: {integrity: sha512-T8qx2cdaE0DW3nMpgf0jxOvSECOIkvPpjEeTs3qVT/+gzhZGLKjex4lc+dNiaLA92hDwmt6AG9WO/j2RUlNQJw==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dev: true - /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -8746,11 +8428,6 @@ packages: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - /exit-x@0.2.2: - resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} - engines: {node: '>= 0.8.0'} - dev: true - /exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} @@ -8770,18 +8447,6 @@ packages: jest-message-util: 29.7.0 jest-util: 29.7.0 - /expect@30.0.0-alpha.7: - resolution: {integrity: sha512-tWb6p3Dn1S8GTunR9jfsku6l6dkZrqZQ5smI+UWx0KIk5ugS0QuPo66w40NdWRWcH+JklC9Dk8Elh2S2M4FfSw==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - '@jest/expect-utils': 30.0.0-alpha.7 - jest-get-type: 30.0.0-alpha.7 - jest-matcher-utils: 30.0.0-alpha.7 - jest-message-util: 30.0.0-alpha.7 - jest-mock: 30.0.0-alpha.7 - jest-util: 30.0.0-alpha.7 - dev: true - /extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} dev: true @@ -10005,15 +9670,6 @@ packages: jest-util: 29.7.0 p-limit: 3.1.0 - /jest-changed-files@30.0.0-alpha.7: - resolution: {integrity: sha512-H8LBMHv5FZ+zkSohhq6vYxVlDl4bogTw/8/Cm78Bw+jfTOH+DkrWUESC8GLCDgK2YA12PiczhCrgun9yaBwn0A==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - execa: 5.1.1 - jest-util: 30.0.0-alpha.7 - p-limit: 3.1.0 - dev: true - /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} @@ -10042,35 +9698,6 @@ packages: - babel-plugin-macros - supports-color - /jest-circus@30.0.0-alpha.7: - resolution: {integrity: sha512-lTd93dNI5zG15AejGuGetIPr9n0BbF6JhaTjtmsENFYOpb0cuNv3supdGp9y+eWW06jbg4PNANHWAyAakNRPqw==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - '@jest/environment': 30.0.0-alpha.7 - '@jest/expect': 30.0.0-alpha.7 - '@jest/test-result': 30.0.0-alpha.7 - '@jest/types': 30.0.0-alpha.7 - '@types/node': 22.13.4 - chalk: 4.1.2 - co: 4.6.0 - dedent: 1.5.3 - is-generator-fn: 2.1.0 - jest-each: 30.0.0-alpha.7 - jest-matcher-utils: 30.0.0-alpha.7 - jest-message-util: 30.0.0-alpha.7 - jest-runtime: 30.0.0-alpha.7 - jest-snapshot: 30.0.0-alpha.7 - jest-util: 30.0.0-alpha.7 - p-limit: 3.1.0 - pretty-format: 30.0.0-alpha.7 - pure-rand: 6.1.0 - slash: 3.0.0 - stack-utils: 2.0.6 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - dev: true - /jest-cli@29.7.0(@types/node@22.13.4)(ts-node@10.9.2): resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10098,34 +9725,6 @@ packages: - supports-color - ts-node - /jest-cli@30.0.0-alpha.7(@types/node@22.13.4)(ts-node@10.9.2): - resolution: {integrity: sha512-DemFDFvWPtdHr61L1MSkzY0VbUtjkQeVAulMmtrJOH25xw8mPQAQVD97zmFLbtvzasxTwY8C36C/dHViAM7rpA==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 30.0.0-alpha.7(ts-node@10.9.2) - '@jest/test-result': 30.0.0-alpha.7 - '@jest/types': 30.0.0-alpha.7 - chalk: 4.1.2 - exit-x: 0.2.2 - import-local: 3.2.0 - jest-config: 30.0.0-alpha.7(@types/node@22.13.4)(ts-node@10.9.2) - jest-util: 30.0.0-alpha.7 - jest-validate: 30.0.0-alpha.7 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - esbuild-register - - supports-color - - ts-node - dev: true - /jest-config@29.7.0(@types/node@22.13.4)(ts-node@10.9.2): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10166,52 +9765,6 @@ packages: - babel-plugin-macros - supports-color - /jest-config@30.0.0-alpha.7(@types/node@22.13.4)(ts-node@10.9.2): - resolution: {integrity: sha512-YTzk8fQ2xwvEfIupwKxDpqHblWxtePTTfCA7Pto1jretggvFtNZnVWiIAqq7/GabsYoTsFl8uj7iKzxTZzXmXg==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - peerDependencies: - '@types/node': '*' - esbuild-register: '>=3.4.0' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - esbuild-register: - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.26.9 - '@jest/pattern': 30.0.0-alpha.7 - '@jest/test-sequencer': 30.0.0-alpha.7 - '@jest/types': 30.0.0-alpha.7 - '@types/node': 22.13.4 - babel-jest: 30.0.0-alpha.7(@babel/core@7.26.9) - chalk: 4.1.2 - ci-info: 4.1.0 - deepmerge: 4.3.1 - glob: 10.4.5 - graceful-fs: 4.2.11 - jest-circus: 30.0.0-alpha.7 - jest-docblock: 30.0.0-alpha.7 - jest-environment-node: 30.0.0-alpha.7 - jest-get-type: 30.0.0-alpha.7 - jest-regex-util: 30.0.0-alpha.7 - jest-resolve: 30.0.0-alpha.7 - jest-runner: 30.0.0-alpha.7 - jest-util: 30.0.0-alpha.7 - jest-validate: 30.0.0-alpha.7 - micromatch: 4.0.8 - parse-json: 5.2.0 - pretty-format: 30.0.0-alpha.7 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 10.9.2(@types/node@22.13.4)(typescript@5.7.3) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - dev: true - /jest-diff@29.7.0: resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10221,29 +9774,12 @@ packages: jest-get-type: 29.6.3 pretty-format: 29.7.0 - /jest-diff@30.0.0-alpha.7: - resolution: {integrity: sha512-a2O+O+qBIhpUtKSwApNDN6zWqNuP1vfSN1maXmm0ix1+GkBezSdNWSGlcQqJNVM1cwSD/oQQo7EzhixpMi6TWQ==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - chalk: 4.1.2 - diff-sequences: 30.0.0-alpha.7 - jest-get-type: 30.0.0-alpha.7 - pretty-format: 30.0.0-alpha.7 - dev: true - /jest-docblock@29.7.0: resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: detect-newline: 3.1.0 - /jest-docblock@30.0.0-alpha.7: - resolution: {integrity: sha512-vAid4aUsBD0yke/NIbmSBi0BuJqcyqX6f4vR//7VADq6ASWzmadfpRPSKrfvOeBy+ElBGVNf9UVaH4+eSPfrcw==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - detect-newline: 3.1.0 - dev: true - /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} @@ -10254,17 +9790,6 @@ packages: jest-util: 29.7.0 pretty-format: 29.7.0 - /jest-each@30.0.0-alpha.7: - resolution: {integrity: sha512-+l0iwn3am4WaIk00+r2qt5yA1kD/GfS9ARIfp/SXNb+4ztxgtK4o+/uCDdUWjiowtPbJtSDDcDcNb4l8/2bgyQ==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - '@jest/types': 30.0.0-alpha.7 - chalk: 4.1.2 - jest-get-type: 30.0.0-alpha.7 - jest-util: 30.0.0-alpha.7 - pretty-format: 30.0.0-alpha.7 - dev: true - /jest-environment-jsdom@29.7.0(bufferutil@4.0.9): resolution: {integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10299,27 +9824,10 @@ packages: jest-mock: 29.7.0 jest-util: 29.7.0 - /jest-environment-node@30.0.0-alpha.7: - resolution: {integrity: sha512-d2WEhVIO75wXaSupVUSsn4VF0G9XIXlKPKMrppEJaHLe+EDtt6lBS6TI7CD1YrxS+0Jgs6+b428tKc4xUZlyMA==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - '@jest/environment': 30.0.0-alpha.7 - '@jest/fake-timers': 30.0.0-alpha.7 - '@jest/types': 30.0.0-alpha.7 - '@types/node': 22.13.4 - jest-mock: 30.0.0-alpha.7 - jest-util: 30.0.0-alpha.7 - dev: true - /jest-get-type@29.6.3: resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - /jest-get-type@30.0.0-alpha.7: - resolution: {integrity: sha512-0Zt3y51PSw3FZxgRYyoC6TlKnL2Z2wMWS1NCQbs/CrmNEDRNpx9ZMF+UIByQgFcDT+fB3U/gwKeLtmSpNhJRNw==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dev: true - /jest-haste-map@29.7.0: resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10338,24 +9846,6 @@ packages: optionalDependencies: fsevents: 2.3.3 - /jest-haste-map@30.0.0-alpha.7: - resolution: {integrity: sha512-Yxxbsm00ne7b1kis8WEkCl1gf+7/TQl8S25iyGp+mDHvhzP8SFpX7Pi1Mi1D+Y0kAO8A0S+6s5UO9QXj9CKCcg==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - '@jest/types': 30.0.0-alpha.7 - '@types/node': 22.13.4 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 30.0.0-alpha.7 - jest-util: 30.0.0-alpha.7 - jest-worker: 30.0.0-alpha.7 - micromatch: 4.0.8 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.3 - dev: true - /jest-leak-detector@29.7.0: resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10363,14 +9853,6 @@ packages: jest-get-type: 29.6.3 pretty-format: 29.7.0 - /jest-leak-detector@30.0.0-alpha.7: - resolution: {integrity: sha512-MdS+e4GnipvUsh7WBYz+hFLTiLhn28asqAFugUKL8IDTHJRhwKi0QRaKRFUXDyA/RX3HWuobeQisR/YMjdsgcw==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - jest-get-type: 30.0.0-alpha.7 - pretty-format: 30.0.0-alpha.7 - dev: true - /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} @@ -10380,16 +9862,6 @@ packages: jest-get-type: 29.6.3 pretty-format: 29.7.0 - /jest-matcher-utils@30.0.0-alpha.7: - resolution: {integrity: sha512-qD99h6nz8VXD+qimS4BSfFKtWXsDsFtKk10jGBdo5+yiuSViY/plr1MWKA1QpbJswXmqcTiPeoViNmhUKqjefw==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - chalk: 4.1.2 - jest-diff: 30.0.0-alpha.7 - jest-get-type: 30.0.0-alpha.7 - pretty-format: 30.0.0-alpha.7 - dev: true - /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} @@ -10404,21 +9876,6 @@ packages: slash: 3.0.0 stack-utils: 2.0.6 - /jest-message-util@30.0.0-alpha.7: - resolution: {integrity: sha512-Wzfx5D8SQwdeb4iXex86ddzTMK2QTc0FUIIFEQ7VuQ+RWEcCRgpOPu6QaQqLl9X8q/JZ1yU/6ZIhb7dpJ6TnWw==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - '@babel/code-frame': 7.26.2 - '@jest/types': 30.0.0-alpha.7 - '@types/stack-utils': 2.0.3 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.8 - pretty-format: 30.0.0-alpha.7 - slash: 3.0.0 - stack-utils: 2.0.6 - dev: true - /jest-mock@29.7.0: resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10427,15 +9884,6 @@ packages: '@types/node': 22.13.4 jest-util: 29.7.0 - /jest-mock@30.0.0-alpha.7: - resolution: {integrity: sha512-HQc7Uem+l5hzVZNMKpUV5F27AahfgmMuYbyRT5NV9OGD2WGkw9BouKAcV5tFGykcQc2+Rt5kk/hF1l5qi4Iwrw==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - '@jest/types': 30.0.0-alpha.7 - '@types/node': 22.13.4 - jest-util: 30.0.0-alpha.7 - dev: true - /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} @@ -10447,27 +9895,10 @@ packages: dependencies: jest-resolve: 29.7.0 - /jest-pnp-resolver@1.2.3(jest-resolve@30.0.0-alpha.7): - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - dependencies: - jest-resolve: 30.0.0-alpha.7 - dev: true - /jest-regex-util@29.6.3: resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - /jest-regex-util@30.0.0-alpha.7: - resolution: {integrity: sha512-EUHpErwer3WQVcX1wKlvGHtIzVnGz5PzFVzp3/PzI+kTGduDvo0JuOnKHWuBYVwc5TADQmrdNiVU3+25swZoug==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dev: true - /jest-resolve-dependencies@29.7.0: resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10477,16 +9908,6 @@ packages: transitivePeerDependencies: - supports-color - /jest-resolve-dependencies@30.0.0-alpha.7: - resolution: {integrity: sha512-6BbZrjAvJIKmD6gfh1moaAxUnKi7QM9L4y9ciV7OMQmbbPRcRynUs/Pfdh5Z1dcxuyYuSV95Q6XIt77SK6ePCQ==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - jest-regex-util: 30.0.0-alpha.7 - jest-snapshot: 30.0.0-alpha.7 - transitivePeerDependencies: - - supports-color - dev: true - /jest-resolve@29.7.0: resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10501,21 +9922,6 @@ packages: resolve.exports: 2.0.3 slash: 3.0.0 - /jest-resolve@30.0.0-alpha.7: - resolution: {integrity: sha512-NukCyDlEv2rw7pM+Tl8tAvxM9di1Svxdx84HM6V2XB9PvPXxxrcfepWpsle09/ypYCRnSPlLpn4j5nQUsVLHZA==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - chalk: 4.1.2 - graceful-fs: 4.2.11 - jest-haste-map: 30.0.0-alpha.7 - jest-pnp-resolver: 1.2.3(jest-resolve@30.0.0-alpha.7) - jest-util: 30.0.0-alpha.7 - jest-validate: 30.0.0-alpha.7 - resolve: 1.22.10 - resolve.exports: 2.0.3 - slash: 3.0.0 - dev: true - /jest-runner@29.7.0: resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10544,35 +9950,6 @@ packages: transitivePeerDependencies: - supports-color - /jest-runner@30.0.0-alpha.7: - resolution: {integrity: sha512-UiXWHn55UfPrDH+F1XO027exFyYNkR7dNgmX9L4Lcmpb3oxDl83ITFdUZZFJwQtwVWNWPziKsCQD9aUPJnlx7Q==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - '@jest/console': 30.0.0-alpha.7 - '@jest/environment': 30.0.0-alpha.7 - '@jest/test-result': 30.0.0-alpha.7 - '@jest/transform': 30.0.0-alpha.7 - '@jest/types': 30.0.0-alpha.7 - '@types/node': 22.13.4 - chalk: 4.1.2 - emittery: 0.13.1 - graceful-fs: 4.2.11 - jest-docblock: 30.0.0-alpha.7 - jest-environment-node: 30.0.0-alpha.7 - jest-haste-map: 30.0.0-alpha.7 - jest-leak-detector: 30.0.0-alpha.7 - jest-message-util: 30.0.0-alpha.7 - jest-resolve: 30.0.0-alpha.7 - jest-runtime: 30.0.0-alpha.7 - jest-util: 30.0.0-alpha.7 - jest-watcher: 30.0.0-alpha.7 - jest-worker: 30.0.0-alpha.7 - p-limit: 3.1.0 - source-map-support: 0.5.13 - transitivePeerDependencies: - - supports-color - dev: true - /jest-runtime@29.7.0: resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10602,36 +9979,6 @@ packages: transitivePeerDependencies: - supports-color - /jest-runtime@30.0.0-alpha.7: - resolution: {integrity: sha512-BRgyqgFRwo+faZDh8LAQ1se+Qu3j9aNtPPm+31Wh+Nrg5On4uEJ3jwqdV5WlRR3A+nGflks3QmRBI/0zeT/3oA==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - '@jest/environment': 30.0.0-alpha.7 - '@jest/fake-timers': 30.0.0-alpha.7 - '@jest/globals': 30.0.0-alpha.7 - '@jest/source-map': 30.0.0-alpha.7 - '@jest/test-result': 30.0.0-alpha.7 - '@jest/transform': 30.0.0-alpha.7 - '@jest/types': 30.0.0-alpha.7 - '@types/node': 22.13.4 - chalk: 4.1.2 - cjs-module-lexer: 1.4.3 - collect-v8-coverage: 1.0.2 - glob: 10.4.5 - graceful-fs: 4.2.11 - jest-haste-map: 30.0.0-alpha.7 - jest-message-util: 30.0.0-alpha.7 - jest-mock: 30.0.0-alpha.7 - jest-regex-util: 30.0.0-alpha.7 - jest-resolve: 30.0.0-alpha.7 - jest-snapshot: 30.0.0-alpha.7 - jest-util: 30.0.0-alpha.7 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - /jest-snapshot@29.7.0: resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10659,35 +10006,6 @@ packages: transitivePeerDependencies: - supports-color - /jest-snapshot@30.0.0-alpha.7: - resolution: {integrity: sha512-c9T892KMUTJJp0FtiR/ynFcIWeS5y7bH/DItXUws1aBO4BA6BxU/qG/1CBHCqmuSFPLmYaKy0wGPEdbXmXchEQ==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - '@babel/core': 7.26.9 - '@babel/generator': 7.26.8 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.9) - '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.9) - '@babel/types': 7.26.8 - '@jest/expect-utils': 30.0.0-alpha.7 - '@jest/snapshot-utils': 30.0.0-alpha.7 - '@jest/transform': 30.0.0-alpha.7 - '@jest/types': 30.0.0-alpha.7 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.9) - chalk: 4.1.2 - expect: 30.0.0-alpha.7 - graceful-fs: 4.2.11 - jest-diff: 30.0.0-alpha.7 - jest-get-type: 30.0.0-alpha.7 - jest-matcher-utils: 30.0.0-alpha.7 - jest-message-util: 30.0.0-alpha.7 - jest-util: 30.0.0-alpha.7 - pretty-format: 30.0.0-alpha.7 - semver: 7.7.1 - synckit: 0.9.2 - transitivePeerDependencies: - - supports-color - dev: true - /jest-util@29.7.0: resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10699,18 +10017,6 @@ packages: graceful-fs: 4.2.11 picomatch: 2.3.1 - /jest-util@30.0.0-alpha.7: - resolution: {integrity: sha512-8slx+UQVqYE7WgkOyAab//u0YlTKXFIv31+nsHNFpT0boE5E/w4uJ/HSer0SWpUOotcrGLveeWYi2Pyy8gxVfg==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - '@jest/types': 30.0.0-alpha.7 - '@types/node': 22.13.4 - chalk: 4.1.2 - ci-info: 4.1.0 - graceful-fs: 4.2.11 - picomatch: 4.0.2 - dev: true - /jest-validate@29.7.0: resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10722,18 +10028,6 @@ packages: leven: 3.1.0 pretty-format: 29.7.0 - /jest-validate@30.0.0-alpha.7: - resolution: {integrity: sha512-PR7tDiTYSoXQPXatW3L39KyeZaF7/HZ4j41Nq2BhtgO/DCqPvySgCa6Cz++ykZcZ4NMnS+og7TBfri9a7dFmmg==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - '@jest/types': 30.0.0-alpha.7 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 30.0.0-alpha.7 - leven: 3.1.0 - pretty-format: 30.0.0-alpha.7 - dev: true - /jest-watch-typeahead@2.2.2(jest@29.7.0): resolution: {integrity: sha512-+QgOFW4o5Xlgd6jGS5X37i08tuuXNW8X0CV9WNFi+3n8ExCIP+E1melYhvYLjv5fE6D0yyzk74vsSO8I6GqtvQ==} engines: {node: ^14.17.0 || ^16.10.0 || >=18.0.0} @@ -10763,20 +10057,6 @@ packages: jest-util: 29.7.0 string-length: 4.0.2 - /jest-watcher@30.0.0-alpha.7: - resolution: {integrity: sha512-lR8YUEcSJ4x1b8Tr6WpQjkCpwwvtU/YlFaBbg0zZ8gePLAeDWs8WFcn1dYOOOe396mCs0YCqBZtBdBCz945kyA==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - '@jest/test-result': 30.0.0-alpha.7 - '@jest/types': 30.0.0-alpha.7 - '@types/node': 22.13.4 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.13.1 - jest-util: 30.0.0-alpha.7 - string-length: 4.0.2 - dev: true - /jest-worker@29.7.0: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10786,17 +10066,6 @@ packages: merge-stream: 2.0.0 supports-color: 8.1.1 - /jest-worker@30.0.0-alpha.7: - resolution: {integrity: sha512-kL3vimPjBpN1PKymyD1JYJM5SDTzqtkIs4TcaI4nUIktJEVulnZf0j4YjaAtnYflFohJfgmcPKP6IHqPHcn6dw==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - '@types/node': 22.13.4 - '@ungap/structured-clone': 1.3.0 - jest-util: 30.0.0-alpha.7 - merge-stream: 2.0.0 - supports-color: 8.1.1 - dev: true - /jest@29.7.0(@types/node@22.13.4)(ts-node@10.9.2): resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10817,28 +10086,6 @@ packages: - supports-color - ts-node - /jest@30.0.0-alpha.7(@types/node@22.13.4)(ts-node@10.9.2): - resolution: {integrity: sha512-wgecbBctx5wBsRO5WePp5v47H9PX9QGzums9iirHm6qYfvaZ3vk7gYGKP1KiDxm5SjmQ1Ae0eG1kcyW8MrRYgA==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 30.0.0-alpha.7(ts-node@10.9.2) - '@jest/types': 30.0.0-alpha.7 - import-local: 3.2.0 - jest-cli: 30.0.0-alpha.7(@types/node@22.13.4)(ts-node@10.9.2) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - esbuild-register - - supports-color - - ts-node - dev: true - /jiti@2.4.2: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} hasBin: true @@ -11010,10 +10257,6 @@ packages: resolution: {integrity: sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==} dev: false - /just-has@2.3.0: - resolution: {integrity: sha512-JzxCot/ETqLDullSSC5OtT/PLWiqgRNO5z33gVit6BoCXe/6BHut33o9ZunG5jQSqeY4EyzFnl8Wqc7S8Ci/wQ==} - dev: false - /just-memoize@2.2.0: resolution: {integrity: sha512-zriv+MY+61RXT0QsrO1ZJtL5umouqqSWmCGBkp2wJm35kniunBAA4qhUKx8Lvg/QcwrF9xuw9E6PkevKFf4boQ==} dev: false @@ -11026,6 +10269,10 @@ packages: resolution: {integrity: sha512-La5CP41Ycv52+E4g7w1sRV8XXk7Sp8a/TwWQAYQKn6RsQz1FD4Z/rDRRmqV3wJznS1MDF3YxK7BCudX1J8FxLg==} dev: false + /just-throttle@4.2.0: + resolution: {integrity: sha512-/iAZv1953JcExpvsywaPKjSzfTiCLqeguUTE6+VmK15mOcwxBx7/FHrVvS4WEErMR03TRazH8kcBSHqMagYIYg==} + dev: false + /jwt-decode@4.0.0: resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} engines: {node: '>=18'} @@ -11202,6 +10449,7 @@ packages: /lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + dev: true /lodash.castarray@4.4.0: resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} @@ -11883,6 +11131,7 @@ packages: /picomatch@4.0.2: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} + dev: false /pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} @@ -11989,15 +11238,6 @@ packages: ansi-styles: 5.2.0 react-is: 18.3.1 - /pretty-format@30.0.0-alpha.7: - resolution: {integrity: sha512-2gg8UNJxO+v6IiWydXPTM2LvCuIBxT2RC53Ind6IW0Cu9zvxoCMKeAAVV9nfukZyK01GFdYXhoH2zW18PsA6MQ==} - engines: {node: ^16.10.0 || ^18.12.0 || >=20.0.0} - dependencies: - '@jest/schemas': 30.0.0-alpha.7 - ansi-styles: 5.2.0 - react-is: 18.3.1 - dev: true - /process-warning@4.0.1: resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} dev: false @@ -13058,14 +12298,6 @@ packages: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: true - /synckit@0.9.2: - resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} - engines: {node: ^14.18.0 || >=16.0.0} - dependencies: - '@pkgr/core': 0.1.1 - tslib: 2.8.1 - dev: true - /tailwindcss@4.0.7: resolution: {integrity: sha512-yH5bPPyapavo7L+547h3c4jcBXcrKwybQRjwdEIVAd9iXRvy/3T1CC6XSQEgZtRySjKfqvo3Cc0ZF1DTheuIdA==} dev: true @@ -14132,14 +13364,6 @@ packages: imurmurhash: 0.1.4 signal-exit: 3.0.7 - /write-file-atomic@5.0.1: - resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dependencies: - imurmurhash: 0.1.4 - signal-exit: 4.1.0 - dev: true - /ws@7.5.10(bufferutil@4.0.9): resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} engines: {node: '>=8.3.0'}