From 77118e114e87bf96035ae3c5ff6b16a401ba800c Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Tue, 17 Mar 2026 09:09:33 +0000 Subject: [PATCH 1/2] feat: consolidate graphile-misc-plugins into graphile-settings and add @requiredInput plugin - Move all plugin source files from graphile-misc-plugins/src/ to graphile-settings/src/plugins/ - Move all tests from graphile-misc-plugins/__tests__/ to graphile-settings/__tests__/ - Update all imports to use local paths instead of graphile-misc-plugins package - Update graphile-settings package.json with dependencies from graphile-misc-plugins - Remove graphile-misc-plugins package from workspace - Implement RequiredInputPlugin: reads @requiredInput smart tag and makes mutation input fields non-nullable - Add RequiredInputPreset to ConstructivePreset - Add comprehensive tests for RequiredInputPlugin (14 test cases) --- graphile/graphile-misc-plugins/CHANGELOG.md | 55 --- graphile/graphile-misc-plugins/README.md | 15 - graphile/graphile-misc-plugins/jest.config.js | 18 - graphile/graphile-misc-plugins/package.json | 61 ---- graphile/graphile-misc-plugins/src/index.ts | 71 ---- .../graphile-misc-plugins/tsconfig.esm.json | 7 - graphile/graphile-misc-plugins/tsconfig.json | 8 - .../__tests__/PublicKeySignature.test.ts | 4 +- .../__snapshots__/meta-schema.test.ts.snap | 0 .../__tests__/meta-schema.test.ts | 2 +- .../__tests__/required-input-plugin.test.ts | 340 ++++++++++++++++++ graphile/graphile-settings/package.json | 4 +- .../src/plugins}/PublicKeySignature.ts | 0 .../src/plugins}/conflict-detector.ts | 0 .../src/plugins}/custom-inflector.ts | 0 .../src/plugins}/enable-all-filter-columns.ts | 0 .../graphile-settings/src/plugins/index.ts | 59 ++- .../src/plugins}/inflector-logger.ts | 0 .../src/plugins}/many-to-many-preset.ts | 0 .../src/plugins}/meta-schema.ts | 0 .../src/plugins}/meta-schema/cache.ts | 0 .../meta-schema/constraint-meta-builders.ts | 0 .../meta-schema/graphql-meta-field.ts | 0 .../plugins}/meta-schema/inflection-utils.ts | 0 .../meta-schema/name-meta-builders.ts | 0 .../src/plugins}/meta-schema/plugin.ts | 0 .../meta-schema/relation-meta-builders.ts | 0 .../meta-schema/table-meta-builder.ts | 0 .../meta-schema/table-meta-context.ts | 0 .../meta-schema/table-resource-utils.ts | 0 .../src/plugins}/meta-schema/type-mappings.ts | 0 .../src/plugins}/meta-schema/types.ts | 0 .../src/plugins}/minimal-preset.ts | 0 .../src/plugins}/pg-type-mappings.ts | 0 .../src/plugins}/primary-key-only.ts | 0 .../src/plugins/required-input-plugin.ts | 112 ++++++ .../src/presets/constructive-preset.ts | 4 +- pnpm-lock.yaml | 282 ++------------- 38 files changed, 538 insertions(+), 504 deletions(-) delete mode 100644 graphile/graphile-misc-plugins/CHANGELOG.md delete mode 100644 graphile/graphile-misc-plugins/README.md delete mode 100644 graphile/graphile-misc-plugins/jest.config.js delete mode 100644 graphile/graphile-misc-plugins/package.json delete mode 100644 graphile/graphile-misc-plugins/src/index.ts delete mode 100644 graphile/graphile-misc-plugins/tsconfig.esm.json delete mode 100644 graphile/graphile-misc-plugins/tsconfig.json rename graphile/{graphile-misc-plugins => graphile-settings}/__tests__/PublicKeySignature.test.ts (95%) rename graphile/{graphile-misc-plugins => graphile-settings}/__tests__/__snapshots__/meta-schema.test.ts.snap (100%) rename graphile/{graphile-misc-plugins => graphile-settings}/__tests__/meta-schema.test.ts (99%) create mode 100644 graphile/graphile-settings/__tests__/required-input-plugin.test.ts rename graphile/{graphile-misc-plugins/src => graphile-settings/src/plugins}/PublicKeySignature.ts (100%) rename graphile/{graphile-misc-plugins/src => graphile-settings/src/plugins}/conflict-detector.ts (100%) rename graphile/{graphile-misc-plugins/src => graphile-settings/src/plugins}/custom-inflector.ts (100%) rename graphile/{graphile-misc-plugins/src => graphile-settings/src/plugins}/enable-all-filter-columns.ts (100%) rename graphile/{graphile-misc-plugins/src => graphile-settings/src/plugins}/inflector-logger.ts (100%) rename graphile/{graphile-misc-plugins/src => graphile-settings/src/plugins}/many-to-many-preset.ts (100%) rename graphile/{graphile-misc-plugins/src => graphile-settings/src/plugins}/meta-schema.ts (100%) rename graphile/{graphile-misc-plugins/src => graphile-settings/src/plugins}/meta-schema/cache.ts (100%) rename graphile/{graphile-misc-plugins/src => graphile-settings/src/plugins}/meta-schema/constraint-meta-builders.ts (100%) rename graphile/{graphile-misc-plugins/src => graphile-settings/src/plugins}/meta-schema/graphql-meta-field.ts (100%) rename graphile/{graphile-misc-plugins/src => graphile-settings/src/plugins}/meta-schema/inflection-utils.ts (100%) rename graphile/{graphile-misc-plugins/src => graphile-settings/src/plugins}/meta-schema/name-meta-builders.ts (100%) rename graphile/{graphile-misc-plugins/src => graphile-settings/src/plugins}/meta-schema/plugin.ts (100%) rename graphile/{graphile-misc-plugins/src => graphile-settings/src/plugins}/meta-schema/relation-meta-builders.ts (100%) rename graphile/{graphile-misc-plugins/src => graphile-settings/src/plugins}/meta-schema/table-meta-builder.ts (100%) rename graphile/{graphile-misc-plugins/src => graphile-settings/src/plugins}/meta-schema/table-meta-context.ts (100%) rename graphile/{graphile-misc-plugins/src => graphile-settings/src/plugins}/meta-schema/table-resource-utils.ts (100%) rename graphile/{graphile-misc-plugins/src => graphile-settings/src/plugins}/meta-schema/type-mappings.ts (100%) rename graphile/{graphile-misc-plugins/src => graphile-settings/src/plugins}/meta-schema/types.ts (100%) rename graphile/{graphile-misc-plugins/src => graphile-settings/src/plugins}/minimal-preset.ts (100%) rename graphile/{graphile-misc-plugins/src => graphile-settings/src/plugins}/pg-type-mappings.ts (100%) rename graphile/{graphile-misc-plugins/src => graphile-settings/src/plugins}/primary-key-only.ts (100%) create mode 100644 graphile/graphile-settings/src/plugins/required-input-plugin.ts diff --git a/graphile/graphile-misc-plugins/CHANGELOG.md b/graphile/graphile-misc-plugins/CHANGELOG.md deleted file mode 100644 index ecbdc4685..000000000 --- a/graphile/graphile-misc-plugins/CHANGELOG.md +++ /dev/null @@ -1,55 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -## [1.4.4](https://github.com/constructive-io/constructive/compare/graphile-misc-plugins@1.4.3...graphile-misc-plugins@1.4.4) (2026-03-15) - -**Note:** Version bump only for package graphile-misc-plugins - -## [1.4.3](https://github.com/constructive-io/constructive/compare/graphile-misc-plugins@1.4.2...graphile-misc-plugins@1.4.3) (2026-03-15) - -### Bug Fixes - -- add null guards for relation lookups in custom-inflector ([47450f5](https://github.com/constructive-io/constructive/commit/47450f5058192558d842a8024f83cf07ce6509b4)) -- align all graphile ecosystem deps to latest compatible pinned RC versions ([d3f7761](https://github.com/constructive-io/constructive/commit/d3f7761182e0470cf992028155d1a5fa00cf9211)) - -## [1.4.2](https://github.com/constructive-io/constructive/compare/graphile-misc-plugins@1.4.1...graphile-misc-plugins@1.4.2) (2026-03-12) - -**Note:** Version bump only for package graphile-misc-plugins - -## [1.4.1](https://github.com/constructive-io/constructive/compare/graphile-misc-plugins@1.3.0...graphile-misc-plugins@1.4.1) (2026-03-12) - -**Note:** Version bump only for package graphile-misc-plugins - -# [1.4.0](https://github.com/constructive-io/constructive/compare/graphile-misc-plugins@1.3.0...graphile-misc-plugins@1.4.0) (2026-03-12) - -**Note:** Version bump only for package graphile-misc-plugins - -# [1.3.0](https://github.com/constructive-io/constructive/compare/graphile-misc-plugins@1.2.1...graphile-misc-plugins@1.3.0) (2026-03-12) - -**Note:** Version bump only for package graphile-misc-plugins - -## [1.2.1](https://github.com/constructive-io/constructive/compare/graphile-misc-plugins@1.2.0...graphile-misc-plugins@1.2.1) (2026-03-04) - -**Note:** Version bump only for package graphile-misc-plugins - -# [1.2.0](https://github.com/constructive-io/constructive/compare/graphile-misc-plugins@1.1.1...graphile-misc-plugins@1.2.0) (2026-03-04) - -### Features - -- replace manual identifier quoting with @pgsql/quotes across all plugins ([8a42a33](https://github.com/constructive-io/constructive/commit/8a42a33ccfcdbba146f2136c70152fd300ee2876)) - -## [1.1.1](https://github.com/constructive-io/constructive/compare/graphile-misc-plugins@1.1.0...graphile-misc-plugins@1.1.1) (2026-02-25) - -### Bug Fixes - -- pin all Graphile ecosystem RC versions and sync inconsistencies ([8f553c1](https://github.com/constructive-io/constructive/commit/8f553c10d0bdc868bc1ac34136a6dfdab76f61b5)) - -# [1.1.0](https://github.com/constructive-io/constructive/compare/graphile-misc-plugins@1.0.1...graphile-misc-plugins@1.1.0) (2026-02-24) - -**Note:** Version bump only for package graphile-misc-plugins - -## 1.0.1 (2026-02-24) - -**Note:** Version bump only for package graphile-misc-plugins diff --git a/graphile/graphile-misc-plugins/README.md b/graphile/graphile-misc-plugins/README.md deleted file mode 100644 index 4dbc508d5..000000000 --- a/graphile/graphile-misc-plugins/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# graphile-misc-plugins - -

- -

- -

- - - - - -

- -Miscellaneous PostGraphile v5 plugins for Constructive: inflection, conflict detection, meta-schema, type mappings, public-key signature, and more. diff --git a/graphile/graphile-misc-plugins/jest.config.js b/graphile/graphile-misc-plugins/jest.config.js deleted file mode 100644 index 057a9420e..000000000 --- a/graphile/graphile-misc-plugins/jest.config.js +++ /dev/null @@ -1,18 +0,0 @@ -/** @type {import('ts-jest').JestConfigWithTsJest} */ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', - transform: { - '^.+\\.tsx?$': [ - 'ts-jest', - { - babelConfig: false, - tsconfig: 'tsconfig.json', - }, - ], - }, - transformIgnorePatterns: [`/node_modules/*`], - testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$', - moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], - modulePathIgnorePatterns: ['dist/*'] -}; diff --git a/graphile/graphile-misc-plugins/package.json b/graphile/graphile-misc-plugins/package.json deleted file mode 100644 index 322ba4b09..000000000 --- a/graphile/graphile-misc-plugins/package.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "name": "graphile-misc-plugins", - "version": "1.4.4", - "author": "Constructive ", - "description": "Miscellaneous PostGraphile v5 plugins: inflection, conflict detection, meta-schema, type mappings, and more", - "main": "index.js", - "module": "esm/index.js", - "types": "index.d.ts", - "homepage": "https://github.com/constructive-io/constructive", - "license": "MIT", - "publishConfig": { - "access": "public", - "directory": "dist" - }, - "repository": { - "type": "git", - "url": "https://github.com/constructive-io/constructive" - }, - "bugs": { - "url": "https://github.com/constructive-io/constructive/issues" - }, - "scripts": { - "clean": "makage clean", - "prepack": "npm run build", - "build": "makage build", - "build:dev": "makage build --dev", - "lint": "eslint . --fix", - "test": "jest", - "test:watch": "jest --watch" - }, - "dependencies": { - "@graphile-contrib/pg-many-to-many": "2.0.0-rc.2", - "@pgsql/quotes": "^17.1.0", - "graphile-utils": "5.0.0-rc.8", - "inflekt": "^0.3.3", - "pg": "^8.20.0", - "pg-query-context": "workspace:^" - }, - "peerDependencies": { - "grafast": "1.0.0-rc.9", - "graphile-build": "5.0.0-rc.6", - "graphile-build-pg": "5.0.0-rc.8", - "graphile-config": "1.0.0-rc.6", - "graphql": "16.13.0", - "pg-sql2": "5.0.0-rc.5" - }, - "devDependencies": { - "@types/node": "^22.19.11", - "makage": "^0.1.10" - }, - "keywords": [ - "postgraphile", - "graphile", - "constructive", - "plugin", - "inflection", - "meta-schema", - "postgres", - "graphql" - ] -} diff --git a/graphile/graphile-misc-plugins/src/index.ts b/graphile/graphile-misc-plugins/src/index.ts deleted file mode 100644 index b38adc43a..000000000 --- a/graphile/graphile-misc-plugins/src/index.ts +++ /dev/null @@ -1,71 +0,0 @@ -/** - * graphile-misc-plugins - * - * Miscellaneous PostGraphile v5 plugins: inflection, conflict detection, - * meta-schema, type mappings, public-key signature, and more. - */ - -// Minimal preset - PostGraphile without Node/Relay features -export { MinimalPreset } from './minimal-preset'; - -// Custom inflector using inflekt library -export { - InflektPlugin, - InflektPreset, - CustomInflectorPlugin, - CustomInflectorPreset, -} from './custom-inflector'; - -// Conflict detector for multi-schema setups -export { - ConflictDetectorPlugin, - ConflictDetectorPreset, -} from './conflict-detector'; - -// Inflector logger for debugging -export { - InflectorLoggerPlugin, - InflectorLoggerPreset, -} from './inflector-logger'; - -// Enable filtering on all columns (not just indexed) -export { - EnableAllFilterColumnsPlugin, - EnableAllFilterColumnsPreset, -} from './enable-all-filter-columns'; - -// Many-to-many with opt-in behavior -export { - ManyToManyOptInPlugin, - ManyToManyOptInPreset, -} from './many-to-many-preset'; - -// Primary key only lookups (disable non-PK unique constraints) -export { - createUniqueLookupPlugin, - PrimaryKeyOnlyPlugin, - NoUniqueLookupPlugin, - PrimaryKeyOnlyPreset, - NoUniqueLookupPreset, -} from './primary-key-only'; -export type { UniqueLookupOptions } from './primary-key-only'; - -// Meta schema plugin for introspection (tables, fields, indexes, constraints) -export { - MetaSchemaPlugin, - MetaSchemaPreset, -} from './meta-schema'; - -// PG type mappings for custom PostgreSQL types (email, url, etc.) -export { - PgTypeMappingsPlugin, - PgTypeMappingsPreset, -} from './pg-type-mappings'; -export type { TypeMapping } from './pg-type-mappings'; - -// Public key signature plugin for crypto authentication -export { PublicKeySignature } from './PublicKeySignature'; -export type { PublicKeyChallengeConfig } from './PublicKeySignature'; - -// Internal exports for testing -export { _pgTypeToGqlType, _buildFieldMeta, _cachedTablesMeta } from './meta-schema'; diff --git a/graphile/graphile-misc-plugins/tsconfig.esm.json b/graphile/graphile-misc-plugins/tsconfig.esm.json deleted file mode 100644 index f624f9670..000000000 --- a/graphile/graphile-misc-plugins/tsconfig.esm.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "dist/esm", - "module": "ESNext" - } -} diff --git a/graphile/graphile-misc-plugins/tsconfig.json b/graphile/graphile-misc-plugins/tsconfig.json deleted file mode 100644 index 9c8a7d7c1..000000000 --- a/graphile/graphile-misc-plugins/tsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "outDir": "dist", - "rootDir": "src" - }, - "include": ["src/**/*"] -} diff --git a/graphile/graphile-misc-plugins/__tests__/PublicKeySignature.test.ts b/graphile/graphile-settings/__tests__/PublicKeySignature.test.ts similarity index 95% rename from graphile/graphile-misc-plugins/__tests__/PublicKeySignature.test.ts rename to graphile/graphile-settings/__tests__/PublicKeySignature.test.ts index 651466740..c3bf0dad1 100644 --- a/graphile/graphile-misc-plugins/__tests__/PublicKeySignature.test.ts +++ b/graphile/graphile-settings/__tests__/PublicKeySignature.test.ts @@ -1,5 +1,5 @@ -import { PublicKeySignature } from '../src/PublicKeySignature'; -import type { PublicKeyChallengeConfig } from '../src/PublicKeySignature'; +import { PublicKeySignature } from '../src/plugins/PublicKeySignature'; +import type { PublicKeyChallengeConfig } from '../src/plugins/PublicKeySignature'; const defaultConfig: PublicKeyChallengeConfig = { schema: 'app_private', diff --git a/graphile/graphile-misc-plugins/__tests__/__snapshots__/meta-schema.test.ts.snap b/graphile/graphile-settings/__tests__/__snapshots__/meta-schema.test.ts.snap similarity index 100% rename from graphile/graphile-misc-plugins/__tests__/__snapshots__/meta-schema.test.ts.snap rename to graphile/graphile-settings/__tests__/__snapshots__/meta-schema.test.ts.snap diff --git a/graphile/graphile-misc-plugins/__tests__/meta-schema.test.ts b/graphile/graphile-settings/__tests__/meta-schema.test.ts similarity index 99% rename from graphile/graphile-misc-plugins/__tests__/meta-schema.test.ts rename to graphile/graphile-settings/__tests__/meta-schema.test.ts index fb09922e5..6ad52365b 100644 --- a/graphile/graphile-misc-plugins/__tests__/meta-schema.test.ts +++ b/graphile/graphile-settings/__tests__/meta-schema.test.ts @@ -3,7 +3,7 @@ import { _pgTypeToGqlType, _buildFieldMeta, _cachedTablesMeta, -} from '../src/meta-schema'; +} from '../src/plugins/meta-schema'; import { parse, print, diff --git a/graphile/graphile-settings/__tests__/required-input-plugin.test.ts b/graphile/graphile-settings/__tests__/required-input-plugin.test.ts new file mode 100644 index 000000000..e0efee781 --- /dev/null +++ b/graphile/graphile-settings/__tests__/required-input-plugin.test.ts @@ -0,0 +1,340 @@ +import { GraphQLNonNull, GraphQLString, GraphQLInt } from 'graphql'; +import { RequiredInputPlugin, RequiredInputPreset } from '../src/plugins/required-input-plugin'; + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +function createMockAttribute(name: string, opts: Record = {}) { + return { + codec: { name: 'text' }, + notNull: false, + hasDefault: false, + extensions: opts.extensions || {}, + ...opts, + }; +} + +function createMockCodec( + name: string, + attributes: Record, +) { + return { + name, + attributes, + isAnonymous: false, + extensions: { pg: { schemaName: 'app_public' } }, + }; +} + +function createMockBuild() { + return { + graphql: { GraphQLNonNull }, + inflection: { + attribute({ attributeName }: { attributeName: string }) { + // Simple camelCase conversion: snake_case -> camelCase + return attributeName.replace(/_([a-z])/g, (_: string, c: string) => c.toUpperCase()); + }, + }, + extend(base: Record, extra: Record, _hint: string) { + return { ...base, ...extra }; + }, + }; +} + +function callHook( + fields: Record, + build: any, + scope: Record, +) { + const hook = RequiredInputPlugin.schema!.hooks!.GraphQLInputObjectType_fields as ( + fields: Record, + build: any, + context: { scope: Record }, + ) => Record; + return hook(fields, build, { scope }); +} + +// --------------------------------------------------------------------------- +// Tests +// --------------------------------------------------------------------------- + +describe('RequiredInputPlugin', () => { + it('exports a valid plugin object', () => { + expect(RequiredInputPlugin).toBeDefined(); + expect(RequiredInputPlugin.name).toBe('RequiredInputPlugin'); + expect(RequiredInputPlugin.version).toBe('1.0.0'); + expect(RequiredInputPlugin.schema).toBeDefined(); + expect(RequiredInputPlugin.schema!.hooks).toBeDefined(); + expect(RequiredInputPlugin.schema!.hooks!.GraphQLInputObjectType_fields).toBeDefined(); + }); + + it('wraps @requiredInput tagged field with NonNull in mutation input', () => { + const codec = createMockCodec('membership', { + id: createMockAttribute('id', { notNull: true, hasDefault: true }), + grantor_id: createMockAttribute('grantor_id', { + extensions: { tags: { requiredInput: true } }, + }), + name: createMockAttribute('name'), + }); + + const fields = { + id: { type: GraphQLString }, + grantorId: { type: GraphQLString }, + name: { type: GraphQLString }, + }; + + const build = createMockBuild(); + const result = callHook(fields, build, { + pgCodec: codec, + isMutationInput: true, + }); + + // grantorId should be wrapped with NonNull + expect(result.grantorId.type).toBeInstanceOf(GraphQLNonNull); + expect(result.grantorId.type.ofType).toBe(GraphQLString); + + // Other fields should remain unchanged + expect(result.id.type).toBe(GraphQLString); + expect(result.name.type).toBe(GraphQLString); + }); + + it('wraps @requiredInput tagged field in isPgPatch scope', () => { + const codec = createMockCodec('membership', { + grantor_id: createMockAttribute('grantor_id', { + extensions: { tags: { requiredInput: true } }, + }), + }); + + const fields = { + grantorId: { type: GraphQLString }, + }; + + const build = createMockBuild(); + const result = callHook(fields, build, { + pgCodec: codec, + isPgPatch: true, + }); + + expect(result.grantorId.type).toBeInstanceOf(GraphQLNonNull); + }); + + it('wraps @requiredInput tagged field in isPgBaseInput scope', () => { + const codec = createMockCodec('membership', { + grantor_id: createMockAttribute('grantor_id', { + extensions: { tags: { requiredInput: true } }, + }), + }); + + const fields = { + grantorId: { type: GraphQLString }, + }; + + const build = createMockBuild(); + const result = callHook(fields, build, { + pgCodec: codec, + isPgBaseInput: true, + }); + + expect(result.grantorId.type).toBeInstanceOf(GraphQLNonNull); + }); + + it('does not modify fields when no @requiredInput tag is present', () => { + const codec = createMockCodec('user', { + id: createMockAttribute('id'), + email: createMockAttribute('email'), + }); + + const fields = { + id: { type: GraphQLString }, + email: { type: GraphQLString }, + }; + + const build = createMockBuild(); + const result = callHook(fields, build, { + pgCodec: codec, + isMutationInput: true, + }); + + expect(result.id.type).toBe(GraphQLString); + expect(result.email.type).toBe(GraphQLString); + }); + + it('does not modify fields for non-mutation input types', () => { + const codec = createMockCodec('membership', { + grantor_id: createMockAttribute('grantor_id', { + extensions: { tags: { requiredInput: true } }, + }), + }); + + const fields = { + grantorId: { type: GraphQLString }, + }; + + const build = createMockBuild(); + + // Not a mutation input type (e.g., a filter or condition type) + const result = callHook(fields, build, { + pgCodec: codec, + isPgPatch: false, + isPgBaseInput: false, + isMutationInput: false, + }); + + expect(result.grantorId.type).toBe(GraphQLString); + }); + + it('returns fields unchanged when pgCodec is missing', () => { + const fields = { + id: { type: GraphQLString }, + }; + + const build = createMockBuild(); + const result = callHook(fields, build, {}); + + expect(result).toBe(fields); + }); + + it('returns fields unchanged when pgCodec has no attributes', () => { + const codec = { name: 'custom_type', isAnonymous: false }; + + const fields = { + id: { type: GraphQLString }, + }; + + const build = createMockBuild(); + const result = callHook(fields, build, { + pgCodec: codec, + isMutationInput: true, + }); + + expect(result).toBe(fields); + }); + + it('skips fields that are already NonNull', () => { + const codec = createMockCodec('membership', { + grantor_id: createMockAttribute('grantor_id', { + notNull: true, + extensions: { tags: { requiredInput: true } }, + }), + }); + + const alreadyNonNull = new GraphQLNonNull(GraphQLString); + const fields = { + grantorId: { type: alreadyNonNull }, + }; + + const build = createMockBuild(); + const result = callHook(fields, build, { + pgCodec: codec, + isMutationInput: true, + }); + + // Should remain the same NonNull instance, not double-wrapped + expect(result.grantorId.type).toBe(alreadyNonNull); + }); + + it('handles multiple @requiredInput fields on the same codec', () => { + const codec = createMockCodec('invite', { + sender_id: createMockAttribute('sender_id', { + extensions: { tags: { requiredInput: true } }, + }), + receiver_id: createMockAttribute('receiver_id', { + extensions: { tags: { requiredInput: true } }, + }), + message: createMockAttribute('message'), + }); + + const fields = { + senderId: { type: GraphQLString }, + receiverId: { type: GraphQLString }, + message: { type: GraphQLString }, + }; + + const build = createMockBuild(); + const result = callHook(fields, build, { + pgCodec: codec, + isMutationInput: true, + }); + + expect(result.senderId.type).toBeInstanceOf(GraphQLNonNull); + expect(result.receiverId.type).toBeInstanceOf(GraphQLNonNull); + expect(result.message.type).toBe(GraphQLString); + }); + + it('skips attributes whose GraphQL field does not exist', () => { + const codec = createMockCodec('membership', { + hidden_field: createMockAttribute('hidden_field', { + extensions: { tags: { requiredInput: true } }, + }), + }); + + // The field is not in the GraphQL fields (e.g., omitted by another plugin) + const fields = { + someOtherField: { type: GraphQLString }, + }; + + const build = createMockBuild(); + const result = callHook(fields, build, { + pgCodec: codec, + isMutationInput: true, + }); + + // Should not crash, fields unchanged + expect(result.someOtherField.type).toBe(GraphQLString); + }); + + it('preserves existing field properties when wrapping', () => { + const codec = createMockCodec('membership', { + grantor_id: createMockAttribute('grantor_id', { + extensions: { tags: { requiredInput: true } }, + }), + }); + + const fields = { + grantorId: { + type: GraphQLString, + description: 'The grantor of this membership', + extensions: { someExtension: true }, + }, + }; + + const build = createMockBuild(); + const result = callHook(fields, build, { + pgCodec: codec, + isMutationInput: true, + }); + + expect(result.grantorId.type).toBeInstanceOf(GraphQLNonNull); + expect(result.grantorId.description).toBe('The grantor of this membership'); + expect(result.grantorId.extensions).toEqual({ someExtension: true }); + }); + + it('works with non-string types (e.g., GraphQLInt)', () => { + const codec = createMockCodec('score', { + player_id: createMockAttribute('player_id', { + extensions: { tags: { requiredInput: true } }, + }), + }); + + const fields = { + playerId: { type: GraphQLInt }, + }; + + const build = createMockBuild(); + const result = callHook(fields, build, { + pgCodec: codec, + isMutationInput: true, + }); + + expect(result.playerId.type).toBeInstanceOf(GraphQLNonNull); + expect(result.playerId.type.ofType).toBe(GraphQLInt); + }); +}); + +describe('RequiredInputPreset', () => { + it('exports a valid preset with the plugin', () => { + expect(RequiredInputPreset).toBeDefined(); + expect(RequiredInputPreset.plugins).toContain(RequiredInputPlugin); + }); +}); diff --git a/graphile/graphile-settings/package.json b/graphile/graphile-settings/package.json index 7b007e391..05637cd29 100644 --- a/graphile/graphile-settings/package.json +++ b/graphile/graphile-settings/package.json @@ -46,7 +46,9 @@ "graphile-build-pg": "5.0.0-rc.8", "graphile-config": "1.0.0-rc.6", "graphile-connection-filter": "workspace:^", - "graphile-misc-plugins": "workspace:^", + "graphile-utils": "5.0.0-rc.8", + "@pgsql/quotes": "^17.1.0", + "pg-query-context": "workspace:^", "graphile-postgis": "workspace:^", "graphile-search": "workspace:^", "graphile-sql-expression-validator": "workspace:^", diff --git a/graphile/graphile-misc-plugins/src/PublicKeySignature.ts b/graphile/graphile-settings/src/plugins/PublicKeySignature.ts similarity index 100% rename from graphile/graphile-misc-plugins/src/PublicKeySignature.ts rename to graphile/graphile-settings/src/plugins/PublicKeySignature.ts diff --git a/graphile/graphile-misc-plugins/src/conflict-detector.ts b/graphile/graphile-settings/src/plugins/conflict-detector.ts similarity index 100% rename from graphile/graphile-misc-plugins/src/conflict-detector.ts rename to graphile/graphile-settings/src/plugins/conflict-detector.ts diff --git a/graphile/graphile-misc-plugins/src/custom-inflector.ts b/graphile/graphile-settings/src/plugins/custom-inflector.ts similarity index 100% rename from graphile/graphile-misc-plugins/src/custom-inflector.ts rename to graphile/graphile-settings/src/plugins/custom-inflector.ts diff --git a/graphile/graphile-misc-plugins/src/enable-all-filter-columns.ts b/graphile/graphile-settings/src/plugins/enable-all-filter-columns.ts similarity index 100% rename from graphile/graphile-misc-plugins/src/enable-all-filter-columns.ts rename to graphile/graphile-settings/src/plugins/enable-all-filter-columns.ts diff --git a/graphile/graphile-settings/src/plugins/index.ts b/graphile/graphile-settings/src/plugins/index.ts index 3f0ca86f5..a82595915 100644 --- a/graphile/graphile-settings/src/plugins/index.ts +++ b/graphile/graphile-settings/src/plugins/index.ts @@ -1,40 +1,79 @@ /** * PostGraphile v5 Plugins * - * This module re-exports all custom plugins. - * Plugin implementations have been moved to graphile-misc-plugins. + * This module exports all custom plugins (consolidated from graphile-misc-plugins). */ -// Re-export all plugins from graphile-misc-plugins +// Minimal preset - PostGraphile without Node/Relay features +export { MinimalPreset } from './minimal-preset'; + +// Custom inflector using inflekt library export { - MinimalPreset, InflektPlugin, InflektPreset, CustomInflectorPlugin, CustomInflectorPreset, +} from './custom-inflector'; + +// Conflict detector for multi-schema setups +export { ConflictDetectorPlugin, ConflictDetectorPreset, +} from './conflict-detector'; + +// Inflector logger for debugging +export { InflectorLoggerPlugin, InflectorLoggerPreset, +} from './inflector-logger'; + +// Enable filtering on all columns (not just indexed) +export { EnableAllFilterColumnsPlugin, EnableAllFilterColumnsPreset, +} from './enable-all-filter-columns'; + +// Many-to-many with opt-in behavior +export { ManyToManyOptInPlugin, ManyToManyOptInPreset, +} from './many-to-many-preset'; + +// Primary key only lookups (disable non-PK unique constraints) +export { createUniqueLookupPlugin, PrimaryKeyOnlyPlugin, NoUniqueLookupPlugin, PrimaryKeyOnlyPreset, NoUniqueLookupPreset, +} from './primary-key-only'; +export type { UniqueLookupOptions } from './primary-key-only'; + +// Meta schema plugin for introspection (tables, fields, indexes, constraints) +export { MetaSchemaPlugin, MetaSchemaPreset, +} from './meta-schema'; + +// PG type mappings for custom PostgreSQL types (email, url, etc.) +export { PgTypeMappingsPlugin, PgTypeMappingsPreset, - PublicKeySignature, - _cachedTablesMeta, - _pgTypeToGqlType, - _buildFieldMeta, -} from 'graphile-misc-plugins'; -export type { UniqueLookupOptions, TypeMapping, PublicKeyChallengeConfig } from 'graphile-misc-plugins'; +} from './pg-type-mappings'; +export type { TypeMapping } from './pg-type-mappings'; + +// Public key signature plugin for crypto authentication +export { PublicKeySignature } from './PublicKeySignature'; +export type { PublicKeyChallengeConfig } from './PublicKeySignature'; + +// Internal exports for testing +export { _pgTypeToGqlType, _buildFieldMeta, _cachedTablesMeta } from './meta-schema'; + +// Required input plugin - makes @requiredInput tagged fields non-nullable in mutation inputs +export { + RequiredInputPlugin, + RequiredInputPreset, +} from './required-input-plugin'; // Unified search — tsvector + BM25 + pg_trgm + pgvector behind a single adapter architecture export { diff --git a/graphile/graphile-misc-plugins/src/inflector-logger.ts b/graphile/graphile-settings/src/plugins/inflector-logger.ts similarity index 100% rename from graphile/graphile-misc-plugins/src/inflector-logger.ts rename to graphile/graphile-settings/src/plugins/inflector-logger.ts diff --git a/graphile/graphile-misc-plugins/src/many-to-many-preset.ts b/graphile/graphile-settings/src/plugins/many-to-many-preset.ts similarity index 100% rename from graphile/graphile-misc-plugins/src/many-to-many-preset.ts rename to graphile/graphile-settings/src/plugins/many-to-many-preset.ts diff --git a/graphile/graphile-misc-plugins/src/meta-schema.ts b/graphile/graphile-settings/src/plugins/meta-schema.ts similarity index 100% rename from graphile/graphile-misc-plugins/src/meta-schema.ts rename to graphile/graphile-settings/src/plugins/meta-schema.ts diff --git a/graphile/graphile-misc-plugins/src/meta-schema/cache.ts b/graphile/graphile-settings/src/plugins/meta-schema/cache.ts similarity index 100% rename from graphile/graphile-misc-plugins/src/meta-schema/cache.ts rename to graphile/graphile-settings/src/plugins/meta-schema/cache.ts diff --git a/graphile/graphile-misc-plugins/src/meta-schema/constraint-meta-builders.ts b/graphile/graphile-settings/src/plugins/meta-schema/constraint-meta-builders.ts similarity index 100% rename from graphile/graphile-misc-plugins/src/meta-schema/constraint-meta-builders.ts rename to graphile/graphile-settings/src/plugins/meta-schema/constraint-meta-builders.ts diff --git a/graphile/graphile-misc-plugins/src/meta-schema/graphql-meta-field.ts b/graphile/graphile-settings/src/plugins/meta-schema/graphql-meta-field.ts similarity index 100% rename from graphile/graphile-misc-plugins/src/meta-schema/graphql-meta-field.ts rename to graphile/graphile-settings/src/plugins/meta-schema/graphql-meta-field.ts diff --git a/graphile/graphile-misc-plugins/src/meta-schema/inflection-utils.ts b/graphile/graphile-settings/src/plugins/meta-schema/inflection-utils.ts similarity index 100% rename from graphile/graphile-misc-plugins/src/meta-schema/inflection-utils.ts rename to graphile/graphile-settings/src/plugins/meta-schema/inflection-utils.ts diff --git a/graphile/graphile-misc-plugins/src/meta-schema/name-meta-builders.ts b/graphile/graphile-settings/src/plugins/meta-schema/name-meta-builders.ts similarity index 100% rename from graphile/graphile-misc-plugins/src/meta-schema/name-meta-builders.ts rename to graphile/graphile-settings/src/plugins/meta-schema/name-meta-builders.ts diff --git a/graphile/graphile-misc-plugins/src/meta-schema/plugin.ts b/graphile/graphile-settings/src/plugins/meta-schema/plugin.ts similarity index 100% rename from graphile/graphile-misc-plugins/src/meta-schema/plugin.ts rename to graphile/graphile-settings/src/plugins/meta-schema/plugin.ts diff --git a/graphile/graphile-misc-plugins/src/meta-schema/relation-meta-builders.ts b/graphile/graphile-settings/src/plugins/meta-schema/relation-meta-builders.ts similarity index 100% rename from graphile/graphile-misc-plugins/src/meta-schema/relation-meta-builders.ts rename to graphile/graphile-settings/src/plugins/meta-schema/relation-meta-builders.ts diff --git a/graphile/graphile-misc-plugins/src/meta-schema/table-meta-builder.ts b/graphile/graphile-settings/src/plugins/meta-schema/table-meta-builder.ts similarity index 100% rename from graphile/graphile-misc-plugins/src/meta-schema/table-meta-builder.ts rename to graphile/graphile-settings/src/plugins/meta-schema/table-meta-builder.ts diff --git a/graphile/graphile-misc-plugins/src/meta-schema/table-meta-context.ts b/graphile/graphile-settings/src/plugins/meta-schema/table-meta-context.ts similarity index 100% rename from graphile/graphile-misc-plugins/src/meta-schema/table-meta-context.ts rename to graphile/graphile-settings/src/plugins/meta-schema/table-meta-context.ts diff --git a/graphile/graphile-misc-plugins/src/meta-schema/table-resource-utils.ts b/graphile/graphile-settings/src/plugins/meta-schema/table-resource-utils.ts similarity index 100% rename from graphile/graphile-misc-plugins/src/meta-schema/table-resource-utils.ts rename to graphile/graphile-settings/src/plugins/meta-schema/table-resource-utils.ts diff --git a/graphile/graphile-misc-plugins/src/meta-schema/type-mappings.ts b/graphile/graphile-settings/src/plugins/meta-schema/type-mappings.ts similarity index 100% rename from graphile/graphile-misc-plugins/src/meta-schema/type-mappings.ts rename to graphile/graphile-settings/src/plugins/meta-schema/type-mappings.ts diff --git a/graphile/graphile-misc-plugins/src/meta-schema/types.ts b/graphile/graphile-settings/src/plugins/meta-schema/types.ts similarity index 100% rename from graphile/graphile-misc-plugins/src/meta-schema/types.ts rename to graphile/graphile-settings/src/plugins/meta-schema/types.ts diff --git a/graphile/graphile-misc-plugins/src/minimal-preset.ts b/graphile/graphile-settings/src/plugins/minimal-preset.ts similarity index 100% rename from graphile/graphile-misc-plugins/src/minimal-preset.ts rename to graphile/graphile-settings/src/plugins/minimal-preset.ts diff --git a/graphile/graphile-misc-plugins/src/pg-type-mappings.ts b/graphile/graphile-settings/src/plugins/pg-type-mappings.ts similarity index 100% rename from graphile/graphile-misc-plugins/src/pg-type-mappings.ts rename to graphile/graphile-settings/src/plugins/pg-type-mappings.ts diff --git a/graphile/graphile-misc-plugins/src/primary-key-only.ts b/graphile/graphile-settings/src/plugins/primary-key-only.ts similarity index 100% rename from graphile/graphile-misc-plugins/src/primary-key-only.ts rename to graphile/graphile-settings/src/plugins/primary-key-only.ts diff --git a/graphile/graphile-settings/src/plugins/required-input-plugin.ts b/graphile/graphile-settings/src/plugins/required-input-plugin.ts new file mode 100644 index 000000000..5256e6c1c --- /dev/null +++ b/graphile/graphile-settings/src/plugins/required-input-plugin.ts @@ -0,0 +1,112 @@ +import 'graphile-build'; +import 'graphile-build-pg'; +import type { GraphileConfig } from 'graphile-config'; + +/** + * RequiredInputPlugin - Makes @requiredInput tagged fields non-nullable in mutation inputs. + * + * WHY THIS EXISTS: + * Some foreign key columns are nullable at the database level (to allow SET NULL cascades + * on FK deletion) but should be required at the API level (the application should always + * provide a value when creating or updating a record). + * + * The `api_required` column in constructive-db's metaschema injects a `@requiredInput` + * smart tag via PostgreSQL COMMENT ON COLUMN. This plugin reads that tag and wraps the + * corresponding GraphQL input field type with NonNull, making it required in mutations + * while keeping the output type nullable. + * + * USAGE: + * In the database, set the smart tag on a column: + * COMMENT ON COLUMN app_public.membership.grantor_id IS E'@requiredInput'; + * + * Or via constructive-db's metaschema: + * UPDATE metaschema_public.field SET api_required = true WHERE ...; + * + * The trigger `tg_sync_api_required_smart_tag` will inject `{"requiredInput": true}` + * into the column's smart_tags JSONB, which PostGraphile reads as `@requiredInput`. + * + * RESULT: + * - Mutation input types (create, patch, base): field becomes non-nullable (required) + * - Output types: field remains nullable (unchanged) + * - Query filters: unaffected + */ +export const RequiredInputPlugin: GraphileConfig.Plugin = { + name: 'RequiredInputPlugin', + version: '1.0.0', + description: 'Makes @requiredInput tagged fields non-nullable in mutation input types', + + schema: { + hooks: { + GraphQLInputObjectType_fields(fields, build, context) { + const { + scope: { pgCodec, isPgPatch, isPgBaseInput, isMutationInput }, + } = context; + + // Only process row-based input types (create inputs, patch inputs, base inputs) + if (!pgCodec || !pgCodec.attributes) { + return fields; + } + + // Must be a mutation-related input type + if (!isPgPatch && !isPgBaseInput && !isMutationInput) { + return fields; + } + + const { + graphql: { GraphQLNonNull }, + } = build; + + let newFields = fields; + + for (const [attributeName, attribute] of Object.entries( + pgCodec.attributes as Record + )) { + // Check for @requiredInput smart tag + const tags = attribute.extensions?.tags; + if (!tags || !tags.requiredInput) { + continue; + } + + // Find the corresponding GraphQL field name using inflection + const fieldName = build.inflection.attribute({ + codec: pgCodec as any, + attributeName, + }); + + const existingField = newFields[fieldName]; + if (!existingField) { + continue; + } + + // If the field type is already NonNull, skip + const fieldType = existingField.type; + if (fieldType instanceof GraphQLNonNull) { + continue; + } + + // Wrap the field type with NonNull to make it required + newFields = build.extend( + newFields, + { + [fieldName]: { + ...existingField, + type: new GraphQLNonNull(fieldType), + }, + }, + `RequiredInputPlugin making '${fieldName}' non-nullable on '${pgCodec.name}' (via @requiredInput smart tag)` + ); + } + + return newFields; + }, + }, + }, +}; + +/** + * Preset that includes the RequiredInputPlugin. + * Add this to your main preset's `extends` array. + */ +export const RequiredInputPreset: GraphileConfig.Preset = { + plugins: [RequiredInputPlugin], +}; diff --git a/graphile/graphile-settings/src/presets/constructive-preset.ts b/graphile/graphile-settings/src/presets/constructive-preset.ts index ff8b80ed8..5c7cd87d3 100644 --- a/graphile/graphile-settings/src/presets/constructive-preset.ts +++ b/graphile/graphile-settings/src/presets/constructive-preset.ts @@ -10,7 +10,8 @@ import { ManyToManyOptInPreset, MetaSchemaPreset, PgTypeMappingsPreset, -} from 'graphile-misc-plugins'; + RequiredInputPreset, +} from '../plugins'; import { UnifiedSearchPreset, createMatchesOperatorFactory, createTrgmOperatorFactories } from 'graphile-search'; import { GraphilePostgisPreset, createPostgisOperatorFactory } from 'graphile-postgis'; import { UploadPreset } from 'graphile-upload-plugin'; @@ -88,6 +89,7 @@ export const ConstructivePreset: GraphileConfig.Preset = { }), SqlExpressionValidatorPreset(), PgTypeMappingsPreset, + RequiredInputPreset, ], /** * Disable PostGraphile core's condition argument entirely. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b09ccb50d..23d692e4d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -177,7 +177,7 @@ importers: version: 5.2.1 grafserv: specifier: 1.0.0-rc.7 - version: 1.0.0-rc.7(@types/node@22.19.15)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(ws@8.19.0) + version: 1.0.0-rc.7(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(ws@8.19.0) lru-cache: specifier: ^11.2.7 version: 11.2.7 @@ -186,7 +186,7 @@ importers: version: link:../../postgres/pg-cache/dist postgraphile: specifier: 5.0.0-rc.10 - version: 5.0.0-rc.10(5332e63d4aec2fecbd1a6d13baaf27e0) + version: 5.0.0-rc.10(01f6c3872a4afea0bb2f9f52d380dd87) devDependencies: '@types/express': specifier: ^5.0.6 @@ -199,7 +199,7 @@ importers: version: 3.1.14 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@22.19.15)(typescript@5.9.3) + version: 10.9.2(@types/node@25.5.0)(typescript@5.9.3) publishDirectory: dist graphile/graphile-connection-filter: @@ -240,53 +240,6 @@ importers: version: link:../../postgres/pgsql-test/dist publishDirectory: dist - graphile/graphile-misc-plugins: - dependencies: - '@graphile-contrib/pg-many-to-many': - specifier: 2.0.0-rc.2 - version: 2.0.0-rc.2 - '@pgsql/quotes': - specifier: ^17.1.0 - version: 17.1.0 - grafast: - specifier: 1.0.0-rc.9 - version: 1.0.0-rc.9(graphql@16.13.0) - graphile-build: - specifier: 5.0.0-rc.6 - version: 5.0.0-rc.6(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0) - graphile-build-pg: - specifier: 5.0.0-rc.8 - version: 5.0.0-rc.8(@dataplan/pg@1.0.0-rc.8(@dataplan/json@1.0.0-rc.6(grafast@1.0.0-rc.9(graphql@16.13.0)))(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0)(pg-sql2@5.0.0-rc.5)(pg@8.20.0))(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-build@5.0.0-rc.6(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0)(pg-sql2@5.0.0-rc.5)(pg@8.20.0)(tamedevil@0.1.0-rc.6) - graphile-config: - specifier: 1.0.0-rc.6 - version: 1.0.0-rc.6 - graphile-utils: - specifier: 5.0.0-rc.8 - version: 5.0.0-rc.8(@dataplan/pg@1.0.0-rc.8(@dataplan/json@1.0.0-rc.6(grafast@1.0.0-rc.9(graphql@16.13.0)))(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0)(pg-sql2@5.0.0-rc.5)(pg@8.20.0))(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-build-pg@5.0.0-rc.8(@dataplan/pg@1.0.0-rc.8(@dataplan/json@1.0.0-rc.6(grafast@1.0.0-rc.9(graphql@16.13.0)))(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0)(pg-sql2@5.0.0-rc.5)(pg@8.20.0))(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-build@5.0.0-rc.6(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0)(pg-sql2@5.0.0-rc.5)(pg@8.20.0)(tamedevil@0.1.0-rc.6))(graphile-build@5.0.0-rc.6(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0)(tamedevil@0.1.0-rc.6) - graphql: - specifier: 16.13.0 - version: 16.13.0 - inflekt: - specifier: ^0.3.3 - version: 0.3.3 - pg: - specifier: ^8.20.0 - version: 8.20.0 - pg-query-context: - specifier: workspace:^ - version: link:../../postgres/pg-query-context/dist - pg-sql2: - specifier: 5.0.0-rc.5 - version: 5.0.0-rc.5 - devDependencies: - '@types/node': - specifier: ^22.19.11 - version: 22.19.11 - makage: - specifier: ^0.1.10 - version: 0.1.12 - publishDirectory: dist - graphile/graphile-postgis: dependencies: '@dataplan/pg': @@ -401,7 +354,7 @@ importers: version: 0.1.12 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@22.19.15)(typescript@5.9.3) + version: 10.9.2(@types/node@25.5.0)(typescript@5.9.3) publishDirectory: dist graphile/graphile-search: @@ -480,6 +433,9 @@ importers: '@pgpmjs/types': specifier: workspace:^ version: link:../../pgpm/types/dist + '@pgsql/quotes': + specifier: ^17.1.0 + version: 17.1.0 cors: specifier: ^2.8.6 version: 2.8.6 @@ -491,7 +447,7 @@ importers: version: 1.0.0-rc.9(graphql@16.13.0) grafserv: specifier: 1.0.0-rc.7 - version: 1.0.0-rc.7(@types/node@22.19.15)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(ws@8.19.0) + version: 1.0.0-rc.7(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(ws@8.19.0) graphile-build: specifier: 5.0.0-rc.6 version: 5.0.0-rc.6(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0) @@ -504,9 +460,6 @@ importers: graphile-connection-filter: specifier: workspace:^ version: link:../graphile-connection-filter/dist - graphile-misc-plugins: - specifier: workspace:^ - version: link:../graphile-misc-plugins/dist graphile-postgis: specifier: workspace:^ version: link:../graphile-postgis/dist @@ -519,6 +472,9 @@ importers: graphile-upload-plugin: specifier: workspace:^ version: link:../graphile-upload-plugin/dist + graphile-utils: + specifier: 5.0.0-rc.8 + version: 5.0.0-rc.8(@dataplan/pg@1.0.0-rc.8(@dataplan/json@1.0.0-rc.6(grafast@1.0.0-rc.9(graphql@16.13.0)))(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0)(pg-sql2@5.0.0-rc.5)(pg@8.20.0))(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-build-pg@5.0.0-rc.8(@dataplan/pg@1.0.0-rc.8(@dataplan/json@1.0.0-rc.6(grafast@1.0.0-rc.9(graphql@16.13.0)))(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0)(pg-sql2@5.0.0-rc.5)(pg@8.20.0))(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-build@5.0.0-rc.6(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0)(pg-sql2@5.0.0-rc.5)(pg@8.20.0)(tamedevil@0.1.0-rc.6))(graphile-build@5.0.0-rc.6(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0)(tamedevil@0.1.0-rc.6) graphql: specifier: 16.13.0 version: 16.13.0 @@ -531,12 +487,15 @@ importers: pg: specifier: ^8.20.0 version: 8.20.0 + pg-query-context: + specifier: workspace:^ + version: link:../../postgres/pg-query-context/dist pg-sql2: specifier: 5.0.0-rc.5 version: 5.0.0-rc.5 postgraphile: specifier: 5.0.0-rc.10 - version: 5.0.0-rc.10(5332e63d4aec2fecbd1a6d13baaf27e0) + version: 5.0.0-rc.10(01f6c3872a4afea0bb2f9f52d380dd87) request-ip: specifier: ^3.3.0 version: 3.3.0 @@ -570,7 +529,7 @@ importers: version: link:../../postgres/pgsql-test/dist ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@22.19.15)(typescript@5.9.3) + version: 10.9.2(@types/node@25.5.0)(typescript@5.9.3) publishDirectory: dist graphile/graphile-sql-expression-validator: @@ -821,7 +780,7 @@ importers: version: 5.2.1 grafserv: specifier: 1.0.0-rc.7 - version: 1.0.0-rc.7(@types/node@22.19.15)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(ws@8.19.0) + version: 1.0.0-rc.7(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(ws@8.19.0) graphile-cache: specifier: workspace:^ version: link:../../graphile/graphile-cache/dist @@ -842,7 +801,7 @@ importers: version: link:../../postgres/pg-env/dist postgraphile: specifier: 5.0.0-rc.10 - version: 5.0.0-rc.10(5332e63d4aec2fecbd1a6d13baaf27e0) + version: 5.0.0-rc.10(01f6c3872a4afea0bb2f9f52d380dd87) devDependencies: '@types/express': specifier: ^5.0.6 @@ -855,7 +814,7 @@ importers: version: 3.1.14 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@22.19.15)(typescript@5.9.3) + version: 10.9.2(@types/node@25.5.0)(typescript@5.9.3) publishDirectory: dist graphql/gql-ast: @@ -1047,7 +1006,7 @@ importers: version: 1.0.0-rc.9(graphql@16.13.0) grafserv: specifier: 1.0.0-rc.7 - version: 1.0.0-rc.7(@types/node@22.19.15)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(ws@8.19.0) + version: 1.0.0-rc.7(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(ws@8.19.0) graphile-build: specifier: 5.0.0-rc.6 version: 5.0.0-rc.6(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0) @@ -1095,7 +1054,7 @@ importers: version: 5.0.0-rc.5 postgraphile: specifier: 5.0.0-rc.10 - version: 5.0.0-rc.10(5332e63d4aec2fecbd1a6d13baaf27e0) + version: 5.0.0-rc.10(01f6c3872a4afea0bb2f9f52d380dd87) postgraphile-plugin-connection-filter: specifier: 3.0.0-rc.1 version: 3.0.0-rc.1 @@ -1135,7 +1094,7 @@ importers: version: 3.1.14 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@22.19.15)(typescript@5.9.3) + version: 10.9.2(@types/node@25.5.0)(typescript@5.9.3) publishDirectory: dist graphql/server-test: @@ -1527,7 +1486,7 @@ importers: version: 7.2.2 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@22.19.15)(typescript@5.9.3) + version: 10.9.2(@types/node@25.5.0)(typescript@5.9.3) publishDirectory: dist jobs/knative-job-worker: @@ -1818,7 +1777,7 @@ importers: version: 0.1.12 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@22.19.15)(typescript@5.9.3) + version: 10.9.2(@types/node@25.5.0)(typescript@5.9.3) publishDirectory: dist packages/smtppostmaster: @@ -1847,7 +1806,7 @@ importers: version: 3.18.1 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@22.19.15)(typescript@5.9.3) + version: 10.9.2(@types/node@25.5.0)(typescript@5.9.3) publishDirectory: dist packages/url-domains: @@ -10806,20 +10765,6 @@ snapshots: - immer - use-sync-external-store - '@graphiql/plugin-doc-explorer@0.4.1(@graphiql/react@0.37.3(@emotion/is-prop-valid@1.4.0)(@types/node@22.19.15)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)))(@types/react@19.2.14)(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))': - dependencies: - '@graphiql/react': 0.37.3(@emotion/is-prop-valid@1.4.0)(@types/node@22.19.15)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) - '@headlessui/react': 2.2.9(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - graphql: 16.13.0 - react: 19.2.4 - react-compiler-runtime: 19.1.0-rc.1(react@19.2.4) - react-dom: 19.2.4(react@19.2.4) - zustand: 5.0.11(@types/react@19.2.14)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) - transitivePeerDependencies: - - '@types/react' - - immer - - use-sync-external-store - '@graphiql/plugin-doc-explorer@0.4.1(@graphiql/react@0.37.3(@emotion/is-prop-valid@1.4.0)(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)))(@types/react@19.2.14)(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))': dependencies: '@graphiql/react': 0.37.3(@emotion/is-prop-valid@1.4.0)(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) @@ -10850,22 +10795,6 @@ snapshots: - immer - use-sync-external-store - '@graphiql/plugin-history@0.4.1(@graphiql/react@0.37.3(@emotion/is-prop-valid@1.4.0)(@types/node@22.19.15)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)))(@types/node@22.19.15)(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))': - dependencies: - '@graphiql/react': 0.37.3(@emotion/is-prop-valid@1.4.0)(@types/node@22.19.15)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) - '@graphiql/toolkit': 0.11.3(@types/node@22.19.15)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0) - react: 19.2.4 - react-compiler-runtime: 19.1.0-rc.1(react@19.2.4) - react-dom: 19.2.4(react@19.2.4) - zustand: 5.0.11(@types/react@19.2.14)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) - transitivePeerDependencies: - - '@types/node' - - '@types/react' - - graphql - - graphql-ws - - immer - - use-sync-external-store - '@graphiql/plugin-history@0.4.1(@graphiql/react@0.37.3(@emotion/is-prop-valid@1.4.0)(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)))(@types/node@25.5.0)(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))': dependencies: '@graphiql/react': 0.37.3(@emotion/is-prop-valid@1.4.0)(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) @@ -10913,37 +10842,6 @@ snapshots: - immer - use-sync-external-store - '@graphiql/react@0.37.3(@emotion/is-prop-valid@1.4.0)(@types/node@22.19.15)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))': - dependencies: - '@graphiql/toolkit': 0.11.3(@types/node@22.19.15)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-dropdown-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-tooltip': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@radix-ui/react-visually-hidden': 1.2.4(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - clsx: 1.2.1 - framer-motion: 12.36.0(@emotion/is-prop-valid@1.4.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - get-value: 3.0.1 - graphql: 16.13.0 - graphql-language-service: 5.5.0(graphql@16.13.0) - jsonc-parser: 3.3.1 - markdown-it: 14.1.1 - monaco-editor: 0.52.2 - monaco-graphql: 1.7.3(graphql@16.13.0)(monaco-editor@0.52.2)(prettier@3.8.1) - prettier: 3.8.1 - react: 19.2.4 - react-compiler-runtime: 19.1.0-rc.1(react@19.2.4) - react-dom: 19.2.4(react@19.2.4) - set-value: 4.1.0 - zustand: 5.0.11(@types/react@19.2.14)(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) - transitivePeerDependencies: - - '@emotion/is-prop-valid' - - '@types/node' - - '@types/react' - - '@types/react-dom' - - graphql-ws - - immer - - use-sync-external-store - '@graphiql/react@0.37.3(@emotion/is-prop-valid@1.4.0)(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))': dependencies: '@graphiql/toolkit': 0.11.3(@types/node@25.5.0)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0) @@ -10985,16 +10883,6 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@graphiql/toolkit@0.11.3(@types/node@22.19.15)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)': - dependencies: - '@n1ru4l/push-pull-async-iterable-iterator': 3.2.0 - graphql: 16.13.0 - meros: 1.3.2(@types/node@22.19.15) - optionalDependencies: - graphql-ws: 6.0.7(graphql@16.13.0)(ws@8.19.0) - transitivePeerDependencies: - - '@types/node' - '@graphiql/toolkit@0.11.3(@types/node@25.5.0)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)': dependencies: '@n1ru4l/push-pull-async-iterable-iterator': 3.2.0 @@ -12924,7 +12812,6 @@ snapshots: '@types/node@25.5.0': dependencies: undici-types: 7.18.2 - optional: true '@types/nodemailer@7.0.11': dependencies: @@ -14679,31 +14566,6 @@ snapshots: - supports-color - use-sync-external-store - grafserv@1.0.0-rc.7(@types/node@22.19.15)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(ws@8.19.0): - dependencies: - '@graphile/lru': 5.0.0-rc.5 - debug: 4.4.3(supports-color@5.5.0) - eventemitter3: 5.0.4 - grafast: 1.0.0-rc.9(graphql@16.13.0) - graphile-config: 1.0.0-rc.6 - graphql: 16.13.0 - graphql-ws: 6.0.7(graphql@16.13.0)(ws@8.19.0) - ruru: 2.0.0-rc.7(@types/node@22.19.15)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(debug@4.4.3)(graphile-config@1.0.0-rc.6)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) - tslib: 2.8.1 - optionalDependencies: - ws: 8.19.0 - transitivePeerDependencies: - - '@fastify/websocket' - - '@types/node' - - '@types/react' - - '@types/react-dom' - - crossws - - immer - - react - - react-dom - - supports-color - - use-sync-external-store - grafserv@1.0.0-rc.7(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(ws@8.19.0): dependencies: '@graphile/lru': 5.0.0-rc.5 @@ -14815,24 +14677,6 @@ snapshots: - immer - use-sync-external-store - graphiql@5.2.2(@emotion/is-prop-valid@1.4.0)(@types/node@22.19.15)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)): - dependencies: - '@graphiql/plugin-doc-explorer': 0.4.1(@graphiql/react@0.37.3(@emotion/is-prop-valid@1.4.0)(@types/node@22.19.15)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)))(@types/react@19.2.14)(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) - '@graphiql/plugin-history': 0.4.1(@graphiql/react@0.37.3(@emotion/is-prop-valid@1.4.0)(@types/node@22.19.15)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)))(@types/node@22.19.15)(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) - '@graphiql/react': 0.37.3(@emotion/is-prop-valid@1.4.0)(@types/node@22.19.15)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) - graphql: 16.13.0 - react: 19.2.4 - react-compiler-runtime: 19.1.0-rc.1(react@19.2.4) - react-dom: 19.2.4(react@19.2.4) - transitivePeerDependencies: - - '@emotion/is-prop-valid' - - '@types/node' - - '@types/react' - - '@types/react-dom' - - graphql-ws - - immer - - use-sync-external-store - graphiql@5.2.2(@emotion/is-prop-valid@1.4.0)(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)): dependencies: '@graphiql/plugin-doc-explorer': 0.4.1(@graphiql/react@0.37.3(@emotion/is-prop-valid@1.4.0)(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)))(@types/react@19.2.14)(graphql@16.13.0)(react-compiler-runtime@19.1.0-rc.1(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) @@ -16041,10 +15885,6 @@ snapshots: optionalDependencies: '@types/node': 22.19.11 - meros@1.3.2(@types/node@22.19.15): - optionalDependencies: - '@types/node': 22.19.15 - meros@1.3.2(@types/node@25.5.0): optionalDependencies: '@types/node': 25.5.0 @@ -17140,33 +16980,6 @@ snapshots: - supports-color - utf-8-validate - postgraphile@5.0.0-rc.10(5332e63d4aec2fecbd1a6d13baaf27e0): - dependencies: - '@dataplan/json': 1.0.0-rc.6(grafast@1.0.0-rc.9(graphql@16.13.0)) - '@dataplan/pg': 1.0.0-rc.8(@dataplan/json@1.0.0-rc.6(grafast@1.0.0-rc.9(graphql@16.13.0)))(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0)(pg-sql2@5.0.0-rc.5)(pg@8.20.0) - '@graphile/lru': 5.0.0-rc.5 - '@types/node': 22.19.15 - '@types/pg': 8.18.0 - debug: 4.4.3(supports-color@5.5.0) - grafast: 1.0.0-rc.9(graphql@16.13.0) - grafserv: 1.0.0-rc.7(@types/node@22.19.15)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4))(ws@8.19.0) - graphile-build: 5.0.0-rc.6(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0) - graphile-build-pg: 5.0.0-rc.8(@dataplan/pg@1.0.0-rc.8(@dataplan/json@1.0.0-rc.6(grafast@1.0.0-rc.9(graphql@16.13.0)))(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0)(pg-sql2@5.0.0-rc.5)(pg@8.20.0))(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-build@5.0.0-rc.6(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0)(pg-sql2@5.0.0-rc.5)(pg@8.20.0)(tamedevil@0.1.0-rc.6) - graphile-config: 1.0.0-rc.6 - graphile-utils: 5.0.0-rc.8(@dataplan/pg@1.0.0-rc.8(@dataplan/json@1.0.0-rc.6(grafast@1.0.0-rc.9(graphql@16.13.0)))(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0)(pg-sql2@5.0.0-rc.5)(pg@8.20.0))(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-build-pg@5.0.0-rc.8(@dataplan/pg@1.0.0-rc.8(@dataplan/json@1.0.0-rc.6(grafast@1.0.0-rc.9(graphql@16.13.0)))(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0)(pg-sql2@5.0.0-rc.5)(pg@8.20.0))(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-build@5.0.0-rc.6(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0)(pg-sql2@5.0.0-rc.5)(pg@8.20.0)(tamedevil@0.1.0-rc.6))(graphile-build@5.0.0-rc.6(grafast@1.0.0-rc.9(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0))(graphile-config@1.0.0-rc.6)(graphql@16.13.0)(tamedevil@0.1.0-rc.6) - graphql: 16.13.0 - iterall: 1.3.0 - jsonwebtoken: 9.0.3 - pg: 8.20.0 - pg-sql2: 5.0.0-rc.5 - tamedevil: 0.1.0-rc.6 - tslib: 2.8.1 - ws: 8.19.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - postgres-array@2.0.0: {} postgres-array@3.0.4: {} @@ -17532,23 +17345,6 @@ snapshots: - immer - use-sync-external-store - ruru-types@2.0.0-rc.6(@emotion/is-prop-valid@1.4.0)(@types/node@22.19.15)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)): - dependencies: - '@graphiql/toolkit': 0.11.3(@types/node@22.19.15)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0) - graphiql: 5.2.2(@emotion/is-prop-valid@1.4.0)(@types/node@22.19.15)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) - graphql: 16.13.0 - optionalDependencies: - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - transitivePeerDependencies: - - '@emotion/is-prop-valid' - - '@types/node' - - '@types/react' - - '@types/react-dom' - - graphql-ws - - immer - - use-sync-external-store - ruru-types@2.0.0-rc.6(@emotion/is-prop-valid@1.4.0)(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)): dependencies: '@graphiql/toolkit': 0.11.3(@types/node@25.5.0)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0) @@ -17587,27 +17383,6 @@ snapshots: - immer - use-sync-external-store - ruru@2.0.0-rc.7(@types/node@22.19.15)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(debug@4.4.3)(graphile-config@1.0.0-rc.6)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)): - dependencies: - '@emotion/is-prop-valid': 1.4.0 - graphile-config: 1.0.0-rc.6 - graphql: 16.13.0 - http-proxy: 1.18.1(debug@4.4.3) - ruru-types: 2.0.0-rc.6(@emotion/is-prop-valid@1.4.0)(@types/node@22.19.15)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)) - tslib: 2.8.1 - yargs: 17.7.2 - optionalDependencies: - react: 19.2.4 - react-dom: 19.2.4(react@19.2.4) - transitivePeerDependencies: - - '@types/node' - - '@types/react' - - '@types/react-dom' - - debug - - graphql-ws - - immer - - use-sync-external-store - ruru@2.0.0-rc.7(@types/node@25.5.0)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(debug@4.4.3)(graphile-config@1.0.0-rc.6)(graphql-ws@6.0.7(graphql@16.13.0)(ws@8.19.0))(graphql@16.13.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(use-sync-external-store@1.6.0(react@19.2.4)): dependencies: '@emotion/is-prop-valid': 1.4.0 @@ -18083,14 +17858,14 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - ts-node@10.9.2(@types/node@22.19.15)(typescript@5.9.3): + ts-node@10.9.2(@types/node@25.5.0)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.19.15 + '@types/node': 25.5.0 acorn: 8.15.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -18171,8 +17946,7 @@ snapshots: undici-types@6.21.0: {} - undici-types@7.18.2: - optional: true + undici-types@7.18.2: {} undici@7.24.3: {} From b7465b0a9bcc0d538808c9a87a918e98eee02250 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Tue, 17 Mar 2026 09:16:24 +0000 Subject: [PATCH 2/2] fix: update dynamic import path in PublicKeySignature test --- graphile/graphile-settings/__tests__/PublicKeySignature.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/graphile/graphile-settings/__tests__/PublicKeySignature.test.ts b/graphile/graphile-settings/__tests__/PublicKeySignature.test.ts index c3bf0dad1..431afccad 100644 --- a/graphile/graphile-settings/__tests__/PublicKeySignature.test.ts +++ b/graphile/graphile-settings/__tests__/PublicKeySignature.test.ts @@ -41,7 +41,7 @@ describe('PublicKeySignature plugin factory', () => { }); it('default export matches named export', async () => { - const mod = await import('../src/PublicKeySignature'); + const mod = await import('../src/plugins/PublicKeySignature'); expect(mod.default).toBe(mod.PublicKeySignature); }); });