@mo36924/graphql-plugin 1.6.4 → 5.0.70

Sign up to get free protection for your applications and to get access to all the features.
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(info.project.getCurrentDirectory());
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.70",
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": "4f3dc6d40bf3dee3e25acb599cf7d17e8e15e3c4"
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":";;;;;;;;;;MAcM,IAAI,GAA+B,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE;IAC1D,OAAO;QACL,MAAM,CAAC,IAAI;YACT,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;YAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC;YAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,IAAIA,YAAO,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAC7D,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,IAAIA,YAAO,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAChE,MAAM,SAAS,GAAG,SAAS,IAAI,UAAU,CAAC;YAC1C,IAAI,MAAM,GAAGC,mBAAW,CAAC,gBAAgB,CAAC,CAAC;YAE3C,MAAM,oBAAoB,GAAG,CAAC,UAAkB,KAC9C,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC,GAAG,UAAU,GAAG,GAAG,UAAU,kBAAkB,CAAC;YAEvF,MAAM,WAAW,GAAG;gBAClB,MAAM,GAAGA,mBAAW,CAAC,oBAAoB,CAACC,8BAAgB,CAACC,eAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;aAC/F,CAAC;YAEF,MAAM,YAAY,GAAG;gBACnB,MAAM,GAAGF,mBAAW,CAAC,oBAAoB,CAACE,eAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;aAC9E,CAAC;YAEF,MAAM,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,YAAY,CAAC;YAEtD,MAAM,QAAQ,GAAG;gBACf,IAAI;oBACF,MAAM,EAAE,CAAC;iBACV;gBAAC,MAAM,GAAE;aACX,CAAC;YAEF,IAAI;gBACF,MAAM,EAAE,CAAC;gBACTC,QAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;aAC5B;YAAC,MAAM;gBACNC,YAAS,CAAC,SAAS,EAAE;oBACnB,IAAI;wBACF,MAAM,EAAE,CAAC;wBACTD,QAAK,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;wBAC3BE,cAAW,CAAC,SAAS,CAAC,CAAC;qBACxB;oBAAC,MAAM,GAAE;iBACX,CAAC,CAAC;aACJ;YAED,MAAM,aAAa,GAAG,CAAC,QAAgB,KAAK,eAAe,CAAC,UAAU,EAAE,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;YAElG,MAAM,YAAY,GAAG,CAAC,GAAW;gBAC/B,QAAQ,GAAG;oBACT,KAAK,OAAO,CAAC;oBACb,KAAK,UAAU,CAAC;oBAChB,KAAK,cAAc;wBACjB,OAAO,IAAI,CAAC;oBACd;wBACE,OAAO,KAAK,CAAC;iBAChB;aACF,CAAC;YAEF,MAAM,qBAAqB,GAAG,CAAC,QAAiB;gBAC9C,QAAQ,QAAQ;oBACd,KAAKC,4CAAkB,CAAC,KAAK;wBAC3B,OAAO,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC;oBACrC,KAAKA,4CAAkB,CAAC,OAAO;wBAC7B,OAAO,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC;oBACvC,KAAKA,4CAAkB,CAAC,WAAW;wBACjC,OAAO,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC;oBACvC,KAAKA,4CAAkB,CAAC,IAAI;wBAC1B,OAAO,EAAE,CAAC,kBAAkB,CAAC,UAAU,CAAC;oBAC1C;wBACE,OAAO,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC;iBACtC;aACF,CAAC;YAEF,MAAM,KAAK,GAAG,CAAC,UAAsB,EAAE,QAAgB;gBACrD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,SAAS,OAAO,CAAC,IAAI;oBAC3D,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE;wBACvB,OAAO,IAAI,CAAC;qBACb;oBAED,IAAI,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE;wBACxB,OAAO;qBACR;oBAED,IAAI,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,EAAE;wBACxG,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;wBAE/B,IAAI,EAAE,CAAC,+BAA+B,CAAC,QAAQ,CAAC,EAAE;4BAChD,IAAI,QAAQ,IAAI,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,QAAQ,GAAG,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;gCAC3E,OAAO,IAAI,CAAC;6BACb;yBACF;6BAAM;4BACL,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;4BAE3B,IAAI,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;gCACnE,OAAO,IAAI,CAAC;6BACb;4BAED,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,QAAQ,CAAC,aAAa,EAAE;gCAChD,IACE,QAAQ,IAAI,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;oCAClC,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EACpE;oCACA,OAAO,IAAI,CAAC;iCACb;6BACF;yBACF;qBACF;oBAED,OAAO,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;iBACvC,CAAC,CAAC;gBAEH,IAAI,GAAG,KAAK,IAAI,EAAE;oBAChB,OAAO;iBACR;gBAED,OAAO,GAAG,CAAC;aACZ,CAAC;YAEF,MAAM,GAAG,GAAG,CAAC,IAA8B;gBACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;gBAC/B,IAAI,KAAK,GAAG,EAAE,CAAC;gBACf,IAAI,SAAS,GAAG,EAAE,CAAC;gBAEnB,IAAI,EAAE,CAAC,+BAA+B,CAAC,QAAQ,CAAC,EAAE;;oBAEhD,MAAM,aAAa,GAAG,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;oBAC9C,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;iBAC/C;qBAAM;oBACL,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;oBAC3B,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC;;oBAG7C,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;oBAC1C,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;oBAE1C,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;wBAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;wBACtC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;wBAC7B,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;wBACxC,MAAM,eAAe,GAAG,SAAS,GAAG,YAAY,CAAC;wBACjD,MAAM,YAAY,GAAG,KAAK,CAAC,EAAE,CAAC;wBAC9B,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC;wBACxF,MAAM,aAAa,GAAG,YAAY,IAAI,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;wBAC1E,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;wBACtD,KAAK,IAAI,QAAQ,GAAG,QAAQ,CAAC;wBAC7B,SAAS,IAAI,YAAY,GAAG,UAAU,CAAC;qBACxC,CAAC,CAAC;iBACJ;gBAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;gBAC/B,IAAI,MAAM,GAAG,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;gBACrC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;gBAErC,IAAI,SAAS,EAAE;oBACb,KAAK,GAAG,GAAG,GAAG,IAAI,SAAS,KAAK,KAAK,GAAG,CAAC;oBACzC,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;iBAC7C;qBAAM,IAAI,GAAG,KAAK,OAAO,EAAE;oBAC1B,KAAK,GAAG,IAAI,KAAK,GAAG,CAAC;oBACrB,MAAM,IAAI,CAAC,CAAC;iBACb;qBAAM;oBACL,KAAK,GAAG,GAAG,GAAG,IAAI,KAAK,GAAG,CAAC;oBAC3B,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;iBAC1B;gBAED,MAAM,YAAY,GAAGC,aAAK,CAAC,KAAK,CAAC,CAAC;gBAClC,MAAM,MAAM,GAAGC,gBAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;gBAE9C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;oBAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAC/B,8EAA8E,CAC/E,CAAC;oBAEF,IAAI,KAAK,EAAE;wBACT,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC3C,MAAM,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;qBAC/B;iBACF;gBAED,OAAO;oBACL,KAAK;oBACL,MAAM;iBACP,CAAC;aACH,CAAC;YAEF,MAAM,KAAK,GAAoB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAEnD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE;gBACzD,KAAa,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;aACnD;YAED,KAAK,CAAC,sBAAsB,GAAG,CAAC,QAAQ,EAAE,QAAQ;gBAChD,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAE3C,IAAI,CAAC,UAAU,EAAE;oBACf,OAAO,SAAS,CAAC;iBAClB;gBAED,MAAM,GAAG,GAAG,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;gBAExC,IAAI,CAAC,GAAG,EAAE;oBACR,OAAO,eAAe,CAAC,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;iBACnE;gBAED,IAAI,MAAyC,CAAC;gBAE9C,IAAI;oBACF,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;iBACnB;gBAAC,MAAM;oBACN,OAAO,eAAe,CAAC,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;iBACnE;gBAED,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;gBACjC,MAAM,MAAM,GAAG,IAAIC,oCAAQ,CAAC,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC;gBACtD,MAAM,KAAK,GAAGC,kDAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAChD,MAAM,MAAM,GAAGC,mDAAmB,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;gBAEjE,IAAI,MAAM,KAAK,EAAE,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;oBAC/C,OAAO;iBACR;gBAED,OAAO;oBACL,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,MAAM;oBACjC,QAAQ,EAAE;wBACR,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC,KAAK;wBAC3B,MAAM,EAAE,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK;qBAChC;oBACD,aAAa,EAAE,EAAE;oBACjB,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;iBAC3C,CAAC;aACH,CAAC;YAEF,KAAK,CAAC,wBAAwB,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO;gBAC3D,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAE3C,IAAI,CAAC,UAAU,EAAE;oBACf,OAAO,SAAS,CAAC;iBAClB;gBAED,MAAM,GAAG,GAAG,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;gBAExC,IAAI,CAAC,GAAG,EAAE;oBACR,OAAO,eAAe,CAAC,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;iBAC9E;gBAED,IAAI,MAAyC,CAAC;gBAE9C,IAAI;oBACF,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;iBACnB;gBAAC,MAAM;oBACN,OAAO,eAAe,CAAC,wBAAwB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;iBAC9E;gBAED,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;gBACjC,MAAM,MAAM,GAAG,IAAIF,oCAAQ,CAAC,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC,CAAC;gBAClD,MAAM,KAAK,GAAGG,0DAA0B,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;gBAEhE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;oBACjB,OAAO;iBACR;gBAED,OAAO;oBACL,kBAAkB,EAAE,KAAK;oBACzB,kBAAkB,EAAE,KAAK;oBACzB,uBAAuB,EAAE,KAAK;oBAC9B,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI;wBACtB,IAAI,IAA0B,CAAC;wBAE/B,QAAQ,IAAI,CAAC,IAAI;4BACf,KAAKC,4CAAkB,CAAC,QAAQ,CAAC;4BACjC,KAAKA,4CAAkB,CAAC,WAAW;gCACjC,IAAI,GAAG,EAAE,CAAC,iBAAiB,CAAC,eAAe,CAAC;gCAC5C,MAAM;4BACR,KAAKA,4CAAkB,CAAC,KAAK,CAAC;4BAC9B,KAAKA,4CAAkB,CAAC,QAAQ;gCAC9B,IAAI,GAAG,EAAE,CAAC,iBAAiB,CAAC,qBAAqB,CAAC;gCAClD,MAAM;4BACR;gCACE,IAAI,GAAG,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC;gCACpC,MAAM;yBACT;wBAED,OAAO;4BACL,IAAI,EAAE,IAAI,CAAC,KAAK;4BAChB,aAAa,EAAE,EAAE;4BACjB,IAAI;4BACJ,QAAQ,EAAE,EAAE;yBACb,CAAC;qBACH,CAAC;iBACH,CAAC;aACH,CAAC;YAEF,KAAK,CAAC,sBAAsB,GAAG,CAAC,QAAQ;gBACtC,MAAM,WAAW,GAAG,eAAe,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;gBACrE,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAE3C,IAAI,CAAC,UAAU,EAAE;oBACf,OAAO,WAAW,CAAC;iBACpB;gBAED,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,SAAS,OAAO,CAAC,IAAI;oBAC/C,IAAI,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,EAAE;wBACxG,IAAI;4BACF,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;4BACpC,MAAM,YAAY,GAAGC,8CAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;4BAEnD,KAAK,MAAM,EACT,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EACrB,QAAQ,EACR,OAAO,GACR,IAAI,YAAY,EAAE;gCACjB,WAAW,CAAC,IAAI,CAAC;oCACf,QAAQ,EAAE,qBAAqB,CAAC,QAAQ,CAAC;oCACzC,IAAI,EAAE,IAAI;oCACV,WAAW,EAAE,OAAO;oCACpB,IAAI,EAAE,UAAU;oCAChB,KAAK,EAAE,KAAK,CAAC,SAAS,GAAG,MAAM;oCAC/B,MAAM,EAAE,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS;iCACxC,CAAC,CAAC;6BACJ;yBACF;wBAAC,OAAO,KAAK,EAAE;4BACd,IAAI,KAAK,YAAYC,oBAAY,EAAE;gCACjC,WAAW,CAAC,IAAI,CAAC;oCACf,QAAQ,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK;oCACrC,IAAI,EAAE,IAAI;oCACV,WAAW,EAAE,KAAK,CAAC,OAAO;oCAC1B,IAAI,EAAE,UAAU;oCAChB,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC;oCACnC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC;iCACrC,CAAC,CAAC;6BACJ;yBACF;qBACF;oBAED,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;iBAChC,CAAC,CAAC;gBAEH,OAAO,WAAW,CAAC;aACpB,CAAC;YAEF,OAAO,KAAK,CAAC;SACd;KACF,CAAC;AACJ;;;;"}