From 667a15a5dfdf36d752ab8c02589be216446ef693 Mon Sep 17 00:00:00 2001 From: jdolle <1841898+jdolle@users.noreply.github.com> Date: Wed, 18 Feb 2026 17:22:19 -0800 Subject: [PATCH 01/29] Add schema proposal composition background job --- deployment/services/workflows.ts | 3 + .../src/modules/shared/providers/storage.ts | 1 - packages/services/workflows/.env.template | 1 + packages/services/workflows/src/context.ts | 2 + .../services/workflows/src/environment.ts | 4 + packages/services/workflows/src/index.ts | 5 + .../workflows/src/lib/schema/provider.ts | 295 ++++++++++++++++++ .../src/tasks/schema-proposal-composition.ts | 50 +++ 8 files changed, 360 insertions(+), 1 deletion(-) create mode 100644 packages/services/workflows/src/lib/schema/provider.ts create mode 100644 packages/services/workflows/src/tasks/schema-proposal-composition.ts diff --git a/deployment/services/workflows.ts b/deployment/services/workflows.ts index ff394ce5b6e..602b969e688 100644 --- a/deployment/services/workflows.ts +++ b/deployment/services/workflows.ts @@ -22,6 +22,7 @@ export function deployWorkflows({ postgres, observability, postmarkSecret, + schemaServiceUrl, }: { postgres: Postgres; observability: Observability; @@ -31,6 +32,7 @@ export function deployWorkflows({ heartbeat?: string; sentry: Sentry; postmarkSecret: PostmarkSecret; + schemaServiceUrl: string; }) { return ( new ServiceDeployment( @@ -47,6 +49,7 @@ export function deployWorkflows({ ? observability.tracingEndpoint : '', LOG_JSON: '1', + SCHEMA_SERVICE_URL: schemaServiceUrl, }, readinessProbe: '/_readiness', livenessProbe: '/_health', diff --git a/packages/services/api/src/modules/shared/providers/storage.ts b/packages/services/api/src/modules/shared/providers/storage.ts index f8b8c85a81c..bb561ac8839 100644 --- a/packages/services/api/src/modules/shared/providers/storage.ts +++ b/packages/services/api/src/modules/shared/providers/storage.ts @@ -413,7 +413,6 @@ export interface Storage { first: number | null; cursor: null | string; }): Promise; - // @todo consider moving to proposals provider getPaginatedSchemaChecksForSchemaProposal< TransformedSchemaCheck extends SchemaCheck = SchemaCheck, >(_: { diff --git a/packages/services/workflows/.env.template b/packages/services/workflows/.env.template index 8ac28c8c7ff..9cd2d0b9875 100644 --- a/packages/services/workflows/.env.template +++ b/packages/services/workflows/.env.template @@ -5,3 +5,4 @@ POSTGRES_USER=postgres POSTGRES_PASSWORD=postgres EMAIL_FROM=mock@graphql-hive.com EMAIL_PROVIDER=mock +SCHEMA_SERVICE_URL=localhost:6500 \ No newline at end of file diff --git a/packages/services/workflows/src/context.ts b/packages/services/workflows/src/context.ts index 884702dbf0d..a3746636921 100644 --- a/packages/services/workflows/src/context.ts +++ b/packages/services/workflows/src/context.ts @@ -1,11 +1,13 @@ import type { DatabasePool } from 'slonik'; import type { Logger } from '@graphql-hive/logger'; import type { EmailProvider } from './lib/emails/providers.js'; +import { SchemaProvider } from './lib/schema/provider.js'; import { RequestBroker } from './lib/webhooks/send-webhook.js'; export type Context = { logger: Logger; email: EmailProvider; + schema: SchemaProvider; pg: DatabasePool; requestBroker: RequestBroker | null; }; diff --git a/packages/services/workflows/src/environment.ts b/packages/services/workflows/src/environment.ts index c8b1904fdbc..60ee72e24b4 100644 --- a/packages/services/workflows/src/environment.ts +++ b/packages/services/workflows/src/environment.ts @@ -26,6 +26,7 @@ const EnvironmentModel = zod.object({ RELEASE: emptyString(zod.string().optional()), HEARTBEAT_ENDPOINT: emptyString(zod.string().url().optional()), EMAIL_FROM: zod.string().email(), + SCHEMA_SERVICE_URL: zod.string().url(), }); const SentryModel = zod.union([ @@ -204,6 +205,9 @@ export const env = { provider: emailProviderConfig, emailFrom: base.EMAIL_FROM, }, + schema: { + serviceUrl: base.SCHEMA_SERVICE_URL, + }, sentry: sentry.SENTRY === '1' ? { dsn: sentry.SENTRY_DSN } : null, log: { level: log.LOG_LEVEL ?? 'info', diff --git a/packages/services/workflows/src/index.ts b/packages/services/workflows/src/index.ts index 625b7170de3..1ad7c8d9fb1 100644 --- a/packages/services/workflows/src/index.ts +++ b/packages/services/workflows/src/index.ts @@ -12,6 +12,7 @@ import { import { Context } from './context.js'; import { env } from './environment.js'; import { createEmailProvider } from './lib/emails/providers.js'; +import { schemaProvider } from './lib/schema/provider.js'; import { bridgeFastifyLogger, bridgeGraphileLogger } from './logger.js'; import { createTaskEventEmitter } from './task-events.js'; @@ -68,6 +69,10 @@ const context: Context = { email: createEmailProvider(env.email.provider, env.email.emailFrom), pg, requestBroker: env.requestBroker, + schema: schemaProvider({ + logger, + serviceUrl: env.schema.serviceUrl, + }), }; const server = await createServer({ diff --git a/packages/services/workflows/src/lib/schema/provider.ts b/packages/services/workflows/src/lib/schema/provider.ts new file mode 100644 index 00000000000..9c40b053838 --- /dev/null +++ b/packages/services/workflows/src/lib/schema/provider.ts @@ -0,0 +1,295 @@ +import { parse, print } from 'graphql'; +import { DatabasePool, sql } from 'slonik'; +import type { Logger } from '@graphql-hive/logger'; +import { errors, patch } from '@graphql-inspector/patch'; +import { Project, SchemaObject } from '@hive/api'; +import { ComposeAndValidateResult } from '@hive/api/shared/entities'; +import type { ContractsInputType, SchemaBuilderApi } from '@hive/schema'; +import { decodeCreatedAtAndUUIDIdBasedCursor } from '@hive/storage'; +import { createTRPCProxyClient, httpLink } from '@trpc/client'; + +type SchemaProviderConfig = { + /** URL of the Schema Service */ + serviceUrl: string; + logger: Logger; +}; + +function createExternalConfig(config: Project['externalComposition']) { + // : ExternalCompositionConfig { + if (config && config.enabled) { + if (!config.endpoint) { + throw new Error('External composition error: endpoint is missing'); + } + + if (!config.encryptedSecret) { + throw new Error('External composition error: encryptedSecret is missing'); + } + + return { + endpoint: config.endpoint, + encryptedSecret: config.encryptedSecret, + }; + } + + return null; +} + +export type SchemaProvider = ReturnType; + +export function schemaProvider(providerConfig: SchemaProviderConfig) { + const schemaService = createTRPCProxyClient({ + links: [ + httpLink({ + url: `${providerConfig.serviceUrl}/trpc`, + fetch, + // headers: { + // 'x-request-id': `job-${args.job.id}`, + // }, + }), + ], + }); + + return { + id: 'schema' as const, + /** + * Compose and validate schemas via the schema service. + * - Requests time out after 30 seconds and result in a human readable error response + * - In case the incoming request is canceled, the call to the schema service is aborted + */ + async composeAndValidate( + compositionType: 'federation' | 'single' | 'stitching', + schemas: SchemaObject[], + config: { + /** Whether external composition should be used (only Federation) */ + external: Project['externalComposition']; + /** Whether native composition should be used (only Federation) */ + native: boolean; + /** Specified contracts (only Federation) */ + contracts: ContractsInputType | null; + }, + ) { + providerConfig.logger.debug( + 'Composing and validating schemas (type=%s, method=%s)', + compositionType, + compositionType === 'federation' + ? config.native + ? 'native' + : config.external.enabled + ? 'external' + : 'v1' + : 'none', + ); + + const timeoutAbortSignal = AbortSignal.timeout(30_000); + + const onTimeout = () => { + providerConfig.logger.debug( + 'Composition HTTP request aborted due to timeout of 30 seconds.', + ); + }; + timeoutAbortSignal.addEventListener('abort', onTimeout); + + try { + const result = await schemaService.composeAndValidate.mutate( + { + type: compositionType, + schemas: schemas.map(s => ({ + raw: s.raw, + source: s.source, + url: s.url ?? null, + })), + external: createExternalConfig(config.external), + native: config.native, + contracts: config.contracts, + }, + { + // Limit the maximum time allowed for composition requests to 30 seconds to avoid a dead-lock + signal: timeoutAbortSignal, + }, + ); + return result; + } catch (err) { + // In case of a timeout error we return something the user can process + if (timeoutAbortSignal.reason) { + return { + contracts: null, + metadataAttributes: null, + schemaMetadata: null, + sdl: null, + supergraph: null, + tags: null, + includesNetworkError: true, + includesException: false, + errors: [ + { + message: 'The schema composition timed out. Please try again.', + source: 'composition', + }, + ], + } satisfies ComposeAndValidateResult; + } + + throw err; + } finally { + timeoutAbortSignal.removeEventListener('abort', onTimeout); + } + }, + + async latestSchemas(args: { targetId: string; pool: DatabasePool }) { + const latestVersion = await args.pool.maybeOne<{ id: string }>( + sql`/* findLatestSchemaVersion */ + SELECT sv.id + FROM schema_versions as sv + WHERE sv.target_id = ${args.targetId} + ORDER BY sv.created_at DESC + LIMIT 1 + `, + ); + + if (!latestVersion) { + return []; + } + + const version = latestVersion.id; + const result = await args.pool.query<{ + id: string; + sdl: string; + serviceName: string; + serviceUrl: string; + type: string; + }>( + sql`/* getSchemasOfVersion */ + SELECT + sl.id, + sl.sdl, + lower(sl.service_name) as serviceName, + sl.service_url as serviceUrl, + p.type + FROM schema_version_to_log AS svl + LEFT JOIN schema_log AS sl ON (sl.id = svl.action_id) + LEFT JOIN projects as p ON (p.id = sl.project_id) + WHERE + svl.version_id = ${version} + AND sl.action = 'PUSH' + AND p.type != 'CUSTOM' + ORDER BY + sl.created_at DESC + `, + ); + + // @todo Consider parsing using zod parser. + return [...result.rows]; + }, + + async proposedSchemas(args: { + targetId: string; + proposalId: string; + cursor?: string | null; + pool: DatabasePool; + }) { + const now = new Date().toISOString(); + let cursor: { + createdAt: string; + id: string; + } | null = null; + + if (args.cursor) { + cursor = decodeCreatedAtAndUUIDIdBasedCursor(args.cursor); + } + + // fetch all latest schemas + const services = await this.latestSchemas({ + targetId: args.targetId, + pool: args.pool, + }); + + let nextCursor = cursor; + // collect changes in paginated requests to avoid stalling the db + do { + const result = await args.pool.any<{ + id: string; + serviceName: string | null; + serviceUrl: string | null; + schemaProposalChanges: any[]; + }>(sql` + SELECT + c."id" + , c."service_name" as "serviceName" + , c."service_url" as "serviceUrl" + , c."schema_proposal_changes" as "schemaProposalChanges" + FROM + "schema_checks" as c + INNER JOIN ( + SELECT COALESCE("service_name", '') as "service", "schema_proposal_id", max("created_at") as "maxdate" + FROM schema_checks + ${ + cursor + ? sql` + WHERE "schema_proposal_id" = ${args.proposalId} + AND ( + ( + "created_at" = ${cursor.createdAt} + AND "id" < ${cursor.id} + ) + OR "created_at" < ${cursor.createdAt} + ) + ` + : sql`` + } + GROUP BY "service", "schema_proposal_id" + ) as cc + ON c."schema_proposal_id" = cc."schema_proposal_id" + AND COALESCE(c."service_name", '') = cc."service" + AND c."created_at" = cc."maxdate" + WHERE + c."schema_proposal_id" = ${args.proposalId} + ${ + cursor + ? sql` + AND ( + ( + c."created_at" = ${cursor.createdAt} + AND c."id" < ${cursor.id} + ) + OR c."created_at" < ${cursor.createdAt} + ) + ` + : sql`` + } + ORDER BY + c."created_at" DESC + , c."id" DESC + LIMIT 20 + `); + + // Use the last id since we don't need to return whether there's a next page or not. + // This may result in one extra DB call if there's exactly mod 20 results. Otherwise, avoids + // fetching extra data. + if (result.length === 20) { + nextCursor = { + createdAt: nextCursor?.createdAt ?? now, + id: result[result.length - 1].id, + }; + } else { + nextCursor = null; + } + + for (const row of result) { + const service = services.find(s => row.serviceName === s.serviceName); + if (service) { + const ast = parse(service.sdl, { noLocation: true }); + service.sdl = print( + patch(ast, row.schemaProposalChanges, { onError: errors.looseErrorHandler }), + ); + + if (row.serviceUrl) { + service.serviceUrl = row.serviceUrl; + } + } + } + } while (nextCursor); + + return services; + }, + }; +} diff --git a/packages/services/workflows/src/tasks/schema-proposal-composition.ts b/packages/services/workflows/src/tasks/schema-proposal-composition.ts new file mode 100644 index 00000000000..c8451c58350 --- /dev/null +++ b/packages/services/workflows/src/tasks/schema-proposal-composition.ts @@ -0,0 +1,50 @@ +/** + * Runs schema composition as a job and then notifies the server when completed. + * + * There's a delay between when this is added and when it's ran on the off chance + * that more requests come in requesting composition for the proposal + */ + +import { z } from 'zod'; +// @todo +import { createSchemaObject } from '@hive/api/shared/entities.js'; +import { defineTask, implementTask } from '../kit.js'; + +export const SchemaProposalCompositionTask = defineTask({ + name: 'schemaProposalComposition', + schema: z.object({ + proposalId: z.string(), + targetId: z.string(), + externalComposition: z.object({ + enabled: z.boolean(), + endpoint: z.optional(z.string()), + encryptedSecret: z.optional(z.string()), + }), + native: z.boolean(), + }), +}); + +export const task = implementTask(SchemaProposalCompositionTask, async args => { + const schemas = await args.context.schema.proposedSchemas({ + pool: args.context.pg, + proposalId: args.input.proposalId, + targetId: args.input.targetId, + }); + + const result = await args.context.schema.composeAndValidate( + schemas[0].type as 'federation' | 'single' | 'stitching', // is this right? + schemas.map(s => createSchemaObject(s)), + { + /** Whether external composition should be used (only Federation) */ + external: args.input.externalComposition, + /** Whether native composition should be used (only Federation) */ + native: args.input.native, + /** Specified contracts (only Federation) */ + // @todo consider passing contracts... + contracts: null, + }, + ); + if (result.errors.length) { + args.logger.error('Composition error found: --------\n%o', result.errors); + } +}); From 88f515fa19a64e923107d21009290406863cc03e Mon Sep 17 00:00:00 2001 From: jdolle <1841898+jdolle@users.noreply.github.com> Date: Mon, 23 Feb 2026 22:20:32 -0800 Subject: [PATCH 02/29] Add pubsub, subscrition, and composition state for proposals --- ...026.02.24T00-00-00.proposal-composition.ts | 16 ++ packages/migrations/src/run-pg-migrations.ts | 1 + .../src/modules/proposals/module.graphql.ts | 18 ++ .../providers/schema-proposal-manager.ts | 37 +++- .../providers/schema-proposal-storage.ts | 60 +++++- .../Subscription/schemaProposalComposition.ts | 12 ++ .../schema/providers/models/composite.ts | 4 +- .../schema/providers/schema-publisher.ts | 12 ++ .../src/modules/shared/providers/pub-sub.ts | 4 + .../services/service-common/src/pubsub.ts | 0 packages/services/workflows/.env.template | 5 +- packages/services/workflows/package.json | 6 + packages/services/workflows/src/context.ts | 2 + .../services/workflows/src/environment.ts | 17 ++ packages/services/workflows/src/index.ts | 35 +++- .../workflows/src/lib/schema/provider.ts | 146 +++++++++---- .../src/tasks/schema-proposal-composition.ts | 69 +++++-- packages/web/app/src/lib/proposals/utils.ts | 1 + pnpm-lock.yaml | 195 +++++++----------- 19 files changed, 442 insertions(+), 198 deletions(-) create mode 100644 packages/migrations/src/actions/2026.02.24T00-00-00.proposal-composition.ts create mode 100644 packages/services/api/src/modules/proposals/resolvers/Subscription/schemaProposalComposition.ts create mode 100644 packages/services/service-common/src/pubsub.ts diff --git a/packages/migrations/src/actions/2026.02.24T00-00-00.proposal-composition.ts b/packages/migrations/src/actions/2026.02.24T00-00-00.proposal-composition.ts new file mode 100644 index 00000000000..0cb16308019 --- /dev/null +++ b/packages/migrations/src/actions/2026.02.24T00-00-00.proposal-composition.ts @@ -0,0 +1,16 @@ +import { type MigrationExecutor } from '../pg-migrator'; + +export default { + name: '2026.02.24T00-00-00.proposal-composition.ts', + run: ({ sql }) => [ + { + name: 'add schema proposal composition state', + query: sql` + ALTER TABLE IF EXISTS "schema_proposals" + ADD COLUMN IF NOT EXISTS "composition_status" TEXT + , ADD COLUMN IF NOT EXISTS "composition_timestamp" TIMESTAMPTZ + ; + `, + }, + ], +} satisfies MigrationExecutor; diff --git a/packages/migrations/src/run-pg-migrations.ts b/packages/migrations/src/run-pg-migrations.ts index 08172435b36..61431a3fd42 100644 --- a/packages/migrations/src/run-pg-migrations.ts +++ b/packages/migrations/src/run-pg-migrations.ts @@ -183,5 +183,6 @@ export const runPGMigrations = async (args: { slonik: DatabasePool; runTo?: stri await import('./actions/2026.01.30T00-00-00.account-linking'), await import('./actions/2026.02.06T00-00-00.zendesk-unique'), await import('./actions/2026.01.30T10-00-00.oidc-require-invitation'), + await import('./actions/2026.02.24T00-00-00.proposal-composition'), ], }); diff --git a/packages/services/api/src/modules/proposals/module.graphql.ts b/packages/services/api/src/modules/proposals/module.graphql.ts index 546927c4ad0..2a3b596ed56 100644 --- a/packages/services/api/src/modules/proposals/module.graphql.ts +++ b/packages/services/api/src/modules/proposals/module.graphql.ts @@ -122,6 +122,21 @@ export default gql` body: String! } + extend type Subscription { + schemaProposalComposition( + input: SchemaProposalCompositionSubscriptionInput! + ): SchemaProposalCompositionEvent! + } + + type SchemaProposalCompositionEvent { + status: String! + timestamp: String! + } + + input SchemaProposalCompositionSubscriptionInput { + proposalId: ID! + } + extend type Query { schemaProposals( after: String @@ -240,6 +255,9 @@ export default gql` """ fromCursor: String ): String + + compositionStatus: String + compositionTimestamp: DateTime } input SchemaProposalChecksInput { 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 86dab5b5469..52fc16d6c0a 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 @@ -1,13 +1,14 @@ /** * This wraps the higher level logic with schema proposals. */ -import { Injectable, Scope } from 'graphql-modules'; +import { Inject, Injectable, Scope } from 'graphql-modules'; import { TargetReferenceInput } from 'packages/libraries/core/src/client/__generated__/types'; import type { SchemaProposalStage } from '../../../__generated__/types'; import { HiveError } from '../../../shared/errors'; import { Session } from '../../auth/lib/authz'; import { IdTranslator } from '../../shared/providers/id-translator'; import { Logger } from '../../shared/providers/logger'; +import { PUB_SUB_CONFIG, type HivePubSub } from '../../shared/providers/pub-sub'; import { Storage } from '../../shared/providers/storage'; import { SchemaProposalStorage } from './schema-proposal-storage'; @@ -23,10 +24,39 @@ export class SchemaProposalManager { private storage: Storage, private session: Session, private idTranslator: IdTranslator, + @Inject(PUB_SUB_CONFIG) private pubSub: HivePubSub, ) { this.logger = logger.child({ source: 'SchemaProposalsManager' }); } + async subscribeToSchemaProposalCompositions(args: { proposalId: string }) { + const proposal = await this.proposalStorage.getProposal({ + id: args.proposalId, + }); + + if (!proposal) { + throw new HiveError('Proposal not found.'); + } + + const target = await this.storage.getTargetById(proposal.targetId); + + if (!target) { + throw new HiveError('Proposal target lookup failed.'); + } + + await this.session.assertPerformAction({ + organizationId: target.orgId, + action: 'schemaProposal:describe', + params: { + organizationId: target.orgId, + projectId: target.projectId, + targetId: target.id, + }, + }); + + return this.pubSub.subscribe('schemaProposalComposition', proposal.id); + } + async proposeSchema(args: { target: TargetReferenceInput; title: string; @@ -131,6 +161,11 @@ export class SchemaProposalManager { // @todo check permissions for user const proposal = await this.proposalStorage.getProposal({ id: args.proposalId }); + + if (!proposal) { + throw new HiveError('Proposal target lookup failed.'); + } + const user = await this.session.getViewer(); const target = await this.storage.getTargetById(proposal.targetId); diff --git a/packages/services/api/src/modules/proposals/providers/schema-proposal-storage.ts b/packages/services/api/src/modules/proposals/providers/schema-proposal-storage.ts index f811de927c5..2fcd0e0d9bb 100644 --- a/packages/services/api/src/modules/proposals/providers/schema-proposal-storage.ts +++ b/packages/services/api/src/modules/proposals/providers/schema-proposal-storage.ts @@ -1,6 +1,12 @@ /** * This wraps the database calls for schema proposals and required validation */ +import { + Logger as GraphileLogger, + LogLevel as GraphileLogLevel, + makeWorkerUtils, + WorkerUtils, +} from 'graphile-worker'; import { Inject, Injectable, Scope } from 'graphql-modules'; import { sql, type DatabasePool } from 'slonik'; import { z } from 'zod'; @@ -14,6 +20,31 @@ import { PG_POOL_CONFIG } from '../../shared/providers/pg-pool'; import { Storage } from '../../shared/providers/storage'; import { SCHEMA_PROPOSALS_ENABLED } from './schema-proposals-enabled-token'; +// @todo do not repeat this definition with workflows service +function logLevel(level: GraphileLogLevel) { + switch (level) { + case 'warning': + return 'warn' as const; + case 'info': { + return 'info' as const; + } + case 'debug': { + return 'debug' as const; + } + case 'error': { + return 'error' as const; + } + } + + return 'info'; +} + +export function bridgeGraphileLogger(logger: Logger) { + return new GraphileLogger(_scope => (level, message, _meta) => { + logger[logLevel(level)](message); + }); +} + const SchemaProposalsTitleModel = z .string() .min(1, 'Must be at least 1 character long') @@ -43,6 +74,27 @@ export class SchemaProposalStorage { this.logger = logger.child({ source: 'SchemaProposalStorage' }); } + async runBackgroundComposition(input: { + proposalId: string; + targetId: string; + externalComposition: { + enabled: boolean; + endpoint?: string | null; + encryptedSecret?: string | null; + }; + native: boolean; + }) { + // @todo inject the graphile worker util instead of making it here? + const tools: WorkerUtils = await makeWorkerUtils({ + pgPool: this.pool.pool, + // @todo + logger: bridgeGraphileLogger(this.logger as any), // as GraphQLHiveLogger), + }); + + // SchemaProposalCompositionTask + await tools.addJob('schemaProposalComposition', { input }); + } + private async assertSchemaProposalsEnabled(args: { organizationId: string; targetId: string; @@ -202,9 +254,9 @@ export class SchemaProposalStorage { "sp"."id" = ${args.id} `, ) - .then(row => SchemaProposalModel.parse(row)); + .then(row => SchemaProposalModel.safeParse(row)); - return result; + return result.data ?? null; } async getPaginatedProposals(args: { @@ -344,7 +396,7 @@ export class SchemaProposalStorage { } const schemaProposalFields = sql` - sp."id" + sp."id" , to_json(sp."created_at") as "createdAt" , to_json(sp."updated_at") as "updatedAt" , sp."title" @@ -352,6 +404,8 @@ const schemaProposalFields = sql` , sp."stage" , sp."target_id" as "targetId" , sp."author" + , sp."composition_status" as "compositionStatus" + , sp."composition_timestamp" as "compositionTimestamp" `; const schemaProposalReviewFields = sql` diff --git a/packages/services/api/src/modules/proposals/resolvers/Subscription/schemaProposalComposition.ts b/packages/services/api/src/modules/proposals/resolvers/Subscription/schemaProposalComposition.ts new file mode 100644 index 00000000000..57973580ac6 --- /dev/null +++ b/packages/services/api/src/modules/proposals/resolvers/Subscription/schemaProposalComposition.ts @@ -0,0 +1,12 @@ +import type { SubscriptionResolvers } from '../../../../__generated__/types'; +import { SchemaProposalManager } from '../../providers/schema-proposal-manager'; + +export const schemaProposalComposition: NonNullable< + SubscriptionResolvers['schemaProposalComposition'] +> = { + subscribe: (_, args, { injector }) => + injector + .get(SchemaProposalManager) + .subscribeToSchemaProposalCompositions({ proposalId: args.input.proposalId }), + resolve: (payload: { status: string; timestamp: string }) => payload, +}; 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 4a7d9bd9bc9..ed1dda27137 100644 --- a/packages/services/api/src/modules/schema/providers/models/composite.ts +++ b/packages/services/api/src/modules/schema/providers/models/composite.ts @@ -250,8 +250,8 @@ export class CompositeModel { modifiedSdl: incoming.sdl, }), ]); - this.logger.info('diff check status: %o', diffCheck); - this.logger.info('policy check status: %o', policyCheck); + this.logger.debug('diff check status: %o', diffCheck); + this.logger.debug('policy check status: %o', policyCheck); if ( compositionCheck.status === 'failed' || 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 b308369c9ed..cff59fbbd63 100644 --- a/packages/services/api/src/modules/schema/providers/schema-publisher.ts +++ b/packages/services/api/src/modules/schema/providers/schema-publisher.ts @@ -728,6 +728,18 @@ export class SchemaPublisher { const retention = await this.rateLimit.getRetention({ targetId: target.id }); const expiresAt = retention ? new Date(Date.now() + retention * millisecondsPerDay) : null; + if (input.schemaProposalId) { + // @todo + await this.schemaProposals.runBackgroundComposition({ + externalComposition: { + enabled: false, + }, + native: true, + proposalId: input.schemaProposalId, + targetId: target.id, + }); + } + if (checkResult.conclusion === SchemaCheckConclusion.Failure) { schemaCheck = await this.storage.createSchemaCheck({ schemaSDL: sdl, diff --git a/packages/services/api/src/modules/shared/providers/pub-sub.ts b/packages/services/api/src/modules/shared/providers/pub-sub.ts index 7854479bb3e..9d7a43890b0 100644 --- a/packages/services/api/src/modules/shared/providers/pub-sub.ts +++ b/packages/services/api/src/modules/shared/providers/pub-sub.ts @@ -3,6 +3,10 @@ import type { PubSub } from 'graphql-yoga'; export type HivePubSub = PubSub<{ oidcIntegrationLogs: [oidcIntegrationId: string, payload: { timestamp: string; message: string }]; + schemaProposalComposition: [ + proposalId: string, + payload: { timestamp: string; status: 'success' | 'fail' | 'error' }, + ]; }>; export const PUB_SUB_CONFIG = new InjectionToken('PUB_SUB'); diff --git a/packages/services/service-common/src/pubsub.ts b/packages/services/service-common/src/pubsub.ts new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/services/workflows/.env.template b/packages/services/workflows/.env.template index 9cd2d0b9875..3babf3fae87 100644 --- a/packages/services/workflows/.env.template +++ b/packages/services/workflows/.env.template @@ -5,4 +5,7 @@ POSTGRES_USER=postgres POSTGRES_PASSWORD=postgres EMAIL_FROM=mock@graphql-hive.com EMAIL_PROVIDER=mock -SCHEMA_SERVICE_URL=localhost:6500 \ No newline at end of file +SCHEMA_SERVICE_URL="http://localhost:6500" +REDIS_HOST=localhost +REDIS_PORT=6379 +REDIS_PASSWORD= \ No newline at end of file diff --git a/packages/services/workflows/package.json b/packages/services/workflows/package.json index e757dd3031d..3485a4032ba 100644 --- a/packages/services/workflows/package.json +++ b/packages/services/workflows/package.json @@ -10,15 +10,21 @@ }, "devDependencies": { "@graphql-hive/logger": "1.0.9", + "@graphql-inspector/patch": "0.1.2", + "@graphql-yoga/redis-event-target": "3.0.3", + "@hive/api": "workspace:*", "@hive/service-common": "workspace:*", "@hive/storage": "workspace:*", "@sentry/node": "7.120.2", + "@trpc/client": "10.45.3", "@types/mjml": "4.7.1", "@types/nodemailer": "7.0.4", "@types/sendmail": "1.4.7", "bentocache": "1.1.0", "dotenv": "16.4.7", "graphile-worker": "0.16.6", + "graphql": "16.9.0", + "graphql-yoga": "5.13.3", "mjml": "4.14.0", "nodemailer": "7.0.11", "sendmail": "1.6.1", diff --git a/packages/services/workflows/src/context.ts b/packages/services/workflows/src/context.ts index a3746636921..fc123931992 100644 --- a/packages/services/workflows/src/context.ts +++ b/packages/services/workflows/src/context.ts @@ -1,5 +1,6 @@ import type { DatabasePool } from 'slonik'; import type { Logger } from '@graphql-hive/logger'; +import type { HivePubSub } from '@hive/api/modules/shared/providers/pub-sub.js'; import type { EmailProvider } from './lib/emails/providers.js'; import { SchemaProvider } from './lib/schema/provider.js'; import { RequestBroker } from './lib/webhooks/send-webhook.js'; @@ -10,4 +11,5 @@ export type Context = { schema: SchemaProvider; pg: DatabasePool; requestBroker: RequestBroker | null; + pubSub: HivePubSub; }; diff --git a/packages/services/workflows/src/environment.ts b/packages/services/workflows/src/environment.ts index 60ee72e24b4..986be4304aa 100644 --- a/packages/services/workflows/src/environment.ts +++ b/packages/services/workflows/src/environment.ts @@ -83,6 +83,15 @@ const EmailProviderModel = zod.union([ SendmailEmailModel, ]); +const RedisModel = zod.object({ + REDIS_HOST: zod.string(), + REDIS_PORT: NumberFromString, + REDIS_PASSWORD: zod.string(), + REDIS_TLS_ENABLED: emptyString( + zod.union([zod.literal('0'), zod.literal('1')]).optional(), + ).default('0'), +}); + const RequestBrokerModel = zod.union([ zod.object({ REQUEST_BROKER: emptyString(zod.literal('0').optional()), @@ -128,6 +137,7 @@ const configs = { log: LogModel.safeParse(process.env), tracing: OpenTelemetryConfigurationModel.safeParse(process.env), requestBroker: RequestBrokerModel.safeParse(process.env), + redis: RedisModel.safeParse(process.env), }; const environmentErrors: Array = []; @@ -159,6 +169,7 @@ const prometheus = extractConfig(configs.prometheus); const log = extractConfig(configs.log); const tracing = extractConfig(configs.tracing); const requestBroker = extractConfig(configs.requestBroker); +const redis = extractConfig(configs.redis); const emailProviderConfig = email.EMAIL_PROVIDER === 'postmark' @@ -239,4 +250,10 @@ export const env = { } satisfies RequestBroker) : null, httpHeartbeat: base.HEARTBEAT_ENDPOINT ? { endpoint: base.HEARTBEAT_ENDPOINT } : null, + redis: { + host: redis.REDIS_HOST, + port: redis.REDIS_PORT, + password: redis.REDIS_PASSWORD ?? '', + tlsEnabled: redis.REDIS_TLS_ENABLED === '1', + }, } as const; diff --git a/packages/services/workflows/src/index.ts b/packages/services/workflows/src/index.ts index 1ad7c8d9fb1..ee3ea1e8825 100644 --- a/packages/services/workflows/src/index.ts +++ b/packages/services/workflows/src/index.ts @@ -1,6 +1,10 @@ import { run } from 'graphile-worker'; +import { createPubSub } from 'graphql-yoga'; import { createPool } from 'slonik'; import { Logger } from '@graphql-hive/logger'; +import { createRedisEventTarget } from '@graphql-yoga/redis-event-target'; +import { HivePubSub } from '@hive/api/modules/shared/providers/pub-sub'; +import { createRedisClient } from '@hive/api/modules/shared/providers/redis'; import { createServer, registerShutdown, @@ -40,6 +44,7 @@ const modules = await Promise.all([ import('./tasks/schema-change-notification.js'), import('./tasks/usage-rate-limit-exceeded.js'), import('./tasks/usage-rate-limit-warning.js'), + import('./tasks/schema-proposal-composition.js'), ]); const crontab = ` @@ -64,6 +69,25 @@ const stopHttpHeartbeat = env.httpHeartbeat }) : null; +const server = await createServer({ + sentryErrorHandler: !!env.sentry, + name: 'workflows', + log: logger, +}); + +const redis = createRedisClient('Redis', env.redis, server.log.child({ source: 'Redis' })); + +const pubSub = createPubSub({ + eventTarget: createRedisEventTarget({ + publishClient: redis, + subscribeClient: createRedisClient( + 'subscriber', + env.redis, + server.log.child({ source: 'RedisSubscribe' }), + ), + }), +}) as HivePubSub; + const context: Context = { logger, email: createEmailProvider(env.email.provider, env.email.emailFrom), @@ -71,16 +95,11 @@ const context: Context = { requestBroker: env.requestBroker, schema: schemaProvider({ logger, - serviceUrl: env.schema.serviceUrl, + schemaServiceUrl: env.schema.serviceUrl, }), + pubSub, }; -const server = await createServer({ - sentryErrorHandler: !!env.sentry, - name: 'workflows', - log: logger, -}); - server.route({ method: ['GET', 'HEAD'], url: '/_health', @@ -137,6 +156,8 @@ registerShutdown({ logger.info('Shutdown postgres connection.'); await pg.end(); logger.info('Shutdown postgres connection successful.'); + logger.info('Shutdown redis connection.'); + redis.disconnect(false); if (shutdownMetrics) { logger.info('Stopping prometheus endpoint'); await shutdownMetrics(); diff --git a/packages/services/workflows/src/lib/schema/provider.ts b/packages/services/workflows/src/lib/schema/provider.ts index 9c40b053838..b0f90a313b8 100644 --- a/packages/services/workflows/src/lib/schema/provider.ts +++ b/packages/services/workflows/src/lib/schema/provider.ts @@ -1,19 +1,36 @@ import { parse, print } from 'graphql'; import { DatabasePool, sql } from 'slonik'; +import { z } from 'zod'; import type { Logger } from '@graphql-hive/logger'; +import { Change } from '@graphql-inspector/core'; import { errors, patch } from '@graphql-inspector/patch'; import { Project, SchemaObject } from '@hive/api'; -import { ComposeAndValidateResult } from '@hive/api/shared/entities'; +import { ComposeAndValidateResult, ProjectType } from '@hive/api/shared/entities'; import type { ContractsInputType, SchemaBuilderApi } from '@hive/schema'; -import { decodeCreatedAtAndUUIDIdBasedCursor } from '@hive/storage'; +import { decodeCreatedAtAndUUIDIdBasedCursor, HiveSchemaChangeModel } from '@hive/storage'; import { createTRPCProxyClient, httpLink } from '@trpc/client'; type SchemaProviderConfig = { /** URL of the Schema Service */ - serviceUrl: string; + schemaServiceUrl: string; logger: Logger; }; +const SchemaModel = z.object({ + id: z.string().uuid(), + sdl: z.string(), + serviceName: z.optional(z.string()), + serviceUrl: z.optional(z.string()), + type: z.string(), +}); + +const SchemaProposalChangesModel = z.object({ + id: z.string().uuid(), + serviceName: z.string().optional(), + serviceUrl: z.string().optional(), + schemaProposalChanges: z.array(HiveSchemaChangeModel).default([]), +}); + function createExternalConfig(config: Project['externalComposition']) { // : ExternalCompositionConfig { if (config && config.enabled) { @@ -36,15 +53,37 @@ function createExternalConfig(config: Project['externalComposition']) { export type SchemaProvider = ReturnType; +function toUpperSnakeCase(str: string) { + // Use a regular expression to find uppercase letters and insert underscores + // The 'g' flag ensures all occurrences are replaced. + // The 'replace' function uses a callback to add an underscore before the matched uppercase letter. + const snakeCaseString = str.replace(/([A-Z])/g, (match, p1, offset) => { + // If it's the first character, don't add an underscore + if (offset === 0) { + return p1; + } + return `_${p1}`; + }); + + return snakeCaseString.toUpperCase(); +} + +export function convertProjectType(t: ProjectType) { + return ( + { + [ProjectType.FEDERATION]: 'federation', + [ProjectType.SINGLE]: 'single', + [ProjectType.STITCHING]: 'stitching', + } as const + )[t]; +} + export function schemaProvider(providerConfig: SchemaProviderConfig) { const schemaService = createTRPCProxyClient({ links: [ httpLink({ - url: `${providerConfig.serviceUrl}/trpc`, + url: `${providerConfig.schemaServiceUrl}/trpc`, fetch, - // headers: { - // 'x-request-id': `job-${args.job.id}`, - // }, }), ], }); @@ -57,7 +96,7 @@ export function schemaProvider(providerConfig: SchemaProviderConfig) { * - In case the incoming request is canceled, the call to the schema service is aborted */ async composeAndValidate( - compositionType: 'federation' | 'single' | 'stitching', + projectType: ProjectType, schemas: SchemaObject[], config: { /** Whether external composition should be used (only Federation) */ @@ -68,6 +107,7 @@ export function schemaProvider(providerConfig: SchemaProviderConfig) { contracts: ContractsInputType | null; }, ) { + const compositionType = convertProjectType(projectType); providerConfig.logger.debug( 'Composing and validating schemas (type=%s, method=%s)', compositionType, @@ -135,12 +175,24 @@ export function schemaProvider(providerConfig: SchemaProviderConfig) { } }, - async latestSchemas(args: { targetId: string; pool: DatabasePool }) { + async updateSchemaProposalComposition(args: { + proposalId: string; + timestamp: string; + status: 'error' | 'success' | 'fail'; + pool: DatabasePool; + }) { + const { pool, ...state } = args; + await pool.query( + sql`/* updateSchemaProposalComposition */ UPDATE schema_proposals SET composition_status = ${args.status}, composition_timestamp = ${args.timestamp} WHERE id=${args.proposalId}`, + ); + }, + + async latestComposableSchemas(args: { targetId: string; pool: DatabasePool }) { const latestVersion = await args.pool.maybeOne<{ id: string }>( - sql`/* findLatestSchemaVersion */ + sql`/* findLatestComposableSchemaVersion */ SELECT sv.id FROM schema_versions as sv - WHERE sv.target_id = ${args.targetId} + WHERE sv.target_id = ${args.targetId} AND sv.is_composable IS TRUE ORDER BY sv.created_at DESC LIMIT 1 `, @@ -151,20 +203,14 @@ export function schemaProvider(providerConfig: SchemaProviderConfig) { } const version = latestVersion.id; - const result = await args.pool.query<{ - id: string; - sdl: string; - serviceName: string; - serviceUrl: string; - type: string; - }>( + const result = await args.pool.query( sql`/* getSchemasOfVersion */ SELECT - sl.id, - sl.sdl, - lower(sl.service_name) as serviceName, - sl.service_url as serviceUrl, - p.type + sl.id + , sl.sdl + , lower(sl.service_name) as "serviceName" + , sl.service_url as "serviceUrl" + , p.type FROM schema_version_to_log AS svl LEFT JOIN schema_log AS sl ON (sl.id = svl.action_id) LEFT JOIN projects as p ON (p.id = sl.project_id) @@ -176,9 +222,14 @@ export function schemaProvider(providerConfig: SchemaProviderConfig) { sl.created_at DESC `, ); + return result.rows.map(row => SchemaModel.parse(row)); + }, - // @todo Consider parsing using zod parser. - return [...result.rows]; + async getBaseSchema(args: { targetId: string; pool: DatabasePool }) { + const data = await args.pool.maybeOne>( + sql`/* getBaseSchema */ SELECT base_schema FROM targets WHERE id=${args.targetId}`, + ); + return data?.base_schema ?? null; }, async proposedSchemas(args: { @@ -198,7 +249,7 @@ export function schemaProvider(providerConfig: SchemaProviderConfig) { } // fetch all latest schemas - const services = await this.latestSchemas({ + const services = await this.latestComposableSchemas({ targetId: args.targetId, pool: args.pool, }); @@ -206,12 +257,7 @@ export function schemaProvider(providerConfig: SchemaProviderConfig) { let nextCursor = cursor; // collect changes in paginated requests to avoid stalling the db do { - const result = await args.pool.any<{ - id: string; - serviceName: string | null; - serviceUrl: string | null; - schemaProposalChanges: any[]; - }>(sql` + const result = await args.pool.query(sql` SELECT c."id" , c."service_name" as "serviceName" @@ -262,28 +308,42 @@ export function schemaProvider(providerConfig: SchemaProviderConfig) { LIMIT 20 `); - // Use the last id since we don't need to return whether there's a next page or not. - // This may result in one extra DB call if there's exactly mod 20 results. Otherwise, avoids - // fetching extra data. - if (result.length === 20) { + const changes = result.rows.map(row => { + const value = SchemaProposalChangesModel.parse(row); + return { + ...value, + schemaProposalChanges: value.schemaProposalChanges.map(c => { + const change: Change = { + ...c, + path: c.path ?? undefined, + criticality: { + level: c.criticality, + }, + }; + return change; + }), + }; + }); + + if (changes.length === 20) { nextCursor = { + // Keep the created at because we want the same set of checks when joining on the "latest". createdAt: nextCursor?.createdAt ?? now, - id: result[result.length - 1].id, + id: changes[changes.length - 1].id, }; } else { nextCursor = null; } - for (const row of result) { - const service = services.find(s => row.serviceName === s.serviceName); + for (const change of changes) { + const service = services.find(s => change.serviceName === s.serviceName); if (service) { const ast = parse(service.sdl, { noLocation: true }); service.sdl = print( - patch(ast, row.schemaProposalChanges, { onError: errors.looseErrorHandler }), + patch(ast, change.schemaProposalChanges, { onError: errors.looseErrorHandler }), ); - - if (row.serviceUrl) { - service.serviceUrl = row.serviceUrl; + if (change.serviceUrl) { + service.serviceUrl = change.serviceUrl; } } } diff --git a/packages/services/workflows/src/tasks/schema-proposal-composition.ts b/packages/services/workflows/src/tasks/schema-proposal-composition.ts index c8451c58350..d48abf76e90 100644 --- a/packages/services/workflows/src/tasks/schema-proposal-composition.ts +++ b/packages/services/workflows/src/tasks/schema-proposal-composition.ts @@ -6,10 +6,27 @@ */ import { z } from 'zod'; -// @todo -import { createSchemaObject } from '@hive/api/shared/entities.js'; +// @todo -- duplicate this or export it from @hive/api to avoid using a file path +import { createSchemaObject, ProjectType } from '@hive/api/shared/entities.js'; import { defineTask, implementTask } from '../kit.js'; +function extendWithBase(schemas: Array<{ sdl: string }>, baseSchema: string | null) { + if (!baseSchema) { + return schemas; + } + + return schemas.map((schema, index) => { + if (index === 0) { + return { + ...schema, + sdl: baseSchema + ' ' + schema.sdl, + }; + } + + return schema; + }); +} + export const SchemaProposalCompositionTask = defineTask({ name: 'schemaProposalComposition', schema: z.object({ @@ -31,20 +48,38 @@ export const task = implementTask(SchemaProposalCompositionTask, async args => { targetId: args.input.targetId, }); - const result = await args.context.schema.composeAndValidate( - schemas[0].type as 'federation' | 'single' | 'stitching', // is this right? - schemas.map(s => createSchemaObject(s)), - { - /** Whether external composition should be used (only Federation) */ - external: args.input.externalComposition, - /** Whether native composition should be used (only Federation) */ - native: args.input.native, - /** Specified contracts (only Federation) */ - // @todo consider passing contracts... - contracts: null, - }, - ); - if (result.errors.length) { - args.logger.error('Composition error found: --------\n%o', result.errors); + const baseSchema = await args.context.schema.getBaseSchema({ + pool: args.context.pg, + targetId: args.input.targetId, + }); + + try { + const result = await args.context.schema.composeAndValidate( + schemas[0].type as ProjectType, + extendWithBase(schemas, baseSchema).map(s => createSchemaObject(s)), + { + /** Whether external composition should be used (only Federation) */ + external: args.input.externalComposition, + /** Whether native composition should be used (only Federation) */ + native: args.input.native, + /** Proposals currently ignore contracts. */ + contracts: null, + }, + ); + + const payload: { timestamp: string; status: 'error' | 'success' } = { + timestamp: new Date().toISOString(), + status: result.errors.length ? 'error' : 'success', + }; + await args.context.schema.updateSchemaProposalComposition({ + ...payload, + proposalId: args.input.proposalId, + pool: args.context.pg, + }); + args.context.pubSub.publish('schemaProposalComposition', args.input.proposalId, payload); + } catch (e) { + // if the internal error persists, then this will be ran multiple times. + args.logger.error('Something went wrong. %s', (e as Error).message); + throw e; } }); diff --git a/packages/web/app/src/lib/proposals/utils.ts b/packages/web/app/src/lib/proposals/utils.ts index 1527036c32f..6a9ecd0d18f 100644 --- a/packages/web/app/src/lib/proposals/utils.ts +++ b/packages/web/app/src/lib/proposals/utils.ts @@ -38,6 +38,7 @@ export function addTypeForExtensions(ast: DocumentNode) { const name = node.name.value; const entry = trackTypeDefs.get(name); if (isTypeExtensionNode(node)) { + console.log(node.kind); if (!entry) { trackTypeDefs.set(name, { state: 'EXTENSION_ONLY', kind: node.kind }); } else if (entry.state === 'TYPE_ONLY') { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dc82f6d609e..54a21bb71a2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1636,6 +1636,15 @@ importers: '@graphql-hive/logger': specifier: 1.0.9 version: 1.0.9(pino@10.3.0) + '@graphql-inspector/patch': + specifier: 0.1.2 + version: 0.1.2(graphql@16.9.0) + '@graphql-yoga/redis-event-target': + specifier: 3.0.3 + version: 3.0.3(ioredis@5.8.2) + '@hive/api': + specifier: workspace:* + version: link:../api '@hive/service-common': specifier: workspace:* version: link:../service-common @@ -1645,6 +1654,9 @@ importers: '@sentry/node': specifier: 7.120.2 version: 7.120.2 + '@trpc/client': + specifier: 10.45.3 + version: 10.45.3(@trpc/server@10.45.3) '@types/mjml': specifier: 4.7.1 version: 4.7.1 @@ -1663,6 +1675,12 @@ importers: graphile-worker: specifier: 0.16.6 version: 0.16.6(typescript@5.7.3) + graphql: + specifier: 16.9.0 + version: 16.9.0 + graphql-yoga: + specifier: 5.13.3 + version: 5.13.3(graphql@16.9.0) mjml: specifier: 4.14.0 version: 4.14.0(encoding@0.1.13) @@ -4722,12 +4740,6 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/executor@1.4.7': - resolution: {integrity: sha512-U0nK9jzJRP9/9Izf1+0Gggd6K6RNRsheFo1gC/VWzfnsr0qjcOSS9qTjY0OTC5iTPt4tQ+W5Zpw/uc7mebI6aA==} - engines: {node: '>=16.0.0'} - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/executor@1.4.9': resolution: {integrity: sha512-SAUlDT70JAvXeqV87gGzvDzUGofn39nvaVcVhNf12Dt+GfWHtNNO/RCn/Ea4VJaSLGzraUd41ObnN3i80EBU7w==} engines: {node: '>=16.0.0'} @@ -5205,10 +5217,6 @@ packages: peerDependencies: graphql-yoga: ^5.16.2 - '@graphql-yoga/subscription@5.0.4': - resolution: {integrity: sha512-Bcj1LYVQyQmFN/vsl73TRSNistd8lBJJcPxqFVCT8diUuH/gTv2be2OYZsirpeO0l5tFjJWJv9RPgIlCYv3Khw==} - engines: {node: '>=18.0.0'} - '@graphql-yoga/subscription@5.0.5': resolution: {integrity: sha512-oCMWOqFs6QV96/NZRt/ZhTQvzjkGB4YohBOpKM4jH/lDT4qb7Lex/aGCxpi/JD9njw3zBBtMqxbaC22+tFHVvw==} engines: {node: '>=18.0.0'} @@ -10195,10 +10203,6 @@ packages: resolution: {integrity: sha512-QxI+HQfJeI/UscFNCTcSri6nrHP25mtyAMbhEri7W2ctdb3EsorPuJz7IovSgNjvKVs73dg9Fmayewx1O2xOxA==} engines: {node: '>=18.0.0'} - '@whatwg-node/server@0.10.3': - resolution: {integrity: sha512-2Dnfey57vWR+hDUMjPhNzJQc9z116BBzSQwR9eD0vhnzYmN2rJXuY0QuMaHDCCqEZRmFHg2bo8iJ+/1uHOlxpg==} - engines: {node: '>=18.0.0'} - '@whatwg-node/server@0.9.65': resolution: {integrity: sha512-CnYTFEUJkbbAcuBXnXirVIgKBfs2YA6sSGjxeq07AUiyXuoQ0fbvTIQoteMglmn09QeGzcH/l0B7nIml83xvVw==} engines: {node: '>=18.0.0'} @@ -21719,7 +21723,7 @@ snapshots: dependencies: '@envelop/core': 5.5.1 '@envelop/extended-validation': 7.0.0(@envelop/core@5.5.1)(graphql@16.12.0) - '@graphql-tools/executor': 1.4.9(graphql@16.12.0) + '@graphql-tools/executor': 1.5.0(graphql@16.12.0) '@graphql-tools/utils': 10.9.1(graphql@16.12.0) '@whatwg-node/promise-helpers': 1.3.2 graphql: 16.12.0 @@ -21729,7 +21733,7 @@ snapshots: dependencies: '@envelop/core': 5.5.1 '@envelop/extended-validation': 7.0.0(@envelop/core@5.5.1)(graphql@16.9.0) - '@graphql-tools/executor': 1.4.9(graphql@16.9.0) + '@graphql-tools/executor': 1.5.0(graphql@16.9.0) '@graphql-tools/utils': 10.9.1(graphql@16.9.0) '@whatwg-node/promise-helpers': 1.3.2 graphql: 16.9.0 @@ -21955,7 +21959,7 @@ snapshots: '@escape.tech/graphql-armor-block-field-suggestions@3.0.1': dependencies: - graphql: 16.11.0 + graphql: 16.12.0 optionalDependencies: '@envelop/core': 5.5.1 @@ -22554,7 +22558,7 @@ snapshots: '@graphql-hive/logger': 1.0.9(pino@10.3.0) '@graphql-hive/pubsub': 2.1.1(ioredis@5.8.2) '@graphql-hive/signal': 2.0.0 - '@graphql-hive/yoga': 0.42.5(graphql-yoga@5.16.2(graphql@16.12.0))(graphql@16.12.0) + '@graphql-hive/yoga': 0.42.5(graphql-yoga@5.17.1(graphql@16.12.0))(graphql@16.12.0) '@graphql-mesh/cross-helpers': 0.4.10(graphql@16.12.0) '@graphql-mesh/fusion-runtime': 1.5.1(@types/node@24.10.1)(graphql@16.12.0)(ioredis@5.8.2)(pino@10.3.0) '@graphql-mesh/hmac-upstream-signature': 2.0.8(graphql@16.12.0)(ioredis@5.8.2) @@ -22570,10 +22574,10 @@ snapshots: '@graphql-tools/stitch': 10.1.3(graphql@16.12.0) '@graphql-tools/utils': 10.10.3(graphql@16.12.0) '@graphql-tools/wrap': 11.0.5(graphql@16.12.0) - '@graphql-yoga/plugin-apollo-usage-report': 0.11.2(@envelop/core@5.5.1)(graphql-yoga@5.16.2(graphql@16.12.0))(graphql@16.12.0) - '@graphql-yoga/plugin-csrf-prevention': 3.16.2(graphql-yoga@5.16.2(graphql@16.12.0)) - '@graphql-yoga/plugin-defer-stream': 3.16.2(graphql-yoga@5.16.2(graphql@16.12.0))(graphql@16.12.0) - '@graphql-yoga/plugin-persisted-operations': 3.16.2(graphql-yoga@5.16.2(graphql@16.12.0))(graphql@16.12.0) + '@graphql-yoga/plugin-apollo-usage-report': 0.11.2(@envelop/core@5.5.1)(graphql-yoga@5.17.1(graphql@16.12.0))(graphql@16.12.0) + '@graphql-yoga/plugin-csrf-prevention': 3.16.2(graphql-yoga@5.17.1(graphql@16.12.0)) + '@graphql-yoga/plugin-defer-stream': 3.16.2(graphql-yoga@5.17.1(graphql@16.12.0))(graphql@16.12.0) + '@graphql-yoga/plugin-persisted-operations': 3.16.2(graphql-yoga@5.17.1(graphql@16.12.0))(graphql@16.12.0) '@types/node': 24.10.1 '@whatwg-node/disposablestack': 0.0.6 '@whatwg-node/promise-helpers': 1.3.2 @@ -22581,7 +22585,7 @@ snapshots: '@whatwg-node/server-plugin-cookies': 1.0.5 graphql: 16.12.0 graphql-ws: 6.0.6(graphql@16.12.0)(ws@8.18.0) - graphql-yoga: 5.16.2(graphql@16.12.0) + graphql-yoga: 5.17.1(graphql@16.12.0) tslib: 2.8.1 transitivePeerDependencies: - '@fastify/websocket' @@ -22969,12 +22973,12 @@ snapshots: '@graphql-hive/signal@2.0.0': {} - '@graphql-hive/yoga@0.42.5(graphql-yoga@5.16.2(graphql@16.12.0))(graphql@16.12.0)': + '@graphql-hive/yoga@0.42.5(graphql-yoga@5.17.1(graphql@16.12.0))(graphql@16.12.0)': dependencies: '@graphql-hive/core': 0.14.0(graphql@16.12.0) - '@graphql-yoga/plugin-persisted-operations': 3.16.2(graphql-yoga@5.16.2(graphql@16.12.0))(graphql@16.12.0) + '@graphql-yoga/plugin-persisted-operations': 3.16.2(graphql-yoga@5.17.1(graphql@16.12.0))(graphql@16.12.0) graphql: 16.12.0 - graphql-yoga: 5.16.2(graphql@16.12.0) + graphql-yoga: 5.17.1(graphql@16.12.0) '@graphql-hive/yoga@0.46.0(graphql-yoga@5.17.1(graphql@16.12.0))(graphql@16.12.0)(pino@10.3.0)': dependencies: @@ -23316,7 +23320,7 @@ snapshots: '@graphql-mesh/utils': 0.104.16(graphql@16.12.0)(ioredis@5.8.2) '@graphql-tools/batch-execute': 10.0.4(graphql@16.12.0) '@graphql-tools/delegate': 11.1.3(graphql@16.12.0) - '@graphql-tools/executor': 1.4.13(graphql@16.12.0) + '@graphql-tools/executor': 1.5.0(graphql@16.12.0) '@graphql-tools/federation': 4.2.3(@types/node@22.10.5)(graphql@16.12.0) '@graphql-tools/merge': 9.1.5(graphql@16.12.0) '@graphql-tools/stitch': 10.1.3(graphql@16.12.0) @@ -23326,7 +23330,7 @@ snapshots: '@whatwg-node/disposablestack': 0.0.6 '@whatwg-node/promise-helpers': 1.3.2 graphql: 16.12.0 - graphql-yoga: 5.16.2(graphql@16.12.0) + graphql-yoga: 5.17.1(graphql@16.12.0) tslib: 2.8.1 transitivePeerDependencies: - '@logtape/logtape' @@ -23347,7 +23351,7 @@ snapshots: '@graphql-mesh/utils': 0.104.16(graphql@16.12.0)(ioredis@5.8.2) '@graphql-tools/batch-execute': 10.0.4(graphql@16.12.0) '@graphql-tools/delegate': 11.1.3(graphql@16.12.0) - '@graphql-tools/executor': 1.4.13(graphql@16.12.0) + '@graphql-tools/executor': 1.5.0(graphql@16.12.0) '@graphql-tools/federation': 4.2.3(@types/node@24.10.1)(graphql@16.12.0) '@graphql-tools/merge': 9.1.5(graphql@16.12.0) '@graphql-tools/stitch': 10.1.3(graphql@16.12.0) @@ -23357,7 +23361,7 @@ snapshots: '@whatwg-node/disposablestack': 0.0.6 '@whatwg-node/promise-helpers': 1.3.2 graphql: 16.12.0 - graphql-yoga: 5.16.2(graphql@16.12.0) + graphql-yoga: 5.17.1(graphql@16.12.0) tslib: 2.8.1 transitivePeerDependencies: - '@logtape/logtape' @@ -23378,7 +23382,7 @@ snapshots: '@graphql-mesh/utils': 0.104.16(graphql@16.12.0)(ioredis@5.8.2) '@graphql-tools/batch-execute': 10.0.4(graphql@16.12.0) '@graphql-tools/delegate': 12.0.2(graphql@16.12.0) - '@graphql-tools/executor': 1.4.13(graphql@16.12.0) + '@graphql-tools/executor': 1.5.0(graphql@16.12.0) '@graphql-tools/federation': 4.2.6(@types/node@25.0.2)(graphql@16.12.0) '@graphql-tools/merge': 9.1.5(graphql@16.12.0) '@graphql-tools/stitch': 10.1.6(graphql@16.12.0) @@ -23409,7 +23413,7 @@ snapshots: '@graphql-mesh/utils': 0.104.16(graphql@16.12.0) '@graphql-tools/batch-execute': 10.0.4(graphql@16.12.0) '@graphql-tools/delegate': 12.0.2(graphql@16.12.0) - '@graphql-tools/executor': 1.4.13(graphql@16.12.0) + '@graphql-tools/executor': 1.5.0(graphql@16.12.0) '@graphql-tools/federation': 4.2.6(@types/node@25.0.2)(graphql@16.12.0) '@graphql-tools/merge': 9.1.5(graphql@16.12.0) '@graphql-tools/stitch': 10.1.6(graphql@16.12.0) @@ -23440,7 +23444,7 @@ snapshots: '@graphql-mesh/utils': 0.104.16(graphql@16.9.0)(ioredis@5.8.2) '@graphql-tools/batch-execute': 10.0.4(graphql@16.9.0) '@graphql-tools/delegate': 12.0.2(graphql@16.9.0) - '@graphql-tools/executor': 1.4.13(graphql@16.9.0) + '@graphql-tools/executor': 1.5.0(graphql@16.9.0) '@graphql-tools/federation': 4.2.6(@types/node@25.0.2)(graphql@16.9.0) '@graphql-tools/merge': 9.1.5(graphql@16.9.0) '@graphql-tools/stitch': 10.1.6(graphql@16.9.0) @@ -23593,11 +23597,11 @@ snapshots: '@graphql-mesh/types': 0.104.16(graphql@16.12.0)(ioredis@5.8.2) '@graphql-mesh/utils': 0.104.16(graphql@16.12.0) '@graphql-tools/utils': 10.9.1(graphql@16.12.0) - '@graphql-yoga/plugin-response-cache': 3.15.4(graphql-yoga@5.16.2(graphql@16.12.0))(graphql@16.12.0) + '@graphql-yoga/plugin-response-cache': 3.15.4(graphql-yoga@5.17.1(graphql@16.12.0))(graphql@16.12.0) '@whatwg-node/promise-helpers': 1.3.2 cache-control-parser: 2.0.6 graphql: 16.12.0 - graphql-yoga: 5.16.2(graphql@16.12.0) + graphql-yoga: 5.17.1(graphql@16.12.0) tslib: 2.8.1 transitivePeerDependencies: - '@nats-io/nats-core' @@ -23612,11 +23616,11 @@ snapshots: '@graphql-mesh/types': 0.104.16(graphql@16.12.0)(ioredis@5.8.2) '@graphql-mesh/utils': 0.104.16(graphql@16.12.0)(ioredis@5.8.2) '@graphql-tools/utils': 10.9.1(graphql@16.12.0) - '@graphql-yoga/plugin-response-cache': 3.15.4(graphql-yoga@5.16.2(graphql@16.12.0))(graphql@16.12.0) + '@graphql-yoga/plugin-response-cache': 3.15.4(graphql-yoga@5.17.1(graphql@16.12.0))(graphql@16.12.0) '@whatwg-node/promise-helpers': 1.3.2 cache-control-parser: 2.0.6 graphql: 16.12.0 - graphql-yoga: 5.16.2(graphql@16.12.0) + graphql-yoga: 5.17.1(graphql@16.12.0) tslib: 2.8.1 transitivePeerDependencies: - '@nats-io/nats-core' @@ -23631,11 +23635,11 @@ snapshots: '@graphql-mesh/types': 0.104.16(graphql@16.9.0)(ioredis@5.8.2) '@graphql-mesh/utils': 0.104.16(graphql@16.9.0)(ioredis@5.8.2) '@graphql-tools/utils': 10.9.1(graphql@16.9.0) - '@graphql-yoga/plugin-response-cache': 3.15.4(graphql-yoga@5.16.2(graphql@16.9.0))(graphql@16.9.0) + '@graphql-yoga/plugin-response-cache': 3.15.4(graphql-yoga@5.17.1(graphql@16.9.0))(graphql@16.9.0) '@whatwg-node/promise-helpers': 1.3.2 cache-control-parser: 2.0.6 graphql: 16.9.0 - graphql-yoga: 5.16.2(graphql@16.9.0) + graphql-yoga: 5.17.1(graphql@16.9.0) tslib: 2.8.1 transitivePeerDependencies: - '@nats-io/nats-core' @@ -23680,7 +23684,7 @@ snapshots: '@graphql-mesh/types': 0.104.16(graphql@16.12.0)(ioredis@5.8.2) '@graphql-tools/executor': 1.4.13(graphql@16.12.0) '@graphql-tools/executor-common': 1.0.5(graphql@16.12.0) - '@graphql-tools/utils': 10.10.3(graphql@16.12.0) + '@graphql-tools/utils': 10.11.0(graphql@16.12.0) graphql: 16.12.0 tslib: 2.8.1 transitivePeerDependencies: @@ -23699,7 +23703,7 @@ snapshots: '@graphql-mesh/types': 0.104.16(graphql@16.12.0)(ioredis@5.8.2) '@graphql-tools/executor': 1.4.13(graphql@16.12.0) '@graphql-tools/executor-common': 1.0.5(graphql@16.12.0) - '@graphql-tools/utils': 10.10.3(graphql@16.12.0) + '@graphql-tools/utils': 10.11.0(graphql@16.12.0) graphql: 16.12.0 tslib: 2.8.1 transitivePeerDependencies: @@ -23718,7 +23722,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: @@ -24074,7 +24078,7 @@ snapshots: '@graphql-tools/delegate@11.1.3(graphql@16.12.0)': dependencies: '@graphql-tools/batch-execute': 10.0.4(graphql@16.12.0) - '@graphql-tools/executor': 1.4.13(graphql@16.12.0) + '@graphql-tools/executor': 1.5.0(graphql@16.12.0) '@graphql-tools/schema': 10.0.29(graphql@16.12.0) '@graphql-tools/utils': 10.11.0(graphql@16.12.0) '@repeaterjs/repeater': 3.0.6 @@ -24086,7 +24090,7 @@ snapshots: '@graphql-tools/delegate@11.1.3(graphql@16.9.0)': dependencies: '@graphql-tools/batch-execute': 10.0.4(graphql@16.9.0) - '@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.29(graphql@16.9.0) '@graphql-tools/utils': 10.11.0(graphql@16.9.0) '@repeaterjs/repeater': 3.0.6 @@ -24098,7 +24102,7 @@ snapshots: '@graphql-tools/delegate@12.0.2(graphql@16.12.0)': dependencies: '@graphql-tools/batch-execute': 10.0.4(graphql@16.12.0) - '@graphql-tools/executor': 1.4.13(graphql@16.12.0) + '@graphql-tools/executor': 1.5.0(graphql@16.12.0) '@graphql-tools/schema': 10.0.29(graphql@16.12.0) '@graphql-tools/utils': 10.11.0(graphql@16.12.0) '@repeaterjs/repeater': 3.0.6 @@ -24110,7 +24114,7 @@ snapshots: '@graphql-tools/delegate@12.0.2(graphql@16.9.0)': dependencies: '@graphql-tools/batch-execute': 10.0.4(graphql@16.9.0) - '@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.29(graphql@16.9.0) '@graphql-tools/utils': 10.11.0(graphql@16.9.0) '@repeaterjs/repeater': 3.0.6 @@ -24434,16 +24438,6 @@ snapshots: graphql: 16.9.0 tslib: 2.8.1 - '@graphql-tools/executor@1.4.7(graphql@16.9.0)': - dependencies: - '@graphql-tools/utils': 10.9.1(graphql@16.9.0) - '@graphql-typed-document-node/core': 3.2.0(graphql@16.9.0) - '@repeaterjs/repeater': 3.0.6 - '@whatwg-node/disposablestack': 0.0.6 - '@whatwg-node/promise-helpers': 1.3.2 - graphql: 16.9.0 - tslib: 2.8.1 - '@graphql-tools/executor@1.4.9(graphql@16.12.0)': dependencies: '@graphql-tools/utils': 10.9.1(graphql@16.12.0) @@ -24487,7 +24481,7 @@ snapshots: '@graphql-tools/federation@4.2.3(@types/node@22.10.5)(graphql@16.12.0)': dependencies: '@graphql-tools/delegate': 11.1.3(graphql@16.12.0) - '@graphql-tools/executor': 1.4.13(graphql@16.12.0) + '@graphql-tools/executor': 1.5.0(graphql@16.12.0) '@graphql-tools/executor-http': 3.0.7(@types/node@22.10.5)(graphql@16.12.0) '@graphql-tools/merge': 9.1.5(graphql@16.12.0) '@graphql-tools/schema': 10.0.29(graphql@16.12.0) @@ -24507,7 +24501,7 @@ snapshots: '@graphql-tools/federation@4.2.3(@types/node@24.10.1)(graphql@16.12.0)': dependencies: '@graphql-tools/delegate': 11.1.3(graphql@16.12.0) - '@graphql-tools/executor': 1.4.13(graphql@16.12.0) + '@graphql-tools/executor': 1.5.0(graphql@16.12.0) '@graphql-tools/executor-http': 3.0.7(@types/node@24.10.1)(graphql@16.12.0) '@graphql-tools/merge': 9.1.5(graphql@16.12.0) '@graphql-tools/schema': 10.0.29(graphql@16.12.0) @@ -24527,7 +24521,7 @@ snapshots: '@graphql-tools/federation@4.2.6(@types/node@25.0.2)(graphql@16.12.0)': dependencies: '@graphql-tools/delegate': 12.0.2(graphql@16.12.0) - '@graphql-tools/executor': 1.4.13(graphql@16.12.0) + '@graphql-tools/executor': 1.5.0(graphql@16.12.0) '@graphql-tools/executor-http': 3.0.7(@types/node@25.0.2)(graphql@16.12.0) '@graphql-tools/merge': 9.1.5(graphql@16.12.0) '@graphql-tools/schema': 10.0.29(graphql@16.12.0) @@ -24547,7 +24541,7 @@ snapshots: '@graphql-tools/federation@4.2.6(@types/node@25.0.2)(graphql@16.9.0)': dependencies: '@graphql-tools/delegate': 12.0.2(graphql@16.9.0) - '@graphql-tools/executor': 1.4.13(graphql@16.9.0) + '@graphql-tools/executor': 1.5.0(graphql@16.9.0) '@graphql-tools/executor-http': 3.0.7(@types/node@25.0.2)(graphql@16.9.0) '@graphql-tools/merge': 9.1.5(graphql@16.9.0) '@graphql-tools/schema': 10.0.29(graphql@16.9.0) @@ -24940,7 +24934,7 @@ snapshots: dependencies: '@graphql-tools/batch-delegate': 10.0.5(graphql@16.12.0) '@graphql-tools/delegate': 11.1.3(graphql@16.12.0) - '@graphql-tools/executor': 1.4.13(graphql@16.12.0) + '@graphql-tools/executor': 1.5.0(graphql@16.12.0) '@graphql-tools/merge': 9.1.5(graphql@16.12.0) '@graphql-tools/schema': 10.0.29(graphql@16.12.0) '@graphql-tools/utils': 10.11.0(graphql@16.12.0) @@ -24953,7 +24947,7 @@ snapshots: dependencies: '@graphql-tools/batch-delegate': 10.0.8(graphql@16.12.0) '@graphql-tools/delegate': 12.0.2(graphql@16.12.0) - '@graphql-tools/executor': 1.4.13(graphql@16.12.0) + '@graphql-tools/executor': 1.5.0(graphql@16.12.0) '@graphql-tools/merge': 9.1.5(graphql@16.12.0) '@graphql-tools/schema': 10.0.29(graphql@16.12.0) '@graphql-tools/utils': 10.11.0(graphql@16.12.0) @@ -24966,7 +24960,7 @@ snapshots: dependencies: '@graphql-tools/batch-delegate': 10.0.8(graphql@16.9.0) '@graphql-tools/delegate': 12.0.2(graphql@16.9.0) - '@graphql-tools/executor': 1.4.13(graphql@16.9.0) + '@graphql-tools/executor': 1.5.0(graphql@16.9.0) '@graphql-tools/merge': 9.1.5(graphql@16.9.0) '@graphql-tools/schema': 10.0.29(graphql@16.9.0) '@graphql-tools/utils': 10.11.0(graphql@16.9.0) @@ -25275,12 +25269,12 @@ snapshots: dependencies: tslib: 2.8.1 - '@graphql-yoga/plugin-apollo-inline-trace@3.16.2(@envelop/core@5.5.1)(graphql-yoga@5.16.2(graphql@16.12.0))(graphql@16.12.0)': + '@graphql-yoga/plugin-apollo-inline-trace@3.16.2(@envelop/core@5.5.1)(graphql-yoga@5.17.1(graphql@16.12.0))(graphql@16.12.0)': dependencies: '@apollo/usage-reporting-protobuf': 4.1.1 '@envelop/on-resolve': 7.0.0(@envelop/core@5.5.1)(graphql@16.12.0) graphql: 16.12.0 - graphql-yoga: 5.16.2(graphql@16.12.0) + graphql-yoga: 5.17.1(graphql@16.12.0) tslib: 2.8.1 transitivePeerDependencies: - '@envelop/core' @@ -25305,16 +25299,16 @@ snapshots: transitivePeerDependencies: - '@envelop/core' - '@graphql-yoga/plugin-apollo-usage-report@0.11.2(@envelop/core@5.5.1)(graphql-yoga@5.16.2(graphql@16.12.0))(graphql@16.12.0)': + '@graphql-yoga/plugin-apollo-usage-report@0.11.2(@envelop/core@5.5.1)(graphql-yoga@5.17.1(graphql@16.12.0))(graphql@16.12.0)': dependencies: '@apollo/server-gateway-interface': 2.0.0(graphql@16.12.0) '@apollo/usage-reporting-protobuf': 4.1.1 '@apollo/utils.usagereporting': 2.1.0(graphql@16.12.0) '@graphql-tools/utils': 10.9.1(graphql@16.12.0) - '@graphql-yoga/plugin-apollo-inline-trace': 3.16.2(@envelop/core@5.5.1)(graphql-yoga@5.16.2(graphql@16.12.0))(graphql@16.12.0) + '@graphql-yoga/plugin-apollo-inline-trace': 3.16.2(@envelop/core@5.5.1)(graphql-yoga@5.17.1(graphql@16.12.0))(graphql@16.12.0) '@whatwg-node/promise-helpers': 1.3.2 graphql: 16.12.0 - graphql-yoga: 5.16.2(graphql@16.12.0) + graphql-yoga: 5.17.1(graphql@16.12.0) tslib: 2.8.1 transitivePeerDependencies: - '@envelop/core' @@ -25347,10 +25341,6 @@ snapshots: transitivePeerDependencies: - '@envelop/core' - '@graphql-yoga/plugin-csrf-prevention@3.16.2(graphql-yoga@5.16.2(graphql@16.12.0))': - dependencies: - graphql-yoga: 5.16.2(graphql@16.12.0) - '@graphql-yoga/plugin-csrf-prevention@3.16.2(graphql-yoga@5.17.1(graphql@16.12.0))': dependencies: graphql-yoga: 5.17.1(graphql@16.12.0) @@ -25359,12 +25349,6 @@ snapshots: dependencies: graphql-yoga: 5.17.1(graphql@16.9.0) - '@graphql-yoga/plugin-defer-stream@3.16.2(graphql-yoga@5.16.2(graphql@16.12.0))(graphql@16.12.0)': - dependencies: - '@graphql-tools/utils': 10.9.1(graphql@16.12.0) - graphql: 16.12.0 - graphql-yoga: 5.16.2(graphql@16.12.0) - '@graphql-yoga/plugin-defer-stream@3.16.2(graphql-yoga@5.17.1(graphql@16.12.0))(graphql@16.12.0)': dependencies: '@graphql-tools/utils': 10.9.1(graphql@16.12.0) @@ -25406,12 +25390,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@graphql-yoga/plugin-persisted-operations@3.16.2(graphql-yoga@5.16.2(graphql@16.12.0))(graphql@16.12.0)': - dependencies: - '@whatwg-node/promise-helpers': 1.3.2 - graphql: 16.12.0 - graphql-yoga: 5.16.2(graphql@16.12.0) - '@graphql-yoga/plugin-persisted-operations@3.16.2(graphql-yoga@5.17.1(graphql@16.12.0))(graphql@16.12.0)': dependencies: '@whatwg-node/promise-helpers': 1.3.2 @@ -25447,21 +25425,21 @@ snapshots: graphql: 16.9.0 graphql-yoga: 5.13.3(graphql@16.9.0) - '@graphql-yoga/plugin-response-cache@3.15.4(graphql-yoga@5.16.2(graphql@16.12.0))(graphql@16.12.0)': + '@graphql-yoga/plugin-response-cache@3.15.4(graphql-yoga@5.17.1(graphql@16.12.0))(graphql@16.12.0)': dependencies: '@envelop/core': 5.5.1 '@envelop/response-cache': 7.1.3(@envelop/core@5.5.1)(graphql@16.12.0) '@whatwg-node/promise-helpers': 1.3.0 graphql: 16.12.0 - graphql-yoga: 5.16.2(graphql@16.12.0) + graphql-yoga: 5.17.1(graphql@16.12.0) - '@graphql-yoga/plugin-response-cache@3.15.4(graphql-yoga@5.16.2(graphql@16.9.0))(graphql@16.9.0)': + '@graphql-yoga/plugin-response-cache@3.15.4(graphql-yoga@5.17.1(graphql@16.9.0))(graphql@16.9.0)': dependencies: '@envelop/core': 5.5.1 '@envelop/response-cache': 7.1.3(@envelop/core@5.5.1)(graphql@16.9.0) '@whatwg-node/promise-helpers': 1.3.0 graphql: 16.9.0 - graphql-yoga: 5.16.2(graphql@16.9.0) + graphql-yoga: 5.17.1(graphql@16.9.0) '@graphql-yoga/plugin-response-cache@3.9.0(@envelop/core@5.5.1)(graphql-yoga@5.13.3(graphql@16.9.0))(graphql@16.9.0)': dependencies: @@ -25474,20 +25452,13 @@ snapshots: '@graphql-yoga/redis-event-target@3.0.3(ioredis@5.8.2)': dependencies: '@graphql-yoga/typed-event-target': 3.0.2 - '@whatwg-node/events': 0.1.1 + '@whatwg-node/events': 0.1.2 ioredis: 5.8.2 '@graphql-yoga/render-graphiql@5.16.2(graphql-yoga@5.16.2(graphql@16.12.0))': dependencies: graphql-yoga: 5.16.2(graphql@16.12.0) - '@graphql-yoga/subscription@5.0.4': - dependencies: - '@graphql-yoga/typed-event-target': 3.0.2 - '@repeaterjs/repeater': 3.0.6 - '@whatwg-node/events': 0.1.1 - tslib: 2.8.1 - '@graphql-yoga/subscription@5.0.5': dependencies: '@graphql-yoga/typed-event-target': 3.0.2 @@ -31985,14 +31956,6 @@ snapshots: '@whatwg-node/promise-helpers': 1.3.2 tslib: 2.8.1 - '@whatwg-node/server@0.10.3': - dependencies: - '@envelop/instrumentation': 1.0.0 - '@whatwg-node/disposablestack': 0.0.6 - '@whatwg-node/fetch': 0.10.13 - '@whatwg-node/promise-helpers': 1.3.2 - tslib: 2.8.1 - '@whatwg-node/server@0.9.65': dependencies: '@whatwg-node/disposablestack': 0.0.5 @@ -35598,14 +35561,14 @@ snapshots: dependencies: '@envelop/core': 5.5.1 '@envelop/instrumentation': 1.0.0 - '@graphql-tools/executor': 1.4.7(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 - '@graphql-yoga/subscription': 5.0.4 + '@graphql-yoga/subscription': 5.0.5 '@whatwg-node/fetch': 0.10.13 - '@whatwg-node/promise-helpers': 1.3.0 - '@whatwg-node/server': 0.10.3 + '@whatwg-node/promise-helpers': 1.3.2 + '@whatwg-node/server': 0.10.17 dset: 3.1.4 graphql: 16.9.0 lru-cache: 10.2.0 @@ -35627,22 +35590,6 @@ snapshots: lru-cache: 10.2.0 tslib: 2.8.1 - graphql-yoga@5.16.2(graphql@16.9.0): - dependencies: - '@envelop/core': 5.5.1 - '@envelop/instrumentation': 1.0.0 - '@graphql-tools/executor': 1.4.9(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 - '@graphql-yoga/subscription': 5.0.5 - '@whatwg-node/fetch': 0.10.13 - '@whatwg-node/promise-helpers': 1.3.1 - '@whatwg-node/server': 0.10.17 - graphql: 16.9.0 - lru-cache: 10.2.0 - tslib: 2.8.1 - graphql-yoga@5.17.1(graphql@16.12.0): dependencies: '@envelop/core': 5.5.1 From e259a34889b56a76f83a6624c51a38da3fdfce0a Mon Sep 17 00:00:00 2001 From: jdolle <1841898+jdolle@users.noreply.github.com> Date: Mon, 23 Feb 2026 22:28:03 -0800 Subject: [PATCH 03/29] revert log change --- .../modules/proposals/providers/schema-proposal-storage.ts | 6 +----- .../api/src/modules/schema/providers/models/composite.ts | 4 ++-- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/services/api/src/modules/proposals/providers/schema-proposal-storage.ts b/packages/services/api/src/modules/proposals/providers/schema-proposal-storage.ts index 2fcd0e0d9bb..31b81e43ea3 100644 --- a/packages/services/api/src/modules/proposals/providers/schema-proposal-storage.ts +++ b/packages/services/api/src/modules/proposals/providers/schema-proposal-storage.ts @@ -84,14 +84,10 @@ export class SchemaProposalStorage { }; native: boolean; }) { - // @todo inject the graphile worker util instead of making it here? const tools: WorkerUtils = await makeWorkerUtils({ pgPool: this.pool.pool, - // @todo - logger: bridgeGraphileLogger(this.logger as any), // as GraphQLHiveLogger), + logger: bridgeGraphileLogger(this.logger), }); - - // SchemaProposalCompositionTask await tools.addJob('schemaProposalComposition', { input }); } 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 ed1dda27137..4a7d9bd9bc9 100644 --- a/packages/services/api/src/modules/schema/providers/models/composite.ts +++ b/packages/services/api/src/modules/schema/providers/models/composite.ts @@ -250,8 +250,8 @@ export class CompositeModel { modifiedSdl: incoming.sdl, }), ]); - this.logger.debug('diff check status: %o', diffCheck); - this.logger.debug('policy check status: %o', policyCheck); + this.logger.info('diff check status: %o', diffCheck); + this.logger.info('policy check status: %o', policyCheck); if ( compositionCheck.status === 'failed' || From 0eb9cddf19d5ee494f200d1d718d5d4adcec5a0e Mon Sep 17 00:00:00 2001 From: jdolle <1841898+jdolle@users.noreply.github.com> Date: Mon, 23 Feb 2026 22:30:12 -0800 Subject: [PATCH 04/29] note --- .../api/src/modules/schema/providers/schema-publisher.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 cff59fbbd63..de9362a0d89 100644 --- a/packages/services/api/src/modules/schema/providers/schema-publisher.ts +++ b/packages/services/api/src/modules/schema/providers/schema-publisher.ts @@ -729,7 +729,7 @@ export class SchemaPublisher { const expiresAt = retention ? new Date(Date.now() + retention * millisecondsPerDay) : null; if (input.schemaProposalId) { - // @todo + // @todo use saved composition settings await this.schemaProposals.runBackgroundComposition({ externalComposition: { enabled: false, From ffeef08de0c47864c8004f5fe519ccf2da93f119 Mon Sep 17 00:00:00 2001 From: jdolle <1841898+jdolle@users.noreply.github.com> Date: Mon, 23 Feb 2026 22:31:07 -0800 Subject: [PATCH 05/29] Remove unused function --- .../services/workflows/src/lib/schema/provider.ts | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/packages/services/workflows/src/lib/schema/provider.ts b/packages/services/workflows/src/lib/schema/provider.ts index b0f90a313b8..c96e3b12ede 100644 --- a/packages/services/workflows/src/lib/schema/provider.ts +++ b/packages/services/workflows/src/lib/schema/provider.ts @@ -53,21 +53,6 @@ function createExternalConfig(config: Project['externalComposition']) { export type SchemaProvider = ReturnType; -function toUpperSnakeCase(str: string) { - // Use a regular expression to find uppercase letters and insert underscores - // The 'g' flag ensures all occurrences are replaced. - // The 'replace' function uses a callback to add an underscore before the matched uppercase letter. - const snakeCaseString = str.replace(/([A-Z])/g, (match, p1, offset) => { - // If it's the first character, don't add an underscore - if (offset === 0) { - return p1; - } - return `_${p1}`; - }); - - return snakeCaseString.toUpperCase(); -} - export function convertProjectType(t: ProjectType) { return ( { From 49d1a2c66cf3ad22c423e601df20e28f518f3cf8 Mon Sep 17 00:00:00 2001 From: jdolle <1841898+jdolle@users.noreply.github.com> Date: Mon, 23 Feb 2026 22:32:45 -0800 Subject: [PATCH 06/29] Remove log --- packages/web/app/src/lib/proposals/utils.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/web/app/src/lib/proposals/utils.ts b/packages/web/app/src/lib/proposals/utils.ts index 6a9ecd0d18f..1527036c32f 100644 --- a/packages/web/app/src/lib/proposals/utils.ts +++ b/packages/web/app/src/lib/proposals/utils.ts @@ -38,7 +38,6 @@ export function addTypeForExtensions(ast: DocumentNode) { const name = node.name.value; const entry = trackTypeDefs.get(name); if (isTypeExtensionNode(node)) { - console.log(node.kind); if (!entry) { trackTypeDefs.set(name, { state: 'EXTENSION_ONLY', kind: node.kind }); } else if (entry.state === 'TYPE_ONLY') { From 406062cfd97be500a21b2e1d6f546ef028794d7a Mon Sep 17 00:00:00 2001 From: jdolle <1841898+jdolle@users.noreply.github.com> Date: Tue, 24 Feb 2026 10:26:48 -0800 Subject: [PATCH 07/29] Add limits to patch fetching; check targetId --- .../services/workflows/src/lib/schema/provider.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/services/workflows/src/lib/schema/provider.ts b/packages/services/workflows/src/lib/schema/provider.ts index c96e3b12ede..37e1dc11f57 100644 --- a/packages/services/workflows/src/lib/schema/provider.ts +++ b/packages/services/workflows/src/lib/schema/provider.ts @@ -29,6 +29,7 @@ const SchemaProposalChangesModel = z.object({ serviceName: z.string().optional(), serviceUrl: z.string().optional(), schemaProposalChanges: z.array(HiveSchemaChangeModel).default([]), + createdAt: z.string(), }); function createExternalConfig(config: Project['externalComposition']) { @@ -233,7 +234,8 @@ export function schemaProvider(providerConfig: SchemaProviderConfig) { cursor = decodeCreatedAtAndUUIDIdBasedCursor(args.cursor); } - // fetch all latest schemas + // fetch all latest schemas. Support up to 2_000 subgraphs. + const maxLoops = 100; const services = await this.latestComposableSchemas({ targetId: args.targetId, pool: args.pool, @@ -241,6 +243,7 @@ export function schemaProvider(providerConfig: SchemaProviderConfig) { let nextCursor = cursor; // collect changes in paginated requests to avoid stalling the db + let i = 0; do { const result = await args.pool.query(sql` SELECT @@ -248,6 +251,7 @@ export function schemaProvider(providerConfig: SchemaProviderConfig) { , c."service_name" as "serviceName" , c."service_url" as "serviceUrl" , c."schema_proposal_changes" as "schemaProposalChanges" + , c.created_at as "createdAt" FROM "schema_checks" as c INNER JOIN ( @@ -273,7 +277,8 @@ export function schemaProvider(providerConfig: SchemaProviderConfig) { AND COALESCE(c."service_name", '') = cc."service" AND c."created_at" = cc."maxdate" WHERE - c."schema_proposal_id" = ${args.proposalId} + c."target_id" = ${args.targetId} + AND c."schema_proposal_id" = ${args.proposalId} ${ cursor ? sql` @@ -313,7 +318,7 @@ export function schemaProvider(providerConfig: SchemaProviderConfig) { if (changes.length === 20) { nextCursor = { // Keep the created at because we want the same set of checks when joining on the "latest". - createdAt: nextCursor?.createdAt ?? now, + createdAt: nextCursor?.createdAt ?? changes[0]?.createdAt ?? now, id: changes[changes.length - 1].id, }; } else { @@ -332,7 +337,7 @@ export function schemaProvider(providerConfig: SchemaProviderConfig) { } } } - } while (nextCursor); + } while (nextCursor && ++i < maxLoops); return services; }, From d841a41187f8faf34d625117954d8017db91404b Mon Sep 17 00:00:00 2001 From: jdolle <1841898+jdolle@users.noreply.github.com> Date: Tue, 24 Feb 2026 10:38:14 -0800 Subject: [PATCH 08/29] Linting errors --- packages/services/api/package.json | 1 + packages/services/workflows/package.json | 1 + packages/services/workflows/src/lib/schema/provider.ts | 4 ++-- pnpm-lock.yaml | 6 ++++++ 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/services/api/package.json b/packages/services/api/package.json index d2b4eee5e67..77166d2615c 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -50,6 +50,7 @@ "date-fns": "4.1.0", "fast-json-stable-stringify": "2.1.0", "got": "14.4.7", + "graphile-worker": "0.16.6", "graphql": "16.9.0", "graphql-modules": "3.1.1", "graphql-parse-resolve-info": "4.13.0", diff --git a/packages/services/workflows/package.json b/packages/services/workflows/package.json index 3485a4032ba..9070acb9956 100644 --- a/packages/services/workflows/package.json +++ b/packages/services/workflows/package.json @@ -10,6 +10,7 @@ }, "devDependencies": { "@graphql-hive/logger": "1.0.9", + "@graphql-inspector/core": "7.1.2", "@graphql-inspector/patch": "0.1.2", "@graphql-yoga/redis-event-target": "3.0.3", "@hive/api": "workspace:*", diff --git a/packages/services/workflows/src/lib/schema/provider.ts b/packages/services/workflows/src/lib/schema/provider.ts index 37e1dc11f57..449656e5193 100644 --- a/packages/services/workflows/src/lib/schema/provider.ts +++ b/packages/services/workflows/src/lib/schema/provider.ts @@ -2,7 +2,7 @@ import { parse, print } from 'graphql'; import { DatabasePool, sql } from 'slonik'; import { z } from 'zod'; import type { Logger } from '@graphql-hive/logger'; -import { Change } from '@graphql-inspector/core'; +import type { Change } from '@graphql-inspector/core'; import { errors, patch } from '@graphql-inspector/patch'; import { Project, SchemaObject } from '@hive/api'; import { ComposeAndValidateResult, ProjectType } from '@hive/api/shared/entities'; @@ -169,7 +169,7 @@ export function schemaProvider(providerConfig: SchemaProviderConfig) { }) { const { pool, ...state } = args; await pool.query( - sql`/* updateSchemaProposalComposition */ UPDATE schema_proposals SET composition_status = ${args.status}, composition_timestamp = ${args.timestamp} WHERE id=${args.proposalId}`, + sql`/* updateSchemaProposalComposition */ UPDATE schema_proposals SET composition_status = ${state.status}, composition_timestamp = ${state.timestamp} WHERE id=${state.proposalId}`, ); }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 54a21bb71a2..5f9f300d501 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -854,6 +854,9 @@ importers: got: specifier: 14.4.7 version: 14.4.7(patch_hash=f7660444905ddadee251ff98241119fb54f5fec1e673a428192da361d5636299) + graphile-worker: + specifier: 0.16.6 + version: 0.16.6(typescript@5.7.3) graphql: specifier: 16.9.0 version: 16.9.0 @@ -1636,6 +1639,9 @@ importers: '@graphql-hive/logger': specifier: 1.0.9 version: 1.0.9(pino@10.3.0) + '@graphql-inspector/core': + specifier: 7.1.2 + version: 7.1.2(graphql@16.9.0) '@graphql-inspector/patch': specifier: 0.1.2 version: 0.1.2(graphql@16.9.0) From f8cafbb77cd29712e25ee135fae66ac0ba82fe0a Mon Sep 17 00:00:00 2001 From: jdolle <1841898+jdolle@users.noreply.github.com> Date: Tue, 24 Feb 2026 11:15:43 -0800 Subject: [PATCH 09/29] Add composition reason; fix timestamp format --- .../2026.02.24T00-00-00.proposal-composition.ts | 1 + .../services/workflows/src/lib/schema/provider.ts | 11 +++++++++-- .../src/tasks/schema-proposal-composition.ts | 3 ++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/packages/migrations/src/actions/2026.02.24T00-00-00.proposal-composition.ts b/packages/migrations/src/actions/2026.02.24T00-00-00.proposal-composition.ts index 0cb16308019..c0d83243b62 100644 --- a/packages/migrations/src/actions/2026.02.24T00-00-00.proposal-composition.ts +++ b/packages/migrations/src/actions/2026.02.24T00-00-00.proposal-composition.ts @@ -9,6 +9,7 @@ export default { ALTER TABLE IF EXISTS "schema_proposals" ADD COLUMN IF NOT EXISTS "composition_status" TEXT , ADD COLUMN IF NOT EXISTS "composition_timestamp" TIMESTAMPTZ + , ADD COLUMN IF NOT EXISTS "composition_status_reason" TEXT ; `, }, diff --git a/packages/services/workflows/src/lib/schema/provider.ts b/packages/services/workflows/src/lib/schema/provider.ts index 449656e5193..afa9cb88ca4 100644 --- a/packages/services/workflows/src/lib/schema/provider.ts +++ b/packages/services/workflows/src/lib/schema/provider.ts @@ -164,12 +164,19 @@ export function schemaProvider(providerConfig: SchemaProviderConfig) { async updateSchemaProposalComposition(args: { proposalId: string; timestamp: string; + reason: string | null; status: 'error' | 'success' | 'fail'; pool: DatabasePool; }) { const { pool, ...state } = args; await pool.query( - sql`/* updateSchemaProposalComposition */ UPDATE schema_proposals SET composition_status = ${state.status}, composition_timestamp = ${state.timestamp} WHERE id=${state.proposalId}`, + sql`/* updateSchemaProposalComposition */ + UPDATE schema_proposals + SET + composition_status = ${state.status} + , composition_timestamp = ${state.timestamp} + , composition_status_reason = ${state.reason} + WHERE id=${state.proposalId}`, ); }, @@ -251,7 +258,7 @@ export function schemaProvider(providerConfig: SchemaProviderConfig) { , c."service_name" as "serviceName" , c."service_url" as "serviceUrl" , c."schema_proposal_changes" as "schemaProposalChanges" - , c.created_at as "createdAt" + , to_json(c."created_at") as "createdAt" FROM "schema_checks" as c INNER JOIN ( diff --git a/packages/services/workflows/src/tasks/schema-proposal-composition.ts b/packages/services/workflows/src/tasks/schema-proposal-composition.ts index d48abf76e90..ce967162b9b 100644 --- a/packages/services/workflows/src/tasks/schema-proposal-composition.ts +++ b/packages/services/workflows/src/tasks/schema-proposal-composition.ts @@ -67,9 +67,10 @@ export const task = implementTask(SchemaProposalCompositionTask, async args => { }, ); - const payload: { timestamp: string; status: 'error' | 'success' } = { + const payload: { timestamp: string; status: 'error' | 'success'; reason: string | null } = { timestamp: new Date().toISOString(), status: result.errors.length ? 'error' : 'success', + reason: result.errors.length ? result.errors.map(e => e.message).join('\n') : null, }; await args.context.schema.updateSchemaProposalComposition({ ...payload, From e42665bfe56cfa27a5d17b9c2c1fc0227c3bf2f0 Mon Sep 17 00:00:00 2001 From: jdolle <1841898+jdolle@users.noreply.github.com> Date: Tue, 24 Feb 2026 13:21:51 -0800 Subject: [PATCH 10/29] Remove @hive/api from workflows' dependencies --- packages/libraries/pubsub/LICENSE | 21 +++ packages/libraries/pubsub/package.json | 63 ++++++++ packages/libraries/pubsub/src/index.ts | 15 ++ packages/libraries/pubsub/src/pub-sub.ts | 9 ++ packages/libraries/pubsub/src/version.ts | 1 + packages/libraries/pubsub/tsconfig.json | 15 ++ packages/services/api/package.json | 1 + .../src/modules/shared/providers/pub-sub.ts | 11 +- packages/services/workflows/package.json | 3 +- packages/services/workflows/src/context.ts | 6 +- packages/services/workflows/src/index.ts | 4 +- .../workflows/src/lib/schema/provider.ts | 60 +++++-- packages/services/workflows/src/redis.ts | 54 +++++++ .../src/tasks/schema-proposal-composition.ts | 5 +- pnpm-lock.yaml | 151 ++++++++---------- tsconfig.json | 3 +- 16 files changed, 306 insertions(+), 116 deletions(-) create mode 100644 packages/libraries/pubsub/LICENSE create mode 100644 packages/libraries/pubsub/package.json create mode 100644 packages/libraries/pubsub/src/index.ts create mode 100644 packages/libraries/pubsub/src/pub-sub.ts create mode 100644 packages/libraries/pubsub/src/version.ts create mode 100644 packages/libraries/pubsub/tsconfig.json create mode 100644 packages/services/workflows/src/redis.ts diff --git a/packages/libraries/pubsub/LICENSE b/packages/libraries/pubsub/LICENSE new file mode 100644 index 00000000000..1cf5b9c7d23 --- /dev/null +++ b/packages/libraries/pubsub/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 The Guild + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/libraries/pubsub/package.json b/packages/libraries/pubsub/package.json new file mode 100644 index 00000000000..0a84153c07b --- /dev/null +++ b/packages/libraries/pubsub/package.json @@ -0,0 +1,63 @@ +{ + "name": "@graphql-hive/pubsub", + "version": "0.0.1", + "type": "module", + "repository": { + "type": "git", + "url": "graphql-hive/console", + "directory": "packages/libraries/pubsub" + }, + "homepage": "https://the-guild.dev/graphql/hive", + "author": { + "email": "contact@the-guild.dev", + "name": "The Guild", + "url": "https://the-guild.dev" + }, + "license": "MIT", + "private": true, + "engines": { + "node": ">=16.0.0" + }, + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "exports": { + ".": { + "require": { + "types": "./dist/typings/index.d.cts", + "default": "./dist/cjs/index.js" + }, + "import": { + "types": "./dist/typings/index.d.ts", + "default": "./dist/esm/index.js" + }, + "default": { + "types": "./dist/typings/index.d.ts", + "default": "./dist/esm/index.js" + } + }, + "./package.json": "./package.json" + }, + "typings": "dist/typings/index.d.ts", + "scripts": { + "build": "node ../../../scripts/generate-version.mjs && bob build", + "check:build": "bob check", + "typecheck": "tsc --noEmit" + }, + "peerDependencies": { + "ioredis": "^5.0.0" + }, + "dependencies": { + "@graphql-hive/logger": "^1.0.9", + "@graphql-yoga/redis-event-target": "3.0.3", + "@whatwg-node/fetch": "^0.10.13", + "graphql-yoga": "5.13.3" + }, + "devDependencies": { + "tslib": "2.8.1", + "vitest": "4.0.9" + }, + "sideEffects": false, + "typescript": { + "definition": "dist/typings/index.d.ts" + } +} diff --git a/packages/libraries/pubsub/src/index.ts b/packages/libraries/pubsub/src/index.ts new file mode 100644 index 00000000000..984301b94b5 --- /dev/null +++ b/packages/libraries/pubsub/src/index.ts @@ -0,0 +1,15 @@ +import { createPubSub } from 'graphql-yoga'; +import { Redis } from 'ioredis'; +import { createRedisEventTarget } from '@graphql-yoga/redis-event-target'; +import { HivePubSub } from './pub-sub'; + +export { HivePubSub } from './pub-sub'; + +export function createHivePubSub(args: { publisher: Redis; subscriber: Redis }) { + return createPubSub({ + eventTarget: createRedisEventTarget({ + publishClient: args.publisher, + subscribeClient: args.subscriber, + }), + }) as HivePubSub; +} diff --git a/packages/libraries/pubsub/src/pub-sub.ts b/packages/libraries/pubsub/src/pub-sub.ts new file mode 100644 index 00000000000..25446809f62 --- /dev/null +++ b/packages/libraries/pubsub/src/pub-sub.ts @@ -0,0 +1,9 @@ +import type { PubSub } from 'graphql-yoga'; + +export type HivePubSub = PubSub<{ + oidcIntegrationLogs: [oidcIntegrationId: string, payload: { timestamp: string; message: string }]; + schemaProposalComposition: [ + proposalId: string, + payload: { timestamp: string; status: 'success' | 'fail' | 'error' }, + ]; +}>; diff --git a/packages/libraries/pubsub/src/version.ts b/packages/libraries/pubsub/src/version.ts new file mode 100644 index 00000000000..266e19f220a --- /dev/null +++ b/packages/libraries/pubsub/src/version.ts @@ -0,0 +1 @@ +export const version = '0.0.1'; diff --git a/packages/libraries/pubsub/tsconfig.json b/packages/libraries/pubsub/tsconfig.json new file mode 100644 index 00000000000..31d8323b929 --- /dev/null +++ b/packages/libraries/pubsub/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../../../tsconfig.json", + "include": ["src"], + "compilerOptions": { + "types": ["node"], + "baseUrl": ".", + "outDir": "dist", + "rootDir": "src", + "target": "es2017", + "module": "esnext", + "skipLibCheck": true, + "declaration": true, + "declarationMap": true + } +} diff --git a/packages/services/api/package.json b/packages/services/api/package.json index 8efe30a6876..042cc638c93 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -21,6 +21,7 @@ "@bentocache/plugin-prometheus": "0.2.0", "@date-fns/utc": "2.1.1", "@graphql-hive/core": "workspace:*", + "@graphql-hive/pubsub": "workspace:*", "@graphql-hive/signal": "1.0.0", "@graphql-inspector/core": "7.1.2", "@graphql-tools/merge": "9.1.1", diff --git a/packages/services/api/src/modules/shared/providers/pub-sub.ts b/packages/services/api/src/modules/shared/providers/pub-sub.ts index 9d7a43890b0..4a9c087a989 100644 --- a/packages/services/api/src/modules/shared/providers/pub-sub.ts +++ b/packages/services/api/src/modules/shared/providers/pub-sub.ts @@ -1,12 +1,5 @@ import { InjectionToken } from 'graphql-modules'; -import type { PubSub } from 'graphql-yoga'; - -export type HivePubSub = PubSub<{ - oidcIntegrationLogs: [oidcIntegrationId: string, payload: { timestamp: string; message: string }]; - schemaProposalComposition: [ - proposalId: string, - payload: { timestamp: string; status: 'success' | 'fail' | 'error' }, - ]; -}>; +import { HivePubSub } from '@graphql-hive/pubsub'; export const PUB_SUB_CONFIG = new InjectionToken('PUB_SUB'); +export { HivePubSub }; diff --git a/packages/services/workflows/package.json b/packages/services/workflows/package.json index 9070acb9956..8bae9d9af7a 100644 --- a/packages/services/workflows/package.json +++ b/packages/services/workflows/package.json @@ -10,10 +10,10 @@ }, "devDependencies": { "@graphql-hive/logger": "1.0.9", + "@graphql-hive/pubsub": "workspace:*", "@graphql-inspector/core": "7.1.2", "@graphql-inspector/patch": "0.1.2", "@graphql-yoga/redis-event-target": "3.0.3", - "@hive/api": "workspace:*", "@hive/service-common": "workspace:*", "@hive/storage": "workspace:*", "@sentry/node": "7.120.2", @@ -26,6 +26,7 @@ "graphile-worker": "0.16.6", "graphql": "16.9.0", "graphql-yoga": "5.13.3", + "ioredis": "5.8.2", "mjml": "4.14.0", "nodemailer": "7.0.11", "sendmail": "1.6.1", diff --git a/packages/services/workflows/src/context.ts b/packages/services/workflows/src/context.ts index fc123931992..9fde02ee615 100644 --- a/packages/services/workflows/src/context.ts +++ b/packages/services/workflows/src/context.ts @@ -1,9 +1,9 @@ import type { DatabasePool } from 'slonik'; import type { Logger } from '@graphql-hive/logger'; -import type { HivePubSub } from '@hive/api/modules/shared/providers/pub-sub.js'; +import type { HivePubSub } from '@graphql-hive/pubsub'; import type { EmailProvider } from './lib/emails/providers.js'; -import { SchemaProvider } from './lib/schema/provider.js'; -import { RequestBroker } from './lib/webhooks/send-webhook.js'; +import type { SchemaProvider } from './lib/schema/provider.js'; +import type { RequestBroker } from './lib/webhooks/send-webhook.js'; export type Context = { logger: Logger; diff --git a/packages/services/workflows/src/index.ts b/packages/services/workflows/src/index.ts index ee3ea1e8825..dde0cb913c3 100644 --- a/packages/services/workflows/src/index.ts +++ b/packages/services/workflows/src/index.ts @@ -2,9 +2,8 @@ import { run } from 'graphile-worker'; import { createPubSub } from 'graphql-yoga'; import { createPool } from 'slonik'; import { Logger } from '@graphql-hive/logger'; +import type { HivePubSub } from '@graphql-hive/pubsub'; import { createRedisEventTarget } from '@graphql-yoga/redis-event-target'; -import { HivePubSub } from '@hive/api/modules/shared/providers/pub-sub'; -import { createRedisClient } from '@hive/api/modules/shared/providers/redis'; import { createServer, registerShutdown, @@ -18,6 +17,7 @@ import { env } from './environment.js'; import { createEmailProvider } from './lib/emails/providers.js'; import { schemaProvider } from './lib/schema/provider.js'; import { bridgeFastifyLogger, bridgeGraphileLogger } from './logger.js'; +import { createRedisClient } from './redis'; import { createTaskEventEmitter } from './task-events.js'; if (env.sentry) { diff --git a/packages/services/workflows/src/lib/schema/provider.ts b/packages/services/workflows/src/lib/schema/provider.ts index afa9cb88ca4..b1864e6dc4b 100644 --- a/packages/services/workflows/src/lib/schema/provider.ts +++ b/packages/services/workflows/src/lib/schema/provider.ts @@ -1,11 +1,11 @@ -import { parse, print } from 'graphql'; +import { DocumentNode, GraphQLError, parse, print, SourceLocation } from 'graphql'; import { DatabasePool, sql } from 'slonik'; import { z } from 'zod'; import type { Logger } from '@graphql-hive/logger'; import type { Change } from '@graphql-inspector/core'; import { errors, patch } from '@graphql-inspector/patch'; -import { Project, SchemaObject } from '@hive/api'; -import { ComposeAndValidateResult, ProjectType } from '@hive/api/shared/entities'; +import type { Project, SchemaObject } from '@hive/api'; +import type { ComposeAndValidateResult } from '@hive/api/shared/entities'; import type { ContractsInputType, SchemaBuilderApi } from '@hive/schema'; import { decodeCreatedAtAndUUIDIdBasedCursor, HiveSchemaChangeModel } from '@hive/storage'; import { createTRPCProxyClient, httpLink } from '@trpc/client'; @@ -52,16 +52,58 @@ function createExternalConfig(config: Project['externalComposition']) { return null; } +export class GraphQLDocumentStringInvalidError extends Error { + constructor(message: string, location?: SourceLocation) { + const locationString = location ? ` at line ${location.line}, column ${location.column}` : ''; + super(`The provided SDL is not valid${locationString}\n: ${message}`); + } +} + +export type CreateSchemaObjectInput = { + sdl: string; + serviceName?: string | null; + serviceUrl?: string | null; +}; + +export const emptySource = '*'; + +export function createSchemaObject(schema: CreateSchemaObjectInput): SchemaObject { + let document: DocumentNode; + + try { + document = parse(schema.sdl, { + noLocation: true, + }); + } catch (err) { + if (err instanceof GraphQLError) { + throw new GraphQLDocumentStringInvalidError(err.message, err.locations?.[0]); + } + throw err; + } + + return { + document, + raw: schema.sdl, + source: schema.serviceName ?? emptySource, + url: schema.serviceUrl ?? null, + }; +} + export type SchemaProvider = ReturnType; -export function convertProjectType(t: ProjectType) { - return ( +export function convertProjectType(t: string) { + const result = ( { - [ProjectType.FEDERATION]: 'federation', - [ProjectType.SINGLE]: 'single', - [ProjectType.STITCHING]: 'stitching', + ['FEDERATION']: 'federation', + ['SINGLE']: 'single', + ['STITCHING']: 'stitching', } as const )[t]; + + if (!result) { + throw new Error('Invalid project type.'); + } + return result; } export function schemaProvider(providerConfig: SchemaProviderConfig) { @@ -82,7 +124,7 @@ export function schemaProvider(providerConfig: SchemaProviderConfig) { * - In case the incoming request is canceled, the call to the schema service is aborted */ async composeAndValidate( - projectType: ProjectType, + projectType: string, schemas: SchemaObject[], config: { /** Whether external composition should be used (only Federation) */ diff --git a/packages/services/workflows/src/redis.ts b/packages/services/workflows/src/redis.ts new file mode 100644 index 00000000000..b989d55547e --- /dev/null +++ b/packages/services/workflows/src/redis.ts @@ -0,0 +1,54 @@ +/** + * Nearly identical to @hive/api's redis definition. + * This is duplicated in case there are additional requirements for workflows. + **/ +import type { Redis as RedisInstance, RedisOptions } from 'ioredis'; +import Redis from 'ioredis'; +import { Logger } from '@graphql-hive/logger'; + +export type { RedisInstance as Redis }; + +export type RedisConfig = Required> & { + tlsEnabled: boolean; +}; + +export function createRedisClient(label: string, config: RedisConfig, logger: Logger) { + const redis = new Redis({ + host: config.host, + port: config.port, + password: config.password, + retryStrategy(times) { + return Math.min(times * 500, 2000); + }, + reconnectOnError(error) { + logger.warn('Redis reconnectOnError (error=%s)', error); + return 1; + }, + db: 0, + maxRetriesPerRequest: null, + enableReadyCheck: false, + tls: config.tlsEnabled ? {} : undefined, + }); + + redis.on('error', err => { + logger.error('Redis connection error (error=%s,label=%s)', err, label); + }); + + redis.on('connect', () => { + logger.debug('Redis connection established (label=%s)', label); + }); + + redis.on('ready', () => { + logger.info('Redis connection ready (label=%s)', label); + }); + + redis.on('close', () => { + logger.info('Redis connection closed (label=%s)', label); + }); + + redis.on('reconnecting', (timeToReconnect?: number) => { + logger.info('Redis reconnecting in %s (label=%s)', timeToReconnect, label); + }); + + return redis; +} diff --git a/packages/services/workflows/src/tasks/schema-proposal-composition.ts b/packages/services/workflows/src/tasks/schema-proposal-composition.ts index ce967162b9b..f7410dea2e0 100644 --- a/packages/services/workflows/src/tasks/schema-proposal-composition.ts +++ b/packages/services/workflows/src/tasks/schema-proposal-composition.ts @@ -6,9 +6,8 @@ */ import { z } from 'zod'; -// @todo -- duplicate this or export it from @hive/api to avoid using a file path -import { createSchemaObject, ProjectType } from '@hive/api/shared/entities.js'; import { defineTask, implementTask } from '../kit.js'; +import { createSchemaObject } from '../lib/schema/provider'; function extendWithBase(schemas: Array<{ sdl: string }>, baseSchema: string | null) { if (!baseSchema) { @@ -55,7 +54,7 @@ export const task = implementTask(SchemaProposalCompositionTask, async args => { try { const result = await args.context.schema.composeAndValidate( - schemas[0].type as ProjectType, + schemas[0].type, extendWithBase(schemas, baseSchema).map(s => createSchemaObject(s)), { /** Whether external composition should be used (only Federation) */ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0bcd75ac001..f0c261b62bd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -624,6 +624,32 @@ importers: version: 16.9.0 publishDirectory: dist + packages/libraries/pubsub: + dependencies: + '@graphql-hive/logger': + specifier: ^1.0.9 + version: 1.0.9(pino@10.3.0) + '@graphql-yoga/redis-event-target': + specifier: 3.0.3 + version: 3.0.3(ioredis@5.8.2) + '@whatwg-node/fetch': + specifier: ^0.10.13 + version: 0.10.13 + graphql-yoga: + specifier: 5.13.3 + version: 5.13.3(graphql@16.12.0) + ioredis: + specifier: ^5.0.0 + version: 5.8.2 + devDependencies: + tslib: + specifier: 2.8.1 + version: 2.8.1 + vitest: + specifier: 4.0.9 + version: 4.0.9(@types/debug@4.1.12)(@types/node@25.0.2)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(msw@2.12.7(@types/node@25.0.2)(typescript@5.7.3))(terser@5.37.0)(tsx@4.19.2)(yaml@2.5.0) + publishDirectory: dist + packages/libraries/router: {} packages/libraries/yoga: @@ -754,6 +780,9 @@ importers: '@graphql-hive/core': specifier: workspace:* version: link:../../libraries/core/dist + '@graphql-hive/pubsub': + specifier: workspace:* + version: link:../../libraries/pubsub/dist '@graphql-hive/signal': specifier: 1.0.0 version: 1.0.0 @@ -1650,6 +1679,9 @@ importers: '@graphql-hive/logger': specifier: 1.0.9 version: 1.0.9(pino@10.3.0) + '@graphql-hive/pubsub': + specifier: workspace:* + version: link:../../libraries/pubsub/dist '@graphql-inspector/core': specifier: 7.1.2 version: 7.1.2(graphql@16.9.0) @@ -1659,9 +1691,6 @@ importers: '@graphql-yoga/redis-event-target': specifier: 3.0.3 version: 3.0.3(ioredis@5.8.2) - '@hive/api': - specifier: workspace:* - version: link:../api '@hive/service-common': specifier: workspace:* version: link:../service-common @@ -1695,9 +1724,15 @@ importers: graphql: specifier: 16.9.0 version: 16.9.0 + graphql-modules: + specifier: 3.1.1 + version: 3.1.1(graphql@16.9.0) graphql-yoga: specifier: 5.13.3 version: 5.13.3(graphql@16.9.0) + ioredis: + specifier: 5.8.2 + version: 5.8.2 mjml: specifier: 4.14.0 version: 4.14.0(encoding@0.1.13) @@ -18764,46 +18799,6 @@ packages: terser: optional: true - vite@7.1.11: - resolution: {integrity: sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 - jiti: '>=1.21.0' - less: ^4.0.0 - lightningcss: ^1.21.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: '>=0.54.8' - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - vite@7.3.1: resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -31919,23 +31914,23 @@ snapshots: chai: 6.2.0 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.9(msw@2.12.7(@types/node@22.10.5)(typescript@5.7.3))(vite@7.1.11(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.5.0))': + '@vitest/mocker@4.0.9(msw@2.12.7(@types/node@22.10.5)(typescript@5.7.3))(vite@7.3.1(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.5.0))': dependencies: '@vitest/spy': 4.0.9 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: msw: 2.12.7(@types/node@22.10.5)(typescript@5.7.3) - vite: 7.1.11(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.5.0) + vite: 7.3.1(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.5.0) - '@vitest/mocker@4.0.9(msw@2.12.7(@types/node@25.0.2)(typescript@5.7.3))(vite@7.1.11(@types/node@25.0.2)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.5.0))': + '@vitest/mocker@4.0.9(msw@2.12.7(@types/node@25.0.2)(typescript@5.7.3))(vite@7.3.1(@types/node@25.0.2)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.5.0))': dependencies: '@vitest/spy': 4.0.9 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: msw: 2.12.7(@types/node@25.0.2)(typescript@5.7.3) - vite: 7.1.11(@types/node@25.0.2)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.5.0) + vite: 7.3.1(@types/node@25.0.2)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.5.0) '@vitest/pretty-format@4.0.9': dependencies: @@ -35677,6 +35672,23 @@ snapshots: optionalDependencies: ws: 8.18.0 + graphql-yoga@5.13.3(graphql@16.12.0): + dependencies: + '@envelop/core': 5.5.1 + '@envelop/instrumentation': 1.0.0 + '@graphql-tools/executor': 1.5.0(graphql@16.12.0) + '@graphql-tools/schema': 10.0.25(graphql@16.12.0) + '@graphql-tools/utils': 10.9.1(graphql@16.12.0) + '@graphql-yoga/logger': 2.0.1 + '@graphql-yoga/subscription': 5.0.5 + '@whatwg-node/fetch': 0.10.13 + '@whatwg-node/promise-helpers': 1.3.2 + '@whatwg-node/server': 0.10.17 + dset: 3.1.4 + graphql: 16.12.0 + lru-cache: 10.2.0 + tslib: 2.8.1 + graphql-yoga@5.13.3(graphql@16.9.0): dependencies: '@envelop/core': 5.5.1 @@ -42425,42 +42437,6 @@ snapshots: lightningcss: 1.31.1 terser: 5.37.0 - vite@7.1.11(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.5.0): - dependencies: - esbuild: 0.25.9 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.50.2 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 22.10.5 - fsevents: 2.3.3 - jiti: 2.6.1 - less: 4.2.0 - lightningcss: 1.31.1 - terser: 5.37.0 - tsx: 4.19.2 - yaml: 2.5.0 - - vite@7.1.11(@types/node@25.0.2)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.5.0): - dependencies: - esbuild: 0.25.9 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.50.2 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 25.0.2 - fsevents: 2.3.3 - jiti: 2.6.1 - less: 4.2.0 - lightningcss: 1.31.1 - terser: 5.37.0 - tsx: 4.19.2 - yaml: 2.5.0 - vite@7.3.1(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.5.0): dependencies: esbuild: 0.25.9 @@ -42478,7 +42454,6 @@ snapshots: terser: 5.37.0 tsx: 4.19.2 yaml: 2.5.0 - optional: true vite@7.3.1(@types/node@25.0.2)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.5.0): dependencies: @@ -42501,7 +42476,7 @@ snapshots: vitest@4.0.9(@types/debug@4.1.12)(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(msw@2.12.7(@types/node@22.10.5)(typescript@5.7.3))(terser@5.37.0)(tsx@4.19.2)(yaml@2.5.0): dependencies: '@vitest/expect': 4.0.9 - '@vitest/mocker': 4.0.9(msw@2.12.7(@types/node@22.10.5)(typescript@5.7.3))(vite@7.1.11(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.5.0)) + '@vitest/mocker': 4.0.9(msw@2.12.7(@types/node@22.10.5)(typescript@5.7.3))(vite@7.3.1(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.5.0)) '@vitest/pretty-format': 4.0.9 '@vitest/runner': 4.0.9 '@vitest/snapshot': 4.0.9 @@ -42518,7 +42493,7 @@ snapshots: tinyexec: 0.3.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.1.11(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.5.0) + vite: 7.3.1(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.5.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 @@ -42540,7 +42515,7 @@ snapshots: vitest@4.0.9(@types/debug@4.1.12)(@types/node@25.0.2)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(msw@2.12.7(@types/node@25.0.2)(typescript@5.7.3))(terser@5.37.0)(tsx@4.19.2)(yaml@2.5.0): dependencies: '@vitest/expect': 4.0.9 - '@vitest/mocker': 4.0.9(msw@2.12.7(@types/node@25.0.2)(typescript@5.7.3))(vite@7.1.11(@types/node@25.0.2)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.5.0)) + '@vitest/mocker': 4.0.9(msw@2.12.7(@types/node@25.0.2)(typescript@5.7.3))(vite@7.3.1(@types/node@25.0.2)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.5.0)) '@vitest/pretty-format': 4.0.9 '@vitest/runner': 4.0.9 '@vitest/snapshot': 4.0.9 @@ -42557,7 +42532,7 @@ snapshots: tinyexec: 0.3.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.1.11(@types/node@25.0.2)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.5.0) + vite: 7.3.1(@types/node@25.0.2)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.5.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 diff --git a/tsconfig.json b/tsconfig.json index 64eecc305ec..bf7c44003d2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -74,7 +74,8 @@ ], "@graphql-hive/plugin-opentelemetry/setup": [ "./node_modules/@graphql-hive/plugin-opentelemetry/dist/setup.d.ts" - ] + ], + "@graphql-hive/pubsub": ["./packages/libraries/pubsub/src/index.ts"] } }, "include": ["packages", "tsup.config.node.ts"], From 6b653449c355e815e4081d3eb2ec4eeaff2204fe Mon Sep 17 00:00:00 2001 From: jdolle <1841898+jdolle@users.noreply.github.com> Date: Tue, 24 Feb 2026 13:33:52 -0800 Subject: [PATCH 11/29] Fix type import --- packages/libraries/pubsub/src/index.ts | 6 +++--- .../services/api/src/modules/shared/providers/pub-sub.ts | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/libraries/pubsub/src/index.ts b/packages/libraries/pubsub/src/index.ts index 984301b94b5..b93a73eb819 100644 --- a/packages/libraries/pubsub/src/index.ts +++ b/packages/libraries/pubsub/src/index.ts @@ -1,9 +1,7 @@ import { createPubSub } from 'graphql-yoga'; import { Redis } from 'ioredis'; import { createRedisEventTarget } from '@graphql-yoga/redis-event-target'; -import { HivePubSub } from './pub-sub'; - -export { HivePubSub } from './pub-sub'; +import type { HivePubSub } from './pub-sub'; export function createHivePubSub(args: { publisher: Redis; subscriber: Redis }) { return createPubSub({ @@ -13,3 +11,5 @@ export function createHivePubSub(args: { publisher: Redis; subscriber: Redis }) }), }) as HivePubSub; } + +export type { HivePubSub }; diff --git a/packages/services/api/src/modules/shared/providers/pub-sub.ts b/packages/services/api/src/modules/shared/providers/pub-sub.ts index 4a9c087a989..eae17984fe2 100644 --- a/packages/services/api/src/modules/shared/providers/pub-sub.ts +++ b/packages/services/api/src/modules/shared/providers/pub-sub.ts @@ -1,5 +1,5 @@ import { InjectionToken } from 'graphql-modules'; -import { HivePubSub } from '@graphql-hive/pubsub'; +import type { HivePubSub } from '@graphql-hive/pubsub'; export const PUB_SUB_CONFIG = new InjectionToken('PUB_SUB'); -export { HivePubSub }; +export type { HivePubSub }; From b2185a3ba60a0da253855e4a8a84152b03a00f9f Mon Sep 17 00:00:00 2001 From: jdolle <1841898+jdolle@users.noreply.github.com> Date: Tue, 24 Feb 2026 13:36:28 -0800 Subject: [PATCH 12/29] Update lockfile --- pnpm-lock.yaml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f0c261b62bd..a2f77efae3b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -648,7 +648,6 @@ importers: vitest: specifier: 4.0.9 version: 4.0.9(@types/debug@4.1.12)(@types/node@25.0.2)(jiti@2.6.1)(less@4.2.0)(lightningcss@1.31.1)(msw@2.12.7(@types/node@25.0.2)(typescript@5.7.3))(terser@5.37.0)(tsx@4.19.2)(yaml@2.5.0) - publishDirectory: dist packages/libraries/router: {} @@ -782,7 +781,7 @@ importers: version: link:../../libraries/core/dist '@graphql-hive/pubsub': specifier: workspace:* - version: link:../../libraries/pubsub/dist + version: link:../../libraries/pubsub '@graphql-hive/signal': specifier: 1.0.0 version: 1.0.0 @@ -1681,7 +1680,7 @@ importers: version: 1.0.9(pino@10.3.0) '@graphql-hive/pubsub': specifier: workspace:* - version: link:../../libraries/pubsub/dist + version: link:../../libraries/pubsub '@graphql-inspector/core': specifier: 7.1.2 version: 7.1.2(graphql@16.9.0) @@ -1724,9 +1723,6 @@ importers: graphql: specifier: 16.9.0 version: 16.9.0 - graphql-modules: - specifier: 3.1.1 - version: 3.1.1(graphql@16.9.0) graphql-yoga: specifier: 5.13.3 version: 5.13.3(graphql@16.9.0) From 2c42fd9764f8b556f4dbb1093494ebad31f96364 Mon Sep 17 00:00:00 2001 From: jdolle <1841898+jdolle@users.noreply.github.com> Date: Tue, 24 Feb 2026 13:46:04 -0800 Subject: [PATCH 13/29] Fix generated type --- packages/services/storage/src/db/types.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/services/storage/src/db/types.ts b/packages/services/storage/src/db/types.ts index 24d4dc3fe40..568458a296b 100644 --- a/packages/services/storage/src/db/types.ts +++ b/packages/services/storage/src/db/types.ts @@ -368,6 +368,9 @@ export interface schema_proposal_reviews { export interface schema_proposals { author: string; comments_count: number; + composition_status: string | null; + composition_status_reason: string | null; + composition_timestamp: Date | null; created_at: Date; description: string; id: string; From 9f008c14fc2f677b7c38abf52c6e97812b69c755 Mon Sep 17 00:00:00 2001 From: jdolle <1841898+jdolle@users.noreply.github.com> Date: Tue, 24 Feb 2026 15:19:51 -0800 Subject: [PATCH 14/29] Fix workflows deployment --- deployment/index.ts | 23 ++++++++++++----------- deployment/services/workflows.ts | 8 +++++--- packages/services/workflows/src/redis.ts | 8 +++++++- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/deployment/index.ts b/deployment/index.ts index 90128423c51..8e968ec5435 100644 --- a/deployment/index.ts +++ b/deployment/index.ts @@ -136,17 +136,6 @@ const tokens = deployTokens({ observability, }); -deployWorkflows({ - image: docker.factory.getImageId('workflows', imagesTag), - docker, - environment, - postgres, - postmarkSecret, - observability, - sentry, - heartbeat: heartbeatsConfig.get('webhooks'), -}); - const commerce = deployCommerce({ image: docker.factory.getImageId('commerce', imagesTag), docker, @@ -201,6 +190,18 @@ const schemaPolicy = deploySchemaPolicy({ observability, }); +deployWorkflows({ + image: docker.factory.getImageId('workflows', imagesTag), + docker, + environment, + postgres, + postmarkSecret, + observability, + sentry, + heartbeat: heartbeatsConfig.get('webhooks'), + schema, +}); + const supertokens = deploySuperTokens(postgres, { dependencies: [dbMigrations] }, environment); const zendesk = configureZendesk({ environment }); const githubApp = configureGithubApp(); diff --git a/deployment/services/workflows.ts b/deployment/services/workflows.ts index 602b969e688..0214ee5a3cb 100644 --- a/deployment/services/workflows.ts +++ b/deployment/services/workflows.ts @@ -1,10 +1,12 @@ import * as pulumi from '@pulumi/pulumi'; +import { serviceLocalEndpoint } from '../utils/local-endpoint'; import { ServiceSecret } from '../utils/secrets'; import { ServiceDeployment } from '../utils/service-deployment'; import { Docker } from './docker'; import { Environment } from './environment'; import { Observability } from './observability'; import { Postgres } from './postgres'; +import { Schema } from './schema'; import { Sentry } from './sentry'; export class PostmarkSecret extends ServiceSecret<{ @@ -22,7 +24,7 @@ export function deployWorkflows({ postgres, observability, postmarkSecret, - schemaServiceUrl, + schema, }: { postgres: Postgres; observability: Observability; @@ -32,7 +34,7 @@ export function deployWorkflows({ heartbeat?: string; sentry: Sentry; postmarkSecret: PostmarkSecret; - schemaServiceUrl: string; + schema: Schema; }) { return ( new ServiceDeployment( @@ -49,7 +51,7 @@ export function deployWorkflows({ ? observability.tracingEndpoint : '', LOG_JSON: '1', - SCHEMA_SERVICE_URL: schemaServiceUrl, + SCHEMA_SERVICE_URL: serviceLocalEndpoint(schema.service), }, readinessProbe: '/_readiness', livenessProbe: '/_health', diff --git a/packages/services/workflows/src/redis.ts b/packages/services/workflows/src/redis.ts index b989d55547e..6ee22fa6543 100644 --- a/packages/services/workflows/src/redis.ts +++ b/packages/services/workflows/src/redis.ts @@ -4,7 +4,6 @@ **/ import type { Redis as RedisInstance, RedisOptions } from 'ioredis'; import Redis from 'ioredis'; -import { Logger } from '@graphql-hive/logger'; export type { RedisInstance as Redis }; @@ -12,6 +11,13 @@ export type RedisConfig = Required Date: Tue, 24 Feb 2026 15:36:31 -0800 Subject: [PATCH 15/29] Fix community & env name --- deployment/services/workflows.ts | 2 +- docker/docker-compose.community.yml | 1 + packages/services/workflows/.env.template | 2 +- packages/services/workflows/src/environment.ts | 4 ++-- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/deployment/services/workflows.ts b/deployment/services/workflows.ts index 0214ee5a3cb..4d4be3f824c 100644 --- a/deployment/services/workflows.ts +++ b/deployment/services/workflows.ts @@ -51,7 +51,7 @@ export function deployWorkflows({ ? observability.tracingEndpoint : '', LOG_JSON: '1', - SCHEMA_SERVICE_URL: serviceLocalEndpoint(schema.service), + SCHEMA_ENDPOINT: serviceLocalEndpoint(schema.service), }, readinessProbe: '/_readiness', livenessProbe: '/_health', diff --git a/docker/docker-compose.community.yml b/docker/docker-compose.community.yml index eeafc15ea28..5324e6801fe 100644 --- a/docker/docker-compose.community.yml +++ b/docker/docker-compose.community.yml @@ -322,6 +322,7 @@ services: SENTRY_DSN: '${SENTRY_DSN:-}' PROMETHEUS_METRICS: '${PROMETHEUS_METRICS:-}' LOG_JSON: '1' + SCHEMA_ENDPOINT: http://schema:3002 usage: image: '${DOCKER_REGISTRY}usage${DOCKER_TAG}' diff --git a/packages/services/workflows/.env.template b/packages/services/workflows/.env.template index 3babf3fae87..4ab7cd696d0 100644 --- a/packages/services/workflows/.env.template +++ b/packages/services/workflows/.env.template @@ -5,7 +5,7 @@ POSTGRES_USER=postgres POSTGRES_PASSWORD=postgres EMAIL_FROM=mock@graphql-hive.com EMAIL_PROVIDER=mock -SCHEMA_SERVICE_URL="http://localhost:6500" +SCHEMA_ENDPOINT=http://localhost:6500 REDIS_HOST=localhost REDIS_PORT=6379 REDIS_PASSWORD= \ No newline at end of file diff --git a/packages/services/workflows/src/environment.ts b/packages/services/workflows/src/environment.ts index 986be4304aa..e15a66972a2 100644 --- a/packages/services/workflows/src/environment.ts +++ b/packages/services/workflows/src/environment.ts @@ -26,7 +26,7 @@ const EnvironmentModel = zod.object({ RELEASE: emptyString(zod.string().optional()), HEARTBEAT_ENDPOINT: emptyString(zod.string().url().optional()), EMAIL_FROM: zod.string().email(), - SCHEMA_SERVICE_URL: zod.string().url(), + SCHEMA_ENDPOINT: zod.string().url(), }); const SentryModel = zod.union([ @@ -217,7 +217,7 @@ export const env = { emailFrom: base.EMAIL_FROM, }, schema: { - serviceUrl: base.SCHEMA_SERVICE_URL, + serviceUrl: base.SCHEMA_ENDPOINT, }, sentry: sentry.SENTRY === '1' ? { dsn: sentry.SENTRY_DSN } : null, log: { From 0dc136e9e5fbddf256466e0a8a23d61c77842639 Mon Sep 17 00:00:00 2001 From: jdolle <1841898+jdolle@users.noreply.github.com> Date: Tue, 24 Feb 2026 16:05:57 -0800 Subject: [PATCH 16/29] Basic composition ui; fix names --- .../src/modules/proposals/module.graphql.ts | 1 + .../providers/schema-proposal-storage.ts | 6 ++- .../web/app/src/pages/target-proposal.tsx | 38 ++++++++++++++++++- 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/packages/services/api/src/modules/proposals/module.graphql.ts b/packages/services/api/src/modules/proposals/module.graphql.ts index 2a3b596ed56..3117ce2b782 100644 --- a/packages/services/api/src/modules/proposals/module.graphql.ts +++ b/packages/services/api/src/modules/proposals/module.graphql.ts @@ -258,6 +258,7 @@ export default gql` compositionStatus: String compositionTimestamp: DateTime + compositionStatusReason: String } input SchemaProposalChecksInput { diff --git a/packages/services/api/src/modules/proposals/providers/schema-proposal-storage.ts b/packages/services/api/src/modules/proposals/providers/schema-proposal-storage.ts index 31b81e43ea3..47cff743f54 100644 --- a/packages/services/api/src/modules/proposals/providers/schema-proposal-storage.ts +++ b/packages/services/api/src/modules/proposals/providers/schema-proposal-storage.ts @@ -401,7 +401,8 @@ const schemaProposalFields = sql` , sp."target_id" as "targetId" , sp."author" , sp."composition_status" as "compositionStatus" - , sp."composition_timestamp" as "compositionTimestamp" + , to_json(sp."composition_timestamp") as "compositionTimestamp" + , sp."composition_status_reason" as "compositionStatusReason" `; const schemaProposalReviewFields = sql` @@ -438,6 +439,9 @@ const SchemaProposalModel = z.object({ stage: StageModel, targetId: z.string(), author: z.string(), + compositionStatus: z.string().optional(), + compositionStatusReason: z.string().optional(), + compositionTimestamp: z.string().optional(), }); export type SchemaProposalRecord = z.infer; diff --git a/packages/web/app/src/pages/target-proposal.tsx b/packages/web/app/src/pages/target-proposal.tsx index 25ddafe257c..358efec8287 100644 --- a/packages/web/app/src/pages/target-proposal.tsx +++ b/packages/web/app/src/pages/target-proposal.tsx @@ -15,13 +15,14 @@ import { VersionSelect, } from '@/components/target/proposals/version-select'; import { CardDescription } from '@/components/ui/card'; -import { DiffIcon, EditIcon, GraphQLIcon } from '@/components/ui/icon'; +import { CheckIcon, DiffIcon, EditIcon, GraphQLIcon, XIcon } from '@/components/ui/icon'; import { Meta } from '@/components/ui/meta'; import { Subtitle, Title } from '@/components/ui/page'; import { SubPageLayoutHeader } from '@/components/ui/page-content-layout'; import { Skeleton } from '@/components/ui/skeleton'; import { Spinner } from '@/components/ui/spinner'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'; import { TimeAgo } from '@/components/v2'; import { FragmentType, graphql, useFragment } from '@/gql'; import { ProjectType } from '@/gql/graphql'; @@ -80,6 +81,9 @@ const ProposalQuery = graphql(/* GraphQL */ ` stage title description + compositionStatus + compositionTimestamp + compositionStatusReason versions: checks(after: null, input: {}) { ...ProposalQuery_VersionsListFragment } @@ -453,7 +457,37 @@ const ProposalsContent = (props: Parameters[0]
- {proposal.title} + + {proposal.title} + <TooltipProvider delayDuration={0}> + <Tooltip> + <TooltipTrigger> + {proposal?.compositionStatus === 'error' ? ( + <XIcon className="text-red-600" /> + ) : null} + {proposal?.compositionStatus === 'success' ? ( + <CheckIcon className="text-emerald-500" /> + ) : null} + </TooltipTrigger> + <TooltipContent align="start"> + {proposal?.compositionStatus === 'error' ? ( + <> + Composition Error{' '} + {proposal.compositionTimestamp ? ( + <> + (<TimeAgo date={proposal.compositionTimestamp} />) + </> + ) : null} + {proposal.compositionStatusReason + ?.split('\n') + .map(e => <div>- {e}</div>) ?? 'Unknown cause.'}{' '} + </> + ) : null} + {proposal?.compositionStatus === 'success' ? 'Composes Successfully' : null} + </TooltipContent> + </Tooltip> + </TooltipProvider> +
proposed by {proposal.author}
From 1aa49aae1b0fbd2ed6c2779ae652b8a1ac64831f Mon Sep 17 00:00:00 2001 From: jdolle <1841898+jdolle@users.noreply.github.com> Date: Tue, 24 Feb 2026 16:07:12 -0800 Subject: [PATCH 17/29] add key --- packages/web/app/src/pages/target-proposal.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web/app/src/pages/target-proposal.tsx b/packages/web/app/src/pages/target-proposal.tsx index 358efec8287..b9c7f27f6c6 100644 --- a/packages/web/app/src/pages/target-proposal.tsx +++ b/packages/web/app/src/pages/target-proposal.tsx @@ -480,7 +480,7 @@ const ProposalsContent = (props: Parameters[0] ) : null} {proposal.compositionStatusReason ?.split('\n') - .map(e =>
- {e}
) ?? 'Unknown cause.'}{' '} + .map((e, i) =>
- {e}
) ?? 'Unknown cause.'}{' '} ) : null} {proposal?.compositionStatus === 'success' ? 'Composes Successfully' : null} From 4d00a88eaef2ae736ad4d944f0bba87aa56dc014 Mon Sep 17 00:00:00 2001 From: jdolle <1841898+jdolle@users.noreply.github.com> Date: Tue, 24 Feb 2026 16:38:37 -0800 Subject: [PATCH 18/29] Unify redis logger utilities --- packages/libraries/pubsub/package.json | 2 - packages/libraries/pubsub/src/index.ts | 2 + packages/libraries/pubsub/src/logger.ts | 32 +++ .../providers/schema-proposal-storage.ts | 33 +-- .../services/service-common/src/pubsub.ts | 0 packages/services/workflows/src/index.ts | 24 +- packages/services/workflows/src/kit.ts | 2 +- packages/services/workflows/src/logger.ts | 32 +-- packages/services/workflows/src/redis.ts | 8 +- pnpm-lock.yaml | 205 +----------------- 10 files changed, 51 insertions(+), 289 deletions(-) create mode 100644 packages/libraries/pubsub/src/logger.ts delete mode 100644 packages/services/service-common/src/pubsub.ts diff --git a/packages/libraries/pubsub/package.json b/packages/libraries/pubsub/package.json index 0a84153c07b..c4bd17437a7 100644 --- a/packages/libraries/pubsub/package.json +++ b/packages/libraries/pubsub/package.json @@ -47,9 +47,7 @@ "ioredis": "^5.0.0" }, "dependencies": { - "@graphql-hive/logger": "^1.0.9", "@graphql-yoga/redis-event-target": "3.0.3", - "@whatwg-node/fetch": "^0.10.13", "graphql-yoga": "5.13.3" }, "devDependencies": { diff --git a/packages/libraries/pubsub/src/index.ts b/packages/libraries/pubsub/src/index.ts index b93a73eb819..419c7d2d102 100644 --- a/packages/libraries/pubsub/src/index.ts +++ b/packages/libraries/pubsub/src/index.ts @@ -3,6 +3,8 @@ import { Redis } from 'ioredis'; import { createRedisEventTarget } from '@graphql-yoga/redis-event-target'; import type { HivePubSub } from './pub-sub'; +export * from './logger'; + export function createHivePubSub(args: { publisher: Redis; subscriber: Redis }) { return createPubSub({ eventTarget: createRedisEventTarget({ diff --git a/packages/libraries/pubsub/src/logger.ts b/packages/libraries/pubsub/src/logger.ts new file mode 100644 index 00000000000..0e9d2cf679d --- /dev/null +++ b/packages/libraries/pubsub/src/logger.ts @@ -0,0 +1,32 @@ +import { Logger as GraphileLogger, type LogLevel as GraphileLogLevel } from 'graphile-worker'; + +export type Logger = { + error(msg: string, ...interpol: unknown[]): void; + warn(msg: string, ...interpol: unknown[]): void; + info(msg: string, ...interpol: unknown[]): void; + debug(msg: string, ...interpol: unknown[]): void; +}; + +function logLevel(level: GraphileLogLevel) { + switch (level) { + case 'warning': + return 'warn' as const; + case 'info': { + return 'info' as const; + } + case 'debug': { + return 'debug' as const; + } + case 'error': { + return 'error' as const; + } + } + + return 'info'; +} + +export function bridgeGraphileLogger(logger: Logger) { + return new GraphileLogger(_scope => (level, message, _meta) => { + logger[logLevel(level)](message); + }); +} diff --git a/packages/services/api/src/modules/proposals/providers/schema-proposal-storage.ts b/packages/services/api/src/modules/proposals/providers/schema-proposal-storage.ts index 47cff743f54..09ece8361e2 100644 --- a/packages/services/api/src/modules/proposals/providers/schema-proposal-storage.ts +++ b/packages/services/api/src/modules/proposals/providers/schema-proposal-storage.ts @@ -1,15 +1,11 @@ /** * This wraps the database calls for schema proposals and required validation */ -import { - Logger as GraphileLogger, - LogLevel as GraphileLogLevel, - makeWorkerUtils, - WorkerUtils, -} from 'graphile-worker'; +import { makeWorkerUtils, WorkerUtils } from 'graphile-worker'; import { Inject, Injectable, Scope } from 'graphql-modules'; import { sql, type DatabasePool } from 'slonik'; import { z } from 'zod'; +import { bridgeGraphileLogger } from '@graphql-hive/pubsub'; import { decodeCreatedAtAndUUIDIdBasedCursor, encodeCreatedAtAndUUIDIdBasedCursor, @@ -20,31 +16,6 @@ import { PG_POOL_CONFIG } from '../../shared/providers/pg-pool'; import { Storage } from '../../shared/providers/storage'; import { SCHEMA_PROPOSALS_ENABLED } from './schema-proposals-enabled-token'; -// @todo do not repeat this definition with workflows service -function logLevel(level: GraphileLogLevel) { - switch (level) { - case 'warning': - return 'warn' as const; - case 'info': { - return 'info' as const; - } - case 'debug': { - return 'debug' as const; - } - case 'error': { - return 'error' as const; - } - } - - return 'info'; -} - -export function bridgeGraphileLogger(logger: Logger) { - return new GraphileLogger(_scope => (level, message, _meta) => { - logger[logLevel(level)](message); - }); -} - const SchemaProposalsTitleModel = z .string() .min(1, 'Must be at least 1 character long') diff --git a/packages/services/service-common/src/pubsub.ts b/packages/services/service-common/src/pubsub.ts deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/packages/services/workflows/src/index.ts b/packages/services/workflows/src/index.ts index dde0cb913c3..b1e2b018f5f 100644 --- a/packages/services/workflows/src/index.ts +++ b/packages/services/workflows/src/index.ts @@ -1,9 +1,7 @@ import { run } from 'graphile-worker'; -import { createPubSub } from 'graphql-yoga'; import { createPool } from 'slonik'; import { Logger } from '@graphql-hive/logger'; -import type { HivePubSub } from '@graphql-hive/pubsub'; -import { createRedisEventTarget } from '@graphql-yoga/redis-event-target'; +import { bridgeGraphileLogger, createHivePubSub } from '@graphql-hive/pubsub'; import { createServer, registerShutdown, @@ -16,7 +14,7 @@ import { Context } from './context.js'; import { env } from './environment.js'; import { createEmailProvider } from './lib/emails/providers.js'; import { schemaProvider } from './lib/schema/provider.js'; -import { bridgeFastifyLogger, bridgeGraphileLogger } from './logger.js'; +import { bridgeFastifyLogger } from './logger.js'; import { createRedisClient } from './redis'; import { createTaskEventEmitter } from './task-events.js'; @@ -77,16 +75,14 @@ const server = await createServer({ const redis = createRedisClient('Redis', env.redis, server.log.child({ source: 'Redis' })); -const pubSub = createPubSub({ - eventTarget: createRedisEventTarget({ - publishClient: redis, - subscribeClient: createRedisClient( - 'subscriber', - env.redis, - server.log.child({ source: 'RedisSubscribe' }), - ), - }), -}) as HivePubSub; +const pubSub = createHivePubSub({ + publisher: redis, + subscriber: createRedisClient( + 'subscriber', + env.redis, + server.log.child({ source: 'RedisSubscribe' }), + ), +}); const context: Context = { logger, diff --git a/packages/services/workflows/src/kit.ts b/packages/services/workflows/src/kit.ts index 3f9c6255898..9e1331a1701 100644 --- a/packages/services/workflows/src/kit.ts +++ b/packages/services/workflows/src/kit.ts @@ -4,8 +4,8 @@ import { makeWorkerUtils, WorkerUtils, type JobHelpers, type Task } from 'graphi import type { Pool } from 'pg'; import { z } from 'zod'; import { Logger } from '@graphql-hive/logger'; +import { bridgeGraphileLogger } from '@graphql-hive/pubsub'; import type { Context } from './context'; -import { bridgeGraphileLogger } from './logger'; export type TaskDefinition = { name: TName; diff --git a/packages/services/workflows/src/logger.ts b/packages/services/workflows/src/logger.ts index 094c3f782c4..809e4bbb02a 100644 --- a/packages/services/workflows/src/logger.ts +++ b/packages/services/workflows/src/logger.ts @@ -1,33 +1,5 @@ -import { Logger as GraphileLogger, type LogLevel as GraphileLogLevel } from 'graphile-worker'; -import type { Logger } from '@graphql-hive/logger'; -import { ServiceLogger } from '@hive/service-common'; - -function logLevel(level: GraphileLogLevel) { - switch (level) { - case 'warning': - return 'warn' as const; - case 'info': { - return 'info' as const; - } - case 'debug': { - return 'debug' as const; - } - case 'error': { - return 'error' as const; - } - } - - return 'info'; -} - -/** - * Bridges Hive Logger to Graphile Logger - */ -export function bridgeGraphileLogger(logger: Logger) { - return new GraphileLogger(_scope => (level, message, _meta) => { - logger[logLevel(level)](message); - }); -} +import type { Logger } from '@graphql-hive/pubsub'; +import type { ServiceLogger } from '@hive/service-common'; export function bridgeFastifyLogger(logger: Logger): ServiceLogger { return logger as unknown as ServiceLogger; diff --git a/packages/services/workflows/src/redis.ts b/packages/services/workflows/src/redis.ts index 6ee22fa6543..5d20c75338f 100644 --- a/packages/services/workflows/src/redis.ts +++ b/packages/services/workflows/src/redis.ts @@ -4,6 +4,7 @@ **/ import type { Redis as RedisInstance, RedisOptions } from 'ioredis'; import Redis from 'ioredis'; +import type { Logger } from '@graphql-hive/pubsub'; export type { RedisInstance as Redis }; @@ -11,13 +12,6 @@ export type RedisConfig = Required Date: Tue, 24 Feb 2026 16:51:21 -0800 Subject: [PATCH 19/29] Fix packages --- packages/libraries/pubsub/package.json | 1 + pnpm-lock.yaml | 1168 +++++++++++++++++++++++- 2 files changed, 1150 insertions(+), 19 deletions(-) diff --git a/packages/libraries/pubsub/package.json b/packages/libraries/pubsub/package.json index c4bd17437a7..d0840bc346a 100644 --- a/packages/libraries/pubsub/package.json +++ b/packages/libraries/pubsub/package.json @@ -44,6 +44,7 @@ "typecheck": "tsc --noEmit" }, "peerDependencies": { + "graphile-worker": "^0.1.0", "ioredis": "^5.0.0" }, "dependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 316ed643495..05f425ac845 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -629,6 +629,9 @@ importers: '@graphql-yoga/redis-event-target': specifier: 3.0.3 version: 3.0.3(ioredis@5.8.2) + graphile-worker: + specifier: ^0.1.0 + version: 0.1.0 graphql-yoga: specifier: 5.13.3 version: 5.13.3(graphql@16.12.0) @@ -1380,7 +1383,7 @@ importers: version: 1.0.9(pino@10.3.0) '@graphql-hive/plugin-opentelemetry': specifier: 1.3.0 - version: 1.3.0(encoding@0.1.13)(graphql@16.12.0)(ioredis@5.8.2)(pino@10.3.0)(ws@8.18.0) + version: 1.3.0(encoding@0.1.13)(graphql@16.12.0)(pino@10.3.0)(ws@8.18.0) '@opentelemetry/api': specifier: 1.9.0 version: 1.9.0 @@ -9597,6 +9600,9 @@ packages: '@types/chai@5.2.2': resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + '@types/chokidar@1.7.5': + resolution: {integrity: sha512-PDkSRY7KltW3M60hSBlerxI8SFPXsO3AL/aRVsO4Kh9IHRW74Ih75gUuTd/aE4LSSFqypb10UIX3QzOJwBQMGQ==} + '@types/cli-progress@3.11.5': resolution: {integrity: sha512-D4PbNRbviKyppS5ivBGyFO29POlySLmA2HyUFE4p5QGazAMM3CwkKWcvTl8gvElSuxRh6FPKL8XmidX873ou4g==} @@ -9717,9 +9723,6 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/debug@4.1.7': - resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==} - '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} @@ -9748,6 +9751,9 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/events@3.0.3': + resolution: {integrity: sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g==} + '@types/express-serve-static-core@4.19.6': resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} @@ -9907,6 +9913,9 @@ packages: '@types/pg-pool@2.0.6': resolution: {integrity: sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==} + '@types/pg@7.14.11': + resolution: {integrity: sha512-EnZkZ1OMw9DvNfQkn2MTJrwKmhJYDEs5ujWrPfvseWNoI95N8B4HzU/Ltrq5ZfYxDX/Zg8mTzwr6UAyTjjFvXA==} + '@types/pg@8.11.10': resolution: {integrity: sha512-LczQUW4dbOQzsH2RQ5qoeJ6qJPdrcM/DcMLoqWQkMLMsq83J5lAX3LXjdkWdpscFy67JSOWDnh7Ny/sPFykmkg==} @@ -10374,6 +10383,10 @@ packages: resolution: {integrity: sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==} engines: {node: '>=18'} + ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -10382,6 +10395,10 @@ packages: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -10408,6 +10425,9 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + anymatch@2.0.0: + resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} + anymatch@3.1.2: resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} engines: {node: '>= 8'} @@ -10468,6 +10488,18 @@ packages: aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + arr-diff@4.0.0: + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} + engines: {node: '>=0.10.0'} + + arr-flatten@1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + + arr-union@3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + array-buffer-byte-length@1.0.0: resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} @@ -10485,6 +10517,10 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + array-unique@0.3.2: + resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} + engines: {node: '>=0.10.0'} + array.prototype.findlastindex@1.2.3: resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} engines: {node: '>= 0.4'} @@ -10529,6 +10565,10 @@ packages: resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} engines: {node: '>=0.8'} + assign-symbols@1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} + ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} @@ -10544,6 +10584,9 @@ packages: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true + async-each@1.0.6: + resolution: {integrity: sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==} + async-mutex@0.5.0: resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==} @@ -10563,6 +10606,11 @@ packages: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} + atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} @@ -10627,6 +10675,10 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + base@0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + engines: {node: '>=0.10.0'} + baseline-browser-mapping@2.8.3: resolution: {integrity: sha512-mcE+Wr2CAhHNWxXN/DdTI+n4gsPc5QpXpWnyCQWiQYIYZX+ZMJ8juXZgjRa/0/YPJo/NSsgW15/YgmI4nbysYw==} hasBin: true @@ -10691,10 +10743,17 @@ packages: resolution: {integrity: sha512-obsRaULtJurnfox/MDwgq6Yo9kzbv1CPTk/1/s7Z/61Lezc8IKkFCOXNeVLXz0456WRzBQmSsDWlai2tIhBsfA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + binary-extensions@1.13.1: + resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} + engines: {node: '>=0.10.0'} + binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + bintrees@1.0.2: resolution: {integrity: sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==} @@ -10764,6 +10823,10 @@ packages: resolution: {integrity: sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==} engines: {node: 20 || >=22} + braces@2.3.2: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} + engines: {node: '>=0.10.0'} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -10793,6 +10856,10 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer-writer@2.0.0: + resolution: {integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==} + engines: {node: '>=4'} + buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} @@ -10860,6 +10927,10 @@ packages: resolution: {integrity: sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw==} engines: {node: ^16.14.0 || >=18.0.0} + cache-base@1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} + engines: {node: '>=0.10.0'} + cache-content-type@1.0.1: resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} engines: {node: '>= 6.0.0'} @@ -11031,6 +11102,9 @@ packages: chevrotain@11.0.3: resolution: {integrity: sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==} + chokidar@2.1.8: + resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -11057,6 +11131,10 @@ packages: cjs-module-lexer@1.2.3: resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + class-utils@0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} + engines: {node: '>=0.10.0'} + class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} @@ -11137,6 +11215,9 @@ packages: resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} engines: {node: '>=18'} + cliui@5.0.0: + resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} + cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} @@ -11196,10 +11277,20 @@ packages: collapse-white-space@2.1.0: resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + collection-visit@1.0.0: + resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} + engines: {node: '>=0.10.0'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -11266,6 +11357,9 @@ packages: resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} engines: {node: '>=4.0.0'} + component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + compressible@2.0.18: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} @@ -11358,6 +11452,10 @@ packages: copy-anything@2.0.6: resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + copy-descriptor@0.1.1: + resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} + engines: {node: '>=0.10.0'} + copy-to-clipboard@3.3.3: resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} @@ -11761,6 +11859,10 @@ packages: decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + decode-uri-component@0.4.1: resolution: {integrity: sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==} engines: {node: '>=14.16'} @@ -11826,6 +11928,18 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + define-property@0.2.5: + resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} + engines: {node: '>=0.10.0'} + + define-property@1.0.0: + resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} + engines: {node: '>=0.10.0'} + + define-property@2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} + defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} @@ -12047,6 +12161,9 @@ packages: emoji-regex@10.3.0: resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + emoji-regex@7.0.3: + resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -12465,6 +12582,10 @@ packages: resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} engines: {node: '>=6'} + expand-brackets@2.1.4: + resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} + engines: {node: '>=0.10.0'} + expect-type@1.2.2: resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} engines: {node: '>=12.0.0'} @@ -12483,12 +12604,20 @@ packages: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} + extend-shallow@3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} + extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + extglob@2.0.4: + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} + engines: {node: '>=0.10.0'} + extract-files@11.0.0: resolution: {integrity: sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ==} engines: {node: ^12.20 || >= 14.13} @@ -12636,6 +12765,9 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} @@ -12643,6 +12775,10 @@ packages: resolution: {integrity: sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ==} engines: {node: '>= 0.4.0'} + fill-range@4.0.0: + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} + engines: {node: '>=0.10.0'} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -12670,6 +12806,10 @@ packages: resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} engines: {node: '>=18'} + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -12708,6 +12848,10 @@ packages: for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + foreach@2.0.6: resolution: {integrity: sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==} @@ -12758,6 +12902,10 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} + fragment-cache@0.2.1: + resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} + engines: {node: '>=0.10.0'} + framer-motion@10.18.0: resolution: {integrity: sha512-oGlDh1Q1XqYPksuTD/usb0I70hq95OUzmL9+6Zd+Hs4XV0oaISBa/UUMSjYiq6m8EUF32132mOJ8xVZS+I0S6w==} peerDependencies: @@ -12820,6 +12968,12 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@1.2.13: + resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} + engines: {node: '>= 4.0'} + os: [darwin] + deprecated: Upgrade to fsevents v2 to mitigate potential security issues + fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -12937,6 +13091,10 @@ packages: resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} engines: {node: '>= 14'} + get-value@2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} + engines: {node: '>=0.10.0'} + get-value@3.0.1: resolution: {integrity: sha512-mKZj9JLQrwMBtj5wxi6MH8Z5eSKaERpAwjg43dPtlGI1ZVEgH/qC7T8/6R2OBSUA+zzHBZgICsVJaEIV2tKTDA==} engines: {node: '>=6.0'} @@ -12956,6 +13114,9 @@ packages: github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + glob-parent@3.1.0: + resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -13076,6 +13237,11 @@ packages: resolution: {integrity: sha512-uMdF9Rt8/NwT1wVXNleYgM5ro2hHDodHiKA3efJhgdU8iP+r/hksnghOHreMva0sF5tV73f4TpiELPUR0g7O9w==} engines: {node: '>=16'} + graphile-worker@0.1.0: + resolution: {integrity: sha512-/RDvhnr1SwjKSN0ouM8FqSbp8iVrvqUIUbjiOrDggz9s2zmiBSm7IJ0KiIlcjJNZPNkvP1mfBbpn7sHICD9Vng==} + engines: {node: '>=10.0.0'} + hasBin: true + graphile-worker@0.16.6: resolution: {integrity: sha512-e7gGYDmGqzju2l83MpzX8vNG/lOtVJiSzI3eZpAFubSxh/cxs7sRrRGBGjzBP1kNG0H+c95etPpNRNlH65PYhw==} engines: {node: '>=14.0.0'} @@ -13311,6 +13477,22 @@ packages: has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + has-value@0.3.1: + resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} + engines: {node: '>=0.10.0'} + + has-value@1.0.0: + resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} + engines: {node: '>=0.10.0'} + + has-values@0.1.4: + resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} + engines: {node: '>=0.10.0'} + + has-values@1.0.0: + resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} + engines: {node: '>=0.10.0'} + has@1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} @@ -13706,6 +13888,10 @@ packages: resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} engines: {node: '>=0.10.0'} + is-accessor-descriptor@1.0.1: + resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} + engines: {node: '>= 0.10'} + is-alphabetical@1.0.4: resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} @@ -13738,6 +13924,10 @@ packages: is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-binary-path@1.0.1: + resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==} + engines: {node: '>=0.10.0'} + is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -13764,6 +13954,10 @@ packages: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} + is-data-descriptor@1.0.1: + resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} + engines: {node: '>= 0.4'} + is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} @@ -13774,6 +13968,14 @@ packages: is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-descriptor@0.1.7: + resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==} + engines: {node: '>= 0.4'} + + is-descriptor@1.0.3: + resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} + engines: {node: '>= 0.4'} + is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -13794,6 +13996,10 @@ packages: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} engines: {node: '>=0.10.0'} + is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -13801,6 +14007,10 @@ packages: is-finalizationregistry@1.0.2: resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -13817,6 +14027,10 @@ packages: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} + is-glob@3.1.0: + resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} + engines: {node: '>=0.10.0'} + is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -13865,6 +14079,10 @@ packages: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} + is-number@3.0.0: + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} + engines: {node: '>=0.10.0'} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -14018,6 +14236,10 @@ packages: iso8601-duration@1.3.0: resolution: {integrity: sha512-K4CiUBzo3YeWk76FuET/dQPH03WE04R94feo5TSKQCXpoXQt9E4yx2CnY737QZnSAI3PI4WlKo/zfqizGx52QQ==} + isobject@2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} + engines: {node: '>=0.10.0'} + isobject@3.0.1: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} @@ -14283,6 +14505,14 @@ packages: khroma@2.1.0: resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + + kind-of@4.0.0: + resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} + engines: {node: '>=0.10.0'} + kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -14559,6 +14789,10 @@ packages: localforage@1.10.0: resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -14759,6 +14993,10 @@ packages: resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} engines: {node: '>=0.10.0'} + map-visit@1.0.0: + resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} + engines: {node: '>=0.10.0'} + markdown-extensions@2.0.0: resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} engines: {node: '>=16'} @@ -15024,6 +15262,10 @@ packages: micromark@4.0.0: resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + micromatch@3.1.10: + resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} + engines: {node: '>=0.10.0'} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -15193,6 +15435,10 @@ packages: resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} engines: {node: '>= 18'} + mixin-deep@1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} + mj-context-menu@0.6.1: resolution: {integrity: sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==} @@ -15395,6 +15641,10 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanomatch@1.2.13: + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} + engines: {node: '>=0.10.0'} + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -15640,6 +15890,10 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + object-copy@0.1.0: + resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} + engines: {node: '>=0.10.0'} + object-hash@3.0.0: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} @@ -15664,6 +15918,10 @@ packages: resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} engines: {node: '>= 10'} + object-visit@1.0.1: + resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} + engines: {node: '>=0.10.0'} + object.assign@4.1.5: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} @@ -15682,6 +15940,10 @@ packages: object.hasown@1.1.2: resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} + object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + object.values@1.1.7: resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} engines: {node: '>= 0.4'} @@ -15815,6 +16077,10 @@ packages: resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==} engines: {node: '>=18'} + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -15884,6 +16150,9 @@ packages: package-manager-detector@1.3.0: resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} + packet-reader@1.0.0: + resolution: {integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==} + pacote@17.0.6: resolution: {integrity: sha512-cJKrW21VRE8vVTRskJo78c/RCvwJCn1f4qgfxL4w77SOWrTCRcmfkYHlHtS0gqpgjv3zhXflRtgsrUCX5xwNnQ==} engines: {node: ^16.14.0 || >=18.0.0} @@ -15959,6 +16228,10 @@ packages: pascal-case@3.1.2: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + pascalcase@0.1.1: + resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} + engines: {node: '>=0.10.0'} + password-prompt@1.1.3: resolution: {integrity: sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw==} @@ -15975,6 +16248,13 @@ packages: path-data-parser@0.1.0: resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} + path-dirname@1.0.2: + resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -16052,6 +16332,9 @@ packages: pg-cloudflare@1.1.1: resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} + pg-connection-string@0.1.3: + resolution: {integrity: sha512-i0NV/CrSkFTaiOQs9AGy3tq0dkSjtTd4d7DfsjeDVZAA4aIHInwfFEmriNYGGJUfZ5x6IAC/QddoUpUJjQAi0w==} + pg-connection-string@2.9.1: resolution: {integrity: sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==} @@ -16083,6 +16366,14 @@ packages: resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==} engines: {node: '>=4'} + pg-packet-stream@1.1.0: + resolution: {integrity: sha512-kRBH0tDIW/8lfnnOyTwKD23ygJ/kexQVXZs7gEyBljw4FYqimZFxnMMx50ndZ8In77QgfGuItS5LLclC2TtjYg==} + + pg-pool@2.0.10: + resolution: {integrity: sha512-qdwzY92bHf3nwzIUcj+zJ0Qo5lpG/YxchahxIN8+ZVmXqkahKXsnl2aiJPHLYN9o5mB/leG+Xh6XKxtP7e0sjg==} + peerDependencies: + pg: '>5.0' + pg-pool@3.7.0: resolution: {integrity: sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==} peerDependencies: @@ -16110,6 +16401,10 @@ packages: resolution: {integrity: sha512-hRCSDuLII9/LE3smys1hRHcu5QGcLs9ggT7I/TCs0IE+2Eesxi9+9RWAAwZ0yaGjxoWICF/YHLOEjydGujoJ+g==} engines: {node: '>=10'} + pg@7.18.2: + resolution: {integrity: sha512-Mvt0dGYMwvEADNKy5PMQGlzPudKcKKzJds/VbOeZJpb6f/pI3mmoXX0JksPgI3l3JPP/2Apq7F36O63J7mgveA==} + engines: {node: '>= 4.5.0'} + pg@8.13.1: resolution: {integrity: sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==} engines: {node: '>= 8.0.0'} @@ -16203,6 +16498,10 @@ packages: points-on-path@0.2.1: resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} + posix-character-classes@0.1.1: + resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} + engines: {node: '>=0.10.0'} + postcss-import@15.1.0: resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} @@ -16895,6 +17194,10 @@ packages: resolution: {integrity: sha512-kDMOq0qLtxV9f/SQv522h8cxZBqNZXuXNyjyezmfAAuribMyVXziljpQ/uQhfE1XLg2/TLTW2DsnoE4VAi/krg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + readdirp@2.2.1: + resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} + engines: {node: '>=0.10'} + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -16963,6 +17266,10 @@ packages: regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + regex-not@1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} + regex-recursion@5.1.1: resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==} @@ -17061,6 +17368,14 @@ packages: remove-trailing-spaces@1.0.9: resolution: {integrity: sha512-xzG7w5IRijvIkHIjDk65URsJJ7k4J95wmcArY5PRcmjldIOl7oTvG8+X2Ag690R7SfwiOcHrWZKVc1Pp5WIOzA==} + repeat-element@1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + + repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + request-progress@3.0.0: resolution: {integrity: sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==} @@ -17100,6 +17415,10 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve-url@0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + resolve.exports@2.0.2: resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} engines: {node: '>=10'} @@ -17250,6 +17569,9 @@ packages: safe-regex2@5.0.0: resolution: {integrity: sha512-YwJwe5a51WlK7KbOJREPdjNrpViQBI3p4T50lfwPuDhZnE3XGVTlGvi+aolc5+RvxDD6bnUmjVsU9n1eboLUYw==} + safe-regex@1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + safe-stable-stringify@2.5.0: resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} engines: {node: '>=10'} @@ -17290,6 +17612,10 @@ packages: semver-compare@1.0.0: resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + semver@4.3.2: + resolution: {integrity: sha512-VyFUffiBx8hABJ9HYSTXLRwyZtdDHMzMtFmID1aiNAD2BZppBmJm0Hqw3p2jkgxP9BNt1pQ9RnC49P0EcXf6cA==} + hasBin: true + semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -17379,6 +17705,10 @@ packages: resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} engines: {node: '>= 0.4'} + set-value@2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + set-value@4.1.0: resolution: {integrity: sha512-zTEg4HL0RwVrqcWs3ztF+x1vkxfm0lP+MQQFPiMJTKVceBwEV0A569Ou8l9IYQG8jOZdMVI1hGsc0tmeD2o/Lw==} engines: {node: '>=11.0'} @@ -17529,6 +17859,18 @@ packages: snake-case@3.0.4: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + snapdragon-node@2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} + engines: {node: '>=0.10.0'} + + snapdragon-util@3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} + engines: {node: '>=0.10.0'} + + snapdragon@0.8.2: + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} + engines: {node: '>=0.10.0'} + snarkdown@2.0.0: resolution: {integrity: sha512-MgL/7k/AZdXCTJiNgrO7chgDqaB9FGM/1Tvlcenenb7div6obaDATzs16JhFyHHBGodHT3B7RzRc5qk8pFhg3A==} @@ -17575,9 +17917,17 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map-resolve@0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map-url@0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} @@ -17632,6 +17982,10 @@ packages: resolution: {integrity: sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==} engines: {node: '>=12'} + split-string@3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + split2@4.1.0: resolution: {integrity: sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==} engines: {node: '>= 10.x'} @@ -17678,6 +18032,10 @@ packages: state-local@1.0.7: resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} + static-extend@0.1.2: + resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} + engines: {node: '>=0.10.0'} + statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} @@ -17717,6 +18075,10 @@ packages: string-template@0.2.1: resolution: {integrity: sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==} + string-width@3.1.0: + resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} + engines: {node: '>=6'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -17766,6 +18128,10 @@ packages: resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} engines: {node: '>=4'} + strip-ansi@5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -18080,10 +18446,22 @@ packages: resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} engines: {node: '>=14.14'} + to-object-path@0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} + engines: {node: '>=0.10.0'} + + to-regex-range@2.1.1: + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} + engines: {node: '>=0.10.0'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + to-regex@3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} + toad-cache@3.7.0: resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} engines: {node: '>=12'} @@ -18194,6 +18572,9 @@ packages: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + tslib@2.3.0: resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} @@ -18418,6 +18799,10 @@ packages: unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + union-value@1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + unique-filename@3.0.0: resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -18499,6 +18884,10 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + unset-value@1.0.0: + resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} + engines: {node: '>=0.10.0'} + until-async@3.0.2: resolution: {integrity: sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==} @@ -18534,6 +18923,10 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + urix@0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} @@ -18632,6 +19025,10 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + use@3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} + engines: {node: '>=0.10.0'} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -18998,6 +19395,10 @@ packages: '@cloudflare/workers-types': optional: true + wrap-ansi@5.1.0: + resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} + engines: {node: '>=6'} + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -19084,6 +19485,9 @@ packages: engines: {node: '>= 14'} hasBin: true + yargs-parser@13.1.2: + resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} + yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} @@ -19096,6 +19500,9 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs@13.3.2: + resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} + yargs@15.4.1: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} @@ -22747,6 +23154,56 @@ snapshots: - winston - ws + '@graphql-hive/gateway-runtime@2.5.0(graphql@16.12.0)(pino@10.3.0)(ws@8.18.0)': + dependencies: + '@envelop/core': 5.5.1 + '@envelop/disable-introspection': 9.0.0(@envelop/core@5.5.1)(graphql@16.12.0) + '@envelop/generic-auth': 11.0.0(@envelop/core@5.5.1)(graphql@16.12.0) + '@envelop/instrumentation': 1.0.0 + '@graphql-hive/core': 0.18.0(graphql@16.12.0)(pino@10.3.0) + '@graphql-hive/logger': 1.0.9(pino@10.3.0) + '@graphql-hive/pubsub': 2.1.1(ioredis@5.8.2) + '@graphql-hive/signal': 2.0.0 + '@graphql-hive/yoga': 0.46.0(graphql-yoga@5.17.1(graphql@16.12.0))(graphql@16.12.0)(pino@10.3.0) + '@graphql-mesh/cross-helpers': 0.4.10(graphql@16.12.0) + '@graphql-mesh/fusion-runtime': 1.6.2(@types/node@25.0.2)(graphql@16.12.0)(pino@10.3.0) + '@graphql-mesh/hmac-upstream-signature': 2.0.8(graphql@16.12.0) + '@graphql-mesh/plugin-response-cache': 0.104.18(graphql@16.12.0) + '@graphql-mesh/transport-common': 1.0.12(graphql@16.12.0)(pino@10.3.0) + '@graphql-mesh/types': 0.104.16(graphql@16.12.0)(ioredis@5.8.2) + '@graphql-mesh/utils': 0.104.16(graphql@16.12.0) + '@graphql-tools/batch-delegate': 10.0.8(graphql@16.12.0) + '@graphql-tools/delegate': 12.0.2(graphql@16.12.0) + '@graphql-tools/executor-common': 1.0.5(graphql@16.12.0) + '@graphql-tools/executor-http': 3.0.7(@types/node@25.0.2)(graphql@16.12.0) + '@graphql-tools/federation': 4.2.6(@types/node@25.0.2)(graphql@16.12.0) + '@graphql-tools/stitch': 10.1.6(graphql@16.12.0) + '@graphql-tools/utils': 10.11.0(graphql@16.12.0) + '@graphql-tools/wrap': 11.1.2(graphql@16.12.0) + '@graphql-yoga/plugin-apollo-usage-report': 0.12.1(@envelop/core@5.5.1)(graphql-yoga@5.17.1(graphql@16.12.0))(graphql@16.12.0) + '@graphql-yoga/plugin-csrf-prevention': 3.16.2(graphql-yoga@5.17.1(graphql@16.12.0)) + '@graphql-yoga/plugin-defer-stream': 3.16.2(graphql-yoga@5.17.1(graphql@16.12.0))(graphql@16.12.0) + '@graphql-yoga/plugin-persisted-operations': 3.16.2(graphql-yoga@5.17.1(graphql@16.12.0))(graphql@16.12.0) + '@types/node': 25.0.2 + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/promise-helpers': 1.3.2 + '@whatwg-node/server': 0.10.17 + '@whatwg-node/server-plugin-cookies': 1.0.5 + graphql: 16.12.0 + graphql-ws: 6.0.6(graphql@16.12.0)(ws@8.18.0) + graphql-yoga: 5.17.1(graphql@16.12.0) + tslib: 2.8.1 + transitivePeerDependencies: + - '@fastify/websocket' + - '@logtape/logtape' + - '@nats-io/nats-core' + - crossws + - ioredis + - pino + - uWebSockets.js + - winston + - ws + '@graphql-hive/gateway-runtime@2.5.0(graphql@16.9.0)(ioredis@5.8.2)(pino@10.3.0)(ws@8.18.0)': dependencies: '@envelop/core': 5.5.1 @@ -22932,6 +23389,45 @@ snapshots: - winston - ws + '@graphql-hive/plugin-opentelemetry@1.3.0(encoding@0.1.13)(graphql@16.12.0)(pino@10.3.0)(ws@8.18.0)': + dependencies: + '@graphql-hive/core': 0.18.0(graphql@16.12.0)(pino@10.3.0) + '@graphql-hive/gateway-runtime': 2.5.0(graphql@16.12.0)(pino@10.3.0)(ws@8.18.0) + '@graphql-hive/logger': 1.0.9(pino@10.3.0) + '@graphql-mesh/cross-helpers': 0.4.10(graphql@16.12.0) + '@graphql-mesh/transport-common': 1.0.12(graphql@16.12.0)(pino@10.3.0) + '@graphql-mesh/types': 0.104.16(graphql@16.12.0)(ioredis@5.8.2) + '@graphql-mesh/utils': 0.104.16(graphql@16.12.0) + '@graphql-tools/utils': 10.11.0(graphql@16.12.0) + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.208.0 + '@opentelemetry/auto-instrumentations-node': 0.67.2(@opentelemetry/api@1.9.0)(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(encoding@0.1.13) + '@opentelemetry/context-async-hooks': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-grpc': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/exporter-trace-otlp-http': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-logs': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-node': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + '@whatwg-node/promise-helpers': 1.3.2 + graphql: 16.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - '@fastify/websocket' + - '@logtape/logtape' + - '@nats-io/nats-core' + - crossws + - encoding + - ioredis + - pino + - supports-color + - uWebSockets.js + - winston + - ws + '@graphql-hive/plugin-opentelemetry@1.3.0(encoding@0.1.13)(graphql@16.9.0)(ioredis@5.8.2)(pino@10.3.0)(ws@8.18.0)': dependencies: '@graphql-hive/core': 0.18.0(graphql@16.9.0)(pino@10.3.0) @@ -23412,6 +23908,37 @@ snapshots: - pino - winston + '@graphql-mesh/fusion-runtime@1.6.2(@types/node@25.0.2)(graphql@16.12.0)(pino@10.3.0)': + dependencies: + '@envelop/core': 5.5.1 + '@envelop/instrumentation': 1.0.0 + '@graphql-hive/logger': 1.0.9(pino@10.3.0) + '@graphql-mesh/cross-helpers': 0.4.10(graphql@16.12.0) + '@graphql-mesh/transport-common': 1.0.12(graphql@16.12.0)(pino@10.3.0) + '@graphql-mesh/types': 0.104.16(graphql@16.12.0)(ioredis@5.8.2) + '@graphql-mesh/utils': 0.104.16(graphql@16.12.0) + '@graphql-tools/batch-execute': 10.0.4(graphql@16.12.0) + '@graphql-tools/delegate': 12.0.2(graphql@16.12.0) + '@graphql-tools/executor': 1.5.0(graphql@16.12.0) + '@graphql-tools/federation': 4.2.6(@types/node@25.0.2)(graphql@16.12.0) + '@graphql-tools/merge': 9.1.5(graphql@16.12.0) + '@graphql-tools/stitch': 10.1.6(graphql@16.12.0) + '@graphql-tools/stitching-directives': 4.0.8(graphql@16.12.0) + '@graphql-tools/utils': 10.11.0(graphql@16.12.0) + '@graphql-tools/wrap': 11.1.2(graphql@16.12.0) + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/promise-helpers': 1.3.2 + graphql: 16.12.0 + graphql-yoga: 5.17.1(graphql@16.12.0) + tslib: 2.8.1 + transitivePeerDependencies: + - '@logtape/logtape' + - '@nats-io/nats-core' + - '@types/node' + - ioredis + - pino + - winston + '@graphql-mesh/fusion-runtime@1.6.2(@types/node@25.0.2)(graphql@16.9.0)(ioredis@5.8.2)(pino@10.3.0)': dependencies: '@envelop/core': 5.5.1 @@ -23443,6 +23970,21 @@ snapshots: - pino - winston + '@graphql-mesh/hmac-upstream-signature@2.0.8(graphql@16.12.0)': + dependencies: + '@graphql-mesh/cross-helpers': 0.4.10(graphql@16.12.0) + '@graphql-mesh/types': 0.104.16(graphql@16.12.0)(ioredis@5.8.2) + '@graphql-mesh/utils': 0.104.16(graphql@16.12.0) + '@graphql-tools/executor-common': 1.0.5(graphql@16.12.0) + '@graphql-tools/utils': 10.10.3(graphql@16.12.0) + '@whatwg-node/promise-helpers': 1.3.2 + graphql: 16.12.0 + json-stable-stringify: 1.3.0 + tslib: 2.8.1 + transitivePeerDependencies: + - '@nats-io/nats-core' + - ioredis + '@graphql-mesh/hmac-upstream-signature@2.0.8(graphql@16.12.0)(ioredis@5.8.2)': dependencies: '@graphql-mesh/cross-helpers': 0.4.10(graphql@16.12.0) @@ -23552,6 +24094,25 @@ snapshots: - '@nats-io/nats-core' - ioredis + '@graphql-mesh/plugin-response-cache@0.104.18(graphql@16.12.0)': + dependencies: + '@envelop/core': 5.5.1 + '@envelop/response-cache': 9.0.0(@envelop/core@5.5.1)(graphql@16.12.0) + '@graphql-mesh/cross-helpers': 0.4.10(graphql@16.12.0) + '@graphql-mesh/string-interpolation': 0.5.9(graphql@16.12.0) + '@graphql-mesh/types': 0.104.16(graphql@16.12.0)(ioredis@5.8.2) + '@graphql-mesh/utils': 0.104.16(graphql@16.12.0) + '@graphql-tools/utils': 10.9.1(graphql@16.12.0) + '@graphql-yoga/plugin-response-cache': 3.15.4(graphql-yoga@5.17.1(graphql@16.12.0))(graphql@16.12.0) + '@whatwg-node/promise-helpers': 1.3.2 + cache-control-parser: 2.0.6 + graphql: 16.12.0 + graphql-yoga: 5.17.1(graphql@16.12.0) + tslib: 2.8.1 + transitivePeerDependencies: + - '@nats-io/nats-core' + - ioredis + '@graphql-mesh/plugin-response-cache@0.104.18(graphql@16.12.0)(ioredis@5.8.2)': dependencies: '@envelop/core': 5.5.1 @@ -23639,6 +24200,25 @@ snapshots: - pino - winston + '@graphql-mesh/transport-common@1.0.12(graphql@16.12.0)(pino@10.3.0)': + dependencies: + '@envelop/core': 5.5.1 + '@graphql-hive/logger': 1.0.9(pino@10.3.0) + '@graphql-hive/pubsub': 2.1.1(ioredis@5.8.2) + '@graphql-hive/signal': 2.0.0 + '@graphql-mesh/types': 0.104.16(graphql@16.12.0)(ioredis@5.8.2) + '@graphql-tools/executor': 1.4.13(graphql@16.12.0) + '@graphql-tools/executor-common': 1.0.5(graphql@16.12.0) + '@graphql-tools/utils': 10.11.0(graphql@16.12.0) + graphql: 16.12.0 + tslib: 2.8.1 + transitivePeerDependencies: + - '@logtape/logtape' + - '@nats-io/nats-core' + - ioredis + - pino + - winston + '@graphql-mesh/transport-common@1.0.12(graphql@16.9.0)(ioredis@5.8.2)(pino@10.3.0)': dependencies: '@envelop/core': 5.5.1 @@ -23755,6 +24335,30 @@ snapshots: - '@nats-io/nats-core' - ioredis + '@graphql-mesh/utils@0.104.16(graphql@16.12.0)': + dependencies: + '@envelop/instrumentation': 1.0.0 + '@graphql-mesh/cross-helpers': 0.4.10(graphql@16.12.0) + '@graphql-mesh/string-interpolation': 0.5.9(graphql@16.12.0) + '@graphql-mesh/types': 0.104.16(graphql@16.12.0)(ioredis@5.8.2) + '@graphql-tools/batch-delegate': 10.0.5(graphql@16.12.0) + '@graphql-tools/delegate': 11.1.3(graphql@16.12.0) + '@graphql-tools/utils': 10.9.1(graphql@16.12.0) + '@graphql-tools/wrap': 11.0.5(graphql@16.12.0) + '@whatwg-node/disposablestack': 0.0.6 + '@whatwg-node/fetch': 0.10.13 + '@whatwg-node/promise-helpers': 1.3.1 + dset: 3.1.4 + graphql: 16.12.0 + js-yaml: 4.1.1 + lodash.get: 4.4.2 + lodash.topath: 4.5.2 + tiny-lru: 11.4.7 + tslib: 2.8.1 + transitivePeerDependencies: + - '@nats-io/nats-core' + - ioredis + '@graphql-mesh/utils@0.104.16(graphql@16.12.0)(ioredis@5.8.2)': dependencies: '@envelop/instrumentation': 1.0.0 @@ -30897,8 +31501,8 @@ snapshots: '@typescript-eslint/parser': 7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3) eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) eslint-config-prettier: 9.1.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-plugin-import@2.29.1)(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) eslint-plugin-jsonc: 2.11.1(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) eslint-plugin-mdx: 3.0.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) @@ -31068,6 +31672,11 @@ snapshots: dependencies: '@types/deep-eql': 4.0.2 + '@types/chokidar@1.7.5': + dependencies: + '@types/events': 3.0.3 + '@types/node': 22.10.5 + '@types/cli-progress@3.11.5': dependencies: '@types/node': 22.10.5 @@ -31217,10 +31826,6 @@ snapshots: dependencies: '@types/ms': 0.7.34 - '@types/debug@4.1.7': - dependencies: - '@types/ms': 0.7.34 - '@types/deep-eql@4.0.2': {} '@types/docker-modem@3.0.2': @@ -31253,6 +31858,8 @@ snapshots: '@types/estree@1.0.8': {} + '@types/events@3.0.3': {} + '@types/express-serve-static-core@4.19.6': dependencies: '@types/node': 22.10.5 @@ -31423,6 +32030,12 @@ snapshots: dependencies: '@types/pg': 8.11.10 + '@types/pg@7.14.11': + dependencies: + '@types/node': 22.10.5 + pg-protocol: 1.7.0 + pg-types: 2.2.0 + '@types/pg@8.11.10': dependencies: '@types/node': 22.10.5 @@ -31993,10 +32606,16 @@ snapshots: dependencies: environment: 1.1.0 + ansi-regex@4.1.1: {} + ansi-regex@5.0.1: {} ansi-regex@6.0.1: {} + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -32013,6 +32632,13 @@ snapshots: any-promise@1.3.0: {} + anymatch@2.0.0: + dependencies: + micromatch: 3.1.10 + normalize-path: 2.1.1 + transitivePeerDependencies: + - supports-color + anymatch@3.1.2: dependencies: normalize-path: 3.0.0 @@ -32070,6 +32696,12 @@ snapshots: dependencies: dequal: 2.0.3 + arr-diff@4.0.0: {} + + arr-flatten@1.1.0: {} + + arr-union@3.1.0: {} + array-buffer-byte-length@1.0.0: dependencies: call-bind: 1.0.7 @@ -32089,6 +32721,8 @@ snapshots: array-union@2.1.0: {} + array-unique@0.3.2: {} + array.prototype.findlastindex@1.2.3: dependencies: call-bind: 1.0.7 @@ -32151,6 +32785,8 @@ snapshots: assert-plus@1.0.0: {} + assign-symbols@1.0.0: {} + ast-types-flow@0.0.8: {} ast-types@0.13.4: @@ -32161,6 +32797,8 @@ snapshots: astring@1.9.0: {} + async-each@1.0.6: {} + async-mutex@0.5.0: dependencies: tslib: 2.8.1 @@ -32179,6 +32817,8 @@ snapshots: at-least-node@1.0.0: {} + atob@2.1.2: {} + atomic-sleep@1.0.0: {} auto-bind@4.0.0: {} @@ -32261,6 +32901,16 @@ snapshots: base64-js@1.5.1: {} + base@0.11.2: + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.1 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + baseline-browser-mapping@2.8.3: {} baseline-browser-mapping@2.9.4: {} @@ -32309,8 +32959,15 @@ snapshots: read-cmd-shim: 4.0.0 write-file-atomic: 5.0.1 + binary-extensions@1.13.1: {} + binary-extensions@2.2.0: {} + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + optional: true + bintrees@1.0.2: {} bl@4.1.0: @@ -32432,6 +33089,21 @@ snapshots: dependencies: balanced-match: 4.0.3 + braces@2.3.2: + dependencies: + arr-flatten: 1.1.0 + array-unique: 0.3.2 + extend-shallow: 2.0.1 + fill-range: 4.0.0 + isobject: 3.0.1 + repeat-element: 1.1.4 + snapdragon: 0.8.2 + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -32466,6 +33138,8 @@ snapshots: buffer-from@1.1.2: {} + buffer-writer@2.0.0: {} + buffer@5.7.1: dependencies: base64-js: 1.5.1 @@ -32559,6 +33233,18 @@ snapshots: tar: 7.5.9 unique-filename: 3.0.0 + cache-base@1.0.1: + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.1 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + cache-content-type@1.0.1: dependencies: mime-types: 2.1.35 @@ -32777,6 +33463,24 @@ snapshots: '@chevrotain/utils': 11.0.3 lodash-es: 4.17.23 + chokidar@2.1.8: + dependencies: + anymatch: 2.0.0 + async-each: 1.0.6 + braces: 2.3.2 + glob-parent: 3.1.0 + inherits: 2.0.4 + is-binary-path: 1.0.1 + is-glob: 4.0.3 + normalize-path: 3.0.0 + path-is-absolute: 1.0.1 + readdirp: 2.2.1 + upath: 1.2.0 + optionalDependencies: + fsevents: 1.2.13 + transitivePeerDependencies: + - supports-color + chokidar@3.6.0: dependencies: anymatch: 3.1.2 @@ -32803,6 +33507,13 @@ snapshots: cjs-module-lexer@1.2.3: {} + class-utils@0.3.6: + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + class-variance-authority@0.7.1: dependencies: clsx: 2.1.1 @@ -32884,6 +33595,12 @@ snapshots: is-wsl: 3.1.0 is64bit: 2.0.0 + cliui@5.0.0: + dependencies: + string-width: 3.1.0 + strip-ansi: 5.2.0 + wrap-ansi: 5.1.0 + cliui@6.0.0: dependencies: string-width: 4.2.3 @@ -32942,10 +33659,21 @@ snapshots: collapse-white-space@2.1.0: {} + collection-visit@1.0.0: + dependencies: + map-visit: 1.0.0 + object-visit: 1.0.1 + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + color-convert@2.0.1: dependencies: color-name: 1.1.4 + color-name@1.1.3: {} + color-name@1.1.4: {} color-string@1.9.1: @@ -32990,6 +33718,8 @@ snapshots: common-tags@1.8.2: {} + component-emitter@1.3.1: {} + compressible@2.0.18: dependencies: mime-db: 1.54.0 @@ -33074,6 +33804,8 @@ snapshots: is-what: 3.14.1 optional: true + copy-descriptor@0.1.1: {} + copy-to-clipboard@3.3.3: dependencies: toggle-selection: 1.0.6 @@ -33519,6 +34251,8 @@ snapshots: dependencies: character-entities: 2.0.2 + decode-uri-component@0.2.2: {} + decode-uri-component@0.4.1: {} decompress-response@6.0.0: @@ -33590,6 +34324,19 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 + define-property@0.2.5: + dependencies: + is-descriptor: 0.1.7 + + define-property@1.0.0: + dependencies: + is-descriptor: 1.0.3 + + define-property@2.0.2: + dependencies: + is-descriptor: 1.0.3 + isobject: 3.0.1 + defu@6.1.4: {} degenerator@5.0.1: @@ -33801,6 +34548,8 @@ snapshots: emoji-regex@10.3.0: {} + emoji-regex@7.0.3: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -34045,13 +34794,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-plugin-import@2.29.1)(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): dependencies: debug: 4.4.3(supports-color@8.1.1) enhanced-resolve: 5.17.1 eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) - eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) fast-glob: 3.3.2 get-tsconfig: 4.7.5 is-core-module: 2.13.1 @@ -34082,14 +34831,14 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): + eslint-module-utils@2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): dependencies: debug: 3.2.7(supports-color@8.1.1) optionalDependencies: '@typescript-eslint/parser': 7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3) eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-plugin-import@2.29.1)(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) transitivePeerDependencies: - supports-color @@ -34121,7 +34870,7 @@ snapshots: eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) eslint-compat-utils: 0.1.2(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): dependencies: array-includes: 3.1.7 array.prototype.findlastindex: 1.2.3 @@ -34131,7 +34880,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -34453,6 +35202,18 @@ snapshots: exit-hook@2.2.1: {} + expand-brackets@2.1.4: + dependencies: + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + posix-character-classes: 0.1.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + expect-type@1.2.2: {} exponential-backoff@3.1.1: {} @@ -34499,10 +35260,28 @@ snapshots: dependencies: is-extendable: 0.1.1 + extend-shallow@3.0.2: + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + extend@3.0.2: {} extendable-error@0.1.7: {} + extglob@2.0.4: + dependencies: + array-unique: 0.3.2 + define-property: 1.0.0 + expand-brackets: 2.1.4 + extend-shallow: 2.0.1 + fragment-cache: 0.2.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + extract-files@11.0.0: {} extract-zip@2.0.1(supports-color@8.1.1): @@ -34688,12 +35467,22 @@ snapshots: dependencies: flat-cache: 3.0.4 + file-uri-to-path@1.0.0: + optional: true + filelist@1.0.4: dependencies: minimatch: 5.1.6 filesize@6.4.0: {} + fill-range@4.0.0: + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -34733,6 +35522,10 @@ snapshots: find-up-simple@1.0.1: {} + find-up@3.0.0: + dependencies: + locate-path: 3.0.0 + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -34766,6 +35559,8 @@ snapshots: dependencies: is-callable: 1.2.7 + for-in@1.0.2: {} + foreach@2.0.6: {} foreground-child@3.1.1: @@ -34825,6 +35620,10 @@ snapshots: forwarded@0.2.0: {} + fragment-cache@0.2.1: + dependencies: + map-cache: 0.2.2 + framer-motion@10.18.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: tslib: 2.8.1 @@ -34886,6 +35685,12 @@ snapshots: fs.realpath@1.0.0: {} + fsevents@1.2.13: + dependencies: + bindings: 1.5.0 + nan: 2.18.0 + optional: true + fsevents@2.3.2: optional: true @@ -35015,6 +35820,8 @@ snapshots: transitivePeerDependencies: - supports-color + get-value@2.0.6: {} + get-value@3.0.1: dependencies: isobject: 3.0.1 @@ -35035,6 +35842,11 @@ snapshots: github-slugger@2.0.0: {} + glob-parent@3.1.0: + dependencies: + is-glob: 3.1.0 + path-dirname: 1.0.2 + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -35208,6 +36020,20 @@ snapshots: transitivePeerDependencies: - supports-color + graphile-worker@0.1.0: + dependencies: + '@types/chokidar': 1.7.5 + '@types/debug': 4.1.12 + '@types/pg': 7.14.11 + chokidar: 2.1.8 + debug: 4.4.3(supports-color@8.1.1) + pg: 7.18.2 + pg-connection-string: 2.9.1 + tslib: 1.14.1 + yargs: 13.3.2 + transitivePeerDependencies: + - supports-color + graphile-worker@0.16.6(typescript@5.7.3): dependencies: '@graphile/logger': 0.2.0 @@ -35599,6 +36425,25 @@ snapshots: has-unicode@2.0.1: {} + has-value@0.3.1: + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + + has-value@1.0.0: + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + + has-values@0.1.4: {} + + has-values@1.0.0: + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + has@1.0.3: dependencies: function-bind: 1.1.2 @@ -36165,6 +37010,10 @@ snapshots: is-relative: 1.0.0 is-windows: 1.0.2 + is-accessor-descriptor@1.0.1: + dependencies: + hasown: 2.0.2 + is-alphabetical@1.0.4: {} is-alphabetical@2.0.1: {} @@ -36202,6 +37051,10 @@ snapshots: dependencies: has-bigints: 1.0.2 + is-binary-path@1.0.1: + dependencies: + binary-extensions: 1.13.1 + is-binary-path@2.1.0: dependencies: binary-extensions: 2.2.0 @@ -36227,6 +37080,10 @@ snapshots: dependencies: hasown: 2.0.2 + is-data-descriptor@1.0.1: + dependencies: + hasown: 2.0.2 + is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.2 @@ -36235,6 +37092,16 @@ snapshots: is-decimal@2.0.1: {} + is-descriptor@0.1.7: + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + + is-descriptor@1.0.3: + dependencies: + is-accessor-descriptor: 1.0.1 + is-data-descriptor: 1.0.1 + is-docker@2.2.1: {} is-docker@3.0.0: {} @@ -36245,12 +37112,18 @@ snapshots: is-extendable@0.1.1: {} + is-extendable@1.0.1: + dependencies: + is-plain-object: 2.0.4 + is-extglob@2.1.1: {} is-finalizationregistry@1.0.2: dependencies: call-bind: 1.0.7 + is-fullwidth-code-point@2.0.0: {} + is-fullwidth-code-point@3.0.0: {} is-fullwidth-code-point@4.0.0: {} @@ -36263,6 +37136,10 @@ snapshots: dependencies: has-tostringtag: 1.0.2 + is-glob@3.1.0: + dependencies: + is-extglob: 2.1.1 + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -36300,6 +37177,10 @@ snapshots: dependencies: has-tostringtag: 1.0.2 + is-number@3.0.0: + dependencies: + kind-of: 3.2.2 + is-number@7.0.0: {} is-obj@1.0.1: {} @@ -36419,6 +37300,10 @@ snapshots: iso8601-duration@1.3.0: {} + isobject@2.1.0: + dependencies: + isarray: 1.0.0 + isobject@3.0.1: {} isomorphic-ws@5.0.0(ws@8.18.0): @@ -36699,6 +37584,14 @@ snapshots: khroma@2.1.0: {} + kind-of@3.2.2: + dependencies: + is-buffer: 1.1.6 + + kind-of@4.0.0: + dependencies: + is-buffer: 1.1.6 + kind-of@6.0.3: {} klaw@4.1.0: {} @@ -36979,6 +37872,11 @@ snapshots: dependencies: lie: 3.1.1 + locate-path@3.0.0: + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -37178,6 +38076,10 @@ snapshots: map-cache@0.2.2: {} + map-visit@1.0.0: + dependencies: + object-visit: 1.0.1 + markdown-extensions@2.0.0: {} markdown-it@14.1.1: @@ -37745,7 +38647,7 @@ snapshots: micromark@4.0.0: dependencies: - '@types/debug': 4.1.7 + '@types/debug': 4.1.12 debug: 4.4.3(supports-color@8.1.1) decode-named-character-reference: 1.0.2 devlop: 1.1.0 @@ -37765,6 +38667,24 @@ snapshots: transitivePeerDependencies: - supports-color + micromatch@3.1.10: + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + extglob: 2.0.4 + fragment-cache: 0.2.1 + kind-of: 6.0.3 + nanomatch: 1.2.13 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -37911,6 +38831,11 @@ snapshots: dependencies: minipass: 7.1.3 + mixin-deep@1.3.2: + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + mj-context-menu@0.6.1: {} mjml-accordion@4.14.0(encoding@0.1.13): @@ -38326,6 +39251,22 @@ snapshots: nanoid@3.3.8: {} + nanomatch@1.2.13: + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + fragment-cache: 0.2.1 + is-windows: 1.0.2 + kind-of: 6.0.3 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + natural-compare@1.4.0: {} natural-orderby@2.0.3: {} @@ -38628,6 +39569,12 @@ snapshots: object-assign@4.1.1: {} + object-copy@0.1.0: + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + object-hash@3.0.0: {} object-inspect@1.13.2: {} @@ -38643,6 +39590,10 @@ snapshots: object-treeify@1.1.33: {} + object-visit@1.0.1: + dependencies: + isobject: 3.0.1 + object.assign@4.1.5: dependencies: call-bind: 1.0.7 @@ -38674,6 +39625,10 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.22.3 + object.pick@1.3.0: + dependencies: + isobject: 3.0.1 + object.values@1.1.7: dependencies: call-bind: 1.0.7 @@ -38831,6 +39786,10 @@ snapshots: dependencies: yocto-queue: 1.1.1 + p-locate@3.0.0: + dependencies: + p-limit: 2.3.0 + p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -38904,6 +39863,8 @@ snapshots: package-manager-detector@1.3.0: {} + packet-reader@1.0.0: {} + pacote@17.0.6: dependencies: '@npmcli/git': 5.0.4 @@ -39035,6 +39996,8 @@ snapshots: no-case: 3.0.4 tslib: 2.8.1 + pascalcase@0.1.1: {} + password-prompt@1.1.3: dependencies: ansi-escapes: 4.3.2 @@ -39051,6 +40014,10 @@ snapshots: path-data-parser@0.1.0: {} + path-dirname@1.0.2: {} + + path-exists@3.0.0: {} + path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -39107,6 +40074,8 @@ snapshots: pg-cloudflare@1.1.1: optional: true + pg-connection-string@0.1.3: {} + pg-connection-string@2.9.1: {} pg-copy-streams-binary@2.2.0: @@ -39136,6 +40105,12 @@ snapshots: pg-numeric@1.0.2: {} + pg-packet-stream@1.1.0: {} + + pg-pool@2.0.10(pg@7.18.2): + dependencies: + pg: 7.18.2 + pg-pool@3.7.0(pg@8.13.1): dependencies: pg: 8.13.1 @@ -39175,6 +40150,17 @@ snapshots: postgres-interval: 3.0.0 postgres-range: 1.1.3 + pg@7.18.2: + dependencies: + buffer-writer: 2.0.0 + packet-reader: 1.0.0 + pg-connection-string: 0.1.3 + pg-packet-stream: 1.1.0 + pg-pool: 2.0.10(pg@7.18.2) + pg-types: 2.2.0 + pgpass: 1.0.5 + semver: 4.3.2 + pg@8.13.1: dependencies: pg-connection-string: 2.9.1 @@ -39281,6 +40267,8 @@ snapshots: path-data-parser: 0.1.0 points-on-curve: 0.2.0 + posix-character-classes@0.1.1: {} + postcss-import@15.1.0(postcss@8.4.49): dependencies: postcss: 8.4.49 @@ -39940,6 +40928,14 @@ snapshots: events: 3.3.0 process: 0.11.10 + readdirp@2.2.1: + dependencies: + graceful-fs: 4.2.11 + micromatch: 3.1.10 + readable-stream: 2.3.8 + transitivePeerDependencies: + - supports-color + readdirp@3.6.0: dependencies: picomatch: 2.3.1 @@ -40025,6 +41021,11 @@ snapshots: regenerator-runtime@0.14.1: {} + regex-not@1.0.2: + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + regex-recursion@5.1.1: dependencies: regex: 5.1.1 @@ -40199,6 +41200,10 @@ snapshots: remove-trailing-spaces@1.0.9: {} + repeat-element@1.1.4: {} + + repeat-string@1.6.1: {} + request-progress@3.0.0: dependencies: throttleit: 1.0.1 @@ -40234,6 +41239,8 @@ snapshots: resolve-pkg-maps@1.0.0: {} + resolve-url@0.2.1: {} + resolve.exports@2.0.2: {} resolve@1.22.11: @@ -40449,6 +41456,10 @@ snapshots: dependencies: ret: 0.5.0 + safe-regex@1.1.0: + dependencies: + ret: 0.1.15 + safe-stable-stringify@2.5.0: {} safer-buffer@2.1.2: {} @@ -40481,6 +41492,8 @@ snapshots: semver-compare@1.0.0: {} + semver@4.3.2: {} + semver@5.7.2: {} semver@6.3.1: {} @@ -40594,6 +41607,13 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + set-value@2.0.1: + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + set-value@4.1.0: dependencies: is-plain-object: 2.0.4 @@ -40834,6 +41854,29 @@ snapshots: dot-case: 3.0.4 tslib: 2.8.1 + snapdragon-node@2.1.1: + dependencies: + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 + + snapdragon-util@3.0.1: + dependencies: + kind-of: 3.2.2 + + snapdragon@0.8.2: + dependencies: + base: 0.11.2 + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.3 + use: 3.1.1 + transitivePeerDependencies: + - supports-color + snarkdown@2.0.0: {} socks-proxy-agent@7.0.0: @@ -40900,11 +41943,21 @@ snapshots: source-map-js@1.2.1: {} + source-map-resolve@0.5.3: + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.2 + resolve-url: 0.2.1 + source-map-url: 0.4.1 + urix: 0.1.0 + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 + source-map-url@0.4.1: {} + source-map@0.5.7: {} source-map@0.6.1: {} @@ -40950,6 +42003,10 @@ snapshots: split-on-first@3.0.0: {} + split-string@3.1.0: + dependencies: + extend-shallow: 3.0.2 + split2@4.1.0: {} sponge-case@1.0.1: @@ -41005,6 +42062,11 @@ snapshots: state-local@1.0.7: {} + static-extend@0.1.2: + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 + statuses@1.5.0: {} statuses@2.0.1: {} @@ -41027,6 +42089,12 @@ snapshots: string-template@0.2.1: {} + string-width@3.1.0: + dependencies: + emoji-regex: 7.0.3 + is-fullwidth-code-point: 2.0.0 + strip-ansi: 5.2.0 + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -41106,6 +42174,10 @@ snapshots: is-obj: 1.0.1 is-regexp: 1.0.0 + strip-ansi@5.2.0: + dependencies: + ansi-regex: 4.1.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -41463,10 +42535,26 @@ snapshots: tmp@0.2.5: {} + to-object-path@0.3.0: + dependencies: + kind-of: 3.2.2 + + to-regex-range@2.1.1: + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 + to-regex@3.0.2: + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + toad-cache@3.7.0: {} toggle-selection@1.0.6: {} @@ -41590,6 +42678,8 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 + tslib@1.14.1: {} + tslib@2.3.0: {} tslib@2.4.1: {} @@ -41810,7 +42900,7 @@ snapshots: unified-engine@11.2.0: dependencies: '@types/concat-stream': 2.0.0 - '@types/debug': 4.1.7 + '@types/debug': 4.1.12 '@types/is-empty': 1.2.1 '@types/node': 20.17.1 '@types/unist': 3.0.0 @@ -41843,6 +42933,13 @@ snapshots: trough: 2.1.0 vfile: 6.0.3 + union-value@1.0.1: + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + unique-filename@3.0.0: dependencies: unique-slug: 4.0.0 @@ -41945,6 +43042,11 @@ snapshots: unpipe@1.0.0: {} + unset-value@1.0.0: + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + until-async@3.0.2: {} untildify@4.0.0: {} @@ -41980,6 +43082,8 @@ snapshots: dependencies: punycode: 2.1.1 + urix@0.1.0: {} + url-parse@1.5.10: dependencies: querystringify: 2.2.0 @@ -42062,6 +43166,8 @@ snapshots: react: 19.2.4 optional: true + use@3.1.1: {} + util-deprecate@1.0.2: {} utils-merge@1.0.1: {} @@ -42529,6 +43635,12 @@ snapshots: - bufferutil - utf-8-validate + wrap-ansi@5.1.0: + dependencies: + ansi-styles: 3.2.1 + string-width: 3.1.0 + strip-ansi: 5.2.0 + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -42596,6 +43708,11 @@ snapshots: yaml@2.5.0: {} + yargs-parser@13.1.2: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + yargs-parser@18.1.3: dependencies: camelcase: 5.3.1 @@ -42605,6 +43722,19 @@ snapshots: yargs-parser@21.1.1: {} + yargs@13.3.2: + dependencies: + cliui: 5.0.0 + find-up: 3.0.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 3.1.0 + which-module: 2.0.0 + y18n: 4.0.3 + yargs-parser: 13.1.2 + yargs@15.4.1: dependencies: cliui: 6.0.0 From e26cf7f491835dec16d6241b4d8924ce95464294 Mon Sep 17 00:00:00 2001 From: jdolle <1841898+jdolle@users.noreply.github.com> Date: Tue, 24 Feb 2026 18:30:18 -0800 Subject: [PATCH 20/29] Later version of graphile worker --- packages/libraries/pubsub/package.json | 2 +- pnpm-lock.yaml | 959 +------------------------ 2 files changed, 12 insertions(+), 949 deletions(-) diff --git a/packages/libraries/pubsub/package.json b/packages/libraries/pubsub/package.json index d0840bc346a..4f68bb2e8a1 100644 --- a/packages/libraries/pubsub/package.json +++ b/packages/libraries/pubsub/package.json @@ -44,7 +44,7 @@ "typecheck": "tsc --noEmit" }, "peerDependencies": { - "graphile-worker": "^0.1.0", + "graphile-worker": "^0.16.0", "ioredis": "^5.0.0" }, "dependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 05f425ac845..773fc59de44 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -630,8 +630,8 @@ importers: specifier: 3.0.3 version: 3.0.3(ioredis@5.8.2) graphile-worker: - specifier: ^0.1.0 - version: 0.1.0 + specifier: ^0.16.0 + version: 0.16.6(typescript@5.7.3) graphql-yoga: specifier: 5.13.3 version: 5.13.3(graphql@16.12.0) @@ -9600,9 +9600,6 @@ packages: '@types/chai@5.2.2': resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} - '@types/chokidar@1.7.5': - resolution: {integrity: sha512-PDkSRY7KltW3M60hSBlerxI8SFPXsO3AL/aRVsO4Kh9IHRW74Ih75gUuTd/aE4LSSFqypb10UIX3QzOJwBQMGQ==} - '@types/cli-progress@3.11.5': resolution: {integrity: sha512-D4PbNRbviKyppS5ivBGyFO29POlySLmA2HyUFE4p5QGazAMM3CwkKWcvTl8gvElSuxRh6FPKL8XmidX873ou4g==} @@ -9751,9 +9748,6 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/events@3.0.3': - resolution: {integrity: sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g==} - '@types/express-serve-static-core@4.19.6': resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==} @@ -9913,9 +9907,6 @@ packages: '@types/pg-pool@2.0.6': resolution: {integrity: sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==} - '@types/pg@7.14.11': - resolution: {integrity: sha512-EnZkZ1OMw9DvNfQkn2MTJrwKmhJYDEs5ujWrPfvseWNoI95N8B4HzU/Ltrq5ZfYxDX/Zg8mTzwr6UAyTjjFvXA==} - '@types/pg@8.11.10': resolution: {integrity: sha512-LczQUW4dbOQzsH2RQ5qoeJ6qJPdrcM/DcMLoqWQkMLMsq83J5lAX3LXjdkWdpscFy67JSOWDnh7Ny/sPFykmkg==} @@ -10383,10 +10374,6 @@ packages: resolution: {integrity: sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==} engines: {node: '>=18'} - ansi-regex@4.1.1: - resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} - engines: {node: '>=6'} - ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -10395,10 +10382,6 @@ packages: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -10425,9 +10408,6 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - anymatch@2.0.0: - resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} - anymatch@3.1.2: resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} engines: {node: '>= 8'} @@ -10488,18 +10468,6 @@ packages: aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - arr-diff@4.0.0: - resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} - engines: {node: '>=0.10.0'} - - arr-flatten@1.1.0: - resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} - engines: {node: '>=0.10.0'} - - arr-union@3.1.0: - resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} - engines: {node: '>=0.10.0'} - array-buffer-byte-length@1.0.0: resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} @@ -10517,10 +10485,6 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - array-unique@0.3.2: - resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} - engines: {node: '>=0.10.0'} - array.prototype.findlastindex@1.2.3: resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} engines: {node: '>= 0.4'} @@ -10565,10 +10529,6 @@ packages: resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} engines: {node: '>=0.8'} - assign-symbols@1.0.0: - resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} - engines: {node: '>=0.10.0'} - ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} @@ -10584,9 +10544,6 @@ packages: resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} hasBin: true - async-each@1.0.6: - resolution: {integrity: sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==} - async-mutex@0.5.0: resolution: {integrity: sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==} @@ -10606,11 +10563,6 @@ packages: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} - atob@2.1.2: - resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} - engines: {node: '>= 4.5.0'} - hasBin: true - atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} @@ -10675,10 +10627,6 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - base@0.11.2: - resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} - engines: {node: '>=0.10.0'} - baseline-browser-mapping@2.8.3: resolution: {integrity: sha512-mcE+Wr2CAhHNWxXN/DdTI+n4gsPc5QpXpWnyCQWiQYIYZX+ZMJ8juXZgjRa/0/YPJo/NSsgW15/YgmI4nbysYw==} hasBin: true @@ -10743,17 +10691,10 @@ packages: resolution: {integrity: sha512-obsRaULtJurnfox/MDwgq6Yo9kzbv1CPTk/1/s7Z/61Lezc8IKkFCOXNeVLXz0456WRzBQmSsDWlai2tIhBsfA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - binary-extensions@1.13.1: - resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} - engines: {node: '>=0.10.0'} - binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - bintrees@1.0.2: resolution: {integrity: sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==} @@ -10823,10 +10764,6 @@ packages: resolution: {integrity: sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==} engines: {node: 20 || >=22} - braces@2.3.2: - resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} - engines: {node: '>=0.10.0'} - braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -10856,10 +10793,6 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - buffer-writer@2.0.0: - resolution: {integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==} - engines: {node: '>=4'} - buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} @@ -10927,10 +10860,6 @@ packages: resolution: {integrity: sha512-r3NU8h/P+4lVUHfeRw1dtgQYar3DZMm4/cm2bZgOvrFC/su7budSOeqh52VJIC4U4iG1WWwV6vRW0znqBvxNuw==} engines: {node: ^16.14.0 || >=18.0.0} - cache-base@1.0.1: - resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} - engines: {node: '>=0.10.0'} - cache-content-type@1.0.1: resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} engines: {node: '>= 6.0.0'} @@ -11102,9 +11031,6 @@ packages: chevrotain@11.0.3: resolution: {integrity: sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==} - chokidar@2.1.8: - resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} - chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -11131,10 +11057,6 @@ packages: cjs-module-lexer@1.2.3: resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} - class-utils@0.3.6: - resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} - engines: {node: '>=0.10.0'} - class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} @@ -11215,9 +11137,6 @@ packages: resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} engines: {node: '>=18'} - cliui@5.0.0: - resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} - cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} @@ -11277,20 +11196,10 @@ packages: collapse-white-space@2.1.0: resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} - collection-visit@1.0.0: - resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} - engines: {node: '>=0.10.0'} - - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -11357,9 +11266,6 @@ packages: resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} engines: {node: '>=4.0.0'} - component-emitter@1.3.1: - resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} - compressible@2.0.18: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} @@ -11452,10 +11358,6 @@ packages: copy-anything@2.0.6: resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} - copy-descriptor@0.1.1: - resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} - engines: {node: '>=0.10.0'} - copy-to-clipboard@3.3.3: resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} @@ -11859,10 +11761,6 @@ packages: decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} - decode-uri-component@0.2.2: - resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} - engines: {node: '>=0.10'} - decode-uri-component@0.4.1: resolution: {integrity: sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==} engines: {node: '>=14.16'} @@ -11928,18 +11826,6 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} - define-property@0.2.5: - resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} - engines: {node: '>=0.10.0'} - - define-property@1.0.0: - resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} - engines: {node: '>=0.10.0'} - - define-property@2.0.2: - resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} - engines: {node: '>=0.10.0'} - defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} @@ -12161,9 +12047,6 @@ packages: emoji-regex@10.3.0: resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} - emoji-regex@7.0.3: - resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} - emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -12582,10 +12465,6 @@ packages: resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} engines: {node: '>=6'} - expand-brackets@2.1.4: - resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} - engines: {node: '>=0.10.0'} - expect-type@1.2.2: resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} engines: {node: '>=12.0.0'} @@ -12604,20 +12483,12 @@ packages: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} - extend-shallow@3.0.2: - resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} - engines: {node: '>=0.10.0'} - extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - extglob@2.0.4: - resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} - engines: {node: '>=0.10.0'} - extract-files@11.0.0: resolution: {integrity: sha512-FuoE1qtbJ4bBVvv94CC7s0oTnKUGvQs+Rjf1L2SJFfS+HTVVjhPFtehPdQ0JiGPqVNfSSZvL5yzHHQq2Z4WNhQ==} engines: {node: ^12.20 || >= 14.13} @@ -12765,9 +12636,6 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} @@ -12775,10 +12643,6 @@ packages: resolution: {integrity: sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ==} engines: {node: '>= 0.4.0'} - fill-range@4.0.0: - resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} - engines: {node: '>=0.10.0'} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -12806,10 +12670,6 @@ packages: resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} engines: {node: '>=18'} - find-up@3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} - engines: {node: '>=6'} - find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -12848,10 +12708,6 @@ packages: for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - for-in@1.0.2: - resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} - engines: {node: '>=0.10.0'} - foreach@2.0.6: resolution: {integrity: sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==} @@ -12902,10 +12758,6 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} - fragment-cache@0.2.1: - resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} - engines: {node: '>=0.10.0'} - framer-motion@10.18.0: resolution: {integrity: sha512-oGlDh1Q1XqYPksuTD/usb0I70hq95OUzmL9+6Zd+Hs4XV0oaISBa/UUMSjYiq6m8EUF32132mOJ8xVZS+I0S6w==} peerDependencies: @@ -12968,12 +12820,6 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@1.2.13: - resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} - engines: {node: '>= 4.0'} - os: [darwin] - deprecated: Upgrade to fsevents v2 to mitigate potential security issues - fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -13091,10 +12937,6 @@ packages: resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} engines: {node: '>= 14'} - get-value@2.0.6: - resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} - engines: {node: '>=0.10.0'} - get-value@3.0.1: resolution: {integrity: sha512-mKZj9JLQrwMBtj5wxi6MH8Z5eSKaERpAwjg43dPtlGI1ZVEgH/qC7T8/6R2OBSUA+zzHBZgICsVJaEIV2tKTDA==} engines: {node: '>=6.0'} @@ -13114,9 +12956,6 @@ packages: github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} - glob-parent@3.1.0: - resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -13237,11 +13076,6 @@ packages: resolution: {integrity: sha512-uMdF9Rt8/NwT1wVXNleYgM5ro2hHDodHiKA3efJhgdU8iP+r/hksnghOHreMva0sF5tV73f4TpiELPUR0g7O9w==} engines: {node: '>=16'} - graphile-worker@0.1.0: - resolution: {integrity: sha512-/RDvhnr1SwjKSN0ouM8FqSbp8iVrvqUIUbjiOrDggz9s2zmiBSm7IJ0KiIlcjJNZPNkvP1mfBbpn7sHICD9Vng==} - engines: {node: '>=10.0.0'} - hasBin: true - graphile-worker@0.16.6: resolution: {integrity: sha512-e7gGYDmGqzju2l83MpzX8vNG/lOtVJiSzI3eZpAFubSxh/cxs7sRrRGBGjzBP1kNG0H+c95etPpNRNlH65PYhw==} engines: {node: '>=14.0.0'} @@ -13477,22 +13311,6 @@ packages: has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - has-value@0.3.1: - resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} - engines: {node: '>=0.10.0'} - - has-value@1.0.0: - resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} - engines: {node: '>=0.10.0'} - - has-values@0.1.4: - resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} - engines: {node: '>=0.10.0'} - - has-values@1.0.0: - resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} - engines: {node: '>=0.10.0'} - has@1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} @@ -13888,10 +13706,6 @@ packages: resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} engines: {node: '>=0.10.0'} - is-accessor-descriptor@1.0.1: - resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} - engines: {node: '>= 0.10'} - is-alphabetical@1.0.4: resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} @@ -13924,10 +13738,6 @@ packages: is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - is-binary-path@1.0.1: - resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==} - engines: {node: '>=0.10.0'} - is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -13954,10 +13764,6 @@ packages: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} - is-data-descriptor@1.0.1: - resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} - engines: {node: '>= 0.4'} - is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} @@ -13968,14 +13774,6 @@ packages: is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - is-descriptor@0.1.7: - resolution: {integrity: sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==} - engines: {node: '>= 0.4'} - - is-descriptor@1.0.3: - resolution: {integrity: sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==} - engines: {node: '>= 0.4'} - is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -13996,10 +13794,6 @@ packages: resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} engines: {node: '>=0.10.0'} - is-extendable@1.0.1: - resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} - engines: {node: '>=0.10.0'} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -14007,10 +13801,6 @@ packages: is-finalizationregistry@1.0.2: resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} - is-fullwidth-code-point@2.0.0: - resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} - engines: {node: '>=4'} - is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -14027,10 +13817,6 @@ packages: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} - is-glob@3.1.0: - resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} - engines: {node: '>=0.10.0'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -14079,10 +13865,6 @@ packages: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} - is-number@3.0.0: - resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} - engines: {node: '>=0.10.0'} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -14236,10 +14018,6 @@ packages: iso8601-duration@1.3.0: resolution: {integrity: sha512-K4CiUBzo3YeWk76FuET/dQPH03WE04R94feo5TSKQCXpoXQt9E4yx2CnY737QZnSAI3PI4WlKo/zfqizGx52QQ==} - isobject@2.1.0: - resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} - engines: {node: '>=0.10.0'} - isobject@3.0.1: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} @@ -14505,14 +14283,6 @@ packages: khroma@2.1.0: resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} - kind-of@3.2.2: - resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} - engines: {node: '>=0.10.0'} - - kind-of@4.0.0: - resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} - engines: {node: '>=0.10.0'} - kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -14789,10 +14559,6 @@ packages: localforage@1.10.0: resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} - locate-path@3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} - engines: {node: '>=6'} - locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -14993,10 +14759,6 @@ packages: resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} engines: {node: '>=0.10.0'} - map-visit@1.0.0: - resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} - engines: {node: '>=0.10.0'} - markdown-extensions@2.0.0: resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} engines: {node: '>=16'} @@ -15262,10 +15024,6 @@ packages: micromark@4.0.0: resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} - micromatch@3.1.10: - resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} - engines: {node: '>=0.10.0'} - micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -15435,10 +15193,6 @@ packages: resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} engines: {node: '>= 18'} - mixin-deep@1.3.2: - resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} - engines: {node: '>=0.10.0'} - mj-context-menu@0.6.1: resolution: {integrity: sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==} @@ -15641,10 +15395,6 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanomatch@1.2.13: - resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} - engines: {node: '>=0.10.0'} - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -15890,10 +15640,6 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-copy@0.1.0: - resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} - engines: {node: '>=0.10.0'} - object-hash@3.0.0: resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} engines: {node: '>= 6'} @@ -15918,10 +15664,6 @@ packages: resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} engines: {node: '>= 10'} - object-visit@1.0.1: - resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} - engines: {node: '>=0.10.0'} - object.assign@4.1.5: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} @@ -15940,10 +15682,6 @@ packages: object.hasown@1.1.2: resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} - object.pick@1.3.0: - resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} - engines: {node: '>=0.10.0'} - object.values@1.1.7: resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} engines: {node: '>= 0.4'} @@ -16077,10 +15815,6 @@ packages: resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==} engines: {node: '>=18'} - p-locate@3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} - p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -16150,9 +15884,6 @@ packages: package-manager-detector@1.3.0: resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} - packet-reader@1.0.0: - resolution: {integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==} - pacote@17.0.6: resolution: {integrity: sha512-cJKrW21VRE8vVTRskJo78c/RCvwJCn1f4qgfxL4w77SOWrTCRcmfkYHlHtS0gqpgjv3zhXflRtgsrUCX5xwNnQ==} engines: {node: ^16.14.0 || >=18.0.0} @@ -16228,10 +15959,6 @@ packages: pascal-case@3.1.2: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} - pascalcase@0.1.1: - resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} - engines: {node: '>=0.10.0'} - password-prompt@1.1.3: resolution: {integrity: sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw==} @@ -16248,13 +15975,6 @@ packages: path-data-parser@0.1.0: resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} - path-dirname@1.0.2: - resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} - - path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -16332,9 +16052,6 @@ packages: pg-cloudflare@1.1.1: resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} - pg-connection-string@0.1.3: - resolution: {integrity: sha512-i0NV/CrSkFTaiOQs9AGy3tq0dkSjtTd4d7DfsjeDVZAA4aIHInwfFEmriNYGGJUfZ5x6IAC/QddoUpUJjQAi0w==} - pg-connection-string@2.9.1: resolution: {integrity: sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==} @@ -16366,14 +16083,6 @@ packages: resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==} engines: {node: '>=4'} - pg-packet-stream@1.1.0: - resolution: {integrity: sha512-kRBH0tDIW/8lfnnOyTwKD23ygJ/kexQVXZs7gEyBljw4FYqimZFxnMMx50ndZ8In77QgfGuItS5LLclC2TtjYg==} - - pg-pool@2.0.10: - resolution: {integrity: sha512-qdwzY92bHf3nwzIUcj+zJ0Qo5lpG/YxchahxIN8+ZVmXqkahKXsnl2aiJPHLYN9o5mB/leG+Xh6XKxtP7e0sjg==} - peerDependencies: - pg: '>5.0' - pg-pool@3.7.0: resolution: {integrity: sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==} peerDependencies: @@ -16401,10 +16110,6 @@ packages: resolution: {integrity: sha512-hRCSDuLII9/LE3smys1hRHcu5QGcLs9ggT7I/TCs0IE+2Eesxi9+9RWAAwZ0yaGjxoWICF/YHLOEjydGujoJ+g==} engines: {node: '>=10'} - pg@7.18.2: - resolution: {integrity: sha512-Mvt0dGYMwvEADNKy5PMQGlzPudKcKKzJds/VbOeZJpb6f/pI3mmoXX0JksPgI3l3JPP/2Apq7F36O63J7mgveA==} - engines: {node: '>= 4.5.0'} - pg@8.13.1: resolution: {integrity: sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==} engines: {node: '>= 8.0.0'} @@ -16498,10 +16203,6 @@ packages: points-on-path@0.2.1: resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} - posix-character-classes@0.1.1: - resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} - engines: {node: '>=0.10.0'} - postcss-import@15.1.0: resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} @@ -17194,10 +16895,6 @@ packages: resolution: {integrity: sha512-kDMOq0qLtxV9f/SQv522h8cxZBqNZXuXNyjyezmfAAuribMyVXziljpQ/uQhfE1XLg2/TLTW2DsnoE4VAi/krg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - readdirp@2.2.1: - resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} - engines: {node: '>=0.10'} - readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -17266,10 +16963,6 @@ packages: regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regex-not@1.0.2: - resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} - engines: {node: '>=0.10.0'} - regex-recursion@5.1.1: resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==} @@ -17368,14 +17061,6 @@ packages: remove-trailing-spaces@1.0.9: resolution: {integrity: sha512-xzG7w5IRijvIkHIjDk65URsJJ7k4J95wmcArY5PRcmjldIOl7oTvG8+X2Ag690R7SfwiOcHrWZKVc1Pp5WIOzA==} - repeat-element@1.1.4: - resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} - engines: {node: '>=0.10.0'} - - repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - request-progress@3.0.0: resolution: {integrity: sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==} @@ -17415,10 +17100,6 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve-url@0.2.1: - resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} - deprecated: https://github.com/lydell/resolve-url#deprecated - resolve.exports@2.0.2: resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} engines: {node: '>=10'} @@ -17569,9 +17250,6 @@ packages: safe-regex2@5.0.0: resolution: {integrity: sha512-YwJwe5a51WlK7KbOJREPdjNrpViQBI3p4T50lfwPuDhZnE3XGVTlGvi+aolc5+RvxDD6bnUmjVsU9n1eboLUYw==} - safe-regex@1.1.0: - resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} - safe-stable-stringify@2.5.0: resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} engines: {node: '>=10'} @@ -17612,10 +17290,6 @@ packages: semver-compare@1.0.0: resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} - semver@4.3.2: - resolution: {integrity: sha512-VyFUffiBx8hABJ9HYSTXLRwyZtdDHMzMtFmID1aiNAD2BZppBmJm0Hqw3p2jkgxP9BNt1pQ9RnC49P0EcXf6cA==} - hasBin: true - semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -17705,10 +17379,6 @@ packages: resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} engines: {node: '>= 0.4'} - set-value@2.0.1: - resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} - engines: {node: '>=0.10.0'} - set-value@4.1.0: resolution: {integrity: sha512-zTEg4HL0RwVrqcWs3ztF+x1vkxfm0lP+MQQFPiMJTKVceBwEV0A569Ou8l9IYQG8jOZdMVI1hGsc0tmeD2o/Lw==} engines: {node: '>=11.0'} @@ -17859,18 +17529,6 @@ packages: snake-case@3.0.4: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} - snapdragon-node@2.1.1: - resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} - engines: {node: '>=0.10.0'} - - snapdragon-util@3.0.1: - resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} - engines: {node: '>=0.10.0'} - - snapdragon@0.8.2: - resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} - engines: {node: '>=0.10.0'} - snarkdown@2.0.0: resolution: {integrity: sha512-MgL/7k/AZdXCTJiNgrO7chgDqaB9FGM/1Tvlcenenb7div6obaDATzs16JhFyHHBGodHT3B7RzRc5qk8pFhg3A==} @@ -17917,17 +17575,9 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map-resolve@0.5.3: - resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} - deprecated: See https://github.com/lydell/source-map-resolve#deprecated - source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - source-map-url@0.4.1: - resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} - deprecated: See https://github.com/lydell/source-map-url#deprecated - source-map@0.5.7: resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} engines: {node: '>=0.10.0'} @@ -17982,10 +17632,6 @@ packages: resolution: {integrity: sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==} engines: {node: '>=12'} - split-string@3.1.0: - resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} - engines: {node: '>=0.10.0'} - split2@4.1.0: resolution: {integrity: sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==} engines: {node: '>= 10.x'} @@ -18032,10 +17678,6 @@ packages: state-local@1.0.7: resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} - static-extend@0.1.2: - resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} - engines: {node: '>=0.10.0'} - statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} @@ -18075,10 +17717,6 @@ packages: string-template@0.2.1: resolution: {integrity: sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==} - string-width@3.1.0: - resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} - engines: {node: '>=6'} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -18128,10 +17766,6 @@ packages: resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} engines: {node: '>=4'} - strip-ansi@5.2.0: - resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} - engines: {node: '>=6'} - strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -18446,22 +18080,10 @@ packages: resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} engines: {node: '>=14.14'} - to-object-path@0.3.0: - resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} - engines: {node: '>=0.10.0'} - - to-regex-range@2.1.1: - resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} - engines: {node: '>=0.10.0'} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - to-regex@3.0.2: - resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} - engines: {node: '>=0.10.0'} - toad-cache@3.7.0: resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} engines: {node: '>=12'} @@ -18572,9 +18194,6 @@ packages: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - tslib@2.3.0: resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} @@ -18799,10 +18418,6 @@ packages: unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} - union-value@1.0.1: - resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} - engines: {node: '>=0.10.0'} - unique-filename@3.0.0: resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -18884,10 +18499,6 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - unset-value@1.0.0: - resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} - engines: {node: '>=0.10.0'} - until-async@3.0.2: resolution: {integrity: sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw==} @@ -18923,10 +18534,6 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - urix@0.1.0: - resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} - deprecated: Please see https://github.com/lydell/urix#deprecated - url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} @@ -19025,10 +18632,6 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - use@3.1.1: - resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} - engines: {node: '>=0.10.0'} - util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -19395,10 +18998,6 @@ packages: '@cloudflare/workers-types': optional: true - wrap-ansi@5.1.0: - resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} - engines: {node: '>=6'} - wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -19485,9 +19084,6 @@ packages: engines: {node: '>= 14'} hasBin: true - yargs-parser@13.1.2: - resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} - yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} @@ -19500,9 +19096,6 @@ packages: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - yargs@13.3.2: - resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} - yargs@15.4.1: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} @@ -31501,8 +31094,8 @@ snapshots: '@typescript-eslint/parser': 7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3) eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) eslint-config-prettier: 9.1.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-plugin-import@2.29.1)(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) eslint-plugin-jsonc: 2.11.1(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) eslint-plugin-mdx: 3.0.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) @@ -31672,11 +31265,6 @@ snapshots: dependencies: '@types/deep-eql': 4.0.2 - '@types/chokidar@1.7.5': - dependencies: - '@types/events': 3.0.3 - '@types/node': 22.10.5 - '@types/cli-progress@3.11.5': dependencies: '@types/node': 22.10.5 @@ -31858,8 +31446,6 @@ snapshots: '@types/estree@1.0.8': {} - '@types/events@3.0.3': {} - '@types/express-serve-static-core@4.19.6': dependencies: '@types/node': 22.10.5 @@ -32030,12 +31616,6 @@ snapshots: dependencies: '@types/pg': 8.11.10 - '@types/pg@7.14.11': - dependencies: - '@types/node': 22.10.5 - pg-protocol: 1.7.0 - pg-types: 2.2.0 - '@types/pg@8.11.10': dependencies: '@types/node': 22.10.5 @@ -32606,16 +32186,10 @@ snapshots: dependencies: environment: 1.1.0 - ansi-regex@4.1.1: {} - ansi-regex@5.0.1: {} ansi-regex@6.0.1: {} - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 @@ -32632,13 +32206,6 @@ snapshots: any-promise@1.3.0: {} - anymatch@2.0.0: - dependencies: - micromatch: 3.1.10 - normalize-path: 2.1.1 - transitivePeerDependencies: - - supports-color - anymatch@3.1.2: dependencies: normalize-path: 3.0.0 @@ -32696,12 +32263,6 @@ snapshots: dependencies: dequal: 2.0.3 - arr-diff@4.0.0: {} - - arr-flatten@1.1.0: {} - - arr-union@3.1.0: {} - array-buffer-byte-length@1.0.0: dependencies: call-bind: 1.0.7 @@ -32721,8 +32282,6 @@ snapshots: array-union@2.1.0: {} - array-unique@0.3.2: {} - array.prototype.findlastindex@1.2.3: dependencies: call-bind: 1.0.7 @@ -32785,8 +32344,6 @@ snapshots: assert-plus@1.0.0: {} - assign-symbols@1.0.0: {} - ast-types-flow@0.0.8: {} ast-types@0.13.4: @@ -32797,8 +32354,6 @@ snapshots: astring@1.9.0: {} - async-each@1.0.6: {} - async-mutex@0.5.0: dependencies: tslib: 2.8.1 @@ -32817,8 +32372,6 @@ snapshots: at-least-node@1.0.0: {} - atob@2.1.2: {} - atomic-sleep@1.0.0: {} auto-bind@4.0.0: {} @@ -32901,16 +32454,6 @@ snapshots: base64-js@1.5.1: {} - base@0.11.2: - dependencies: - cache-base: 1.0.1 - class-utils: 0.3.6 - component-emitter: 1.3.1 - define-property: 1.0.0 - isobject: 3.0.1 - mixin-deep: 1.3.2 - pascalcase: 0.1.1 - baseline-browser-mapping@2.8.3: {} baseline-browser-mapping@2.9.4: {} @@ -32959,15 +32502,8 @@ snapshots: read-cmd-shim: 4.0.0 write-file-atomic: 5.0.1 - binary-extensions@1.13.1: {} - binary-extensions@2.2.0: {} - bindings@1.5.0: - dependencies: - file-uri-to-path: 1.0.0 - optional: true - bintrees@1.0.2: {} bl@4.1.0: @@ -33089,21 +32625,6 @@ snapshots: dependencies: balanced-match: 4.0.3 - braces@2.3.2: - dependencies: - arr-flatten: 1.1.0 - array-unique: 0.3.2 - extend-shallow: 2.0.1 - fill-range: 4.0.0 - isobject: 3.0.1 - repeat-element: 1.1.4 - snapdragon: 0.8.2 - snapdragon-node: 2.1.1 - split-string: 3.1.0 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -33138,8 +32659,6 @@ snapshots: buffer-from@1.1.2: {} - buffer-writer@2.0.0: {} - buffer@5.7.1: dependencies: base64-js: 1.5.1 @@ -33233,18 +32752,6 @@ snapshots: tar: 7.5.9 unique-filename: 3.0.0 - cache-base@1.0.1: - dependencies: - collection-visit: 1.0.0 - component-emitter: 1.3.1 - get-value: 2.0.6 - has-value: 1.0.0 - isobject: 3.0.1 - set-value: 2.0.1 - to-object-path: 0.3.0 - union-value: 1.0.1 - unset-value: 1.0.0 - cache-content-type@1.0.1: dependencies: mime-types: 2.1.35 @@ -33463,24 +32970,6 @@ snapshots: '@chevrotain/utils': 11.0.3 lodash-es: 4.17.23 - chokidar@2.1.8: - dependencies: - anymatch: 2.0.0 - async-each: 1.0.6 - braces: 2.3.2 - glob-parent: 3.1.0 - inherits: 2.0.4 - is-binary-path: 1.0.1 - is-glob: 4.0.3 - normalize-path: 3.0.0 - path-is-absolute: 1.0.1 - readdirp: 2.2.1 - upath: 1.2.0 - optionalDependencies: - fsevents: 1.2.13 - transitivePeerDependencies: - - supports-color - chokidar@3.6.0: dependencies: anymatch: 3.1.2 @@ -33507,13 +32996,6 @@ snapshots: cjs-module-lexer@1.2.3: {} - class-utils@0.3.6: - dependencies: - arr-union: 3.1.0 - define-property: 0.2.5 - isobject: 3.0.1 - static-extend: 0.1.2 - class-variance-authority@0.7.1: dependencies: clsx: 2.1.1 @@ -33595,12 +33077,6 @@ snapshots: is-wsl: 3.1.0 is64bit: 2.0.0 - cliui@5.0.0: - dependencies: - string-width: 3.1.0 - strip-ansi: 5.2.0 - wrap-ansi: 5.1.0 - cliui@6.0.0: dependencies: string-width: 4.2.3 @@ -33659,21 +33135,10 @@ snapshots: collapse-white-space@2.1.0: {} - collection-visit@1.0.0: - dependencies: - map-visit: 1.0.0 - object-visit: 1.0.1 - - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} - color-name@1.1.4: {} color-string@1.9.1: @@ -33718,8 +33183,6 @@ snapshots: common-tags@1.8.2: {} - component-emitter@1.3.1: {} - compressible@2.0.18: dependencies: mime-db: 1.54.0 @@ -33804,8 +33267,6 @@ snapshots: is-what: 3.14.1 optional: true - copy-descriptor@0.1.1: {} - copy-to-clipboard@3.3.3: dependencies: toggle-selection: 1.0.6 @@ -34251,8 +33712,6 @@ snapshots: dependencies: character-entities: 2.0.2 - decode-uri-component@0.2.2: {} - decode-uri-component@0.4.1: {} decompress-response@6.0.0: @@ -34324,19 +33783,6 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 - define-property@0.2.5: - dependencies: - is-descriptor: 0.1.7 - - define-property@1.0.0: - dependencies: - is-descriptor: 1.0.3 - - define-property@2.0.2: - dependencies: - is-descriptor: 1.0.3 - isobject: 3.0.1 - defu@6.1.4: {} degenerator@5.0.1: @@ -34548,8 +33994,6 @@ snapshots: emoji-regex@10.3.0: {} - emoji-regex@7.0.3: {} - emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -34794,13 +34238,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-plugin-import@2.29.1)(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): dependencies: debug: 4.4.3(supports-color@8.1.1) enhanced-resolve: 5.17.1 eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) - eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) fast-glob: 3.3.2 get-tsconfig: 4.7.5 is-core-module: 2.13.1 @@ -34831,14 +34275,14 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): + eslint-module-utils@2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): dependencies: debug: 3.2.7(supports-color@8.1.1) optionalDependencies: '@typescript-eslint/parser': 7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3) eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-plugin-import@2.29.1)(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) transitivePeerDependencies: - supports-color @@ -34870,7 +34314,7 @@ snapshots: eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) eslint-compat-utils: 0.1.2(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): dependencies: array-includes: 3.1.7 array.prototype.findlastindex: 1.2.3 @@ -34880,7 +34324,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) hasown: 2.0.2 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -35202,18 +34646,6 @@ snapshots: exit-hook@2.2.1: {} - expand-brackets@2.1.4: - dependencies: - debug: 2.6.9 - define-property: 0.2.5 - extend-shallow: 2.0.1 - posix-character-classes: 0.1.1 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - expect-type@1.2.2: {} exponential-backoff@3.1.1: {} @@ -35260,28 +34692,10 @@ snapshots: dependencies: is-extendable: 0.1.1 - extend-shallow@3.0.2: - dependencies: - assign-symbols: 1.0.0 - is-extendable: 1.0.1 - extend@3.0.2: {} extendable-error@0.1.7: {} - extglob@2.0.4: - dependencies: - array-unique: 0.3.2 - define-property: 1.0.0 - expand-brackets: 2.1.4 - extend-shallow: 2.0.1 - fragment-cache: 0.2.1 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - extract-files@11.0.0: {} extract-zip@2.0.1(supports-color@8.1.1): @@ -35467,22 +34881,12 @@ snapshots: dependencies: flat-cache: 3.0.4 - file-uri-to-path@1.0.0: - optional: true - filelist@1.0.4: dependencies: minimatch: 5.1.6 filesize@6.4.0: {} - fill-range@4.0.0: - dependencies: - extend-shallow: 2.0.1 - is-number: 3.0.0 - repeat-string: 1.6.1 - to-regex-range: 2.1.1 - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -35522,10 +34926,6 @@ snapshots: find-up-simple@1.0.1: {} - find-up@3.0.0: - dependencies: - locate-path: 3.0.0 - find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -35559,8 +34959,6 @@ snapshots: dependencies: is-callable: 1.2.7 - for-in@1.0.2: {} - foreach@2.0.6: {} foreground-child@3.1.1: @@ -35620,10 +35018,6 @@ snapshots: forwarded@0.2.0: {} - fragment-cache@0.2.1: - dependencies: - map-cache: 0.2.2 - framer-motion@10.18.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: tslib: 2.8.1 @@ -35685,12 +35079,6 @@ snapshots: fs.realpath@1.0.0: {} - fsevents@1.2.13: - dependencies: - bindings: 1.5.0 - nan: 2.18.0 - optional: true - fsevents@2.3.2: optional: true @@ -35820,8 +35208,6 @@ snapshots: transitivePeerDependencies: - supports-color - get-value@2.0.6: {} - get-value@3.0.1: dependencies: isobject: 3.0.1 @@ -35842,11 +35228,6 @@ snapshots: github-slugger@2.0.0: {} - glob-parent@3.1.0: - dependencies: - is-glob: 3.1.0 - path-dirname: 1.0.2 - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -36020,20 +35401,6 @@ snapshots: transitivePeerDependencies: - supports-color - graphile-worker@0.1.0: - dependencies: - '@types/chokidar': 1.7.5 - '@types/debug': 4.1.12 - '@types/pg': 7.14.11 - chokidar: 2.1.8 - debug: 4.4.3(supports-color@8.1.1) - pg: 7.18.2 - pg-connection-string: 2.9.1 - tslib: 1.14.1 - yargs: 13.3.2 - transitivePeerDependencies: - - supports-color - graphile-worker@0.16.6(typescript@5.7.3): dependencies: '@graphile/logger': 0.2.0 @@ -36425,25 +35792,6 @@ snapshots: has-unicode@2.0.1: {} - has-value@0.3.1: - dependencies: - get-value: 2.0.6 - has-values: 0.1.4 - isobject: 2.1.0 - - has-value@1.0.0: - dependencies: - get-value: 2.0.6 - has-values: 1.0.0 - isobject: 3.0.1 - - has-values@0.1.4: {} - - has-values@1.0.0: - dependencies: - is-number: 3.0.0 - kind-of: 4.0.0 - has@1.0.3: dependencies: function-bind: 1.1.2 @@ -37010,10 +36358,6 @@ snapshots: is-relative: 1.0.0 is-windows: 1.0.2 - is-accessor-descriptor@1.0.1: - dependencies: - hasown: 2.0.2 - is-alphabetical@1.0.4: {} is-alphabetical@2.0.1: {} @@ -37051,10 +36395,6 @@ snapshots: dependencies: has-bigints: 1.0.2 - is-binary-path@1.0.1: - dependencies: - binary-extensions: 1.13.1 - is-binary-path@2.1.0: dependencies: binary-extensions: 2.2.0 @@ -37080,10 +36420,6 @@ snapshots: dependencies: hasown: 2.0.2 - is-data-descriptor@1.0.1: - dependencies: - hasown: 2.0.2 - is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.2 @@ -37092,16 +36428,6 @@ snapshots: is-decimal@2.0.1: {} - is-descriptor@0.1.7: - dependencies: - is-accessor-descriptor: 1.0.1 - is-data-descriptor: 1.0.1 - - is-descriptor@1.0.3: - dependencies: - is-accessor-descriptor: 1.0.1 - is-data-descriptor: 1.0.1 - is-docker@2.2.1: {} is-docker@3.0.0: {} @@ -37112,18 +36438,12 @@ snapshots: is-extendable@0.1.1: {} - is-extendable@1.0.1: - dependencies: - is-plain-object: 2.0.4 - is-extglob@2.1.1: {} is-finalizationregistry@1.0.2: dependencies: call-bind: 1.0.7 - is-fullwidth-code-point@2.0.0: {} - is-fullwidth-code-point@3.0.0: {} is-fullwidth-code-point@4.0.0: {} @@ -37136,10 +36456,6 @@ snapshots: dependencies: has-tostringtag: 1.0.2 - is-glob@3.1.0: - dependencies: - is-extglob: 2.1.1 - is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -37177,10 +36493,6 @@ snapshots: dependencies: has-tostringtag: 1.0.2 - is-number@3.0.0: - dependencies: - kind-of: 3.2.2 - is-number@7.0.0: {} is-obj@1.0.1: {} @@ -37300,10 +36612,6 @@ snapshots: iso8601-duration@1.3.0: {} - isobject@2.1.0: - dependencies: - isarray: 1.0.0 - isobject@3.0.1: {} isomorphic-ws@5.0.0(ws@8.18.0): @@ -37584,14 +36892,6 @@ snapshots: khroma@2.1.0: {} - kind-of@3.2.2: - dependencies: - is-buffer: 1.1.6 - - kind-of@4.0.0: - dependencies: - is-buffer: 1.1.6 - kind-of@6.0.3: {} klaw@4.1.0: {} @@ -37872,11 +37172,6 @@ snapshots: dependencies: lie: 3.1.1 - locate-path@3.0.0: - dependencies: - p-locate: 3.0.0 - path-exists: 3.0.0 - locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -38076,10 +37371,6 @@ snapshots: map-cache@0.2.2: {} - map-visit@1.0.0: - dependencies: - object-visit: 1.0.1 - markdown-extensions@2.0.0: {} markdown-it@14.1.1: @@ -38667,24 +37958,6 @@ snapshots: transitivePeerDependencies: - supports-color - micromatch@3.1.10: - dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - braces: 2.3.2 - define-property: 2.0.2 - extend-shallow: 3.0.2 - extglob: 2.0.4 - fragment-cache: 0.2.1 - kind-of: 6.0.3 - nanomatch: 1.2.13 - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -38831,11 +38104,6 @@ snapshots: dependencies: minipass: 7.1.3 - mixin-deep@1.3.2: - dependencies: - for-in: 1.0.2 - is-extendable: 1.0.1 - mj-context-menu@0.6.1: {} mjml-accordion@4.14.0(encoding@0.1.13): @@ -39251,22 +38519,6 @@ snapshots: nanoid@3.3.8: {} - nanomatch@1.2.13: - dependencies: - arr-diff: 4.0.0 - array-unique: 0.3.2 - define-property: 2.0.2 - extend-shallow: 3.0.2 - fragment-cache: 0.2.1 - is-windows: 1.0.2 - kind-of: 6.0.3 - object.pick: 1.3.0 - regex-not: 1.0.2 - snapdragon: 0.8.2 - to-regex: 3.0.2 - transitivePeerDependencies: - - supports-color - natural-compare@1.4.0: {} natural-orderby@2.0.3: {} @@ -39569,12 +38821,6 @@ snapshots: object-assign@4.1.1: {} - object-copy@0.1.0: - dependencies: - copy-descriptor: 0.1.1 - define-property: 0.2.5 - kind-of: 3.2.2 - object-hash@3.0.0: {} object-inspect@1.13.2: {} @@ -39590,10 +38836,6 @@ snapshots: object-treeify@1.1.33: {} - object-visit@1.0.1: - dependencies: - isobject: 3.0.1 - object.assign@4.1.5: dependencies: call-bind: 1.0.7 @@ -39625,10 +38867,6 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.22.3 - object.pick@1.3.0: - dependencies: - isobject: 3.0.1 - object.values@1.1.7: dependencies: call-bind: 1.0.7 @@ -39786,10 +39024,6 @@ snapshots: dependencies: yocto-queue: 1.1.1 - p-locate@3.0.0: - dependencies: - p-limit: 2.3.0 - p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -39863,8 +39097,6 @@ snapshots: package-manager-detector@1.3.0: {} - packet-reader@1.0.0: {} - pacote@17.0.6: dependencies: '@npmcli/git': 5.0.4 @@ -39996,8 +39228,6 @@ snapshots: no-case: 3.0.4 tslib: 2.8.1 - pascalcase@0.1.1: {} - password-prompt@1.1.3: dependencies: ansi-escapes: 4.3.2 @@ -40014,10 +39244,6 @@ snapshots: path-data-parser@0.1.0: {} - path-dirname@1.0.2: {} - - path-exists@3.0.0: {} - path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -40074,8 +39300,6 @@ snapshots: pg-cloudflare@1.1.1: optional: true - pg-connection-string@0.1.3: {} - pg-connection-string@2.9.1: {} pg-copy-streams-binary@2.2.0: @@ -40105,12 +39329,6 @@ snapshots: pg-numeric@1.0.2: {} - pg-packet-stream@1.1.0: {} - - pg-pool@2.0.10(pg@7.18.2): - dependencies: - pg: 7.18.2 - pg-pool@3.7.0(pg@8.13.1): dependencies: pg: 8.13.1 @@ -40150,17 +39368,6 @@ snapshots: postgres-interval: 3.0.0 postgres-range: 1.1.3 - pg@7.18.2: - dependencies: - buffer-writer: 2.0.0 - packet-reader: 1.0.0 - pg-connection-string: 0.1.3 - pg-packet-stream: 1.1.0 - pg-pool: 2.0.10(pg@7.18.2) - pg-types: 2.2.0 - pgpass: 1.0.5 - semver: 4.3.2 - pg@8.13.1: dependencies: pg-connection-string: 2.9.1 @@ -40267,8 +39474,6 @@ snapshots: path-data-parser: 0.1.0 points-on-curve: 0.2.0 - posix-character-classes@0.1.1: {} - postcss-import@15.1.0(postcss@8.4.49): dependencies: postcss: 8.4.49 @@ -40928,14 +40133,6 @@ snapshots: events: 3.3.0 process: 0.11.10 - readdirp@2.2.1: - dependencies: - graceful-fs: 4.2.11 - micromatch: 3.1.10 - readable-stream: 2.3.8 - transitivePeerDependencies: - - supports-color - readdirp@3.6.0: dependencies: picomatch: 2.3.1 @@ -41021,11 +40218,6 @@ snapshots: regenerator-runtime@0.14.1: {} - regex-not@1.0.2: - dependencies: - extend-shallow: 3.0.2 - safe-regex: 1.1.0 - regex-recursion@5.1.1: dependencies: regex: 5.1.1 @@ -41200,10 +40392,6 @@ snapshots: remove-trailing-spaces@1.0.9: {} - repeat-element@1.1.4: {} - - repeat-string@1.6.1: {} - request-progress@3.0.0: dependencies: throttleit: 1.0.1 @@ -41239,8 +40427,6 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve-url@0.2.1: {} - resolve.exports@2.0.2: {} resolve@1.22.11: @@ -41456,10 +40642,6 @@ snapshots: dependencies: ret: 0.5.0 - safe-regex@1.1.0: - dependencies: - ret: 0.1.15 - safe-stable-stringify@2.5.0: {} safer-buffer@2.1.2: {} @@ -41492,8 +40674,6 @@ snapshots: semver-compare@1.0.0: {} - semver@4.3.2: {} - semver@5.7.2: {} semver@6.3.1: {} @@ -41607,13 +40787,6 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - set-value@2.0.1: - dependencies: - extend-shallow: 2.0.1 - is-extendable: 0.1.1 - is-plain-object: 2.0.4 - split-string: 3.1.0 - set-value@4.1.0: dependencies: is-plain-object: 2.0.4 @@ -41854,29 +41027,6 @@ snapshots: dot-case: 3.0.4 tslib: 2.8.1 - snapdragon-node@2.1.1: - dependencies: - define-property: 1.0.0 - isobject: 3.0.1 - snapdragon-util: 3.0.1 - - snapdragon-util@3.0.1: - dependencies: - kind-of: 3.2.2 - - snapdragon@0.8.2: - dependencies: - base: 0.11.2 - debug: 2.6.9 - define-property: 0.2.5 - extend-shallow: 2.0.1 - map-cache: 0.2.2 - source-map: 0.5.7 - source-map-resolve: 0.5.3 - use: 3.1.1 - transitivePeerDependencies: - - supports-color - snarkdown@2.0.0: {} socks-proxy-agent@7.0.0: @@ -41943,21 +41093,11 @@ snapshots: source-map-js@1.2.1: {} - source-map-resolve@0.5.3: - dependencies: - atob: 2.1.2 - decode-uri-component: 0.2.2 - resolve-url: 0.2.1 - source-map-url: 0.4.1 - urix: 0.1.0 - source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - source-map-url@0.4.1: {} - source-map@0.5.7: {} source-map@0.6.1: {} @@ -42003,10 +41143,6 @@ snapshots: split-on-first@3.0.0: {} - split-string@3.1.0: - dependencies: - extend-shallow: 3.0.2 - split2@4.1.0: {} sponge-case@1.0.1: @@ -42062,11 +41198,6 @@ snapshots: state-local@1.0.7: {} - static-extend@0.1.2: - dependencies: - define-property: 0.2.5 - object-copy: 0.1.0 - statuses@1.5.0: {} statuses@2.0.1: {} @@ -42089,12 +41220,6 @@ snapshots: string-template@0.2.1: {} - string-width@3.1.0: - dependencies: - emoji-regex: 7.0.3 - is-fullwidth-code-point: 2.0.0 - strip-ansi: 5.2.0 - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -42174,10 +41299,6 @@ snapshots: is-obj: 1.0.1 is-regexp: 1.0.0 - strip-ansi@5.2.0: - dependencies: - ansi-regex: 4.1.1 - strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -42535,26 +41656,10 @@ snapshots: tmp@0.2.5: {} - to-object-path@0.3.0: - dependencies: - kind-of: 3.2.2 - - to-regex-range@2.1.1: - dependencies: - is-number: 3.0.0 - repeat-string: 1.6.1 - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - to-regex@3.0.2: - dependencies: - define-property: 2.0.2 - extend-shallow: 3.0.2 - regex-not: 1.0.2 - safe-regex: 1.1.0 - toad-cache@3.7.0: {} toggle-selection@1.0.6: {} @@ -42678,8 +41783,6 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tslib@1.14.1: {} - tslib@2.3.0: {} tslib@2.4.1: {} @@ -42933,13 +42036,6 @@ snapshots: trough: 2.1.0 vfile: 6.0.3 - union-value@1.0.1: - dependencies: - arr-union: 3.1.0 - get-value: 2.0.6 - is-extendable: 0.1.1 - set-value: 2.0.1 - unique-filename@3.0.0: dependencies: unique-slug: 4.0.0 @@ -43042,11 +42138,6 @@ snapshots: unpipe@1.0.0: {} - unset-value@1.0.0: - dependencies: - has-value: 0.3.1 - isobject: 3.0.1 - until-async@3.0.2: {} untildify@4.0.0: {} @@ -43082,8 +42173,6 @@ snapshots: dependencies: punycode: 2.1.1 - urix@0.1.0: {} - url-parse@1.5.10: dependencies: querystringify: 2.2.0 @@ -43166,8 +42255,6 @@ snapshots: react: 19.2.4 optional: true - use@3.1.1: {} - util-deprecate@1.0.2: {} utils-merge@1.0.1: {} @@ -43635,12 +42722,6 @@ snapshots: - bufferutil - utf-8-validate - wrap-ansi@5.1.0: - dependencies: - ansi-styles: 3.2.1 - string-width: 3.1.0 - strip-ansi: 5.2.0 - wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -43708,11 +42789,6 @@ snapshots: yaml@2.5.0: {} - yargs-parser@13.1.2: - dependencies: - camelcase: 5.3.1 - decamelize: 1.2.0 - yargs-parser@18.1.3: dependencies: camelcase: 5.3.1 @@ -43722,19 +42798,6 @@ snapshots: yargs-parser@21.1.1: {} - yargs@13.3.2: - dependencies: - cliui: 5.0.0 - find-up: 3.0.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - require-main-filename: 2.0.0 - set-blocking: 2.0.0 - string-width: 3.1.0 - which-module: 2.0.0 - y18n: 4.0.3 - yargs-parser: 13.1.2 - yargs@15.4.1: dependencies: cliui: 6.0.0 From 1c974eddf9380081ba3f7ce182e1bde1cd232112 Mon Sep 17 00:00:00 2001 From: jdolle <1841898+jdolle@users.noreply.github.com> Date: Tue, 24 Feb 2026 18:34:20 -0800 Subject: [PATCH 21/29] Use nullable instead of optional --- .../modules/proposals/providers/schema-proposal-storage.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/services/api/src/modules/proposals/providers/schema-proposal-storage.ts b/packages/services/api/src/modules/proposals/providers/schema-proposal-storage.ts index 09ece8361e2..1f0f14d1379 100644 --- a/packages/services/api/src/modules/proposals/providers/schema-proposal-storage.ts +++ b/packages/services/api/src/modules/proposals/providers/schema-proposal-storage.ts @@ -410,9 +410,9 @@ const SchemaProposalModel = z.object({ stage: StageModel, targetId: z.string(), author: z.string(), - compositionStatus: z.string().optional(), - compositionStatusReason: z.string().optional(), - compositionTimestamp: z.string().optional(), + compositionStatus: z.string().nullable(), + compositionStatusReason: z.string().nullable(), + compositionTimestamp: z.string().nullable(), }); export type SchemaProposalRecord = z.infer; From 5d954d73e659a590318fba675790c49843300921 Mon Sep 17 00:00:00 2001 From: jdolle <1841898+jdolle@users.noreply.github.com> Date: Wed, 25 Feb 2026 12:45:47 -0800 Subject: [PATCH 22/29] Remove proposal version select --- package.json | 2 +- packages/libraries/pubsub/package.json | 2 +- packages/services/workflows/package.json | 2 +- packages/web/app/package.json | 2 +- .../target/proposals/service-heading.tsx | 37 +++++++---- .../proposals/stage-transition-select.tsx | 7 ++- .../app/src/pages/target-proposal-checks.tsx | 2 +- .../web/app/src/pages/target-proposal.tsx | 62 ++++++++----------- packages/web/docs/e2e/search.e2e.ts | 2 +- pnpm-lock.yaml | 18 +++--- 10 files changed, 71 insertions(+), 65 deletions(-) diff --git a/package.json b/package.json index e524a037a03..b2c7923faeb 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "@graphql-eslint/eslint-plugin": "3.20.1", "@graphql-inspector/cli": "6.0.6", "@graphql-inspector/core": "7.1.2", - "@graphql-inspector/patch": "0.1.2", + "@graphql-inspector/patch": "0.1.3-alpha-20260225183305-b1e68e3f363401fe16845d7f731ff8ed3467f5a7", "@graphql-tools/load": "8.1.2", "@manypkg/get-packages": "2.2.2", "@next/eslint-plugin-next": "14.2.23", diff --git a/packages/libraries/pubsub/package.json b/packages/libraries/pubsub/package.json index 4f68bb2e8a1..5008bc9e991 100644 --- a/packages/libraries/pubsub/package.json +++ b/packages/libraries/pubsub/package.json @@ -44,11 +44,11 @@ "typecheck": "tsc --noEmit" }, "peerDependencies": { - "graphile-worker": "^0.16.0", "ioredis": "^5.0.0" }, "dependencies": { "@graphql-yoga/redis-event-target": "3.0.3", + "graphile-worker": "^0.16.0", "graphql-yoga": "5.13.3" }, "devDependencies": { diff --git a/packages/services/workflows/package.json b/packages/services/workflows/package.json index 8bae9d9af7a..82047163d27 100644 --- a/packages/services/workflows/package.json +++ b/packages/services/workflows/package.json @@ -12,7 +12,7 @@ "@graphql-hive/logger": "1.0.9", "@graphql-hive/pubsub": "workspace:*", "@graphql-inspector/core": "7.1.2", - "@graphql-inspector/patch": "0.1.2", + "@graphql-inspector/patch": "0.1.3-alpha-20260225183305-b1e68e3f363401fe16845d7f731ff8ed3467f5a7", "@graphql-yoga/redis-event-target": "3.0.3", "@hive/service-common": "workspace:*", "@hive/storage": "workspace:*", diff --git a/packages/web/app/package.json b/packages/web/app/package.json index 8b62a92243d..97bf39cb032 100644 --- a/packages/web/app/package.json +++ b/packages/web/app/package.json @@ -24,7 +24,7 @@ "@graphiql/toolkit": "0.9.1", "@graphql-codegen/client-preset-swc-plugin": "0.2.0", "@graphql-inspector/core": "7.1.2", - "@graphql-inspector/patch": "0.1.2", + "@graphql-inspector/patch": "0.1.3-alpha-20260225183305-b1e68e3f363401fe16845d7f731ff8ed3467f5a7", "@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/service-heading.tsx b/packages/web/app/src/components/target/proposals/service-heading.tsx index 7e8b5f996da..0a1a69902aa 100644 --- a/packages/web/app/src/components/target/proposals/service-heading.tsx +++ b/packages/web/app/src/components/target/proposals/service-heading.tsx @@ -1,6 +1,6 @@ -import type { MouseEventHandler } from 'react'; +import { useState, type MouseEventHandler } from 'react'; import { cn } from '@/lib/utils'; -import { CubeIcon } from '@radix-ui/react-icons'; +import { ChevronDownIcon, CubeIcon } from '@radix-ui/react-icons'; export enum ServiceHeadingType { NEW, @@ -11,26 +11,39 @@ export function ServiceHeading(props: { serviceName: string; type?: ServiceHeadingType; onClick?: MouseEventHandler; + showToggleIcon?: boolean; }) { + const [isOpen, setIsOpen] = useState(true); if (props.serviceName.length === 0) { return null; } + const showToggleIcon = props.showToggleIcon ?? props.onClick !== undefined; return (
{ + props.onClick?.(e); + setIsOpen(!isOpen); + }} > - - {props.serviceName} - {props.type === ServiceHeadingType.NEW ? ( - *NEW* - ) : null} - {props.type === ServiceHeadingType.DELETED ? ( - *DELETED* - ) : null} +
+ + {props.serviceName} + {props.type === ServiceHeadingType.NEW ? ( + *NEW* + ) : null} + {props.type === ServiceHeadingType.DELETED ? ( + *DELETED* + ) : null} +
+ {showToggleIcon && ( +
+ +
+ )}
); } diff --git a/packages/web/app/src/components/target/proposals/stage-transition-select.tsx b/packages/web/app/src/components/target/proposals/stage-transition-select.tsx index 9f08d468fcc..61e4edef902 100644 --- a/packages/web/app/src/components/target/proposals/stage-transition-select.tsx +++ b/packages/web/app/src/components/target/proposals/stage-transition-select.tsx @@ -57,18 +57,19 @@ const STAGE_TITLES = { export function StageTransitionSelect(props: { stage: SchemaProposalStage; onSelect: (stage: SchemaProposalStage) => void | Promise; + className?: string; }) { const [open, setOpen] = useState(false); return ( diff --git a/packages/web/app/src/pages/target-proposal-checks.tsx b/packages/web/app/src/pages/target-proposal-checks.tsx index d6f76decd47..a692ba23ac3 100644 --- a/packages/web/app/src/pages/target-proposal-checks.tsx +++ b/packages/web/app/src/pages/target-proposal-checks.tsx @@ -38,7 +38,7 @@ export function TargetProposalChecksPage(props: { }) { const checks = useFragment(ProposalOverview_ChecksFragment, props.checks); return ( -
+
{checks?.edges?.map(({ node }, index) => { return ( [0] services={services ?? []} reviews={proposal.reviews ?? {}} checks={proposal.checks ?? null} - versions={proposal.versions ?? null} isDistributedGraph={isDistributedGraph} proposal={proposal} target={query.data.target} @@ -436,29 +428,10 @@ const ProposalsContent = (props: Parameters[0] ) : ( proposal && ( <> -
- -
- { - const _review = await reviewSchemaProposal({ - input: { - schemaProposalId: props.proposalId, - stageTransition: stage, - // for monorepos and non-service related comments, use an empty string - serviceName: '', - }, - }); - // @todo use urqlCache to invalidate the proposal and refresh? - refreshProposal(); - }} - /> -
-
-
- - {proposal.title} + <div className="flex flex-col gap-2 sm:flex-row"> + {/* <VersionSelect proposalId={props.proposalId} versions={proposal.versions ?? {}} /> */} + <Title className="flex grow flex-row items-center gap-2 truncate"> + <div className="truncate">{proposal.title}</div> <TooltipProvider delayDuration={0}> <Tooltip> <TooltipTrigger> @@ -488,10 +461,30 @@ const ProposalsContent = (props: Parameters<typeof TargetProposalsSinglePage>[0] </Tooltip> </TooltipProvider> -
+
+ { + const _review = await reviewSchemaProposal({ + input: { + schemaProposalId: props.proposalId, + stageTransition: stage, + // for monorepos and non-service related comments, use an empty string + serviceName: '', + }, + }); + // @todo use urqlCache to invalidate the proposal and refresh? + refreshProposal(); + }} + /> +
+
+
+
{proposal.description}
+
proposed by {proposal.author}
-
{proposal.description}
) @@ -512,7 +505,6 @@ function TabbedContent(props: { services: ServiceProposalDetails[]; reviews: FragmentType; checks: FragmentType | null; - versions: FragmentType | null; proposal: FragmentType; target: FragmentType; me: FragmentType | null; @@ -520,7 +512,7 @@ function TabbedContent(props: { }) { return ( - + { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 773fc59de44..a8d6211aff9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -138,8 +138,8 @@ importers: specifier: 7.1.2 version: 7.1.2(graphql@16.9.0) '@graphql-inspector/patch': - specifier: 0.1.2 - version: 0.1.2(graphql@16.9.0) + specifier: 0.1.3-alpha-20260225183305-b1e68e3f363401fe16845d7f731ff8ed3467f5a7 + version: 0.1.3-alpha-20260225183305-b1e68e3f363401fe16845d7f731ff8ed3467f5a7(graphql@16.9.0) '@graphql-tools/load': specifier: 8.1.2 version: 8.1.2(graphql@16.9.0) @@ -1682,8 +1682,8 @@ importers: specifier: 7.1.2 version: 7.1.2(graphql@16.9.0) '@graphql-inspector/patch': - specifier: 0.1.2 - version: 0.1.2(graphql@16.9.0) + specifier: 0.1.3-alpha-20260225183305-b1e68e3f363401fe16845d7f731ff8ed3467f5a7 + version: 0.1.3-alpha-20260225183305-b1e68e3f363401fe16845d7f731ff8ed3467f5a7(graphql@16.9.0) '@graphql-yoga/redis-event-target': specifier: 3.0.3 version: 3.0.3(ioredis@5.8.2) @@ -1784,8 +1784,8 @@ importers: specifier: 7.1.2 version: 7.1.2(graphql@16.9.0) '@graphql-inspector/patch': - specifier: 0.1.2 - version: 0.1.2(graphql@16.9.0) + specifier: 0.1.3-alpha-20260225183305-b1e68e3f363401fe16845d7f731ff8ed3467f5a7 + version: 0.1.3-alpha-20260225183305-b1e68e3f363401fe16845d7f731ff8ed3467f5a7(graphql@16.9.0) '@graphql-tools/mock': specifier: 9.0.25 version: 9.0.25(graphql@16.9.0) @@ -4399,8 +4399,8 @@ packages: resolution: {integrity: sha512-rEo+HoQt+qjdayy7p5vcR9GeGTdKXmN0LbIm3W+jKKoXeAMlV4zHxnOW6jEhO6E0eVQxf8Sc1TlcH78i2P2a9w==} engines: {node: '>=18.0.0'} - '@graphql-inspector/patch@0.1.2': - resolution: {integrity: sha512-iSuRozeQmWm4cX3iNA19+1ADDLdN+qyptkfedKcm1WbGaT7UDDdbh7/RyfAeomVagnhbBKFLLsf3S7I9jV5Iew==} + '@graphql-inspector/patch@0.1.3-alpha-20260225183305-b1e68e3f363401fe16845d7f731ff8ed3467f5a7': + resolution: {integrity: sha512-r+sW5w1Gu8njCKZd0sR4Z4oXXJ2mvoeJuufZM78iAdu68JxGSBvAuKE9wIlZxp+1Q2GQcAQ9EpB/ofgj/vnojg==} engines: {node: '>=18.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 @@ -23279,7 +23279,7 @@ snapshots: std-env: 3.7.0 tslib: 2.6.2 - '@graphql-inspector/patch@0.1.2(graphql@16.9.0)': + '@graphql-inspector/patch@0.1.3-alpha-20260225183305-b1e68e3f363401fe16845d7f731ff8ed3467f5a7(graphql@16.9.0)': dependencies: '@graphql-tools/utils': 10.9.1(graphql@16.9.0) graphql: 16.9.0 From 201f156752befcf4bc3aef9021c1bb1ca46a43d9 Mon Sep 17 00:00:00 2001 From: jdolle <1841898+jdolle@users.noreply.github.com> Date: Wed, 25 Feb 2026 13:56:25 -0800 Subject: [PATCH 23/29] Pass in external composition state --- .../api/src/modules/schema/providers/schema-publisher.ts | 7 ++----- .../workflows/src/tasks/schema-proposal-composition.ts | 4 ++-- .../src/components/target/proposals/service-heading.tsx | 3 ++- packages/web/docs/e2e/search.e2e.ts | 1 - 4 files changed, 6 insertions(+), 9 deletions(-) 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 de9362a0d89..eb0bbd874ac 100644 --- a/packages/services/api/src/modules/schema/providers/schema-publisher.ts +++ b/packages/services/api/src/modules/schema/providers/schema-publisher.ts @@ -729,12 +729,9 @@ export class SchemaPublisher { const expiresAt = retention ? new Date(Date.now() + retention * millisecondsPerDay) : null; if (input.schemaProposalId) { - // @todo use saved composition settings await this.schemaProposals.runBackgroundComposition({ - externalComposition: { - enabled: false, - }, - native: true, + externalComposition: project.externalComposition, + native: project.nativeFederation, proposalId: input.schemaProposalId, targetId: target.id, }); diff --git a/packages/services/workflows/src/tasks/schema-proposal-composition.ts b/packages/services/workflows/src/tasks/schema-proposal-composition.ts index f7410dea2e0..99fb78c0f89 100644 --- a/packages/services/workflows/src/tasks/schema-proposal-composition.ts +++ b/packages/services/workflows/src/tasks/schema-proposal-composition.ts @@ -33,8 +33,8 @@ export const SchemaProposalCompositionTask = defineTask({ targetId: z.string(), externalComposition: z.object({ enabled: z.boolean(), - endpoint: z.optional(z.string()), - encryptedSecret: z.optional(z.string()), + endpoint: z.string().nullable().optional(), + encryptedSecret: z.string().nullable().optional(), }), native: z.boolean(), }), diff --git a/packages/web/app/src/components/target/proposals/service-heading.tsx b/packages/web/app/src/components/target/proposals/service-heading.tsx index 0a1a69902aa..062780144ff 100644 --- a/packages/web/app/src/components/target/proposals/service-heading.tsx +++ b/packages/web/app/src/components/target/proposals/service-heading.tsx @@ -21,8 +21,9 @@ export function ServiceHeading(props: { return (
{ props.onClick?.(e); diff --git a/packages/web/docs/e2e/search.e2e.ts b/packages/web/docs/e2e/search.e2e.ts index 1aee993bd0e..8c0d403d78a 100644 --- a/packages/web/docs/e2e/search.e2e.ts +++ b/packages/web/docs/e2e/search.e2e.ts @@ -1,4 +1,3 @@ - import { expect, test } from '@playwright/test'; test.describe('Search User Journeys', () => { From 8544455864702df54d566684a7079d0f17acfb1f Mon Sep 17 00:00:00 2001 From: jdolle <1841898+jdolle@users.noreply.github.com> Date: Wed, 25 Feb 2026 18:08:34 -0800 Subject: [PATCH 24/29] Fix proposal manager permissions; fix workflow redis env var; add an integration test for proposals --- docker/docker-compose.community.yml | 3 + .../docker-compose.integration.yaml | 1 + .../tests/api/proposals/create.spec.ts | 83 +++++++++++++++++++ .../organization-access-token-permissions.ts | 10 +++ .../providers/schema-proposal-manager.ts | 81 +++++++++++++++--- .../providers/schema-proposal-storage.ts | 31 +++++++ .../services/workflows/src/environment.ts | 6 +- 7 files changed, 198 insertions(+), 17 deletions(-) create mode 100644 integration-tests/tests/api/proposals/create.spec.ts diff --git a/docker/docker-compose.community.yml b/docker/docker-compose.community.yml index 5324e6801fe..ed35cf42b7a 100644 --- a/docker/docker-compose.community.yml +++ b/docker/docker-compose.community.yml @@ -323,6 +323,9 @@ services: PROMETHEUS_METRICS: '${PROMETHEUS_METRICS:-}' LOG_JSON: '1' SCHEMA_ENDPOINT: http://schema:3002 + REDIS_HOST: redis + REDIS_PORT: 6379 + REDIS_PASSWORD: '${REDIS_PASSWORD}' usage: image: '${DOCKER_REGISTRY}usage${DOCKER_TAG}' diff --git a/integration-tests/docker-compose.integration.yaml b/integration-tests/docker-compose.integration.yaml index 70ff54d9a8a..4e6ad78b977 100644 --- a/integration-tests/docker-compose.integration.yaml +++ b/integration-tests/docker-compose.integration.yaml @@ -239,6 +239,7 @@ services: workflows: environment: EMAIL_PROVIDER: '${EMAIL_PROVIDER}' + SCHEMA_ENDPOINT: http://schema:3002 LOG_LEVEL: debug ports: - '3014:3014' diff --git a/integration-tests/tests/api/proposals/create.spec.ts b/integration-tests/tests/api/proposals/create.spec.ts new file mode 100644 index 00000000000..c15b1f1c624 --- /dev/null +++ b/integration-tests/tests/api/proposals/create.spec.ts @@ -0,0 +1,83 @@ +import { graphql } from 'testkit/gql'; +import { ProjectType, ResourceAssignmentModeType } from 'testkit/gql/graphql'; +import { execute } from 'testkit/graphql'; +import { initSeed } from 'testkit/seed'; + +const CreateProposalMutation = graphql(` + mutation CreateProposalMutation($input: CreateSchemaProposalInput!) { + createSchemaProposal(input: $input) { + ok { + schemaProposal { + id + } + } + error { + message + } + } + } +`); + +describe('Schema Proposals', () => { + test.concurrent( + 'cannot be proposed without "schemaProposal:modify" permission', + async ({ expect }) => { + const { createOrg, ownerToken } = await initSeed().createOwner(); + const { createProject, createOrganizationAccessToken, setFeatureFlag } = await createOrg(); + await setFeatureFlag('schemaProposals', true); + const { target } = await createProject(ProjectType.Federation); + const { privateAccessKey: accessKey } = await createOrganizationAccessToken( + { + resources: { + mode: ResourceAssignmentModeType.All, + }, + permissions: ['schemaProposal:describe'], + }, + ownerToken, + ); + + const result = await execute({ + document: CreateProposalMutation, + variables: { + input: { + target: { byId: target.id }, + author: 'Jeff', + title: 'Proposed changes to the schema...', + }, + }, + authToken: accessKey, + }).then(r => r.expectGraphQLErrors()); + }, + ); + + test.concurrent( + 'can be proposed successfully with "schemaProposal:modify" permission', + async ({ expect }) => { + const { createOrg, ownerToken } = await initSeed().createOwner(); + const { createProject, createOrganizationAccessToken, setFeatureFlag } = await createOrg(); + await setFeatureFlag('schemaProposals', true); + const { target } = await createProject(ProjectType.Federation); + + const { privateAccessKey: accessKey } = await createOrganizationAccessToken({ + resources: { + mode: ResourceAssignmentModeType.All, + }, + permissions: ['schemaProposal:modify'], + }); + + const result = await execute({ + document: CreateProposalMutation, + variables: { + input: { + target: { byId: target.id }, + author: 'Jeff', + title: 'Proposed changes to the schema...', + }, + }, + authToken: accessKey, + }).then(r => r.expectNoGraphQLErrors()); + + expect(result.createSchemaProposal.ok?.schemaProposal).toHaveProperty('id'); + }, + ); +}); diff --git a/packages/services/api/src/modules/organization/lib/organization-access-token-permissions.ts b/packages/services/api/src/modules/organization/lib/organization-access-token-permissions.ts index eedc6144864..d80bd59d7b8 100644 --- a/packages/services/api/src/modules/organization/lib/organization-access-token-permissions.ts +++ b/packages/services/api/src/modules/organization/lib/organization-access-token-permissions.ts @@ -94,6 +94,16 @@ export const permissionGroups: Array = [ title: 'Manage CDN access tokens', description: 'Allow managing access tokens for the CDN.', }, + { + id: 'schemaProposal:modify', + title: 'Create and edit schema proposals', + description: 'Allow managing schema proposals.', + }, + { + id: 'schemaProposal:describe', + title: 'View schema proposals', + description: 'Allow viewing schema proposals and adding comments.', + }, ], }, { 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 52fc16d6c0a..eb0207d26bc 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 @@ -38,20 +38,20 @@ export class SchemaProposalManager { throw new HiveError('Proposal not found.'); } - const target = await this.storage.getTargetById(proposal.targetId); + const selector = await this.idTranslator.resolveTargetReference({ + reference: { + byId: proposal.targetId, + }, + }); - if (!target) { - throw new HiveError('Proposal target lookup failed.'); + if (!selector) { + throw new HiveError('Proposal not found.'); } await this.session.assertPerformAction({ - organizationId: target.orgId, + organizationId: selector.organizationId, action: 'schemaProposal:describe', - params: { - organizationId: target.orgId, - projectId: target.projectId, - targetId: target.id, - }, + params: selector, }); return this.pubSub.subscribe('schemaProposalComposition', proposal.id); @@ -69,6 +69,12 @@ export class SchemaProposalManager { this.session.raise('schemaProposal:modify'); } + await this.session.assertPerformAction({ + action: 'schemaProposal:modify', + organizationId: selector.organizationId, + params: selector, + }); + const createProposalResult = await this.proposalStorage.createProposal({ organizationId: selector.organizationId, author: args.author ?? null, @@ -109,7 +115,24 @@ export class SchemaProposalManager { } async getProposal(args: { id: string }) { - return this.proposalStorage.getProposal(args); + const proposal = await this.proposalStorage.getProposal(args); + + if (proposal) { + const selector = await this.idTranslator.resolveTargetReference({ + reference: { + byId: proposal.targetId, + }, + }); + if (selector === null) { + this.session.raise('schemaProposal:describe'); + } + await this.session.assertPerformAction({ + action: 'schemaProposal:describe', + organizationId: selector.organizationId, + params: selector, + }); + } + return proposal; } async getPaginatedReviews(args: { @@ -120,6 +143,23 @@ export class SchemaProposalManager { authors: string[]; }) { this.logger.debug('Get paginated reviews (target=%s, after=%s)', args.proposalId, args.after); + const proposal = await this.proposalStorage.getProposalTargetId({ id: args.proposalId }); + + if (proposal) { + const selector = await this.idTranslator.resolveTargetReference({ + reference: { + byId: proposal.targetId, + }, + }); + if (selector === null) { + this.session.raise('schemaProposal:describe'); + } + await this.session.assertPerformAction({ + action: 'schemaProposal:describe', + organizationId: selector.organizationId, + params: selector, + }); + } return this.proposalStorage.getPaginatedReviews(args); } @@ -140,9 +180,15 @@ export class SchemaProposalManager { reference: args.target, }); if (selector === null) { - this.session.raise('schemaProposal:modify'); + this.session.raise('schemaProposal:describe'); } + await this.session.assertPerformAction({ + action: 'schemaProposal:describe', + organizationId: selector.organizationId, + params: selector, + }); + return this.proposalStorage.getPaginatedProposals({ targetId: selector.targetId, after: args.after, @@ -159,8 +205,7 @@ export class SchemaProposalManager { }) { this.logger.debug(`Reviewing proposal (proposal=%s, stage=%s)`, args.proposalId, args.stage); - // @todo check permissions for user - const proposal = await this.proposalStorage.getProposal({ id: args.proposalId }); + const proposal = await this.proposalStorage.getProposalTargetId({ id: args.proposalId }); if (!proposal) { throw new HiveError('Proposal target lookup failed.'); @@ -173,6 +218,16 @@ export class SchemaProposalManager { throw new HiveError('Proposal target lookup failed.'); } + await this.session.assertPerformAction({ + action: 'schemaProposal:describe', + organizationId: target.orgId, + params: { + organizationId: target.orgId, + projectId: target.projectId, + targetId: proposal.targetId, + }, + }); + if (args.stage) { const review = await this.proposalStorage.manuallyTransitionProposal({ organizationId: target.orgId, diff --git a/packages/services/api/src/modules/proposals/providers/schema-proposal-storage.ts b/packages/services/api/src/modules/proposals/providers/schema-proposal-storage.ts index 1f0f14d1379..a0b19aedaf9 100644 --- a/packages/services/api/src/modules/proposals/providers/schema-proposal-storage.ts +++ b/packages/services/api/src/modules/proposals/providers/schema-proposal-storage.ts @@ -208,6 +208,29 @@ export class SchemaProposalStorage { }; } + /** + * A stripped down version of getProposal that only returns the ID. This is intended + * to be used + */ + async getProposalTargetId(args: { id: string }) { + this.logger.debug('Get proposal target ID (proposal=%s)', args.id); + const result = await this.pool + .maybeOne( + sql` + SELECT + id + , target_id as "targetId" + FROM + "schema_proposals" + WHERE + id=${args.id} + `, + ) + .then(row => SchemaProposalTargetIdModel.safeParse(row)); + + return result.data ?? null; + } + async getProposal(args: { id: string }) { this.logger.debug('Get proposal (proposal=%s)', args.id); const result = await this.pool @@ -415,5 +438,13 @@ const SchemaProposalModel = z.object({ compositionTimestamp: z.string().nullable(), }); +/** + * Minimal model for extracting just the target Id for permission checks. + */ +const SchemaProposalTargetIdModel = z.object({ + id: z.string(), + targetId: z.string(), +}); + export type SchemaProposalRecord = z.infer; export type SchemaProposalReviewRecord = z.infer; diff --git a/packages/services/workflows/src/environment.ts b/packages/services/workflows/src/environment.ts index e15a66972a2..44e9f4cb7da 100644 --- a/packages/services/workflows/src/environment.ts +++ b/packages/services/workflows/src/environment.ts @@ -86,10 +86,8 @@ const EmailProviderModel = zod.union([ const RedisModel = zod.object({ REDIS_HOST: zod.string(), REDIS_PORT: NumberFromString, - REDIS_PASSWORD: zod.string(), - REDIS_TLS_ENABLED: emptyString( - zod.union([zod.literal('0'), zod.literal('1')]).optional(), - ).default('0'), + REDIS_PASSWORD: emptyString(zod.string().optional()), + REDIS_TLS_ENABLED: emptyString(zod.union([zod.literal('1'), zod.literal('0')]).optional()), }); const RequestBrokerModel = zod.union([ From 6e8a950e446a9094672d9766ad5aba5f69fc897e Mon Sep 17 00:00:00 2001 From: jdolle <1841898+jdolle@users.noreply.github.com> Date: Thu, 26 Feb 2026 13:00:09 -0800 Subject: [PATCH 25/29] Add subscription test and more --- integration-tests/package.json | 1 + integration-tests/testkit/graphql.ts | 40 ++++++ integration-tests/testkit/seed.ts | 2 + .../tests/api/proposals/read.spec.ts | 115 +++++++++++++++++ .../tests/api/proposals/subscribe.spec.ts | 116 ++++++++++++++++++ packages/libraries/pubsub/src/pub-sub.ts | 2 +- .../providers/schema-proposal-manager.ts | 10 +- .../Subscription/schemaProposalComposition.ts | 2 +- packages/services/server/src/index.ts | 19 ++- .../workflows/src/lib/schema/provider.ts | 8 +- .../target/proposals/service-heading.tsx | 2 +- 11 files changed, 296 insertions(+), 21 deletions(-) create mode 100644 integration-tests/tests/api/proposals/read.spec.ts create mode 100644 integration-tests/tests/api/proposals/subscribe.spec.ts diff --git a/integration-tests/package.json b/integration-tests/package.json index 308c020171e..abb4db0671f 100644 --- a/integration-tests/package.json +++ b/integration-tests/package.json @@ -34,6 +34,7 @@ "dockerode": "4.0.8", "dotenv": "16.4.7", "graphql": "16.9.0", + "graphql-sse": "2.6.0", "human-id": "4.1.1", "ioredis": "5.8.2", "slonik": "30.4.4", diff --git a/integration-tests/testkit/graphql.ts b/integration-tests/testkit/graphql.ts index ea960875984..f8ce222120a 100644 --- a/integration-tests/testkit/graphql.ts +++ b/integration-tests/testkit/graphql.ts @@ -1,4 +1,5 @@ import { ExecutionResult, parse, print } from 'graphql'; +import { createClient } from 'graphql-sse'; import { TypedDocumentNode } from '@graphql-typed-document-node/core'; import { sortSDL } from '@theguild/federation-composition'; import { getServiceHost } from './utils'; @@ -87,3 +88,42 @@ export async function execute( }, }; } + +export async function subscribe( + params: { + document: TypedDocumentNode; + operationName?: string; + authToken?: string; + token?: string; + legacyAuthorizationMode?: boolean; + } & (TVariables extends Record + ? { variables?: never } + : { variables: TVariables }), +) { + const registryAddress = await getServiceHost('server', 8082); + const client = createClient({ + url: `http://${registryAddress}/graphql`, + headers: { + ...(params.authToken + ? { + authorization: `Bearer ${params.authToken}`, + } + : {}), + ...(params.token + ? params.legacyAuthorizationMode + ? { + 'x-api-token': params.token, + } + : { + authorization: `Bearer ${params.token}`, + } + : {}), + }, + }); + + return client.iterate({ + operationName: params.operationName, + query: print(params.document), + variables: params.variables ?? {}, + }); +} diff --git a/integration-tests/testkit/seed.ts b/integration-tests/testkit/seed.ts index 09809745825..b0ce800549a 100644 --- a/integration-tests/testkit/seed.ts +++ b/integration-tests/testkit/seed.ts @@ -577,6 +577,7 @@ export function initSeed() { commit: string; }, contextId?: string, + schemaProposalId?: string, ) { return await checkSchema( { @@ -584,6 +585,7 @@ export function initSeed() { service, meta, contextId, + schemaProposalId, }, secret, ); diff --git a/integration-tests/tests/api/proposals/read.spec.ts b/integration-tests/tests/api/proposals/read.spec.ts new file mode 100644 index 00000000000..20721d7b5c3 --- /dev/null +++ b/integration-tests/tests/api/proposals/read.spec.ts @@ -0,0 +1,115 @@ +import { graphql } from 'testkit/gql'; +import { ProjectType, ResourceAssignmentModeType } from 'testkit/gql/graphql'; +import { execute } from 'testkit/graphql'; +import { initSeed } from 'testkit/seed'; + +const CreateProposalMutation = graphql(` + mutation CreateProposalMutation($input: CreateSchemaProposalInput!) { + createSchemaProposal(input: $input) { + ok { + schemaProposal { + id + } + } + error { + message + } + } + } +`); + +const ReadProposalQuery = graphql(` + query ReadProposalQuery($input: SchemaProposalInput!) { + schemaProposal(input: $input) { + title + description + checks(input: { latestPerService: true }) { + edges { + node { + id + } + } + } + } + } +`); + +/** + * Creates a proposal and returns a token with specified permissions + **/ +async function setup(input: { + tokenPermissions: string[]; +}): Promise<{ accessKey: string; proposalId: string }> { + const { createOrg, ownerToken } = await initSeed().createOwner(); + const { createProject, createOrganizationAccessToken, setFeatureFlag } = await createOrg(); + await setFeatureFlag('schemaProposals', true); + const { target } = await createProject(ProjectType.Federation); + + // create as owner + const result = await execute({ + document: CreateProposalMutation, + variables: { + input: { + target: { byId: target.id }, + author: 'Jeff', + title: 'Proposed changes to the schema...', + }, + }, + token: ownerToken, + }).then(r => r.expectNoGraphQLErrors()); + + const { privateAccessKey: accessKey } = await createOrganizationAccessToken( + { + resources: { + mode: ResourceAssignmentModeType.All, + }, + permissions: input.tokenPermissions, + }, + ownerToken, + ); + const proposalId = result.createSchemaProposal.ok?.schemaProposal.id!; + return { accessKey, proposalId }; +} + +describe('Schema Proposals', () => { + test.concurrent( + 'can read proposal with "schemaProposal:describe" permission', + async ({ expect }) => { + const { accessKey, proposalId } = await setup({ + tokenPermissions: ['schemaProposal:describe'], + }); + + { + const proposal = await execute({ + document: ReadProposalQuery, + variables: { + input: { + id: proposalId, + }, + }, + token: accessKey, + }).then(r => r.expectNoGraphQLErrors()); + + expect(proposal.schemaProposal?.title).toMatchInlineSnapshot( + `Proposed changes to the schema...`, + ); + } + }, + ); + + test.concurrent('cannot read proposal without "schemaProposal:describe" permission', async () => { + const { accessKey, proposalId } = await setup({ tokenPermissions: [] }); + + { + await execute({ + document: ReadProposalQuery, + variables: { + input: { + id: proposalId, + }, + }, + token: accessKey, + }).then(r => r.expectGraphQLErrors()); + } + }); +}); diff --git a/integration-tests/tests/api/proposals/subscribe.spec.ts b/integration-tests/tests/api/proposals/subscribe.spec.ts new file mode 100644 index 00000000000..060ae3cd601 --- /dev/null +++ b/integration-tests/tests/api/proposals/subscribe.spec.ts @@ -0,0 +1,116 @@ +import { graphql } from 'testkit/gql'; +import { ProjectType, ResourceAssignmentModeType } from 'testkit/gql/graphql'; +import { execute, subscribe } from 'testkit/graphql'; +import { initSeed } from 'testkit/seed'; + +const CreateProposalMutation = graphql(` + mutation CreateProposalMutation($input: CreateSchemaProposalInput!) { + createSchemaProposal(input: $input) { + ok { + schemaProposal { + id + } + } + error { + message + } + } + } +`); + +const ProposalCompositionSubscription = graphql(` + subscription ProposalCompositionSubscription( + $input: SchemaProposalCompositionSubscriptionInput! + ) { + schemaProposalComposition(input: $input) { + status + timestamp + } + } +`); + +/** + * Creates a proposal and returns a token with specified permissions + **/ +async function setup(input: { tokenPermissions: string[] }) { + const { createOrg, ownerToken } = await initSeed().createOwner(); + const { createProject, createOrganizationAccessToken, setFeatureFlag } = await createOrg(); + await setFeatureFlag('schemaProposals', true); + const project = await createProject(ProjectType.Federation); + + // create as owner + const result = await execute({ + document: CreateProposalMutation, + variables: { + input: { + target: { byId: project.target.id }, + author: 'Jeff', + title: 'Proposed changes to the schema...', + }, + }, + token: ownerToken, + }).then(r => r.expectNoGraphQLErrors()); + + const { privateAccessKey: accessKey } = await createOrganizationAccessToken( + { + resources: { + mode: ResourceAssignmentModeType.All, + }, + permissions: input.tokenPermissions, + }, + ownerToken, + ); + const proposalId = result.createSchemaProposal.ok?.schemaProposal.id!; + return { accessKey, proposalId, project }; +} + +describe('Schema Proposals', () => { + test.concurrent( + 'can subscribe for proposal events with "schemaProposal:describe" permission', + async ({ expect }) => { + const { accessKey, proposalId, project } = await setup({ + tokenPermissions: ['schemaProposal:describe'], + }); + + const query = await subscribe({ + document: ProposalCompositionSubscription, + variables: { + input: { + proposalId, + }, + }, + token: accessKey, + }); + + // create the schema check to trigger the composition and subscription event + const token = await project.createTargetAccessToken({ mode: 'readWrite' }); + await token.publishSchema({ + sdl: /* GraphQL */ ` + type Query { + ping: String + } + `, + service: 'example', + url: 'http://localhost:4001', + }); + const checkResultErrors = await token + .checkSchema( + /* GraphQL */ ` + type Query { + ping: String + pong: String + } + `, + 'example', + undefined, + undefined, + proposalId, + ) + .then(r => r.expectNoGraphQLErrors()); + expect(checkResultErrors.schemaCheck.__typename).toBe(`SchemaCheckSuccess`); + const { value } = await query.next(); + expect(value.data.schemaProposalComposition.status).toBe(`success`); + await expect(query.return?.()).resolves.toMatchObject({ done: true }); + }, + ); +}); diff --git a/packages/libraries/pubsub/src/pub-sub.ts b/packages/libraries/pubsub/src/pub-sub.ts index 25446809f62..0cba7270c3b 100644 --- a/packages/libraries/pubsub/src/pub-sub.ts +++ b/packages/libraries/pubsub/src/pub-sub.ts @@ -4,6 +4,6 @@ export type HivePubSub = PubSub<{ oidcIntegrationLogs: [oidcIntegrationId: string, payload: { timestamp: string; message: string }]; schemaProposalComposition: [ proposalId: string, - payload: { timestamp: string; status: 'success' | 'fail' | 'error' }, + payload: { timestamp: string; status: 'success' | 'fail' | 'error'; reason?: string | null }, ]; }>; 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 eb0207d26bc..34de9ac96d3 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 @@ -30,12 +30,12 @@ export class SchemaProposalManager { } async subscribeToSchemaProposalCompositions(args: { proposalId: string }) { - const proposal = await this.proposalStorage.getProposal({ + const proposal = await this.proposalStorage.getProposalTargetId({ id: args.proposalId, }); if (!proposal) { - throw new HiveError('Proposal not found.'); + this.session.raise('schemaProposal:describe'); } const selector = await this.idTranslator.resolveTargetReference({ @@ -45,7 +45,7 @@ export class SchemaProposalManager { }); if (!selector) { - throw new HiveError('Proposal not found.'); + this.session.raise('schemaProposal:describe'); } await this.session.assertPerformAction({ @@ -54,7 +54,9 @@ export class SchemaProposalManager { params: selector, }); - return this.pubSub.subscribe('schemaProposalComposition', proposal.id); + this.logger.info(`Subscribed to "schemaProposalComposition" (id=${args.proposalId})`); + + return this.pubSub.subscribe('schemaProposalComposition', args.proposalId); } async proposeSchema(args: { diff --git a/packages/services/api/src/modules/proposals/resolvers/Subscription/schemaProposalComposition.ts b/packages/services/api/src/modules/proposals/resolvers/Subscription/schemaProposalComposition.ts index 57973580ac6..8f5a1c4b0a5 100644 --- a/packages/services/api/src/modules/proposals/resolvers/Subscription/schemaProposalComposition.ts +++ b/packages/services/api/src/modules/proposals/resolvers/Subscription/schemaProposalComposition.ts @@ -8,5 +8,5 @@ export const schemaProposalComposition: NonNullable< injector .get(SchemaProposalManager) .subscribeToSchemaProposalCompositions({ proposalId: args.input.proposalId }), - resolve: (payload: { status: string; timestamp: string }) => payload, + resolve: (payload: { status: string; timestamp: string; reason?: string | null }) => payload, }; diff --git a/packages/services/server/src/index.ts b/packages/services/server/src/index.ts index f68e605abc6..de90560fd9e 100644 --- a/packages/services/server/src/index.ts +++ b/packages/services/server/src/index.ts @@ -13,6 +13,7 @@ import 'reflect-metadata'; import { createPubSub } from 'graphql-yoga'; import { z } from 'zod'; import formDataPlugin from '@fastify/formbody'; +import { createHivePubSub } from '@graphql-hive/pubsub'; import { createRegistry, CryptoProvider, @@ -184,16 +185,14 @@ export async function main() { const redis = createRedisClient('Redis', env.redis, server.log.child({ source: 'Redis' })); - const pubSub = createPubSub({ - eventTarget: createRedisEventTarget({ - publishClient: redis, - subscribeClient: createRedisClient( - 'subscriber', - env.redis, - server.log.child({ source: 'RedisSubscribe' }), - ), - }), - }) as HivePubSub; + const pubSub = createHivePubSub({ + publisher: redis, + subscriber: createRedisClient( + 'subscriber', + env.redis, + server.log.child({ source: 'RedisSubscribe' }), + ), + }); registerShutdown({ logger: server.log, diff --git a/packages/services/workflows/src/lib/schema/provider.ts b/packages/services/workflows/src/lib/schema/provider.ts index b1864e6dc4b..1fde013ac12 100644 --- a/packages/services/workflows/src/lib/schema/provider.ts +++ b/packages/services/workflows/src/lib/schema/provider.ts @@ -19,15 +19,15 @@ type SchemaProviderConfig = { const SchemaModel = z.object({ id: z.string().uuid(), sdl: z.string(), - serviceName: z.optional(z.string()), - serviceUrl: z.optional(z.string()), + serviceName: z.string().nullable(), + serviceUrl: z.string().nullable(), type: z.string(), }); const SchemaProposalChangesModel = z.object({ id: z.string().uuid(), - serviceName: z.string().optional(), - serviceUrl: z.string().optional(), + serviceName: z.string().nullable(), + serviceUrl: z.string().nullable(), schemaProposalChanges: z.array(HiveSchemaChangeModel).default([]), createdAt: z.string(), }); diff --git a/packages/web/app/src/components/target/proposals/service-heading.tsx b/packages/web/app/src/components/target/proposals/service-heading.tsx index 062780144ff..aa9ae979d66 100644 --- a/packages/web/app/src/components/target/proposals/service-heading.tsx +++ b/packages/web/app/src/components/target/proposals/service-heading.tsx @@ -22,7 +22,7 @@ export function ServiceHeading(props: {
{ From 8e4142ce62dfb58362b88b4fb80c677547740a74 Mon Sep 17 00:00:00 2001 From: jdolle <1841898+jdolle@users.noreply.github.com> Date: Thu, 26 Feb 2026 13:07:20 -0800 Subject: [PATCH 26/29] Lint --- packages/services/server/package.json | 1 + packages/services/server/src/index.ts | 3 --- pnpm-lock.yaml | 18 +++++++++++++++++- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/packages/services/server/package.json b/packages/services/server/package.json index 87c26f13ccc..f8cccb67c87 100644 --- a/packages/services/server/package.json +++ b/packages/services/server/package.json @@ -25,6 +25,7 @@ "@fastify/cors": "11.2.0", "@fastify/formbody": "8.0.2", "@graphql-hive/plugin-opentelemetry": "1.3.0", + "@graphql-hive/pubsub": "workspace:*", "@graphql-hive/yoga": "workspace:*", "@graphql-tools/merge": "9.1.1", "@graphql-yoga/plugin-response-cache": "3.15.4", diff --git a/packages/services/server/src/index.ts b/packages/services/server/src/index.ts index de90560fd9e..44247b21b94 100644 --- a/packages/services/server/src/index.ts +++ b/packages/services/server/src/index.ts @@ -8,9 +8,7 @@ import { } from 'supertokens-node/framework/fastify/index.js'; import cors from '@fastify/cors'; import type { FastifyCorsOptionsDelegateCallback } from '@fastify/cors'; -import { createRedisEventTarget } from '@graphql-yoga/redis-event-target'; import 'reflect-metadata'; -import { createPubSub } from 'graphql-yoga'; import { z } from 'zod'; import formDataPlugin from '@fastify/formbody'; import { createHivePubSub } from '@graphql-hive/pubsub'; @@ -25,7 +23,6 @@ import { import { AccessTokenKeyContainer } from '@hive/api/modules/auth/lib/supertokens-at-home/crypto'; import { EmailVerification } from '@hive/api/modules/auth/providers/email-verification'; import { OAuthCache } from '@hive/api/modules/auth/providers/oauth-cache'; -import { HivePubSub } from '@hive/api/modules/shared/providers/pub-sub'; import { createRedisClient } from '@hive/api/modules/shared/providers/redis'; import { RedisRateLimiter } from '@hive/api/modules/shared/providers/redis-rate-limiter'; import { TargetsByIdCache } from '@hive/api/modules/target/providers/targets-by-id-cache'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a8d6211aff9..e16598e912a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -381,6 +381,9 @@ importers: graphql: specifier: 16.9.0 version: 16.9.0 + graphql-sse: + specifier: 2.6.0 + version: 2.6.0(graphql@16.9.0) human-id: specifier: 4.1.1 version: 4.1.1 @@ -1275,6 +1278,9 @@ importers: '@graphql-hive/plugin-opentelemetry': specifier: 1.3.0 version: 1.3.0(encoding@0.1.13)(graphql@16.9.0)(ioredis@5.8.2)(pino@10.3.0)(ws@8.18.0) + '@graphql-hive/pubsub': + specifier: workspace:* + version: link:../../libraries/pubsub '@graphql-hive/yoga': specifier: workspace:* version: link:../../libraries/yoga/dist @@ -13196,6 +13202,12 @@ packages: peerDependencies: graphql: '>=0.11 <=16' + graphql-sse@2.6.0: + resolution: {integrity: sha512-BXT5Rjv9UFunjQsmN9WWEIq+TFNhgYibgwo1xkXLxzguQVyOd6paJ4v5DlL9K5QplS0w74bhF+aUiqaGXZBaug==} + engines: {node: '>=12'} + peerDependencies: + graphql: '>=0.11 <=16' + graphql-tag@2.12.6: resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} engines: {node: '>=10'} @@ -25474,7 +25486,7 @@ snapshots: '@graphql-yoga/plugin-graphql-sse@3.7.0(graphql-yoga@5.13.3(graphql@16.9.0))(graphql@16.9.0)': dependencies: graphql: 16.9.0 - graphql-sse: 2.5.3(graphql@16.9.0) + graphql-sse: 2.6.0(graphql@16.9.0) graphql-yoga: 5.13.3(graphql@16.9.0) '@graphql-yoga/plugin-jwt@3.10.2(graphql-yoga@5.16.2(graphql@16.12.0))(graphql@16.12.0)': @@ -35629,6 +35641,10 @@ snapshots: dependencies: graphql: 16.9.0 + graphql-sse@2.6.0(graphql@16.9.0): + dependencies: + graphql: 16.9.0 + graphql-tag@2.12.6(graphql@16.9.0): dependencies: graphql: 16.9.0 From 24055c3fde5597943da3e14324f97c86d229023b Mon Sep 17 00:00:00 2001 From: jdolle <1841898+jdolle@users.noreply.github.com> Date: Thu, 26 Feb 2026 13:17:55 -0800 Subject: [PATCH 27/29] service heading style tweak --- .../web/app/src/components/target/proposals/service-heading.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/web/app/src/components/target/proposals/service-heading.tsx b/packages/web/app/src/components/target/proposals/service-heading.tsx index aa9ae979d66..dd64829a146 100644 --- a/packages/web/app/src/components/target/proposals/service-heading.tsx +++ b/packages/web/app/src/components/target/proposals/service-heading.tsx @@ -22,7 +22,7 @@ export function ServiceHeading(props: {
{ From 016527f66ed4fa7a255672a80ed2e1ec071e3eb7 Mon Sep 17 00:00:00 2001 From: jdolle <1841898+jdolle@users.noreply.github.com> Date: Thu, 26 Feb 2026 15:21:06 -0800 Subject: [PATCH 28/29] Rename submodule to avoid conflict with actual package --- packages/libraries/pubsub/package.json | 2 +- packages/services/api/package.json | 2 +- .../providers/schema-proposal-storage.ts | 2 +- .../src/modules/shared/providers/pub-sub.ts | 2 +- packages/services/server/package.json | 2 +- packages/services/server/src/index.ts | 2 +- packages/services/workflows/package.json | 2 +- packages/services/workflows/src/context.ts | 2 +- packages/services/workflows/src/index.ts | 2 +- packages/services/workflows/src/kit.ts | 2 +- packages/services/workflows/src/logger.ts | 2 +- packages/services/workflows/src/redis.ts | 2 +- pnpm-lock.yaml | 18 +++++++++--------- tsconfig.json | 2 +- 14 files changed, 22 insertions(+), 22 deletions(-) diff --git a/packages/libraries/pubsub/package.json b/packages/libraries/pubsub/package.json index 5008bc9e991..7eae513c6ee 100644 --- a/packages/libraries/pubsub/package.json +++ b/packages/libraries/pubsub/package.json @@ -1,5 +1,5 @@ { - "name": "@graphql-hive/pubsub", + "name": "@hive/pubsub", "version": "0.0.1", "type": "module", "repository": { diff --git a/packages/services/api/package.json b/packages/services/api/package.json index 042cc638c93..a03311a91bd 100644 --- a/packages/services/api/package.json +++ b/packages/services/api/package.json @@ -21,11 +21,11 @@ "@bentocache/plugin-prometheus": "0.2.0", "@date-fns/utc": "2.1.1", "@graphql-hive/core": "workspace:*", - "@graphql-hive/pubsub": "workspace:*", "@graphql-hive/signal": "1.0.0", "@graphql-inspector/core": "7.1.2", "@graphql-tools/merge": "9.1.1", "@hive/cdn-script": "workspace:*", + "@hive/pubsub": "workspace:*", "@hive/schema": "workspace:*", "@hive/service-common": "workspace:*", "@hive/storage": "workspace:*", diff --git a/packages/services/api/src/modules/proposals/providers/schema-proposal-storage.ts b/packages/services/api/src/modules/proposals/providers/schema-proposal-storage.ts index a0b19aedaf9..225e307275e 100644 --- a/packages/services/api/src/modules/proposals/providers/schema-proposal-storage.ts +++ b/packages/services/api/src/modules/proposals/providers/schema-proposal-storage.ts @@ -5,7 +5,7 @@ import { makeWorkerUtils, WorkerUtils } from 'graphile-worker'; import { Inject, Injectable, Scope } from 'graphql-modules'; import { sql, type DatabasePool } from 'slonik'; import { z } from 'zod'; -import { bridgeGraphileLogger } from '@graphql-hive/pubsub'; +import { bridgeGraphileLogger } from '@hive/pubsub'; import { decodeCreatedAtAndUUIDIdBasedCursor, encodeCreatedAtAndUUIDIdBasedCursor, diff --git a/packages/services/api/src/modules/shared/providers/pub-sub.ts b/packages/services/api/src/modules/shared/providers/pub-sub.ts index eae17984fe2..e7546fe2969 100644 --- a/packages/services/api/src/modules/shared/providers/pub-sub.ts +++ b/packages/services/api/src/modules/shared/providers/pub-sub.ts @@ -1,5 +1,5 @@ import { InjectionToken } from 'graphql-modules'; -import type { HivePubSub } from '@graphql-hive/pubsub'; +import type { HivePubSub } from '@hive/pubsub'; export const PUB_SUB_CONFIG = new InjectionToken('PUB_SUB'); export type { HivePubSub }; diff --git a/packages/services/server/package.json b/packages/services/server/package.json index f8cccb67c87..915662b7ff3 100644 --- a/packages/services/server/package.json +++ b/packages/services/server/package.json @@ -25,13 +25,13 @@ "@fastify/cors": "11.2.0", "@fastify/formbody": "8.0.2", "@graphql-hive/plugin-opentelemetry": "1.3.0", - "@graphql-hive/pubsub": "workspace:*", "@graphql-hive/yoga": "workspace:*", "@graphql-tools/merge": "9.1.1", "@graphql-yoga/plugin-response-cache": "3.15.4", "@graphql-yoga/redis-event-target": "3.0.3", "@hive/api": "workspace:*", "@hive/cdn-script": "workspace:*", + "@hive/pubsub": "workspace:*", "@hive/schema": "workspace:*", "@hive/service-common": "workspace:*", "@hive/storage": "workspace:*", diff --git a/packages/services/server/src/index.ts b/packages/services/server/src/index.ts index 44247b21b94..58f11771814 100644 --- a/packages/services/server/src/index.ts +++ b/packages/services/server/src/index.ts @@ -11,7 +11,6 @@ import type { FastifyCorsOptionsDelegateCallback } from '@fastify/cors'; import 'reflect-metadata'; import { z } from 'zod'; import formDataPlugin from '@fastify/formbody'; -import { createHivePubSub } from '@graphql-hive/pubsub'; import { createRegistry, CryptoProvider, @@ -32,6 +31,7 @@ import { ArtifactStorageReader } from '@hive/cdn-script/artifact-storage-reader' import { AwsClient } from '@hive/cdn-script/aws'; import { createIsAppDeploymentActive } from '@hive/cdn-script/is-app-deployment-active'; import { createIsKeyValid } from '@hive/cdn-script/key-validation'; +import { createHivePubSub } from '@hive/pubsub'; import { configureTracing, createServer, diff --git a/packages/services/workflows/package.json b/packages/services/workflows/package.json index 82047163d27..719b31f8c26 100644 --- a/packages/services/workflows/package.json +++ b/packages/services/workflows/package.json @@ -10,10 +10,10 @@ }, "devDependencies": { "@graphql-hive/logger": "1.0.9", - "@graphql-hive/pubsub": "workspace:*", "@graphql-inspector/core": "7.1.2", "@graphql-inspector/patch": "0.1.3-alpha-20260225183305-b1e68e3f363401fe16845d7f731ff8ed3467f5a7", "@graphql-yoga/redis-event-target": "3.0.3", + "@hive/pubsub": "workspace:*", "@hive/service-common": "workspace:*", "@hive/storage": "workspace:*", "@sentry/node": "7.120.2", diff --git a/packages/services/workflows/src/context.ts b/packages/services/workflows/src/context.ts index 9fde02ee615..944ea2b87c4 100644 --- a/packages/services/workflows/src/context.ts +++ b/packages/services/workflows/src/context.ts @@ -1,6 +1,6 @@ import type { DatabasePool } from 'slonik'; import type { Logger } from '@graphql-hive/logger'; -import type { HivePubSub } from '@graphql-hive/pubsub'; +import type { HivePubSub } from '@hive/pubsub'; import type { EmailProvider } from './lib/emails/providers.js'; import type { SchemaProvider } from './lib/schema/provider.js'; import type { RequestBroker } from './lib/webhooks/send-webhook.js'; diff --git a/packages/services/workflows/src/index.ts b/packages/services/workflows/src/index.ts index b1e2b018f5f..db80dd74ef3 100644 --- a/packages/services/workflows/src/index.ts +++ b/packages/services/workflows/src/index.ts @@ -1,7 +1,7 @@ import { run } from 'graphile-worker'; import { createPool } from 'slonik'; import { Logger } from '@graphql-hive/logger'; -import { bridgeGraphileLogger, createHivePubSub } from '@graphql-hive/pubsub'; +import { bridgeGraphileLogger, createHivePubSub } from '@hive/pubsub'; import { createServer, registerShutdown, diff --git a/packages/services/workflows/src/kit.ts b/packages/services/workflows/src/kit.ts index 9e1331a1701..987ba2e3754 100644 --- a/packages/services/workflows/src/kit.ts +++ b/packages/services/workflows/src/kit.ts @@ -4,7 +4,7 @@ import { makeWorkerUtils, WorkerUtils, type JobHelpers, type Task } from 'graphi import type { Pool } from 'pg'; import { z } from 'zod'; import { Logger } from '@graphql-hive/logger'; -import { bridgeGraphileLogger } from '@graphql-hive/pubsub'; +import { bridgeGraphileLogger } from '@hive/pubsub'; import type { Context } from './context'; export type TaskDefinition = { diff --git a/packages/services/workflows/src/logger.ts b/packages/services/workflows/src/logger.ts index 809e4bbb02a..4a66dee026d 100644 --- a/packages/services/workflows/src/logger.ts +++ b/packages/services/workflows/src/logger.ts @@ -1,4 +1,4 @@ -import type { Logger } from '@graphql-hive/pubsub'; +import type { Logger } from '@hive/pubsub'; import type { ServiceLogger } from '@hive/service-common'; export function bridgeFastifyLogger(logger: Logger): ServiceLogger { diff --git a/packages/services/workflows/src/redis.ts b/packages/services/workflows/src/redis.ts index 5d20c75338f..cb1a86034e3 100644 --- a/packages/services/workflows/src/redis.ts +++ b/packages/services/workflows/src/redis.ts @@ -4,7 +4,7 @@ **/ import type { Redis as RedisInstance, RedisOptions } from 'ioredis'; import Redis from 'ioredis'; -import type { Logger } from '@graphql-hive/pubsub'; +import type { Logger } from '@hive/pubsub'; export type { RedisInstance as Redis }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 466c6711c64..60bb6be85fe 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -782,9 +782,6 @@ importers: '@graphql-hive/core': specifier: workspace:* version: link:../../libraries/core/dist - '@graphql-hive/pubsub': - specifier: workspace:* - version: link:../../libraries/pubsub '@graphql-hive/signal': specifier: 1.0.0 version: 1.0.0 @@ -797,6 +794,9 @@ importers: '@hive/cdn-script': specifier: workspace:* version: link:../cdn-worker + '@hive/pubsub': + specifier: workspace:* + version: link:../../libraries/pubsub '@hive/schema': specifier: workspace:* version: link:../schema @@ -1281,9 +1281,6 @@ importers: '@graphql-hive/plugin-opentelemetry': specifier: 1.3.0 version: 1.3.0(encoding@0.1.13)(graphql@16.9.0)(ioredis@5.8.2)(pino@10.3.0)(ws@8.18.0) - '@graphql-hive/pubsub': - specifier: workspace:* - version: link:../../libraries/pubsub '@graphql-hive/yoga': specifier: workspace:* version: link:../../libraries/yoga/dist @@ -1302,6 +1299,9 @@ importers: '@hive/cdn-script': specifier: workspace:* version: link:../cdn-worker + '@hive/pubsub': + specifier: workspace:* + version: link:../../libraries/pubsub '@hive/schema': specifier: workspace:* version: link:../schema @@ -1684,9 +1684,6 @@ importers: '@graphql-hive/logger': specifier: 1.0.9 version: 1.0.9(pino@10.3.0) - '@graphql-hive/pubsub': - specifier: workspace:* - version: link:../../libraries/pubsub '@graphql-inspector/core': specifier: 7.1.2 version: 7.1.2(graphql@16.9.0) @@ -1696,6 +1693,9 @@ importers: '@graphql-yoga/redis-event-target': specifier: 3.0.3 version: 3.0.3(ioredis@5.8.2) + '@hive/pubsub': + specifier: workspace:* + version: link:../../libraries/pubsub '@hive/service-common': specifier: workspace:* version: link:../service-common diff --git a/tsconfig.json b/tsconfig.json index bf7c44003d2..f9d907c4977 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -75,7 +75,7 @@ "@graphql-hive/plugin-opentelemetry/setup": [ "./node_modules/@graphql-hive/plugin-opentelemetry/dist/setup.d.ts" ], - "@graphql-hive/pubsub": ["./packages/libraries/pubsub/src/index.ts"] + "@hive/pubsub": ["./packages/libraries/pubsub/src/index.ts"] } }, "include": ["packages", "tsup.config.node.ts"], From 748f7e4672f13e62671efd84c3571dba54089e1e Mon Sep 17 00:00:00 2001 From: jdolle <1841898+jdolle@users.noreply.github.com> Date: Thu, 26 Feb 2026 15:56:35 -0800 Subject: [PATCH 29/29] Check integrity --- packages/libraries/pubsub/src/index.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/libraries/pubsub/src/index.ts b/packages/libraries/pubsub/src/index.ts index 419c7d2d102..f6c7a6b06b6 100644 --- a/packages/libraries/pubsub/src/index.ts +++ b/packages/libraries/pubsub/src/index.ts @@ -1,9 +1,8 @@ import { createPubSub } from 'graphql-yoga'; import { Redis } from 'ioredis'; import { createRedisEventTarget } from '@graphql-yoga/redis-event-target'; -import type { HivePubSub } from './pub-sub'; - -export * from './logger'; +import { bridgeGraphileLogger, type Logger } from './logger.js'; +import type { HivePubSub } from './pub-sub.js'; export function createHivePubSub(args: { publisher: Redis; subscriber: Redis }) { return createPubSub({ @@ -14,4 +13,4 @@ export function createHivePubSub(args: { publisher: Redis; subscriber: Redis }) }) as HivePubSub; } -export type { HivePubSub }; +export { type HivePubSub, type Logger, bridgeGraphileLogger };