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,