@mo36924/graphql-plugin 1.6.4 → 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 CHANGED
@@ -1,125 +1,88 @@
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';
1
+ import { getConfig } from '@mo36924/graphql';
2
+ import { GraphQLError } from 'graphql';
3
+ import { Position, getTokenAtPosition, getHoverInformation, getAutocompleteSuggestions, getDiagnostics, CompletionItemKind, DIAGNOSTIC_SEVERITY } from 'graphql-language-service';
8
4
 
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);
5
+ const init = ({ typescript: ts })=>{
6
+ const isQueryTag = (node)=>ts.isTaggedTemplateExpression(node) && ts.isIdentifier(node.tag) && node.tag.escapedText === "gql";
7
+ const getScriptElementKind = (completionItemKind)=>{
8
+ switch(completionItemKind){
9
+ case CompletionItemKind.Function:
10
+ case CompletionItemKind.Constructor:
11
+ return ts.ScriptElementKind.functionElement;
12
+ case CompletionItemKind.Field:
13
+ case CompletionItemKind.Variable:
14
+ return ts.ScriptElementKind.memberVariableElement;
15
+ default:
16
+ return ts.ScriptElementKind.unknown;
17
+ }
18
+ };
19
+ const getDiagnosticCategory = (diagnosticSeverity)=>{
20
+ switch(diagnosticSeverity){
21
+ case DIAGNOSTIC_SEVERITY.Warning:
22
+ return ts.DiagnosticCategory.Warning;
23
+ case DIAGNOSTIC_SEVERITY.Information:
24
+ return ts.DiagnosticCategory.Message;
25
+ case DIAGNOSTIC_SEVERITY.Hint:
26
+ return ts.DiagnosticCategory.Suggestion;
27
+ default:
28
+ return ts.DiagnosticCategory.Error;
29
+ }
30
+ };
31
+ const getHoverQueryTag = (sourceFile, position)=>{
32
+ const tag = ts.forEachChild(sourceFile, function visitor(node) {
33
+ if (position < node.pos) {
34
+ return true;
36
35
  }
37
- catch {
38
- watchFile(watchPath, () => {
39
- try {
40
- update();
41
- watch(watchPath, listener);
42
- unwatchFile(watchPath);
43
- }
44
- catch { }
45
- });
36
+ if (position >= node.end) {
37
+ return;
46
38
  }
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;
39
+ if (isQueryTag(node)) {
40
+ const template = node.template;
41
+ if (ts.isNoSubstitutionTemplateLiteral(template)) {
42
+ if (position >= template.getStart() + 1 && position < template.getEnd() - 1) {
43
+ return node;
76
44
  }
77
- if (position >= node.end) {
78
- return;
45
+ } else {
46
+ const head = template.head;
47
+ if (position >= head.getStart() + 1 && position < head.getEnd() - 2) {
48
+ return node;
79
49
  }
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
- }
50
+ for (const { literal } of template.templateSpans){
51
+ if (position >= literal.getStart() + 1 && position < literal.getEnd() - (ts.isTemplateMiddle(literal) ? 2 : 1)) {
52
+ return node;
98
53
  }
99
54
  }
100
- return ts.forEachChild(node, visitor);
101
- });
102
- if (tag === true) {
103
- return;
104
55
  }
105
- return tag;
106
- };
107
- const fix = (node) => {
56
+ }
57
+ return ts.forEachChild(node, visitor);
58
+ });
59
+ if (tag === true) {
60
+ return;
61
+ }
62
+ return tag;
63
+ };
64
+ return {
65
+ create (info) {
66
+ const { path, schema } = getConfig();
67
+ const languageService = info.languageService;
68
+ if (!path) {
69
+ return languageService;
70
+ }
71
+ const getSourceFile = (fileName)=>languageService.getProgram()?.getSourceFile(fileName);
72
+ const normalizeQuery = (node)=>{
108
73
  const template = node.template;
109
74
  let query = "";
110
- let variables = "";
111
75
  if (ts.isNoSubstitutionTemplateLiteral(template)) {
112
- // 2 ``
76
+ // 2 \`\`
113
77
  const templateWidth = template.getWidth() - 2;
114
78
  query = template.text.padStart(templateWidth);
115
- }
116
- else {
79
+ } else {
117
80
  const head = template.head;
118
81
  const templateSpans = template.templateSpans;
119
- // 3 `...${
82
+ // 3 \`...\${
120
83
  const templateWidth = head.getWidth() - 3;
121
84
  query = head.text.padStart(templateWidth);
122
- templateSpans.forEach((span, i) => {
85
+ templateSpans.forEach((span, i)=>{
123
86
  const spanWidth = span.getFullWidth();
124
87
  const literal = span.literal;
125
88
  const literalWidth = literal.getWidth();
@@ -129,168 +92,130 @@ const init = ({ typescript: ts }) => {
129
92
  const templateWidth = literalWidth - (ts.isTemplateTail(literal) ? 2 : 3);
130
93
  const template = literal.text.padStart(templateWidth);
131
94
  query += variable + template;
132
- variables += variableName + ":Unknown";
133
95
  });
134
96
  }
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
- }
97
+ const field = query.match(/\w+/)?.[0] ?? "";
98
+ const isMutation = !!schema.getMutationType()?.getFields()[field];
99
+ const operation = isMutation ? "mutation" : "query";
100
+ query = operation + query.replace(/\n|\r/g, " ");
101
+ const offset = -operation.length + template.getStart() + 1;
159
102
  return {
160
103
  query,
161
- offset,
104
+ offset
162
105
  };
163
106
  };
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
- });
107
+ const proxy = {
108
+ ...languageService,
109
+ getQuickInfoAtPosition (fileName, position) {
110
+ const sourceFile = getSourceFile(fileName);
111
+ if (!sourceFile) {
112
+ return;
113
+ }
114
+ const tag = getHoverQueryTag(sourceFile, position);
115
+ if (!tag) {
116
+ return languageService.getQuickInfoAtPosition(fileName, position);
117
+ }
118
+ const { query, offset } = normalizeQuery(tag);
119
+ const cursor = new Position(0, position - offset);
120
+ const token = getTokenAtPosition(query, cursor);
121
+ const marked = getHoverInformation(schema, query, cursor, token);
122
+ if (marked === "" || typeof marked !== "string") {
123
+ return;
124
+ }
125
+ return {
126
+ kind: ts.ScriptElementKind.string,
127
+ textSpan: {
128
+ start: offset + token.start,
129
+ length: token.end - token.start
130
+ },
131
+ kindModifiers: "",
132
+ displayParts: [
133
+ {
134
+ text: marked,
135
+ kind: ""
271
136
  }
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
- });
137
+ ]
138
+ };
139
+ },
140
+ getCompletionsAtPosition (fileName, position, options) {
141
+ const sourceFile = getSourceFile(fileName);
142
+ if (!sourceFile) {
143
+ return;
144
+ }
145
+ const tag = getHoverQueryTag(sourceFile, position);
146
+ if (!tag) {
147
+ return languageService.getCompletionsAtPosition(fileName, position, options);
148
+ }
149
+ const { query, offset } = normalizeQuery(tag);
150
+ const cursor = new Position(0, position - offset);
151
+ const items = getAutocompleteSuggestions(schema, query, cursor);
152
+ if (/^\s*\{\s*\}\s*$/.test(query)) {
153
+ const operation = "mutation";
154
+ const cursor = new Position(0, operation.length + position - offset);
155
+ const labels = new Set(items.map((item)=>item.label));
156
+ const mutationItems = getAutocompleteSuggestions(schema, operation + query, cursor).filter((item)=>!labels.has(item.label));
157
+ items.push(...mutationItems);
158
+ }
159
+ if (!items.length) {
160
+ return;
161
+ }
162
+ return {
163
+ isGlobalCompletion: false,
164
+ isMemberCompletion: false,
165
+ isNewIdentifierLocation: false,
166
+ entries: items.map((item)=>({
167
+ name: item.label,
168
+ kindModifiers: "",
169
+ kind: getScriptElementKind(item.kind),
170
+ sortText: ""
171
+ }))
172
+ };
173
+ },
174
+ getSemanticDiagnostics (fileName) {
175
+ const diagnostics = languageService.getSemanticDiagnostics(fileName);
176
+ const sourceFile = getSourceFile(fileName);
177
+ if (!sourceFile) {
178
+ return diagnostics;
179
+ }
180
+ ts.forEachChild(sourceFile, function visitor(node) {
181
+ if (isQueryTag(node)) {
182
+ try {
183
+ const { query, offset } = normalizeQuery(node);
184
+ const _diagnostics = getDiagnostics(query, schema);
185
+ for (const { range: { start, end }, severity, message } of _diagnostics){
186
+ if (/Variable "\$.*?" is not defined/.test(message)) {
187
+ continue;
188
+ }
189
+ diagnostics.push({
190
+ category: getDiagnosticCategory(severity),
191
+ code: 9999,
192
+ messageText: message,
193
+ file: sourceFile,
194
+ start: start.character + offset,
195
+ length: end.character - start.character
196
+ });
197
+ }
198
+ } catch (error) {
199
+ if (error instanceof GraphQLError) {
200
+ diagnostics.push({
201
+ category: ts.DiagnosticCategory.Error,
202
+ code: 9999,
203
+ messageText: error.message,
204
+ file: sourceFile,
205
+ start: node.template.getStart() + 1,
206
+ length: node.template.getWidth() - 2
207
+ });
208
+ }
283
209
  }
284
210
  }
285
- }
286
- ts.forEachChild(node, visitor);
287
- });
288
- return diagnostics;
211
+ ts.forEachChild(node, visitor);
212
+ });
213
+ return diagnostics;
214
+ }
289
215
  };
290
216
  return proxy;
291
- },
217
+ }
292
218
  };
293
219
  };
294
220
 
295
221
  export { init as default };
296
- //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,35 +1,39 @@
1
1
  {
2
2
  "name": "@mo36924/graphql-plugin",
3
- "version": "1.6.4",
3
+ "type": "module",
4
+ "version": "5.0.69",
4
5
  "description": "graphql-plugin",
5
- "keywords": [],
6
- "homepage": "https://github.com/mo36924/monorepo#readme",
7
- "bugs": {
8
- "url": "https://github.com/mo36924/monorepo/issues"
9
- },
6
+ "author": "mo36924",
7
+ "license": "MIT",
8
+ "homepage": "https://github.com/mo36924/packages#readme",
10
9
  "repository": {
11
10
  "type": "git",
12
- "url": "git+https://github.com/mo36924/monorepo.git",
11
+ "url": "git+https://github.com/mo36924/packages.git",
13
12
  "directory": "packages/graphql-plugin"
14
13
  },
15
- "license": "MIT",
16
- "author": "mo36924 <mo36924@users.noreply.github.com>",
14
+ "bugs": {
15
+ "url": "https://github.com/mo36924/packages/issues"
16
+ },
17
+ "keywords": [],
17
18
  "exports": {
18
19
  ".": {
19
20
  "types": "./dist/index.d.ts",
20
- "browser": "./dist/index.js",
21
- "import": "./dist/index.mjs",
21
+ "import": "./dist/index.js",
22
22
  "require": "./dist/index.cjs",
23
- "default": "./dist/index.cjs"
23
+ "default": "./dist/index.js"
24
24
  }
25
25
  },
26
26
  "main": "./dist/index.cjs",
27
- "module": "./dist/index.mjs",
27
+ "module": "./dist/index.js",
28
28
  "types": "./dist/index.d.ts",
29
+ "publishConfig": {
30
+ "access": "public"
31
+ },
29
32
  "typesVersions": {
30
33
  "*": {
31
34
  "*": [
32
- "dist/*.d.ts"
35
+ "dist/*.d.ts",
36
+ "*"
33
37
  ]
34
38
  }
35
39
  },
@@ -37,15 +41,11 @@
37
41
  "dist"
38
42
  ],
39
43
  "dependencies": {
40
- "@mo36924/graphql-schema": "^1.6.4",
41
- "graphql": "^16.3.0",
42
- "graphql-language-service-interface": "^2.10.2",
43
- "graphql-language-service-utils": "^2.7.1",
44
- "typescript": "^4.6.3",
45
- "vscode-languageserver-types": "^3.16.0"
46
- },
47
- "publishConfig": {
48
- "access": "public"
44
+ "@mo36924/graphql": "^5.0.68",
45
+ "graphql": "^16.9.0",
46
+ "graphql-language-service": "^5.3.0",
47
+ "typescript": "^5.5.4",
48
+ "vscode-languageserver-types": "^3.17.5"
49
49
  },
50
- "gitHead": "d31e02b7fa864af39ce9fd8efaa6b2c2677f1537"
50
+ "gitHead": "5e9a973df2dab3b8eedcc0c37f6f5f5716662aaf"
51
51
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs","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":["resolve","buildSchema","printSchemaModel","readFileSync","watch","watchFile","unwatchFile","DiagnosticSeverity","parse","validate","Position","getTokenAtPosition","getHoverInformation","getAutocompleteSuggestions","CompletionItemKind","getDiagnostics","GraphQLError"],"mappings":"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"}