@marko/language-server 0.11.0 → 0.12.0

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