From 5706e59d8ec31dffe61731b34941a95f08a2feb2 Mon Sep 17 00:00:00 2001 From: Sean Matheson Date: Thu, 1 Sep 2022 22:33:44 +0800 Subject: [PATCH] fix: ObjectTypeDefinitionBuilder greedy matching ignore types --- src/graphql.ts | 2 +- tests/graphql.spec.ts | 46 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 tests/graphql.spec.ts diff --git a/src/graphql.ts b/src/graphql.ts index 535f2fb9..9877d92c 100644 --- a/src/graphql.ts +++ b/src/graphql.ts @@ -14,7 +14,7 @@ export const ObjectTypeDefinitionBuilder = ( ): ObjectTypeDefinitionFn | undefined => { if (!useObjectTypes) return undefined; return node => { - if (/^Query|Mutation|Subscription$/.test(node.name.value)) { + if (/^(Query|Mutation|Subscription)$/.test(node.name.value)) { return; } return callback(node); diff --git a/tests/graphql.spec.ts b/tests/graphql.spec.ts new file mode 100644 index 00000000..634058d1 --- /dev/null +++ b/tests/graphql.spec.ts @@ -0,0 +1,46 @@ +import { Kind, ObjectTypeDefinitionNode } from 'graphql'; +import { ObjectTypeDefinitionBuilder } from '../src/graphql'; + +describe('graphql', () => { + describe('ObjectTypeDefinitionBuilder', () => { + describe('useObjectTypes === true', () => { + test.each([ + ['Query', false], + ['Mutation', false], + ['Subscription', false], + ['QueryFoo', true], + ['MutationFoo', true], + ['SubscriptionFoo', true], + ['FooQuery', true], + ['FooMutation', true], + ['FooSubscription', true], + ['Foo', true], + ])(`A node with a name of "%s" should be matched? %s`, (nodeName, nodeIsMatched) => { + const node: ObjectTypeDefinitionNode = { + name: { + kind: Kind.NAME, + value: nodeName, + }, + kind: Kind.OBJECT_TYPE_DEFINITION, + }; + + const objectTypeDefFn = ObjectTypeDefinitionBuilder(true, (n: ObjectTypeDefinitionNode) => n); + + expect(objectTypeDefFn).toBeDefined(); + + if (nodeIsMatched) { + expect(objectTypeDefFn?.(node)).toBe(node); + } else { + expect(objectTypeDefFn?.(node)).toBeUndefined(); + } + }); + }); + + describe('useObjectTypes === false', () => { + test('should not return an ObjectTypeDefinitionFn', () => { + const objectTypeDefFn = ObjectTypeDefinitionBuilder(false, (n: ObjectTypeDefinitionNode) => n); + expect(objectTypeDefFn).toBeUndefined(); + }); + }); + }); +});