From 287f568a2ae38b5b8c6213ef948fbf60300c232e Mon Sep 17 00:00:00 2001 From: vejrj <77059398+vejrj@users.noreply.github.com> Date: Mon, 8 Dec 2025 12:56:28 +0100 Subject: [PATCH 1/3] extractMinimalViableSChemaForRequestDocument now returns optional arguments even when they are not used --- ...nimalViableSchemaToRequestDocument.test.ts | 19 ++++++++++ ...imalViableSchemaForRequestDocument.test.ts | 11 +++++- ...ctMinimalViableSchemaForRequestDocument.ts | 36 +++---------------- 3 files changed, 33 insertions(+), 33 deletions(-) diff --git a/packages/supermassive/src/utilities/__tests__/addMinimalViableSchemaToRequestDocument.test.ts b/packages/supermassive/src/utilities/__tests__/addMinimalViableSchemaToRequestDocument.test.ts index e556cd019..edb1877fc 100644 --- a/packages/supermassive/src/utilities/__tests__/addMinimalViableSchemaToRequestDocument.test.ts +++ b/packages/supermassive/src/utilities/__tests__/addMinimalViableSchemaToRequestDocument.test.ts @@ -27,6 +27,25 @@ describe(addMinimalViableSchemaToRequestDocument, () => { }; } + it("minimal viable schema should include optional param even when it's not used in directive", () => { + const { printedDoc } = testHelper( + schema, + `query @i18n { + film(id: 42) { + __typename + } + }`, + ); + expect(printedDoc).toMatchInlineSnapshot(` + "query @i18n @schema(definitions: "{\\"types\\":{\\"Query\\":[2,{\\"film\\":[\\"Film\\",{\\"id\\":10}]}],\\"Film\\":[2,{},[\\"Node\\"]]},\\"directives\\":[[\\"i18n\\",[1],{\\"locale\\":1}]]}") { + film(id: 42) { + __typename + } + } + " + `); + }); + it("adds minimal viable schema to operation definition", () => { const { printedDoc } = testHelper( schema, diff --git a/packages/supermassive/src/utilities/__tests__/extractMinimalViableSchemaForRequestDocument.test.ts b/packages/supermassive/src/utilities/__tests__/extractMinimalViableSchemaForRequestDocument.test.ts index aeaf87fac..177bb37ba 100644 --- a/packages/supermassive/src/utilities/__tests__/extractMinimalViableSchemaForRequestDocument.test.ts +++ b/packages/supermassive/src/utilities/__tests__/extractMinimalViableSchemaForRequestDocument.test.ts @@ -422,7 +422,16 @@ describe(extractMinimalViableSchemaForRequestDocument, () => { ); expect(sdl).toMatchInlineSnapshot(` "type Query { - countFilms: Int! + countFilms(filter: FilmFilterInput): Int! + } + + input FilmFilterInput { + genre: FilmGenre + } + + enum FilmGenre { + COMEDY + DRAMA } " `); diff --git a/packages/supermassive/src/utilities/extractMinimalViableSchemaForRequestDocument.ts b/packages/supermassive/src/utilities/extractMinimalViableSchemaForRequestDocument.ts index 845e05203..6fc55d377 100644 --- a/packages/supermassive/src/utilities/extractMinimalViableSchemaForRequestDocument.ts +++ b/packages/supermassive/src/utilities/extractMinimalViableSchemaForRequestDocument.ts @@ -16,7 +16,6 @@ import { isCompositeType, isEnumType, isInputObjectType, - isNonNullType, isObjectType, isScalarType, isSpecifiedScalarType, @@ -39,7 +38,6 @@ import { encodeDirectiveLocation, EnumTypeDefinitionTuple, FieldDefinition, - getDirectiveDefinitionArgs, getDirectiveName, getFieldArgs, getFields, @@ -102,7 +100,7 @@ export function extractMinimalViableSchemaForRequestDocument( assertExistingField(field, node, ancestors); assertAllArgumentsAreDefined(field, node, ancestors); - const fieldDef = addField(typeDef, field, node); + const fieldDef = addField(typeDef, field); addReferencedOutputType(schema, types, getFieldTypeReference(fieldDef)); addReferencedInputTypes(schema, types, getFieldArgs(fieldDef)); }, @@ -116,7 +114,7 @@ export function extractMinimalViableSchemaForRequestDocument( unknownDirectives.push(node); return; } - addDirective(directives, directive, node); + addDirective(directives, directive); }, FragmentDefinition(node, _key, _parent, _path, ancestors): void { const type = typeInfo.getType(); @@ -223,31 +221,15 @@ function addCompositeType( function addField( type: ObjectTypeDefinitionTuple | InterfaceTypeDefinitionTuple, field: GraphQLField, - fieldNode: FieldNode, ): FieldDefinition { const fields = getFields(type); - const existingFieldDef: FieldDefinition = fields[field.name]; - const previouslyAddedArgs = - getFieldArgs(existingFieldDef) ?? Object.create(null); - - const nodeArgs = new Set(fieldNode.arguments?.map((arg) => arg.name.value)); - - const argsFilter = (argDef: GraphQLArgument) => - Boolean( - previouslyAddedArgs[argDef.name] || - isNonNullType(argDef.type) || - argDef.defaultValue !== undefined || - nodeArgs.has(argDef.name), - ); - - return (fields[field.name] = encodeFieldDef(field, argsFilter)); + return (fields[field.name] = encodeFieldDef(field)); } function addDirective( directives: DirectiveDefinitionTuple[], directive: GraphQLDirective, - node: DirectiveNode, ) { const name = directive.name; let tuple = directives.find((d) => getDirectiveName(d) === name); @@ -256,17 +238,7 @@ function addDirective( directives.push(tuple); } - const previouslyAddedArgs = getDirectiveDefinitionArgs(tuple); - const nodeArgs = new Set(node.arguments?.map((arg) => arg.name.value)); - - const argsFilter = (argDef: GraphQLArgument) => - Boolean( - previouslyAddedArgs?.[argDef.name] || - isNonNullType(argDef.type) || - argDef.defaultValue !== undefined || - nodeArgs.has(argDef.name), - ); - const [hasArgs, argsRecord] = encodeArguments(directive.args, argsFilter); + const [hasArgs, argsRecord] = encodeArguments(directive.args); if (hasArgs) { setDirectiveDefinitionArgs(tuple, argsRecord); } From fa8f3f84ea0d8f5e32018c6fcac68e0d0213d586 Mon Sep 17 00:00:00 2001 From: vejrj <77059398+vejrj@users.noreply.github.com> Date: Mon, 8 Dec 2025 12:56:45 +0100 Subject: [PATCH 2/3] Change files --- ...-supermassive-ab65c253-9999-4de3-a471-26f47af37586.json | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 change/@graphitation-supermassive-ab65c253-9999-4de3-a471-26f47af37586.json diff --git a/change/@graphitation-supermassive-ab65c253-9999-4de3-a471-26f47af37586.json b/change/@graphitation-supermassive-ab65c253-9999-4de3-a471-26f47af37586.json new file mode 100644 index 000000000..1fa84d6ba --- /dev/null +++ b/change/@graphitation-supermassive-ab65c253-9999-4de3-a471-26f47af37586.json @@ -0,0 +1,7 @@ +{ + "type": "minor", + "comment": "extractMinimalViableSChemaForRequestDocument now returns optional arguments even when they are not used", + "packageName": "@graphitation/supermassive", + "email": "77059398+vejrj@users.noreply.github.com", + "dependentChangeType": "patch" +} From e19ebd02f86dc3682cffe6432c4e4865a557e25e Mon Sep 17 00:00:00 2001 From: vejrj <77059398+vejrj@users.noreply.github.com> Date: Mon, 8 Dec 2025 15:41:27 +0100 Subject: [PATCH 3/3] CR fix --- ...nimalViableSchemaToRequestDocument.test.ts | 19 --------------- ...imalViableSchemaForRequestDocument.test.ts | 23 ++++++++++++++++++- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/packages/supermassive/src/utilities/__tests__/addMinimalViableSchemaToRequestDocument.test.ts b/packages/supermassive/src/utilities/__tests__/addMinimalViableSchemaToRequestDocument.test.ts index edb1877fc..e556cd019 100644 --- a/packages/supermassive/src/utilities/__tests__/addMinimalViableSchemaToRequestDocument.test.ts +++ b/packages/supermassive/src/utilities/__tests__/addMinimalViableSchemaToRequestDocument.test.ts @@ -27,25 +27,6 @@ describe(addMinimalViableSchemaToRequestDocument, () => { }; } - it("minimal viable schema should include optional param even when it's not used in directive", () => { - const { printedDoc } = testHelper( - schema, - `query @i18n { - film(id: 42) { - __typename - } - }`, - ); - expect(printedDoc).toMatchInlineSnapshot(` - "query @i18n @schema(definitions: "{\\"types\\":{\\"Query\\":[2,{\\"film\\":[\\"Film\\",{\\"id\\":10}]}],\\"Film\\":[2,{},[\\"Node\\"]]},\\"directives\\":[[\\"i18n\\",[1],{\\"locale\\":1}]]}") { - film(id: 42) { - __typename - } - } - " - `); - }); - it("adds minimal viable schema to operation definition", () => { const { printedDoc } = testHelper( schema, diff --git a/packages/supermassive/src/utilities/__tests__/extractMinimalViableSchemaForRequestDocument.test.ts b/packages/supermassive/src/utilities/__tests__/extractMinimalViableSchemaForRequestDocument.test.ts index 177bb37ba..92f53bdf2 100644 --- a/packages/supermassive/src/utilities/__tests__/extractMinimalViableSchemaForRequestDocument.test.ts +++ b/packages/supermassive/src/utilities/__tests__/extractMinimalViableSchemaForRequestDocument.test.ts @@ -413,7 +413,7 @@ describe(extractMinimalViableSchemaForRequestDocument, () => { `); }); - it("omits optional arguments", () => { + it("includes optional arguments", () => { const { sdl } = testHelper( schema, `query { @@ -437,6 +437,27 @@ describe(extractMinimalViableSchemaForRequestDocument, () => { `); }); + it("should include optional param even when it's not used in directive", () => { + const { sdl } = testHelper( + schema, + `query @i18n { + film(id: 42) { + __typename + } + }`, + ); + expect(sdl).toMatchInlineSnapshot(` + "type Query { + film(id: ID!): Film + } + + type Film implements Node + + directive @i18n(locale: String) on QUERY + " + `); + }); + it("adds optional arguments when referenced at least once", () => { const { sdl } = testHelper( schema,