@marko/language-server 0.12.2 → 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
@@ -429,8 +429,8 @@ function closeTag(_taglib, document, _params, event) {
429
429
 
430
430
  // src/utils/completions/types/openTag.ts
431
431
  var import_vscode_languageserver5 = require("vscode-languageserver");
432
- function openTag(_taglib, _document, params, event) {
433
- 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));
434
434
  if (triggerCharacter !== ">" || event.openTagOnly || event.selfClosed) {
435
435
  return;
436
436
  }
@@ -568,11 +568,11 @@ function attributeName2(taglib, document, _params, event) {
568
568
  const attrDef = taglib.getAttribute(tagName || "*", event.name);
569
569
  let range = START_OF_FILE;
570
570
  if (!attrDef) {
571
- return;
571
+ return [];
572
572
  }
573
573
  const attrEntryFile = attrDef.filePath || tagDef && tagDef.filePath;
574
574
  if (!attrEntryFile) {
575
- return;
575
+ return [];
576
576
  }
577
577
  if (/\/marko(?:-tag)?\.json$/.test(attrEntryFile)) {
578
578
  const tagDefDoc = createTextDocument(attrEntryFile);
@@ -587,6 +587,7 @@ function attributeName2(taglib, document, _params, event) {
587
587
  }
588
588
 
589
589
  // src/utils/definitions/types/openTagName.ts
590
+ var import_path3 = __toESM(require("path"));
590
591
  var import_vscode_uri5 = require("vscode-uri");
591
592
  var import_vscode_languageserver9 = require("vscode-languageserver");
592
593
  function openTagName2(taglib, document, _params, event) {
@@ -600,12 +601,15 @@ function openTagName2(taglib, document, _params, event) {
600
601
  tagDef = taglib.getTag(event.tagName);
601
602
  }
602
603
  if (!tagDef) {
603
- return;
604
+ return [];
604
605
  }
605
606
  const tagEntryFile = tagDef.template || tagDef.renderer || tagDef.filePath;
607
+ if (!import_path3.default.isAbsolute(tagEntryFile)) {
608
+ return [];
609
+ }
606
610
  if (/\/marko(?:-tag)?\.json$/.test(tagEntryFile)) {
607
611
  const tagDefDoc = createTextDocument(tagEntryFile);
608
- 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());
609
613
  if (match && match.index) {
610
614
  range = import_vscode_languageserver9.Range.create(tagDefDoc.positionAt(match.index), tagDefDoc.positionAt(match.index + match[0].length));
611
615
  }
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 * 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} 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,
@@ -454,10 +454,12 @@ function closeTag(_taglib, document, _params, event) {
454
454
  import {
455
455
  CompletionList as CompletionList4,
456
456
  CompletionItemKind as CompletionItemKind4,
457
- InsertTextFormat as InsertTextFormat3
457
+ InsertTextFormat as InsertTextFormat3,
458
+ Range as Range2,
459
+ Position as Position2
458
460
  } from "vscode-languageserver";
459
- function openTag(_taglib, _document, params, event) {
460
- 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));
461
463
  if (triggerCharacter !== ">" || event.openTagOnly || event.selfClosed) {
462
464
  return;
463
465
  }
@@ -542,7 +544,7 @@ ${autocomplete.description}`;
542
544
  }
543
545
 
544
546
  // src/utils/completions/types/styleContent.ts
545
- import { Position as Position2 } from "vscode-languageserver";
547
+ import { Position as Position3 } from "vscode-languageserver";
546
548
  import { TextDocument as TextDocument2 } from "vscode-languageserver-textdocument";
547
549
  import {
548
550
  getCSSLanguageService,
@@ -557,7 +559,7 @@ var services = {
557
559
  function styleContent(_taglib, document, params, event) {
558
560
  const service = services[event.language]();
559
561
  const startPos = document.positionAt(event.pos);
560
- 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));
561
563
  const contentDocument = TextDocument2.create(document.uri, event.language, document.version, event.content);
562
564
  const completions = service.doComplete(contentDocument, relativePos, service.parseStylesheet(contentDocument));
563
565
  return shiftCompletionRanges(completions, startPos);
@@ -573,7 +575,7 @@ __export(definitions_exports, {
573
575
  // src/utils/definitions/types/attributeName.ts
574
576
  import { URI as URI4 } from "vscode-uri";
575
577
  import {
576
- Range as Range2,
578
+ Range as Range3,
577
579
  LocationLink
578
580
  } from "vscode-languageserver";
579
581
 
@@ -608,17 +610,17 @@ function attributeName2(taglib, document, _params, event) {
608
610
  const attrDef = taglib.getAttribute(tagName || "*", event.name);
609
611
  let range = START_OF_FILE;
610
612
  if (!attrDef) {
611
- return;
613
+ return [];
612
614
  }
613
615
  const attrEntryFile = attrDef.filePath || tagDef && tagDef.filePath;
614
616
  if (!attrEntryFile) {
615
- return;
617
+ return [];
616
618
  }
617
619
  if (/\/marko(?:-tag)?\.json$/.test(attrEntryFile)) {
618
620
  const tagDefDoc = createTextDocument(attrEntryFile);
619
621
  const match = RegExpBuilder`/"@${event.name}"\s*:\s*[^\r\n,]+/g`.exec(tagDefDoc.getText());
620
622
  if (match && match.index) {
621
- 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));
622
624
  }
623
625
  }
624
626
  return [
@@ -627,9 +629,10 @@ function attributeName2(taglib, document, _params, event) {
627
629
  }
628
630
 
629
631
  // src/utils/definitions/types/openTagName.ts
632
+ import path3 from "path";
630
633
  import { URI as URI5 } from "vscode-uri";
631
634
  import {
632
- Range as Range3,
635
+ Range as Range4,
633
636
  LocationLink as LocationLink2
634
637
  } from "vscode-languageserver";
635
638
  function openTagName2(taglib, document, _params, event) {
@@ -643,14 +646,17 @@ function openTagName2(taglib, document, _params, event) {
643
646
  tagDef = taglib.getTag(event.tagName);
644
647
  }
645
648
  if (!tagDef) {
646
- return;
649
+ return [];
647
650
  }
648
651
  const tagEntryFile = tagDef.template || tagDef.renderer || tagDef.filePath;
652
+ if (!path3.isAbsolute(tagEntryFile)) {
653
+ return [];
654
+ }
649
655
  if (/\/marko(?:-tag)?\.json$/.test(tagEntryFile)) {
650
656
  const tagDefDoc = createTextDocument(tagEntryFile);
651
- 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());
652
658
  if (match && match.index) {
653
- 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));
654
660
  }
655
661
  }
656
662
  return [
@@ -735,13 +741,13 @@ connection.onDocumentFormatting(async ({
735
741
  editorconfig: true
736
742
  }).catch(() => null) : null));
737
743
  return [
738
- 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)
739
745
  ];
740
746
  } catch (e) {
741
747
  displayMessage("Error", inspect(e, { colors: false }));
742
748
  }
743
749
  return [
744
- 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)), "")
745
751
  ];
746
752
  });
747
753
  connection.onDidChangeWatchedFiles(() => {
@@ -795,7 +801,7 @@ function doValidate(doc) {
795
801
  const [, fileName, rawLine, rawCol, msg] = match;
796
802
  const line = (parseInt(rawLine, 10) || 1) - 1;
797
803
  const col = (parseInt(rawCol, 10) || 1) - 1;
798
- 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));
799
805
  }
800
806
  }
801
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 * 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} 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.2",
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.5",
11
- "@marko/compiler": "^5.20.5",
12
- "@marko/translator-default": "^5.20.5",
10
+ "@marko/babel-utils": "^5.21.1",
11
+ "@marko/compiler": "^5.21.4",
12
+ "@marko/translator-default": "^5.21.2",
13
13
  "htmljs-parser": "^2.11.3",
14
14
  "lasso-package-root": "^1.0.1",
15
- "marko": "^5.20.5",
15
+ "marko": "^5.21.2",
16
16
  "prettier": "^2.6.2",
17
- "prettier-plugin-marko": "^1.2.0",
17
+ "prettier-plugin-marko": "^1.2.1",
18
18
  "resolve-from": "^5.0.0",
19
- "vscode-css-languageservice": "^5.4.1",
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.6.0"
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.