@marko/language-server 0.12.0 → 0.12.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -37,6 +37,7 @@ var import_node = require("vscode-languageserver/node");
37
37
  var import_vscode_uri6 = require("vscode-uri");
38
38
  var import_vscode_languageserver_textdocument3 = require("vscode-languageserver-textdocument");
39
39
  var prettier = __toESM(require("prettier"));
40
+ var markoPrettier = __toESM(require("prettier-plugin-marko"));
40
41
  var import_util = require("util");
41
42
 
42
43
  // src/utils/compiler.ts
@@ -46,6 +47,7 @@ var import_resolve_from = __toESM(require("resolve-from"));
46
47
  var import_lasso_package_root = __toESM(require("lasso-package-root"));
47
48
  var builtinCompiler = __toESM(require("@marko/compiler"));
48
49
  var builtinTranslator = __toESM(require("@marko/translator-default"));
50
+ builtinCompiler.configure({ translator: builtinTranslator });
49
51
  var compilerAndTranslatorForDoc = /* @__PURE__ */ new WeakMap();
50
52
  function getCompilerAndTranslatorForDoc(doc) {
51
53
  let compilerAndTranslator = compilerAndTranslatorForDoc.get(doc);
@@ -427,8 +429,8 @@ function closeTag(_taglib, document, _params, event) {
427
429
 
428
430
  // src/utils/completions/types/openTag.ts
429
431
  var import_vscode_languageserver5 = require("vscode-languageserver");
430
- function openTag(_taglib, _document, params, event) {
431
- const triggerCharacter = params.context && params.context.triggerCharacter;
432
+ function openTag(_taglib, doc, params, event) {
433
+ const triggerCharacter = params.context && params.context.triggerCharacter || doc.getText(import_vscode_languageserver5.Range.create(import_vscode_languageserver5.Position.create(params.position.line, params.position.character - 1), params.position));
432
434
  if (triggerCharacter !== ">" || event.openTagOnly || event.selfClosed) {
433
435
  return;
434
436
  }
@@ -566,11 +568,11 @@ function attributeName2(taglib, document, _params, event) {
566
568
  const attrDef = taglib.getAttribute(tagName || "*", event.name);
567
569
  let range = START_OF_FILE;
568
570
  if (!attrDef) {
569
- return;
571
+ return [];
570
572
  }
571
573
  const attrEntryFile = attrDef.filePath || tagDef && tagDef.filePath;
572
574
  if (!attrEntryFile) {
573
- return;
575
+ return [];
574
576
  }
575
577
  if (/\/marko(?:-tag)?\.json$/.test(attrEntryFile)) {
576
578
  const tagDefDoc = createTextDocument(attrEntryFile);
@@ -585,6 +587,7 @@ function attributeName2(taglib, document, _params, event) {
585
587
  }
586
588
 
587
589
  // src/utils/definitions/types/openTagName.ts
590
+ var import_path3 = __toESM(require("path"));
588
591
  var import_vscode_uri5 = require("vscode-uri");
589
592
  var import_vscode_languageserver9 = require("vscode-languageserver");
590
593
  function openTagName2(taglib, document, _params, event) {
@@ -598,12 +601,15 @@ function openTagName2(taglib, document, _params, event) {
598
601
  tagDef = taglib.getTag(event.tagName);
599
602
  }
600
603
  if (!tagDef) {
601
- return;
604
+ return [];
602
605
  }
603
606
  const tagEntryFile = tagDef.template || tagDef.renderer || tagDef.filePath;
607
+ if (!import_path3.default.isAbsolute(tagEntryFile)) {
608
+ return [];
609
+ }
604
610
  if (/\/marko(?:-tag)?\.json$/.test(tagEntryFile)) {
605
611
  const tagDefDoc = createTextDocument(tagEntryFile);
606
- const match = RegExpBuilder`/"<${event.tagName}>"\s*:\s*[^\r\n,]+/g`.exec(tagDefDoc.getText());
612
+ const match = RegExpBuilder`/"(?:<${event.tagName}>|${event.tagName})"\s*:\s*[^\r\n,]+/g`.exec(tagDefDoc.getText());
607
613
  if (match && match.index) {
608
614
  range = import_vscode_languageserver9.Range.create(tagDefDoc.positionAt(match.index), tagDefDoc.positionAt(match.index + match[0].length));
609
615
  }
@@ -683,6 +689,7 @@ connection.onDocumentFormatting(async ({
683
689
  const formatted = prettier.format(text, __spreadValues({
684
690
  parser: "marko",
685
691
  filepath: fsPath,
692
+ plugins: [markoPrettier],
686
693
  tabWidth: options.tabSize,
687
694
  useTabs: options.insertSpaces === false
688
695
  }, scheme === "file" ? await prettier.resolveConfig(fsPath, {
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/utils/compiler.ts", "../src/utils/htmljs-parser.ts", "../src/utils/completions/index.ts", "../src/utils/completions/types/attributeModifier.ts", "../src/utils/completions/types/attributeName.ts", "../src/utils/utils.ts", "../src/utils/completions/types/closeTag.ts", "../src/utils/completions/types/openTag.ts", "../src/utils/completions/types/openTagName.ts", "../src/utils/completions/types/styleContent.ts", "../src/utils/definitions/index.ts", "../src/utils/definitions/types/attributeName.ts", "../src/utils/regexp-builder.ts", "../src/utils/definitions/types/openTagName.ts"],
4
- "sourcesContent": ["import {\n createConnection,\n ProposedFeatures,\n Range,\n Position,\n CompletionList,\n CompletionParams,\n Diagnostic,\n DiagnosticSeverity,\n DocumentFormattingParams,\n TextDocuments,\n TextEdit,\n TextDocumentSyncKind,\n} from \"vscode-languageserver/node\";\nimport { URI } from \"vscode-uri\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport * as prettier from \"prettier\";\nimport { inspect, isDeepStrictEqual } from \"util\";\nimport {\n getTagLibLookup,\n getCompilerAndTranslatorForDoc,\n Compiler,\n} from \"./utils/compiler\";\nimport { parseUntilOffset } from \"./utils/htmljs-parser\";\nimport * as completionTypes from \"./utils/completions\";\nimport * as definitionTypes from \"./utils/definitions\";\n\nif (\n typeof require !== \"undefined\" &&\n require.extensions &&\n !(\".ts\" in require.extensions)\n) {\n // Prevent compiler hooks written in typescript to explode the language server.\n require.extensions[\".ts\"] = undefined;\n}\n\nconst cacheForCompiler = new WeakMap<Compiler, Map<unknown, unknown>>();\nconst connection = createConnection(ProposedFeatures.all);\nconst prevDiagnostics = new WeakMap<TextDocument, Diagnostic[]>();\nconst diagnosticTimeouts = new WeakMap<\n TextDocument,\n ReturnType<typeof setTimeout>\n>();\nconst documents = new TextDocuments(TextDocument);\nconst markoErrorRegExp = /^(.+?)(?:\\((\\d+)(?:\\s*,\\s*(\\d+))?\\))?: (.*)$/gm;\n\nconsole.log = (...args: unknown[]) => {\n connection.console.log(args.map((v) => inspect(v)).join(\" \"));\n};\nconsole.error = (...args: unknown[]) => {\n connection.console.error(args.map((v) => inspect(v)).join(\" \"));\n};\nprocess.on(\"uncaughtException\", console.error);\nprocess.on(\"unhandledRejection\", console.error);\n\nconnection.onInitialize(() => {\n return {\n capabilities: {\n textDocumentSync: TextDocumentSyncKind.Incremental,\n documentFormattingProvider: true,\n definitionProvider: true,\n completionProvider: {\n triggerCharacters: [\".\", \":\", \"<\", \">\", \"@\", \"/\"],\n },\n },\n };\n});\n\nconnection.onInitialized(() => {\n documents.all().forEach((doc) => queueValidation(doc));\n});\n\nconnection.onCompletion((params: CompletionParams): CompletionList => {\n const doc = documents.get(params.textDocument.uri)!;\n const taglib = getTagLibLookup(doc);\n if (!taglib) return CompletionList.create([], true);\n\n const event = parseUntilOffset({\n taglib,\n offset: doc.offsetAt(params.position),\n text: doc.getText(),\n });\n\n const handler =\n event && completionTypes[event.type as keyof typeof completionTypes];\n return (\n (handler && handler(taglib, doc, params, event as any)) ||\n CompletionList.create([], true)\n );\n});\n\nconnection.onDefinition((params) => {\n const doc = documents.get(params.textDocument.uri)!;\n const taglib = getTagLibLookup(doc);\n if (!taglib) return;\n\n const event = parseUntilOffset({\n taglib,\n offset: doc.offsetAt(params.position),\n text: doc.getText(),\n });\n\n const handler =\n event && definitionTypes[event.type as keyof typeof definitionTypes];\n return handler && handler(taglib, doc, params, event as any);\n});\n\nconnection.onDocumentFormatting(\n async ({\n textDocument,\n options,\n }: DocumentFormattingParams): Promise<TextEdit[]> => {\n try {\n const doc = documents.get(textDocument.uri)!;\n const { fsPath, scheme } = URI.parse(textDocument.uri);\n const text = doc.getText();\n const formatted = prettier.format(text, {\n parser: \"marko\",\n filepath: fsPath,\n tabWidth: options.tabSize,\n useTabs: options.insertSpaces === false,\n ...(scheme === \"file\"\n ? await prettier\n .resolveConfig(fsPath, {\n editorconfig: true,\n })\n .catch(() => null)\n : null),\n });\n\n return [\n TextEdit.replace(\n Range.create(doc.positionAt(0), doc.positionAt(text.length)),\n formatted\n ),\n ];\n } catch (e) {\n displayMessage(\"Error\", inspect(e, { colors: false }));\n }\n\n return [\n TextEdit.replace(\n Range.create(Position.create(0, 0), Position.create(0, 0)),\n \"\"\n ),\n ];\n }\n);\n\nconnection.onDidChangeWatchedFiles(() => {\n const clearedCompilers = new Set<Compiler>();\n for (const doc of documents.all()) {\n const { compiler } = getCompilerAndTranslatorForDoc(doc);\n\n if (!clearedCompilers.has(compiler)) {\n clearCaches(compiler);\n clearedCompilers.add(compiler);\n }\n }\n});\n\ndocuments.onDidChangeContent((change) => {\n queueValidation(change.document);\n\n if (change.document.version > 1) {\n clearCaches(getCompilerAndTranslatorForDoc(change.document).compiler);\n }\n});\n\nfunction queueValidation(doc: TextDocument) {\n clearTimeout(diagnosticTimeouts.get(doc)!);\n diagnosticTimeouts.set(\n doc,\n setTimeout(() => {\n const prevDiag = prevDiagnostics.get(doc);\n const nextDiag = doValidate(doc);\n\n if (prevDiag && isDeepStrictEqual(prevDiag, nextDiag)) {\n return;\n }\n\n prevDiagnostics.set(doc, nextDiag);\n connection.sendDiagnostics({\n uri: doc.uri,\n diagnostics: nextDiag,\n });\n }, 800)\n );\n}\n\nfunction doValidate(doc: TextDocument): Diagnostic[] {\n const { fsPath, scheme } = URI.parse(doc.uri);\n\n if (scheme !== \"file\") {\n return [];\n }\n\n const { compiler, translator } = getCompilerAndTranslatorForDoc(doc);\n const diagnostics: Diagnostic[] = [];\n\n try {\n compiler.compileSync(doc.getText(), fsPath, {\n cache: getCacheForCompiler(compiler),\n output: \"source\",\n code: false,\n translator,\n });\n } catch (e) {\n let match: RegExpExecArray | null;\n while ((match = markoErrorRegExp.exec((e as Error).message))) {\n const [, fileName, rawLine, rawCol, msg] = match;\n const line = (parseInt(rawLine, 10) || 1) - 1;\n const col = (parseInt(rawCol, 10) || 1) - 1;\n diagnostics.push(\n Diagnostic.create(\n Range.create(line, col, line, col),\n msg,\n DiagnosticSeverity.Error,\n undefined,\n fileName\n )\n );\n }\n }\n\n return diagnostics;\n}\n\nfunction clearCaches(compiler: Compiler) {\n cacheForCompiler.get(compiler)?.clear();\n compiler.taglib.clearCaches();\n}\n\nfunction getCacheForCompiler(compiler: Compiler) {\n let cache = cacheForCompiler.get(compiler);\n if (!cache) {\n cacheForCompiler.set(compiler, (cache = new Map()));\n }\n return cache;\n}\n\nfunction displayMessage(\n type: \"Information\" | \"Warning\" | \"Error\",\n msg: string\n) {\n setImmediate(() => {\n connection.sendNotification(`show${type}`, msg);\n });\n}\n\ndocuments.listen(connection);\nconnection.listen();\n", "import path from \"path\";\nimport { URI } from \"vscode-uri\";\nimport resolveFrom from \"resolve-from\";\nimport lassoPackageRoot from \"lasso-package-root\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type {\n AttributeDefinition,\n TagDefinition,\n TaglibLookup,\n} from \"@marko/babel-utils\";\n\nimport * as builtinCompiler from \"@marko/compiler\";\nimport * as builtinTranslator from \"@marko/translator-default\";\n\nexport type Compiler = typeof import(\"@marko/compiler\");\nexport { AttributeDefinition, TagDefinition, TaglibLookup };\nexport type CompilerAndTranslator = {\n compiler: Compiler;\n translator: any; // TODO should update the type in `@marko/compiler` to not just be string | undefined\n};\n\nconst compilerAndTranslatorForDoc = new WeakMap<\n TextDocument,\n CompilerAndTranslator\n>();\n\nexport function getCompilerAndTranslatorForDoc(\n doc: TextDocument\n): CompilerAndTranslator {\n let compilerAndTranslator = compilerAndTranslatorForDoc.get(doc);\n if (!compilerAndTranslator) {\n compilerAndTranslatorForDoc.set(\n doc,\n (compilerAndTranslator = loadCompiler(\n path.dirname(URI.parse(doc.uri).fsPath)\n ))\n );\n }\n\n return compilerAndTranslator;\n}\n\nexport function getTagLibLookup(\n document: TextDocument\n): TaglibLookup | undefined {\n try {\n const { compiler, translator } = getCompilerAndTranslatorForDoc(document);\n return compiler.taglib.buildLookup(\n URI.parse(document.uri).fsPath,\n translator\n );\n // eslint-disable-next-line no-empty\n } catch {}\n}\n\nfunction loadCompiler(dir: string): CompilerAndTranslator {\n const rootDir = lassoPackageRoot.getRootDir(dir);\n const pkgPath =\n rootDir && resolveFrom.silent(rootDir, \"@marko/compiler/package.json\");\n const pkg = pkgPath && require(pkgPath);\n\n if (pkg && /^5\\./.test(pkg.version)) {\n try {\n // Ensure translator is available in local package, or fallback to built in compiler.\n let translator = ([] as string[])\n .concat(\n Object.keys(pkg.dependencies),\n Object.keys(pkg.peerDependencies),\n Object.keys(pkg.devDependencies)\n )\n .find((name) => /^marko$|^(@\\/marko\\/|marko-)translator-/.test(name));\n\n if (translator === \"marko\" || !translator) {\n // Fallback to compiler default translator\n translator = require(resolveFrom(dir, \"@marko/compiler/config\"))\n .translator as string;\n }\n\n require(resolveFrom(dir, translator));\n return {\n compiler: require(resolveFrom(dir, \"@marko/compiler\")),\n translator,\n };\n // eslint-disable-next-line no-empty\n } catch {}\n }\n\n return {\n compiler: builtinCompiler,\n translator: builtinTranslator,\n };\n}\n", "import { createParser } from \"htmljs-parser\";\nimport type { TaglibLookup } from \"./compiler\";\n\nexport namespace ParserEvents {\n export interface Error {\n type: \"error\";\n code: string;\n message: string;\n pos: number;\n endPos: number;\n }\n\n export interface OpenTagName extends Tag {\n type: \"openTagName\";\n }\n\n export interface OpenTag extends Tag {\n type: \"openTag\";\n argument: { pos: number; endPos: number; value: string } | undefined;\n params: { pos: number; endPos: number; value: string } | undefined;\n shorthandClassNames:\n | {\n value: string;\n rawParts: { text: string; pos: number; endPos: number }[];\n }[]\n | undefined;\n attributes: Attribute[];\n nestedTags: { [x: string]: Tag } | undefined;\n openTagOnly: boolean;\n selfClosed: boolean;\n tagNameEndPos: number;\n isNestedTag: boolean;\n isRepeated: boolean;\n targetProperty: string | undefined;\n }\n\n export interface CloseTag {\n type: \"closeTag\";\n tagName: string;\n pos: number;\n endPos: number;\n }\n\n export interface Placeholder {\n type: \"placeholder\";\n escape: boolean;\n pos: number;\n endPos: number; // Added manually.\n value: string;\n withinTagName: string;\n withinOpenTag: string;\n withinAttribute: boolean;\n withinBody: boolean;\n withinString: boolean;\n }\n\n // Extended events\n export interface AttributeName {\n type: \"attributeName\";\n tag: OpenTag;\n name: string;\n pos: number;\n endPos: number;\n }\n\n export interface AttributeModifier {\n type: \"attributeModifier\";\n tag: OpenTag;\n name: string;\n modifier: string;\n pos: number;\n endPos: number;\n }\n\n export interface AttributeValue {\n type: \"attributeValue\";\n tag: OpenTag;\n name: string;\n value: string;\n pos: number;\n endPos: number;\n }\n\n export interface Text {\n type: \"text\";\n value: string;\n // Added manually.\n pos: number;\n endPos: number;\n parent: OpenTag | null;\n }\n\n export interface StyleContent {\n type: \"styleContent\";\n language: \"css\" | \"less\" | \"scss\";\n block: boolean;\n content: string;\n pos: number;\n endPos: number;\n }\n\n export type Any =\n | Error\n | OpenTagName\n | OpenTag\n | CloseTag\n | Placeholder\n | AttributeName\n | AttributeModifier\n | AttributeValue\n | Text\n | StyleContent;\n\n interface Tag {\n tagName: string;\n tagNameExpression: string | undefined;\n emptyTagName: boolean; // eg: <.class>\n concise: boolean;\n pos: number;\n endPos: number;\n // Added manually.\n parent: OpenTag | null;\n }\n\n interface Attribute {\n name: string;\n argument: { pos: number; endPos: number; value: string } | undefined;\n value: string | undefined;\n pos: number;\n endPos: number;\n }\n}\n\nconst SUPPORTED_STYLE_LANGS = {\n css: true,\n scss: true,\n less: true,\n};\n\nexport function parseUntilOffset(options: {\n offset: number;\n text: string;\n taglib: TaglibLookup;\n includeErrors?: boolean;\n}) {\n const { offset, text, taglib, includeErrors } = options;\n let result: ParserEvents.Any | null = null;\n let parentTag: ParserEvents.OpenTagName | ParserEvents.OpenTag | null = null;\n const parser = createParser(\n {\n onError: includeErrors && finish,\n onScriptlet: finish,\n onPlaceholder: finish,\n onOpenTagName(ev: ParserEvents.OpenTagName) {\n if (parentTag) {\n ev.parent = parentTag as ParserEvents.OpenTag;\n }\n\n // Currently the parser has the wrong end position here with tag params :\\\n if (!ev.concise) {\n ev.pos += 1;\n }\n\n ev.endPos = ev.pos + ev.tagName.length;\n parentTag = ev;\n finish(ev);\n },\n onOpenTag(ev: ParserEvents.OpenTag) {\n ev.parent = parentTag!.parent;\n parentTag = ev;\n\n if (ev.tagName === \"style\") {\n const firstAttr = ev.attributes[0];\n const isBlock = firstAttr && firstAttr.name.startsWith(\"{\");\n\n if (isBlock) {\n const content = firstAttr.name.slice(1, -1);\n const pos = text.indexOf(content, ev.tagNameEndPos);\n const endPos = pos + content.length;\n const requestedLanguage = (ev.shorthandClassNames &&\n ev.shorthandClassNames[0].rawParts[0] &&\n ev.shorthandClassNames[0].rawParts[0].text) as\n | void\n | keyof typeof SUPPORTED_STYLE_LANGS;\n const language =\n requestedLanguage && SUPPORTED_STYLE_LANGS[requestedLanguage]\n ? requestedLanguage\n : \"css\";\n\n finish({\n type: \"styleContent\",\n language,\n block: true,\n content: text.slice(pos, endPos),\n pos,\n endPos,\n });\n\n return;\n }\n }\n\n let attrEndPos = ev.tagNameEndPos;\n for (const attr of ev.attributes) {\n if (!attr.name) {\n // Legacy dynamic attrs.\n if (attr.value !== undefined) {\n attrEndPos += attr.value.length;\n }\n continue;\n }\n\n if (attr.name.slice(0, 3) === \"...\") {\n attrEndPos = attr.argument ? attr.argument.endPos + 1 : attr.endPos;\n continue;\n }\n\n const attrStartPos = text.indexOf(attr.name, attrEndPos);\n const match = /:(.*)$/.exec(attr.name);\n const modifier = match && match[1];\n let name = attr.name;\n\n if (modifier) {\n name = name.slice(0, name.length - modifier.length - 1);\n const modifierStartPos = attrStartPos + name.length;\n const modifierEndPos = modifierStartPos + modifier.length + 1;\n if (\n finish({\n type: \"attributeModifier\",\n tag: ev,\n name,\n modifier,\n pos: modifierStartPos,\n endPos: modifierEndPos,\n })\n ) {\n return;\n }\n }\n\n const attrNameEndPos = attrStartPos + name.length;\n\n if (\n finish({\n type: \"attributeName\",\n tag: ev,\n name,\n pos: attrStartPos,\n endPos: attrNameEndPos,\n })\n ) {\n return;\n }\n\n if (attr.value) {\n attrEndPos = attr.endPos;\n const valueStartPos = attr.pos + 1; // Add one to account for \"=\".\n if (\n finish({\n type: \"attributeValue\",\n tag: ev,\n name,\n value: text.slice(valueStartPos, attrEndPos), // We use the raw value to ignore things like non standard placeholders.\n pos: valueStartPos,\n endPos: attr.endPos,\n })\n ) {\n break;\n }\n } else {\n attrEndPos = attr.argument ? attr.argument.endPos + 1 : attr.endPos;\n }\n }\n\n finish(ev);\n },\n onText(ev: ParserEvents.Text) {\n ev.endPos = parser.pos as number;\n ev.pos = ev.endPos - ev.value.length;\n\n if (parentTag) {\n ev.parent = parentTag as ParserEvents.OpenTag;\n\n if (parentTag.tagName === \"style\") {\n finish({\n type: \"styleContent\",\n language: \"css\",\n block: false,\n content: ev.value,\n pos: ev.pos,\n endPos: ev.endPos,\n });\n\n return;\n }\n }\n\n finish(ev);\n },\n onCloseTag(ev: ParserEvents.CloseTag) {\n parentTag = parentTag && parentTag.parent;\n finish(ev);\n },\n },\n {\n isOpenTagOnly(ev: string) {\n const tagDef = taglib.getTag(ev);\n return tagDef && tagDef.openTagOnly;\n },\n }\n );\n\n try {\n // We only parse up to the end of the line the user is currently looking for.\n parser.parse(`${text}\\n`);\n } catch (err) {\n return includeErrors\n ? ({\n type: \"error\",\n code: \"UNEXPECTED_TOKEN\",\n message: (err as Error).message,\n pos: parser.pos,\n endPos: parser.pos,\n } as ParserEvents.Error)\n : null;\n }\n\n return result as ParserEvents.Any | null;\n\n function finish(event: ParserEvents.Any): boolean {\n const { type, pos, endPos } = event;\n if (\n !result &&\n (type === \"error\" ||\n (pos != null && pos <= offset && endPos != null && endPos >= offset))\n ) {\n result = event;\n parser.end();\n return true;\n }\n\n return false;\n }\n}\n", "export * from \"./types/attributeModifier\";\nexport * from \"./types/attributeName\";\nexport * from \"./types/closeTag\";\nexport * from \"./types/openTag\";\nexport * from \"./types/openTagName\";\nexport * from \"./types/styleContent\";\n", "import {\n type CompletionParams,\n CompletionList,\n CompletionItemKind,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\n\nexport function attributeModifier(\n _taglib: TaglibLookup,\n _document: TextDocument,\n _params: CompletionParams,\n _event: ParserEvents.OpenTagName\n) {\n return CompletionList.create(\n [\n {\n label: \"scoped\",\n kind: CompletionItemKind.Keyword,\n detail: \"Use to prefix with a unique ID\",\n },\n {\n label: \"no-update\",\n kind: CompletionItemKind.Keyword,\n detail: \"Use to skip future updates to this attribute\",\n },\n ],\n true\n );\n}\n", "import {\n type CompletionParams,\n type CompletionItem,\n type MarkupContent,\n CompletionList,\n CompletionItemKind,\n MarkupKind,\n InsertTextFormat,\n TextEdit,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport { rangeFromEvent } from \"../../utils\";\n\nexport function attributeName(\n taglib: TaglibLookup,\n document: TextDocument,\n _params: CompletionParams,\n event: ParserEvents.AttributeName\n) {\n const completions: CompletionItem[] = [];\n const attrNameRange = rangeFromEvent(document, event);\n const tagDef =\n !event.tag.tagNameExpression && taglib.getTag(event.tag.tagName);\n const tagName = (tagDef && tagDef.name) || \"*\";\n const nestedTagAttrs: { [x: string]: boolean } = {};\n const neverAttrs: Set<string> = new Set();\n\n if (tagDef && tagDef.nestedTags) {\n for (const key in tagDef.nestedTags) {\n const nestedTagDef = tagDef.nestedTags[key];\n nestedTagAttrs[nestedTagDef.targetProperty] = true;\n }\n }\n\n taglib.forEachAttribute(tagName, (attr) => {\n if (attr.type === \"never\") {\n neverAttrs.add(attr.name);\n }\n });\n\n taglib.forEachAttribute(tagName, (attr, parent) => {\n if (\n attr.deprecated ||\n nestedTagAttrs[attr.name] ||\n attr.name === \"*\" ||\n neverAttrs.has(attr.name) ||\n (attr.name[0] === \"_\" &&\n /\\/node_modules\\//.test(attr.filePath || parent.filePath))\n ) {\n return;\n }\n\n const type = attr.type || (attr.html ? \"string\" : null);\n const documentation: MarkupContent = {\n kind: MarkupKind.Markdown,\n value: attr.description || \"\",\n };\n let label = attr.name;\n let snippet = attr.name;\n\n if (attr.enum) {\n snippet += `=\"\\${1|${attr.enum.join()}|}\"$0`;\n } else {\n switch (type) {\n case \"string\":\n snippet += '=\"$1\"$0';\n break;\n case \"function\":\n snippet += \"=($1)$0\";\n break;\n case \"statement\":\n case \"boolean\":\n case \"flag\":\n break;\n default:\n snippet += \"=\";\n break;\n }\n }\n\n const autocomplete =\n attr.autocomplete && Array.isArray(attr.autocomplete)\n ? attr.autocomplete[0]\n : attr.autocomplete;\n\n if (autocomplete) {\n label = autocomplete.displayText || label;\n snippet = autocomplete.snippet || snippet;\n\n if (autocomplete.descriptionMoreURL) {\n if (documentation.value) {\n documentation.value += `\\n\\n`;\n }\n\n documentation.value += `[More Info](${autocomplete.descriptionMoreURL})`;\n }\n }\n\n completions.push({\n label,\n documentation: documentation.value ? documentation : undefined,\n kind: CompletionItemKind.Property,\n insertTextFormat: InsertTextFormat.Snippet,\n textEdit: TextEdit.replace(attrNameRange, snippet),\n });\n });\n\n return CompletionList.create(completions, true);\n}\n", "import fs from \"fs\";\nimport { URI } from \"vscode-uri\";\nimport {\n type CompletionList,\n type InsertReplaceEdit,\n TextEdit,\n Position,\n Range,\n} from \"vscode-languageserver\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"./htmljs-parser\";\n\nexport const START_OF_FILE = Range.create(\n Position.create(0, 0),\n Position.create(0, 0)\n);\n\nexport function findNonControlFlowParent(tag: ParserEvents.OpenTagName) {\n let parent = tag.parent;\n\n while (parent) {\n if (!/^(?:else-)?if|else|for|while$/.test(parent.tagName)) {\n return parent;\n }\n\n parent = parent.parent;\n }\n\n return null;\n}\n\nexport function rangeFromEvent(\n document: TextDocument,\n event: ParserEvents.Any\n) {\n return Range.create(\n document.positionAt(event.pos),\n document.positionAt(event.endPos)\n );\n}\n\nexport function createTextDocument(filename: string): TextDocument {\n const uri = URI.file(filename).toString();\n const content = fs.readFileSync(filename, \"utf-8\");\n return TextDocument.create(uri, \"plaintext\", 0, content);\n}\n\nexport function shiftCompletionRanges(list: CompletionList, offset: Position) {\n list.items.forEach((item) => {\n if (item.additionalTextEdits) {\n item.additionalTextEdits.forEach((edit) =>\n shiftRange(edit.range, offset)\n );\n }\n\n if (item.textEdit) {\n shiftEdit(item.textEdit, offset);\n }\n });\n\n return list;\n}\n\nexport function shiftEdit(\n edit: TextEdit | InsertReplaceEdit,\n offset: Position\n) {\n if (TextEdit.is(edit)) {\n shiftRange(edit.range, offset);\n } else {\n shiftRange(edit.insert, offset);\n shiftRange(edit.replace, offset);\n }\n}\n\nexport function shiftRange(range: Range | undefined, offset: Position) {\n if (range) {\n shiftPosition(range.start, offset);\n shiftPosition(range.end, offset);\n }\n}\n\nexport function shiftPosition(pos: Position, offset: Position) {\n if (pos.line === 0) {\n pos.character += offset.character;\n }\n\n pos.line += offset.line;\n return pos;\n}\n", "import {\n type CompletionParams,\n CompletionList,\n CompletionItemKind,\n InsertTextFormat,\n TextEdit,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport { rangeFromEvent } from \"../../utils\";\n\nexport function closeTag(\n _taglib: TaglibLookup,\n document: TextDocument,\n _params: CompletionParams,\n event: ParserEvents.CloseTag\n) {\n if (event.tagName[0] === \"$\") {\n return;\n }\n\n const closingTagStr = `</${event.tagName}>`;\n\n return CompletionList.create(\n [\n {\n label: closingTagStr,\n kind: CompletionItemKind.Class,\n insertTextFormat: InsertTextFormat.Snippet,\n textEdit: TextEdit.replace(\n rangeFromEvent(document, event),\n closingTagStr\n ),\n },\n ],\n true\n );\n}\n", "import {\n type CompletionParams,\n CompletionList,\n CompletionItemKind,\n InsertTextFormat,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\n\nexport function openTag(\n _taglib: TaglibLookup,\n _document: TextDocument,\n params: CompletionParams,\n event: ParserEvents.OpenTag\n) {\n const triggerCharacter = params.context && params.context.triggerCharacter;\n if (triggerCharacter !== \">\" || event.openTagOnly || event.selfClosed) {\n return;\n }\n\n const closingTagStr = `</${event.tagName[0] === \"$\" ? \"\" : event.tagName}>`;\n\n return CompletionList.create(\n [\n {\n label: closingTagStr,\n kind: CompletionItemKind.Class,\n insertTextFormat: InsertTextFormat.Snippet,\n insertText: `\\n\\t$0\\n${closingTagStr}`,\n },\n ],\n true\n );\n}\n", "import path from \"path\";\nimport { URI } from \"vscode-uri\";\nimport {\n type CompletionParams,\n CompletionItemKind,\n CompletionItem,\n CompletionList,\n InsertTextFormat,\n MarkupKind,\n TextEdit,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup, TagDefinition } from \"../../compiler\";\nimport { rangeFromEvent, findNonControlFlowParent } from \"../../utils\";\n\nexport function openTagName(\n taglib: TaglibLookup,\n document: TextDocument,\n params: CompletionParams,\n event: ParserEvents.OpenTagName\n) {\n const { fsPath: currentTemplateFilePath } = URI.parse(document.uri);\n let tags: TagDefinition[];\n const triggerCharacter =\n (params.context && params.context.triggerCharacter) || event.tagName[0];\n const isAttributeTag = triggerCharacter === \"@\";\n const tagNameRange = rangeFromEvent(document, event);\n\n if (isAttributeTag) {\n const parentTag = findNonControlFlowParent(event);\n const parentTagDef =\n parentTag &&\n !parentTag.tagNameExpression &&\n taglib.getTag(parentTag.tagName);\n tags =\n (parentTagDef &&\n parentTagDef.nestedTags &&\n Object.values(parentTagDef.nestedTags)) ||\n [];\n } else {\n tags = taglib.getTagsSorted().filter((it) => !it.isNestedTag);\n }\n\n return CompletionList.create(\n tags\n .filter((it) => !it.deprecated)\n .filter((it) => it.name !== \"*\")\n .filter(\n (it) => /^[^_]/.test(it.name) || !/\\/node_modules\\//.test(it.filePath)\n )\n .map((it) => {\n let label = it.isNestedTag ? `@${it.name}` : it.name;\n const fileForTag = it.template || it.renderer || it.filePath;\n const fileURIForTag = URI.file(fileForTag).toString();\n const nodeModuleMatch = /\\/node_modules\\/((?:@[^/]+\\/)?[^/]+)/.exec(\n fileForTag\n );\n\n const nodeModuleName = nodeModuleMatch && nodeModuleMatch[1];\n const isCoreTag = nodeModuleName === \"marko\";\n\n const documentation = {\n kind: MarkupKind.Markdown,\n value: it.html\n ? `Built in [<${it.name}>](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/${it.name}) HTML tag.`\n : nodeModuleName\n ? isCoreTag\n ? `Core Marko [<${it.name}>](${fileURIForTag}) tag.`\n : `Custom Marko tag discovered from the [\"${nodeModuleName}\"](${fileURIForTag}) npm package.`\n : `Custom Marko tag discovered from:\\n\\n[${path.relative(\n currentTemplateFilePath,\n fileForTag\n )}](${fileURIForTag})`,\n };\n\n if (it.description) {\n documentation.value += `\\n\\n${it.description}`;\n }\n\n const autocomplete = it.autocomplete && it.autocomplete[0];\n\n if (autocomplete) {\n if (autocomplete.displayText) {\n label = autocomplete.displayText;\n }\n\n if (autocomplete.description) {\n documentation.value += `\\n\\n${autocomplete.description}`;\n }\n\n if (autocomplete.descriptionMoreURL) {\n documentation.value += `\\n\\n[More Info](${autocomplete.descriptionMoreURL})`;\n }\n }\n\n return {\n label,\n documentation,\n kind: CompletionItemKind.Class,\n insertTextFormat: InsertTextFormat.Snippet,\n textEdit: TextEdit.replace(\n tagNameRange,\n (autocomplete && autocomplete.snippet) || label\n ),\n } as CompletionItem;\n }),\n true\n );\n}\n", "import { type CompletionParams, Position } from \"vscode-languageserver\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport {\n getCSSLanguageService,\n getSCSSLanguageService,\n getLESSLanguageService,\n} from \"vscode-css-languageservice\";\n\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport { shiftCompletionRanges, shiftPosition } from \"../../utils\";\n\nconst services = {\n css: getCSSLanguageService,\n scss: getSCSSLanguageService,\n less: getLESSLanguageService,\n};\n\nexport function styleContent(\n _taglib: TaglibLookup,\n document: TextDocument,\n params: CompletionParams,\n event: ParserEvents.StyleContent\n) {\n const service = services[event.language]();\n const startPos = document.positionAt(event.pos);\n const relativePos = shiftPosition(\n params.position,\n Position.create(startPos.line * -1, startPos.character * -1)\n );\n const contentDocument = TextDocument.create(\n document.uri,\n event.language,\n document.version,\n event.content\n );\n\n const completions = service.doComplete(\n contentDocument,\n relativePos,\n service.parseStylesheet(contentDocument)\n );\n\n return shiftCompletionRanges(completions, startPos);\n}\n", "export * from \"./types/attributeName\";\nexport * from \"./types/openTagName\";\n", "import { URI } from \"vscode-uri\";\nimport {\n type TextDocumentPositionParams,\n Range,\n LocationLink,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport RegExpBuilder from \"../../regexp-builder\";\nimport { START_OF_FILE, createTextDocument, rangeFromEvent } from \"../../utils\";\n\nexport function attributeName(\n taglib: TaglibLookup,\n document: TextDocument,\n _params: TextDocumentPositionParams,\n event: ParserEvents.AttributeName\n) {\n const tagName = event.tag.tagNameExpression ? undefined : event.tag.tagName;\n const tagDef = tagName && taglib.getTag(tagName);\n const attrDef = taglib.getAttribute(tagName || \"*\", event.name);\n let range = START_OF_FILE;\n\n if (!attrDef) {\n return;\n }\n\n const attrEntryFile = attrDef.filePath || (tagDef && tagDef.filePath);\n\n if (!attrEntryFile) {\n return;\n }\n\n if (/\\/marko(?:-tag)?\\.json$/.test(attrEntryFile)) {\n const tagDefDoc = createTextDocument(attrEntryFile);\n const match = RegExpBuilder`/\"@${event.name}\"\\s*:\\s*[^\\r\\n,]+/g`.exec(\n tagDefDoc.getText()\n );\n\n if (match && match.index) {\n range = Range.create(\n tagDefDoc.positionAt(match.index),\n tagDefDoc.positionAt(match.index + match[0].length)\n );\n }\n }\n\n return [\n LocationLink.create(\n URI.file(attrEntryFile).toString(),\n range,\n range,\n rangeFromEvent(document, event)\n ),\n ];\n}\n", "export default function RegExpBuilder(\n strings: TemplateStringsArray,\n ...expressions: [unknown, ...unknown[]]\n) {\n let i = 0;\n let src = strings[0].slice(strings[0].indexOf(\"/\") + 1);\n const secondLastExprIndex = strings.length - 2;\n\n for (; i < secondLastExprIndex; i++) {\n src += escape(expressions[i]) + strings[i + 1];\n }\n\n src += escape(expressions[i]);\n\n const lastStr = strings[i + 1];\n const lastSlashIndex = lastStr.lastIndexOf(\"/\");\n let flags = \"\";\n\n if (lastSlashIndex === -1) {\n src += lastStr;\n } else {\n flags = lastStr.slice(lastSlashIndex + 1);\n src += lastStr.slice(0, lastSlashIndex);\n }\n\n return new RegExp(src, flags);\n}\n\nfunction escape(val: unknown) {\n return String(val).replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n}\n", "import { URI } from \"vscode-uri\";\nimport {\n type TextDocumentPositionParams,\n Range,\n LocationLink,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup, TagDefinition } from \"../../compiler\";\nimport RegExpBuilder from \"../../regexp-builder\";\nimport {\n START_OF_FILE,\n findNonControlFlowParent,\n createTextDocument,\n rangeFromEvent,\n} from \"../../utils\";\n\nexport function openTagName(\n taglib: TaglibLookup,\n document: TextDocument,\n _params: TextDocumentPositionParams,\n event: ParserEvents.OpenTagName\n) {\n let tagDef: TagDefinition | null | undefined;\n let range = START_OF_FILE;\n const isAttributeTag = event.tagName[0] === \"@\";\n\n if (isAttributeTag) {\n const parentTag = findNonControlFlowParent(event);\n tagDef =\n parentTag &&\n (parentTag.tagNameExpression\n ? undefined\n : taglib.getTag(parentTag.tagName));\n } else {\n tagDef = taglib.getTag(event.tagName);\n }\n\n if (!tagDef) {\n return;\n }\n\n const tagEntryFile = tagDef.template || tagDef.renderer || tagDef.filePath;\n\n if (/\\/marko(?:-tag)?\\.json$/.test(tagEntryFile)) {\n const tagDefDoc = createTextDocument(tagEntryFile);\n const match = RegExpBuilder`/\"<${event.tagName}>\"\\s*:\\s*[^\\r\\n,]+/g`.exec(\n tagDefDoc.getText()\n );\n\n if (match && match.index) {\n range = Range.create(\n tagDefDoc.positionAt(match.index),\n tagDefDoc.positionAt(match.index + match[0].length)\n );\n }\n }\n\n return [\n LocationLink.create(\n URI.file(tagEntryFile).toString(),\n range,\n range,\n rangeFromEvent(document, event)\n ),\n ];\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n createConnection,\n ProposedFeatures,\n Range,\n Position,\n CompletionList,\n CompletionParams,\n Diagnostic,\n DiagnosticSeverity,\n DocumentFormattingParams,\n TextDocuments,\n TextEdit,\n TextDocumentSyncKind,\n} from \"vscode-languageserver/node\";\nimport { URI } from \"vscode-uri\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport * as prettier from \"prettier\";\nimport * as markoPrettier from \"prettier-plugin-marko\";\nimport { inspect, isDeepStrictEqual } from \"util\";\nimport {\n getTagLibLookup,\n getCompilerAndTranslatorForDoc,\n Compiler,\n} from \"./utils/compiler\";\nimport { parseUntilOffset } from \"./utils/htmljs-parser\";\nimport * as completionTypes from \"./utils/completions\";\nimport * as definitionTypes from \"./utils/definitions\";\n\nif (\n typeof require !== \"undefined\" &&\n require.extensions &&\n !(\".ts\" in require.extensions)\n) {\n // Prevent compiler hooks written in typescript to explode the language server.\n require.extensions[\".ts\"] = undefined;\n}\n\nconst cacheForCompiler = new WeakMap<Compiler, Map<unknown, unknown>>();\nconst connection = createConnection(ProposedFeatures.all);\nconst prevDiagnostics = new WeakMap<TextDocument, Diagnostic[]>();\nconst diagnosticTimeouts = new WeakMap<\n TextDocument,\n ReturnType<typeof setTimeout>\n>();\nconst documents = new TextDocuments(TextDocument);\nconst markoErrorRegExp = /^(.+?)(?:\\((\\d+)(?:\\s*,\\s*(\\d+))?\\))?: (.*)$/gm;\n\nconsole.log = (...args: unknown[]) => {\n connection.console.log(args.map((v) => inspect(v)).join(\" \"));\n};\nconsole.error = (...args: unknown[]) => {\n connection.console.error(args.map((v) => inspect(v)).join(\" \"));\n};\nprocess.on(\"uncaughtException\", console.error);\nprocess.on(\"unhandledRejection\", console.error);\n\nconnection.onInitialize(() => {\n return {\n capabilities: {\n textDocumentSync: TextDocumentSyncKind.Incremental,\n documentFormattingProvider: true,\n definitionProvider: true,\n completionProvider: {\n triggerCharacters: [\".\", \":\", \"<\", \">\", \"@\", \"/\"],\n },\n },\n };\n});\n\nconnection.onInitialized(() => {\n documents.all().forEach((doc) => queueValidation(doc));\n});\n\nconnection.onCompletion((params: CompletionParams): CompletionList => {\n const doc = documents.get(params.textDocument.uri)!;\n const taglib = getTagLibLookup(doc);\n if (!taglib) return CompletionList.create([], true);\n\n const event = parseUntilOffset({\n taglib,\n offset: doc.offsetAt(params.position),\n text: doc.getText(),\n });\n\n const handler =\n event && completionTypes[event.type as keyof typeof completionTypes];\n return (\n (handler && handler(taglib, doc, params, event as any)) ||\n CompletionList.create([], true)\n );\n});\n\nconnection.onDefinition((params) => {\n const doc = documents.get(params.textDocument.uri)!;\n const taglib = getTagLibLookup(doc);\n if (!taglib) return;\n\n const event = parseUntilOffset({\n taglib,\n offset: doc.offsetAt(params.position),\n text: doc.getText(),\n });\n\n const handler =\n event && definitionTypes[event.type as keyof typeof definitionTypes];\n return handler && handler(taglib, doc, params, event as any);\n});\n\nconnection.onDocumentFormatting(\n async ({\n textDocument,\n options,\n }: DocumentFormattingParams): Promise<TextEdit[]> => {\n try {\n const doc = documents.get(textDocument.uri)!;\n const { fsPath, scheme } = URI.parse(textDocument.uri);\n const text = doc.getText();\n const formatted = prettier.format(text, {\n parser: \"marko\",\n filepath: fsPath,\n plugins: [markoPrettier],\n tabWidth: options.tabSize,\n useTabs: options.insertSpaces === false,\n ...(scheme === \"file\"\n ? await prettier\n .resolveConfig(fsPath, {\n editorconfig: true,\n })\n .catch(() => null)\n : null),\n });\n\n return [\n TextEdit.replace(\n Range.create(doc.positionAt(0), doc.positionAt(text.length)),\n formatted\n ),\n ];\n } catch (e) {\n displayMessage(\"Error\", inspect(e, { colors: false }));\n }\n\n return [\n TextEdit.replace(\n Range.create(Position.create(0, 0), Position.create(0, 0)),\n \"\"\n ),\n ];\n }\n);\n\nconnection.onDidChangeWatchedFiles(() => {\n const clearedCompilers = new Set<Compiler>();\n for (const doc of documents.all()) {\n const { compiler } = getCompilerAndTranslatorForDoc(doc);\n\n if (!clearedCompilers.has(compiler)) {\n clearCaches(compiler);\n clearedCompilers.add(compiler);\n }\n }\n});\n\ndocuments.onDidChangeContent((change) => {\n queueValidation(change.document);\n\n if (change.document.version > 1) {\n clearCaches(getCompilerAndTranslatorForDoc(change.document).compiler);\n }\n});\n\nfunction queueValidation(doc: TextDocument) {\n clearTimeout(diagnosticTimeouts.get(doc)!);\n diagnosticTimeouts.set(\n doc,\n setTimeout(() => {\n const prevDiag = prevDiagnostics.get(doc);\n const nextDiag = doValidate(doc);\n\n if (prevDiag && isDeepStrictEqual(prevDiag, nextDiag)) {\n return;\n }\n\n prevDiagnostics.set(doc, nextDiag);\n connection.sendDiagnostics({\n uri: doc.uri,\n diagnostics: nextDiag,\n });\n }, 800)\n );\n}\n\nfunction doValidate(doc: TextDocument): Diagnostic[] {\n const { fsPath, scheme } = URI.parse(doc.uri);\n\n if (scheme !== \"file\") {\n return [];\n }\n\n const { compiler, translator } = getCompilerAndTranslatorForDoc(doc);\n const diagnostics: Diagnostic[] = [];\n\n try {\n compiler.compileSync(doc.getText(), fsPath, {\n cache: getCacheForCompiler(compiler),\n output: \"source\",\n code: false,\n translator,\n });\n } catch (e) {\n let match: RegExpExecArray | null;\n while ((match = markoErrorRegExp.exec((e as Error).message))) {\n const [, fileName, rawLine, rawCol, msg] = match;\n const line = (parseInt(rawLine, 10) || 1) - 1;\n const col = (parseInt(rawCol, 10) || 1) - 1;\n diagnostics.push(\n Diagnostic.create(\n Range.create(line, col, line, col),\n msg,\n DiagnosticSeverity.Error,\n undefined,\n fileName\n )\n );\n }\n }\n\n return diagnostics;\n}\n\nfunction clearCaches(compiler: Compiler) {\n cacheForCompiler.get(compiler)?.clear();\n compiler.taglib.clearCaches();\n}\n\nfunction getCacheForCompiler(compiler: Compiler) {\n let cache = cacheForCompiler.get(compiler);\n if (!cache) {\n cacheForCompiler.set(compiler, (cache = new Map()));\n }\n return cache;\n}\n\nfunction displayMessage(\n type: \"Information\" | \"Warning\" | \"Error\",\n msg: string\n) {\n setImmediate(() => {\n connection.sendNotification(`show${type}`, msg);\n });\n}\n\ndocuments.listen(connection);\nconnection.listen();\n", "import path from \"path\";\nimport { URI } from \"vscode-uri\";\nimport resolveFrom from \"resolve-from\";\nimport lassoPackageRoot from \"lasso-package-root\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type {\n AttributeDefinition,\n TagDefinition,\n TaglibLookup,\n} from \"@marko/babel-utils\";\n\nimport * as builtinCompiler from \"@marko/compiler\";\nimport * as builtinTranslator from \"@marko/translator-default\";\nbuiltinCompiler.configure({ translator: builtinTranslator as any });\n\nexport type Compiler = typeof import(\"@marko/compiler\");\nexport { AttributeDefinition, TagDefinition, TaglibLookup };\nexport type CompilerAndTranslator = {\n compiler: Compiler;\n translator: any; // TODO should update the type in `@marko/compiler` to not just be string | undefined\n};\n\nconst compilerAndTranslatorForDoc = new WeakMap<\n TextDocument,\n CompilerAndTranslator\n>();\n\nexport function getCompilerAndTranslatorForDoc(\n doc: TextDocument\n): CompilerAndTranslator {\n let compilerAndTranslator = compilerAndTranslatorForDoc.get(doc);\n if (!compilerAndTranslator) {\n compilerAndTranslatorForDoc.set(\n doc,\n (compilerAndTranslator = loadCompiler(\n path.dirname(URI.parse(doc.uri).fsPath)\n ))\n );\n }\n\n return compilerAndTranslator;\n}\n\nexport function getTagLibLookup(\n document: TextDocument\n): TaglibLookup | undefined {\n try {\n const { compiler, translator } = getCompilerAndTranslatorForDoc(document);\n return compiler.taglib.buildLookup(\n URI.parse(document.uri).fsPath,\n translator\n );\n // eslint-disable-next-line no-empty\n } catch {}\n}\n\nfunction loadCompiler(dir: string): CompilerAndTranslator {\n const rootDir = lassoPackageRoot.getRootDir(dir);\n const pkgPath =\n rootDir && resolveFrom.silent(rootDir, \"@marko/compiler/package.json\");\n const pkg = pkgPath && require(pkgPath);\n\n if (pkg && /^5\\./.test(pkg.version)) {\n try {\n // Ensure translator is available in local package, or fallback to built in compiler.\n let translator = ([] as string[])\n .concat(\n Object.keys(pkg.dependencies),\n Object.keys(pkg.peerDependencies),\n Object.keys(pkg.devDependencies)\n )\n .find((name) => /^marko$|^(@\\/marko\\/|marko-)translator-/.test(name));\n\n if (translator === \"marko\" || !translator) {\n // Fallback to compiler default translator\n translator = require(resolveFrom(dir, \"@marko/compiler/config\"))\n .translator as string;\n }\n\n require(resolveFrom(dir, translator));\n return {\n compiler: require(resolveFrom(dir, \"@marko/compiler\")),\n translator,\n };\n // eslint-disable-next-line no-empty\n } catch {}\n }\n\n return {\n compiler: builtinCompiler,\n translator: builtinTranslator,\n };\n}\n", "import { createParser } from \"htmljs-parser\";\nimport type { TaglibLookup } from \"./compiler\";\n\nexport namespace ParserEvents {\n export interface Error {\n type: \"error\";\n code: string;\n message: string;\n pos: number;\n endPos: number;\n }\n\n export interface OpenTagName extends Tag {\n type: \"openTagName\";\n }\n\n export interface OpenTag extends Tag {\n type: \"openTag\";\n argument: { pos: number; endPos: number; value: string } | undefined;\n params: { pos: number; endPos: number; value: string } | undefined;\n shorthandClassNames:\n | {\n value: string;\n rawParts: { text: string; pos: number; endPos: number }[];\n }[]\n | undefined;\n attributes: Attribute[];\n nestedTags: { [x: string]: Tag } | undefined;\n openTagOnly: boolean;\n selfClosed: boolean;\n tagNameEndPos: number;\n isNestedTag: boolean;\n isRepeated: boolean;\n targetProperty: string | undefined;\n }\n\n export interface CloseTag {\n type: \"closeTag\";\n tagName: string;\n pos: number;\n endPos: number;\n }\n\n export interface Placeholder {\n type: \"placeholder\";\n escape: boolean;\n pos: number;\n endPos: number; // Added manually.\n value: string;\n withinTagName: string;\n withinOpenTag: string;\n withinAttribute: boolean;\n withinBody: boolean;\n withinString: boolean;\n }\n\n // Extended events\n export interface AttributeName {\n type: \"attributeName\";\n tag: OpenTag;\n name: string;\n pos: number;\n endPos: number;\n }\n\n export interface AttributeModifier {\n type: \"attributeModifier\";\n tag: OpenTag;\n name: string;\n modifier: string;\n pos: number;\n endPos: number;\n }\n\n export interface AttributeValue {\n type: \"attributeValue\";\n tag: OpenTag;\n name: string;\n value: string;\n pos: number;\n endPos: number;\n }\n\n export interface Text {\n type: \"text\";\n value: string;\n // Added manually.\n pos: number;\n endPos: number;\n parent: OpenTag | null;\n }\n\n export interface StyleContent {\n type: \"styleContent\";\n language: \"css\" | \"less\" | \"scss\";\n block: boolean;\n content: string;\n pos: number;\n endPos: number;\n }\n\n export type Any =\n | Error\n | OpenTagName\n | OpenTag\n | CloseTag\n | Placeholder\n | AttributeName\n | AttributeModifier\n | AttributeValue\n | Text\n | StyleContent;\n\n interface Tag {\n tagName: string;\n tagNameExpression: string | undefined;\n emptyTagName: boolean; // eg: <.class>\n concise: boolean;\n pos: number;\n endPos: number;\n // Added manually.\n parent: OpenTag | null;\n }\n\n interface Attribute {\n name: string;\n argument: { pos: number; endPos: number; value: string } | undefined;\n value: string | undefined;\n pos: number;\n endPos: number;\n }\n}\n\nconst SUPPORTED_STYLE_LANGS = {\n css: true,\n scss: true,\n less: true,\n};\n\nexport function parseUntilOffset(options: {\n offset: number;\n text: string;\n taglib: TaglibLookup;\n includeErrors?: boolean;\n}) {\n const { offset, text, taglib, includeErrors } = options;\n let result: ParserEvents.Any | null = null;\n let parentTag: ParserEvents.OpenTagName | ParserEvents.OpenTag | null = null;\n const parser = createParser(\n {\n onError: includeErrors && finish,\n onScriptlet: finish,\n onPlaceholder: finish,\n onOpenTagName(ev: ParserEvents.OpenTagName) {\n if (parentTag) {\n ev.parent = parentTag as ParserEvents.OpenTag;\n }\n\n // Currently the parser has the wrong end position here with tag params :\\\n if (!ev.concise) {\n ev.pos += 1;\n }\n\n ev.endPos = ev.pos + ev.tagName.length;\n parentTag = ev;\n finish(ev);\n },\n onOpenTag(ev: ParserEvents.OpenTag) {\n ev.parent = parentTag!.parent;\n parentTag = ev;\n\n if (ev.tagName === \"style\") {\n const firstAttr = ev.attributes[0];\n const isBlock = firstAttr && firstAttr.name.startsWith(\"{\");\n\n if (isBlock) {\n const content = firstAttr.name.slice(1, -1);\n const pos = text.indexOf(content, ev.tagNameEndPos);\n const endPos = pos + content.length;\n const requestedLanguage = (ev.shorthandClassNames &&\n ev.shorthandClassNames[0].rawParts[0] &&\n ev.shorthandClassNames[0].rawParts[0].text) as\n | void\n | keyof typeof SUPPORTED_STYLE_LANGS;\n const language =\n requestedLanguage && SUPPORTED_STYLE_LANGS[requestedLanguage]\n ? requestedLanguage\n : \"css\";\n\n finish({\n type: \"styleContent\",\n language,\n block: true,\n content: text.slice(pos, endPos),\n pos,\n endPos,\n });\n\n return;\n }\n }\n\n let attrEndPos = ev.tagNameEndPos;\n for (const attr of ev.attributes) {\n if (!attr.name) {\n // Legacy dynamic attrs.\n if (attr.value !== undefined) {\n attrEndPos += attr.value.length;\n }\n continue;\n }\n\n if (attr.name.slice(0, 3) === \"...\") {\n attrEndPos = attr.argument ? attr.argument.endPos + 1 : attr.endPos;\n continue;\n }\n\n const attrStartPos = text.indexOf(attr.name, attrEndPos);\n const match = /:(.*)$/.exec(attr.name);\n const modifier = match && match[1];\n let name = attr.name;\n\n if (modifier) {\n name = name.slice(0, name.length - modifier.length - 1);\n const modifierStartPos = attrStartPos + name.length;\n const modifierEndPos = modifierStartPos + modifier.length + 1;\n if (\n finish({\n type: \"attributeModifier\",\n tag: ev,\n name,\n modifier,\n pos: modifierStartPos,\n endPos: modifierEndPos,\n })\n ) {\n return;\n }\n }\n\n const attrNameEndPos = attrStartPos + name.length;\n\n if (\n finish({\n type: \"attributeName\",\n tag: ev,\n name,\n pos: attrStartPos,\n endPos: attrNameEndPos,\n })\n ) {\n return;\n }\n\n if (attr.value) {\n attrEndPos = attr.endPos;\n const valueStartPos = attr.pos + 1; // Add one to account for \"=\".\n if (\n finish({\n type: \"attributeValue\",\n tag: ev,\n name,\n value: text.slice(valueStartPos, attrEndPos), // We use the raw value to ignore things like non standard placeholders.\n pos: valueStartPos,\n endPos: attr.endPos,\n })\n ) {\n break;\n }\n } else {\n attrEndPos = attr.argument ? attr.argument.endPos + 1 : attr.endPos;\n }\n }\n\n finish(ev);\n },\n onText(ev: ParserEvents.Text) {\n ev.endPos = parser.pos as number;\n ev.pos = ev.endPos - ev.value.length;\n\n if (parentTag) {\n ev.parent = parentTag as ParserEvents.OpenTag;\n\n if (parentTag.tagName === \"style\") {\n finish({\n type: \"styleContent\",\n language: \"css\",\n block: false,\n content: ev.value,\n pos: ev.pos,\n endPos: ev.endPos,\n });\n\n return;\n }\n }\n\n finish(ev);\n },\n onCloseTag(ev: ParserEvents.CloseTag) {\n parentTag = parentTag && parentTag.parent;\n finish(ev);\n },\n },\n {\n isOpenTagOnly(ev: string) {\n const tagDef = taglib.getTag(ev);\n return tagDef && tagDef.openTagOnly;\n },\n }\n );\n\n try {\n // We only parse up to the end of the line the user is currently looking for.\n parser.parse(`${text}\\n`);\n } catch (err) {\n return includeErrors\n ? ({\n type: \"error\",\n code: \"UNEXPECTED_TOKEN\",\n message: (err as Error).message,\n pos: parser.pos,\n endPos: parser.pos,\n } as ParserEvents.Error)\n : null;\n }\n\n return result as ParserEvents.Any | null;\n\n function finish(event: ParserEvents.Any): boolean {\n const { type, pos, endPos } = event;\n if (\n !result &&\n (type === \"error\" ||\n (pos != null && pos <= offset && endPos != null && endPos >= offset))\n ) {\n result = event;\n parser.end();\n return true;\n }\n\n return false;\n }\n}\n", "export * from \"./types/attributeModifier\";\nexport * from \"./types/attributeName\";\nexport * from \"./types/closeTag\";\nexport * from \"./types/openTag\";\nexport * from \"./types/openTagName\";\nexport * from \"./types/styleContent\";\n", "import {\n type CompletionParams,\n CompletionList,\n CompletionItemKind,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\n\nexport function attributeModifier(\n _taglib: TaglibLookup,\n _document: TextDocument,\n _params: CompletionParams,\n _event: ParserEvents.OpenTagName\n) {\n return CompletionList.create(\n [\n {\n label: \"scoped\",\n kind: CompletionItemKind.Keyword,\n detail: \"Use to prefix with a unique ID\",\n },\n {\n label: \"no-update\",\n kind: CompletionItemKind.Keyword,\n detail: \"Use to skip future updates to this attribute\",\n },\n ],\n true\n );\n}\n", "import {\n type CompletionParams,\n type CompletionItem,\n type MarkupContent,\n CompletionList,\n CompletionItemKind,\n MarkupKind,\n InsertTextFormat,\n TextEdit,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport { rangeFromEvent } from \"../../utils\";\n\nexport function attributeName(\n taglib: TaglibLookup,\n document: TextDocument,\n _params: CompletionParams,\n event: ParserEvents.AttributeName\n) {\n const completions: CompletionItem[] = [];\n const attrNameRange = rangeFromEvent(document, event);\n const tagDef =\n !event.tag.tagNameExpression && taglib.getTag(event.tag.tagName);\n const tagName = (tagDef && tagDef.name) || \"*\";\n const nestedTagAttrs: { [x: string]: boolean } = {};\n const neverAttrs: Set<string> = new Set();\n\n if (tagDef && tagDef.nestedTags) {\n for (const key in tagDef.nestedTags) {\n const nestedTagDef = tagDef.nestedTags[key];\n nestedTagAttrs[nestedTagDef.targetProperty] = true;\n }\n }\n\n taglib.forEachAttribute(tagName, (attr) => {\n if (attr.type === \"never\") {\n neverAttrs.add(attr.name);\n }\n });\n\n taglib.forEachAttribute(tagName, (attr, parent) => {\n if (\n attr.deprecated ||\n nestedTagAttrs[attr.name] ||\n attr.name === \"*\" ||\n neverAttrs.has(attr.name) ||\n (attr.name[0] === \"_\" &&\n /\\/node_modules\\//.test(attr.filePath || parent.filePath))\n ) {\n return;\n }\n\n const type = attr.type || (attr.html ? \"string\" : null);\n const documentation: MarkupContent = {\n kind: MarkupKind.Markdown,\n value: attr.description || \"\",\n };\n let label = attr.name;\n let snippet = attr.name;\n\n if (attr.enum) {\n snippet += `=\"\\${1|${attr.enum.join()}|}\"$0`;\n } else {\n switch (type) {\n case \"string\":\n snippet += '=\"$1\"$0';\n break;\n case \"function\":\n snippet += \"=($1)$0\";\n break;\n case \"statement\":\n case \"boolean\":\n case \"flag\":\n break;\n default:\n snippet += \"=\";\n break;\n }\n }\n\n const autocomplete =\n attr.autocomplete && Array.isArray(attr.autocomplete)\n ? attr.autocomplete[0]\n : attr.autocomplete;\n\n if (autocomplete) {\n label = autocomplete.displayText || label;\n snippet = autocomplete.snippet || snippet;\n\n if (autocomplete.descriptionMoreURL) {\n if (documentation.value) {\n documentation.value += `\\n\\n`;\n }\n\n documentation.value += `[More Info](${autocomplete.descriptionMoreURL})`;\n }\n }\n\n completions.push({\n label,\n documentation: documentation.value ? documentation : undefined,\n kind: CompletionItemKind.Property,\n insertTextFormat: InsertTextFormat.Snippet,\n textEdit: TextEdit.replace(attrNameRange, snippet),\n });\n });\n\n return CompletionList.create(completions, true);\n}\n", "import fs from \"fs\";\nimport { URI } from \"vscode-uri\";\nimport {\n type CompletionList,\n type InsertReplaceEdit,\n TextEdit,\n Position,\n Range,\n} from \"vscode-languageserver\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"./htmljs-parser\";\n\nexport const START_OF_FILE = Range.create(\n Position.create(0, 0),\n Position.create(0, 0)\n);\n\nexport function findNonControlFlowParent(tag: ParserEvents.OpenTagName) {\n let parent = tag.parent;\n\n while (parent) {\n if (!/^(?:else-)?if|else|for|while$/.test(parent.tagName)) {\n return parent;\n }\n\n parent = parent.parent;\n }\n\n return null;\n}\n\nexport function rangeFromEvent(\n document: TextDocument,\n event: ParserEvents.Any\n) {\n return Range.create(\n document.positionAt(event.pos),\n document.positionAt(event.endPos)\n );\n}\n\nexport function createTextDocument(filename: string): TextDocument {\n const uri = URI.file(filename).toString();\n const content = fs.readFileSync(filename, \"utf-8\");\n return TextDocument.create(uri, \"plaintext\", 0, content);\n}\n\nexport function shiftCompletionRanges(list: CompletionList, offset: Position) {\n list.items.forEach((item) => {\n if (item.additionalTextEdits) {\n item.additionalTextEdits.forEach((edit) =>\n shiftRange(edit.range, offset)\n );\n }\n\n if (item.textEdit) {\n shiftEdit(item.textEdit, offset);\n }\n });\n\n return list;\n}\n\nexport function shiftEdit(\n edit: TextEdit | InsertReplaceEdit,\n offset: Position\n) {\n if (TextEdit.is(edit)) {\n shiftRange(edit.range, offset);\n } else {\n shiftRange(edit.insert, offset);\n shiftRange(edit.replace, offset);\n }\n}\n\nexport function shiftRange(range: Range | undefined, offset: Position) {\n if (range) {\n shiftPosition(range.start, offset);\n shiftPosition(range.end, offset);\n }\n}\n\nexport function shiftPosition(pos: Position, offset: Position) {\n if (pos.line === 0) {\n pos.character += offset.character;\n }\n\n pos.line += offset.line;\n return pos;\n}\n", "import {\n type CompletionParams,\n CompletionList,\n CompletionItemKind,\n InsertTextFormat,\n TextEdit,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport { rangeFromEvent } from \"../../utils\";\n\nexport function closeTag(\n _taglib: TaglibLookup,\n document: TextDocument,\n _params: CompletionParams,\n event: ParserEvents.CloseTag\n) {\n if (event.tagName[0] === \"$\") {\n return;\n }\n\n const closingTagStr = `</${event.tagName}>`;\n\n return CompletionList.create(\n [\n {\n label: closingTagStr,\n kind: CompletionItemKind.Class,\n insertTextFormat: InsertTextFormat.Snippet,\n textEdit: TextEdit.replace(\n rangeFromEvent(document, event),\n closingTagStr\n ),\n },\n ],\n true\n );\n}\n", "import {\n type CompletionParams,\n CompletionList,\n CompletionItemKind,\n InsertTextFormat,\n Range,\n Position,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\n\nexport function openTag(\n _taglib: TaglibLookup,\n doc: TextDocument,\n params: CompletionParams,\n event: ParserEvents.OpenTag\n) {\n const triggerCharacter =\n (params.context && params.context.triggerCharacter) ||\n doc.getText(\n Range.create(\n Position.create(params.position.line, params.position.character - 1),\n params.position\n )\n );\n\n if (triggerCharacter !== \">\" || event.openTagOnly || event.selfClosed) {\n return;\n }\n\n const closingTagStr = `</${event.tagName[0] === \"$\" ? \"\" : event.tagName}>`;\n\n return CompletionList.create(\n [\n {\n label: closingTagStr,\n kind: CompletionItemKind.Class,\n insertTextFormat: InsertTextFormat.Snippet,\n insertText: `\\n\\t$0\\n${closingTagStr}`,\n },\n ],\n true\n );\n}\n", "import path from \"path\";\nimport { URI } from \"vscode-uri\";\nimport {\n type CompletionParams,\n CompletionItemKind,\n CompletionItem,\n CompletionList,\n InsertTextFormat,\n MarkupKind,\n TextEdit,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup, TagDefinition } from \"../../compiler\";\nimport { rangeFromEvent, findNonControlFlowParent } from \"../../utils\";\n\nexport function openTagName(\n taglib: TaglibLookup,\n document: TextDocument,\n params: CompletionParams,\n event: ParserEvents.OpenTagName\n) {\n const { fsPath: currentTemplateFilePath } = URI.parse(document.uri);\n let tags: TagDefinition[];\n const triggerCharacter =\n (params.context && params.context.triggerCharacter) || event.tagName[0];\n const isAttributeTag = triggerCharacter === \"@\";\n const tagNameRange = rangeFromEvent(document, event);\n\n if (isAttributeTag) {\n const parentTag = findNonControlFlowParent(event);\n const parentTagDef =\n parentTag &&\n !parentTag.tagNameExpression &&\n taglib.getTag(parentTag.tagName);\n tags =\n (parentTagDef &&\n parentTagDef.nestedTags &&\n Object.values(parentTagDef.nestedTags)) ||\n [];\n } else {\n tags = taglib.getTagsSorted().filter((it) => !it.isNestedTag);\n }\n\n return CompletionList.create(\n tags\n .filter((it) => !it.deprecated)\n .filter((it) => it.name !== \"*\")\n .filter(\n (it) => /^[^_]/.test(it.name) || !/\\/node_modules\\//.test(it.filePath)\n )\n .map((it) => {\n let label = it.isNestedTag ? `@${it.name}` : it.name;\n const fileForTag = it.template || it.renderer || it.filePath;\n const fileURIForTag = URI.file(fileForTag).toString();\n const nodeModuleMatch = /\\/node_modules\\/((?:@[^/]+\\/)?[^/]+)/.exec(\n fileForTag\n );\n\n const nodeModuleName = nodeModuleMatch && nodeModuleMatch[1];\n const isCoreTag = nodeModuleName === \"marko\";\n\n const documentation = {\n kind: MarkupKind.Markdown,\n value: it.html\n ? `Built in [<${it.name}>](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/${it.name}) HTML tag.`\n : nodeModuleName\n ? isCoreTag\n ? `Core Marko [<${it.name}>](${fileURIForTag}) tag.`\n : `Custom Marko tag discovered from the [\"${nodeModuleName}\"](${fileURIForTag}) npm package.`\n : `Custom Marko tag discovered from:\\n\\n[${path.relative(\n currentTemplateFilePath,\n fileForTag\n )}](${fileURIForTag})`,\n };\n\n if (it.description) {\n documentation.value += `\\n\\n${it.description}`;\n }\n\n const autocomplete = it.autocomplete && it.autocomplete[0];\n\n if (autocomplete) {\n if (autocomplete.displayText) {\n label = autocomplete.displayText;\n }\n\n if (autocomplete.description) {\n documentation.value += `\\n\\n${autocomplete.description}`;\n }\n\n if (autocomplete.descriptionMoreURL) {\n documentation.value += `\\n\\n[More Info](${autocomplete.descriptionMoreURL})`;\n }\n }\n\n return {\n label,\n documentation,\n kind: CompletionItemKind.Class,\n insertTextFormat: InsertTextFormat.Snippet,\n textEdit: TextEdit.replace(\n tagNameRange,\n (autocomplete && autocomplete.snippet) || label\n ),\n } as CompletionItem;\n }),\n true\n );\n}\n", "import { type CompletionParams, Position } from \"vscode-languageserver\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport {\n getCSSLanguageService,\n getSCSSLanguageService,\n getLESSLanguageService,\n} from \"vscode-css-languageservice\";\n\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport { shiftCompletionRanges, shiftPosition } from \"../../utils\";\n\nconst services = {\n css: getCSSLanguageService,\n scss: getSCSSLanguageService,\n less: getLESSLanguageService,\n};\n\nexport function styleContent(\n _taglib: TaglibLookup,\n document: TextDocument,\n params: CompletionParams,\n event: ParserEvents.StyleContent\n) {\n const service = services[event.language]();\n const startPos = document.positionAt(event.pos);\n const relativePos = shiftPosition(\n params.position,\n Position.create(startPos.line * -1, startPos.character * -1)\n );\n const contentDocument = TextDocument.create(\n document.uri,\n event.language,\n document.version,\n event.content\n );\n\n const completions = service.doComplete(\n contentDocument,\n relativePos,\n service.parseStylesheet(contentDocument)\n );\n\n return shiftCompletionRanges(completions, startPos);\n}\n", "export * from \"./types/attributeName\";\nexport * from \"./types/openTagName\";\n", "import { URI } from \"vscode-uri\";\nimport {\n type TextDocumentPositionParams,\n Range,\n LocationLink,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport RegExpBuilder from \"../../regexp-builder\";\nimport { START_OF_FILE, createTextDocument, rangeFromEvent } from \"../../utils\";\n\nexport function attributeName(\n taglib: TaglibLookup,\n document: TextDocument,\n _params: TextDocumentPositionParams,\n event: ParserEvents.AttributeName\n) {\n const tagName = event.tag.tagNameExpression ? undefined : event.tag.tagName;\n const tagDef = tagName && taglib.getTag(tagName);\n const attrDef = taglib.getAttribute(tagName || \"*\", event.name);\n let range = START_OF_FILE;\n\n if (!attrDef) {\n return [];\n }\n\n const attrEntryFile = attrDef.filePath || (tagDef && tagDef.filePath);\n\n if (!attrEntryFile) {\n return [];\n }\n\n if (/\\/marko(?:-tag)?\\.json$/.test(attrEntryFile)) {\n const tagDefDoc = createTextDocument(attrEntryFile);\n const match = RegExpBuilder`/\"@${event.name}\"\\s*:\\s*[^\\r\\n,]+/g`.exec(\n tagDefDoc.getText()\n );\n\n if (match && match.index) {\n range = Range.create(\n tagDefDoc.positionAt(match.index),\n tagDefDoc.positionAt(match.index + match[0].length)\n );\n }\n }\n\n return [\n LocationLink.create(\n URI.file(attrEntryFile).toString(),\n range,\n range,\n rangeFromEvent(document, event)\n ),\n ];\n}\n", "export default function RegExpBuilder(\n strings: TemplateStringsArray,\n ...expressions: [unknown, ...unknown[]]\n) {\n let i = 0;\n let src = strings[0].slice(strings[0].indexOf(\"/\") + 1);\n const secondLastExprIndex = strings.length - 2;\n\n for (; i < secondLastExprIndex; i++) {\n src += escape(expressions[i]) + strings[i + 1];\n }\n\n src += escape(expressions[i]);\n\n const lastStr = strings[i + 1];\n const lastSlashIndex = lastStr.lastIndexOf(\"/\");\n let flags = \"\";\n\n if (lastSlashIndex === -1) {\n src += lastStr;\n } else {\n flags = lastStr.slice(lastSlashIndex + 1);\n src += lastStr.slice(0, lastSlashIndex);\n }\n\n return new RegExp(src, flags);\n}\n\nfunction escape(val: unknown) {\n return String(val).replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n}\n", "import path from \"path\";\nimport { URI } from \"vscode-uri\";\nimport {\n type TextDocumentPositionParams,\n Range,\n LocationLink,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup, TagDefinition } from \"../../compiler\";\nimport RegExpBuilder from \"../../regexp-builder\";\nimport {\n START_OF_FILE,\n findNonControlFlowParent,\n createTextDocument,\n rangeFromEvent,\n} from \"../../utils\";\n\nexport function openTagName(\n taglib: TaglibLookup,\n document: TextDocument,\n _params: TextDocumentPositionParams,\n event: ParserEvents.OpenTagName\n) {\n let tagDef: TagDefinition | null | undefined;\n let range = START_OF_FILE;\n const isAttributeTag = event.tagName[0] === \"@\";\n\n if (isAttributeTag) {\n const parentTag = findNonControlFlowParent(event);\n tagDef =\n parentTag &&\n (parentTag.tagNameExpression\n ? undefined\n : taglib.getTag(parentTag.tagName));\n } else {\n tagDef = taglib.getTag(event.tagName);\n }\n\n if (!tagDef) {\n return [];\n }\n\n const tagEntryFile = tagDef.template || tagDef.renderer || tagDef.filePath;\n\n if (!path.isAbsolute(tagEntryFile)) {\n return [];\n }\n\n if (/\\/marko(?:-tag)?\\.json$/.test(tagEntryFile)) {\n const tagDefDoc = createTextDocument(tagEntryFile);\n const match =\n RegExpBuilder`/\"(?:<${event.tagName}>|${event.tagName})\"\\s*:\\s*[^\\r\\n,]+/g`.exec(\n tagDefDoc.getText()\n );\n\n if (match && match.index) {\n range = Range.create(\n tagDefDoc.positionAt(match.index),\n tagDefDoc.positionAt(match.index + match[0].length)\n );\n }\n }\n\n return [\n LocationLink.create(\n URI.file(tagEntryFile).toString(),\n range,\n range,\n rangeFromEvent(document, event)\n ),\n ];\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/dist/index.mjs CHANGED
@@ -30,8 +30,8 @@ var __export = (target, all) => {
30
30
  import {
31
31
  createConnection,
32
32
  ProposedFeatures,
33
- Range as Range4,
34
- Position as Position3,
33
+ Range as Range5,
34
+ Position as Position4,
35
35
  CompletionList as CompletionList6,
36
36
  Diagnostic,
37
37
  DiagnosticSeverity,
@@ -42,6 +42,7 @@ import {
42
42
  import { URI as URI6 } from "vscode-uri";
43
43
  import { TextDocument as TextDocument3 } from "vscode-languageserver-textdocument";
44
44
  import * as prettier from "prettier";
45
+ import * as markoPrettier from "prettier-plugin-marko";
45
46
  import { inspect, isDeepStrictEqual } from "util";
46
47
 
47
48
  // src/utils/compiler.ts
@@ -51,6 +52,7 @@ import resolveFrom from "resolve-from";
51
52
  import lassoPackageRoot from "lasso-package-root";
52
53
  import * as builtinCompiler from "@marko/compiler";
53
54
  import * as builtinTranslator from "@marko/translator-default";
55
+ builtinCompiler.configure({ translator: builtinTranslator });
54
56
  var compilerAndTranslatorForDoc = /* @__PURE__ */ new WeakMap();
55
57
  function getCompilerAndTranslatorForDoc(doc) {
56
58
  let compilerAndTranslator = compilerAndTranslatorForDoc.get(doc);
@@ -452,10 +454,12 @@ function closeTag(_taglib, document, _params, event) {
452
454
  import {
453
455
  CompletionList as CompletionList4,
454
456
  CompletionItemKind as CompletionItemKind4,
455
- InsertTextFormat as InsertTextFormat3
457
+ InsertTextFormat as InsertTextFormat3,
458
+ Range as Range2,
459
+ Position as Position2
456
460
  } from "vscode-languageserver";
457
- function openTag(_taglib, _document, params, event) {
458
- const triggerCharacter = params.context && params.context.triggerCharacter;
461
+ function openTag(_taglib, doc, params, event) {
462
+ const triggerCharacter = params.context && params.context.triggerCharacter || doc.getText(Range2.create(Position2.create(params.position.line, params.position.character - 1), params.position));
459
463
  if (triggerCharacter !== ">" || event.openTagOnly || event.selfClosed) {
460
464
  return;
461
465
  }
@@ -540,7 +544,7 @@ ${autocomplete.description}`;
540
544
  }
541
545
 
542
546
  // src/utils/completions/types/styleContent.ts
543
- import { Position as Position2 } from "vscode-languageserver";
547
+ import { Position as Position3 } from "vscode-languageserver";
544
548
  import { TextDocument as TextDocument2 } from "vscode-languageserver-textdocument";
545
549
  import {
546
550
  getCSSLanguageService,
@@ -555,7 +559,7 @@ var services = {
555
559
  function styleContent(_taglib, document, params, event) {
556
560
  const service = services[event.language]();
557
561
  const startPos = document.positionAt(event.pos);
558
- const relativePos = shiftPosition(params.position, Position2.create(startPos.line * -1, startPos.character * -1));
562
+ const relativePos = shiftPosition(params.position, Position3.create(startPos.line * -1, startPos.character * -1));
559
563
  const contentDocument = TextDocument2.create(document.uri, event.language, document.version, event.content);
560
564
  const completions = service.doComplete(contentDocument, relativePos, service.parseStylesheet(contentDocument));
561
565
  return shiftCompletionRanges(completions, startPos);
@@ -571,7 +575,7 @@ __export(definitions_exports, {
571
575
  // src/utils/definitions/types/attributeName.ts
572
576
  import { URI as URI4 } from "vscode-uri";
573
577
  import {
574
- Range as Range2,
578
+ Range as Range3,
575
579
  LocationLink
576
580
  } from "vscode-languageserver";
577
581
 
@@ -606,17 +610,17 @@ function attributeName2(taglib, document, _params, event) {
606
610
  const attrDef = taglib.getAttribute(tagName || "*", event.name);
607
611
  let range = START_OF_FILE;
608
612
  if (!attrDef) {
609
- return;
613
+ return [];
610
614
  }
611
615
  const attrEntryFile = attrDef.filePath || tagDef && tagDef.filePath;
612
616
  if (!attrEntryFile) {
613
- return;
617
+ return [];
614
618
  }
615
619
  if (/\/marko(?:-tag)?\.json$/.test(attrEntryFile)) {
616
620
  const tagDefDoc = createTextDocument(attrEntryFile);
617
621
  const match = RegExpBuilder`/"@${event.name}"\s*:\s*[^\r\n,]+/g`.exec(tagDefDoc.getText());
618
622
  if (match && match.index) {
619
- range = Range2.create(tagDefDoc.positionAt(match.index), tagDefDoc.positionAt(match.index + match[0].length));
623
+ range = Range3.create(tagDefDoc.positionAt(match.index), tagDefDoc.positionAt(match.index + match[0].length));
620
624
  }
621
625
  }
622
626
  return [
@@ -625,9 +629,10 @@ function attributeName2(taglib, document, _params, event) {
625
629
  }
626
630
 
627
631
  // src/utils/definitions/types/openTagName.ts
632
+ import path3 from "path";
628
633
  import { URI as URI5 } from "vscode-uri";
629
634
  import {
630
- Range as Range3,
635
+ Range as Range4,
631
636
  LocationLink as LocationLink2
632
637
  } from "vscode-languageserver";
633
638
  function openTagName2(taglib, document, _params, event) {
@@ -641,14 +646,17 @@ function openTagName2(taglib, document, _params, event) {
641
646
  tagDef = taglib.getTag(event.tagName);
642
647
  }
643
648
  if (!tagDef) {
644
- return;
649
+ return [];
645
650
  }
646
651
  const tagEntryFile = tagDef.template || tagDef.renderer || tagDef.filePath;
652
+ if (!path3.isAbsolute(tagEntryFile)) {
653
+ return [];
654
+ }
647
655
  if (/\/marko(?:-tag)?\.json$/.test(tagEntryFile)) {
648
656
  const tagDefDoc = createTextDocument(tagEntryFile);
649
- const match = RegExpBuilder`/"<${event.tagName}>"\s*:\s*[^\r\n,]+/g`.exec(tagDefDoc.getText());
657
+ const match = RegExpBuilder`/"(?:<${event.tagName}>|${event.tagName})"\s*:\s*[^\r\n,]+/g`.exec(tagDefDoc.getText());
650
658
  if (match && match.index) {
651
- range = Range3.create(tagDefDoc.positionAt(match.index), tagDefDoc.positionAt(match.index + match[0].length));
659
+ range = Range4.create(tagDefDoc.positionAt(match.index), tagDefDoc.positionAt(match.index + match[0].length));
652
660
  }
653
661
  }
654
662
  return [
@@ -726,19 +734,20 @@ connection.onDocumentFormatting(async ({
726
734
  const formatted = prettier.format(text, __spreadValues({
727
735
  parser: "marko",
728
736
  filepath: fsPath,
737
+ plugins: [markoPrettier],
729
738
  tabWidth: options.tabSize,
730
739
  useTabs: options.insertSpaces === false
731
740
  }, scheme === "file" ? await prettier.resolveConfig(fsPath, {
732
741
  editorconfig: true
733
742
  }).catch(() => null) : null));
734
743
  return [
735
- TextEdit5.replace(Range4.create(doc.positionAt(0), doc.positionAt(text.length)), formatted)
744
+ TextEdit5.replace(Range5.create(doc.positionAt(0), doc.positionAt(text.length)), formatted)
736
745
  ];
737
746
  } catch (e) {
738
747
  displayMessage("Error", inspect(e, { colors: false }));
739
748
  }
740
749
  return [
741
- TextEdit5.replace(Range4.create(Position3.create(0, 0), Position3.create(0, 0)), "")
750
+ TextEdit5.replace(Range5.create(Position4.create(0, 0), Position4.create(0, 0)), "")
742
751
  ];
743
752
  });
744
753
  connection.onDidChangeWatchedFiles(() => {
@@ -792,7 +801,7 @@ function doValidate(doc) {
792
801
  const [, fileName, rawLine, rawCol, msg] = match;
793
802
  const line = (parseInt(rawLine, 10) || 1) - 1;
794
803
  const col = (parseInt(rawCol, 10) || 1) - 1;
795
- diagnostics.push(Diagnostic.create(Range4.create(line, col, line, col), msg, DiagnosticSeverity.Error, void 0, fileName));
804
+ diagnostics.push(Diagnostic.create(Range5.create(line, col, line, col), msg, DiagnosticSeverity.Error, void 0, fileName));
796
805
  }
797
806
  }
798
807
  return diagnostics;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/utils/compiler.ts", "../src/utils/htmljs-parser.ts", "../src/utils/completions/index.ts", "../src/utils/completions/types/attributeModifier.ts", "../src/utils/completions/types/attributeName.ts", "../src/utils/utils.ts", "../src/utils/completions/types/closeTag.ts", "../src/utils/completions/types/openTag.ts", "../src/utils/completions/types/openTagName.ts", "../src/utils/completions/types/styleContent.ts", "../src/utils/definitions/index.ts", "../src/utils/definitions/types/attributeName.ts", "../src/utils/regexp-builder.ts", "../src/utils/definitions/types/openTagName.ts"],
4
- "sourcesContent": ["import {\n createConnection,\n ProposedFeatures,\n Range,\n Position,\n CompletionList,\n CompletionParams,\n Diagnostic,\n DiagnosticSeverity,\n DocumentFormattingParams,\n TextDocuments,\n TextEdit,\n TextDocumentSyncKind,\n} from \"vscode-languageserver/node\";\nimport { URI } from \"vscode-uri\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport * as prettier from \"prettier\";\nimport { inspect, isDeepStrictEqual } from \"util\";\nimport {\n getTagLibLookup,\n getCompilerAndTranslatorForDoc,\n Compiler,\n} from \"./utils/compiler\";\nimport { parseUntilOffset } from \"./utils/htmljs-parser\";\nimport * as completionTypes from \"./utils/completions\";\nimport * as definitionTypes from \"./utils/definitions\";\n\nif (\n typeof require !== \"undefined\" &&\n require.extensions &&\n !(\".ts\" in require.extensions)\n) {\n // Prevent compiler hooks written in typescript to explode the language server.\n require.extensions[\".ts\"] = undefined;\n}\n\nconst cacheForCompiler = new WeakMap<Compiler, Map<unknown, unknown>>();\nconst connection = createConnection(ProposedFeatures.all);\nconst prevDiagnostics = new WeakMap<TextDocument, Diagnostic[]>();\nconst diagnosticTimeouts = new WeakMap<\n TextDocument,\n ReturnType<typeof setTimeout>\n>();\nconst documents = new TextDocuments(TextDocument);\nconst markoErrorRegExp = /^(.+?)(?:\\((\\d+)(?:\\s*,\\s*(\\d+))?\\))?: (.*)$/gm;\n\nconsole.log = (...args: unknown[]) => {\n connection.console.log(args.map((v) => inspect(v)).join(\" \"));\n};\nconsole.error = (...args: unknown[]) => {\n connection.console.error(args.map((v) => inspect(v)).join(\" \"));\n};\nprocess.on(\"uncaughtException\", console.error);\nprocess.on(\"unhandledRejection\", console.error);\n\nconnection.onInitialize(() => {\n return {\n capabilities: {\n textDocumentSync: TextDocumentSyncKind.Incremental,\n documentFormattingProvider: true,\n definitionProvider: true,\n completionProvider: {\n triggerCharacters: [\".\", \":\", \"<\", \">\", \"@\", \"/\"],\n },\n },\n };\n});\n\nconnection.onInitialized(() => {\n documents.all().forEach((doc) => queueValidation(doc));\n});\n\nconnection.onCompletion((params: CompletionParams): CompletionList => {\n const doc = documents.get(params.textDocument.uri)!;\n const taglib = getTagLibLookup(doc);\n if (!taglib) return CompletionList.create([], true);\n\n const event = parseUntilOffset({\n taglib,\n offset: doc.offsetAt(params.position),\n text: doc.getText(),\n });\n\n const handler =\n event && completionTypes[event.type as keyof typeof completionTypes];\n return (\n (handler && handler(taglib, doc, params, event as any)) ||\n CompletionList.create([], true)\n );\n});\n\nconnection.onDefinition((params) => {\n const doc = documents.get(params.textDocument.uri)!;\n const taglib = getTagLibLookup(doc);\n if (!taglib) return;\n\n const event = parseUntilOffset({\n taglib,\n offset: doc.offsetAt(params.position),\n text: doc.getText(),\n });\n\n const handler =\n event && definitionTypes[event.type as keyof typeof definitionTypes];\n return handler && handler(taglib, doc, params, event as any);\n});\n\nconnection.onDocumentFormatting(\n async ({\n textDocument,\n options,\n }: DocumentFormattingParams): Promise<TextEdit[]> => {\n try {\n const doc = documents.get(textDocument.uri)!;\n const { fsPath, scheme } = URI.parse(textDocument.uri);\n const text = doc.getText();\n const formatted = prettier.format(text, {\n parser: \"marko\",\n filepath: fsPath,\n tabWidth: options.tabSize,\n useTabs: options.insertSpaces === false,\n ...(scheme === \"file\"\n ? await prettier\n .resolveConfig(fsPath, {\n editorconfig: true,\n })\n .catch(() => null)\n : null),\n });\n\n return [\n TextEdit.replace(\n Range.create(doc.positionAt(0), doc.positionAt(text.length)),\n formatted\n ),\n ];\n } catch (e) {\n displayMessage(\"Error\", inspect(e, { colors: false }));\n }\n\n return [\n TextEdit.replace(\n Range.create(Position.create(0, 0), Position.create(0, 0)),\n \"\"\n ),\n ];\n }\n);\n\nconnection.onDidChangeWatchedFiles(() => {\n const clearedCompilers = new Set<Compiler>();\n for (const doc of documents.all()) {\n const { compiler } = getCompilerAndTranslatorForDoc(doc);\n\n if (!clearedCompilers.has(compiler)) {\n clearCaches(compiler);\n clearedCompilers.add(compiler);\n }\n }\n});\n\ndocuments.onDidChangeContent((change) => {\n queueValidation(change.document);\n\n if (change.document.version > 1) {\n clearCaches(getCompilerAndTranslatorForDoc(change.document).compiler);\n }\n});\n\nfunction queueValidation(doc: TextDocument) {\n clearTimeout(diagnosticTimeouts.get(doc)!);\n diagnosticTimeouts.set(\n doc,\n setTimeout(() => {\n const prevDiag = prevDiagnostics.get(doc);\n const nextDiag = doValidate(doc);\n\n if (prevDiag && isDeepStrictEqual(prevDiag, nextDiag)) {\n return;\n }\n\n prevDiagnostics.set(doc, nextDiag);\n connection.sendDiagnostics({\n uri: doc.uri,\n diagnostics: nextDiag,\n });\n }, 800)\n );\n}\n\nfunction doValidate(doc: TextDocument): Diagnostic[] {\n const { fsPath, scheme } = URI.parse(doc.uri);\n\n if (scheme !== \"file\") {\n return [];\n }\n\n const { compiler, translator } = getCompilerAndTranslatorForDoc(doc);\n const diagnostics: Diagnostic[] = [];\n\n try {\n compiler.compileSync(doc.getText(), fsPath, {\n cache: getCacheForCompiler(compiler),\n output: \"source\",\n code: false,\n translator,\n });\n } catch (e) {\n let match: RegExpExecArray | null;\n while ((match = markoErrorRegExp.exec((e as Error).message))) {\n const [, fileName, rawLine, rawCol, msg] = match;\n const line = (parseInt(rawLine, 10) || 1) - 1;\n const col = (parseInt(rawCol, 10) || 1) - 1;\n diagnostics.push(\n Diagnostic.create(\n Range.create(line, col, line, col),\n msg,\n DiagnosticSeverity.Error,\n undefined,\n fileName\n )\n );\n }\n }\n\n return diagnostics;\n}\n\nfunction clearCaches(compiler: Compiler) {\n cacheForCompiler.get(compiler)?.clear();\n compiler.taglib.clearCaches();\n}\n\nfunction getCacheForCompiler(compiler: Compiler) {\n let cache = cacheForCompiler.get(compiler);\n if (!cache) {\n cacheForCompiler.set(compiler, (cache = new Map()));\n }\n return cache;\n}\n\nfunction displayMessage(\n type: \"Information\" | \"Warning\" | \"Error\",\n msg: string\n) {\n setImmediate(() => {\n connection.sendNotification(`show${type}`, msg);\n });\n}\n\ndocuments.listen(connection);\nconnection.listen();\n", "import path from \"path\";\nimport { URI } from \"vscode-uri\";\nimport resolveFrom from \"resolve-from\";\nimport lassoPackageRoot from \"lasso-package-root\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type {\n AttributeDefinition,\n TagDefinition,\n TaglibLookup,\n} from \"@marko/babel-utils\";\n\nimport * as builtinCompiler from \"@marko/compiler\";\nimport * as builtinTranslator from \"@marko/translator-default\";\n\nexport type Compiler = typeof import(\"@marko/compiler\");\nexport { AttributeDefinition, TagDefinition, TaglibLookup };\nexport type CompilerAndTranslator = {\n compiler: Compiler;\n translator: any; // TODO should update the type in `@marko/compiler` to not just be string | undefined\n};\n\nconst compilerAndTranslatorForDoc = new WeakMap<\n TextDocument,\n CompilerAndTranslator\n>();\n\nexport function getCompilerAndTranslatorForDoc(\n doc: TextDocument\n): CompilerAndTranslator {\n let compilerAndTranslator = compilerAndTranslatorForDoc.get(doc);\n if (!compilerAndTranslator) {\n compilerAndTranslatorForDoc.set(\n doc,\n (compilerAndTranslator = loadCompiler(\n path.dirname(URI.parse(doc.uri).fsPath)\n ))\n );\n }\n\n return compilerAndTranslator;\n}\n\nexport function getTagLibLookup(\n document: TextDocument\n): TaglibLookup | undefined {\n try {\n const { compiler, translator } = getCompilerAndTranslatorForDoc(document);\n return compiler.taglib.buildLookup(\n URI.parse(document.uri).fsPath,\n translator\n );\n // eslint-disable-next-line no-empty\n } catch {}\n}\n\nfunction loadCompiler(dir: string): CompilerAndTranslator {\n const rootDir = lassoPackageRoot.getRootDir(dir);\n const pkgPath =\n rootDir && resolveFrom.silent(rootDir, \"@marko/compiler/package.json\");\n const pkg = pkgPath && require(pkgPath);\n\n if (pkg && /^5\\./.test(pkg.version)) {\n try {\n // Ensure translator is available in local package, or fallback to built in compiler.\n let translator = ([] as string[])\n .concat(\n Object.keys(pkg.dependencies),\n Object.keys(pkg.peerDependencies),\n Object.keys(pkg.devDependencies)\n )\n .find((name) => /^marko$|^(@\\/marko\\/|marko-)translator-/.test(name));\n\n if (translator === \"marko\" || !translator) {\n // Fallback to compiler default translator\n translator = require(resolveFrom(dir, \"@marko/compiler/config\"))\n .translator as string;\n }\n\n require(resolveFrom(dir, translator));\n return {\n compiler: require(resolveFrom(dir, \"@marko/compiler\")),\n translator,\n };\n // eslint-disable-next-line no-empty\n } catch {}\n }\n\n return {\n compiler: builtinCompiler,\n translator: builtinTranslator,\n };\n}\n", "import { createParser } from \"htmljs-parser\";\nimport type { TaglibLookup } from \"./compiler\";\n\nexport namespace ParserEvents {\n export interface Error {\n type: \"error\";\n code: string;\n message: string;\n pos: number;\n endPos: number;\n }\n\n export interface OpenTagName extends Tag {\n type: \"openTagName\";\n }\n\n export interface OpenTag extends Tag {\n type: \"openTag\";\n argument: { pos: number; endPos: number; value: string } | undefined;\n params: { pos: number; endPos: number; value: string } | undefined;\n shorthandClassNames:\n | {\n value: string;\n rawParts: { text: string; pos: number; endPos: number }[];\n }[]\n | undefined;\n attributes: Attribute[];\n nestedTags: { [x: string]: Tag } | undefined;\n openTagOnly: boolean;\n selfClosed: boolean;\n tagNameEndPos: number;\n isNestedTag: boolean;\n isRepeated: boolean;\n targetProperty: string | undefined;\n }\n\n export interface CloseTag {\n type: \"closeTag\";\n tagName: string;\n pos: number;\n endPos: number;\n }\n\n export interface Placeholder {\n type: \"placeholder\";\n escape: boolean;\n pos: number;\n endPos: number; // Added manually.\n value: string;\n withinTagName: string;\n withinOpenTag: string;\n withinAttribute: boolean;\n withinBody: boolean;\n withinString: boolean;\n }\n\n // Extended events\n export interface AttributeName {\n type: \"attributeName\";\n tag: OpenTag;\n name: string;\n pos: number;\n endPos: number;\n }\n\n export interface AttributeModifier {\n type: \"attributeModifier\";\n tag: OpenTag;\n name: string;\n modifier: string;\n pos: number;\n endPos: number;\n }\n\n export interface AttributeValue {\n type: \"attributeValue\";\n tag: OpenTag;\n name: string;\n value: string;\n pos: number;\n endPos: number;\n }\n\n export interface Text {\n type: \"text\";\n value: string;\n // Added manually.\n pos: number;\n endPos: number;\n parent: OpenTag | null;\n }\n\n export interface StyleContent {\n type: \"styleContent\";\n language: \"css\" | \"less\" | \"scss\";\n block: boolean;\n content: string;\n pos: number;\n endPos: number;\n }\n\n export type Any =\n | Error\n | OpenTagName\n | OpenTag\n | CloseTag\n | Placeholder\n | AttributeName\n | AttributeModifier\n | AttributeValue\n | Text\n | StyleContent;\n\n interface Tag {\n tagName: string;\n tagNameExpression: string | undefined;\n emptyTagName: boolean; // eg: <.class>\n concise: boolean;\n pos: number;\n endPos: number;\n // Added manually.\n parent: OpenTag | null;\n }\n\n interface Attribute {\n name: string;\n argument: { pos: number; endPos: number; value: string } | undefined;\n value: string | undefined;\n pos: number;\n endPos: number;\n }\n}\n\nconst SUPPORTED_STYLE_LANGS = {\n css: true,\n scss: true,\n less: true,\n};\n\nexport function parseUntilOffset(options: {\n offset: number;\n text: string;\n taglib: TaglibLookup;\n includeErrors?: boolean;\n}) {\n const { offset, text, taglib, includeErrors } = options;\n let result: ParserEvents.Any | null = null;\n let parentTag: ParserEvents.OpenTagName | ParserEvents.OpenTag | null = null;\n const parser = createParser(\n {\n onError: includeErrors && finish,\n onScriptlet: finish,\n onPlaceholder: finish,\n onOpenTagName(ev: ParserEvents.OpenTagName) {\n if (parentTag) {\n ev.parent = parentTag as ParserEvents.OpenTag;\n }\n\n // Currently the parser has the wrong end position here with tag params :\\\n if (!ev.concise) {\n ev.pos += 1;\n }\n\n ev.endPos = ev.pos + ev.tagName.length;\n parentTag = ev;\n finish(ev);\n },\n onOpenTag(ev: ParserEvents.OpenTag) {\n ev.parent = parentTag!.parent;\n parentTag = ev;\n\n if (ev.tagName === \"style\") {\n const firstAttr = ev.attributes[0];\n const isBlock = firstAttr && firstAttr.name.startsWith(\"{\");\n\n if (isBlock) {\n const content = firstAttr.name.slice(1, -1);\n const pos = text.indexOf(content, ev.tagNameEndPos);\n const endPos = pos + content.length;\n const requestedLanguage = (ev.shorthandClassNames &&\n ev.shorthandClassNames[0].rawParts[0] &&\n ev.shorthandClassNames[0].rawParts[0].text) as\n | void\n | keyof typeof SUPPORTED_STYLE_LANGS;\n const language =\n requestedLanguage && SUPPORTED_STYLE_LANGS[requestedLanguage]\n ? requestedLanguage\n : \"css\";\n\n finish({\n type: \"styleContent\",\n language,\n block: true,\n content: text.slice(pos, endPos),\n pos,\n endPos,\n });\n\n return;\n }\n }\n\n let attrEndPos = ev.tagNameEndPos;\n for (const attr of ev.attributes) {\n if (!attr.name) {\n // Legacy dynamic attrs.\n if (attr.value !== undefined) {\n attrEndPos += attr.value.length;\n }\n continue;\n }\n\n if (attr.name.slice(0, 3) === \"...\") {\n attrEndPos = attr.argument ? attr.argument.endPos + 1 : attr.endPos;\n continue;\n }\n\n const attrStartPos = text.indexOf(attr.name, attrEndPos);\n const match = /:(.*)$/.exec(attr.name);\n const modifier = match && match[1];\n let name = attr.name;\n\n if (modifier) {\n name = name.slice(0, name.length - modifier.length - 1);\n const modifierStartPos = attrStartPos + name.length;\n const modifierEndPos = modifierStartPos + modifier.length + 1;\n if (\n finish({\n type: \"attributeModifier\",\n tag: ev,\n name,\n modifier,\n pos: modifierStartPos,\n endPos: modifierEndPos,\n })\n ) {\n return;\n }\n }\n\n const attrNameEndPos = attrStartPos + name.length;\n\n if (\n finish({\n type: \"attributeName\",\n tag: ev,\n name,\n pos: attrStartPos,\n endPos: attrNameEndPos,\n })\n ) {\n return;\n }\n\n if (attr.value) {\n attrEndPos = attr.endPos;\n const valueStartPos = attr.pos + 1; // Add one to account for \"=\".\n if (\n finish({\n type: \"attributeValue\",\n tag: ev,\n name,\n value: text.slice(valueStartPos, attrEndPos), // We use the raw value to ignore things like non standard placeholders.\n pos: valueStartPos,\n endPos: attr.endPos,\n })\n ) {\n break;\n }\n } else {\n attrEndPos = attr.argument ? attr.argument.endPos + 1 : attr.endPos;\n }\n }\n\n finish(ev);\n },\n onText(ev: ParserEvents.Text) {\n ev.endPos = parser.pos as number;\n ev.pos = ev.endPos - ev.value.length;\n\n if (parentTag) {\n ev.parent = parentTag as ParserEvents.OpenTag;\n\n if (parentTag.tagName === \"style\") {\n finish({\n type: \"styleContent\",\n language: \"css\",\n block: false,\n content: ev.value,\n pos: ev.pos,\n endPos: ev.endPos,\n });\n\n return;\n }\n }\n\n finish(ev);\n },\n onCloseTag(ev: ParserEvents.CloseTag) {\n parentTag = parentTag && parentTag.parent;\n finish(ev);\n },\n },\n {\n isOpenTagOnly(ev: string) {\n const tagDef = taglib.getTag(ev);\n return tagDef && tagDef.openTagOnly;\n },\n }\n );\n\n try {\n // We only parse up to the end of the line the user is currently looking for.\n parser.parse(`${text}\\n`);\n } catch (err) {\n return includeErrors\n ? ({\n type: \"error\",\n code: \"UNEXPECTED_TOKEN\",\n message: (err as Error).message,\n pos: parser.pos,\n endPos: parser.pos,\n } as ParserEvents.Error)\n : null;\n }\n\n return result as ParserEvents.Any | null;\n\n function finish(event: ParserEvents.Any): boolean {\n const { type, pos, endPos } = event;\n if (\n !result &&\n (type === \"error\" ||\n (pos != null && pos <= offset && endPos != null && endPos >= offset))\n ) {\n result = event;\n parser.end();\n return true;\n }\n\n return false;\n }\n}\n", "export * from \"./types/attributeModifier\";\nexport * from \"./types/attributeName\";\nexport * from \"./types/closeTag\";\nexport * from \"./types/openTag\";\nexport * from \"./types/openTagName\";\nexport * from \"./types/styleContent\";\n", "import {\n type CompletionParams,\n CompletionList,\n CompletionItemKind,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\n\nexport function attributeModifier(\n _taglib: TaglibLookup,\n _document: TextDocument,\n _params: CompletionParams,\n _event: ParserEvents.OpenTagName\n) {\n return CompletionList.create(\n [\n {\n label: \"scoped\",\n kind: CompletionItemKind.Keyword,\n detail: \"Use to prefix with a unique ID\",\n },\n {\n label: \"no-update\",\n kind: CompletionItemKind.Keyword,\n detail: \"Use to skip future updates to this attribute\",\n },\n ],\n true\n );\n}\n", "import {\n type CompletionParams,\n type CompletionItem,\n type MarkupContent,\n CompletionList,\n CompletionItemKind,\n MarkupKind,\n InsertTextFormat,\n TextEdit,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport { rangeFromEvent } from \"../../utils\";\n\nexport function attributeName(\n taglib: TaglibLookup,\n document: TextDocument,\n _params: CompletionParams,\n event: ParserEvents.AttributeName\n) {\n const completions: CompletionItem[] = [];\n const attrNameRange = rangeFromEvent(document, event);\n const tagDef =\n !event.tag.tagNameExpression && taglib.getTag(event.tag.tagName);\n const tagName = (tagDef && tagDef.name) || \"*\";\n const nestedTagAttrs: { [x: string]: boolean } = {};\n const neverAttrs: Set<string> = new Set();\n\n if (tagDef && tagDef.nestedTags) {\n for (const key in tagDef.nestedTags) {\n const nestedTagDef = tagDef.nestedTags[key];\n nestedTagAttrs[nestedTagDef.targetProperty] = true;\n }\n }\n\n taglib.forEachAttribute(tagName, (attr) => {\n if (attr.type === \"never\") {\n neverAttrs.add(attr.name);\n }\n });\n\n taglib.forEachAttribute(tagName, (attr, parent) => {\n if (\n attr.deprecated ||\n nestedTagAttrs[attr.name] ||\n attr.name === \"*\" ||\n neverAttrs.has(attr.name) ||\n (attr.name[0] === \"_\" &&\n /\\/node_modules\\//.test(attr.filePath || parent.filePath))\n ) {\n return;\n }\n\n const type = attr.type || (attr.html ? \"string\" : null);\n const documentation: MarkupContent = {\n kind: MarkupKind.Markdown,\n value: attr.description || \"\",\n };\n let label = attr.name;\n let snippet = attr.name;\n\n if (attr.enum) {\n snippet += `=\"\\${1|${attr.enum.join()}|}\"$0`;\n } else {\n switch (type) {\n case \"string\":\n snippet += '=\"$1\"$0';\n break;\n case \"function\":\n snippet += \"=($1)$0\";\n break;\n case \"statement\":\n case \"boolean\":\n case \"flag\":\n break;\n default:\n snippet += \"=\";\n break;\n }\n }\n\n const autocomplete =\n attr.autocomplete && Array.isArray(attr.autocomplete)\n ? attr.autocomplete[0]\n : attr.autocomplete;\n\n if (autocomplete) {\n label = autocomplete.displayText || label;\n snippet = autocomplete.snippet || snippet;\n\n if (autocomplete.descriptionMoreURL) {\n if (documentation.value) {\n documentation.value += `\\n\\n`;\n }\n\n documentation.value += `[More Info](${autocomplete.descriptionMoreURL})`;\n }\n }\n\n completions.push({\n label,\n documentation: documentation.value ? documentation : undefined,\n kind: CompletionItemKind.Property,\n insertTextFormat: InsertTextFormat.Snippet,\n textEdit: TextEdit.replace(attrNameRange, snippet),\n });\n });\n\n return CompletionList.create(completions, true);\n}\n", "import fs from \"fs\";\nimport { URI } from \"vscode-uri\";\nimport {\n type CompletionList,\n type InsertReplaceEdit,\n TextEdit,\n Position,\n Range,\n} from \"vscode-languageserver\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"./htmljs-parser\";\n\nexport const START_OF_FILE = Range.create(\n Position.create(0, 0),\n Position.create(0, 0)\n);\n\nexport function findNonControlFlowParent(tag: ParserEvents.OpenTagName) {\n let parent = tag.parent;\n\n while (parent) {\n if (!/^(?:else-)?if|else|for|while$/.test(parent.tagName)) {\n return parent;\n }\n\n parent = parent.parent;\n }\n\n return null;\n}\n\nexport function rangeFromEvent(\n document: TextDocument,\n event: ParserEvents.Any\n) {\n return Range.create(\n document.positionAt(event.pos),\n document.positionAt(event.endPos)\n );\n}\n\nexport function createTextDocument(filename: string): TextDocument {\n const uri = URI.file(filename).toString();\n const content = fs.readFileSync(filename, \"utf-8\");\n return TextDocument.create(uri, \"plaintext\", 0, content);\n}\n\nexport function shiftCompletionRanges(list: CompletionList, offset: Position) {\n list.items.forEach((item) => {\n if (item.additionalTextEdits) {\n item.additionalTextEdits.forEach((edit) =>\n shiftRange(edit.range, offset)\n );\n }\n\n if (item.textEdit) {\n shiftEdit(item.textEdit, offset);\n }\n });\n\n return list;\n}\n\nexport function shiftEdit(\n edit: TextEdit | InsertReplaceEdit,\n offset: Position\n) {\n if (TextEdit.is(edit)) {\n shiftRange(edit.range, offset);\n } else {\n shiftRange(edit.insert, offset);\n shiftRange(edit.replace, offset);\n }\n}\n\nexport function shiftRange(range: Range | undefined, offset: Position) {\n if (range) {\n shiftPosition(range.start, offset);\n shiftPosition(range.end, offset);\n }\n}\n\nexport function shiftPosition(pos: Position, offset: Position) {\n if (pos.line === 0) {\n pos.character += offset.character;\n }\n\n pos.line += offset.line;\n return pos;\n}\n", "import {\n type CompletionParams,\n CompletionList,\n CompletionItemKind,\n InsertTextFormat,\n TextEdit,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport { rangeFromEvent } from \"../../utils\";\n\nexport function closeTag(\n _taglib: TaglibLookup,\n document: TextDocument,\n _params: CompletionParams,\n event: ParserEvents.CloseTag\n) {\n if (event.tagName[0] === \"$\") {\n return;\n }\n\n const closingTagStr = `</${event.tagName}>`;\n\n return CompletionList.create(\n [\n {\n label: closingTagStr,\n kind: CompletionItemKind.Class,\n insertTextFormat: InsertTextFormat.Snippet,\n textEdit: TextEdit.replace(\n rangeFromEvent(document, event),\n closingTagStr\n ),\n },\n ],\n true\n );\n}\n", "import {\n type CompletionParams,\n CompletionList,\n CompletionItemKind,\n InsertTextFormat,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\n\nexport function openTag(\n _taglib: TaglibLookup,\n _document: TextDocument,\n params: CompletionParams,\n event: ParserEvents.OpenTag\n) {\n const triggerCharacter = params.context && params.context.triggerCharacter;\n if (triggerCharacter !== \">\" || event.openTagOnly || event.selfClosed) {\n return;\n }\n\n const closingTagStr = `</${event.tagName[0] === \"$\" ? \"\" : event.tagName}>`;\n\n return CompletionList.create(\n [\n {\n label: closingTagStr,\n kind: CompletionItemKind.Class,\n insertTextFormat: InsertTextFormat.Snippet,\n insertText: `\\n\\t$0\\n${closingTagStr}`,\n },\n ],\n true\n );\n}\n", "import path from \"path\";\nimport { URI } from \"vscode-uri\";\nimport {\n type CompletionParams,\n CompletionItemKind,\n CompletionItem,\n CompletionList,\n InsertTextFormat,\n MarkupKind,\n TextEdit,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup, TagDefinition } from \"../../compiler\";\nimport { rangeFromEvent, findNonControlFlowParent } from \"../../utils\";\n\nexport function openTagName(\n taglib: TaglibLookup,\n document: TextDocument,\n params: CompletionParams,\n event: ParserEvents.OpenTagName\n) {\n const { fsPath: currentTemplateFilePath } = URI.parse(document.uri);\n let tags: TagDefinition[];\n const triggerCharacter =\n (params.context && params.context.triggerCharacter) || event.tagName[0];\n const isAttributeTag = triggerCharacter === \"@\";\n const tagNameRange = rangeFromEvent(document, event);\n\n if (isAttributeTag) {\n const parentTag = findNonControlFlowParent(event);\n const parentTagDef =\n parentTag &&\n !parentTag.tagNameExpression &&\n taglib.getTag(parentTag.tagName);\n tags =\n (parentTagDef &&\n parentTagDef.nestedTags &&\n Object.values(parentTagDef.nestedTags)) ||\n [];\n } else {\n tags = taglib.getTagsSorted().filter((it) => !it.isNestedTag);\n }\n\n return CompletionList.create(\n tags\n .filter((it) => !it.deprecated)\n .filter((it) => it.name !== \"*\")\n .filter(\n (it) => /^[^_]/.test(it.name) || !/\\/node_modules\\//.test(it.filePath)\n )\n .map((it) => {\n let label = it.isNestedTag ? `@${it.name}` : it.name;\n const fileForTag = it.template || it.renderer || it.filePath;\n const fileURIForTag = URI.file(fileForTag).toString();\n const nodeModuleMatch = /\\/node_modules\\/((?:@[^/]+\\/)?[^/]+)/.exec(\n fileForTag\n );\n\n const nodeModuleName = nodeModuleMatch && nodeModuleMatch[1];\n const isCoreTag = nodeModuleName === \"marko\";\n\n const documentation = {\n kind: MarkupKind.Markdown,\n value: it.html\n ? `Built in [<${it.name}>](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/${it.name}) HTML tag.`\n : nodeModuleName\n ? isCoreTag\n ? `Core Marko [<${it.name}>](${fileURIForTag}) tag.`\n : `Custom Marko tag discovered from the [\"${nodeModuleName}\"](${fileURIForTag}) npm package.`\n : `Custom Marko tag discovered from:\\n\\n[${path.relative(\n currentTemplateFilePath,\n fileForTag\n )}](${fileURIForTag})`,\n };\n\n if (it.description) {\n documentation.value += `\\n\\n${it.description}`;\n }\n\n const autocomplete = it.autocomplete && it.autocomplete[0];\n\n if (autocomplete) {\n if (autocomplete.displayText) {\n label = autocomplete.displayText;\n }\n\n if (autocomplete.description) {\n documentation.value += `\\n\\n${autocomplete.description}`;\n }\n\n if (autocomplete.descriptionMoreURL) {\n documentation.value += `\\n\\n[More Info](${autocomplete.descriptionMoreURL})`;\n }\n }\n\n return {\n label,\n documentation,\n kind: CompletionItemKind.Class,\n insertTextFormat: InsertTextFormat.Snippet,\n textEdit: TextEdit.replace(\n tagNameRange,\n (autocomplete && autocomplete.snippet) || label\n ),\n } as CompletionItem;\n }),\n true\n );\n}\n", "import { type CompletionParams, Position } from \"vscode-languageserver\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport {\n getCSSLanguageService,\n getSCSSLanguageService,\n getLESSLanguageService,\n} from \"vscode-css-languageservice\";\n\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport { shiftCompletionRanges, shiftPosition } from \"../../utils\";\n\nconst services = {\n css: getCSSLanguageService,\n scss: getSCSSLanguageService,\n less: getLESSLanguageService,\n};\n\nexport function styleContent(\n _taglib: TaglibLookup,\n document: TextDocument,\n params: CompletionParams,\n event: ParserEvents.StyleContent\n) {\n const service = services[event.language]();\n const startPos = document.positionAt(event.pos);\n const relativePos = shiftPosition(\n params.position,\n Position.create(startPos.line * -1, startPos.character * -1)\n );\n const contentDocument = TextDocument.create(\n document.uri,\n event.language,\n document.version,\n event.content\n );\n\n const completions = service.doComplete(\n contentDocument,\n relativePos,\n service.parseStylesheet(contentDocument)\n );\n\n return shiftCompletionRanges(completions, startPos);\n}\n", "export * from \"./types/attributeName\";\nexport * from \"./types/openTagName\";\n", "import { URI } from \"vscode-uri\";\nimport {\n type TextDocumentPositionParams,\n Range,\n LocationLink,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport RegExpBuilder from \"../../regexp-builder\";\nimport { START_OF_FILE, createTextDocument, rangeFromEvent } from \"../../utils\";\n\nexport function attributeName(\n taglib: TaglibLookup,\n document: TextDocument,\n _params: TextDocumentPositionParams,\n event: ParserEvents.AttributeName\n) {\n const tagName = event.tag.tagNameExpression ? undefined : event.tag.tagName;\n const tagDef = tagName && taglib.getTag(tagName);\n const attrDef = taglib.getAttribute(tagName || \"*\", event.name);\n let range = START_OF_FILE;\n\n if (!attrDef) {\n return;\n }\n\n const attrEntryFile = attrDef.filePath || (tagDef && tagDef.filePath);\n\n if (!attrEntryFile) {\n return;\n }\n\n if (/\\/marko(?:-tag)?\\.json$/.test(attrEntryFile)) {\n const tagDefDoc = createTextDocument(attrEntryFile);\n const match = RegExpBuilder`/\"@${event.name}\"\\s*:\\s*[^\\r\\n,]+/g`.exec(\n tagDefDoc.getText()\n );\n\n if (match && match.index) {\n range = Range.create(\n tagDefDoc.positionAt(match.index),\n tagDefDoc.positionAt(match.index + match[0].length)\n );\n }\n }\n\n return [\n LocationLink.create(\n URI.file(attrEntryFile).toString(),\n range,\n range,\n rangeFromEvent(document, event)\n ),\n ];\n}\n", "export default function RegExpBuilder(\n strings: TemplateStringsArray,\n ...expressions: [unknown, ...unknown[]]\n) {\n let i = 0;\n let src = strings[0].slice(strings[0].indexOf(\"/\") + 1);\n const secondLastExprIndex = strings.length - 2;\n\n for (; i < secondLastExprIndex; i++) {\n src += escape(expressions[i]) + strings[i + 1];\n }\n\n src += escape(expressions[i]);\n\n const lastStr = strings[i + 1];\n const lastSlashIndex = lastStr.lastIndexOf(\"/\");\n let flags = \"\";\n\n if (lastSlashIndex === -1) {\n src += lastStr;\n } else {\n flags = lastStr.slice(lastSlashIndex + 1);\n src += lastStr.slice(0, lastSlashIndex);\n }\n\n return new RegExp(src, flags);\n}\n\nfunction escape(val: unknown) {\n return String(val).replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n}\n", "import { URI } from \"vscode-uri\";\nimport {\n type TextDocumentPositionParams,\n Range,\n LocationLink,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup, TagDefinition } from \"../../compiler\";\nimport RegExpBuilder from \"../../regexp-builder\";\nimport {\n START_OF_FILE,\n findNonControlFlowParent,\n createTextDocument,\n rangeFromEvent,\n} from \"../../utils\";\n\nexport function openTagName(\n taglib: TaglibLookup,\n document: TextDocument,\n _params: TextDocumentPositionParams,\n event: ParserEvents.OpenTagName\n) {\n let tagDef: TagDefinition | null | undefined;\n let range = START_OF_FILE;\n const isAttributeTag = event.tagName[0] === \"@\";\n\n if (isAttributeTag) {\n const parentTag = findNonControlFlowParent(event);\n tagDef =\n parentTag &&\n (parentTag.tagNameExpression\n ? undefined\n : taglib.getTag(parentTag.tagName));\n } else {\n tagDef = taglib.getTag(event.tagName);\n }\n\n if (!tagDef) {\n return;\n }\n\n const tagEntryFile = tagDef.template || tagDef.renderer || tagDef.filePath;\n\n if (/\\/marko(?:-tag)?\\.json$/.test(tagEntryFile)) {\n const tagDefDoc = createTextDocument(tagEntryFile);\n const match = RegExpBuilder`/\"<${event.tagName}>\"\\s*:\\s*[^\\r\\n,]+/g`.exec(\n tagDefDoc.getText()\n );\n\n if (match && match.index) {\n range = Range.create(\n tagDefDoc.positionAt(match.index),\n tagDefDoc.positionAt(match.index + match[0].length)\n );\n }\n }\n\n return [\n LocationLink.create(\n URI.file(tagEntryFile).toString(),\n range,\n range,\n rangeFromEvent(document, event)\n ),\n ];\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n createConnection,\n ProposedFeatures,\n Range,\n Position,\n CompletionList,\n CompletionParams,\n Diagnostic,\n DiagnosticSeverity,\n DocumentFormattingParams,\n TextDocuments,\n TextEdit,\n TextDocumentSyncKind,\n} from \"vscode-languageserver/node\";\nimport { URI } from \"vscode-uri\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport * as prettier from \"prettier\";\nimport * as markoPrettier from \"prettier-plugin-marko\";\nimport { inspect, isDeepStrictEqual } from \"util\";\nimport {\n getTagLibLookup,\n getCompilerAndTranslatorForDoc,\n Compiler,\n} from \"./utils/compiler\";\nimport { parseUntilOffset } from \"./utils/htmljs-parser\";\nimport * as completionTypes from \"./utils/completions\";\nimport * as definitionTypes from \"./utils/definitions\";\n\nif (\n typeof require !== \"undefined\" &&\n require.extensions &&\n !(\".ts\" in require.extensions)\n) {\n // Prevent compiler hooks written in typescript to explode the language server.\n require.extensions[\".ts\"] = undefined;\n}\n\nconst cacheForCompiler = new WeakMap<Compiler, Map<unknown, unknown>>();\nconst connection = createConnection(ProposedFeatures.all);\nconst prevDiagnostics = new WeakMap<TextDocument, Diagnostic[]>();\nconst diagnosticTimeouts = new WeakMap<\n TextDocument,\n ReturnType<typeof setTimeout>\n>();\nconst documents = new TextDocuments(TextDocument);\nconst markoErrorRegExp = /^(.+?)(?:\\((\\d+)(?:\\s*,\\s*(\\d+))?\\))?: (.*)$/gm;\n\nconsole.log = (...args: unknown[]) => {\n connection.console.log(args.map((v) => inspect(v)).join(\" \"));\n};\nconsole.error = (...args: unknown[]) => {\n connection.console.error(args.map((v) => inspect(v)).join(\" \"));\n};\nprocess.on(\"uncaughtException\", console.error);\nprocess.on(\"unhandledRejection\", console.error);\n\nconnection.onInitialize(() => {\n return {\n capabilities: {\n textDocumentSync: TextDocumentSyncKind.Incremental,\n documentFormattingProvider: true,\n definitionProvider: true,\n completionProvider: {\n triggerCharacters: [\".\", \":\", \"<\", \">\", \"@\", \"/\"],\n },\n },\n };\n});\n\nconnection.onInitialized(() => {\n documents.all().forEach((doc) => queueValidation(doc));\n});\n\nconnection.onCompletion((params: CompletionParams): CompletionList => {\n const doc = documents.get(params.textDocument.uri)!;\n const taglib = getTagLibLookup(doc);\n if (!taglib) return CompletionList.create([], true);\n\n const event = parseUntilOffset({\n taglib,\n offset: doc.offsetAt(params.position),\n text: doc.getText(),\n });\n\n const handler =\n event && completionTypes[event.type as keyof typeof completionTypes];\n return (\n (handler && handler(taglib, doc, params, event as any)) ||\n CompletionList.create([], true)\n );\n});\n\nconnection.onDefinition((params) => {\n const doc = documents.get(params.textDocument.uri)!;\n const taglib = getTagLibLookup(doc);\n if (!taglib) return;\n\n const event = parseUntilOffset({\n taglib,\n offset: doc.offsetAt(params.position),\n text: doc.getText(),\n });\n\n const handler =\n event && definitionTypes[event.type as keyof typeof definitionTypes];\n return handler && handler(taglib, doc, params, event as any);\n});\n\nconnection.onDocumentFormatting(\n async ({\n textDocument,\n options,\n }: DocumentFormattingParams): Promise<TextEdit[]> => {\n try {\n const doc = documents.get(textDocument.uri)!;\n const { fsPath, scheme } = URI.parse(textDocument.uri);\n const text = doc.getText();\n const formatted = prettier.format(text, {\n parser: \"marko\",\n filepath: fsPath,\n plugins: [markoPrettier],\n tabWidth: options.tabSize,\n useTabs: options.insertSpaces === false,\n ...(scheme === \"file\"\n ? await prettier\n .resolveConfig(fsPath, {\n editorconfig: true,\n })\n .catch(() => null)\n : null),\n });\n\n return [\n TextEdit.replace(\n Range.create(doc.positionAt(0), doc.positionAt(text.length)),\n formatted\n ),\n ];\n } catch (e) {\n displayMessage(\"Error\", inspect(e, { colors: false }));\n }\n\n return [\n TextEdit.replace(\n Range.create(Position.create(0, 0), Position.create(0, 0)),\n \"\"\n ),\n ];\n }\n);\n\nconnection.onDidChangeWatchedFiles(() => {\n const clearedCompilers = new Set<Compiler>();\n for (const doc of documents.all()) {\n const { compiler } = getCompilerAndTranslatorForDoc(doc);\n\n if (!clearedCompilers.has(compiler)) {\n clearCaches(compiler);\n clearedCompilers.add(compiler);\n }\n }\n});\n\ndocuments.onDidChangeContent((change) => {\n queueValidation(change.document);\n\n if (change.document.version > 1) {\n clearCaches(getCompilerAndTranslatorForDoc(change.document).compiler);\n }\n});\n\nfunction queueValidation(doc: TextDocument) {\n clearTimeout(diagnosticTimeouts.get(doc)!);\n diagnosticTimeouts.set(\n doc,\n setTimeout(() => {\n const prevDiag = prevDiagnostics.get(doc);\n const nextDiag = doValidate(doc);\n\n if (prevDiag && isDeepStrictEqual(prevDiag, nextDiag)) {\n return;\n }\n\n prevDiagnostics.set(doc, nextDiag);\n connection.sendDiagnostics({\n uri: doc.uri,\n diagnostics: nextDiag,\n });\n }, 800)\n );\n}\n\nfunction doValidate(doc: TextDocument): Diagnostic[] {\n const { fsPath, scheme } = URI.parse(doc.uri);\n\n if (scheme !== \"file\") {\n return [];\n }\n\n const { compiler, translator } = getCompilerAndTranslatorForDoc(doc);\n const diagnostics: Diagnostic[] = [];\n\n try {\n compiler.compileSync(doc.getText(), fsPath, {\n cache: getCacheForCompiler(compiler),\n output: \"source\",\n code: false,\n translator,\n });\n } catch (e) {\n let match: RegExpExecArray | null;\n while ((match = markoErrorRegExp.exec((e as Error).message))) {\n const [, fileName, rawLine, rawCol, msg] = match;\n const line = (parseInt(rawLine, 10) || 1) - 1;\n const col = (parseInt(rawCol, 10) || 1) - 1;\n diagnostics.push(\n Diagnostic.create(\n Range.create(line, col, line, col),\n msg,\n DiagnosticSeverity.Error,\n undefined,\n fileName\n )\n );\n }\n }\n\n return diagnostics;\n}\n\nfunction clearCaches(compiler: Compiler) {\n cacheForCompiler.get(compiler)?.clear();\n compiler.taglib.clearCaches();\n}\n\nfunction getCacheForCompiler(compiler: Compiler) {\n let cache = cacheForCompiler.get(compiler);\n if (!cache) {\n cacheForCompiler.set(compiler, (cache = new Map()));\n }\n return cache;\n}\n\nfunction displayMessage(\n type: \"Information\" | \"Warning\" | \"Error\",\n msg: string\n) {\n setImmediate(() => {\n connection.sendNotification(`show${type}`, msg);\n });\n}\n\ndocuments.listen(connection);\nconnection.listen();\n", "import path from \"path\";\nimport { URI } from \"vscode-uri\";\nimport resolveFrom from \"resolve-from\";\nimport lassoPackageRoot from \"lasso-package-root\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type {\n AttributeDefinition,\n TagDefinition,\n TaglibLookup,\n} from \"@marko/babel-utils\";\n\nimport * as builtinCompiler from \"@marko/compiler\";\nimport * as builtinTranslator from \"@marko/translator-default\";\nbuiltinCompiler.configure({ translator: builtinTranslator as any });\n\nexport type Compiler = typeof import(\"@marko/compiler\");\nexport { AttributeDefinition, TagDefinition, TaglibLookup };\nexport type CompilerAndTranslator = {\n compiler: Compiler;\n translator: any; // TODO should update the type in `@marko/compiler` to not just be string | undefined\n};\n\nconst compilerAndTranslatorForDoc = new WeakMap<\n TextDocument,\n CompilerAndTranslator\n>();\n\nexport function getCompilerAndTranslatorForDoc(\n doc: TextDocument\n): CompilerAndTranslator {\n let compilerAndTranslator = compilerAndTranslatorForDoc.get(doc);\n if (!compilerAndTranslator) {\n compilerAndTranslatorForDoc.set(\n doc,\n (compilerAndTranslator = loadCompiler(\n path.dirname(URI.parse(doc.uri).fsPath)\n ))\n );\n }\n\n return compilerAndTranslator;\n}\n\nexport function getTagLibLookup(\n document: TextDocument\n): TaglibLookup | undefined {\n try {\n const { compiler, translator } = getCompilerAndTranslatorForDoc(document);\n return compiler.taglib.buildLookup(\n URI.parse(document.uri).fsPath,\n translator\n );\n // eslint-disable-next-line no-empty\n } catch {}\n}\n\nfunction loadCompiler(dir: string): CompilerAndTranslator {\n const rootDir = lassoPackageRoot.getRootDir(dir);\n const pkgPath =\n rootDir && resolveFrom.silent(rootDir, \"@marko/compiler/package.json\");\n const pkg = pkgPath && require(pkgPath);\n\n if (pkg && /^5\\./.test(pkg.version)) {\n try {\n // Ensure translator is available in local package, or fallback to built in compiler.\n let translator = ([] as string[])\n .concat(\n Object.keys(pkg.dependencies),\n Object.keys(pkg.peerDependencies),\n Object.keys(pkg.devDependencies)\n )\n .find((name) => /^marko$|^(@\\/marko\\/|marko-)translator-/.test(name));\n\n if (translator === \"marko\" || !translator) {\n // Fallback to compiler default translator\n translator = require(resolveFrom(dir, \"@marko/compiler/config\"))\n .translator as string;\n }\n\n require(resolveFrom(dir, translator));\n return {\n compiler: require(resolveFrom(dir, \"@marko/compiler\")),\n translator,\n };\n // eslint-disable-next-line no-empty\n } catch {}\n }\n\n return {\n compiler: builtinCompiler,\n translator: builtinTranslator,\n };\n}\n", "import { createParser } from \"htmljs-parser\";\nimport type { TaglibLookup } from \"./compiler\";\n\nexport namespace ParserEvents {\n export interface Error {\n type: \"error\";\n code: string;\n message: string;\n pos: number;\n endPos: number;\n }\n\n export interface OpenTagName extends Tag {\n type: \"openTagName\";\n }\n\n export interface OpenTag extends Tag {\n type: \"openTag\";\n argument: { pos: number; endPos: number; value: string } | undefined;\n params: { pos: number; endPos: number; value: string } | undefined;\n shorthandClassNames:\n | {\n value: string;\n rawParts: { text: string; pos: number; endPos: number }[];\n }[]\n | undefined;\n attributes: Attribute[];\n nestedTags: { [x: string]: Tag } | undefined;\n openTagOnly: boolean;\n selfClosed: boolean;\n tagNameEndPos: number;\n isNestedTag: boolean;\n isRepeated: boolean;\n targetProperty: string | undefined;\n }\n\n export interface CloseTag {\n type: \"closeTag\";\n tagName: string;\n pos: number;\n endPos: number;\n }\n\n export interface Placeholder {\n type: \"placeholder\";\n escape: boolean;\n pos: number;\n endPos: number; // Added manually.\n value: string;\n withinTagName: string;\n withinOpenTag: string;\n withinAttribute: boolean;\n withinBody: boolean;\n withinString: boolean;\n }\n\n // Extended events\n export interface AttributeName {\n type: \"attributeName\";\n tag: OpenTag;\n name: string;\n pos: number;\n endPos: number;\n }\n\n export interface AttributeModifier {\n type: \"attributeModifier\";\n tag: OpenTag;\n name: string;\n modifier: string;\n pos: number;\n endPos: number;\n }\n\n export interface AttributeValue {\n type: \"attributeValue\";\n tag: OpenTag;\n name: string;\n value: string;\n pos: number;\n endPos: number;\n }\n\n export interface Text {\n type: \"text\";\n value: string;\n // Added manually.\n pos: number;\n endPos: number;\n parent: OpenTag | null;\n }\n\n export interface StyleContent {\n type: \"styleContent\";\n language: \"css\" | \"less\" | \"scss\";\n block: boolean;\n content: string;\n pos: number;\n endPos: number;\n }\n\n export type Any =\n | Error\n | OpenTagName\n | OpenTag\n | CloseTag\n | Placeholder\n | AttributeName\n | AttributeModifier\n | AttributeValue\n | Text\n | StyleContent;\n\n interface Tag {\n tagName: string;\n tagNameExpression: string | undefined;\n emptyTagName: boolean; // eg: <.class>\n concise: boolean;\n pos: number;\n endPos: number;\n // Added manually.\n parent: OpenTag | null;\n }\n\n interface Attribute {\n name: string;\n argument: { pos: number; endPos: number; value: string } | undefined;\n value: string | undefined;\n pos: number;\n endPos: number;\n }\n}\n\nconst SUPPORTED_STYLE_LANGS = {\n css: true,\n scss: true,\n less: true,\n};\n\nexport function parseUntilOffset(options: {\n offset: number;\n text: string;\n taglib: TaglibLookup;\n includeErrors?: boolean;\n}) {\n const { offset, text, taglib, includeErrors } = options;\n let result: ParserEvents.Any | null = null;\n let parentTag: ParserEvents.OpenTagName | ParserEvents.OpenTag | null = null;\n const parser = createParser(\n {\n onError: includeErrors && finish,\n onScriptlet: finish,\n onPlaceholder: finish,\n onOpenTagName(ev: ParserEvents.OpenTagName) {\n if (parentTag) {\n ev.parent = parentTag as ParserEvents.OpenTag;\n }\n\n // Currently the parser has the wrong end position here with tag params :\\\n if (!ev.concise) {\n ev.pos += 1;\n }\n\n ev.endPos = ev.pos + ev.tagName.length;\n parentTag = ev;\n finish(ev);\n },\n onOpenTag(ev: ParserEvents.OpenTag) {\n ev.parent = parentTag!.parent;\n parentTag = ev;\n\n if (ev.tagName === \"style\") {\n const firstAttr = ev.attributes[0];\n const isBlock = firstAttr && firstAttr.name.startsWith(\"{\");\n\n if (isBlock) {\n const content = firstAttr.name.slice(1, -1);\n const pos = text.indexOf(content, ev.tagNameEndPos);\n const endPos = pos + content.length;\n const requestedLanguage = (ev.shorthandClassNames &&\n ev.shorthandClassNames[0].rawParts[0] &&\n ev.shorthandClassNames[0].rawParts[0].text) as\n | void\n | keyof typeof SUPPORTED_STYLE_LANGS;\n const language =\n requestedLanguage && SUPPORTED_STYLE_LANGS[requestedLanguage]\n ? requestedLanguage\n : \"css\";\n\n finish({\n type: \"styleContent\",\n language,\n block: true,\n content: text.slice(pos, endPos),\n pos,\n endPos,\n });\n\n return;\n }\n }\n\n let attrEndPos = ev.tagNameEndPos;\n for (const attr of ev.attributes) {\n if (!attr.name) {\n // Legacy dynamic attrs.\n if (attr.value !== undefined) {\n attrEndPos += attr.value.length;\n }\n continue;\n }\n\n if (attr.name.slice(0, 3) === \"...\") {\n attrEndPos = attr.argument ? attr.argument.endPos + 1 : attr.endPos;\n continue;\n }\n\n const attrStartPos = text.indexOf(attr.name, attrEndPos);\n const match = /:(.*)$/.exec(attr.name);\n const modifier = match && match[1];\n let name = attr.name;\n\n if (modifier) {\n name = name.slice(0, name.length - modifier.length - 1);\n const modifierStartPos = attrStartPos + name.length;\n const modifierEndPos = modifierStartPos + modifier.length + 1;\n if (\n finish({\n type: \"attributeModifier\",\n tag: ev,\n name,\n modifier,\n pos: modifierStartPos,\n endPos: modifierEndPos,\n })\n ) {\n return;\n }\n }\n\n const attrNameEndPos = attrStartPos + name.length;\n\n if (\n finish({\n type: \"attributeName\",\n tag: ev,\n name,\n pos: attrStartPos,\n endPos: attrNameEndPos,\n })\n ) {\n return;\n }\n\n if (attr.value) {\n attrEndPos = attr.endPos;\n const valueStartPos = attr.pos + 1; // Add one to account for \"=\".\n if (\n finish({\n type: \"attributeValue\",\n tag: ev,\n name,\n value: text.slice(valueStartPos, attrEndPos), // We use the raw value to ignore things like non standard placeholders.\n pos: valueStartPos,\n endPos: attr.endPos,\n })\n ) {\n break;\n }\n } else {\n attrEndPos = attr.argument ? attr.argument.endPos + 1 : attr.endPos;\n }\n }\n\n finish(ev);\n },\n onText(ev: ParserEvents.Text) {\n ev.endPos = parser.pos as number;\n ev.pos = ev.endPos - ev.value.length;\n\n if (parentTag) {\n ev.parent = parentTag as ParserEvents.OpenTag;\n\n if (parentTag.tagName === \"style\") {\n finish({\n type: \"styleContent\",\n language: \"css\",\n block: false,\n content: ev.value,\n pos: ev.pos,\n endPos: ev.endPos,\n });\n\n return;\n }\n }\n\n finish(ev);\n },\n onCloseTag(ev: ParserEvents.CloseTag) {\n parentTag = parentTag && parentTag.parent;\n finish(ev);\n },\n },\n {\n isOpenTagOnly(ev: string) {\n const tagDef = taglib.getTag(ev);\n return tagDef && tagDef.openTagOnly;\n },\n }\n );\n\n try {\n // We only parse up to the end of the line the user is currently looking for.\n parser.parse(`${text}\\n`);\n } catch (err) {\n return includeErrors\n ? ({\n type: \"error\",\n code: \"UNEXPECTED_TOKEN\",\n message: (err as Error).message,\n pos: parser.pos,\n endPos: parser.pos,\n } as ParserEvents.Error)\n : null;\n }\n\n return result as ParserEvents.Any | null;\n\n function finish(event: ParserEvents.Any): boolean {\n const { type, pos, endPos } = event;\n if (\n !result &&\n (type === \"error\" ||\n (pos != null && pos <= offset && endPos != null && endPos >= offset))\n ) {\n result = event;\n parser.end();\n return true;\n }\n\n return false;\n }\n}\n", "export * from \"./types/attributeModifier\";\nexport * from \"./types/attributeName\";\nexport * from \"./types/closeTag\";\nexport * from \"./types/openTag\";\nexport * from \"./types/openTagName\";\nexport * from \"./types/styleContent\";\n", "import {\n type CompletionParams,\n CompletionList,\n CompletionItemKind,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\n\nexport function attributeModifier(\n _taglib: TaglibLookup,\n _document: TextDocument,\n _params: CompletionParams,\n _event: ParserEvents.OpenTagName\n) {\n return CompletionList.create(\n [\n {\n label: \"scoped\",\n kind: CompletionItemKind.Keyword,\n detail: \"Use to prefix with a unique ID\",\n },\n {\n label: \"no-update\",\n kind: CompletionItemKind.Keyword,\n detail: \"Use to skip future updates to this attribute\",\n },\n ],\n true\n );\n}\n", "import {\n type CompletionParams,\n type CompletionItem,\n type MarkupContent,\n CompletionList,\n CompletionItemKind,\n MarkupKind,\n InsertTextFormat,\n TextEdit,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport { rangeFromEvent } from \"../../utils\";\n\nexport function attributeName(\n taglib: TaglibLookup,\n document: TextDocument,\n _params: CompletionParams,\n event: ParserEvents.AttributeName\n) {\n const completions: CompletionItem[] = [];\n const attrNameRange = rangeFromEvent(document, event);\n const tagDef =\n !event.tag.tagNameExpression && taglib.getTag(event.tag.tagName);\n const tagName = (tagDef && tagDef.name) || \"*\";\n const nestedTagAttrs: { [x: string]: boolean } = {};\n const neverAttrs: Set<string> = new Set();\n\n if (tagDef && tagDef.nestedTags) {\n for (const key in tagDef.nestedTags) {\n const nestedTagDef = tagDef.nestedTags[key];\n nestedTagAttrs[nestedTagDef.targetProperty] = true;\n }\n }\n\n taglib.forEachAttribute(tagName, (attr) => {\n if (attr.type === \"never\") {\n neverAttrs.add(attr.name);\n }\n });\n\n taglib.forEachAttribute(tagName, (attr, parent) => {\n if (\n attr.deprecated ||\n nestedTagAttrs[attr.name] ||\n attr.name === \"*\" ||\n neverAttrs.has(attr.name) ||\n (attr.name[0] === \"_\" &&\n /\\/node_modules\\//.test(attr.filePath || parent.filePath))\n ) {\n return;\n }\n\n const type = attr.type || (attr.html ? \"string\" : null);\n const documentation: MarkupContent = {\n kind: MarkupKind.Markdown,\n value: attr.description || \"\",\n };\n let label = attr.name;\n let snippet = attr.name;\n\n if (attr.enum) {\n snippet += `=\"\\${1|${attr.enum.join()}|}\"$0`;\n } else {\n switch (type) {\n case \"string\":\n snippet += '=\"$1\"$0';\n break;\n case \"function\":\n snippet += \"=($1)$0\";\n break;\n case \"statement\":\n case \"boolean\":\n case \"flag\":\n break;\n default:\n snippet += \"=\";\n break;\n }\n }\n\n const autocomplete =\n attr.autocomplete && Array.isArray(attr.autocomplete)\n ? attr.autocomplete[0]\n : attr.autocomplete;\n\n if (autocomplete) {\n label = autocomplete.displayText || label;\n snippet = autocomplete.snippet || snippet;\n\n if (autocomplete.descriptionMoreURL) {\n if (documentation.value) {\n documentation.value += `\\n\\n`;\n }\n\n documentation.value += `[More Info](${autocomplete.descriptionMoreURL})`;\n }\n }\n\n completions.push({\n label,\n documentation: documentation.value ? documentation : undefined,\n kind: CompletionItemKind.Property,\n insertTextFormat: InsertTextFormat.Snippet,\n textEdit: TextEdit.replace(attrNameRange, snippet),\n });\n });\n\n return CompletionList.create(completions, true);\n}\n", "import fs from \"fs\";\nimport { URI } from \"vscode-uri\";\nimport {\n type CompletionList,\n type InsertReplaceEdit,\n TextEdit,\n Position,\n Range,\n} from \"vscode-languageserver\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"./htmljs-parser\";\n\nexport const START_OF_FILE = Range.create(\n Position.create(0, 0),\n Position.create(0, 0)\n);\n\nexport function findNonControlFlowParent(tag: ParserEvents.OpenTagName) {\n let parent = tag.parent;\n\n while (parent) {\n if (!/^(?:else-)?if|else|for|while$/.test(parent.tagName)) {\n return parent;\n }\n\n parent = parent.parent;\n }\n\n return null;\n}\n\nexport function rangeFromEvent(\n document: TextDocument,\n event: ParserEvents.Any\n) {\n return Range.create(\n document.positionAt(event.pos),\n document.positionAt(event.endPos)\n );\n}\n\nexport function createTextDocument(filename: string): TextDocument {\n const uri = URI.file(filename).toString();\n const content = fs.readFileSync(filename, \"utf-8\");\n return TextDocument.create(uri, \"plaintext\", 0, content);\n}\n\nexport function shiftCompletionRanges(list: CompletionList, offset: Position) {\n list.items.forEach((item) => {\n if (item.additionalTextEdits) {\n item.additionalTextEdits.forEach((edit) =>\n shiftRange(edit.range, offset)\n );\n }\n\n if (item.textEdit) {\n shiftEdit(item.textEdit, offset);\n }\n });\n\n return list;\n}\n\nexport function shiftEdit(\n edit: TextEdit | InsertReplaceEdit,\n offset: Position\n) {\n if (TextEdit.is(edit)) {\n shiftRange(edit.range, offset);\n } else {\n shiftRange(edit.insert, offset);\n shiftRange(edit.replace, offset);\n }\n}\n\nexport function shiftRange(range: Range | undefined, offset: Position) {\n if (range) {\n shiftPosition(range.start, offset);\n shiftPosition(range.end, offset);\n }\n}\n\nexport function shiftPosition(pos: Position, offset: Position) {\n if (pos.line === 0) {\n pos.character += offset.character;\n }\n\n pos.line += offset.line;\n return pos;\n}\n", "import {\n type CompletionParams,\n CompletionList,\n CompletionItemKind,\n InsertTextFormat,\n TextEdit,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport { rangeFromEvent } from \"../../utils\";\n\nexport function closeTag(\n _taglib: TaglibLookup,\n document: TextDocument,\n _params: CompletionParams,\n event: ParserEvents.CloseTag\n) {\n if (event.tagName[0] === \"$\") {\n return;\n }\n\n const closingTagStr = `</${event.tagName}>`;\n\n return CompletionList.create(\n [\n {\n label: closingTagStr,\n kind: CompletionItemKind.Class,\n insertTextFormat: InsertTextFormat.Snippet,\n textEdit: TextEdit.replace(\n rangeFromEvent(document, event),\n closingTagStr\n ),\n },\n ],\n true\n );\n}\n", "import {\n type CompletionParams,\n CompletionList,\n CompletionItemKind,\n InsertTextFormat,\n Range,\n Position,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\n\nexport function openTag(\n _taglib: TaglibLookup,\n doc: TextDocument,\n params: CompletionParams,\n event: ParserEvents.OpenTag\n) {\n const triggerCharacter =\n (params.context && params.context.triggerCharacter) ||\n doc.getText(\n Range.create(\n Position.create(params.position.line, params.position.character - 1),\n params.position\n )\n );\n\n if (triggerCharacter !== \">\" || event.openTagOnly || event.selfClosed) {\n return;\n }\n\n const closingTagStr = `</${event.tagName[0] === \"$\" ? \"\" : event.tagName}>`;\n\n return CompletionList.create(\n [\n {\n label: closingTagStr,\n kind: CompletionItemKind.Class,\n insertTextFormat: InsertTextFormat.Snippet,\n insertText: `\\n\\t$0\\n${closingTagStr}`,\n },\n ],\n true\n );\n}\n", "import path from \"path\";\nimport { URI } from \"vscode-uri\";\nimport {\n type CompletionParams,\n CompletionItemKind,\n CompletionItem,\n CompletionList,\n InsertTextFormat,\n MarkupKind,\n TextEdit,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup, TagDefinition } from \"../../compiler\";\nimport { rangeFromEvent, findNonControlFlowParent } from \"../../utils\";\n\nexport function openTagName(\n taglib: TaglibLookup,\n document: TextDocument,\n params: CompletionParams,\n event: ParserEvents.OpenTagName\n) {\n const { fsPath: currentTemplateFilePath } = URI.parse(document.uri);\n let tags: TagDefinition[];\n const triggerCharacter =\n (params.context && params.context.triggerCharacter) || event.tagName[0];\n const isAttributeTag = triggerCharacter === \"@\";\n const tagNameRange = rangeFromEvent(document, event);\n\n if (isAttributeTag) {\n const parentTag = findNonControlFlowParent(event);\n const parentTagDef =\n parentTag &&\n !parentTag.tagNameExpression &&\n taglib.getTag(parentTag.tagName);\n tags =\n (parentTagDef &&\n parentTagDef.nestedTags &&\n Object.values(parentTagDef.nestedTags)) ||\n [];\n } else {\n tags = taglib.getTagsSorted().filter((it) => !it.isNestedTag);\n }\n\n return CompletionList.create(\n tags\n .filter((it) => !it.deprecated)\n .filter((it) => it.name !== \"*\")\n .filter(\n (it) => /^[^_]/.test(it.name) || !/\\/node_modules\\//.test(it.filePath)\n )\n .map((it) => {\n let label = it.isNestedTag ? `@${it.name}` : it.name;\n const fileForTag = it.template || it.renderer || it.filePath;\n const fileURIForTag = URI.file(fileForTag).toString();\n const nodeModuleMatch = /\\/node_modules\\/((?:@[^/]+\\/)?[^/]+)/.exec(\n fileForTag\n );\n\n const nodeModuleName = nodeModuleMatch && nodeModuleMatch[1];\n const isCoreTag = nodeModuleName === \"marko\";\n\n const documentation = {\n kind: MarkupKind.Markdown,\n value: it.html\n ? `Built in [<${it.name}>](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/${it.name}) HTML tag.`\n : nodeModuleName\n ? isCoreTag\n ? `Core Marko [<${it.name}>](${fileURIForTag}) tag.`\n : `Custom Marko tag discovered from the [\"${nodeModuleName}\"](${fileURIForTag}) npm package.`\n : `Custom Marko tag discovered from:\\n\\n[${path.relative(\n currentTemplateFilePath,\n fileForTag\n )}](${fileURIForTag})`,\n };\n\n if (it.description) {\n documentation.value += `\\n\\n${it.description}`;\n }\n\n const autocomplete = it.autocomplete && it.autocomplete[0];\n\n if (autocomplete) {\n if (autocomplete.displayText) {\n label = autocomplete.displayText;\n }\n\n if (autocomplete.description) {\n documentation.value += `\\n\\n${autocomplete.description}`;\n }\n\n if (autocomplete.descriptionMoreURL) {\n documentation.value += `\\n\\n[More Info](${autocomplete.descriptionMoreURL})`;\n }\n }\n\n return {\n label,\n documentation,\n kind: CompletionItemKind.Class,\n insertTextFormat: InsertTextFormat.Snippet,\n textEdit: TextEdit.replace(\n tagNameRange,\n (autocomplete && autocomplete.snippet) || label\n ),\n } as CompletionItem;\n }),\n true\n );\n}\n", "import { type CompletionParams, Position } from \"vscode-languageserver\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport {\n getCSSLanguageService,\n getSCSSLanguageService,\n getLESSLanguageService,\n} from \"vscode-css-languageservice\";\n\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport { shiftCompletionRanges, shiftPosition } from \"../../utils\";\n\nconst services = {\n css: getCSSLanguageService,\n scss: getSCSSLanguageService,\n less: getLESSLanguageService,\n};\n\nexport function styleContent(\n _taglib: TaglibLookup,\n document: TextDocument,\n params: CompletionParams,\n event: ParserEvents.StyleContent\n) {\n const service = services[event.language]();\n const startPos = document.positionAt(event.pos);\n const relativePos = shiftPosition(\n params.position,\n Position.create(startPos.line * -1, startPos.character * -1)\n );\n const contentDocument = TextDocument.create(\n document.uri,\n event.language,\n document.version,\n event.content\n );\n\n const completions = service.doComplete(\n contentDocument,\n relativePos,\n service.parseStylesheet(contentDocument)\n );\n\n return shiftCompletionRanges(completions, startPos);\n}\n", "export * from \"./types/attributeName\";\nexport * from \"./types/openTagName\";\n", "import { URI } from \"vscode-uri\";\nimport {\n type TextDocumentPositionParams,\n Range,\n LocationLink,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { TaglibLookup } from \"../../compiler\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport RegExpBuilder from \"../../regexp-builder\";\nimport { START_OF_FILE, createTextDocument, rangeFromEvent } from \"../../utils\";\n\nexport function attributeName(\n taglib: TaglibLookup,\n document: TextDocument,\n _params: TextDocumentPositionParams,\n event: ParserEvents.AttributeName\n) {\n const tagName = event.tag.tagNameExpression ? undefined : event.tag.tagName;\n const tagDef = tagName && taglib.getTag(tagName);\n const attrDef = taglib.getAttribute(tagName || \"*\", event.name);\n let range = START_OF_FILE;\n\n if (!attrDef) {\n return [];\n }\n\n const attrEntryFile = attrDef.filePath || (tagDef && tagDef.filePath);\n\n if (!attrEntryFile) {\n return [];\n }\n\n if (/\\/marko(?:-tag)?\\.json$/.test(attrEntryFile)) {\n const tagDefDoc = createTextDocument(attrEntryFile);\n const match = RegExpBuilder`/\"@${event.name}\"\\s*:\\s*[^\\r\\n,]+/g`.exec(\n tagDefDoc.getText()\n );\n\n if (match && match.index) {\n range = Range.create(\n tagDefDoc.positionAt(match.index),\n tagDefDoc.positionAt(match.index + match[0].length)\n );\n }\n }\n\n return [\n LocationLink.create(\n URI.file(attrEntryFile).toString(),\n range,\n range,\n rangeFromEvent(document, event)\n ),\n ];\n}\n", "export default function RegExpBuilder(\n strings: TemplateStringsArray,\n ...expressions: [unknown, ...unknown[]]\n) {\n let i = 0;\n let src = strings[0].slice(strings[0].indexOf(\"/\") + 1);\n const secondLastExprIndex = strings.length - 2;\n\n for (; i < secondLastExprIndex; i++) {\n src += escape(expressions[i]) + strings[i + 1];\n }\n\n src += escape(expressions[i]);\n\n const lastStr = strings[i + 1];\n const lastSlashIndex = lastStr.lastIndexOf(\"/\");\n let flags = \"\";\n\n if (lastSlashIndex === -1) {\n src += lastStr;\n } else {\n flags = lastStr.slice(lastSlashIndex + 1);\n src += lastStr.slice(0, lastSlashIndex);\n }\n\n return new RegExp(src, flags);\n}\n\nfunction escape(val: unknown) {\n return String(val).replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n}\n", "import path from \"path\";\nimport { URI } from \"vscode-uri\";\nimport {\n type TextDocumentPositionParams,\n Range,\n LocationLink,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { ParserEvents } from \"../../htmljs-parser\";\nimport type { TaglibLookup, TagDefinition } from \"../../compiler\";\nimport RegExpBuilder from \"../../regexp-builder\";\nimport {\n START_OF_FILE,\n findNonControlFlowParent,\n createTextDocument,\n rangeFromEvent,\n} from \"../../utils\";\n\nexport function openTagName(\n taglib: TaglibLookup,\n document: TextDocument,\n _params: TextDocumentPositionParams,\n event: ParserEvents.OpenTagName\n) {\n let tagDef: TagDefinition | null | undefined;\n let range = START_OF_FILE;\n const isAttributeTag = event.tagName[0] === \"@\";\n\n if (isAttributeTag) {\n const parentTag = findNonControlFlowParent(event);\n tagDef =\n parentTag &&\n (parentTag.tagNameExpression\n ? undefined\n : taglib.getTag(parentTag.tagName));\n } else {\n tagDef = taglib.getTag(event.tagName);\n }\n\n if (!tagDef) {\n return [];\n }\n\n const tagEntryFile = tagDef.template || tagDef.renderer || tagDef.filePath;\n\n if (!path.isAbsolute(tagEntryFile)) {\n return [];\n }\n\n if (/\\/marko(?:-tag)?\\.json$/.test(tagEntryFile)) {\n const tagDefDoc = createTextDocument(tagEntryFile);\n const match =\n RegExpBuilder`/\"(?:<${event.tagName}>|${event.tagName})\"\\s*:\\s*[^\\r\\n,]+/g`.exec(\n tagDefDoc.getText()\n );\n\n if (match && match.index) {\n range = Range.create(\n tagDefDoc.positionAt(match.index),\n tagDefDoc.positionAt(match.index + match[0].length)\n );\n }\n }\n\n return [\n LocationLink.create(\n URI.file(tagEntryFile).toString(),\n range,\n range,\n rangeFromEvent(document, event)\n ),\n ];\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -2,4 +2,4 @@ import { type CompletionParams, CompletionList } from "vscode-languageserver";
2
2
  import type { TextDocument } from "vscode-languageserver-textdocument";
3
3
  import type { ParserEvents } from "../../htmljs-parser";
4
4
  import type { TaglibLookup } from "../../compiler";
5
- export declare function openTag(_taglib: TaglibLookup, _document: TextDocument, params: CompletionParams, event: ParserEvents.OpenTag): CompletionList | undefined;
5
+ export declare function openTag(_taglib: TaglibLookup, doc: TextDocument, params: CompletionParams, event: ParserEvents.OpenTag): CompletionList | undefined;
@@ -2,4 +2,4 @@ import { type CompletionParams } from "vscode-languageserver";
2
2
  import { TextDocument } from "vscode-languageserver-textdocument";
3
3
  import type { ParserEvents } from "../../htmljs-parser";
4
4
  import type { TaglibLookup } from "../../compiler";
5
- export declare function styleContent(_taglib: TaglibLookup, document: TextDocument, params: CompletionParams, event: ParserEvents.StyleContent): import("vscode-languageserver").CompletionList;
5
+ export declare function styleContent(_taglib: TaglibLookup, document: TextDocument, params: CompletionParams, event: ParserEvents.StyleContent): import("vscode-languageserver-types").CompletionList;
@@ -2,4 +2,4 @@ import { type TextDocumentPositionParams, LocationLink } from "vscode-languagese
2
2
  import type { TextDocument } from "vscode-languageserver-textdocument";
3
3
  import type { TaglibLookup } from "../../compiler";
4
4
  import type { ParserEvents } from "../../htmljs-parser";
5
- export declare function attributeName(taglib: TaglibLookup, document: TextDocument, _params: TextDocumentPositionParams, event: ParserEvents.AttributeName): LocationLink[] | undefined;
5
+ export declare function attributeName(taglib: TaglibLookup, document: TextDocument, _params: TextDocumentPositionParams, event: ParserEvents.AttributeName): LocationLink[];
@@ -2,4 +2,4 @@ import { type TextDocumentPositionParams, LocationLink } from "vscode-languagese
2
2
  import type { TextDocument } from "vscode-languageserver-textdocument";
3
3
  import type { ParserEvents } from "../../htmljs-parser";
4
4
  import type { TaglibLookup } from "../../compiler";
5
- export declare function openTagName(taglib: TaglibLookup, document: TextDocument, _params: TextDocumentPositionParams, event: ParserEvents.OpenTagName): LocationLink[] | undefined;
5
+ export declare function openTagName(taglib: TaglibLookup, document: TextDocument, _params: TextDocumentPositionParams, event: ParserEvents.OpenTagName): LocationLink[];
package/package.json CHANGED
@@ -1,28 +1,29 @@
1
1
  {
2
2
  "name": "@marko/language-server",
3
3
  "description": "Marko Language Server",
4
- "version": "0.12.0",
4
+ "version": "0.12.3",
5
5
  "bin": {
6
6
  "marko-language-server": "./bin.js"
7
7
  },
8
8
  "bugs": "https://github.com/marko-js/language-server/issues/new?template=Bug_report.md",
9
9
  "dependencies": {
10
- "@marko/babel-utils": "^5.20.3",
11
- "@marko/compiler": "^5.20.3",
12
- "@marko/translator-default": "^5.20.3",
13
- "htmljs-parser": "^2.11.2",
10
+ "@marko/babel-utils": "^5.21.1",
11
+ "@marko/compiler": "^5.21.4",
12
+ "@marko/translator-default": "^5.21.2",
13
+ "htmljs-parser": "^2.11.3",
14
14
  "lasso-package-root": "^1.0.1",
15
- "marko": "^5.20.3",
16
- "prettier": "^2.6.0",
17
- "prettier-plugin-marko": "^1.1.3",
15
+ "marko": "^5.21.2",
16
+ "prettier": "^2.6.2",
17
+ "prettier-plugin-marko": "^1.2.1",
18
18
  "resolve-from": "^5.0.0",
19
- "vscode-css-languageservice": "^5.3.0",
20
- "vscode-languageserver": "^7.0.0",
21
- "vscode-languageserver-textdocument": "^1.0.4",
19
+ "tsx": "^3.4.2",
20
+ "vscode-css-languageservice": "^6.0.1",
21
+ "vscode-languageserver": "^8.0.1",
22
+ "vscode-languageserver-textdocument": "^1.0.5",
22
23
  "vscode-uri": "^3.0.3"
23
24
  },
24
25
  "devDependencies": {
25
- "@types/prettier": "^2.4.4"
26
+ "@types/prettier": "^2.6.3"
26
27
  },
27
28
  "exports": {
28
29
  ".": {
@@ -51,6 +52,6 @@
51
52
  "url": "https://github.com/marko-js/language-server/tree/master/server"
52
53
  },
53
54
  "scripts": {
54
- "build": "tsc -b && node -r esbuild-register build"
55
+ "build": "tsc -b && tsx build.mts"
55
56
  }
56
- }
57
+ }
package/LICENSE DELETED
@@ -1,20 +0,0 @@
1
- MIT License
2
-
3
- Copyright 2022 eBay Inc.
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy of
6
- this software and associated documentation files (the "Software"), to deal in
7
- the Software without restriction, including without limitation the rights to
8
- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
- the Software, and to permit persons to whom the Software is furnished to do so,
10
- subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
- FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
- COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
- IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.