From 6f1741af03689f8146178637ecabec18347e9331 Mon Sep 17 00:00:00 2001 From: Eddy Nguyen Date: Mon, 27 Jan 2025 17:37:06 +1100 Subject: [PATCH] Fix load schema pointer type (#10227) * Fix load schema pointer type * Add tests --- .changeset/famous-spiders-call.md | 5 ++ packages/graphql-codegen-cli/src/config.ts | 2 +- packages/graphql-codegen-cli/src/load.ts | 2 +- .../graphql-codegen-cli/tests/config.spec.ts | 89 +++++++++++++++++++ 4 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 .changeset/famous-spiders-call.md create mode 100644 packages/graphql-codegen-cli/tests/config.spec.ts diff --git a/.changeset/famous-spiders-call.md b/.changeset/famous-spiders-call.md new file mode 100644 index 00000000000..90dbe64c89d --- /dev/null +++ b/.changeset/famous-spiders-call.md @@ -0,0 +1,5 @@ +--- +'@graphql-codegen/cli': patch +--- + +Fix schema pointers type to allow an array of pointers diff --git a/packages/graphql-codegen-cli/src/config.ts b/packages/graphql-codegen-cli/src/config.ts index 519d88c922a..514afd1afb5 100644 --- a/packages/graphql-codegen-cli/src/config.ts +++ b/packages/graphql-codegen-cli/src/config.ts @@ -422,7 +422,7 @@ export class CodegenContext { return this._pluginContext; } - async loadSchema(pointer: Types.Schema): Promise { + async loadSchema(pointer: Types.Schema | Types.Schema[]): Promise { const config = this.getConfig(defaultSchemaLoadOptions); if (this._graphqlConfig) { // TODO: SchemaWithLoader won't work here diff --git a/packages/graphql-codegen-cli/src/load.ts b/packages/graphql-codegen-cli/src/load.ts index dd24b13ad1c..213330ee076 100644 --- a/packages/graphql-codegen-cli/src/load.ts +++ b/packages/graphql-codegen-cli/src/load.ts @@ -28,7 +28,7 @@ export const defaultDocumentsLoadOptions = { }; export async function loadSchema( - schemaPointers: UnnormalizedTypeDefPointer, + schemaPointers: UnnormalizedTypeDefPointer | UnnormalizedTypeDefPointer[], config: Types.Config ): Promise { try { diff --git a/packages/graphql-codegen-cli/tests/config.spec.ts b/packages/graphql-codegen-cli/tests/config.spec.ts new file mode 100644 index 00000000000..e1863c52991 --- /dev/null +++ b/packages/graphql-codegen-cli/tests/config.spec.ts @@ -0,0 +1,89 @@ +import { createContext, ensureContext } from '../src/index.js'; + +describe('Codegen config - Context', () => { + it('loads and merge multiple schemas when using GraphQL config', async () => { + const context = await createContext({ + config: './packages/graphql-codegen-cli/tests/test-files/graphql.config.js', + project: 'prj1', + errorsOnly: true, + overwrite: true, + profile: true, + require: [], + silent: false, + watch: false, + }); + + const schema1 = /* GraphQL */ ` + type Query + scalar Date + `; + + const schema2 = /* GraphQL */ ` + extend type Query { + me: User + } + type User { + id: ID! + name: String! + createdAt: Date! + } + `; + + const schema3 = /* GraphQL */ ` + extend type Query { + media: Media + } + interface Media { + id: ID! + } + type Image implements Media { + id: ID! + url: String! + } + type Book implements Media { + id: ID! + title: String! + } + `; + + const mergedSchema = await context.loadSchema([schema1, schema2, schema3]); + + const typeMap = mergedSchema.getTypeMap(); + + expect(typeMap['Query']).toBeDefined(); + expect(typeMap['Date']).toBeDefined(); + expect(typeMap['User']).toBeDefined(); + expect(typeMap['Media']).toBeDefined(); + expect(typeMap['Image']).toBeDefined(); + expect(typeMap['Book']).toBeDefined(); + }); + + it('loads and merge multiple schemas when using input config', async () => { + const context = ensureContext({ + generates: {}, + }); + + const schema1 = /* GraphQL */ ` + type Mutation + scalar DateTime + `; + + const schema2 = /* GraphQL */ ` + extend type Mutation { + createUser: User + } + type User { + id: ID! + createdAt: DateTime! + } + `; + + const mergedSchema = await context.loadSchema([schema1, schema2]); + + const typeMap = mergedSchema.getTypeMap(); + + expect(typeMap['Mutation']).toBeDefined(); + expect(typeMap['DateTime']).toBeDefined(); + expect(typeMap['User']).toBeDefined(); + }); +});