From 12b4195f888913ac6a902dcbeeda53c23fe71926 Mon Sep 17 00:00:00 2001 From: Dan Lynch Date: Wed, 11 Feb 2026 09:16:49 +0000 Subject: [PATCH] fix(graphile-settings): add standalone UppercaseEnumsPlugin for v4 CONSTANT_CASE enum values --- .../graphile-settings/src/plugins/index.ts | 6 ++++ .../src/plugins/uppercase-enums.ts | 33 +++++++++++++++++++ .../src/presets/constructive-preset.ts | 2 ++ 3 files changed, 41 insertions(+) create mode 100644 graphile/graphile-settings/src/plugins/uppercase-enums.ts diff --git a/graphile/graphile-settings/src/plugins/index.ts b/graphile/graphile-settings/src/plugins/index.ts index 3d26bee71..a7f4da51a 100644 --- a/graphile/graphile-settings/src/plugins/index.ts +++ b/graphile/graphile-settings/src/plugins/index.ts @@ -63,6 +63,12 @@ export { } from './pg-type-mappings'; export type { TypeMapping } from './pg-type-mappings'; +// Uppercase enum values to match v4 CONSTANT_CASE convention +export { + UppercaseEnumsPlugin, + UppercaseEnumsPreset, +} from './uppercase-enums'; + // Search plugin for tsvector full-text search conditions (includes TsvectorCodec) export { PgSearchPlugin, diff --git a/graphile/graphile-settings/src/plugins/uppercase-enums.ts b/graphile/graphile-settings/src/plugins/uppercase-enums.ts new file mode 100644 index 000000000..86da0cc8e --- /dev/null +++ b/graphile/graphile-settings/src/plugins/uppercase-enums.ts @@ -0,0 +1,33 @@ +import type { GraphileConfig } from 'graphile-config'; + +/** + * Plugin that uppercases PostgreSQL enum values in the GraphQL schema. + * + * WHY THIS EXISTS: + * In PostGraphile v4, custom PostgreSQL enum values (e.g., 'app', 'core', 'module') + * were automatically uppercased to CONSTANT_CASE ('APP', 'CORE', 'MODULE'). + * In PostGraphile v5, the default `enumValue` inflector preserves the original + * PostgreSQL casing via `coerceToGraphQLName(value)`, resulting in lowercase + * enum values in the GraphQL schema. + * + * This plugin overrides the `enumValue` inflector to uppercase the result, + * restoring v4 behavior. It delegates to the previous inflector first to + * retain all special character handling (asterisks, symbols, etc.). + */ +export const UppercaseEnumsPlugin: GraphileConfig.Plugin = { + name: 'UppercaseEnumsPlugin', + version: '1.0.0', + + inflection: { + replace: { + enumValue(previous, _options, value, codec) { + const result = previous!(value, codec); + return result.toUpperCase(); + }, + }, + }, +}; + +export const UppercaseEnumsPreset: GraphileConfig.Preset = { + plugins: [UppercaseEnumsPlugin], +}; diff --git a/graphile/graphile-settings/src/presets/constructive-preset.ts b/graphile/graphile-settings/src/presets/constructive-preset.ts index 5c8c42ce4..020293fcc 100644 --- a/graphile/graphile-settings/src/presets/constructive-preset.ts +++ b/graphile/graphile-settings/src/presets/constructive-preset.ts @@ -10,6 +10,7 @@ import { ManyToManyOptInPreset } from '../plugins/many-to-many-preset'; import { MetaSchemaPreset } from '../plugins/meta-schema'; import { PgSearchPreset } from 'graphile-search-plugin'; import { PgTypeMappingsPreset } from '../plugins/pg-type-mappings'; +import { UppercaseEnumsPreset } from '../plugins/uppercase-enums'; /** * Constructive PostGraphile v5 Preset @@ -61,6 +62,7 @@ export const ConstructivePreset: GraphileConfig.Preset = { MetaSchemaPreset, PgSearchPreset({ pgSearchPrefix: 'fullText' }), PgTypeMappingsPreset, + UppercaseEnumsPreset, ], /** * Disable relation filter plugins from postgraphile-plugin-connection-filter.