@marko/language-server 0.10.1 → 0.12.1

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.
Files changed (48) hide show
  1. package/LICENSE +1 -1
  2. package/bin.js +2 -0
  3. package/dist/index.js +744 -136
  4. package/dist/index.js.map +7 -1
  5. package/dist/index.mjs +822 -0
  6. package/dist/index.mjs.map +7 -0
  7. package/dist/utils/compiler.d.ts +9 -61
  8. package/dist/utils/completions/types/attributeModifier.d.ts +5 -5
  9. package/dist/utils/completions/types/attributeName.d.ts +5 -5
  10. package/dist/utils/completions/types/closeTag.d.ts +5 -5
  11. package/dist/utils/completions/types/openTag.d.ts +5 -5
  12. package/dist/utils/completions/types/openTagName.d.ts +5 -5
  13. package/dist/utils/completions/types/styleContent.d.ts +4 -4
  14. package/dist/utils/definitions/types/attributeName.d.ts +5 -5
  15. package/dist/utils/definitions/types/openTagName.d.ts +5 -5
  16. package/dist/utils/htmljs-parser.d.ts +2 -2
  17. package/dist/utils/utils.d.ts +2 -2
  18. package/package.json +30 -16
  19. package/dist/bin.js +0 -5
  20. package/dist/bin.js.map +0 -1
  21. package/dist/utils/compiler.js +0 -33
  22. package/dist/utils/compiler.js.map +0 -1
  23. package/dist/utils/completions/index.js +0 -10
  24. package/dist/utils/completions/index.js.map +0 -1
  25. package/dist/utils/completions/types/attributeModifier.js +0 -20
  26. package/dist/utils/completions/types/attributeModifier.js.map +0 -1
  27. package/dist/utils/completions/types/attributeName.js +0 -84
  28. package/dist/utils/completions/types/attributeName.js.map +0 -1
  29. package/dist/utils/completions/types/closeTag.js +0 -21
  30. package/dist/utils/completions/types/closeTag.js.map +0 -1
  31. package/dist/utils/completions/types/openTag.js +0 -21
  32. package/dist/utils/completions/types/openTag.js.map +0 -1
  33. package/dist/utils/completions/types/openTagName.js +0 -75
  34. package/dist/utils/completions/types/openTagName.js.map +0 -1
  35. package/dist/utils/completions/types/styleContent.js +0 -22
  36. package/dist/utils/completions/types/styleContent.js.map +0 -1
  37. package/dist/utils/definitions/index.js +0 -6
  38. package/dist/utils/definitions/index.js.map +0 -1
  39. package/dist/utils/definitions/types/attributeName.js +0 -31
  40. package/dist/utils/definitions/types/attributeName.js.map +0 -1
  41. package/dist/utils/definitions/types/openTagName.js +0 -38
  42. package/dist/utils/definitions/types/openTagName.js.map +0 -1
  43. package/dist/utils/htmljs-parser.js +0 -179
  44. package/dist/utils/htmljs-parser.js.map +0 -1
  45. package/dist/utils/regexp-builder.js +0 -27
  46. package/dist/utils/regexp-builder.js.map +0 -1
  47. package/dist/utils/utils.js +0 -68
  48. package/dist/utils/utils.js.map +0 -1
package/dist/index.js CHANGED
@@ -1,171 +1,779 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const tslib_1 = require("tslib");
4
- const node_1 = require("vscode-languageserver/node");
5
- const vscode_uri_1 = require("vscode-uri");
6
- const vscode_languageserver_textdocument_1 = require("vscode-languageserver-textdocument");
7
- const prettier = (0, tslib_1.__importStar)(require("prettier"));
8
- const util_1 = require("util");
9
- const compiler_1 = require("./utils/compiler");
10
- const htmljs_parser_1 = require("./utils/htmljs-parser");
11
- const completionTypes = (0, tslib_1.__importStar)(require("./utils/completions"));
12
- const definitionTypes = (0, tslib_1.__importStar)(require("./utils/definitions"));
13
- if (typeof require !== "undefined" &&
14
- require.extensions &&
15
- !(".ts" in require.extensions)) {
16
- // Prevent compiler hooks written in typescript to explode the language server.
17
- require.extensions[".ts"] = undefined;
18
- }
19
- const cacheForCompiler = new WeakMap();
20
- const connection = (0, node_1.createConnection)(node_1.ProposedFeatures.all);
21
- const prevDiagnostics = new WeakMap();
22
- const diagnosticTimeouts = new WeakMap();
23
- const documents = new node_1.TextDocuments(vscode_languageserver_textdocument_1.TextDocument);
24
- const markoErrorRegExp = /^(.+?)(?:\((\d+)(?:\s*,\s*(\d+))?\))?: (.*)$/gm;
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
9
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10
+ var __spreadValues = (a, b) => {
11
+ for (var prop in b || (b = {}))
12
+ if (__hasOwnProp.call(b, prop))
13
+ __defNormalProp(a, prop, b[prop]);
14
+ if (__getOwnPropSymbols)
15
+ for (var prop of __getOwnPropSymbols(b)) {
16
+ if (__propIsEnum.call(b, prop))
17
+ __defNormalProp(a, prop, b[prop]);
18
+ }
19
+ return a;
20
+ };
21
+ var __export = (target, all) => {
22
+ for (var name in all)
23
+ __defProp(target, name, { get: all[name], enumerable: true });
24
+ };
25
+ var __copyProps = (to, from, except, desc) => {
26
+ if (from && typeof from === "object" || typeof from === "function") {
27
+ for (let key of __getOwnPropNames(from))
28
+ if (!__hasOwnProp.call(to, key) && key !== except)
29
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
30
+ }
31
+ return to;
32
+ };
33
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod));
34
+
35
+ // src/index.ts
36
+ var import_node = require("vscode-languageserver/node");
37
+ var import_vscode_uri6 = require("vscode-uri");
38
+ var import_vscode_languageserver_textdocument3 = require("vscode-languageserver-textdocument");
39
+ var prettier = __toESM(require("prettier"));
40
+ var markoPrettier = __toESM(require("prettier-plugin-marko"));
41
+ var import_util = require("util");
42
+
43
+ // src/utils/compiler.ts
44
+ var import_path = __toESM(require("path"));
45
+ var import_vscode_uri = require("vscode-uri");
46
+ var import_resolve_from = __toESM(require("resolve-from"));
47
+ var import_lasso_package_root = __toESM(require("lasso-package-root"));
48
+ var builtinCompiler = __toESM(require("@marko/compiler"));
49
+ var builtinTranslator = __toESM(require("@marko/translator-default"));
50
+ builtinCompiler.configure({ translator: builtinTranslator });
51
+ var compilerAndTranslatorForDoc = /* @__PURE__ */ new WeakMap();
52
+ function getCompilerAndTranslatorForDoc(doc) {
53
+ let compilerAndTranslator = compilerAndTranslatorForDoc.get(doc);
54
+ if (!compilerAndTranslator) {
55
+ compilerAndTranslatorForDoc.set(doc, compilerAndTranslator = loadCompiler(import_path.default.dirname(import_vscode_uri.URI.parse(doc.uri).fsPath)));
56
+ }
57
+ return compilerAndTranslator;
58
+ }
59
+ function getTagLibLookup(document) {
60
+ try {
61
+ const { compiler, translator } = getCompilerAndTranslatorForDoc(document);
62
+ return compiler.taglib.buildLookup(import_vscode_uri.URI.parse(document.uri).fsPath, translator);
63
+ } catch {
64
+ }
65
+ }
66
+ function loadCompiler(dir) {
67
+ const rootDir = import_lasso_package_root.default.getRootDir(dir);
68
+ const pkgPath = rootDir && import_resolve_from.default.silent(rootDir, "@marko/compiler/package.json");
69
+ const pkg = pkgPath && require(pkgPath);
70
+ if (pkg && /^5\./.test(pkg.version)) {
71
+ try {
72
+ let translator = [].concat(Object.keys(pkg.dependencies), Object.keys(pkg.peerDependencies), Object.keys(pkg.devDependencies)).find((name) => /^marko$|^(@\/marko\/|marko-)translator-/.test(name));
73
+ if (translator === "marko" || !translator) {
74
+ translator = require((0, import_resolve_from.default)(dir, "@marko/compiler/config")).translator;
75
+ }
76
+ require((0, import_resolve_from.default)(dir, translator));
77
+ return {
78
+ compiler: require((0, import_resolve_from.default)(dir, "@marko/compiler")),
79
+ translator
80
+ };
81
+ } catch {
82
+ }
83
+ }
84
+ return {
85
+ compiler: builtinCompiler,
86
+ translator: builtinTranslator
87
+ };
88
+ }
89
+
90
+ // src/utils/htmljs-parser.ts
91
+ var import_htmljs_parser = require("htmljs-parser");
92
+ var SUPPORTED_STYLE_LANGS = {
93
+ css: true,
94
+ scss: true,
95
+ less: true
96
+ };
97
+ function parseUntilOffset(options) {
98
+ const { offset, text, taglib, includeErrors } = options;
99
+ let result = null;
100
+ let parentTag = null;
101
+ const parser = (0, import_htmljs_parser.createParser)({
102
+ onError: includeErrors && finish,
103
+ onScriptlet: finish,
104
+ onPlaceholder: finish,
105
+ onOpenTagName(ev) {
106
+ if (parentTag) {
107
+ ev.parent = parentTag;
108
+ }
109
+ if (!ev.concise) {
110
+ ev.pos += 1;
111
+ }
112
+ ev.endPos = ev.pos + ev.tagName.length;
113
+ parentTag = ev;
114
+ finish(ev);
115
+ },
116
+ onOpenTag(ev) {
117
+ ev.parent = parentTag.parent;
118
+ parentTag = ev;
119
+ if (ev.tagName === "style") {
120
+ const firstAttr = ev.attributes[0];
121
+ const isBlock = firstAttr && firstAttr.name.startsWith("{");
122
+ if (isBlock) {
123
+ const content = firstAttr.name.slice(1, -1);
124
+ const pos = text.indexOf(content, ev.tagNameEndPos);
125
+ const endPos = pos + content.length;
126
+ const requestedLanguage = ev.shorthandClassNames && ev.shorthandClassNames[0].rawParts[0] && ev.shorthandClassNames[0].rawParts[0].text;
127
+ const language = requestedLanguage && SUPPORTED_STYLE_LANGS[requestedLanguage] ? requestedLanguage : "css";
128
+ finish({
129
+ type: "styleContent",
130
+ language,
131
+ block: true,
132
+ content: text.slice(pos, endPos),
133
+ pos,
134
+ endPos
135
+ });
136
+ return;
137
+ }
138
+ }
139
+ let attrEndPos = ev.tagNameEndPos;
140
+ for (const attr of ev.attributes) {
141
+ if (!attr.name) {
142
+ if (attr.value !== void 0) {
143
+ attrEndPos += attr.value.length;
144
+ }
145
+ continue;
146
+ }
147
+ if (attr.name.slice(0, 3) === "...") {
148
+ attrEndPos = attr.argument ? attr.argument.endPos + 1 : attr.endPos;
149
+ continue;
150
+ }
151
+ const attrStartPos = text.indexOf(attr.name, attrEndPos);
152
+ const match = /:(.*)$/.exec(attr.name);
153
+ const modifier = match && match[1];
154
+ let name = attr.name;
155
+ if (modifier) {
156
+ name = name.slice(0, name.length - modifier.length - 1);
157
+ const modifierStartPos = attrStartPos + name.length;
158
+ const modifierEndPos = modifierStartPos + modifier.length + 1;
159
+ if (finish({
160
+ type: "attributeModifier",
161
+ tag: ev,
162
+ name,
163
+ modifier,
164
+ pos: modifierStartPos,
165
+ endPos: modifierEndPos
166
+ })) {
167
+ return;
168
+ }
169
+ }
170
+ const attrNameEndPos = attrStartPos + name.length;
171
+ if (finish({
172
+ type: "attributeName",
173
+ tag: ev,
174
+ name,
175
+ pos: attrStartPos,
176
+ endPos: attrNameEndPos
177
+ })) {
178
+ return;
179
+ }
180
+ if (attr.value) {
181
+ attrEndPos = attr.endPos;
182
+ const valueStartPos = attr.pos + 1;
183
+ if (finish({
184
+ type: "attributeValue",
185
+ tag: ev,
186
+ name,
187
+ value: text.slice(valueStartPos, attrEndPos),
188
+ pos: valueStartPos,
189
+ endPos: attr.endPos
190
+ })) {
191
+ break;
192
+ }
193
+ } else {
194
+ attrEndPos = attr.argument ? attr.argument.endPos + 1 : attr.endPos;
195
+ }
196
+ }
197
+ finish(ev);
198
+ },
199
+ onText(ev) {
200
+ ev.endPos = parser.pos;
201
+ ev.pos = ev.endPos - ev.value.length;
202
+ if (parentTag) {
203
+ ev.parent = parentTag;
204
+ if (parentTag.tagName === "style") {
205
+ finish({
206
+ type: "styleContent",
207
+ language: "css",
208
+ block: false,
209
+ content: ev.value,
210
+ pos: ev.pos,
211
+ endPos: ev.endPos
212
+ });
213
+ return;
214
+ }
215
+ }
216
+ finish(ev);
217
+ },
218
+ onCloseTag(ev) {
219
+ parentTag = parentTag && parentTag.parent;
220
+ finish(ev);
221
+ }
222
+ }, {
223
+ isOpenTagOnly(ev) {
224
+ const tagDef = taglib.getTag(ev);
225
+ return tagDef && tagDef.openTagOnly;
226
+ }
227
+ });
228
+ try {
229
+ parser.parse(`${text}
230
+ `);
231
+ } catch (err) {
232
+ return includeErrors ? {
233
+ type: "error",
234
+ code: "UNEXPECTED_TOKEN",
235
+ message: err.message,
236
+ pos: parser.pos,
237
+ endPos: parser.pos
238
+ } : null;
239
+ }
240
+ return result;
241
+ function finish(event) {
242
+ const { type, pos, endPos } = event;
243
+ if (!result && (type === "error" || pos != null && pos <= offset && endPos != null && endPos >= offset)) {
244
+ result = event;
245
+ parser.end();
246
+ return true;
247
+ }
248
+ return false;
249
+ }
250
+ }
251
+
252
+ // src/utils/completions/index.ts
253
+ var completions_exports = {};
254
+ __export(completions_exports, {
255
+ attributeModifier: () => attributeModifier,
256
+ attributeName: () => attributeName,
257
+ closeTag: () => closeTag,
258
+ openTag: () => openTag,
259
+ openTagName: () => openTagName,
260
+ styleContent: () => styleContent
261
+ });
262
+
263
+ // src/utils/completions/types/attributeModifier.ts
264
+ var import_vscode_languageserver = require("vscode-languageserver");
265
+ function attributeModifier(_taglib, _document, _params, _event) {
266
+ return import_vscode_languageserver.CompletionList.create([
267
+ {
268
+ label: "scoped",
269
+ kind: import_vscode_languageserver.CompletionItemKind.Keyword,
270
+ detail: "Use to prefix with a unique ID"
271
+ },
272
+ {
273
+ label: "no-update",
274
+ kind: import_vscode_languageserver.CompletionItemKind.Keyword,
275
+ detail: "Use to skip future updates to this attribute"
276
+ }
277
+ ], true);
278
+ }
279
+
280
+ // src/utils/completions/types/attributeName.ts
281
+ var import_vscode_languageserver3 = require("vscode-languageserver");
282
+
283
+ // src/utils/utils.ts
284
+ var import_fs = __toESM(require("fs"));
285
+ var import_vscode_uri2 = require("vscode-uri");
286
+ var import_vscode_languageserver2 = require("vscode-languageserver");
287
+ var import_vscode_languageserver_textdocument = require("vscode-languageserver-textdocument");
288
+ var START_OF_FILE = import_vscode_languageserver2.Range.create(import_vscode_languageserver2.Position.create(0, 0), import_vscode_languageserver2.Position.create(0, 0));
289
+ function findNonControlFlowParent(tag) {
290
+ let parent = tag.parent;
291
+ while (parent) {
292
+ if (!/^(?:else-)?if|else|for|while$/.test(parent.tagName)) {
293
+ return parent;
294
+ }
295
+ parent = parent.parent;
296
+ }
297
+ return null;
298
+ }
299
+ function rangeFromEvent(document, event) {
300
+ return import_vscode_languageserver2.Range.create(document.positionAt(event.pos), document.positionAt(event.endPos));
301
+ }
302
+ function createTextDocument(filename) {
303
+ const uri = import_vscode_uri2.URI.file(filename).toString();
304
+ const content = import_fs.default.readFileSync(filename, "utf-8");
305
+ return import_vscode_languageserver_textdocument.TextDocument.create(uri, "plaintext", 0, content);
306
+ }
307
+ function shiftCompletionRanges(list, offset) {
308
+ list.items.forEach((item) => {
309
+ if (item.additionalTextEdits) {
310
+ item.additionalTextEdits.forEach((edit) => shiftRange(edit.range, offset));
311
+ }
312
+ if (item.textEdit) {
313
+ shiftEdit(item.textEdit, offset);
314
+ }
315
+ });
316
+ return list;
317
+ }
318
+ function shiftEdit(edit, offset) {
319
+ if (import_vscode_languageserver2.TextEdit.is(edit)) {
320
+ shiftRange(edit.range, offset);
321
+ } else {
322
+ shiftRange(edit.insert, offset);
323
+ shiftRange(edit.replace, offset);
324
+ }
325
+ }
326
+ function shiftRange(range, offset) {
327
+ if (range) {
328
+ shiftPosition(range.start, offset);
329
+ shiftPosition(range.end, offset);
330
+ }
331
+ }
332
+ function shiftPosition(pos, offset) {
333
+ if (pos.line === 0) {
334
+ pos.character += offset.character;
335
+ }
336
+ pos.line += offset.line;
337
+ return pos;
338
+ }
339
+
340
+ // src/utils/completions/types/attributeName.ts
341
+ function attributeName(taglib, document, _params, event) {
342
+ const completions = [];
343
+ const attrNameRange = rangeFromEvent(document, event);
344
+ const tagDef = !event.tag.tagNameExpression && taglib.getTag(event.tag.tagName);
345
+ const tagName = tagDef && tagDef.name || "*";
346
+ const nestedTagAttrs = {};
347
+ const neverAttrs = /* @__PURE__ */ new Set();
348
+ if (tagDef && tagDef.nestedTags) {
349
+ for (const key in tagDef.nestedTags) {
350
+ const nestedTagDef = tagDef.nestedTags[key];
351
+ nestedTagAttrs[nestedTagDef.targetProperty] = true;
352
+ }
353
+ }
354
+ taglib.forEachAttribute(tagName, (attr) => {
355
+ if (attr.type === "never") {
356
+ neverAttrs.add(attr.name);
357
+ }
358
+ });
359
+ taglib.forEachAttribute(tagName, (attr, parent) => {
360
+ if (attr.deprecated || nestedTagAttrs[attr.name] || attr.name === "*" || neverAttrs.has(attr.name) || attr.name[0] === "_" && /\/node_modules\//.test(attr.filePath || parent.filePath)) {
361
+ return;
362
+ }
363
+ const type = attr.type || (attr.html ? "string" : null);
364
+ const documentation = {
365
+ kind: import_vscode_languageserver3.MarkupKind.Markdown,
366
+ value: attr.description || ""
367
+ };
368
+ let label = attr.name;
369
+ let snippet = attr.name;
370
+ if (attr.enum) {
371
+ snippet += `="\${1|${attr.enum.join()}|}"$0`;
372
+ } else {
373
+ switch (type) {
374
+ case "string":
375
+ snippet += '="$1"$0';
376
+ break;
377
+ case "function":
378
+ snippet += "=($1)$0";
379
+ break;
380
+ case "statement":
381
+ case "boolean":
382
+ case "flag":
383
+ break;
384
+ default:
385
+ snippet += "=";
386
+ break;
387
+ }
388
+ }
389
+ const autocomplete = attr.autocomplete && Array.isArray(attr.autocomplete) ? attr.autocomplete[0] : attr.autocomplete;
390
+ if (autocomplete) {
391
+ label = autocomplete.displayText || label;
392
+ snippet = autocomplete.snippet || snippet;
393
+ if (autocomplete.descriptionMoreURL) {
394
+ if (documentation.value) {
395
+ documentation.value += `
396
+
397
+ `;
398
+ }
399
+ documentation.value += `[More Info](${autocomplete.descriptionMoreURL})`;
400
+ }
401
+ }
402
+ completions.push({
403
+ label,
404
+ documentation: documentation.value ? documentation : void 0,
405
+ kind: import_vscode_languageserver3.CompletionItemKind.Property,
406
+ insertTextFormat: import_vscode_languageserver3.InsertTextFormat.Snippet,
407
+ textEdit: import_vscode_languageserver3.TextEdit.replace(attrNameRange, snippet)
408
+ });
409
+ });
410
+ return import_vscode_languageserver3.CompletionList.create(completions, true);
411
+ }
412
+
413
+ // src/utils/completions/types/closeTag.ts
414
+ var import_vscode_languageserver4 = require("vscode-languageserver");
415
+ function closeTag(_taglib, document, _params, event) {
416
+ if (event.tagName[0] === "$") {
417
+ return;
418
+ }
419
+ const closingTagStr = `</${event.tagName}>`;
420
+ return import_vscode_languageserver4.CompletionList.create([
421
+ {
422
+ label: closingTagStr,
423
+ kind: import_vscode_languageserver4.CompletionItemKind.Class,
424
+ insertTextFormat: import_vscode_languageserver4.InsertTextFormat.Snippet,
425
+ textEdit: import_vscode_languageserver4.TextEdit.replace(rangeFromEvent(document, event), closingTagStr)
426
+ }
427
+ ], true);
428
+ }
429
+
430
+ // src/utils/completions/types/openTag.ts
431
+ var import_vscode_languageserver5 = require("vscode-languageserver");
432
+ function openTag(_taglib, _document, params, event) {
433
+ const triggerCharacter = params.context && params.context.triggerCharacter;
434
+ if (triggerCharacter !== ">" || event.openTagOnly || event.selfClosed) {
435
+ return;
436
+ }
437
+ const closingTagStr = `</${event.tagName[0] === "$" ? "" : event.tagName}>`;
438
+ return import_vscode_languageserver5.CompletionList.create([
439
+ {
440
+ label: closingTagStr,
441
+ kind: import_vscode_languageserver5.CompletionItemKind.Class,
442
+ insertTextFormat: import_vscode_languageserver5.InsertTextFormat.Snippet,
443
+ insertText: `
444
+ $0
445
+ ${closingTagStr}`
446
+ }
447
+ ], true);
448
+ }
449
+
450
+ // src/utils/completions/types/openTagName.ts
451
+ var import_path2 = __toESM(require("path"));
452
+ var import_vscode_uri3 = require("vscode-uri");
453
+ var import_vscode_languageserver6 = require("vscode-languageserver");
454
+ function openTagName(taglib, document, params, event) {
455
+ const { fsPath: currentTemplateFilePath } = import_vscode_uri3.URI.parse(document.uri);
456
+ let tags;
457
+ const triggerCharacter = params.context && params.context.triggerCharacter || event.tagName[0];
458
+ const isAttributeTag = triggerCharacter === "@";
459
+ const tagNameRange = rangeFromEvent(document, event);
460
+ if (isAttributeTag) {
461
+ const parentTag = findNonControlFlowParent(event);
462
+ const parentTagDef = parentTag && !parentTag.tagNameExpression && taglib.getTag(parentTag.tagName);
463
+ tags = parentTagDef && parentTagDef.nestedTags && Object.values(parentTagDef.nestedTags) || [];
464
+ } else {
465
+ tags = taglib.getTagsSorted().filter((it) => !it.isNestedTag);
466
+ }
467
+ return import_vscode_languageserver6.CompletionList.create(tags.filter((it) => !it.deprecated).filter((it) => it.name !== "*").filter((it) => /^[^_]/.test(it.name) || !/\/node_modules\//.test(it.filePath)).map((it) => {
468
+ let label = it.isNestedTag ? `@${it.name}` : it.name;
469
+ const fileForTag = it.template || it.renderer || it.filePath;
470
+ const fileURIForTag = import_vscode_uri3.URI.file(fileForTag).toString();
471
+ const nodeModuleMatch = /\/node_modules\/((?:@[^/]+\/)?[^/]+)/.exec(fileForTag);
472
+ const nodeModuleName = nodeModuleMatch && nodeModuleMatch[1];
473
+ const isCoreTag = nodeModuleName === "marko";
474
+ const documentation = {
475
+ kind: import_vscode_languageserver6.MarkupKind.Markdown,
476
+ value: it.html ? `Built in [<${it.name}>](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/${it.name}) HTML tag.` : nodeModuleName ? isCoreTag ? `Core Marko [<${it.name}>](${fileURIForTag}) tag.` : `Custom Marko tag discovered from the ["${nodeModuleName}"](${fileURIForTag}) npm package.` : `Custom Marko tag discovered from:
477
+
478
+ [${import_path2.default.relative(currentTemplateFilePath, fileForTag)}](${fileURIForTag})`
479
+ };
480
+ if (it.description) {
481
+ documentation.value += `
482
+
483
+ ${it.description}`;
484
+ }
485
+ const autocomplete = it.autocomplete && it.autocomplete[0];
486
+ if (autocomplete) {
487
+ if (autocomplete.displayText) {
488
+ label = autocomplete.displayText;
489
+ }
490
+ if (autocomplete.description) {
491
+ documentation.value += `
492
+
493
+ ${autocomplete.description}`;
494
+ }
495
+ if (autocomplete.descriptionMoreURL) {
496
+ documentation.value += `
497
+
498
+ [More Info](${autocomplete.descriptionMoreURL})`;
499
+ }
500
+ }
501
+ return {
502
+ label,
503
+ documentation,
504
+ kind: import_vscode_languageserver6.CompletionItemKind.Class,
505
+ insertTextFormat: import_vscode_languageserver6.InsertTextFormat.Snippet,
506
+ textEdit: import_vscode_languageserver6.TextEdit.replace(tagNameRange, autocomplete && autocomplete.snippet || label)
507
+ };
508
+ }), true);
509
+ }
510
+
511
+ // src/utils/completions/types/styleContent.ts
512
+ var import_vscode_languageserver7 = require("vscode-languageserver");
513
+ var import_vscode_languageserver_textdocument2 = require("vscode-languageserver-textdocument");
514
+ var import_vscode_css_languageservice = require("vscode-css-languageservice");
515
+ var services = {
516
+ css: import_vscode_css_languageservice.getCSSLanguageService,
517
+ scss: import_vscode_css_languageservice.getSCSSLanguageService,
518
+ less: import_vscode_css_languageservice.getLESSLanguageService
519
+ };
520
+ function styleContent(_taglib, document, params, event) {
521
+ const service = services[event.language]();
522
+ const startPos = document.positionAt(event.pos);
523
+ const relativePos = shiftPosition(params.position, import_vscode_languageserver7.Position.create(startPos.line * -1, startPos.character * -1));
524
+ const contentDocument = import_vscode_languageserver_textdocument2.TextDocument.create(document.uri, event.language, document.version, event.content);
525
+ const completions = service.doComplete(contentDocument, relativePos, service.parseStylesheet(contentDocument));
526
+ return shiftCompletionRanges(completions, startPos);
527
+ }
528
+
529
+ // src/utils/definitions/index.ts
530
+ var definitions_exports = {};
531
+ __export(definitions_exports, {
532
+ attributeName: () => attributeName2,
533
+ openTagName: () => openTagName2
534
+ });
535
+
536
+ // src/utils/definitions/types/attributeName.ts
537
+ var import_vscode_uri4 = require("vscode-uri");
538
+ var import_vscode_languageserver8 = require("vscode-languageserver");
539
+
540
+ // src/utils/regexp-builder.ts
541
+ function RegExpBuilder(strings, ...expressions) {
542
+ let i = 0;
543
+ let src = strings[0].slice(strings[0].indexOf("/") + 1);
544
+ const secondLastExprIndex = strings.length - 2;
545
+ for (; i < secondLastExprIndex; i++) {
546
+ src += escape(expressions[i]) + strings[i + 1];
547
+ }
548
+ src += escape(expressions[i]);
549
+ const lastStr = strings[i + 1];
550
+ const lastSlashIndex = lastStr.lastIndexOf("/");
551
+ let flags = "";
552
+ if (lastSlashIndex === -1) {
553
+ src += lastStr;
554
+ } else {
555
+ flags = lastStr.slice(lastSlashIndex + 1);
556
+ src += lastStr.slice(0, lastSlashIndex);
557
+ }
558
+ return new RegExp(src, flags);
559
+ }
560
+ function escape(val) {
561
+ return String(val).replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&");
562
+ }
563
+
564
+ // src/utils/definitions/types/attributeName.ts
565
+ function attributeName2(taglib, document, _params, event) {
566
+ const tagName = event.tag.tagNameExpression ? void 0 : event.tag.tagName;
567
+ const tagDef = tagName && taglib.getTag(tagName);
568
+ const attrDef = taglib.getAttribute(tagName || "*", event.name);
569
+ let range = START_OF_FILE;
570
+ if (!attrDef) {
571
+ return;
572
+ }
573
+ const attrEntryFile = attrDef.filePath || tagDef && tagDef.filePath;
574
+ if (!attrEntryFile) {
575
+ return;
576
+ }
577
+ if (/\/marko(?:-tag)?\.json$/.test(attrEntryFile)) {
578
+ const tagDefDoc = createTextDocument(attrEntryFile);
579
+ const match = RegExpBuilder`/"@${event.name}"\s*:\s*[^\r\n,]+/g`.exec(tagDefDoc.getText());
580
+ if (match && match.index) {
581
+ range = import_vscode_languageserver8.Range.create(tagDefDoc.positionAt(match.index), tagDefDoc.positionAt(match.index + match[0].length));
582
+ }
583
+ }
584
+ return [
585
+ import_vscode_languageserver8.LocationLink.create(import_vscode_uri4.URI.file(attrEntryFile).toString(), range, range, rangeFromEvent(document, event))
586
+ ];
587
+ }
588
+
589
+ // src/utils/definitions/types/openTagName.ts
590
+ var import_vscode_uri5 = require("vscode-uri");
591
+ var import_vscode_languageserver9 = require("vscode-languageserver");
592
+ function openTagName2(taglib, document, _params, event) {
593
+ let tagDef;
594
+ let range = START_OF_FILE;
595
+ const isAttributeTag = event.tagName[0] === "@";
596
+ if (isAttributeTag) {
597
+ const parentTag = findNonControlFlowParent(event);
598
+ tagDef = parentTag && (parentTag.tagNameExpression ? void 0 : taglib.getTag(parentTag.tagName));
599
+ } else {
600
+ tagDef = taglib.getTag(event.tagName);
601
+ }
602
+ if (!tagDef) {
603
+ return;
604
+ }
605
+ const tagEntryFile = tagDef.template || tagDef.renderer || tagDef.filePath;
606
+ if (/\/marko(?:-tag)?\.json$/.test(tagEntryFile)) {
607
+ const tagDefDoc = createTextDocument(tagEntryFile);
608
+ const match = RegExpBuilder`/"<${event.tagName}>"\s*:\s*[^\r\n,]+/g`.exec(tagDefDoc.getText());
609
+ if (match && match.index) {
610
+ range = import_vscode_languageserver9.Range.create(tagDefDoc.positionAt(match.index), tagDefDoc.positionAt(match.index + match[0].length));
611
+ }
612
+ }
613
+ return [
614
+ import_vscode_languageserver9.LocationLink.create(import_vscode_uri5.URI.file(tagEntryFile).toString(), range, range, rangeFromEvent(document, event))
615
+ ];
616
+ }
617
+
618
+ // src/index.ts
619
+ if (typeof require !== "undefined" && require.extensions && !(".ts" in require.extensions)) {
620
+ require.extensions[".ts"] = void 0;
621
+ }
622
+ var cacheForCompiler = /* @__PURE__ */ new WeakMap();
623
+ var connection = (0, import_node.createConnection)(import_node.ProposedFeatures.all);
624
+ var prevDiagnostics = /* @__PURE__ */ new WeakMap();
625
+ var diagnosticTimeouts = /* @__PURE__ */ new WeakMap();
626
+ var documents = new import_node.TextDocuments(import_vscode_languageserver_textdocument3.TextDocument);
627
+ var markoErrorRegExp = /^(.+?)(?:\((\d+)(?:\s*,\s*(\d+))?\))?: (.*)$/gm;
25
628
  console.log = (...args) => {
26
- connection.console.log(args.join(" "));
629
+ connection.console.log(args.map((v) => (0, import_util.inspect)(v)).join(" "));
27
630
  };
28
631
  console.error = (...args) => {
29
- connection.console.error(args.map((arg) => arg.stack || arg).join("\n"));
632
+ connection.console.error(args.map((v) => (0, import_util.inspect)(v)).join(" "));
30
633
  };
31
634
  process.on("uncaughtException", console.error);
32
635
  process.on("unhandledRejection", console.error);
33
636
  connection.onInitialize(() => {
34
- return {
35
- capabilities: {
36
- textDocumentSync: node_1.TextDocumentSyncKind.Incremental,
37
- documentFormattingProvider: true,
38
- definitionProvider: true,
39
- completionProvider: {
40
- triggerCharacters: [".", ":", "<", ">", "@", "/"],
41
- },
42
- },
43
- };
637
+ return {
638
+ capabilities: {
639
+ textDocumentSync: import_node.TextDocumentSyncKind.Incremental,
640
+ documentFormattingProvider: true,
641
+ definitionProvider: true,
642
+ completionProvider: {
643
+ triggerCharacters: [".", ":", "<", ">", "@", "/"]
644
+ }
645
+ }
646
+ };
44
647
  });
45
648
  connection.onInitialized(() => {
46
- documents.all().forEach((doc) => queueValidation(doc));
649
+ documents.all().forEach((doc) => queueValidation(doc));
47
650
  });
48
651
  connection.onCompletion((params) => {
49
- const doc = documents.get(params.textDocument.uri);
50
- const taglib = (0, compiler_1.getTagLibLookup)(doc);
51
- if (!taglib)
52
- return node_1.CompletionList.create([], true);
53
- const event = (0, htmljs_parser_1.parseUntilOffset)({
54
- taglib,
55
- offset: doc.offsetAt(params.position),
56
- text: doc.getText(),
57
- });
58
- const handler = event && completionTypes[event.type];
59
- return ((handler && handler(taglib, doc, params, event)) ||
60
- node_1.CompletionList.create([], true));
652
+ const doc = documents.get(params.textDocument.uri);
653
+ const taglib = getTagLibLookup(doc);
654
+ if (!taglib)
655
+ return import_node.CompletionList.create([], true);
656
+ const event = parseUntilOffset({
657
+ taglib,
658
+ offset: doc.offsetAt(params.position),
659
+ text: doc.getText()
660
+ });
661
+ const handler = event && completions_exports[event.type];
662
+ return handler && handler(taglib, doc, params, event) || import_node.CompletionList.create([], true);
61
663
  });
62
664
  connection.onDefinition((params) => {
63
- const doc = documents.get(params.textDocument.uri);
64
- const taglib = (0, compiler_1.getTagLibLookup)(doc);
65
- if (!taglib)
66
- return;
67
- const event = (0, htmljs_parser_1.parseUntilOffset)({
68
- taglib,
69
- offset: doc.offsetAt(params.position),
70
- text: doc.getText(),
71
- });
72
- const handler = event && definitionTypes[event.type];
73
- return handler && handler(taglib, doc, params, event);
665
+ const doc = documents.get(params.textDocument.uri);
666
+ const taglib = getTagLibLookup(doc);
667
+ if (!taglib)
668
+ return;
669
+ const event = parseUntilOffset({
670
+ taglib,
671
+ offset: doc.offsetAt(params.position),
672
+ text: doc.getText()
673
+ });
674
+ const handler = event && definitions_exports[event.type];
675
+ return handler && handler(taglib, doc, params, event);
74
676
  });
75
- connection.onDocumentFormatting(async ({ textDocument, options, }) => {
76
- try {
77
- const doc = documents.get(textDocument.uri);
78
- const { fsPath, scheme } = vscode_uri_1.URI.parse(textDocument.uri);
79
- const text = doc.getText();
80
- const formatted = prettier.format(text, Object.assign({ parser: "marko", filepath: fsPath, tabWidth: options.tabSize, useTabs: options.insertSpaces === false }, (scheme === "file" ? await prettier
81
- .resolveConfig(fsPath, {
82
- editorconfig: true,
83
- })
84
- .catch(() => null) : null)));
85
- return [
86
- node_1.TextEdit.replace(node_1.Range.create(doc.positionAt(0), doc.positionAt(text.length)), formatted),
87
- ];
88
- }
89
- catch (e) {
90
- displayMessage("Error", (0, util_1.inspect)(e, { colors: false }));
91
- }
677
+ connection.onDocumentFormatting(async ({
678
+ textDocument,
679
+ options
680
+ }) => {
681
+ try {
682
+ const doc = documents.get(textDocument.uri);
683
+ const { fsPath, scheme } = import_vscode_uri6.URI.parse(textDocument.uri);
684
+ const text = doc.getText();
685
+ const formatted = prettier.format(text, __spreadValues({
686
+ parser: "marko",
687
+ filepath: fsPath,
688
+ plugins: [markoPrettier],
689
+ tabWidth: options.tabSize,
690
+ useTabs: options.insertSpaces === false
691
+ }, scheme === "file" ? await prettier.resolveConfig(fsPath, {
692
+ editorconfig: true
693
+ }).catch(() => null) : null));
92
694
  return [
93
- node_1.TextEdit.replace(node_1.Range.create(node_1.Position.create(0, 0), node_1.Position.create(0, 0)), ""),
695
+ import_node.TextEdit.replace(import_node.Range.create(doc.positionAt(0), doc.positionAt(text.length)), formatted)
94
696
  ];
697
+ } catch (e) {
698
+ displayMessage("Error", (0, import_util.inspect)(e, { colors: false }));
699
+ }
700
+ return [
701
+ import_node.TextEdit.replace(import_node.Range.create(import_node.Position.create(0, 0), import_node.Position.create(0, 0)), "")
702
+ ];
95
703
  });
96
704
  connection.onDidChangeWatchedFiles(() => {
97
- const clearedCompilers = new Set();
98
- for (const doc of documents.all()) {
99
- const compiler = (0, compiler_1.getCompilerForDoc)(doc);
100
- if (!clearedCompilers.has(compiler)) {
101
- clearCaches(compiler);
102
- clearedCompilers.add(compiler);
103
- }
705
+ const clearedCompilers = /* @__PURE__ */ new Set();
706
+ for (const doc of documents.all()) {
707
+ const { compiler } = getCompilerAndTranslatorForDoc(doc);
708
+ if (!clearedCompilers.has(compiler)) {
709
+ clearCaches(compiler);
710
+ clearedCompilers.add(compiler);
104
711
  }
712
+ }
105
713
  });
106
714
  documents.onDidChangeContent((change) => {
107
- queueValidation(change.document);
108
- if (change.document.version > 1) {
109
- clearCaches((0, compiler_1.getCompilerForDoc)(change.document));
110
- }
715
+ queueValidation(change.document);
716
+ if (change.document.version > 1) {
717
+ clearCaches(getCompilerAndTranslatorForDoc(change.document).compiler);
718
+ }
111
719
  });
112
720
  function queueValidation(doc) {
113
- clearTimeout(diagnosticTimeouts.get(doc));
114
- diagnosticTimeouts.set(doc, setTimeout(() => {
115
- const prevDiag = prevDiagnostics.get(doc);
116
- const nextDiag = doValidate(doc);
117
- if (prevDiag && (0, util_1.isDeepStrictEqual)(prevDiag, nextDiag)) {
118
- return;
119
- }
120
- prevDiagnostics.set(doc, nextDiag);
121
- connection.sendDiagnostics({
122
- uri: doc.uri,
123
- diagnostics: nextDiag,
124
- });
125
- }, 800));
721
+ clearTimeout(diagnosticTimeouts.get(doc));
722
+ diagnosticTimeouts.set(doc, setTimeout(() => {
723
+ const prevDiag = prevDiagnostics.get(doc);
724
+ const nextDiag = doValidate(doc);
725
+ if (prevDiag && (0, import_util.isDeepStrictEqual)(prevDiag, nextDiag)) {
726
+ return;
727
+ }
728
+ prevDiagnostics.set(doc, nextDiag);
729
+ connection.sendDiagnostics({
730
+ uri: doc.uri,
731
+ diagnostics: nextDiag
732
+ });
733
+ }, 800));
126
734
  }
127
735
  function doValidate(doc) {
128
- const { fsPath, scheme } = vscode_uri_1.URI.parse(doc.uri);
129
- if (scheme !== "file") {
130
- return [];
131
- }
132
- const compiler = (0, compiler_1.getCompilerForDoc)(doc);
133
- const diagnostics = [];
134
- try {
135
- compiler.compileSync(doc.getText(), fsPath, {
136
- cache: getCacheForCompiler(compiler),
137
- output: "source",
138
- code: false,
139
- });
140
- }
141
- catch (e) {
142
- let match;
143
- while ((match = markoErrorRegExp.exec(e.message))) {
144
- const [, fileName, rawLine, rawCol, msg] = match;
145
- const line = (parseInt(rawLine, 10) || 1) - 1;
146
- const col = (parseInt(rawCol, 10) || 1) - 1;
147
- diagnostics.push(node_1.Diagnostic.create(node_1.Range.create(line, col, line, col), msg, node_1.DiagnosticSeverity.Error, undefined, fileName));
148
- }
736
+ const { fsPath, scheme } = import_vscode_uri6.URI.parse(doc.uri);
737
+ if (scheme !== "file") {
738
+ return [];
739
+ }
740
+ const { compiler, translator } = getCompilerAndTranslatorForDoc(doc);
741
+ const diagnostics = [];
742
+ try {
743
+ compiler.compileSync(doc.getText(), fsPath, {
744
+ cache: getCacheForCompiler(compiler),
745
+ output: "source",
746
+ code: false,
747
+ translator
748
+ });
749
+ } catch (e) {
750
+ let match;
751
+ while (match = markoErrorRegExp.exec(e.message)) {
752
+ const [, fileName, rawLine, rawCol, msg] = match;
753
+ const line = (parseInt(rawLine, 10) || 1) - 1;
754
+ const col = (parseInt(rawCol, 10) || 1) - 1;
755
+ diagnostics.push(import_node.Diagnostic.create(import_node.Range.create(line, col, line, col), msg, import_node.DiagnosticSeverity.Error, void 0, fileName));
149
756
  }
150
- return diagnostics;
757
+ }
758
+ return diagnostics;
151
759
  }
152
760
  function clearCaches(compiler) {
153
- var _a;
154
- (_a = cacheForCompiler.get(compiler)) === null || _a === void 0 ? void 0 : _a.clear();
155
- compiler.taglib.clearCaches();
761
+ var _a;
762
+ (_a = cacheForCompiler.get(compiler)) == null ? void 0 : _a.clear();
763
+ compiler.taglib.clearCaches();
156
764
  }
157
765
  function getCacheForCompiler(compiler) {
158
- let cache = cacheForCompiler.get(compiler);
159
- if (!cache) {
160
- cacheForCompiler.set(compiler, (cache = new Map()));
161
- }
162
- return cache;
766
+ let cache = cacheForCompiler.get(compiler);
767
+ if (!cache) {
768
+ cacheForCompiler.set(compiler, cache = /* @__PURE__ */ new Map());
769
+ }
770
+ return cache;
163
771
  }
164
772
  function displayMessage(type, msg) {
165
- setImmediate(() => {
166
- connection.sendNotification(`show${type}`, msg);
167
- });
773
+ setImmediate(() => {
774
+ connection.sendNotification(`show${type}`, msg);
775
+ });
168
776
  }
169
777
  documents.listen(connection);
170
778
  connection.listen();
171
- //# sourceMappingURL=index.js.map
779
+ //# sourceMappingURL=index.js.map