@marko/language-server 0.12.2 → 0.12.5
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 +1322 -555
- package/dist/index.js.map +3 -3
- package/dist/index.mjs +1350 -605
- package/dist/index.mjs.map +3 -3
- package/dist/service/index.d.ts +6 -0
- package/dist/service/marko/complete/AttrName.d.ts +3 -0
- package/dist/service/marko/complete/OpenTagName.d.ts +3 -0
- package/dist/service/marko/complete/Tag.d.ts +6 -0
- package/dist/service/marko/complete/index.d.ts +14 -0
- package/dist/service/marko/definition/AttrName.d.ts +3 -0
- package/dist/service/marko/definition/OpenTagName.d.ts +3 -0
- package/dist/service/marko/definition/index.d.ts +14 -0
- package/dist/service/marko/format.d.ts +2 -0
- package/dist/service/marko/index.d.ts +3 -0
- package/dist/service/marko/validate.d.ts +2 -0
- package/dist/service/stylesheet/extract.d.ts +10 -0
- package/dist/service/stylesheet/index.d.ts +3 -0
- package/dist/service/types.d.ts +12 -0
- package/dist/utils/compiler.d.ts +16 -4
- package/dist/utils/doc-file.d.ts +3 -0
- package/dist/utils/extractor.d.ts +12 -0
- package/dist/utils/get-node-at-offset.d.ts +2 -0
- package/dist/utils/messages.d.ts +5 -0
- package/dist/utils/parser.d.ts +176 -0
- package/dist/utils/utils.d.ts +1 -8
- package/package.json +15 -14
- package/LICENSE +0 -20
- package/dist/utils/completions/index.d.ts +0 -6
- package/dist/utils/completions/types/attributeModifier.d.ts +0 -5
- package/dist/utils/completions/types/attributeName.d.ts +0 -5
- package/dist/utils/completions/types/closeTag.d.ts +0 -5
- package/dist/utils/completions/types/openTag.d.ts +0 -5
- package/dist/utils/completions/types/openTagName.d.ts +0 -5
- package/dist/utils/completions/types/styleContent.d.ts +0 -5
- package/dist/utils/definitions/index.d.ts +0 -2
- package/dist/utils/definitions/types/attributeName.d.ts +0 -5
- package/dist/utils/definitions/types/openTagName.d.ts +0 -5
- package/dist/utils/htmljs-parser.d.ts +0 -128
package/dist/index.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/index.ts", "../src/utils/compiler.ts", "../src/utils/
|
|
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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",
|
|
3
|
+
"sources": ["../src/index.ts", "../src/utils/compiler.ts", "../src/utils/doc-file.ts", "../src/utils/parser.ts", "../src/utils/get-node-at-offset.ts", "../src/utils/messages.ts", "../src/service/index.ts", "../src/service/marko/complete/index.ts", "../src/service/marko/complete/Tag.ts", "../src/service/marko/complete/OpenTagName.ts", "../src/service/marko/complete/AttrName.ts", "../src/service/marko/validate.ts", "../src/service/marko/definition/OpenTagName.ts", "../src/utils/regexp-builder.ts", "../src/utils/utils.ts", "../src/service/marko/definition/AttrName.ts", "../src/service/marko/definition/index.ts", "../src/service/marko/format.ts", "../src/service/marko/index.ts", "../src/service/stylesheet/index.ts", "../src/utils/extractor.ts", "../src/service/stylesheet/extract.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n createConnection,\n DefinitionLink,\n Diagnostic,\n ProposedFeatures,\n TextDocuments,\n TextDocumentSyncKind,\n} from \"vscode-languageserver/node\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport { inspect, isDeepStrictEqual } from \"util\";\nimport setupCompiler from \"./utils/compiler\";\nimport setupMessages from \"./utils/messages\";\nimport service from \"./service\";\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}\nconst documents = new TextDocuments(TextDocument);\nconst connection = createConnection(ProposedFeatures.all);\nconst prevDiagnostics = new WeakMap<TextDocument, Diagnostic[]>();\nconst diagnosticTimeouts = new WeakMap<\n TextDocument,\n ReturnType<typeof setTimeout>\n>();\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 setupMessages(connection);\n setupCompiler(connection, documents);\n\n return {\n capabilities: {\n textDocumentSync: TextDocumentSyncKind.Incremental,\n documentFormattingProvider: true,\n definitionProvider: true,\n hoverProvider: true,\n completionProvider: {\n triggerCharacters: [\n \".\",\n \":\",\n \"<\",\n \">\",\n \"@\",\n \"/\",\n '\"',\n \"'\",\n \"`\",\n \" \",\n \"=\",\n \"*\",\n \"#\",\n \"$\",\n \"+\",\n \"^\",\n \"(\",\n \"[\",\n \"-\",\n ],\n },\n },\n };\n});\n\nconnection.onInitialized(() => {\n documents.all().forEach((doc) => queueValidation(doc));\n});\n\ndocuments.onDidChangeContent((change) => {\n queueValidation(change.document);\n});\n\nconnection.onCompletion(async (params, cancel) => {\n return (\n (await service.doComplete(\n documents.get(params.textDocument.uri)!,\n params,\n cancel\n )) || null\n );\n});\n\nconnection.onDefinition(async (params, cancel) => {\n return (\n ((await service.findDefinition(\n documents.get(params.textDocument.uri)!,\n params,\n cancel\n )) as DefinitionLink[]) || null\n );\n});\n\nconnection.onHover(async (params, cancel) => {\n return (\n (await service.doHover(\n documents.get(params.textDocument.uri)!,\n params,\n cancel\n )) || null\n );\n});\n\nconnection.onDocumentFormatting(async (params, cancel) => {\n return (\n (await service.format(\n documents.get(params.textDocument.uri)!,\n params,\n cancel\n )) || null\n );\n});\n\nfunction queueValidation(doc: TextDocument) {\n clearTimeout(diagnosticTimeouts.get(doc)!);\n const id = setTimeout(async () => {\n const prevDiag = prevDiagnostics.get(doc);\n const nextDiag = (await service.doValidate(doc)) || [];\n\n if (\n diagnosticTimeouts.get(doc) !== id ||\n (prevDiag && isDeepStrictEqual(prevDiag, nextDiag))\n ) {\n return;\n }\n\n prevDiagnostics.set(doc, nextDiag);\n connection.sendDiagnostics({\n uri: doc.uri,\n diagnostics: nextDiag,\n });\n }, 400);\n\n diagnosticTimeouts.set(doc, id);\n}\n\ndocuments.listen(connection);\nconnection.listen();\n", "import { URI } from \"vscode-uri\";\nimport resolveFrom from \"resolve-from\";\nimport lassoPackageRoot from \"lasso-package-root\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { Connection, TextDocuments } from \"vscode-languageserver\";\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\";\nimport { getDocDir } from \"./doc-file\";\nimport * as parser from \"./parser\";\n\nconst lookupKey = Symbol(\"lookup\");\nconst compilerInfoByDir = new Map<string, CompilerInfo>();\nconst builtinInfo: CompilerInfo = {\n cache: new Map(),\n lookup: builtinCompiler.taglib.buildLookup(__dirname, builtinTranslator),\n compiler: builtinCompiler,\n translator: builtinTranslator,\n};\nbuiltinCompiler.configure({ translator: builtinTranslator });\n\nexport type Compiler = typeof import(\"@marko/compiler\");\nexport { AttributeDefinition, TagDefinition, TaglibLookup };\nexport type CompilerInfo = {\n cache: Map<unknown, unknown>;\n lookup: TaglibLookup;\n compiler: Compiler;\n translator: builtinCompiler.Config[\"translator\"];\n};\n\nexport function parse(doc: TextDocument) {\n const compilerInfo = getCompilerInfo(doc);\n let parsed = compilerInfo.cache.get(doc) as\n | ReturnType<typeof parser.parse>\n | undefined;\n if (!parsed) {\n const source = doc.getText();\n compilerInfo.cache.set(doc, (parsed = parser.parse(source)));\n }\n\n return parsed;\n}\n\nexport function getCompilerInfo(doc: TextDocument): CompilerInfo {\n const dir = getDocDir(doc);\n if (!dir) return builtinInfo;\n\n let info = compilerInfoByDir.get(dir);\n if (!info) {\n info = loadCompilerInfo(dir);\n compilerInfoByDir.set(dir, info);\n }\n\n return info;\n}\n\nexport default function setup(\n connection: Connection,\n documents: TextDocuments<TextDocument>\n) {\n connection.onDidChangeWatchedFiles(() => {\n clearAllCaches();\n });\n\n documents.onDidChangeContent(({ document }) => {\n if (document.version > 1) {\n if (document.languageId === \"marko\") {\n getCompilerInfo(document).cache.delete(document);\n } else if (/[./\\\\]marko(?:-tag)?\\.json$/.test(document.uri)) {\n clearAllCaches();\n }\n }\n });\n\n documents.onDidClose(({ document }) => {\n if (\n document.languageId === \"marko\" &&\n URI.parse(document.uri).scheme !== \"file\"\n ) {\n // Delete untitled files from the cache when closed.\n getCompilerInfo(document).cache.delete(document);\n }\n });\n}\n\nfunction clearAllCaches() {\n for (const [, info] of compilerInfoByDir) {\n info.cache.clear();\n info.compiler.taglib.clearCaches();\n }\n}\n\nfunction loadCompilerInfo(dir: string): CompilerInfo {\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 const cache = new Map();\n let translator = builtinTranslator;\n let compiler = builtinCompiler;\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 checkTranslator = ([] 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 (checkTranslator === \"marko\" || !checkTranslator) {\n // Fallback to compiler default translator\n checkTranslator = require(resolveFrom(dir, \"@marko/compiler/config\"))\n .translator as string;\n }\n\n [compiler, translator] = [\n require(resolveFrom(dir, \"@marko/compiler\")),\n require(resolveFrom(dir, checkTranslator)),\n ];\n // eslint-disable-next-line no-empty\n } catch {}\n }\n\n return {\n cache,\n get lookup() {\n let lookup: TaglibLookup = cache.get(lookupKey);\n if (lookup === undefined) {\n // Lazily build the lookup, and ensure it's re-created whenever the cache is cleared.\n try {\n lookup = compiler.taglib.buildLookup(dir, translator);\n } catch {\n lookup = builtinInfo.lookup;\n }\n\n cache.set(lookupKey, lookup);\n }\n\n return lookup;\n },\n compiler,\n translator,\n };\n}\n", "import type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport path from \"path\";\nimport { URI } from \"vscode-uri\";\n\nexport function getDocDir(doc: TextDocument): string | undefined {\n const filename = getDocFile(doc);\n return filename ? path.dirname(filename) : undefined;\n}\n\nexport function getDocFile(doc: TextDocument): string | undefined {\n return URI.parse(doc.uri).fsPath;\n}\n", "import { createParser, TagType, Range, Ranges } from \"htmljs-parser\";\nimport { getNodeAtOffset } from \"./get-node-at-offset\";\n\nexport { Range, Ranges };\n\nexport const UNFINISHED = Number.MAX_SAFE_INTEGER;\nexport enum NodeType {\n Program,\n Tag,\n OpenTagName,\n ShorthandId,\n ShorthandClassName,\n TagVar,\n TagArgs,\n TagParams,\n AttrNamed,\n AttrName,\n AttrArgs,\n AttrValue,\n AttrMethod,\n AttrSpread,\n AttrTag,\n Text,\n CDATA,\n Doctype,\n Declaration,\n Comment,\n Statement,\n Placeholder,\n Scriptlet,\n}\n\nexport namespace Node {\n export type AnyNode =\n | Program\n | Tag\n | OpenTagName\n | ShorthandId\n | ShorthandClassName\n | TagVar\n | TagArgs\n | TagParams\n | AttrNamed\n | AttrName\n | AttrArgs\n | AttrValue\n | AttrMethod\n | AttrSpread\n | AttrTag\n | Text\n | CDATA\n | Doctype\n | Declaration\n | Comment\n | Statement\n | Placeholder\n | Scriptlet;\n export type ParentNode = Program | Tag | AttrTag;\n export type StaticNode = Comment | Statement;\n export type ParentTag = Tag | AttrTag;\n export type AttrNode = AttrNamed | AttrSpread | AttrTag;\n export type ChildNode =\n | Tag\n | AttrTag\n | Text\n | Doctype\n | Declaration\n | CDATA\n | Comment\n | Placeholder\n | Scriptlet;\n\n export interface Program extends Range {\n type: NodeType.Program;\n parent: undefined;\n static: StaticNode[];\n body: ChildNode[];\n }\n\n export interface Tag extends Range {\n type: NodeType.Tag;\n parent: ParentNode;\n owner: undefined;\n concise: boolean;\n open: Range;\n close: Range | undefined;\n nameText: string | undefined;\n bodyType: Exclude<TagType, \"statement\">;\n name: OpenTagName;\n var: TagVar | undefined;\n args: TagArgs | undefined;\n params: TagParams | undefined;\n shorthandId: ShorthandId | undefined;\n shorthandClassNames: ShorthandClassName[] | undefined;\n attrs: AttrNode[] | undefined;\n selfClosed: boolean;\n body: undefined | ChildNode[];\n }\n\n export interface AttrTag extends Range {\n type: NodeType.AttrTag;\n parent: ParentTag;\n owner: ParentTag | undefined;\n concise: boolean;\n open: Range;\n close: Range | undefined;\n nameText: string | undefined;\n bodyType: TagType.html;\n name: OpenTagName;\n var: TagVar | undefined;\n args: TagArgs | undefined;\n params: TagParams | undefined;\n shorthandId: ShorthandId | undefined;\n shorthandClassNames: ShorthandClassName[] | undefined;\n attrs: AttrNode[] | undefined;\n selfClosed: boolean;\n body: undefined | ChildNode[];\n }\n\n export interface OpenTagName extends Ranges.Template {\n type: NodeType.OpenTagName;\n parent: ParentTag;\n }\n\n export interface ShorthandId extends Ranges.Template {\n type: NodeType.ShorthandId;\n parent: ParentTag;\n }\n\n export interface ShorthandClassName extends Ranges.Template {\n type: NodeType.ShorthandClassName;\n parent: ParentTag;\n }\n\n export interface TagVar extends Ranges.Value {\n type: NodeType.TagVar;\n parent: ParentTag;\n }\n\n export interface TagArgs extends Ranges.Value {\n type: NodeType.TagArgs;\n parent: ParentTag;\n }\n\n export interface TagParams extends Ranges.Value {\n type: NodeType.TagParams;\n parent: ParentTag;\n }\n\n export interface Statement extends Range {\n type: NodeType.Statement;\n parent: ParentNode;\n }\n\n export interface Text extends Range {\n type: NodeType.Text;\n parent: ParentNode;\n }\n\n export interface CDATA extends Ranges.Value {\n type: NodeType.CDATA;\n parent: ParentNode;\n }\n\n export interface Doctype extends Ranges.Value {\n type: NodeType.Doctype;\n parent: ParentNode;\n }\n\n export interface Declaration extends Ranges.Value {\n type: NodeType.Declaration;\n parent: ParentNode;\n }\n\n export interface Comment extends Ranges.Value {\n type: NodeType.Comment;\n parent: ParentNode;\n }\n\n export interface Placeholder extends Ranges.Value {\n type: NodeType.Placeholder;\n parent: ParentNode;\n escape: boolean;\n }\n\n export interface Scriptlet extends Ranges.Value {\n type: NodeType.Scriptlet;\n parent: ParentNode;\n block: boolean;\n }\n\n export interface AttrNamed extends Range {\n type: NodeType.AttrNamed;\n parent: ParentTag;\n name: AttrName;\n args: undefined | AttrArgs;\n value: undefined | AttrValue | AttrMethod;\n }\n\n export interface AttrName extends Range {\n type: NodeType.AttrName;\n parent: AttrNamed;\n }\n\n export interface AttrArgs extends Ranges.Value {\n type: NodeType.AttrArgs;\n parent: AttrNamed;\n }\n\n export interface AttrValue extends Range {\n type: NodeType.AttrValue;\n parent: AttrNamed;\n value: Range;\n bound: boolean;\n }\n\n export interface AttrMethod extends Range {\n type: NodeType.AttrMethod;\n parent: AttrNamed;\n params: Range;\n body: Range;\n }\n\n export interface AttrSpread extends Ranges.Value {\n type: NodeType.AttrSpread;\n parent: ParentTag;\n }\n}\n\nexport function parse(source: string) {\n const program: Node.Program = {\n type: NodeType.Program,\n parent: undefined,\n static: [],\n body: [],\n start: 0,\n end: source.length,\n };\n let curBodyType: TagType;\n let curOpenTagStart: Range | undefined;\n let curParent: Node.ParentNode | Node.Statement = program;\n let curAttr: Node.AttrNamed | undefined = undefined;\n let curBody: Exclude<Node.ParentNode[\"body\"], void> = program.body;\n\n const parser = createParser({\n onText(range) {\n // @ts-expect-error we know we are in a Tag or Program\n declare const curParent: Node.ParentNode;\n curBody.push({\n type: NodeType.Text,\n parent: curParent,\n start: range.start,\n end: range.end,\n });\n },\n onCDATA(range) {\n // @ts-expect-error we know we are in a Tag or Program\n declare const curParent: Node.ParentNode;\n curBody.push({\n type: NodeType.CDATA,\n parent: curParent,\n value: range.value,\n start: range.start,\n end: range.end,\n });\n },\n onDoctype(range) {\n // @ts-expect-error we know we are in a Tag or Program\n declare const curParent: Node.ParentNode;\n curBody.push({\n type: NodeType.Doctype,\n parent: curParent,\n value: range.value,\n start: range.start,\n end: range.end,\n });\n },\n onDeclaration(range) {\n // @ts-expect-error we know we are in a Tag or Program\n declare const curParent: Node.ParentNode;\n curBody.push({\n type: NodeType.Declaration,\n parent: curParent,\n value: range.value,\n start: range.start,\n end: range.end,\n });\n },\n onComment(range) {\n // @ts-expect-error we know we are in a Tag or Program\n declare const curParent: Node.ParentNode;\n curBody.push({\n type: NodeType.Comment,\n parent: curParent,\n value: range.value,\n start: range.start,\n end: range.end,\n });\n },\n onPlaceholder(range) {\n // @ts-expect-error we know we are in a Tag or Program\n declare const curParent: Node.ParentNode;\n curBody.push({\n type: NodeType.Placeholder,\n parent: curParent,\n value: range.value,\n escape: range.escape,\n start: range.start,\n end: range.end,\n });\n },\n onScriptlet(range) {\n // @ts-expect-error we know we are in a Tag or Program\n declare const curParent: Node.ParentNode;\n curBody.push({\n type: NodeType.Scriptlet,\n parent: curParent,\n value: range.value,\n block: range.block,\n start: range.start,\n end: range.end,\n });\n },\n onOpenTagStart(range) {\n curOpenTagStart = range;\n },\n onOpenTagName(range) {\n let concise = true;\n let start = range.start;\n let type = NodeType.Tag;\n let nameText: string | undefined = undefined;\n\n if (curOpenTagStart) {\n concise = false;\n start = curOpenTagStart.start;\n curOpenTagStart = undefined;\n }\n\n if (range.expressions.length) {\n curBodyType = TagType.html;\n } else {\n switch ((nameText = parser.read(range))) {\n case \"area\":\n case \"base\":\n case \"br\":\n case \"col\":\n case \"embed\":\n case \"hr\":\n case \"img\":\n case \"input\":\n case \"link\":\n case \"meta\":\n case \"param\":\n case \"source\":\n case \"track\":\n case \"wbr\":\n curBodyType = TagType.void;\n break;\n case \"html-comment\":\n case \"script\":\n case \"style\":\n case \"textarea\":\n curBodyType = TagType.text;\n break;\n case \"class\":\n case \"export\":\n case \"import\":\n case \"static\": {\n // Copy comments before statements into the static section.\n let i = program.body.length;\n for (; i--; ) {\n const prev = program.body[i];\n if (prev.type === NodeType.Comment) {\n program.static.push(prev);\n } else {\n break;\n }\n }\n\n program.body.length = i + 1; // Remove comments that were copied from above.\n program.static.push(\n (curParent = {\n type: NodeType.Statement,\n parent: program,\n start: range.start,\n end: UNFINISHED, // will be set later\n })\n );\n return (curBodyType = TagType.statement);\n }\n default:\n if (nameText[0] === \"@\") {\n type = NodeType.AttrTag;\n }\n curBodyType = TagType.html;\n break;\n }\n }\n\n const parent = curParent as Node.ParentNode;\n const end = UNFINISHED; // will be set later\n const name: Node.OpenTagName = {\n type: NodeType.OpenTagName,\n parent: undefined as unknown as Node.Tag,\n quasis: range.quasis,\n expressions: range.expressions,\n start: range.start,\n end: range.end,\n };\n const tag =\n (curParent =\n name.parent =\n {\n type,\n parent,\n owner: undefined,\n concise,\n open: { start, end },\n nameText,\n name,\n var: undefined,\n args: undefined,\n params: undefined,\n shorthandId: undefined,\n shorthandClassNames: undefined,\n attrs: undefined,\n selfClosed: false,\n bodyType: curBodyType,\n body: undefined,\n close: undefined,\n start,\n end,\n } as Node.ParentTag);\n\n if (tag.type === NodeType.AttrTag) {\n // We add attribute tags as a attribute of the closest non transparent tag.\n let owner = parent as Node.ParentTag;\n outer: do {\n switch (owner.type) {\n case NodeType.AttrTag:\n break;\n case NodeType.Tag:\n if (isTransparentTag(owner)) {\n owner = owner.parent as Node.ParentTag;\n continue outer;\n }\n break;\n default:\n break outer;\n }\n\n tag.owner = owner;\n // This name includes the full ancestry of the attribute tag and can be used in `TaglibLookup.getTag`.\n tag.nameText = resolveAttrTagName(tag);\n pushAttr(owner, tag);\n // eslint-disable-next-line no-constant-condition\n } while (false);\n }\n\n curBody.push(tag);\n curOpenTagStart = undefined;\n return curBodyType;\n },\n onTagShorthandId(range) {\n // @ts-expect-error we know we are in a Tag\n declare const curParent: Node.ParentTag;\n curParent.shorthandId = {\n type: NodeType.ShorthandId,\n parent: curParent,\n quasis: range.quasis,\n expressions: range.expressions,\n start: range.start,\n end: range.end,\n };\n },\n onTagShorthandClass(range) {\n // @ts-expect-error we know we are in a Tag\n declare const curParent: Node.ParentTag;\n const shorthandClassName: Node.ShorthandClassName = {\n type: NodeType.ShorthandClassName,\n parent: curParent,\n quasis: range.quasis,\n expressions: range.expressions,\n start: range.start,\n end: range.end,\n };\n\n if (curParent.shorthandClassNames) {\n curParent.shorthandClassNames.push(shorthandClassName);\n } else {\n curParent.shorthandClassNames = [shorthandClassName];\n }\n },\n onTagVar(range) {\n // @ts-expect-error we know we are in a Tag\n declare const curParent: Node.OpenTag;\n curParent.var = {\n type: NodeType.TagVar,\n parent: curParent,\n value: range.value,\n start: range.start,\n end: range.end,\n };\n },\n onTagParams(range) {\n // @ts-expect-error we know we are in a Tag\n declare const curParent: Node.OpenTag;\n curParent.params = {\n type: NodeType.TagParams,\n parent: curParent,\n value: range.value,\n start: range.start,\n end: range.end,\n };\n },\n onTagArgs(range) {\n // @ts-expect-error we know we are in a Tag\n declare const curParent: Node.OpenTag;\n curParent.args = {\n type: NodeType.TagArgs,\n parent: curParent,\n value: range.value,\n start: range.start,\n end: range.end,\n };\n },\n onAttrName(range) {\n const parent = curParent as Node.Tag;\n const name: Node.AttrName = {\n type: NodeType.AttrName,\n parent: undefined as unknown as Node.AttrNamed,\n start: range.start,\n end: range.end,\n };\n\n pushAttr(\n parent,\n (curAttr = name.parent =\n {\n type: NodeType.AttrNamed,\n parent,\n name,\n value: undefined,\n args: undefined,\n start: range.start,\n end: range.end,\n })\n );\n },\n onAttrArgs(range) {\n curAttr!.args = {\n type: NodeType.AttrArgs,\n parent: curAttr!,\n value: range.value,\n start: range.start,\n end: range.end,\n };\n },\n onAttrValue(range) {\n curAttr!.value = {\n type: NodeType.AttrValue,\n parent: curAttr!,\n value: range.value,\n bound: range.bound,\n start: range.start,\n end: range.end,\n };\n curAttr!.end = range.end;\n },\n onAttrMethod(range) {\n curAttr!.value = {\n type: NodeType.AttrMethod,\n parent: curAttr!,\n params: range.params,\n body: range.body,\n start: range.start,\n end: range.end,\n };\n curAttr!.end = range.end;\n },\n onAttrSpread(range) {\n // @ts-expect-error we know we are in a Tag\n declare const curParent: Node.ParentTag;\n pushAttr(curParent, {\n type: NodeType.AttrSpread,\n parent: curParent,\n value: range.value,\n start: range.start,\n end: range.end,\n });\n },\n onOpenTagEnd(range) {\n curAttr = undefined;\n\n if (curBodyType === TagType.statement) {\n curParent.end = range.end;\n curParent = curParent.parent as Node.ParentNode;\n } else {\n const tag = curParent as Node.ParentTag;\n tag.open.end = range.end;\n\n if (range.selfClosed || curBodyType === TagType.void) {\n curParent = tag.parent;\n tag.selfClosed = range.selfClosed;\n tag.end = range.end;\n } else {\n curBody = tag.body = [];\n }\n }\n },\n onCloseTagStart(range) {\n // @ts-expect-error we know we are in a Tag\n declare const curParent: Node.ParentTag;\n curParent.close = {\n start: range.start,\n end: Number.MAX_SAFE_INTEGER,\n };\n },\n onCloseTagEnd(range) {\n if (hasCloseTag(curParent)) curParent.close.end = range.end;\n curParent.end = range.end;\n curBody = (curParent = curParent.parent as Node.ParentNode).body!;\n },\n });\n\n parser.parse(source);\n return {\n read: parser.read,\n locationAt: parser.locationAt,\n positionAt: parser.positionAt,\n nodeAt: (offset: number) => getNodeAtOffset(offset, program),\n program,\n };\n}\n\nfunction pushAttr(parent: Node.ParentTag, node: Node.AttrNode) {\n if (parent.attrs) {\n parent.attrs.push(node);\n } else {\n parent.attrs = [node];\n }\n}\n\nfunction hasCloseTag(\n parent: Node.AnyNode\n): parent is Node.ParentTag & { close: Range } {\n return (parent as Node.ParentTag).close !== undefined;\n}\n\nfunction resolveAttrTagName(tag: Node.AttrTag) {\n let name = tag.nameText;\n let parentTag: Node.ParentTag | undefined = tag.owner!;\n do {\n switch (parentTag.type) {\n case NodeType.Tag:\n return parentTag.nameText ? `${parentTag.nameText}:${name}` : undefined;\n case NodeType.AttrTag:\n name = `${parentTag.nameText}:${name}`;\n parentTag = parentTag.owner;\n break;\n default:\n return;\n }\n } while (parentTag);\n}\n\n/**\n * Used to check if a node should be ignored as the parent of an attribute tag.\n * When control flow is the parent of an attribute tag, we add the attribute tag to\n * the closest non control flow ancestor attrs instead.\n */\nfunction isTransparentTag(node: Node.Tag): node is Node.Tag {\n return (\n node.nameText !== undefined &&\n /^(?:if|else(?:-if)?|for|while)$/.test(node.nameText)\n );\n}\n", "import { Node, NodeType } from \"./parser\";\n\nexport function getNodeAtOffset(\n offset: number,\n program: Node.Program\n): Node.AnyNode {\n const bodyNode = childAtOffset(offset, program.body);\n if (bodyNode) return visitChildNode(offset, bodyNode);\n return childAtOffset(offset, program.static) || program;\n}\n\nfunction visitChildNode(offset: number, child: Node.ChildNode): Node.AnyNode {\n switch (child.type) {\n case NodeType.Tag:\n case NodeType.AttrTag:\n return visitTag(offset, child);\n default:\n return child;\n }\n}\n\nfunction visitTag(offset: number, tag: Node.ParentTag): Node.AnyNode {\n const { body } = tag;\n if (body && offset > tag.open.end) {\n const childNode = childAtOffset(offset, body);\n return childNode ? visitChildNode(offset, childNode) : tag;\n }\n\n const { attrs } = tag;\n if (attrs && offset > attrs[0].start) {\n const attrNode = childAtOffset(offset, attrs);\n return attrNode ? visitAttrNode(offset, attrNode) : tag;\n }\n\n const { var: tagVar } = tag;\n if (tagVar && offset > tagVar.start && offset <= tagVar.end) {\n return tagVar;\n }\n\n const { args } = tag;\n if (args && offset > args.start && offset <= args.end) {\n return args;\n }\n\n const { params } = tag;\n if (params && offset > params.start && offset <= params.end) {\n return params;\n }\n\n const { name } = tag;\n if (name && offset <= name.end) {\n return name;\n }\n\n return tag;\n}\n\nfunction visitAttrNode(offset: number, attr: Node.AttrNode): Node.AnyNode {\n switch (attr.type) {\n case NodeType.AttrTag:\n return visitTag(offset, attr);\n case NodeType.AttrNamed: {\n const { value } = attr;\n if (value && offset > value.start) {\n return value;\n }\n\n const { name } = attr;\n if (offset > name.start && offset <= name.end) {\n return name;\n }\n\n break;\n }\n }\n\n return attr;\n}\n\nfunction childAtOffset<T extends Node.AnyNode[]>(\n offset: number,\n children: T\n): undefined | T[number] {\n let max = children.length - 1;\n if (max === -1) return undefined;\n\n let min = 0;\n while (min < max) {\n const mid = (1 + min + max) >>> 1;\n\n if (children[mid].start < offset) {\n min = mid;\n } else {\n max = mid - 1;\n }\n }\n\n const child = children[min];\n return offset > child.start && offset <= child.end ? child : undefined;\n}\n", "import { inspect } from \"util\";\nimport type { Connection } from \"vscode-languageserver\";\n\nlet connection!: Connection;\nexport default function setup(_: Connection) {\n connection = _;\n}\n\nexport function displayInformation(data: unknown) {\n display(\"showInformation\", data);\n}\n\nexport function displayWarning(data: unknown) {\n display(\"showWarning\", data);\n}\n\nexport function displayError(data: unknown) {\n display(\"showError\", data);\n}\n\nfunction display(type: string, data: unknown) {\n const msg =\n typeof data === \"string\" ? data : inspect(data, { colors: false });\n setImmediate(() => connection.sendNotification(type, msg));\n}\n", "import {\n CompletionItem,\n CompletionList,\n DefinitionLink,\n Diagnostic,\n Location,\n} from \"vscode-languageserver\";\nimport { displayError } from \"../utils/messages\";\nimport type { Plugin } from \"./types\";\n\nimport MarkoPlugin from \"./marko\";\nimport StyleSheetPlugin from \"./stylesheet\";\nconst plugins = [MarkoPlugin, StyleSheetPlugin];\n\n/**\n * Facade to all embedded plugins, eg css, typescript and our own.\n */\nconst service: Plugin = {\n async doComplete(doc, params, cancel) {\n const result = CompletionList.create([], false);\n\n try {\n const requests = plugins.map((plugin) =>\n plugin.doComplete?.(doc, params, cancel)\n );\n for (const pending of requests) {\n const cur = await pending;\n if (cancel.isCancellationRequested) break;\n if (cur) {\n let items!: CompletionItem[];\n if (Array.isArray(cur)) {\n items = cur;\n } else {\n items = cur.items;\n result.isIncomplete ||= cur.isIncomplete;\n }\n\n result.items.push(...items);\n }\n }\n } catch (err) {\n result.isIncomplete = true;\n displayError(err);\n }\n\n return result;\n },\n async findDefinition(doc, params, cancel) {\n const result: (DefinitionLink | Location)[] = [];\n\n try {\n const requests = plugins.map((plugin) =>\n plugin.findDefinition?.(doc, params, cancel)\n );\n for (const pending of requests) {\n const cur = await pending;\n if (cancel.isCancellationRequested) break;\n if (cur) {\n if (Array.isArray(cur)) {\n result.push(...cur);\n } else {\n result.push(cur);\n }\n }\n }\n } catch (err) {\n displayError(err);\n }\n\n return result;\n },\n async doHover(doc, params, cancel) {\n try {\n for (const plugin of plugins) {\n const result = await plugin.doHover?.(doc, params, cancel);\n if (cancel.isCancellationRequested) return;\n if (result) return result;\n }\n } catch (err) {\n displayError(err);\n }\n },\n async doValidate(doc) {\n const result: Diagnostic[] = [];\n try {\n const requests = plugins.map((plugin) => plugin.doValidate?.(doc));\n for (const pending of requests) {\n const cur = await pending;\n if (cur) result.push(...cur);\n }\n } catch (err) {\n displayError(err);\n }\n\n return result;\n },\n format: MarkoPlugin.format,\n};\n\nexport { service as default };\n", "import type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport {\n CompletionItem,\n CompletionList,\n CompletionParams,\n} from \"vscode-languageserver\";\nimport { getCompilerInfo, parse } from \"../../../utils/compiler\";\n\nimport { Tag } from \"./Tag\";\nimport { OpenTagName } from \"./OpenTagName\";\nimport { AttrName } from \"./AttrName\";\nimport type { Plugin, Result } from \"../../types\";\nimport { NodeType } from \"../../../utils/parser\";\n\nexport type CompletionResult = Result<CompletionItem[]>;\nexport interface CompletionMeta<N = unknown>\n extends ReturnType<typeof getCompilerInfo> {\n document: TextDocument;\n params: CompletionParams;\n parsed: ReturnType<typeof parse>;\n offset: number;\n code: string;\n node: N;\n}\n\nconst handlers: Record<\n string,\n (data: CompletionMeta<any>) => CompletionResult\n> = {\n Tag,\n OpenTagName,\n AttrName,\n};\n\nexport const doComplete: Plugin[\"doComplete\"] = async (doc, params) => {\n const parsed = parse(doc);\n const offset = doc.offsetAt(params.position);\n const node = parsed.nodeAt(offset);\n return CompletionList.create(\n (await handlers[NodeType[node.type]]?.({\n document: doc,\n params,\n parsed,\n offset,\n node,\n code: doc.getText(),\n ...getCompilerInfo(doc),\n })) || [],\n true\n );\n};\n", "import {\n CompletionItemKind,\n InsertTextFormat,\n TextEdit,\n} from \"vscode-languageserver\";\nimport { type Node, UNFINISHED } from \"../../../utils/parser\";\nimport type { CompletionMeta, CompletionResult } from \".\";\n\nconst partialCloseTagReg = /<\\/(?:[^><]*>)?/iy;\n\n/**\n * Provide completion for the closing tag.\n */\nexport function Tag(event: CompletionMeta<Node.Tag>): CompletionResult {\n const { node } = event;\n const isClosed = node.end !== UNFINISHED;\n if (isClosed || node.concise) return;\n\n const { offset, parsed, code } = event;\n const closingTagStr = `</${node.nameText}>`;\n\n if (offset === node.open.end) {\n // We're at the end of the open tag and the closing tag was not found.\n return [\n {\n label: closingTagStr,\n kind: CompletionItemKind.Class,\n insertTextFormat: InsertTextFormat.Snippet,\n insertText: `\\n\\t$0\\n${closingTagStr}`,\n },\n ];\n } else if (node.close && offset >= node.close.start) {\n // We have an unfinished closing tag.\n const start = node.close.start;\n partialCloseTagReg.lastIndex = start;\n const [{ length }] = partialCloseTagReg.exec(code)!;\n const end = start + length;\n\n return [\n {\n label: closingTagStr,\n kind: CompletionItemKind.Class,\n insertTextFormat: InsertTextFormat.Snippet,\n textEdit: TextEdit.replace(\n parsed.locationAt({\n start,\n end,\n }),\n closingTagStr\n ),\n },\n ];\n }\n}\n", "import path from \"path\";\nimport { URI } from \"vscode-uri\";\nimport {\n CompletionItemKind,\n CompletionItem,\n InsertTextFormat,\n MarkupKind,\n TextEdit,\n} from \"vscode-languageserver\";\nimport type { TagDefinition } from \"@marko/babel-utils\";\nimport { type Node, NodeType } from \"../../../utils/parser\";\nimport { getDocFile } from \"../../../utils/doc-file\";\nimport type { CompletionMeta, CompletionResult } from \".\";\n\nexport function OpenTagName({\n document,\n lookup,\n parsed,\n node,\n}: CompletionMeta<Node.OpenTagName>): CompletionResult {\n const currentTemplateFilePath = getDocFile(document);\n const tag = node.parent;\n const tagNameLocation = parsed.locationAt(node);\n let tags: TagDefinition[];\n\n if (tag.type === NodeType.AttrTag) {\n let parentTag = tag.owner;\n while (parentTag?.type === NodeType.AttrTag) parentTag = parentTag.owner;\n const parentTagDef =\n parentTag && parentTag.nameText && lookup.getTag(parentTag.nameText);\n tags =\n (parentTagDef &&\n parentTagDef.nestedTags &&\n Object.values(parentTagDef.nestedTags)) ||\n [];\n } else {\n tags = lookup.getTagsSorted().filter((it) => !it.isNestedTag);\n }\n\n return 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[${\n currentTemplateFilePath\n ? path.relative(currentTemplateFilePath, fileForTag)\n : currentTemplateFilePath\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 tagNameLocation,\n (autocomplete && autocomplete.snippet) || label\n ),\n } as CompletionItem;\n });\n}\n", "import {\n type CompletionItem,\n type MarkupContent,\n CompletionItemKind,\n MarkupKind,\n InsertTextFormat,\n TextEdit,\n} from \"vscode-languageserver\";\n\nimport type { Node } from \"../../../utils/parser\";\nimport type { CompletionMeta, CompletionResult } from \".\";\n\nexport function AttrName({\n offset,\n node,\n parsed,\n lookup,\n}: CompletionMeta<Node.AttrName>): CompletionResult {\n let name = parsed.read(node);\n if (name[0] === \"{\") return; // Ignore tag blocks.\n\n const modifierIndex = name.indexOf(\":\");\n const hasModifier = modifierIndex !== -1;\n\n if (hasModifier) {\n if (offset >= node.start + modifierIndex) {\n return [\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 } else {\n name = name.slice(0, modifierIndex);\n }\n }\n\n const completions: CompletionItem[] = [];\n const attrNameLoc = parsed.locationAt(\n hasModifier\n ? {\n start: node.start,\n end: node.start + name.length,\n }\n : node\n );\n\n const tagName = node.parent.parent.nameText || \"\";\n const tagDef = tagName && lookup.getTag(tagName);\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 lookup.forEachAttribute(tagName, (attr) => {\n if (attr.type === \"never\") {\n neverAttrs.add(attr.name);\n }\n });\n\n lookup.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(attrNameLoc, snippet),\n });\n });\n\n return completions;\n}\n", "import { Diagnostic, DiagnosticSeverity, Range } from \"vscode-languageserver\";\nimport { getCompilerInfo } from \"../../utils/compiler\";\nimport { getDocFile } from \"../../utils/doc-file\";\nimport type { Plugin } from \"../types\";\n\nconst markoErrorRegExp = /^(.+?)(?:\\((\\d+)(?:\\s*,\\s*(\\d+))?\\))?: (.*)$/gm;\n\nexport const doValidate: Plugin[\"doValidate\"] = (doc) => {\n const fsPath = getDocFile(doc);\n const diagnostics: Diagnostic[] = [];\n\n const { compiler, translator, cache } = getCompilerInfo(doc);\n\n try {\n compiler.compileSync(doc.getText(), fsPath || \"untitled.marko\", {\n cache,\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", "import path from \"path\";\nimport { URI } from \"vscode-uri\";\nimport { Range, LocationLink } from \"vscode-languageserver\";\nimport type { TagDefinition } from \"../../../utils/compiler\";\nimport RegExpBuilder from \"../../../utils/regexp-builder\";\nimport { START_OF_FILE, createTextDocument } from \"../../../utils/utils\";\nimport { Node, NodeType } from \"../../../utils/parser\";\nimport type { DefinitionMeta, DefinitionResult } from \".\";\n\nexport function OpenTagName({\n lookup,\n parsed,\n node,\n}: DefinitionMeta<Node.OpenTagName>): DefinitionResult {\n const tag = node.parent;\n let tagDef: TagDefinition | null | undefined;\n let range = START_OF_FILE;\n\n if (tag.type === NodeType.AttrTag) {\n let parentTag = tag.owner;\n while (parentTag?.type === NodeType.AttrTag) parentTag = parentTag.owner;\n tagDef =\n parentTag && parentTag.nameText\n ? lookup.getTag(parentTag.nameText)\n : undefined;\n } else {\n tagDef = tag.nameText ? lookup.getTag(tag.nameText) : undefined;\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`/\"(?:<${tag.nameText}>|${tag.nameText})\"\\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 parsed.locationAt(node)\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 fs from \"fs\";\nimport { URI } from \"vscode-uri\";\nimport { Position, Range } from \"vscode-languageserver\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\n\nexport const START_OF_FILE = Range.create(\n Position.create(0, 0),\n Position.create(0, 0)\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", "import { URI } from \"vscode-uri\";\nimport { Range, LocationLink } from \"vscode-languageserver\";\nimport RegExpBuilder from \"../../../utils/regexp-builder\";\nimport { START_OF_FILE, createTextDocument } from \"../../../utils/utils\";\nimport type { Node } from \"../../../utils/parser\";\nimport type { DefinitionMeta, DefinitionResult } from \".\";\n\nexport function AttrName({\n lookup,\n parsed,\n node,\n}: DefinitionMeta<Node.AttrName>): DefinitionResult {\n const tagName = node.parent.parent.nameText;\n const attrName = parsed.read(node);\n if (attrName[0] === \"{\") return; // Ignore tag blocks.\n\n const tagDef = tagName && lookup.getTag(tagName);\n const attrDef = lookup.getAttribute(tagName || \"\", attrName);\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`/\"@${attrName}\"\\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 parsed.locationAt(node)\n ),\n ];\n}\n", "import type { DefinitionParams, DefinitionLink } from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport { getCompilerInfo, parse } from \"../../../utils/compiler\";\nimport { NodeType } from \"../../../utils/parser\";\nimport type { Plugin, Result } from \"../../types\";\nimport { OpenTagName } from \"./OpenTagName\";\nimport { AttrName } from \"./AttrName\";\n\nexport type DefinitionResult = Result<DefinitionLink[]>;\nexport interface DefinitionMeta<N = unknown>\n extends ReturnType<typeof getCompilerInfo> {\n document: TextDocument;\n params: DefinitionParams;\n parsed: ReturnType<typeof parse>;\n offset: number;\n code: string;\n node: N;\n}\n\nconst handlers: Record<\n string,\n (data: DefinitionMeta<any>) => DefinitionResult\n> = {\n OpenTagName,\n AttrName,\n};\n\nexport const findDefinition: Plugin[\"findDefinition\"] = async (doc, params) => {\n const parsed = parse(doc);\n const offset = doc.offsetAt(params.position);\n const node = parsed.nodeAt(offset);\n return (\n (await handlers[NodeType[node.type]]?.({\n document: doc,\n params,\n parsed,\n offset,\n node,\n code: doc.getText(),\n ...getCompilerInfo(doc),\n })) || []\n );\n};\n", "import { Position, Range, TextEdit } from \"vscode-languageserver\";\nimport { URI } from \"vscode-uri\";\nimport * as prettier from \"prettier\";\nimport * as markoPrettier from \"prettier-plugin-marko\";\nimport { displayError } from \"../../utils/messages\";\nimport type { Plugin } from \"../types\";\n\nconst NO_EDIT = [\n TextEdit.replace(\n Range.create(Position.create(0, 0), Position.create(0, 0)),\n \"\"\n ),\n];\n\nexport const format: Plugin[\"format\"] = async (doc, params, token) => {\n try {\n const { fsPath, scheme } = URI.parse(doc.uri);\n const text = doc.getText();\n const options: prettier.Options = {\n parser: \"marko\",\n filepath: fsPath,\n plugins: [markoPrettier],\n tabWidth: params.options.tabSize,\n useTabs: params.options.insertSpaces === false,\n ...(scheme === \"file\"\n ? await prettier\n .resolveConfig(fsPath, {\n editorconfig: true,\n })\n .catch(() => null)\n : null),\n };\n\n if (!token.isCancellationRequested) {\n // TODO: format selection\n return [\n TextEdit.replace(\n Range.create(doc.positionAt(0), doc.positionAt(text.length)),\n prettier.format(text, options)\n ),\n ];\n }\n } catch (e) {\n displayError(e);\n }\n\n return NO_EDIT;\n};\n", "import type { Plugin } from \"../types\";\nimport { doComplete } from \"./complete\";\nimport { doValidate } from \"./validate\";\nimport { findDefinition } from \"./definition\";\nimport { format } from \"./format\";\n\nexport default {\n doComplete,\n doValidate,\n findDefinition,\n format,\n} as Plugin;\n", "import {\n CompletionList,\n Diagnostic,\n InsertReplaceEdit,\n Range,\n TextEdit,\n} from \"vscode-languageserver\";\nimport {\n getCSSLanguageService,\n getLESSLanguageService,\n getSCSSLanguageService,\n LanguageService,\n} from \"vscode-css-languageservice\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport { getCompilerInfo, parse } from \"../../utils/compiler\";\nimport { START_OF_FILE } from \"../../utils/utils\";\nimport type { Plugin } from \"../types\";\nimport { extractStyleSheets } from \"./extract\";\n\ninterface StyleSheetInfo {\n virtualDoc: TextDocument;\n service: LanguageService;\n parsed: ReturnType<LanguageService[\"parseStylesheet\"]>;\n sourceOffsetAt(generatedOffset: number): number | undefined;\n generatedOffsetAt(sourceOffset: number): number | undefined;\n}\n\nconst cache = new WeakMap<\n ReturnType<typeof parse>,\n Record<string, StyleSheetInfo>\n>();\n\nconst services: Record<string, () => LanguageService> = {\n css: getCSSLanguageService,\n less: getLESSLanguageService,\n scss: getSCSSLanguageService,\n};\n\nexport default {\n async doComplete(doc, params) {\n const infoByExt = getStyleSheetInfo(doc);\n const sourceOffset = doc.offsetAt(params.position);\n\n for (const ext in infoByExt) {\n const info = infoByExt[ext];\n // Find the first stylesheet data that contains the offset.\n const generatedOffset = info.generatedOffsetAt(sourceOffset);\n if (generatedOffset === undefined) continue;\n\n const { service, virtualDoc } = info;\n const result = service.doComplete(\n virtualDoc,\n virtualDoc.positionAt(generatedOffset),\n info.parsed\n );\n\n for (const item of result.items) {\n if (item.additionalTextEdits) {\n for (const edit of item.additionalTextEdits) {\n if (!updateRange(doc, info, edit.range)) {\n edit.newText = \"\";\n edit.range = START_OF_FILE;\n }\n }\n }\n\n const { textEdit } = item;\n if (textEdit) {\n if ((textEdit as TextEdit).range) {\n if (!updateRange(doc, info, (textEdit as TextEdit).range)) {\n textEdit.newText = \"\";\n (textEdit as TextEdit).range = START_OF_FILE;\n }\n }\n\n if ((textEdit as InsertReplaceEdit).insert) {\n if (\n !updateRange(doc, info, (textEdit as InsertReplaceEdit).insert)\n ) {\n textEdit.newText = \"\";\n (textEdit as InsertReplaceEdit).insert = START_OF_FILE;\n }\n }\n }\n }\n\n return result;\n }\n\n return CompletionList.create([], true);\n },\n async findDefinition(doc, params) {\n const infoByExt = getStyleSheetInfo(doc);\n const sourceOffset = doc.offsetAt(params.position);\n\n for (const ext in infoByExt) {\n const info = infoByExt[ext];\n // Find the first stylesheet data that contains the offset.\n const generatedOffset = info.generatedOffsetAt(sourceOffset);\n if (generatedOffset === undefined) continue;\n\n const { service, virtualDoc } = info;\n const result = service.findDefinition(\n virtualDoc,\n virtualDoc.positionAt(generatedOffset),\n info.parsed\n );\n\n if (result && updateRange(doc, info, result.range)) {\n return result;\n }\n\n break;\n }\n },\n async doHover(doc, params) {\n const infoByExt = getStyleSheetInfo(doc);\n const sourceOffset = doc.offsetAt(params.position);\n\n for (const ext in infoByExt) {\n const info = infoByExt[ext];\n // Find the first stylesheet data that contains the offset.\n const generatedOffset = info.generatedOffsetAt(sourceOffset);\n if (generatedOffset === undefined) continue;\n\n const { service, virtualDoc } = info;\n const result = service.doHover(\n virtualDoc,\n virtualDoc.positionAt(generatedOffset),\n service.parseStylesheet(virtualDoc)\n );\n\n if (result && (!result.range || updateRange(doc, info, result.range))) {\n return result;\n }\n }\n },\n async doValidate(doc) {\n const infoByExt = getStyleSheetInfo(doc);\n const result: Diagnostic[] = [];\n\n for (const ext in infoByExt) {\n const info = infoByExt[ext];\n\n for (const diag of info.service.doValidation(\n info.virtualDoc,\n info.parsed\n )) {\n if (updateRange(doc, info, diag.range)) {\n result.push(diag);\n }\n }\n }\n\n return result;\n },\n} as Partial<Plugin>;\n\nfunction updateRange(doc: TextDocument, info: StyleSheetInfo, range: Range) {\n const start = info.sourceOffsetAt(info.virtualDoc.offsetAt(range.start));\n const end = info.sourceOffsetAt(info.virtualDoc.offsetAt(range.end));\n\n if (start !== undefined || end !== undefined) {\n range.start = doc.positionAt(start ?? end!);\n range.end = doc.positionAt(end ?? start!);\n return true;\n }\n\n return false;\n}\n\nfunction getStyleSheetInfo(doc: TextDocument): Record<string, StyleSheetInfo> {\n const parsed = parse(doc);\n let cached = cache.get(parsed);\n\n if (!cached) {\n const results = extractStyleSheets(\n doc.getText(),\n parsed.program,\n getCompilerInfo(doc).lookup\n );\n\n cached = {};\n\n for (const ext in results) {\n const service = services[ext]?.();\n if (!service) continue;\n\n const { generated, sourceOffsetAt, generatedOffsetAt } = results[ext];\n const virtualDoc = TextDocument.create(\n doc.uri,\n \"css\",\n doc.version,\n generated\n );\n\n cached[ext] = {\n service,\n virtualDoc,\n sourceOffsetAt,\n generatedOffsetAt,\n parsed: service.parseStylesheet(virtualDoc),\n };\n }\n\n cache.set(parsed, cached);\n }\n\n return cached;\n}\n", "import type { Range } from \"./parser\";\n\n/**\n * Utility to build up generate code from source ranges while maintaining a source mapping.\n */\nexport function createExtractor(code: string) {\n let generated = \"\";\n const generatedMap: number[] = []; // grouped in sets of [generatedStart, sourceStart, sourceEnd] and sorted by generatedStart\n return {\n write(strs: TemplateStringsArray, ...exprs: (string | Range)[]) {\n const len = exprs.length;\n for (let i = 0; i < len; i++) {\n const expr = exprs[i];\n generated += strs[i];\n\n if (typeof expr === \"string\") {\n generated += expr;\n } else {\n generatedMap.push(generated.length, expr.start, expr.end);\n generated += code.slice(expr.start, expr.end);\n }\n }\n\n generated += strs[len];\n },\n end() {\n const sourceMap: typeof generatedMap = generatedMap.slice(); // grouped in sets of [generatedStart, sourceStart, sourceEnd] and sorted by sourceStart\n // Quick sort generatedMap by sourceStart\n (function sort(left: number, right: number) {\n if (left < right) {\n let next = left;\n\n for (let i = left; i <= right; i += 3) {\n if (sourceMap[i] <= sourceMap[right]) {\n [sourceMap[next - 1], sourceMap[i - 1]] = [\n sourceMap[i - 1],\n sourceMap[next - 1],\n ];\n [sourceMap[next], sourceMap[i]] = [sourceMap[i], sourceMap[next]];\n [sourceMap[next + 1], sourceMap[i + 1]] = [\n sourceMap[i + 1],\n sourceMap[next + 1],\n ];\n next += 3;\n }\n }\n\n next -= 3;\n sort(left, next - 3);\n sort(next + 3, right);\n }\n })(1, sourceMap.length - 2);\n return {\n generated,\n sourceOffsetAt(generatedOffset: number): number | undefined {\n let max = generatedMap.length / 3;\n let min = 0;\n\n while (min < max) {\n const mid = (1 + min + max) >>> 1;\n\n if (generatedMap[mid * 3] <= generatedOffset) {\n min = mid;\n } else {\n max = mid - 1;\n }\n }\n\n const key = min * 3;\n const generatedStart = generatedMap[key];\n const sourceStart = generatedMap[key + 1];\n const sourceEnd = generatedMap[key + 2];\n return sourceEnd - sourceStart <= generatedOffset - generatedStart\n ? undefined\n : sourceStart + (generatedOffset - generatedStart);\n },\n generatedOffsetAt(sourceOffset: number): number | undefined {\n let max = sourceMap.length / 3;\n let min = 0;\n\n while (min < max) {\n const mid = (1 + min + max) >>> 1;\n\n if (sourceMap[mid * 3 + 1] <= sourceOffset) {\n min = mid;\n } else {\n max = mid - 1;\n }\n }\n\n const key = min * 3;\n const sourceStart = sourceMap[key + 1];\n const sourceEnd = sourceMap[key + 2];\n if (sourceOffset < sourceStart || sourceOffset > sourceEnd)\n return undefined;\n\n const generatedStart = sourceMap[key];\n return generatedStart + (sourceOffset - sourceStart);\n },\n };\n },\n };\n}\n", "import type { TaglibLookup } from \"@marko/babel-utils\";\nimport { createExtractor } from \"../../utils/extractor\";\nimport { Node, Range, NodeType } from \"../../utils/parser\";\n\n/**\n * Iterate over the Marko CST and extract all the stylesheets.\n */\nexport function extractStyleSheets(\n code: string,\n program: Node.Program,\n lookup: TaglibLookup | null | undefined\n) {\n let placeholderId = 0;\n const extractorsByExt: Record<\n string,\n ReturnType<typeof createExtractor>\n > = {};\n const read = (range: Range) => code.slice(range.start, range.end);\n const getExtractor = (ext: string) =>\n extractorsByExt[ext] || (extractorsByExt[ext] = createExtractor(code));\n const getFileExtFromTag = (tag: Node.Tag) => {\n const prefixEnd = tag.shorthandClassNames\n ? tag.shorthandClassNames.at(-1)!.end\n : tag.name.end;\n\n return tag.shorthandClassNames\n ? read({\n start: tag.shorthandClassNames[0].start,\n end: prefixEnd,\n }).replace(/^.*\\./, \"\")\n : \"css\";\n };\n const visit = (node: Node.ChildNode) => {\n switch (node.type) {\n case NodeType.Tag:\n if (node.body?.length) {\n if (node.nameText === \"style\") {\n const ext = getFileExtFromTag(node);\n for (const child of node.body) {\n switch (child.type) {\n case NodeType.Text:\n // Add all the text nodes to the stylesheet.\n getExtractor(ext).write`${child}`;\n break;\n case NodeType.Placeholder:\n // Eventually we'll want to support placeholders in stylesheets, this just pretends they are custom properties.\n getExtractor(ext).write`${`var(--_${placeholderId++})`}`;\n break;\n }\n }\n } else {\n if (node.attrs) {\n for (const attr of node.attrs) {\n if (\n // Check for string literal attribute values.\n attr.type === NodeType.AttrNamed &&\n attr.value?.type === NodeType.AttrValue &&\n /^['\"]$/.test(code[attr.value.value.start])\n ) {\n const name = read(attr.name);\n\n // TODO: support #style directive with custom extension, eg `#style.less=\"\"`.\n // /^#style(?:\\..*)/.test(name)\n\n // Adds inline style and #style attributes to the stylesheet.\n if (\n name === \"#style\" ||\n (name === \"style\" &&\n lookup &&\n node.nameText &&\n name === \"style\" &&\n lookup.getTag(node.nameText)?.html)\n ) {\n // Add inline \"style\" attribute.\n getExtractor(\"css\").write`:root{${{\n start: attr.value.value.start + 1,\n end: attr.value.value.end - 1,\n }}}`;\n }\n }\n }\n }\n for (const child of node.body) {\n visit(child);\n }\n }\n } else if (node.nameText === \"style\" && node.concise && node.attrs) {\n const block = node.attrs.at(-1)!;\n // Adds style blocks to the style sheet.\n if (block.type === NodeType.AttrNamed && code[block.start] === \"{\") {\n getExtractor(getFileExtFromTag(node)).write`${{\n start: block.start + 1,\n end: block.end - 1,\n }}`;\n }\n }\n break;\n }\n };\n\n for (const node of program.body) visit(node);\n\n const resultsByExt: Record<\n string,\n ReturnType<ReturnType<typeof createExtractor>[\"end\"]>\n > = {};\n\n for (const ext in extractorsByExt) {\n resultsByExt[ext] = extractorsByExt[ext].end();\n }\n\n return resultsByExt;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { TextDocument } from "vscode-languageserver-textdocument";
|
|
2
|
+
import { CompletionItem, CompletionParams } from "vscode-languageserver";
|
|
3
|
+
import { getCompilerInfo, parse } from "../../../utils/compiler";
|
|
4
|
+
import type { Plugin, Result } from "../../types";
|
|
5
|
+
export declare type CompletionResult = Result<CompletionItem[]>;
|
|
6
|
+
export interface CompletionMeta<N = unknown> extends ReturnType<typeof getCompilerInfo> {
|
|
7
|
+
document: TextDocument;
|
|
8
|
+
params: CompletionParams;
|
|
9
|
+
parsed: ReturnType<typeof parse>;
|
|
10
|
+
offset: number;
|
|
11
|
+
code: string;
|
|
12
|
+
node: N;
|
|
13
|
+
}
|
|
14
|
+
export declare const doComplete: Plugin["doComplete"];
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { DefinitionParams, DefinitionLink } from "vscode-languageserver";
|
|
2
|
+
import type { TextDocument } from "vscode-languageserver-textdocument";
|
|
3
|
+
import { getCompilerInfo, parse } from "../../../utils/compiler";
|
|
4
|
+
import type { Plugin, Result } from "../../types";
|
|
5
|
+
export declare type DefinitionResult = Result<DefinitionLink[]>;
|
|
6
|
+
export interface DefinitionMeta<N = unknown> extends ReturnType<typeof getCompilerInfo> {
|
|
7
|
+
document: TextDocument;
|
|
8
|
+
params: DefinitionParams;
|
|
9
|
+
parsed: ReturnType<typeof parse>;
|
|
10
|
+
offset: number;
|
|
11
|
+
code: string;
|
|
12
|
+
node: N;
|
|
13
|
+
}
|
|
14
|
+
export declare const findDefinition: Plugin["findDefinition"];
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { TaglibLookup } from "@marko/babel-utils";
|
|
2
|
+
import { Node } from "../../utils/parser";
|
|
3
|
+
/**
|
|
4
|
+
* Iterate over the Marko CST and extract all the stylesheets.
|
|
5
|
+
*/
|
|
6
|
+
export declare function extractStyleSheets(code: string, program: Node.Program, lookup: TaglibLookup | null | undefined): Record<string, {
|
|
7
|
+
generated: string;
|
|
8
|
+
sourceOffsetAt(generatedOffset: number): number | undefined;
|
|
9
|
+
generatedOffsetAt(sourceOffset: number): number | undefined;
|
|
10
|
+
}>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { CancellationToken, CompletionItem, CompletionList, CompletionParams, DefinitionParams, Diagnostic, DocumentFormattingParams, Hover, HoverParams, Location, LocationLink, TextEdit } from "vscode-languageserver";
|
|
2
|
+
import type { TextDocument } from "vscode-languageserver-textdocument";
|
|
3
|
+
export declare type Result<V> = Promise<V | void> | V | void;
|
|
4
|
+
declare type Handler<P, R> = (doc: TextDocument, params: P extends null ? CancellationToken : P, token: P extends null ? never : CancellationToken) => Result<R>;
|
|
5
|
+
export declare type Plugin = {
|
|
6
|
+
doComplete: Handler<CompletionParams, CompletionItem[] | CompletionList>;
|
|
7
|
+
doValidate: (doc: TextDocument) => Result<Diagnostic[]>;
|
|
8
|
+
doHover: Handler<HoverParams, Hover>;
|
|
9
|
+
findDefinition: Handler<DefinitionParams, Location | LocationLink | (Location | LocationLink)[]>;
|
|
10
|
+
format: Handler<DocumentFormattingParams, TextEdit[]>;
|
|
11
|
+
};
|
|
12
|
+
export {};
|
package/dist/utils/compiler.d.ts
CHANGED
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
import type { TextDocument } from "vscode-languageserver-textdocument";
|
|
2
|
+
import type { Connection, TextDocuments } from "vscode-languageserver";
|
|
2
3
|
import type { AttributeDefinition, TagDefinition, TaglibLookup } from "@marko/babel-utils";
|
|
4
|
+
import * as builtinCompiler from "@marko/compiler";
|
|
5
|
+
import * as parser from "./parser";
|
|
3
6
|
export declare type Compiler = typeof import("@marko/compiler");
|
|
4
7
|
export { AttributeDefinition, TagDefinition, TaglibLookup };
|
|
5
|
-
export declare type
|
|
8
|
+
export declare type CompilerInfo = {
|
|
9
|
+
cache: Map<unknown, unknown>;
|
|
10
|
+
lookup: TaglibLookup;
|
|
6
11
|
compiler: Compiler;
|
|
7
|
-
translator:
|
|
12
|
+
translator: builtinCompiler.Config["translator"];
|
|
8
13
|
};
|
|
9
|
-
export declare function
|
|
10
|
-
|
|
14
|
+
export declare function parse(doc: TextDocument): {
|
|
15
|
+
read: (range: parser.Range) => string;
|
|
16
|
+
locationAt: (range: parser.Range) => import("htmljs-parser").Location;
|
|
17
|
+
positionAt: (offset: number) => import("htmljs-parser").Position;
|
|
18
|
+
nodeAt: (offset: number) => parser.Node.AnyNode;
|
|
19
|
+
program: parser.Node.Program;
|
|
20
|
+
};
|
|
21
|
+
export declare function getCompilerInfo(doc: TextDocument): CompilerInfo;
|
|
22
|
+
export default function setup(connection: Connection, documents: TextDocuments<TextDocument>): void;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Range } from "./parser";
|
|
2
|
+
/**
|
|
3
|
+
* Utility to build up generate code from source ranges while maintaining a source mapping.
|
|
4
|
+
*/
|
|
5
|
+
export declare function createExtractor(code: string): {
|
|
6
|
+
write(strs: TemplateStringsArray, ...exprs: (string | Range)[]): void;
|
|
7
|
+
end(): {
|
|
8
|
+
generated: string;
|
|
9
|
+
sourceOffsetAt(generatedOffset: number): number | undefined;
|
|
10
|
+
generatedOffsetAt(sourceOffset: number): number | undefined;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Connection } from "vscode-languageserver";
|
|
2
|
+
export default function setup(_: Connection): void;
|
|
3
|
+
export declare function displayInformation(data: unknown): void;
|
|
4
|
+
export declare function displayWarning(data: unknown): void;
|
|
5
|
+
export declare function displayError(data: unknown): void;
|