Skip to content

Commit a8f6949

Browse files
committed
fix: allow code generation from typescript generic graphql tag
Allow to use generic graph tag like: graphql<TResponse>`{ myQuery }`
1 parent c05c9e4 commit a8f6949

File tree

2 files changed

+29
-2
lines changed

2 files changed

+29
-2
lines changed

packages/apollo-language-server/src/__tests__/document.test.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,33 @@ describe("extractGraphQLDocuments", () => {
9393
expect(documents[0].syntaxErrors.length).toBe(0);
9494
expect(documents[0].ast.definitions.length).toBe(2);
9595
});
96+
97+
it("works with a generic tagname", () => {
98+
const textDocument = mockTextDocument(`
99+
gql <TResponse, TOther> \`
100+
{
101+
hero {
102+
...Hero_character
103+
}
104+
}
105+
106+
\${Hero.fragments.character}
107+
108+
{
109+
reviews(episode: NEWHOPE) {
110+
...ReviewList_reviews
111+
}
112+
}
113+
114+
\${ReviewList.fragments.reviews}
115+
\`
116+
`);
117+
const documents = extractGraphQLDocuments(textDocument);
118+
119+
expect(documents.length).toEqual(1);
120+
expect(documents[0].syntaxErrors.length).toBe(0);
121+
expect(documents[0].ast.definitions.length).toBe(2);
122+
});
96123
});
97124

98125
describe("extracting documents from ReasonML extension nodes", () => {

packages/apollo-language-server/src/document.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,11 @@ function extractGraphQLDocumentsFromJSTemplateLiterals(
8989

9090
const documents: GraphQLDocument[] = [];
9191

92-
const regExp = new RegExp(`${tagName}\\s*\`([\\s\\S]+?)\``, "gm");
92+
const regExp = new RegExp(`${tagName}\\s*(?:<([\\sa-zA-Z0-9_,<>]+)>)?\\s*\`([\\s\\S]+?)\``, "gm");
9393

9494
let result;
9595
while ((result = regExp.exec(text)) !== null) {
96-
const contents = replacePlaceholdersWithWhiteSpace(result[1]);
96+
const contents = replacePlaceholdersWithWhiteSpace(result[2]);
9797
const position = document.positionAt(result.index + (tagName.length + 1));
9898
const locationOffset: SourceLocation = {
9999
line: position.line + 1,

0 commit comments

Comments
 (0)