From c149f35eed174c06e7ba647bca2b5689984b62dd Mon Sep 17 00:00:00 2001 From: Jovi De Croock Date: Wed, 4 Sep 2024 10:10:23 +0200 Subject: [PATCH] fix: Strip the unmask directive (#354) --- .changeset/fluffy-rabbits-shake.md | 5 ++++ packages/graphqlsp/src/persisted.ts | 40 ++++++++++++++++++++++++++++- 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 .changeset/fluffy-rabbits-shake.md diff --git a/.changeset/fluffy-rabbits-shake.md b/.changeset/fluffy-rabbits-shake.md new file mode 100644 index 0000000..8611215 --- /dev/null +++ b/.changeset/fluffy-rabbits-shake.md @@ -0,0 +1,5 @@ +--- +'@0no-co/graphqlsp': patch +--- + +Strip our internal `@_unmask` directive from fragment-definitions when creating hashes for persisted-operations diff --git a/packages/graphqlsp/src/persisted.ts b/packages/graphqlsp/src/persisted.ts index e262918..71f002b 100644 --- a/packages/graphqlsp/src/persisted.ts +++ b/packages/graphqlsp/src/persisted.ts @@ -12,6 +12,7 @@ import { import { resolveTemplate } from './ast/resolve'; import { FragmentDefinitionNode, + Kind, parse, print, visit, @@ -183,8 +184,22 @@ export const generateHashForDocument = ( foundFilename, info ).combinedText; + const parsed = parse(text); + const seen = new Set(); + for (const definition of parsed.definitions) { + if ( + definition.kind === Kind.FRAGMENT_DEFINITION && + !seen.has(definition) + ) { + stripUnmaskDirectivesFromDefinition(definition); + } + } + const deduplicatedFragments = fragments - .map(fragment => print(fragment)) + .map(fragment => { + stripUnmaskDirectivesFromDefinition(fragment); + return print(fragment) + }) .filter((fragment, index, array) => array.indexOf(fragment) === index); deduplicatedFragments.forEach(fragmentDefinition => { @@ -203,6 +218,16 @@ export const generateHashForDocument = ( ).combinedText; const parsed = parse(text); + const seen = new Set(); + for (const definition of parsed.definitions) { + if ( + definition.kind === Kind.FRAGMENT_DEFINITION && + !seen.has(definition) + ) { + stripUnmaskDirectivesFromDefinition(definition); + } + } + const spreads = new Set(); visit(parsed, { FragmentSpread: node => { @@ -227,6 +252,8 @@ export const generateHashForDocument = ( return; } + stripUnmaskDirectivesFromDefinition(fragmentDefinition); + visit(fragmentDefinition, { FragmentSpread: node => { if (!visited.has(node.name.value)) @@ -322,3 +349,14 @@ export const getDocumentReferenceFromDocumentNode = ( return { node: documentNodeArgument, filename }; } }; + +type writable = { -readonly [K in keyof T]: T[K] }; + +const stripUnmaskDirectivesFromDefinition = ( + definition: FragmentDefinitionNode +) => { + (definition as writable).directives = + definition.directives?.filter( + directive => directive.name.value !== '_unmask' + ); +}; -- knotmirror 0.0.1