diff --git a/.changeset/eleven-pugs-send.md b/.changeset/eleven-pugs-send.md new file mode 100644 index 000000000..1c2370f1b --- /dev/null +++ b/.changeset/eleven-pugs-send.md @@ -0,0 +1,5 @@ +--- +'hive': minor +--- + +Store schema proposal changes on a separate column in the schema check; update graphql inspector diff --git a/integration-tests/tests/api/schema/publish.spec.ts b/integration-tests/tests/api/schema/publish.spec.ts index 879fa60c8..b77c59564 100644 --- a/integration-tests/tests/api/schema/publish.spec.ts +++ b/integration-tests/tests/api/schema/publish.spec.ts @@ -1807,7 +1807,7 @@ describe('schema publishing changes are persisted', () => { `, schemaAfter: /* GraphQL */ ` type Query { - a(a: String): String! + a(a: String): String } `, equalsObject: { diff --git a/package.json b/package.json index e5f77a319..20e7012a4 100644 --- a/package.json +++ b/package.json @@ -73,9 +73,9 @@ "@graphql-codegen/typescript-resolvers": "5.1.0", "@graphql-codegen/urql-introspection": "3.0.1", "@graphql-eslint/eslint-plugin": "3.20.1", - "@graphql-inspector/cli": "6.0.0", - "@graphql-inspector/core": "7.1.0", - "@graphql-inspector/patch": "0.1.0", + "@graphql-inspector/cli": "6.0.6", + "@graphql-inspector/core": "7.1.1", + "@graphql-inspector/patch": "0.1.1", "@graphql-tools/load": "8.1.2", "@manypkg/get-packages": "2.2.2", "@next/eslint-plugin-next": "14.2.23", diff --git a/packages/libraries/cli/package.json b/packages/libraries/cli/package.json index d310eae0c..c493abd68 100644 --- a/packages/libraries/cli/package.json +++ b/packages/libraries/cli/package.json @@ -49,7 +49,7 @@ }, "dependencies": { "@graphql-hive/core": "workspace:*", - "@graphql-inspector/core": "7.1.0", + "@graphql-inspector/core": "7.1.1", "@graphql-tools/code-file-loader": "~8.1.0", "@graphql-tools/graphql-file-loader": "~8.1.0", "@graphql-tools/json-file-loader": "~8.0.0", diff --git a/packages/migrations/src/actions/2026.01.25T00-00-00.checks-proposals-changes.ts b/packages/migrations/src/actions/2026.01.25T00-00-00.checks-proposals-changes.ts new file mode 100644 index 000000000..0d10947d7 --- /dev/null +++ b/packages/migrations/src/actions/2026.01.25T00-00-00.checks-proposals-changes.ts @@ -0,0 +1,15 @@ +import { type MigrationExecutor } from '../pg-migrator'; + +export default { + name: '2026.01.25T00-00-00.checks-proposals-changes.ts', + run: ({ sql }) => [ + { + name: 'add schema proposal changes to schema_checks table', + query: sql` + ALTER TABLE IF EXISTS "schema_checks" + ADD COLUMN IF NOT EXISTS "schema_proposal_changes" jsonb + ; + `, + }, + ], +} satisfies MigrationExecutor; diff --git a/packages/migrations/src/run-pg-migrations.ts b/packages/migrations/src/run-pg-migrations.ts index 846bf74ee..9ffa4dd93 100644 --- a/packages/migrations/src/run-pg-migrations.ts +++ b/packages/migrations/src/run-pg-migrations.ts @@ -177,5 +177,6 @@ export const runPGMigrations = async (args: { slonik: DatabasePool; runTo?: stri await import('./actions/2025.12.17T00-00-00.custom-oidc-scopes'), await import('./actions/2025.12.12T00-00-00.workflows-deduplication'), await import('./actions/2026.01.09T10.00.00.target-validation-app-deployment-exclusion'), + await import('./actions/2026.01.25T00-00-00.checks-proposals-changes'), ], }); diff --git a/packages/migrations/test/2024.01.26T00.00.01.schema-check-purging.test.ts b/packages/migrations/test/2024.01.26T00.00.01.schema-check-purging.test.ts index c672cf6e7..cffd50627 100644 --- a/packages/migrations/test/2024.01.26T00.00.01.schema-check-purging.test.ts +++ b/packages/migrations/test/2024.01.26T00.00.01.schema-check-purging.test.ts @@ -84,6 +84,7 @@ describe('schema check purging', async () => { conditionalBreakingChangeMetadata: null, serviceUrl: null, schemaProposalId: null, + schemaProposalChanges: null, }); let schemaCheckCount = await db.oneFirst( @@ -168,6 +169,7 @@ describe('schema check purging', async () => { conditionalBreakingChangeMetadata: null, serviceUrl: null, schemaProposalId: null, + schemaProposalChanges: null, }); await storage.createSchemaCheck({ @@ -195,6 +197,7 @@ describe('schema check purging', async () => { conditionalBreakingChangeMetadata: null, serviceUrl: null, schemaProposalId: null, + schemaProposalChanges: null, }); let schemaCheckCount = await db.oneFirst( @@ -279,6 +282,7 @@ describe('schema check purging', async () => { conditionalBreakingChangeMetadata: null, serviceUrl: null, schemaProposalId: null, + schemaProposalChanges: null, }); await storage.createSchemaCheck({ @@ -306,6 +310,7 @@ describe('schema check purging', async () => { conditionalBreakingChangeMetadata: null, serviceUrl: null, schemaProposalId: null, + schemaProposalChanges: null, }); let schemaCheckCount = await db.oneFirst( @@ -400,6 +405,7 @@ describe('schema check purging', async () => { conditionalBreakingChangeMetadata: null, serviceUrl: null, schemaProposalId: null, + schemaProposalChanges: null, }); await storage.createSchemaCheck({ @@ -427,6 +433,7 @@ describe('schema check purging', async () => { conditionalBreakingChangeMetadata: null, serviceUrl: null, schemaProposalId: null, + schemaProposalChanges: null, }); let schemaCheckCount = await db.oneFirst( @@ -579,6 +586,7 @@ describe('schema check purging', async () => { conditionalBreakingChangeMetadata: null, serviceUrl: null, schemaProposalId: null, + schemaProposalChanges: null, }); await storage.createSchemaCheck({ @@ -606,6 +614,7 @@ describe('schema check purging', async () => { conditionalBreakingChangeMetadata: null, serviceUrl: null, schemaProposalId: null, + schemaProposalChanges: null, }); let schemaCheckCount = await db.oneFirst( @@ -755,6 +764,7 @@ describe('schema check purging', async () => { conditionalBreakingChangeMetadata: null, serviceUrl: null, schemaProposalId: null, + schemaProposalChanges: null, }); let sdlStoreCount = await db.oneFirst(sql`SELECT count(*) as total FROM sdl_store`); @@ -867,6 +877,7 @@ describe('schema check purging', async () => { conditionalBreakingChangeMetadata: null, serviceUrl: null, schemaProposalId: null, + schemaProposalChanges: null, }); let schemaCheckCount = await db.oneFirst( @@ -1028,6 +1039,7 @@ describe('schema check purging', async () => { conditionalBreakingChangeMetadata: null, serviceUrl: null, schemaProposalId: null, + schemaProposalChanges: null, }); await storage.createSchemaCheck({ @@ -1074,6 +1086,7 @@ describe('schema check purging', async () => { conditionalBreakingChangeMetadata: null, serviceUrl: null, schemaProposalId: null, + schemaProposalChanges: null, }); let schemaCheckCount = await db.oneFirst( diff --git a/packages/services/api/package.json b/packages/services/api/package.json index dd0627c6a..18d939995 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -17,7 +17,7 @@ "@date-fns/utc": "2.1.1", "@graphql-hive/core": "workspace:*", "@graphql-hive/signal": "1.0.0", - "@graphql-inspector/core": "7.1.0", + "@graphql-inspector/core": "7.1.1", "@graphql-tools/merge": "9.1.1", "@hive/cdn-script": "workspace:*", "@hive/schema": "workspace:*", diff --git a/packages/services/api/src/modules/proposals/module.graphql.ts b/packages/services/api/src/modules/proposals/module.graphql.ts index 7e941cac4..010c25de9 100644 --- a/packages/services/api/src/modules/proposals/module.graphql.ts +++ b/packages/services/api/src/modules/proposals/module.graphql.ts @@ -453,6 +453,8 @@ export default gql` | DirectiveUsageArgumentDefinitionAdded | DirectiveUsageArgumentAdded | DirectiveUsageArgumentRemoved + | DirectiveRepeatableAdded + | DirectiveRepeatableRemoved # Directive @@ -662,12 +664,14 @@ export default gql` addedUnionMemberTypeName: String! addedDirectiveName: String! addedToNewType: Boolean + directiveRepeatedTimes: Int! } type DirectiveUsageUnionMemberRemoved { unionName: String! removedUnionMemberTypeName: String! removedDirectiveName: String! + directiveRepeatedTimes: Int! } type FieldArgumentAdded { @@ -820,11 +824,13 @@ export default gql` enumName: String! addedDirectiveName: String! addedToNewType: Boolean + directiveRepeatedTimes: Int! } type DirectiveUsageEnumRemoved { enumName: String! removedDirectiveName: String! + directiveRepeatedTimes: Int! } type DirectiveUsageEnumValueAdded { @@ -832,12 +838,14 @@ export default gql` enumValueName: String! addedDirectiveName: String! addedToNewType: Boolean + directiveRepeatedTimes: Int! } type DirectiveUsageEnumValueRemoved { enumName: String! enumValueName: String! removedDirectiveName: String! + directiveRepeatedTimes: Int! } type DirectiveUsageInputObjectRemoved { @@ -846,6 +854,7 @@ export default gql` isRemovedInputFieldTypeNullable: Boolean removedInputFieldType: String! removedDirectiveName: String! + directiveRepeatedTimes: Int! } type DirectiveUsageInputObjectAdded { @@ -855,6 +864,7 @@ export default gql` addedInputFieldType: String! addedDirectiveName: String! addedToNewType: Boolean + directiveRepeatedTimes: Int! } type DirectiveUsageInputFieldDefinitionAdded { @@ -863,63 +873,74 @@ export default gql` inputFieldType: String! addedDirectiveName: String! addedToNewType: Boolean + directiveRepeatedTimes: Int! } type DirectiveUsageInputFieldDefinitionRemoved { inputObjectName: String! inputFieldName: String! removedDirectiveName: String! + directiveRepeatedTimes: Int! } type DirectiveUsageFieldAdded { typeName: String! fieldName: String! addedDirectiveName: String! + directiveRepeatedTimes: Int! } type DirectiveUsageFieldRemoved { typeName: String! fieldName: String! removedDirectiveName: String! + directiveRepeatedTimes: Int! } type DirectiveUsageScalarAdded { scalarName: String! addedDirectiveName: String! addedToNewType: Boolean + directiveRepeatedTimes: Int! } type DirectiveUsageScalarRemoved { scalarName: String! removedDirectiveName: String! + directiveRepeatedTimes: Int! } type DirectiveUsageObjectAdded { objectName: String! addedDirectiveName: String! addedToNewType: Boolean + directiveRepeatedTimes: Int! } type DirectiveUsageObjectRemoved { objectName: String! removedDirectiveName: String! + directiveRepeatedTimes: Int! } type DirectiveUsageInterfaceAdded { interfaceName: String! addedDirectiveName: String! addedToNewType: Boolean + directiveRepeatedTimes: Int! } type DirectiveUsageSchemaAdded { addedDirectiveName: String! schemaTypeName: String! addedToNewType: Boolean + directiveRepeatedTimes: Int! } type DirectiveUsageSchemaRemoved { removedDirectiveName: String! schemaTypeName: String! + directiveRepeatedTimes: Int! } type DirectiveUsageFieldDefinitionAdded { @@ -927,12 +948,14 @@ export default gql` fieldName: String! addedDirectiveName: String! addedToNewType: Boolean + directiveRepeatedTimes: Int! } type DirectiveUsageFieldDefinitionRemoved { typeName: String! fieldName: String! removedDirectiveName: String! + directiveRepeatedTimes: Int! } type DirectiveUsageArgumentDefinitionRemoved { @@ -940,11 +963,13 @@ export default gql` fieldName: String! argumentName: String! removedDirectiveName: String! + directiveRepeatedTimes: Int! } type DirectiveUsageInterfaceRemoved { interfaceName: String! removedDirectiveName: String! + directiveRepeatedTimes: Int! } type DirectiveUsageArgumentDefinitionAdded { @@ -953,6 +978,7 @@ export default gql` argumentName: String! addedDirectiveName: String! addedToNewType: Boolean + directiveRepeatedTimes: Int! } type DirectiveUsageArgumentAdded { @@ -964,6 +990,7 @@ export default gql` parentFieldName: String parentArgumentName: String parentEnumValueName: String + directiveRepeatedTimes: Int! } type DirectiveUsageArgumentRemoved { @@ -973,5 +1000,14 @@ export default gql` parentFieldName: String parentArgumentName: String parentEnumValueName: String + directiveRepeatedTimes: Int! + } + + type DirectiveRepeatableAdded { + directiveName: String! + } + + type DirectiveRepeatableRemoved { + directiveName: String! } `; diff --git a/packages/services/api/src/modules/proposals/providers/schema-proposal-manager.ts b/packages/services/api/src/modules/proposals/providers/schema-proposal-manager.ts index 99bb55886..0436de391 100644 --- a/packages/services/api/src/modules/proposals/providers/schema-proposal-manager.ts +++ b/packages/services/api/src/modules/proposals/providers/schema-proposal-manager.ts @@ -3,7 +3,6 @@ */ import { Injectable, Scope } from 'graphql-modules'; import { TargetReferenceInput } from 'packages/libraries/core/src/client/__generated__/types'; -import { SchemaChangeType } from '@hive/storage'; import { SchemaProposalCheckInput, SchemaProposalStage } from '../../../__generated__/types'; import { HiveError } from '../../../shared/errors'; import { Session } from '../../auth/lib/authz'; @@ -57,7 +56,6 @@ export class SchemaProposalManager { } const proposal = createProposalResult.proposal; - const changes: SchemaChangeType[] = []; const checkPromises = args.initialChecks.map(async check => { const result = await this.schemaPublisher.check({ ...check, @@ -66,10 +64,8 @@ export class SchemaProposalManager { schemaProposalId: proposal.id, }); if ('changes' in result && result.changes) { - changes.push(...result.changes); return { ...result, - changes: result.changes, errors: result.errors?.map(error => ({ ...error, diff --git a/packages/services/api/src/modules/schema/module.graphql.ts b/packages/services/api/src/modules/schema/module.graphql.ts index 8ec7ddb3d..0540e6a9e 100644 --- a/packages/services/api/src/modules/schema/module.graphql.ts +++ b/packages/services/api/src/modules/schema/module.graphql.ts @@ -727,6 +727,11 @@ export default gql` valid: Boolean! initial: Boolean! changes: SchemaChangeConnection + """ + If the check is associated with a schema proposal, then this contains an unfiltered list of changes + to the SDL. + """ + schemaProposalChanges: SchemaChangeConnection warnings: SchemaWarningConnection schemaCheck: SchemaCheck } @@ -740,6 +745,11 @@ export default gql` type SchemaCheckError { valid: Boolean! + """ + If the check is associated with a schema proposal, then this contains an unfiltered list of changes + to the SDL. + """ + schemaProposalChanges: SchemaChangeConnection changes: SchemaChangeConnection errors: SchemaErrorConnection! warnings: SchemaWarningConnection @@ -1335,6 +1345,12 @@ export default gql` """ hasSchemaChanges: Boolean! + """ + If the check is associated with a schema proposal, then this contains an unfiltered list of changes + to the SDL. + """ + schemaProposalChanges: SchemaChangeConnection + schemaChanges: SchemaChangeConnection @tag(name: "public") breakingSchemaChanges: SchemaChangeConnection safeSchemaChanges: SchemaChangeConnection @@ -1486,6 +1502,12 @@ export default gql` """ hasSchemaChanges: Boolean! + """ + If the check is associated with a schema proposal, then this contains an unfiltered list of changes + to the SDL. + """ + schemaProposalChanges: SchemaChangeConnection + schemaChanges: SchemaChangeConnection @tag(name: "public") """ Breaking changes can exist in an successful schema check if the check was manually approved. @@ -1583,6 +1605,12 @@ export default gql` """ hasSchemaChanges: Boolean! + """ + If the check is associated with a schema proposal, then this contains an unfiltered list of changes + to the SDL. + """ + schemaProposalChanges: SchemaChangeConnection + schemaChanges: SchemaChangeConnection @tag(name: "public") breakingSchemaChanges: SchemaChangeConnection safeSchemaChanges: SchemaChangeConnection diff --git a/packages/services/api/src/modules/schema/providers/inspector.ts b/packages/services/api/src/modules/schema/providers/inspector.ts index 54ac5fc54..6859e58b7 100644 --- a/packages/services/api/src/modules/schema/providers/inspector.ts +++ b/packages/services/api/src/modules/schema/providers/inspector.ts @@ -36,16 +36,13 @@ export class Inspector { const changes = await diff(existing, incoming, rules); - return changes - .filter(dropTrimmedDescriptionChangedChange) - .map(change => - HiveSchemaChangeModel.parse({ - type: change.type, - meta: change.meta, - isSafeBasedOnUsage: change.criticality.isSafeBasedOnUsage, - }), - ) - .sort((a, b) => a.criticality.localeCompare(b.criticality)); + return changes.filter(dropTrimmedDescriptionChangedChange).map(change => + HiveSchemaChangeModel.parse({ + type: change.type, + meta: change.meta, + isSafeBasedOnUsage: change.criticality.isSafeBasedOnUsage, + }), + ); } } diff --git a/packages/services/api/src/modules/schema/providers/models/composite.ts b/packages/services/api/src/modules/schema/providers/models/composite.ts index 57e4bd50a..79b1d9f02 100644 --- a/packages/services/api/src/modules/schema/providers/models/composite.ts +++ b/packages/services/api/src/modules/schema/providers/models/composite.ts @@ -93,6 +93,26 @@ export class CompositeModel { ); } + @traceFn('Composite modern: diffSchema') + async diffSchema({ + input, + latest, + }: { + input: { + sdl: string; + serviceName: string; + url: string | null; + }; + latest: { + schemas: Pick[]; + } | null; + }) { + return this.checks.serviceDiff({ + existingSdl: latest?.schemas?.find(s => s.service_name === input.serviceName)?.sdl ?? null, + incomingSdl: input.sdl, + }); + } + @traceFn('Composite modern: check', { initAttributes: args => ({ 'hive.project.id': args.selector.projectId, diff --git a/packages/services/api/src/modules/schema/providers/models/single.ts b/packages/services/api/src/modules/schema/providers/models/single.ts index 6221e7b91..670208d55 100644 --- a/packages/services/api/src/modules/schema/providers/models/single.ts +++ b/packages/services/api/src/modules/schema/providers/models/single.ts @@ -31,6 +31,24 @@ export class SingleModel { private appDeployments: AppDeployments, ) {} + @traceFn('Single modern: diffSchema') + async diffSchema({ + input, + latest, + }: { + input: { + sdl: string; + }; + latest: { + schemas: [SingleSchema]; + } | null; + }) { + return this.checks.serviceDiff({ + existingSdl: latest?.schemas[0]?.sdl ?? null, + incomingSdl: input.sdl, + }); + } + @traceFn('Single modern: check', { initAttributes: args => ({ 'hive.project.id': args.selector.projectId, diff --git a/packages/services/api/src/modules/schema/providers/registry-checks.ts b/packages/services/api/src/modules/schema/providers/registry-checks.ts index d2e00231b..7a40d7d46 100644 --- a/packages/services/api/src/modules/schema/providers/registry-checks.ts +++ b/packages/services/api/src/modules/schema/providers/registry-checks.ts @@ -426,6 +426,63 @@ export class RegistryChecks { } satisfies CheckResult; } + @traceFn('RegistryChecks.serviceDiff') + /** + * Intended to be used for subgraph/service schemas only. This does not check conditional breaking changes + * or policy logic. This function strictly calculates the diff between two SDL and returns the list of changes. + */ + async serviceDiff(args: { + /** The existing SDL */ + existingSdl: string | null; + /** The incoming SDL */ + incomingSdl: string | null; + }) { + let existingSchema: GraphQLSchema | null; + let incomingSchema: GraphQLSchema | null; + + try { + existingSchema = args.existingSdl + ? buildSortedSchemaFromSchemaObject( + this.helper.createSchemaObject({ + sdl: args.existingSdl, + }), + ) + : null; + + incomingSchema = args.incomingSdl + ? buildSortedSchemaFromSchemaObject( + this.helper.createSchemaObject({ + sdl: args.incomingSdl, + }), + ) + : null; + } catch (error) { + this.logger.error('Failed to build schema for diff. Skip diff check.'); + return { + status: 'skipped', + } satisfies CheckResult; + } + + if (!existingSchema || !incomingSchema) { + this.logger.debug('Skip diff check due to either existing or incoming SDL being absent.'); + return { + status: 'skipped', + } satisfies CheckResult; + } + if (!incomingSchema) { + return { + status: 'failed', + reason: 'Incoming schema is invalid.', + } satisfies CheckResult; + } + let inspectorChanges = await this.inspector.diff(existingSchema, incomingSchema); + + return { + status: 'completed', + result: inspectorChanges, + } satisfies CheckResult; + } + /** * Diff incoming and existing SDL and generate a list of changes. * Uses usage stats to determine whether a change is safe or not (if available). diff --git a/packages/services/api/src/modules/schema/providers/schema-publisher.ts b/packages/services/api/src/modules/schema/providers/schema-publisher.ts index 21445fbd5..8d61e540a 100644 --- a/packages/services/api/src/modules/schema/providers/schema-publisher.ts +++ b/packages/services/api/src/modules/schema/providers/schema-publisher.ts @@ -599,9 +599,31 @@ export class SchemaPublisher { }) : null; + let proposalChanges: Array | null = null; switch (project.type) { case ProjectType.SINGLE: this.logger.debug('Using SINGLE registry model'); + + if (input.schemaProposalId) { + try { + const diffSchema = await this.models[project.type].diffSchema({ + input: { + sdl, + }, + latest: latestVersion + ? { + schemas: [ensureSingleSchema(latestVersion.schemas)], + } + : null, + }); + if ('result' in diffSchema) { + proposalChanges = diffSchema.result ?? null; + } + } catch (e: any) { + this.logger.error('Could not calculate schema proposal diff: ', e.message ?? e); + } + } + checkResult = await this.models[ProjectType.SINGLE].check({ input, selector, @@ -626,7 +648,7 @@ export class SchemaPublisher { conditionalBreakingChangeDiffConfig: conditionalBreakingChangeConfiguration?.conditionalBreakingChangeDiffConfig ?? null, failDiffOnDangerousChange, - filterNestedChanges: !input.schemaProposalId, + filterNestedChanges: true, }); break; case ProjectType.FEDERATION: @@ -637,6 +659,28 @@ export class SchemaPublisher { throw new Error('Guard for TypeScript limitations on inferring types. :)'); } + if (input.schemaProposalId) { + try { + const diffSchema = await this.models[project.type].diffSchema({ + input: { + sdl, + serviceName: input.service, + url: input.url ?? null, + }, + latest: latestVersion + ? { + schemas: ensureCompositeSchemas(latestVersion.schemas), + } + : null, + }); + if ('result' in diffSchema) { + proposalChanges = diffSchema.result ?? null; + } + } catch (e: any) { + this.logger.error('Could not calculate schema proposal diff: ', e.message ?? e); + } + } + checkResult = await this.models[project.type].check({ input: { sdl, @@ -672,7 +716,7 @@ export class SchemaPublisher { conditionalBreakingChangeDiffConfig: conditionalBreakingChangeConfiguration?.conditionalBreakingChangeDiffConfig ?? null, failDiffOnDangerousChange, - filterNestedChanges: !input.schemaProposalId, + filterNestedChanges: true, }); break; default: @@ -738,6 +782,7 @@ export class SchemaPublisher { safeSchemaChanges: contract.schemaChanges?.safe ?? null, })) ?? null, schemaProposalId: input.schemaProposalId ?? null, + schemaProposalChanges: proposalChanges, }); this.logger.info('created failed schema check. (schemaCheckId=%s)', schemaCheck.id); } else if (checkResult.conclusion === SchemaCheckConclusion.Success) { @@ -785,6 +830,7 @@ export class SchemaPublisher { safeSchemaChanges: contract.schemaChanges?.safe ?? null, })) ?? null, schemaProposalId: input.schemaProposalId ?? null, + schemaProposalChanges: proposalChanges, }); this.logger.info('created successful schema check. (schemaCheckId=%s)', schemaCheck.id); } else if (checkResult.conclusion === SchemaCheckConclusion.Skip) { @@ -864,6 +910,7 @@ export class SchemaPublisher { ) : null, schemaProposalId: input.schemaProposalId ?? null, + schemaProposalChanges: proposalChanges, }); this.logger.info('created skipped schema check. (schemaCheckId=%s)', schemaCheck.id); } @@ -975,6 +1022,7 @@ export class SchemaPublisher { return { __typename: 'SchemaCheckSuccess', valid: true, + schemaProposalChanges: schemaCheck.schemaProposalChanges, changes: [ ...(checkResult.state?.schemaChanges?.all ?? []), ...(checkResult.state?.contracts?.flatMap(contract => [ diff --git a/packages/services/api/src/modules/schema/resolvers/Mutation/schemaCheck.ts b/packages/services/api/src/modules/schema/resolvers/Mutation/schemaCheck.ts index 8da9e3db9..ba779ef84 100644 --- a/packages/services/api/src/modules/schema/resolvers/Mutation/schemaCheck.ts +++ b/packages/services/api/src/modules/schema/resolvers/Mutation/schemaCheck.ts @@ -16,6 +16,7 @@ export const schemaCheck: NonNullable = async if ('changes' in result && result.changes) { return { ...result, + schemaProposalChanges: result.schemaProposalChanges, changes: result.changes, errors: result.errors?.map(error => ({ diff --git a/packages/services/api/src/modules/shared/providers/storage.ts b/packages/services/api/src/modules/shared/providers/storage.ts index 87938429b..ebbefaaef 100644 --- a/packages/services/api/src/modules/shared/providers/storage.ts +++ b/packages/services/api/src/modules/shared/providers/storage.ts @@ -776,7 +776,11 @@ export interface Storage { * Persist a schema check record in the database. */ createSchemaCheck( - _: SchemaCheckInput & { expiresAt: Date | null; schemaProposalId?: string | null }, + _: SchemaCheckInput & { + expiresAt: Date | null; + schemaProposalId?: string | null; + schemaProposalChanges: null | Array; + }, ): Promise; /** * Delete the expired schema checks from the database. diff --git a/packages/services/storage/package.json b/packages/services/storage/package.json index 5ef470817..70cdc42ac 100644 --- a/packages/services/storage/package.json +++ b/packages/services/storage/package.json @@ -16,7 +16,7 @@ "db:generate": "schemats generate --config schemats.cjs -o src/db/types.ts && prettier --write src/db/types.ts" }, "devDependencies": { - "@graphql-inspector/core": "7.1.0", + "@graphql-inspector/core": "7.1.1", "@hive/service-common": "workspace:*", "@sentry/node": "7.120.2", "@sentry/types": "7.120.2", diff --git a/packages/services/storage/src/db/types.ts b/packages/services/storage/src/db/types.ts index 5d732397c..4a8f68088 100644 --- a/packages/services/storage/src/db/types.ts +++ b/packages/services/storage/src/db/types.ts @@ -288,6 +288,7 @@ export interface schema_checks { schema_composition_errors: any | null; schema_policy_errors: any | null; schema_policy_warnings: any | null; + schema_proposal_changes: any | null; schema_proposal_id: string | null; schema_sdl: string | null; schema_sdl_store_id: string | null; diff --git a/packages/services/storage/src/index.ts b/packages/services/storage/src/index.ts index 0ec0ceca8..7ca798784 100644 --- a/packages/services/storage/src/index.ts +++ b/packages/services/storage/src/index.ts @@ -3970,6 +3970,7 @@ export async function createStorage( , "has_contract_schema_changes" , "conditional_breaking_change_metadata" , "schema_proposal_id" + , "schema_proposal_changes" ) VALUES ( ${schemaSDLHash} @@ -4000,6 +4001,7 @@ export async function createStorage( } , ${jsonify(InsertConditionalBreakingChangeMetadataModel.parse(args.conditionalBreakingChangeMetadata))} , ${args.schemaProposalId ?? null} + , ${jsonify(args.schemaProposalChanges?.map(toSerializableSchemaChange))} ) RETURNING "id" @@ -5382,6 +5384,7 @@ const schemaCheckSQLFields = sql` , c."context_id" as "contextId" , c."conditional_breaking_change_metadata" as "conditionalBreakingChangeMetadata" , c."schema_proposal_id" as "schemaProposalId" + , c."schema_proposal_changes" as "schemaProposalChanges" `; const schemaVersionSQLFields = (t = sql``) => sql` diff --git a/packages/services/storage/src/schema-change-model.ts b/packages/services/storage/src/schema-change-model.ts index 1e56c47df..81df65266 100644 --- a/packages/services/storage/src/schema-change-model.ts +++ b/packages/services/storage/src/schema-change-model.ts @@ -1435,13 +1435,17 @@ const NotManuallyApprovedSchemaCheckFields = { manualApprovalUserId: z.null(), }; +const SchemaProposalOutputFields = { + schemaProposalId: z.string().nullable(), + schemaProposalChanges: z.array(HiveSchemaChangeModel).nullable(), +}; + const SchemaCheckSharedOutputFields = { schemaSDL: z.string(), serviceName: z.string().nullable(), serviceUrl: z.string().nullable(), targetId: z.string(), schemaVersionId: z.string().nullable(), - schemaProposalId: z.string().nullable(), meta: z .object({ author: z.string(), @@ -1455,6 +1459,7 @@ const SchemaCheckSharedOutputFields = { githubRepository: z.string().nullable(), githubSha: z.string().nullable(), contextId: z.string().nullable(), + ...SchemaProposalOutputFields, }; const SchemaCheckSharedInputFields = { diff --git a/packages/web/app/package.json b/packages/web/app/package.json index 928b549e9..bee01b60e 100644 --- a/packages/web/app/package.json +++ b/packages/web/app/package.json @@ -24,8 +24,8 @@ "@graphiql/react": "1.0.0-alpha.4", "@graphiql/toolkit": "0.9.1", "@graphql-codegen/client-preset-swc-plugin": "0.2.0", - "@graphql-inspector/core": "7.1.0", - "@graphql-inspector/patch": "0.1.0", + "@graphql-inspector/core": "7.1.1", + "@graphql-inspector/patch": "0.1.1", "@graphql-tools/mock": "9.0.25", "@graphql-typed-document-node/core": "3.2.0", "@headlessui/react": "2.2.0", diff --git a/packages/web/app/src/components/target/proposals/change-detail.tsx b/packages/web/app/src/components/target/proposals/change-detail.tsx index 6b9bd341a..7f168aaae 100644 --- a/packages/web/app/src/components/target/proposals/change-detail.tsx +++ b/packages/web/app/src/components/target/proposals/change-detail.tsx @@ -54,7 +54,7 @@ export function ChangeBlock(props: { {props.info && }
- {props.changes.map(({ change, error, mergeStatus }) => { + {props.changes.map(({ change, error, mergeStatus }, i) => { let icon: ReactNode | undefined; if (mergeStatus === MergeStatus.CONFLICT) { icon = ( @@ -74,7 +74,7 @@ export function ChangeBlock(props: { ); diff --git a/packages/web/app/src/components/target/proposals/index.tsx b/packages/web/app/src/components/target/proposals/index.tsx index 80a354c35..0fc248775 100644 --- a/packages/web/app/src/components/target/proposals/index.tsx +++ b/packages/web/app/src/components/target/proposals/index.tsx @@ -11,8 +11,8 @@ import { SchemaDiff } from './schema-diff/core'; * but this can be done serially because there should not be so many reviews within * a single screen's height that it matters. * */ -export const ProposalOverview_ReviewsFragment = graphql(/** GraphQL */ ` - fragment ProposalOverview_ReviewsFragment on SchemaProposalReviewConnection { +export const Proposal_ReviewsFragment = graphql(/** GraphQL */ ` + fragment Proposal_ReviewsFragment on SchemaProposalReviewConnection { pageInfo { startCursor } @@ -31,8 +31,8 @@ export const ProposalOverview_ReviewsFragment = graphql(/** GraphQL */ ` `); /** Move to utils? */ -export const ProposalOverview_ChangeFragment = graphql(/* GraphQL */ ` - fragment ProposalOverview_ChangeFragment on SchemaChange { +export const Proposal_ChangeFragment = graphql(/* GraphQL */ ` + fragment Proposal_ChangeFragment on SchemaChange { message(withSafeBasedOnUsageNote: false) path severityLevel @@ -184,13 +184,14 @@ export const ProposalOverview_ChangeFragment = graphql(/* GraphQL */ ` ... on DirectiveUsageUnionMemberAdded { addedDirectiveName addedUnionMemberTypeName - addedUnionMemberTypeName unionName + directiveRepeatedTimes } ... on DirectiveUsageUnionMemberRemoved { removedDirectiveName removedUnionMemberTypeName unionName + directiveRepeatedTimes } ... on FieldArgumentAdded { addedArgumentName @@ -266,7 +267,6 @@ export const ProposalOverview_ChangeFragment = graphql(/* GraphQL */ ` } ... on TypeKindChanged { newTypeKind - oldTypeKind typeName } ... on TypeDescriptionChanged { @@ -292,117 +292,140 @@ export const ProposalOverview_ChangeFragment = graphql(/* GraphQL */ ` ... on DirectiveUsageEnumAdded { addedDirectiveName enumName + directiveRepeatedTimes } ... on DirectiveUsageEnumRemoved { enumName removedDirectiveName + directiveRepeatedTimes } ... on DirectiveUsageEnumValueAdded { addedDirectiveName enumName enumValueName + directiveRepeatedTimes } ... on DirectiveUsageEnumValueRemoved { enumName enumValueName removedDirectiveName + directiveRepeatedTimes } ... on DirectiveUsageInputObjectRemoved { inputObjectName removedDirectiveName removedInputFieldName removedInputFieldType + directiveRepeatedTimes } ... on DirectiveUsageInputObjectAdded { addedDirectiveName addedInputFieldName addedInputFieldType inputObjectName + directiveRepeatedTimes } ... on DirectiveUsageInputFieldDefinitionAdded { addedDirectiveName inputFieldName inputFieldType inputObjectName + directiveRepeatedTimes } ... on DirectiveUsageInputFieldDefinitionRemoved { inputFieldName inputObjectName removedDirectiveName + directiveRepeatedTimes } ... on DirectiveUsageFieldAdded { addedDirectiveName fieldName typeName + directiveRepeatedTimes } ... on DirectiveUsageFieldRemoved { fieldName removedDirectiveName typeName + directiveRepeatedTimes } ... on DirectiveUsageScalarAdded { addedDirectiveName scalarName + directiveRepeatedTimes } ... on DirectiveUsageScalarRemoved { removedDirectiveName scalarName + directiveRepeatedTimes } ... on DirectiveUsageObjectAdded { addedDirectiveName objectName + directiveRepeatedTimes } ... on DirectiveUsageObjectRemoved { objectName removedDirectiveName + directiveRepeatedTimes } ... on DirectiveUsageInterfaceAdded { addedDirectiveName interfaceName + directiveRepeatedTimes } ... on DirectiveUsageSchemaAdded { addedDirectiveName schemaTypeName + directiveRepeatedTimes } ... on DirectiveUsageSchemaRemoved { removedDirectiveName schemaTypeName + directiveRepeatedTimes } ... on DirectiveUsageFieldDefinitionAdded { addedDirectiveName fieldName typeName + directiveRepeatedTimes } ... on DirectiveUsageFieldDefinitionRemoved { fieldName removedDirectiveName typeName + directiveRepeatedTimes } ... on DirectiveUsageArgumentDefinitionRemoved { argumentName fieldName removedDirectiveName typeName + directiveRepeatedTimes } ... on DirectiveUsageInterfaceRemoved { interfaceName removedDirectiveName + directiveRepeatedTimes } ... on DirectiveUsageArgumentDefinitionAdded { addedDirectiveName argumentName fieldName typeName + directiveRepeatedTimes } ... on DirectiveUsageArgumentAdded { addedArgumentName addedArgumentValue directiveName - # oldArgumentValue + directiveRepeatedTimes } ... on DirectiveUsageArgumentRemoved { directiveName removedArgumentName + directiveRepeatedTimes } } } @@ -428,7 +451,7 @@ export function toUpperSnakeCase(str: string) { export function Proposal(props: { beforeSchema: GraphQLSchema | null; afterSchema: GraphQLSchema | null; - reviews: FragmentType; + reviews: FragmentType; serviceName: string; className?: string; }) { @@ -439,7 +462,7 @@ export function Proposal(props: { * * Odds are there will never be so many reviews/comments that this is even a problem. */ - const reviewsConnection = useFragment(ProposalOverview_ReviewsFragment, props.reviews); + const reviewsConnection = useFragment(Proposal_ReviewsFragment, props.reviews); const [annotations, reviewssByCoordinate] = useMemo(() => { const serviceReviews = reviewsConnection?.edges?.filter(edge => { diff --git a/packages/web/app/src/lib/urql.ts b/packages/web/app/src/lib/urql.ts index f8ab7b686..7b71fdb64 100644 --- a/packages/web/app/src/lib/urql.ts +++ b/packages/web/app/src/lib/urql.ts @@ -168,6 +168,8 @@ export const urqlClient = createClient({ DirectiveUsageArgumentDefinitionAdded: noKey, DirectiveUsageArgumentAdded: noKey, DirectiveUsageArgumentRemoved: noKey, + DirectiveRepeatableAdded: noKey, + DirectiveRepeatableRemoved: noKey, }, globalIDs: ['SuccessfulSchemaCheck', 'FailedSchemaCheck'], }), diff --git a/packages/web/app/src/pages/target-proposal-details.tsx b/packages/web/app/src/pages/target-proposal-details.tsx index 64ebb5bbc..ffaad66b0 100644 --- a/packages/web/app/src/pages/target-proposal-details.tsx +++ b/packages/web/app/src/pages/target-proposal-details.tsx @@ -1,6 +1,6 @@ import { Fragment, useMemo } from 'react'; import { CompositionErrorsSection } from '@/components/target/history/errors-and-changes'; -import { ProposalOverview_ReviewsFragment } from '@/components/target/proposals'; +import { Proposal_ReviewsFragment } from '@/components/target/proposals'; import { ChangeBlock } from '@/components/target/proposals/change-detail'; import { ServiceHeading, ServiceHeadingType } from '@/components/target/proposals/service-heading'; import { FragmentType } from '@/gql'; @@ -24,7 +24,7 @@ export function TargetProposalDetailsPage(props: { targetSlug: string; proposalId: string; services: ServiceProposalDetails[]; - reviews: FragmentType; + reviews: FragmentType; }) { const mappedServices = useMemo(() => { return props.services?.map( diff --git a/packages/web/app/src/pages/target-proposal-schema.tsx b/packages/web/app/src/pages/target-proposal-schema.tsx index a286dc9fc..294dbebe5 100644 --- a/packages/web/app/src/pages/target-proposal-schema.tsx +++ b/packages/web/app/src/pages/target-proposal-schema.tsx @@ -1,5 +1,5 @@ import { Fragment, useState } from 'react'; -import { Proposal, ProposalOverview_ReviewsFragment } from '@/components/target/proposals'; +import { Proposal, Proposal_ReviewsFragment } from '@/components/target/proposals'; import { ServiceHeading, ServiceHeadingType } from '@/components/target/proposals/service-heading'; import { FragmentType } from '@/gql'; import { cn } from '@/lib/utils'; @@ -11,7 +11,7 @@ export function TargetProposalSchemaPage(props: { targetSlug: string; proposalId: string; // @todo pass to proposal for commenting etc services: ServiceProposalDetails[]; - reviews: FragmentType; + reviews: FragmentType; }) { if (props.services.length) { return ( @@ -31,7 +31,7 @@ function Schema({ reviews, }: { details: ServiceProposalDetails; - reviews: FragmentType; + reviews: FragmentType; }) { const [isVisible, setIsVisible] = useState(true); diff --git a/packages/web/app/src/pages/target-proposal-supergraph.tsx b/packages/web/app/src/pages/target-proposal-supergraph.tsx index 00c307151..85a8354de 100644 --- a/packages/web/app/src/pages/target-proposal-supergraph.tsx +++ b/packages/web/app/src/pages/target-proposal-supergraph.tsx @@ -1,6 +1,6 @@ import { buildSchema } from 'graphql'; import { useQuery } from 'urql'; -import { ProposalOverview_ChangeFragment, toUpperSnakeCase } from '@/components/target/proposals'; +import { Proposal_ChangeFragment, toUpperSnakeCase } from '@/components/target/proposals'; import { SchemaDiff } from '@/components/target/proposals/schema-diff/core'; import { Spinner } from '@/components/ui/spinner'; import { FragmentType, graphql, useFragment } from '@/gql'; @@ -23,7 +23,7 @@ const ProposalSupergraphChangesQuery = graphql(/* GraphQL */ ` edges { node { __typename - ...ProposalOverview_ChangeFragment + ...Proposal_ChangeFragment } } } @@ -70,8 +70,7 @@ export function TargetProposalSupergraphPage(props: { }); // @todo use pagination to collect all - const allChanges: (FragmentType | null | undefined)[] = - []; + const allChanges: (FragmentType | null | undefined)[] = []; query?.data?.schemaProposal?.checks?.edges?.map(({ node: { schemaChanges } }) => { if (schemaChanges) { const changes = schemaChanges.edges.map(edge => edge.node); @@ -92,7 +91,7 @@ export function TargetProposalSupergraphPage(props: { function SupergraphDiff(props: { baseSchemaSDL: string; - changes: (FragmentType | null | undefined)[] | null; + changes: (FragmentType | null | undefined)[] | null; }) { if (props.baseSchemaSDL.length === 0) { return null; @@ -104,7 +103,7 @@ function SupergraphDiff(props: { for (const change of props.changes ?? []) { // @todo calling inside a loop can cause errors... fix. // eslint-disable-next-line react-hooks/rules-of-hooks - const c = useFragment(ProposalOverview_ChangeFragment, change); + const c = useFragment(Proposal_ChangeFragment, change); if (c) { changes.push({ criticality: { diff --git a/packages/web/app/src/pages/target-proposal-types.ts b/packages/web/app/src/pages/target-proposal-types.ts index ecfa7f1d2..0571f9841 100644 --- a/packages/web/app/src/pages/target-proposal-types.ts +++ b/packages/web/app/src/pages/target-proposal-types.ts @@ -1,6 +1,6 @@ import type { GraphQLSchema } from 'graphql'; import type { CompositionErrorsSection_SchemaErrorConnection } from '@/components/target/history/errors-and-changes'; -import type { ProposalOverview_ChangeFragment } from '@/components/target/proposals'; +import type { Proposal_ChangeFragment } from '@/components/target/proposals'; import { FragmentType } from '@/gql'; import type { Change } from '@graphql-inspector/core'; @@ -11,7 +11,7 @@ export type ServiceProposalDetails = { buildError: Error | null; allChanges: Change[]; // Required because the component ChangesBlock uses this fragment. - rawChanges: FragmentType[]; + rawChanges: FragmentType[]; ignoredChanges: Array<{ change: Change; error: Error; diff --git a/packages/web/app/src/pages/target-proposal.tsx b/packages/web/app/src/pages/target-proposal.tsx index 71b52f62f..ae1389158 100644 --- a/packages/web/app/src/pages/target-proposal.tsx +++ b/packages/web/app/src/pages/target-proposal.tsx @@ -4,8 +4,8 @@ import { useMutation, useQuery, UseQueryExecute } from 'urql'; import { Page, TargetLayout } from '@/components/layouts/target'; import { CompositionErrorsSection_SchemaErrorConnection } from '@/components/target/history/errors-and-changes'; import { - ProposalOverview_ChangeFragment, - ProposalOverview_ReviewsFragment, + Proposal_ChangeFragment, + Proposal_ReviewsFragment, toUpperSnakeCase, } from '@/components/target/proposals'; import { StageTransitionSelect } from '@/components/target/proposals/stage-transition-select'; @@ -26,7 +26,7 @@ import { FragmentType, graphql, useFragment } from '@/gql'; import { ProjectType } from '@/gql/graphql'; import { Change } from '@graphql-inspector/core'; import { errors, patchSchema } from '@graphql-inspector/patch'; -import { NoopError } from '@graphql-inspector/patch/errors'; +import { NoopError, ValueMismatchError } from '@graphql-inspector/patch/errors'; import { ListBulletIcon, PieChartIcon } from '@radix-ui/react-icons'; import { Link } from '@tanstack/react-router'; import { @@ -85,7 +85,7 @@ const ProposalQuery = graphql(/* GraphQL */ ` ...ProposalOverview_ChecksFragment } reviews { - ...ProposalOverview_ReviewsFragment + ...Proposal_ReviewsFragment } ...Proposals_EditProposalProposalFragment } @@ -119,17 +119,17 @@ const ProposalChangesQuery = graphql(/* GraphQL */ ` edges { node { id - ... on FailedSchemaCheck { - compositionErrors { - ...CompositionErrorsSection_SchemaErrorConnection - } - } + # ... on FailedSchemaCheck { + # compositionErrors { + # ...CompositionErrorsSection_SchemaErrorConnection + # } + # } schemaSDL serviceName - schemaChanges { + schemaChanges: schemaProposalChanges { edges { node { - ...ProposalOverview_ChangeFragment + ...Proposal_ChangeFragment } } } @@ -233,9 +233,9 @@ const ProposalsContent = (props: Parameters[0] let compositionErrors: | FragmentType | undefined; - if (proposalVersion.__typename === 'FailedSchemaCheck') { - compositionErrors = proposalVersion.compositionErrors ?? undefined; - } + // if (proposalVersion.__typename === 'FailedSchemaCheck') { + // compositionErrors = proposalVersion.compositionErrors ?? undefined; + // } const existingSchema = query.data?.latestValidVersion?.schemas.edges.find( ({ node: latestSchema }) => @@ -255,7 +255,7 @@ const ProposalsContent = (props: Parameters[0] ?.map(({ node: change }): Change => { // @todo don't useFragment here... // eslint-disable-next-line react-hooks/rules-of-hooks - const c = useFragment(ProposalOverview_ChangeFragment, change); + const c = useFragment(Proposal_ChangeFragment, change); return { criticality: { // isSafeBasedOnUsage: , @@ -268,6 +268,7 @@ const ProposalsContent = (props: Parameters[0] path: c.path?.join('.'), }; }) ?? []; + const conflictingChanges: Array<{ change: Change; error: Error }> = []; const ignoredChanges: Array<{ change: Change; error: Error }> = []; let buildError: Error | null = null; @@ -277,8 +278,10 @@ const ProposalsContent = (props: Parameters[0] onError(error, change) { if (error instanceof NoopError) { ignoredChanges.push({ change, error }); + } else if (!(error instanceof ValueMismatchError)) { + // totally ignore value mismatches + conflictingChanges.push({ change, error }); } - conflictingChanges.push({ change, error }); return errors.looseErrorHandler(error, change); }, }); @@ -466,7 +469,7 @@ function TabbedContent(props: { version?: string; page?: string; services: ServiceProposalDetails[]; - reviews: FragmentType; + reviews: FragmentType; checks: FragmentType | null; versions: FragmentType | null; proposal: FragmentType; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 366b46c75..cb15efbd0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -129,14 +129,14 @@ importers: specifier: 3.20.1 version: 3.20.1(patch_hash=695fba67df25ba9d46472c8398c94c6a2ccf75d902321d8f95150f68e940313e)(@babel/core@7.28.5)(@types/node@22.10.5)(encoding@0.1.13)(graphql@16.9.0) '@graphql-inspector/cli': - specifier: 6.0.0 - version: 6.0.0(@types/node@22.10.5)(encoding@0.1.13)(graphql@16.9.0) + specifier: 6.0.6 + version: 6.0.6(@types/node@22.10.5)(encoding@0.1.13)(graphql@16.9.0) '@graphql-inspector/core': - specifier: 7.1.0 - version: 7.1.0(graphql@16.9.0) + specifier: 7.1.1 + version: 7.1.1(graphql@16.9.0) '@graphql-inspector/patch': - specifier: 0.1.0 - version: 0.1.0(graphql@16.9.0) + specifier: 0.1.1 + version: 0.1.1(graphql@16.9.0) '@graphql-tools/load': specifier: 8.1.2 version: 8.1.2(graphql@16.9.0) @@ -456,8 +456,8 @@ importers: specifier: workspace:* version: link:../core/dist '@graphql-inspector/core': - specifier: 7.1.0 - version: 7.1.0(graphql@16.9.0) + specifier: 7.1.1 + version: 7.1.1(graphql@16.9.0) '@graphql-tools/code-file-loader': specifier: ~8.1.0 version: 8.1.0(graphql@16.9.0) @@ -755,8 +755,8 @@ importers: specifier: 1.0.0 version: 1.0.0 '@graphql-inspector/core': - specifier: 7.1.0 - version: 7.1.0(graphql@16.9.0) + specifier: 7.1.1 + version: 7.1.1(graphql@16.9.0) '@graphql-tools/merge': specifier: 9.1.1 version: 9.1.1(graphql@16.9.0) @@ -1414,8 +1414,8 @@ importers: packages/services/storage: devDependencies: '@graphql-inspector/core': - specifier: 7.1.0 - version: 7.1.0(graphql@16.9.0) + specifier: 7.1.1 + version: 7.1.1(graphql@16.9.0) '@hive/service-common': specifier: workspace:* version: link:../service-common @@ -1720,11 +1720,11 @@ importers: specifier: 0.2.0 version: 0.2.0 '@graphql-inspector/core': - specifier: 7.1.0 - version: 7.1.0(graphql@16.9.0) + specifier: 7.1.1 + version: 7.1.1(graphql@16.9.0) '@graphql-inspector/patch': - specifier: 0.1.0 - version: 0.1.0(graphql@16.9.0) + specifier: 0.1.1 + version: 0.1.1(graphql@16.9.0) '@graphql-tools/mock': specifier: 9.0.25 version: 9.0.25(graphql@16.9.0) @@ -4289,14 +4289,14 @@ packages: graphql: ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 graphql-yoga: ^5.10.8 - '@graphql-inspector/audit-command@5.0.12': - resolution: {integrity: sha512-ZTt4K1WvJKjZgB6Hx8w8Gky6j3XCY1zioEVPv1rleib/9ULUyp+5QdGNS9g22U12lFSDzOvy95AAIBpfGnNSBg==} + '@graphql-inspector/audit-command@5.0.18': + resolution: {integrity: sha512-2DByUZHBu9bcYv0yBV5wxSLNF64oTDh3rFX0husZFfNm89W09NYJ7RKEEzxYrrTmZwguIj+1+ATlstAim7+fdQ==} engines: {node: '>=18.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - '@graphql-inspector/cli@6.0.0': - resolution: {integrity: sha512-kNOyaMFtKg5+GDyfcmCEuQHnPtF/SBGha00JJeR4YD6RXtF0Jv9j3LpdeiNbv3Z9e7mX7iuD5YDdvCno1mYpDQ==} + '@graphql-inspector/cli@6.0.6': + resolution: {integrity: sha512-g35G2dh+MFk38ZLLSQrFYKDMBAxFiLav4ZK9gbrN7+uKNQ01WpH3ZOyZA/Qx4vvbNAe750/IsahcChFaeNYEUg==} engines: {node: '>=18.0.0'} hasBin: true peerDependencies: @@ -4323,26 +4323,20 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - '@graphql-inspector/core@7.0.0': - resolution: {integrity: sha512-ZEKbKqJUqkWlJhab1ywQ2U0hk225lF2nYenZxPCaTEmKx1ovHucgh/3kq+b6bA5aW2S3tXlpuIGcctymCtZ2/g==} + '@graphql-inspector/core@7.1.1': + resolution: {integrity: sha512-EzpOtDMK2q6D89czinZXGGLlxt85fBijZSGuPt+CXv84u7prFU6pUA/0mq6tpSiuQKWyRKu4MMuxB0vTNJZoRw==} engines: {node: '>=18.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - '@graphql-inspector/core@7.1.0': - resolution: {integrity: sha512-wfyNEOnNjzqCygj7mp3ctVBwQwBWNirDpgJ+tAPu/yA9y7xjAFPPtFuP9Nj9mMFn1Y1hJTnZ2XfA7kJJXrwRkw==} + '@graphql-inspector/coverage-command@6.1.12': + resolution: {integrity: sha512-5XzKVgDYRzYXGsvi/9Y7/2LPV7DhVNe6bp+9ip1kSNozB8LDBl1L6zZn16PEFJB6ROknN1LPuwcnR3SxTlHQ6w==} engines: {node: '>=18.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - '@graphql-inspector/coverage-command@6.1.6': - resolution: {integrity: sha512-DFCDb1IlpdGEnywFbcZsLgGwZGqlrryOPxXPY2a+GLhFYSJO13ytl7eaVb6lCXCGjFrCtPpcgBWFSC6YxoMYAA==} - engines: {node: '>=18.0.0'} - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - - '@graphql-inspector/diff-command@6.0.0': - resolution: {integrity: sha512-qIviI/GNh+SxbV19XhfSWs7mY9CU6XDw2tLc/KFNQEmP9MF6XvT7UB+wD9W9rjxcmTFjjKtcqm0HaPEtFlXT5w==} + '@graphql-inspector/diff-command@6.0.6': + resolution: {integrity: sha512-oGJawa87a1zQ0htRxNlnJzp2spfZ0F3L+PGyBA676WAdm13WV+wQEggJdRy+AILklfkH1W9B7SPH36KyPB/wTA==} engines: {node: '>=18.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 @@ -4371,8 +4365,8 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - '@graphql-inspector/introspect-command@5.0.12': - resolution: {integrity: sha512-l+P4NeLcWRukPMsBL1pljx1l7I+VVUuLJ1xdtnhmRSUNJzx410SSIgV0wUKOsWR6JIZHdLQKN0ly9S2Tex9Q3Q==} + '@graphql-inspector/introspect-command@5.0.18': + resolution: {integrity: sha512-fr7D4xAYr25vp6kX2j4CvzCsn5DXxx81cdnHKh5ha3FFJgvH/ChC0KfxXW0j8VQQuJLw940QJb0Ta10knDBs/Q==} engines: {node: '>=18.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 @@ -4394,8 +4388,8 @@ packages: resolution: {integrity: sha512-rEo+HoQt+qjdayy7p5vcR9GeGTdKXmN0LbIm3W+jKKoXeAMlV4zHxnOW6jEhO6E0eVQxf8Sc1TlcH78i2P2a9w==} engines: {node: '>=18.0.0'} - '@graphql-inspector/patch@0.1.0': - resolution: {integrity: sha512-ZlDk4EESEP4scj7jBsKGoCdNP+uxrdKixxhtS+WAqm5RL5ph9W+gk4pm0Rpw+T3YIJgNqB7XqFDTbVURz7TG/w==} + '@graphql-inspector/patch@0.1.1': + resolution: {integrity: sha512-0+8mCAt5JO3gKWyFzotM5ppKWP520bLVJ9eCHRKJxVEBI2s7Ir5q+VfU/BQx8AuqBD7vJLK96IsE2tZaN4Xacg==} engines: {node: '>=18.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 @@ -4406,8 +4400,8 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - '@graphql-inspector/similar-command@5.0.12': - resolution: {integrity: sha512-UDC+AvYH/IYLR56Ze5iY+1CW/nOrIOax7Onjl+DuF8WTp4IA9mbjQx//TY4CTaWBM0gTOVdbzzYMTjS4TGoRpw==} + '@graphql-inspector/similar-command@5.0.18': + resolution: {integrity: sha512-91k27cPkkpHkOa5HzwQy7QrQuSCtebNYr7JPATqO2jop7bpom0FeVldM8w8fugwpsfWAOSTNjtiJx8cFoE0CjQ==} engines: {node: '>=18.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 @@ -4418,8 +4412,8 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 - '@graphql-inspector/validate-command@5.0.12': - resolution: {integrity: sha512-pg5ZDLssXj+dW+itkbrR3Pf6HLBlz9LhHN6Aj808GI+vIKS7WhAEMWzngycENazXxAafvLVAHOPKINLEJwuZdQ==} + '@graphql-inspector/validate-command@5.0.18': + resolution: {integrity: sha512-7kcE2Q9IQCE3M8Yo4ezHsdeW/d6Ave/4iraKDEyKXlbIXwFLkb7dqfCEBfQMB59g41nmAY23Vs+RjtMC8VSQvw==} engines: {node: '>=18.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 @@ -22930,10 +22924,10 @@ snapshots: - pino - winston - '@graphql-inspector/audit-command@5.0.12(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2)': + '@graphql-inspector/audit-command@5.0.18(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2)': dependencies: '@graphql-inspector/commands': 6.0.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2) - '@graphql-inspector/core': 7.0.0(graphql@16.9.0) + '@graphql-inspector/core': 7.1.1(graphql@16.9.0) '@graphql-inspector/logger': 5.0.1 '@graphql-tools/utils': 10.8.6(graphql@16.9.0) cli-table3: 0.6.3 @@ -22944,26 +22938,26 @@ snapshots: - '@graphql-inspector/loaders' - yargs - '@graphql-inspector/cli@6.0.0(@types/node@22.10.5)(encoding@0.1.13)(graphql@16.9.0)': + '@graphql-inspector/cli@6.0.6(@types/node@22.10.5)(encoding@0.1.13)(graphql@16.9.0)': dependencies: '@babel/core': 7.26.10 - '@graphql-inspector/audit-command': 5.0.12(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2) + '@graphql-inspector/audit-command': 5.0.18(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2) '@graphql-inspector/code-loader': 5.0.1(graphql@16.9.0) '@graphql-inspector/commands': 6.0.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2) '@graphql-inspector/config': 4.0.2(graphql@16.9.0) - '@graphql-inspector/coverage-command': 6.1.6(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2) - '@graphql-inspector/diff-command': 6.0.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2) + '@graphql-inspector/coverage-command': 6.1.12(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2) + '@graphql-inspector/diff-command': 6.0.6(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2) '@graphql-inspector/docs-command': 5.0.5(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2) '@graphql-inspector/git-loader': 5.0.1(graphql@16.9.0) '@graphql-inspector/github-loader': 5.0.1(@types/node@22.10.5)(encoding@0.1.13)(graphql@16.9.0) '@graphql-inspector/graphql-loader': 5.0.1(graphql@16.9.0) - '@graphql-inspector/introspect-command': 5.0.12(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2) + '@graphql-inspector/introspect-command': 5.0.18(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2) '@graphql-inspector/json-loader': 5.0.1(graphql@16.9.0) '@graphql-inspector/loaders': 4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0) '@graphql-inspector/serve-command': 5.0.7(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2) - '@graphql-inspector/similar-command': 5.0.12(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2) + '@graphql-inspector/similar-command': 5.0.18(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2) '@graphql-inspector/url-loader': 5.0.1(@types/node@22.10.5)(encoding@0.1.13)(graphql@16.9.0) - '@graphql-inspector/validate-command': 5.0.12(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2) + '@graphql-inspector/validate-command': 5.0.18(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2) graphql: 16.9.0 tslib: 2.6.2 yargs: 17.7.2 @@ -22995,24 +22989,17 @@ snapshots: graphql: 16.9.0 tslib: 2.6.2 - '@graphql-inspector/core@7.0.0(graphql@16.9.0)': + '@graphql-inspector/core@7.1.1(graphql@16.9.0)': dependencies: dependency-graph: 1.0.0 graphql: 16.9.0 object-inspect: 1.13.2 tslib: 2.6.2 - '@graphql-inspector/core@7.1.0(graphql@16.9.0)': - dependencies: - dependency-graph: 1.0.0 - graphql: 16.9.0 - object-inspect: 1.13.2 - tslib: 2.6.2 - - '@graphql-inspector/coverage-command@6.1.6(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2)': + '@graphql-inspector/coverage-command@6.1.12(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2)': dependencies: '@graphql-inspector/commands': 6.0.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2) - '@graphql-inspector/core': 7.0.0(graphql@16.9.0) + '@graphql-inspector/core': 7.1.1(graphql@16.9.0) '@graphql-inspector/logger': 5.0.1 '@graphql-tools/utils': 10.8.6(graphql@16.9.0) graphql: 16.9.0 @@ -23022,10 +23009,10 @@ snapshots: - '@graphql-inspector/loaders' - yargs - '@graphql-inspector/diff-command@6.0.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2)': + '@graphql-inspector/diff-command@6.0.6(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2)': dependencies: '@graphql-inspector/commands': 6.0.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2) - '@graphql-inspector/core': 7.0.0(graphql@16.9.0) + '@graphql-inspector/core': 7.1.1(graphql@16.9.0) '@graphql-inspector/logger': 5.0.1 graphql: 16.9.0 tslib: 2.6.2 @@ -23069,10 +23056,10 @@ snapshots: graphql: 16.9.0 tslib: 2.6.2 - '@graphql-inspector/introspect-command@5.0.12(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2)': + '@graphql-inspector/introspect-command@5.0.18(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2)': dependencies: '@graphql-inspector/commands': 6.0.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2) - '@graphql-inspector/core': 7.0.0(graphql@16.9.0) + '@graphql-inspector/core': 7.1.1(graphql@16.9.0) '@graphql-inspector/logger': 5.0.1 graphql: 16.9.0 tslib: 2.6.2 @@ -23106,7 +23093,7 @@ snapshots: std-env: 3.7.0 tslib: 2.6.2 - '@graphql-inspector/patch@0.1.0(graphql@16.9.0)': + '@graphql-inspector/patch@0.1.1(graphql@16.9.0)': dependencies: '@graphql-tools/utils': 10.9.1(graphql@16.9.0) graphql: 16.9.0 @@ -23125,10 +23112,10 @@ snapshots: - '@graphql-inspector/loaders' - yargs - '@graphql-inspector/similar-command@5.0.12(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2)': + '@graphql-inspector/similar-command@5.0.18(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2)': dependencies: '@graphql-inspector/commands': 6.0.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2) - '@graphql-inspector/core': 7.0.0(graphql@16.9.0) + '@graphql-inspector/core': 7.1.1(graphql@16.9.0) '@graphql-inspector/logger': 5.0.1 graphql: 16.9.0 tslib: 2.6.2 @@ -23148,10 +23135,10 @@ snapshots: - encoding - utf-8-validate - '@graphql-inspector/validate-command@5.0.12(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2)': + '@graphql-inspector/validate-command@5.0.18(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2)': dependencies: '@graphql-inspector/commands': 6.0.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(@graphql-inspector/loaders@4.1.0(@graphql-inspector/config@4.0.2(graphql@16.9.0))(graphql@16.9.0))(graphql@16.9.0)(yargs@17.7.2) - '@graphql-inspector/core': 7.0.0(graphql@16.9.0) + '@graphql-inspector/core': 7.1.1(graphql@16.9.0) '@graphql-inspector/logger': 5.0.1 '@graphql-tools/utils': 10.8.6(graphql@16.9.0) graphql: 16.9.0 @@ -23251,7 +23238,7 @@ snapshots: '@graphql-tools/merge': 9.1.5(graphql@16.11.0) '@graphql-tools/stitch': 10.1.3(graphql@16.11.0) '@graphql-tools/stitching-directives': 4.0.5(graphql@16.11.0) - '@graphql-tools/utils': 10.10.3(graphql@16.11.0) + '@graphql-tools/utils': 10.11.0(graphql@16.11.0) '@graphql-tools/wrap': 11.0.5(graphql@16.11.0) '@whatwg-node/disposablestack': 0.0.6 '@whatwg-node/promise-helpers': 1.3.2 @@ -23282,7 +23269,7 @@ snapshots: '@graphql-tools/merge': 9.1.5(graphql@16.11.0) '@graphql-tools/stitch': 10.1.3(graphql@16.11.0) '@graphql-tools/stitching-directives': 4.0.5(graphql@16.11.0) - '@graphql-tools/utils': 10.10.3(graphql@16.11.0) + '@graphql-tools/utils': 10.11.0(graphql@16.11.0) '@graphql-tools/wrap': 11.0.5(graphql@16.11.0) '@whatwg-node/disposablestack': 0.0.6 '@whatwg-node/promise-helpers': 1.3.2 @@ -23610,7 +23597,7 @@ snapshots: '@graphql-mesh/types': 0.104.16(graphql@16.11.0)(ioredis@5.8.2) '@graphql-tools/executor': 1.4.13(graphql@16.11.0) '@graphql-tools/executor-common': 1.0.5(graphql@16.11.0) - '@graphql-tools/utils': 10.10.3(graphql@16.11.0) + '@graphql-tools/utils': 10.11.0(graphql@16.11.0) graphql: 16.11.0 tslib: 2.8.1 transitivePeerDependencies: @@ -23629,7 +23616,7 @@ snapshots: '@graphql-mesh/types': 0.104.16(graphql@16.11.0)(ioredis@5.8.2) '@graphql-tools/executor': 1.4.13(graphql@16.11.0) '@graphql-tools/executor-common': 1.0.5(graphql@16.11.0) - '@graphql-tools/utils': 10.10.3(graphql@16.11.0) + '@graphql-tools/utils': 10.11.0(graphql@16.11.0) graphql: 16.11.0 tslib: 2.8.1 transitivePeerDependencies: @@ -23648,7 +23635,7 @@ snapshots: '@graphql-mesh/types': 0.104.16(graphql@16.9.0)(ioredis@5.8.2) '@graphql-tools/executor': 1.4.13(graphql@16.9.0) '@graphql-tools/executor-common': 1.0.5(graphql@16.9.0) - '@graphql-tools/utils': 10.10.3(graphql@16.9.0) + '@graphql-tools/utils': 10.11.0(graphql@16.9.0) graphql: 16.9.0 tslib: 2.8.1 transitivePeerDependencies: @@ -23838,7 +23825,7 @@ snapshots: '@graphql-tools/batch-delegate@10.0.5(graphql@16.11.0)': dependencies: '@graphql-tools/delegate': 11.1.3(graphql@16.11.0) - '@graphql-tools/utils': 10.10.3(graphql@16.11.0) + '@graphql-tools/utils': 10.11.0(graphql@16.11.0) '@whatwg-node/promise-helpers': 1.3.2 dataloader: 2.2.3 graphql: 16.11.0 @@ -23847,7 +23834,7 @@ snapshots: '@graphql-tools/batch-delegate@10.0.5(graphql@16.9.0)': dependencies: '@graphql-tools/delegate': 11.1.3(graphql@16.9.0) - '@graphql-tools/utils': 10.10.3(graphql@16.9.0) + '@graphql-tools/utils': 10.11.0(graphql@16.9.0) '@whatwg-node/promise-helpers': 1.3.2 dataloader: 2.2.3 graphql: 16.9.0 @@ -24006,7 +23993,7 @@ snapshots: '@graphql-tools/batch-execute': 10.0.4(graphql@16.11.0) '@graphql-tools/executor': 1.4.13(graphql@16.11.0) '@graphql-tools/schema': 10.0.29(graphql@16.11.0) - '@graphql-tools/utils': 10.10.3(graphql@16.11.0) + '@graphql-tools/utils': 10.11.0(graphql@16.11.0) '@repeaterjs/repeater': 3.0.6 '@whatwg-node/promise-helpers': 1.3.2 dataloader: 2.2.3 @@ -24018,7 +24005,7 @@ snapshots: '@graphql-tools/batch-execute': 10.0.4(graphql@16.9.0) '@graphql-tools/executor': 1.4.13(graphql@16.9.0) '@graphql-tools/schema': 10.0.29(graphql@16.9.0) - '@graphql-tools/utils': 10.10.3(graphql@16.9.0) + '@graphql-tools/utils': 10.11.0(graphql@16.9.0) '@repeaterjs/repeater': 3.0.6 '@whatwg-node/promise-helpers': 1.3.2 dataloader: 2.2.3 @@ -24087,13 +24074,13 @@ snapshots: '@graphql-tools/executor-common@1.0.5(graphql@16.11.0)': dependencies: '@envelop/core': 5.4.0 - '@graphql-tools/utils': 10.10.3(graphql@16.11.0) + '@graphql-tools/utils': 10.11.0(graphql@16.11.0) graphql: 16.11.0 '@graphql-tools/executor-common@1.0.5(graphql@16.9.0)': dependencies: '@envelop/core': 5.4.0 - '@graphql-tools/utils': 10.10.3(graphql@16.9.0) + '@graphql-tools/utils': 10.11.0(graphql@16.9.0) graphql: 16.9.0 '@graphql-tools/executor-graphql-ws@0.0.14(graphql@16.9.0)': @@ -24158,7 +24145,7 @@ snapshots: '@graphql-tools/executor-graphql-ws@3.1.3(graphql@16.11.0)': dependencies: '@graphql-tools/executor-common': 1.0.5(graphql@16.11.0) - '@graphql-tools/utils': 10.10.3(graphql@16.11.0) + '@graphql-tools/utils': 10.11.0(graphql@16.11.0) '@whatwg-node/disposablestack': 0.0.6 graphql: 16.11.0 graphql-ws: 6.0.6(graphql@16.11.0)(ws@8.18.0) @@ -24233,7 +24220,7 @@ snapshots: dependencies: '@graphql-hive/signal': 2.0.0 '@graphql-tools/executor-common': 1.0.5(graphql@16.11.0) - '@graphql-tools/utils': 10.10.3(graphql@16.11.0) + '@graphql-tools/utils': 10.11.0(graphql@16.11.0) '@repeaterjs/repeater': 3.0.6 '@whatwg-node/disposablestack': 0.0.6 '@whatwg-node/fetch': 0.10.13 @@ -24248,7 +24235,7 @@ snapshots: dependencies: '@graphql-hive/signal': 2.0.0 '@graphql-tools/executor-common': 1.0.5(graphql@16.11.0) - '@graphql-tools/utils': 10.10.3(graphql@16.11.0) + '@graphql-tools/utils': 10.11.0(graphql@16.11.0) '@repeaterjs/repeater': 3.0.6 '@whatwg-node/disposablestack': 0.0.6 '@whatwg-node/fetch': 0.10.13 @@ -24263,7 +24250,7 @@ snapshots: dependencies: '@graphql-hive/signal': 2.0.0 '@graphql-tools/executor-common': 1.0.5(graphql@16.11.0) - '@graphql-tools/utils': 10.10.3(graphql@16.11.0) + '@graphql-tools/utils': 10.11.0(graphql@16.11.0) '@repeaterjs/repeater': 3.0.6 '@whatwg-node/disposablestack': 0.0.6 '@whatwg-node/fetch': 0.10.13 @@ -24278,7 +24265,7 @@ snapshots: dependencies: '@graphql-hive/signal': 2.0.0 '@graphql-tools/executor-common': 1.0.5(graphql@16.9.0) - '@graphql-tools/utils': 10.10.3(graphql@16.9.0) + '@graphql-tools/utils': 10.11.0(graphql@16.9.0) '@repeaterjs/repeater': 3.0.6 '@whatwg-node/disposablestack': 0.0.6 '@whatwg-node/fetch': 0.10.13 @@ -24422,7 +24409,7 @@ snapshots: '@graphql-tools/merge': 9.1.5(graphql@16.11.0) '@graphql-tools/schema': 10.0.29(graphql@16.11.0) '@graphql-tools/stitch': 10.1.3(graphql@16.11.0) - '@graphql-tools/utils': 10.10.3(graphql@16.11.0) + '@graphql-tools/utils': 10.11.0(graphql@16.11.0) '@graphql-tools/wrap': 11.0.5(graphql@16.11.0) '@graphql-yoga/typed-event-target': 3.0.2 '@whatwg-node/disposablestack': 0.0.6 @@ -24442,7 +24429,7 @@ snapshots: '@graphql-tools/merge': 9.1.5(graphql@16.11.0) '@graphql-tools/schema': 10.0.29(graphql@16.11.0) '@graphql-tools/stitch': 10.1.3(graphql@16.11.0) - '@graphql-tools/utils': 10.10.3(graphql@16.11.0) + '@graphql-tools/utils': 10.11.0(graphql@16.11.0) '@graphql-tools/wrap': 11.0.5(graphql@16.11.0) '@graphql-yoga/typed-event-target': 3.0.2 '@whatwg-node/disposablestack': 0.0.6 @@ -24661,7 +24648,7 @@ snapshots: '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.5) '@babel/traverse': 7.28.5 '@babel/types': 7.26.10 - '@graphql-tools/utils': 10.10.3(graphql@16.11.0) + '@graphql-tools/utils': 10.11.0(graphql@16.11.0) graphql: 16.11.0 tslib: 2.8.1 transitivePeerDependencies: @@ -24674,7 +24661,7 @@ snapshots: '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.5) '@babel/traverse': 7.28.5 '@babel/types': 7.26.10 - '@graphql-tools/utils': 10.10.3(graphql@16.9.0) + '@graphql-tools/utils': 10.11.0(graphql@16.9.0) graphql: 16.9.0 tslib: 2.8.1 transitivePeerDependencies: @@ -24706,7 +24693,7 @@ snapshots: '@graphql-tools/import@7.1.7(graphql@16.11.0)': dependencies: - '@graphql-tools/utils': 10.10.3(graphql@16.11.0) + '@graphql-tools/utils': 10.11.0(graphql@16.11.0) '@theguild/federation-composition': 0.20.2(graphql@16.11.0) graphql: 16.11.0 resolve-from: 5.0.0 @@ -24847,14 +24834,14 @@ snapshots: '@graphql-tools/schema@10.0.29(graphql@16.11.0)': dependencies: '@graphql-tools/merge': 9.1.5(graphql@16.11.0) - '@graphql-tools/utils': 10.10.3(graphql@16.11.0) + '@graphql-tools/utils': 10.11.0(graphql@16.11.0) graphql: 16.11.0 tslib: 2.8.1 '@graphql-tools/schema@10.0.29(graphql@16.9.0)': dependencies: '@graphql-tools/merge': 9.1.5(graphql@16.9.0) - '@graphql-tools/utils': 10.10.3(graphql@16.9.0) + '@graphql-tools/utils': 10.11.0(graphql@16.9.0) graphql: 16.9.0 tslib: 2.8.1 @@ -24873,7 +24860,7 @@ snapshots: '@graphql-tools/executor': 1.4.13(graphql@16.11.0) '@graphql-tools/merge': 9.1.5(graphql@16.11.0) '@graphql-tools/schema': 10.0.29(graphql@16.11.0) - '@graphql-tools/utils': 10.10.3(graphql@16.11.0) + '@graphql-tools/utils': 10.11.0(graphql@16.11.0) '@graphql-tools/wrap': 11.0.5(graphql@16.11.0) '@whatwg-node/promise-helpers': 1.3.2 graphql: 16.11.0 @@ -25152,7 +25139,7 @@ snapshots: dependencies: '@graphql-tools/delegate': 11.1.3(graphql@16.11.0) '@graphql-tools/schema': 10.0.29(graphql@16.11.0) - '@graphql-tools/utils': 10.10.3(graphql@16.11.0) + '@graphql-tools/utils': 10.11.0(graphql@16.11.0) '@whatwg-node/promise-helpers': 1.3.2 graphql: 16.11.0 tslib: 2.8.1 @@ -25161,7 +25148,7 @@ snapshots: dependencies: '@graphql-tools/delegate': 11.1.3(graphql@16.9.0) '@graphql-tools/schema': 10.0.29(graphql@16.9.0) - '@graphql-tools/utils': 10.10.3(graphql@16.9.0) + '@graphql-tools/utils': 10.11.0(graphql@16.9.0) '@whatwg-node/promise-helpers': 1.3.2 graphql: 16.9.0 tslib: 2.8.1 @@ -35638,7 +35625,7 @@ snapshots: graphql-yoga@5.7.0(graphql@16.9.0): dependencies: '@envelop/core': 5.0.2 - '@graphql-tools/executor': 1.4.13(graphql@16.9.0) + '@graphql-tools/executor': 1.5.0(graphql@16.9.0) '@graphql-tools/schema': 10.0.25(graphql@16.9.0) '@graphql-tools/utils': 10.9.1(graphql@16.9.0) '@graphql-yoga/logger': 2.0.1