From 1bfd0f6a3c8ae3b9b8d519199513cbd50516c8e9 Mon Sep 17 00:00:00 2001 From: hugofqt <12221094+hugo082@users.noreply.github.com> Date: Mon, 26 Jul 2021 10:27:51 +0200 Subject: [PATCH] fix: allow code generation from typescript generic graphql tag Allow to use generic graph tag like: graphql`{ myQuery }` --- .../src/__tests__/document.test.ts | 27 +++++++++++++++++++ .../apollo-language-server/src/document.ts | 7 +++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/packages/apollo-language-server/src/__tests__/document.test.ts b/packages/apollo-language-server/src/__tests__/document.test.ts index 6bb6104b4c..709fef10ca 100644 --- a/packages/apollo-language-server/src/__tests__/document.test.ts +++ b/packages/apollo-language-server/src/__tests__/document.test.ts @@ -93,6 +93,33 @@ describe("extractGraphQLDocuments", () => { expect(documents[0].syntaxErrors.length).toBe(0); expect(documents[0].ast.definitions.length).toBe(2); }); + + it("works with a generic tagname", () => { + const textDocument = mockTextDocument(` + gql \` + { + hero { + ...Hero_character + } + } + + \${Hero.fragments.character} + + { + reviews(episode: NEWHOPE) { + ...ReviewList_reviews + } + } + + \${ReviewList.fragments.reviews} + \` + `); + const documents = extractGraphQLDocuments(textDocument); + + expect(documents.length).toEqual(1); + expect(documents[0].syntaxErrors.length).toBe(0); + expect(documents[0].ast.definitions.length).toBe(2); + }); }); describe("extracting documents from ReasonML extension nodes", () => { diff --git a/packages/apollo-language-server/src/document.ts b/packages/apollo-language-server/src/document.ts index 100f311ec1..eb606b893e 100644 --- a/packages/apollo-language-server/src/document.ts +++ b/packages/apollo-language-server/src/document.ts @@ -89,11 +89,14 @@ function extractGraphQLDocumentsFromJSTemplateLiterals( const documents: GraphQLDocument[] = []; - const regExp = new RegExp(`${tagName}\\s*\`([\\s\\S]+?)\``, "gm"); + const regExp = new RegExp( + `${tagName}\\s*(?:<([\\sa-zA-Z0-9_,<>]+)>)?\\s*\`([\\s\\S]+?)\``, + "gm" + ); let result; while ((result = regExp.exec(text)) !== null) { - const contents = replacePlaceholdersWithWhiteSpace(result[1]); + const contents = replacePlaceholdersWithWhiteSpace(result[2]); const position = document.positionAt(result.index + (tagName.length + 1)); const locationOffset: SourceLocation = { line: position.line + 1,