From 616dee9a42ac4730e3f9f59ad9612bc223770819 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Thu, 12 Mar 2026 05:20:40 +0000 Subject: [PATCH 01/19] feat: add v5-native graphile-connection-filter plugin Implements a from-scratch PostGraphile v5 native connection filter plugin, replacing the upstream postgraphile-plugin-connection-filter dependency. New package: graphile/graphile-connection-filter/ Plugin architecture (7 plugins): - ConnectionFilterInflectionPlugin: filter type naming conventions - ConnectionFilterTypesPlugin: registers per-table and per-scalar filter types - ConnectionFilterArgPlugin: injects filter arg on connections via applyPlan - ConnectionFilterAttributesPlugin: adds per-column filter fields - ConnectionFilterOperatorsPlugin: standard/sort/pattern/jsonb/inet/array/range operators - ConnectionFilterCustomOperatorsPlugin: addConnectionFilterOperator API for satellite plugins - ConnectionFilterLogicalOperatorsPlugin: and/or/not logical composition Key features: - Full v5 native: uses Grafast planning, PgCondition, codec system, behavior registry - EXPORTABLE pattern for schema caching - Preserves addConnectionFilterOperator API for PostGIS, search, pgvector, textsearch plugins - No relation filter plugins (simplifies configuration vs upstream) - Preset factory: ConnectionFilterPreset(options) Also updates graphile-settings to use the new workspace package. --- graphile/graphile-connection-filter/README.md | 40 + .../graphile-connection-filter/package.json | 55 + .../src/augmentations.ts | 88 ++ .../graphile-connection-filter/src/index.ts | 60 + .../src/plugins/ConnectionFilterArgPlugin.ts | 150 +++ .../ConnectionFilterAttributesPlugin.ts | 143 +++ .../ConnectionFilterCustomOperatorsPlugin.ts | 156 +++ .../ConnectionFilterInflectionPlugin.ts | 30 + .../ConnectionFilterLogicalOperatorsPlugin.ts | 116 ++ .../ConnectionFilterOperatorsPlugin.ts | 1022 +++++++++++++++++ .../plugins/ConnectionFilterTypesPlugin.ts | 338 ++++++ .../src/plugins/index.ts | 8 + .../src/plugins/operatorApply.ts | 124 ++ .../graphile-connection-filter/src/preset.ts | 83 ++ .../graphile-connection-filter/src/types.ts | 108 ++ .../graphile-connection-filter/src/utils.ts | 113 ++ .../tsconfig.esm.json | 7 + .../graphile-connection-filter/tsconfig.json | 8 + graphile/graphile-settings/package.json | 2 +- .../src/presets/constructive-preset.ts | 45 +- pnpm-lock.yaml | 38 +- 21 files changed, 2690 insertions(+), 44 deletions(-) create mode 100644 graphile/graphile-connection-filter/README.md create mode 100644 graphile/graphile-connection-filter/package.json create mode 100644 graphile/graphile-connection-filter/src/augmentations.ts create mode 100644 graphile/graphile-connection-filter/src/index.ts create mode 100644 graphile/graphile-connection-filter/src/plugins/ConnectionFilterArgPlugin.ts create mode 100644 graphile/graphile-connection-filter/src/plugins/ConnectionFilterAttributesPlugin.ts create mode 100644 graphile/graphile-connection-filter/src/plugins/ConnectionFilterCustomOperatorsPlugin.ts create mode 100644 graphile/graphile-connection-filter/src/plugins/ConnectionFilterInflectionPlugin.ts create mode 100644 graphile/graphile-connection-filter/src/plugins/ConnectionFilterLogicalOperatorsPlugin.ts create mode 100644 graphile/graphile-connection-filter/src/plugins/ConnectionFilterOperatorsPlugin.ts create mode 100644 graphile/graphile-connection-filter/src/plugins/ConnectionFilterTypesPlugin.ts create mode 100644 graphile/graphile-connection-filter/src/plugins/index.ts create mode 100644 graphile/graphile-connection-filter/src/plugins/operatorApply.ts create mode 100644 graphile/graphile-connection-filter/src/preset.ts create mode 100644 graphile/graphile-connection-filter/src/types.ts create mode 100644 graphile/graphile-connection-filter/src/utils.ts create mode 100644 graphile/graphile-connection-filter/tsconfig.esm.json create mode 100644 graphile/graphile-connection-filter/tsconfig.json diff --git a/graphile/graphile-connection-filter/README.md b/graphile/graphile-connection-filter/README.md new file mode 100644 index 000000000..c980827ff --- /dev/null +++ b/graphile/graphile-connection-filter/README.md @@ -0,0 +1,40 @@ +# graphile-connection-filter + +A PostGraphile v5 native connection filter plugin for the Constructive monorepo. + +Adds advanced filtering capabilities to connection and list fields, including: + +- Per-table filter types (e.g. `UserFilter`) +- Per-scalar operator types (e.g. `StringFilter`, `IntFilter`) +- Standard operators: `equalTo`, `notEqualTo`, `isNull`, `in`, `notIn`, etc. +- Sort operators: `lessThan`, `greaterThan`, etc. +- Pattern matching: `includes`, `startsWith`, `endsWith`, `like` + case-insensitive variants +- Type-specific operators: JSONB, hstore, inet, array, range +- Logical operators: `and`, `or`, `not` +- Custom operator API: `addConnectionFilterOperator` for satellite plugins + +## Usage + +```typescript +import { ConnectionFilterPreset } from 'graphile-connection-filter'; + +const preset: GraphileConfig.Preset = { + extends: [ + ConnectionFilterPreset(), + ], +}; +``` + +## Custom Operators + +Satellite plugins can register custom operators during the `init` hook: + +```typescript +const addConnectionFilterOperator = (build as any).addConnectionFilterOperator; +if (typeof addConnectionFilterOperator === 'function') { + addConnectionFilterOperator('MyType', 'myOperator', { + description: 'My custom operator', + resolve: (sqlIdentifier, sqlValue) => sql`${sqlIdentifier} OP ${sqlValue}`, + }); +} +``` diff --git a/graphile/graphile-connection-filter/package.json b/graphile/graphile-connection-filter/package.json new file mode 100644 index 000000000..3a1a86885 --- /dev/null +++ b/graphile/graphile-connection-filter/package.json @@ -0,0 +1,55 @@ +{ + "name": "graphile-connection-filter", + "version": "1.0.0", + "description": "PostGraphile v5 native connection filter plugin - adds advanced filtering to connections", + "author": "Constructive ", + "homepage": "https://github.com/constructive-io/constructive", + "license": "MIT", + "main": "index.js", + "module": "esm/index.js", + "types": "index.d.ts", + "scripts": { + "clean": "makage clean", + "prepack": "npm run build", + "build": "makage build", + "build:dev": "makage build --dev", + "lint": "eslint . --fix", + "test": "jest", + "test:watch": "jest --watch" + }, + "publishConfig": { + "access": "public", + "directory": "dist" + }, + "repository": { + "type": "git", + "url": "https://github.com/constructive-io/constructive" + }, + "keywords": [ + "postgraphile", + "graphile", + "constructive", + "plugin", + "postgres", + "graphql", + "filter", + "connection-filter", + "v5" + ], + "bugs": { + "url": "https://github.com/constructive-io/constructive/issues" + }, + "devDependencies": { + "@types/node": "^22.19.11", + "makage": "^0.1.10" + }, + "peerDependencies": { + "@dataplan/pg": "1.0.0-rc.5", + "graphile-build": "5.0.0-rc.4", + "graphile-build-pg": "5.0.0-rc.5", + "graphile-config": "1.0.0-rc.5", + "graphql": "^16.9.0", + "pg-sql2": "5.0.0-rc.4", + "postgraphile": "5.0.0-rc.7" + } +} diff --git a/graphile/graphile-connection-filter/src/augmentations.ts b/graphile/graphile-connection-filter/src/augmentations.ts new file mode 100644 index 000000000..2071d506b --- /dev/null +++ b/graphile/graphile-connection-filter/src/augmentations.ts @@ -0,0 +1,88 @@ +/** + * TypeScript namespace augmentations for graphile-connection-filter. + * + * These extend the Graphile type system so that our custom inflection methods, + * build properties, scope properties, schema options, and behaviors are + * recognized by the TypeScript compiler. + */ + +import 'graphile-build'; +import 'graphile-build-pg'; +import type { ConnectionFilterOperatorSpec, ConnectionFilterOperatorsDigest, PgConnectionFilterOperatorsScope } from './types'; + +declare global { + namespace GraphileBuild { + interface Inflection { + /** Filter type name for a table, e.g. "UserFilter" */ + filterType(this: Inflection, typeName: string): string; + /** Filter field type name for a scalar, e.g. "StringFilter" */ + filterFieldType(this: Inflection, typeName: string): string; + /** Filter field list type name for an array scalar, e.g. "StringListFilter" */ + filterFieldListType(this: Inflection, typeName: string): string; + } + + interface Build { + /** Returns the operator digest for a given codec, or null if not filterable */ + connectionFilterOperatorsDigest(codec: any): ConnectionFilterOperatorsDigest | null; + /** Escapes LIKE wildcard characters (% and _) */ + escapeLikeWildcards(input: unknown): string; + /** Registers a custom filter operator (used by satellite plugins) */ + addConnectionFilterOperator( + typeNameOrNames: string | string[], + filterName: string, + spec: ConnectionFilterOperatorSpec + ): void; + /** Internal filter operator registry keyed by filter type name */ + [key: symbol]: any; + } + + interface ScopeInputObject { + /** True if this is a table-level connection filter type (e.g. UserFilter) */ + isPgConnectionFilter?: boolean; + /** Operator type scope data (present on scalar filter types like StringFilter) */ + pgConnectionFilterOperators?: PgConnectionFilterOperatorsScope; + } + + interface ScopeInputObjectFieldsField { + /** True if this field is an attribute-based filter field */ + isPgConnectionFilterField?: boolean; + /** True if this field is a filter operator (e.g. equalTo, lessThan) */ + isPgConnectionFilterOperator?: boolean; + /** True if this field is a logical operator (and/or/not) */ + isPgConnectionFilterOperatorLogical?: boolean; + /** True if this is a many-relation filter field */ + isPgConnectionFilterManyField?: boolean; + } + + interface BehaviorStrings { + filter: true; + filterProc: true; + 'attribute:filterBy': true; + } + + interface SchemaOptions { + connectionFilterArrays?: boolean; + connectionFilterLogicalOperators?: boolean; + connectionFilterAllowNullInput?: boolean; + connectionFilterAllowEmptyObjectInput?: boolean; + connectionFilterAllowedFieldTypes?: string[]; + connectionFilterAllowedOperators?: string[]; + connectionFilterOperatorNames?: Record; + connectionFilterSetofFunctions?: boolean; + connectionFilterComputedColumns?: boolean; + connectionFilterRelations?: boolean; + } + } + + namespace GraphileConfig { + interface Plugins { + ConnectionFilterInflectionPlugin: true; + ConnectionFilterTypesPlugin: true; + ConnectionFilterArgPlugin: true; + ConnectionFilterAttributesPlugin: true; + ConnectionFilterOperatorsPlugin: true; + ConnectionFilterCustomOperatorsPlugin: true; + ConnectionFilterLogicalOperatorsPlugin: true; + } + } +} diff --git a/graphile/graphile-connection-filter/src/index.ts b/graphile/graphile-connection-filter/src/index.ts new file mode 100644 index 000000000..27b52091d --- /dev/null +++ b/graphile/graphile-connection-filter/src/index.ts @@ -0,0 +1,60 @@ +/** + * graphile-connection-filter + * + * A PostGraphile v5 native connection filter plugin. + * Adds advanced filtering capabilities to connection and list fields. + * + * @example + * ```typescript + * import { ConnectionFilterPreset } from 'graphile-connection-filter'; + * + * const preset = { + * extends: [ + * ConnectionFilterPreset(), + * ], + * }; + * ``` + * + * For satellite plugins that need to register custom operators: + * ```typescript + * // In your plugin's init hook: + * const addConnectionFilterOperator = (build as any).addConnectionFilterOperator; + * if (typeof addConnectionFilterOperator === 'function') { + * addConnectionFilterOperator('MyType', 'myOperator', { + * description: 'My custom operator', + * resolve: (sqlIdentifier, sqlValue) => sql`${sqlIdentifier} OP ${sqlValue}`, + * }); + * } + * ``` + */ + +export { ConnectionFilterPreset } from './preset'; + +// Re-export all plugins for granular use +export { + ConnectionFilterInflectionPlugin, + ConnectionFilterTypesPlugin, + ConnectionFilterArgPlugin, + ConnectionFilterAttributesPlugin, + ConnectionFilterOperatorsPlugin, + ConnectionFilterCustomOperatorsPlugin, + ConnectionFilterLogicalOperatorsPlugin, + makeApplyFromOperatorSpec, +} from './plugins'; + +// Re-export types +export type { + ConnectionFilterOperatorSpec, + ConnectionFilterOptions, + ConnectionFilterOperatorsDigest, + PgConnectionFilterOperatorsScope, +} from './types'; +export { $$filters } from './types'; + +// Re-export utilities +export { + isEmpty, + makeAssertAllowed, + isComputedScalarAttributeResource, + getComputedAttributeResources, +} from './utils'; diff --git a/graphile/graphile-connection-filter/src/plugins/ConnectionFilterArgPlugin.ts b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterArgPlugin.ts new file mode 100644 index 000000000..c3651bed7 --- /dev/null +++ b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterArgPlugin.ts @@ -0,0 +1,150 @@ +import '../augmentations'; +import type { GraphileConfig } from 'graphile-config'; +import { makeAssertAllowed } from '../utils'; + +const version = '1.0.0'; + +/** + * ConnectionFilterArgPlugin + * + * Adds the `filter` argument to connection and simple collection fields. + * Uses `applyPlan` to create a PgCondition that child filter fields can + * add WHERE clauses to. + * + * This runs before PgConnectionArgOrderByPlugin so that filters are applied + * before ordering (important for e.g. full-text search rank ordering). + */ +export const ConnectionFilterArgPlugin: GraphileConfig.Plugin = { + name: 'ConnectionFilterArgPlugin', + version, + description: 'Adds the filter argument to connection and list fields', + before: ['PgConnectionArgOrderByPlugin'], + + schema: { + hooks: { + GraphQLObjectType_fields_field_args(args, build, context) { + const { + extend, + inflection, + EXPORTABLE, + dataplanPg: { PgCondition }, + } = build; + const { + scope: { + isPgFieldConnection, + isPgFieldSimpleCollection, + pgFieldResource: resource, + pgFieldCodec, + fieldName, + }, + Self, + } = context; + + const shouldAddFilter = + isPgFieldConnection || isPgFieldSimpleCollection; + if (!shouldAddFilter) return args; + + const codec = pgFieldCodec ?? resource?.codec; + if (!codec) return args; + + // Check behavior: procedures use "filterProc", tables use "filter" + const desiredBehavior = resource?.parameters + ? 'filterProc' + : 'filter'; + if ( + resource + ? !build.behavior.pgResourceMatches(resource, desiredBehavior) + : !build.behavior.pgCodecMatches(codec, desiredBehavior) + ) { + return args; + } + + const returnCodec = codec; + const nodeType = build.getGraphQLTypeByPgCodec( + returnCodec, + 'output' + ); + if (!nodeType) return args; + + const nodeTypeName = nodeType.name; + const filterTypeName = inflection.filterType(nodeTypeName); + const FilterType = build.getTypeByName(filterTypeName); + if (!FilterType) return args; + + const assertAllowed = makeAssertAllowed(build); + + // For setof functions returning scalars, track the codec + const attributeCodec = + resource?.parameters && !resource?.codec.attributes + ? resource.codec + : null; + + return extend( + args, + { + filter: { + description: + 'A filter to be used in determining which values should be returned by the collection.', + type: FilterType, + ...(isPgFieldConnection + ? { + applyPlan: EXPORTABLE( + ( + PgCondition: any, + assertAllowed: any, + attributeCodec: any + ) => + function (_: any, $connection: any, fieldArg: any) { + const $pgSelect = $connection.getSubplan(); + fieldArg.apply( + $pgSelect, + (queryBuilder: any, value: any) => { + assertAllowed(value, 'object'); + if (value == null) return; + const condition = new PgCondition(queryBuilder); + if (attributeCodec) { + condition.extensions.pgFilterAttribute = { + codec: attributeCodec, + }; + } + return condition; + } + ); + }, + [PgCondition, assertAllowed, attributeCodec] + ), + } + : { + applyPlan: EXPORTABLE( + ( + PgCondition: any, + assertAllowed: any, + attributeCodec: any + ) => + function (_: any, $pgSelect: any, fieldArg: any) { + fieldArg.apply( + $pgSelect, + (queryBuilder: any, value: any) => { + assertAllowed(value, 'object'); + if (value == null) return; + const condition = new PgCondition(queryBuilder); + if (attributeCodec) { + condition.extensions.pgFilterAttribute = { + codec: attributeCodec, + }; + } + return condition; + } + ); + }, + [PgCondition, assertAllowed, attributeCodec] + ), + }), + }, + }, + `Adding connection filter arg to field '${fieldName}' of '${Self.name}'` + ); + }, + }, + }, +}; diff --git a/graphile/graphile-connection-filter/src/plugins/ConnectionFilterAttributesPlugin.ts b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterAttributesPlugin.ts new file mode 100644 index 000000000..cedcbdf7f --- /dev/null +++ b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterAttributesPlugin.ts @@ -0,0 +1,143 @@ +import '../augmentations'; +import type { GraphileConfig } from 'graphile-config'; +import { isEmpty } from '../utils'; + +const version = '1.0.0'; + +/** + * ConnectionFilterAttributesPlugin + * + * Adds per-column filter fields to the table filter types. + * For example, on `UserFilter`, adds fields like `name` (type: StringFilter), + * `age` (type: IntFilter), etc. + * + * Each field's `apply` function creates a new PgCondition with the + * `pgFilterAttribute` extension set, so downstream operator fields know + * which column they are operating on. + */ +export const ConnectionFilterAttributesPlugin: GraphileConfig.Plugin = { + name: 'ConnectionFilterAttributesPlugin', + version, + description: 'Adds column-based filter fields to connection filter types', + + schema: { + entityBehavior: { + pgCodecAttribute: 'attribute:filterBy', + }, + + hooks: { + GraphQLInputObjectType_fields(inFields, build, context) { + let fields = inFields; + + const { + inflection, + connectionFilterOperatorsDigest, + dataplanPg: { PgCondition }, + EXPORTABLE, + } = build; + const { + fieldWithHooks, + scope: { pgCodec: rawCodec, isPgConnectionFilter }, + } = context; + + if (!isPgConnectionFilter || !rawCodec || !rawCodec.attributes) { + return fields; + } + + const codec = rawCodec as any; + + for (const [attributeName, attribute] of Object.entries( + codec.attributes as Record + )) { + if ( + !build.behavior.pgCodecAttributeMatches( + [codec, attributeName], + 'attribute:filterBy' + ) + ) { + continue; + } + + const fieldName = inflection.attribute({ codec: codec as any, attributeName }); + const colSpec = { fieldName, attributeName, attribute }; + + const digest = connectionFilterOperatorsDigest(attribute.codec); + if (!digest) continue; + + const OperatorsType = build.getTypeByName(digest.operatorsTypeName); + if (!OperatorsType) continue; + + const { + connectionFilterAllowEmptyObjectInput, + connectionFilterAllowNullInput, + } = build.options; + + fields = build.extend( + fields, + { + [fieldName]: fieldWithHooks( + { + fieldName, + isPgConnectionFilterField: true, + }, + () => ({ + description: `Filter by the object's \`${fieldName}\` field.`, + type: OperatorsType, + apply: EXPORTABLE( + ( + PgCondition: any, + colSpec: any, + connectionFilterAllowEmptyObjectInput: boolean, + connectionFilterAllowNullInput: boolean, + isEmpty: (o: unknown) => boolean + ) => + function (queryBuilder: any, value: any) { + if (value === undefined) { + return; + } + if ( + !connectionFilterAllowEmptyObjectInput && + isEmpty(value) + ) { + throw Object.assign( + new Error( + 'Empty objects are forbidden in filter argument input.' + ), + {} + ); + } + if ( + !connectionFilterAllowNullInput && + value === null + ) { + throw Object.assign( + new Error( + 'Null literals are forbidden in filter argument input.' + ), + {} + ); + } + const condition = new PgCondition(queryBuilder); + condition.extensions.pgFilterAttribute = colSpec; + return condition; + }, + [ + PgCondition, + colSpec, + connectionFilterAllowEmptyObjectInput, + connectionFilterAllowNullInput, + isEmpty, + ] + ), + }) + ), + }, + 'Adding attribute-based filtering' + ); + } + + return fields; + }, + }, + }, +}; diff --git a/graphile/graphile-connection-filter/src/plugins/ConnectionFilterCustomOperatorsPlugin.ts b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterCustomOperatorsPlugin.ts new file mode 100644 index 000000000..15176604b --- /dev/null +++ b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterCustomOperatorsPlugin.ts @@ -0,0 +1,156 @@ +import '../augmentations'; +import type { GraphileConfig } from 'graphile-config'; +import type { ConnectionFilterOperatorSpec } from '../types'; +import { $$filters } from '../types'; +import { makeApplyFromOperatorSpec } from './operatorApply'; + +const version = '1.0.0'; + +/** + * ConnectionFilterCustomOperatorsPlugin + * + * Provides the `addConnectionFilterOperator` API on the build object. + * Satellite plugins (PostGIS filter, search, pgvector, textsearch) call this + * during the `init` hook to register custom filter operators. + * + * API contract (must be preserved for compatibility): + * build.addConnectionFilterOperator( + * typeNameOrNames: string | string[], + * filterName: string, + * spec: ConnectionFilterOperatorSpec + * ) + */ +export const ConnectionFilterCustomOperatorsPlugin: GraphileConfig.Plugin = { + name: 'ConnectionFilterCustomOperatorsPlugin', + version, + description: + 'Provides the addConnectionFilterOperator API for custom operator registration', + + schema: { + hooks: { + build(build) { + const { inflection } = build; + + // Initialize the filter registry + build[$$filters] = new Map< + string, + Map + >(); + + // The public API that satellite plugins call + build.addConnectionFilterOperator = ( + typeNameOrNames: string | string[], + filterName: string, + spec: ConnectionFilterOperatorSpec + ) => { + if ( + !build.status.isBuildPhaseComplete || + build.status.isInitPhaseComplete + ) { + throw new Error( + "addConnectionFilterOperator may only be called during the 'init' phase" + ); + } + + const typeNames = Array.isArray(typeNameOrNames) + ? typeNameOrNames + : [typeNameOrNames]; + + for (const typeName of typeNames) { + const filterTypeName = inflection.filterType(typeName); + let operatorSpecByFilterName = build[$$filters].get(filterTypeName); + if (!operatorSpecByFilterName) { + operatorSpecByFilterName = new Map(); + build[$$filters].set(filterTypeName, operatorSpecByFilterName); + } + if (operatorSpecByFilterName.has(filterName)) { + throw new Error( + `Filter '${filterName}' already registered on '${filterTypeName}'` + ); + } + operatorSpecByFilterName.set(filterName, spec); + } + }; + + return build; + }, + + /** + * Applies custom operators to their respective filter types. + * When a type like "StringFilter" has custom operators registered, + * they are added as fields with apply functions. + */ + GraphQLInputObjectType_fields(inFields, build, context) { + let fields = inFields; + + const { + scope: { pgConnectionFilterOperators }, + Self, + fieldWithHooks, + } = context; + + if (!pgConnectionFilterOperators) { + return fields; + } + + const operatorSpecByFilterName = build[$$filters].get(Self.name); + if (!operatorSpecByFilterName) { + return fields; + } + + const { inputTypeName } = pgConnectionFilterOperators; + const fieldInputType = build.getTypeByName(inputTypeName); + if (!fieldInputType) { + return fields; + } + + for (const [filterName, spec] of operatorSpecByFilterName.entries()) { + const { description, resolveInputCodec, resolveType } = spec; + + const firstCodec = pgConnectionFilterOperators.pgCodecs[0]; + const inputCodec = resolveInputCodec + ? resolveInputCodec(firstCodec) + : firstCodec; + + const codecGraphQLType = build.getGraphQLTypeByPgCodec( + inputCodec, + 'input' + ); + if (!codecGraphQLType) { + continue; + } + + const type = resolveType + ? resolveType(codecGraphQLType) + : codecGraphQLType; + + fields = build.extend( + fields, + { + [filterName]: fieldWithHooks( + { + fieldName: filterName, + isPgConnectionFilterOperator: true, + }, + { + description, + type, + apply: makeApplyFromOperatorSpec( + build, + Self.name, + filterName, + spec, + type + ), + } + ), + }, + '' + ); + } + + return fields; + }, + }, + }, +}; diff --git a/graphile/graphile-connection-filter/src/plugins/ConnectionFilterInflectionPlugin.ts b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterInflectionPlugin.ts new file mode 100644 index 000000000..2b7a016de --- /dev/null +++ b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterInflectionPlugin.ts @@ -0,0 +1,30 @@ +import '../augmentations'; +import type { GraphileConfig } from 'graphile-config'; + +/** + * ConnectionFilterInflectionPlugin + * + * Adds inflection methods for naming filter types: + * - filterType(typeName) -> e.g. "UserFilter" + * - filterFieldType(typeName) -> e.g. "StringFilter" + * - filterFieldListType(typeName) -> e.g. "StringListFilter" + */ +export const ConnectionFilterInflectionPlugin: GraphileConfig.Plugin = { + name: 'ConnectionFilterInflectionPlugin', + version: '1.0.0', + description: 'Adds inflection methods for connection filter type naming', + + inflection: { + add: { + filterType(_preset, typeName: string): string { + return `${typeName}Filter`; + }, + filterFieldType(_preset, typeName: string): string { + return `${typeName}Filter`; + }, + filterFieldListType(_preset, typeName: string): string { + return `${typeName}ListFilter`; + }, + }, + }, +}; diff --git a/graphile/graphile-connection-filter/src/plugins/ConnectionFilterLogicalOperatorsPlugin.ts b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterLogicalOperatorsPlugin.ts new file mode 100644 index 000000000..6d7f29894 --- /dev/null +++ b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterLogicalOperatorsPlugin.ts @@ -0,0 +1,116 @@ +import '../augmentations'; +import type { GraphileConfig } from 'graphile-config'; +import { makeAssertAllowed } from '../utils'; + +const version = '1.0.0'; + +/** + * ConnectionFilterLogicalOperatorsPlugin + * + * Adds the `and`, `or`, and `not` logical operators to filter types. + * + * - `and`: [Filter!] - all conditions must match (uses $where.andPlan()) + * - `or`: [Filter!] - any condition must match (uses $where.orPlan()) + * - `not`: Filter - negates the condition (uses $where.notPlan()) + * + * These are only added if the filter type has at least one other field + * (to avoid creating useless logical-only filter types). + */ +export const ConnectionFilterLogicalOperatorsPlugin: GraphileConfig.Plugin = { + name: 'ConnectionFilterLogicalOperatorsPlugin', + version, + description: 'Adds and/or/not logical operators to connection filter types', + + schema: { + hooks: { + GraphQLInputObjectType_fields(fields, build, context) { + const { + extend, + graphql: { GraphQLList, GraphQLNonNull }, + EXPORTABLE, + } = build; + const { + fieldWithHooks, + scope: { isPgConnectionFilter }, + Self, + } = context; + + if (!isPgConnectionFilter) return fields; + + // Don't add logical operators if there are no other fields + if (Object.keys(fields).length === 0) { + return fields; + } + + const assertAllowed = makeAssertAllowed(build); + + const logicalOperatorFields = { + and: fieldWithHooks( + { + fieldName: 'and', + isPgConnectionFilterOperatorLogical: true, + }, + { + description: 'Checks for all expressions in this list.', + type: new GraphQLList(new GraphQLNonNull(Self)), + apply: EXPORTABLE( + (assertAllowed: any) => + function ($where: any, value: any) { + assertAllowed(value, 'list'); + if (value == null) return; + const $and = $where.andPlan(); + return $and; + }, + [assertAllowed] + ), + } + ), + or: fieldWithHooks( + { + fieldName: 'or', + isPgConnectionFilterOperatorLogical: true, + }, + { + description: 'Checks for any expressions in this list.', + type: new GraphQLList(new GraphQLNonNull(Self)), + apply: EXPORTABLE( + (assertAllowed: any) => + function ($where: any, value: any) { + assertAllowed(value, 'list'); + if (value == null) return; + const $or = $where.orPlan(); + // Each entry in the OR list should use AND internally + return () => $or.andPlan(); + }, + [assertAllowed] + ), + } + ), + not: fieldWithHooks( + { + fieldName: 'not', + isPgConnectionFilterOperatorLogical: true, + }, + { + description: 'Negates the expression.', + type: Self, + apply: EXPORTABLE( + (assertAllowed: any) => + function ($where: any, value: any) { + assertAllowed(value, 'object'); + if (value == null) return; + const $not = $where.notPlan(); + const $and = $not.andPlan(); + return $and; + }, + [assertAllowed] + ), + } + ), + }; + + return extend(fields, logicalOperatorFields, ''); + }, + }, + }, +}; diff --git a/graphile/graphile-connection-filter/src/plugins/ConnectionFilterOperatorsPlugin.ts b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterOperatorsPlugin.ts new file mode 100644 index 000000000..9bf62642b --- /dev/null +++ b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterOperatorsPlugin.ts @@ -0,0 +1,1022 @@ +import '../augmentations'; +import type { GraphileConfig } from 'graphile-config'; +import { makeApplyFromOperatorSpec } from './operatorApply'; + +const version = '1.0.0'; + +/** + * ConnectionFilterOperatorsPlugin + * + * Registers all built-in filter operators on the per-scalar operator types + * (e.g. StringFilter, IntFilter, DatetimeFilter, etc.). + * + * Operator categories: + * - Standard: isNull, equalTo, notEqualTo, distinctFrom, notDistinctFrom, in, notIn + * - Sort: lessThan, lessThanOrEqualTo, greaterThan, greaterThanOrEqualTo + * - Pattern matching (text-like): includes, startsWith, endsWith, like + insensitive variants + * - Hstore: contains, containsKey, containsAllKeys, containsAnyKeys, containedBy + * - JSONB: contains, containsKey, containsAllKeys, containsAnyKeys, containedBy + * - Inet: contains, containsOrEqualTo, containedBy, containedByOrEqualTo, containsOrContainedBy + * - Array: contains, containedBy, overlaps, anyEqualTo, anyNotEqualTo, any comparison operators + * - Range: contains, containsElement, containedBy, overlaps, strictlyLeftOf, strictlyRightOf, etc. + * - Enum: standard + sort operators + * - Case-insensitive variants of standard and sort operators + */ +export const ConnectionFilterOperatorsPlugin: GraphileConfig.Plugin = { + name: 'ConnectionFilterOperatorsPlugin', + version, + description: 'Registers built-in filter operators for all scalar types', + + schema: { + hooks: { + GraphQLInputObjectType_fields(fields, build, context) { + const { + extend, + graphql: { GraphQLNonNull, GraphQLList, isListType, isNonNullType }, + dataplanPg: { isEnumCodec, listOfCodec, TYPES, sqlValueWithCodec }, + sql, + escapeLikeWildcards, + options: { + connectionFilterAllowedOperators, + connectionFilterOperatorNames, + }, + EXPORTABLE, + } = build; + const { + scope: { pgConnectionFilterOperators }, + fieldWithHooks, + Self, + } = context; + + if (!pgConnectionFilterOperators) { + return fields; + } + + // --- Helper functions for type resolution --- + + /** Turn `[Foo]` into `[Foo!]` */ + const resolveTypeToListOfNonNullable = EXPORTABLE( + (GraphQLList: any, GraphQLNonNull: any, isListType: any, isNonNullType: any) => + function (type: any) { + if (isListType(type) && !isNonNullType(type.ofType)) { + return new GraphQLList(new GraphQLNonNull(type.ofType)); + } + return type; + }, + [GraphQLList, GraphQLNonNull, isListType, isNonNullType] + ); + + // Types that need casting to text for case-sensitive comparisons + const forceTextTypesSensitive = [TYPES.citext, TYPES.char, TYPES.bpchar]; + const forceTextTypesInsensitive = [TYPES.char, TYPES.bpchar]; + + const resolveDomains = EXPORTABLE( + () => + function (c: any): any { + let current = c; + while (current.domainOfCodec) { + current = current.domainOfCodec; + } + return current; + }, + [] + ); + + // --- Codec resolution helpers for sensitive/insensitive comparisons --- + + const resolveArrayInputCodecSensitive = EXPORTABLE( + (TYPES: any, forceTextTypesSensitive: any, listOfCodec: any, resolveDomains: any) => + function (c: any) { + if (forceTextTypesSensitive.includes(resolveDomains(c))) { + return listOfCodec(TYPES.text, { extensions: { listItemNonNull: true } }); + } + return listOfCodec(c, { extensions: { listItemNonNull: true } }); + }, + [TYPES, forceTextTypesSensitive, listOfCodec, resolveDomains] + ); + + const resolveArrayItemInputCodecSensitive = EXPORTABLE( + (TYPES: any, forceTextTypesSensitive: any, resolveDomains: any) => + function (c: any) { + if (c.arrayOfCodec) { + if (forceTextTypesSensitive.includes(resolveDomains(c.arrayOfCodec))) { + return TYPES.text; + } + return c.arrayOfCodec; + } + throw new Error('Expected array codec'); + }, + [TYPES, forceTextTypesSensitive, resolveDomains] + ); + + const resolveInputCodecSensitive = EXPORTABLE( + (TYPES: any, forceTextTypesSensitive: any, listOfCodec: any, resolveDomains: any) => + function (c: any) { + if (c.arrayOfCodec) { + if (forceTextTypesSensitive.includes(resolveDomains(c.arrayOfCodec))) { + return listOfCodec(TYPES.text, { + extensions: { listItemNonNull: c.extensions?.listItemNonNull }, + }); + } + return c; + } + if (forceTextTypesSensitive.includes(resolveDomains(c))) { + return TYPES.text; + } + return c; + }, + [TYPES, forceTextTypesSensitive, listOfCodec, resolveDomains] + ); + + const resolveSqlIdentifierSensitive = EXPORTABLE( + (TYPES: any, forceTextTypesSensitive: any, listOfCodec: any, resolveDomains: any, sql: any) => + function (identifier: any, c: any): [any, any] { + if ( + c.arrayOfCodec && + forceTextTypesSensitive.includes(resolveDomains(c.arrayOfCodec)) + ) { + return [ + sql`(${identifier})::text[]`, + listOfCodec(TYPES.text, { + extensions: { listItemNonNull: c.extensions?.listItemNonNull }, + }), + ]; + } else if (forceTextTypesSensitive.includes(resolveDomains(c))) { + return [sql`(${identifier})::text`, TYPES.text]; + } + return [identifier, c]; + }, + [TYPES, forceTextTypesSensitive, listOfCodec, resolveDomains, sql] + ); + + const resolveInputCodecInsensitive = EXPORTABLE( + (TYPES: any, forceTextTypesInsensitive: any, listOfCodec: any, resolveDomains: any) => + function (c: any) { + if (c.arrayOfCodec) { + if (forceTextTypesInsensitive.includes(resolveDomains(c.arrayOfCodec))) { + return listOfCodec(TYPES.text, { + extensions: { listItemNonNull: c.extensions?.listItemNonNull }, + }); + } + return c; + } + if (forceTextTypesInsensitive.includes(resolveDomains(c))) { + return TYPES.text; + } + return c; + }, + [TYPES, forceTextTypesInsensitive, listOfCodec, resolveDomains] + ); + + const resolveSqlIdentifierInsensitive = EXPORTABLE( + (TYPES: any, forceTextTypesInsensitive: any, listOfCodec: any, resolveDomains: any, sql: any) => + function (identifier: any, c: any): [any, any] { + if ( + c.arrayOfCodec && + forceTextTypesInsensitive.includes(resolveDomains(c.arrayOfCodec)) + ) { + return [ + sql`(${identifier})::text[]`, + listOfCodec(TYPES.text, { + extensions: { listItemNonNull: c.extensions?.listItemNonNull }, + }), + ]; + } else if (forceTextTypesInsensitive.includes(resolveDomains(c))) { + return [sql`(${identifier})::text`, TYPES.text]; + } + return [identifier, c]; + }, + [TYPES, forceTextTypesInsensitive, listOfCodec, resolveDomains, sql] + ); + + // --- Operator definitions --- + + const standardOperators: Record = { + isNull: { + description: + 'Is null (if `true` is specified) or is not null (if `false` is specified).', + resolveInputCodec: EXPORTABLE((TYPES: any) => () => TYPES.boolean, [TYPES]), + resolveSqlValue: EXPORTABLE((sql: any) => () => sql.null, [sql]), + resolve: EXPORTABLE( + (sql: any) => (i: any, _v: any, input: any) => + sql`${i} ${input ? sql`IS NULL` : sql`IS NOT NULL`}`, + [sql] + ), + }, + equalTo: { + description: 'Equal to the specified value.', + resolve: EXPORTABLE((sql: any) => (i: any, v: any) => sql`${i} = ${v}`, [sql]), + resolveInputCodec: resolveInputCodecSensitive, + resolveSqlIdentifier: resolveSqlIdentifierSensitive, + }, + notEqualTo: { + description: 'Not equal to the specified value.', + resolve: EXPORTABLE((sql: any) => (i: any, v: any) => sql`${i} <> ${v}`, [sql]), + resolveInputCodec: resolveInputCodecSensitive, + resolveSqlIdentifier: resolveSqlIdentifierSensitive, + }, + distinctFrom: { + description: + 'Not equal to the specified value, treating null like an ordinary value.', + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} IS DISTINCT FROM ${v}`, + [sql] + ), + resolveInputCodec: resolveInputCodecSensitive, + resolveSqlIdentifier: resolveSqlIdentifierSensitive, + }, + notDistinctFrom: { + description: + 'Equal to the specified value, treating null like an ordinary value.', + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} IS NOT DISTINCT FROM ${v}`, + [sql] + ), + resolveInputCodec: resolveInputCodecSensitive, + resolveSqlIdentifier: resolveSqlIdentifierSensitive, + }, + in: { + description: 'Included in the specified list.', + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} = ANY(${v})`, + [sql] + ), + resolveInputCodec: resolveArrayInputCodecSensitive, + resolveSqlIdentifier: resolveSqlIdentifierSensitive, + resolveType: resolveTypeToListOfNonNullable, + }, + notIn: { + description: 'Not included in the specified list.', + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} <> ALL(${v})`, + [sql] + ), + resolveInputCodec: resolveArrayInputCodecSensitive, + resolveSqlIdentifier: resolveSqlIdentifierSensitive, + resolveType: resolveTypeToListOfNonNullable, + }, + }; + + const sortOperators: Record = { + lessThan: { + description: 'Less than the specified value.', + resolve: EXPORTABLE((sql: any) => (i: any, v: any) => sql`${i} < ${v}`, [sql]), + resolveInputCodec: resolveInputCodecSensitive, + resolveSqlIdentifier: resolveSqlIdentifierSensitive, + }, + lessThanOrEqualTo: { + description: 'Less than or equal to the specified value.', + resolve: EXPORTABLE((sql: any) => (i: any, v: any) => sql`${i} <= ${v}`, [sql]), + resolveInputCodec: resolveInputCodecSensitive, + resolveSqlIdentifier: resolveSqlIdentifierSensitive, + }, + greaterThan: { + description: 'Greater than the specified value.', + resolve: EXPORTABLE((sql: any) => (i: any, v: any) => sql`${i} > ${v}`, [sql]), + resolveInputCodec: resolveInputCodecSensitive, + resolveSqlIdentifier: resolveSqlIdentifierSensitive, + }, + greaterThanOrEqualTo: { + description: 'Greater than or equal to the specified value.', + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} >= ${v}`, + [sql] + ), + resolveInputCodec: resolveInputCodecSensitive, + resolveSqlIdentifier: resolveSqlIdentifierSensitive, + }, + }; + + const patternMatchingOperators: Record = { + includes: { + description: 'Contains the specified string (case-sensitive).', + resolveInput: EXPORTABLE( + (escapeLikeWildcards: any) => (input: any) => + `%${escapeLikeWildcards(input)}%`, + [escapeLikeWildcards] + ), + resolveInputCodec: resolveInputCodecSensitive, + resolveSqlIdentifier: resolveSqlIdentifierSensitive, + resolve: EXPORTABLE((sql: any) => (i: any, v: any) => sql`${i} LIKE ${v}`, [sql]), + }, + notIncludes: { + description: 'Does not contain the specified string (case-sensitive).', + resolveInput: EXPORTABLE( + (escapeLikeWildcards: any) => (input: any) => + `%${escapeLikeWildcards(input)}%`, + [escapeLikeWildcards] + ), + resolveInputCodec: resolveInputCodecSensitive, + resolveSqlIdentifier: resolveSqlIdentifierSensitive, + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} NOT LIKE ${v}`, + [sql] + ), + }, + includesInsensitive: { + description: 'Contains the specified string (case-insensitive).', + resolveInput: EXPORTABLE( + (escapeLikeWildcards: any) => (input: any) => + `%${escapeLikeWildcards(input)}%`, + [escapeLikeWildcards] + ), + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} ILIKE ${v}`, + [sql] + ), + resolveInputCodec: resolveInputCodecInsensitive, + resolveSqlIdentifier: resolveSqlIdentifierInsensitive, + }, + notIncludesInsensitive: { + description: 'Does not contain the specified string (case-insensitive).', + resolveInput: EXPORTABLE( + (escapeLikeWildcards: any) => (input: any) => + `%${escapeLikeWildcards(input)}%`, + [escapeLikeWildcards] + ), + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} NOT ILIKE ${v}`, + [sql] + ), + resolveInputCodec: resolveInputCodecInsensitive, + resolveSqlIdentifier: resolveSqlIdentifierInsensitive, + }, + startsWith: { + description: 'Starts with the specified string (case-sensitive).', + resolveInput: EXPORTABLE( + (escapeLikeWildcards: any) => (input: any) => + `${escapeLikeWildcards(input)}%`, + [escapeLikeWildcards] + ), + resolveInputCodec: resolveInputCodecSensitive, + resolveSqlIdentifier: resolveSqlIdentifierSensitive, + resolve: EXPORTABLE((sql: any) => (i: any, v: any) => sql`${i} LIKE ${v}`, [sql]), + }, + notStartsWith: { + description: 'Does not start with the specified string (case-sensitive).', + resolveInput: EXPORTABLE( + (escapeLikeWildcards: any) => (input: any) => + `${escapeLikeWildcards(input)}%`, + [escapeLikeWildcards] + ), + resolveInputCodec: resolveInputCodecSensitive, + resolveSqlIdentifier: resolveSqlIdentifierSensitive, + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} NOT LIKE ${v}`, + [sql] + ), + }, + startsWithInsensitive: { + description: 'Starts with the specified string (case-insensitive).', + resolveInput: EXPORTABLE( + (escapeLikeWildcards: any) => (input: any) => + `${escapeLikeWildcards(input)}%`, + [escapeLikeWildcards] + ), + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} ILIKE ${v}`, + [sql] + ), + resolveInputCodec: resolveInputCodecInsensitive, + resolveSqlIdentifier: resolveSqlIdentifierInsensitive, + }, + notStartsWithInsensitive: { + description: 'Does not start with the specified string (case-insensitive).', + resolveInput: EXPORTABLE( + (escapeLikeWildcards: any) => (input: any) => + `${escapeLikeWildcards(input)}%`, + [escapeLikeWildcards] + ), + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} NOT ILIKE ${v}`, + [sql] + ), + resolveInputCodec: resolveInputCodecInsensitive, + resolveSqlIdentifier: resolveSqlIdentifierInsensitive, + }, + endsWith: { + description: 'Ends with the specified string (case-sensitive).', + resolveInput: EXPORTABLE( + (escapeLikeWildcards: any) => (input: any) => + `%${escapeLikeWildcards(input)}`, + [escapeLikeWildcards] + ), + resolveInputCodec: resolveInputCodecSensitive, + resolveSqlIdentifier: resolveSqlIdentifierSensitive, + resolve: EXPORTABLE((sql: any) => (i: any, v: any) => sql`${i} LIKE ${v}`, [sql]), + }, + notEndsWith: { + description: 'Does not end with the specified string (case-sensitive).', + resolveInput: EXPORTABLE( + (escapeLikeWildcards: any) => (input: any) => + `%${escapeLikeWildcards(input)}`, + [escapeLikeWildcards] + ), + resolveInputCodec: resolveInputCodecSensitive, + resolveSqlIdentifier: resolveSqlIdentifierSensitive, + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} NOT LIKE ${v}`, + [sql] + ), + }, + endsWithInsensitive: { + description: 'Ends with the specified string (case-insensitive).', + resolveInput: EXPORTABLE( + (escapeLikeWildcards: any) => (input: any) => + `%${escapeLikeWildcards(input)}`, + [escapeLikeWildcards] + ), + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} ILIKE ${v}`, + [sql] + ), + resolveInputCodec: resolveInputCodecInsensitive, + resolveSqlIdentifier: resolveSqlIdentifierInsensitive, + }, + notEndsWithInsensitive: { + description: 'Does not end with the specified string (case-insensitive).', + resolveInput: EXPORTABLE( + (escapeLikeWildcards: any) => (input: any) => + `%${escapeLikeWildcards(input)}`, + [escapeLikeWildcards] + ), + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} NOT ILIKE ${v}`, + [sql] + ), + resolveInputCodec: resolveInputCodecInsensitive, + resolveSqlIdentifier: resolveSqlIdentifierInsensitive, + }, + like: { + description: + 'Matches the specified pattern (case-sensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters.', + resolve: EXPORTABLE((sql: any) => (i: any, v: any) => sql`${i} LIKE ${v}`, [sql]), + resolveInputCodec: resolveInputCodecSensitive, + resolveSqlIdentifier: resolveSqlIdentifierSensitive, + }, + notLike: { + description: + 'Does not match the specified pattern (case-sensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters.', + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} NOT LIKE ${v}`, + [sql] + ), + resolveInputCodec: resolveInputCodecSensitive, + resolveSqlIdentifier: resolveSqlIdentifierSensitive, + }, + likeInsensitive: { + description: + 'Matches the specified pattern (case-insensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters.', + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} ILIKE ${v}`, + [sql] + ), + resolveInputCodec: resolveInputCodecInsensitive, + resolveSqlIdentifier: resolveSqlIdentifierInsensitive, + }, + notLikeInsensitive: { + description: + 'Does not match the specified pattern (case-insensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters.', + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} NOT ILIKE ${v}`, + [sql] + ), + resolveInputCodec: resolveInputCodecInsensitive, + resolveSqlIdentifier: resolveSqlIdentifierInsensitive, + }, + }; + + const resolveTextArrayInputCodec = EXPORTABLE( + (TYPES: any, listOfCodec: any) => () => + listOfCodec(TYPES.text, { extensions: { listItemNonNull: true } }), + [TYPES, listOfCodec] + ); + + const hstoreOperators: Record = { + contains: { + description: 'Contains the specified KeyValueHash.', + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} @> ${v}`, + [sql] + ), + }, + containsKey: { + description: 'Contains the specified key.', + resolveInputCodec: EXPORTABLE((TYPES: any) => () => TYPES.text, [TYPES]), + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} ? ${v}`, + [sql] + ), + }, + containsAllKeys: { + description: 'Contains all of the specified keys.', + resolveInputCodec: resolveTextArrayInputCodec, + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} ?& ${v}`, + [sql] + ), + resolveType: resolveTypeToListOfNonNullable, + }, + containsAnyKeys: { + description: 'Contains any of the specified keys.', + resolveInputCodec: resolveTextArrayInputCodec, + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} ?| ${v}`, + [sql] + ), + resolveType: resolveTypeToListOfNonNullable, + }, + containedBy: { + description: 'Contained by the specified KeyValueHash.', + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} <@ ${v}`, + [sql] + ), + }, + }; + + const jsonbOperators: Record = { + contains: { + description: 'Contains the specified JSON.', + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} @> ${v}`, + [sql] + ), + }, + containsKey: { + description: 'Contains the specified key.', + resolveInputCodec: EXPORTABLE((TYPES: any) => () => TYPES.text, [TYPES]), + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} ? ${v}`, + [sql] + ), + }, + containsAllKeys: { + description: 'Contains all of the specified keys.', + resolveInputCodec: resolveTextArrayInputCodec, + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} ?& ${v}`, + [sql] + ), + }, + containsAnyKeys: { + description: 'Contains any of the specified keys.', + resolveInputCodec: resolveTextArrayInputCodec, + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} ?| ${v}`, + [sql] + ), + }, + containedBy: { + description: 'Contained by the specified JSON.', + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} <@ ${v}`, + [sql] + ), + }, + }; + + const inetOperators: Record = { + contains: { + description: 'Contains the specified internet address.', + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} >> ${v}`, + [sql] + ), + }, + containsOrEqualTo: { + description: 'Contains or equal to the specified internet address.', + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} >>= ${v}`, + [sql] + ), + }, + containedBy: { + description: 'Contained by the specified internet address.', + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} << ${v}`, + [sql] + ), + }, + containedByOrEqualTo: { + description: 'Contained by or equal to the specified internet address.', + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} <<= ${v}`, + [sql] + ), + }, + containsOrContainedBy: { + description: 'Contains or contained by the specified internet address.', + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} && ${v}`, + [sql] + ), + }, + }; + + // --- Case-insensitive variants of standard + sort operators --- + const insensitiveOperators: Record = {}; + for (const [name, spec] of [ + ...Object.entries(standardOperators), + ...Object.entries(sortOperators), + ]) { + if (name === 'isNull') continue; + + const description = `${spec.description.substring(0, spec.description.length - 1)} (case-insensitive).`; + + const resolveSqlIdentifier = EXPORTABLE( + (TYPES: any, resolveDomains: any, sql: any) => + function (sourceAlias: any, codec: any): [any, any] { + return resolveDomains(codec) === TYPES.citext + ? [sourceAlias, codec] + : [sql`lower(${sourceAlias}::text)`, TYPES.text]; + }, + [TYPES, resolveDomains, sql] + ); + + const resolveSqlValue = EXPORTABLE( + (TYPES: any, name: string, sql: any, sqlValueWithCodec: any) => + function (_unused: any, input: any, inputCodec: any) { + if (name === 'in' || name === 'notIn') { + const sqlList = sqlValueWithCodec(input, inputCodec); + if (inputCodec.arrayOfCodec === TYPES.citext) { + return sqlList; + } + return sql`(select lower(t) from unnest(${sqlList}) t)`; + } + const sqlValue = sqlValueWithCodec(input, inputCodec); + if (inputCodec === TYPES.citext) { + return sqlValue; + } + return sql`lower(${sqlValue})`; + }, + [TYPES, name, sql, sqlValueWithCodec] + ); + + const resolveInputCodec = EXPORTABLE( + (TYPES: any, listOfCodec: any, name: string, resolveDomains: any) => + function (inputCodec: any) { + if (name === 'in' || name === 'notIn') { + const t = + resolveDomains(inputCodec) === TYPES.citext + ? inputCodec + : TYPES.text; + return listOfCodec(t, { extensions: { listItemNonNull: true } }); + } + return resolveDomains(inputCodec) === TYPES.citext + ? inputCodec + : TYPES.text; + }, + [TYPES, listOfCodec, name, resolveDomains] + ); + + insensitiveOperators[`${name}Insensitive`] = { + ...spec, + description, + resolveInputCodec: resolveInputCodec, + resolveSqlIdentifier: resolveSqlIdentifier, + resolveSqlValue: resolveSqlValue, + }; + } + + // --- Composite operator sets for specific type categories --- + + const connectionFilterEnumOperators = { + ...standardOperators, + ...sortOperators, + }; + + const connectionFilterRangeOperators: Record = { + ...standardOperators, + ...sortOperators, + contains: { + description: 'Contains the specified range.', + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} @> ${v}`, + [sql] + ), + }, + containsElement: { + description: 'Contains the specified value.', + resolveInputCodec: EXPORTABLE( + () => + function (c: any) { + if (c.rangeOfCodec) return c.rangeOfCodec; + throw new Error( + "Couldn't determine the range element type to use" + ); + }, + [] + ), + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} @> ${v}`, + [sql] + ), + }, + containedBy: { + description: 'Contained by the specified range.', + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} <@ ${v}`, + [sql] + ), + }, + overlaps: { + description: 'Overlaps the specified range.', + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} && ${v}`, + [sql] + ), + }, + strictlyLeftOf: { + description: 'Strictly left of the specified range.', + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} << ${v}`, + [sql] + ), + }, + strictlyRightOf: { + description: 'Strictly right of the specified range.', + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} >> ${v}`, + [sql] + ), + }, + notExtendsRightOf: { + description: 'Does not extend right of the specified range.', + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} &< ${v}`, + [sql] + ), + }, + notExtendsLeftOf: { + description: 'Does not extend left of the specified range.', + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} &> ${v}`, + [sql] + ), + }, + adjacentTo: { + description: 'Adjacent to the specified range.', + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} -|- ${v}`, + [sql] + ), + }, + }; + + const connectionFilterArrayOperators: Record = { + isNull: standardOperators.isNull, + equalTo: standardOperators.equalTo, + notEqualTo: standardOperators.notEqualTo, + distinctFrom: standardOperators.distinctFrom, + notDistinctFrom: standardOperators.notDistinctFrom, + ...sortOperators, + contains: { + description: 'Contains the specified list of values.', + resolveSqlIdentifier: resolveSqlIdentifierSensitive, + resolveInputCodec: resolveInputCodecSensitive, + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} @> ${v}`, + [sql] + ), + }, + containedBy: { + description: 'Contained by the specified list of values.', + resolveSqlIdentifier: resolveSqlIdentifierSensitive, + resolveInputCodec: resolveInputCodecSensitive, + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} <@ ${v}`, + [sql] + ), + }, + overlaps: { + description: 'Overlaps the specified list of values.', + resolveSqlIdentifier: resolveSqlIdentifierSensitive, + resolveInputCodec: resolveInputCodecSensitive, + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${i} && ${v}`, + [sql] + ), + }, + anyEqualTo: { + description: 'Any array item is equal to the specified value.', + resolveInputCodec: resolveArrayItemInputCodecSensitive, + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${v} = ANY (${i})`, + [sql] + ), + }, + anyNotEqualTo: { + description: 'Any array item is not equal to the specified value.', + resolveInputCodec: resolveArrayItemInputCodecSensitive, + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${v} <> ANY (${i})`, + [sql] + ), + }, + anyLessThan: { + description: 'Any array item is less than the specified value.', + resolveInputCodec: resolveArrayItemInputCodecSensitive, + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${v} > ANY (${i})`, + [sql] + ), + }, + anyLessThanOrEqualTo: { + description: 'Any array item is less than or equal to the specified value.', + resolveInputCodec: resolveArrayItemInputCodecSensitive, + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${v} >= ANY (${i})`, + [sql] + ), + }, + anyGreaterThan: { + description: 'Any array item is greater than the specified value.', + resolveInputCodec: resolveArrayItemInputCodecSensitive, + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${v} < ANY (${i})`, + [sql] + ), + }, + anyGreaterThanOrEqualTo: { + description: 'Any array item is greater than or equal to the specified value.', + resolveInputCodec: resolveArrayItemInputCodecSensitive, + resolve: EXPORTABLE( + (sql: any) => (i: any, v: any) => sql`${v} <= ANY (${i})`, + [sql] + ), + }, + }; + + // --- Determine which operators to use based on codec characteristics --- + + const { pgCodecs } = pgConnectionFilterOperators; + const someCodec = pgCodecs[0]; + const fieldInputType = build.getGraphQLTypeByPgCodec(someCodec, 'input'); + + let textLike = true; + let sortable = true; + let inetLike = true; + let jsonLike = true; + let hstoreLike = true; + let arrayLike = true; + let rangeLike = true; + let enumLike = true; + + for (const codec of pgCodecs) { + const underlyingType = codec.domainOfCodec ?? codec; + if (!underlyingType.arrayOfCodec) arrayLike = false; + if (!underlyingType.rangeOfCodec) rangeLike = false; + if (!isEnumCodec(underlyingType)) enumLike = false; + + switch (underlyingType) { + case TYPES.numeric: + case TYPES.money: + case TYPES.float: + case TYPES.float4: + case TYPES.bigint: + case TYPES.int: + case TYPES.int2: + case TYPES.boolean: + case TYPES.varbit: + case TYPES.bit: + case TYPES.date: + case TYPES.timestamp: + case TYPES.timestamptz: + case TYPES.time: + case TYPES.timetz: + case TYPES.interval: + case TYPES.json: + case TYPES.jsonb: + case TYPES.cidr: + case TYPES.inet: + case TYPES.macaddr: + case TYPES.macaddr8: + case TYPES.text: + case TYPES.name: + case TYPES.citext: + case TYPES.varchar: + case TYPES.char: + case TYPES.bpchar: + case TYPES.uuid: + break; + default: + sortable = false; + } + + switch (underlyingType) { + case TYPES.cidr: + case TYPES.inet: + case TYPES.macaddr: + case TYPES.macaddr8: + break; + default: + inetLike = false; + } + + switch (underlyingType) { + case TYPES.text: + case TYPES.name: + case TYPES.citext: + case TYPES.varchar: + case TYPES.char: + case TYPES.bpchar: + break; + default: + textLike = false; + } + + switch (underlyingType) { + case TYPES.json: + case TYPES.jsonb: + break; + default: + jsonLike = false; + } + + switch (underlyingType) { + case TYPES.hstore: + break; + default: + hstoreLike = false; + } + } + + // Choose the correct operator set + const operatorSpecs: Record = arrayLike + ? connectionFilterArrayOperators + : rangeLike + ? connectionFilterRangeOperators + : enumLike + ? connectionFilterEnumOperators + : { + ...standardOperators, + ...(sortable ? sortOperators : null), + ...(inetLike ? inetOperators : null), + ...(jsonLike ? jsonbOperators : null), + ...(hstoreLike ? hstoreOperators : null), + ...(textLike ? patternMatchingOperators : null), + ...(textLike ? insensitiveOperators : null), + }; + + // Build the operator fields + const operatorFields = Object.entries(operatorSpecs).reduce( + (memo: Record, [name, spec]) => { + const { description, resolveInputCodec, resolveType } = spec; + + if ( + connectionFilterAllowedOperators && + !connectionFilterAllowedOperators.includes(name) + ) { + return memo; + } + + if (!fieldInputType) return memo; + + const firstCodec = pgCodecs[0]; + const inputCodec = resolveInputCodec + ? resolveInputCodec(firstCodec) + : firstCodec; + + const codecGraphQLType = build.getGraphQLTypeByPgCodec( + inputCodec, + 'input' + ); + if (!codecGraphQLType) return memo; + + const type = resolveType + ? resolveType(codecGraphQLType) + : codecGraphQLType; + + const operatorName = + (connectionFilterOperatorNames && + connectionFilterOperatorNames[name]) || + name; + + memo[operatorName] = fieldWithHooks( + { + fieldName: operatorName, + isPgConnectionFilterOperator: true, + }, + { + description, + type, + apply: makeApplyFromOperatorSpec( + build, + Self.name, + operatorName, + spec, + type + ), + } + ); + return memo; + }, + Object.create(null) + ); + + return extend(fields, operatorFields, ''); + }, + }, + }, +}; diff --git a/graphile/graphile-connection-filter/src/plugins/ConnectionFilterTypesPlugin.ts b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterTypesPlugin.ts new file mode 100644 index 000000000..50962de25 --- /dev/null +++ b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterTypesPlugin.ts @@ -0,0 +1,338 @@ +import '../augmentations'; +import type { GraphileConfig } from 'graphile-config'; + +const version = '1.0.0'; + +/** + * Determines if a codec is suitable for scalar/enum/domain/array filtering. + * Excludes void, composite types, anonymous types, and polymorphic types. + */ +function isSuitableForFiltering(build: any, codec: any): boolean { + return ( + codec !== build.dataplanPg.TYPES.void && + !codec.attributes && + !codec.isAnonymous && + !codec.polymorphism && + (!codec.arrayOfCodec || isSuitableForFiltering(build, codec.arrayOfCodec)) && + (!codec.domainOfCodec || isSuitableForFiltering(build, codec.domainOfCodec)) + ); +} + +/** + * ConnectionFilterTypesPlugin + * + * Registers the filter types in the schema: + * 1. Per-table filter types (e.g. UserFilter) - registered for every codec with attributes + * 2. Per-scalar operator types (e.g. StringFilter, IntFilter) - registered for each scalar type + * + * Also adds `connectionFilterOperatorsDigest` and `escapeLikeWildcards` to the build object. + */ +export const ConnectionFilterTypesPlugin: GraphileConfig.Plugin = { + name: 'ConnectionFilterTypesPlugin', + version, + description: 'Registers connection filter input types for tables and scalars', + + schema: { + behaviorRegistry: { + add: { + filterProc: { + description: 'Can this function be filtered?', + entities: ['pgResource'], + }, + filter: { + description: 'Can this table be filtered?', + entities: ['pgResource'], + }, + }, + }, + + entityBehavior: { + pgCodec: 'filter', + pgResource: { + inferred(behavior: any, entity: any, build: any) { + if (entity.parameters) { + return [ + behavior, + build.options.connectionFilterSetofFunctions + ? 'filterProc' + : '-filterProc', + ]; + } else { + return ['filter', behavior]; + } + }, + }, + }, + + hooks: { + build(build) { + const { + inflection, + options: { + connectionFilterAllowedFieldTypes, + connectionFilterArrays, + }, + EXPORTABLE, + } = build; + + // Add connectionFilterOperatorsDigest to the build object + build.connectionFilterOperatorsDigest = (codec: any) => { + const finalBuild = build; + const { + dataplanPg: { getInnerCodec, TYPES, isEnumCodec }, + } = finalBuild; + + if (!isSuitableForFiltering(finalBuild, codec)) { + return null; + } + + // Unwrap to the simple type + const pgSimpleCodec = getInnerCodec(codec); + if (!pgSimpleCodec) return null; + if ( + pgSimpleCodec.polymorphism || + pgSimpleCodec.attributes || + pgSimpleCodec.isAnonymous + ) { + return null; + } + + // json type has no valid operators (use jsonb instead) + if (pgSimpleCodec === TYPES.json) { + return null; + } + + const itemCodec = codec.arrayOfCodec ?? codec; + const fieldTypeName = build.getGraphQLTypeNameByPgCodec( + itemCodec, + 'output' + ); + if (!fieldTypeName) return null; + + const fieldTypeMeta = build.getTypeMetaByName(fieldTypeName); + if (!fieldTypeMeta) return null; + + const fieldInputTypeName = build.getGraphQLTypeNameByPgCodec( + itemCodec, + 'input' + ); + if (!fieldInputTypeName) return null; + + const fieldInputTypeMeta = build.getTypeMetaByName(fieldInputTypeName); + if (!fieldInputTypeMeta) return null; + + // Skip unrecognized types that PostGraphile maps to String + const namedTypeName = fieldTypeName; + const namedInputTypeName = fieldInputTypeName; + const actualStringCodecs = [ + TYPES.bpchar, + TYPES.char, + TYPES.name, + TYPES.text, + TYPES.varchar, + TYPES.citext, + ]; + if ( + namedInputTypeName === 'String' && + !actualStringCodecs.includes(pgSimpleCodec) + ) { + return null; + } + + // Respect connectionFilterAllowedFieldTypes + if ( + connectionFilterAllowedFieldTypes && + !connectionFilterAllowedFieldTypes.includes(namedTypeName) + ) { + return null; + } + + // Respect connectionFilterArrays + const isArray = !!codec.arrayOfCodec; + if (isArray && !connectionFilterArrays) { + return null; + } + + const listType = !!( + codec.arrayOfCodec || + codec.domainOfCodec?.arrayOfCodec || + codec.rangeOfCodec?.arrayOfCodec + ); + + const operatorsTypeName = listType + ? inflection.filterFieldListType(namedTypeName) + : inflection.filterFieldType(namedTypeName); + + const rangeElementInputTypeName = + codec.rangeOfCodec && !codec.rangeOfCodec.arrayOfCodec + ? build.getGraphQLTypeNameByPgCodec(codec.rangeOfCodec, 'input') + : null; + + const domainBaseTypeName = + codec.domainOfCodec && !codec.domainOfCodec.arrayOfCodec + ? build.getGraphQLTypeNameByPgCodec( + codec.domainOfCodec, + 'output' + ) + : null; + + return { + isList: listType, + operatorsTypeName, + relatedTypeName: namedTypeName, + inputTypeName: fieldInputTypeName, + rangeElementInputTypeName, + domainBaseTypeName, + }; + }; + + // Add escapeLikeWildcards helper + build.escapeLikeWildcards = EXPORTABLE( + () => + function (input: unknown): string { + if ('string' !== typeof input) { + throw new Error( + 'Non-string input was provided to escapeLikeWildcards' + ); + } + return input.split('%').join('\\%').split('_').join('\\_'); + }, + [] + ); + + return build; + }, + + init: { + after: ['PgCodecs'], + callback(_, build) { + const { inflection } = build; + + // Register per-table filter types (e.g. UserFilter) + for (const pgCodec of build.allPgCodecs) { + if (!pgCodec.attributes) { + continue; + } + const nodeTypeName = build.getGraphQLTypeNameByPgCodec( + pgCodec, + 'output' + ); + if (!nodeTypeName) { + continue; + } + const filterTypeName = inflection.filterType(nodeTypeName); + build.registerInputObjectType( + filterTypeName, + { + pgCodec, + isPgConnectionFilter: true, + }, + () => ({ + description: `A filter to be used against \`${nodeTypeName}\` object types. All fields are combined with a logical 'and.'`, + }), + 'ConnectionFilterTypesPlugin' + ); + } + + // Register per-scalar operator types (e.g. StringFilter, IntFilter) + const codecsByFilterTypeName: Record< + string, + { + isList: boolean; + relatedTypeName: string; + pgCodecs: any[]; + inputTypeName: string; + rangeElementInputTypeName: string | null; + domainBaseTypeName: string | null; + } + > = {}; + + for (const codec of build.allPgCodecs) { + const digest = build.connectionFilterOperatorsDigest(codec); + if (!digest) continue; + + const { + isList, + operatorsTypeName, + relatedTypeName, + inputTypeName, + rangeElementInputTypeName, + domainBaseTypeName, + } = digest; + + if (!codecsByFilterTypeName[operatorsTypeName]) { + codecsByFilterTypeName[operatorsTypeName] = { + isList, + relatedTypeName, + pgCodecs: [codec], + inputTypeName, + rangeElementInputTypeName, + domainBaseTypeName, + }; + } else { + // Validate consistency + for (const key of [ + 'isList', + 'relatedTypeName', + 'inputTypeName', + 'rangeElementInputTypeName', + ] as const) { + if ( + (digest as any)[key] !== + (codecsByFilterTypeName[operatorsTypeName] as any)[key] + ) { + throw new Error( + `${key} mismatch: existing codecs (${codecsByFilterTypeName[ + operatorsTypeName + ].pgCodecs + .map((c: any) => c.name) + .join(', ')}) had ${key} = ${ + (codecsByFilterTypeName[operatorsTypeName] as any)[key] + }, but ${codec.name} instead has ${key} = ${ + (digest as any)[key] + }` + ); + } + } + codecsByFilterTypeName[operatorsTypeName].pgCodecs.push(codec); + } + } + + for (const [ + operatorsTypeName, + { + isList, + relatedTypeName, + pgCodecs, + inputTypeName, + rangeElementInputTypeName, + domainBaseTypeName, + }, + ] of Object.entries(codecsByFilterTypeName)) { + build.registerInputObjectType( + operatorsTypeName, + { + pgConnectionFilterOperators: { + isList, + pgCodecs, + inputTypeName, + rangeElementInputTypeName, + domainBaseTypeName, + }, + }, + () => ({ + name: operatorsTypeName, + description: `A filter to be used against ${relatedTypeName}${ + isList ? ' List' : '' + } fields. All fields are combined with a logical 'and.'`, + }), + 'ConnectionFilterTypesPlugin' + ); + } + + return _; + }, + }, + }, + }, +}; diff --git a/graphile/graphile-connection-filter/src/plugins/index.ts b/graphile/graphile-connection-filter/src/plugins/index.ts new file mode 100644 index 000000000..3356cbb6a --- /dev/null +++ b/graphile/graphile-connection-filter/src/plugins/index.ts @@ -0,0 +1,8 @@ +export { ConnectionFilterInflectionPlugin } from './ConnectionFilterInflectionPlugin'; +export { ConnectionFilterTypesPlugin } from './ConnectionFilterTypesPlugin'; +export { ConnectionFilterArgPlugin } from './ConnectionFilterArgPlugin'; +export { ConnectionFilterAttributesPlugin } from './ConnectionFilterAttributesPlugin'; +export { ConnectionFilterOperatorsPlugin } from './ConnectionFilterOperatorsPlugin'; +export { ConnectionFilterCustomOperatorsPlugin } from './ConnectionFilterCustomOperatorsPlugin'; +export { ConnectionFilterLogicalOperatorsPlugin } from './ConnectionFilterLogicalOperatorsPlugin'; +export { makeApplyFromOperatorSpec } from './operatorApply'; diff --git a/graphile/graphile-connection-filter/src/plugins/operatorApply.ts b/graphile/graphile-connection-filter/src/plugins/operatorApply.ts new file mode 100644 index 000000000..cf8d02b83 --- /dev/null +++ b/graphile/graphile-connection-filter/src/plugins/operatorApply.ts @@ -0,0 +1,124 @@ +/** + * Creates an `apply` function for a filter operator field. + * + * This is the core execution logic: given a PgCondition ($where) and an input value, + * it resolves the SQL identifier, SQL value, and calls the operator's resolve function + * to produce a SQL WHERE clause fragment, then applies it via `$where.where(fragment)`. + * + * The `pgFilterAttribute` extension on $where provides the context about which + * column is being filtered, including the attribute name, codec, and any expression. + */ +export function makeApplyFromOperatorSpec( + build: any, + _typeName: string, + fieldName: string, + spec: any, + _type: any +): any { + const { + sql, + dataplanPg: { TYPES, sqlValueWithCodec }, + EXPORTABLE, + } = build; + const { + resolve, + resolveInput, + resolveSqlIdentifier, + resolveSqlValue, + resolveInputCodec, + } = spec; + + const { options: { connectionFilterAllowNullInput } } = build; + + return EXPORTABLE( + ( + connectionFilterAllowNullInput: boolean, + fieldName: string, + resolve: any, + resolveInput: any, + resolveInputCodec: any, + resolveSqlIdentifier: any, + resolveSqlValue: any, + sql: any, + sqlValueWithCodec: any + ) => + function ($where: any, value: any) { + if (!$where.extensions?.pgFilterAttribute) { + throw new Error( + "Planning error: expected 'pgFilterAttribute' to be present on the $where plan's extensions; your extensions to the connection filter plugin do not implement the required interfaces." + ); + } + + if (value === undefined) { + return; + } + + const { + fieldName: parentFieldName, + attributeName, + attribute, + codec, + expression, + } = $where.extensions.pgFilterAttribute; + + // Determine the SQL expression for the column + const sourceAlias = attribute + ? attribute.expression + ? attribute.expression($where.alias) + : sql`${$where.alias}.${sql.identifier(attributeName)}` + : expression + ? expression + : $where.alias; + + const sourceCodec = codec ?? attribute.codec; + + // Optionally override the SQL identifier (e.g. cast citext to text) + const [sqlIdentifier, identifierCodec] = resolveSqlIdentifier + ? resolveSqlIdentifier(sourceAlias, sourceCodec) + : [sourceAlias, sourceCodec]; + + // Handle null input + if (connectionFilterAllowNullInput && value === null) { + return; + } + if (!connectionFilterAllowNullInput && value === null) { + throw Object.assign( + new Error('Null literals are forbidden in filter argument input.'), + {} + ); + } + + // Optionally transform the input value + const resolvedInput = resolveInput ? resolveInput(value) : value; + + // Determine the input codec + const inputCodec = resolveInputCodec + ? resolveInputCodec(codec ?? attribute.codec) + : codec ?? attribute.codec; + + // Generate the SQL value + const sqlValue = resolveSqlValue + ? resolveSqlValue($where, value, inputCodec) + : sqlValueWithCodec(resolvedInput, inputCodec); + + // Generate the WHERE clause fragment and apply it + const fragment = resolve(sqlIdentifier, sqlValue, value, $where, { + fieldName: parentFieldName ?? null, + operatorName: fieldName, + }); + + $where.where(fragment); + }, + [ + connectionFilterAllowNullInput, + fieldName, + resolve, + resolveInput, + resolveInputCodec, + resolveSqlIdentifier, + resolveSqlValue, + sql, + sqlValueWithCodec, + ] + ); +} diff --git a/graphile/graphile-connection-filter/src/preset.ts b/graphile/graphile-connection-filter/src/preset.ts new file mode 100644 index 000000000..945ab3844 --- /dev/null +++ b/graphile/graphile-connection-filter/src/preset.ts @@ -0,0 +1,83 @@ +/** + * Connection Filter Preset + * + * Provides a convenient preset factory for including connection filtering + * in PostGraphile v5. + * + * @example + * ```typescript + * import { ConnectionFilterPreset } from 'graphile-connection-filter'; + * + * const preset = { + * extends: [ + * ConnectionFilterPreset(), + * // or with options: + * ConnectionFilterPreset({ + * connectionFilterLogicalOperators: true, + * connectionFilterArrays: true, + * }), + * ], + * }; + * ``` + */ + +import './augmentations'; +import type { GraphileConfig } from 'graphile-config'; +import type { ConnectionFilterOptions } from './types'; +import { + ConnectionFilterInflectionPlugin, + ConnectionFilterTypesPlugin, + ConnectionFilterArgPlugin, + ConnectionFilterAttributesPlugin, + ConnectionFilterOperatorsPlugin, + ConnectionFilterCustomOperatorsPlugin, + ConnectionFilterLogicalOperatorsPlugin, +} from './plugins'; + +/** + * Default schema options for the connection filter. + */ +const defaultSchemaOptions: ConnectionFilterOptions = { + connectionFilterArrays: true, + connectionFilterLogicalOperators: true, + connectionFilterAllowNullInput: false, + connectionFilterAllowEmptyObjectInput: false, + connectionFilterSetofFunctions: true, + connectionFilterComputedColumns: true, +}; + +/** + * Creates a preset that includes the connection filter plugins with the given options. + * + * All plugins are always included. Use the schema options to control behavior: + * - `connectionFilterLogicalOperators: false` to exclude and/or/not + * - `connectionFilterArrays: false` to exclude array type filters + * - `connectionFilterAllowNullInput: true` to allow null literals + * - `connectionFilterAllowEmptyObjectInput: true` to allow empty objects + */ +export function ConnectionFilterPreset( + options: ConnectionFilterOptions = {} +): GraphileConfig.Preset { + const mergedOptions = { ...defaultSchemaOptions, ...options }; + + const plugins: GraphileConfig.Plugin[] = [ + ConnectionFilterInflectionPlugin, + ConnectionFilterTypesPlugin, + ConnectionFilterArgPlugin, + ConnectionFilterAttributesPlugin, + ConnectionFilterOperatorsPlugin, + ConnectionFilterCustomOperatorsPlugin, + ]; + + // Logical operators are opt-out + if (mergedOptions.connectionFilterLogicalOperators !== false) { + plugins.push(ConnectionFilterLogicalOperatorsPlugin); + } + + return { + plugins, + schema: mergedOptions, + }; +} + +export default ConnectionFilterPreset; diff --git a/graphile/graphile-connection-filter/src/types.ts b/graphile/graphile-connection-filter/src/types.ts new file mode 100644 index 000000000..db6e2b979 --- /dev/null +++ b/graphile/graphile-connection-filter/src/types.ts @@ -0,0 +1,108 @@ +import type { SQL } from 'pg-sql2'; +import type { GraphQLInputType } from 'graphql'; + +/** + * Symbol used to store the filter operator registry on the build object. + */ +export const $$filters = Symbol('connectionFilters'); + +/** + * Specification for a filter operator. + * + * This is the contract that satellite plugins (PostGIS, search, pgvector, etc.) + * use when calling `addConnectionFilterOperator`. + */ +export interface ConnectionFilterOperatorSpec { + /** Human-readable description for the GraphQL schema. */ + description?: string; + + /** + * Core resolve function: given the SQL identifier for the column and the SQL + * value for the user input, return a SQL fragment for the WHERE clause. + */ + resolve: ( + sqlIdentifier: SQL, + sqlValue: SQL, + input: unknown, + $where: any, + details: { fieldName: string | null; operatorName: string } + ) => SQL; + + /** + * Optional: transform the user input before encoding to SQL. + * e.g. wrapping a LIKE pattern with `%`. + */ + resolveInput?: (input: unknown) => unknown; + + /** + * Optional: override the codec used for encoding the input value to SQL. + * Receives the column's codec and returns the codec to use for the input. + */ + resolveInputCodec?: (codec: any) => any; + + /** + * Optional: override the SQL identifier and its codec. + * Useful for casting columns (e.g. citext -> text for case-sensitive matching). + */ + resolveSqlIdentifier?: (sqlIdentifier: SQL, codec: any) => [SQL, any]; + + /** + * Optional: completely override how the SQL value is generated. + * Receives the $where plan, the raw input value, and the resolved input codec. + */ + resolveSqlValue?: ($where: any, value: unknown, inputCodec: any) => SQL; + + /** + * Optional: override the GraphQL input type for this operator. + * Receives the default field input type and returns the type to use. + */ + resolveType?: (fieldType: GraphQLInputType) => GraphQLInputType; +} + +/** + * Configuration options for the connection filter preset. + */ +export interface ConnectionFilterOptions { + /** Allow filtering on array columns. Default: true */ + connectionFilterArrays?: boolean; + /** Include logical operators (and/or/not). Default: true */ + connectionFilterLogicalOperators?: boolean; + /** Allow null literals in filter input. Default: false */ + connectionFilterAllowNullInput?: boolean; + /** Allow empty objects in filter input. Default: false */ + connectionFilterAllowEmptyObjectInput?: boolean; + /** Restrict which field types can be filtered. Default: all types */ + connectionFilterAllowedFieldTypes?: string[]; + /** Restrict which operators are available. Default: all operators */ + connectionFilterAllowedOperators?: string[]; + /** Rename operators. Keys are default names, values are custom names. */ + connectionFilterOperatorNames?: Record; + /** Allow filtering on setof functions. Default: true */ + connectionFilterSetofFunctions?: boolean; + /** Allow filtering on computed columns. Default: true */ + connectionFilterComputedColumns?: boolean; +} + +/** + * Digest of operator type information for a given codec. + * Used to determine which filter type (e.g. StringFilter, IntFilter) to create. + */ +export interface ConnectionFilterOperatorsDigest { + isList: boolean; + operatorsTypeName: string; + relatedTypeName: string; + inputTypeName: string; + rangeElementInputTypeName: string | null; + domainBaseTypeName: string | null; +} + +/** + * Scope metadata stored on operator filter types (e.g. StringFilter, IntFilter). + */ +export interface PgConnectionFilterOperatorsScope { + isList: boolean; + pgCodecs: any[]; + inputTypeName: string; + rangeElementInputTypeName: string | null; + domainBaseTypeName: string | null; +} diff --git a/graphile/graphile-connection-filter/src/utils.ts b/graphile/graphile-connection-filter/src/utils.ts new file mode 100644 index 000000000..d623fe73c --- /dev/null +++ b/graphile/graphile-connection-filter/src/utils.ts @@ -0,0 +1,113 @@ +/** + * Utility functions for the connection filter plugin. + */ + +/** + * Check if a value is an empty object (no own enumerable keys). + */ +export function isEmpty(o: unknown): boolean { + return typeof o === 'object' && o !== null && Object.keys(o).length === 0; +} + +/** + * Check if a pgResource is a computed scalar attribute function. + * A computed attribute is a function that: + * - has parameters + * - returns a scalar (no attributes on codec) + * - is unique (returns single row) + * - first parameter's codec has attributes (i.e. takes a table row) + */ +export function isComputedScalarAttributeResource(s: any): boolean { + if (!s.parameters || s.parameters.length < 1) { + return false; + } + if (s.codec.attributes) { + return false; + } + if (!s.isUnique) { + return false; + } + const firstParameter = s.parameters[0]; + if (!firstParameter?.codec.attributes) { + return false; + } + return true; +} + +/** + * Get all computed attribute resources for a given source. + */ +export function getComputedAttributeResources(build: any, source: any): any[] { + const computedAttributeSources = Object.values( + build.input.pgRegistry.pgResources + ).filter( + (s: any) => + isComputedScalarAttributeResource(s) && + s.parameters[0].codec === source.codec + ); + return computedAttributeSources; +} + +/** + * Creates an assertion function that validates filter input values + * based on the connectionFilterAllowNullInput and connectionFilterAllowEmptyObjectInput options. + */ +export function makeAssertAllowed(build: any): (value: unknown, mode: 'object' | 'list') => void { + const { options, EXPORTABLE } = build; + const { + connectionFilterAllowNullInput, + connectionFilterAllowEmptyObjectInput, + } = options; + + const assertAllowed = EXPORTABLE( + ( + connectionFilterAllowEmptyObjectInput: boolean, + connectionFilterAllowNullInput: boolean, + isEmpty: (o: unknown) => boolean + ) => + function (value: unknown, mode: 'object' | 'list') { + if ( + mode === 'object' && + !connectionFilterAllowEmptyObjectInput && + isEmpty(value) + ) { + throw Object.assign( + new Error( + 'Empty objects are forbidden in filter argument input.' + ), + {} + ); + } + + if (mode === 'list' && !connectionFilterAllowEmptyObjectInput) { + const arr = value as unknown[]; + if (arr) { + const l = arr.length; + for (let i = 0; i < l; i++) { + if (isEmpty(arr[i])) { + throw Object.assign( + new Error( + 'Empty objects are forbidden in filter argument input.' + ), + {} + ); + } + } + } + } + + // For all modes, check null + if (!connectionFilterAllowNullInput && value === null) { + throw Object.assign( + new Error( + 'Null literals are forbidden in filter argument input.' + ), + {} + ); + } + }, + [connectionFilterAllowEmptyObjectInput, connectionFilterAllowNullInput, isEmpty] + ); + + return assertAllowed; +} diff --git a/graphile/graphile-connection-filter/tsconfig.esm.json b/graphile/graphile-connection-filter/tsconfig.esm.json new file mode 100644 index 000000000..f624f9670 --- /dev/null +++ b/graphile/graphile-connection-filter/tsconfig.esm.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "dist/esm", + "module": "ESNext" + } +} diff --git a/graphile/graphile-connection-filter/tsconfig.json b/graphile/graphile-connection-filter/tsconfig.json new file mode 100644 index 000000000..9c8a7d7c1 --- /dev/null +++ b/graphile/graphile-connection-filter/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src" + }, + "include": ["src/**/*"] +} diff --git a/graphile/graphile-settings/package.json b/graphile/graphile-settings/package.json index f8751b6ec..e5828b29c 100644 --- a/graphile/graphile-settings/package.json +++ b/graphile/graphile-settings/package.json @@ -59,7 +59,7 @@ "pg": "^8.19.0", "pg-sql2": "5.0.0-rc.4", "postgraphile": "5.0.0-rc.7", - "postgraphile-plugin-connection-filter": "3.0.0-rc.1", + "graphile-connection-filter": "workspace:^", "request-ip": "^3.3.0", "tamedevil": "0.1.0-rc.4" }, diff --git a/graphile/graphile-settings/src/presets/constructive-preset.ts b/graphile/graphile-settings/src/presets/constructive-preset.ts index 570592ca2..c2356f770 100644 --- a/graphile/graphile-settings/src/presets/constructive-preset.ts +++ b/graphile/graphile-settings/src/presets/constructive-preset.ts @@ -1,5 +1,5 @@ import type { GraphileConfig } from 'graphile-config'; -import { PostGraphileConnectionFilterPreset } from 'postgraphile-plugin-connection-filter'; +import { ConnectionFilterPreset } from 'graphile-connection-filter'; import { MinimalPreset, InflektPreset, @@ -72,7 +72,7 @@ export const ConstructivePreset: GraphileConfig.Preset = { InflektPreset, InflectorLoggerPreset, NoUniqueLookupPreset, - PostGraphileConnectionFilterPreset, + ConnectionFilterPreset(), EnableAllFilterColumnsPreset, ManyToManyOptInPreset, MetaSchemaPreset, @@ -91,54 +91,19 @@ export const ConstructivePreset: GraphileConfig.Preset = { SqlExpressionValidatorPreset(), PgTypeMappingsPreset, ], - /** - * Disable relation filter plugins from postgraphile-plugin-connection-filter. - * - * WHY THIS EXISTS: - * The connection filter plugin includes PgConnectionArgFilterBackwardRelationsPlugin and - * PgConnectionArgFilterForwardRelationsPlugin which add relation filter fields like - * `apiExtensions`, `apiExtensionsExist`, `database`, `domains`, etc. to every filter type. - * - * The `connectionFilterRelations: false` schema option does NOT work - it's defined in the - * plugin's TypeScript types but the actual code always includes the plugins regardless. - * See: https://github.com/graphile-contrib/postgraphile-plugin-connection-filter/blob/master/src/index.ts - * The comments `//if (connectionFilterRelations)` are just comments, not actual conditional logic. - * - * The entityBehavior approach (setting `pgCodecRelation: '-filterBy'`) also doesn't work - * because the behavior system doesn't properly negate the plugin's default `filterBy` behavior. - * - * OUR FIX: - * We use `disablePlugins` to directly disable the two relation filter plugins. - * This is the most reliable way to prevent relation filter fields from being generated. - */ - disablePlugins: [ - 'PgConnectionArgFilterBackwardRelationsPlugin', - 'PgConnectionArgFilterForwardRelationsPlugin', - ], /** * Connection Filter Plugin Configuration * * These options control what fields appear in the `filter` argument on connections. - * We disable relation filters to keep the API surface clean and match our v4 behavior. + * Our v5-native graphile-connection-filter plugin does NOT include relation filter plugins, + * so no `disablePlugins` hack is needed (unlike the upstream postgraphile-plugin-connection-filter). * * NOTE: By default, PostGraphile v5 only allows filtering on INDEXED columns. * We override this with EnableAllFilterColumnsPreset to allow filtering on ALL columns. * This gives developers flexibility but requires monitoring for slow queries on - * non-indexed columns. See the plugin documentation for performance considerations. - * - * NOTE: Relation filtering is disabled via `disablePlugins` above. - * - * Documentation: https://github.com/graphile-contrib/postgraphile-plugin-connection-filter + * non-indexed columns. */ schema: { - /** - * connectionFilterRelations: false - * This option is defined in the plugin's types but does NOT actually work. - * The relation filter plugins are disabled via `disablePlugins` above. - * We keep this option set to false for documentation purposes. - */ - connectionFilterRelations: false, - /** * connectionFilterComputedColumns: false * Disables filtering on computed columns (functions that return a value for a row). diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index efe3dee61..34ce662c4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -199,6 +199,38 @@ importers: version: 10.9.2(@types/node@25.3.3)(typescript@5.9.3) publishDirectory: dist + graphile/graphile-connection-filter: + dependencies: + '@dataplan/pg': + specifier: 1.0.0-rc.5 + version: 1.0.0-rc.5(@dataplan/json@1.0.0-rc.5(grafast@1.0.0-rc.7(graphql@16.13.0)))(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0)(pg-sql2@5.0.0-rc.4)(pg@8.19.0) + graphile-build: + specifier: 5.0.0-rc.4 + version: 5.0.0-rc.4(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0) + graphile-build-pg: + specifier: 5.0.0-rc.5 + version: 5.0.0-rc.5(@dataplan/pg@1.0.0-rc.5(@dataplan/json@1.0.0-rc.5(grafast@1.0.0-rc.7(graphql@16.13.0)))(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0)(pg-sql2@5.0.0-rc.4)(pg@8.19.0))(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-build@5.0.0-rc.4(grafast@1.0.0-rc.7(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0))(graphile-config@1.0.0-rc.5)(graphql@16.13.0)(pg-sql2@5.0.0-rc.4)(pg@8.19.0)(tamedevil@0.1.0-rc.4) + graphile-config: + specifier: 1.0.0-rc.5 + version: 1.0.0-rc.5 + graphql: + specifier: 16.13.0 + version: 16.13.0 + pg-sql2: + specifier: 5.0.0-rc.4 + version: 5.0.0-rc.4 + postgraphile: + specifier: 5.0.0-rc.7 + version: 5.0.0-rc.7(853bfb5f6928535d2602be94c7020fe8) + devDependencies: + '@types/node': + specifier: ^22.19.11 + version: 22.19.11 + makage: + specifier: ^0.1.10 + version: 0.1.12 + publishDirectory: dist + graphile/graphile-misc-plugins: dependencies: '@graphile-contrib/pg-many-to-many': @@ -583,6 +615,9 @@ importers: graphile-config: specifier: 1.0.0-rc.5 version: 1.0.0-rc.5 + graphile-connection-filter: + specifier: workspace:^ + version: link:../graphile-connection-filter/dist graphile-misc-plugins: specifier: workspace:^ version: link:../graphile-misc-plugins/dist @@ -625,9 +660,6 @@ importers: postgraphile: specifier: 5.0.0-rc.7 version: 5.0.0-rc.7(56415cfaef0e792e7fc3250b8cf6023f) - postgraphile-plugin-connection-filter: - specifier: 3.0.0-rc.1 - version: 3.0.0-rc.1 request-ip: specifier: ^3.3.0 version: 3.3.0 From eac02082d64f8bf10f65bdf892e3983ca7bff7e1 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Thu, 12 Mar 2026 06:00:39 +0000 Subject: [PATCH 02/19] fix: use filterFieldType instead of filterType in addConnectionFilterOperator filterType is for table-level filter types (UserFilter), while filterFieldType is for scalar operator types (StringFilter). Satellite plugins pass scalar type names, so the lookup must use filterFieldType to match the registration in ConnectionFilterTypesPlugin. Previously worked by coincidence since both inflections produce the same output, but would silently fail if a consumer overrode one inflection but not the other. --- .../src/plugins/ConnectionFilterCustomOperatorsPlugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphile/graphile-connection-filter/src/plugins/ConnectionFilterCustomOperatorsPlugin.ts b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterCustomOperatorsPlugin.ts index 15176604b..a578db7dd 100644 --- a/graphile/graphile-connection-filter/src/plugins/ConnectionFilterCustomOperatorsPlugin.ts +++ b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterCustomOperatorsPlugin.ts @@ -57,7 +57,7 @@ export const ConnectionFilterCustomOperatorsPlugin: GraphileConfig.Plugin = { : [typeNameOrNames]; for (const typeName of typeNames) { - const filterTypeName = inflection.filterType(typeName); + const filterTypeName = inflection.filterFieldType(typeName); let operatorSpecByFilterName = build[$$filters].get(filterTypeName); if (!operatorSpecByFilterName) { operatorSpecByFilterName = new Map(); From b1ca75d65fd4dc2d201f57ad48e47e1ac95fb203 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Thu, 12 Mar 2026 06:11:39 +0000 Subject: [PATCH 03/19] feat: add ConnectionFilterComputedAttributesPlugin for feature parity MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds computed column filter support — allows filtering on PostgreSQL functions that take a table row as their first argument and return a scalar. Controlled by connectionFilterComputedColumns schema option. The preset factory includes the plugin only when the option is truthy (default in preset: true, but constructive-preset sets it to false). --- .../src/augmentations.ts | 1 + .../graphile-connection-filter/src/index.ts | 1 + ...onnectionFilterComputedAttributesPlugin.ts | 210 ++++++++++++++++++ .../src/plugins/index.ts | 1 + .../graphile-connection-filter/src/preset.ts | 6 + 5 files changed, 219 insertions(+) create mode 100644 graphile/graphile-connection-filter/src/plugins/ConnectionFilterComputedAttributesPlugin.ts diff --git a/graphile/graphile-connection-filter/src/augmentations.ts b/graphile/graphile-connection-filter/src/augmentations.ts index 2071d506b..cb2f550a4 100644 --- a/graphile/graphile-connection-filter/src/augmentations.ts +++ b/graphile/graphile-connection-filter/src/augmentations.ts @@ -83,6 +83,7 @@ declare global { ConnectionFilterOperatorsPlugin: true; ConnectionFilterCustomOperatorsPlugin: true; ConnectionFilterLogicalOperatorsPlugin: true; + ConnectionFilterComputedAttributesPlugin: true; } } } diff --git a/graphile/graphile-connection-filter/src/index.ts b/graphile/graphile-connection-filter/src/index.ts index 27b52091d..b479e689d 100644 --- a/graphile/graphile-connection-filter/src/index.ts +++ b/graphile/graphile-connection-filter/src/index.ts @@ -39,6 +39,7 @@ export { ConnectionFilterOperatorsPlugin, ConnectionFilterCustomOperatorsPlugin, ConnectionFilterLogicalOperatorsPlugin, + ConnectionFilterComputedAttributesPlugin, makeApplyFromOperatorSpec, } from './plugins'; diff --git a/graphile/graphile-connection-filter/src/plugins/ConnectionFilterComputedAttributesPlugin.ts b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterComputedAttributesPlugin.ts new file mode 100644 index 000000000..45f869ecf --- /dev/null +++ b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterComputedAttributesPlugin.ts @@ -0,0 +1,210 @@ +import '../augmentations'; +import type { GraphileConfig } from 'graphile-config'; +import { + isComputedScalarAttributeResource, + getComputedAttributeResources, +} from '../utils'; + +const version = '1.0.0'; + +/** + * ConnectionFilterComputedAttributesPlugin + * + * Adds filter fields for computed columns (PostgreSQL functions that take + * a table row as their first argument and return a scalar). + * + * For example, given: + * CREATE FUNCTION person_full_name(person) RETURNS text AS $$ ... $$; + * + * This plugin adds a `fullName` filter field to `PersonFilter`, typed as `StringFilter`, + * allowing queries like: + * { people(filter: { fullName: { startsWith: "John" } }) { ... } } + * + * Controlled by the `connectionFilterComputedColumns` schema option (default: true). + * Requires the `filterBy` behavior on the pgResource to be enabled. + */ +export const ConnectionFilterComputedAttributesPlugin: GraphileConfig.Plugin = { + name: 'ConnectionFilterComputedAttributesPlugin', + version, + description: + 'Adds filter fields for computed column functions (scalar-returning functions that take a table row)', + + schema: { + behaviorRegistry: { + add: { + filterBy: { + description: + 'Whether a computed attribute resource should be available as a filter field', + entities: ['pgResource'], + }, + }, + }, + + entityBehavior: { + pgResource: { + inferred(behavior, entity, build) { + if ( + build.options.connectionFilterComputedColumns && + isComputedScalarAttributeResource(entity) + ) { + return [behavior, 'filterBy']; + } + return behavior; + }, + }, + }, + + hooks: { + GraphQLInputObjectType_fields(inFields, build, context) { + let fields = inFields; + + const { + inflection, + connectionFilterOperatorsDigest, + dataplanPg: { TYPES, PgCondition }, + EXPORTABLE, + } = build; + + const { + fieldWithHooks, + scope: { pgCodec: codec, isPgConnectionFilter }, + } = context; + + // Only apply to table-level filter types (e.g. UserFilter) + if ( + !isPgConnectionFilter || + !codec || + !(codec as any).attributes || + (codec as any).isAnonymous + ) { + return fields; + } + + // Find the source resource for this codec + const source = Object.values( + build.input.pgRegistry.pgResources + ).find( + (s: any) => + s.codec === codec && !s.parameters && !s.isUnique + ); + if (!source) { + return fields; + } + + const computedAttributeResources = getComputedAttributeResources( + build, + source + ); + + for (const computedAttributeResource of computedAttributeResources) { + // Must return a scalar or an array (not a composite) + if (!computedAttributeResource.isUnique) { + continue; + } + if (computedAttributeResource.codec.attributes) { + continue; + } + if (computedAttributeResource.codec === TYPES.void) { + continue; + } + + // Get the operator type for this codec + const digest = connectionFilterOperatorsDigest( + computedAttributeResource.codec + ); + if (!digest) { + continue; + } + + const OperatorsType = build.getTypeByName( + digest.operatorsTypeName + ); + if (!OperatorsType) { + continue; + } + + // Check behavior + if ( + !build.behavior.pgResourceMatches( + computedAttributeResource, + 'filterBy' + ) + ) { + continue; + } + + // Must have no required arguments beyond the first (the table row) + const { argDetails } = build.pgGetArgDetailsFromParameters( + computedAttributeResource, + computedAttributeResource.parameters.slice(1) + ); + if (argDetails.some((a: any) => a.required)) { + continue; + } + + // Derive the field name from the computed attribute function + const fieldName = inflection.computedAttributeField({ + resource: computedAttributeResource, + }); + + const functionResultCodec = computedAttributeResource.codec; + + fields = build.extend( + fields, + { + [fieldName]: fieldWithHooks( + { + fieldName, + isPgConnectionFilterField: true, + }, + { + description: `Filter by the object's \`${fieldName}\` field.`, + type: OperatorsType, + apply: EXPORTABLE( + ( + PgCondition: any, + computedAttributeResource: any, + fieldName: string, + functionResultCodec: any + ) => + function ($where: any, value: any) { + if ( + typeof computedAttributeResource.from !== + 'function' + ) { + throw new Error(`Unexpected...`); + } + if (value == null) return; + + const expression = + computedAttributeResource.from({ + placeholder: $where.alias, + }); + + const $col = new PgCondition($where); + $col.extensions.pgFilterAttribute = { + fieldName, + codec: functionResultCodec, + expression, + }; + return $col; + }, + [ + PgCondition, + computedAttributeResource, + fieldName, + functionResultCodec, + ] + ), + } + ), + }, + '' + ); + } + + return fields; + }, + }, + }, +}; diff --git a/graphile/graphile-connection-filter/src/plugins/index.ts b/graphile/graphile-connection-filter/src/plugins/index.ts index 3356cbb6a..487515552 100644 --- a/graphile/graphile-connection-filter/src/plugins/index.ts +++ b/graphile/graphile-connection-filter/src/plugins/index.ts @@ -5,4 +5,5 @@ export { ConnectionFilterAttributesPlugin } from './ConnectionFilterAttributesPl export { ConnectionFilterOperatorsPlugin } from './ConnectionFilterOperatorsPlugin'; export { ConnectionFilterCustomOperatorsPlugin } from './ConnectionFilterCustomOperatorsPlugin'; export { ConnectionFilterLogicalOperatorsPlugin } from './ConnectionFilterLogicalOperatorsPlugin'; +export { ConnectionFilterComputedAttributesPlugin } from './ConnectionFilterComputedAttributesPlugin'; export { makeApplyFromOperatorSpec } from './operatorApply'; diff --git a/graphile/graphile-connection-filter/src/preset.ts b/graphile/graphile-connection-filter/src/preset.ts index 945ab3844..5f337996a 100644 --- a/graphile/graphile-connection-filter/src/preset.ts +++ b/graphile/graphile-connection-filter/src/preset.ts @@ -32,6 +32,7 @@ import { ConnectionFilterOperatorsPlugin, ConnectionFilterCustomOperatorsPlugin, ConnectionFilterLogicalOperatorsPlugin, + ConnectionFilterComputedAttributesPlugin, } from './plugins'; /** @@ -74,6 +75,11 @@ export function ConnectionFilterPreset( plugins.push(ConnectionFilterLogicalOperatorsPlugin); } + // Computed columns are opt-in (disabled by default) + if (mergedOptions.connectionFilterComputedColumns) { + plugins.push(ConnectionFilterComputedAttributesPlugin); + } + return { plugins, schema: mergedOptions, From ac3d6417f917f7cc28da505d82078fb80c92e365 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Thu, 12 Mar 2026 06:18:55 +0000 Subject: [PATCH 04/19] refactor: clean up satellite plugin dependencies on connection filter - Remove phantom postgraphile-plugin-connection-filter dep from graphile-pgvector-plugin (never used) - Remove phantom postgraphile-plugin-connection-filter dep from graphile-pg-textsearch-plugin (never used) - Update graphile-plugin-connection-filter-postgis to use graphile-connection-filter workspace dep with typed imports - Update graphile-search-plugin to use graphile-connection-filter workspace dep with typed imports - Replace (build as any).addConnectionFilterOperator casts with properly typed build.addConnectionFilterOperator --- .../graphile-pg-textsearch-plugin/package.json | 8 +------- graphile/graphile-pgvector-plugin/package.json | 8 +------- .../package.json | 8 ++------ .../src/plugin.ts | 13 +++++++------ graphile/graphile-search-plugin/package.json | 7 +++---- graphile/graphile-search-plugin/src/plugin.ts | 9 ++++----- pnpm-lock.yaml | 18 ++++++------------ 7 files changed, 24 insertions(+), 47 deletions(-) diff --git a/graphile/graphile-pg-textsearch-plugin/package.json b/graphile/graphile-pg-textsearch-plugin/package.json index e4b1f2e7b..ce508be13 100644 --- a/graphile/graphile-pg-textsearch-plugin/package.json +++ b/graphile/graphile-pg-textsearch-plugin/package.json @@ -43,13 +43,7 @@ "graphile-config": "1.0.0-rc.5", "graphql": "^16.9.0", "pg-sql2": "5.0.0-rc.4", - "postgraphile": "5.0.0-rc.7", - "postgraphile-plugin-connection-filter": "3.0.0-rc.1" - }, - "peerDependenciesMeta": { - "postgraphile-plugin-connection-filter": { - "optional": true - } + "postgraphile": "5.0.0-rc.7" }, "keywords": [ "postgraphile", diff --git a/graphile/graphile-pgvector-plugin/package.json b/graphile/graphile-pgvector-plugin/package.json index fb600092c..5cc357e68 100644 --- a/graphile/graphile-pgvector-plugin/package.json +++ b/graphile/graphile-pgvector-plugin/package.json @@ -43,13 +43,7 @@ "graphile-config": "1.0.0-rc.5", "graphql": "^16.9.0", "pg-sql2": "5.0.0-rc.4", - "postgraphile": "5.0.0-rc.7", - "postgraphile-plugin-connection-filter": "3.0.0-rc.1" - }, - "peerDependenciesMeta": { - "postgraphile-plugin-connection-filter": { - "optional": true - } + "postgraphile": "5.0.0-rc.7" }, "keywords": [ "postgraphile", diff --git a/graphile/graphile-plugin-connection-filter-postgis/package.json b/graphile/graphile-plugin-connection-filter-postgis/package.json index 96fe43256..bf8f80f61 100644 --- a/graphile/graphile-plugin-connection-filter-postgis/package.json +++ b/graphile/graphile-plugin-connection-filter-postgis/package.json @@ -35,12 +35,9 @@ "graphql": "^16.9.0", "pg-sql2": "5.0.0-rc.4", "postgraphile": "5.0.0-rc.7", - "postgraphile-plugin-connection-filter": "3.0.0-rc.1" + "graphile-connection-filter": "workspace:^" }, "peerDependenciesMeta": { - "postgraphile-plugin-connection-filter": { - "optional": false - }, "graphile-postgis": { "optional": false } @@ -49,8 +46,7 @@ "@types/node": "^22.19.11", "graphile-postgis": "workspace:^", "graphile-test": "workspace:^", - "makage": "^0.1.10", - "postgraphile-plugin-connection-filter": "3.0.0-rc.1" + "makage": "^0.1.10" }, "keywords": [ "postgraphile", diff --git a/graphile/graphile-plugin-connection-filter-postgis/src/plugin.ts b/graphile/graphile-plugin-connection-filter-postgis/src/plugin.ts index 74e552023..076d625da 100644 --- a/graphile/graphile-plugin-connection-filter-postgis/src/plugin.ts +++ b/graphile/graphile-plugin-connection-filter-postgis/src/plugin.ts @@ -1,4 +1,6 @@ import 'graphile-build'; +import 'graphile-connection-filter'; +import type { ConnectionFilterOperatorSpec } from 'graphile-connection-filter'; import type { GraphileConfig } from 'graphile-config'; import sql from 'pg-sql2'; import type { SQL } from 'pg-sql2'; @@ -30,7 +32,7 @@ const ALLOWED_SQL_OPERATORS = new Set([ * - ST_ function-based operators (contains, intersects, within, etc.) * - SQL operator-based operators (&&, =, ~, etc. for bounding box ops) * - * Requires graphile-postgis and postgraphile-plugin-connection-filter to be loaded. + * Requires graphile-postgis and graphile-connection-filter to be loaded. */ export const PgConnectionArgFilterPostgisOperatorsPlugin: GraphileConfig.Plugin = { name: 'PgConnectionArgFilterPostgisOperatorsPlugin', @@ -51,8 +53,7 @@ export const PgConnectionArgFilterPostgisOperatorsPlugin: GraphileConfig.Plugin return _; } - const addConnectionFilterOperator = (build as any).addConnectionFilterOperator; - if (typeof addConnectionFilterOperator !== 'function') { + if (typeof build.addConnectionFilterOperator !== 'function') { return _; } @@ -293,9 +294,9 @@ export const PgConnectionArgFilterPostgisOperatorsPlugin: GraphileConfig.Plugin // Register each operator with the connection filter plugin for (const spec of allSpecs) { for (const typeName of spec.typeNames) { - addConnectionFilterOperator(typeName, spec.operatorName, { + build.addConnectionFilterOperator(typeName, spec.operatorName, { description: spec.description, - resolveType: (fieldType: any) => fieldType, + resolveType: (fieldType) => fieldType, resolve( sqlIdentifier: SQL, sqlValue: SQL, @@ -305,7 +306,7 @@ export const PgConnectionArgFilterPostgisOperatorsPlugin: GraphileConfig.Plugin ) { return spec.resolve(sqlIdentifier, sqlValue); } - }); + } satisfies ConnectionFilterOperatorSpec); } } diff --git a/graphile/graphile-search-plugin/package.json b/graphile/graphile-search-plugin/package.json index 9cf59484f..836286ca6 100644 --- a/graphile/graphile-search-plugin/package.json +++ b/graphile/graphile-search-plugin/package.json @@ -44,8 +44,7 @@ "@types/node": "^22.19.11", "graphile-test": "workspace:^", "makage": "^0.1.10", - "pgsql-test": "workspace:^", - "postgraphile-plugin-connection-filter": "3.0.0-rc.1" + "pgsql-test": "workspace:^" }, "peerDependencies": { "@dataplan/pg": "1.0.0-rc.5", @@ -55,10 +54,10 @@ "graphql": "^16.9.0", "pg-sql2": "5.0.0-rc.4", "postgraphile": "5.0.0-rc.7", - "postgraphile-plugin-connection-filter": "3.0.0-rc.1" + "graphile-connection-filter": "workspace:^" }, "peerDependenciesMeta": { - "postgraphile-plugin-connection-filter": { + "graphile-connection-filter": { "optional": true } } diff --git a/graphile/graphile-search-plugin/src/plugin.ts b/graphile/graphile-search-plugin/src/plugin.ts index ed34c0f4d..0c7af7411 100644 --- a/graphile/graphile-search-plugin/src/plugin.ts +++ b/graphile/graphile-search-plugin/src/plugin.ts @@ -33,6 +33,7 @@ import 'graphile-build'; import 'graphile-build-pg'; +import 'graphile-connection-filter'; import { TYPES } from '@dataplan/pg'; import type { PgCodecWithAttributes, PgResource } from '@dataplan/pg'; import type { GraphileConfig } from 'graphile-config'; @@ -271,12 +272,10 @@ export function createPgSearchPlugin( } = build; // Register the `matches` filter operator for the FullText scalar. - // Requires postgraphile-plugin-connection-filter; skip if not loaded. - const addConnectionFilterOperator = (build as any) - .addConnectionFilterOperator; - if (typeof addConnectionFilterOperator === 'function') { + // Requires graphile-connection-filter; skip if not loaded. + if (typeof build.addConnectionFilterOperator === 'function') { const TYPES = (build as any).dataplanPg?.TYPES; - addConnectionFilterOperator(fullTextScalarName, 'matches', { + build.addConnectionFilterOperator(fullTextScalarName, 'matches', { description: 'Performs a full text search on the field.', resolveType: () => GraphQLString, resolveInputCodec: TYPES ? () => TYPES.text : undefined, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 34ce662c4..21a5c9333 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -304,9 +304,6 @@ importers: postgraphile: specifier: 5.0.0-rc.7 version: 5.0.0-rc.7(853bfb5f6928535d2602be94c7020fe8) - postgraphile-plugin-connection-filter: - specifier: 3.0.0-rc.1 - version: 3.0.0-rc.1 devDependencies: '@types/node': specifier: ^22.19.11 @@ -351,9 +348,6 @@ importers: postgraphile: specifier: 5.0.0-rc.7 version: 5.0.0-rc.7(853bfb5f6928535d2602be94c7020fe8) - postgraphile-plugin-connection-filter: - specifier: 3.0.0-rc.1 - version: 3.0.0-rc.1 devDependencies: '@types/node': specifier: ^22.19.11 @@ -383,6 +377,9 @@ importers: graphile-config: specifier: 1.0.0-rc.5 version: 1.0.0-rc.5 + graphile-connection-filter: + specifier: workspace:^ + version: link:../graphile-connection-filter/dist graphql: specifier: 16.13.0 version: 16.13.0 @@ -405,9 +402,6 @@ importers: makage: specifier: ^0.1.10 version: 0.1.12 - postgraphile-plugin-connection-filter: - specifier: 3.0.0-rc.1 - version: 3.0.0-rc.1 publishDirectory: dist graphile/graphile-postgis: @@ -538,6 +532,9 @@ importers: graphile-config: specifier: 1.0.0-rc.5 version: 1.0.0-rc.5 + graphile-connection-filter: + specifier: workspace:^ + version: link:../graphile-connection-filter/dist graphql: specifier: 16.13.0 version: 16.13.0 @@ -560,9 +557,6 @@ importers: pgsql-test: specifier: workspace:^ version: link:../../postgres/pgsql-test/dist - postgraphile-plugin-connection-filter: - specifier: 3.0.0-rc.1 - version: 3.0.0-rc.1 publishDirectory: dist graphile/graphile-settings: From b2e07e9d972e76ce442ee01c223f48d777124d24 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Thu, 12 Mar 2026 06:31:40 +0000 Subject: [PATCH 05/19] fix: update test imports and description quotes for graphile-connection-filter - Update search plugin, pgvector, and postgis test files to import from graphile-connection-filter instead of postgraphile-plugin-connection-filter - Use ConnectionFilterPreset() factory instead of PostGraphileConnectionFilterPreset - Import ConnectionFilterOperatorSpec type from graphile-connection-filter - Fix smart quote characters in filter descriptions to match existing snapshots --- .../src/plugins/ConnectionFilterAttributesPlugin.ts | 2 +- .../plugins/ConnectionFilterComputedAttributesPlugin.ts | 2 +- .../src/plugins/ConnectionFilterTypesPlugin.ts | 4 ++-- .../src/__tests__/vector-search.test.ts | 4 ++-- .../__tests__/integration.test.ts | 2 +- graphile/graphile-search-plugin/__tests__/filter.test.ts | 8 ++++---- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/graphile/graphile-connection-filter/src/plugins/ConnectionFilterAttributesPlugin.ts b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterAttributesPlugin.ts index cedcbdf7f..861af9a0f 100644 --- a/graphile/graphile-connection-filter/src/plugins/ConnectionFilterAttributesPlugin.ts +++ b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterAttributesPlugin.ts @@ -81,7 +81,7 @@ export const ConnectionFilterAttributesPlugin: GraphileConfig.Plugin = { isPgConnectionFilterField: true, }, () => ({ - description: `Filter by the object's \`${fieldName}\` field.`, + description: `Filter by the object\u2019s \`${fieldName}\` field.`, type: OperatorsType, apply: EXPORTABLE( ( diff --git a/graphile/graphile-connection-filter/src/plugins/ConnectionFilterComputedAttributesPlugin.ts b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterComputedAttributesPlugin.ts index 45f869ecf..ce0c6c7b5 100644 --- a/graphile/graphile-connection-filter/src/plugins/ConnectionFilterComputedAttributesPlugin.ts +++ b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterComputedAttributesPlugin.ts @@ -158,7 +158,7 @@ export const ConnectionFilterComputedAttributesPlugin: GraphileConfig.Plugin = { isPgConnectionFilterField: true, }, { - description: `Filter by the object's \`${fieldName}\` field.`, + description: `Filter by the object\u2019s \`${fieldName}\` field.`, type: OperatorsType, apply: EXPORTABLE( ( diff --git a/graphile/graphile-connection-filter/src/plugins/ConnectionFilterTypesPlugin.ts b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterTypesPlugin.ts index 50962de25..1ab2d1a0b 100644 --- a/graphile/graphile-connection-filter/src/plugins/ConnectionFilterTypesPlugin.ts +++ b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterTypesPlugin.ts @@ -228,7 +228,7 @@ export const ConnectionFilterTypesPlugin: GraphileConfig.Plugin = { isPgConnectionFilter: true, }, () => ({ - description: `A filter to be used against \`${nodeTypeName}\` object types. All fields are combined with a logical 'and.'`, + description: `A filter to be used against \`${nodeTypeName}\` object types. All fields are combined with a logical \u2018and.\u2019`, }), 'ConnectionFilterTypesPlugin' ); @@ -324,7 +324,7 @@ export const ConnectionFilterTypesPlugin: GraphileConfig.Plugin = { name: operatorsTypeName, description: `A filter to be used against ${relatedTypeName}${ isList ? ' List' : '' - } fields. All fields are combined with a logical 'and.'`, + } fields. All fields are combined with a logical \u2018and.\u2019`, }), 'ConnectionFilterTypesPlugin' ); diff --git a/graphile/graphile-pgvector-plugin/src/__tests__/vector-search.test.ts b/graphile/graphile-pgvector-plugin/src/__tests__/vector-search.test.ts index 07252a5ac..07af85ae7 100644 --- a/graphile/graphile-pgvector-plugin/src/__tests__/vector-search.test.ts +++ b/graphile/graphile-pgvector-plugin/src/__tests__/vector-search.test.ts @@ -2,7 +2,7 @@ import { join } from 'path'; import { getConnections, seed } from 'graphile-test'; import type { GraphQLResponse } from 'graphile-test'; import type { PgTestClient } from 'pgsql-test'; -import { PostGraphileConnectionFilterPreset } from 'postgraphile-plugin-connection-filter'; +import { ConnectionFilterPreset } from 'graphile-connection-filter'; import { VectorCodecPreset } from '../vector-codec'; import { createVectorSearchPlugin } from '../vector-search'; @@ -31,7 +31,7 @@ describe('VectorSearchPlugin', () => { beforeAll(async () => { const testPreset = { extends: [ - PostGraphileConnectionFilterPreset, + ConnectionFilterPreset(), VectorCodecPreset, { plugins: [createVectorSearchPlugin({ defaultMetric: 'COSINE' })], diff --git a/graphile/graphile-plugin-connection-filter-postgis/__tests__/integration.test.ts b/graphile/graphile-plugin-connection-filter-postgis/__tests__/integration.test.ts index 8b41e2a5c..f42267f0b 100644 --- a/graphile/graphile-plugin-connection-filter-postgis/__tests__/integration.test.ts +++ b/graphile/graphile-plugin-connection-filter-postgis/__tests__/integration.test.ts @@ -1,7 +1,7 @@ import sql from 'pg-sql2'; import type { SQL } from 'pg-sql2'; import { CONCRETE_SUBTYPES, GisSubtype } from 'graphile-postgis'; -import type { OperatorSpec } from 'postgraphile-plugin-connection-filter/dist/PgConnectionArgFilterOperatorsPlugin'; +import type { ConnectionFilterOperatorSpec as OperatorSpec } from 'graphile-connection-filter'; import { PgConnectionArgFilterPostgisOperatorsPlugin } from '../src/plugin'; /** diff --git a/graphile/graphile-search-plugin/__tests__/filter.test.ts b/graphile/graphile-search-plugin/__tests__/filter.test.ts index f1c74528f..c85a23f8f 100644 --- a/graphile/graphile-search-plugin/__tests__/filter.test.ts +++ b/graphile/graphile-search-plugin/__tests__/filter.test.ts @@ -1,7 +1,7 @@ import { join } from 'path'; import { getConnectionsObject, seed } from 'graphile-test'; import type { GraphQLQueryFnObj } from 'graphile-test'; -import { PostGraphileConnectionFilterPreset } from 'postgraphile-plugin-connection-filter'; +import { ConnectionFilterPreset } from 'graphile-connection-filter'; import type { GraphileConfig } from 'graphile-config'; import { PgSearchPreset } from '../src'; @@ -37,7 +37,7 @@ describe('PgSearchPlugin filter (matches operator)', () => { beforeAll(async () => { const testPreset = { extends: [ - PostGraphileConnectionFilterPreset, + ConnectionFilterPreset(), PgSearchPreset({ pgSearchPrefix: 'fullText' }), ], plugins: [EnableAllFilterColumnsPlugin], @@ -325,7 +325,7 @@ describe('PgSearchPlugin filter with multiple tsvector columns', () => { beforeAll(async () => { const testPreset = { extends: [ - PostGraphileConnectionFilterPreset, + ConnectionFilterPreset(), PgSearchPreset({ pgSearchPrefix: 'fullText' }), ], plugins: [EnableAllFilterColumnsPlugin], @@ -403,7 +403,7 @@ describe('PgSearchPlugin filter with connectionFilterRelations', () => { beforeAll(async () => { const testPreset = { extends: [ - PostGraphileConnectionFilterPreset, + ConnectionFilterPreset(), PgSearchPreset({ pgSearchPrefix: 'fullText' }), ], plugins: [EnableAllFilterColumnsPlugin], From 5744b8b49c7805c943db6ed89d8195b621d9a526 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Thu, 12 Mar 2026 06:40:14 +0000 Subject: [PATCH 06/19] fix: add graphile-connection-filter devDep to pgvector and skip relation filter tests - Add graphile-connection-filter as devDependency in graphile-pgvector-plugin (test file imports ConnectionFilterPreset but package had no dependency) - Skip connectionFilterRelations tests in search plugin (relation filters are intentionally not included in the v5-native plugin; they were disabled in production via disablePlugins with the old plugin) --- .../graphile-pgvector-plugin/package.json | 1 + .../__tests__/filter.test.ts | 6 +- pnpm-lock.yaml | 9899 +++++------------ 3 files changed, 2557 insertions(+), 7349 deletions(-) diff --git a/graphile/graphile-pgvector-plugin/package.json b/graphile/graphile-pgvector-plugin/package.json index 0eb572732..f43d255c2 100644 --- a/graphile/graphile-pgvector-plugin/package.json +++ b/graphile/graphile-pgvector-plugin/package.json @@ -31,6 +31,7 @@ "devDependencies": { "@types/node": "^22.19.11", "@types/pg": "^8.18.0", + "graphile-connection-filter": "workspace:^", "graphile-test": "workspace:^", "makage": "^0.1.10", "pg": "^8.19.0", diff --git a/graphile/graphile-search-plugin/__tests__/filter.test.ts b/graphile/graphile-search-plugin/__tests__/filter.test.ts index c85a23f8f..e758f591e 100644 --- a/graphile/graphile-search-plugin/__tests__/filter.test.ts +++ b/graphile/graphile-search-plugin/__tests__/filter.test.ts @@ -396,7 +396,11 @@ describe('PgSearchPlugin filter with multiple tsvector columns', () => { }); }); -describe('PgSearchPlugin filter with connectionFilterRelations', () => { +// Skipped: these tests require relation filter plugins (e.g. clientByClientId) +// which are not included in the v5-native graphile-connection-filter plugin. +// Relation filters were disabled in production (via disablePlugins) with the old plugin. +// Re-enable these tests if/when relation filter support is added. +describe.skip('PgSearchPlugin filter with connectionFilterRelations', () => { let teardown: () => Promise; let query: QueryFn; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6aa1db789..58d121a4b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,7 @@ overrides: packageExtensionsChecksum: sha256-x8B4zkJ4KLRX+yspUWxuggXWlz6zrBLSIh72pNhpPiE= importers: + .: devDependencies: '@jest/test-sequencer': @@ -354,6 +355,9 @@ importers: '@types/pg': specifier: ^8.18.0 version: 8.18.0 + graphile-connection-filter: + specifier: workspace:^ + version: link:../graphile-connection-filter/dist graphile-test: specifier: workspace:^ version: link:../graphile-test/dist @@ -2734,11 +2738,9 @@ importers: publishDirectory: dist packages: + '@0no-co/graphql.web@1.2.0': - resolution: - { - integrity: sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==, - } + resolution: {integrity: sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==} peerDependencies: graphql: 16.13.0 peerDependenciesMeta: @@ -2746,273 +2748,156 @@ packages: optional: true '@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.1001.0': - resolution: - { - integrity: sha512-uKgFjQuBjMcd0iigLQwnqIp9gOy/5TGBxa42rcb6l5byDt1mrwOe6fyWTEUEJaNHG2LKYSPUibteGvM1zfm0Rw==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-uKgFjQuBjMcd0iigLQwnqIp9gOy/5TGBxa42rcb6l5byDt1mrwOe6fyWTEUEJaNHG2LKYSPUibteGvM1zfm0Rw==} + engines: {node: '>=20.0.0'} '@aws-sdk/core@3.973.16': - resolution: - { - integrity: sha512-Nasoyb5K4jfvncTKQyA13q55xHoz9as01NVYP05B0Kzux/X5UhMn3qXsZDyWOSXkfSCAIrMBKmVVWbI0vUapdQ==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-Nasoyb5K4jfvncTKQyA13q55xHoz9as01NVYP05B0Kzux/X5UhMn3qXsZDyWOSXkfSCAIrMBKmVVWbI0vUapdQ==} + engines: {node: '>=20.0.0'} '@aws-sdk/crc64-nvme@3.972.3': - resolution: - { - integrity: sha512-UExeK+EFiq5LAcbHm96CQLSia+5pvpUVSAsVApscBzayb7/6dJBJKwV4/onsk4VbWSmqxDMcfuTD+pC4RxgZHg==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-UExeK+EFiq5LAcbHm96CQLSia+5pvpUVSAsVApscBzayb7/6dJBJKwV4/onsk4VbWSmqxDMcfuTD+pC4RxgZHg==} + engines: {node: '>=20.0.0'} '@aws-sdk/credential-provider-env@3.972.14': - resolution: - { - integrity: sha512-PvnBY9rwBuLh9MEsAng28DG+WKl+txerKgf4BU9IPAqYI7FBIo1x6q/utLf4KLyQYgSy1TLQnbQuXx5xfBGASg==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-PvnBY9rwBuLh9MEsAng28DG+WKl+txerKgf4BU9IPAqYI7FBIo1x6q/utLf4KLyQYgSy1TLQnbQuXx5xfBGASg==} + engines: {node: '>=20.0.0'} '@aws-sdk/credential-provider-http@3.972.16': - resolution: - { - integrity: sha512-m/QAcvw5OahqGPjeAnKtgfWgjLxeWOYj7JSmxKK6PLyKp2S/t2TAHI6EELEzXnIz28RMgbQLukJkVAqPASVAGQ==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-m/QAcvw5OahqGPjeAnKtgfWgjLxeWOYj7JSmxKK6PLyKp2S/t2TAHI6EELEzXnIz28RMgbQLukJkVAqPASVAGQ==} + engines: {node: '>=20.0.0'} '@aws-sdk/credential-provider-ini@3.972.14': - resolution: - { - integrity: sha512-EGA7ufqNpZKZcD0RwM6gRDEQgwAf19wQ99R1ptdWYDJAnpcMcWiFyT0RIrgiZFLD28CwJmYjnra75hChnEveWA==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-EGA7ufqNpZKZcD0RwM6gRDEQgwAf19wQ99R1ptdWYDJAnpcMcWiFyT0RIrgiZFLD28CwJmYjnra75hChnEveWA==} + engines: {node: '>=20.0.0'} '@aws-sdk/credential-provider-login@3.972.14': - resolution: - { - integrity: sha512-P2kujQHAoV7irCTv6EGyReKFofkHCjIK+F0ZYf5UxeLeecrCwtrDkHoO2Vjsv/eRUumaKblD8czuk3CLlzwGDw==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-P2kujQHAoV7irCTv6EGyReKFofkHCjIK+F0ZYf5UxeLeecrCwtrDkHoO2Vjsv/eRUumaKblD8czuk3CLlzwGDw==} + engines: {node: '>=20.0.0'} '@aws-sdk/credential-provider-node@3.972.15': - resolution: - { - integrity: sha512-59NBJgTcQ2FC94T+SWkN5UQgViFtrLnkswSKhG5xbjPAotOXnkEF2Bf0bfUV1F3VaXzqAPZJoZ3bpg4rr8XD5Q==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-59NBJgTcQ2FC94T+SWkN5UQgViFtrLnkswSKhG5xbjPAotOXnkEF2Bf0bfUV1F3VaXzqAPZJoZ3bpg4rr8XD5Q==} + engines: {node: '>=20.0.0'} '@aws-sdk/credential-provider-process@3.972.14': - resolution: - { - integrity: sha512-KAF5LBkJInUPaR9dJDw8LqmbPDRTLyXyRoWVGcJQ+DcN9rxVKBRzAK+O4dTIvQtQ7xaIDZ2kY7zUmDlz6CCXdw==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-KAF5LBkJInUPaR9dJDw8LqmbPDRTLyXyRoWVGcJQ+DcN9rxVKBRzAK+O4dTIvQtQ7xaIDZ2kY7zUmDlz6CCXdw==} + engines: {node: '>=20.0.0'} '@aws-sdk/credential-provider-sso@3.972.14': - resolution: - { - integrity: sha512-LQzIYrNABnZzkyuIguFa3VVOox9UxPpRW6PL+QYtRHaGl1Ux/+Zi54tAVK31VdeBKPKU3cxqeu8dbOgNqy+naw==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-LQzIYrNABnZzkyuIguFa3VVOox9UxPpRW6PL+QYtRHaGl1Ux/+Zi54tAVK31VdeBKPKU3cxqeu8dbOgNqy+naw==} + engines: {node: '>=20.0.0'} '@aws-sdk/credential-provider-web-identity@3.972.14': - resolution: - { - integrity: sha512-rOwB3vXHHHnGvAOjTgQETxVAsWjgF61XlbGd/ulvYo7EpdXs8cbIHE3PGih9tTj/65ZOegSqZGFqLaKntaI9Kw==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-rOwB3vXHHHnGvAOjTgQETxVAsWjgF61XlbGd/ulvYo7EpdXs8cbIHE3PGih9tTj/65ZOegSqZGFqLaKntaI9Kw==} + engines: {node: '>=20.0.0'} '@aws-sdk/lib-storage@3.1001.0': - resolution: - { - integrity: sha512-h1EO4CKayPb7KqdC8M8aSr/7g8LueCN048WvasFMKxH5wuN5UBa+slE1OHfi/tR+fHILa6K7YUJ6L0Ibg3OdBA==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-h1EO4CKayPb7KqdC8M8aSr/7g8LueCN048WvasFMKxH5wuN5UBa+slE1OHfi/tR+fHILa6K7YUJ6L0Ibg3OdBA==} + engines: {node: '>=20.0.0'} peerDependencies: '@aws-sdk/client-s3': ^3.1001.0 '@aws-sdk/middleware-bucket-endpoint@3.972.6': - resolution: - { - integrity: sha512-3H2bhvb7Cb/S6WFsBy/Dy9q2aegC9JmGH1inO8Lb2sWirSqpLJlZmvQHPE29h2tIxzv6el/14X/tLCQ8BQU6ZQ==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-3H2bhvb7Cb/S6WFsBy/Dy9q2aegC9JmGH1inO8Lb2sWirSqpLJlZmvQHPE29h2tIxzv6el/14X/tLCQ8BQU6ZQ==} + engines: {node: '>=20.0.0'} '@aws-sdk/middleware-expect-continue@3.972.6': - resolution: - { - integrity: sha512-QMdffpU+GkSGC+bz6WdqlclqIeCsOfgX8JFZ5xvwDtX+UTj4mIXm3uXu7Ko6dBseRcJz1FA6T9OmlAAY6JgJUg==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-QMdffpU+GkSGC+bz6WdqlclqIeCsOfgX8JFZ5xvwDtX+UTj4mIXm3uXu7Ko6dBseRcJz1FA6T9OmlAAY6JgJUg==} + engines: {node: '>=20.0.0'} '@aws-sdk/middleware-flexible-checksums@3.973.2': - resolution: - { - integrity: sha512-KM6QujWdasNjRLG+f7YEqEY5D36vR6Govm7nPIwxjILpb5rJ0pPJZpYY1nrzgtlxwJIYAznfBK5YXoLOHKHyfQ==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-KM6QujWdasNjRLG+f7YEqEY5D36vR6Govm7nPIwxjILpb5rJ0pPJZpYY1nrzgtlxwJIYAznfBK5YXoLOHKHyfQ==} + engines: {node: '>=20.0.0'} '@aws-sdk/middleware-host-header@3.972.6': - resolution: - { - integrity: sha512-5XHwjPH1lHB+1q4bfC7T8Z5zZrZXfaLcjSMwTd1HPSPrCmPFMbg3UQ5vgNWcVj0xoX4HWqTGkSf2byrjlnRg5w==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-5XHwjPH1lHB+1q4bfC7T8Z5zZrZXfaLcjSMwTd1HPSPrCmPFMbg3UQ5vgNWcVj0xoX4HWqTGkSf2byrjlnRg5w==} + engines: {node: '>=20.0.0'} '@aws-sdk/middleware-location-constraint@3.972.6': - resolution: - { - integrity: sha512-XdZ2TLwyj3Am6kvUc67vquQvs6+D8npXvXgyEUJAdkUDx5oMFJKOqpK+UpJhVDsEL068WAJl2NEGzbSik7dGJQ==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-XdZ2TLwyj3Am6kvUc67vquQvs6+D8npXvXgyEUJAdkUDx5oMFJKOqpK+UpJhVDsEL068WAJl2NEGzbSik7dGJQ==} + engines: {node: '>=20.0.0'} '@aws-sdk/middleware-logger@3.972.6': - resolution: - { - integrity: sha512-iFnaMFMQdljAPrvsCVKYltPt2j40LQqukAbXvW7v0aL5I+1GO7bZ/W8m12WxW3gwyK5p5u1WlHg8TSAizC5cZw==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-iFnaMFMQdljAPrvsCVKYltPt2j40LQqukAbXvW7v0aL5I+1GO7bZ/W8m12WxW3gwyK5p5u1WlHg8TSAizC5cZw==} + engines: {node: '>=20.0.0'} '@aws-sdk/middleware-recursion-detection@3.972.6': - resolution: - { - integrity: sha512-dY4v3of5EEMvik6+UDwQ96KfUFDk8m1oZDdkSc5lwi4o7rFrjnv0A+yTV+gu230iybQZnKgDLg/rt2P3H+Vscw==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-dY4v3of5EEMvik6+UDwQ96KfUFDk8m1oZDdkSc5lwi4o7rFrjnv0A+yTV+gu230iybQZnKgDLg/rt2P3H+Vscw==} + engines: {node: '>=20.0.0'} '@aws-sdk/middleware-sdk-s3@3.972.16': - resolution: - { - integrity: sha512-U4K1rqyJYvT/zgTI3+rN+MToa51dFnnq1VSsVJuJWPNEKcEnuZVqf7yTpkJJMkYixVW5TTi1dgupd+nmJ0JyWw==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-U4K1rqyJYvT/zgTI3+rN+MToa51dFnnq1VSsVJuJWPNEKcEnuZVqf7yTpkJJMkYixVW5TTi1dgupd+nmJ0JyWw==} + engines: {node: '>=20.0.0'} '@aws-sdk/middleware-ssec@3.972.6': - resolution: - { - integrity: sha512-acvMUX9jF4I2Ew+Z/EA6gfaFaz9ehci5wxBmXCZeulLuv8m+iGf6pY9uKz8TPjg39bdAz3hxoE0eLP8Qz+IYlA==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-acvMUX9jF4I2Ew+Z/EA6gfaFaz9ehci5wxBmXCZeulLuv8m+iGf6pY9uKz8TPjg39bdAz3hxoE0eLP8Qz+IYlA==} + engines: {node: '>=20.0.0'} '@aws-sdk/middleware-user-agent@3.972.16': - resolution: - { - integrity: sha512-AmVxtxn8ZkNJbuPu3KKfW9IkJgTgcEtgSwbo0NVcAb31iGvLgHXj2nbbyrUDfh2fx8otXmqL+qw1lRaTi+V3vA==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-AmVxtxn8ZkNJbuPu3KKfW9IkJgTgcEtgSwbo0NVcAb31iGvLgHXj2nbbyrUDfh2fx8otXmqL+qw1lRaTi+V3vA==} + engines: {node: '>=20.0.0'} '@aws-sdk/nested-clients@3.996.4': - resolution: - { - integrity: sha512-NowB1HfOnWC4kwZOnTg8E8rSL0U+RSjSa++UtEV4ipoH6JOjMLnHyGilqwl+Pe1f0Al6v9yMkSJ/8Ot0f578CQ==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-NowB1HfOnWC4kwZOnTg8E8rSL0U+RSjSa++UtEV4ipoH6JOjMLnHyGilqwl+Pe1f0Al6v9yMkSJ/8Ot0f578CQ==} + engines: {node: '>=20.0.0'} '@aws-sdk/region-config-resolver@3.972.6': - resolution: - { - integrity: sha512-Aa5PusHLXAqLTX1UKDvI3pHQJtIsF7Q+3turCHqfz/1F61/zDMWfbTC8evjhrrYVAtz9Vsv3SJ/waSUeu7B6gw==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-Aa5PusHLXAqLTX1UKDvI3pHQJtIsF7Q+3turCHqfz/1F61/zDMWfbTC8evjhrrYVAtz9Vsv3SJ/waSUeu7B6gw==} + engines: {node: '>=20.0.0'} '@aws-sdk/signature-v4-multi-region@3.996.4': - resolution: - { - integrity: sha512-MGa8ro0onekYIiesHX60LwKdkxK3Kd61p7TTbLwZemBqlnD9OLrk9sXZdFOIxXanJ+3AaJnV/jiX866eD/4PDg==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-MGa8ro0onekYIiesHX60LwKdkxK3Kd61p7TTbLwZemBqlnD9OLrk9sXZdFOIxXanJ+3AaJnV/jiX866eD/4PDg==} + engines: {node: '>=20.0.0'} '@aws-sdk/token-providers@3.1001.0': - resolution: - { - integrity: sha512-09XAq/uIYgeZhohuGRrR/R+ek3+ljFNdzWCXdqb9rlIERDjSfNiLjTtpHgSK1xTPmC5G4yWoEAyMfTXiggS6wA==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-09XAq/uIYgeZhohuGRrR/R+ek3+ljFNdzWCXdqb9rlIERDjSfNiLjTtpHgSK1xTPmC5G4yWoEAyMfTXiggS6wA==} + engines: {node: '>=20.0.0'} '@aws-sdk/types@3.973.4': - resolution: - { - integrity: sha512-RW60aH26Bsc016Y9B98hC0Plx6fK5P2v/iQYwMzrSjiDh1qRMUCP6KrXHYEHe3uFvKiOC93Z9zk4BJsUi6Tj1Q==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-RW60aH26Bsc016Y9B98hC0Plx6fK5P2v/iQYwMzrSjiDh1qRMUCP6KrXHYEHe3uFvKiOC93Z9zk4BJsUi6Tj1Q==} + engines: {node: '>=20.0.0'} '@aws-sdk/util-arn-parser@3.972.2': - resolution: - { - integrity: sha512-VkykWbqMjlSgBFDyrY3nOSqupMc6ivXuGmvci6Q3NnLq5kC+mKQe2QBZ4nrWRE/jqOxeFP2uYzLtwncYYcvQDg==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-VkykWbqMjlSgBFDyrY3nOSqupMc6ivXuGmvci6Q3NnLq5kC+mKQe2QBZ4nrWRE/jqOxeFP2uYzLtwncYYcvQDg==} + engines: {node: '>=20.0.0'} '@aws-sdk/util-endpoints@3.996.3': - resolution: - { - integrity: sha512-yWIQSNiCjykLL+ezN5A+DfBb1gfXTytBxm57e64lYmwxDHNmInYHRJYYRAGWG1o77vKEiWaw4ui28e3yb1k5aQ==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-yWIQSNiCjykLL+ezN5A+DfBb1gfXTytBxm57e64lYmwxDHNmInYHRJYYRAGWG1o77vKEiWaw4ui28e3yb1k5aQ==} + engines: {node: '>=20.0.0'} '@aws-sdk/util-locate-window@3.965.4': - resolution: - { - integrity: sha512-H1onv5SkgPBK2P6JR2MjGgbOnttoNzSPIRoeZTNPZYyaplwGg50zS3amXvXqF0/qfXpWEC9rLWU564QTB9bSog==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-H1onv5SkgPBK2P6JR2MjGgbOnttoNzSPIRoeZTNPZYyaplwGg50zS3amXvXqF0/qfXpWEC9rLWU564QTB9bSog==} + engines: {node: '>=20.0.0'} '@aws-sdk/util-user-agent-browser@3.972.6': - resolution: - { - integrity: sha512-Fwr/llD6GOrFgQnKaI2glhohdGuBDfHfora6iG9qsBBBR8xv1SdCSwbtf5CWlUdCw5X7g76G/9Hf0Inh0EmoxA==, - } + resolution: {integrity: sha512-Fwr/llD6GOrFgQnKaI2glhohdGuBDfHfora6iG9qsBBBR8xv1SdCSwbtf5CWlUdCw5X7g76G/9Hf0Inh0EmoxA==} '@aws-sdk/util-user-agent-node@3.973.1': - resolution: - { - integrity: sha512-kmgbDqT7aCBEVrqESM2JUjbf0zhDUQ7wnt3q1RuVS+3mglrcfVb2bwkbmf38npOyyPGtQPV5dWN3m+sSFAVAgQ==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-kmgbDqT7aCBEVrqESM2JUjbf0zhDUQ7wnt3q1RuVS+3mglrcfVb2bwkbmf38npOyyPGtQPV5dWN3m+sSFAVAgQ==} + engines: {node: '>=20.0.0'} peerDependencies: aws-crt: '>=1.0.0' peerDependenciesMeta: @@ -3020,409 +2905,250 @@ packages: optional: true '@aws-sdk/xml-builder@3.972.9': - resolution: - { - integrity: sha512-ItnlMgSqkPrUfJs7EsvU/01zw5UeIb2tNPhD09LBLHbg+g+HDiKibSLwpkuz/ZIlz4F2IMn+5XgE4AK/pfPuog==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-ItnlMgSqkPrUfJs7EsvU/01zw5UeIb2tNPhD09LBLHbg+g+HDiKibSLwpkuz/ZIlz4F2IMn+5XgE4AK/pfPuog==} + engines: {node: '>=20.0.0'} '@aws/lambda-invoke-store@0.2.3': - resolution: - { - integrity: sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==} + 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/code-frame@7.28.6': - resolution: - { - integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==} + engines: {node: '>=6.9.0'} '@babel/compat-data@7.28.6': - resolution: - { - integrity: sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==} + engines: {node: '>=6.9.0'} '@babel/core@7.28.6': - resolution: - { - integrity: sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==} + engines: {node: '>=6.9.0'} '@babel/generator@7.29.1': - resolution: - { - integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + 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.28.6': - resolution: - { - integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} + 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-imports@7.28.6': - resolution: - { - integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} '@babel/helper-module-transforms@7.28.6': - resolution: - { - integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} + 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-plugin-utils@7.28.6': - resolution: - { - integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} + 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.6': - resolution: - { - integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} + engines: {node: '>=6.9.0'} '@babel/parser@7.28.6': - resolution: - { - integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==} + engines: {node: '>=6.0.0'} hasBin: true '@babel/parser@7.29.0': - resolution: - { - integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} + 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.28.6': - resolution: - { - integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==} + 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-jsx@7.28.6': - resolution: - { - integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} + 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.28.6': - resolution: - { - integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-react-jsx-self@7.27.1': - resolution: - { - integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 '@babel/plugin-transform-react-jsx-source@7.27.1': - resolution: - { - integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + 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/template@7.28.6': - resolution: - { - integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + 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/traverse@7.28.6': - resolution: - { - integrity: sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==} + 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'} '@babel/types@7.29.0': - resolution: - { - integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==, - } - engines: { node: '>=6.9.0' } + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + 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'} '@dataplan/json@1.0.0-rc.5': - resolution: - { - integrity: sha512-KjSV8fcKtp1qyulpj9uQeAh9JQfn1VQRNv35ZQSTeoo/aKdc48Lfmw3mDVCllAsJHNxa2U/WylVepV+y1KqVYQ==, - } - engines: { node: '>=22' } + resolution: {integrity: sha512-KjSV8fcKtp1qyulpj9uQeAh9JQfn1VQRNv35ZQSTeoo/aKdc48Lfmw3mDVCllAsJHNxa2U/WylVepV+y1KqVYQ==} + engines: {node: '>=22'} peerDependencies: grafast: ^1.0.0-rc.7 '@dataplan/pg@1.0.0-rc.5': - resolution: - { - integrity: sha512-9zWeFej39R/jzeKJyIYElGmmiQ75JqI8LFLCFBhDsFJGiv3SOIE7k/nxpgKB9N0M5oD8bmJcnsXgm//eyRHT5w==, - } - engines: { node: '>=22' } + resolution: {integrity: sha512-9zWeFej39R/jzeKJyIYElGmmiQ75JqI8LFLCFBhDsFJGiv3SOIE7k/nxpgKB9N0M5oD8bmJcnsXgm//eyRHT5w==} + engines: {node: '>=22'} peerDependencies: '@dataplan/json': 1.0.0-rc.5 grafast: ^1.0.0-rc.7 @@ -3435,662 +3161,422 @@ packages: optional: true '@emnapi/core@1.7.1': - resolution: - { - integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==, - } + resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} '@emnapi/core@1.8.1': - resolution: - { - integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==, - } + resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} '@emnapi/runtime@1.7.1': - resolution: - { - integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==, - } + resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} '@emnapi/runtime@1.8.1': - resolution: - { - integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==, - } + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} '@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.25.12': - resolution: - { - integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] '@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.25.12': - resolution: - { - integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} cpu: [arm64] os: [android] '@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.25.12': - resolution: - { - integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} cpu: [arm] 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.25.12': - resolution: - { - integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} cpu: [x64] 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.25.12': - resolution: - { - integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] '@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.25.12': - resolution: - { - integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} cpu: [x64] 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.25.12': - resolution: - { - integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] '@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.25.12': - resolution: - { - integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} cpu: [x64] 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.25.12': - resolution: - { - integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] '@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.25.12': - resolution: - { - integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} cpu: [arm] 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.25.12': - resolution: - { - integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} cpu: [ia32] 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.25.12': - resolution: - { - integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} cpu: [loong64] 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.25.12': - resolution: - { - integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} cpu: [mips64el] 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.25.12': - resolution: - { - integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} cpu: [ppc64] 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.25.12': - resolution: - { - integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} cpu: [riscv64] 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.25.12': - resolution: - { - integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} cpu: [s390x] 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.25.12': - resolution: - { - integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} cpu: [x64] 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.25.12': - resolution: - { - integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} cpu: [arm64] os: [netbsd] '@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.25.12': - resolution: - { - integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} cpu: [x64] 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.25.12': - resolution: - { - integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} cpu: [arm64] os: [openbsd] '@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.25.12': - resolution: - { - integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} cpu: [x64] 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.25.12': - resolution: - { - integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} cpu: [arm64] os: [openharmony] '@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.25.12': - resolution: - { - integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] '@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.25.12': - resolution: - { - integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] '@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.25.12': - resolution: - { - integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} cpu: [ia32] 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.25.12': - resolution: - { - integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} cpu: [x64] 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/eslint-utils@4.9.1': - resolution: - { - integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==, - } - engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + 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} '@floating-ui/core@1.7.4': - resolution: - { - integrity: sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==, - } + resolution: {integrity: sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==} '@floating-ui/dom@1.7.5': - resolution: - { - integrity: sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==, - } + resolution: {integrity: sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==} '@floating-ui/react-dom@2.1.7': - resolution: - { - integrity: sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg==, - } + resolution: {integrity: sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' '@floating-ui/react@0.26.28': - resolution: - { - integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==, - } + resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' '@floating-ui/utils@0.2.10': - resolution: - { - integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==, - } + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} '@graphile-contrib/pg-many-to-many@2.0.0-rc.1': - resolution: - { - integrity: sha512-qd6u50sxYFEzGPO6rjH+5OH6A8BFNhVsTuJaVD/JOfF2LIO+ANS8sT0MTicgZ9WLd+Eq6OYrYJD0iNUDN3Eing==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-qd6u50sxYFEzGPO6rjH+5OH6A8BFNhVsTuJaVD/JOfF2LIO+ANS8sT0MTicgZ9WLd+Eq6OYrYJD0iNUDN3Eing==} + engines: {node: '>=10'} '@graphile/lru@5.0.0-rc.4': - resolution: - { - integrity: sha512-QJibEzd/Fhxut3OS5opWd+b1kYUhg74hurepbhb4cHSW76U7Xp6vIPBh//eRznymIOVgE4KNDo7bKblM/NGbVA==, - } - engines: { node: '>=22' } + resolution: {integrity: sha512-QJibEzd/Fhxut3OS5opWd+b1kYUhg74hurepbhb4cHSW76U7Xp6vIPBh//eRznymIOVgE4KNDo7bKblM/NGbVA==} + engines: {node: '>=22'} '@graphile/simplify-inflection@8.0.0-rc.3': - resolution: - { - integrity: sha512-2ujrwI5P7tNDUfr0NegXmU6M9cwyBPoGGy+sykQne5jf2PUgdwJz4HxLsyFT/ykukwZt5Kcrm7Thik2f7reiJA==, - } + resolution: {integrity: sha512-2ujrwI5P7tNDUfr0NegXmU6M9cwyBPoGGy+sykQne5jf2PUgdwJz4HxLsyFT/ykukwZt5Kcrm7Thik2f7reiJA==} '@graphiql/plugin-doc-explorer@0.4.1': - resolution: - { - integrity: sha512-+ram1dDDGMqJn/f9n5I8E6grTvxcM9JZYt/HhtYLuCvkN8kERI6/E3zBHBshhIUnQZoXioZ03fAzXg7JOn0Kyg==, - } + resolution: {integrity: sha512-+ram1dDDGMqJn/f9n5I8E6grTvxcM9JZYt/HhtYLuCvkN8kERI6/E3zBHBshhIUnQZoXioZ03fAzXg7JOn0Kyg==} peerDependencies: '@graphiql/react': ^0.37.0 graphql: 16.13.0 @@ -4099,10 +3585,7 @@ packages: react-dom: ^18 || ^19 '@graphiql/plugin-history@0.4.1': - resolution: - { - integrity: sha512-UyGI/Nm5tzKNMB71li41p6TfkthLqHkmNi9CgHzAM1zKgPIrtSq7Q8WCWKHLOEB5n4/8X8sXFeyQfHgnGYTXYg==, - } + resolution: {integrity: sha512-UyGI/Nm5tzKNMB71li41p6TfkthLqHkmNi9CgHzAM1zKgPIrtSq7Q8WCWKHLOEB5n4/8X8sXFeyQfHgnGYTXYg==} peerDependencies: '@graphiql/react': ^0.37.0 react: ^18 || ^19 @@ -4110,10 +3593,7 @@ packages: react-dom: ^18 || ^19 '@graphiql/react@0.37.3': - resolution: - { - integrity: sha512-rNJjwsYGhcZRdZ2FnyU6ss06xQaZ4UordyvOhp7+b/bEqQiEBpMOLJjuUr48Z6T7zEbZBnzCJpIJyXNqlcfQeA==, - } + resolution: {integrity: sha512-rNJjwsYGhcZRdZ2FnyU6ss06xQaZ4UordyvOhp7+b/bEqQiEBpMOLJjuUr48Z6T7zEbZBnzCJpIJyXNqlcfQeA==} peerDependencies: graphql: 16.13.0 react: ^18 || ^19 @@ -4121,10 +3601,7 @@ packages: react-dom: ^18 || ^19 '@graphiql/toolkit@0.11.3': - resolution: - { - integrity: sha512-Glf0fK1cdHLNq52UWPzfSrYIJuNxy8h4451Pw1ZVpJ7dtU+tm7GVVC64UjEDQ/v2j3fnG4cX8jvR75IvfL6nzQ==, - } + resolution: {integrity: sha512-Glf0fK1cdHLNq52UWPzfSrYIJuNxy8h4451Pw1ZVpJ7dtU+tm7GVVC64UjEDQ/v2j3fnG4cX8jvR75IvfL6nzQ==} peerDependencies: graphql: 16.13.0 graphql-ws: '>= 4.5.0' @@ -4133,64 +3610,40 @@ packages: optional: true '@graphql-typed-document-node/core@3.2.0': - resolution: - { - integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==, - } + resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} peerDependencies: graphql: 16.13.0 '@headlessui/react@2.2.9': - resolution: - { - integrity: sha512-Mb+Un58gwBn0/yWZfyrCh0TJyurtT+dETj7YHleylHk5od3dv2XqETPGWMyQ5/7sYN7oWdyM1u9MvC0OC8UmzQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-Mb+Un58gwBn0/yWZfyrCh0TJyurtT+dETj7YHleylHk5od3dv2XqETPGWMyQ5/7sYN7oWdyM1u9MvC0OC8UmzQ==} + engines: {node: '>=10'} peerDependencies: react: ^18 || ^19 || ^19.0.0-rc react-dom: ^18 || ^19 || ^19.0.0-rc '@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: @@ -4198,10 +3651,7 @@ packages: optional: true '@inquirerer/test@1.3.3': - resolution: - { - integrity: sha512-PowD9YoBzvThoIrfxGcEVPH3FuXpWqVStTmqhFDhvmrYdnN8FrnQ49S5QoLDU8hIzMKhDj3t/ZJbp61kkSU0Rw==, - } + resolution: {integrity: sha512-PowD9YoBzvThoIrfxGcEVPH3FuXpWqVStTmqhFDhvmrYdnN8FrnQ49S5QoLDU8hIzMKhDj3t/ZJbp61kkSU0Rw==} peerDependencies: jest: '>=29.0.0' peerDependenciesMeta: @@ -4209,72 +3659,42 @@ packages: optional: true '@inquirerer/utils@3.3.1': - resolution: - { - integrity: sha512-9KkXpM3q7C59KTZXrSDAWBto5RoTQlwoJ2w6fAAt/8o6OdsXwJUQa8huzg25yGvydxcivxEoNT6/yAERT1EZJw==, - } + resolution: {integrity: sha512-9KkXpM3q7C59KTZXrSDAWBto5RoTQlwoJ2w6fAAt/8o6OdsXwJUQa8huzg25yGvydxcivxEoNT6/yAERT1EZJw==} '@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/cliui@9.0.0': - resolution: - { - integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-AokJm4tuBHillT+FpMtxQ60n8ObyXBatq7jD2/JA9dxbDDokKQm8KMht5ibGzLVU9IJDIKK4TPKgMHEYMn3lMg==} + engines: {node: '>=18'} '@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@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@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: @@ -4282,67 +3702,40 @@ 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@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@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@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@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@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@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: @@ -4350,812 +3743,482 @@ 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@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@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@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@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@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/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'} '@n1ru4l/push-pull-async-iterable-iterator@3.2.0': - resolution: - { - integrity: sha512-3fkKj25kEjsfObL6IlKPAlHYPq/oYwUkkQ03zsTTiDjD7vg/RxjdiLeCydqtxHZP0JgsXL3D/X5oAkMGzuUp/Q==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-3fkKj25kEjsfObL6IlKPAlHYPq/oYwUkkQ03zsTTiDjD7vg/RxjdiLeCydqtxHZP0JgsXL3D/X5oAkMGzuUp/Q==} + engines: {node: '>=12'} '@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==} '@noble/hashes@1.8.0': - resolution: - { - integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==, - } - engines: { node: ^14.21.3 || >=16 } + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} '@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==} '@oxfmt/binding-android-arm-eabi@0.36.0': - resolution: - { - integrity: sha512-Z4yVHJWx/swHHjtr0dXrBZb6LxS+qNz1qdza222mWwPTUK4L790+5i3LTgjx3KYGBzcYpjaiZBw4vOx94dH7MQ==, - } - engines: { node: ^20.19.0 || >=22.12.0 } + resolution: {integrity: sha512-Z4yVHJWx/swHHjtr0dXrBZb6LxS+qNz1qdza222mWwPTUK4L790+5i3LTgjx3KYGBzcYpjaiZBw4vOx94dH7MQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] '@oxfmt/binding-android-arm64@0.36.0': - resolution: - { - integrity: sha512-3ElCJRFNPQl7jexf2CAa9XmAm8eC5JPrIDSjc9jSchkVSFTEqyL0NtZinBB2h1a4i4JgP1oGl/5G5n8YR4FN8Q==, - } - engines: { node: ^20.19.0 || >=22.12.0 } + resolution: {integrity: sha512-3ElCJRFNPQl7jexf2CAa9XmAm8eC5JPrIDSjc9jSchkVSFTEqyL0NtZinBB2h1a4i4JgP1oGl/5G5n8YR4FN8Q==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] '@oxfmt/binding-darwin-arm64@0.36.0': - resolution: - { - integrity: sha512-nak4znWCqIExKhYSY/mz/lWsqWIpdsS7o0+SRzXR1Q0m7GrMcG1UrF1pS7TLGZhhkf7nTfEF7q6oZzJiodRDuw==, - } - engines: { node: ^20.19.0 || >=22.12.0 } + resolution: {integrity: sha512-nak4znWCqIExKhYSY/mz/lWsqWIpdsS7o0+SRzXR1Q0m7GrMcG1UrF1pS7TLGZhhkf7nTfEF7q6oZzJiodRDuw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] '@oxfmt/binding-darwin-x64@0.36.0': - resolution: - { - integrity: sha512-V4GP96thDnpKx6ADnMDnhIXNdtV+Ql9D4HUU+a37VTeVbs5qQSF/s6hhUP1b3xUqU7iRcwh72jUU2Y12rtGHAw==, - } - engines: { node: ^20.19.0 || >=22.12.0 } + resolution: {integrity: sha512-V4GP96thDnpKx6ADnMDnhIXNdtV+Ql9D4HUU+a37VTeVbs5qQSF/s6hhUP1b3xUqU7iRcwh72jUU2Y12rtGHAw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] '@oxfmt/binding-freebsd-x64@0.36.0': - resolution: - { - integrity: sha512-/xapWCADfI5wrhxpEUjhI9fnw7MV5BUZizVa8e24n3VSK6A3Y1TB/ClOP1tfxNspykFKXp4NBWl6NtDJP3osqQ==, - } - engines: { node: ^20.19.0 || >=22.12.0 } + resolution: {integrity: sha512-/xapWCADfI5wrhxpEUjhI9fnw7MV5BUZizVa8e24n3VSK6A3Y1TB/ClOP1tfxNspykFKXp4NBWl6NtDJP3osqQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] '@oxfmt/binding-linux-arm-gnueabihf@0.36.0': - resolution: - { - integrity: sha512-1lOmv61XMFIH5uNm27620kRRzWt/RK6tdn250BRDoG9W7OXGOQ5UyI1HVT+SFkoOoKztBiinWgi68+NA1MjBVQ==, - } - engines: { node: ^20.19.0 || >=22.12.0 } + resolution: {integrity: sha512-1lOmv61XMFIH5uNm27620kRRzWt/RK6tdn250BRDoG9W7OXGOQ5UyI1HVT+SFkoOoKztBiinWgi68+NA1MjBVQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] '@oxfmt/binding-linux-arm-musleabihf@0.36.0': - resolution: - { - integrity: sha512-vMH23AskdR1ujUS9sPck2Df9rBVoZUnCVY86jisILzIQ/QQ/yKUTi7tgnIvydPx7TyB/48wsQ5QMr5Knq5p/aw==, - } - engines: { node: ^20.19.0 || >=22.12.0 } + resolution: {integrity: sha512-vMH23AskdR1ujUS9sPck2Df9rBVoZUnCVY86jisILzIQ/QQ/yKUTi7tgnIvydPx7TyB/48wsQ5QMr5Knq5p/aw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] '@oxfmt/binding-linux-arm64-gnu@0.36.0': - resolution: - { - integrity: sha512-Hy1V+zOBHpBiENRx77qrUTt5aPDHeCASRc8K5KwwAHkX2AKP0nV89eL17hsZrE9GmnXFjsNmd80lyf7aRTXsbw==, - } - engines: { node: ^20.19.0 || >=22.12.0 } + resolution: {integrity: sha512-Hy1V+zOBHpBiENRx77qrUTt5aPDHeCASRc8K5KwwAHkX2AKP0nV89eL17hsZrE9GmnXFjsNmd80lyf7aRTXsbw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] '@oxfmt/binding-linux-arm64-musl@0.36.0': - resolution: - { - integrity: sha512-SPGLJkOIHSIC6ABUQ5V8NqJpvYhMJueJv26NYqfCnwi/Mn6A61amkpJJ9Suy0Nmvs+OWESJpcebrBUbXPGZyQQ==, - } - engines: { node: ^20.19.0 || >=22.12.0 } + resolution: {integrity: sha512-SPGLJkOIHSIC6ABUQ5V8NqJpvYhMJueJv26NYqfCnwi/Mn6A61amkpJJ9Suy0Nmvs+OWESJpcebrBUbXPGZyQQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] '@oxfmt/binding-linux-ppc64-gnu@0.36.0': - resolution: - { - integrity: sha512-3EuoyB8x9x8ysYJjbEO/M9fkSk72zQKnXCvpZMDHXlnY36/1qMp55Nm0PrCwjGO/1pen5hdOVkz9WmP3nAp2IQ==, - } - engines: { node: ^20.19.0 || >=22.12.0 } + resolution: {integrity: sha512-3EuoyB8x9x8ysYJjbEO/M9fkSk72zQKnXCvpZMDHXlnY36/1qMp55Nm0PrCwjGO/1pen5hdOVkz9WmP3nAp2IQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] '@oxfmt/binding-linux-riscv64-gnu@0.36.0': - resolution: - { - integrity: sha512-MpY3itLwpGh8dnywtrZtaZ604T1m715SydCKy0+qTxetv+IHzuA+aO/AGzrlzUNYZZmtWtmDBrChZGibvZxbRQ==, - } - engines: { node: ^20.19.0 || >=22.12.0 } + resolution: {integrity: sha512-MpY3itLwpGh8dnywtrZtaZ604T1m715SydCKy0+qTxetv+IHzuA+aO/AGzrlzUNYZZmtWtmDBrChZGibvZxbRQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] '@oxfmt/binding-linux-riscv64-musl@0.36.0': - resolution: - { - integrity: sha512-mmDhe4Vtx+XwQPRPn/V25+APnkApYgZ23q+6GVsNYY98pf3aU0aI3Me96pbRs/AfJ1jIiGC+/6q71FEu8dHcHw==, - } - engines: { node: ^20.19.0 || >=22.12.0 } + resolution: {integrity: sha512-mmDhe4Vtx+XwQPRPn/V25+APnkApYgZ23q+6GVsNYY98pf3aU0aI3Me96pbRs/AfJ1jIiGC+/6q71FEu8dHcHw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] '@oxfmt/binding-linux-s390x-gnu@0.36.0': - resolution: - { - integrity: sha512-AYXhU+DmNWLSnvVwkHM92fuYhogtVHab7UQrPNaDf1sxadugg9gWVmcgJDlIwxJdpk5CVW/TFvwUKwI432zhhA==, - } - engines: { node: ^20.19.0 || >=22.12.0 } + resolution: {integrity: sha512-AYXhU+DmNWLSnvVwkHM92fuYhogtVHab7UQrPNaDf1sxadugg9gWVmcgJDlIwxJdpk5CVW/TFvwUKwI432zhhA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] '@oxfmt/binding-linux-x64-gnu@0.36.0': - resolution: - { - integrity: sha512-H16QhhQ3usoakMleiAAQ2mg0NsBDAdyE9agUgfC8IHHh3jZEbr0rIKwjEqwbOHK5M0EmfhJmr+aGO/MgZPsneA==, - } - engines: { node: ^20.19.0 || >=22.12.0 } + resolution: {integrity: sha512-H16QhhQ3usoakMleiAAQ2mg0NsBDAdyE9agUgfC8IHHh3jZEbr0rIKwjEqwbOHK5M0EmfhJmr+aGO/MgZPsneA==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] '@oxfmt/binding-linux-x64-musl@0.36.0': - resolution: - { - integrity: sha512-EFFGkixA39BcmHiCe2ECdrq02D6FCve5ka6ObbvrheXl4V+R0U/E+/uLyVx1X65LW8TA8QQHdnbdDallRekohw==, - } - engines: { node: ^20.19.0 || >=22.12.0 } + resolution: {integrity: sha512-EFFGkixA39BcmHiCe2ECdrq02D6FCve5ka6ObbvrheXl4V+R0U/E+/uLyVx1X65LW8TA8QQHdnbdDallRekohw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] '@oxfmt/binding-openharmony-arm64@0.36.0': - resolution: - { - integrity: sha512-zr/t369wZWFOj1qf06Z5gGNjFymfUNDrxKMmr7FKiDRVI1sNsdKRCuRL4XVjtcptKQ+ao3FfxLN1vrynivmCYg==, - } - engines: { node: ^20.19.0 || >=22.12.0 } + resolution: {integrity: sha512-zr/t369wZWFOj1qf06Z5gGNjFymfUNDrxKMmr7FKiDRVI1sNsdKRCuRL4XVjtcptKQ+ao3FfxLN1vrynivmCYg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] '@oxfmt/binding-win32-arm64-msvc@0.36.0': - resolution: - { - integrity: sha512-FxO7UksTv8h4olzACgrqAXNF6BP329+H322323iDrMB5V/+a1kcAw07fsOsUmqNrb9iJBsCQgH/zqcqp5903ag==, - } - engines: { node: ^20.19.0 || >=22.12.0 } + resolution: {integrity: sha512-FxO7UksTv8h4olzACgrqAXNF6BP329+H322323iDrMB5V/+a1kcAw07fsOsUmqNrb9iJBsCQgH/zqcqp5903ag==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] '@oxfmt/binding-win32-ia32-msvc@0.36.0': - resolution: - { - integrity: sha512-OjoMQ89H01M0oLMfr/CPNH1zi48ZIwxAKObUl57oh7ssUBNDp/2Vjf7E1TQ8M4oj4VFQ/byxl2SmcPNaI2YNDg==, - } - engines: { node: ^20.19.0 || >=22.12.0 } + resolution: {integrity: sha512-OjoMQ89H01M0oLMfr/CPNH1zi48ZIwxAKObUl57oh7ssUBNDp/2Vjf7E1TQ8M4oj4VFQ/byxl2SmcPNaI2YNDg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] '@oxfmt/binding-win32-x64-msvc@0.36.0': - resolution: - { - integrity: sha512-MoyeQ9S36ZTz/4bDhOKJgOBIDROd4dQ5AkT9iezhEaUBxAPdNX9Oq0jD8OSnCj3G4wam/XNxVWKMA52kmzmPtQ==, - } - engines: { node: ^20.19.0 || >=22.12.0 } + resolution: {integrity: sha512-MoyeQ9S36ZTz/4bDhOKJgOBIDROd4dQ5AkT9iezhEaUBxAPdNX9Oq0jD8OSnCj3G4wam/XNxVWKMA52kmzmPtQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] '@paralleldrive/cuid2@2.3.1': - resolution: - { - integrity: sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==, - } + resolution: {integrity: sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==} '@pgpm/database-jobs@0.18.0': - resolution: - { - integrity: sha512-3LX7ZQJQEMHd4POG2I2xPzMFR2X6LwvuxJAMpLhcc/I4P3EbEyEig6rPpsyDr9uabRjgUWfZDz05w6cW8X4KwA==, - } + resolution: {integrity: sha512-3LX7ZQJQEMHd4POG2I2xPzMFR2X6LwvuxJAMpLhcc/I4P3EbEyEig6rPpsyDr9uabRjgUWfZDz05w6cW8X4KwA==} '@pgpm/inflection@0.18.0': - resolution: - { - integrity: sha512-gHfxI6l/+cE9zY5ea6BjVjNcb9VKIavqRXGVyw16Fy0n4HgCmxF8ccZFFPq46JXfakNSk3cPTHDYvvWQaAlIPA==, - } + resolution: {integrity: sha512-gHfxI6l/+cE9zY5ea6BjVjNcb9VKIavqRXGVyw16Fy0n4HgCmxF8ccZFFPq46JXfakNSk3cPTHDYvvWQaAlIPA==} '@pgpm/metaschema-modules@0.18.0': - resolution: - { - integrity: sha512-bSawB8SJJWGRpQjazJR4MYL6zMmI7dqdUtmw9O9jj7NqGXbZDLqrfUYOzxDbThJ/4BI49fJba19Qiz94Ys/CCg==, - } + resolution: {integrity: sha512-bSawB8SJJWGRpQjazJR4MYL6zMmI7dqdUtmw9O9jj7NqGXbZDLqrfUYOzxDbThJ/4BI49fJba19Qiz94Ys/CCg==} '@pgpm/metaschema-schema@0.18.0': - resolution: - { - integrity: sha512-joIBoYegI4ZQFFPW7w0HhNXMT+sXnmSytX8YBxGgi5XZqjE2aQdtZcWBIiwZa3MjqU7mYN2xlZt5gPmo/IzLMw==, - } + resolution: {integrity: sha512-joIBoYegI4ZQFFPW7w0HhNXMT+sXnmSytX8YBxGgi5XZqjE2aQdtZcWBIiwZa3MjqU7mYN2xlZt5gPmo/IzLMw==} '@pgpm/services@0.18.0': - resolution: - { - integrity: sha512-YedLEVdgwkHden55uaZaO8O3HACEiIvblYmPFsQk1ivHwzw1l0KUv6WT5+idwMC/SOsexH/Xq8ckSSM84ErWtQ==, - } + resolution: {integrity: sha512-YedLEVdgwkHden55uaZaO8O3HACEiIvblYmPFsQk1ivHwzw1l0KUv6WT5+idwMC/SOsexH/Xq8ckSSM84ErWtQ==} '@pgpm/types@0.18.0': - resolution: - { - integrity: sha512-w6pfcS5HuJ2IGfyn74mGChl0nhNBIbxdu6sarlARGveZFHvBkTIPKEezA524sLKhUHda84YWuExEhCUd6N/AqQ==, - } + resolution: {integrity: sha512-w6pfcS5HuJ2IGfyn74mGChl0nhNBIbxdu6sarlARGveZFHvBkTIPKEezA524sLKhUHda84YWuExEhCUd6N/AqQ==} '@pgpm/verify@0.18.0': - resolution: - { - integrity: sha512-7XtY+hj9CbYb0ZhD0LJRp+TErtYS2z0FZbdkMNM7UabEwz05VLlS/lXbdtn5hksbUq6dkIxwxQ2mfFpATPpqDQ==, - } + resolution: {integrity: sha512-7XtY+hj9CbYb0ZhD0LJRp+TErtYS2z0FZbdkMNM7UabEwz05VLlS/lXbdtn5hksbUq6dkIxwxQ2mfFpATPpqDQ==} '@pgsql/quotes@17.1.0': - resolution: - { - integrity: sha512-J/H+LcrENBpYgL45WW6aTjb5Yk4tX4+AmB2/k8KZa+Zh3wiCtqmNIag+HZz5HmWaF6EZK9ZGC95NBD1fs+rUvg==, - } + resolution: {integrity: sha512-J/H+LcrENBpYgL45WW6aTjb5Yk4tX4+AmB2/k8KZa+Zh3wiCtqmNIag+HZz5HmWaF6EZK9ZGC95NBD1fs+rUvg==} '@pgsql/types@17.6.2': - resolution: - { - integrity: sha512-1UtbELdbqNdyOShhrVfSz3a1gDi0s9XXiQemx+6QqtsrXe62a6zOGU+vjb2GRfG5jeEokI1zBBcfD42enRv0Rw==, - } + resolution: {integrity: sha512-1UtbELdbqNdyOShhrVfSz3a1gDi0s9XXiQemx+6QqtsrXe62a6zOGU+vjb2GRfG5jeEokI1zBBcfD42enRv0Rw==} '@pgsql/utils@17.8.13': - resolution: - { - integrity: sha512-hTQik5jZZqS/fXa2p4EMfkcv6qhGSTKSO3mrjMj/kH0OAYMEyeQ2vbNPOsmfD7N5/taZX+8rXXqDbstIxUYxOg==, - } + resolution: {integrity: sha512-hTQik5jZZqS/fXa2p4EMfkcv6qhGSTKSO3mrjMj/kH0OAYMEyeQ2vbNPOsmfD7N5/taZX+8rXXqDbstIxUYxOg==} '@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.58.2': - resolution: - { - integrity: sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==} + 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==} '@radix-ui/primitive@1.1.3': - resolution: - { - integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==, - } + resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} '@radix-ui/react-arrow@1.1.7': - resolution: - { - integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==, - } + resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5168,10 +4231,7 @@ packages: optional: true '@radix-ui/react-collection@1.1.7': - resolution: - { - integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==, - } + resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5184,10 +4244,7 @@ packages: optional: true '@radix-ui/react-compose-refs@1.1.2': - resolution: - { - integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==, - } + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -5196,10 +4253,7 @@ packages: optional: true '@radix-ui/react-context@1.1.2': - resolution: - { - integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==, - } + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -5208,10 +4262,7 @@ packages: optional: true '@radix-ui/react-dialog@1.1.15': - resolution: - { - integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==, - } + resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5224,10 +4275,7 @@ packages: optional: true '@radix-ui/react-direction@1.1.1': - resolution: - { - integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==, - } + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -5236,10 +4284,7 @@ packages: optional: true '@radix-ui/react-dismissable-layer@1.1.11': - resolution: - { - integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==, - } + resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5252,10 +4297,7 @@ packages: optional: true '@radix-ui/react-dropdown-menu@2.1.16': - resolution: - { - integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==, - } + resolution: {integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5268,10 +4310,7 @@ packages: optional: true '@radix-ui/react-focus-guards@1.1.3': - resolution: - { - integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==, - } + resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -5280,10 +4319,7 @@ packages: optional: true '@radix-ui/react-focus-scope@1.1.7': - resolution: - { - integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==, - } + resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5296,10 +4332,7 @@ packages: optional: true '@radix-ui/react-id@1.1.1': - resolution: - { - integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==, - } + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -5308,10 +4341,7 @@ packages: optional: true '@radix-ui/react-menu@2.1.16': - resolution: - { - integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==, - } + resolution: {integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5324,10 +4354,7 @@ packages: optional: true '@radix-ui/react-popper@1.2.8': - resolution: - { - integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==, - } + resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5340,10 +4367,7 @@ packages: optional: true '@radix-ui/react-portal@1.1.9': - resolution: - { - integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==, - } + resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5356,10 +4380,7 @@ packages: optional: true '@radix-ui/react-presence@1.1.5': - resolution: - { - integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==, - } + resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5372,10 +4393,7 @@ packages: optional: true '@radix-ui/react-primitive@2.1.3': - resolution: - { - integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==, - } + resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5388,10 +4406,7 @@ packages: optional: true '@radix-ui/react-primitive@2.1.4': - resolution: - { - integrity: sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==, - } + resolution: {integrity: sha512-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5404,10 +4419,7 @@ packages: optional: true '@radix-ui/react-roving-focus@1.1.11': - resolution: - { - integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==, - } + resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5420,10 +4432,7 @@ packages: optional: true '@radix-ui/react-slot@1.2.3': - resolution: - { - integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==, - } + resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -5432,10 +4441,7 @@ packages: optional: true '@radix-ui/react-slot@1.2.4': - resolution: - { - integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==, - } + resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -5444,10 +4450,7 @@ packages: optional: true '@radix-ui/react-tooltip@1.2.8': - resolution: - { - integrity: sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==, - } + resolution: {integrity: sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5460,10 +4463,7 @@ packages: optional: true '@radix-ui/react-use-callback-ref@1.1.1': - resolution: - { - integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==, - } + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -5472,10 +4472,7 @@ packages: optional: true '@radix-ui/react-use-controllable-state@1.2.2': - resolution: - { - integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==, - } + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -5484,10 +4481,7 @@ packages: optional: true '@radix-ui/react-use-effect-event@0.0.2': - resolution: - { - integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==, - } + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -5496,10 +4490,7 @@ packages: optional: true '@radix-ui/react-use-escape-keydown@1.1.1': - resolution: - { - integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==, - } + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -5508,10 +4499,7 @@ packages: optional: true '@radix-ui/react-use-layout-effect@1.1.1': - resolution: - { - integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==, - } + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -5520,10 +4508,7 @@ packages: optional: true '@radix-ui/react-use-rect@1.1.1': - resolution: - { - integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==, - } + resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -5532,10 +4517,7 @@ packages: optional: true '@radix-ui/react-use-size@1.1.1': - resolution: - { - integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==, - } + resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -5544,10 +4526,7 @@ packages: optional: true '@radix-ui/react-visually-hidden@1.2.3': - resolution: - { - integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==, - } + resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5560,10 +4539,7 @@ packages: optional: true '@radix-ui/react-visually-hidden@1.2.4': - resolution: - { - integrity: sha512-kaeiyGCe844dkb9AVF+rb4yTyb1LiLN/e3es3nLiRyN4dC8AduBYPMnnNlDjX2VDOcvDEiPnRNMJeWCfsX0txg==, - } + resolution: {integrity: sha512-kaeiyGCe844dkb9AVF+rb4yTyb1LiLN/e3es3nLiRyN4dC8AduBYPMnnNlDjX2VDOcvDEiPnRNMJeWCfsX0txg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -5576,2546 +4552,1436 @@ packages: optional: true '@radix-ui/rect@1.1.1': - resolution: - { - integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==, - } + resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} '@react-aria/focus@3.21.4': - resolution: - { - integrity: sha512-6gz+j9ip0/vFRTKJMl3R30MHopn4i19HqqLfSQfElxJD+r9hBnYG1Q6Wd/kl/WRR1+CALn2F+rn06jUnf5sT8Q==, - } + resolution: {integrity: sha512-6gz+j9ip0/vFRTKJMl3R30MHopn4i19HqqLfSQfElxJD+r9hBnYG1Q6Wd/kl/WRR1+CALn2F+rn06jUnf5sT8Q==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-aria/interactions@3.27.0': - resolution: - { - integrity: sha512-D27pOy+0jIfHK60BB26AgqjjRFOYdvVSkwC31b2LicIzRCSPOSP06V4gMHuGmkhNTF4+YWDi1HHYjxIvMeiSlA==, - } + resolution: {integrity: sha512-D27pOy+0jIfHK60BB26AgqjjRFOYdvVSkwC31b2LicIzRCSPOSP06V4gMHuGmkhNTF4+YWDi1HHYjxIvMeiSlA==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-aria/ssr@3.9.10': - resolution: - { - integrity: sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ==, - } - engines: { node: '>= 12' } + resolution: {integrity: sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ==} + engines: {node: '>= 12'} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-aria/utils@3.33.0': - resolution: - { - integrity: sha512-yvz7CMH8d2VjwbSa5nGXqjU031tYhD8ddax95VzJsHSPyqHDEGfxul8RkhGV6oO7bVqZxVs6xY66NIgae+FHjw==, - } + resolution: {integrity: sha512-yvz7CMH8d2VjwbSa5nGXqjU031tYhD8ddax95VzJsHSPyqHDEGfxul8RkhGV6oO7bVqZxVs6xY66NIgae+FHjw==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-stately/flags@3.1.2': - resolution: - { - integrity: sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==, - } + resolution: {integrity: sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==} '@react-stately/utils@3.11.0': - resolution: - { - integrity: sha512-8LZpYowJ9eZmmYLpudbo/eclIRnbhWIJZ994ncmlKlouNzKohtM8qTC6B1w1pwUbiwGdUoyzLuQbeaIor5Dvcw==, - } + resolution: {integrity: sha512-8LZpYowJ9eZmmYLpudbo/eclIRnbhWIJZ994ncmlKlouNzKohtM8qTC6B1w1pwUbiwGdUoyzLuQbeaIor5Dvcw==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@react-types/shared@3.33.0': - resolution: - { - integrity: sha512-xuUpP6MyuPmJtzNOqF5pzFUIHH2YogyOQfUQHag54PRmWB7AbjuGWBUv0l1UDmz6+AbzAYGmDVAzcRDOu2PFpw==, - } + resolution: {integrity: sha512-xuUpP6MyuPmJtzNOqF5pzFUIHH2YogyOQfUQHag54PRmWB7AbjuGWBUv0l1UDmz6+AbzAYGmDVAzcRDOu2PFpw==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 '@rolldown/pluginutils@1.0.0-beta.27': - resolution: - { - integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==, - } + resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} '@rollup/rollup-android-arm-eabi@4.57.1': - resolution: - { - integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==, - } + resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} cpu: [arm] os: [android] '@rollup/rollup-android-arm64@4.57.1': - resolution: - { - integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==, - } + resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} cpu: [arm64] os: [android] '@rollup/rollup-darwin-arm64@4.57.1': - resolution: - { - integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==, - } + resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} cpu: [arm64] os: [darwin] '@rollup/rollup-darwin-x64@4.57.1': - resolution: - { - integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==, - } + resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} cpu: [x64] os: [darwin] '@rollup/rollup-freebsd-arm64@4.57.1': - resolution: - { - integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==, - } + resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} cpu: [arm64] os: [freebsd] '@rollup/rollup-freebsd-x64@4.57.1': - resolution: - { - integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==, - } + resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} cpu: [x64] os: [freebsd] '@rollup/rollup-linux-arm-gnueabihf@4.57.1': - resolution: - { - integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==, - } + resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} cpu: [arm] os: [linux] '@rollup/rollup-linux-arm-musleabihf@4.57.1': - resolution: - { - integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==, - } + resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} cpu: [arm] os: [linux] '@rollup/rollup-linux-arm64-gnu@4.57.1': - resolution: - { - integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==, - } + resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} cpu: [arm64] os: [linux] '@rollup/rollup-linux-arm64-musl@4.57.1': - resolution: - { - integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==, - } + resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} cpu: [arm64] os: [linux] '@rollup/rollup-linux-loong64-gnu@4.57.1': - resolution: - { - integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==, - } + resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} cpu: [loong64] os: [linux] '@rollup/rollup-linux-loong64-musl@4.57.1': - resolution: - { - integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==, - } + resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} cpu: [loong64] os: [linux] '@rollup/rollup-linux-ppc64-gnu@4.57.1': - resolution: - { - integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==, - } + resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} cpu: [ppc64] os: [linux] '@rollup/rollup-linux-ppc64-musl@4.57.1': - resolution: - { - integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==, - } + resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} cpu: [ppc64] os: [linux] '@rollup/rollup-linux-riscv64-gnu@4.57.1': - resolution: - { - integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==, - } + resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} cpu: [riscv64] os: [linux] '@rollup/rollup-linux-riscv64-musl@4.57.1': - resolution: - { - integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==, - } + resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} cpu: [riscv64] os: [linux] '@rollup/rollup-linux-s390x-gnu@4.57.1': - resolution: - { - integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==, - } + resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} cpu: [s390x] os: [linux] '@rollup/rollup-linux-x64-gnu@4.57.1': - resolution: - { - integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==, - } + resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} cpu: [x64] os: [linux] '@rollup/rollup-linux-x64-musl@4.57.1': - resolution: - { - integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==, - } + resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} cpu: [x64] os: [linux] '@rollup/rollup-openbsd-x64@4.57.1': - resolution: - { - integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==, - } + resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} cpu: [x64] os: [openbsd] '@rollup/rollup-openharmony-arm64@4.57.1': - resolution: - { - integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==, - } + resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} cpu: [arm64] os: [openharmony] '@rollup/rollup-win32-arm64-msvc@4.57.1': - resolution: - { - integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==, - } + resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} cpu: [arm64] os: [win32] '@rollup/rollup-win32-ia32-msvc@4.57.1': - resolution: - { - integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==, - } + resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} cpu: [ia32] os: [win32] '@rollup/rollup-win32-x64-gnu@4.57.1': - resolution: - { - integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==, - } + resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} cpu: [x64] os: [win32] '@rollup/rollup-win32-x64-msvc@4.57.1': - resolution: - { - integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==, - } + resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} cpu: [x64] os: [win32] '@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.47': - resolution: - { - integrity: sha512-ZGIBQ+XDvO5JQku9wmwtabcVTHJsgSWAHYtVuM9pBNNR5E88v6Jcj/llpmsjivig5X8A8HHOb4/mbEKPS5EvAw==, - } + resolution: {integrity: sha512-ZGIBQ+XDvO5JQku9wmwtabcVTHJsgSWAHYtVuM9pBNNR5E88v6Jcj/llpmsjivig5X8A8HHOb4/mbEKPS5EvAw==} '@sinonjs/commons@3.0.1': - resolution: - { - integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==, - } + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} '@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.10': - resolution: - { - integrity: sha512-qocxM/X4XGATqQtUkbE9SPUB6wekBi+FyJOMbPj0AhvyvFGYEmOlz6VB22iMePCQsFmMIvFSeViDvA7mZJG47g==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-qocxM/X4XGATqQtUkbE9SPUB6wekBi+FyJOMbPj0AhvyvFGYEmOlz6VB22iMePCQsFmMIvFSeViDvA7mZJG47g==} + engines: {node: '>=18.0.0'} '@smithy/chunked-blob-reader-native@4.2.2': - resolution: - { - integrity: sha512-QzzYIlf4yg0w5TQaC9VId3B3ugSk1MI/wb7tgcHtd7CBV9gNRKZrhc2EPSxSZuDy10zUZ0lomNMgkc6/VVe8xg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-QzzYIlf4yg0w5TQaC9VId3B3ugSk1MI/wb7tgcHtd7CBV9gNRKZrhc2EPSxSZuDy10zUZ0lomNMgkc6/VVe8xg==} + engines: {node: '>=18.0.0'} '@smithy/chunked-blob-reader@5.2.1': - resolution: - { - integrity: sha512-y5d4xRiD6TzeP5BWlb+Ig/VFqF+t9oANNhGeMqyzU7obw7FYgTgVi50i5JqBTeKp+TABeDIeeXFZdz65RipNtA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-y5d4xRiD6TzeP5BWlb+Ig/VFqF+t9oANNhGeMqyzU7obw7FYgTgVi50i5JqBTeKp+TABeDIeeXFZdz65RipNtA==} + engines: {node: '>=18.0.0'} '@smithy/config-resolver@4.4.9': - resolution: - { - integrity: sha512-ejQvXqlcU30h7liR9fXtj7PIAau1t/sFbJpgWPfiYDs7zd16jpH0IsSXKcba2jF6ChTXvIjACs27kNMc5xxE2Q==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-ejQvXqlcU30h7liR9fXtj7PIAau1t/sFbJpgWPfiYDs7zd16jpH0IsSXKcba2jF6ChTXvIjACs27kNMc5xxE2Q==} + engines: {node: '>=18.0.0'} '@smithy/core@3.23.7': - resolution: - { - integrity: sha512-/+ldRdtiO5Cb26afAZOG1FZM0x7D4AYdjpyOv2OScJw+4C7X+OLdRnNKF5UyUE0VpPgSKr3rnF/kvprRA4h2kg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-/+ldRdtiO5Cb26afAZOG1FZM0x7D4AYdjpyOv2OScJw+4C7X+OLdRnNKF5UyUE0VpPgSKr3rnF/kvprRA4h2kg==} + engines: {node: '>=18.0.0'} '@smithy/credential-provider-imds@4.2.10': - resolution: - { - integrity: sha512-3bsMLJJLTZGZqVGGeBVFfLzuRulVsGTj12BzRKODTHqUABpIr0jMN1vN3+u6r2OfyhAQ2pXaMZWX/swBK5I6PQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-3bsMLJJLTZGZqVGGeBVFfLzuRulVsGTj12BzRKODTHqUABpIr0jMN1vN3+u6r2OfyhAQ2pXaMZWX/swBK5I6PQ==} + engines: {node: '>=18.0.0'} '@smithy/eventstream-codec@4.2.10': - resolution: - { - integrity: sha512-A4ynrsFFfSXUHicfTcRehytppFBcY3HQxEGYiyGktPIOye3Ot7fxpiy4VR42WmtGI4Wfo6OXt/c1Ky1nUFxYYQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-A4ynrsFFfSXUHicfTcRehytppFBcY3HQxEGYiyGktPIOye3Ot7fxpiy4VR42WmtGI4Wfo6OXt/c1Ky1nUFxYYQ==} + engines: {node: '>=18.0.0'} '@smithy/eventstream-serde-browser@4.2.10': - resolution: - { - integrity: sha512-0xupsu9yj9oDVuQ50YCTS9nuSYhGlrwqdaKQel9y2Fz7LU9fNErVlw9N0o4pm4qqvWEGbSTI4HKc6XJfB30MVw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-0xupsu9yj9oDVuQ50YCTS9nuSYhGlrwqdaKQel9y2Fz7LU9fNErVlw9N0o4pm4qqvWEGbSTI4HKc6XJfB30MVw==} + engines: {node: '>=18.0.0'} '@smithy/eventstream-serde-config-resolver@4.3.10': - resolution: - { - integrity: sha512-8kn6sinrduk0yaYHMJDsNuiFpXwQwibR7n/4CDUqn4UgaG+SeBHu5jHGFdU9BLFAM7Q4/gvr9RYxBHz9/jKrhA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-8kn6sinrduk0yaYHMJDsNuiFpXwQwibR7n/4CDUqn4UgaG+SeBHu5jHGFdU9BLFAM7Q4/gvr9RYxBHz9/jKrhA==} + engines: {node: '>=18.0.0'} '@smithy/eventstream-serde-node@4.2.10': - resolution: - { - integrity: sha512-uUrxPGgIffnYfvIOUmBM5i+USdEBRTdh7mLPttjphgtooxQ8CtdO1p6K5+Q4BBAZvKlvtJ9jWyrWpBJYzBKsyQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-uUrxPGgIffnYfvIOUmBM5i+USdEBRTdh7mLPttjphgtooxQ8CtdO1p6K5+Q4BBAZvKlvtJ9jWyrWpBJYzBKsyQ==} + engines: {node: '>=18.0.0'} '@smithy/eventstream-serde-universal@4.2.10': - resolution: - { - integrity: sha512-aArqzOEvcs2dK+xQVCgLbpJQGfZihw8SD4ymhkwNTtwKbnrzdhJsFDKuMQnam2kF69WzgJYOU5eJlCx+CA32bw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-aArqzOEvcs2dK+xQVCgLbpJQGfZihw8SD4ymhkwNTtwKbnrzdhJsFDKuMQnam2kF69WzgJYOU5eJlCx+CA32bw==} + engines: {node: '>=18.0.0'} '@smithy/fetch-http-handler@5.3.12': - resolution: - { - integrity: sha512-muS5tFw+A/uo+U+yig06vk1776UFM+aAp9hFM8efI4ZcHhTcgv6NTeK4x7ltHeMPBwnhEjcf0MULTyxNkSNxDw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-muS5tFw+A/uo+U+yig06vk1776UFM+aAp9hFM8efI4ZcHhTcgv6NTeK4x7ltHeMPBwnhEjcf0MULTyxNkSNxDw==} + engines: {node: '>=18.0.0'} '@smithy/hash-blob-browser@4.2.11': - resolution: - { - integrity: sha512-DrcAx3PM6AEbWZxsKl6CWAGnVwiz28Wp1ZhNu+Hi4uI/6C1PIZBIaPM2VoqBDAsOWbM6ZVzOEQMxFLLdmb4eBQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-DrcAx3PM6AEbWZxsKl6CWAGnVwiz28Wp1ZhNu+Hi4uI/6C1PIZBIaPM2VoqBDAsOWbM6ZVzOEQMxFLLdmb4eBQ==} + engines: {node: '>=18.0.0'} '@smithy/hash-node@4.2.10': - resolution: - { - integrity: sha512-1VzIOI5CcsvMDvP3iv1vG/RfLJVVVc67dCRyLSB2Hn9SWCZrDO3zvcIzj3BfEtqRW5kcMg5KAeVf1K3dR6nD3w==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-1VzIOI5CcsvMDvP3iv1vG/RfLJVVVc67dCRyLSB2Hn9SWCZrDO3zvcIzj3BfEtqRW5kcMg5KAeVf1K3dR6nD3w==} + engines: {node: '>=18.0.0'} '@smithy/hash-stream-node@4.2.10': - resolution: - { - integrity: sha512-w78xsYrOlwXKwN5tv1GnKIRbHb1HygSpeZMP6xDxCPGf1U/xDHjCpJu64c5T35UKyEPwa0bPeIcvU69VY3khUA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-w78xsYrOlwXKwN5tv1GnKIRbHb1HygSpeZMP6xDxCPGf1U/xDHjCpJu64c5T35UKyEPwa0bPeIcvU69VY3khUA==} + engines: {node: '>=18.0.0'} '@smithy/invalid-dependency@4.2.10': - resolution: - { - integrity: sha512-vy9KPNSFUU0ajFYk0sDZIYiUlAWGEAhRfehIr5ZkdFrRFTAuXEPUd41USuqHU6vvLX4r6Q9X7MKBco5+Il0Org==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-vy9KPNSFUU0ajFYk0sDZIYiUlAWGEAhRfehIr5ZkdFrRFTAuXEPUd41USuqHU6vvLX4r6Q9X7MKBco5+Il0Org==} + 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.1': - resolution: - { - integrity: sha512-Yfu664Qbf1B4IYIsYgKoABt010daZjkaCRvdU/sPnZG6TtHOB0md0RjNdLGzxe5UIdn9js4ftPICzmkRa9RJ4Q==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-Yfu664Qbf1B4IYIsYgKoABt010daZjkaCRvdU/sPnZG6TtHOB0md0RjNdLGzxe5UIdn9js4ftPICzmkRa9RJ4Q==} + engines: {node: '>=18.0.0'} '@smithy/md5-js@4.2.10': - resolution: - { - integrity: sha512-Op+Dh6dPLWTjWITChFayDllIaCXRofOed8ecpggTC5fkh8yXes0vAEX7gRUfjGK+TlyxoCAA05gHbZW/zB9JwQ==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-Op+Dh6dPLWTjWITChFayDllIaCXRofOed8ecpggTC5fkh8yXes0vAEX7gRUfjGK+TlyxoCAA05gHbZW/zB9JwQ==} + engines: {node: '>=18.0.0'} '@smithy/middleware-content-length@4.2.10': - resolution: - { - integrity: sha512-TQZ9kX5c6XbjhaEBpvhSvMEZ0klBs1CFtOdPFwATZSbC9UeQfKHPLPN9Y+I6wZGMOavlYTOlHEPDrt42PMSH9w==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-TQZ9kX5c6XbjhaEBpvhSvMEZ0klBs1CFtOdPFwATZSbC9UeQfKHPLPN9Y+I6wZGMOavlYTOlHEPDrt42PMSH9w==} + engines: {node: '>=18.0.0'} '@smithy/middleware-endpoint@4.4.21': - resolution: - { - integrity: sha512-CoVGZaqIC0tEjz0ga3ciwCMA5fd/4lIOwO2wx0fH+cTi1zxSFZnMJbIiIF9G1d4vRSDyTupDrpS3FKBBJGkRZg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-CoVGZaqIC0tEjz0ga3ciwCMA5fd/4lIOwO2wx0fH+cTi1zxSFZnMJbIiIF9G1d4vRSDyTupDrpS3FKBBJGkRZg==} + engines: {node: '>=18.0.0'} '@smithy/middleware-retry@4.4.38': - resolution: - { - integrity: sha512-WdHvdhjE6Fj78vxFwDKFDwlqGOGRUWrwGeuENUbTVE46Su9mnQM+dXHtbnCaQvwuSYrRsjpe8zUsFpwUp/azlA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-WdHvdhjE6Fj78vxFwDKFDwlqGOGRUWrwGeuENUbTVE46Su9mnQM+dXHtbnCaQvwuSYrRsjpe8zUsFpwUp/azlA==} + engines: {node: '>=18.0.0'} '@smithy/middleware-serde@4.2.11': - resolution: - { - integrity: sha512-STQdONGPwbbC7cusL60s7vOa6He6A9w2jWhoapL0mgVjmR19pr26slV+yoSP76SIssMTX/95e5nOZ6UQv6jolg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-STQdONGPwbbC7cusL60s7vOa6He6A9w2jWhoapL0mgVjmR19pr26slV+yoSP76SIssMTX/95e5nOZ6UQv6jolg==} + engines: {node: '>=18.0.0'} '@smithy/middleware-stack@4.2.10': - resolution: - { - integrity: sha512-pmts/WovNcE/tlyHa8z/groPeOtqtEpp61q3W0nW1nDJuMq/x+hWa/OVQBtgU0tBqupeXq0VBOLA4UZwE8I0YA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-pmts/WovNcE/tlyHa8z/groPeOtqtEpp61q3W0nW1nDJuMq/x+hWa/OVQBtgU0tBqupeXq0VBOLA4UZwE8I0YA==} + engines: {node: '>=18.0.0'} '@smithy/node-config-provider@4.3.10': - resolution: - { - integrity: sha512-UALRbJtVX34AdP2VECKVlnNgidLHA2A7YgcJzwSBg1hzmnO/bZBHl/LDQQyYifzUwp1UOODnl9JJ3KNawpUJ9w==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-UALRbJtVX34AdP2VECKVlnNgidLHA2A7YgcJzwSBg1hzmnO/bZBHl/LDQQyYifzUwp1UOODnl9JJ3KNawpUJ9w==} + engines: {node: '>=18.0.0'} '@smithy/node-http-handler@4.4.13': - resolution: - { - integrity: sha512-o8CP8w6tlUA0lk+Qfwm6Ed0jCWk3bEY6iBOJjdBaowbXKCSClk8zIHQvUL6RUZMvuNafF27cbRCMYqw6O1v4aA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-o8CP8w6tlUA0lk+Qfwm6Ed0jCWk3bEY6iBOJjdBaowbXKCSClk8zIHQvUL6RUZMvuNafF27cbRCMYqw6O1v4aA==} + engines: {node: '>=18.0.0'} '@smithy/property-provider@4.2.10': - resolution: - { - integrity: sha512-5jm60P0CU7tom0eNrZ7YrkgBaoLFXzmqB0wVS+4uK8PPGmosSrLNf6rRd50UBvukztawZ7zyA8TxlrKpF5z9jw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-5jm60P0CU7tom0eNrZ7YrkgBaoLFXzmqB0wVS+4uK8PPGmosSrLNf6rRd50UBvukztawZ7zyA8TxlrKpF5z9jw==} + engines: {node: '>=18.0.0'} '@smithy/protocol-http@5.3.10': - resolution: - { - integrity: sha512-2NzVWpYY0tRdfeCJLsgrR89KE3NTWT2wGulhNUxYlRmtRmPwLQwKzhrfVaiNlA9ZpJvbW7cjTVChYKgnkqXj1A==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-2NzVWpYY0tRdfeCJLsgrR89KE3NTWT2wGulhNUxYlRmtRmPwLQwKzhrfVaiNlA9ZpJvbW7cjTVChYKgnkqXj1A==} + engines: {node: '>=18.0.0'} '@smithy/querystring-builder@4.2.10': - resolution: - { - integrity: sha512-HeN7kEvuzO2DmAzLukE9UryiUvejD3tMp9a1D1NJETerIfKobBUCLfviP6QEk500166eD2IATaXM59qgUI+YDA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-HeN7kEvuzO2DmAzLukE9UryiUvejD3tMp9a1D1NJETerIfKobBUCLfviP6QEk500166eD2IATaXM59qgUI+YDA==} + engines: {node: '>=18.0.0'} '@smithy/querystring-parser@4.2.10': - resolution: - { - integrity: sha512-4Mh18J26+ao1oX5wXJfWlTT+Q1OpDR8ssiC9PDOuEgVBGloqg18Fw7h5Ct8DyT9NBYwJgtJ2nLjKKFU6RP1G1Q==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-4Mh18J26+ao1oX5wXJfWlTT+Q1OpDR8ssiC9PDOuEgVBGloqg18Fw7h5Ct8DyT9NBYwJgtJ2nLjKKFU6RP1G1Q==} + engines: {node: '>=18.0.0'} '@smithy/service-error-classification@4.2.10': - resolution: - { - integrity: sha512-0R/+/Il5y8nB/By90o8hy/bWVYptbIfvoTYad0igYQO5RefhNCDmNzqxaMx7K1t/QWo0d6UynqpqN5cCQt1MCg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-0R/+/Il5y8nB/By90o8hy/bWVYptbIfvoTYad0igYQO5RefhNCDmNzqxaMx7K1t/QWo0d6UynqpqN5cCQt1MCg==} + engines: {node: '>=18.0.0'} '@smithy/shared-ini-file-loader@4.4.5': - resolution: - { - integrity: sha512-pHgASxl50rrtOztgQCPmOXFjRW+mCd7ALr/3uXNzRrRoGV5G2+78GOsQ3HlQuBVHCh9o6xqMNvlIKZjWn4Euug==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-pHgASxl50rrtOztgQCPmOXFjRW+mCd7ALr/3uXNzRrRoGV5G2+78GOsQ3HlQuBVHCh9o6xqMNvlIKZjWn4Euug==} + engines: {node: '>=18.0.0'} '@smithy/signature-v4@5.3.10': - resolution: - { - integrity: sha512-Wab3wW8468WqTKIxI+aZe3JYO52/RYT/8sDOdzkUhjnLakLe9qoQqIcfih/qxcF4qWEFoWBszY0mj5uxffaVXA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-Wab3wW8468WqTKIxI+aZe3JYO52/RYT/8sDOdzkUhjnLakLe9qoQqIcfih/qxcF4qWEFoWBszY0mj5uxffaVXA==} + engines: {node: '>=18.0.0'} '@smithy/smithy-client@4.12.1': - resolution: - { - integrity: sha512-Xf9UFHlAihewfkmLNZ6I/Ek6kcYBKoU3cbRS9Z4q++9GWoW0YFbAHs7wMbuXm+nGuKHZ5OKheZMuDdaWPv8DJw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-Xf9UFHlAihewfkmLNZ6I/Ek6kcYBKoU3cbRS9Z4q++9GWoW0YFbAHs7wMbuXm+nGuKHZ5OKheZMuDdaWPv8DJw==} + engines: {node: '>=18.0.0'} '@smithy/types@4.13.0': - resolution: - { - integrity: sha512-COuLsZILbbQsdrwKQpkkpyep7lCsByxwj7m0Mg5v66/ZTyenlfBc40/QFQ5chO0YN/PNEH1Bi3fGtfXPnYNeDw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-COuLsZILbbQsdrwKQpkkpyep7lCsByxwj7m0Mg5v66/ZTyenlfBc40/QFQ5chO0YN/PNEH1Bi3fGtfXPnYNeDw==} + engines: {node: '>=18.0.0'} '@smithy/url-parser@4.2.10': - resolution: - { - integrity: sha512-uypjF7fCDsRk26u3qHmFI/ePL7bxxB9vKkE+2WKEciHhz+4QtbzWiHRVNRJwU3cKhrYDYQE3b0MRFtqfLYdA4A==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-uypjF7fCDsRk26u3qHmFI/ePL7bxxB9vKkE+2WKEciHhz+4QtbzWiHRVNRJwU3cKhrYDYQE3b0MRFtqfLYdA4A==} + engines: {node: '>=18.0.0'} '@smithy/util-base64@4.3.1': - resolution: - { - integrity: sha512-BKGuawX4Doq/bI/uEmg+Zyc36rJKWuin3py89PquXBIBqmbnJwBBsmKhdHfNEp0+A4TDgLmT/3MSKZ1SxHcR6w==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-BKGuawX4Doq/bI/uEmg+Zyc36rJKWuin3py89PquXBIBqmbnJwBBsmKhdHfNEp0+A4TDgLmT/3MSKZ1SxHcR6w==} + engines: {node: '>=18.0.0'} '@smithy/util-body-length-browser@4.2.1': - resolution: - { - integrity: sha512-SiJeLiozrAoCrgDBUgsVbmqHmMgg/2bA15AzcbcW+zan7SuyAVHN4xTSbq0GlebAIwlcaX32xacnrG488/J/6g==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-SiJeLiozrAoCrgDBUgsVbmqHmMgg/2bA15AzcbcW+zan7SuyAVHN4xTSbq0GlebAIwlcaX32xacnrG488/J/6g==} + engines: {node: '>=18.0.0'} '@smithy/util-body-length-node@4.2.2': - resolution: - { - integrity: sha512-4rHqBvxtJEBvsZcFQSPQqXP2b/yy/YlB66KlcEgcH2WNoOKCKB03DSLzXmOsXjbl8dJ4OEYTn31knhdznwk7zw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-4rHqBvxtJEBvsZcFQSPQqXP2b/yy/YlB66KlcEgcH2WNoOKCKB03DSLzXmOsXjbl8dJ4OEYTn31knhdznwk7zw==} + 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.1': - resolution: - { - integrity: sha512-/swhmt1qTiVkaejlmMPPDgZhEaWb/HWMGRBheaxwuVkusp/z+ErJyQxO6kaXumOciZSWlmq6Z5mNylCd33X7Ig==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-/swhmt1qTiVkaejlmMPPDgZhEaWb/HWMGRBheaxwuVkusp/z+ErJyQxO6kaXumOciZSWlmq6Z5mNylCd33X7Ig==} + engines: {node: '>=18.0.0'} '@smithy/util-config-provider@4.2.1': - resolution: - { - integrity: sha512-462id/00U8JWFw6qBuTSWfN5TxOHvDu4WliI97qOIOnuC/g+NDAknTU8eoGXEPlLkRVgWEr03jJBLV4o2FL8+A==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-462id/00U8JWFw6qBuTSWfN5TxOHvDu4WliI97qOIOnuC/g+NDAknTU8eoGXEPlLkRVgWEr03jJBLV4o2FL8+A==} + engines: {node: '>=18.0.0'} '@smithy/util-defaults-mode-browser@4.3.37': - resolution: - { - integrity: sha512-JlPZhV1kQCGNJgofRTU6E8kHrjCKsb6cps8gco8QDVaFl7biFYzHg0p1x89ytIWyVyCkY3nOpO8tJPM47Vqlww==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-JlPZhV1kQCGNJgofRTU6E8kHrjCKsb6cps8gco8QDVaFl7biFYzHg0p1x89ytIWyVyCkY3nOpO8tJPM47Vqlww==} + engines: {node: '>=18.0.0'} '@smithy/util-defaults-mode-node@4.2.40': - resolution: - { - integrity: sha512-BM5cPEsyxHdYYO4Da77E94lenhaVPNUzBTyCGDkcw/n/mE8Q1cfHwr+n/w2bNPuUsPC30WaW5/hGKWOTKqw8kw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-BM5cPEsyxHdYYO4Da77E94lenhaVPNUzBTyCGDkcw/n/mE8Q1cfHwr+n/w2bNPuUsPC30WaW5/hGKWOTKqw8kw==} + engines: {node: '>=18.0.0'} '@smithy/util-endpoints@3.3.1': - resolution: - { - integrity: sha512-xyctc4klmjmieQiF9I1wssBWleRV0RhJ2DpO8+8yzi2LO1Z+4IWOZNGZGNj4+hq9kdo+nyfrRLmQTzc16Op2Vg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-xyctc4klmjmieQiF9I1wssBWleRV0RhJ2DpO8+8yzi2LO1Z+4IWOZNGZGNj4+hq9kdo+nyfrRLmQTzc16Op2Vg==} + engines: {node: '>=18.0.0'} '@smithy/util-hex-encoding@4.2.1': - resolution: - { - integrity: sha512-c1hHtkgAWmE35/50gmdKajgGAKV3ePJ7t6UtEmpfCWJmQE9BQAQPz0URUVI89eSkcDqCtzqllxzG28IQoZPvwA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-c1hHtkgAWmE35/50gmdKajgGAKV3ePJ7t6UtEmpfCWJmQE9BQAQPz0URUVI89eSkcDqCtzqllxzG28IQoZPvwA==} + engines: {node: '>=18.0.0'} '@smithy/util-middleware@4.2.10': - resolution: - { - integrity: sha512-LxaQIWLp4y0r72eA8mwPNQ9va4h5KeLM0I3M/HV9klmFaY2kN766wf5vsTzmaOpNNb7GgXAd9a25P3h8T49PSA==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-LxaQIWLp4y0r72eA8mwPNQ9va4h5KeLM0I3M/HV9klmFaY2kN766wf5vsTzmaOpNNb7GgXAd9a25P3h8T49PSA==} + engines: {node: '>=18.0.0'} '@smithy/util-retry@4.2.10': - resolution: - { - integrity: sha512-HrBzistfpyE5uqTwiyLsFHscgnwB0kgv8vySp7q5kZ0Eltn/tjosaSGGDj/jJ9ys7pWzIP/icE2d+7vMKXLv7A==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-HrBzistfpyE5uqTwiyLsFHscgnwB0kgv8vySp7q5kZ0Eltn/tjosaSGGDj/jJ9ys7pWzIP/icE2d+7vMKXLv7A==} + engines: {node: '>=18.0.0'} '@smithy/util-stream@4.5.16': - resolution: - { - integrity: sha512-c7awZV6cxY0czgDDSr+Bz0XfRtg8AwW2BWhrHhLJISrpmwv8QzA2qzTllWyMVNdy1+UJr9vCm29hzuh3l8TTFw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-c7awZV6cxY0czgDDSr+Bz0XfRtg8AwW2BWhrHhLJISrpmwv8QzA2qzTllWyMVNdy1+UJr9vCm29hzuh3l8TTFw==} + engines: {node: '>=18.0.0'} '@smithy/util-uri-escape@4.2.1': - resolution: - { - integrity: sha512-YmiUDn2eo2IOiWYYvGQkgX5ZkBSiTQu4FlDo5jNPpAxng2t6Sjb6WutnZV9l6VR4eJul1ABmCrnWBC9hKHQa6Q==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-YmiUDn2eo2IOiWYYvGQkgX5ZkBSiTQu4FlDo5jNPpAxng2t6Sjb6WutnZV9l6VR4eJul1ABmCrnWBC9hKHQa6Q==} + 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.1': - resolution: - { - integrity: sha512-DSIwNaWtmzrNQHv8g7DBGR9mulSit65KSj5ymGEIAknmIN8IpbZefEep10LaMG/P/xquwbmJ1h9ectz8z6mV6g==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-DSIwNaWtmzrNQHv8g7DBGR9mulSit65KSj5ymGEIAknmIN8IpbZefEep10LaMG/P/xquwbmJ1h9ectz8z6mV6g==} + engines: {node: '>=18.0.0'} '@smithy/util-waiter@4.2.10': - resolution: - { - integrity: sha512-4eTWph/Lkg1wZEDAyObwme0kmhEb7J/JjibY2znJdrYRgKbKqB7YoEhhJVJ4R1g/SYih4zuwX7LpJaM8RsnTVg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-4eTWph/Lkg1wZEDAyObwme0kmhEb7J/JjibY2znJdrYRgKbKqB7YoEhhJVJ4R1g/SYih4zuwX7LpJaM8RsnTVg==} + engines: {node: '>=18.0.0'} '@smithy/uuid@1.1.1': - resolution: - { - integrity: sha512-dSfDCeihDmZlV2oyr0yWPTUfh07suS+R5OB+FZGiv/hHyK3hrFBW5rR1UYjfa57vBsrP9lciFkRPzebaV1Qujw==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-dSfDCeihDmZlV2oyr0yWPTUfh07suS+R5OB+FZGiv/hHyK3hrFBW5rR1UYjfa57vBsrP9lciFkRPzebaV1Qujw==} + 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==} '@swc/helpers@0.5.18': - resolution: - { - integrity: sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==, - } + resolution: {integrity: sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==} '@tanstack/query-core@5.90.20': - resolution: - { - integrity: sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==, - } + resolution: {integrity: sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==} '@tanstack/react-query@5.90.21': - resolution: - { - integrity: sha512-0Lu6y5t+tvlTJMTO7oh5NSpJfpg/5D41LlThfepTixPYkJ0sE2Jj0m0f6yYqujBwIXlId87e234+MxG3D3g7kg==, - } + resolution: {integrity: sha512-0Lu6y5t+tvlTJMTO7oh5NSpJfpg/5D41LlThfepTixPYkJ0sE2Jj0m0f6yYqujBwIXlId87e234+MxG3D3g7kg==} peerDependencies: react: ^18 || ^19 '@tanstack/react-virtual@3.13.18': - resolution: - { - integrity: sha512-dZkhyfahpvlaV0rIKnvQiVoWPyURppl6w4m9IwMDpuIjcJ1sD9YGWrt0wISvgU7ewACXx2Ct46WPgI6qAD4v6A==, - } + resolution: {integrity: sha512-dZkhyfahpvlaV0rIKnvQiVoWPyURppl6w4m9IwMDpuIjcJ1sD9YGWrt0wISvgU7ewACXx2Ct46WPgI6qAD4v6A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 '@tanstack/virtual-core@3.13.18': - resolution: - { - integrity: sha512-Mx86Hqu1k39icq2Zusq+Ey2J6dDWTjDvEv43PJtRCoEYTLyfaPnxIQ6iy7YAOK0NV/qOEmZQ/uCufrppZxTgcg==, - } + resolution: {integrity: sha512-Mx86Hqu1k39icq2Zusq+Ey2J6dDWTjDvEv43PJtRCoEYTLyfaPnxIQ6iy7YAOK0NV/qOEmZQ/uCufrppZxTgcg==} '@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: '*' '@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==} '@tsconfig/node20@20.1.9': - resolution: - { - integrity: sha512-IjlTv1RsvnPtUcjTqtVsZExKVq+KQx4g5pCP5tI7rAs6Xesl2qFwSz/tPDBC4JajkL/MlezBu3gPUwqRHl+RIg==, - } + resolution: {integrity: sha512-IjlTv1RsvnPtUcjTqtVsZExKVq+KQx4g5pCP5tI7rAs6Xesl2qFwSz/tPDBC4JajkL/MlezBu3gPUwqRHl+RIg==} '@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/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/cookiejar@2.1.5': - resolution: - { - integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==, - } + resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} '@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/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/interpret@1.1.4': - resolution: - { - integrity: sha512-r+tPKWHYqaxJOYA3Eik0mMi+SEREqOXLmsooRFmc6GHv7nWUDixFtKN+cegvsPlDcEZd9wxsdp041v2imQuvag==, - } + resolution: {integrity: sha512-r+tPKWHYqaxJOYA3Eik0mMi+SEREqOXLmsooRFmc6GHv7nWUDixFtKN+cegvsPlDcEZd9wxsdp041v2imQuvag==} '@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@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/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/methods@1.1.4': - resolution: - { - integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==, - } + resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} '@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/multer@2.0.0': - resolution: - { - integrity: sha512-C3Z9v9Evij2yST3RSBktxP9STm6OdMc5uR1xF1SGr98uv8dUlAL2hqwrZ3GVB3uyMyiegnscEK6PGtYvNrjTjw==, - } + resolution: {integrity: sha512-C3Z9v9Evij2yST3RSBktxP9STm6OdMc5uR1xF1SGr98uv8dUlAL2hqwrZ3GVB3uyMyiegnscEK6PGtYvNrjTjw==} '@types/node@22.19.11': - resolution: - { - integrity: sha512-BH7YwL6rA93ReqeQS1c4bsPpcfOmJasG+Fkr6Y59q83f9M1WcBRHR2vM+P9eOisYRcN3ujQoiZY8uk5W+1WL8w==, - } + resolution: {integrity: sha512-BH7YwL6rA93ReqeQS1c4bsPpcfOmJasG+Fkr6Y59q83f9M1WcBRHR2vM+P9eOisYRcN3ujQoiZY8uk5W+1WL8w==} '@types/node@25.3.3': - resolution: - { - integrity: sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==, - } + resolution: {integrity: sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==} '@types/nodemailer@7.0.11': - resolution: - { - integrity: sha512-E+U4RzR2dKrx+u3N4DlsmLaDC6mMZOM/TPROxA0UAPiTgI0y4CEFBmZE+coGWTjakDriRsXG368lNk1u9Q0a2g==, - } + resolution: {integrity: sha512-E+U4RzR2dKrx+u3N4DlsmLaDC6mMZOM/TPROxA0UAPiTgI0y4CEFBmZE+coGWTjakDriRsXG368lNk1u9Q0a2g==} '@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.18.0': - resolution: - { - integrity: sha512-gT+oueVQkqnj6ajGJXblFR4iavIXWsGAFCk3dP4Kki5+a9R4NMt0JARdk6s8cUKcfUoqP5dAtDSLU8xYUTFV+Q==, - } + resolution: {integrity: sha512-gT+oueVQkqnj6ajGJXblFR4iavIXWsGAFCk3dP4Kki5+a9R4NMt0JARdk6s8cUKcfUoqP5dAtDSLU8xYUTFV+Q==} '@types/pluralize@0.0.33': - resolution: - { - integrity: sha512-JOqsl+ZoCpP4e8TDke9W79FDcSgPAR0l6pixx2JHkhnRjvShyYiAYw2LVsnA7K08Y6DeOnaU6ujmENO4os/cYg==, - } + resolution: {integrity: sha512-JOqsl+ZoCpP4e8TDke9W79FDcSgPAR0l6pixx2JHkhnRjvShyYiAYw2LVsnA7K08Y6DeOnaU6ujmENO4os/cYg==} '@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-dom@19.2.3': - resolution: - { - integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==, - } + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: '@types/react': ^19.2.0 '@types/react@19.2.14': - resolution: - { - integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==, - } + resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} '@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.10.0': - resolution: - { - integrity: sha512-OEfyhE5Ox+FeoHbhrEDwm0kXxntO6nsyMRCFvNsIBHPZu5rV1w2OjPcLclaC/IZ1TlzZPgbeMfwAZEi5N238yQ==, - } + resolution: {integrity: sha512-OEfyhE5Ox+FeoHbhrEDwm0kXxntO6nsyMRCFvNsIBHPZu5rV1w2OjPcLclaC/IZ1TlzZPgbeMfwAZEi5N238yQ==} '@types/smtp-server@3.5.12': - resolution: - { - integrity: sha512-IBemrqI6nzvbgwE41Lnd4v4Yf1Kc7F1UHjk1GFBLNhLcI/Zop1ggHQ8g7Y8QYc6jGVgzWQcsa0MBNcGnDY9UGw==, - } + resolution: {integrity: sha512-IBemrqI6nzvbgwE41Lnd4v4Yf1Kc7F1UHjk1GFBLNhLcI/Zop1ggHQ8g7Y8QYc6jGVgzWQcsa0MBNcGnDY9UGw==} '@types/stack-utils@2.0.3': - resolution: - { - integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==, - } + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} '@types/superagent@8.1.9': - resolution: - { - integrity: sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==, - } + resolution: {integrity: sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==} '@types/supertest@7.2.0': - resolution: - { - integrity: sha512-uh2Lv57xvggst6lCqNdFAmDSvoMG7M/HDtX4iUCquxQ5EGPtaPM5PL5Hmi7LCvOG8db7YaCPNJEeoI8s/WzIQw==, - } + resolution: {integrity: sha512-uh2Lv57xvggst6lCqNdFAmDSvoMG7M/HDtX4iUCquxQ5EGPtaPM5PL5Hmi7LCvOG8db7YaCPNJEeoI8s/WzIQw==} '@types/testing-library__jest-dom@5.14.9': - resolution: - { - integrity: sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==, - } + resolution: {integrity: sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==} '@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.56.1': - resolution: - { - integrity: sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.56.1 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/parser@8.56.1': - resolution: - { - integrity: sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/project-service@8.56.1': - resolution: - { - integrity: sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/scope-manager@8.56.1': - resolution: - { - integrity: sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/tsconfig-utils@8.56.1': - resolution: - { - integrity: sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/type-utils@8.56.1': - resolution: - { - integrity: sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/types@8.56.1': - resolution: - { - integrity: sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@8.56.1': - resolution: - { - integrity: sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/utils@8.56.1': - resolution: - { - integrity: sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/visitor-keys@8.56.1': - resolution: - { - integrity: sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==, - } - engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + resolution: {integrity: sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==} + 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] '@vitejs/plugin-react@4.7.0': - resolution: - { - integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==, - } - engines: { node: ^14.18.0 || >=16.0.0 } + resolution: {integrity: sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 '@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} 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@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@8.18.0: - resolution: - { - integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==, - } + resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} 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@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'} append-field@1.0.0: - resolution: - { - integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==, - } + resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==} appstash@0.5.0: - resolution: - { - integrity: sha512-f9CkbNq1UK2aRn7ErcZI4C1ojInalknp+GsjHnlGSM35sKDBYf6lDc3Z6hViH751hOI0tSrNcFunkaYvxWYgKQ==, - } + resolution: {integrity: sha512-f9CkbNq1UK2aRn7ErcZI4C1ojInalknp+GsjHnlGSM35sKDBYf6lDc3Z6hViH751hOI0tSrNcFunkaYvxWYgKQ==} 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-hidden@1.2.6: - resolution: - { - integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} 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'} asap@2.0.6: - resolution: - { - integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==, - } + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} async-retry@1.3.3: - resolution: - { - integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==, - } + resolution: {integrity: sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==} 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 axios@1.13.2: - resolution: - { - integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==, - } + resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==} 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@7.0.1: - resolution: - { - integrity: sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==} + engines: {node: '>=12'} 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@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==} balanced-match@1.0.2: - resolution: - { - integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, - } + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} balanced-match@4.0.4: - resolution: - { - integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==, - } - engines: { node: 18 || 20 || >=22 } + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} base-64@1.0.0: - resolution: - { - integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==, - } + resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} base64-js@1.5.1: - resolution: - { - integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, - } + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} baseline-browser-mapping@2.9.15: - resolution: - { - integrity: sha512-kX8h7K2srmDyYnXRIppo4AH/wYgzWVCs+eKr3RusRSQ5PvRYoEFmR/I0PbdTjKFAoKqp5+kbxnNTFO9jOfSVJg==, - } + resolution: {integrity: sha512-kX8h7K2srmDyYnXRIppo4AH/wYgzWVCs+eKr3RusRSQ5PvRYoEFmR/I0PbdTjKFAoKqp5+kbxnNTFO9jOfSVJg==} hasBin: true 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@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.14.1: - resolution: - { - integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==, - } + resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} 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==} brace-expansion@5.0.4: - resolution: - { - integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==, - } - engines: { node: 18 || 20 || >=22 } + resolution: {integrity: sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==} + engines: {node: 18 || 20 || >=22} 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'} busboy@1.6.0: - resolution: - { - integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==, - } - engines: { node: '>=10.16.0' } + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.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.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-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.30001765: - resolution: - { - integrity: sha512-LWcNtSyZrakjECqmpP4qdg0MMGdN368D7X8XvvAqOcqMv0RxnlqVKZl2V6/mBR68oYMxOZPLw/gO7DuisMHUvQ==, - } + resolution: {integrity: sha512-LWcNtSyZrakjECqmpP4qdg0MMGdN368D7X8XvvAqOcqMv0RxnlqVKZl2V6/mBR68oYMxOZPLw/gO7DuisMHUvQ==} case@1.6.3: - resolution: - { - integrity: sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==, - } - engines: { node: '>= 0.8.0' } + resolution: {integrity: sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==} + engines: {node: '>= 0.8.0'} 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@2.2.0: - resolution: - { - integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==, - } + resolution: {integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==} clean-ansi@0.2.1: - resolution: - { - integrity: sha512-V9IOKBKHv0Sqay4efImuCVWwO8kVmaKU66cvbDBa99F21j2G3ye3mrKkPSfZ7RTR7yP4CNDjtESkNY5dFq+8Sg==, - } + resolution: {integrity: sha512-V9IOKBKHv0Sqay4efImuCVWwO8kVmaKU66cvbDBa99F21j2G3ye3mrKkPSfZ7RTR7yP4CNDjtESkNY5dFq+8Sg==} 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'} clsx@1.2.1: - resolution: - { - integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} clsx@2.1.1: - resolution: - { - integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} 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' } + 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@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.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@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@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==} component-emitter@1.3.1: - resolution: - { - integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==, - } + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} 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'} cookiejar@2.1.4: - resolution: - { - integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==, - } + resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} 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.3: - resolution: - { - integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, - } + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} cors@2.8.6: - resolution: - { - integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==, - } - engines: { node: '>= 0.10' } + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} + 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: @@ -8123,128 +5989,71 @@ packages: optional: true create-require@1.1.1: - resolution: - { - integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==, - } + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} cron-parser@4.9.0: - resolution: - { - integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==, - } - engines: { node: '>=12.0.0' } + resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} + engines: {node: '>=12.0.0'} 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@3.2.0: - resolution: - { - integrity: sha512-fgKbp+AJbn1h2dcAHKIdKNSSjfp43BZZykXsCjzALjKy80VXQNHPFJ6T9Afwdzoj24aMkq8GwDS7KGcDPpejrA==, - } - engines: { node: '>= 10' } + resolution: {integrity: sha512-fgKbp+AJbn1h2dcAHKIdKNSSjfp43BZZykXsCjzALjKy80VXQNHPFJ6T9Afwdzoj24aMkq8GwDS7KGcDPpejrA==} + engines: {node: '>= 10'} 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'} dateformat@3.0.3: - resolution: - { - integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==, - } + resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} debounce-promise@3.1.2: - resolution: - { - integrity: sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg==, - } + resolution: {integrity: sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg==} 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: @@ -8252,31 +6061,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: @@ -8284,10 +6081,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: @@ -8295,230 +6089,125 @@ 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-lazy-prop@2.0.0: - resolution: - { - integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==, - } - engines: { node: '>=8' } + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} 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-es@1.1.0: - resolution: - { - integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==, - } + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} detect-node@2.1.0: - resolution: - { - integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==, - } + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} dezalgo@1.0.4: - resolution: - { - integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==, - } + resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} 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'} 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' @@ -8610,270 +6299,153 @@ 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==} 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@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'} esbuild@0.25.12: - resolution: - { - integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} hasBin: true 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'} 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.4.1: - resolution: - { - integrity: sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ==, - } + resolution: {integrity: sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ==} peerDependencies: '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 eslint: ^10.0.0 || ^9.0.0 || ^8.0.0 @@ -8882,39 +6454,24 @@ 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-visitor-keys@5.0.1: - resolution: - { - integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==, - } - engines: { node: ^20.19.0 || ^22.13.0 || >=24 } + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} 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: '*' @@ -8923,183 +6480,102 @@ 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@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@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@4.0.7: - resolution: - { - integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==, - } + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} eventemitter3@5.0.4: - resolution: - { - integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==, - } + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} 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'} 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'} 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-safe-stringify@2.1.1: - resolution: - { - integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==, - } + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} fast-uri@3.1.0: - resolution: - { - integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==, - } + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} fast-xml-builder@1.0.0: - resolution: - { - integrity: sha512-fpZuDogrAgnyt9oDDz+5DBz0zgPdPZz6D4IR7iESxRXElrlGTRkHJ9eEt+SACRJwT0FNFrt71DFQIUFBJfX/uQ==, - } + resolution: {integrity: sha512-fpZuDogrAgnyt9oDDz+5DBz0zgPdPZz6D4IR7iESxRXElrlGTRkHJ9eEt+SACRJwT0FNFrt71DFQIUFBJfX/uQ==} fast-xml-parser@5.4.1: - resolution: - { - integrity: sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A==, - } + resolution: {integrity: sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A==} 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: @@ -9107,92 +6583,53 @@ 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'} 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@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.9.1: - resolution: - { - integrity: sha512-jFpCL0XgjipSk109viUtfp+NyR/oW6a4Xus4tV3UYkmCbsjisEeZD1x5QnD1NDDK/hXas1WFs4yO13L4TPXWlQ==, - } + resolution: {integrity: sha512-jFpCL0XgjipSk109viUtfp+NyR/oW6a4Xus4tV3UYkmCbsjisEeZD1x5QnD1NDDK/hXas1WFs4yO13L4TPXWlQ==} 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: @@ -9200,38 +6637,23 @@ packages: optional: true foreground-child@3.3.1: - resolution: - { - integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} form-data@4.0.5: - resolution: - { - integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==, - } - engines: { node: '>= 6' } + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} formidable@3.5.4: - resolution: - { - integrity: sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==, - } - engines: { node: '>=14.0.0' } + resolution: {integrity: sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==} + engines: {node: '>=14.0.0'} forwarded@0.2.0: - resolution: - { - integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} framer-motion@12.34.0: - resolution: - { - integrity: sha512-+/H49owhzkzQyxtn7nZeF4kdH++I2FWrESQ184Zbcw5cEqNHYkE5yxWxcTLSj5lNx3NWdbIRy5FHqUvetD8FWg==, - } + resolution: {integrity: sha512-+/H49owhzkzQyxtn7nZeF4kdH++I2FWrESQ184Zbcw5cEqNHYkE5yxWxcTLSj5lNx3NWdbIRy5FHqUvetD8FWg==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -9245,306 +6667,177 @@ packages: optional: true 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] function-bind@1.1.2: - resolution: - { - integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==, - } + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} genomic@5.3.5: - resolution: - { - integrity: sha512-VDaKXRUjqR15DjXjx5qCxkHPBzUR7TFKbuOXSpifesUY7vmsYM9/EivetfbVJ957pheSIV+qDyojKuU08uLNfQ==, - } + resolution: {integrity: sha512-VDaKXRUjqR15DjXjx5qCxkHPBzUR7TFKbuOXSpifesUY7vmsYM9/EivetfbVJ957pheSIV+qDyojKuU08uLNfQ==} 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-nonce@1.0.1: - resolution: - { - integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} 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-value@3.0.1: - resolution: - { - integrity: sha512-mKZj9JLQrwMBtj5wxi6MH8Z5eSKaERpAwjg43dPtlGI1ZVEgH/qC7T8/6R2OBSUA+zzHBZgICsVJaEIV2tKTDA==, - } - engines: { node: '>=6.0' } + resolution: {integrity: sha512-mKZj9JLQrwMBtj5wxi6MH8Z5eSKaERpAwjg43dPtlGI1ZVEgH/qC7T8/6R2OBSUA+zzHBZgICsVJaEIV2tKTDA==} + engines: {node: '>=6.0'} 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'} deprecated: This package is no longer maintained. For the JavaScript API, please use @conventional-changelog/git-client instead. 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'} deprecated: This package is no longer maintained. For the JavaScript API, please use @conventional-changelog/git-client instead. 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==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@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} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@13.0.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@13.0.6: - resolution: - { - integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==, - } - engines: { node: 18 || 20 || >=22 } + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} glob@7.2.3: - resolution: - { - integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==, - } + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me 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'} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me globals@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==} grafast@1.0.0-rc.7: - resolution: - { - integrity: sha512-MZSg/6vFhs3FS2oe8XHsH2rcQ+ASnwNdomgDUI4SqIh8/qO4WkZVOn/iwyDO2sBgsT1Ck2Wovy8PkDUpMYt8JQ==, - } - engines: { node: '>=22' } + resolution: {integrity: sha512-MZSg/6vFhs3FS2oe8XHsH2rcQ+ASnwNdomgDUI4SqIh8/qO4WkZVOn/iwyDO2sBgsT1Ck2Wovy8PkDUpMYt8JQ==} + engines: {node: '>=22'} peerDependencies: '@envelop/core': ^5.0.0 graphql: 16.13.0 @@ -9553,11 +6846,8 @@ packages: optional: true grafserv@1.0.0-rc.6: - resolution: - { - integrity: sha512-1ZM4ZBLN7SxG1genI3k19RePjA4FsWCPH+RYW3DV/4im/27zbAQurj7DgK/5IoNXXBax6OCXezX1lx2aDEMnDw==, - } - engines: { node: '>=22' } + resolution: {integrity: sha512-1ZM4ZBLN7SxG1genI3k19RePjA4FsWCPH+RYW3DV/4im/27zbAQurj7DgK/5IoNXXBax6OCXezX1lx2aDEMnDw==} + engines: {node: '>=22'} peerDependencies: '@envelop/core': ^5.0.0 '@whatwg-node/server': ^0.9.64 @@ -9580,11 +6870,8 @@ packages: optional: true graphile-build-pg@5.0.0-rc.5: - resolution: - { - integrity: sha512-fUGPju4HeHt+XeA0Ci2pBlnfN/qUuurZOShPiLK7CcjnRCCmWJmsJhFvLwkKg/dLdsEfchVrVdY2FrvhAXgaww==, - } - engines: { node: '>=22' } + resolution: {integrity: sha512-fUGPju4HeHt+XeA0Ci2pBlnfN/qUuurZOShPiLK7CcjnRCCmWJmsJhFvLwkKg/dLdsEfchVrVdY2FrvhAXgaww==} + engines: {node: '>=22'} peerDependencies: '@dataplan/pg': ^1.0.0-rc.5 grafast: ^1.0.0-rc.7 @@ -9599,29 +6886,20 @@ packages: optional: true graphile-build@5.0.0-rc.4: - resolution: - { - integrity: sha512-LOzqlccyOuYIK/+3239+FChTfDdysJBg1dB0oJrf5mHzxrcMCPFaUau+usgRRPrOYmBp4R9SJM75SnIQQqStMQ==, - } - engines: { node: '>=22' } + resolution: {integrity: sha512-LOzqlccyOuYIK/+3239+FChTfDdysJBg1dB0oJrf5mHzxrcMCPFaUau+usgRRPrOYmBp4R9SJM75SnIQQqStMQ==} + engines: {node: '>=22'} peerDependencies: grafast: ^1.0.0-rc.5 graphile-config: ^1.0.0-rc.4 graphql: 16.13.0 graphile-config@1.0.0-rc.5: - resolution: - { - integrity: sha512-NKUREBAEVxe4/YNClbW9F95cosykbVxO3k5suDlfA8VKQzzembhiz3sJvE03PoII1Qetf4RpprZCIZNMd5h/QA==, - } - engines: { node: '>=22' } + resolution: {integrity: sha512-NKUREBAEVxe4/YNClbW9F95cosykbVxO3k5suDlfA8VKQzzembhiz3sJvE03PoII1Qetf4RpprZCIZNMd5h/QA==} + engines: {node: '>=22'} graphile-utils@5.0.0-rc.5: - resolution: - { - integrity: sha512-oXPLOU7N7Rc6wJoixIHtant2LITVoVMgUcytT8cp/KgpYJ7KHabiCHW90rBqaq9fy2+XaemTHEjpb+r2/3FzUw==, - } - engines: { node: '>=22' } + resolution: {integrity: sha512-oXPLOU7N7Rc6wJoixIHtant2LITVoVMgUcytT8cp/KgpYJ7KHabiCHW90rBqaq9fy2+XaemTHEjpb+r2/3FzUw==} + engines: {node: '>=22'} peerDependencies: '@dataplan/pg': ^1.0.0-rc.4 grafast: ^1.0.0-rc.6 @@ -9635,11 +6913,8 @@ packages: optional: true graphile-utils@5.0.0-rc.6: - resolution: - { - integrity: sha512-CTvHAvQd4nwAvEldaRIiGFClOjb8I1IIv8x55tcSDLdjuPsVlldWA6nOfdTypdZE7vcc2YrMt6xAU9mwjeOo6g==, - } - engines: { node: '>=22' } + resolution: {integrity: sha512-CTvHAvQd4nwAvEldaRIiGFClOjb8I1IIv8x55tcSDLdjuPsVlldWA6nOfdTypdZE7vcc2YrMt6xAU9mwjeOo6g==} + engines: {node: '>=22'} peerDependencies: '@dataplan/pg': ^1.0.0-rc.5 grafast: ^1.0.0-rc.7 @@ -9653,56 +6928,38 @@ packages: optional: true graphiql@5.2.2: - resolution: - { - integrity: sha512-qYhw7e2QPLPEIdJXqlLa/XkZtEu2SVYyD71abOpPnrzmJzTdB+QsEswFIMg9u1WGkEtp/wi8epCsuKeA/chRcg==, - } + resolution: {integrity: sha512-qYhw7e2QPLPEIdJXqlLa/XkZtEu2SVYyD71abOpPnrzmJzTdB+QsEswFIMg9u1WGkEtp/wi8epCsuKeA/chRcg==} peerDependencies: graphql: 16.13.0 react: ^18 || ^19 react-dom: ^18 || ^19 graphql-language-service@5.5.0: - resolution: - { - integrity: sha512-9EvWrLLkF6Y5e29/2cmFoAO6hBPPAZlCyjznmpR11iFtRydfkss+9m6x+htA8h7YznGam+TtJwS6JuwoWWgb2Q==, - } + resolution: {integrity: sha512-9EvWrLLkF6Y5e29/2cmFoAO6hBPPAZlCyjznmpR11iFtRydfkss+9m6x+htA8h7YznGam+TtJwS6JuwoWWgb2Q==} hasBin: true peerDependencies: graphql: 16.13.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: 16.13.0 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: 16.13.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: 16.13.0 graphql-ws@6.0.7: - resolution: - { - integrity: sha512-yoLRW+KRlDmnnROdAu7sX77VNLC0bsFoZyGQJLy1cF+X/SkLg/fWkRGrEEYQK8o2cafJ2wmEaMqMEZB3U3DYDg==, - } - engines: { node: '>=20' } + resolution: {integrity: sha512-yoLRW+KRlDmnnROdAu7sX77VNLC0bsFoZyGQJLy1cF+X/SkLg/fWkRGrEEYQK8o2cafJ2wmEaMqMEZB3U3DYDg==} + engines: {node: '>=20'} peerDependencies: '@fastify/websocket': ^10 || ^11 crossws: ~0.3 @@ -9717,629 +6974,353 @@ packages: optional: true graphql@16.13.0: - resolution: - { - integrity: sha512-uSisMYERbaB9bkA9M4/4dnqyktaEkf1kMHNKq/7DHyxVeWqHQ2mBmVqm5u6/FVHwF3iCNalKcg82Zfl+tffWoA==, - } - engines: { node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0 } + resolution: {integrity: sha512-uSisMYERbaB9bkA9M4/4dnqyktaEkf1kMHNKq/7DHyxVeWqHQ2mBmVqm5u6/FVHwF3iCNalKcg82Zfl+tffWoA==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} 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 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-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.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@7.0.2: - resolution: - { - integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==, - } - engines: { node: '>= 14' } + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} http-proxy@1.18.1: - resolution: - { - integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==, - } - engines: { node: '>=8.0.0' } + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.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.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@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.3.3: - resolution: - { - integrity: sha512-Jw3XIpEwkvgxb0yoQfS4vIpL2dW4gFyn0kHjRWTSpuWbJWyn5/3PvsUy9QSWSSxoiAbeyXXdz4Gzk7HIOTnS4Q==, - } + resolution: {integrity: sha512-Jw3XIpEwkvgxb0yoQfS4vIpL2dW4gFyn0kHjRWTSpuWbJWyn5/3PvsUy9QSWSSxoiAbeyXXdz4Gzk7HIOTnS4Q==} 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.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.5.2: - resolution: - { - integrity: sha512-MUSAR2HuIPuriITCA9X1j7e9FS2P/6HJyKTI6/f6mMdpAkMQDXPERX+D9UmUFmQ3eeUaqvXYfFb406DS2dBpzA==, - } + resolution: {integrity: sha512-MUSAR2HuIPuriITCA9X1j7e9FS2P/6HJyKTI6/f6mMdpAkMQDXPERX+D9UmUFmQ3eeUaqvXYfFb406DS2dBpzA==} inquirerer@4.7.0: - resolution: - { - integrity: sha512-Gp6Bd7NGeA1y/vV+q0Dl7KqakMHvHiTXyRIMYXCH4L6tQ3AWJBWd6BRmxikOp9t1C8eoJIGrHs7iJt34hx573Q==, - } + resolution: {integrity: sha512-Gp6Bd7NGeA1y/vV+q0Dl7KqakMHvHiTXyRIMYXCH4L6tQ3AWJBWd6BRmxikOp9t1C8eoJIGrHs7iJt34hx573Q==} interpret@3.1.1: - resolution: - { - integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==, - } - engines: { node: '>=10.13.0' } + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} ip-address@10.1.0: - resolution: - { - integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==, - } - engines: { node: '>= 12' } + resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} + engines: {node: '>= 12'} 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'} ipv6-normalize@1.0.1: - resolution: - { - integrity: sha512-Bm6H79i01DjgGTCWjUuCjJ6QDo1HB96PT/xCYuyJUP9WFbVDrLSbG4EZCvOCun2rNswZb0c3e4Jt/ws795esHA==, - } + resolution: {integrity: sha512-Bm6H79i01DjgGTCWjUuCjJ6QDo1HB96PT/xCYuyJUP9WFbVDrLSbG4EZCvOCun2rNswZb0c3e4Jt/ws795esHA==} 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-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-primitive@3.0.1: - resolution: - { - integrity: sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==} + 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@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-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'} 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@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@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.2.3: - resolution: - { - integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} + 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@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@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@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 @@ -10348,11 +7329,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' @@ -10366,95 +7344,56 @@ 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@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@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@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@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@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@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@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@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: @@ -10462,81 +7401,48 @@ packages: optional: true 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@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@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@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@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@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@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@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@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@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@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 @@ -10545,594 +7451,324 @@ 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 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-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==} jsonc-parser@3.3.1: - resolution: - { - integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==, - } + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} 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'} 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'} komoji@0.8.1: - resolution: - { - integrity: sha512-7wYXVGaHc+MNTyOoOVmgXA08bRXWm5TDoRdQuLCBFnQsR7TGf+q1bth1E8caIHJit0sbYCTeBAdk3QHxnpYzYQ==, - } + resolution: {integrity: sha512-7wYXVGaHc+MNTyOoOVmgXA08bRXWm5TDoRdQuLCBFnQsR7TGf+q1bth1E8caIHJit0sbYCTeBAdk3QHxnpYzYQ==} 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.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} linkify-it@5.0.0: - resolution: - { - integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==, - } + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} 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==} lodash@4.17.23: - resolution: - { - integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==, - } + resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} 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.6: - resolution: - { - integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==, - } - engines: { node: 20 || >=22 } + resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} + engines: {node: 20 || >=22} 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'} luxon@3.7.2: - resolution: - { - integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} + engines: {node: '>=12'} lz-string@1.5.0: - resolution: - { - integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==, - } + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true mailgun.js@10.4.0: - resolution: - { - integrity: sha512-YrdaZEAJwwjXGBTfZTNQ1LM7tmkdUaz2NpZEu7+zULcG4Wrlhd7cWSNZW0bxT3bP48k5N0mZWz8C2f9gc2+Geg==, - } - engines: { node: '>=18.0.0' } + resolution: {integrity: sha512-YrdaZEAJwwjXGBTfZTNQ1LM7tmkdUaz2NpZEu7+zULcG4Wrlhd7cWSNZW0bxT3bP48k5N0mZWz8C2f9gc2+Geg==} + engines: {node: '>=18.0.0'} makage@0.1.12: - resolution: - { - integrity: sha512-R3bITl50Ts2GzoaErywe8n24Iu2qbvbNOqOyidjDjh6iqK0CAj2VzIk3xRS4z8Q4xDQzaJrcb2+dGDjqRj6ChA==, - } + resolution: {integrity: sha512-R3bITl50Ts2GzoaErywe8n24Iu2qbvbNOqOyidjDjh6iqK0CAj2VzIk3xRS4z8Q4xDQzaJrcb2+dGDjqRj6ChA==} 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'} markdown-it@14.1.1: - resolution: - { - integrity: sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==, - } + resolution: {integrity: sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==} hasBin: true 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'} mdurl@2.0.0: - resolution: - { - integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==, - } + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} 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'} meros@1.3.2: - resolution: - { - integrity: sha512-Q3mobPbvEx7XbwhnC1J1r60+5H6EZyNccdzSz0eGexJRwouUtTZxPVRGdqKtxlpD84ScK4+tIGldkqDtCKdI0A==, - } - engines: { node: '>=13' } + resolution: {integrity: sha512-Q3mobPbvEx7XbwhnC1J1r60+5H6EZyNccdzSz0eGexJRwouUtTZxPVRGdqKtxlpD84ScK4+tIGldkqDtCKdI0A==} + engines: {node: '>=13'} peerDependencies: '@types/node': '>=13' peerDependenciesMeta: @@ -11140,591 +7776,324 @@ packages: optional: true methods@1.1.2: - resolution: - { - integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==, - } - engines: { node: '>= 0.6' } + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} 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@10.2.4: - resolution: - { - integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==, - } - engines: { node: 18 || 20 || >=22 } + resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} + engines: {node: 18 || 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@3.1.5: - resolution: - { - integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==, - } + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} minimatch@5.1.9: - resolution: - { - integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} minimatch@8.0.7: - resolution: - { - integrity: sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg==, - } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg==} + 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.9: - resolution: - { - integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==, - } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + 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'} minipass@7.1.3: - resolution: - { - integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==, - } - engines: { node: '>=16 || 14 >=14.17' } + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + 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'} monaco-editor@0.52.2: - resolution: - { - integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==, - } + resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==} monaco-graphql@1.7.3: - resolution: - { - integrity: sha512-6LAIcg/vT2NGLjHnT+5iIZONsZCaCuz2orbg7qD/u4Ry9R7rDotLh0HAzIF/yKdzEA5fTZC+TofSx2O+Zi+0ow==, - } + resolution: {integrity: sha512-6LAIcg/vT2NGLjHnT+5iIZONsZCaCuz2orbg7qD/u4Ry9R7rDotLh0HAzIF/yKdzEA5fTZC+TofSx2O+Zi+0ow==} peerDependencies: graphql: 16.13.0 monaco-editor: '>= 0.20.0 < 0.53' prettier: ^2.8.0 || ^3.0.0 motion-dom@12.34.0: - resolution: - { - integrity: sha512-Lql3NuEcScRDxTAO6GgUsRHBZOWI/3fnMlkMcH5NftzcN37zJta+bpbMAV9px4Nj057TuvRooMK7QrzMCgtz6Q==, - } + resolution: {integrity: sha512-Lql3NuEcScRDxTAO6GgUsRHBZOWI/3fnMlkMcH5NftzcN37zJta+bpbMAV9px4Nj057TuvRooMK7QrzMCgtz6Q==} motion-utils@12.29.2: - resolution: - { - integrity: sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A==, - } + resolution: {integrity: sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A==} ms@2.1.3: - resolution: - { - integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, - } + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} multer@2.1.0: - resolution: - { - integrity: sha512-TBm6j41rxNohqawsxlsWsNNh/VdV4QFXcBvRcPhXaA05EZ79z0qJ2bQFpync6JBoHTeNY5Q1JpG7AlTjdlfAEA==, - } - engines: { node: '>= 10.16.0' } + resolution: {integrity: sha512-TBm6j41rxNohqawsxlsWsNNh/VdV4QFXcBvRcPhXaA05EZ79z0qJ2bQFpync6JBoHTeNY5Q1JpG7AlTjdlfAEA==} + engines: {node: '>= 10.16.0'} 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==} nanoid@3.3.11: - resolution: - { - integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==, - } - engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true 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==} nested-obj@0.2.1: - resolution: - { - integrity: sha512-MQnXdT8qoxxu5/ONQ8tO70HsuvuUAhLmAvOr1RaAtWqpGda+JycVIhN1Pclq5Zny7sr4Jn4wKgIR8IpdnXU+EQ==, - } + resolution: {integrity: sha512-MQnXdT8qoxxu5/ONQ8tO70HsuvuUAhLmAvOr1RaAtWqpGda+JycVIhN1Pclq5Zny7sr4Jn4wKgIR8IpdnXU+EQ==} 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: @@ -11732,11 +8101,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: @@ -11744,180 +8110,102 @@ 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@2.1.1: - resolution: - { - integrity: sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-OXdegQq03OmXEjt2hZP33W2YPs/E5BcFQks46+G2gAxs4gHOIVD1u7EqlYLYSKsaIpyKCK9Gbk0ta1/gjRSMRQ==} + engines: {node: '>=6'} nodemailer@6.10.1: - resolution: - { - integrity: sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-Z+iLaBGVaSjbIzQ4pX6XV41HrooLsQ10ZWPUehGmuantvzWoDVBnmsdUcOIDM1t+yPor5pDhVlDESgOMEGxhHA==} + engines: {node: '>=6.0.0'} nodemailer@7.0.13: - resolution: - { - integrity: sha512-PNDFSJdP+KFgdsG3ZzMXCgquO7I6McjY2vlqILjtJd0hy8wEvtugS9xKRF2NWlPNGxvLCXlTNIae4serI7dinw==, - } - engines: { node: '>=6.0.0' } + resolution: {integrity: sha512-PNDFSJdP+KFgdsG3ZzMXCgquO7I6McjY2vlqILjtJd0hy8wEvtugS9xKRF2NWlPNGxvLCXlTNIae4serI7dinw==} + engines: {node: '>=6.0.0'} nodemon@3.1.14: - resolution: - { - integrity: sha512-jakjZi93UtB3jHMWsXL68FXSAosbLfY0In5gtKq3niLSkrWznrVBzXFNOEMJUfc9+Ke7SHWoAZsiMkNP3vq6Jw==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-jakjZi93UtB3jHMWsXL68FXSAosbLfY0In5gtKq3niLSkrWznrVBzXFNOEMJUfc9+Ke7SHWoAZsiMkNP3vq6Jw==} + 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==} nullthrows@1.1.1: - resolution: - { - integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==, - } + resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} 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 @@ -11929,437 +8217,245 @@ packages: optional: true 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-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.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.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'} oxfmt@0.36.0: - resolution: - { - integrity: sha512-/ejJ+KoSW6J9bcNT9a9UtJSJNWhJ3yOLSBLbkoFHJs/8CZjmaZVZAJe4YgO1KMJlKpNQasrn/G9JQUEZI3p0EQ==, - } - engines: { node: ^20.19.0 || >=22.12.0 } + resolution: {integrity: sha512-/ejJ+KoSW6J9bcNT9a9UtJSJNWhJ3yOLSBLbkoFHJs/8CZjmaZVZAJe4YgO1KMJlKpNQasrn/G9JQUEZI3p0EQ==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true 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'} 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' } + 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-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-scurry@2.0.2: - resolution: - { - integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==, - } - engines: { node: 18 || 20 || >=22 } + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 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'} pg-cloudflare@1.3.0: - resolution: - { - integrity: sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==, - } + resolution: {integrity: sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==} pg-connection-string@2.11.0: - resolution: - { - integrity: sha512-kecgoJwhOpxYU21rZjULrmrBJ698U2RxXofKVzOn5UDj61BPj/qMb7diYUR1nLScCDbrztQFl1TaQZT0t1EtzQ==, - } + resolution: {integrity: sha512-kecgoJwhOpxYU21rZjULrmrBJ698U2RxXofKVzOn5UDj61BPj/qMb7diYUR1nLScCDbrztQFl1TaQZT0t1EtzQ==} 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-introspection@1.0.0-rc.4: - resolution: - { - integrity: sha512-Cz5HZz4IbJN2wj9ow13dzco/HZ7UUi9qq0PYyjE4+hHgI8yxNLfXk9TqcJA+zgv7KR43QzGlx7yYcC25jTcFDw==, - } - engines: { node: '>=22' } + resolution: {integrity: sha512-Cz5HZz4IbJN2wj9ow13dzco/HZ7UUi9qq0PYyjE4+hHgI8yxNLfXk9TqcJA+zgv7KR43QzGlx7yYcC25jTcFDw==} + engines: {node: '>=22'} pg-pool@3.12.0: - resolution: - { - integrity: sha512-eIJ0DES8BLaziFHW7VgJEBPi5hg3Nyng5iKpYtj3wbcAUV9A1wLgWiY7ajf/f/oO1wfxt83phXPY8Emztg7ITg==, - } + resolution: {integrity: sha512-eIJ0DES8BLaziFHW7VgJEBPi5hg3Nyng5iKpYtj3wbcAUV9A1wLgWiY7ajf/f/oO1wfxt83phXPY8Emztg7ITg==} 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.12.0: - resolution: - { - integrity: sha512-uOANXNRACNdElMXJ0tPz6RBM0XQ61nONGAwlt8da5zs/iUOOCLBQOHSXnrC6fMsvtjxbOJrZZl5IScGv+7mpbg==, - } + resolution: {integrity: sha512-uOANXNRACNdElMXJ0tPz6RBM0XQ61nONGAwlt8da5zs/iUOOCLBQOHSXnrC6fMsvtjxbOJrZZl5IScGv+7mpbg==} pg-sql2@5.0.0-rc.4: - resolution: - { - integrity: sha512-f8um4jNwumksk39zhkdps9jXeCkM3SY22gPjAcq45D/ZTIw2zWHMdsS6H5DE3XdeHy6pyGUzY0urmCgwuhiywg==, - } - engines: { node: '>=22' } + resolution: {integrity: sha512-f8um4jNwumksk39zhkdps9jXeCkM3SY22gPjAcq45D/ZTIw2zWHMdsS6H5DE3XdeHy6pyGUzY0urmCgwuhiywg==} + engines: {node: '>=22'} 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.19.0: - resolution: - { - integrity: sha512-QIcLGi508BAHkQ3pJNptsFz5WQMlpGbuBGBaIaXsWK8mel2kQ/rThYI+DbgjUvZrIr7MiuEuc9LcChJoEZK1xQ==, - } - engines: { node: '>= 16.0.0' } + resolution: {integrity: sha512-QIcLGi508BAHkQ3pJNptsFz5WQMlpGbuBGBaIaXsWK8mel2kQ/rThYI+DbgjUvZrIr7MiuEuc9LcChJoEZK1xQ==} + engines: {node: '>= 16.0.0'} peerDependencies: pg-native: '>=3.0.1' peerDependenciesMeta: @@ -12367,147 +8463,84 @@ packages: optional: true pgpass@1.0.5: - resolution: - { - integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==, - } + resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} pgsql-deparser@17.18.0: - resolution: - { - integrity: sha512-LFjdKKYHVo8lUPbOVfO6dRm5L28hBrfqnBrX3DhiC97k6Hsbi+7LXzvL30gahLUbN5dLai9MvsJ8Gbg/7joD1Q==, - } + resolution: {integrity: sha512-LFjdKKYHVo8lUPbOVfO6dRm5L28hBrfqnBrX3DhiC97k6Hsbi+7LXzvL30gahLUbN5dLai9MvsJ8Gbg/7joD1Q==} pgsql-parser@17.9.12: - resolution: - { - integrity: sha512-dsC9DuTSjrYQCsZq74WZwP7obWv58Z1x/PmZZWNE0L+DnM2wAsWSZAyLQVU0U1IvD3y+7fZDVIx9bibLx0sEpQ==, - } + resolution: {integrity: sha512-dsC9DuTSjrYQCsZq74WZwP7obWv58Z1x/PmZZWNE0L+DnM2wAsWSZAyLQVU0U1IvD3y+7fZDVIx9bibLx0sEpQ==} picocolors@1.1.1: - resolution: - { - integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, - } + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch-browser@2.2.6: - resolution: - { - integrity: sha512-0ypsOQt9D4e3hziV8O4elD9uN0z/jtUEfxVRtNaAAtXIyUx9m/SzlO020i8YNL2aL/E6blOvvHQcin6HZlFy/w==, - } - engines: { node: '>=8.6' } + resolution: {integrity: sha512-0ypsOQt9D4e3hziV8O4elD9uN0z/jtUEfxVRtNaAAtXIyUx9m/SzlO020i8YNL2aL/E6blOvvHQcin6HZlFy/w==} + engines: {node: '>=8.6'} 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.58.2: - resolution: - { - integrity: sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==} + engines: {node: '>=18'} hasBin: true playwright@1.58.2: - resolution: - { - integrity: sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==} + 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==} postcss@8.5.6: - resolution: - { - integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==, - } - engines: { node: ^10 || ^12 || >=14 } + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} postgraphile-plugin-connection-filter@3.0.0-rc.1: - resolution: - { - integrity: sha512-gVzLoY+OGAVhUWdcbtY4Hu2zSup8qZB+wlH54RgIa+tQSysWDDh5S3Opaz5uPwY6etcmzR5JjcApOmb1YYIzlA==, - } + resolution: {integrity: sha512-gVzLoY+OGAVhUWdcbtY4Hu2zSup8qZB+wlH54RgIa+tQSysWDDh5S3Opaz5uPwY6etcmzR5JjcApOmb1YYIzlA==} postgraphile@5.0.0-rc.7: - resolution: - { - integrity: sha512-sUjq9c2Q53TWs8fuoohStSAZwvkbnAvtgwqZTDzPP6OL2OI0ymv10qtnBzHwJh+dTrWEM/isqgVH29IEPG+LVQ==, - } - engines: { node: '>=22' } + resolution: {integrity: sha512-sUjq9c2Q53TWs8fuoohStSAZwvkbnAvtgwqZTDzPP6OL2OI0ymv10qtnBzHwJh+dTrWEM/isqgVH29IEPG+LVQ==} + engines: {node: '>=22'} hasBin: true peerDependencies: '@dataplan/json': 1.0.0-rc.5 @@ -12527,119 +8560,68 @@ packages: optional: 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-array@3.0.4: - resolution: - { - integrity: sha512-nAUSGfSDGOaOAEGwqsRY27GPOea7CNipJPOA7lPbdEpx5Kg3qzdP0AaWC5MlhTWV9s4hFX39nomVZ+C4tnGOJQ==, - } - engines: { node: '>=12' } + resolution: {integrity: sha512-nAUSGfSDGOaOAEGwqsRY27GPOea7CNipJPOA7lPbdEpx5Kg3qzdP0AaWC5MlhTWV9s4hFX39nomVZ+C4tnGOJQ==} + engines: {node: '>=12'} 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'} postgres-range@1.1.4: - resolution: - { - integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==, - } + resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==} 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.8.1: - resolution: - { - integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==, - } - engines: { node: '>=14' } + resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + 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: @@ -12647,156 +8629,87 @@ 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'} 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-from-env@1.1.0: - resolution: - { - integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==, - } + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} pstree.remy@1.1.8: - resolution: - { - integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==, - } + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} punycode.js@2.3.1: - resolution: - { - integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==, - } - engines: { node: '>=6' } + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} 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@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.14.1: - resolution: - { - integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==, - } - engines: { node: '>=0.6' } + resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} + 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@3.0.2: - resolution: - { - integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==, - } - engines: { node: '>= 0.10' } + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} react-compiler-runtime@19.1.0-rc.1: - resolution: - { - integrity: sha512-wCt6g+cRh8g32QT18/9blfQHywGjYu+4FlEc3CW1mx3pPxYzZZl1y+VtqxRgnKKBCFLIGUYxog4j4rs5YS86hw==, - } + resolution: {integrity: sha512-wCt6g+cRh8g32QT18/9blfQHywGjYu+4FlEc3CW1mx3pPxYzZZl1y+VtqxRgnKKBCFLIGUYxog4j4rs5YS86hw==} peerDependencies: react: ^17.0.0 || ^18.0.0 || ^19.0.0 || ^0.0.0-experimental react-dom@19.2.4: - resolution: - { - integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==, - } + resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} peerDependencies: react: ^19.2.4 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-is@19.2.4: - resolution: - { - integrity: sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==, - } + resolution: {integrity: sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==} 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: '*' @@ -12808,18 +8721,12 @@ packages: optional: true react-refresh@0.17.0: - resolution: - { - integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} + engines: {node: '>=0.10.0'} react-remove-scroll-bar@2.3.8: - resolution: - { - integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} peerDependencies: '@types/react': '*' react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -12828,11 +8735,8 @@ packages: optional: true react-remove-scroll@2.7.2: - resolution: - { - integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} + engines: {node: '>=10'} peerDependencies: '@types/react': '*' react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc @@ -12841,11 +8745,8 @@ packages: optional: true react-style-singleton@2.2.3: - resolution: - { - integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} peerDependencies: '@types/react': '*' react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc @@ -12854,245 +8755,140 @@ packages: optional: true react-test-renderer@19.2.4: - resolution: - { - integrity: sha512-Ttl5D7Rnmi6JGMUpri4UjB4BAN0FPs4yRDnu2XSsigCWOLm11o8GwRlVsh27ER+4WFqsGtrBuuv5zumUaRCmKw==, - } + resolution: {integrity: sha512-Ttl5D7Rnmi6JGMUpri4UjB4BAN0FPs4yRDnu2XSsigCWOLm11o8GwRlVsh27ER+4WFqsGtrBuuv5zumUaRCmKw==} peerDependencies: react: ^19.2.4 react@19.2.4: - resolution: - { - integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} + 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@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==} 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==} requires-port@1.0.0: - resolution: - { - integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==, - } + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} 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'} retry@0.13.1: - resolution: - { - integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==, - } - engines: { node: '>= 4' } + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + 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 rollup-plugin-visualizer@6.0.5: - resolution: - { - integrity: sha512-9+HlNgKCVbJDs8tVtjQ43US12eqaiHyyiLMdBwQ7vSZPiHMysGNo2E88TAp1si5wx8NAoYriI2A5kuKfIakmJg==, - } - engines: { node: '>=18' } + resolution: {integrity: sha512-9+HlNgKCVbJDs8tVtjQ43US12eqaiHyyiLMdBwQ7vSZPiHMysGNo2E88TAp1si5wx8NAoYriI2A5kuKfIakmJg==} + engines: {node: '>=18'} hasBin: true peerDependencies: rolldown: 1.x || ^1.0.0-beta @@ -13104,39 +8900,24 @@ packages: optional: true rollup@4.57.1: - resolution: - { - integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==, - } - engines: { node: '>=18.0.0', npm: '>=8.0.0' } + resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} 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==} ruru-types@2.0.0-rc.5: - resolution: - { - integrity: sha512-ttaNhhJ/piofg4ZDsGlHeMmqiE1k/zcbrH3d/FAdZL9dvp4k59KbGaGJvqyRUEaLwO45F1rQV0Ws+30HFGdKTg==, - } - engines: { node: '>=22' } + resolution: {integrity: sha512-ttaNhhJ/piofg4ZDsGlHeMmqiE1k/zcbrH3d/FAdZL9dvp4k59KbGaGJvqyRUEaLwO45F1rQV0Ws+30HFGdKTg==} + engines: {node: '>=22'} peerDependencies: graphql: 16.13.0 react: ^18 || ^19 @@ -13148,11 +8929,8 @@ packages: optional: true ruru@2.0.0-rc.6: - resolution: - { - integrity: sha512-+xqJhDxDs3wEtT8GG0PYjYIZo92JHcpfntbVzTrXC9pAof93Zcm1bsnBv7PdXaJqLEEwRFZhO4mdm0EbJ4Lrhg==, - } - engines: { node: '>=22' } + resolution: {integrity: sha512-+xqJhDxDs3wEtT8GG0PYjYIZo92JHcpfntbVzTrXC9pAof93Zcm1bsnBv7PdXaJqLEEwRFZhO4mdm0EbJ4Lrhg==} + engines: {node: '>=22'} hasBin: true peerDependencies: graphile-config: ^1.0.0-rc.5 @@ -13166,697 +8944,391 @@ packages: optional: true 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 semver@7.7.4: - resolution: - { - integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + 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-value@4.1.0: - resolution: - { - integrity: sha512-zTEg4HL0RwVrqcWs3ztF+x1vkxfm0lP+MQQFPiMJTKVceBwEV0A569Ou8l9IYQG8jOZdMVI1hGsc0tmeD2o/Lw==, - } - engines: { node: '>=11.0' } + resolution: {integrity: sha512-zTEg4HL0RwVrqcWs3ztF+x1vkxfm0lP+MQQFPiMJTKVceBwEV0A569Ou8l9IYQG8jOZdMVI1hGsc0tmeD2o/Lw==} + engines: {node: '>=11.0'} 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'} 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'} smtp-server@3.18.1: - resolution: - { - integrity: sha512-zlUXA6n3HkO0jMyNNc2S67uw7DWHOoLU9vjPo5oW2c8ehJMpRlSumyw4riuvfWPfW/8mryd7ED5PVf4YVg8Y6w==, - } - engines: { node: '>=18.18.0' } + resolution: {integrity: sha512-zlUXA6n3HkO0jMyNNc2S67uw7DWHOoLU9vjPo5oW2c8ehJMpRlSumyw4riuvfWPfW/8mryd7ED5PVf4YVg8Y6w==} + engines: {node: '>=18.18.0'} 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.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-js@1.2.1: - resolution: - { - integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, - } - engines: { node: '>=0.10.0' } + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} 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'} source-map@0.7.6: - resolution: - { - integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==, - } - engines: { node: '>= 12' } + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} 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==} 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'} streamsearch@1.1.0: - resolution: - { - integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==, - } - engines: { node: '>=10.0.0' } + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.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.2.0: - resolution: - { - integrity: sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==, - } + resolution: {integrity: sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==} 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==} superagent@10.3.0: - resolution: - { - integrity: sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ==, - } - engines: { node: '>=14.18.0' } + resolution: {integrity: sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ==} + engines: {node: '>=14.18.0'} supertest@7.2.2: - resolution: - { - integrity: sha512-oK8WG9diS3DlhdUkcFn4tkNIiIbBx9lI2ClF8K+b2/m8Eyv47LSawxUzZQSNKUrVb2KsqeTDCcjAAVPYaSLVTA==, - } - engines: { node: '>=14.18.0' } + resolution: {integrity: sha512-oK8WG9diS3DlhdUkcFn4tkNIiIbBx9lI2ClF8K+b2/m8Eyv47LSawxUzZQSNKUrVb2KsqeTDCcjAAVPYaSLVTA==} + engines: {node: '>=14.18.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'} synckit@0.11.12: - resolution: - { - integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==, - } - engines: { node: ^14.18.0 || >=16.0.0 } + resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} + engines: {node: ^14.18.0 || >=16.0.0} tabbable@6.4.0: - resolution: - { - integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==, - } + resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} tamedevil@0.1.0-rc.4: - resolution: - { - integrity: sha512-w6gmlfoKCBfOTjLzTVcUmEPuhWEes2lFZkC+y+KLsP3AUNiRZcyAgefosCaxOEehlHB6Rt4jRbFDSMBxQbGsug==, - } - engines: { node: '>=22' } + resolution: {integrity: sha512-w6gmlfoKCBfOTjLzTVcUmEPuhWEes2lFZkC+y+KLsP3AUNiRZcyAgefosCaxOEehlHB6Rt4jRbFDSMBxQbGsug==} + engines: {node: '>=22'} 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'} deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me 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==} through@2.3.8: - resolution: - { - integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==, - } + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} 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'} tinypool@2.1.0: - resolution: - { - integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==, - } - engines: { node: ^20.0.0 || >=22.0.0 } + resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} + engines: {node: ^20.0.0 || >=22.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.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 tr46@0.0.3: - resolution: - { - integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==, - } + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} transliteration@2.6.1: - resolution: - { - integrity: sha512-hJ9BhrQAOnNTbpOr1MxsNjZISkn7ppvF5TKUeFmTE1mG4ZPD/XVxF0L0LUoIUCWmQyxH0gJpVtfYLAWf298U9w==, - } - engines: { node: '>=20.0.0' } + resolution: {integrity: sha512-hJ9BhrQAOnNTbpOr1MxsNjZISkn7ppvF5TKUeFmTE1mG4ZPD/XVxF0L0LUoIUCWmQyxH0gJpVtfYLAWf298U9w==} + engines: {node: '>=20.0.0'} hasBin: true 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.4.0: - resolution: - { - integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==, - } - engines: { node: '>=18.12' } + resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} + 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' @@ -13882,10 +9354,7 @@ packages: optional: true 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' @@ -13899,257 +9368,146 @@ 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==} 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} 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 uc.micro@2.1.0: - resolution: - { - integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==, - } + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} 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@6.21.0: - resolution: - { - integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==, - } + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} undici-types@7.18.2: - resolution: - { - integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==, - } + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} undici@7.22.0: - resolution: - { - integrity: sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==, - } - engines: { node: '>=20.18.1' } + resolution: {integrity: sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==} + 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==} url-join@4.0.1: - resolution: - { - integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==, - } + resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} use-callback-ref@1.3.3: - resolution: - { - integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} peerDependencies: '@types/react': '*' react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc @@ -14158,11 +9516,8 @@ packages: optional: true use-sidecar@1.1.3: - resolution: - { - integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==, - } - engines: { node: '>=10' } + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} peerDependencies: '@types/react': '*' react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc @@ -14171,72 +9526,42 @@ packages: optional: true use-sync-external-store@1.6.0: - resolution: - { - integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==, - } + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 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 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} 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'} vite@6.4.1: - resolution: - { - integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==, - } - engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } + resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 @@ -14275,170 +9600,95 @@ packages: optional: true vscode-languageserver-types@3.17.5: - resolution: - { - integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==, - } + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} 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==} 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@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@8.19.0: - resolution: - { - integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==, - } - engines: { node: '>=10.0.0' } + resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 utf-8-validate: '>=5.0.2' @@ -14449,113 +9699,65 @@ packages: optional: true 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@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.2.1: - resolution: - { - integrity: sha512-SMi3ZO1IqsvPLLXuy8LBCP1orqcjOT8VygiuyAlplaGeH2g+n4ZSSyWlA/BZjuUuN58TyOcz89mVkflSqIPxxQ==, - } + resolution: {integrity: sha512-SMi3ZO1IqsvPLLXuy8LBCP1orqcjOT8VygiuyAlplaGeH2g+n4ZSSyWlA/BZjuUuN58TyOcz89mVkflSqIPxxQ==} 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'} zustand@5.0.11: - resolution: - { - integrity: sha512-fdZY+dk7zn/vbWNCYmzZULHRrss0jx5pPFiOuMZ/5HJN6Yv3u+1Wswy/4MpZEkEGhtNH+pwxZB8OKgUBPzYAGg==, - } - engines: { node: '>=12.20.0' } + resolution: {integrity: sha512-fdZY+dk7zn/vbWNCYmzZULHRrss0jx5pPFiOuMZ/5HJN6Yv3u+1Wswy/4MpZEkEGhtNH+pwxZB8OKgUBPzYAGg==} + engines: {node: '>=12.20.0'} peerDependencies: '@types/react': '>=18.0.0' immer: '>=9.0.6' @@ -14572,6 +9774,7 @@ packages: optional: true snapshots: + '@0no-co/graphql.web@1.2.0(graphql@16.13.0)': optionalDependencies: graphql: 16.13.0 From e8af929b2e9c636758710213c958c2f336154c7b Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Thu, 12 Mar 2026 08:32:43 +0000 Subject: [PATCH 07/19] feat: add optional relation filter plugins (forward + backward) with toggle - ConnectionFilterForwardRelationsPlugin: filter by FK parent relations - ConnectionFilterBackwardRelationsPlugin: filter by backward relations (one-to-one + one-to-many with some/every/none) - connectionFilterRelations toggle in preset (default: false) - Un-skip relation filter tests in search plugin - Updated augmentations, types, and exports --- .../src/augmentations.ts | 20 + .../graphile-connection-filter/src/index.ts | 2 + ...ConnectionFilterBackwardRelationsPlugin.ts | 628 ++++++++++++++++++ .../ConnectionFilterForwardRelationsPlugin.ts | 257 +++++++ .../src/plugins/index.ts | 2 + .../graphile-connection-filter/src/preset.ts | 9 + .../graphile-connection-filter/src/types.ts | 2 + .../__tests__/filter.test.ts | 6 +- 8 files changed, 921 insertions(+), 5 deletions(-) create mode 100644 graphile/graphile-connection-filter/src/plugins/ConnectionFilterBackwardRelationsPlugin.ts create mode 100644 graphile/graphile-connection-filter/src/plugins/ConnectionFilterForwardRelationsPlugin.ts diff --git a/graphile/graphile-connection-filter/src/augmentations.ts b/graphile/graphile-connection-filter/src/augmentations.ts index cb2f550a4..20820a20c 100644 --- a/graphile/graphile-connection-filter/src/augmentations.ts +++ b/graphile/graphile-connection-filter/src/augmentations.ts @@ -19,6 +19,20 @@ declare global { filterFieldType(this: Inflection, typeName: string): string; /** Filter field list type name for an array scalar, e.g. "StringListFilter" */ filterFieldListType(this: Inflection, typeName: string): string; + /** Forward relation field name (passthrough) */ + filterSingleRelationFieldName(this: Inflection, fieldName: string): string; + /** Forward relation exists field name, e.g. "clientByClientIdExists" */ + filterForwardRelationExistsFieldName(this: Inflection, relationFieldName: string): string; + /** Backward single relation field name (passthrough) */ + filterSingleRelationByKeysBackwardsFieldName(this: Inflection, fieldName: string): string; + /** Backward single relation exists field name */ + filterBackwardSingleRelationExistsFieldName(this: Inflection, relationFieldName: string): string; + /** Backward many relation field name (passthrough) */ + filterManyRelationByKeysFieldName(this: Inflection, fieldName: string): string; + /** Backward many relation exists field name */ + filterBackwardManyRelationExistsFieldName(this: Inflection, relationFieldName: string): string; + /** Many filter type name, e.g. "ClientToManyOrderFilter" */ + filterManyType(this: Inflection, table: any, foreignTable: any): string; } interface Build { @@ -41,6 +55,10 @@ declare global { isPgConnectionFilter?: boolean; /** Operator type scope data (present on scalar filter types like StringFilter) */ pgConnectionFilterOperators?: PgConnectionFilterOperatorsScope; + /** Foreign table resource (used by many filter types) */ + foreignTable?: any; + /** True if this is a many-relation filter type (e.g. ClientToManyOrderFilter) */ + isPgConnectionFilterMany?: boolean; } interface ScopeInputObjectFieldsField { @@ -84,6 +102,8 @@ declare global { ConnectionFilterCustomOperatorsPlugin: true; ConnectionFilterLogicalOperatorsPlugin: true; ConnectionFilterComputedAttributesPlugin: true; + ConnectionFilterForwardRelationsPlugin: true; + ConnectionFilterBackwardRelationsPlugin: true; } } } diff --git a/graphile/graphile-connection-filter/src/index.ts b/graphile/graphile-connection-filter/src/index.ts index b479e689d..1fc61bb53 100644 --- a/graphile/graphile-connection-filter/src/index.ts +++ b/graphile/graphile-connection-filter/src/index.ts @@ -40,6 +40,8 @@ export { ConnectionFilterCustomOperatorsPlugin, ConnectionFilterLogicalOperatorsPlugin, ConnectionFilterComputedAttributesPlugin, + ConnectionFilterForwardRelationsPlugin, + ConnectionFilterBackwardRelationsPlugin, makeApplyFromOperatorSpec, } from './plugins'; diff --git a/graphile/graphile-connection-filter/src/plugins/ConnectionFilterBackwardRelationsPlugin.ts b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterBackwardRelationsPlugin.ts new file mode 100644 index 000000000..8c9170df9 --- /dev/null +++ b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterBackwardRelationsPlugin.ts @@ -0,0 +1,628 @@ +import '../augmentations'; +import type { GraphileConfig } from 'graphile-config'; +import type { PgCodecRelation, PgCodecWithAttributes, PgResource } from '@dataplan/pg'; +import type { SQL } from 'pg-sql2'; +import type { GraphQLInputObjectType } from 'graphql'; +import { makeAssertAllowed } from '../utils'; + +const version = '1.0.0'; + +/** + * ConnectionFilterBackwardRelationsPlugin + * + * Adds backward relation filter fields to table filter types. + * A "backward" relation is one where another table has a FK referencing the current table. + * + * For unique backward relations (one-to-one), a single filter field is added: + * ```graphql + * allClients(filter: { + * profileByClientId: { bio: { includes: "engineer" } } + * }) { ... } + * ``` + * + * For non-unique backward relations (one-to-many), a "many" filter type is added + * with `some`, `every`, and `none` sub-fields: + * ```graphql + * allClients(filter: { + * ordersByClientId: { some: { total: { greaterThan: 1000 } } } + * }) { ... } + * ``` + * + * The SQL generated uses EXISTS subqueries: + * ```sql + * WHERE EXISTS ( + * SELECT 1 FROM orders + * WHERE orders.client_id = clients.id + * AND + * ) + * ``` + */ +export const ConnectionFilterBackwardRelationsPlugin: GraphileConfig.Plugin = { + name: 'ConnectionFilterBackwardRelationsPlugin', + version, + description: 'Adds backward relation filter fields to connection filter types', + + inflection: { + add: { + filterManyType(_preset: any, table: any, foreignTable: any): string { + return this.upperCamelCase( + `${this.tableType(table)}-to-many-${this.tableType( + foreignTable.codec + )}-filter` + ); + }, + filterBackwardSingleRelationExistsFieldName( + _preset: any, + relationFieldName: string + ) { + return `${relationFieldName}Exists`; + }, + filterBackwardManyRelationExistsFieldName( + _preset: any, + relationFieldName: string + ) { + return `${relationFieldName}Exist`; + }, + filterSingleRelationByKeysBackwardsFieldName( + _preset: any, + fieldName: string + ) { + return fieldName; + }, + filterManyRelationByKeysFieldName(_preset: any, fieldName: string) { + return fieldName; + }, + }, + }, + + schema: { + entityBehavior: { + pgCodecRelation: 'filterBy', + }, + + hooks: { + init(_, build) { + const { inflection } = build; + + // Register "many" filter types (e.g. ClientToManyOrderFilter) + // These contain `some`, `every`, `none` fields. + for (const source of Object.values( + build.input.pgRegistry.pgResources + ) as any[]) { + if ( + source.parameters || + !source.codec.attributes || + source.isUnique + ) { + continue; + } + for (const [_relationName, relation] of Object.entries( + source.getRelations() as { + [relationName: string]: PgCodecRelation; + } + )) { + if (!relation.isReferencee) continue; + if (relation.isUnique) continue; + + const foreignTable = relation.remoteResource; + if (typeof foreignTable.from === 'function') continue; + + if (!build.behavior.pgCodecRelationMatches(relation, 'filterBy')) { + continue; + } + + const filterManyTypeName = inflection.filterManyType( + source.codec, + foreignTable + ); + const foreignTableTypeName = inflection.tableType( + foreignTable.codec + ); + if (!build.getTypeMetaByName(filterManyTypeName)) { + build.recoverable(null, () => { + build.registerInputObjectType( + filterManyTypeName, + { + foreignTable, + isPgConnectionFilterMany: true, + }, + () => ({ + name: filterManyTypeName, + description: `A filter to be used against many \`${foreignTableTypeName}\` object types. All fields are combined with a logical \u2018and.\u2019`, + }), + `ConnectionFilterBackwardRelationsPlugin: Adding '${filterManyTypeName}' type for ${foreignTable.name}` + ); + }); + } + } + } + return _; + }, + + GraphQLInputObjectType_fields(inFields, build, context) { + let fields = inFields; + const { + extend, + inflection, + sql, + graphql: { GraphQLBoolean }, + EXPORTABLE, + } = build; + const { + fieldWithHooks, + scope: { + pgCodec, + isPgConnectionFilter, + foreignTable: scopeForeignTable, + isPgConnectionFilterMany, + }, + Self, + } = context; + + const assertAllowed = makeAssertAllowed(build); + + // ─── Part 1: Add backward relation fields to table filter types ─── + const source = + pgCodec && + (Object.values(build.input.pgRegistry.pgResources).find( + (s: any) => s.codec === pgCodec && !s.parameters + ) as + | PgResource + | undefined); + + if (isPgConnectionFilter && pgCodec && pgCodec.attributes && source) { + const backwardRelations = Object.entries( + source.getRelations() as { + [relationName: string]: PgCodecRelation; + } + ).filter( + ([_relationName, relation]) => relation.isReferencee + ); + + for (const [relationName, relation] of backwardRelations) { + const foreignTable = relation.remoteResource; + + if ( + !build.behavior.pgCodecRelationMatches(relation, 'filterBy') + ) { + continue; + } + + if (typeof foreignTable.from === 'function') { + continue; + } + + const isForeignKeyUnique = relation.isUnique; + const foreignTableExpression = foreignTable.from as SQL; + const localAttributes = relation.localAttributes as string[]; + const remoteAttributes = relation.remoteAttributes as string[]; + + if (isForeignKeyUnique) { + // One-to-one: add a single relation filter field + const fieldName = inflection.singleRelationBackwards({ + registry: source.registry, + codec: source.codec, + relationName, + }); + const filterFieldName = + inflection.filterSingleRelationByKeysBackwardsFieldName( + fieldName + ); + + const foreignTableTypeName = inflection.tableType( + foreignTable.codec + ); + const foreignTableFilterTypeName = + inflection.filterType(foreignTableTypeName); + const ForeignTableFilterType = build.getTypeByName( + foreignTableFilterTypeName + ) as GraphQLInputObjectType; + if (!ForeignTableFilterType) continue; + + fields = extend( + fields, + { + [filterFieldName]: fieldWithHooks( + { + fieldName: filterFieldName, + isPgConnectionFilterField: true, + }, + () => ({ + description: `Filter by the object\u2019s \`${fieldName}\` relation.`, + type: ForeignTableFilterType, + apply: EXPORTABLE( + ( + assertAllowed: any, + foreignTable: any, + foreignTableExpression: any, + localAttributes: string[], + remoteAttributes: string[], + sql: any + ) => + function ( + $where: any, + value: object | null + ) { + assertAllowed(value, 'object'); + if (value == null) return; + const $subQuery = $where.existsPlan({ + tableExpression: foreignTableExpression, + alias: foreignTable.name, + }); + localAttributes.forEach( + (localAttribute: string, i: number) => { + const remoteAttribute = remoteAttributes[i]; + $subQuery.where( + sql`${$where.alias}.${sql.identifier( + localAttribute + )} = ${$subQuery.alias}.${sql.identifier( + remoteAttribute + )}` + ); + } + ); + return $subQuery; + }, + [ + assertAllowed, + foreignTable, + foreignTableExpression, + localAttributes, + remoteAttributes, + sql, + ] + ), + }) + ), + }, + `Adding connection filter backward single relation field from ${source.name} to ${foreignTable.name}` + ); + + // Add exists field + const existsFieldName = + inflection.filterBackwardSingleRelationExistsFieldName( + fieldName + ); + fields = extend( + fields, + { + [existsFieldName]: fieldWithHooks( + { + fieldName: existsFieldName, + isPgConnectionFilterField: true, + }, + () => ({ + description: `A related \`${fieldName}\` exists.`, + type: GraphQLBoolean, + apply: EXPORTABLE( + ( + assertAllowed: any, + foreignTable: any, + foreignTableExpression: any, + localAttributes: string[], + remoteAttributes: string[], + sql: any + ) => + function ( + $where: any, + value: boolean | null + ) { + assertAllowed(value, 'scalar' as any); + if (value == null) return; + const $subQuery = $where.existsPlan({ + tableExpression: foreignTableExpression, + alias: foreignTable.name, + equals: value, + }); + localAttributes.forEach( + (localAttribute: string, i: number) => { + const remoteAttribute = remoteAttributes[i]; + $subQuery.where( + sql`${$where.alias}.${sql.identifier( + localAttribute + )} = ${$subQuery.alias}.${sql.identifier( + remoteAttribute + )}` + ); + } + ); + }, + [ + assertAllowed, + foreignTable, + foreignTableExpression, + localAttributes, + remoteAttributes, + sql, + ] + ), + }) + ), + }, + `Adding connection filter backward single relation exists field for ${fieldName}` + ); + } else { + // One-to-many: add a "many" filter field (e.g. ordersByClientId: ClientToManyOrderFilter) + const fieldName = inflection._manyRelation({ + registry: source.registry, + codec: source.codec, + relationName, + }); + const filterFieldName = + inflection.filterManyRelationByKeysFieldName(fieldName); + + const filterManyTypeName = inflection.filterManyType( + source.codec, + foreignTable + ); + const FilterManyType = build.getTypeByName( + filterManyTypeName + ) as GraphQLInputObjectType; + if (!FilterManyType) continue; + + // The many relation field tags $where with relation info so that + // some/every/none can create the appropriate EXISTS subquery. + fields = extend( + fields, + { + [filterFieldName]: fieldWithHooks( + { + fieldName: filterFieldName, + isPgConnectionFilterField: true, + isPgConnectionFilterManyField: true, + }, + () => ({ + description: `Filter by the object\u2019s \`${fieldName}\` relation.`, + type: FilterManyType, + apply: EXPORTABLE( + ( + assertAllowed: any, + foreignTable: any, + foreignTableExpression: any, + localAttributes: string[], + remoteAttributes: string[] + ) => + function ($where: any, value: object | null) { + assertAllowed(value, 'object'); + if (value == null) return; + // Tag $where with relation info for some/every/none + $where._manyRelation = { + foreignTable, + foreignTableExpression, + localAttributes, + remoteAttributes, + }; + return $where; + }, + [ + assertAllowed, + foreignTable, + foreignTableExpression, + localAttributes, + remoteAttributes, + ] + ), + }) + ), + }, + `Adding connection filter backward many relation field from ${source.name} to ${foreignTable.name}` + ); + + // Add exists field for many relations + const existsFieldName = + inflection.filterBackwardManyRelationExistsFieldName(fieldName); + fields = extend( + fields, + { + [existsFieldName]: fieldWithHooks( + { + fieldName: existsFieldName, + isPgConnectionFilterField: true, + }, + () => ({ + description: `\`${fieldName}\` exist.`, + type: GraphQLBoolean, + apply: EXPORTABLE( + ( + assertAllowed: any, + foreignTable: any, + foreignTableExpression: any, + localAttributes: string[], + remoteAttributes: string[], + sql: any + ) => + function ( + $where: any, + value: boolean | null + ) { + assertAllowed(value, 'scalar' as any); + if (value == null) return; + const $subQuery = $where.existsPlan({ + tableExpression: foreignTableExpression, + alias: foreignTable.name, + equals: value, + }); + localAttributes.forEach( + (localAttribute: string, i: number) => { + const remoteAttribute = remoteAttributes[i]; + $subQuery.where( + sql`${$where.alias}.${sql.identifier( + localAttribute + )} = ${$subQuery.alias}.${sql.identifier( + remoteAttribute + )}` + ); + } + ); + }, + [ + assertAllowed, + foreignTable, + foreignTableExpression, + localAttributes, + remoteAttributes, + sql, + ] + ), + }) + ), + }, + `Adding connection filter backward many relation exists field for ${fieldName}` + ); + } + } + } + + // ─── Part 2: Add some/every/none fields to "many" filter types ─── + if (isPgConnectionFilterMany && scopeForeignTable) { + const foreignTableTypeName = inflection.tableType( + scopeForeignTable.codec + ); + const foreignTableFilterTypeName = + inflection.filterType(foreignTableTypeName); + const ForeignTableFilterType = build.getTypeByName( + foreignTableFilterTypeName + ) as GraphQLInputObjectType; + if (!ForeignTableFilterType) return fields; + + fields = extend( + fields, + { + // `some`: EXISTS (... WHERE join AND filter) + some: fieldWithHooks( + { + fieldName: 'some', + isPgConnectionFilterField: true, + }, + () => ({ + description: 'Filters to entities where at least one related entity matches.', + type: ForeignTableFilterType, + apply: EXPORTABLE( + ( + assertAllowed: any, + sql: any + ) => + function ($where: any, value: object | null) { + assertAllowed(value, 'object'); + if (value == null) return; + const rel = $where._manyRelation; + if (!rel) return; + const $subQuery = $where.existsPlan({ + tableExpression: rel.foreignTableExpression, + alias: rel.foreignTable.name, + }); + rel.localAttributes.forEach( + (la: string, i: number) => { + $subQuery.where( + sql`${$where.alias}.${sql.identifier( + la + )} = ${$subQuery.alias}.${sql.identifier( + rel.remoteAttributes[i] + )}` + ); + } + ); + return $subQuery; + }, + [assertAllowed, sql] + ), + }) + ), + + // `every`: NOT EXISTS (... WHERE join AND NOT(filter)) + every: fieldWithHooks( + { + fieldName: 'every', + isPgConnectionFilterField: true, + }, + () => ({ + description: 'Filters to entities where every related entity matches.', + type: ForeignTableFilterType, + apply: EXPORTABLE( + ( + assertAllowed: any, + sql: any + ) => + function ($where: any, value: object | null) { + assertAllowed(value, 'object'); + if (value == null) return; + const rel = $where._manyRelation; + if (!rel) return; + // NOT EXISTS (... WHERE join AND NOT(filter)) + const $subQuery = $where.existsPlan({ + tableExpression: rel.foreignTableExpression, + alias: rel.foreignTable.name, + equals: false, + }); + rel.localAttributes.forEach( + (la: string, i: number) => { + $subQuery.where( + sql`${$where.alias}.${sql.identifier( + la + )} = ${$subQuery.alias}.${sql.identifier( + rel.remoteAttributes[i] + )}` + ); + } + ); + // Negate the inner filter conditions + const $not = $subQuery.notPlan(); + return $not; + }, + [assertAllowed, sql] + ), + }) + ), + + // `none`: NOT EXISTS (... WHERE join AND filter) + none: fieldWithHooks( + { + fieldName: 'none', + isPgConnectionFilterField: true, + }, + () => ({ + description: 'Filters to entities where no related entity matches.', + type: ForeignTableFilterType, + apply: EXPORTABLE( + ( + assertAllowed: any, + sql: any + ) => + function ($where: any, value: object | null) { + assertAllowed(value, 'object'); + if (value == null) return; + const rel = $where._manyRelation; + if (!rel) return; + // NOT EXISTS (... WHERE join AND filter) + const $subQuery = $where.existsPlan({ + tableExpression: rel.foreignTableExpression, + alias: rel.foreignTable.name, + equals: false, + }); + rel.localAttributes.forEach( + (la: string, i: number) => { + $subQuery.where( + sql`${$where.alias}.${sql.identifier( + la + )} = ${$subQuery.alias}.${sql.identifier( + rel.remoteAttributes[i] + )}` + ); + } + ); + return $subQuery; + }, + [assertAllowed, sql] + ), + }) + ), + }, + 'Adding some/every/none fields to many filter type' + ); + } + + return fields; + }, + }, + }, +}; diff --git a/graphile/graphile-connection-filter/src/plugins/ConnectionFilterForwardRelationsPlugin.ts b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterForwardRelationsPlugin.ts new file mode 100644 index 000000000..0dcb83951 --- /dev/null +++ b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterForwardRelationsPlugin.ts @@ -0,0 +1,257 @@ +import '../augmentations'; +import type { GraphileConfig } from 'graphile-config'; +import type { PgCondition, PgCodecRelation, PgCodecWithAttributes, PgResource } from '@dataplan/pg'; +import type { SQL } from 'pg-sql2'; +import type { GraphQLInputObjectType } from 'graphql'; +import { makeAssertAllowed } from '../utils'; + +const version = '1.0.0'; + +/** + * ConnectionFilterForwardRelationsPlugin + * + * Adds forward relation filter fields to table filter types. + * A "forward" relation is one where the current table has a FK referencing another table. + * + * For example, if `orders` has `client_id` referencing `clients`, + * then `OrderFilter` gets a `clientByClientId` field of type `ClientFilter`, + * allowing queries like: + * + * ```graphql + * allOrders(filter: { + * clientByClientId: { name: { startsWith: "Acme" } } + * }) { ... } + * ``` + * + * The SQL generated is an EXISTS subquery: + * ```sql + * WHERE EXISTS ( + * SELECT 1 FROM clients + * WHERE clients.id = orders.client_id + * AND + * ) + * ``` + */ +export const ConnectionFilterForwardRelationsPlugin: GraphileConfig.Plugin = { + name: 'ConnectionFilterForwardRelationsPlugin', + version, + description: 'Adds forward relation filter fields to connection filter types', + + inflection: { + add: { + filterForwardRelationExistsFieldName(_preset: any, relationFieldName: string) { + return `${relationFieldName}Exists`; + }, + filterSingleRelationFieldName(_preset: any, fieldName: string) { + return fieldName; + }, + }, + }, + + schema: { + entityBehavior: { + pgCodecRelation: 'filterBy', + }, + + hooks: { + GraphQLInputObjectType_fields(inFields, build, context) { + let fields = inFields; + + const { + extend, + inflection, + sql, + graphql: { GraphQLBoolean }, + EXPORTABLE, + } = build; + const { + fieldWithHooks, + scope: { pgCodec, isPgConnectionFilter }, + } = context; + + if (!isPgConnectionFilter || !pgCodec || !pgCodec.attributes) { + return fields; + } + + const assertAllowed = makeAssertAllowed(build); + + const source = Object.values( + build.input.pgRegistry.pgResources + ).find( + (s: any) => s.codec === pgCodec && !s.parameters + ) as PgResource | undefined; + + if (!source) return fields; + + const relations = source.getRelations() as { + [relationName: string]: PgCodecRelation; + }; + + const forwardRelations = Object.entries(relations).filter( + ([_relationName, relation]) => !relation.isReferencee + ); + + for (const [relationName, relation] of forwardRelations) { + const foreignTable = relation.remoteResource; + + if (!build.behavior.pgCodecRelationMatches(relation, 'filterBy')) { + continue; + } + + // Skip function-based sources + if (typeof foreignTable.from === 'function') { + continue; + } + + const fieldName = inflection.singleRelation({ + registry: source.registry, + codec: source.codec, + relationName, + }); + const filterFieldName = + inflection.filterSingleRelationFieldName(fieldName); + const foreignTableTypeName = inflection.tableType( + foreignTable.codec + ); + const foreignTableFilterTypeName = + inflection.filterType(foreignTableTypeName); + const ForeignTableFilterType = build.getTypeByName( + foreignTableFilterTypeName + ) as GraphQLInputObjectType; + if (!ForeignTableFilterType) continue; + + const foreignTableExpression = foreignTable.from as SQL; + const localAttributes = relation.localAttributes as string[]; + const remoteAttributes = relation.remoteAttributes as string[]; + + // Add the relation filter field (e.g. clientByClientId: ClientFilter) + fields = extend( + fields, + { + [filterFieldName]: fieldWithHooks( + { + fieldName: filterFieldName, + isPgConnectionFilterField: true, + }, + () => ({ + description: `Filter by the object\u2019s \`${fieldName}\` relation.`, + type: ForeignTableFilterType, + apply: EXPORTABLE( + ( + assertAllowed: any, + foreignTable: any, + foreignTableExpression: any, + localAttributes: string[], + remoteAttributes: string[], + sql: any + ) => + function ($where: any, value: object | null) { + assertAllowed(value, 'object'); + if (value == null) return; + const $subQuery = $where.existsPlan({ + tableExpression: foreignTableExpression, + alias: foreignTable.name, + }); + localAttributes.forEach( + (localAttribute: string, i: number) => { + const remoteAttribute = remoteAttributes[i]; + $subQuery.where( + sql`${$where.alias}.${sql.identifier( + localAttribute + )} = ${$subQuery.alias}.${sql.identifier( + remoteAttribute + )}` + ); + } + ); + return $subQuery; + }, + [ + assertAllowed, + foreignTable, + foreignTableExpression, + localAttributes, + remoteAttributes, + sql, + ] + ), + }) + ), + }, + `Adding connection filter forward relation field from ${source.name} to ${foreignTable.name}` + ); + + // Add an "exists" field for nullable FKs (e.g. clientByClientIdExists: Boolean) + const keyIsNullable = (relation.localAttributes as string[]).some( + (col: string) => + !(source.codec.attributes[col] as any)?.notNull + ); + if (keyIsNullable) { + const existsFieldName = + inflection.filterForwardRelationExistsFieldName(fieldName); + fields = extend( + fields, + { + [existsFieldName]: fieldWithHooks( + { + fieldName: existsFieldName, + isPgConnectionFilterField: true, + }, + () => ({ + description: `A related \`${fieldName}\` exists.`, + type: GraphQLBoolean, + apply: EXPORTABLE( + ( + assertAllowed: any, + foreignTable: any, + foreignTableExpression: any, + localAttributes: string[], + remoteAttributes: string[], + sql: any + ) => + function ( + $where: any, + value: boolean | null + ) { + assertAllowed(value, 'scalar' as any); + if (value == null) return; + const $subQuery = $where.existsPlan({ + tableExpression: foreignTableExpression, + alias: foreignTable.name, + equals: value, + }); + localAttributes.forEach( + (localAttribute: string, i: number) => { + const remoteAttribute = remoteAttributes[i]; + $subQuery.where( + sql`${$where.alias}.${sql.identifier( + localAttribute + )} = ${$subQuery.alias}.${sql.identifier( + remoteAttribute + )}` + ); + } + ); + }, + [ + assertAllowed, + foreignTable, + foreignTableExpression, + localAttributes, + remoteAttributes, + sql, + ] + ), + }) + ), + }, + `Adding connection filter forward relation exists field for ${fieldName}` + ); + } + } + + return fields; + }, + }, + }, +}; diff --git a/graphile/graphile-connection-filter/src/plugins/index.ts b/graphile/graphile-connection-filter/src/plugins/index.ts index 487515552..0e8db1cb4 100644 --- a/graphile/graphile-connection-filter/src/plugins/index.ts +++ b/graphile/graphile-connection-filter/src/plugins/index.ts @@ -6,4 +6,6 @@ export { ConnectionFilterOperatorsPlugin } from './ConnectionFilterOperatorsPlug export { ConnectionFilterCustomOperatorsPlugin } from './ConnectionFilterCustomOperatorsPlugin'; export { ConnectionFilterLogicalOperatorsPlugin } from './ConnectionFilterLogicalOperatorsPlugin'; export { ConnectionFilterComputedAttributesPlugin } from './ConnectionFilterComputedAttributesPlugin'; +export { ConnectionFilterForwardRelationsPlugin } from './ConnectionFilterForwardRelationsPlugin'; +export { ConnectionFilterBackwardRelationsPlugin } from './ConnectionFilterBackwardRelationsPlugin'; export { makeApplyFromOperatorSpec } from './operatorApply'; diff --git a/graphile/graphile-connection-filter/src/preset.ts b/graphile/graphile-connection-filter/src/preset.ts index 5f337996a..c41352529 100644 --- a/graphile/graphile-connection-filter/src/preset.ts +++ b/graphile/graphile-connection-filter/src/preset.ts @@ -33,6 +33,8 @@ import { ConnectionFilterCustomOperatorsPlugin, ConnectionFilterLogicalOperatorsPlugin, ConnectionFilterComputedAttributesPlugin, + ConnectionFilterForwardRelationsPlugin, + ConnectionFilterBackwardRelationsPlugin, } from './plugins'; /** @@ -45,6 +47,7 @@ const defaultSchemaOptions: ConnectionFilterOptions = { connectionFilterAllowEmptyObjectInput: false, connectionFilterSetofFunctions: true, connectionFilterComputedColumns: true, + connectionFilterRelations: false, }; /** @@ -80,6 +83,12 @@ export function ConnectionFilterPreset( plugins.push(ConnectionFilterComputedAttributesPlugin); } + // Relation filters are opt-in (disabled by default) + if (mergedOptions.connectionFilterRelations) { + plugins.push(ConnectionFilterForwardRelationsPlugin); + plugins.push(ConnectionFilterBackwardRelationsPlugin); + } + return { plugins, schema: mergedOptions, diff --git a/graphile/graphile-connection-filter/src/types.ts b/graphile/graphile-connection-filter/src/types.ts index db6e2b979..ff46e3af4 100644 --- a/graphile/graphile-connection-filter/src/types.ts +++ b/graphile/graphile-connection-filter/src/types.ts @@ -81,6 +81,8 @@ export interface ConnectionFilterOptions { connectionFilterSetofFunctions?: boolean; /** Allow filtering on computed columns. Default: true */ connectionFilterComputedColumns?: boolean; + /** Allow filtering on related tables via FK relationships. Default: false */ + connectionFilterRelations?: boolean; } /** diff --git a/graphile/graphile-search-plugin/__tests__/filter.test.ts b/graphile/graphile-search-plugin/__tests__/filter.test.ts index e758f591e..c85a23f8f 100644 --- a/graphile/graphile-search-plugin/__tests__/filter.test.ts +++ b/graphile/graphile-search-plugin/__tests__/filter.test.ts @@ -396,11 +396,7 @@ describe('PgSearchPlugin filter with multiple tsvector columns', () => { }); }); -// Skipped: these tests require relation filter plugins (e.g. clientByClientId) -// which are not included in the v5-native graphile-connection-filter plugin. -// Relation filters were disabled in production (via disablePlugins) with the old plugin. -// Re-enable these tests if/when relation filter support is added. -describe.skip('PgSearchPlugin filter with connectionFilterRelations', () => { +describe('PgSearchPlugin filter with connectionFilterRelations', () => { let teardown: () => Promise; let query: QueryFn; From b4ff740642a90a342fe4f06476ef9828c84dcf38 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Thu, 12 Mar 2026 08:42:20 +0000 Subject: [PATCH 08/19] fix: always include relation plugins, check connectionFilterRelations at runtime The preset factory now always includes relation plugins in the plugin list. Each plugin checks build.options.connectionFilterRelations at runtime and early-returns if disabled. This allows the toggle to be set by any preset in the chain, not just the ConnectionFilterPreset() call. --- .../ConnectionFilterBackwardRelationsPlugin.ts | 11 +++++++++++ .../plugins/ConnectionFilterForwardRelationsPlugin.ts | 5 +++++ graphile/graphile-connection-filter/src/preset.ts | 9 ++++----- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/graphile/graphile-connection-filter/src/plugins/ConnectionFilterBackwardRelationsPlugin.ts b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterBackwardRelationsPlugin.ts index 8c9170df9..0f596ada2 100644 --- a/graphile/graphile-connection-filter/src/plugins/ConnectionFilterBackwardRelationsPlugin.ts +++ b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterBackwardRelationsPlugin.ts @@ -82,6 +82,11 @@ export const ConnectionFilterBackwardRelationsPlugin: GraphileConfig.Plugin = { hooks: { init(_, build) { + // Runtime check: only proceed if relation filters are enabled + if (!build.options.connectionFilterRelations) { + return _; + } + const { inflection } = build; // Register "many" filter types (e.g. ClientToManyOrderFilter) @@ -141,6 +146,12 @@ export const ConnectionFilterBackwardRelationsPlugin: GraphileConfig.Plugin = { GraphQLInputObjectType_fields(inFields, build, context) { let fields = inFields; + + // Runtime check: only proceed if relation filters are enabled + if (!build.options.connectionFilterRelations) { + return fields; + } + const { extend, inflection, diff --git a/graphile/graphile-connection-filter/src/plugins/ConnectionFilterForwardRelationsPlugin.ts b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterForwardRelationsPlugin.ts index 0dcb83951..6590e0391 100644 --- a/graphile/graphile-connection-filter/src/plugins/ConnectionFilterForwardRelationsPlugin.ts +++ b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterForwardRelationsPlugin.ts @@ -57,6 +57,11 @@ export const ConnectionFilterForwardRelationsPlugin: GraphileConfig.Plugin = { GraphQLInputObjectType_fields(inFields, build, context) { let fields = inFields; + // Runtime check: only proceed if relation filters are enabled + if (!build.options.connectionFilterRelations) { + return fields; + } + const { extend, inflection, diff --git a/graphile/graphile-connection-filter/src/preset.ts b/graphile/graphile-connection-filter/src/preset.ts index c41352529..6bdd0254c 100644 --- a/graphile/graphile-connection-filter/src/preset.ts +++ b/graphile/graphile-connection-filter/src/preset.ts @@ -83,11 +83,10 @@ export function ConnectionFilterPreset( plugins.push(ConnectionFilterComputedAttributesPlugin); } - // Relation filters are opt-in (disabled by default) - if (mergedOptions.connectionFilterRelations) { - plugins.push(ConnectionFilterForwardRelationsPlugin); - plugins.push(ConnectionFilterBackwardRelationsPlugin); - } + // Relation filter plugins are always included but check + // build.options.connectionFilterRelations at runtime + plugins.push(ConnectionFilterForwardRelationsPlugin); + plugins.push(ConnectionFilterBackwardRelationsPlugin); return { plugins, From 28b23c48dc3e7c9613fc1b38282256ac6e54f654 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Thu, 12 Mar 2026 23:52:02 +0000 Subject: [PATCH 09/19] feat: enable connectionFilterRelations in constructive preset Enables relation filter fields in the production schema: - Forward: filter by FK parent (e.g. clientByClientId on OrderFilter) - Backward: filter by children with some/every/none - Codegen will pick up the new filter fields automatically --- .../src/presets/constructive-preset.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/graphile/graphile-settings/src/presets/constructive-preset.ts b/graphile/graphile-settings/src/presets/constructive-preset.ts index c2356f770..4ef2598df 100644 --- a/graphile/graphile-settings/src/presets/constructive-preset.ts +++ b/graphile/graphile-settings/src/presets/constructive-preset.ts @@ -45,9 +45,10 @@ import { constructiveUploadFieldDefinitions } from '../upload-resolver'; * - pg_textsearch BM25 search (auto-discovers BM25 indexes: condition fields, score computed fields, * orderBy score — zero config) * - * DISABLED PLUGINS: - * - PgConnectionArgFilterBackwardRelationsPlugin (relation filters bloat the API) - * - PgConnectionArgFilterForwardRelationsPlugin (relation filters bloat the API) + * RELATION FILTERS: + * - Enabled via connectionFilterRelations: true + * - Forward: filter child by parent (e.g. allOrders(filter: { clientByClientId: { name: { startsWith: "Acme" } } })) + * - Backward: filter parent by children (e.g. allClients(filter: { ordersByClientId: { some: { total: { greaterThan: 1000 } } } })) * * USAGE: * ```typescript @@ -72,7 +73,7 @@ export const ConstructivePreset: GraphileConfig.Preset = { InflektPreset, InflectorLoggerPreset, NoUniqueLookupPreset, - ConnectionFilterPreset(), + ConnectionFilterPreset({ connectionFilterRelations: true }), EnableAllFilterColumnsPreset, ManyToManyOptInPreset, MetaSchemaPreset, @@ -95,8 +96,8 @@ export const ConstructivePreset: GraphileConfig.Preset = { * Connection Filter Plugin Configuration * * These options control what fields appear in the `filter` argument on connections. - * Our v5-native graphile-connection-filter plugin does NOT include relation filter plugins, - * so no `disablePlugins` hack is needed (unlike the upstream postgraphile-plugin-connection-filter). + * Our v5-native graphile-connection-filter plugin controls relation filters via the + * `connectionFilterRelations` option passed to ConnectionFilterPreset(). * * NOTE: By default, PostGraphile v5 only allows filtering on INDEXED columns. * We override this with EnableAllFilterColumnsPreset to allow filtering on ALL columns. From 76f35f53dfc3821ab81dcb6b3ef1fe944a2e8983 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Fri, 13 Mar 2026 00:15:03 +0000 Subject: [PATCH 10/19] feat: deprecate condition argument, move search + BM25 plugins to filter MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Search plugin: isPgCondition → isPgConnectionFilter scope - BM25 plugin: isPgCondition → isPgConnectionFilter scope - Disable PgConditionArgumentPlugin and PgConditionCustomFieldsPlugin in preset - Update all tests from condition: {...} to filter: {...} - Add graphile-connection-filter devDependency to BM25 plugin - Update search plugin graceful degradation tests to use filter BREAKING CHANGE: The condition argument has been removed entirely. All filtering now uses the filter argument exclusively. --- .../package.json | 1 + .../src/__tests__/bm25-search.test.ts | 28 +++++++++++-------- .../src/bm25-search.ts | 17 ++++++----- .../__tests__/filter.test.ts | 23 +++++++-------- graphile/graphile-search-plugin/src/plugin.ts | 10 +++---- .../src/presets/constructive-preset.ts | 18 ++++++++++-- pnpm-lock.yaml | 3 ++ 7 files changed, 63 insertions(+), 37 deletions(-) diff --git a/graphile/graphile-pg-textsearch-plugin/package.json b/graphile/graphile-pg-textsearch-plugin/package.json index 28684037f..01661c1ec 100644 --- a/graphile/graphile-pg-textsearch-plugin/package.json +++ b/graphile/graphile-pg-textsearch-plugin/package.json @@ -31,6 +31,7 @@ "devDependencies": { "@types/node": "^22.19.11", "@types/pg": "^8.18.0", + "graphile-connection-filter": "workspace:^", "graphile-test": "workspace:^", "makage": "^0.1.10", "pg": "^8.19.0", diff --git a/graphile/graphile-pg-textsearch-plugin/src/__tests__/bm25-search.test.ts b/graphile/graphile-pg-textsearch-plugin/src/__tests__/bm25-search.test.ts index 456e561be..9c56f604e 100644 --- a/graphile/graphile-pg-textsearch-plugin/src/__tests__/bm25-search.test.ts +++ b/graphile/graphile-pg-textsearch-plugin/src/__tests__/bm25-search.test.ts @@ -2,6 +2,7 @@ import { join } from 'path'; import { getConnections, seed } from 'graphile-test'; import type { GraphQLResponse } from 'graphile-test'; import type { PgTestClient } from 'pgsql-test'; +import { ConnectionFilterPreset } from 'graphile-connection-filter'; import { Bm25CodecPlugin } from '../bm25-codec'; import { createBm25SearchPlugin } from '../bm25-search'; @@ -30,6 +31,9 @@ describe('Bm25SearchPlugin', () => { beforeAll(async () => { const testPreset = { + extends: [ + ConnectionFilterPreset(), + ], plugins: [ Bm25CodecPlugin, createBm25SearchPlugin({ conditionPrefix: 'bm25' }), @@ -75,11 +79,11 @@ describe('Bm25SearchPlugin', () => { await db.afterEach(); }); - describe('condition field (bm25Body)', () => { + describe('filter field (bm25Body)', () => { it('performs BM25 search with a query string', async () => { const result = await query(` query { - allArticles(condition: { + allArticles(filter: { bm25Body: { query: "database management system" } @@ -101,10 +105,10 @@ describe('Bm25SearchPlugin', () => { expect(nodes!.length).toBeGreaterThan(0); }); - it('returns bm25BodyScore computed field when condition is active', async () => { + it('returns bm25BodyScore computed field when filter is active', async () => { const result = await query(` query { - allArticles(condition: { + allArticles(filter: { bm25Body: { query: "database" } @@ -121,7 +125,7 @@ describe('Bm25SearchPlugin', () => { const nodes = result.data?.allArticles?.nodes; expect(nodes).toBeDefined(); - // All nodes should have a BM25 score since the condition is active + // All nodes should have a BM25 score since the filter is active for (const node of nodes!) { expect(node.bm25BodyScore).toBeDefined(); expect(typeof node.bm25BodyScore).toBe('number'); @@ -130,7 +134,7 @@ describe('Bm25SearchPlugin', () => { } }); - it('returns null for bm25BodyScore when no condition is active', async () => { + it('returns null for bm25BodyScore when no filter is active', async () => { const result = await query(` query { allArticles { @@ -154,7 +158,7 @@ describe('Bm25SearchPlugin', () => { it('filters by score threshold', async () => { const result = await query(` query { - allArticles(condition: { + allArticles(filter: { bm25Body: { query: "database" threshold: -0.5 @@ -183,7 +187,7 @@ describe('Bm25SearchPlugin', () => { it('discovers BM25 indexes on both title and body columns', async () => { const result = await query(` query { - allArticles(condition: { + allArticles(filter: { bm25Title: { query: "PostgreSQL" } @@ -215,7 +219,7 @@ describe('Bm25SearchPlugin', () => { const result = await query(` query { allArticles( - condition: { + filter: { bm25Body: { query: "database" } @@ -247,7 +251,7 @@ describe('Bm25SearchPlugin', () => { const result = await query(` query { allArticles( - condition: { + filter: { bm25Body: { query: "database" } @@ -281,7 +285,7 @@ describe('Bm25SearchPlugin', () => { const result = await query(` query { allArticles( - condition: { + filter: { bm25Body: { query: "search ranking" threshold: -0.1 @@ -320,7 +324,7 @@ describe('Bm25SearchPlugin', () => { const result = await query(` query { allArticles( - condition: { + filter: { bm25Body: { query: "database" } diff --git a/graphile/graphile-pg-textsearch-plugin/src/bm25-search.ts b/graphile/graphile-pg-textsearch-plugin/src/bm25-search.ts index 9c63f4594..92676440d 100644 --- a/graphile/graphile-pg-textsearch-plugin/src/bm25-search.ts +++ b/graphile/graphile-pg-textsearch-plugin/src/bm25-search.ts @@ -35,6 +35,7 @@ import 'graphile-build'; import 'graphile-build-pg'; +import 'graphile-connection-filter'; import { TYPES } from '@dataplan/pg'; import type { PgCodecWithAttributes } from '@dataplan/pg'; import type { GraphileConfig } from 'graphile-config'; @@ -155,10 +156,12 @@ export function createBm25SearchPlugin( name: 'Bm25SearchPlugin', version: '1.0.0', description: - 'Auto-discovers text columns with BM25 indexes and adds search conditions, score fields, and orderBy', + 'Auto-discovers text columns with BM25 indexes and adds search filter fields, score fields, and orderBy', after: [ 'Bm25CodecPlugin', 'PgAttributesPlugin', + 'PgConnectionArgFilterPlugin', + 'PgConnectionArgFilterAttributesPlugin', ], // ─── Custom Inflection Methods ───────────────────────────────────── @@ -457,18 +460,18 @@ export function createBm25SearchPlugin( }, /** - * Add `bm25` condition fields on connection condition input types + * Add `bm25` filter fields on connection filter input types * for tables with BM25-indexed text columns. */ GraphQLInputObjectType_fields(fields, build, context) { const { inflection, sql } = build; const { - scope: { isPgCondition, pgCodec }, + scope: { isPgConnectionFilter, pgCodec } = {} as any, fieldWithHooks, } = context; if ( - !isPgCondition || + !isPgConnectionFilter || !pgCodec || !pgCodec.attributes || pgCodec.isAnonymous @@ -509,8 +512,8 @@ export function createBm25SearchPlugin( [fieldName]: fieldWithHooks( { fieldName, - isPgConnectionConditionInputField: true, - }, + isPgConnectionFilterField: true, + } as any, { description: build.wrapDescription( `BM25 ranked text search on the \`${attributeName}\` column using pg_textsearch. ` + @@ -585,7 +588,7 @@ export function createBm25SearchPlugin( } ), }, - `Bm25SearchPlugin adding condition field '${fieldName}' for BM25 column '${attributeName}' on '${pgCodec.name}'` + `Bm25SearchPlugin adding filter field '${fieldName}' for BM25 column '${attributeName}' on '${pgCodec.name}'` ); } diff --git a/graphile/graphile-search-plugin/__tests__/filter.test.ts b/graphile/graphile-search-plugin/__tests__/filter.test.ts index c85a23f8f..c8ffdd5c2 100644 --- a/graphile/graphile-search-plugin/__tests__/filter.test.ts +++ b/graphile/graphile-search-plugin/__tests__/filter.test.ts @@ -150,15 +150,15 @@ describe('PgSearchPlugin filter (matches operator)', () => { } }); - it('condition-based search populates fullTextRank', async () => { - // Rank features work with condition-based search. + it('filter-based search populates fullTextRank', async () => { + // Rank features work with filter-based search. // "fruit OR banana" — both rows match "fruit", one also matches "banana" // (websearch_to_tsquery uses the word "or" for OR, not "|") const result = await query<{ allJobs: { nodes: any[] } }>({ query: ` query { allJobs( - condition: { fullTextFullText: "fruit or banana" } + filter: { fullTextFullText: "fruit or banana" } ) { nodes { id @@ -179,13 +179,13 @@ describe('PgSearchPlugin filter (matches operator)', () => { }); it('sort by full text rank orderBy enums works', async () => { - // Use condition-based search so rank data is available. + // Use filter-based search so rank data is available. // "fruit or banana" matches both rows with different ranks. const ascResult = await query<{ allJobs: { nodes: any[] } }>({ query: ` query { allJobs( - condition: { fullTextFullText: "fruit or banana" } + filter: { fullTextFullText: "fruit or banana" } orderBy: [FULL_TEXT_RANK_ASC] ) { nodes { @@ -209,7 +209,7 @@ describe('PgSearchPlugin filter (matches operator)', () => { query: ` query { allJobs( - condition: { fullTextFullText: "fruit or banana" } + filter: { fullTextFullText: "fruit or banana" } orderBy: [FULL_TEXT_RANK_DESC] ) { nodes { @@ -482,16 +482,17 @@ describe('PgSearchPlugin filter with connectionFilterRelations', () => { }); }); -describe('PgSearchPlugin without connection-filter (graceful degradation)', () => { +describe('PgSearchPlugin with connection-filter (simple schema)', () => { let teardown: () => Promise; let query: QueryFn; beforeAll(async () => { - // Preset WITHOUT connection-filter const testPreset = { extends: [ + ConnectionFilterPreset(), PgSearchPreset({ pgSearchPrefix: 'fullText' }), ], + plugins: [EnableAllFilterColumnsPlugin], }; const connections = await getConnectionsObject( @@ -513,11 +514,11 @@ describe('PgSearchPlugin without connection-filter (graceful degradation)', () = } }); - it('condition-based search still works without connection-filter', async () => { + it('filter-based search works on simple schema', async () => { const result = await query<{ allSimpleJobs: { nodes: any[] } }>({ query: ` query { - allSimpleJobs(condition: { fullTextTsv: "apple" }) { + allSimpleJobs(filter: { fullTextTsv: "apple" }) { nodes { id name @@ -531,7 +532,7 @@ describe('PgSearchPlugin without connection-filter (graceful degradation)', () = expect(result.data?.allSimpleJobs.nodes).toHaveLength(1); }); - it('no errors when connection-filter not loaded', async () => { + it('no errors when querying without filter', async () => { const result = await query<{ allSimpleJobs: { nodes: any[] } }>({ query: ` query { diff --git a/graphile/graphile-search-plugin/src/plugin.ts b/graphile/graphile-search-plugin/src/plugin.ts index 0c7af7411..02dd1cda4 100644 --- a/graphile/graphile-search-plugin/src/plugin.ts +++ b/graphile/graphile-search-plugin/src/plugin.ts @@ -553,12 +553,12 @@ export function createPgSearchPlugin( graphql: { GraphQLString }, } = build; const { - scope: { isPgCondition, pgCodec }, + scope: { isPgConnectionFilter, pgCodec } = {} as any, fieldWithHooks, } = context; if ( - !isPgCondition || + !isPgConnectionFilter || !pgCodec || !pgCodec.attributes || pgCodec.isAnonymous @@ -591,8 +591,8 @@ export function createPgSearchPlugin( [fieldName]: fieldWithHooks( { fieldName, - isPgConnectionConditionInputField: true, - }, + isPgConnectionFilterField: true, + } as any, { description: build.wrapDescription( `Full-text search on the \`${attributeName}\` tsvector column using \`websearch_to_tsquery\`.`, @@ -643,7 +643,7 @@ export function createPgSearchPlugin( } ), }, - `PgSearchPlugin adding condition field '${fieldName}' for tsvector column '${attributeName}' on '${pgCodec.name}'` + `PgSearchPlugin adding filter field '${fieldName}' for tsvector column '${attributeName}' on '${pgCodec.name}'` ); } diff --git a/graphile/graphile-settings/src/presets/constructive-preset.ts b/graphile/graphile-settings/src/presets/constructive-preset.ts index 4ef2598df..d3287dbdb 100644 --- a/graphile/graphile-settings/src/presets/constructive-preset.ts +++ b/graphile/graphile-settings/src/presets/constructive-preset.ts @@ -40,11 +40,15 @@ import { constructiveUploadFieldDefinitions } from '../upload-resolver'; * - Upload plugin (file upload to S3/MinIO for image, upload, attachment domain columns) * - SQL expression validator (validates @sqlExpression columns in mutations) * - PG type mappings (maps custom types like email, url to GraphQL scalars) - * - pgvector search (auto-discovers vector columns: condition fields, distance computed fields, + * - pgvector search (auto-discovers vector columns: filter fields, distance computed fields, * orderBy distance — zero config) - * - pg_textsearch BM25 search (auto-discovers BM25 indexes: condition fields, score computed fields, + * - pg_textsearch BM25 search (auto-discovers BM25 indexes: filter fields, score computed fields, * orderBy score — zero config) * + * DEPRECATED: + * - The `condition` argument has been removed. All filtering lives under `filter`. + * PgConditionArgumentPlugin and PgConditionCustomFieldsPlugin are disabled. + * * RELATION FILTERS: * - Enabled via connectionFilterRelations: true * - Forward: filter child by parent (e.g. allOrders(filter: { clientByClientId: { name: { startsWith: "Acme" } } })) @@ -92,6 +96,16 @@ export const ConstructivePreset: GraphileConfig.Preset = { SqlExpressionValidatorPreset(), PgTypeMappingsPreset, ], + /** + * Disable PostGraphile core's condition argument entirely. + * All filtering now lives under the `filter` argument via our v5-native + * graphile-connection-filter plugin. Search, BM25, pgvector, and PostGIS + * filter fields all hook into `isPgConnectionFilter` instead of `isPgCondition`. + */ + disablePlugins: [ + 'PgConditionArgumentPlugin', + 'PgConditionCustomFieldsPlugin', + ], /** * Connection Filter Plugin Configuration * diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 58d121a4b..5c89bedea 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -311,6 +311,9 @@ importers: '@types/pg': specifier: ^8.18.0 version: 8.18.0 + graphile-connection-filter: + specifier: workspace:^ + version: link:../graphile-connection-filter/dist graphile-test: specifier: workspace:^ version: link:../graphile-test/dist From 10ed4c485e01cf7e8e964498b996494ea4345dcf Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Fri, 13 Mar 2026 00:28:53 +0000 Subject: [PATCH 11/19] fix: update tests and snapshots for condition deprecation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Search plugin plugin.test.ts: condition → filter syntax, add ConnectionFilterPreset - Server-test: condition → filter in query with equalTo operator - Clear stale snapshots (schema-snapshot, introspection) for regeneration --- .../__snapshots__/plugin.test.ts.snap | 38 - .../__tests__/plugin.test.ts | 28 +- .../schema-snapshot.test.ts.snap | 2369 --------- .../server-test/__tests__/server-test.test.ts | 2 +- .../__snapshots__/graphile-test.test.ts.snap | 4289 ----------------- 5 files changed, 16 insertions(+), 6710 deletions(-) diff --git a/graphile/graphile-search-plugin/__tests__/__snapshots__/plugin.test.ts.snap b/graphile/graphile-search-plugin/__tests__/__snapshots__/plugin.test.ts.snap index 0aec1048b..12c5cfd47 100644 --- a/graphile/graphile-search-plugin/__tests__/__snapshots__/plugin.test.ts.snap +++ b/graphile/graphile-search-plugin/__tests__/__snapshots__/plugin.test.ts.snap @@ -1,39 +1 @@ // Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing - -exports[`PgSearchPlugin condition-based search on stsv column returns only title-matched rows for fullTextStsv condition 1`] = ` -{ - "allGoals": { - "nodes": [ - { - "description": "Second in years female given. Us firmament. She'd kind there let moved thing evening saying set whales a fowl heaven.", - "rowId": "[ID]", - "title": "green fowl", - }, - ], - }, -} -`; - -exports[`PgSearchPlugin condition-based search on tsv column returns matching rows with ts_rank as secondary sort 1`] = ` -{ - "allGoals": { - "nodes": [ - { - "description": "Appear evening that gathered saying. Sea subdue so fill stars. Bring is man divided behold fish their. Also won't fowl.", - "rowId": "[ID]", - "title": "evenings", - }, - { - "description": "Heaven. Tree creeping was. Gathered living dominion us likeness first subdue fill. Fowl him moveth fly also the is created.", - "rowId": "[ID]", - "title": "heaven", - }, - { - "description": "Second in years female given. Us firmament. She'd kind there let moved thing evening saying set whales a fowl heaven.", - "rowId": "[ID]", - "title": "green fowl", - }, - ], - }, -} -`; diff --git a/graphile/graphile-search-plugin/__tests__/plugin.test.ts b/graphile/graphile-search-plugin/__tests__/plugin.test.ts index ae66ccada..126ae7b88 100644 --- a/graphile/graphile-search-plugin/__tests__/plugin.test.ts +++ b/graphile/graphile-search-plugin/__tests__/plugin.test.ts @@ -2,6 +2,7 @@ import { join } from 'path'; import { getConnections, seed, snapshot } from 'graphile-test'; import type { GraphQLResponse } from 'graphile-test'; import type { PgTestClient } from 'pgsql-test'; +import { ConnectionFilterPreset } from 'graphile-connection-filter'; import { PgSearchPreset } from '../src'; const SCHEMA = 'app_public'; @@ -30,6 +31,7 @@ describe('PgSearchPlugin', () => { beforeAll(async () => { const testPreset = { extends: [ + ConnectionFilterPreset(), PgSearchPreset({ pgSearchPrefix: 'fullText' }), ], }; @@ -73,12 +75,12 @@ describe('PgSearchPlugin', () => { await db.afterEach(); }); - describe('condition-based search on tsv column', () => { + describe('filter-based search on tsv column', () => { it('returns matching rows with ts_rank as secondary sort', async () => { const result = await query( ` - query GoalsSearchViaCondition($search: String!) { - allGoals(condition: { fullTextTsv: $search }) { + query GoalsSearchViaFilter($search: String!) { + allGoals(filter: { fullTextTsv: $search }) { nodes { rowId title @@ -97,8 +99,8 @@ describe('PgSearchPlugin', () => { it('returns no rows when search term does not match', async () => { const result = await query( ` - query GoalsSearchViaCondition($search: String!) { - allGoals(condition: { fullTextTsv: $search }) { + query GoalsSearchViaFilter($search: String!) { + allGoals(filter: { fullTextTsv: $search }) { nodes { rowId title @@ -114,12 +116,12 @@ describe('PgSearchPlugin', () => { }); }); - describe('condition-based search on stsv column', () => { - it('returns only title-matched rows for fullTextStsv condition', async () => { + describe('filter-based search on stsv column', () => { + it('returns only title-matched rows for fullTextStsv filter', async () => { const result = await query( ` - query GoalsSearchViaCondition2($search: String!) { - allGoals(condition: { fullTextStsv: $search }) { + query GoalsSearchViaFilter2($search: String!) { + allGoals(filter: { fullTextStsv: $search }) { nodes { rowId title @@ -140,8 +142,8 @@ describe('PgSearchPlugin', () => { it('handles empty search string gracefully', async () => { const result = await query( ` - query GoalsSearchViaCondition($search: String!) { - allGoals(condition: { fullTextTsv: $search }) { + query GoalsSearchViaFilter($search: String!) { + allGoals(filter: { fullTextTsv: $search }) { nodes { rowId title @@ -160,8 +162,8 @@ describe('PgSearchPlugin', () => { it('works with multi-word search terms', async () => { const result = await query( ` - query GoalsSearchViaCondition($search: String!) { - allGoals(condition: { fullTextTsv: $search }) { + query GoalsSearchViaFilter($search: String!) { + allGoals(filter: { fullTextTsv: $search }) { nodes { rowId title diff --git a/graphql/server-test/__tests__/__snapshots__/schema-snapshot.test.ts.snap b/graphql/server-test/__tests__/__snapshots__/schema-snapshot.test.ts.snap index 28db1c24b..12c5cfd47 100644 --- a/graphql/server-test/__tests__/__snapshots__/schema-snapshot.test.ts.snap +++ b/graphql/server-test/__tests__/__snapshots__/schema-snapshot.test.ts.snap @@ -1,2370 +1 @@ // Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing - -exports[`Schema Snapshot should generate consistent GraphQL SDL from the test schema 1`] = ` -""""The root query type which gives access points into the data universe.""" -type Query { - """Reads and enables pagination through a set of \`PostTag\`.""" - postTags( - """Only read the first \`n\` values of the set.""" - first: Int - - """Only read the last \`n\` values of the set.""" - last: Int - - """ - Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor - based pagination. May not be used with \`last\`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: PostTagCondition - - """ - A filter to be used in determining which values should be returned by the collection. - """ - filter: PostTagFilter - - """The method to use when ordering \`PostTag\`.""" - orderBy: [PostTagOrderBy!] = [PRIMARY_KEY_ASC] - ): PostTagConnection - - """Reads and enables pagination through a set of \`Tag\`.""" - tags( - """Only read the first \`n\` values of the set.""" - first: Int - - """Only read the last \`n\` values of the set.""" - last: Int - - """ - Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor - based pagination. May not be used with \`last\`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: TagCondition - - """ - A filter to be used in determining which values should be returned by the collection. - """ - filter: TagFilter - - """The method to use when ordering \`Tag\`.""" - orderBy: [TagOrderBy!] = [PRIMARY_KEY_ASC] - ): TagConnection - - """Reads and enables pagination through a set of \`User\`.""" - users( - """Only read the first \`n\` values of the set.""" - first: Int - - """Only read the last \`n\` values of the set.""" - last: Int - - """ - Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor - based pagination. May not be used with \`last\`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: UserCondition - - """ - A filter to be used in determining which values should be returned by the collection. - """ - filter: UserFilter - - """The method to use when ordering \`User\`.""" - orderBy: [UserOrderBy!] = [PRIMARY_KEY_ASC] - ): UserConnection - - """Reads and enables pagination through a set of \`Comment\`.""" - comments( - """Only read the first \`n\` values of the set.""" - first: Int - - """Only read the last \`n\` values of the set.""" - last: Int - - """ - Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor - based pagination. May not be used with \`last\`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: CommentCondition - - """ - A filter to be used in determining which values should be returned by the collection. - """ - filter: CommentFilter - - """The method to use when ordering \`Comment\`.""" - orderBy: [CommentOrderBy!] = [PRIMARY_KEY_ASC] - ): CommentConnection - - """Reads and enables pagination through a set of \`Post\`.""" - posts( - """Only read the first \`n\` values of the set.""" - first: Int - - """Only read the last \`n\` values of the set.""" - last: Int - - """ - Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor - based pagination. May not be used with \`last\`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: PostCondition - - """ - A filter to be used in determining which values should be returned by the collection. - """ - filter: PostFilter - - """The method to use when ordering \`Post\`.""" - orderBy: [PostOrderBy!] = [PRIMARY_KEY_ASC] - ): PostConnection - - """ - Metadata about the database schema, including tables, fields, indexes, and constraints. Useful for code generation tools. - """ - _meta: MetaSchema -} - -"""A connection to a list of \`PostTag\` values.""" -type PostTagConnection { - """A list of \`PostTag\` objects.""" - nodes: [PostTag]! - - """ - A list of edges which contains the \`PostTag\` and cursor to aid in pagination. - """ - edges: [PostTagEdge]! - - """Information to aid in pagination.""" - pageInfo: PageInfo! - - """The count of *all* \`PostTag\` you could get from the connection.""" - totalCount: Int! -} - -type PostTag { - id: UUID! - postId: UUID! - tagId: UUID! - createdAt: Datetime - - """Reads a single \`Post\` that is related to this \`PostTag\`.""" - post: Post - - """Reads a single \`Tag\` that is related to this \`PostTag\`.""" - tag: Tag -} - -""" -A universally unique identifier as defined by [RFC 4122](https://tools.ietf.org/html/rfc4122). -""" -scalar UUID - -""" -A point in time as described by the [ISO -8601](https://en.wikipedia.org/wiki/ISO_8601) and, if it has a timezone, [RFC -3339](https://datatracker.ietf.org/doc/html/rfc3339) standards. Input values -that do not conform to both ISO 8601 and RFC 3339 may be coerced, which may lead -to unexpected results. -""" -scalar Datetime - -type Post { - id: UUID! - authorId: UUID! - title: String! - slug: String! - content: String - excerpt: String - isPublished: Boolean - publishedAt: Datetime - viewCount: Int - createdAt: Datetime - updatedAt: Datetime - - """Reads and enables pagination through a set of \`Tag\`.""" - tags( - """Only read the first \`n\` values of the set.""" - first: Int - - """Only read the last \`n\` values of the set.""" - last: Int - - """ - Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor - based pagination. May not be used with \`last\`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: TagCondition - - """ - A filter to be used in determining which values should be returned by the collection. - """ - filter: TagFilter - - """The method to use when ordering \`Tag\`.""" - orderBy: [TagOrderBy!] = [PRIMARY_KEY_ASC] - ): PostTagsManyToManyConnection! - - """Reads a single \`User\` that is related to this \`Post\`.""" - author: User - - """Reads and enables pagination through a set of \`PostTag\`.""" - postTags( - """Only read the first \`n\` values of the set.""" - first: Int - - """Only read the last \`n\` values of the set.""" - last: Int - - """ - Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor - based pagination. May not be used with \`last\`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: PostTagCondition - - """ - A filter to be used in determining which values should be returned by the collection. - """ - filter: PostTagFilter - - """The method to use when ordering \`PostTag\`.""" - orderBy: [PostTagOrderBy!] = [PRIMARY_KEY_ASC] - ): PostTagConnection! - - """Reads and enables pagination through a set of \`Comment\`.""" - comments( - """Only read the first \`n\` values of the set.""" - first: Int - - """Only read the last \`n\` values of the set.""" - last: Int - - """ - Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor - based pagination. May not be used with \`last\`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: CommentCondition - - """ - A filter to be used in determining which values should be returned by the collection. - """ - filter: CommentFilter - - """The method to use when ordering \`Comment\`.""" - orderBy: [CommentOrderBy!] = [PRIMARY_KEY_ASC] - ): CommentConnection! -} - -"""A connection to a list of \`Tag\` values, with data from \`PostTag\`.""" -type PostTagsManyToManyConnection { - """A list of \`Tag\` objects.""" - nodes: [Tag]! - - """ - A list of edges which contains the \`Tag\`, info from the \`PostTag\`, and the cursor to aid in pagination. - """ - edges: [PostTagsManyToManyEdge!]! - - """Information to aid in pagination.""" - pageInfo: PageInfo! - - """The count of *all* \`Tag\` you could get from the connection.""" - totalCount: Int! -} - -type Tag { - id: UUID! - name: String! - slug: String! - description: String - color: String - createdAt: Datetime - - """Reads and enables pagination through a set of \`Post\`.""" - posts( - """Only read the first \`n\` values of the set.""" - first: Int - - """Only read the last \`n\` values of the set.""" - last: Int - - """ - Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor - based pagination. May not be used with \`last\`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: PostCondition - - """ - A filter to be used in determining which values should be returned by the collection. - """ - filter: PostFilter - - """The method to use when ordering \`Post\`.""" - orderBy: [PostOrderBy!] = [PRIMARY_KEY_ASC] - ): TagPostsManyToManyConnection! - - """Reads and enables pagination through a set of \`PostTag\`.""" - postTags( - """Only read the first \`n\` values of the set.""" - first: Int - - """Only read the last \`n\` values of the set.""" - last: Int - - """ - Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor - based pagination. May not be used with \`last\`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: PostTagCondition - - """ - A filter to be used in determining which values should be returned by the collection. - """ - filter: PostTagFilter - - """The method to use when ordering \`PostTag\`.""" - orderBy: [PostTagOrderBy!] = [PRIMARY_KEY_ASC] - ): PostTagConnection! -} - -"""A connection to a list of \`Post\` values, with data from \`PostTag\`.""" -type TagPostsManyToManyConnection { - """A list of \`Post\` objects.""" - nodes: [Post]! - - """ - A list of edges which contains the \`Post\`, info from the \`PostTag\`, and the cursor to aid in pagination. - """ - edges: [TagPostsManyToManyEdge!]! - - """Information to aid in pagination.""" - pageInfo: PageInfo! - - """The count of *all* \`Post\` you could get from the connection.""" - totalCount: Int! -} - -"""A \`Post\` edge in the connection, with data from \`PostTag\`.""" -type TagPostsManyToManyEdge { - """A cursor for use in pagination.""" - cursor: Cursor - - """The \`Post\` at the end of the edge.""" - node: Post - id: UUID! - createdAt: Datetime -} - -"""A location in a connection that can be used for resuming pagination.""" -scalar Cursor - -"""Information about pagination in a connection.""" -type PageInfo { - """When paginating forwards, are there more items?""" - hasNextPage: Boolean! - - """When paginating backwards, are there more items?""" - hasPreviousPage: Boolean! - - """When paginating backwards, the cursor to continue.""" - startCursor: Cursor - - """When paginating forwards, the cursor to continue.""" - endCursor: Cursor -} - -""" -A condition to be used against \`Post\` object types. All fields are tested for equality and combined with a logical ‘and.’ -""" -input PostCondition { - """Checks for equality with the object’s \`id\` field.""" - id: UUID - - """Checks for equality with the object’s \`authorId\` field.""" - authorId: UUID - - """Checks for equality with the object’s \`title\` field.""" - title: String - - """Checks for equality with the object’s \`slug\` field.""" - slug: String - - """Checks for equality with the object’s \`content\` field.""" - content: String - - """Checks for equality with the object’s \`excerpt\` field.""" - excerpt: String - - """Checks for equality with the object’s \`isPublished\` field.""" - isPublished: Boolean - - """Checks for equality with the object’s \`publishedAt\` field.""" - publishedAt: Datetime - - """Checks for equality with the object’s \`viewCount\` field.""" - viewCount: Int - - """Checks for equality with the object’s \`createdAt\` field.""" - createdAt: Datetime - - """Checks for equality with the object’s \`updatedAt\` field.""" - updatedAt: Datetime -} - -""" -A filter to be used against \`Post\` object types. All fields are combined with a logical ‘and.’ -""" -input PostFilter { - """Filter by the object’s \`id\` field.""" - id: UUIDFilter - - """Filter by the object’s \`authorId\` field.""" - authorId: UUIDFilter - - """Filter by the object’s \`title\` field.""" - title: StringFilter - - """Filter by the object’s \`slug\` field.""" - slug: StringFilter - - """Filter by the object’s \`content\` field.""" - content: StringFilter - - """Filter by the object’s \`excerpt\` field.""" - excerpt: StringFilter - - """Filter by the object’s \`isPublished\` field.""" - isPublished: BooleanFilter - - """Filter by the object’s \`publishedAt\` field.""" - publishedAt: DatetimeFilter - - """Filter by the object’s \`viewCount\` field.""" - viewCount: IntFilter - - """Filter by the object’s \`createdAt\` field.""" - createdAt: DatetimeFilter - - """Filter by the object’s \`updatedAt\` field.""" - updatedAt: DatetimeFilter - - """Checks for all expressions in this list.""" - and: [PostFilter!] - - """Checks for any expressions in this list.""" - or: [PostFilter!] - - """Negates the expression.""" - not: PostFilter -} - -""" -A filter to be used against UUID fields. All fields are combined with a logical ‘and.’ -""" -input UUIDFilter { - """ - Is null (if \`true\` is specified) or is not null (if \`false\` is specified). - """ - isNull: Boolean - - """Equal to the specified value.""" - equalTo: UUID - - """Not equal to the specified value.""" - notEqualTo: UUID - - """ - Not equal to the specified value, treating null like an ordinary value. - """ - distinctFrom: UUID - - """Equal to the specified value, treating null like an ordinary value.""" - notDistinctFrom: UUID - - """Included in the specified list.""" - in: [UUID!] - - """Not included in the specified list.""" - notIn: [UUID!] - - """Less than the specified value.""" - lessThan: UUID - - """Less than or equal to the specified value.""" - lessThanOrEqualTo: UUID - - """Greater than the specified value.""" - greaterThan: UUID - - """Greater than or equal to the specified value.""" - greaterThanOrEqualTo: UUID -} - -""" -A filter to be used against String fields. All fields are combined with a logical ‘and.’ -""" -input StringFilter { - """ - Is null (if \`true\` is specified) or is not null (if \`false\` is specified). - """ - isNull: Boolean - - """Equal to the specified value.""" - equalTo: String - - """Not equal to the specified value.""" - notEqualTo: String - - """ - Not equal to the specified value, treating null like an ordinary value. - """ - distinctFrom: String - - """Equal to the specified value, treating null like an ordinary value.""" - notDistinctFrom: String - - """Included in the specified list.""" - in: [String!] - - """Not included in the specified list.""" - notIn: [String!] - - """Less than the specified value.""" - lessThan: String - - """Less than or equal to the specified value.""" - lessThanOrEqualTo: String - - """Greater than the specified value.""" - greaterThan: String - - """Greater than or equal to the specified value.""" - greaterThanOrEqualTo: String - - """Contains the specified string (case-sensitive).""" - includes: String - - """Does not contain the specified string (case-sensitive).""" - notIncludes: String - - """Contains the specified string (case-insensitive).""" - includesInsensitive: String - - """Does not contain the specified string (case-insensitive).""" - notIncludesInsensitive: String - - """Starts with the specified string (case-sensitive).""" - startsWith: String - - """Does not start with the specified string (case-sensitive).""" - notStartsWith: String - - """Starts with the specified string (case-insensitive).""" - startsWithInsensitive: String - - """Does not start with the specified string (case-insensitive).""" - notStartsWithInsensitive: String - - """Ends with the specified string (case-sensitive).""" - endsWith: String - - """Does not end with the specified string (case-sensitive).""" - notEndsWith: String - - """Ends with the specified string (case-insensitive).""" - endsWithInsensitive: String - - """Does not end with the specified string (case-insensitive).""" - notEndsWithInsensitive: String - - """ - Matches the specified pattern (case-sensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters. - """ - like: String - - """ - Does not match the specified pattern (case-sensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters. - """ - notLike: String - - """ - Matches the specified pattern (case-insensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters. - """ - likeInsensitive: String - - """ - Does not match the specified pattern (case-insensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters. - """ - notLikeInsensitive: String - - """Equal to the specified value (case-insensitive).""" - equalToInsensitive: String - - """Not equal to the specified value (case-insensitive).""" - notEqualToInsensitive: String - - """ - Not equal to the specified value, treating null like an ordinary value (case-insensitive). - """ - distinctFromInsensitive: String - - """ - Equal to the specified value, treating null like an ordinary value (case-insensitive). - """ - notDistinctFromInsensitive: String - - """Included in the specified list (case-insensitive).""" - inInsensitive: [String!] - - """Not included in the specified list (case-insensitive).""" - notInInsensitive: [String!] - - """Less than the specified value (case-insensitive).""" - lessThanInsensitive: String - - """Less than or equal to the specified value (case-insensitive).""" - lessThanOrEqualToInsensitive: String - - """Greater than the specified value (case-insensitive).""" - greaterThanInsensitive: String - - """Greater than or equal to the specified value (case-insensitive).""" - greaterThanOrEqualToInsensitive: String -} - -""" -A filter to be used against Boolean fields. All fields are combined with a logical ‘and.’ -""" -input BooleanFilter { - """ - Is null (if \`true\` is specified) or is not null (if \`false\` is specified). - """ - isNull: Boolean - - """Equal to the specified value.""" - equalTo: Boolean - - """Not equal to the specified value.""" - notEqualTo: Boolean - - """ - Not equal to the specified value, treating null like an ordinary value. - """ - distinctFrom: Boolean - - """Equal to the specified value, treating null like an ordinary value.""" - notDistinctFrom: Boolean - - """Included in the specified list.""" - in: [Boolean!] - - """Not included in the specified list.""" - notIn: [Boolean!] - - """Less than the specified value.""" - lessThan: Boolean - - """Less than or equal to the specified value.""" - lessThanOrEqualTo: Boolean - - """Greater than the specified value.""" - greaterThan: Boolean - - """Greater than or equal to the specified value.""" - greaterThanOrEqualTo: Boolean -} - -""" -A filter to be used against Datetime fields. All fields are combined with a logical ‘and.’ -""" -input DatetimeFilter { - """ - Is null (if \`true\` is specified) or is not null (if \`false\` is specified). - """ - isNull: Boolean - - """Equal to the specified value.""" - equalTo: Datetime - - """Not equal to the specified value.""" - notEqualTo: Datetime - - """ - Not equal to the specified value, treating null like an ordinary value. - """ - distinctFrom: Datetime - - """Equal to the specified value, treating null like an ordinary value.""" - notDistinctFrom: Datetime - - """Included in the specified list.""" - in: [Datetime!] - - """Not included in the specified list.""" - notIn: [Datetime!] - - """Less than the specified value.""" - lessThan: Datetime - - """Less than or equal to the specified value.""" - lessThanOrEqualTo: Datetime - - """Greater than the specified value.""" - greaterThan: Datetime - - """Greater than or equal to the specified value.""" - greaterThanOrEqualTo: Datetime -} - -""" -A filter to be used against Int fields. All fields are combined with a logical ‘and.’ -""" -input IntFilter { - """ - Is null (if \`true\` is specified) or is not null (if \`false\` is specified). - """ - isNull: Boolean - - """Equal to the specified value.""" - equalTo: Int - - """Not equal to the specified value.""" - notEqualTo: Int - - """ - Not equal to the specified value, treating null like an ordinary value. - """ - distinctFrom: Int - - """Equal to the specified value, treating null like an ordinary value.""" - notDistinctFrom: Int - - """Included in the specified list.""" - in: [Int!] - - """Not included in the specified list.""" - notIn: [Int!] - - """Less than the specified value.""" - lessThan: Int - - """Less than or equal to the specified value.""" - lessThanOrEqualTo: Int - - """Greater than the specified value.""" - greaterThan: Int - - """Greater than or equal to the specified value.""" - greaterThanOrEqualTo: Int -} - -"""Methods to use when ordering \`Post\`.""" -enum PostOrderBy { - NATURAL - PRIMARY_KEY_ASC - PRIMARY_KEY_DESC - ID_ASC - ID_DESC - AUTHOR_ID_ASC - AUTHOR_ID_DESC - SLUG_ASC - SLUG_DESC - PUBLISHED_AT_ASC - PUBLISHED_AT_DESC - CREATED_AT_ASC - CREATED_AT_DESC -} - -""" -A condition to be used against \`PostTag\` object types. All fields are tested for equality and combined with a logical ‘and.’ -""" -input PostTagCondition { - """Checks for equality with the object’s \`id\` field.""" - id: UUID - - """Checks for equality with the object’s \`postId\` field.""" - postId: UUID - - """Checks for equality with the object’s \`tagId\` field.""" - tagId: UUID - - """Checks for equality with the object’s \`createdAt\` field.""" - createdAt: Datetime -} - -""" -A filter to be used against \`PostTag\` object types. All fields are combined with a logical ‘and.’ -""" -input PostTagFilter { - """Filter by the object’s \`id\` field.""" - id: UUIDFilter - - """Filter by the object’s \`postId\` field.""" - postId: UUIDFilter - - """Filter by the object’s \`tagId\` field.""" - tagId: UUIDFilter - - """Filter by the object’s \`createdAt\` field.""" - createdAt: DatetimeFilter - - """Checks for all expressions in this list.""" - and: [PostTagFilter!] - - """Checks for any expressions in this list.""" - or: [PostTagFilter!] - - """Negates the expression.""" - not: PostTagFilter -} - -"""Methods to use when ordering \`PostTag\`.""" -enum PostTagOrderBy { - NATURAL - PRIMARY_KEY_ASC - PRIMARY_KEY_DESC - ID_ASC - ID_DESC - POST_ID_ASC - POST_ID_DESC - TAG_ID_ASC - TAG_ID_DESC -} - -"""A \`Tag\` edge in the connection, with data from \`PostTag\`.""" -type PostTagsManyToManyEdge { - """A cursor for use in pagination.""" - cursor: Cursor - - """The \`Tag\` at the end of the edge.""" - node: Tag - id: UUID! - createdAt: Datetime -} - -""" -A condition to be used against \`Tag\` object types. All fields are tested for equality and combined with a logical ‘and.’ -""" -input TagCondition { - """Checks for equality with the object’s \`id\` field.""" - id: UUID - - """Checks for equality with the object’s \`name\` field.""" - name: String - - """Checks for equality with the object’s \`slug\` field.""" - slug: String - - """Checks for equality with the object’s \`description\` field.""" - description: String - - """Checks for equality with the object’s \`color\` field.""" - color: String - - """Checks for equality with the object’s \`createdAt\` field.""" - createdAt: Datetime -} - -""" -A filter to be used against \`Tag\` object types. All fields are combined with a logical ‘and.’ -""" -input TagFilter { - """Filter by the object’s \`id\` field.""" - id: UUIDFilter - - """Filter by the object’s \`name\` field.""" - name: StringFilter - - """Filter by the object’s \`slug\` field.""" - slug: StringFilter - - """Filter by the object’s \`description\` field.""" - description: StringFilter - - """Filter by the object’s \`color\` field.""" - color: StringFilter - - """Filter by the object’s \`createdAt\` field.""" - createdAt: DatetimeFilter - - """Checks for all expressions in this list.""" - and: [TagFilter!] - - """Checks for any expressions in this list.""" - or: [TagFilter!] - - """Negates the expression.""" - not: TagFilter -} - -"""Methods to use when ordering \`Tag\`.""" -enum TagOrderBy { - NATURAL - PRIMARY_KEY_ASC - PRIMARY_KEY_DESC - ID_ASC - ID_DESC - NAME_ASC - NAME_DESC - SLUG_ASC - SLUG_DESC -} - -type User { - id: UUID! - email: String! - username: String! - displayName: String - bio: String - isActive: Boolean - role: String - createdAt: Datetime - updatedAt: Datetime - - """Reads and enables pagination through a set of \`Post\`.""" - authoredPosts( - """Only read the first \`n\` values of the set.""" - first: Int - - """Only read the last \`n\` values of the set.""" - last: Int - - """ - Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor - based pagination. May not be used with \`last\`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: PostCondition - - """ - A filter to be used in determining which values should be returned by the collection. - """ - filter: PostFilter - - """The method to use when ordering \`Post\`.""" - orderBy: [PostOrderBy!] = [PRIMARY_KEY_ASC] - ): PostConnection! - - """Reads and enables pagination through a set of \`Comment\`.""" - authoredComments( - """Only read the first \`n\` values of the set.""" - first: Int - - """Only read the last \`n\` values of the set.""" - last: Int - - """ - Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor - based pagination. May not be used with \`last\`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: CommentCondition - - """ - A filter to be used in determining which values should be returned by the collection. - """ - filter: CommentFilter - - """The method to use when ordering \`Comment\`.""" - orderBy: [CommentOrderBy!] = [PRIMARY_KEY_ASC] - ): CommentConnection! -} - -"""A connection to a list of \`Post\` values.""" -type PostConnection { - """A list of \`Post\` objects.""" - nodes: [Post]! - - """ - A list of edges which contains the \`Post\` and cursor to aid in pagination. - """ - edges: [PostEdge]! - - """Information to aid in pagination.""" - pageInfo: PageInfo! - - """The count of *all* \`Post\` you could get from the connection.""" - totalCount: Int! -} - -"""A \`Post\` edge in the connection.""" -type PostEdge { - """A cursor for use in pagination.""" - cursor: Cursor - - """The \`Post\` at the end of the edge.""" - node: Post -} - -"""A connection to a list of \`Comment\` values.""" -type CommentConnection { - """A list of \`Comment\` objects.""" - nodes: [Comment]! - - """ - A list of edges which contains the \`Comment\` and cursor to aid in pagination. - """ - edges: [CommentEdge]! - - """Information to aid in pagination.""" - pageInfo: PageInfo! - - """The count of *all* \`Comment\` you could get from the connection.""" - totalCount: Int! -} - -type Comment { - id: UUID! - postId: UUID! - authorId: UUID! - parentId: UUID - content: String! - isApproved: Boolean - likesCount: Int - createdAt: Datetime - updatedAt: Datetime - - """Reads a single \`User\` that is related to this \`Comment\`.""" - author: User - - """Reads a single \`Comment\` that is related to this \`Comment\`.""" - parent: Comment - - """Reads a single \`Post\` that is related to this \`Comment\`.""" - post: Post - - """Reads and enables pagination through a set of \`Comment\`.""" - childComments( - """Only read the first \`n\` values of the set.""" - first: Int - - """Only read the last \`n\` values of the set.""" - last: Int - - """ - Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor - based pagination. May not be used with \`last\`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """ - A condition to be used in determining which values should be returned by the collection. - """ - condition: CommentCondition - - """ - A filter to be used in determining which values should be returned by the collection. - """ - filter: CommentFilter - - """The method to use when ordering \`Comment\`.""" - orderBy: [CommentOrderBy!] = [PRIMARY_KEY_ASC] - ): CommentConnection! -} - -""" -A condition to be used against \`Comment\` object types. All fields are tested for equality and combined with a logical ‘and.’ -""" -input CommentCondition { - """Checks for equality with the object’s \`id\` field.""" - id: UUID - - """Checks for equality with the object’s \`postId\` field.""" - postId: UUID - - """Checks for equality with the object’s \`authorId\` field.""" - authorId: UUID - - """Checks for equality with the object’s \`parentId\` field.""" - parentId: UUID - - """Checks for equality with the object’s \`content\` field.""" - content: String - - """Checks for equality with the object’s \`isApproved\` field.""" - isApproved: Boolean - - """Checks for equality with the object’s \`likesCount\` field.""" - likesCount: Int - - """Checks for equality with the object’s \`createdAt\` field.""" - createdAt: Datetime - - """Checks for equality with the object’s \`updatedAt\` field.""" - updatedAt: Datetime -} - -""" -A filter to be used against \`Comment\` object types. All fields are combined with a logical ‘and.’ -""" -input CommentFilter { - """Filter by the object’s \`id\` field.""" - id: UUIDFilter - - """Filter by the object’s \`postId\` field.""" - postId: UUIDFilter - - """Filter by the object’s \`authorId\` field.""" - authorId: UUIDFilter - - """Filter by the object’s \`parentId\` field.""" - parentId: UUIDFilter - - """Filter by the object’s \`content\` field.""" - content: StringFilter - - """Filter by the object’s \`isApproved\` field.""" - isApproved: BooleanFilter - - """Filter by the object’s \`likesCount\` field.""" - likesCount: IntFilter - - """Filter by the object’s \`createdAt\` field.""" - createdAt: DatetimeFilter - - """Filter by the object’s \`updatedAt\` field.""" - updatedAt: DatetimeFilter - - """Checks for all expressions in this list.""" - and: [CommentFilter!] - - """Checks for any expressions in this list.""" - or: [CommentFilter!] - - """Negates the expression.""" - not: CommentFilter -} - -"""Methods to use when ordering \`Comment\`.""" -enum CommentOrderBy { - NATURAL - PRIMARY_KEY_ASC - PRIMARY_KEY_DESC - ID_ASC - ID_DESC - POST_ID_ASC - POST_ID_DESC - AUTHOR_ID_ASC - AUTHOR_ID_DESC - PARENT_ID_ASC - PARENT_ID_DESC - CREATED_AT_ASC - CREATED_AT_DESC -} - -"""A \`Comment\` edge in the connection.""" -type CommentEdge { - """A cursor for use in pagination.""" - cursor: Cursor - - """The \`Comment\` at the end of the edge.""" - node: Comment -} - -"""A \`PostTag\` edge in the connection.""" -type PostTagEdge { - """A cursor for use in pagination.""" - cursor: Cursor - - """The \`PostTag\` at the end of the edge.""" - node: PostTag -} - -"""A connection to a list of \`Tag\` values.""" -type TagConnection { - """A list of \`Tag\` objects.""" - nodes: [Tag]! - - """ - A list of edges which contains the \`Tag\` and cursor to aid in pagination. - """ - edges: [TagEdge]! - - """Information to aid in pagination.""" - pageInfo: PageInfo! - - """The count of *all* \`Tag\` you could get from the connection.""" - totalCount: Int! -} - -"""A \`Tag\` edge in the connection.""" -type TagEdge { - """A cursor for use in pagination.""" - cursor: Cursor - - """The \`Tag\` at the end of the edge.""" - node: Tag -} - -"""A connection to a list of \`User\` values.""" -type UserConnection { - """A list of \`User\` objects.""" - nodes: [User]! - - """ - A list of edges which contains the \`User\` and cursor to aid in pagination. - """ - edges: [UserEdge]! - - """Information to aid in pagination.""" - pageInfo: PageInfo! - - """The count of *all* \`User\` you could get from the connection.""" - totalCount: Int! -} - -"""A \`User\` edge in the connection.""" -type UserEdge { - """A cursor for use in pagination.""" - cursor: Cursor - - """The \`User\` at the end of the edge.""" - node: User -} - -""" -A condition to be used against \`User\` object types. All fields are tested for equality and combined with a logical ‘and.’ -""" -input UserCondition { - """Checks for equality with the object’s \`id\` field.""" - id: UUID - - """Checks for equality with the object’s \`email\` field.""" - email: String - - """Checks for equality with the object’s \`username\` field.""" - username: String - - """Checks for equality with the object’s \`displayName\` field.""" - displayName: String - - """Checks for equality with the object’s \`bio\` field.""" - bio: String - - """Checks for equality with the object’s \`isActive\` field.""" - isActive: Boolean - - """Checks for equality with the object’s \`role\` field.""" - role: String - - """Checks for equality with the object’s \`createdAt\` field.""" - createdAt: Datetime - - """Checks for equality with the object’s \`updatedAt\` field.""" - updatedAt: Datetime -} - -""" -A filter to be used against \`User\` object types. All fields are combined with a logical ‘and.’ -""" -input UserFilter { - """Filter by the object’s \`id\` field.""" - id: UUIDFilter - - """Filter by the object’s \`email\` field.""" - email: StringFilter - - """Filter by the object’s \`username\` field.""" - username: StringFilter - - """Filter by the object’s \`displayName\` field.""" - displayName: StringFilter - - """Filter by the object’s \`bio\` field.""" - bio: StringFilter - - """Filter by the object’s \`isActive\` field.""" - isActive: BooleanFilter - - """Filter by the object’s \`role\` field.""" - role: StringFilter - - """Filter by the object’s \`createdAt\` field.""" - createdAt: DatetimeFilter - - """Filter by the object’s \`updatedAt\` field.""" - updatedAt: DatetimeFilter - - """Checks for all expressions in this list.""" - and: [UserFilter!] - - """Checks for any expressions in this list.""" - or: [UserFilter!] - - """Negates the expression.""" - not: UserFilter -} - -"""Methods to use when ordering \`User\`.""" -enum UserOrderBy { - NATURAL - PRIMARY_KEY_ASC - PRIMARY_KEY_DESC - ID_ASC - ID_DESC - EMAIL_ASC - EMAIL_DESC - USERNAME_ASC - USERNAME_DESC - CREATED_AT_ASC - CREATED_AT_DESC -} - -"""Root meta schema type""" -type MetaSchema { - tables: [MetaTable!]! -} - -"""Information about a database table""" -type MetaTable { - name: String! - schemaName: String! - fields: [MetaField!]! - indexes: [MetaIndex!]! - constraints: MetaConstraints! - foreignKeyConstraints: [MetaForeignKeyConstraint!]! - primaryKeyConstraints: [MetaPrimaryKeyConstraint!]! - uniqueConstraints: [MetaUniqueConstraint!]! - relations: MetaRelations! - inflection: MetaInflection! - query: MetaQuery! -} - -"""Information about a table field/column""" -type MetaField { - name: String! - type: MetaType! - isNotNull: Boolean! - hasDefault: Boolean! -} - -"""Information about a PostgreSQL type""" -type MetaType { - pgType: String! - gqlType: String! - isArray: Boolean! - isNotNull: Boolean - hasDefault: Boolean -} - -"""Information about a database index""" -type MetaIndex { - name: String! - isUnique: Boolean! - isPrimary: Boolean! - columns: [String!]! - fields: [MetaField!] -} - -"""Table constraints""" -type MetaConstraints { - primaryKey: MetaPrimaryKeyConstraint - unique: [MetaUniqueConstraint!]! - foreignKey: [MetaForeignKeyConstraint!]! -} - -"""Information about a primary key constraint""" -type MetaPrimaryKeyConstraint { - name: String! - fields: [MetaField!]! -} - -"""Information about a unique constraint""" -type MetaUniqueConstraint { - name: String! - fields: [MetaField!]! -} - -"""Information about a foreign key constraint""" -type MetaForeignKeyConstraint { - name: String! - fields: [MetaField!]! - referencedTable: String! - referencedFields: [String!]! - refFields: [MetaField!] - refTable: MetaRefTable -} - -"""Reference to a related table""" -type MetaRefTable { - name: String! -} - -"""Table relations""" -type MetaRelations { - belongsTo: [MetaBelongsToRelation!]! - has: [MetaHasRelation!]! - hasOne: [MetaHasRelation!]! - hasMany: [MetaHasRelation!]! - manyToMany: [MetaManyToManyRelation!]! -} - -"""A belongs-to (forward FK) relation""" -type MetaBelongsToRelation { - fieldName: String - isUnique: Boolean! - type: String - keys: [MetaField!]! - references: MetaRefTable! -} - -"""A has-one or has-many (reverse FK) relation""" -type MetaHasRelation { - fieldName: String - isUnique: Boolean! - type: String - keys: [MetaField!]! - referencedBy: MetaRefTable! -} - -"""A many-to-many relation via junction table""" -type MetaManyToManyRelation { - fieldName: String - type: String - junctionTable: MetaRefTable! - junctionLeftConstraint: MetaForeignKeyConstraint! - junctionLeftKeyAttributes: [MetaField!]! - junctionRightConstraint: MetaForeignKeyConstraint! - junctionRightKeyAttributes: [MetaField!]! - leftKeyAttributes: [MetaField!]! - rightKeyAttributes: [MetaField!]! - rightTable: MetaRefTable! -} - -"""Table inflection names""" -type MetaInflection { - tableType: String! - allRows: String! - connection: String! - edge: String! - filterType: String - orderByType: String! - conditionType: String! - patchType: String - createInputType: String! - createPayloadType: String! - updatePayloadType: String - deletePayloadType: String! -} - -"""Table query/mutation names""" -type MetaQuery { - all: String! - one: String - create: String - update: String - delete: String -} - -""" -The root mutation type which contains root level fields which mutate data. -""" -type Mutation { - """Creates a single \`PostTag\`.""" - createPostTag( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: CreatePostTagInput! - ): CreatePostTagPayload - - """Creates a single \`Tag\`.""" - createTag( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: CreateTagInput! - ): CreateTagPayload - - """Creates a single \`User\`.""" - createUser( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: CreateUserInput! - ): CreateUserPayload - - """Creates a single \`Comment\`.""" - createComment( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: CreateCommentInput! - ): CreateCommentPayload - - """Creates a single \`Post\`.""" - createPost( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: CreatePostInput! - ): CreatePostPayload - - """Updates a single \`PostTag\` using a unique key and a patch.""" - updatePostTag( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: UpdatePostTagInput! - ): UpdatePostTagPayload - - """Updates a single \`Tag\` using a unique key and a patch.""" - updateTag( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: UpdateTagInput! - ): UpdateTagPayload - - """Updates a single \`User\` using a unique key and a patch.""" - updateUser( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: UpdateUserInput! - ): UpdateUserPayload - - """Updates a single \`Comment\` using a unique key and a patch.""" - updateComment( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: UpdateCommentInput! - ): UpdateCommentPayload - - """Updates a single \`Post\` using a unique key and a patch.""" - updatePost( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: UpdatePostInput! - ): UpdatePostPayload - - """Deletes a single \`PostTag\` using a unique key.""" - deletePostTag( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: DeletePostTagInput! - ): DeletePostTagPayload - - """Deletes a single \`Tag\` using a unique key.""" - deleteTag( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: DeleteTagInput! - ): DeleteTagPayload - - """Deletes a single \`User\` using a unique key.""" - deleteUser( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: DeleteUserInput! - ): DeleteUserPayload - - """Deletes a single \`Comment\` using a unique key.""" - deleteComment( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: DeleteCommentInput! - ): DeleteCommentPayload - - """Deletes a single \`Post\` using a unique key.""" - deletePost( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: DeletePostInput! - ): DeletePostPayload -} - -"""The output of our create \`PostTag\` mutation.""" -type CreatePostTagPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`PostTag\` that was created by this mutation.""" - postTag: PostTag - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`PostTag\`. May be used by Relay 1.""" - postTagEdge( - """The method to use when ordering \`PostTag\`.""" - orderBy: [PostTagOrderBy!]! = [PRIMARY_KEY_ASC] - ): PostTagEdge -} - -"""All input for the create \`PostTag\` mutation.""" -input CreatePostTagInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - - """The \`PostTag\` to be created by this mutation.""" - postTag: PostTagInput! -} - -"""An input for mutations affecting \`PostTag\`""" -input PostTagInput { - id: UUID - postId: UUID! - tagId: UUID! - createdAt: Datetime -} - -"""The output of our create \`Tag\` mutation.""" -type CreateTagPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`Tag\` that was created by this mutation.""" - tag: Tag - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`Tag\`. May be used by Relay 1.""" - tagEdge( - """The method to use when ordering \`Tag\`.""" - orderBy: [TagOrderBy!]! = [PRIMARY_KEY_ASC] - ): TagEdge -} - -"""All input for the create \`Tag\` mutation.""" -input CreateTagInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - - """The \`Tag\` to be created by this mutation.""" - tag: TagInput! -} - -"""An input for mutations affecting \`Tag\`""" -input TagInput { - id: UUID - name: String! - slug: String! - description: String - color: String - createdAt: Datetime -} - -"""The output of our create \`User\` mutation.""" -type CreateUserPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`User\` that was created by this mutation.""" - user: User - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`User\`. May be used by Relay 1.""" - userEdge( - """The method to use when ordering \`User\`.""" - orderBy: [UserOrderBy!]! = [PRIMARY_KEY_ASC] - ): UserEdge -} - -"""All input for the create \`User\` mutation.""" -input CreateUserInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - - """The \`User\` to be created by this mutation.""" - user: UserInput! -} - -"""An input for mutations affecting \`User\`""" -input UserInput { - id: UUID - email: String! - username: String! - displayName: String - bio: String - isActive: Boolean - role: String - createdAt: Datetime - updatedAt: Datetime -} - -"""The output of our create \`Comment\` mutation.""" -type CreateCommentPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`Comment\` that was created by this mutation.""" - comment: Comment - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`Comment\`. May be used by Relay 1.""" - commentEdge( - """The method to use when ordering \`Comment\`.""" - orderBy: [CommentOrderBy!]! = [PRIMARY_KEY_ASC] - ): CommentEdge -} - -"""All input for the create \`Comment\` mutation.""" -input CreateCommentInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - - """The \`Comment\` to be created by this mutation.""" - comment: CommentInput! -} - -"""An input for mutations affecting \`Comment\`""" -input CommentInput { - id: UUID - postId: UUID! - authorId: UUID! - parentId: UUID - content: String! - isApproved: Boolean - likesCount: Int - createdAt: Datetime - updatedAt: Datetime -} - -"""The output of our create \`Post\` mutation.""" -type CreatePostPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`Post\` that was created by this mutation.""" - post: Post - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`Post\`. May be used by Relay 1.""" - postEdge( - """The method to use when ordering \`Post\`.""" - orderBy: [PostOrderBy!]! = [PRIMARY_KEY_ASC] - ): PostEdge -} - -"""All input for the create \`Post\` mutation.""" -input CreatePostInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - - """The \`Post\` to be created by this mutation.""" - post: PostInput! -} - -"""An input for mutations affecting \`Post\`""" -input PostInput { - id: UUID - authorId: UUID! - title: String! - slug: String! - content: String - excerpt: String - isPublished: Boolean - publishedAt: Datetime - viewCount: Int - createdAt: Datetime - updatedAt: Datetime -} - -"""The output of our update \`PostTag\` mutation.""" -type UpdatePostTagPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`PostTag\` that was updated by this mutation.""" - postTag: PostTag - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`PostTag\`. May be used by Relay 1.""" - postTagEdge( - """The method to use when ordering \`PostTag\`.""" - orderBy: [PostTagOrderBy!]! = [PRIMARY_KEY_ASC] - ): PostTagEdge -} - -"""All input for the \`updatePostTag\` mutation.""" -input UpdatePostTagInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - id: UUID! - - """ - An object where the defined keys will be set on the \`PostTag\` being updated. - """ - postTagPatch: PostTagPatch! -} - -""" -Represents an update to a \`PostTag\`. Fields that are set will be updated. -""" -input PostTagPatch { - id: UUID - postId: UUID - tagId: UUID - createdAt: Datetime -} - -"""The output of our update \`Tag\` mutation.""" -type UpdateTagPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`Tag\` that was updated by this mutation.""" - tag: Tag - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`Tag\`. May be used by Relay 1.""" - tagEdge( - """The method to use when ordering \`Tag\`.""" - orderBy: [TagOrderBy!]! = [PRIMARY_KEY_ASC] - ): TagEdge -} - -"""All input for the \`updateTag\` mutation.""" -input UpdateTagInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - id: UUID! - - """ - An object where the defined keys will be set on the \`Tag\` being updated. - """ - tagPatch: TagPatch! -} - -"""Represents an update to a \`Tag\`. Fields that are set will be updated.""" -input TagPatch { - id: UUID - name: String - slug: String - description: String - color: String - createdAt: Datetime -} - -"""The output of our update \`User\` mutation.""" -type UpdateUserPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`User\` that was updated by this mutation.""" - user: User - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`User\`. May be used by Relay 1.""" - userEdge( - """The method to use when ordering \`User\`.""" - orderBy: [UserOrderBy!]! = [PRIMARY_KEY_ASC] - ): UserEdge -} - -"""All input for the \`updateUser\` mutation.""" -input UpdateUserInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - id: UUID! - - """ - An object where the defined keys will be set on the \`User\` being updated. - """ - userPatch: UserPatch! -} - -"""Represents an update to a \`User\`. Fields that are set will be updated.""" -input UserPatch { - id: UUID - email: String - username: String - displayName: String - bio: String - isActive: Boolean - role: String - createdAt: Datetime - updatedAt: Datetime -} - -"""The output of our update \`Comment\` mutation.""" -type UpdateCommentPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`Comment\` that was updated by this mutation.""" - comment: Comment - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`Comment\`. May be used by Relay 1.""" - commentEdge( - """The method to use when ordering \`Comment\`.""" - orderBy: [CommentOrderBy!]! = [PRIMARY_KEY_ASC] - ): CommentEdge -} - -"""All input for the \`updateComment\` mutation.""" -input UpdateCommentInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - id: UUID! - - """ - An object where the defined keys will be set on the \`Comment\` being updated. - """ - commentPatch: CommentPatch! -} - -""" -Represents an update to a \`Comment\`. Fields that are set will be updated. -""" -input CommentPatch { - id: UUID - postId: UUID - authorId: UUID - parentId: UUID - content: String - isApproved: Boolean - likesCount: Int - createdAt: Datetime - updatedAt: Datetime -} - -"""The output of our update \`Post\` mutation.""" -type UpdatePostPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`Post\` that was updated by this mutation.""" - post: Post - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`Post\`. May be used by Relay 1.""" - postEdge( - """The method to use when ordering \`Post\`.""" - orderBy: [PostOrderBy!]! = [PRIMARY_KEY_ASC] - ): PostEdge -} - -"""All input for the \`updatePost\` mutation.""" -input UpdatePostInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - id: UUID! - - """ - An object where the defined keys will be set on the \`Post\` being updated. - """ - postPatch: PostPatch! -} - -"""Represents an update to a \`Post\`. Fields that are set will be updated.""" -input PostPatch { - id: UUID - authorId: UUID - title: String - slug: String - content: String - excerpt: String - isPublished: Boolean - publishedAt: Datetime - viewCount: Int - createdAt: Datetime - updatedAt: Datetime -} - -"""The output of our delete \`PostTag\` mutation.""" -type DeletePostTagPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`PostTag\` that was deleted by this mutation.""" - postTag: PostTag - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`PostTag\`. May be used by Relay 1.""" - postTagEdge( - """The method to use when ordering \`PostTag\`.""" - orderBy: [PostTagOrderBy!]! = [PRIMARY_KEY_ASC] - ): PostTagEdge -} - -"""All input for the \`deletePostTag\` mutation.""" -input DeletePostTagInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - id: UUID! -} - -"""The output of our delete \`Tag\` mutation.""" -type DeleteTagPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`Tag\` that was deleted by this mutation.""" - tag: Tag - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`Tag\`. May be used by Relay 1.""" - tagEdge( - """The method to use when ordering \`Tag\`.""" - orderBy: [TagOrderBy!]! = [PRIMARY_KEY_ASC] - ): TagEdge -} - -"""All input for the \`deleteTag\` mutation.""" -input DeleteTagInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - id: UUID! -} - -"""The output of our delete \`User\` mutation.""" -type DeleteUserPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`User\` that was deleted by this mutation.""" - user: User - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`User\`. May be used by Relay 1.""" - userEdge( - """The method to use when ordering \`User\`.""" - orderBy: [UserOrderBy!]! = [PRIMARY_KEY_ASC] - ): UserEdge -} - -"""All input for the \`deleteUser\` mutation.""" -input DeleteUserInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - id: UUID! -} - -"""The output of our delete \`Comment\` mutation.""" -type DeleteCommentPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`Comment\` that was deleted by this mutation.""" - comment: Comment - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`Comment\`. May be used by Relay 1.""" - commentEdge( - """The method to use when ordering \`Comment\`.""" - orderBy: [CommentOrderBy!]! = [PRIMARY_KEY_ASC] - ): CommentEdge -} - -"""All input for the \`deleteComment\` mutation.""" -input DeleteCommentInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - id: UUID! -} - -"""The output of our delete \`Post\` mutation.""" -type DeletePostPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`Post\` that was deleted by this mutation.""" - post: Post - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`Post\`. May be used by Relay 1.""" - postEdge( - """The method to use when ordering \`Post\`.""" - orderBy: [PostOrderBy!]! = [PRIMARY_KEY_ASC] - ): PostEdge -} - -"""All input for the \`deletePost\` mutation.""" -input DeletePostInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - id: UUID! -}" -`; diff --git a/graphql/server-test/__tests__/server-test.test.ts b/graphql/server-test/__tests__/server-test.test.ts index c3f3b37f2..a6eecb524 100644 --- a/graphql/server-test/__tests__/server-test.test.ts +++ b/graphql/server-test/__tests__/server-test.test.ts @@ -70,7 +70,7 @@ describe('graphql-server-test', () => { { username: string } >( `query GetUser($username: String!) { - users(condition: { username: $username }) { + users(filter: { username: { equalTo: $username } }) { nodes { username email diff --git a/graphql/test/__tests__/__snapshots__/graphile-test.test.ts.snap b/graphql/test/__tests__/__snapshots__/graphile-test.test.ts.snap index 90df2a983..12c5cfd47 100644 --- a/graphql/test/__tests__/__snapshots__/graphile-test.test.ts.snap +++ b/graphql/test/__tests__/__snapshots__/graphile-test.test.ts.snap @@ -1,4290 +1 @@ // Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing - -exports[`introspection query snapshot: introspection 1`] = ` -{ - "data": { - "__schema": { - "directives": [ - { - "args": [ - { - "defaultValue": null, - "description": "Included when true.", - "name": "if", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null, - }, - }, - }, - ], - "description": "Directs the executor to include this field or fragment only when the \`if\` argument is true.", - "locations": [ - "FIELD", - "FRAGMENT_SPREAD", - "INLINE_FRAGMENT", - ], - "name": "include", - }, - { - "args": [ - { - "defaultValue": null, - "description": "Skipped when true.", - "name": "if", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null, - }, - }, - }, - ], - "description": "Directs the executor to skip this field or fragment when the \`if\` argument is true.", - "locations": [ - "FIELD", - "FRAGMENT_SPREAD", - "INLINE_FRAGMENT", - ], - "name": "skip", - }, - { - "args": [ - { - "defaultValue": ""No longer supported"", - "description": "Explains why this element was deprecated, usually also including a suggestion for how to access supported similar data. Formatted using the Markdown syntax, as specified by [CommonMark](https://commonmark.org/).", - "name": "reason", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - ], - "description": "Marks an element of a GraphQL schema as no longer supported.", - "locations": [ - "FIELD_DEFINITION", - "ARGUMENT_DEFINITION", - "INPUT_FIELD_DEFINITION", - "ENUM_VALUE", - ], - "name": "deprecated", - }, - { - "args": [ - { - "defaultValue": null, - "description": "The URL that specifies the behavior of this scalar.", - "name": "url", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - ], - "description": "Exposes a URL that specifies the behavior of this scalar.", - "locations": [ - "SCALAR", - ], - "name": "specifiedBy", - }, - { - "args": [], - "description": "Indicates exactly one field must be supplied and this field must not be \`null\`.", - "locations": [ - "INPUT_OBJECT", - ], - "name": "oneOf", - }, - ], - "mutationType": { - "name": "Mutation", - }, - "queryType": { - "name": "Query", - }, - "subscriptionType": null, - "types": [ - { - "description": "The root query type which gives access points into the data universe.", - "enumValues": null, - "fields": [ - { - "args": [ - { - "defaultValue": null, - "description": "Only read the first \`n\` values of the set.", - "name": "first", - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Only read the last \`n\` values of the set.", - "name": "last", - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor -based pagination. May not be used with \`last\`.", - "name": "offset", - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Read all values in the set before (above) this cursor.", - "name": "before", - "type": { - "kind": "SCALAR", - "name": "Cursor", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Read all values in the set after (below) this cursor.", - "name": "after", - "type": { - "kind": "SCALAR", - "name": "Cursor", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "A condition to be used in determining which values should be returned by the collection.", - "name": "condition", - "type": { - "kind": "INPUT_OBJECT", - "name": "UserCondition", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "A filter to be used in determining which values should be returned by the collection.", - "name": "filter", - "type": { - "kind": "INPUT_OBJECT", - "name": "UserFilter", - "ofType": null, - }, - }, - { - "defaultValue": "[PRIMARY_KEY_ASC]", - "description": "The method to use when ordering \`User\`.", - "name": "orderBy", - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "ENUM", - "name": "UserOrderBy", - "ofType": null, - }, - }, - }, - }, - ], - "deprecationReason": null, - "description": "Reads and enables pagination through a set of \`User\`.", - "isDeprecated": false, - "name": "users", - "type": { - "kind": "OBJECT", - "name": "UserConnection", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": "Metadata about the database schema, including tables, fields, indexes, and constraints. Useful for code generation tools.", - "isDeprecated": false, - "name": "_meta", - "type": { - "kind": "OBJECT", - "name": "MetaSchema", - "ofType": null, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "Query", - "possibleTypes": null, - }, - { - "description": "A connection to a list of \`User\` values.", - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": "A list of \`User\` objects.", - "isDeprecated": false, - "name": "nodes", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "User", - "ofType": null, - }, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": "A list of edges which contains the \`User\` and cursor to aid in pagination.", - "isDeprecated": false, - "name": "edges", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "UserEdge", - "ofType": null, - }, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": "Information to aid in pagination.", - "isDeprecated": false, - "name": "pageInfo", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "PageInfo", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": "The count of *all* \`User\` you could get from the connection.", - "isDeprecated": false, - "name": "totalCount", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Int", - "ofType": null, - }, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "UserConnection", - "possibleTypes": null, - }, - { - "description": null, - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "id", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Int", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "username", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "User", - "possibleTypes": null, - }, - { - "description": "The \`Int\` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.", - "enumValues": null, - "fields": null, - "inputFields": null, - "interfaces": null, - "kind": "SCALAR", - "name": "Int", - "possibleTypes": null, - }, - { - "description": "The \`String\` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.", - "enumValues": null, - "fields": null, - "inputFields": null, - "interfaces": null, - "kind": "SCALAR", - "name": "String", - "possibleTypes": null, - }, - { - "description": "A \`User\` edge in the connection.", - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": "A cursor for use in pagination.", - "isDeprecated": false, - "name": "cursor", - "type": { - "kind": "SCALAR", - "name": "Cursor", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": "The \`User\` at the end of the edge.", - "isDeprecated": false, - "name": "node", - "type": { - "kind": "OBJECT", - "name": "User", - "ofType": null, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "UserEdge", - "possibleTypes": null, - }, - { - "description": "A location in a connection that can be used for resuming pagination.", - "enumValues": null, - "fields": null, - "inputFields": null, - "interfaces": null, - "kind": "SCALAR", - "name": "Cursor", - "possibleTypes": null, - }, - { - "description": "Information about pagination in a connection.", - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": "When paginating forwards, are there more items?", - "isDeprecated": false, - "name": "hasNextPage", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": "When paginating backwards, are there more items?", - "isDeprecated": false, - "name": "hasPreviousPage", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": "When paginating backwards, the cursor to continue.", - "isDeprecated": false, - "name": "startCursor", - "type": { - "kind": "SCALAR", - "name": "Cursor", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": "When paginating forwards, the cursor to continue.", - "isDeprecated": false, - "name": "endCursor", - "type": { - "kind": "SCALAR", - "name": "Cursor", - "ofType": null, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "PageInfo", - "possibleTypes": null, - }, - { - "description": "The \`Boolean\` scalar type represents \`true\` or \`false\`.", - "enumValues": null, - "fields": null, - "inputFields": null, - "interfaces": null, - "kind": "SCALAR", - "name": "Boolean", - "possibleTypes": null, - }, - { - "description": "A condition to be used against \`User\` object types. All fields are tested for equality and combined with a logical ‘and.’", - "enumValues": null, - "fields": null, - "inputFields": [ - { - "defaultValue": null, - "description": "Checks for equality with the object’s \`id\` field.", - "name": "id", - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Checks for equality with the object’s \`username\` field.", - "name": "username", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - ], - "interfaces": null, - "kind": "INPUT_OBJECT", - "name": "UserCondition", - "possibleTypes": null, - }, - { - "description": "A filter to be used against \`User\` object types. All fields are combined with a logical ‘and.’", - "enumValues": null, - "fields": null, - "inputFields": [ - { - "defaultValue": null, - "description": "Filter by the object’s \`id\` field.", - "name": "id", - "type": { - "kind": "INPUT_OBJECT", - "name": "IntFilter", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Filter by the object’s \`username\` field.", - "name": "username", - "type": { - "kind": "INPUT_OBJECT", - "name": "StringFilter", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Checks for all expressions in this list.", - "name": "and", - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "INPUT_OBJECT", - "name": "UserFilter", - "ofType": null, - }, - }, - }, - }, - { - "defaultValue": null, - "description": "Checks for any expressions in this list.", - "name": "or", - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "INPUT_OBJECT", - "name": "UserFilter", - "ofType": null, - }, - }, - }, - }, - { - "defaultValue": null, - "description": "Negates the expression.", - "name": "not", - "type": { - "kind": "INPUT_OBJECT", - "name": "UserFilter", - "ofType": null, - }, - }, - ], - "interfaces": null, - "kind": "INPUT_OBJECT", - "name": "UserFilter", - "possibleTypes": null, - }, - { - "description": "A filter to be used against Int fields. All fields are combined with a logical ‘and.’", - "enumValues": null, - "fields": null, - "inputFields": [ - { - "defaultValue": null, - "description": "Is null (if \`true\` is specified) or is not null (if \`false\` is specified).", - "name": "isNull", - "type": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Equal to the specified value.", - "name": "equalTo", - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Not equal to the specified value.", - "name": "notEqualTo", - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Not equal to the specified value, treating null like an ordinary value.", - "name": "distinctFrom", - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Equal to the specified value, treating null like an ordinary value.", - "name": "notDistinctFrom", - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Included in the specified list.", - "name": "in", - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Int", - "ofType": null, - }, - }, - }, - }, - { - "defaultValue": null, - "description": "Not included in the specified list.", - "name": "notIn", - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Int", - "ofType": null, - }, - }, - }, - }, - { - "defaultValue": null, - "description": "Less than the specified value.", - "name": "lessThan", - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Less than or equal to the specified value.", - "name": "lessThanOrEqualTo", - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Greater than the specified value.", - "name": "greaterThan", - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Greater than or equal to the specified value.", - "name": "greaterThanOrEqualTo", - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null, - }, - }, - ], - "interfaces": null, - "kind": "INPUT_OBJECT", - "name": "IntFilter", - "possibleTypes": null, - }, - { - "description": "A filter to be used against String fields. All fields are combined with a logical ‘and.’", - "enumValues": null, - "fields": null, - "inputFields": [ - { - "defaultValue": null, - "description": "Is null (if \`true\` is specified) or is not null (if \`false\` is specified).", - "name": "isNull", - "type": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Equal to the specified value.", - "name": "equalTo", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Not equal to the specified value.", - "name": "notEqualTo", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Not equal to the specified value, treating null like an ordinary value.", - "name": "distinctFrom", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Equal to the specified value, treating null like an ordinary value.", - "name": "notDistinctFrom", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Included in the specified list.", - "name": "in", - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - }, - { - "defaultValue": null, - "description": "Not included in the specified list.", - "name": "notIn", - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - }, - { - "defaultValue": null, - "description": "Less than the specified value.", - "name": "lessThan", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Less than or equal to the specified value.", - "name": "lessThanOrEqualTo", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Greater than the specified value.", - "name": "greaterThan", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Greater than or equal to the specified value.", - "name": "greaterThanOrEqualTo", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Contains the specified string (case-sensitive).", - "name": "includes", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Does not contain the specified string (case-sensitive).", - "name": "notIncludes", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Contains the specified string (case-insensitive).", - "name": "includesInsensitive", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Does not contain the specified string (case-insensitive).", - "name": "notIncludesInsensitive", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Starts with the specified string (case-sensitive).", - "name": "startsWith", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Does not start with the specified string (case-sensitive).", - "name": "notStartsWith", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Starts with the specified string (case-insensitive).", - "name": "startsWithInsensitive", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Does not start with the specified string (case-insensitive).", - "name": "notStartsWithInsensitive", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Ends with the specified string (case-sensitive).", - "name": "endsWith", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Does not end with the specified string (case-sensitive).", - "name": "notEndsWith", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Ends with the specified string (case-insensitive).", - "name": "endsWithInsensitive", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Does not end with the specified string (case-insensitive).", - "name": "notEndsWithInsensitive", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Matches the specified pattern (case-sensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters.", - "name": "like", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Does not match the specified pattern (case-sensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters.", - "name": "notLike", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Matches the specified pattern (case-insensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters.", - "name": "likeInsensitive", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Does not match the specified pattern (case-insensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters.", - "name": "notLikeInsensitive", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Equal to the specified value (case-insensitive).", - "name": "equalToInsensitive", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Not equal to the specified value (case-insensitive).", - "name": "notEqualToInsensitive", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Not equal to the specified value, treating null like an ordinary value (case-insensitive).", - "name": "distinctFromInsensitive", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Equal to the specified value, treating null like an ordinary value (case-insensitive).", - "name": "notDistinctFromInsensitive", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Included in the specified list (case-insensitive).", - "name": "inInsensitive", - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - }, - { - "defaultValue": null, - "description": "Not included in the specified list (case-insensitive).", - "name": "notInInsensitive", - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - }, - { - "defaultValue": null, - "description": "Less than the specified value (case-insensitive).", - "name": "lessThanInsensitive", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Less than or equal to the specified value (case-insensitive).", - "name": "lessThanOrEqualToInsensitive", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Greater than the specified value (case-insensitive).", - "name": "greaterThanInsensitive", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "Greater than or equal to the specified value (case-insensitive).", - "name": "greaterThanOrEqualToInsensitive", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - ], - "interfaces": null, - "kind": "INPUT_OBJECT", - "name": "StringFilter", - "possibleTypes": null, - }, - { - "description": "Methods to use when ordering \`User\`.", - "enumValues": [ - { - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "NATURAL", - }, - { - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "PRIMARY_KEY_ASC", - }, - { - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "PRIMARY_KEY_DESC", - }, - { - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "ID_ASC", - }, - { - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "ID_DESC", - }, - { - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "USERNAME_ASC", - }, - { - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "USERNAME_DESC", - }, - ], - "fields": null, - "inputFields": null, - "interfaces": null, - "kind": "ENUM", - "name": "UserOrderBy", - "possibleTypes": null, - }, - { - "description": "Root meta schema type", - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "tables", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaTable", - "ofType": null, - }, - }, - }, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "MetaSchema", - "possibleTypes": null, - }, - { - "description": "Information about a database table", - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "name", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "schemaName", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "fields", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaField", - "ofType": null, - }, - }, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "indexes", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaIndex", - "ofType": null, - }, - }, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "constraints", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaConstraints", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "foreignKeyConstraints", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaForeignKeyConstraint", - "ofType": null, - }, - }, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "primaryKeyConstraints", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaPrimaryKeyConstraint", - "ofType": null, - }, - }, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "uniqueConstraints", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaUniqueConstraint", - "ofType": null, - }, - }, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "relations", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaRelations", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "inflection", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaInflection", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "query", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaQuery", - "ofType": null, - }, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "MetaTable", - "possibleTypes": null, - }, - { - "description": "Information about a table field/column", - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "name", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "type", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaType", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "isNotNull", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "hasDefault", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null, - }, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "MetaField", - "possibleTypes": null, - }, - { - "description": "Information about a PostgreSQL type", - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "pgType", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "gqlType", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "isArray", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "isNotNull", - "type": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "hasDefault", - "type": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "MetaType", - "possibleTypes": null, - }, - { - "description": "Information about a database index", - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "name", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "isUnique", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "isPrimary", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "columns", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "fields", - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaField", - "ofType": null, - }, - }, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "MetaIndex", - "possibleTypes": null, - }, - { - "description": "Table constraints", - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "primaryKey", - "type": { - "kind": "OBJECT", - "name": "MetaPrimaryKeyConstraint", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "unique", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaUniqueConstraint", - "ofType": null, - }, - }, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "foreignKey", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaForeignKeyConstraint", - "ofType": null, - }, - }, - }, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "MetaConstraints", - "possibleTypes": null, - }, - { - "description": "Information about a primary key constraint", - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "name", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "fields", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaField", - "ofType": null, - }, - }, - }, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "MetaPrimaryKeyConstraint", - "possibleTypes": null, - }, - { - "description": "Information about a unique constraint", - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "name", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "fields", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaField", - "ofType": null, - }, - }, - }, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "MetaUniqueConstraint", - "possibleTypes": null, - }, - { - "description": "Information about a foreign key constraint", - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "name", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "fields", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaField", - "ofType": null, - }, - }, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "referencedTable", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "referencedFields", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "refFields", - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaField", - "ofType": null, - }, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "refTable", - "type": { - "kind": "OBJECT", - "name": "MetaRefTable", - "ofType": null, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "MetaForeignKeyConstraint", - "possibleTypes": null, - }, - { - "description": "Reference to a related table", - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "name", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "MetaRefTable", - "possibleTypes": null, - }, - { - "description": "Table relations", - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "belongsTo", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaBelongsToRelation", - "ofType": null, - }, - }, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "has", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaHasRelation", - "ofType": null, - }, - }, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "hasOne", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaHasRelation", - "ofType": null, - }, - }, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "hasMany", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaHasRelation", - "ofType": null, - }, - }, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "manyToMany", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaManyToManyRelation", - "ofType": null, - }, - }, - }, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "MetaRelations", - "possibleTypes": null, - }, - { - "description": "A belongs-to (forward FK) relation", - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "fieldName", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "isUnique", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "type", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "keys", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaField", - "ofType": null, - }, - }, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "references", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaRefTable", - "ofType": null, - }, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "MetaBelongsToRelation", - "possibleTypes": null, - }, - { - "description": "A has-one or has-many (reverse FK) relation", - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "fieldName", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "isUnique", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "type", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "keys", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaField", - "ofType": null, - }, - }, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "referencedBy", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaRefTable", - "ofType": null, - }, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "MetaHasRelation", - "possibleTypes": null, - }, - { - "description": "A many-to-many relation via junction table", - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "fieldName", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "type", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "junctionTable", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaRefTable", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "junctionLeftConstraint", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaForeignKeyConstraint", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "junctionLeftKeyAttributes", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaField", - "ofType": null, - }, - }, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "junctionRightConstraint", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaForeignKeyConstraint", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "junctionRightKeyAttributes", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaField", - "ofType": null, - }, - }, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "leftKeyAttributes", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaField", - "ofType": null, - }, - }, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "rightKeyAttributes", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaField", - "ofType": null, - }, - }, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "rightTable", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "MetaRefTable", - "ofType": null, - }, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "MetaManyToManyRelation", - "possibleTypes": null, - }, - { - "description": "Table inflection names", - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "tableType", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "allRows", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "connection", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "edge", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "filterType", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "orderByType", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "conditionType", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "patchType", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "createInputType", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "createPayloadType", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "updatePayloadType", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "deletePayloadType", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "MetaInflection", - "possibleTypes": null, - }, - { - "description": "Table query/mutation names", - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "all", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "one", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "create", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "update", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "delete", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "MetaQuery", - "possibleTypes": null, - }, - { - "description": "The root mutation type which contains root level fields which mutate data.", - "enumValues": null, - "fields": [ - { - "args": [ - { - "defaultValue": null, - "description": "The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields.", - "name": "input", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "INPUT_OBJECT", - "name": "CreateUserInput", - "ofType": null, - }, - }, - }, - ], - "deprecationReason": null, - "description": "Creates a single \`User\`.", - "isDeprecated": false, - "name": "createUser", - "type": { - "kind": "OBJECT", - "name": "CreateUserPayload", - "ofType": null, - }, - }, - { - "args": [ - { - "defaultValue": null, - "description": "The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields.", - "name": "input", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "INPUT_OBJECT", - "name": "UpdateUserInput", - "ofType": null, - }, - }, - }, - ], - "deprecationReason": null, - "description": "Updates a single \`User\` using a unique key and a patch.", - "isDeprecated": false, - "name": "updateUser", - "type": { - "kind": "OBJECT", - "name": "UpdateUserPayload", - "ofType": null, - }, - }, - { - "args": [ - { - "defaultValue": null, - "description": "The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields.", - "name": "input", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "INPUT_OBJECT", - "name": "DeleteUserInput", - "ofType": null, - }, - }, - }, - ], - "deprecationReason": null, - "description": "Deletes a single \`User\` using a unique key.", - "isDeprecated": false, - "name": "deleteUser", - "type": { - "kind": "OBJECT", - "name": "DeleteUserPayload", - "ofType": null, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "Mutation", - "possibleTypes": null, - }, - { - "description": "The output of our create \`User\` mutation.", - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": "The exact same \`clientMutationId\` that was provided in the mutation input, -unchanged and unused. May be used by a client to track mutations.", - "isDeprecated": false, - "name": "clientMutationId", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": "The \`User\` that was created by this mutation.", - "isDeprecated": false, - "name": "user", - "type": { - "kind": "OBJECT", - "name": "User", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": "Our root query field type. Allows us to run any query from our mutation payload.", - "isDeprecated": false, - "name": "query", - "type": { - "kind": "OBJECT", - "name": "Query", - "ofType": null, - }, - }, - { - "args": [ - { - "defaultValue": "[PRIMARY_KEY_ASC]", - "description": "The method to use when ordering \`User\`.", - "name": "orderBy", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "ENUM", - "name": "UserOrderBy", - "ofType": null, - }, - }, - }, - }, - }, - ], - "deprecationReason": null, - "description": "An edge for our \`User\`. May be used by Relay 1.", - "isDeprecated": false, - "name": "userEdge", - "type": { - "kind": "OBJECT", - "name": "UserEdge", - "ofType": null, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "CreateUserPayload", - "possibleTypes": null, - }, - { - "description": "All input for the create \`User\` mutation.", - "enumValues": null, - "fields": null, - "inputFields": [ - { - "defaultValue": null, - "description": "An arbitrary string value with no semantic meaning. Will be included in the -payload verbatim. May be used to track mutations by the client.", - "name": "clientMutationId", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": "The \`User\` to be created by this mutation.", - "name": "user", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "INPUT_OBJECT", - "name": "UserInput", - "ofType": null, - }, - }, - }, - ], - "interfaces": null, - "kind": "INPUT_OBJECT", - "name": "CreateUserInput", - "possibleTypes": null, - }, - { - "description": "An input for mutations affecting \`User\`", - "enumValues": null, - "fields": null, - "inputFields": [ - { - "defaultValue": null, - "description": null, - "name": "id", - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": null, - "name": "username", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - ], - "interfaces": null, - "kind": "INPUT_OBJECT", - "name": "UserInput", - "possibleTypes": null, - }, - { - "description": "The output of our update \`User\` mutation.", - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": "The exact same \`clientMutationId\` that was provided in the mutation input, -unchanged and unused. May be used by a client to track mutations.", - "isDeprecated": false, - "name": "clientMutationId", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": "The \`User\` that was updated by this mutation.", - "isDeprecated": false, - "name": "user", - "type": { - "kind": "OBJECT", - "name": "User", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": "Our root query field type. Allows us to run any query from our mutation payload.", - "isDeprecated": false, - "name": "query", - "type": { - "kind": "OBJECT", - "name": "Query", - "ofType": null, - }, - }, - { - "args": [ - { - "defaultValue": "[PRIMARY_KEY_ASC]", - "description": "The method to use when ordering \`User\`.", - "name": "orderBy", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "ENUM", - "name": "UserOrderBy", - "ofType": null, - }, - }, - }, - }, - }, - ], - "deprecationReason": null, - "description": "An edge for our \`User\`. May be used by Relay 1.", - "isDeprecated": false, - "name": "userEdge", - "type": { - "kind": "OBJECT", - "name": "UserEdge", - "ofType": null, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "UpdateUserPayload", - "possibleTypes": null, - }, - { - "description": "All input for the \`updateUser\` mutation.", - "enumValues": null, - "fields": null, - "inputFields": [ - { - "defaultValue": null, - "description": "An arbitrary string value with no semantic meaning. Will be included in the -payload verbatim. May be used to track mutations by the client.", - "name": "clientMutationId", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": null, - "name": "id", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Int", - "ofType": null, - }, - }, - }, - { - "defaultValue": null, - "description": "An object where the defined keys will be set on the \`User\` being updated.", - "name": "userPatch", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "INPUT_OBJECT", - "name": "UserPatch", - "ofType": null, - }, - }, - }, - ], - "interfaces": null, - "kind": "INPUT_OBJECT", - "name": "UpdateUserInput", - "possibleTypes": null, - }, - { - "description": "Represents an update to a \`User\`. Fields that are set will be updated.", - "enumValues": null, - "fields": null, - "inputFields": [ - { - "defaultValue": null, - "description": null, - "name": "id", - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": null, - "name": "username", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - ], - "interfaces": null, - "kind": "INPUT_OBJECT", - "name": "UserPatch", - "possibleTypes": null, - }, - { - "description": "The output of our delete \`User\` mutation.", - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": "The exact same \`clientMutationId\` that was provided in the mutation input, -unchanged and unused. May be used by a client to track mutations.", - "isDeprecated": false, - "name": "clientMutationId", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": "The \`User\` that was deleted by this mutation.", - "isDeprecated": false, - "name": "user", - "type": { - "kind": "OBJECT", - "name": "User", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": "Our root query field type. Allows us to run any query from our mutation payload.", - "isDeprecated": false, - "name": "query", - "type": { - "kind": "OBJECT", - "name": "Query", - "ofType": null, - }, - }, - { - "args": [ - { - "defaultValue": "[PRIMARY_KEY_ASC]", - "description": "The method to use when ordering \`User\`.", - "name": "orderBy", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "ENUM", - "name": "UserOrderBy", - "ofType": null, - }, - }, - }, - }, - }, - ], - "deprecationReason": null, - "description": "An edge for our \`User\`. May be used by Relay 1.", - "isDeprecated": false, - "name": "userEdge", - "type": { - "kind": "OBJECT", - "name": "UserEdge", - "ofType": null, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "DeleteUserPayload", - "possibleTypes": null, - }, - { - "description": "All input for the \`deleteUser\` mutation.", - "enumValues": null, - "fields": null, - "inputFields": [ - { - "defaultValue": null, - "description": "An arbitrary string value with no semantic meaning. Will be included in the -payload verbatim. May be used to track mutations by the client.", - "name": "clientMutationId", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "defaultValue": null, - "description": null, - "name": "id", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Int", - "ofType": null, - }, - }, - }, - ], - "interfaces": null, - "kind": "INPUT_OBJECT", - "name": "DeleteUserInput", - "possibleTypes": null, - }, - { - "description": "A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, as well as the entry points for query, mutation, and subscription operations.", - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "description", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": "A list of all types supported by this server.", - "isDeprecated": false, - "name": "types", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "__Type", - "ofType": null, - }, - }, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": "The type that query operations will be rooted at.", - "isDeprecated": false, - "name": "queryType", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "__Type", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": "If this server supports mutation, the type that mutation operations will be rooted at.", - "isDeprecated": false, - "name": "mutationType", - "type": { - "kind": "OBJECT", - "name": "__Type", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": "If this server support subscription, the type that subscription operations will be rooted at.", - "isDeprecated": false, - "name": "subscriptionType", - "type": { - "kind": "OBJECT", - "name": "__Type", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": "A list of all directives supported by this server.", - "isDeprecated": false, - "name": "directives", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "__Directive", - "ofType": null, - }, - }, - }, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "__Schema", - "possibleTypes": null, - }, - { - "description": "The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in GraphQL as represented by the \`__TypeKind\` enum. - -Depending on the kind of a type, certain fields describe information about that type. Scalar types provide no information beyond a name, description and optional \`specifiedByURL\`, while Enum types provide their values. Object and Interface types provide the fields they describe. Abstract types, Union and Interface, provide the Object types possible at runtime. List and NonNull types compose other types.", - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "kind", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "ENUM", - "name": "__TypeKind", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "name", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "description", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "specifiedByURL", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "args": [ - { - "defaultValue": "false", - "description": null, - "name": "includeDeprecated", - "type": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null, - }, - }, - ], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "fields", - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "__Field", - "ofType": null, - }, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "interfaces", - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "__Type", - "ofType": null, - }, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "possibleTypes", - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "__Type", - "ofType": null, - }, - }, - }, - }, - { - "args": [ - { - "defaultValue": "false", - "description": null, - "name": "includeDeprecated", - "type": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null, - }, - }, - ], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "enumValues", - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "__EnumValue", - "ofType": null, - }, - }, - }, - }, - { - "args": [ - { - "defaultValue": "false", - "description": null, - "name": "includeDeprecated", - "type": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null, - }, - }, - ], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "inputFields", - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "__InputValue", - "ofType": null, - }, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "ofType", - "type": { - "kind": "OBJECT", - "name": "__Type", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "isOneOf", - "type": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "__Type", - "possibleTypes": null, - }, - { - "description": "An enum describing what kind of type a given \`__Type\` is.", - "enumValues": [ - { - "deprecationReason": null, - "description": "Indicates this type is a scalar.", - "isDeprecated": false, - "name": "SCALAR", - }, - { - "deprecationReason": null, - "description": "Indicates this type is an object. \`fields\` and \`interfaces\` are valid fields.", - "isDeprecated": false, - "name": "OBJECT", - }, - { - "deprecationReason": null, - "description": "Indicates this type is an interface. \`fields\`, \`interfaces\`, and \`possibleTypes\` are valid fields.", - "isDeprecated": false, - "name": "INTERFACE", - }, - { - "deprecationReason": null, - "description": "Indicates this type is a union. \`possibleTypes\` is a valid field.", - "isDeprecated": false, - "name": "UNION", - }, - { - "deprecationReason": null, - "description": "Indicates this type is an enum. \`enumValues\` is a valid field.", - "isDeprecated": false, - "name": "ENUM", - }, - { - "deprecationReason": null, - "description": "Indicates this type is an input object. \`inputFields\` is a valid field.", - "isDeprecated": false, - "name": "INPUT_OBJECT", - }, - { - "deprecationReason": null, - "description": "Indicates this type is a list. \`ofType\` is a valid field.", - "isDeprecated": false, - "name": "LIST", - }, - { - "deprecationReason": null, - "description": "Indicates this type is a non-null. \`ofType\` is a valid field.", - "isDeprecated": false, - "name": "NON_NULL", - }, - ], - "fields": null, - "inputFields": null, - "interfaces": null, - "kind": "ENUM", - "name": "__TypeKind", - "possibleTypes": null, - }, - { - "description": "Object and Interface types are described by a list of Fields, each of which has a name, potentially a list of arguments, and a return type.", - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "name", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "description", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "args": [ - { - "defaultValue": "false", - "description": null, - "name": "includeDeprecated", - "type": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null, - }, - }, - ], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "args", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "__InputValue", - "ofType": null, - }, - }, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "type", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "__Type", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "isDeprecated", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "deprecationReason", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "__Field", - "possibleTypes": null, - }, - { - "description": "Arguments provided to Fields or Directives and the input fields of an InputObject are represented as Input Values which describe their type and optionally a default value.", - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "name", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "description", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "type", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "__Type", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": "A GraphQL-formatted string representing the default value for this input value.", - "isDeprecated": false, - "name": "defaultValue", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "isDeprecated", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "deprecationReason", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "__InputValue", - "possibleTypes": null, - }, - { - "description": "One possible value for a given Enum. Enum values are unique values, not a placeholder for a string or numeric value. However an Enum value is returned in a JSON response as a string.", - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "name", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "description", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "isDeprecated", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "deprecationReason", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "__EnumValue", - "possibleTypes": null, - }, - { - "description": "A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document. - -In some cases, you need to provide options to alter GraphQL's execution behavior in ways field arguments will not suffice, such as conditionally including or skipping a field. Directives provide this by describing additional information to the executor.", - "enumValues": null, - "fields": [ - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "name", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "description", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "isRepeatable", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null, - }, - }, - }, - { - "args": [], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "locations", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "ENUM", - "name": "__DirectiveLocation", - "ofType": null, - }, - }, - }, - }, - }, - { - "args": [ - { - "defaultValue": "false", - "description": null, - "name": "includeDeprecated", - "type": { - "kind": "SCALAR", - "name": "Boolean", - "ofType": null, - }, - }, - ], - "deprecationReason": null, - "description": null, - "isDeprecated": false, - "name": "args", - "type": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { - "kind": "OBJECT", - "name": "__InputValue", - "ofType": null, - }, - }, - }, - }, - }, - ], - "inputFields": null, - "interfaces": [], - "kind": "OBJECT", - "name": "__Directive", - "possibleTypes": null, - }, - { - "description": "A Directive can be adjacent to many parts of the GraphQL language, a __DirectiveLocation describes one such possible adjacencies.", - "enumValues": [ - { - "deprecationReason": null, - "description": "Location adjacent to a query operation.", - "isDeprecated": false, - "name": "QUERY", - }, - { - "deprecationReason": null, - "description": "Location adjacent to a mutation operation.", - "isDeprecated": false, - "name": "MUTATION", - }, - { - "deprecationReason": null, - "description": "Location adjacent to a subscription operation.", - "isDeprecated": false, - "name": "SUBSCRIPTION", - }, - { - "deprecationReason": null, - "description": "Location adjacent to a field.", - "isDeprecated": false, - "name": "FIELD", - }, - { - "deprecationReason": null, - "description": "Location adjacent to a fragment definition.", - "isDeprecated": false, - "name": "FRAGMENT_DEFINITION", - }, - { - "deprecationReason": null, - "description": "Location adjacent to a fragment spread.", - "isDeprecated": false, - "name": "FRAGMENT_SPREAD", - }, - { - "deprecationReason": null, - "description": "Location adjacent to an inline fragment.", - "isDeprecated": false, - "name": "INLINE_FRAGMENT", - }, - { - "deprecationReason": null, - "description": "Location adjacent to a variable definition.", - "isDeprecated": false, - "name": "VARIABLE_DEFINITION", - }, - { - "deprecationReason": null, - "description": "Location adjacent to a schema definition.", - "isDeprecated": false, - "name": "SCHEMA", - }, - { - "deprecationReason": null, - "description": "Location adjacent to a scalar definition.", - "isDeprecated": false, - "name": "SCALAR", - }, - { - "deprecationReason": null, - "description": "Location adjacent to an object type definition.", - "isDeprecated": false, - "name": "OBJECT", - }, - { - "deprecationReason": null, - "description": "Location adjacent to a field definition.", - "isDeprecated": false, - "name": "FIELD_DEFINITION", - }, - { - "deprecationReason": null, - "description": "Location adjacent to an argument definition.", - "isDeprecated": false, - "name": "ARGUMENT_DEFINITION", - }, - { - "deprecationReason": null, - "description": "Location adjacent to an interface definition.", - "isDeprecated": false, - "name": "INTERFACE", - }, - { - "deprecationReason": null, - "description": "Location adjacent to a union definition.", - "isDeprecated": false, - "name": "UNION", - }, - { - "deprecationReason": null, - "description": "Location adjacent to an enum definition.", - "isDeprecated": false, - "name": "ENUM", - }, - { - "deprecationReason": null, - "description": "Location adjacent to an enum value definition.", - "isDeprecated": false, - "name": "ENUM_VALUE", - }, - { - "deprecationReason": null, - "description": "Location adjacent to an input object type definition.", - "isDeprecated": false, - "name": "INPUT_OBJECT", - }, - { - "deprecationReason": null, - "description": "Location adjacent to an input object field definition.", - "isDeprecated": false, - "name": "INPUT_FIELD_DEFINITION", - }, - ], - "fields": null, - "inputFields": null, - "interfaces": null, - "kind": "ENUM", - "name": "__DirectiveLocation", - "possibleTypes": null, - }, - ], - }, - }, -} -`; From eb9e5b83954a79194e27f49bd1e612402d0251d4 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Fri, 13 Mar 2026 00:38:38 +0000 Subject: [PATCH 12/19] fix: provide correct snapshot content for CI (no condition fields) - Search plugin: update snapshot keys to match renamed filter-based tests - Schema snapshot: remove all condition arguments and XxxCondition input types - Introspection snapshot: remove condition arg and UserCondition type - Kept conditionType in _meta schema (unrelated to deprecated condition arg) --- .../__snapshots__/plugin.test.ts.snap | 38 + .../schema-snapshot.test.ts.snap | 2162 +++++++++ .../__snapshots__/graphile-test.test.ts.snap | 4248 +++++++++++++++++ 3 files changed, 6448 insertions(+) diff --git a/graphile/graphile-search-plugin/__tests__/__snapshots__/plugin.test.ts.snap b/graphile/graphile-search-plugin/__tests__/__snapshots__/plugin.test.ts.snap index 12c5cfd47..f663008c1 100644 --- a/graphile/graphile-search-plugin/__tests__/__snapshots__/plugin.test.ts.snap +++ b/graphile/graphile-search-plugin/__tests__/__snapshots__/plugin.test.ts.snap @@ -1 +1,39 @@ // Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing + +exports[`PgSearchPlugin filter-based search on stsv column returns only title-matched rows for fullTextStsv filter 1`] = ` +{ + "allGoals": { + "nodes": [ + { + "description": "Second in years female given. Us firmament. She'd kind there let moved thing evening saying set whales a fowl heaven.", + "rowId": "[ID]", + "title": "green fowl", + }, + ], + }, +} +`; + +exports[`PgSearchPlugin filter-based search on tsv column returns matching rows with ts_rank as secondary sort 1`] = ` +{ + "allGoals": { + "nodes": [ + { + "description": "Appear evening that gathered saying. Sea subdue so fill stars. Bring is man divided behold fish their. Also won't fowl.", + "rowId": "[ID]", + "title": "evenings", + }, + { + "description": "Heaven. Tree creeping was. Gathered living dominion us likeness first subdue fill. Fowl him moveth fly also the is created.", + "rowId": "[ID]", + "title": "heaven", + }, + { + "description": "Second in years female given. Us firmament. She'd kind there let moved thing evening saying set whales a fowl heaven.", + "rowId": "[ID]", + "title": "green fowl", + }, + ], + }, +} +`; diff --git a/graphql/server-test/__tests__/__snapshots__/schema-snapshot.test.ts.snap b/graphql/server-test/__tests__/__snapshots__/schema-snapshot.test.ts.snap index 12c5cfd47..2d958381a 100644 --- a/graphql/server-test/__tests__/__snapshots__/schema-snapshot.test.ts.snap +++ b/graphql/server-test/__tests__/__snapshots__/schema-snapshot.test.ts.snap @@ -1 +1,2163 @@ // Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing + +exports[`Schema Snapshot should generate consistent GraphQL SDL from the test schema 1`] = ` +""""The root query type which gives access points into the data universe.""" +type Query { + """Reads and enables pagination through a set of \`PostTag\`.""" + postTags( + """Only read the first \`n\` values of the set.""" + first: Int + + """Only read the last \`n\` values of the set.""" + last: Int + + """ + Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor + based pagination. May not be used with \`last\`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: PostTagFilter + + """The method to use when ordering \`PostTag\`.""" + orderBy: [PostTagOrderBy!] = [PRIMARY_KEY_ASC] + ): PostTagConnection + + """Reads and enables pagination through a set of \`Tag\`.""" + tags( + """Only read the first \`n\` values of the set.""" + first: Int + + """Only read the last \`n\` values of the set.""" + last: Int + + """ + Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor + based pagination. May not be used with \`last\`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: TagFilter + + """The method to use when ordering \`Tag\`.""" + orderBy: [TagOrderBy!] = [PRIMARY_KEY_ASC] + ): TagConnection + + """Reads and enables pagination through a set of \`User\`.""" + users( + """Only read the first \`n\` values of the set.""" + first: Int + + """Only read the last \`n\` values of the set.""" + last: Int + + """ + Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor + based pagination. May not be used with \`last\`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: UserFilter + + """The method to use when ordering \`User\`.""" + orderBy: [UserOrderBy!] = [PRIMARY_KEY_ASC] + ): UserConnection + + """Reads and enables pagination through a set of \`Comment\`.""" + comments( + """Only read the first \`n\` values of the set.""" + first: Int + + """Only read the last \`n\` values of the set.""" + last: Int + + """ + Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor + based pagination. May not be used with \`last\`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CommentFilter + + """The method to use when ordering \`Comment\`.""" + orderBy: [CommentOrderBy!] = [PRIMARY_KEY_ASC] + ): CommentConnection + + """Reads and enables pagination through a set of \`Post\`.""" + posts( + """Only read the first \`n\` values of the set.""" + first: Int + + """Only read the last \`n\` values of the set.""" + last: Int + + """ + Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor + based pagination. May not be used with \`last\`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: PostFilter + + """The method to use when ordering \`Post\`.""" + orderBy: [PostOrderBy!] = [PRIMARY_KEY_ASC] + ): PostConnection + + """ + Metadata about the database schema, including tables, fields, indexes, and constraints. Useful for code generation tools. + """ + _meta: MetaSchema +} + +"""A connection to a list of \`PostTag\` values.""" +type PostTagConnection { + """A list of \`PostTag\` objects.""" + nodes: [PostTag]! + + """ + A list of edges which contains the \`PostTag\` and cursor to aid in pagination. + """ + edges: [PostTagEdge]! + + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """The count of *all* \`PostTag\` you could get from the connection.""" + totalCount: Int! +} + +type PostTag { + id: UUID! + postId: UUID! + tagId: UUID! + createdAt: Datetime + + """Reads a single \`Post\` that is related to this \`PostTag\`.""" + post: Post + + """Reads a single \`Tag\` that is related to this \`PostTag\`.""" + tag: Tag +} + +""" +A universally unique identifier as defined by [RFC 4122](https://tools.ietf.org/html/rfc4122). +""" +scalar UUID + +""" +A point in time as described by the [ISO +8601](https://en.wikipedia.org/wiki/ISO_8601) and, if it has a timezone, [RFC +3339](https://datatracker.ietf.org/doc/html/rfc3339) standards. Input values +that do not conform to both ISO 8601 and RFC 3339 may be coerced, which may lead +to unexpected results. +""" +scalar Datetime + +type Post { + id: UUID! + authorId: UUID! + title: String! + slug: String! + content: String + excerpt: String + isPublished: Boolean + publishedAt: Datetime + viewCount: Int + createdAt: Datetime + updatedAt: Datetime + + """Reads and enables pagination through a set of \`Tag\`.""" + tags( + """Only read the first \`n\` values of the set.""" + first: Int + + """Only read the last \`n\` values of the set.""" + last: Int + + """ + Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor + based pagination. May not be used with \`last\`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: TagFilter + + """The method to use when ordering \`Tag\`.""" + orderBy: [TagOrderBy!] = [PRIMARY_KEY_ASC] + ): PostTagsManyToManyConnection! + + """Reads a single \`User\` that is related to this \`Post\`.""" + author: User + + """Reads and enables pagination through a set of \`PostTag\`.""" + postTags( + """Only read the first \`n\` values of the set.""" + first: Int + + """Only read the last \`n\` values of the set.""" + last: Int + + """ + Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor + based pagination. May not be used with \`last\`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: PostTagFilter + + """The method to use when ordering \`PostTag\`.""" + orderBy: [PostTagOrderBy!] = [PRIMARY_KEY_ASC] + ): PostTagConnection! + + """Reads and enables pagination through a set of \`Comment\`.""" + comments( + """Only read the first \`n\` values of the set.""" + first: Int + + """Only read the last \`n\` values of the set.""" + last: Int + + """ + Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor + based pagination. May not be used with \`last\`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CommentFilter + + """The method to use when ordering \`Comment\`.""" + orderBy: [CommentOrderBy!] = [PRIMARY_KEY_ASC] + ): CommentConnection! +} + +"""A connection to a list of \`Tag\` values, with data from \`PostTag\`.""" +type PostTagsManyToManyConnection { + """A list of \`Tag\` objects.""" + nodes: [Tag]! + + """ + A list of edges which contains the \`Tag\`, info from the \`PostTag\`, and the cursor to aid in pagination. + """ + edges: [PostTagsManyToManyEdge!]! + + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """The count of *all* \`Tag\` you could get from the connection.""" + totalCount: Int! +} + +type Tag { + id: UUID! + name: String! + slug: String! + description: String + color: String + createdAt: Datetime + + """Reads and enables pagination through a set of \`Post\`.""" + posts( + """Only read the first \`n\` values of the set.""" + first: Int + + """Only read the last \`n\` values of the set.""" + last: Int + + """ + Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor + based pagination. May not be used with \`last\`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: PostFilter + + """The method to use when ordering \`Post\`.""" + orderBy: [PostOrderBy!] = [PRIMARY_KEY_ASC] + ): TagPostsManyToManyConnection! + + """Reads and enables pagination through a set of \`PostTag\`.""" + postTags( + """Only read the first \`n\` values of the set.""" + first: Int + + """Only read the last \`n\` values of the set.""" + last: Int + + """ + Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor + based pagination. May not be used with \`last\`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: PostTagFilter + + """The method to use when ordering \`PostTag\`.""" + orderBy: [PostTagOrderBy!] = [PRIMARY_KEY_ASC] + ): PostTagConnection! +} + +"""A connection to a list of \`Post\` values, with data from \`PostTag\`.""" +type TagPostsManyToManyConnection { + """A list of \`Post\` objects.""" + nodes: [Post]! + + """ + A list of edges which contains the \`Post\`, info from the \`PostTag\`, and the cursor to aid in pagination. + """ + edges: [TagPostsManyToManyEdge!]! + + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """The count of *all* \`Post\` you could get from the connection.""" + totalCount: Int! +} + +"""A \`Post\` edge in the connection, with data from \`PostTag\`.""" +type TagPostsManyToManyEdge { + """A cursor for use in pagination.""" + cursor: Cursor + + """The \`Post\` at the end of the edge.""" + node: Post + id: UUID! + createdAt: Datetime +} + +"""A location in a connection that can be used for resuming pagination.""" +scalar Cursor + +"""Information about pagination in a connection.""" +type PageInfo { + """When paginating forwards, are there more items?""" + hasNextPage: Boolean! + + """When paginating backwards, are there more items?""" + hasPreviousPage: Boolean! + + """When paginating backwards, the cursor to continue.""" + startCursor: Cursor + + """When paginating forwards, the cursor to continue.""" + endCursor: Cursor +} + +""" +A filter to be used against \`Post\` object types. All fields are combined with a logical ‘and.’ +""" +input PostFilter { + """Filter by the object’s \`id\` field.""" + id: UUIDFilter + + """Filter by the object’s \`authorId\` field.""" + authorId: UUIDFilter + + """Filter by the object’s \`title\` field.""" + title: StringFilter + + """Filter by the object’s \`slug\` field.""" + slug: StringFilter + + """Filter by the object’s \`content\` field.""" + content: StringFilter + + """Filter by the object’s \`excerpt\` field.""" + excerpt: StringFilter + + """Filter by the object’s \`isPublished\` field.""" + isPublished: BooleanFilter + + """Filter by the object’s \`publishedAt\` field.""" + publishedAt: DatetimeFilter + + """Filter by the object’s \`viewCount\` field.""" + viewCount: IntFilter + + """Filter by the object’s \`createdAt\` field.""" + createdAt: DatetimeFilter + + """Filter by the object’s \`updatedAt\` field.""" + updatedAt: DatetimeFilter + + """Checks for all expressions in this list.""" + and: [PostFilter!] + + """Checks for any expressions in this list.""" + or: [PostFilter!] + + """Negates the expression.""" + not: PostFilter +} + +""" +A filter to be used against UUID fields. All fields are combined with a logical ‘and.’ +""" +input UUIDFilter { + """ + Is null (if \`true\` is specified) or is not null (if \`false\` is specified). + """ + isNull: Boolean + + """Equal to the specified value.""" + equalTo: UUID + + """Not equal to the specified value.""" + notEqualTo: UUID + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: UUID + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: UUID + + """Included in the specified list.""" + in: [UUID!] + + """Not included in the specified list.""" + notIn: [UUID!] + + """Less than the specified value.""" + lessThan: UUID + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: UUID + + """Greater than the specified value.""" + greaterThan: UUID + + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: UUID +} + +""" +A filter to be used against String fields. All fields are combined with a logical ‘and.’ +""" +input StringFilter { + """ + Is null (if \`true\` is specified) or is not null (if \`false\` is specified). + """ + isNull: Boolean + + """Equal to the specified value.""" + equalTo: String + + """Not equal to the specified value.""" + notEqualTo: String + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: String + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: String + + """Included in the specified list.""" + in: [String!] + + """Not included in the specified list.""" + notIn: [String!] + + """Less than the specified value.""" + lessThan: String + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: String + + """Greater than the specified value.""" + greaterThan: String + + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: String + + """Contains the specified string (case-sensitive).""" + includes: String + + """Does not contain the specified string (case-sensitive).""" + notIncludes: String + + """Contains the specified string (case-insensitive).""" + includesInsensitive: String + + """Does not contain the specified string (case-insensitive).""" + notIncludesInsensitive: String + + """Starts with the specified string (case-sensitive).""" + startsWith: String + + """Does not start with the specified string (case-sensitive).""" + notStartsWith: String + + """Starts with the specified string (case-insensitive).""" + startsWithInsensitive: String + + """Does not start with the specified string (case-insensitive).""" + notStartsWithInsensitive: String + + """Ends with the specified string (case-sensitive).""" + endsWith: String + + """Does not end with the specified string (case-sensitive).""" + notEndsWith: String + + """Ends with the specified string (case-insensitive).""" + endsWithInsensitive: String + + """Does not end with the specified string (case-insensitive).""" + notEndsWithInsensitive: String + + """ + Matches the specified pattern (case-sensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters. + """ + like: String + + """ + Does not match the specified pattern (case-sensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters. + """ + notLike: String + + """ + Matches the specified pattern (case-insensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters. + """ + likeInsensitive: String + + """ + Does not match the specified pattern (case-insensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters. + """ + notLikeInsensitive: String + + """Equal to the specified value (case-insensitive).""" + equalToInsensitive: String + + """Not equal to the specified value (case-insensitive).""" + notEqualToInsensitive: String + + """ + Not equal to the specified value, treating null like an ordinary value (case-insensitive). + """ + distinctFromInsensitive: String + + """ + Equal to the specified value, treating null like an ordinary value (case-insensitive). + """ + notDistinctFromInsensitive: String + + """Included in the specified list (case-insensitive).""" + inInsensitive: [String!] + + """Not included in the specified list (case-insensitive).""" + notInInsensitive: [String!] + + """Less than the specified value (case-insensitive).""" + lessThanInsensitive: String + + """Less than or equal to the specified value (case-insensitive).""" + lessThanOrEqualToInsensitive: String + + """Greater than the specified value (case-insensitive).""" + greaterThanInsensitive: String + + """Greater than or equal to the specified value (case-insensitive).""" + greaterThanOrEqualToInsensitive: String +} + +""" +A filter to be used against Boolean fields. All fields are combined with a logical ‘and.’ +""" +input BooleanFilter { + """ + Is null (if \`true\` is specified) or is not null (if \`false\` is specified). + """ + isNull: Boolean + + """Equal to the specified value.""" + equalTo: Boolean + + """Not equal to the specified value.""" + notEqualTo: Boolean + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: Boolean + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: Boolean + + """Included in the specified list.""" + in: [Boolean!] + + """Not included in the specified list.""" + notIn: [Boolean!] + + """Less than the specified value.""" + lessThan: Boolean + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: Boolean + + """Greater than the specified value.""" + greaterThan: Boolean + + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: Boolean +} + +""" +A filter to be used against Datetime fields. All fields are combined with a logical ‘and.’ +""" +input DatetimeFilter { + """ + Is null (if \`true\` is specified) or is not null (if \`false\` is specified). + """ + isNull: Boolean + + """Equal to the specified value.""" + equalTo: Datetime + + """Not equal to the specified value.""" + notEqualTo: Datetime + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: Datetime + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: Datetime + + """Included in the specified list.""" + in: [Datetime!] + + """Not included in the specified list.""" + notIn: [Datetime!] + + """Less than the specified value.""" + lessThan: Datetime + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: Datetime + + """Greater than the specified value.""" + greaterThan: Datetime + + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: Datetime +} + +""" +A filter to be used against Int fields. All fields are combined with a logical ‘and.’ +""" +input IntFilter { + """ + Is null (if \`true\` is specified) or is not null (if \`false\` is specified). + """ + isNull: Boolean + + """Equal to the specified value.""" + equalTo: Int + + """Not equal to the specified value.""" + notEqualTo: Int + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: Int + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: Int + + """Included in the specified list.""" + in: [Int!] + + """Not included in the specified list.""" + notIn: [Int!] + + """Less than the specified value.""" + lessThan: Int + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: Int + + """Greater than the specified value.""" + greaterThan: Int + + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: Int +} + +"""Methods to use when ordering \`Post\`.""" +enum PostOrderBy { + NATURAL + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC + ID_ASC + ID_DESC + AUTHOR_ID_ASC + AUTHOR_ID_DESC + SLUG_ASC + SLUG_DESC + PUBLISHED_AT_ASC + PUBLISHED_AT_DESC + CREATED_AT_ASC + CREATED_AT_DESC +} + +""" +A filter to be used against \`PostTag\` object types. All fields are combined with a logical ‘and.’ +""" +input PostTagFilter { + """Filter by the object’s \`id\` field.""" + id: UUIDFilter + + """Filter by the object’s \`postId\` field.""" + postId: UUIDFilter + + """Filter by the object’s \`tagId\` field.""" + tagId: UUIDFilter + + """Filter by the object’s \`createdAt\` field.""" + createdAt: DatetimeFilter + + """Checks for all expressions in this list.""" + and: [PostTagFilter!] + + """Checks for any expressions in this list.""" + or: [PostTagFilter!] + + """Negates the expression.""" + not: PostTagFilter +} + +"""Methods to use when ordering \`PostTag\`.""" +enum PostTagOrderBy { + NATURAL + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC + ID_ASC + ID_DESC + POST_ID_ASC + POST_ID_DESC + TAG_ID_ASC + TAG_ID_DESC +} + +"""A \`Tag\` edge in the connection, with data from \`PostTag\`.""" +type PostTagsManyToManyEdge { + """A cursor for use in pagination.""" + cursor: Cursor + + """The \`Tag\` at the end of the edge.""" + node: Tag + id: UUID! + createdAt: Datetime +} + +""" +A filter to be used against \`Tag\` object types. All fields are combined with a logical ‘and.’ +""" +input TagFilter { + """Filter by the object’s \`id\` field.""" + id: UUIDFilter + + """Filter by the object’s \`name\` field.""" + name: StringFilter + + """Filter by the object’s \`slug\` field.""" + slug: StringFilter + + """Filter by the object’s \`description\` field.""" + description: StringFilter + + """Filter by the object’s \`color\` field.""" + color: StringFilter + + """Filter by the object’s \`createdAt\` field.""" + createdAt: DatetimeFilter + + """Checks for all expressions in this list.""" + and: [TagFilter!] + + """Checks for any expressions in this list.""" + or: [TagFilter!] + + """Negates the expression.""" + not: TagFilter +} + +"""Methods to use when ordering \`Tag\`.""" +enum TagOrderBy { + NATURAL + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC + ID_ASC + ID_DESC + NAME_ASC + NAME_DESC + SLUG_ASC + SLUG_DESC +} + +type User { + id: UUID! + email: String! + username: String! + displayName: String + bio: String + isActive: Boolean + role: String + createdAt: Datetime + updatedAt: Datetime + + """Reads and enables pagination through a set of \`Post\`.""" + authoredPosts( + """Only read the first \`n\` values of the set.""" + first: Int + + """Only read the last \`n\` values of the set.""" + last: Int + + """ + Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor + based pagination. May not be used with \`last\`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: PostFilter + + """The method to use when ordering \`Post\`.""" + orderBy: [PostOrderBy!] = [PRIMARY_KEY_ASC] + ): PostConnection! + + """Reads and enables pagination through a set of \`Comment\`.""" + authoredComments( + """Only read the first \`n\` values of the set.""" + first: Int + + """Only read the last \`n\` values of the set.""" + last: Int + + """ + Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor + based pagination. May not be used with \`last\`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CommentFilter + + """The method to use when ordering \`Comment\`.""" + orderBy: [CommentOrderBy!] = [PRIMARY_KEY_ASC] + ): CommentConnection! +} + +"""A connection to a list of \`Post\` values.""" +type PostConnection { + """A list of \`Post\` objects.""" + nodes: [Post]! + + """ + A list of edges which contains the \`Post\` and cursor to aid in pagination. + """ + edges: [PostEdge]! + + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """The count of *all* \`Post\` you could get from the connection.""" + totalCount: Int! +} + +"""A \`Post\` edge in the connection.""" +type PostEdge { + """A cursor for use in pagination.""" + cursor: Cursor + + """The \`Post\` at the end of the edge.""" + node: Post +} + +"""A connection to a list of \`Comment\` values.""" +type CommentConnection { + """A list of \`Comment\` objects.""" + nodes: [Comment]! + + """ + A list of edges which contains the \`Comment\` and cursor to aid in pagination. + """ + edges: [CommentEdge]! + + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """The count of *all* \`Comment\` you could get from the connection.""" + totalCount: Int! +} + +type Comment { + id: UUID! + postId: UUID! + authorId: UUID! + parentId: UUID + content: String! + isApproved: Boolean + likesCount: Int + createdAt: Datetime + updatedAt: Datetime + + """Reads a single \`User\` that is related to this \`Comment\`.""" + author: User + + """Reads a single \`Comment\` that is related to this \`Comment\`.""" + parent: Comment + + """Reads a single \`Post\` that is related to this \`Comment\`.""" + post: Post + + """Reads and enables pagination through a set of \`Comment\`.""" + childComments( + """Only read the first \`n\` values of the set.""" + first: Int + + """Only read the last \`n\` values of the set.""" + last: Int + + """ + Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor + based pagination. May not be used with \`last\`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CommentFilter + + """The method to use when ordering \`Comment\`.""" + orderBy: [CommentOrderBy!] = [PRIMARY_KEY_ASC] + ): CommentConnection! +} + +""" +A filter to be used against \`Comment\` object types. All fields are combined with a logical ‘and.’ +""" +input CommentFilter { + """Filter by the object’s \`id\` field.""" + id: UUIDFilter + + """Filter by the object’s \`postId\` field.""" + postId: UUIDFilter + + """Filter by the object’s \`authorId\` field.""" + authorId: UUIDFilter + + """Filter by the object’s \`parentId\` field.""" + parentId: UUIDFilter + + """Filter by the object’s \`content\` field.""" + content: StringFilter + + """Filter by the object’s \`isApproved\` field.""" + isApproved: BooleanFilter + + """Filter by the object’s \`likesCount\` field.""" + likesCount: IntFilter + + """Filter by the object’s \`createdAt\` field.""" + createdAt: DatetimeFilter + + """Filter by the object’s \`updatedAt\` field.""" + updatedAt: DatetimeFilter + + """Checks for all expressions in this list.""" + and: [CommentFilter!] + + """Checks for any expressions in this list.""" + or: [CommentFilter!] + + """Negates the expression.""" + not: CommentFilter +} + +"""Methods to use when ordering \`Comment\`.""" +enum CommentOrderBy { + NATURAL + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC + ID_ASC + ID_DESC + POST_ID_ASC + POST_ID_DESC + AUTHOR_ID_ASC + AUTHOR_ID_DESC + PARENT_ID_ASC + PARENT_ID_DESC + CREATED_AT_ASC + CREATED_AT_DESC +} + +"""A \`Comment\` edge in the connection.""" +type CommentEdge { + """A cursor for use in pagination.""" + cursor: Cursor + + """The \`Comment\` at the end of the edge.""" + node: Comment +} + +"""A \`PostTag\` edge in the connection.""" +type PostTagEdge { + """A cursor for use in pagination.""" + cursor: Cursor + + """The \`PostTag\` at the end of the edge.""" + node: PostTag +} + +"""A connection to a list of \`Tag\` values.""" +type TagConnection { + """A list of \`Tag\` objects.""" + nodes: [Tag]! + + """ + A list of edges which contains the \`Tag\` and cursor to aid in pagination. + """ + edges: [TagEdge]! + + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """The count of *all* \`Tag\` you could get from the connection.""" + totalCount: Int! +} + +"""A \`Tag\` edge in the connection.""" +type TagEdge { + """A cursor for use in pagination.""" + cursor: Cursor + + """The \`Tag\` at the end of the edge.""" + node: Tag +} + +"""A connection to a list of \`User\` values.""" +type UserConnection { + """A list of \`User\` objects.""" + nodes: [User]! + + """ + A list of edges which contains the \`User\` and cursor to aid in pagination. + """ + edges: [UserEdge]! + + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """The count of *all* \`User\` you could get from the connection.""" + totalCount: Int! +} + +"""A \`User\` edge in the connection.""" +type UserEdge { + """A cursor for use in pagination.""" + cursor: Cursor + + """The \`User\` at the end of the edge.""" + node: User +} + +""" +A filter to be used against \`User\` object types. All fields are combined with a logical ‘and.’ +""" +input UserFilter { + """Filter by the object’s \`id\` field.""" + id: UUIDFilter + + """Filter by the object’s \`email\` field.""" + email: StringFilter + + """Filter by the object’s \`username\` field.""" + username: StringFilter + + """Filter by the object’s \`displayName\` field.""" + displayName: StringFilter + + """Filter by the object’s \`bio\` field.""" + bio: StringFilter + + """Filter by the object’s \`isActive\` field.""" + isActive: BooleanFilter + + """Filter by the object’s \`role\` field.""" + role: StringFilter + + """Filter by the object’s \`createdAt\` field.""" + createdAt: DatetimeFilter + + """Filter by the object’s \`updatedAt\` field.""" + updatedAt: DatetimeFilter + + """Checks for all expressions in this list.""" + and: [UserFilter!] + + """Checks for any expressions in this list.""" + or: [UserFilter!] + + """Negates the expression.""" + not: UserFilter +} + +"""Methods to use when ordering \`User\`.""" +enum UserOrderBy { + NATURAL + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC + ID_ASC + ID_DESC + EMAIL_ASC + EMAIL_DESC + USERNAME_ASC + USERNAME_DESC + CREATED_AT_ASC + CREATED_AT_DESC +} + +"""Root meta schema type""" +type MetaSchema { + tables: [MetaTable!]! +} + +"""Information about a database table""" +type MetaTable { + name: String! + schemaName: String! + fields: [MetaField!]! + indexes: [MetaIndex!]! + constraints: MetaConstraints! + foreignKeyConstraints: [MetaForeignKeyConstraint!]! + primaryKeyConstraints: [MetaPrimaryKeyConstraint!]! + uniqueConstraints: [MetaUniqueConstraint!]! + relations: MetaRelations! + inflection: MetaInflection! + query: MetaQuery! +} + +"""Information about a table field/column""" +type MetaField { + name: String! + type: MetaType! + isNotNull: Boolean! + hasDefault: Boolean! +} + +"""Information about a PostgreSQL type""" +type MetaType { + pgType: String! + gqlType: String! + isArray: Boolean! + isNotNull: Boolean + hasDefault: Boolean +} + +"""Information about a database index""" +type MetaIndex { + name: String! + isUnique: Boolean! + isPrimary: Boolean! + columns: [String!]! + fields: [MetaField!] +} + +"""Table constraints""" +type MetaConstraints { + primaryKey: MetaPrimaryKeyConstraint + unique: [MetaUniqueConstraint!]! + foreignKey: [MetaForeignKeyConstraint!]! +} + +"""Information about a primary key constraint""" +type MetaPrimaryKeyConstraint { + name: String! + fields: [MetaField!]! +} + +"""Information about a unique constraint""" +type MetaUniqueConstraint { + name: String! + fields: [MetaField!]! +} + +"""Information about a foreign key constraint""" +type MetaForeignKeyConstraint { + name: String! + fields: [MetaField!]! + referencedTable: String! + referencedFields: [String!]! + refFields: [MetaField!] + refTable: MetaRefTable +} + +"""Reference to a related table""" +type MetaRefTable { + name: String! +} + +"""Table relations""" +type MetaRelations { + belongsTo: [MetaBelongsToRelation!]! + has: [MetaHasRelation!]! + hasOne: [MetaHasRelation!]! + hasMany: [MetaHasRelation!]! + manyToMany: [MetaManyToManyRelation!]! +} + +"""A belongs-to (forward FK) relation""" +type MetaBelongsToRelation { + fieldName: String + isUnique: Boolean! + type: String + keys: [MetaField!]! + references: MetaRefTable! +} + +"""A has-one or has-many (reverse FK) relation""" +type MetaHasRelation { + fieldName: String + isUnique: Boolean! + type: String + keys: [MetaField!]! + referencedBy: MetaRefTable! +} + +"""A many-to-many relation via junction table""" +type MetaManyToManyRelation { + fieldName: String + type: String + junctionTable: MetaRefTable! + junctionLeftConstraint: MetaForeignKeyConstraint! + junctionLeftKeyAttributes: [MetaField!]! + junctionRightConstraint: MetaForeignKeyConstraint! + junctionRightKeyAttributes: [MetaField!]! + leftKeyAttributes: [MetaField!]! + rightKeyAttributes: [MetaField!]! + rightTable: MetaRefTable! +} + +"""Table inflection names""" +type MetaInflection { + tableType: String! + allRows: String! + connection: String! + edge: String! + filterType: String + orderByType: String! + conditionType: String! + patchType: String + createInputType: String! + createPayloadType: String! + updatePayloadType: String + deletePayloadType: String! +} + +"""Table query/mutation names""" +type MetaQuery { + all: String! + one: String + create: String + update: String + delete: String +} + +""" +The root mutation type which contains root level fields which mutate data. +""" +type Mutation { + """Creates a single \`PostTag\`.""" + createPostTag( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: CreatePostTagInput! + ): CreatePostTagPayload + + """Creates a single \`Tag\`.""" + createTag( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: CreateTagInput! + ): CreateTagPayload + + """Creates a single \`User\`.""" + createUser( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: CreateUserInput! + ): CreateUserPayload + + """Creates a single \`Comment\`.""" + createComment( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: CreateCommentInput! + ): CreateCommentPayload + + """Creates a single \`Post\`.""" + createPost( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: CreatePostInput! + ): CreatePostPayload + + """Updates a single \`PostTag\` using a unique key and a patch.""" + updatePostTag( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: UpdatePostTagInput! + ): UpdatePostTagPayload + + """Updates a single \`Tag\` using a unique key and a patch.""" + updateTag( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: UpdateTagInput! + ): UpdateTagPayload + + """Updates a single \`User\` using a unique key and a patch.""" + updateUser( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: UpdateUserInput! + ): UpdateUserPayload + + """Updates a single \`Comment\` using a unique key and a patch.""" + updateComment( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: UpdateCommentInput! + ): UpdateCommentPayload + + """Updates a single \`Post\` using a unique key and a patch.""" + updatePost( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: UpdatePostInput! + ): UpdatePostPayload + + """Deletes a single \`PostTag\` using a unique key.""" + deletePostTag( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeletePostTagInput! + ): DeletePostTagPayload + + """Deletes a single \`Tag\` using a unique key.""" + deleteTag( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteTagInput! + ): DeleteTagPayload + + """Deletes a single \`User\` using a unique key.""" + deleteUser( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteUserInput! + ): DeleteUserPayload + + """Deletes a single \`Comment\` using a unique key.""" + deleteComment( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteCommentInput! + ): DeleteCommentPayload + + """Deletes a single \`Post\` using a unique key.""" + deletePost( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeletePostInput! + ): DeletePostPayload +} + +"""The output of our create \`PostTag\` mutation.""" +type CreatePostTagPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`PostTag\` that was created by this mutation.""" + postTag: PostTag + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`PostTag\`. May be used by Relay 1.""" + postTagEdge( + """The method to use when ordering \`PostTag\`.""" + orderBy: [PostTagOrderBy!]! = [PRIMARY_KEY_ASC] + ): PostTagEdge +} + +"""All input for the create \`PostTag\` mutation.""" +input CreatePostTagInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + + """The \`PostTag\` to be created by this mutation.""" + postTag: PostTagInput! +} + +"""An input for mutations affecting \`PostTag\`""" +input PostTagInput { + id: UUID + postId: UUID! + tagId: UUID! + createdAt: Datetime +} + +"""The output of our create \`Tag\` mutation.""" +type CreateTagPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`Tag\` that was created by this mutation.""" + tag: Tag + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`Tag\`. May be used by Relay 1.""" + tagEdge( + """The method to use when ordering \`Tag\`.""" + orderBy: [TagOrderBy!]! = [PRIMARY_KEY_ASC] + ): TagEdge +} + +"""All input for the create \`Tag\` mutation.""" +input CreateTagInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + + """The \`Tag\` to be created by this mutation.""" + tag: TagInput! +} + +"""An input for mutations affecting \`Tag\`""" +input TagInput { + id: UUID + name: String! + slug: String! + description: String + color: String + createdAt: Datetime +} + +"""The output of our create \`User\` mutation.""" +type CreateUserPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`User\` that was created by this mutation.""" + user: User + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`User\`. May be used by Relay 1.""" + userEdge( + """The method to use when ordering \`User\`.""" + orderBy: [UserOrderBy!]! = [PRIMARY_KEY_ASC] + ): UserEdge +} + +"""All input for the create \`User\` mutation.""" +input CreateUserInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + + """The \`User\` to be created by this mutation.""" + user: UserInput! +} + +"""An input for mutations affecting \`User\`""" +input UserInput { + id: UUID + email: String! + username: String! + displayName: String + bio: String + isActive: Boolean + role: String + createdAt: Datetime + updatedAt: Datetime +} + +"""The output of our create \`Comment\` mutation.""" +type CreateCommentPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`Comment\` that was created by this mutation.""" + comment: Comment + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`Comment\`. May be used by Relay 1.""" + commentEdge( + """The method to use when ordering \`Comment\`.""" + orderBy: [CommentOrderBy!]! = [PRIMARY_KEY_ASC] + ): CommentEdge +} + +"""All input for the create \`Comment\` mutation.""" +input CreateCommentInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + + """The \`Comment\` to be created by this mutation.""" + comment: CommentInput! +} + +"""An input for mutations affecting \`Comment\`""" +input CommentInput { + id: UUID + postId: UUID! + authorId: UUID! + parentId: UUID + content: String! + isApproved: Boolean + likesCount: Int + createdAt: Datetime + updatedAt: Datetime +} + +"""The output of our create \`Post\` mutation.""" +type CreatePostPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`Post\` that was created by this mutation.""" + post: Post + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`Post\`. May be used by Relay 1.""" + postEdge( + """The method to use when ordering \`Post\`.""" + orderBy: [PostOrderBy!]! = [PRIMARY_KEY_ASC] + ): PostEdge +} + +"""All input for the create \`Post\` mutation.""" +input CreatePostInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + + """The \`Post\` to be created by this mutation.""" + post: PostInput! +} + +"""An input for mutations affecting \`Post\`""" +input PostInput { + id: UUID + authorId: UUID! + title: String! + slug: String! + content: String + excerpt: String + isPublished: Boolean + publishedAt: Datetime + viewCount: Int + createdAt: Datetime + updatedAt: Datetime +} + +"""The output of our update \`PostTag\` mutation.""" +type UpdatePostTagPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`PostTag\` that was updated by this mutation.""" + postTag: PostTag + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`PostTag\`. May be used by Relay 1.""" + postTagEdge( + """The method to use when ordering \`PostTag\`.""" + orderBy: [PostTagOrderBy!]! = [PRIMARY_KEY_ASC] + ): PostTagEdge +} + +"""All input for the \`updatePostTag\` mutation.""" +input UpdatePostTagInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + id: UUID! + + """ + An object where the defined keys will be set on the \`PostTag\` being updated. + """ + postTagPatch: PostTagPatch! +} + +""" +Represents an update to a \`PostTag\`. Fields that are set will be updated. +""" +input PostTagPatch { + id: UUID + postId: UUID + tagId: UUID + createdAt: Datetime +} + +"""The output of our update \`Tag\` mutation.""" +type UpdateTagPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`Tag\` that was updated by this mutation.""" + tag: Tag + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`Tag\`. May be used by Relay 1.""" + tagEdge( + """The method to use when ordering \`Tag\`.""" + orderBy: [TagOrderBy!]! = [PRIMARY_KEY_ASC] + ): TagEdge +} + +"""All input for the \`updateTag\` mutation.""" +input UpdateTagInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + id: UUID! + + """ + An object where the defined keys will be set on the \`Tag\` being updated. + """ + tagPatch: TagPatch! +} + +"""Represents an update to a \`Tag\`. Fields that are set will be updated.""" +input TagPatch { + id: UUID + name: String + slug: String + description: String + color: String + createdAt: Datetime +} + +"""The output of our update \`User\` mutation.""" +type UpdateUserPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`User\` that was updated by this mutation.""" + user: User + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`User\`. May be used by Relay 1.""" + userEdge( + """The method to use when ordering \`User\`.""" + orderBy: [UserOrderBy!]! = [PRIMARY_KEY_ASC] + ): UserEdge +} + +"""All input for the \`updateUser\` mutation.""" +input UpdateUserInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + id: UUID! + + """ + An object where the defined keys will be set on the \`User\` being updated. + """ + userPatch: UserPatch! +} + +"""Represents an update to a \`User\`. Fields that are set will be updated.""" +input UserPatch { + id: UUID + email: String + username: String + displayName: String + bio: String + isActive: Boolean + role: String + createdAt: Datetime + updatedAt: Datetime +} + +"""The output of our update \`Comment\` mutation.""" +type UpdateCommentPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`Comment\` that was updated by this mutation.""" + comment: Comment + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`Comment\`. May be used by Relay 1.""" + commentEdge( + """The method to use when ordering \`Comment\`.""" + orderBy: [CommentOrderBy!]! = [PRIMARY_KEY_ASC] + ): CommentEdge +} + +"""All input for the \`updateComment\` mutation.""" +input UpdateCommentInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + id: UUID! + + """ + An object where the defined keys will be set on the \`Comment\` being updated. + """ + commentPatch: CommentPatch! +} + +""" +Represents an update to a \`Comment\`. Fields that are set will be updated. +""" +input CommentPatch { + id: UUID + postId: UUID + authorId: UUID + parentId: UUID + content: String + isApproved: Boolean + likesCount: Int + createdAt: Datetime + updatedAt: Datetime +} + +"""The output of our update \`Post\` mutation.""" +type UpdatePostPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`Post\` that was updated by this mutation.""" + post: Post + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`Post\`. May be used by Relay 1.""" + postEdge( + """The method to use when ordering \`Post\`.""" + orderBy: [PostOrderBy!]! = [PRIMARY_KEY_ASC] + ): PostEdge +} + +"""All input for the \`updatePost\` mutation.""" +input UpdatePostInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + id: UUID! + + """ + An object where the defined keys will be set on the \`Post\` being updated. + """ + postPatch: PostPatch! +} + +"""Represents an update to a \`Post\`. Fields that are set will be updated.""" +input PostPatch { + id: UUID + authorId: UUID + title: String + slug: String + content: String + excerpt: String + isPublished: Boolean + publishedAt: Datetime + viewCount: Int + createdAt: Datetime + updatedAt: Datetime +} + +"""The output of our delete \`PostTag\` mutation.""" +type DeletePostTagPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`PostTag\` that was deleted by this mutation.""" + postTag: PostTag + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`PostTag\`. May be used by Relay 1.""" + postTagEdge( + """The method to use when ordering \`PostTag\`.""" + orderBy: [PostTagOrderBy!]! = [PRIMARY_KEY_ASC] + ): PostTagEdge +} + +"""All input for the \`deletePostTag\` mutation.""" +input DeletePostTagInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + id: UUID! +} + +"""The output of our delete \`Tag\` mutation.""" +type DeleteTagPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`Tag\` that was deleted by this mutation.""" + tag: Tag + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`Tag\`. May be used by Relay 1.""" + tagEdge( + """The method to use when ordering \`Tag\`.""" + orderBy: [TagOrderBy!]! = [PRIMARY_KEY_ASC] + ): TagEdge +} + +"""All input for the \`deleteTag\` mutation.""" +input DeleteTagInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + id: UUID! +} + +"""The output of our delete \`User\` mutation.""" +type DeleteUserPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`User\` that was deleted by this mutation.""" + user: User + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`User\`. May be used by Relay 1.""" + userEdge( + """The method to use when ordering \`User\`.""" + orderBy: [UserOrderBy!]! = [PRIMARY_KEY_ASC] + ): UserEdge +} + +"""All input for the \`deleteUser\` mutation.""" +input DeleteUserInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + id: UUID! +} + +"""The output of our delete \`Comment\` mutation.""" +type DeleteCommentPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`Comment\` that was deleted by this mutation.""" + comment: Comment + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`Comment\`. May be used by Relay 1.""" + commentEdge( + """The method to use when ordering \`Comment\`.""" + orderBy: [CommentOrderBy!]! = [PRIMARY_KEY_ASC] + ): CommentEdge +} + +"""All input for the \`deleteComment\` mutation.""" +input DeleteCommentInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + id: UUID! +} + +"""The output of our delete \`Post\` mutation.""" +type DeletePostPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`Post\` that was deleted by this mutation.""" + post: Post + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`Post\`. May be used by Relay 1.""" + postEdge( + """The method to use when ordering \`Post\`.""" + orderBy: [PostOrderBy!]! = [PRIMARY_KEY_ASC] + ): PostEdge +} + +"""All input for the \`deletePost\` mutation.""" +input DeletePostInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + id: UUID! +}" +`; diff --git a/graphql/test/__tests__/__snapshots__/graphile-test.test.ts.snap b/graphql/test/__tests__/__snapshots__/graphile-test.test.ts.snap index 12c5cfd47..3a1aaf6d7 100644 --- a/graphql/test/__tests__/__snapshots__/graphile-test.test.ts.snap +++ b/graphql/test/__tests__/__snapshots__/graphile-test.test.ts.snap @@ -1 +1,4249 @@ // Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing + +exports[`introspection query snapshot: introspection 1`] = ` +{ + "data": { + "__schema": { + "directives": [ + { + "args": [ + { + "defaultValue": null, + "description": "Included when true.", + "name": "if", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null, + }, + }, + }, + ], + "description": "Directs the executor to include this field or fragment only when the \`if\` argument is true.", + "locations": [ + "FIELD", + "FRAGMENT_SPREAD", + "INLINE_FRAGMENT", + ], + "name": "include", + }, + { + "args": [ + { + "defaultValue": null, + "description": "Skipped when true.", + "name": "if", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null, + }, + }, + }, + ], + "description": "Directs the executor to skip this field or fragment when the \`if\` argument is true.", + "locations": [ + "FIELD", + "FRAGMENT_SPREAD", + "INLINE_FRAGMENT", + ], + "name": "skip", + }, + { + "args": [ + { + "defaultValue": ""No longer supported"", + "description": "Explains why this element was deprecated, usually also including a suggestion for how to access supported similar data. Formatted using the Markdown syntax, as specified by [CommonMark](https://commonmark.org/).", + "name": "reason", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + ], + "description": "Marks an element of a GraphQL schema as no longer supported.", + "locations": [ + "FIELD_DEFINITION", + "ARGUMENT_DEFINITION", + "INPUT_FIELD_DEFINITION", + "ENUM_VALUE", + ], + "name": "deprecated", + }, + { + "args": [ + { + "defaultValue": null, + "description": "The URL that specifies the behavior of this scalar.", + "name": "url", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + ], + "description": "Exposes a URL that specifies the behavior of this scalar.", + "locations": [ + "SCALAR", + ], + "name": "specifiedBy", + }, + { + "args": [], + "description": "Indicates exactly one field must be supplied and this field must not be \`null\`.", + "locations": [ + "INPUT_OBJECT", + ], + "name": "oneOf", + }, + ], + "mutationType": { + "name": "Mutation", + }, + "queryType": { + "name": "Query", + }, + "subscriptionType": null, + "types": [ + { + "description": "The root query type which gives access points into the data universe.", + "enumValues": null, + "fields": [ + { + "args": [ + { + "defaultValue": null, + "description": "Only read the first \`n\` values of the set.", + "name": "first", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Only read the last \`n\` values of the set.", + "name": "last", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor +based pagination. May not be used with \`last\`.", + "name": "offset", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Read all values in the set before (above) this cursor.", + "name": "before", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Read all values in the set after (below) this cursor.", + "name": "after", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "A filter to be used in determining which values should be returned by the collection.", + "name": "filter", + "type": { + "kind": "INPUT_OBJECT", + "name": "UserFilter", + "ofType": null, + }, + }, + { + "defaultValue": "[PRIMARY_KEY_ASC]", + "description": "The method to use when ordering \`User\`.", + "name": "orderBy", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "UserOrderBy", + "ofType": null, + }, + }, + }, + }, + ], + "deprecationReason": null, + "description": "Reads and enables pagination through a set of \`User\`.", + "isDeprecated": false, + "name": "users", + "type": { + "kind": "OBJECT", + "name": "UserConnection", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": "Metadata about the database schema, including tables, fields, indexes, and constraints. Useful for code generation tools.", + "isDeprecated": false, + "name": "_meta", + "type": { + "kind": "OBJECT", + "name": "MetaSchema", + "ofType": null, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "Query", + "possibleTypes": null, + }, + { + "description": "A connection to a list of \`User\` values.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "A list of \`User\` objects.", + "isDeprecated": false, + "name": "nodes", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "User", + "ofType": null, + }, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": "A list of edges which contains the \`User\` and cursor to aid in pagination.", + "isDeprecated": false, + "name": "edges", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "UserEdge", + "ofType": null, + }, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": "Information to aid in pagination.", + "isDeprecated": false, + "name": "pageInfo", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PageInfo", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": "The count of *all* \`User\` you could get from the connection.", + "isDeprecated": false, + "name": "totalCount", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null, + }, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "UserConnection", + "possibleTypes": null, + }, + { + "description": null, + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "username", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "User", + "possibleTypes": null, + }, + { + "description": "The \`Int\` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.", + "enumValues": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "SCALAR", + "name": "Int", + "possibleTypes": null, + }, + { + "description": "The \`String\` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.", + "enumValues": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "SCALAR", + "name": "String", + "possibleTypes": null, + }, + { + "description": "A \`User\` edge in the connection.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "A cursor for use in pagination.", + "isDeprecated": false, + "name": "cursor", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": "The \`User\` at the end of the edge.", + "isDeprecated": false, + "name": "node", + "type": { + "kind": "OBJECT", + "name": "User", + "ofType": null, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "UserEdge", + "possibleTypes": null, + }, + { + "description": "A location in a connection that can be used for resuming pagination.", + "enumValues": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "SCALAR", + "name": "Cursor", + "possibleTypes": null, + }, + { + "description": "Information about pagination in a connection.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "When paginating forwards, are there more items?", + "isDeprecated": false, + "name": "hasNextPage", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": "When paginating backwards, are there more items?", + "isDeprecated": false, + "name": "hasPreviousPage", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": "When paginating backwards, the cursor to continue.", + "isDeprecated": false, + "name": "startCursor", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": "When paginating forwards, the cursor to continue.", + "isDeprecated": false, + "name": "endCursor", + "type": { + "kind": "SCALAR", + "name": "Cursor", + "ofType": null, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "PageInfo", + "possibleTypes": null, + }, + { + "description": "The \`Boolean\` scalar type represents \`true\` or \`false\`.", + "enumValues": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "SCALAR", + "name": "Boolean", + "possibleTypes": null, + }, + { + "description": "A filter to be used against \`User\` object types. All fields are combined with a logical ‘and.’", + "enumValues": null, + "fields": null, + "inputFields": [ + { + "defaultValue": null, + "description": "Filter by the object’s \`id\` field.", + "name": "id", + "type": { + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Filter by the object’s \`username\` field.", + "name": "username", + "type": { + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Checks for all expressions in this list.", + "name": "and", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "UserFilter", + "ofType": null, + }, + }, + }, + }, + { + "defaultValue": null, + "description": "Checks for any expressions in this list.", + "name": "or", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "UserFilter", + "ofType": null, + }, + }, + }, + }, + { + "defaultValue": null, + "description": "Negates the expression.", + "name": "not", + "type": { + "kind": "INPUT_OBJECT", + "name": "UserFilter", + "ofType": null, + }, + }, + ], + "interfaces": null, + "kind": "INPUT_OBJECT", + "name": "UserFilter", + "possibleTypes": null, + }, + { + "description": "A filter to be used against Int fields. All fields are combined with a logical ‘and.’", + "enumValues": null, + "fields": null, + "inputFields": [ + { + "defaultValue": null, + "description": "Is null (if \`true\` is specified) or is not null (if \`false\` is specified).", + "name": "isNull", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Equal to the specified value.", + "name": "equalTo", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Not equal to the specified value.", + "name": "notEqualTo", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Not equal to the specified value, treating null like an ordinary value.", + "name": "distinctFrom", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Equal to the specified value, treating null like an ordinary value.", + "name": "notDistinctFrom", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Included in the specified list.", + "name": "in", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null, + }, + }, + }, + }, + { + "defaultValue": null, + "description": "Not included in the specified list.", + "name": "notIn", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null, + }, + }, + }, + }, + { + "defaultValue": null, + "description": "Less than the specified value.", + "name": "lessThan", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Less than or equal to the specified value.", + "name": "lessThanOrEqualTo", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Greater than the specified value.", + "name": "greaterThan", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Greater than or equal to the specified value.", + "name": "greaterThanOrEqualTo", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null, + }, + }, + ], + "interfaces": null, + "kind": "INPUT_OBJECT", + "name": "IntFilter", + "possibleTypes": null, + }, + { + "description": "A filter to be used against String fields. All fields are combined with a logical ‘and.’", + "enumValues": null, + "fields": null, + "inputFields": [ + { + "defaultValue": null, + "description": "Is null (if \`true\` is specified) or is not null (if \`false\` is specified).", + "name": "isNull", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Equal to the specified value.", + "name": "equalTo", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Not equal to the specified value.", + "name": "notEqualTo", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Not equal to the specified value, treating null like an ordinary value.", + "name": "distinctFrom", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Equal to the specified value, treating null like an ordinary value.", + "name": "notDistinctFrom", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Included in the specified list.", + "name": "in", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + }, + { + "defaultValue": null, + "description": "Not included in the specified list.", + "name": "notIn", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + }, + { + "defaultValue": null, + "description": "Less than the specified value.", + "name": "lessThan", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Less than or equal to the specified value.", + "name": "lessThanOrEqualTo", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Greater than the specified value.", + "name": "greaterThan", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Greater than or equal to the specified value.", + "name": "greaterThanOrEqualTo", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Contains the specified string (case-sensitive).", + "name": "includes", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Does not contain the specified string (case-sensitive).", + "name": "notIncludes", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Contains the specified string (case-insensitive).", + "name": "includesInsensitive", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Does not contain the specified string (case-insensitive).", + "name": "notIncludesInsensitive", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Starts with the specified string (case-sensitive).", + "name": "startsWith", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Does not start with the specified string (case-sensitive).", + "name": "notStartsWith", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Starts with the specified string (case-insensitive).", + "name": "startsWithInsensitive", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Does not start with the specified string (case-insensitive).", + "name": "notStartsWithInsensitive", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Ends with the specified string (case-sensitive).", + "name": "endsWith", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Does not end with the specified string (case-sensitive).", + "name": "notEndsWith", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Ends with the specified string (case-insensitive).", + "name": "endsWithInsensitive", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Does not end with the specified string (case-insensitive).", + "name": "notEndsWithInsensitive", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Matches the specified pattern (case-sensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters.", + "name": "like", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Does not match the specified pattern (case-sensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters.", + "name": "notLike", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Matches the specified pattern (case-insensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters.", + "name": "likeInsensitive", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Does not match the specified pattern (case-insensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters.", + "name": "notLikeInsensitive", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Equal to the specified value (case-insensitive).", + "name": "equalToInsensitive", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Not equal to the specified value (case-insensitive).", + "name": "notEqualToInsensitive", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Not equal to the specified value, treating null like an ordinary value (case-insensitive).", + "name": "distinctFromInsensitive", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Equal to the specified value, treating null like an ordinary value (case-insensitive).", + "name": "notDistinctFromInsensitive", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Included in the specified list (case-insensitive).", + "name": "inInsensitive", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + }, + { + "defaultValue": null, + "description": "Not included in the specified list (case-insensitive).", + "name": "notInInsensitive", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + }, + { + "defaultValue": null, + "description": "Less than the specified value (case-insensitive).", + "name": "lessThanInsensitive", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Less than or equal to the specified value (case-insensitive).", + "name": "lessThanOrEqualToInsensitive", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Greater than the specified value (case-insensitive).", + "name": "greaterThanInsensitive", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "Greater than or equal to the specified value (case-insensitive).", + "name": "greaterThanOrEqualToInsensitive", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + ], + "interfaces": null, + "kind": "INPUT_OBJECT", + "name": "StringFilter", + "possibleTypes": null, + }, + { + "description": "Methods to use when ordering \`User\`.", + "enumValues": [ + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "NATURAL", + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "PRIMARY_KEY_ASC", + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "PRIMARY_KEY_DESC", + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "ID_ASC", + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "ID_DESC", + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "USERNAME_ASC", + }, + { + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "USERNAME_DESC", + }, + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "UserOrderBy", + "possibleTypes": null, + }, + { + "description": "Root meta schema type", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "tables", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaTable", + "ofType": null, + }, + }, + }, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "MetaSchema", + "possibleTypes": null, + }, + { + "description": "Information about a database table", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "name", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "schemaName", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "fields", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaField", + "ofType": null, + }, + }, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "indexes", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaIndex", + "ofType": null, + }, + }, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "constraints", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaConstraints", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "foreignKeyConstraints", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaForeignKeyConstraint", + "ofType": null, + }, + }, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "primaryKeyConstraints", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaPrimaryKeyConstraint", + "ofType": null, + }, + }, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "uniqueConstraints", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaUniqueConstraint", + "ofType": null, + }, + }, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "relations", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaRelations", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "inflection", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaInflection", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "query", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaQuery", + "ofType": null, + }, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "MetaTable", + "possibleTypes": null, + }, + { + "description": "Information about a table field/column", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "name", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "type", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaType", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "isNotNull", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "hasDefault", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null, + }, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "MetaField", + "possibleTypes": null, + }, + { + "description": "Information about a PostgreSQL type", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "pgType", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "gqlType", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "isArray", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "isNotNull", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "hasDefault", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "MetaType", + "possibleTypes": null, + }, + { + "description": "Information about a database index", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "name", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "isUnique", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "isPrimary", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "columns", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "fields", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaField", + "ofType": null, + }, + }, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "MetaIndex", + "possibleTypes": null, + }, + { + "description": "Table constraints", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "primaryKey", + "type": { + "kind": "OBJECT", + "name": "MetaPrimaryKeyConstraint", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "unique", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaUniqueConstraint", + "ofType": null, + }, + }, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "foreignKey", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaForeignKeyConstraint", + "ofType": null, + }, + }, + }, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "MetaConstraints", + "possibleTypes": null, + }, + { + "description": "Information about a primary key constraint", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "name", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "fields", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaField", + "ofType": null, + }, + }, + }, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "MetaPrimaryKeyConstraint", + "possibleTypes": null, + }, + { + "description": "Information about a unique constraint", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "name", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "fields", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaField", + "ofType": null, + }, + }, + }, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "MetaUniqueConstraint", + "possibleTypes": null, + }, + { + "description": "Information about a foreign key constraint", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "name", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "fields", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaField", + "ofType": null, + }, + }, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "referencedTable", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "referencedFields", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "refFields", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaField", + "ofType": null, + }, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "refTable", + "type": { + "kind": "OBJECT", + "name": "MetaRefTable", + "ofType": null, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "MetaForeignKeyConstraint", + "possibleTypes": null, + }, + { + "description": "Reference to a related table", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "name", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "MetaRefTable", + "possibleTypes": null, + }, + { + "description": "Table relations", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "belongsTo", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaBelongsToRelation", + "ofType": null, + }, + }, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "has", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaHasRelation", + "ofType": null, + }, + }, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "hasOne", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaHasRelation", + "ofType": null, + }, + }, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "hasMany", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaHasRelation", + "ofType": null, + }, + }, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "manyToMany", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaManyToManyRelation", + "ofType": null, + }, + }, + }, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "MetaRelations", + "possibleTypes": null, + }, + { + "description": "A belongs-to (forward FK) relation", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "fieldName", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "isUnique", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "type", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "keys", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaField", + "ofType": null, + }, + }, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "references", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaRefTable", + "ofType": null, + }, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "MetaBelongsToRelation", + "possibleTypes": null, + }, + { + "description": "A has-one or has-many (reverse FK) relation", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "fieldName", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "isUnique", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "type", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "keys", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaField", + "ofType": null, + }, + }, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "referencedBy", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaRefTable", + "ofType": null, + }, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "MetaHasRelation", + "possibleTypes": null, + }, + { + "description": "A many-to-many relation via junction table", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "fieldName", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "type", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "junctionTable", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaRefTable", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "junctionLeftConstraint", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaForeignKeyConstraint", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "junctionLeftKeyAttributes", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaField", + "ofType": null, + }, + }, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "junctionRightConstraint", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaForeignKeyConstraint", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "junctionRightKeyAttributes", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaField", + "ofType": null, + }, + }, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "leftKeyAttributes", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaField", + "ofType": null, + }, + }, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "rightKeyAttributes", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaField", + "ofType": null, + }, + }, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "rightTable", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "MetaRefTable", + "ofType": null, + }, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "MetaManyToManyRelation", + "possibleTypes": null, + }, + { + "description": "Table inflection names", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "tableType", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "allRows", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "connection", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "edge", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "filterType", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "orderByType", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "conditionType", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "patchType", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "createInputType", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "createPayloadType", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "updatePayloadType", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "deletePayloadType", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "MetaInflection", + "possibleTypes": null, + }, + { + "description": "Table query/mutation names", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "all", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "one", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "create", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "update", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "delete", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "MetaQuery", + "possibleTypes": null, + }, + { + "description": "The root mutation type which contains root level fields which mutate data.", + "enumValues": null, + "fields": [ + { + "args": [ + { + "defaultValue": null, + "description": "The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields.", + "name": "input", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CreateUserInput", + "ofType": null, + }, + }, + }, + ], + "deprecationReason": null, + "description": "Creates a single \`User\`.", + "isDeprecated": false, + "name": "createUser", + "type": { + "kind": "OBJECT", + "name": "CreateUserPayload", + "ofType": null, + }, + }, + { + "args": [ + { + "defaultValue": null, + "description": "The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields.", + "name": "input", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "UpdateUserInput", + "ofType": null, + }, + }, + }, + ], + "deprecationReason": null, + "description": "Updates a single \`User\` using a unique key and a patch.", + "isDeprecated": false, + "name": "updateUser", + "type": { + "kind": "OBJECT", + "name": "UpdateUserPayload", + "ofType": null, + }, + }, + { + "args": [ + { + "defaultValue": null, + "description": "The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields.", + "name": "input", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "DeleteUserInput", + "ofType": null, + }, + }, + }, + ], + "deprecationReason": null, + "description": "Deletes a single \`User\` using a unique key.", + "isDeprecated": false, + "name": "deleteUser", + "type": { + "kind": "OBJECT", + "name": "DeleteUserPayload", + "ofType": null, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "Mutation", + "possibleTypes": null, + }, + { + "description": "The output of our create \`User\` mutation.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "The exact same \`clientMutationId\` that was provided in the mutation input, +unchanged and unused. May be used by a client to track mutations.", + "isDeprecated": false, + "name": "clientMutationId", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": "The \`User\` that was created by this mutation.", + "isDeprecated": false, + "name": "user", + "type": { + "kind": "OBJECT", + "name": "User", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": "Our root query field type. Allows us to run any query from our mutation payload.", + "isDeprecated": false, + "name": "query", + "type": { + "kind": "OBJECT", + "name": "Query", + "ofType": null, + }, + }, + { + "args": [ + { + "defaultValue": "[PRIMARY_KEY_ASC]", + "description": "The method to use when ordering \`User\`.", + "name": "orderBy", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "UserOrderBy", + "ofType": null, + }, + }, + }, + }, + }, + ], + "deprecationReason": null, + "description": "An edge for our \`User\`. May be used by Relay 1.", + "isDeprecated": false, + "name": "userEdge", + "type": { + "kind": "OBJECT", + "name": "UserEdge", + "ofType": null, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "CreateUserPayload", + "possibleTypes": null, + }, + { + "description": "All input for the create \`User\` mutation.", + "enumValues": null, + "fields": null, + "inputFields": [ + { + "defaultValue": null, + "description": "An arbitrary string value with no semantic meaning. Will be included in the +payload verbatim. May be used to track mutations by the client.", + "name": "clientMutationId", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": "The \`User\` to be created by this mutation.", + "name": "user", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "UserInput", + "ofType": null, + }, + }, + }, + ], + "interfaces": null, + "kind": "INPUT_OBJECT", + "name": "CreateUserInput", + "possibleTypes": null, + }, + { + "description": "An input for mutations affecting \`User\`", + "enumValues": null, + "fields": null, + "inputFields": [ + { + "defaultValue": null, + "description": null, + "name": "id", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": null, + "name": "username", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + ], + "interfaces": null, + "kind": "INPUT_OBJECT", + "name": "UserInput", + "possibleTypes": null, + }, + { + "description": "The output of our update \`User\` mutation.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "The exact same \`clientMutationId\` that was provided in the mutation input, +unchanged and unused. May be used by a client to track mutations.", + "isDeprecated": false, + "name": "clientMutationId", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": "The \`User\` that was updated by this mutation.", + "isDeprecated": false, + "name": "user", + "type": { + "kind": "OBJECT", + "name": "User", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": "Our root query field type. Allows us to run any query from our mutation payload.", + "isDeprecated": false, + "name": "query", + "type": { + "kind": "OBJECT", + "name": "Query", + "ofType": null, + }, + }, + { + "args": [ + { + "defaultValue": "[PRIMARY_KEY_ASC]", + "description": "The method to use when ordering \`User\`.", + "name": "orderBy", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "UserOrderBy", + "ofType": null, + }, + }, + }, + }, + }, + ], + "deprecationReason": null, + "description": "An edge for our \`User\`. May be used by Relay 1.", + "isDeprecated": false, + "name": "userEdge", + "type": { + "kind": "OBJECT", + "name": "UserEdge", + "ofType": null, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "UpdateUserPayload", + "possibleTypes": null, + }, + { + "description": "All input for the \`updateUser\` mutation.", + "enumValues": null, + "fields": null, + "inputFields": [ + { + "defaultValue": null, + "description": "An arbitrary string value with no semantic meaning. Will be included in the +payload verbatim. May be used to track mutations by the client.", + "name": "clientMutationId", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": null, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null, + }, + }, + }, + { + "defaultValue": null, + "description": "An object where the defined keys will be set on the \`User\` being updated.", + "name": "userPatch", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "UserPatch", + "ofType": null, + }, + }, + }, + ], + "interfaces": null, + "kind": "INPUT_OBJECT", + "name": "UpdateUserInput", + "possibleTypes": null, + }, + { + "description": "Represents an update to a \`User\`. Fields that are set will be updated.", + "enumValues": null, + "fields": null, + "inputFields": [ + { + "defaultValue": null, + "description": null, + "name": "id", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": null, + "name": "username", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + ], + "interfaces": null, + "kind": "INPUT_OBJECT", + "name": "UserPatch", + "possibleTypes": null, + }, + { + "description": "The output of our delete \`User\` mutation.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": "The exact same \`clientMutationId\` that was provided in the mutation input, +unchanged and unused. May be used by a client to track mutations.", + "isDeprecated": false, + "name": "clientMutationId", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": "The \`User\` that was deleted by this mutation.", + "isDeprecated": false, + "name": "user", + "type": { + "kind": "OBJECT", + "name": "User", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": "Our root query field type. Allows us to run any query from our mutation payload.", + "isDeprecated": false, + "name": "query", + "type": { + "kind": "OBJECT", + "name": "Query", + "ofType": null, + }, + }, + { + "args": [ + { + "defaultValue": "[PRIMARY_KEY_ASC]", + "description": "The method to use when ordering \`User\`.", + "name": "orderBy", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "UserOrderBy", + "ofType": null, + }, + }, + }, + }, + }, + ], + "deprecationReason": null, + "description": "An edge for our \`User\`. May be used by Relay 1.", + "isDeprecated": false, + "name": "userEdge", + "type": { + "kind": "OBJECT", + "name": "UserEdge", + "ofType": null, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "DeleteUserPayload", + "possibleTypes": null, + }, + { + "description": "All input for the \`deleteUser\` mutation.", + "enumValues": null, + "fields": null, + "inputFields": [ + { + "defaultValue": null, + "description": "An arbitrary string value with no semantic meaning. Will be included in the +payload verbatim. May be used to track mutations by the client.", + "name": "clientMutationId", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "defaultValue": null, + "description": null, + "name": "id", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null, + }, + }, + }, + ], + "interfaces": null, + "kind": "INPUT_OBJECT", + "name": "DeleteUserInput", + "possibleTypes": null, + }, + { + "description": "A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, as well as the entry points for query, mutation, and subscription operations.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "description", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": "A list of all types supported by this server.", + "isDeprecated": false, + "name": "types", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null, + }, + }, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": "The type that query operations will be rooted at.", + "isDeprecated": false, + "name": "queryType", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": "If this server supports mutation, the type that mutation operations will be rooted at.", + "isDeprecated": false, + "name": "mutationType", + "type": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": "If this server support subscription, the type that subscription operations will be rooted at.", + "isDeprecated": false, + "name": "subscriptionType", + "type": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": "A list of all directives supported by this server.", + "isDeprecated": false, + "name": "directives", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Directive", + "ofType": null, + }, + }, + }, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "__Schema", + "possibleTypes": null, + }, + { + "description": "The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in GraphQL as represented by the \`__TypeKind\` enum. + +Depending on the kind of a type, certain fields describe information about that type. Scalar types provide no information beyond a name, description and optional \`specifiedByURL\`, while Enum types provide their values. Object and Interface types provide the fields they describe. Abstract types, Union and Interface, provide the Object types possible at runtime. List and NonNull types compose other types.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "kind", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "__TypeKind", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "name", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "description", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "specifiedByURL", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "args": [ + { + "defaultValue": "false", + "description": null, + "name": "includeDeprecated", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null, + }, + }, + ], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "fields", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Field", + "ofType": null, + }, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "interfaces", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null, + }, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "possibleTypes", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null, + }, + }, + }, + }, + { + "args": [ + { + "defaultValue": "false", + "description": null, + "name": "includeDeprecated", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null, + }, + }, + ], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "enumValues", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__EnumValue", + "ofType": null, + }, + }, + }, + }, + { + "args": [ + { + "defaultValue": "false", + "description": null, + "name": "includeDeprecated", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null, + }, + }, + ], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "inputFields", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__InputValue", + "ofType": null, + }, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "ofType", + "type": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "isOneOf", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "__Type", + "possibleTypes": null, + }, + { + "description": "An enum describing what kind of type a given \`__Type\` is.", + "enumValues": [ + { + "deprecationReason": null, + "description": "Indicates this type is a scalar.", + "isDeprecated": false, + "name": "SCALAR", + }, + { + "deprecationReason": null, + "description": "Indicates this type is an object. \`fields\` and \`interfaces\` are valid fields.", + "isDeprecated": false, + "name": "OBJECT", + }, + { + "deprecationReason": null, + "description": "Indicates this type is an interface. \`fields\`, \`interfaces\`, and \`possibleTypes\` are valid fields.", + "isDeprecated": false, + "name": "INTERFACE", + }, + { + "deprecationReason": null, + "description": "Indicates this type is a union. \`possibleTypes\` is a valid field.", + "isDeprecated": false, + "name": "UNION", + }, + { + "deprecationReason": null, + "description": "Indicates this type is an enum. \`enumValues\` is a valid field.", + "isDeprecated": false, + "name": "ENUM", + }, + { + "deprecationReason": null, + "description": "Indicates this type is an input object. \`inputFields\` is a valid field.", + "isDeprecated": false, + "name": "INPUT_OBJECT", + }, + { + "deprecationReason": null, + "description": "Indicates this type is a list. \`ofType\` is a valid field.", + "isDeprecated": false, + "name": "LIST", + }, + { + "deprecationReason": null, + "description": "Indicates this type is a non-null. \`ofType\` is a valid field.", + "isDeprecated": false, + "name": "NON_NULL", + }, + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "__TypeKind", + "possibleTypes": null, + }, + { + "description": "Object and Interface types are described by a list of Fields, each of which has a name, potentially a list of arguments, and a return type.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "name", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "description", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "args": [ + { + "defaultValue": "false", + "description": null, + "name": "includeDeprecated", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null, + }, + }, + ], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "args", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__InputValue", + "ofType": null, + }, + }, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "type", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "isDeprecated", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "deprecationReason", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "__Field", + "possibleTypes": null, + }, + { + "description": "Arguments provided to Fields or Directives and the input fields of an InputObject are represented as Input Values which describe their type and optionally a default value.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "name", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "description", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "type", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__Type", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": "A GraphQL-formatted string representing the default value for this input value.", + "isDeprecated": false, + "name": "defaultValue", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "isDeprecated", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "deprecationReason", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "__InputValue", + "possibleTypes": null, + }, + { + "description": "One possible value for a given Enum. Enum values are unique values, not a placeholder for a string or numeric value. However an Enum value is returned in a JSON response as a string.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "name", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "description", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "isDeprecated", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "deprecationReason", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "__EnumValue", + "possibleTypes": null, + }, + { + "description": "A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document. + +In some cases, you need to provide options to alter GraphQL's execution behavior in ways field arguments will not suffice, such as conditionally including or skipping a field. Directives provide this by describing additional information to the executor.", + "enumValues": null, + "fields": [ + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "name", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "description", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "isRepeatable", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null, + }, + }, + }, + { + "args": [], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "locations", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "__DirectiveLocation", + "ofType": null, + }, + }, + }, + }, + }, + { + "args": [ + { + "defaultValue": "false", + "description": null, + "name": "includeDeprecated", + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null, + }, + }, + ], + "deprecationReason": null, + "description": null, + "isDeprecated": false, + "name": "args", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "__InputValue", + "ofType": null, + }, + }, + }, + }, + }, + ], + "inputFields": null, + "interfaces": [], + "kind": "OBJECT", + "name": "__Directive", + "possibleTypes": null, + }, + { + "description": "A Directive can be adjacent to many parts of the GraphQL language, a __DirectiveLocation describes one such possible adjacencies.", + "enumValues": [ + { + "deprecationReason": null, + "description": "Location adjacent to a query operation.", + "isDeprecated": false, + "name": "QUERY", + }, + { + "deprecationReason": null, + "description": "Location adjacent to a mutation operation.", + "isDeprecated": false, + "name": "MUTATION", + }, + { + "deprecationReason": null, + "description": "Location adjacent to a subscription operation.", + "isDeprecated": false, + "name": "SUBSCRIPTION", + }, + { + "deprecationReason": null, + "description": "Location adjacent to a field.", + "isDeprecated": false, + "name": "FIELD", + }, + { + "deprecationReason": null, + "description": "Location adjacent to a fragment definition.", + "isDeprecated": false, + "name": "FRAGMENT_DEFINITION", + }, + { + "deprecationReason": null, + "description": "Location adjacent to a fragment spread.", + "isDeprecated": false, + "name": "FRAGMENT_SPREAD", + }, + { + "deprecationReason": null, + "description": "Location adjacent to an inline fragment.", + "isDeprecated": false, + "name": "INLINE_FRAGMENT", + }, + { + "deprecationReason": null, + "description": "Location adjacent to a variable definition.", + "isDeprecated": false, + "name": "VARIABLE_DEFINITION", + }, + { + "deprecationReason": null, + "description": "Location adjacent to a schema definition.", + "isDeprecated": false, + "name": "SCHEMA", + }, + { + "deprecationReason": null, + "description": "Location adjacent to a scalar definition.", + "isDeprecated": false, + "name": "SCALAR", + }, + { + "deprecationReason": null, + "description": "Location adjacent to an object type definition.", + "isDeprecated": false, + "name": "OBJECT", + }, + { + "deprecationReason": null, + "description": "Location adjacent to a field definition.", + "isDeprecated": false, + "name": "FIELD_DEFINITION", + }, + { + "deprecationReason": null, + "description": "Location adjacent to an argument definition.", + "isDeprecated": false, + "name": "ARGUMENT_DEFINITION", + }, + { + "deprecationReason": null, + "description": "Location adjacent to an interface definition.", + "isDeprecated": false, + "name": "INTERFACE", + }, + { + "deprecationReason": null, + "description": "Location adjacent to a union definition.", + "isDeprecated": false, + "name": "UNION", + }, + { + "deprecationReason": null, + "description": "Location adjacent to an enum definition.", + "isDeprecated": false, + "name": "ENUM", + }, + { + "deprecationReason": null, + "description": "Location adjacent to an enum value definition.", + "isDeprecated": false, + "name": "ENUM_VALUE", + }, + { + "deprecationReason": null, + "description": "Location adjacent to an input object type definition.", + "isDeprecated": false, + "name": "INPUT_OBJECT", + }, + { + "deprecationReason": null, + "description": "Location adjacent to an input object field definition.", + "isDeprecated": false, + "name": "INPUT_FIELD_DEFINITION", + }, + ], + "fields": null, + "inputFields": null, + "interfaces": null, + "kind": "ENUM", + "name": "__DirectiveLocation", + "possibleTypes": null, + }, + ], + }, + }, +} +`; From 5207254ad96ec30100e93f6268137eaede1e4387 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Fri, 13 Mar 2026 00:58:26 +0000 Subject: [PATCH 13/19] fix: migrate remaining condition queries to filter, register filterBy behavior for pgCodecRelation, update schema snapshot with relation filter types --- functions/send-email-link/src/index.ts | 6 +- ...ConnectionFilterBackwardRelationsPlugin.ts | 9 + .../src/__tests__/integration.test.ts | 6 +- .../schema-snapshot.test.ts.snap | 459 ++++++++++++------ .../__tests__/jobs.e2e.test.ts | 2 +- 5 files changed, 317 insertions(+), 165 deletions(-) diff --git a/functions/send-email-link/src/index.ts b/functions/send-email-link/src/index.ts index e8e04c16b..0f056b2e0 100644 --- a/functions/send-email-link/src/index.ts +++ b/functions/send-email-link/src/index.ts @@ -14,7 +14,7 @@ const app = createJobApp(); const GetUser = gql` query GetUser($userId: UUID!) { - users(condition: { id: $userId }, first: 1) { + users(filter: { id: { equalTo: $userId } }, first: 1) { nodes { username displayName @@ -26,7 +26,7 @@ const GetUser = gql` const GetDatabaseInfo = gql` query GetDatabaseInfo($databaseId: UUID!) { - databases(condition: { id: $databaseId }, first: 1) { + databases(filter: { id: { equalTo: $databaseId } }, first: 1) { nodes { sites { nodes { @@ -43,7 +43,7 @@ const GetDatabaseInfo = gql` theme } } - siteModules(condition: { name: "legal_terms_module" }) { + siteModules(filter: { name: { equalTo: "legal_terms_module" } }) { nodes { data } diff --git a/graphile/graphile-connection-filter/src/plugins/ConnectionFilterBackwardRelationsPlugin.ts b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterBackwardRelationsPlugin.ts index 0f596ada2..59b0d5658 100644 --- a/graphile/graphile-connection-filter/src/plugins/ConnectionFilterBackwardRelationsPlugin.ts +++ b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterBackwardRelationsPlugin.ts @@ -76,6 +76,15 @@ export const ConnectionFilterBackwardRelationsPlugin: GraphileConfig.Plugin = { }, schema: { + behaviorRegistry: { + add: { + filterBy: { + description: 'Whether a relation should be available as a filter field', + entities: ['pgCodecRelation'], + }, + }, + }, + entityBehavior: { pgCodecRelation: 'filterBy', }, diff --git a/graphile/graphile-pgvector-plugin/src/__tests__/integration.test.ts b/graphile/graphile-pgvector-plugin/src/__tests__/integration.test.ts index 12dfbab0c..7f53056a8 100644 --- a/graphile/graphile-pgvector-plugin/src/__tests__/integration.test.ts +++ b/graphile/graphile-pgvector-plugin/src/__tests__/integration.test.ts @@ -3,6 +3,7 @@ import { getConnections, seed } from 'graphile-test'; import type { GraphQLResponse } from 'graphile-test'; import type { PgTestClient } from 'pgsql-test'; import { VectorCodecPreset } from '../vector-codec'; +import { ConnectionFilterPreset } from 'graphile-connection-filter'; interface DocumentResult { allDocuments: { @@ -49,6 +50,7 @@ describe('graphile-pgvector-plugin integration', () => { const testPreset = { extends: [ VectorCodecPreset, + ConnectionFilterPreset(), ], }; @@ -119,7 +121,7 @@ describe('graphile-pgvector-plugin integration', () => { it('returns correct vector values', async () => { const result = await query(` query { - allDocuments(condition: { title: "Document A" }) { + allDocuments(filter: { title: { equalTo: "Document A" } }) { nodes { title embedding @@ -263,7 +265,7 @@ describe('graphile-pgvector-plugin integration', () => { // Read it back const readResult = await query(` query($rowId: Int!) { - allDocuments(condition: { rowId: $rowId }) { + allDocuments(filter: { rowId: { equalTo: $rowId } }) { nodes { embedding } diff --git a/graphql/server-test/__tests__/__snapshots__/schema-snapshot.test.ts.snap b/graphql/server-test/__tests__/__snapshots__/schema-snapshot.test.ts.snap index 2d958381a..eb458244a 100644 --- a/graphql/server-test/__tests__/__snapshots__/schema-snapshot.test.ts.snap +++ b/graphql/server-test/__tests__/__snapshots__/schema-snapshot.test.ts.snap @@ -472,14 +472,29 @@ input PostFilter { """Checks for all expressions in this list.""" and: [PostFilter!] - """Checks for any expressions in this list.""" - or: [PostFilter!] +"""Checks for any expressions in this list.""" +or: [PostFilter!] +"""Negates the expression.""" +not: PostFilter - """Negates the expression.""" - not: PostFilter -} + """Filter by the object’s `author` relation.""" + author: UserFilter -""" + """Filter by the object’s `postTags` relation.""" + postTags: PostToManyPostTagFilter + + """`postTags` exist.""" + postTagsExist: Boolean + + """Filter by the object’s `comments` relation.""" + comments: PostToManyCommentFilter + + """`comments` exist.""" + commentsExist: Boolean + } + """ + A filter to be used against UUID fields. All fields are combined with a logical ‘and.’ + """ A filter to be used against UUID fields. All fields are combined with a logical ‘and.’ """ input UUIDFilter { @@ -772,80 +787,213 @@ input IntFilter { """Less than or equal to the specified value.""" lessThanOrEqualTo: Int - """Greater than the specified value.""" - greaterThan: Int +"""Greater than the specified value.""" +greaterThan: Int +"""Greater than or equal to the specified value.""" +greaterThanOrEqualTo: Int +} - """Greater than or equal to the specified value.""" - greaterThanOrEqualTo: Int +""" +A filter to be used against `User` object types. All fields are combined with a logical ‘and.’ +""" +input UserFilter { + """Filter by the object’s `id` field.""" + id: UUIDFilter + + """Filter by the object’s `email` field.""" + email: StringFilter + + """Filter by the object’s `username` field.""" + username: StringFilter + + """Filter by the object’s `displayName` field.""" + displayName: StringFilter + + """Filter by the object’s `bio` field.""" + bio: StringFilter + + """Filter by the object’s `isActive` field.""" + isActive: BooleanFilter + + """Filter by the object’s `role` field.""" + role: StringFilter + + """Filter by the object’s `createdAt` field.""" + createdAt: DatetimeFilter + + """Filter by the object’s `updatedAt` field.""" + updatedAt: DatetimeFilter + + """Checks for all expressions in this list.""" + and: [UserFilter!] + + """Checks for any expressions in this list.""" + or: [UserFilter!] + + """Negates the expression.""" + not: UserFilter + + """Filter by the object’s `authoredPosts` relation.""" + authoredPosts: UserToManyPostFilter + + """`authoredPosts` exist.""" + authoredPostsExist: Boolean + + """Filter by the object’s `authoredComments` relation.""" + authoredComments: UserToManyCommentFilter + + """`authoredComments` exist.""" + authoredCommentsExist: Boolean } -"""Methods to use when ordering \`Post\`.""" -enum PostOrderBy { - NATURAL - PRIMARY_KEY_ASC - PRIMARY_KEY_DESC - ID_ASC - ID_DESC - AUTHOR_ID_ASC - AUTHOR_ID_DESC - SLUG_ASC - SLUG_DESC - PUBLISHED_AT_ASC - PUBLISHED_AT_DESC - CREATED_AT_ASC - CREATED_AT_DESC +""" +A filter to be used against many `Post` object types. All fields are combined with a logical ‘and.’ +""" +input UserToManyPostFilter { + """Filters to entities where at least one related entity matches.""" + some: PostFilter + + """Filters to entities where every related entity matches.""" + every: PostFilter + + """Filters to entities where no related entity matches.""" + none: PostFilter + } + +""" +A filter to be used against many `Comment` object types. All fields are combined with a logical ‘and.’ +""" +input UserToManyCommentFilter { + """Filters to entities where at least one related entity matches.""" + some: CommentFilter + + """Filters to entities where every related entity matches.""" + every: CommentFilter + """Filters to entities where no related entity matches.""" + none: CommentFilter } """ -A filter to be used against \`PostTag\` object types. All fields are combined with a logical ‘and.’ +A filter to be used against `Comment` object types. All fields are combined with a logical ‘and.’ """ -input PostTagFilter { - """Filter by the object’s \`id\` field.""" +input CommentFilter { + """Filter by the object’s `id` field.""" id: UUIDFilter - """Filter by the object’s \`postId\` field.""" + """Filter by the object’s `postId` field.""" postId: UUIDFilter - """Filter by the object’s \`tagId\` field.""" - tagId: UUIDFilter + """Filter by the object’s `authorId` field.""" + authorId: UUIDFilter - """Filter by the object’s \`createdAt\` field.""" + """Filter by the object’s `parentId` field.""" + parentId: UUIDFilter + + """Filter by the object’s `content` field.""" + content: StringFilter + + """Filter by the object’s `isApproved` field.""" + isApproved: BooleanFilter + + """Filter by the object’s `likesCount` field.""" + likesCount: IntFilter + + """Filter by the object’s `createdAt` field.""" createdAt: DatetimeFilter + """Filter by the object’s `updatedAt` field.""" + updatedAt: DatetimeFilter + """Checks for all expressions in this list.""" - and: [PostTagFilter!] + and: [CommentFilter!] """Checks for any expressions in this list.""" - or: [PostTagFilter!] + or: [CommentFilter!] """Negates the expression.""" - not: PostTagFilter -} + not: CommentFilter -"""Methods to use when ordering \`PostTag\`.""" -enum PostTagOrderBy { - NATURAL - PRIMARY_KEY_ASC - PRIMARY_KEY_DESC - ID_ASC - ID_DESC - POST_ID_ASC - POST_ID_DESC - TAG_ID_ASC - TAG_ID_DESC + """Filter by the object’s `author` relation.""" + author: UserFilter + + """Filter by the object’s `parent` relation.""" + parent: CommentFilter + + """A related `parent` exists.""" + parentExists: Boolean + + """Filter by the object’s `post` relation.""" + post: PostFilter + + """Filter by the object’s `childComments` relation.""" + childComments: CommentToManyCommentFilter + + """`childComments` exist.""" + childCommentsExist: Boolean } -"""A \`Tag\` edge in the connection, with data from \`PostTag\`.""" -type PostTagsManyToManyEdge { - """A cursor for use in pagination.""" - cursor: Cursor +""" +A filter to be used against many `Comment` object types. All fields are combined with a logical ‘and.’ +""" +input CommentToManyCommentFilter { + """Filters to entities where at least one related entity matches.""" + some: CommentFilter - """The \`Tag\` at the end of the edge.""" - node: Tag - id: UUID! - createdAt: Datetime + """Filters to entities where every related entity matches.""" + every: CommentFilter + + """Filters to entities where no related entity matches.""" + none: CommentFilter } +""" +A filter to be used against many `PostTag` object types. All fields are combined with a logical ‘and.’ +""" +input PostToManyPostTagFilter { + """Filters to entities where at least one related entity matches.""" + some: PostTagFilter + + """Filters to entities where every related entity matches.""" + every: PostTagFilter + + """Filters to entities where no related entity matches.""" + none: PostTagFilter + } + """ + A filter to be used against `PostTag` object types. All fields are combined with a logical ‘and.’ + """ +""" +A filter to be used against \`PostTag\` object types. All fields are combined with a logical ‘and.’ +""" +input PostTagFilter { + """Filter by the object’s \`id\` field.""" + id: UUIDFilter + + """Filter by the object’s \`postId\` field.""" + postId: UUIDFilter + + """Filter by the object’s \`tagId\` field.""" + tagId: UUIDFilter + + """Filter by the object’s \`createdAt\` field.""" + createdAt: DatetimeFilter + + """Checks for all expressions in this list.""" + and: [PostTagFilter!] + +"""Checks for any expressions in this list.""" +or: [PostTagFilter!] +"""Negates the expression.""" +not: PostTagFilter + """Filter by the object’s `post` relation.""" + post: PostFilter + """Filter by the object’s `tag` relation.""" + tag: TagFilter + } + """ + A filter to be used against `Tag` object types. All fields are combined with a logical ‘and.’ + """ + """ A filter to be used against \`Tag\` object types. All fields are combined with a logical ‘and.’ """ @@ -871,16 +1019,91 @@ input TagFilter { """Checks for all expressions in this list.""" and: [TagFilter!] - """Checks for any expressions in this list.""" - or: [TagFilter!] +"""Checks for any expressions in this list.""" +or: [TagFilter!] +"""Negates the expression.""" +not: TagFilter - """Negates the expression.""" - not: TagFilter + """Filter by the object’s `postTags` relation.""" + postTags: TagToManyPostTagFilter + + """`postTags` exist.""" + postTagsExist: Boolean +} + +""" +A filter to be used against many `PostTag` object types. All fields are combined with a logical ‘and.’ +""" +input TagToManyPostTagFilter { + """Filters to entities where at least one related entity matches.""" + some: PostTagFilter + + """Filters to entities where every related entity matches.""" + every: PostTagFilter + + """Filters to entities where no related entity matches.""" + none: PostTagFilter +} + +""" +A filter to be used against many `Comment` object types. All fields are combined with a logical ‘and.’ +""" +input PostToManyCommentFilter { + """Filters to entities where at least one related entity matches.""" + some: CommentFilter + + """Filters to entities where every related entity matches.""" + every: CommentFilter + + """Filters to entities where no related entity matches.""" + none: CommentFilter } -"""Methods to use when ordering \`Tag\`.""" -enum TagOrderBy { +"""Methods to use when ordering `Post`.""" +enum PostOrderBy { NATURAL + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC + ID_ASC + ID_DESC + AUTHOR_ID_ASC + AUTHOR_ID_DESC + SLUG_ASC + SLUG_DESC + PUBLISHED_AT_ASC + PUBLISHED_AT_DESC + CREATED_AT_ASC + CREATED_AT_DESC + } +"""Methods to use when ordering `PostTag`.""" +enum PostTagOrderBy { + NATURAL + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC + ID_ASC + ID_DESC + POST_ID_ASC + POST_ID_DESC + TAG_ID_ASC + TAG_ID_DESC +} + +"""A `Tag` edge in the connection, with data from `PostTag`.""" +type PostTagsManyToManyEdge { + """A cursor for use in pagination.""" + cursor: Cursor + + """The `Tag` at the end of the edge.""" + node: Tag + id: UUID! + createdAt: Datetime +} + + """Methods to use when ordering `Tag`.""" + enum TagOrderBy { +NATURAL +PRIMARY_KEY_ASC +PRIMARY_KEY_DESC PRIMARY_KEY_ASC PRIMARY_KEY_DESC ID_ASC @@ -1047,55 +1270,14 @@ type Comment { """ A filter to be used in determining which values should be returned by the collection. """ - filter: CommentFilter - - """The method to use when ordering \`Comment\`.""" - orderBy: [CommentOrderBy!] = [PRIMARY_KEY_ASC] - ): CommentConnection! -} - -""" -A filter to be used against \`Comment\` object types. All fields are combined with a logical ‘and.’ -""" -input CommentFilter { - """Filter by the object’s \`id\` field.""" - id: UUIDFilter - - """Filter by the object’s \`postId\` field.""" - postId: UUIDFilter - - """Filter by the object’s \`authorId\` field.""" - authorId: UUIDFilter - - """Filter by the object’s \`parentId\` field.""" - parentId: UUIDFilter - - """Filter by the object’s \`content\` field.""" - content: StringFilter - - """Filter by the object’s \`isApproved\` field.""" - isApproved: BooleanFilter - - """Filter by the object’s \`likesCount\` field.""" - likesCount: IntFilter - - """Filter by the object’s \`createdAt\` field.""" - createdAt: DatetimeFilter - - """Filter by the object’s \`updatedAt\` field.""" - updatedAt: DatetimeFilter - - """Checks for all expressions in this list.""" - and: [CommentFilter!] - - """Checks for any expressions in this list.""" - or: [CommentFilter!] - - """Negates the expression.""" - not: CommentFilter -} - -"""Methods to use when ordering \`Comment\`.""" + filter: CommentFilter + """The method to use when ordering `Comment`.""" + orderBy: [CommentOrderBy!] = [PRIMARY_KEY_ASC] +): CommentConnection! + } + """Methods to use when ordering `Comment`.""" + enum CommentOrderBy { +NATURAL enum CommentOrderBy { NATURAL PRIMARY_KEY_ASC @@ -1175,55 +1357,14 @@ type UserConnection { """A \`User\` edge in the connection.""" type UserEdge { - """A cursor for use in pagination.""" - cursor: Cursor - - """The \`User\` at the end of the edge.""" - node: User -} - -""" -A filter to be used against \`User\` object types. All fields are combined with a logical ‘and.’ -""" -input UserFilter { - """Filter by the object’s \`id\` field.""" - id: UUIDFilter - - """Filter by the object’s \`email\` field.""" - email: StringFilter - - """Filter by the object’s \`username\` field.""" - username: StringFilter - - """Filter by the object’s \`displayName\` field.""" - displayName: StringFilter - - """Filter by the object’s \`bio\` field.""" - bio: StringFilter - - """Filter by the object’s \`isActive\` field.""" - isActive: BooleanFilter - - """Filter by the object’s \`role\` field.""" - role: StringFilter - - """Filter by the object’s \`createdAt\` field.""" - createdAt: DatetimeFilter - - """Filter by the object’s \`updatedAt\` field.""" - updatedAt: DatetimeFilter - - """Checks for all expressions in this list.""" - and: [UserFilter!] - - """Checks for any expressions in this list.""" - or: [UserFilter!] - - """Negates the expression.""" - not: UserFilter -} - -"""Methods to use when ordering \`User\`.""" +"""A cursor for use in pagination.""" +cursor: Cursor +"""The `User` at the end of the edge.""" +node: User + } + """Methods to use when ordering `User`.""" + enum UserOrderBy { +NATURAL enum UserOrderBy { NATURAL PRIMARY_KEY_ASC diff --git a/jobs/knative-job-service/__tests__/jobs.e2e.test.ts b/jobs/knative-job-service/__tests__/jobs.e2e.test.ts index 43b1fcf05..ae947bd49 100644 --- a/jobs/knative-job-service/__tests__/jobs.e2e.test.ts +++ b/jobs/knative-job-service/__tests__/jobs.e2e.test.ts @@ -75,7 +75,7 @@ const addJobMutation = ` const jobByIdQuery = ` query JobById($id: BigInt!) { - jobs(condition: { id: $id }, first: 1) { + jobs(filter: { id: { equalTo: $id } }, first: 1) { nodes { id lastError From 8191c00846d1641d984d37514b46841a6755ce51 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Fri, 13 Mar 2026 01:15:18 +0000 Subject: [PATCH 14/19] fix: allow empty filter objects in pgvector test, add relation filter types to schema snapshot --- .../src/__tests__/integration.test.ts | 2 +- .../schema-snapshot.test.ts.snap | 543 +++++++++--------- 2 files changed, 271 insertions(+), 274 deletions(-) diff --git a/graphile/graphile-pgvector-plugin/src/__tests__/integration.test.ts b/graphile/graphile-pgvector-plugin/src/__tests__/integration.test.ts index 7f53056a8..96044940d 100644 --- a/graphile/graphile-pgvector-plugin/src/__tests__/integration.test.ts +++ b/graphile/graphile-pgvector-plugin/src/__tests__/integration.test.ts @@ -50,7 +50,7 @@ describe('graphile-pgvector-plugin integration', () => { const testPreset = { extends: [ VectorCodecPreset, - ConnectionFilterPreset(), + ConnectionFilterPreset({ connectionFilterAllowEmptyObjectInput: true }), ], }; diff --git a/graphql/server-test/__tests__/__snapshots__/schema-snapshot.test.ts.snap b/graphql/server-test/__tests__/__snapshots__/schema-snapshot.test.ts.snap index eb458244a..239014b3e 100644 --- a/graphql/server-test/__tests__/__snapshots__/schema-snapshot.test.ts.snap +++ b/graphql/server-test/__tests__/__snapshots__/schema-snapshot.test.ts.snap @@ -472,29 +472,57 @@ input PostFilter { """Checks for all expressions in this list.""" and: [PostFilter!] -"""Checks for any expressions in this list.""" -or: [PostFilter!] -"""Negates the expression.""" -not: PostFilter + """Checks for any expressions in this list.""" + or: [PostFilter!] + + """Negates the expression.""" + not: PostFilter - """Filter by the object’s `author` relation.""" + """Filter by the object's \`author\` relation.""" author: UserFilter - """Filter by the object’s `postTags` relation.""" + """Filter by the object's \`postTags\` relation.""" postTags: PostToManyPostTagFilter - """`postTags` exist.""" + """\`postTags\` exist.""" postTagsExist: Boolean - """Filter by the object’s `comments` relation.""" + """Filter by the object's \`comments\` relation.""" comments: PostToManyCommentFilter - """`comments` exist.""" + """\`comments\` exist.""" commentsExist: Boolean - } - """ - A filter to be used against UUID fields. All fields are combined with a logical ‘and.’ - """ +} + +""" +A filter to be used against many \`PostTag\` object types. All fields are combined with a logical 'and.' +""" +input PostToManyPostTagFilter { + """Filters to entities where at least one related entity matches.""" + some: PostTagFilter + + """Filters to entities where every related entity matches.""" + every: PostTagFilter + + """Filters to entities where no related entity matches.""" + none: PostTagFilter +} + +""" +A filter to be used against many \`Comment\` object types. All fields are combined with a logical 'and.' +""" +input PostToManyCommentFilter { + """Filters to entities where at least one related entity matches.""" + some: CommentFilter + + """Filters to entities where every related entity matches.""" + every: CommentFilter + + """Filters to entities where no related entity matches.""" + none: CommentFilter +} + +""" A filter to be used against UUID fields. All fields are combined with a logical ‘and.’ """ input UUIDFilter { @@ -787,212 +815,85 @@ input IntFilter { """Less than or equal to the specified value.""" lessThanOrEqualTo: Int -"""Greater than the specified value.""" -greaterThan: Int -"""Greater than or equal to the specified value.""" -greaterThanOrEqualTo: Int -} - -""" -A filter to be used against `User` object types. All fields are combined with a logical ‘and.’ -""" -input UserFilter { - """Filter by the object’s `id` field.""" - id: UUIDFilter - - """Filter by the object’s `email` field.""" - email: StringFilter - - """Filter by the object’s `username` field.""" - username: StringFilter - - """Filter by the object’s `displayName` field.""" - displayName: StringFilter - - """Filter by the object’s `bio` field.""" - bio: StringFilter - - """Filter by the object’s `isActive` field.""" - isActive: BooleanFilter - - """Filter by the object’s `role` field.""" - role: StringFilter - - """Filter by the object’s `createdAt` field.""" - createdAt: DatetimeFilter - - """Filter by the object’s `updatedAt` field.""" - updatedAt: DatetimeFilter - - """Checks for all expressions in this list.""" - and: [UserFilter!] - - """Checks for any expressions in this list.""" - or: [UserFilter!] - - """Negates the expression.""" - not: UserFilter - - """Filter by the object’s `authoredPosts` relation.""" - authoredPosts: UserToManyPostFilter - - """`authoredPosts` exist.""" - authoredPostsExist: Boolean - - """Filter by the object’s `authoredComments` relation.""" - authoredComments: UserToManyCommentFilter + """Greater than the specified value.""" + greaterThan: Int - """`authoredComments` exist.""" - authoredCommentsExist: Boolean + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: Int } -""" -A filter to be used against many `Post` object types. All fields are combined with a logical ‘and.’ -""" -input UserToManyPostFilter { - """Filters to entities where at least one related entity matches.""" - some: PostFilter - - """Filters to entities where every related entity matches.""" - every: PostFilter - - """Filters to entities where no related entity matches.""" - none: PostFilter - } - -""" -A filter to be used against many `Comment` object types. All fields are combined with a logical ‘and.’ -""" -input UserToManyCommentFilter { - """Filters to entities where at least one related entity matches.""" - some: CommentFilter - - """Filters to entities where every related entity matches.""" - every: CommentFilter - """Filters to entities where no related entity matches.""" - none: CommentFilter +"""Methods to use when ordering \`Post\`.""" +enum PostOrderBy { + NATURAL + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC + ID_ASC + ID_DESC + AUTHOR_ID_ASC + AUTHOR_ID_DESC + SLUG_ASC + SLUG_DESC + PUBLISHED_AT_ASC + PUBLISHED_AT_DESC + CREATED_AT_ASC + CREATED_AT_DESC } """ -A filter to be used against `Comment` object types. All fields are combined with a logical ‘and.’ +A filter to be used against \`PostTag\` object types. All fields are combined with a logical ‘and.’ """ -input CommentFilter { - """Filter by the object’s `id` field.""" +input PostTagFilter { + """Filter by the object’s \`id\` field.""" id: UUIDFilter - """Filter by the object’s `postId` field.""" + """Filter by the object’s \`postId\` field.""" postId: UUIDFilter - """Filter by the object’s `authorId` field.""" - authorId: UUIDFilter - - """Filter by the object’s `parentId` field.""" - parentId: UUIDFilter - - """Filter by the object’s `content` field.""" - content: StringFilter - - """Filter by the object’s `isApproved` field.""" - isApproved: BooleanFilter - - """Filter by the object’s `likesCount` field.""" - likesCount: IntFilter + """Filter by the object’s \`tagId\` field.""" + tagId: UUIDFilter - """Filter by the object’s `createdAt` field.""" + """Filter by the object’s \`createdAt\` field.""" createdAt: DatetimeFilter - """Filter by the object’s `updatedAt` field.""" - updatedAt: DatetimeFilter - """Checks for all expressions in this list.""" - and: [CommentFilter!] + and: [PostTagFilter!] """Checks for any expressions in this list.""" - or: [CommentFilter!] + or: [PostTagFilter!] """Negates the expression.""" - not: CommentFilter - - """Filter by the object’s `author` relation.""" - author: UserFilter - - """Filter by the object’s `parent` relation.""" - parent: CommentFilter + not: PostTagFilter - """A related `parent` exists.""" - parentExists: Boolean - - """Filter by the object’s `post` relation.""" + """Filter by the object's \`post\` relation.""" post: PostFilter - """Filter by the object’s `childComments` relation.""" - childComments: CommentToManyCommentFilter - - """`childComments` exist.""" - childCommentsExist: Boolean + """Filter by the object's \`tag\` relation.""" + tag: TagFilter } -""" -A filter to be used against many `Comment` object types. All fields are combined with a logical ‘and.’ -""" -input CommentToManyCommentFilter { - """Filters to entities where at least one related entity matches.""" - some: CommentFilter - - """Filters to entities where every related entity matches.""" - every: CommentFilter - - """Filters to entities where no related entity matches.""" - none: CommentFilter +"""Methods to use when ordering \`PostTag\`.""" +enum PostTagOrderBy { + NATURAL + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC + ID_ASC + ID_DESC + POST_ID_ASC + POST_ID_DESC + TAG_ID_ASC + TAG_ID_DESC } -""" -A filter to be used against many `PostTag` object types. All fields are combined with a logical ‘and.’ -""" -input PostToManyPostTagFilter { - """Filters to entities where at least one related entity matches.""" - some: PostTagFilter - - """Filters to entities where every related entity matches.""" - every: PostTagFilter - - """Filters to entities where no related entity matches.""" - none: PostTagFilter - } - """ - A filter to be used against `PostTag` object types. All fields are combined with a logical ‘and.’ - """ -""" -A filter to be used against \`PostTag\` object types. All fields are combined with a logical ‘and.’ -""" -input PostTagFilter { - """Filter by the object’s \`id\` field.""" - id: UUIDFilter - - """Filter by the object’s \`postId\` field.""" - postId: UUIDFilter - - """Filter by the object’s \`tagId\` field.""" - tagId: UUIDFilter - - """Filter by the object’s \`createdAt\` field.""" - createdAt: DatetimeFilter - - """Checks for all expressions in this list.""" - and: [PostTagFilter!] +"""A \`Tag\` edge in the connection, with data from \`PostTag\`.""" +type PostTagsManyToManyEdge { + """A cursor for use in pagination.""" + cursor: Cursor -"""Checks for any expressions in this list.""" -or: [PostTagFilter!] -"""Negates the expression.""" -not: PostTagFilter - """Filter by the object’s `post` relation.""" - post: PostFilter - """Filter by the object’s `tag` relation.""" - tag: TagFilter - } - """ - A filter to be used against `Tag` object types. All fields are combined with a logical ‘and.’ - """ + """The \`Tag\` at the end of the edge.""" + node: Tag + id: UUID! + createdAt: Datetime +} """ A filter to be used against \`Tag\` object types. All fields are combined with a logical ‘and.’ @@ -1019,20 +920,21 @@ input TagFilter { """Checks for all expressions in this list.""" and: [TagFilter!] -"""Checks for any expressions in this list.""" -or: [TagFilter!] -"""Negates the expression.""" -not: TagFilter + """Checks for any expressions in this list.""" + or: [TagFilter!] - """Filter by the object’s `postTags` relation.""" + """Negates the expression.""" + not: TagFilter + + """Filter by the object's \`postTags\` relation.""" postTags: TagToManyPostTagFilter - """`postTags` exist.""" + """\`postTags\` exist.""" postTagsExist: Boolean } """ -A filter to be used against many `PostTag` object types. All fields are combined with a logical ‘and.’ +A filter to be used against many \`PostTag\` object types. All fields are combined with a logical 'and.' """ input TagToManyPostTagFilter { """Filters to entities where at least one related entity matches.""" @@ -1045,65 +947,9 @@ input TagToManyPostTagFilter { none: PostTagFilter } -""" -A filter to be used against many `Comment` object types. All fields are combined with a logical ‘and.’ -""" -input PostToManyCommentFilter { - """Filters to entities where at least one related entity matches.""" - some: CommentFilter - - """Filters to entities where every related entity matches.""" - every: CommentFilter - - """Filters to entities where no related entity matches.""" - none: CommentFilter -} - -"""Methods to use when ordering `Post`.""" -enum PostOrderBy { +"""Methods to use when ordering \`Tag\`.""" +enum TagOrderBy { NATURAL - PRIMARY_KEY_ASC - PRIMARY_KEY_DESC - ID_ASC - ID_DESC - AUTHOR_ID_ASC - AUTHOR_ID_DESC - SLUG_ASC - SLUG_DESC - PUBLISHED_AT_ASC - PUBLISHED_AT_DESC - CREATED_AT_ASC - CREATED_AT_DESC - } -"""Methods to use when ordering `PostTag`.""" -enum PostTagOrderBy { - NATURAL - PRIMARY_KEY_ASC - PRIMARY_KEY_DESC - ID_ASC - ID_DESC - POST_ID_ASC - POST_ID_DESC - TAG_ID_ASC - TAG_ID_DESC -} - -"""A `Tag` edge in the connection, with data from `PostTag`.""" -type PostTagsManyToManyEdge { - """A cursor for use in pagination.""" - cursor: Cursor - - """The `Tag` at the end of the edge.""" - node: Tag - id: UUID! - createdAt: Datetime -} - - """Methods to use when ordering `Tag`.""" - enum TagOrderBy { -NATURAL -PRIMARY_KEY_ASC -PRIMARY_KEY_DESC PRIMARY_KEY_ASC PRIMARY_KEY_DESC ID_ASC @@ -1270,14 +1116,84 @@ type Comment { """ A filter to be used in determining which values should be returned by the collection. """ - filter: CommentFilter - """The method to use when ordering `Comment`.""" - orderBy: [CommentOrderBy!] = [PRIMARY_KEY_ASC] -): CommentConnection! - } - """Methods to use when ordering `Comment`.""" - enum CommentOrderBy { -NATURAL + filter: CommentFilter + + """The method to use when ordering \`Comment\`.""" + orderBy: [CommentOrderBy!] = [PRIMARY_KEY_ASC] + ): CommentConnection! +} + +""" +A filter to be used against \`Comment\` object types. All fields are combined with a logical ‘and.’ +""" +input CommentFilter { + """Filter by the object’s \`id\` field.""" + id: UUIDFilter + + """Filter by the object’s \`postId\` field.""" + postId: UUIDFilter + + """Filter by the object’s \`authorId\` field.""" + authorId: UUIDFilter + + """Filter by the object’s \`parentId\` field.""" + parentId: UUIDFilter + + """Filter by the object’s \`content\` field.""" + content: StringFilter + + """Filter by the object’s \`isApproved\` field.""" + isApproved: BooleanFilter + + """Filter by the object’s \`likesCount\` field.""" + likesCount: IntFilter + + """Filter by the object’s \`createdAt\` field.""" + createdAt: DatetimeFilter + + """Filter by the object’s \`updatedAt\` field.""" + updatedAt: DatetimeFilter + + """Checks for all expressions in this list.""" + and: [CommentFilter!] + + """Checks for any expressions in this list.""" + or: [CommentFilter!] + + """Negates the expression.""" + not: CommentFilter + + """Filter by the object's \`author\` relation.""" + author: UserFilter + + """Filter by the object's \`parent\` relation.""" + parent: CommentFilter + + """Filter by the object's \`post\` relation.""" + post: PostFilter + + """Filter by the object's \`childComments\` relation.""" + childComments: CommentToManyCommentFilter + + """\`childComments\` exist.""" + childCommentsExist: Boolean +} + +""" +A filter to be used against many \`Comment\` object types. All fields are combined with a logical 'and.' +""" +input CommentToManyCommentFilter { + """Filters to entities where at least one related entity matches.""" + some: CommentFilter + + """Filters to entities where every related entity matches.""" + every: CommentFilter + + """Filters to entities where no related entity matches.""" + none: CommentFilter +} + +"""Methods to use when ordering \`Comment\`.""" enum CommentOrderBy { NATURAL PRIMARY_KEY_ASC @@ -1357,14 +1273,95 @@ type UserConnection { """A \`User\` edge in the connection.""" type UserEdge { -"""A cursor for use in pagination.""" -cursor: Cursor -"""The `User` at the end of the edge.""" -node: User - } - """Methods to use when ordering `User`.""" - enum UserOrderBy { -NATURAL + """A cursor for use in pagination.""" + cursor: Cursor + + """The \`User\` at the end of the edge.""" + node: User +} + +""" +A filter to be used against \`User\` object types. All fields are combined with a logical ‘and.’ +""" +input UserFilter { + """Filter by the object’s \`id\` field.""" + id: UUIDFilter + + """Filter by the object’s \`email\` field.""" + email: StringFilter + + """Filter by the object’s \`username\` field.""" + username: StringFilter + + """Filter by the object’s \`displayName\` field.""" + displayName: StringFilter + + """Filter by the object’s \`bio\` field.""" + bio: StringFilter + + """Filter by the object’s \`isActive\` field.""" + isActive: BooleanFilter + + """Filter by the object’s \`role\` field.""" + role: StringFilter + + """Filter by the object’s \`createdAt\` field.""" + createdAt: DatetimeFilter + + """Filter by the object’s \`updatedAt\` field.""" + updatedAt: DatetimeFilter + + """Checks for all expressions in this list.""" + and: [UserFilter!] + + """Checks for any expressions in this list.""" + or: [UserFilter!] + + """Negates the expression.""" + not: UserFilter + + """Filter by the object's \`authoredPosts\` relation.""" + authoredPosts: UserToManyPostFilter + + """\`authoredPosts\` exist.""" + authoredPostsExist: Boolean + + """Filter by the object's \`authoredComments\` relation.""" + authoredComments: UserToManyCommentFilter + + """\`authoredComments\` exist.""" + authoredCommentsExist: Boolean +} + +""" +A filter to be used against many \`Post\` object types. All fields are combined with a logical 'and.' +""" +input UserToManyPostFilter { + """Filters to entities where at least one related entity matches.""" + some: PostFilter + + """Filters to entities where every related entity matches.""" + every: PostFilter + + """Filters to entities where no related entity matches.""" + none: PostFilter +} + +""" +A filter to be used against many \`Comment\` object types. All fields are combined with a logical 'and.' +""" +input UserToManyCommentFilter { + """Filters to entities where at least one related entity matches.""" + some: CommentFilter + + """Filters to entities where every related entity matches.""" + every: CommentFilter + + """Filters to entities where no related entity matches.""" + none: CommentFilter +} + +"""Methods to use when ordering \`User\`.""" enum UserOrderBy { NATURAL PRIMARY_KEY_ASC From e6bc1272b480144ef5b472e3848ea73882426252 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Fri, 13 Mar 2026 01:24:29 +0000 Subject: [PATCH 15/19] fix: delete snapshot to let Jest regenerate with correct relation filter types --- .../schema-snapshot.test.ts.snap | 2301 ----------------- 1 file changed, 2301 deletions(-) delete mode 100644 graphql/server-test/__tests__/__snapshots__/schema-snapshot.test.ts.snap diff --git a/graphql/server-test/__tests__/__snapshots__/schema-snapshot.test.ts.snap b/graphql/server-test/__tests__/__snapshots__/schema-snapshot.test.ts.snap deleted file mode 100644 index 239014b3e..000000000 --- a/graphql/server-test/__tests__/__snapshots__/schema-snapshot.test.ts.snap +++ /dev/null @@ -1,2301 +0,0 @@ -// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing - -exports[`Schema Snapshot should generate consistent GraphQL SDL from the test schema 1`] = ` -""""The root query type which gives access points into the data universe.""" -type Query { - """Reads and enables pagination through a set of \`PostTag\`.""" - postTags( - """Only read the first \`n\` values of the set.""" - first: Int - - """Only read the last \`n\` values of the set.""" - last: Int - - """ - Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor - based pagination. May not be used with \`last\`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """ - A filter to be used in determining which values should be returned by the collection. - """ - filter: PostTagFilter - - """The method to use when ordering \`PostTag\`.""" - orderBy: [PostTagOrderBy!] = [PRIMARY_KEY_ASC] - ): PostTagConnection - - """Reads and enables pagination through a set of \`Tag\`.""" - tags( - """Only read the first \`n\` values of the set.""" - first: Int - - """Only read the last \`n\` values of the set.""" - last: Int - - """ - Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor - based pagination. May not be used with \`last\`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """ - A filter to be used in determining which values should be returned by the collection. - """ - filter: TagFilter - - """The method to use when ordering \`Tag\`.""" - orderBy: [TagOrderBy!] = [PRIMARY_KEY_ASC] - ): TagConnection - - """Reads and enables pagination through a set of \`User\`.""" - users( - """Only read the first \`n\` values of the set.""" - first: Int - - """Only read the last \`n\` values of the set.""" - last: Int - - """ - Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor - based pagination. May not be used with \`last\`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """ - A filter to be used in determining which values should be returned by the collection. - """ - filter: UserFilter - - """The method to use when ordering \`User\`.""" - orderBy: [UserOrderBy!] = [PRIMARY_KEY_ASC] - ): UserConnection - - """Reads and enables pagination through a set of \`Comment\`.""" - comments( - """Only read the first \`n\` values of the set.""" - first: Int - - """Only read the last \`n\` values of the set.""" - last: Int - - """ - Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor - based pagination. May not be used with \`last\`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """ - A filter to be used in determining which values should be returned by the collection. - """ - filter: CommentFilter - - """The method to use when ordering \`Comment\`.""" - orderBy: [CommentOrderBy!] = [PRIMARY_KEY_ASC] - ): CommentConnection - - """Reads and enables pagination through a set of \`Post\`.""" - posts( - """Only read the first \`n\` values of the set.""" - first: Int - - """Only read the last \`n\` values of the set.""" - last: Int - - """ - Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor - based pagination. May not be used with \`last\`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """ - A filter to be used in determining which values should be returned by the collection. - """ - filter: PostFilter - - """The method to use when ordering \`Post\`.""" - orderBy: [PostOrderBy!] = [PRIMARY_KEY_ASC] - ): PostConnection - - """ - Metadata about the database schema, including tables, fields, indexes, and constraints. Useful for code generation tools. - """ - _meta: MetaSchema -} - -"""A connection to a list of \`PostTag\` values.""" -type PostTagConnection { - """A list of \`PostTag\` objects.""" - nodes: [PostTag]! - - """ - A list of edges which contains the \`PostTag\` and cursor to aid in pagination. - """ - edges: [PostTagEdge]! - - """Information to aid in pagination.""" - pageInfo: PageInfo! - - """The count of *all* \`PostTag\` you could get from the connection.""" - totalCount: Int! -} - -type PostTag { - id: UUID! - postId: UUID! - tagId: UUID! - createdAt: Datetime - - """Reads a single \`Post\` that is related to this \`PostTag\`.""" - post: Post - - """Reads a single \`Tag\` that is related to this \`PostTag\`.""" - tag: Tag -} - -""" -A universally unique identifier as defined by [RFC 4122](https://tools.ietf.org/html/rfc4122). -""" -scalar UUID - -""" -A point in time as described by the [ISO -8601](https://en.wikipedia.org/wiki/ISO_8601) and, if it has a timezone, [RFC -3339](https://datatracker.ietf.org/doc/html/rfc3339) standards. Input values -that do not conform to both ISO 8601 and RFC 3339 may be coerced, which may lead -to unexpected results. -""" -scalar Datetime - -type Post { - id: UUID! - authorId: UUID! - title: String! - slug: String! - content: String - excerpt: String - isPublished: Boolean - publishedAt: Datetime - viewCount: Int - createdAt: Datetime - updatedAt: Datetime - - """Reads and enables pagination through a set of \`Tag\`.""" - tags( - """Only read the first \`n\` values of the set.""" - first: Int - - """Only read the last \`n\` values of the set.""" - last: Int - - """ - Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor - based pagination. May not be used with \`last\`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """ - A filter to be used in determining which values should be returned by the collection. - """ - filter: TagFilter - - """The method to use when ordering \`Tag\`.""" - orderBy: [TagOrderBy!] = [PRIMARY_KEY_ASC] - ): PostTagsManyToManyConnection! - - """Reads a single \`User\` that is related to this \`Post\`.""" - author: User - - """Reads and enables pagination through a set of \`PostTag\`.""" - postTags( - """Only read the first \`n\` values of the set.""" - first: Int - - """Only read the last \`n\` values of the set.""" - last: Int - - """ - Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor - based pagination. May not be used with \`last\`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """ - A filter to be used in determining which values should be returned by the collection. - """ - filter: PostTagFilter - - """The method to use when ordering \`PostTag\`.""" - orderBy: [PostTagOrderBy!] = [PRIMARY_KEY_ASC] - ): PostTagConnection! - - """Reads and enables pagination through a set of \`Comment\`.""" - comments( - """Only read the first \`n\` values of the set.""" - first: Int - - """Only read the last \`n\` values of the set.""" - last: Int - - """ - Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor - based pagination. May not be used with \`last\`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """ - A filter to be used in determining which values should be returned by the collection. - """ - filter: CommentFilter - - """The method to use when ordering \`Comment\`.""" - orderBy: [CommentOrderBy!] = [PRIMARY_KEY_ASC] - ): CommentConnection! -} - -"""A connection to a list of \`Tag\` values, with data from \`PostTag\`.""" -type PostTagsManyToManyConnection { - """A list of \`Tag\` objects.""" - nodes: [Tag]! - - """ - A list of edges which contains the \`Tag\`, info from the \`PostTag\`, and the cursor to aid in pagination. - """ - edges: [PostTagsManyToManyEdge!]! - - """Information to aid in pagination.""" - pageInfo: PageInfo! - - """The count of *all* \`Tag\` you could get from the connection.""" - totalCount: Int! -} - -type Tag { - id: UUID! - name: String! - slug: String! - description: String - color: String - createdAt: Datetime - - """Reads and enables pagination through a set of \`Post\`.""" - posts( - """Only read the first \`n\` values of the set.""" - first: Int - - """Only read the last \`n\` values of the set.""" - last: Int - - """ - Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor - based pagination. May not be used with \`last\`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """ - A filter to be used in determining which values should be returned by the collection. - """ - filter: PostFilter - - """The method to use when ordering \`Post\`.""" - orderBy: [PostOrderBy!] = [PRIMARY_KEY_ASC] - ): TagPostsManyToManyConnection! - - """Reads and enables pagination through a set of \`PostTag\`.""" - postTags( - """Only read the first \`n\` values of the set.""" - first: Int - - """Only read the last \`n\` values of the set.""" - last: Int - - """ - Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor - based pagination. May not be used with \`last\`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """ - A filter to be used in determining which values should be returned by the collection. - """ - filter: PostTagFilter - - """The method to use when ordering \`PostTag\`.""" - orderBy: [PostTagOrderBy!] = [PRIMARY_KEY_ASC] - ): PostTagConnection! -} - -"""A connection to a list of \`Post\` values, with data from \`PostTag\`.""" -type TagPostsManyToManyConnection { - """A list of \`Post\` objects.""" - nodes: [Post]! - - """ - A list of edges which contains the \`Post\`, info from the \`PostTag\`, and the cursor to aid in pagination. - """ - edges: [TagPostsManyToManyEdge!]! - - """Information to aid in pagination.""" - pageInfo: PageInfo! - - """The count of *all* \`Post\` you could get from the connection.""" - totalCount: Int! -} - -"""A \`Post\` edge in the connection, with data from \`PostTag\`.""" -type TagPostsManyToManyEdge { - """A cursor for use in pagination.""" - cursor: Cursor - - """The \`Post\` at the end of the edge.""" - node: Post - id: UUID! - createdAt: Datetime -} - -"""A location in a connection that can be used for resuming pagination.""" -scalar Cursor - -"""Information about pagination in a connection.""" -type PageInfo { - """When paginating forwards, are there more items?""" - hasNextPage: Boolean! - - """When paginating backwards, are there more items?""" - hasPreviousPage: Boolean! - - """When paginating backwards, the cursor to continue.""" - startCursor: Cursor - - """When paginating forwards, the cursor to continue.""" - endCursor: Cursor -} - -""" -A filter to be used against \`Post\` object types. All fields are combined with a logical ‘and.’ -""" -input PostFilter { - """Filter by the object’s \`id\` field.""" - id: UUIDFilter - - """Filter by the object’s \`authorId\` field.""" - authorId: UUIDFilter - - """Filter by the object’s \`title\` field.""" - title: StringFilter - - """Filter by the object’s \`slug\` field.""" - slug: StringFilter - - """Filter by the object’s \`content\` field.""" - content: StringFilter - - """Filter by the object’s \`excerpt\` field.""" - excerpt: StringFilter - - """Filter by the object’s \`isPublished\` field.""" - isPublished: BooleanFilter - - """Filter by the object’s \`publishedAt\` field.""" - publishedAt: DatetimeFilter - - """Filter by the object’s \`viewCount\` field.""" - viewCount: IntFilter - - """Filter by the object’s \`createdAt\` field.""" - createdAt: DatetimeFilter - - """Filter by the object’s \`updatedAt\` field.""" - updatedAt: DatetimeFilter - - """Checks for all expressions in this list.""" - and: [PostFilter!] - - """Checks for any expressions in this list.""" - or: [PostFilter!] - - """Negates the expression.""" - not: PostFilter - - """Filter by the object's \`author\` relation.""" - author: UserFilter - - """Filter by the object's \`postTags\` relation.""" - postTags: PostToManyPostTagFilter - - """\`postTags\` exist.""" - postTagsExist: Boolean - - """Filter by the object's \`comments\` relation.""" - comments: PostToManyCommentFilter - - """\`comments\` exist.""" - commentsExist: Boolean -} - -""" -A filter to be used against many \`PostTag\` object types. All fields are combined with a logical 'and.' -""" -input PostToManyPostTagFilter { - """Filters to entities where at least one related entity matches.""" - some: PostTagFilter - - """Filters to entities where every related entity matches.""" - every: PostTagFilter - - """Filters to entities where no related entity matches.""" - none: PostTagFilter -} - -""" -A filter to be used against many \`Comment\` object types. All fields are combined with a logical 'and.' -""" -input PostToManyCommentFilter { - """Filters to entities where at least one related entity matches.""" - some: CommentFilter - - """Filters to entities where every related entity matches.""" - every: CommentFilter - - """Filters to entities where no related entity matches.""" - none: CommentFilter -} - -""" -A filter to be used against UUID fields. All fields are combined with a logical ‘and.’ -""" -input UUIDFilter { - """ - Is null (if \`true\` is specified) or is not null (if \`false\` is specified). - """ - isNull: Boolean - - """Equal to the specified value.""" - equalTo: UUID - - """Not equal to the specified value.""" - notEqualTo: UUID - - """ - Not equal to the specified value, treating null like an ordinary value. - """ - distinctFrom: UUID - - """Equal to the specified value, treating null like an ordinary value.""" - notDistinctFrom: UUID - - """Included in the specified list.""" - in: [UUID!] - - """Not included in the specified list.""" - notIn: [UUID!] - - """Less than the specified value.""" - lessThan: UUID - - """Less than or equal to the specified value.""" - lessThanOrEqualTo: UUID - - """Greater than the specified value.""" - greaterThan: UUID - - """Greater than or equal to the specified value.""" - greaterThanOrEqualTo: UUID -} - -""" -A filter to be used against String fields. All fields are combined with a logical ‘and.’ -""" -input StringFilter { - """ - Is null (if \`true\` is specified) or is not null (if \`false\` is specified). - """ - isNull: Boolean - - """Equal to the specified value.""" - equalTo: String - - """Not equal to the specified value.""" - notEqualTo: String - - """ - Not equal to the specified value, treating null like an ordinary value. - """ - distinctFrom: String - - """Equal to the specified value, treating null like an ordinary value.""" - notDistinctFrom: String - - """Included in the specified list.""" - in: [String!] - - """Not included in the specified list.""" - notIn: [String!] - - """Less than the specified value.""" - lessThan: String - - """Less than or equal to the specified value.""" - lessThanOrEqualTo: String - - """Greater than the specified value.""" - greaterThan: String - - """Greater than or equal to the specified value.""" - greaterThanOrEqualTo: String - - """Contains the specified string (case-sensitive).""" - includes: String - - """Does not contain the specified string (case-sensitive).""" - notIncludes: String - - """Contains the specified string (case-insensitive).""" - includesInsensitive: String - - """Does not contain the specified string (case-insensitive).""" - notIncludesInsensitive: String - - """Starts with the specified string (case-sensitive).""" - startsWith: String - - """Does not start with the specified string (case-sensitive).""" - notStartsWith: String - - """Starts with the specified string (case-insensitive).""" - startsWithInsensitive: String - - """Does not start with the specified string (case-insensitive).""" - notStartsWithInsensitive: String - - """Ends with the specified string (case-sensitive).""" - endsWith: String - - """Does not end with the specified string (case-sensitive).""" - notEndsWith: String - - """Ends with the specified string (case-insensitive).""" - endsWithInsensitive: String - - """Does not end with the specified string (case-insensitive).""" - notEndsWithInsensitive: String - - """ - Matches the specified pattern (case-sensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters. - """ - like: String - - """ - Does not match the specified pattern (case-sensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters. - """ - notLike: String - - """ - Matches the specified pattern (case-insensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters. - """ - likeInsensitive: String - - """ - Does not match the specified pattern (case-insensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters. - """ - notLikeInsensitive: String - - """Equal to the specified value (case-insensitive).""" - equalToInsensitive: String - - """Not equal to the specified value (case-insensitive).""" - notEqualToInsensitive: String - - """ - Not equal to the specified value, treating null like an ordinary value (case-insensitive). - """ - distinctFromInsensitive: String - - """ - Equal to the specified value, treating null like an ordinary value (case-insensitive). - """ - notDistinctFromInsensitive: String - - """Included in the specified list (case-insensitive).""" - inInsensitive: [String!] - - """Not included in the specified list (case-insensitive).""" - notInInsensitive: [String!] - - """Less than the specified value (case-insensitive).""" - lessThanInsensitive: String - - """Less than or equal to the specified value (case-insensitive).""" - lessThanOrEqualToInsensitive: String - - """Greater than the specified value (case-insensitive).""" - greaterThanInsensitive: String - - """Greater than or equal to the specified value (case-insensitive).""" - greaterThanOrEqualToInsensitive: String -} - -""" -A filter to be used against Boolean fields. All fields are combined with a logical ‘and.’ -""" -input BooleanFilter { - """ - Is null (if \`true\` is specified) or is not null (if \`false\` is specified). - """ - isNull: Boolean - - """Equal to the specified value.""" - equalTo: Boolean - - """Not equal to the specified value.""" - notEqualTo: Boolean - - """ - Not equal to the specified value, treating null like an ordinary value. - """ - distinctFrom: Boolean - - """Equal to the specified value, treating null like an ordinary value.""" - notDistinctFrom: Boolean - - """Included in the specified list.""" - in: [Boolean!] - - """Not included in the specified list.""" - notIn: [Boolean!] - - """Less than the specified value.""" - lessThan: Boolean - - """Less than or equal to the specified value.""" - lessThanOrEqualTo: Boolean - - """Greater than the specified value.""" - greaterThan: Boolean - - """Greater than or equal to the specified value.""" - greaterThanOrEqualTo: Boolean -} - -""" -A filter to be used against Datetime fields. All fields are combined with a logical ‘and.’ -""" -input DatetimeFilter { - """ - Is null (if \`true\` is specified) or is not null (if \`false\` is specified). - """ - isNull: Boolean - - """Equal to the specified value.""" - equalTo: Datetime - - """Not equal to the specified value.""" - notEqualTo: Datetime - - """ - Not equal to the specified value, treating null like an ordinary value. - """ - distinctFrom: Datetime - - """Equal to the specified value, treating null like an ordinary value.""" - notDistinctFrom: Datetime - - """Included in the specified list.""" - in: [Datetime!] - - """Not included in the specified list.""" - notIn: [Datetime!] - - """Less than the specified value.""" - lessThan: Datetime - - """Less than or equal to the specified value.""" - lessThanOrEqualTo: Datetime - - """Greater than the specified value.""" - greaterThan: Datetime - - """Greater than or equal to the specified value.""" - greaterThanOrEqualTo: Datetime -} - -""" -A filter to be used against Int fields. All fields are combined with a logical ‘and.’ -""" -input IntFilter { - """ - Is null (if \`true\` is specified) or is not null (if \`false\` is specified). - """ - isNull: Boolean - - """Equal to the specified value.""" - equalTo: Int - - """Not equal to the specified value.""" - notEqualTo: Int - - """ - Not equal to the specified value, treating null like an ordinary value. - """ - distinctFrom: Int - - """Equal to the specified value, treating null like an ordinary value.""" - notDistinctFrom: Int - - """Included in the specified list.""" - in: [Int!] - - """Not included in the specified list.""" - notIn: [Int!] - - """Less than the specified value.""" - lessThan: Int - - """Less than or equal to the specified value.""" - lessThanOrEqualTo: Int - - """Greater than the specified value.""" - greaterThan: Int - - """Greater than or equal to the specified value.""" - greaterThanOrEqualTo: Int -} - -"""Methods to use when ordering \`Post\`.""" -enum PostOrderBy { - NATURAL - PRIMARY_KEY_ASC - PRIMARY_KEY_DESC - ID_ASC - ID_DESC - AUTHOR_ID_ASC - AUTHOR_ID_DESC - SLUG_ASC - SLUG_DESC - PUBLISHED_AT_ASC - PUBLISHED_AT_DESC - CREATED_AT_ASC - CREATED_AT_DESC -} - -""" -A filter to be used against \`PostTag\` object types. All fields are combined with a logical ‘and.’ -""" -input PostTagFilter { - """Filter by the object’s \`id\` field.""" - id: UUIDFilter - - """Filter by the object’s \`postId\` field.""" - postId: UUIDFilter - - """Filter by the object’s \`tagId\` field.""" - tagId: UUIDFilter - - """Filter by the object’s \`createdAt\` field.""" - createdAt: DatetimeFilter - - """Checks for all expressions in this list.""" - and: [PostTagFilter!] - - """Checks for any expressions in this list.""" - or: [PostTagFilter!] - - """Negates the expression.""" - not: PostTagFilter - - """Filter by the object's \`post\` relation.""" - post: PostFilter - - """Filter by the object's \`tag\` relation.""" - tag: TagFilter -} - -"""Methods to use when ordering \`PostTag\`.""" -enum PostTagOrderBy { - NATURAL - PRIMARY_KEY_ASC - PRIMARY_KEY_DESC - ID_ASC - ID_DESC - POST_ID_ASC - POST_ID_DESC - TAG_ID_ASC - TAG_ID_DESC -} - -"""A \`Tag\` edge in the connection, with data from \`PostTag\`.""" -type PostTagsManyToManyEdge { - """A cursor for use in pagination.""" - cursor: Cursor - - """The \`Tag\` at the end of the edge.""" - node: Tag - id: UUID! - createdAt: Datetime -} - -""" -A filter to be used against \`Tag\` object types. All fields are combined with a logical ‘and.’ -""" -input TagFilter { - """Filter by the object’s \`id\` field.""" - id: UUIDFilter - - """Filter by the object’s \`name\` field.""" - name: StringFilter - - """Filter by the object’s \`slug\` field.""" - slug: StringFilter - - """Filter by the object’s \`description\` field.""" - description: StringFilter - - """Filter by the object’s \`color\` field.""" - color: StringFilter - - """Filter by the object’s \`createdAt\` field.""" - createdAt: DatetimeFilter - - """Checks for all expressions in this list.""" - and: [TagFilter!] - - """Checks for any expressions in this list.""" - or: [TagFilter!] - - """Negates the expression.""" - not: TagFilter - - """Filter by the object's \`postTags\` relation.""" - postTags: TagToManyPostTagFilter - - """\`postTags\` exist.""" - postTagsExist: Boolean -} - -""" -A filter to be used against many \`PostTag\` object types. All fields are combined with a logical 'and.' -""" -input TagToManyPostTagFilter { - """Filters to entities where at least one related entity matches.""" - some: PostTagFilter - - """Filters to entities where every related entity matches.""" - every: PostTagFilter - - """Filters to entities where no related entity matches.""" - none: PostTagFilter -} - -"""Methods to use when ordering \`Tag\`.""" -enum TagOrderBy { - NATURAL - PRIMARY_KEY_ASC - PRIMARY_KEY_DESC - ID_ASC - ID_DESC - NAME_ASC - NAME_DESC - SLUG_ASC - SLUG_DESC -} - -type User { - id: UUID! - email: String! - username: String! - displayName: String - bio: String - isActive: Boolean - role: String - createdAt: Datetime - updatedAt: Datetime - - """Reads and enables pagination through a set of \`Post\`.""" - authoredPosts( - """Only read the first \`n\` values of the set.""" - first: Int - - """Only read the last \`n\` values of the set.""" - last: Int - - """ - Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor - based pagination. May not be used with \`last\`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """ - A filter to be used in determining which values should be returned by the collection. - """ - filter: PostFilter - - """The method to use when ordering \`Post\`.""" - orderBy: [PostOrderBy!] = [PRIMARY_KEY_ASC] - ): PostConnection! - - """Reads and enables pagination through a set of \`Comment\`.""" - authoredComments( - """Only read the first \`n\` values of the set.""" - first: Int - - """Only read the last \`n\` values of the set.""" - last: Int - - """ - Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor - based pagination. May not be used with \`last\`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """ - A filter to be used in determining which values should be returned by the collection. - """ - filter: CommentFilter - - """The method to use when ordering \`Comment\`.""" - orderBy: [CommentOrderBy!] = [PRIMARY_KEY_ASC] - ): CommentConnection! -} - -"""A connection to a list of \`Post\` values.""" -type PostConnection { - """A list of \`Post\` objects.""" - nodes: [Post]! - - """ - A list of edges which contains the \`Post\` and cursor to aid in pagination. - """ - edges: [PostEdge]! - - """Information to aid in pagination.""" - pageInfo: PageInfo! - - """The count of *all* \`Post\` you could get from the connection.""" - totalCount: Int! -} - -"""A \`Post\` edge in the connection.""" -type PostEdge { - """A cursor for use in pagination.""" - cursor: Cursor - - """The \`Post\` at the end of the edge.""" - node: Post -} - -"""A connection to a list of \`Comment\` values.""" -type CommentConnection { - """A list of \`Comment\` objects.""" - nodes: [Comment]! - - """ - A list of edges which contains the \`Comment\` and cursor to aid in pagination. - """ - edges: [CommentEdge]! - - """Information to aid in pagination.""" - pageInfo: PageInfo! - - """The count of *all* \`Comment\` you could get from the connection.""" - totalCount: Int! -} - -type Comment { - id: UUID! - postId: UUID! - authorId: UUID! - parentId: UUID - content: String! - isApproved: Boolean - likesCount: Int - createdAt: Datetime - updatedAt: Datetime - - """Reads a single \`User\` that is related to this \`Comment\`.""" - author: User - - """Reads a single \`Comment\` that is related to this \`Comment\`.""" - parent: Comment - - """Reads a single \`Post\` that is related to this \`Comment\`.""" - post: Post - - """Reads and enables pagination through a set of \`Comment\`.""" - childComments( - """Only read the first \`n\` values of the set.""" - first: Int - - """Only read the last \`n\` values of the set.""" - last: Int - - """ - Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor - based pagination. May not be used with \`last\`. - """ - offset: Int - - """Read all values in the set before (above) this cursor.""" - before: Cursor - - """Read all values in the set after (below) this cursor.""" - after: Cursor - - """ - A filter to be used in determining which values should be returned by the collection. - """ - filter: CommentFilter - - """The method to use when ordering \`Comment\`.""" - orderBy: [CommentOrderBy!] = [PRIMARY_KEY_ASC] - ): CommentConnection! -} - -""" -A filter to be used against \`Comment\` object types. All fields are combined with a logical ‘and.’ -""" -input CommentFilter { - """Filter by the object’s \`id\` field.""" - id: UUIDFilter - - """Filter by the object’s \`postId\` field.""" - postId: UUIDFilter - - """Filter by the object’s \`authorId\` field.""" - authorId: UUIDFilter - - """Filter by the object’s \`parentId\` field.""" - parentId: UUIDFilter - - """Filter by the object’s \`content\` field.""" - content: StringFilter - - """Filter by the object’s \`isApproved\` field.""" - isApproved: BooleanFilter - - """Filter by the object’s \`likesCount\` field.""" - likesCount: IntFilter - - """Filter by the object’s \`createdAt\` field.""" - createdAt: DatetimeFilter - - """Filter by the object’s \`updatedAt\` field.""" - updatedAt: DatetimeFilter - - """Checks for all expressions in this list.""" - and: [CommentFilter!] - - """Checks for any expressions in this list.""" - or: [CommentFilter!] - - """Negates the expression.""" - not: CommentFilter - - """Filter by the object's \`author\` relation.""" - author: UserFilter - - """Filter by the object's \`parent\` relation.""" - parent: CommentFilter - - """Filter by the object's \`post\` relation.""" - post: PostFilter - - """Filter by the object's \`childComments\` relation.""" - childComments: CommentToManyCommentFilter - - """\`childComments\` exist.""" - childCommentsExist: Boolean -} - -""" -A filter to be used against many \`Comment\` object types. All fields are combined with a logical 'and.' -""" -input CommentToManyCommentFilter { - """Filters to entities where at least one related entity matches.""" - some: CommentFilter - - """Filters to entities where every related entity matches.""" - every: CommentFilter - - """Filters to entities where no related entity matches.""" - none: CommentFilter -} - -"""Methods to use when ordering \`Comment\`.""" -enum CommentOrderBy { - NATURAL - PRIMARY_KEY_ASC - PRIMARY_KEY_DESC - ID_ASC - ID_DESC - POST_ID_ASC - POST_ID_DESC - AUTHOR_ID_ASC - AUTHOR_ID_DESC - PARENT_ID_ASC - PARENT_ID_DESC - CREATED_AT_ASC - CREATED_AT_DESC -} - -"""A \`Comment\` edge in the connection.""" -type CommentEdge { - """A cursor for use in pagination.""" - cursor: Cursor - - """The \`Comment\` at the end of the edge.""" - node: Comment -} - -"""A \`PostTag\` edge in the connection.""" -type PostTagEdge { - """A cursor for use in pagination.""" - cursor: Cursor - - """The \`PostTag\` at the end of the edge.""" - node: PostTag -} - -"""A connection to a list of \`Tag\` values.""" -type TagConnection { - """A list of \`Tag\` objects.""" - nodes: [Tag]! - - """ - A list of edges which contains the \`Tag\` and cursor to aid in pagination. - """ - edges: [TagEdge]! - - """Information to aid in pagination.""" - pageInfo: PageInfo! - - """The count of *all* \`Tag\` you could get from the connection.""" - totalCount: Int! -} - -"""A \`Tag\` edge in the connection.""" -type TagEdge { - """A cursor for use in pagination.""" - cursor: Cursor - - """The \`Tag\` at the end of the edge.""" - node: Tag -} - -"""A connection to a list of \`User\` values.""" -type UserConnection { - """A list of \`User\` objects.""" - nodes: [User]! - - """ - A list of edges which contains the \`User\` and cursor to aid in pagination. - """ - edges: [UserEdge]! - - """Information to aid in pagination.""" - pageInfo: PageInfo! - - """The count of *all* \`User\` you could get from the connection.""" - totalCount: Int! -} - -"""A \`User\` edge in the connection.""" -type UserEdge { - """A cursor for use in pagination.""" - cursor: Cursor - - """The \`User\` at the end of the edge.""" - node: User -} - -""" -A filter to be used against \`User\` object types. All fields are combined with a logical ‘and.’ -""" -input UserFilter { - """Filter by the object’s \`id\` field.""" - id: UUIDFilter - - """Filter by the object’s \`email\` field.""" - email: StringFilter - - """Filter by the object’s \`username\` field.""" - username: StringFilter - - """Filter by the object’s \`displayName\` field.""" - displayName: StringFilter - - """Filter by the object’s \`bio\` field.""" - bio: StringFilter - - """Filter by the object’s \`isActive\` field.""" - isActive: BooleanFilter - - """Filter by the object’s \`role\` field.""" - role: StringFilter - - """Filter by the object’s \`createdAt\` field.""" - createdAt: DatetimeFilter - - """Filter by the object’s \`updatedAt\` field.""" - updatedAt: DatetimeFilter - - """Checks for all expressions in this list.""" - and: [UserFilter!] - - """Checks for any expressions in this list.""" - or: [UserFilter!] - - """Negates the expression.""" - not: UserFilter - - """Filter by the object's \`authoredPosts\` relation.""" - authoredPosts: UserToManyPostFilter - - """\`authoredPosts\` exist.""" - authoredPostsExist: Boolean - - """Filter by the object's \`authoredComments\` relation.""" - authoredComments: UserToManyCommentFilter - - """\`authoredComments\` exist.""" - authoredCommentsExist: Boolean -} - -""" -A filter to be used against many \`Post\` object types. All fields are combined with a logical 'and.' -""" -input UserToManyPostFilter { - """Filters to entities where at least one related entity matches.""" - some: PostFilter - - """Filters to entities where every related entity matches.""" - every: PostFilter - - """Filters to entities where no related entity matches.""" - none: PostFilter -} - -""" -A filter to be used against many \`Comment\` object types. All fields are combined with a logical 'and.' -""" -input UserToManyCommentFilter { - """Filters to entities where at least one related entity matches.""" - some: CommentFilter - - """Filters to entities where every related entity matches.""" - every: CommentFilter - - """Filters to entities where no related entity matches.""" - none: CommentFilter -} - -"""Methods to use when ordering \`User\`.""" -enum UserOrderBy { - NATURAL - PRIMARY_KEY_ASC - PRIMARY_KEY_DESC - ID_ASC - ID_DESC - EMAIL_ASC - EMAIL_DESC - USERNAME_ASC - USERNAME_DESC - CREATED_AT_ASC - CREATED_AT_DESC -} - -"""Root meta schema type""" -type MetaSchema { - tables: [MetaTable!]! -} - -"""Information about a database table""" -type MetaTable { - name: String! - schemaName: String! - fields: [MetaField!]! - indexes: [MetaIndex!]! - constraints: MetaConstraints! - foreignKeyConstraints: [MetaForeignKeyConstraint!]! - primaryKeyConstraints: [MetaPrimaryKeyConstraint!]! - uniqueConstraints: [MetaUniqueConstraint!]! - relations: MetaRelations! - inflection: MetaInflection! - query: MetaQuery! -} - -"""Information about a table field/column""" -type MetaField { - name: String! - type: MetaType! - isNotNull: Boolean! - hasDefault: Boolean! -} - -"""Information about a PostgreSQL type""" -type MetaType { - pgType: String! - gqlType: String! - isArray: Boolean! - isNotNull: Boolean - hasDefault: Boolean -} - -"""Information about a database index""" -type MetaIndex { - name: String! - isUnique: Boolean! - isPrimary: Boolean! - columns: [String!]! - fields: [MetaField!] -} - -"""Table constraints""" -type MetaConstraints { - primaryKey: MetaPrimaryKeyConstraint - unique: [MetaUniqueConstraint!]! - foreignKey: [MetaForeignKeyConstraint!]! -} - -"""Information about a primary key constraint""" -type MetaPrimaryKeyConstraint { - name: String! - fields: [MetaField!]! -} - -"""Information about a unique constraint""" -type MetaUniqueConstraint { - name: String! - fields: [MetaField!]! -} - -"""Information about a foreign key constraint""" -type MetaForeignKeyConstraint { - name: String! - fields: [MetaField!]! - referencedTable: String! - referencedFields: [String!]! - refFields: [MetaField!] - refTable: MetaRefTable -} - -"""Reference to a related table""" -type MetaRefTable { - name: String! -} - -"""Table relations""" -type MetaRelations { - belongsTo: [MetaBelongsToRelation!]! - has: [MetaHasRelation!]! - hasOne: [MetaHasRelation!]! - hasMany: [MetaHasRelation!]! - manyToMany: [MetaManyToManyRelation!]! -} - -"""A belongs-to (forward FK) relation""" -type MetaBelongsToRelation { - fieldName: String - isUnique: Boolean! - type: String - keys: [MetaField!]! - references: MetaRefTable! -} - -"""A has-one or has-many (reverse FK) relation""" -type MetaHasRelation { - fieldName: String - isUnique: Boolean! - type: String - keys: [MetaField!]! - referencedBy: MetaRefTable! -} - -"""A many-to-many relation via junction table""" -type MetaManyToManyRelation { - fieldName: String - type: String - junctionTable: MetaRefTable! - junctionLeftConstraint: MetaForeignKeyConstraint! - junctionLeftKeyAttributes: [MetaField!]! - junctionRightConstraint: MetaForeignKeyConstraint! - junctionRightKeyAttributes: [MetaField!]! - leftKeyAttributes: [MetaField!]! - rightKeyAttributes: [MetaField!]! - rightTable: MetaRefTable! -} - -"""Table inflection names""" -type MetaInflection { - tableType: String! - allRows: String! - connection: String! - edge: String! - filterType: String - orderByType: String! - conditionType: String! - patchType: String - createInputType: String! - createPayloadType: String! - updatePayloadType: String - deletePayloadType: String! -} - -"""Table query/mutation names""" -type MetaQuery { - all: String! - one: String - create: String - update: String - delete: String -} - -""" -The root mutation type which contains root level fields which mutate data. -""" -type Mutation { - """Creates a single \`PostTag\`.""" - createPostTag( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: CreatePostTagInput! - ): CreatePostTagPayload - - """Creates a single \`Tag\`.""" - createTag( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: CreateTagInput! - ): CreateTagPayload - - """Creates a single \`User\`.""" - createUser( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: CreateUserInput! - ): CreateUserPayload - - """Creates a single \`Comment\`.""" - createComment( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: CreateCommentInput! - ): CreateCommentPayload - - """Creates a single \`Post\`.""" - createPost( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: CreatePostInput! - ): CreatePostPayload - - """Updates a single \`PostTag\` using a unique key and a patch.""" - updatePostTag( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: UpdatePostTagInput! - ): UpdatePostTagPayload - - """Updates a single \`Tag\` using a unique key and a patch.""" - updateTag( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: UpdateTagInput! - ): UpdateTagPayload - - """Updates a single \`User\` using a unique key and a patch.""" - updateUser( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: UpdateUserInput! - ): UpdateUserPayload - - """Updates a single \`Comment\` using a unique key and a patch.""" - updateComment( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: UpdateCommentInput! - ): UpdateCommentPayload - - """Updates a single \`Post\` using a unique key and a patch.""" - updatePost( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: UpdatePostInput! - ): UpdatePostPayload - - """Deletes a single \`PostTag\` using a unique key.""" - deletePostTag( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: DeletePostTagInput! - ): DeletePostTagPayload - - """Deletes a single \`Tag\` using a unique key.""" - deleteTag( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: DeleteTagInput! - ): DeleteTagPayload - - """Deletes a single \`User\` using a unique key.""" - deleteUser( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: DeleteUserInput! - ): DeleteUserPayload - - """Deletes a single \`Comment\` using a unique key.""" - deleteComment( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: DeleteCommentInput! - ): DeleteCommentPayload - - """Deletes a single \`Post\` using a unique key.""" - deletePost( - """ - The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. - """ - input: DeletePostInput! - ): DeletePostPayload -} - -"""The output of our create \`PostTag\` mutation.""" -type CreatePostTagPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`PostTag\` that was created by this mutation.""" - postTag: PostTag - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`PostTag\`. May be used by Relay 1.""" - postTagEdge( - """The method to use when ordering \`PostTag\`.""" - orderBy: [PostTagOrderBy!]! = [PRIMARY_KEY_ASC] - ): PostTagEdge -} - -"""All input for the create \`PostTag\` mutation.""" -input CreatePostTagInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - - """The \`PostTag\` to be created by this mutation.""" - postTag: PostTagInput! -} - -"""An input for mutations affecting \`PostTag\`""" -input PostTagInput { - id: UUID - postId: UUID! - tagId: UUID! - createdAt: Datetime -} - -"""The output of our create \`Tag\` mutation.""" -type CreateTagPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`Tag\` that was created by this mutation.""" - tag: Tag - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`Tag\`. May be used by Relay 1.""" - tagEdge( - """The method to use when ordering \`Tag\`.""" - orderBy: [TagOrderBy!]! = [PRIMARY_KEY_ASC] - ): TagEdge -} - -"""All input for the create \`Tag\` mutation.""" -input CreateTagInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - - """The \`Tag\` to be created by this mutation.""" - tag: TagInput! -} - -"""An input for mutations affecting \`Tag\`""" -input TagInput { - id: UUID - name: String! - slug: String! - description: String - color: String - createdAt: Datetime -} - -"""The output of our create \`User\` mutation.""" -type CreateUserPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`User\` that was created by this mutation.""" - user: User - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`User\`. May be used by Relay 1.""" - userEdge( - """The method to use when ordering \`User\`.""" - orderBy: [UserOrderBy!]! = [PRIMARY_KEY_ASC] - ): UserEdge -} - -"""All input for the create \`User\` mutation.""" -input CreateUserInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - - """The \`User\` to be created by this mutation.""" - user: UserInput! -} - -"""An input for mutations affecting \`User\`""" -input UserInput { - id: UUID - email: String! - username: String! - displayName: String - bio: String - isActive: Boolean - role: String - createdAt: Datetime - updatedAt: Datetime -} - -"""The output of our create \`Comment\` mutation.""" -type CreateCommentPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`Comment\` that was created by this mutation.""" - comment: Comment - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`Comment\`. May be used by Relay 1.""" - commentEdge( - """The method to use when ordering \`Comment\`.""" - orderBy: [CommentOrderBy!]! = [PRIMARY_KEY_ASC] - ): CommentEdge -} - -"""All input for the create \`Comment\` mutation.""" -input CreateCommentInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - - """The \`Comment\` to be created by this mutation.""" - comment: CommentInput! -} - -"""An input for mutations affecting \`Comment\`""" -input CommentInput { - id: UUID - postId: UUID! - authorId: UUID! - parentId: UUID - content: String! - isApproved: Boolean - likesCount: Int - createdAt: Datetime - updatedAt: Datetime -} - -"""The output of our create \`Post\` mutation.""" -type CreatePostPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`Post\` that was created by this mutation.""" - post: Post - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`Post\`. May be used by Relay 1.""" - postEdge( - """The method to use when ordering \`Post\`.""" - orderBy: [PostOrderBy!]! = [PRIMARY_KEY_ASC] - ): PostEdge -} - -"""All input for the create \`Post\` mutation.""" -input CreatePostInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - - """The \`Post\` to be created by this mutation.""" - post: PostInput! -} - -"""An input for mutations affecting \`Post\`""" -input PostInput { - id: UUID - authorId: UUID! - title: String! - slug: String! - content: String - excerpt: String - isPublished: Boolean - publishedAt: Datetime - viewCount: Int - createdAt: Datetime - updatedAt: Datetime -} - -"""The output of our update \`PostTag\` mutation.""" -type UpdatePostTagPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`PostTag\` that was updated by this mutation.""" - postTag: PostTag - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`PostTag\`. May be used by Relay 1.""" - postTagEdge( - """The method to use when ordering \`PostTag\`.""" - orderBy: [PostTagOrderBy!]! = [PRIMARY_KEY_ASC] - ): PostTagEdge -} - -"""All input for the \`updatePostTag\` mutation.""" -input UpdatePostTagInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - id: UUID! - - """ - An object where the defined keys will be set on the \`PostTag\` being updated. - """ - postTagPatch: PostTagPatch! -} - -""" -Represents an update to a \`PostTag\`. Fields that are set will be updated. -""" -input PostTagPatch { - id: UUID - postId: UUID - tagId: UUID - createdAt: Datetime -} - -"""The output of our update \`Tag\` mutation.""" -type UpdateTagPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`Tag\` that was updated by this mutation.""" - tag: Tag - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`Tag\`. May be used by Relay 1.""" - tagEdge( - """The method to use when ordering \`Tag\`.""" - orderBy: [TagOrderBy!]! = [PRIMARY_KEY_ASC] - ): TagEdge -} - -"""All input for the \`updateTag\` mutation.""" -input UpdateTagInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - id: UUID! - - """ - An object where the defined keys will be set on the \`Tag\` being updated. - """ - tagPatch: TagPatch! -} - -"""Represents an update to a \`Tag\`. Fields that are set will be updated.""" -input TagPatch { - id: UUID - name: String - slug: String - description: String - color: String - createdAt: Datetime -} - -"""The output of our update \`User\` mutation.""" -type UpdateUserPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`User\` that was updated by this mutation.""" - user: User - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`User\`. May be used by Relay 1.""" - userEdge( - """The method to use when ordering \`User\`.""" - orderBy: [UserOrderBy!]! = [PRIMARY_KEY_ASC] - ): UserEdge -} - -"""All input for the \`updateUser\` mutation.""" -input UpdateUserInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - id: UUID! - - """ - An object where the defined keys will be set on the \`User\` being updated. - """ - userPatch: UserPatch! -} - -"""Represents an update to a \`User\`. Fields that are set will be updated.""" -input UserPatch { - id: UUID - email: String - username: String - displayName: String - bio: String - isActive: Boolean - role: String - createdAt: Datetime - updatedAt: Datetime -} - -"""The output of our update \`Comment\` mutation.""" -type UpdateCommentPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`Comment\` that was updated by this mutation.""" - comment: Comment - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`Comment\`. May be used by Relay 1.""" - commentEdge( - """The method to use when ordering \`Comment\`.""" - orderBy: [CommentOrderBy!]! = [PRIMARY_KEY_ASC] - ): CommentEdge -} - -"""All input for the \`updateComment\` mutation.""" -input UpdateCommentInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - id: UUID! - - """ - An object where the defined keys will be set on the \`Comment\` being updated. - """ - commentPatch: CommentPatch! -} - -""" -Represents an update to a \`Comment\`. Fields that are set will be updated. -""" -input CommentPatch { - id: UUID - postId: UUID - authorId: UUID - parentId: UUID - content: String - isApproved: Boolean - likesCount: Int - createdAt: Datetime - updatedAt: Datetime -} - -"""The output of our update \`Post\` mutation.""" -type UpdatePostPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`Post\` that was updated by this mutation.""" - post: Post - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`Post\`. May be used by Relay 1.""" - postEdge( - """The method to use when ordering \`Post\`.""" - orderBy: [PostOrderBy!]! = [PRIMARY_KEY_ASC] - ): PostEdge -} - -"""All input for the \`updatePost\` mutation.""" -input UpdatePostInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - id: UUID! - - """ - An object where the defined keys will be set on the \`Post\` being updated. - """ - postPatch: PostPatch! -} - -"""Represents an update to a \`Post\`. Fields that are set will be updated.""" -input PostPatch { - id: UUID - authorId: UUID - title: String - slug: String - content: String - excerpt: String - isPublished: Boolean - publishedAt: Datetime - viewCount: Int - createdAt: Datetime - updatedAt: Datetime -} - -"""The output of our delete \`PostTag\` mutation.""" -type DeletePostTagPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`PostTag\` that was deleted by this mutation.""" - postTag: PostTag - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`PostTag\`. May be used by Relay 1.""" - postTagEdge( - """The method to use when ordering \`PostTag\`.""" - orderBy: [PostTagOrderBy!]! = [PRIMARY_KEY_ASC] - ): PostTagEdge -} - -"""All input for the \`deletePostTag\` mutation.""" -input DeletePostTagInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - id: UUID! -} - -"""The output of our delete \`Tag\` mutation.""" -type DeleteTagPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`Tag\` that was deleted by this mutation.""" - tag: Tag - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`Tag\`. May be used by Relay 1.""" - tagEdge( - """The method to use when ordering \`Tag\`.""" - orderBy: [TagOrderBy!]! = [PRIMARY_KEY_ASC] - ): TagEdge -} - -"""All input for the \`deleteTag\` mutation.""" -input DeleteTagInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - id: UUID! -} - -"""The output of our delete \`User\` mutation.""" -type DeleteUserPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`User\` that was deleted by this mutation.""" - user: User - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`User\`. May be used by Relay 1.""" - userEdge( - """The method to use when ordering \`User\`.""" - orderBy: [UserOrderBy!]! = [PRIMARY_KEY_ASC] - ): UserEdge -} - -"""All input for the \`deleteUser\` mutation.""" -input DeleteUserInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - id: UUID! -} - -"""The output of our delete \`Comment\` mutation.""" -type DeleteCommentPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`Comment\` that was deleted by this mutation.""" - comment: Comment - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`Comment\`. May be used by Relay 1.""" - commentEdge( - """The method to use when ordering \`Comment\`.""" - orderBy: [CommentOrderBy!]! = [PRIMARY_KEY_ASC] - ): CommentEdge -} - -"""All input for the \`deleteComment\` mutation.""" -input DeleteCommentInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - id: UUID! -} - -"""The output of our delete \`Post\` mutation.""" -type DeletePostPayload { - """ - The exact same \`clientMutationId\` that was provided in the mutation input, - unchanged and unused. May be used by a client to track mutations. - """ - clientMutationId: String - - """The \`Post\` that was deleted by this mutation.""" - post: Post - - """ - Our root query field type. Allows us to run any query from our mutation payload. - """ - query: Query - - """An edge for our \`Post\`. May be used by Relay 1.""" - postEdge( - """The method to use when ordering \`Post\`.""" - orderBy: [PostOrderBy!]! = [PRIMARY_KEY_ASC] - ): PostEdge -} - -"""All input for the \`deletePost\` mutation.""" -input DeletePostInput { - """ - An arbitrary string value with no semantic meaning. Will be included in the - payload verbatim. May be used to track mutations by the client. - """ - clientMutationId: String - id: UUID! -}" -`; From 11f887330f975213d5e9d8f096813ef904197bdc Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Fri, 13 Mar 2026 01:34:09 +0000 Subject: [PATCH 16/19] fix: correct schema snapshot with relation filter types, smart quotes, and proper type ordering --- .../schema-snapshot.test.ts.snap | 2303 +++++++++++++++++ 1 file changed, 2303 insertions(+) create mode 100644 graphql/server-test/__tests__/__snapshots__/schema-snapshot.test.ts.snap diff --git a/graphql/server-test/__tests__/__snapshots__/schema-snapshot.test.ts.snap b/graphql/server-test/__tests__/__snapshots__/schema-snapshot.test.ts.snap new file mode 100644 index 000000000..fceb1ddf2 --- /dev/null +++ b/graphql/server-test/__tests__/__snapshots__/schema-snapshot.test.ts.snap @@ -0,0 +1,2303 @@ +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing + +exports[`Schema Snapshot should generate consistent GraphQL SDL from the test schema 1`] = ` +""""The root query type which gives access points into the data universe.""" +type Query { + """Reads and enables pagination through a set of \`PostTag\`.""" + postTags( + """Only read the first \`n\` values of the set.""" + first: Int + + """Only read the last \`n\` values of the set.""" + last: Int + + """ + Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor + based pagination. May not be used with \`last\`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: PostTagFilter + + """The method to use when ordering \`PostTag\`.""" + orderBy: [PostTagOrderBy!] = [PRIMARY_KEY_ASC] + ): PostTagConnection + + """Reads and enables pagination through a set of \`Tag\`.""" + tags( + """Only read the first \`n\` values of the set.""" + first: Int + + """Only read the last \`n\` values of the set.""" + last: Int + + """ + Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor + based pagination. May not be used with \`last\`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: TagFilter + + """The method to use when ordering \`Tag\`.""" + orderBy: [TagOrderBy!] = [PRIMARY_KEY_ASC] + ): TagConnection + + """Reads and enables pagination through a set of \`User\`.""" + users( + """Only read the first \`n\` values of the set.""" + first: Int + + """Only read the last \`n\` values of the set.""" + last: Int + + """ + Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor + based pagination. May not be used with \`last\`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: UserFilter + + """The method to use when ordering \`User\`.""" + orderBy: [UserOrderBy!] = [PRIMARY_KEY_ASC] + ): UserConnection + + """Reads and enables pagination through a set of \`Comment\`.""" + comments( + """Only read the first \`n\` values of the set.""" + first: Int + + """Only read the last \`n\` values of the set.""" + last: Int + + """ + Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor + based pagination. May not be used with \`last\`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CommentFilter + + """The method to use when ordering \`Comment\`.""" + orderBy: [CommentOrderBy!] = [PRIMARY_KEY_ASC] + ): CommentConnection + + """Reads and enables pagination through a set of \`Post\`.""" + posts( + """Only read the first \`n\` values of the set.""" + first: Int + + """Only read the last \`n\` values of the set.""" + last: Int + + """ + Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor + based pagination. May not be used with \`last\`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: PostFilter + + """The method to use when ordering \`Post\`.""" + orderBy: [PostOrderBy!] = [PRIMARY_KEY_ASC] + ): PostConnection + + """ + Metadata about the database schema, including tables, fields, indexes, and constraints. Useful for code generation tools. + """ + _meta: MetaSchema +} + +"""A connection to a list of \`PostTag\` values.""" +type PostTagConnection { + """A list of \`PostTag\` objects.""" + nodes: [PostTag]! + + """ + A list of edges which contains the \`PostTag\` and cursor to aid in pagination. + """ + edges: [PostTagEdge]! + + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """The count of *all* \`PostTag\` you could get from the connection.""" + totalCount: Int! +} + +type PostTag { + id: UUID! + postId: UUID! + tagId: UUID! + createdAt: Datetime + + """Reads a single \`Post\` that is related to this \`PostTag\`.""" + post: Post + + """Reads a single \`Tag\` that is related to this \`PostTag\`.""" + tag: Tag +} + +""" +A universally unique identifier as defined by [RFC 4122](https://tools.ietf.org/html/rfc4122). +""" +scalar UUID + +""" +A point in time as described by the [ISO +8601](https://en.wikipedia.org/wiki/ISO_8601) and, if it has a timezone, [RFC +3339](https://datatracker.ietf.org/doc/html/rfc3339) standards. Input values +that do not conform to both ISO 8601 and RFC 3339 may be coerced, which may lead +to unexpected results. +""" +scalar Datetime + +type Post { + id: UUID! + authorId: UUID! + title: String! + slug: String! + content: String + excerpt: String + isPublished: Boolean + publishedAt: Datetime + viewCount: Int + createdAt: Datetime + updatedAt: Datetime + + """Reads and enables pagination through a set of \`Tag\`.""" + tags( + """Only read the first \`n\` values of the set.""" + first: Int + + """Only read the last \`n\` values of the set.""" + last: Int + + """ + Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor + based pagination. May not be used with \`last\`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: TagFilter + + """The method to use when ordering \`Tag\`.""" + orderBy: [TagOrderBy!] = [PRIMARY_KEY_ASC] + ): PostTagsManyToManyConnection! + + """Reads a single \`User\` that is related to this \`Post\`.""" + author: User + + """Reads and enables pagination through a set of \`PostTag\`.""" + postTags( + """Only read the first \`n\` values of the set.""" + first: Int + + """Only read the last \`n\` values of the set.""" + last: Int + + """ + Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor + based pagination. May not be used with \`last\`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: PostTagFilter + + """The method to use when ordering \`PostTag\`.""" + orderBy: [PostTagOrderBy!] = [PRIMARY_KEY_ASC] + ): PostTagConnection! + + """Reads and enables pagination through a set of \`Comment\`.""" + comments( + """Only read the first \`n\` values of the set.""" + first: Int + + """Only read the last \`n\` values of the set.""" + last: Int + + """ + Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor + based pagination. May not be used with \`last\`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CommentFilter + + """The method to use when ordering \`Comment\`.""" + orderBy: [CommentOrderBy!] = [PRIMARY_KEY_ASC] + ): CommentConnection! +} + +"""A connection to a list of \`Tag\` values, with data from \`PostTag\`.""" +type PostTagsManyToManyConnection { + """A list of \`Tag\` objects.""" + nodes: [Tag]! + + """ + A list of edges which contains the \`Tag\`, info from the \`PostTag\`, and the cursor to aid in pagination. + """ + edges: [PostTagsManyToManyEdge!]! + + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """The count of *all* \`Tag\` you could get from the connection.""" + totalCount: Int! +} + +type Tag { + id: UUID! + name: String! + slug: String! + description: String + color: String + createdAt: Datetime + + """Reads and enables pagination through a set of \`Post\`.""" + posts( + """Only read the first \`n\` values of the set.""" + first: Int + + """Only read the last \`n\` values of the set.""" + last: Int + + """ + Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor + based pagination. May not be used with \`last\`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: PostFilter + + """The method to use when ordering \`Post\`.""" + orderBy: [PostOrderBy!] = [PRIMARY_KEY_ASC] + ): TagPostsManyToManyConnection! + + """Reads and enables pagination through a set of \`PostTag\`.""" + postTags( + """Only read the first \`n\` values of the set.""" + first: Int + + """Only read the last \`n\` values of the set.""" + last: Int + + """ + Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor + based pagination. May not be used with \`last\`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: PostTagFilter + + """The method to use when ordering \`PostTag\`.""" + orderBy: [PostTagOrderBy!] = [PRIMARY_KEY_ASC] + ): PostTagConnection! +} + +"""A connection to a list of \`Post\` values, with data from \`PostTag\`.""" +type TagPostsManyToManyConnection { + """A list of \`Post\` objects.""" + nodes: [Post]! + + """ + A list of edges which contains the \`Post\`, info from the \`PostTag\`, and the cursor to aid in pagination. + """ + edges: [TagPostsManyToManyEdge!]! + + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """The count of *all* \`Post\` you could get from the connection.""" + totalCount: Int! +} + +"""A \`Post\` edge in the connection, with data from \`PostTag\`.""" +type TagPostsManyToManyEdge { + """A cursor for use in pagination.""" + cursor: Cursor + + """The \`Post\` at the end of the edge.""" + node: Post + id: UUID! + createdAt: Datetime +} + +"""A location in a connection that can be used for resuming pagination.""" +scalar Cursor + +"""Information about pagination in a connection.""" +type PageInfo { + """When paginating forwards, are there more items?""" + hasNextPage: Boolean! + + """When paginating backwards, are there more items?""" + hasPreviousPage: Boolean! + + """When paginating backwards, the cursor to continue.""" + startCursor: Cursor + + """When paginating forwards, the cursor to continue.""" + endCursor: Cursor +} + +""" +A filter to be used against \`Post\` object types. All fields are combined with a logical ‘and.’ +""" +input PostFilter { + """Filter by the object’s \`id\` field.""" + id: UUIDFilter + + """Filter by the object’s \`authorId\` field.""" + authorId: UUIDFilter + + """Filter by the object’s \`title\` field.""" + title: StringFilter + + """Filter by the object’s \`slug\` field.""" + slug: StringFilter + + """Filter by the object’s \`content\` field.""" + content: StringFilter + + """Filter by the object’s \`excerpt\` field.""" + excerpt: StringFilter + + """Filter by the object’s \`isPublished\` field.""" + isPublished: BooleanFilter + + """Filter by the object’s \`publishedAt\` field.""" + publishedAt: DatetimeFilter + + """Filter by the object’s \`viewCount\` field.""" + viewCount: IntFilter + + """Filter by the object’s \`createdAt\` field.""" + createdAt: DatetimeFilter + + """Filter by the object’s \`updatedAt\` field.""" + updatedAt: DatetimeFilter + + """Checks for all expressions in this list.""" + and: [PostFilter!] + + """Checks for any expressions in this list.""" + or: [PostFilter!] + + """Negates the expression.""" + not: PostFilter + + """Filter by the object’s \`author\` relation.""" + author: UserFilter + + """Filter by the object’s \`postTags\` relation.""" + postTags: PostToManyPostTagFilter + + """\`postTags\` exist.""" + postTagsExist: Boolean + + """Filter by the object’s \`comments\` relation.""" + comments: PostToManyCommentFilter + + """\`comments\` exist.""" + commentsExist: Boolean +} + +""" +A filter to be used against UUID fields. All fields are combined with a logical ‘and.’ +""" +input UUIDFilter { + """ + Is null (if \`true\` is specified) or is not null (if \`false\` is specified). + """ + isNull: Boolean + + """Equal to the specified value.""" + equalTo: UUID + + """Not equal to the specified value.""" + notEqualTo: UUID + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: UUID + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: UUID + + """Included in the specified list.""" + in: [UUID!] + + """Not included in the specified list.""" + notIn: [UUID!] + + """Less than the specified value.""" + lessThan: UUID + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: UUID + + """Greater than the specified value.""" + greaterThan: UUID + + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: UUID +} + +""" +A filter to be used against String fields. All fields are combined with a logical ‘and.’ +""" +input StringFilter { + """ + Is null (if \`true\` is specified) or is not null (if \`false\` is specified). + """ + isNull: Boolean + + """Equal to the specified value.""" + equalTo: String + + """Not equal to the specified value.""" + notEqualTo: String + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: String + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: String + + """Included in the specified list.""" + in: [String!] + + """Not included in the specified list.""" + notIn: [String!] + + """Less than the specified value.""" + lessThan: String + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: String + + """Greater than the specified value.""" + greaterThan: String + + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: String + + """Contains the specified string (case-sensitive).""" + includes: String + + """Does not contain the specified string (case-sensitive).""" + notIncludes: String + + """Contains the specified string (case-insensitive).""" + includesInsensitive: String + + """Does not contain the specified string (case-insensitive).""" + notIncludesInsensitive: String + + """Starts with the specified string (case-sensitive).""" + startsWith: String + + """Does not start with the specified string (case-sensitive).""" + notStartsWith: String + + """Starts with the specified string (case-insensitive).""" + startsWithInsensitive: String + + """Does not start with the specified string (case-insensitive).""" + notStartsWithInsensitive: String + + """Ends with the specified string (case-sensitive).""" + endsWith: String + + """Does not end with the specified string (case-sensitive).""" + notEndsWith: String + + """Ends with the specified string (case-insensitive).""" + endsWithInsensitive: String + + """Does not end with the specified string (case-insensitive).""" + notEndsWithInsensitive: String + + """ + Matches the specified pattern (case-sensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters. + """ + like: String + + """ + Does not match the specified pattern (case-sensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters. + """ + notLike: String + + """ + Matches the specified pattern (case-insensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters. + """ + likeInsensitive: String + + """ + Does not match the specified pattern (case-insensitive). An underscore (_) matches any single character; a percent sign (%) matches any sequence of zero or more characters. + """ + notLikeInsensitive: String + + """Equal to the specified value (case-insensitive).""" + equalToInsensitive: String + + """Not equal to the specified value (case-insensitive).""" + notEqualToInsensitive: String + + """ + Not equal to the specified value, treating null like an ordinary value (case-insensitive). + """ + distinctFromInsensitive: String + + """ + Equal to the specified value, treating null like an ordinary value (case-insensitive). + """ + notDistinctFromInsensitive: String + + """Included in the specified list (case-insensitive).""" + inInsensitive: [String!] + + """Not included in the specified list (case-insensitive).""" + notInInsensitive: [String!] + + """Less than the specified value (case-insensitive).""" + lessThanInsensitive: String + + """Less than or equal to the specified value (case-insensitive).""" + lessThanOrEqualToInsensitive: String + + """Greater than the specified value (case-insensitive).""" + greaterThanInsensitive: String + + """Greater than or equal to the specified value (case-insensitive).""" + greaterThanOrEqualToInsensitive: String +} + +""" +A filter to be used against Boolean fields. All fields are combined with a logical ‘and.’ +""" +input BooleanFilter { + """ + Is null (if \`true\` is specified) or is not null (if \`false\` is specified). + """ + isNull: Boolean + + """Equal to the specified value.""" + equalTo: Boolean + + """Not equal to the specified value.""" + notEqualTo: Boolean + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: Boolean + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: Boolean + + """Included in the specified list.""" + in: [Boolean!] + + """Not included in the specified list.""" + notIn: [Boolean!] + + """Less than the specified value.""" + lessThan: Boolean + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: Boolean + + """Greater than the specified value.""" + greaterThan: Boolean + + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: Boolean +} + +""" +A filter to be used against Datetime fields. All fields are combined with a logical ‘and.’ +""" +input DatetimeFilter { + """ + Is null (if \`true\` is specified) or is not null (if \`false\` is specified). + """ + isNull: Boolean + + """Equal to the specified value.""" + equalTo: Datetime + + """Not equal to the specified value.""" + notEqualTo: Datetime + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: Datetime + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: Datetime + + """Included in the specified list.""" + in: [Datetime!] + + """Not included in the specified list.""" + notIn: [Datetime!] + + """Less than the specified value.""" + lessThan: Datetime + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: Datetime + + """Greater than the specified value.""" + greaterThan: Datetime + + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: Datetime +} + +""" +A filter to be used against Int fields. All fields are combined with a logical ‘and.’ +""" +input IntFilter { + """ + Is null (if \`true\` is specified) or is not null (if \`false\` is specified). + """ + isNull: Boolean + + """Equal to the specified value.""" + equalTo: Int + + """Not equal to the specified value.""" + notEqualTo: Int + + """ + Not equal to the specified value, treating null like an ordinary value. + """ + distinctFrom: Int + + """Equal to the specified value, treating null like an ordinary value.""" + notDistinctFrom: Int + + """Included in the specified list.""" + in: [Int!] + + """Not included in the specified list.""" + notIn: [Int!] + + """Less than the specified value.""" + lessThan: Int + + """Less than or equal to the specified value.""" + lessThanOrEqualTo: Int + + """Greater than the specified value.""" + greaterThan: Int + + """Greater than or equal to the specified value.""" + greaterThanOrEqualTo: Int +} + +""" +A filter to be used against \`User\` object types. All fields are combined with a logical ‘and.’ +""" +input UserFilter { + """Filter by the object’s \`id\` field.""" + id: UUIDFilter + + """Filter by the object’s \`email\` field.""" + email: StringFilter + + """Filter by the object’s \`username\` field.""" + username: StringFilter + + """Filter by the object’s \`displayName\` field.""" + displayName: StringFilter + + """Filter by the object’s \`bio\` field.""" + bio: StringFilter + + """Filter by the object’s \`isActive\` field.""" + isActive: BooleanFilter + + """Filter by the object’s \`role\` field.""" + role: StringFilter + + """Filter by the object’s \`createdAt\` field.""" + createdAt: DatetimeFilter + + """Filter by the object’s \`updatedAt\` field.""" + updatedAt: DatetimeFilter + + """Checks for all expressions in this list.""" + and: [UserFilter!] + + """Checks for any expressions in this list.""" + or: [UserFilter!] + + """Negates the expression.""" + not: UserFilter + + """Filter by the object’s \`authoredPosts\` relation.""" + authoredPosts: UserToManyPostFilter + + """\`authoredPosts\` exist.""" + authoredPostsExist: Boolean + + """Filter by the object’s \`authoredComments\` relation.""" + authoredComments: UserToManyCommentFilter + + """\`authoredComments\` exist.""" + authoredCommentsExist: Boolean +} + +""" +A filter to be used against many \`Post\` object types. All fields are combined with a logical ‘and.’ +""" +input UserToManyPostFilter { + """Filters to entities where at least one related entity matches.""" + some: PostFilter + + """Filters to entities where every related entity matches.""" + every: PostFilter + + """Filters to entities where no related entity matches.""" + none: PostFilter +} + +""" +A filter to be used against many \`Comment\` object types. All fields are combined with a logical ‘and.’ +""" +input UserToManyCommentFilter { + """Filters to entities where at least one related entity matches.""" + some: CommentFilter + + """Filters to entities where every related entity matches.""" + every: CommentFilter + + """Filters to entities where no related entity matches.""" + none: CommentFilter +} + +""" +A filter to be used against \`Comment\` object types. All fields are combined with a logical ‘and.’ +""" +input CommentFilter { + """Filter by the object’s \`id\` field.""" + id: UUIDFilter + + """Filter by the object’s \`postId\` field.""" + postId: UUIDFilter + + """Filter by the object’s \`authorId\` field.""" + authorId: UUIDFilter + + """Filter by the object’s \`parentId\` field.""" + parentId: UUIDFilter + + """Filter by the object’s \`content\` field.""" + content: StringFilter + + """Filter by the object’s \`isApproved\` field.""" + isApproved: BooleanFilter + + """Filter by the object’s \`likesCount\` field.""" + likesCount: IntFilter + + """Filter by the object’s \`createdAt\` field.""" + createdAt: DatetimeFilter + + """Filter by the object’s \`updatedAt\` field.""" + updatedAt: DatetimeFilter + + """Checks for all expressions in this list.""" + and: [CommentFilter!] + + """Checks for any expressions in this list.""" + or: [CommentFilter!] + + """Negates the expression.""" + not: CommentFilter + + """Filter by the object’s \`author\` relation.""" + author: UserFilter + + """Filter by the object’s \`parent\` relation.""" + parent: CommentFilter + + """A related \`parent\` exists.""" + parentExists: Boolean + + """Filter by the object’s \`post\` relation.""" + post: PostFilter + + """Filter by the object’s \`childComments\` relation.""" + childComments: CommentToManyCommentFilter + + """\`childComments\` exist.""" + childCommentsExist: Boolean +} + +""" +A filter to be used against many \`Comment\` object types. All fields are combined with a logical ‘and.’ +""" +input CommentToManyCommentFilter { + """Filters to entities where at least one related entity matches.""" + some: CommentFilter + + """Filters to entities where every related entity matches.""" + every: CommentFilter + + """Filters to entities where no related entity matches.""" + none: CommentFilter +} + +""" +A filter to be used against many \`PostTag\` object types. All fields are combined with a logical ‘and.’ +""" +input PostToManyPostTagFilter { + """Filters to entities where at least one related entity matches.""" + some: PostTagFilter + + """Filters to entities where every related entity matches.""" + every: PostTagFilter + + """Filters to entities where no related entity matches.""" + none: PostTagFilter +} + +""" +A filter to be used against \`PostTag\` object types. All fields are combined with a logical ‘and.’ +""" +input PostTagFilter { + """Filter by the object’s \`id\` field.""" + id: UUIDFilter + + """Filter by the object’s \`postId\` field.""" + postId: UUIDFilter + + """Filter by the object’s \`tagId\` field.""" + tagId: UUIDFilter + + """Filter by the object’s \`createdAt\` field.""" + createdAt: DatetimeFilter + + """Checks for all expressions in this list.""" + and: [PostTagFilter!] + + """Checks for any expressions in this list.""" + or: [PostTagFilter!] + + """Negates the expression.""" + not: PostTagFilter + + """Filter by the object’s \`post\` relation.""" + post: PostFilter + + """Filter by the object’s \`tag\` relation.""" + tag: TagFilter +} + +""" +A filter to be used against \`Tag\` object types. All fields are combined with a logical ‘and.’ +""" +input TagFilter { + """Filter by the object’s \`id\` field.""" + id: UUIDFilter + + """Filter by the object’s \`name\` field.""" + name: StringFilter + + """Filter by the object’s \`slug\` field.""" + slug: StringFilter + + """Filter by the object’s \`description\` field.""" + description: StringFilter + + """Filter by the object’s \`color\` field.""" + color: StringFilter + + """Filter by the object’s \`createdAt\` field.""" + createdAt: DatetimeFilter + + """Checks for all expressions in this list.""" + and: [TagFilter!] + + """Checks for any expressions in this list.""" + or: [TagFilter!] + + """Negates the expression.""" + not: TagFilter + + """Filter by the object’s \`postTags\` relation.""" + postTags: TagToManyPostTagFilter + + """\`postTags\` exist.""" + postTagsExist: Boolean +} + +""" +A filter to be used against many \`PostTag\` object types. All fields are combined with a logical ‘and.’ +""" +input TagToManyPostTagFilter { + """Filters to entities where at least one related entity matches.""" + some: PostTagFilter + + """Filters to entities where every related entity matches.""" + every: PostTagFilter + + """Filters to entities where no related entity matches.""" + none: PostTagFilter +} + +""" +A filter to be used against many \`Comment\` object types. All fields are combined with a logical ‘and.’ +""" +input PostToManyCommentFilter { + """Filters to entities where at least one related entity matches.""" + some: CommentFilter + + """Filters to entities where every related entity matches.""" + every: CommentFilter + + """Filters to entities where no related entity matches.""" + none: CommentFilter +} + +"""Methods to use when ordering \`Post\`.""" +enum PostOrderBy { + NATURAL + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC + ID_ASC + ID_DESC + AUTHOR_ID_ASC + AUTHOR_ID_DESC + SLUG_ASC + SLUG_DESC + PUBLISHED_AT_ASC + PUBLISHED_AT_DESC + CREATED_AT_ASC + CREATED_AT_DESC +} + +"""Methods to use when ordering \`PostTag\`.""" +enum PostTagOrderBy { + NATURAL + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC + ID_ASC + ID_DESC + POST_ID_ASC + POST_ID_DESC + TAG_ID_ASC + TAG_ID_DESC +} + +"""A \`Tag\` edge in the connection, with data from \`PostTag\`.""" +type PostTagsManyToManyEdge { + """A cursor for use in pagination.""" + cursor: Cursor + + """The \`Tag\` at the end of the edge.""" + node: Tag + id: UUID! + createdAt: Datetime +} + +"""Methods to use when ordering \`Tag\`.""" +enum TagOrderBy { + NATURAL + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC + ID_ASC + ID_DESC + NAME_ASC + NAME_DESC + SLUG_ASC + SLUG_DESC +} + +type User { + id: UUID! + email: String! + username: String! + displayName: String + bio: String + isActive: Boolean + role: String + createdAt: Datetime + updatedAt: Datetime + + """Reads and enables pagination through a set of \`Post\`.""" + authoredPosts( + """Only read the first \`n\` values of the set.""" + first: Int + + """Only read the last \`n\` values of the set.""" + last: Int + + """ + Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor + based pagination. May not be used with \`last\`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: PostFilter + + """The method to use when ordering \`Post\`.""" + orderBy: [PostOrderBy!] = [PRIMARY_KEY_ASC] + ): PostConnection! + + """Reads and enables pagination through a set of \`Comment\`.""" + authoredComments( + """Only read the first \`n\` values of the set.""" + first: Int + + """Only read the last \`n\` values of the set.""" + last: Int + + """ + Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor + based pagination. May not be used with \`last\`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CommentFilter + + """The method to use when ordering \`Comment\`.""" + orderBy: [CommentOrderBy!] = [PRIMARY_KEY_ASC] + ): CommentConnection! +} + +"""A connection to a list of \`Post\` values.""" +type PostConnection { + """A list of \`Post\` objects.""" + nodes: [Post]! + + """ + A list of edges which contains the \`Post\` and cursor to aid in pagination. + """ + edges: [PostEdge]! + + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """The count of *all* \`Post\` you could get from the connection.""" + totalCount: Int! +} + +"""A \`Post\` edge in the connection.""" +type PostEdge { + """A cursor for use in pagination.""" + cursor: Cursor + + """The \`Post\` at the end of the edge.""" + node: Post +} + +"""A connection to a list of \`Comment\` values.""" +type CommentConnection { + """A list of \`Comment\` objects.""" + nodes: [Comment]! + + """ + A list of edges which contains the \`Comment\` and cursor to aid in pagination. + """ + edges: [CommentEdge]! + + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """The count of *all* \`Comment\` you could get from the connection.""" + totalCount: Int! +} + +type Comment { + id: UUID! + postId: UUID! + authorId: UUID! + parentId: UUID + content: String! + isApproved: Boolean + likesCount: Int + createdAt: Datetime + updatedAt: Datetime + + """Reads a single \`User\` that is related to this \`Comment\`.""" + author: User + + """Reads a single \`Comment\` that is related to this \`Comment\`.""" + parent: Comment + + """Reads a single \`Post\` that is related to this \`Comment\`.""" + post: Post + + """Reads and enables pagination through a set of \`Comment\`.""" + childComments( + """Only read the first \`n\` values of the set.""" + first: Int + + """Only read the last \`n\` values of the set.""" + last: Int + + """ + Skip the first \`n\` values from our \`after\` cursor, an alternative to cursor + based pagination. May not be used with \`last\`. + """ + offset: Int + + """Read all values in the set before (above) this cursor.""" + before: Cursor + + """Read all values in the set after (below) this cursor.""" + after: Cursor + + """ + A filter to be used in determining which values should be returned by the collection. + """ + filter: CommentFilter + + """The method to use when ordering \`Comment\`.""" + orderBy: [CommentOrderBy!] = [PRIMARY_KEY_ASC] + ): CommentConnection! +} + +"""Methods to use when ordering \`Comment\`.""" +enum CommentOrderBy { + NATURAL + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC + ID_ASC + ID_DESC + POST_ID_ASC + POST_ID_DESC + AUTHOR_ID_ASC + AUTHOR_ID_DESC + PARENT_ID_ASC + PARENT_ID_DESC + CREATED_AT_ASC + CREATED_AT_DESC +} + +"""A \`Comment\` edge in the connection.""" +type CommentEdge { + """A cursor for use in pagination.""" + cursor: Cursor + + """The \`Comment\` at the end of the edge.""" + node: Comment +} + +"""A \`PostTag\` edge in the connection.""" +type PostTagEdge { + """A cursor for use in pagination.""" + cursor: Cursor + + """The \`PostTag\` at the end of the edge.""" + node: PostTag +} + +"""A connection to a list of \`Tag\` values.""" +type TagConnection { + """A list of \`Tag\` objects.""" + nodes: [Tag]! + + """ + A list of edges which contains the \`Tag\` and cursor to aid in pagination. + """ + edges: [TagEdge]! + + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """The count of *all* \`Tag\` you could get from the connection.""" + totalCount: Int! +} + +"""A \`Tag\` edge in the connection.""" +type TagEdge { + """A cursor for use in pagination.""" + cursor: Cursor + + """The \`Tag\` at the end of the edge.""" + node: Tag +} + +"""A connection to a list of \`User\` values.""" +type UserConnection { + """A list of \`User\` objects.""" + nodes: [User]! + + """ + A list of edges which contains the \`User\` and cursor to aid in pagination. + """ + edges: [UserEdge]! + + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """The count of *all* \`User\` you could get from the connection.""" + totalCount: Int! +} + +"""A \`User\` edge in the connection.""" +type UserEdge { + """A cursor for use in pagination.""" + cursor: Cursor + + """The \`User\` at the end of the edge.""" + node: User +} +"""Methods to use when ordering \`User\`.""" +enum UserOrderBy { + NATURAL + PRIMARY_KEY_ASC + PRIMARY_KEY_DESC + ID_ASC + ID_DESC + EMAIL_ASC + EMAIL_DESC + USERNAME_ASC + USERNAME_DESC + CREATED_AT_ASC + CREATED_AT_DESC +} + +"""Root meta schema type""" +type MetaSchema { + tables: [MetaTable!]! +} + +"""Information about a database table""" +type MetaTable { + name: String! + schemaName: String! + fields: [MetaField!]! + indexes: [MetaIndex!]! + constraints: MetaConstraints! + foreignKeyConstraints: [MetaForeignKeyConstraint!]! + primaryKeyConstraints: [MetaPrimaryKeyConstraint!]! + uniqueConstraints: [MetaUniqueConstraint!]! + relations: MetaRelations! + inflection: MetaInflection! + query: MetaQuery! +} + +"""Information about a table field/column""" +type MetaField { + name: String! + type: MetaType! + isNotNull: Boolean! + hasDefault: Boolean! +} + +"""Information about a PostgreSQL type""" +type MetaType { + pgType: String! + gqlType: String! + isArray: Boolean! + isNotNull: Boolean + hasDefault: Boolean +} + +"""Information about a database index""" +type MetaIndex { + name: String! + isUnique: Boolean! + isPrimary: Boolean! + columns: [String!]! + fields: [MetaField!] +} + +"""Table constraints""" +type MetaConstraints { + primaryKey: MetaPrimaryKeyConstraint + unique: [MetaUniqueConstraint!]! + foreignKey: [MetaForeignKeyConstraint!]! +} + +"""Information about a primary key constraint""" +type MetaPrimaryKeyConstraint { + name: String! + fields: [MetaField!]! +} + +"""Information about a unique constraint""" +type MetaUniqueConstraint { + name: String! + fields: [MetaField!]! +} + +"""Information about a foreign key constraint""" +type MetaForeignKeyConstraint { + name: String! + fields: [MetaField!]! + referencedTable: String! + referencedFields: [String!]! + refFields: [MetaField!] + refTable: MetaRefTable +} + +"""Reference to a related table""" +type MetaRefTable { + name: String! +} + +"""Table relations""" +type MetaRelations { + belongsTo: [MetaBelongsToRelation!]! + has: [MetaHasRelation!]! + hasOne: [MetaHasRelation!]! + hasMany: [MetaHasRelation!]! + manyToMany: [MetaManyToManyRelation!]! +} + +"""A belongs-to (forward FK) relation""" +type MetaBelongsToRelation { + fieldName: String + isUnique: Boolean! + type: String + keys: [MetaField!]! + references: MetaRefTable! +} + +"""A has-one or has-many (reverse FK) relation""" +type MetaHasRelation { + fieldName: String + isUnique: Boolean! + type: String + keys: [MetaField!]! + referencedBy: MetaRefTable! +} + +"""A many-to-many relation via junction table""" +type MetaManyToManyRelation { + fieldName: String + type: String + junctionTable: MetaRefTable! + junctionLeftConstraint: MetaForeignKeyConstraint! + junctionLeftKeyAttributes: [MetaField!]! + junctionRightConstraint: MetaForeignKeyConstraint! + junctionRightKeyAttributes: [MetaField!]! + leftKeyAttributes: [MetaField!]! + rightKeyAttributes: [MetaField!]! + rightTable: MetaRefTable! +} + +"""Table inflection names""" +type MetaInflection { + tableType: String! + allRows: String! + connection: String! + edge: String! + filterType: String + orderByType: String! + conditionType: String! + patchType: String + createInputType: String! + createPayloadType: String! + updatePayloadType: String + deletePayloadType: String! +} + +"""Table query/mutation names""" +type MetaQuery { + all: String! + one: String + create: String + update: String + delete: String +} + +""" +The root mutation type which contains root level fields which mutate data. +""" +type Mutation { + """Creates a single \`PostTag\`.""" + createPostTag( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: CreatePostTagInput! + ): CreatePostTagPayload + + """Creates a single \`Tag\`.""" + createTag( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: CreateTagInput! + ): CreateTagPayload + + """Creates a single \`User\`.""" + createUser( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: CreateUserInput! + ): CreateUserPayload + + """Creates a single \`Comment\`.""" + createComment( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: CreateCommentInput! + ): CreateCommentPayload + + """Creates a single \`Post\`.""" + createPost( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: CreatePostInput! + ): CreatePostPayload + + """Updates a single \`PostTag\` using a unique key and a patch.""" + updatePostTag( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: UpdatePostTagInput! + ): UpdatePostTagPayload + + """Updates a single \`Tag\` using a unique key and a patch.""" + updateTag( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: UpdateTagInput! + ): UpdateTagPayload + + """Updates a single \`User\` using a unique key and a patch.""" + updateUser( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: UpdateUserInput! + ): UpdateUserPayload + + """Updates a single \`Comment\` using a unique key and a patch.""" + updateComment( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: UpdateCommentInput! + ): UpdateCommentPayload + + """Updates a single \`Post\` using a unique key and a patch.""" + updatePost( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: UpdatePostInput! + ): UpdatePostPayload + + """Deletes a single \`PostTag\` using a unique key.""" + deletePostTag( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeletePostTagInput! + ): DeletePostTagPayload + + """Deletes a single \`Tag\` using a unique key.""" + deleteTag( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteTagInput! + ): DeleteTagPayload + + """Deletes a single \`User\` using a unique key.""" + deleteUser( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteUserInput! + ): DeleteUserPayload + + """Deletes a single \`Comment\` using a unique key.""" + deleteComment( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeleteCommentInput! + ): DeleteCommentPayload + + """Deletes a single \`Post\` using a unique key.""" + deletePost( + """ + The exclusive input argument for this mutation. An object type, make sure to see documentation for this object’s fields. + """ + input: DeletePostInput! + ): DeletePostPayload +} + +"""The output of our create \`PostTag\` mutation.""" +type CreatePostTagPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`PostTag\` that was created by this mutation.""" + postTag: PostTag + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`PostTag\`. May be used by Relay 1.""" + postTagEdge( + """The method to use when ordering \`PostTag\`.""" + orderBy: [PostTagOrderBy!]! = [PRIMARY_KEY_ASC] + ): PostTagEdge +} + +"""All input for the create \`PostTag\` mutation.""" +input CreatePostTagInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + + """The \`PostTag\` to be created by this mutation.""" + postTag: PostTagInput! +} + +"""An input for mutations affecting \`PostTag\`""" +input PostTagInput { + id: UUID + postId: UUID! + tagId: UUID! + createdAt: Datetime +} + +"""The output of our create \`Tag\` mutation.""" +type CreateTagPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`Tag\` that was created by this mutation.""" + tag: Tag + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`Tag\`. May be used by Relay 1.""" + tagEdge( + """The method to use when ordering \`Tag\`.""" + orderBy: [TagOrderBy!]! = [PRIMARY_KEY_ASC] + ): TagEdge +} + +"""All input for the create \`Tag\` mutation.""" +input CreateTagInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + + """The \`Tag\` to be created by this mutation.""" + tag: TagInput! +} + +"""An input for mutations affecting \`Tag\`""" +input TagInput { + id: UUID + name: String! + slug: String! + description: String + color: String + createdAt: Datetime +} + +"""The output of our create \`User\` mutation.""" +type CreateUserPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`User\` that was created by this mutation.""" + user: User + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`User\`. May be used by Relay 1.""" + userEdge( + """The method to use when ordering \`User\`.""" + orderBy: [UserOrderBy!]! = [PRIMARY_KEY_ASC] + ): UserEdge +} + +"""All input for the create \`User\` mutation.""" +input CreateUserInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + + """The \`User\` to be created by this mutation.""" + user: UserInput! +} + +"""An input for mutations affecting \`User\`""" +input UserInput { + id: UUID + email: String! + username: String! + displayName: String + bio: String + isActive: Boolean + role: String + createdAt: Datetime + updatedAt: Datetime +} + +"""The output of our create \`Comment\` mutation.""" +type CreateCommentPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`Comment\` that was created by this mutation.""" + comment: Comment + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`Comment\`. May be used by Relay 1.""" + commentEdge( + """The method to use when ordering \`Comment\`.""" + orderBy: [CommentOrderBy!]! = [PRIMARY_KEY_ASC] + ): CommentEdge +} + +"""All input for the create \`Comment\` mutation.""" +input CreateCommentInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + + """The \`Comment\` to be created by this mutation.""" + comment: CommentInput! +} + +"""An input for mutations affecting \`Comment\`""" +input CommentInput { + id: UUID + postId: UUID! + authorId: UUID! + parentId: UUID + content: String! + isApproved: Boolean + likesCount: Int + createdAt: Datetime + updatedAt: Datetime +} + +"""The output of our create \`Post\` mutation.""" +type CreatePostPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`Post\` that was created by this mutation.""" + post: Post + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`Post\`. May be used by Relay 1.""" + postEdge( + """The method to use when ordering \`Post\`.""" + orderBy: [PostOrderBy!]! = [PRIMARY_KEY_ASC] + ): PostEdge +} + +"""All input for the create \`Post\` mutation.""" +input CreatePostInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + + """The \`Post\` to be created by this mutation.""" + post: PostInput! +} + +"""An input for mutations affecting \`Post\`""" +input PostInput { + id: UUID + authorId: UUID! + title: String! + slug: String! + content: String + excerpt: String + isPublished: Boolean + publishedAt: Datetime + viewCount: Int + createdAt: Datetime + updatedAt: Datetime +} + +"""The output of our update \`PostTag\` mutation.""" +type UpdatePostTagPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`PostTag\` that was updated by this mutation.""" + postTag: PostTag + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`PostTag\`. May be used by Relay 1.""" + postTagEdge( + """The method to use when ordering \`PostTag\`.""" + orderBy: [PostTagOrderBy!]! = [PRIMARY_KEY_ASC] + ): PostTagEdge +} + +"""All input for the \`updatePostTag\` mutation.""" +input UpdatePostTagInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + id: UUID! + + """ + An object where the defined keys will be set on the \`PostTag\` being updated. + """ + postTagPatch: PostTagPatch! +} + +""" +Represents an update to a \`PostTag\`. Fields that are set will be updated. +""" +input PostTagPatch { + id: UUID + postId: UUID + tagId: UUID + createdAt: Datetime +} + +"""The output of our update \`Tag\` mutation.""" +type UpdateTagPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`Tag\` that was updated by this mutation.""" + tag: Tag + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`Tag\`. May be used by Relay 1.""" + tagEdge( + """The method to use when ordering \`Tag\`.""" + orderBy: [TagOrderBy!]! = [PRIMARY_KEY_ASC] + ): TagEdge +} + +"""All input for the \`updateTag\` mutation.""" +input UpdateTagInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + id: UUID! + + """ + An object where the defined keys will be set on the \`Tag\` being updated. + """ + tagPatch: TagPatch! +} + +"""Represents an update to a \`Tag\`. Fields that are set will be updated.""" +input TagPatch { + id: UUID + name: String + slug: String + description: String + color: String + createdAt: Datetime +} + +"""The output of our update \`User\` mutation.""" +type UpdateUserPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`User\` that was updated by this mutation.""" + user: User + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`User\`. May be used by Relay 1.""" + userEdge( + """The method to use when ordering \`User\`.""" + orderBy: [UserOrderBy!]! = [PRIMARY_KEY_ASC] + ): UserEdge +} + +"""All input for the \`updateUser\` mutation.""" +input UpdateUserInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + id: UUID! + + """ + An object where the defined keys will be set on the \`User\` being updated. + """ + userPatch: UserPatch! +} + +"""Represents an update to a \`User\`. Fields that are set will be updated.""" +input UserPatch { + id: UUID + email: String + username: String + displayName: String + bio: String + isActive: Boolean + role: String + createdAt: Datetime + updatedAt: Datetime +} + +"""The output of our update \`Comment\` mutation.""" +type UpdateCommentPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`Comment\` that was updated by this mutation.""" + comment: Comment + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`Comment\`. May be used by Relay 1.""" + commentEdge( + """The method to use when ordering \`Comment\`.""" + orderBy: [CommentOrderBy!]! = [PRIMARY_KEY_ASC] + ): CommentEdge +} + +"""All input for the \`updateComment\` mutation.""" +input UpdateCommentInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + id: UUID! + + """ + An object where the defined keys will be set on the \`Comment\` being updated. + """ + commentPatch: CommentPatch! +} + +""" +Represents an update to a \`Comment\`. Fields that are set will be updated. +""" +input CommentPatch { + id: UUID + postId: UUID + authorId: UUID + parentId: UUID + content: String + isApproved: Boolean + likesCount: Int + createdAt: Datetime + updatedAt: Datetime +} + +"""The output of our update \`Post\` mutation.""" +type UpdatePostPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`Post\` that was updated by this mutation.""" + post: Post + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`Post\`. May be used by Relay 1.""" + postEdge( + """The method to use when ordering \`Post\`.""" + orderBy: [PostOrderBy!]! = [PRIMARY_KEY_ASC] + ): PostEdge +} + +"""All input for the \`updatePost\` mutation.""" +input UpdatePostInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + id: UUID! + + """ + An object where the defined keys will be set on the \`Post\` being updated. + """ + postPatch: PostPatch! +} + +"""Represents an update to a \`Post\`. Fields that are set will be updated.""" +input PostPatch { + id: UUID + authorId: UUID + title: String + slug: String + content: String + excerpt: String + isPublished: Boolean + publishedAt: Datetime + viewCount: Int + createdAt: Datetime + updatedAt: Datetime +} + +"""The output of our delete \`PostTag\` mutation.""" +type DeletePostTagPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`PostTag\` that was deleted by this mutation.""" + postTag: PostTag + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`PostTag\`. May be used by Relay 1.""" + postTagEdge( + """The method to use when ordering \`PostTag\`.""" + orderBy: [PostTagOrderBy!]! = [PRIMARY_KEY_ASC] + ): PostTagEdge +} + +"""All input for the \`deletePostTag\` mutation.""" +input DeletePostTagInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + id: UUID! +} + +"""The output of our delete \`Tag\` mutation.""" +type DeleteTagPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`Tag\` that was deleted by this mutation.""" + tag: Tag + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`Tag\`. May be used by Relay 1.""" + tagEdge( + """The method to use when ordering \`Tag\`.""" + orderBy: [TagOrderBy!]! = [PRIMARY_KEY_ASC] + ): TagEdge +} + +"""All input for the \`deleteTag\` mutation.""" +input DeleteTagInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + id: UUID! +} + +"""The output of our delete \`User\` mutation.""" +type DeleteUserPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`User\` that was deleted by this mutation.""" + user: User + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`User\`. May be used by Relay 1.""" + userEdge( + """The method to use when ordering \`User\`.""" + orderBy: [UserOrderBy!]! = [PRIMARY_KEY_ASC] + ): UserEdge +} + +"""All input for the \`deleteUser\` mutation.""" +input DeleteUserInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + id: UUID! +} + +"""The output of our delete \`Comment\` mutation.""" +type DeleteCommentPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`Comment\` that was deleted by this mutation.""" + comment: Comment + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`Comment\`. May be used by Relay 1.""" + commentEdge( + """The method to use when ordering \`Comment\`.""" + orderBy: [CommentOrderBy!]! = [PRIMARY_KEY_ASC] + ): CommentEdge +} + +"""All input for the \`deleteComment\` mutation.""" +input DeleteCommentInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + id: UUID! +} + +"""The output of our delete \`Post\` mutation.""" +type DeletePostPayload { + """ + The exact same \`clientMutationId\` that was provided in the mutation input, + unchanged and unused. May be used by a client to track mutations. + """ + clientMutationId: String + + """The \`Post\` that was deleted by this mutation.""" + post: Post + + """ + Our root query field type. Allows us to run any query from our mutation payload. + """ + query: Query + + """An edge for our \`Post\`. May be used by Relay 1.""" + postEdge( + """The method to use when ordering \`Post\`.""" + orderBy: [PostOrderBy!]! = [PRIMARY_KEY_ASC] + ): PostEdge +} + +"""All input for the \`deletePost\` mutation.""" +input DeletePostInput { + """ + An arbitrary string value with no semantic meaning. Will be included in the + payload verbatim. May be used to track mutations by the client. + """ + clientMutationId: String + id: UUID! +}" +`; From 48c8332423e3a91976fc9aecb60053f887108c7b Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Fri, 13 Mar 2026 01:39:49 +0000 Subject: [PATCH 17/19] fix: add missing blank line between UsersEdge and UserOrderBy in snapshot --- .../__tests__/__snapshots__/schema-snapshot.test.ts.snap | 1 + 1 file changed, 1 insertion(+) diff --git a/graphql/server-test/__tests__/__snapshots__/schema-snapshot.test.ts.snap b/graphql/server-test/__tests__/__snapshots__/schema-snapshot.test.ts.snap index fceb1ddf2..a27fc5d07 100644 --- a/graphql/server-test/__tests__/__snapshots__/schema-snapshot.test.ts.snap +++ b/graphql/server-test/__tests__/__snapshots__/schema-snapshot.test.ts.snap @@ -1363,6 +1363,7 @@ type UserEdge { """The \`User\` at the end of the edge.""" node: User } + """Methods to use when ordering \`User\`.""" enum UserOrderBy { NATURAL From f21d0f0d536f1c7aefaed177820368d8b4b9e35c Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Fri, 13 Mar 2026 01:54:36 +0000 Subject: [PATCH 18/19] fix: remove connectionFilterAllowEmptyObjectInput option, handle empty filter at applyPlan level Top-level empty filter {} is now treated as 'no filter' (skipped) instead of throwing an error. Nested empty objects in and/or/not and relation filters are still rejected. This removes the need for the connectionFilterAllowEmptyObjectInput workaround in pgvector tests. --- .../src/augmentations.ts | 1 - .../src/plugins/ConnectionFilterArgPlugin.ts | 20 ++++++++--------- .../ConnectionFilterAttributesPlugin.ts | 8 +------ .../graphile-connection-filter/src/preset.ts | 2 -- .../graphile-connection-filter/src/types.ts | 2 -- .../graphile-connection-filter/src/utils.ts | 22 +++++++++---------- .../src/__tests__/integration.test.ts | 2 +- 7 files changed, 22 insertions(+), 35 deletions(-) diff --git a/graphile/graphile-connection-filter/src/augmentations.ts b/graphile/graphile-connection-filter/src/augmentations.ts index 20820a20c..f72fc2bd9 100644 --- a/graphile/graphile-connection-filter/src/augmentations.ts +++ b/graphile/graphile-connection-filter/src/augmentations.ts @@ -82,7 +82,6 @@ declare global { connectionFilterArrays?: boolean; connectionFilterLogicalOperators?: boolean; connectionFilterAllowNullInput?: boolean; - connectionFilterAllowEmptyObjectInput?: boolean; connectionFilterAllowedFieldTypes?: string[]; connectionFilterAllowedOperators?: string[]; connectionFilterOperatorNames?: Record; diff --git a/graphile/graphile-connection-filter/src/plugins/ConnectionFilterArgPlugin.ts b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterArgPlugin.ts index c3651bed7..a40b923ea 100644 --- a/graphile/graphile-connection-filter/src/plugins/ConnectionFilterArgPlugin.ts +++ b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterArgPlugin.ts @@ -1,6 +1,6 @@ import '../augmentations'; import type { GraphileConfig } from 'graphile-config'; -import { makeAssertAllowed } from '../utils'; +import { isEmpty } from '../utils'; const version = '1.0.0'; @@ -71,8 +71,6 @@ export const ConnectionFilterArgPlugin: GraphileConfig.Plugin = { const FilterType = build.getTypeByName(filterTypeName); if (!FilterType) return args; - const assertAllowed = makeAssertAllowed(build); - // For setof functions returning scalars, track the codec const attributeCodec = resource?.parameters && !resource?.codec.attributes @@ -91,7 +89,7 @@ export const ConnectionFilterArgPlugin: GraphileConfig.Plugin = { applyPlan: EXPORTABLE( ( PgCondition: any, - assertAllowed: any, + isEmpty: any, attributeCodec: any ) => function (_: any, $connection: any, fieldArg: any) { @@ -99,8 +97,8 @@ export const ConnectionFilterArgPlugin: GraphileConfig.Plugin = { fieldArg.apply( $pgSelect, (queryBuilder: any, value: any) => { - assertAllowed(value, 'object'); - if (value == null) return; + // If filter is null/undefined or empty {}, treat as "no filter" — skip + if (value == null || isEmpty(value)) return; const condition = new PgCondition(queryBuilder); if (attributeCodec) { condition.extensions.pgFilterAttribute = { @@ -111,22 +109,22 @@ export const ConnectionFilterArgPlugin: GraphileConfig.Plugin = { } ); }, - [PgCondition, assertAllowed, attributeCodec] + [PgCondition, isEmpty, attributeCodec] ), } : { applyPlan: EXPORTABLE( ( PgCondition: any, - assertAllowed: any, + isEmpty: any, attributeCodec: any ) => function (_: any, $pgSelect: any, fieldArg: any) { fieldArg.apply( $pgSelect, (queryBuilder: any, value: any) => { - assertAllowed(value, 'object'); - if (value == null) return; + // If filter is null/undefined or empty {}, treat as "no filter" — skip + if (value == null || isEmpty(value)) return; const condition = new PgCondition(queryBuilder); if (attributeCodec) { condition.extensions.pgFilterAttribute = { @@ -137,7 +135,7 @@ export const ConnectionFilterArgPlugin: GraphileConfig.Plugin = { } ); }, - [PgCondition, assertAllowed, attributeCodec] + [PgCondition, isEmpty, attributeCodec] ), }), }, diff --git a/graphile/graphile-connection-filter/src/plugins/ConnectionFilterAttributesPlugin.ts b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterAttributesPlugin.ts index 861af9a0f..806c0e3ac 100644 --- a/graphile/graphile-connection-filter/src/plugins/ConnectionFilterAttributesPlugin.ts +++ b/graphile/graphile-connection-filter/src/plugins/ConnectionFilterAttributesPlugin.ts @@ -68,7 +68,6 @@ export const ConnectionFilterAttributesPlugin: GraphileConfig.Plugin = { if (!OperatorsType) continue; const { - connectionFilterAllowEmptyObjectInput, connectionFilterAllowNullInput, } = build.options; @@ -87,7 +86,6 @@ export const ConnectionFilterAttributesPlugin: GraphileConfig.Plugin = { ( PgCondition: any, colSpec: any, - connectionFilterAllowEmptyObjectInput: boolean, connectionFilterAllowNullInput: boolean, isEmpty: (o: unknown) => boolean ) => @@ -95,10 +93,7 @@ export const ConnectionFilterAttributesPlugin: GraphileConfig.Plugin = { if (value === undefined) { return; } - if ( - !connectionFilterAllowEmptyObjectInput && - isEmpty(value) - ) { + if (isEmpty(value)) { throw Object.assign( new Error( 'Empty objects are forbidden in filter argument input.' @@ -124,7 +119,6 @@ export const ConnectionFilterAttributesPlugin: GraphileConfig.Plugin = { [ PgCondition, colSpec, - connectionFilterAllowEmptyObjectInput, connectionFilterAllowNullInput, isEmpty, ] diff --git a/graphile/graphile-connection-filter/src/preset.ts b/graphile/graphile-connection-filter/src/preset.ts index 6bdd0254c..522358718 100644 --- a/graphile/graphile-connection-filter/src/preset.ts +++ b/graphile/graphile-connection-filter/src/preset.ts @@ -44,7 +44,6 @@ const defaultSchemaOptions: ConnectionFilterOptions = { connectionFilterArrays: true, connectionFilterLogicalOperators: true, connectionFilterAllowNullInput: false, - connectionFilterAllowEmptyObjectInput: false, connectionFilterSetofFunctions: true, connectionFilterComputedColumns: true, connectionFilterRelations: false, @@ -57,7 +56,6 @@ const defaultSchemaOptions: ConnectionFilterOptions = { * - `connectionFilterLogicalOperators: false` to exclude and/or/not * - `connectionFilterArrays: false` to exclude array type filters * - `connectionFilterAllowNullInput: true` to allow null literals - * - `connectionFilterAllowEmptyObjectInput: true` to allow empty objects */ export function ConnectionFilterPreset( options: ConnectionFilterOptions = {} diff --git a/graphile/graphile-connection-filter/src/types.ts b/graphile/graphile-connection-filter/src/types.ts index ff46e3af4..226a820bb 100644 --- a/graphile/graphile-connection-filter/src/types.ts +++ b/graphile/graphile-connection-filter/src/types.ts @@ -69,8 +69,6 @@ export interface ConnectionFilterOptions { connectionFilterLogicalOperators?: boolean; /** Allow null literals in filter input. Default: false */ connectionFilterAllowNullInput?: boolean; - /** Allow empty objects in filter input. Default: false */ - connectionFilterAllowEmptyObjectInput?: boolean; /** Restrict which field types can be filtered. Default: all types */ connectionFilterAllowedFieldTypes?: string[]; /** Restrict which operators are available. Default: all operators */ diff --git a/graphile/graphile-connection-filter/src/utils.ts b/graphile/graphile-connection-filter/src/utils.ts index d623fe73c..3319ea62c 100644 --- a/graphile/graphile-connection-filter/src/utils.ts +++ b/graphile/graphile-connection-filter/src/utils.ts @@ -49,28 +49,28 @@ export function getComputedAttributeResources(build: any, source: any): any[] { } /** - * Creates an assertion function that validates filter input values - * based on the connectionFilterAllowNullInput and connectionFilterAllowEmptyObjectInput options. + * Creates an assertion function that validates filter input values. + * + * Rejects empty objects in nested contexts (logical operators, relation filters) + * and optionally rejects null literals based on the connectionFilterAllowNullInput option. + * + * Note: Top-level empty filter `{}` is handled in ConnectionFilterArgPlugin's + * applyPlan — it's treated as "no filter" and skipped, not rejected. */ export function makeAssertAllowed(build: any): (value: unknown, mode: 'object' | 'list') => void { const { options, EXPORTABLE } = build; const { connectionFilterAllowNullInput, - connectionFilterAllowEmptyObjectInput, } = options; const assertAllowed = EXPORTABLE( ( - connectionFilterAllowEmptyObjectInput: boolean, connectionFilterAllowNullInput: boolean, isEmpty: (o: unknown) => boolean ) => function (value: unknown, mode: 'object' | 'list') { - if ( - mode === 'object' && - !connectionFilterAllowEmptyObjectInput && - isEmpty(value) - ) { + // Reject empty objects in nested filter contexts (and/or/not, relation filters) + if (mode === 'object' && isEmpty(value)) { throw Object.assign( new Error( 'Empty objects are forbidden in filter argument input.' @@ -79,7 +79,7 @@ export function makeAssertAllowed(build: any): (value: unknown, mode: 'object' | ); } - if (mode === 'list' && !connectionFilterAllowEmptyObjectInput) { + if (mode === 'list') { const arr = value as unknown[]; if (arr) { const l = arr.length; @@ -106,7 +106,7 @@ export function makeAssertAllowed(build: any): (value: unknown, mode: 'object' | ); } }, - [connectionFilterAllowEmptyObjectInput, connectionFilterAllowNullInput, isEmpty] + [connectionFilterAllowNullInput, isEmpty] ); return assertAllowed; diff --git a/graphile/graphile-pgvector-plugin/src/__tests__/integration.test.ts b/graphile/graphile-pgvector-plugin/src/__tests__/integration.test.ts index 96044940d..7f53056a8 100644 --- a/graphile/graphile-pgvector-plugin/src/__tests__/integration.test.ts +++ b/graphile/graphile-pgvector-plugin/src/__tests__/integration.test.ts @@ -50,7 +50,7 @@ describe('graphile-pgvector-plugin integration', () => { const testPreset = { extends: [ VectorCodecPreset, - ConnectionFilterPreset({ connectionFilterAllowEmptyObjectInput: true }), + ConnectionFilterPreset(), ], }; From 72ac8fe65a9e6462f40e342eb88d0147c6ffe775 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Fri, 13 Mar 2026 02:33:48 +0000 Subject: [PATCH 19/19] feat: tighten TypeScript types in satellite filter plugins - Extract shared getQueryBuilder utility into graphile-connection-filter/src/utils.ts - Remove duplicate getQueryBuilder from search, BM25, and pgvector plugins - Replace (build as any).dataplanPg with build.dataplanPg (already typed on Build) - Replace (build as any).behavior with build.behavior (already typed on Build) - Replace (build as any).input.pgRegistry with build.input.pgRegistry (already typed) - Remove scope destructuring as any casts (pgCodec already typed on ScopeInputObject) - Add pgCodec comment to augmentations.ts noting it's already declared by graphile-build-pg - Export getQueryBuilder from graphile-connection-filter for satellite plugin use --- .../src/augmentations.ts | 1 + .../graphile-connection-filter/src/index.ts | 17 +++++- .../graphile-connection-filter/src/utils.ts | 47 +++++++++++++++ .../src/bm25-search.ts | 46 ++------------- .../src/vector-search.ts | 47 ++------------- graphile/graphile-search-plugin/src/plugin.ts | 57 ++++--------------- 6 files changed, 81 insertions(+), 134 deletions(-) diff --git a/graphile/graphile-connection-filter/src/augmentations.ts b/graphile/graphile-connection-filter/src/augmentations.ts index f72fc2bd9..3f8ff6978 100644 --- a/graphile/graphile-connection-filter/src/augmentations.ts +++ b/graphile/graphile-connection-filter/src/augmentations.ts @@ -53,6 +53,7 @@ declare global { interface ScopeInputObject { /** True if this is a table-level connection filter type (e.g. UserFilter) */ isPgConnectionFilter?: boolean; + // pgCodec is already declared by graphile-build-pg on ScopeInputObject /** Operator type scope data (present on scalar filter types like StringFilter) */ pgConnectionFilterOperators?: PgConnectionFilterOperatorsScope; /** Foreign table resource (used by many filter types) */ diff --git a/graphile/graphile-connection-filter/src/index.ts b/graphile/graphile-connection-filter/src/index.ts index 1fc61bb53..0526aadc4 100644 --- a/graphile/graphile-connection-filter/src/index.ts +++ b/graphile/graphile-connection-filter/src/index.ts @@ -18,14 +18,24 @@ * For satellite plugins that need to register custom operators: * ```typescript * // In your plugin's init hook: - * const addConnectionFilterOperator = (build as any).addConnectionFilterOperator; - * if (typeof addConnectionFilterOperator === 'function') { - * addConnectionFilterOperator('MyType', 'myOperator', { + * if (typeof build.addConnectionFilterOperator === 'function') { + * build.addConnectionFilterOperator('MyType', 'myOperator', { * description: 'My custom operator', * resolve: (sqlIdentifier, sqlValue) => sql`${sqlIdentifier} OP ${sqlValue}`, * }); * } * ``` + * + * For satellite plugins that need to access the query builder from a filter apply: + * ```typescript + * import { getQueryBuilder } from 'graphile-connection-filter'; + * // In your filter field's apply callback: + * const qb = getQueryBuilder(build, $condition); + * if (qb) { + * const idx = qb.selectAndReturnIndex(sql`...`); + * qb.setMeta('key', { selectIndex: idx }); + * } + * ``` */ export { ConnectionFilterPreset } from './preset'; @@ -58,6 +68,7 @@ export { $$filters } from './types'; export { isEmpty, makeAssertAllowed, + getQueryBuilder, isComputedScalarAttributeResource, getComputedAttributeResources, } from './utils'; diff --git a/graphile/graphile-connection-filter/src/utils.ts b/graphile/graphile-connection-filter/src/utils.ts index 3319ea62c..411798206 100644 --- a/graphile/graphile-connection-filter/src/utils.ts +++ b/graphile/graphile-connection-filter/src/utils.ts @@ -48,6 +48,53 @@ export function getComputedAttributeResources(build: any, source: any): any[] { return computedAttributeSources; } +/** + * Walks from a PgCondition up to the PgSelectQueryBuilder. + * Uses the .parent property on PgCondition to traverse up the chain, + * following Benjie's pattern from postgraphile-plugin-fulltext-filter. + * + * This is used by satellite plugins (search, BM25, pgvector) that need + * to access the query builder from within a filter's apply callback + * to inject SELECT expressions (for ranking/scoring) and ORDER BY clauses. + * + * @param build - The Graphile Build object (needs build.dataplanPg.PgCondition) + * @param $condition - The PgCondition instance from the filter apply callback + * @returns The PgSelectQueryBuilder if found, or null + */ +export function getQueryBuilder( + build: GraphileBuild.Build, + $condition: any +): any | null { + const PgCondition = build.dataplanPg?.PgCondition; + if (!PgCondition) return null; + + let current = $condition; + const { alias } = current; + + // Walk up through nested PgConditions (e.g. and/or/not) + // Note: PgCondition.parent is protected, so we use bracket notation + // to access it from outside the class hierarchy. + while ( + current && + current instanceof PgCondition && + current.alias === alias + ) { + current = (current as any)['parent']; + } + + // Verify we found a query builder with matching alias + // Using duck-typing per Benjie's pattern + if ( + current && + typeof current.selectAndReturnIndex === 'function' && + current.alias === alias + ) { + return current; + } + + return null; +} + /** * Creates an assertion function that validates filter input values. * diff --git a/graphile/graphile-pg-textsearch-plugin/src/bm25-search.ts b/graphile/graphile-pg-textsearch-plugin/src/bm25-search.ts index 92676440d..9f385250a 100644 --- a/graphile/graphile-pg-textsearch-plugin/src/bm25-search.ts +++ b/graphile/graphile-pg-textsearch-plugin/src/bm25-search.ts @@ -39,6 +39,7 @@ import 'graphile-connection-filter'; import { TYPES } from '@dataplan/pg'; import type { PgCodecWithAttributes } from '@dataplan/pg'; import type { GraphileConfig } from 'graphile-config'; +import { getQueryBuilder } from 'graphile-connection-filter'; import type { Bm25SearchPluginOptions, Bm25IndexInfo } from './types'; import { bm25IndexStore, bm25ExtensionDetected } from './bm25-codec'; import { QuoteUtils } from '@pgsql/quotes'; @@ -105,45 +106,6 @@ function isTextCodec(codec: any): boolean { return name === 'text' || name === 'varchar' || name === 'bpchar'; } -/** - * Walks from a PgCondition up to the PgSelectQueryBuilder. - * Uses the .parent property on PgCondition to traverse up the chain, - * following Benjie's pattern from postgraphile-plugin-fulltext-filter. - * - * Returns the query builder if found, or null if the traversal fails. - */ -function getQueryBuilder( - build: any, - $condition: any -): any | null { - const PgCondition = build.dataplanPg?.PgCondition; - if (!PgCondition) return null; - - let current = $condition; - const { alias } = current; - - // Walk up through nested PgConditions (e.g. and/or/not) - while ( - current && - current instanceof PgCondition && - current.alias === alias - ) { - current = (current as any).parent; - } - - // Verify we found a query builder with matching alias - // Using duck-typing (isPgSelectQueryBuilder) per Benjie's pattern - if ( - current && - typeof current.selectAndReturnIndex === 'function' && - current.alias === alias - ) { - return current; - } - - return null; -} - /** * Creates the BM25 search plugin with the given options. */ @@ -295,7 +257,7 @@ export function createBm25SearchPlugin( } const codec = rawPgCodec as PgCodecWithAttributes; - const behavior = (build as any).behavior; + const behavior = build.behavior; let newFields = fields; @@ -395,7 +357,7 @@ export function createBm25SearchPlugin( } const codec = rawPgCodec as PgCodecWithAttributes; - const behavior = (build as any).behavior; + const behavior = build.behavior; let newValues = values; @@ -466,7 +428,7 @@ export function createBm25SearchPlugin( GraphQLInputObjectType_fields(fields, build, context) { const { inflection, sql } = build; const { - scope: { isPgConnectionFilter, pgCodec } = {} as any, + scope: { isPgConnectionFilter, pgCodec } = {}, fieldWithHooks, } = context; diff --git a/graphile/graphile-pgvector-plugin/src/vector-search.ts b/graphile/graphile-pgvector-plugin/src/vector-search.ts index ef130c000..7a5330e76 100644 --- a/graphile/graphile-pgvector-plugin/src/vector-search.ts +++ b/graphile/graphile-pgvector-plugin/src/vector-search.ts @@ -23,9 +23,11 @@ import 'graphile-build'; import 'graphile-build-pg'; +import 'graphile-connection-filter'; import { TYPES } from '@dataplan/pg'; import type { PgCodecWithAttributes } from '@dataplan/pg'; import type { GraphileConfig } from 'graphile-config'; +import { getQueryBuilder } from 'graphile-connection-filter'; import type { VectorSearchPluginOptions } from './types'; // ─── TypeScript Namespace Augmentations ────────────────────────────────────── @@ -82,45 +84,6 @@ function isVectorCodec(codec: any): boolean { return codec?.name === 'vector'; } -/** - * Walks from a PgCondition up to the PgSelectQueryBuilder. - * Uses the .parent property on PgCondition to traverse up the chain, - * following Benjie's pattern from postgraphile-plugin-fulltext-filter. - * - * Returns the query builder if found, or null if the traversal fails. - */ -function getQueryBuilder( - build: any, - $condition: any -): any | null { - const PgCondition = build.dataplanPg?.PgCondition; - if (!PgCondition) return null; - - let current = $condition; - const { alias } = current; - - // Walk up through nested PgConditions (e.g. and/or/not) - while ( - current && - current instanceof PgCondition && - current.alias === alias - ) { - current = (current as any).parent; - } - - // Verify we found a query builder with matching alias - // Using duck-typing (isPgSelectQueryBuilder) per Benjie's pattern - if ( - current && - typeof current.selectAndReturnIndex === 'function' && - current.alias === alias - ) { - return current; - } - - return null; -} - /** * Creates the vector search plugin with the given options. */ @@ -294,7 +257,7 @@ export function createVectorSearchPlugin( } const codec = rawPgCodec as PgCodecWithAttributes; - const behavior = (build as any).behavior; + const behavior = build.behavior; let newFields = fields; @@ -391,7 +354,7 @@ export function createVectorSearchPlugin( } const codec = rawPgCodec as PgCodecWithAttributes; - const behavior = (build as any).behavior; + const behavior = build.behavior; let newValues = values; @@ -464,7 +427,7 @@ export function createVectorSearchPlugin( GraphQLInputObjectType_fields(fields, build, context) { const { inflection, sql } = build; const { - scope: { isPgConnectionFilter, pgCodec } = {} as any, + scope: { isPgConnectionFilter, pgCodec } = {}, fieldWithHooks, } = context; diff --git a/graphile/graphile-search-plugin/src/plugin.ts b/graphile/graphile-search-plugin/src/plugin.ts index 02dd1cda4..f53dde33a 100644 --- a/graphile/graphile-search-plugin/src/plugin.ts +++ b/graphile/graphile-search-plugin/src/plugin.ts @@ -38,6 +38,7 @@ import { TYPES } from '@dataplan/pg'; import type { PgCodecWithAttributes, PgResource } from '@dataplan/pg'; import type { GraphileConfig } from 'graphile-config'; import type { SQL } from 'pg-sql2'; +import { getQueryBuilder } from 'graphile-connection-filter'; import type { PgSearchPluginOptions } from './types'; // ─── TypeScript Namespace Augmentations ────────────────────────────────────── @@ -115,44 +116,6 @@ function isTsvectorCodec(codec: any): boolean { ); } -/** - * Walks from a PgCondition up to the PgSelectQueryBuilder. - * Uses the .parent property on PgCondition to traverse up the chain, - * following Benjie's pattern from postgraphile-plugin-fulltext-filter. - * - * Returns the query builder if found, or null if the traversal fails. - */ -function getQueryBuilder( - build: any, - $condition: any -): any | null { - const PgCondition = build.dataplanPg?.PgCondition; - if (!PgCondition) return null; - - let current = $condition; - const { alias } = current; - - // Walk up through nested PgConditions (e.g. and/or/not) - while ( - current && - current instanceof PgCondition && - current.alias === alias - ) { - current = (current as any).parent; - } - - // Verify we found a query builder with matching alias - if ( - current && - typeof current.selectAndReturnIndex === 'function' && - current.alias === alias - ) { - return current; - } - - return null; -} - /** * Creates the search plugin with the given options. */ @@ -274,7 +237,7 @@ export function createPgSearchPlugin( // Register the `matches` filter operator for the FullText scalar. // Requires graphile-connection-filter; skip if not loaded. if (typeof build.addConnectionFilterOperator === 'function') { - const TYPES = (build as any).dataplanPg?.TYPES; + const TYPES = build.dataplanPg?.TYPES; build.addConnectionFilterOperator(fullTextScalarName, 'matches', { description: 'Performs a full text search on the field.', resolveType: () => GraphQLString, @@ -310,8 +273,8 @@ export function createPgSearchPlugin( } const codec = rawPgCodec as PgCodecWithAttributes; - const behavior = (build as any).behavior; - const pgRegistry = (build as any).input?.pgRegistry; + const behavior = build.behavior; + const pgRegistry = build.input.pgRegistry; // Helper to add a rank field for a given base field name function addTsvField( @@ -400,7 +363,7 @@ export function createPgSearchPlugin( if (pgRegistry) { const tsvProcs = Object.values(pgRegistry.pgResources).filter( (r: any): boolean => { - if (r.codec !== (build as any).dataplanPg?.TYPES?.tsvector) return false; + if (r.codec !== (build.dataplanPg?.TYPES as any)?.tsvector) return false; if (!r.parameters) return false; if (!r.parameters[0]) return false; if (r.parameters[0].codec !== codec) return false; @@ -447,8 +410,8 @@ export function createPgSearchPlugin( } const codec = rawPgCodec as PgCodecWithAttributes; - const behavior = (build as any).behavior; - const pgRegistry = (build as any).input?.pgRegistry; + const behavior = build.behavior; + const pgRegistry = build.input.pgRegistry; let newValues = values; @@ -510,7 +473,7 @@ export function createPgSearchPlugin( if (pgRegistry) { const tsvProcs = Object.values(pgRegistry.pgResources).filter( (r: any): boolean => { - if (r.codec !== (build as any).dataplanPg?.TYPES?.tsvector) return false; + if (r.codec !== (build.dataplanPg?.TYPES as any)?.tsvector) return false; if (!r.parameters) return false; if (!r.parameters[0]) return false; if (r.parameters[0].codec !== codec) return false; @@ -553,7 +516,7 @@ export function createPgSearchPlugin( graphql: { GraphQLString }, } = build; const { - scope: { isPgConnectionFilter, pgCodec } = {} as any, + scope: { isPgConnectionFilter, pgCodec } = {}, fieldWithHooks, } = context; @@ -633,7 +596,7 @@ export function createPgSearchPlugin( const orderRequest = qb.getMetaRaw(orderMetaKey) as FtsOrderByRequest | undefined; if (orderRequest) { qb.orderBy({ - codec: (build as any).dataplanPg?.TYPES?.float, + codec: build.dataplanPg?.TYPES?.float, fragment: scoreFragment, direction: orderRequest.direction, });