@mo36924/graphql-plugin 1.6.2 → 5.0.69

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import { readFileSync, unwatchFile, watch, watchFile } from \"fs\";\nimport { resolve } from \"path\";\nimport { printSchemaModel } from \"@mo36924/graphql-schema\";\nimport { GraphQLError, buildSchema, parse, validate } from \"graphql\";\nimport {\n getAutocompleteSuggestions,\n getDiagnostics,\n getHoverInformation,\n getTokenAtPosition,\n} from \"graphql-language-service-interface\";\nimport { Position } from \"graphql-language-service-utils\";\nimport type { LanguageService, SourceFile, TaggedTemplateExpression, server } from \"typescript/lib/tsserverlibrary\";\nimport { CompletionItemKind, DiagnosticSeverity } from \"vscode-languageserver-types\";\n\nconst init: server.PluginModuleFactory = ({ typescript: ts }) => {\n return {\n create(info) {\n const languageService = info.languageService;\n const config = info.config;\n const cwd = info.project.getCurrentDirectory();\n const modelPath = config.model && resolve(cwd, config.model);\n const schemaPath = config.schema && resolve(cwd, config.schema);\n const watchPath = modelPath || schemaPath;\n let schema = buildSchema(\"scalar Unknown\");\n\n const addScalarUnknownType = (schemaCode: string) =>\n schemaCode.includes(\"scalar Unknown\") ? schemaCode : `${schemaCode}\\nscalar Unknown`;\n\n const changeModel = () => {\n schema = buildSchema(addScalarUnknownType(printSchemaModel(readFileSync(modelPath, \"utf8\"))));\n };\n\n const changeSchema = () => {\n schema = buildSchema(addScalarUnknownType(readFileSync(schemaPath, \"utf8\")));\n };\n\n const update = modelPath ? changeModel : changeSchema;\n\n const listener = () => {\n try {\n update();\n } catch {}\n };\n\n try {\n update();\n watch(watchPath, listener);\n } catch {\n watchFile(watchPath, () => {\n try {\n update();\n watch(watchPath, listener);\n unwatchFile(watchPath);\n } catch {}\n });\n }\n\n const getSourceFile = (fileName: string) => languageService.getProgram()?.getSourceFile(fileName);\n\n const isGraphqlTag = (tag: string): tag is \"query\" | \"mutation\" | \"subscription\" => {\n switch (tag) {\n case \"query\":\n case \"mutation\":\n case \"subscription\":\n return true;\n default:\n return false;\n }\n };\n\n const getDiagnosticCategory = (severity?: number) => {\n switch (severity) {\n case DiagnosticSeverity.Error:\n return ts.DiagnosticCategory.Error;\n case DiagnosticSeverity.Warning:\n return ts.DiagnosticCategory.Warning;\n case DiagnosticSeverity.Information:\n return ts.DiagnosticCategory.Message;\n case DiagnosticSeverity.Hint:\n return ts.DiagnosticCategory.Suggestion;\n default:\n return ts.DiagnosticCategory.Error;\n }\n };\n\n const hover = (sourceFile: SourceFile, position: number) => {\n const tag = ts.forEachChild(sourceFile, function visitor(node): true | undefined | TaggedTemplateExpression {\n if (position < node.pos) {\n return true;\n }\n\n if (position >= node.end) {\n return;\n }\n\n if (ts.isTaggedTemplateExpression(node) && ts.isIdentifier(node.tag) && isGraphqlTag(node.tag.getText())) {\n const template = node.template;\n\n if (ts.isNoSubstitutionTemplateLiteral(template)) {\n if (position >= template.getStart() + 1 && position < template.getEnd() - 1) {\n return node;\n }\n } else {\n const head = template.head;\n\n if (position >= head.getStart() + 1 && position < head.getEnd() - 2) {\n return node;\n }\n\n for (const { literal } of template.templateSpans) {\n if (\n position >= literal.getStart() + 1 &&\n position < literal.getEnd() - (ts.isTemplateMiddle(literal) ? 2 : 1)\n ) {\n return node;\n }\n }\n }\n }\n\n return ts.forEachChild(node, visitor);\n });\n\n if (tag === true) {\n return;\n }\n\n return tag;\n };\n\n const fix = (node: TaggedTemplateExpression) => {\n const template = node.template;\n let query = \"\";\n let variables = \"\";\n\n if (ts.isNoSubstitutionTemplateLiteral(template)) {\n // 2 ``\n const templateWidth = template.getWidth() - 2;\n query = template.text.padStart(templateWidth);\n } else {\n const head = template.head;\n const templateSpans = template.templateSpans;\n\n // 3 `...${\n const templateWidth = head.getWidth() - 3;\n query = head.text.padStart(templateWidth);\n\n templateSpans.forEach((span, i) => {\n const spanWidth = span.getFullWidth();\n const literal = span.literal;\n const literalWidth = literal.getWidth();\n const expressionWidth = spanWidth - literalWidth;\n const variableName = `$_${i}`;\n const variable = variableName.padStart(expressionWidth + 2).padEnd(expressionWidth + 3);\n const templateWidth = literalWidth - (ts.isTemplateTail(literal) ? 2 : 3);\n const template = literal.text.padStart(templateWidth);\n query += variable + template;\n variables += variableName + \":Unknown\";\n });\n }\n\n const tag = node.tag.getText();\n let offset = template.getStart() + 1;\n query = query.replace(/\\n|\\r/g, \" \");\n\n if (variables) {\n query = `${tag}(${variables}){${query}}`;\n offset -= tag.length + variables.length + 3;\n } else if (tag === \"query\") {\n query = `{${query}}`;\n offset -= 1;\n } else {\n query = `${tag}{${query}}`;\n offset -= tag.length + 1;\n }\n\n const documentNode = parse(query);\n const errors = validate(schema, documentNode);\n\n for (const error of errors) {\n const match = error.message.match(\n /^Variable \".*?\" of type \"Unknown\" used in position expecting type \"(.*?)\"\\.$/,\n );\n\n if (match) {\n query = query.replace(\"Unknown\", match[1]);\n offset += 7 - match[1].length;\n }\n }\n\n return {\n query,\n offset,\n };\n };\n\n const proxy: LanguageService = Object.create(null);\n\n for (const [key, value] of Object.entries(languageService)) {\n (proxy as any)[key] = value.bind(languageService);\n }\n\n proxy.getQuickInfoAtPosition = (fileName, position) => {\n const sourceFile = getSourceFile(fileName);\n\n if (!sourceFile) {\n return undefined;\n }\n\n const tag = hover(sourceFile, position);\n\n if (!tag) {\n return languageService.getQuickInfoAtPosition(fileName, position);\n }\n\n let result: { query: string; offset: number };\n\n try {\n result = fix(tag);\n } catch {\n return languageService.getQuickInfoAtPosition(fileName, position);\n }\n\n const { query, offset } = result;\n const cursor = new Position(0, position - offset + 1);\n const token = getTokenAtPosition(query, cursor);\n const marked = getHoverInformation(schema, query, cursor, token);\n\n if (marked === \"\" || typeof marked !== \"string\") {\n return;\n }\n\n return {\n kind: ts.ScriptElementKind.string,\n textSpan: {\n start: offset + token.start,\n length: token.end - token.start,\n },\n kindModifiers: \"\",\n displayParts: [{ text: marked, kind: \"\" }],\n };\n };\n\n proxy.getCompletionsAtPosition = (fileName, position, options) => {\n const sourceFile = getSourceFile(fileName);\n\n if (!sourceFile) {\n return undefined;\n }\n\n const tag = hover(sourceFile, position);\n\n if (!tag) {\n return languageService.getCompletionsAtPosition(fileName, position, options);\n }\n\n let result: { query: string; offset: number };\n\n try {\n result = fix(tag);\n } catch {\n return languageService.getCompletionsAtPosition(fileName, position, options);\n }\n\n const { query, offset } = result;\n const cursor = new Position(0, position - offset);\n const items = getAutocompleteSuggestions(schema, query, cursor);\n\n if (!items.length) {\n return;\n }\n\n return {\n isGlobalCompletion: false,\n isMemberCompletion: false,\n isNewIdentifierLocation: false,\n entries: items.map((item) => {\n let kind: ts.ScriptElementKind;\n\n switch (item.kind) {\n case CompletionItemKind.Function:\n case CompletionItemKind.Constructor:\n kind = ts.ScriptElementKind.functionElement;\n break;\n case CompletionItemKind.Field:\n case CompletionItemKind.Variable:\n kind = ts.ScriptElementKind.memberVariableElement;\n break;\n default:\n kind = ts.ScriptElementKind.unknown;\n break;\n }\n\n return {\n name: item.label,\n kindModifiers: \"\",\n kind,\n sortText: \"\",\n };\n }),\n };\n };\n\n proxy.getSemanticDiagnostics = (fileName) => {\n const diagnostics = languageService.getSemanticDiagnostics(fileName);\n const sourceFile = getSourceFile(fileName);\n\n if (!sourceFile) {\n return diagnostics;\n }\n\n ts.forEachChild(sourceFile, function visitor(node) {\n if (ts.isTaggedTemplateExpression(node) && ts.isIdentifier(node.tag) && isGraphqlTag(node.tag.getText())) {\n try {\n const { query, offset } = fix(node);\n const _diagnostics = getDiagnostics(query, schema);\n\n for (const {\n range: { start, end },\n severity,\n message,\n } of _diagnostics) {\n diagnostics.push({\n category: getDiagnosticCategory(severity),\n code: 9999,\n messageText: message,\n file: sourceFile,\n start: start.character + offset,\n length: end.character - start.character,\n });\n }\n } catch (error) {\n if (error instanceof GraphQLError) {\n diagnostics.push({\n category: ts.DiagnosticCategory.Error,\n code: 9999,\n messageText: error.message,\n file: sourceFile,\n start: node.template.getStart() + 1,\n length: node.template.getWidth() - 2,\n });\n }\n }\n }\n\n ts.forEachChild(node, visitor);\n });\n\n return diagnostics;\n };\n\n return proxy;\n },\n };\n};\n\nexport default init;\n"],"names":[],"mappings":"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"}
package/dist/index.mjs DELETED
@@ -1,296 +0,0 @@
1
- import { watch, watchFile, unwatchFile, readFileSync } from 'fs';
2
- import { resolve } from 'path';
3
- import { printSchemaModel } from '@mo36924/graphql-schema';
4
- import { buildSchema, GraphQLError, parse, validate } from 'graphql';
5
- import { getTokenAtPosition, getHoverInformation, getAutocompleteSuggestions, getDiagnostics } from 'graphql-language-service-interface';
6
- import { Position } from 'graphql-language-service-utils';
7
- import { CompletionItemKind, DiagnosticSeverity } from 'vscode-languageserver-types';
8
-
9
- const init = ({ typescript: ts }) => {
10
- return {
11
- create(info) {
12
- const languageService = info.languageService;
13
- const config = info.config;
14
- const cwd = info.project.getCurrentDirectory();
15
- const modelPath = config.model && resolve(cwd, config.model);
16
- const schemaPath = config.schema && resolve(cwd, config.schema);
17
- const watchPath = modelPath || schemaPath;
18
- let schema = buildSchema("scalar Unknown");
19
- const addScalarUnknownType = (schemaCode) => schemaCode.includes("scalar Unknown") ? schemaCode : `${schemaCode}\nscalar Unknown`;
20
- const changeModel = () => {
21
- schema = buildSchema(addScalarUnknownType(printSchemaModel(readFileSync(modelPath, "utf8"))));
22
- };
23
- const changeSchema = () => {
24
- schema = buildSchema(addScalarUnknownType(readFileSync(schemaPath, "utf8")));
25
- };
26
- const update = modelPath ? changeModel : changeSchema;
27
- const listener = () => {
28
- try {
29
- update();
30
- }
31
- catch { }
32
- };
33
- try {
34
- update();
35
- watch(watchPath, listener);
36
- }
37
- catch {
38
- watchFile(watchPath, () => {
39
- try {
40
- update();
41
- watch(watchPath, listener);
42
- unwatchFile(watchPath);
43
- }
44
- catch { }
45
- });
46
- }
47
- const getSourceFile = (fileName) => languageService.getProgram()?.getSourceFile(fileName);
48
- const isGraphqlTag = (tag) => {
49
- switch (tag) {
50
- case "query":
51
- case "mutation":
52
- case "subscription":
53
- return true;
54
- default:
55
- return false;
56
- }
57
- };
58
- const getDiagnosticCategory = (severity) => {
59
- switch (severity) {
60
- case DiagnosticSeverity.Error:
61
- return ts.DiagnosticCategory.Error;
62
- case DiagnosticSeverity.Warning:
63
- return ts.DiagnosticCategory.Warning;
64
- case DiagnosticSeverity.Information:
65
- return ts.DiagnosticCategory.Message;
66
- case DiagnosticSeverity.Hint:
67
- return ts.DiagnosticCategory.Suggestion;
68
- default:
69
- return ts.DiagnosticCategory.Error;
70
- }
71
- };
72
- const hover = (sourceFile, position) => {
73
- const tag = ts.forEachChild(sourceFile, function visitor(node) {
74
- if (position < node.pos) {
75
- return true;
76
- }
77
- if (position >= node.end) {
78
- return;
79
- }
80
- if (ts.isTaggedTemplateExpression(node) && ts.isIdentifier(node.tag) && isGraphqlTag(node.tag.getText())) {
81
- const template = node.template;
82
- if (ts.isNoSubstitutionTemplateLiteral(template)) {
83
- if (position >= template.getStart() + 1 && position < template.getEnd() - 1) {
84
- return node;
85
- }
86
- }
87
- else {
88
- const head = template.head;
89
- if (position >= head.getStart() + 1 && position < head.getEnd() - 2) {
90
- return node;
91
- }
92
- for (const { literal } of template.templateSpans) {
93
- if (position >= literal.getStart() + 1 &&
94
- position < literal.getEnd() - (ts.isTemplateMiddle(literal) ? 2 : 1)) {
95
- return node;
96
- }
97
- }
98
- }
99
- }
100
- return ts.forEachChild(node, visitor);
101
- });
102
- if (tag === true) {
103
- return;
104
- }
105
- return tag;
106
- };
107
- const fix = (node) => {
108
- const template = node.template;
109
- let query = "";
110
- let variables = "";
111
- if (ts.isNoSubstitutionTemplateLiteral(template)) {
112
- // 2 ``
113
- const templateWidth = template.getWidth() - 2;
114
- query = template.text.padStart(templateWidth);
115
- }
116
- else {
117
- const head = template.head;
118
- const templateSpans = template.templateSpans;
119
- // 3 `...${
120
- const templateWidth = head.getWidth() - 3;
121
- query = head.text.padStart(templateWidth);
122
- templateSpans.forEach((span, i) => {
123
- const spanWidth = span.getFullWidth();
124
- const literal = span.literal;
125
- const literalWidth = literal.getWidth();
126
- const expressionWidth = spanWidth - literalWidth;
127
- const variableName = `$_${i}`;
128
- const variable = variableName.padStart(expressionWidth + 2).padEnd(expressionWidth + 3);
129
- const templateWidth = literalWidth - (ts.isTemplateTail(literal) ? 2 : 3);
130
- const template = literal.text.padStart(templateWidth);
131
- query += variable + template;
132
- variables += variableName + ":Unknown";
133
- });
134
- }
135
- const tag = node.tag.getText();
136
- let offset = template.getStart() + 1;
137
- query = query.replace(/\n|\r/g, " ");
138
- if (variables) {
139
- query = `${tag}(${variables}){${query}}`;
140
- offset -= tag.length + variables.length + 3;
141
- }
142
- else if (tag === "query") {
143
- query = `{${query}}`;
144
- offset -= 1;
145
- }
146
- else {
147
- query = `${tag}{${query}}`;
148
- offset -= tag.length + 1;
149
- }
150
- const documentNode = parse(query);
151
- const errors = validate(schema, documentNode);
152
- for (const error of errors) {
153
- const match = error.message.match(/^Variable ".*?" of type "Unknown" used in position expecting type "(.*?)"\.$/);
154
- if (match) {
155
- query = query.replace("Unknown", match[1]);
156
- offset += 7 - match[1].length;
157
- }
158
- }
159
- return {
160
- query,
161
- offset,
162
- };
163
- };
164
- const proxy = Object.create(null);
165
- for (const [key, value] of Object.entries(languageService)) {
166
- proxy[key] = value.bind(languageService);
167
- }
168
- proxy.getQuickInfoAtPosition = (fileName, position) => {
169
- const sourceFile = getSourceFile(fileName);
170
- if (!sourceFile) {
171
- return undefined;
172
- }
173
- const tag = hover(sourceFile, position);
174
- if (!tag) {
175
- return languageService.getQuickInfoAtPosition(fileName, position);
176
- }
177
- let result;
178
- try {
179
- result = fix(tag);
180
- }
181
- catch {
182
- return languageService.getQuickInfoAtPosition(fileName, position);
183
- }
184
- const { query, offset } = result;
185
- const cursor = new Position(0, position - offset + 1);
186
- const token = getTokenAtPosition(query, cursor);
187
- const marked = getHoverInformation(schema, query, cursor, token);
188
- if (marked === "" || typeof marked !== "string") {
189
- return;
190
- }
191
- return {
192
- kind: ts.ScriptElementKind.string,
193
- textSpan: {
194
- start: offset + token.start,
195
- length: token.end - token.start,
196
- },
197
- kindModifiers: "",
198
- displayParts: [{ text: marked, kind: "" }],
199
- };
200
- };
201
- proxy.getCompletionsAtPosition = (fileName, position, options) => {
202
- const sourceFile = getSourceFile(fileName);
203
- if (!sourceFile) {
204
- return undefined;
205
- }
206
- const tag = hover(sourceFile, position);
207
- if (!tag) {
208
- return languageService.getCompletionsAtPosition(fileName, position, options);
209
- }
210
- let result;
211
- try {
212
- result = fix(tag);
213
- }
214
- catch {
215
- return languageService.getCompletionsAtPosition(fileName, position, options);
216
- }
217
- const { query, offset } = result;
218
- const cursor = new Position(0, position - offset);
219
- const items = getAutocompleteSuggestions(schema, query, cursor);
220
- if (!items.length) {
221
- return;
222
- }
223
- return {
224
- isGlobalCompletion: false,
225
- isMemberCompletion: false,
226
- isNewIdentifierLocation: false,
227
- entries: items.map((item) => {
228
- let kind;
229
- switch (item.kind) {
230
- case CompletionItemKind.Function:
231
- case CompletionItemKind.Constructor:
232
- kind = ts.ScriptElementKind.functionElement;
233
- break;
234
- case CompletionItemKind.Field:
235
- case CompletionItemKind.Variable:
236
- kind = ts.ScriptElementKind.memberVariableElement;
237
- break;
238
- default:
239
- kind = ts.ScriptElementKind.unknown;
240
- break;
241
- }
242
- return {
243
- name: item.label,
244
- kindModifiers: "",
245
- kind,
246
- sortText: "",
247
- };
248
- }),
249
- };
250
- };
251
- proxy.getSemanticDiagnostics = (fileName) => {
252
- const diagnostics = languageService.getSemanticDiagnostics(fileName);
253
- const sourceFile = getSourceFile(fileName);
254
- if (!sourceFile) {
255
- return diagnostics;
256
- }
257
- ts.forEachChild(sourceFile, function visitor(node) {
258
- if (ts.isTaggedTemplateExpression(node) && ts.isIdentifier(node.tag) && isGraphqlTag(node.tag.getText())) {
259
- try {
260
- const { query, offset } = fix(node);
261
- const _diagnostics = getDiagnostics(query, schema);
262
- for (const { range: { start, end }, severity, message, } of _diagnostics) {
263
- diagnostics.push({
264
- category: getDiagnosticCategory(severity),
265
- code: 9999,
266
- messageText: message,
267
- file: sourceFile,
268
- start: start.character + offset,
269
- length: end.character - start.character,
270
- });
271
- }
272
- }
273
- catch (error) {
274
- if (error instanceof GraphQLError) {
275
- diagnostics.push({
276
- category: ts.DiagnosticCategory.Error,
277
- code: 9999,
278
- messageText: error.message,
279
- file: sourceFile,
280
- start: node.template.getStart() + 1,
281
- length: node.template.getWidth() - 2,
282
- });
283
- }
284
- }
285
- }
286
- ts.forEachChild(node, visitor);
287
- });
288
- return diagnostics;
289
- };
290
- return proxy;
291
- },
292
- };
293
- };
294
-
295
- export { init as default };
296
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import { readFileSync, unwatchFile, watch, watchFile } from \"fs\";\nimport { resolve } from \"path\";\nimport { printSchemaModel } from \"@mo36924/graphql-schema\";\nimport { GraphQLError, buildSchema, parse, validate } from \"graphql\";\nimport {\n getAutocompleteSuggestions,\n getDiagnostics,\n getHoverInformation,\n getTokenAtPosition,\n} from \"graphql-language-service-interface\";\nimport { Position } from \"graphql-language-service-utils\";\nimport type { LanguageService, SourceFile, TaggedTemplateExpression, server } from \"typescript/lib/tsserverlibrary\";\nimport { CompletionItemKind, DiagnosticSeverity } from \"vscode-languageserver-types\";\n\nconst init: server.PluginModuleFactory = ({ typescript: ts }) => {\n return {\n create(info) {\n const languageService = info.languageService;\n const config = info.config;\n const cwd = info.project.getCurrentDirectory();\n const modelPath = config.model && resolve(cwd, config.model);\n const schemaPath = config.schema && resolve(cwd, config.schema);\n const watchPath = modelPath || schemaPath;\n let schema = buildSchema(\"scalar Unknown\");\n\n const addScalarUnknownType = (schemaCode: string) =>\n schemaCode.includes(\"scalar Unknown\") ? schemaCode : `${schemaCode}\\nscalar Unknown`;\n\n const changeModel = () => {\n schema = buildSchema(addScalarUnknownType(printSchemaModel(readFileSync(modelPath, \"utf8\"))));\n };\n\n const changeSchema = () => {\n schema = buildSchema(addScalarUnknownType(readFileSync(schemaPath, \"utf8\")));\n };\n\n const update = modelPath ? changeModel : changeSchema;\n\n const listener = () => {\n try {\n update();\n } catch {}\n };\n\n try {\n update();\n watch(watchPath, listener);\n } catch {\n watchFile(watchPath, () => {\n try {\n update();\n watch(watchPath, listener);\n unwatchFile(watchPath);\n } catch {}\n });\n }\n\n const getSourceFile = (fileName: string) => languageService.getProgram()?.getSourceFile(fileName);\n\n const isGraphqlTag = (tag: string): tag is \"query\" | \"mutation\" | \"subscription\" => {\n switch (tag) {\n case \"query\":\n case \"mutation\":\n case \"subscription\":\n return true;\n default:\n return false;\n }\n };\n\n const getDiagnosticCategory = (severity?: number) => {\n switch (severity) {\n case DiagnosticSeverity.Error:\n return ts.DiagnosticCategory.Error;\n case DiagnosticSeverity.Warning:\n return ts.DiagnosticCategory.Warning;\n case DiagnosticSeverity.Information:\n return ts.DiagnosticCategory.Message;\n case DiagnosticSeverity.Hint:\n return ts.DiagnosticCategory.Suggestion;\n default:\n return ts.DiagnosticCategory.Error;\n }\n };\n\n const hover = (sourceFile: SourceFile, position: number) => {\n const tag = ts.forEachChild(sourceFile, function visitor(node): true | undefined | TaggedTemplateExpression {\n if (position < node.pos) {\n return true;\n }\n\n if (position >= node.end) {\n return;\n }\n\n if (ts.isTaggedTemplateExpression(node) && ts.isIdentifier(node.tag) && isGraphqlTag(node.tag.getText())) {\n const template = node.template;\n\n if (ts.isNoSubstitutionTemplateLiteral(template)) {\n if (position >= template.getStart() + 1 && position < template.getEnd() - 1) {\n return node;\n }\n } else {\n const head = template.head;\n\n if (position >= head.getStart() + 1 && position < head.getEnd() - 2) {\n return node;\n }\n\n for (const { literal } of template.templateSpans) {\n if (\n position >= literal.getStart() + 1 &&\n position < literal.getEnd() - (ts.isTemplateMiddle(literal) ? 2 : 1)\n ) {\n return node;\n }\n }\n }\n }\n\n return ts.forEachChild(node, visitor);\n });\n\n if (tag === true) {\n return;\n }\n\n return tag;\n };\n\n const fix = (node: TaggedTemplateExpression) => {\n const template = node.template;\n let query = \"\";\n let variables = \"\";\n\n if (ts.isNoSubstitutionTemplateLiteral(template)) {\n // 2 ``\n const templateWidth = template.getWidth() - 2;\n query = template.text.padStart(templateWidth);\n } else {\n const head = template.head;\n const templateSpans = template.templateSpans;\n\n // 3 `...${\n const templateWidth = head.getWidth() - 3;\n query = head.text.padStart(templateWidth);\n\n templateSpans.forEach((span, i) => {\n const spanWidth = span.getFullWidth();\n const literal = span.literal;\n const literalWidth = literal.getWidth();\n const expressionWidth = spanWidth - literalWidth;\n const variableName = `$_${i}`;\n const variable = variableName.padStart(expressionWidth + 2).padEnd(expressionWidth + 3);\n const templateWidth = literalWidth - (ts.isTemplateTail(literal) ? 2 : 3);\n const template = literal.text.padStart(templateWidth);\n query += variable + template;\n variables += variableName + \":Unknown\";\n });\n }\n\n const tag = node.tag.getText();\n let offset = template.getStart() + 1;\n query = query.replace(/\\n|\\r/g, \" \");\n\n if (variables) {\n query = `${tag}(${variables}){${query}}`;\n offset -= tag.length + variables.length + 3;\n } else if (tag === \"query\") {\n query = `{${query}}`;\n offset -= 1;\n } else {\n query = `${tag}{${query}}`;\n offset -= tag.length + 1;\n }\n\n const documentNode = parse(query);\n const errors = validate(schema, documentNode);\n\n for (const error of errors) {\n const match = error.message.match(\n /^Variable \".*?\" of type \"Unknown\" used in position expecting type \"(.*?)\"\\.$/,\n );\n\n if (match) {\n query = query.replace(\"Unknown\", match[1]);\n offset += 7 - match[1].length;\n }\n }\n\n return {\n query,\n offset,\n };\n };\n\n const proxy: LanguageService = Object.create(null);\n\n for (const [key, value] of Object.entries(languageService)) {\n (proxy as any)[key] = value.bind(languageService);\n }\n\n proxy.getQuickInfoAtPosition = (fileName, position) => {\n const sourceFile = getSourceFile(fileName);\n\n if (!sourceFile) {\n return undefined;\n }\n\n const tag = hover(sourceFile, position);\n\n if (!tag) {\n return languageService.getQuickInfoAtPosition(fileName, position);\n }\n\n let result: { query: string; offset: number };\n\n try {\n result = fix(tag);\n } catch {\n return languageService.getQuickInfoAtPosition(fileName, position);\n }\n\n const { query, offset } = result;\n const cursor = new Position(0, position - offset + 1);\n const token = getTokenAtPosition(query, cursor);\n const marked = getHoverInformation(schema, query, cursor, token);\n\n if (marked === \"\" || typeof marked !== \"string\") {\n return;\n }\n\n return {\n kind: ts.ScriptElementKind.string,\n textSpan: {\n start: offset + token.start,\n length: token.end - token.start,\n },\n kindModifiers: \"\",\n displayParts: [{ text: marked, kind: \"\" }],\n };\n };\n\n proxy.getCompletionsAtPosition = (fileName, position, options) => {\n const sourceFile = getSourceFile(fileName);\n\n if (!sourceFile) {\n return undefined;\n }\n\n const tag = hover(sourceFile, position);\n\n if (!tag) {\n return languageService.getCompletionsAtPosition(fileName, position, options);\n }\n\n let result: { query: string; offset: number };\n\n try {\n result = fix(tag);\n } catch {\n return languageService.getCompletionsAtPosition(fileName, position, options);\n }\n\n const { query, offset } = result;\n const cursor = new Position(0, position - offset);\n const items = getAutocompleteSuggestions(schema, query, cursor);\n\n if (!items.length) {\n return;\n }\n\n return {\n isGlobalCompletion: false,\n isMemberCompletion: false,\n isNewIdentifierLocation: false,\n entries: items.map((item) => {\n let kind: ts.ScriptElementKind;\n\n switch (item.kind) {\n case CompletionItemKind.Function:\n case CompletionItemKind.Constructor:\n kind = ts.ScriptElementKind.functionElement;\n break;\n case CompletionItemKind.Field:\n case CompletionItemKind.Variable:\n kind = ts.ScriptElementKind.memberVariableElement;\n break;\n default:\n kind = ts.ScriptElementKind.unknown;\n break;\n }\n\n return {\n name: item.label,\n kindModifiers: \"\",\n kind,\n sortText: \"\",\n };\n }),\n };\n };\n\n proxy.getSemanticDiagnostics = (fileName) => {\n const diagnostics = languageService.getSemanticDiagnostics(fileName);\n const sourceFile = getSourceFile(fileName);\n\n if (!sourceFile) {\n return diagnostics;\n }\n\n ts.forEachChild(sourceFile, function visitor(node) {\n if (ts.isTaggedTemplateExpression(node) && ts.isIdentifier(node.tag) && isGraphqlTag(node.tag.getText())) {\n try {\n const { query, offset } = fix(node);\n const _diagnostics = getDiagnostics(query, schema);\n\n for (const {\n range: { start, end },\n severity,\n message,\n } of _diagnostics) {\n diagnostics.push({\n category: getDiagnosticCategory(severity),\n code: 9999,\n messageText: message,\n file: sourceFile,\n start: start.character + offset,\n length: end.character - start.character,\n });\n }\n } catch (error) {\n if (error instanceof GraphQLError) {\n diagnostics.push({\n category: ts.DiagnosticCategory.Error,\n code: 9999,\n messageText: error.message,\n file: sourceFile,\n start: node.template.getStart() + 1,\n length: node.template.getWidth() - 2,\n });\n }\n }\n }\n\n ts.forEachChild(node, visitor);\n });\n\n return diagnostics;\n };\n\n return proxy;\n },\n };\n};\n\nexport default init;\n"],"names":[],"mappings":"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"}