@marko/language-server 0.12.11 → 0.12.14
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 +391 -216
- package/dist/index.js.map +3 -3
- package/dist/index.mjs +375 -199
- package/dist/index.mjs.map +3 -3
- package/dist/service/marko/complete/Statement.d.ts +3 -0
- package/dist/service/marko/{document-links/index.d.ts → document-links.d.ts} +1 -1
- package/dist/service/marko/document-symbols.d.ts +2 -0
- package/dist/service/marko/hover/OpenTagName.d.ts +3 -0
- package/dist/service/marko/hover/index.d.ts +14 -0
- package/dist/service/marko/util/get-tag-name-completion.d.ts +8 -0
- package/dist/service/types.d.ts +2 -1
- package/package.json +8 -8
- package/dist/service/marko/document-links/extract.d.ts +0 -8
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
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/complete/AttrValue.ts", "../src/service/marko/util/is-document-link-attr.ts", "../src/utils/file-system.ts", "../src/utils/resolve-url.ts", "../src/service/marko/validate.ts", "../src/service/marko/
|
|
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 { clearCompilerCache } 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 prevDiags = new WeakMap<TextDocument, Diagnostic[]>();\nconst pendingDiags = new WeakSet<TextDocument>();\nlet diagnosticTimeout: ReturnType<typeof setTimeout> | undefined;\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(async (params) => {\n setupMessages(connection);\n await service.initialize(params);\n\n return {\n capabilities: {\n textDocumentSync: TextDocumentSyncKind.Incremental,\n documentFormattingProvider: true,\n definitionProvider: true,\n hoverProvider: true,\n renameProvider: true,\n codeActionProvider: true,\n referencesProvider: true,\n documentLinkProvider: { resolveProvider: false },\n colorProvider: true,\n documentHighlightProvider: 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.onDidChangeConfiguration(validateDocs);\nconnection.onDidChangeWatchedFiles(validateDocs);\ndocuments.onDidChangeContent(({ document }) => {\n queueDiagnostic();\n pendingDiags.add(document);\n clearCompilerCache(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.onReferences(async (params, cancel) => {\n return (\n (await service.findReferences(\n documents.get(params.textDocument.uri)!,\n params,\n cancel\n )) || null\n );\n});\n\nconnection.onDocumentLinks(async (params, cancel) => {\n return (\n (await service.findDocumentLinks(\n documents.get(params.textDocument.uri)!,\n params,\n cancel\n )) || null\n );\n});\n\nconnection.onDocumentHighlight(async (params, cancel) => {\n return (\n (await service.findDocumentHighlights(\n documents.get(params.textDocument.uri)!,\n params,\n cancel\n )) || null\n );\n});\n\nconnection.onDocumentColor(async (params, cancel) => {\n return (\n (await service.findDocumentColors(\n documents.get(params.textDocument.uri)!,\n params,\n cancel\n )) || null\n );\n});\n\nconnection.onColorPresentation(async (params, cancel) => {\n return (\n (await service.getColorPresentations(\n documents.get(params.textDocument.uri)!,\n params,\n cancel\n )) || 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.onRenameRequest(async (params, cancel) => {\n return (\n (await service.doRename(\n documents.get(params.textDocument.uri)!,\n params,\n cancel\n )) || null\n );\n});\n\nconnection.onCodeAction(async (params, cancel) => {\n return (\n (await service.doCodeActions(\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 validateDocs() {\n queueDiagnostic();\n clearCompilerCache();\n for (const doc of documents.all()) {\n pendingDiags.add(doc);\n }\n}\n\nfunction queueDiagnostic() {\n clearTimeout(diagnosticTimeout);\n const id = (diagnosticTimeout = setTimeout(async () => {\n const results = await Promise.all(\n documents.all().map(async (doc) => {\n if (!pendingDiags.delete(doc)) return;\n const prevDiag = prevDiags.get(doc) || [];\n const nextDiag = (await service.doValidate(doc)) || [];\n if (isDeepStrictEqual(prevDiag, nextDiag)) return;\n return [doc, nextDiag] as const;\n })\n );\n\n // Check that it wasn't canceled.\n if (id === diagnosticTimeout) {\n for (const result of results) {\n if (result) {\n const [doc, diag] = result;\n prevDiags.set(doc, diag);\n connection.sendDiagnostics({\n uri: doc.uri,\n diagnostics: diag,\n });\n }\n }\n }\n }, 400));\n}\n\ndocuments.listen(connection);\nconnection.listen();\n", "import 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\";\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 function clearCompilerCache(doc?: TextDocument) {\n if (doc) {\n getCompilerInfo(doc).cache.delete(doc);\n } else {\n for (const [, info] of compilerInfoByDir) {\n info.cache.clear();\n info.compiler.taglib.clearCaches();\n }\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 CodeAction,\n ColorInformation,\n ColorPresentation,\n Command,\n CompletionItem,\n CompletionList,\n DefinitionLink,\n Diagnostic,\n DocumentHighlight,\n DocumentLink,\n Location,\n WorkspaceEdit,\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 initialize(params) {\n await Promise.all(plugins.map((plugin) => plugin.initialize?.(params)));\n },\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) return;\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) return;\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 findReferences(doc, params, cancel) {\n let result: Location[] | undefined;\n\n try {\n const requests = plugins.map((plugin) =>\n plugin.findReferences?.(doc, params, cancel)\n );\n for (const pending of requests) {\n const cur = await pending;\n if (cancel.isCancellationRequested) return;\n if (cur) {\n if (result) {\n result.push(...cur);\n } else {\n result = cur;\n }\n }\n }\n } catch (err) {\n displayError(err);\n }\n\n return result;\n },\n async findDocumentLinks(doc, params, cancel) {\n let result: DocumentLink[] | undefined;\n\n try {\n const requests = plugins.map((plugin) =>\n plugin.findDocumentLinks?.(doc, params, cancel)\n );\n for (const pending of requests) {\n const cur = await pending;\n if (cancel.isCancellationRequested) return;\n if (cur) {\n if (result) {\n result.push(...cur);\n } else {\n result = cur;\n }\n }\n }\n } catch (err) {\n displayError(err);\n }\n\n return result;\n },\n async findDocumentHighlights(doc, params, cancel) {\n let result: DocumentHighlight[] | undefined;\n\n try {\n const requests = plugins.map((plugin) =>\n plugin.findDocumentHighlights?.(doc, params, cancel)\n );\n for (const pending of requests) {\n const cur = await pending;\n if (cancel.isCancellationRequested) return;\n if (cur) {\n if (result) {\n result.push(...cur);\n } else {\n result = cur;\n }\n }\n }\n } catch (err) {\n displayError(err);\n }\n\n return result;\n },\n async findDocumentColors(doc, params, cancel) {\n let result: ColorInformation[] | undefined;\n\n try {\n const requests = plugins.map((plugin) =>\n plugin.findDocumentColors?.(doc, params, cancel)\n );\n for (const pending of requests) {\n const cur = await pending;\n if (cancel.isCancellationRequested) return;\n if (cur) {\n if (result) {\n result.push(...cur);\n } else {\n result = cur;\n }\n }\n }\n } catch (err) {\n displayError(err);\n }\n\n return result;\n },\n async getColorPresentations(doc, params, cancel) {\n let result: ColorPresentation[] | undefined;\n\n try {\n const requests = plugins.map((plugin) =>\n plugin.getColorPresentations?.(doc, params, cancel)\n );\n for (const pending of requests) {\n const cur = await pending;\n if (cancel.isCancellationRequested) return;\n if (cur) {\n if (result) {\n result.push(...cur);\n } else {\n result = 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 doRename(doc, params, cancel) {\n let changes: WorkspaceEdit[\"changes\"];\n let changeAnnotations: WorkspaceEdit[\"changeAnnotations\"];\n let documentChanges: WorkspaceEdit[\"documentChanges\"];\n\n try {\n const requests = plugins.map((plugin) =>\n plugin.doRename?.(doc, params, cancel)\n );\n for (const pending of requests) {\n const cur = await pending;\n if (cancel.isCancellationRequested) return;\n\n if (cur) {\n if (cur.changes) {\n if (changes) {\n for (const uri in cur.changes) {\n if (changes[uri]) {\n changes[uri].push(...cur.changes[uri]);\n } else {\n changes[uri] = cur.changes[uri];\n }\n }\n } else {\n changes = cur.changes;\n }\n }\n\n if (cur.changeAnnotations) {\n if (changeAnnotations) {\n Object.assign(changeAnnotations, cur.changeAnnotations);\n } else {\n changeAnnotations = cur.changeAnnotations;\n }\n }\n\n if (cur.documentChanges) {\n if (documentChanges) {\n documentChanges.push(...cur.documentChanges);\n } else {\n documentChanges = cur.documentChanges;\n }\n }\n }\n }\n } catch (err) {\n displayError(err);\n }\n\n if (changes || changeAnnotations || documentChanges) {\n return {\n changes,\n changeAnnotations,\n documentChanges,\n };\n }\n },\n async doCodeActions(doc, params, cancel) {\n const result: (Command | CodeAction)[] = [];\n\n try {\n const requests = plugins.map((plugin) =>\n plugin.doCodeActions?.(doc, params, cancel)\n );\n for (const pending of requests) {\n const cur = await pending;\n if (cancel.isCancellationRequested) return;\n if (cur) {\n result.push(...cur);\n }\n }\n } catch (err) {\n displayError(err);\n }\n\n return result;\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 { AttrValue } from \"./AttrValue\";\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 AttrValue,\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 path from \"path\";\nimport {\n CompletionItem,\n CompletionItemKind,\n Range,\n TextEdit,\n} from \"vscode-languageserver\";\nimport type { Node } from \"../../../utils/parser\";\nimport isDocumentLinkAttr from \"../util/is-document-link-attr\";\nimport fileSystem, { FileType } from \"../../../utils/file-system\";\nimport resolveUrl from \"../../../utils/resolve-url\";\nimport type { CompletionMeta } from \".\";\n\nexport async function AttrValue({\n document,\n offset,\n node,\n parsed,\n code,\n}: CompletionMeta<Node.AttrValue>): Promise<void | CompletionItem[]> {\n const attr = node.parent;\n if (isDocumentLinkAttr(document, attr.parent, attr)) {\n const start = node.value.start + 1;\n if (code[start] !== \".\") return; // only resolve relative paths\n\n const end = node.value.end - 1;\n const relativeOffset = offset - start;\n const rawValue = parsed.read({\n start,\n end,\n });\n\n const segmentStart = rawValue.lastIndexOf(\"/\", relativeOffset);\n if (segmentStart === -1) return; // only resolve after a slash.\n\n const req = rawValue.slice(0, segmentStart);\n const uri = resolveUrl(req, document.uri);\n\n if (uri) {\n const result: CompletionItem[] = [];\n const curFile = req === \".\" ? path.basename(document.uri) : undefined;\n const replaceRange = Range.create(\n document.positionAt(start + segmentStart + 1),\n document.positionAt(start + rawValue.length)\n );\n\n for (const [entry, type] of await fileSystem.readDirectory(uri)) {\n if (entry[0] !== \".\" && entry !== curFile) {\n result.push(\n type === FileType.Directory\n ? {\n label: `${entry}/`,\n kind: CompletionItemKind.Folder,\n textEdit: TextEdit.replace(replaceRange, `${entry}/`),\n command: {\n title: \"Suggest\",\n command: \"editor.action.triggerSuggest\",\n },\n }\n : {\n label: entry,\n kind: CompletionItemKind.File,\n textEdit: TextEdit.replace(replaceRange, entry),\n }\n );\n }\n }\n\n return result;\n }\n }\n}\n", "import type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport { type Node, NodeType } from \"../../../utils/parser\";\n\nconst linkedAttrs: Map<string, Set<string>> = new Map([\n [\n \"src\",\n new Set([\n \"audio\",\n \"embed\",\n \"iframe\",\n \"img\",\n \"input\",\n \"script\",\n \"source\",\n \"track\",\n \"video\",\n ]),\n ],\n [\"href\", new Set([\"a\", \"area\", \"link\"])],\n [\"data\", new Set([\"object\"])],\n [\"poster\", new Set([\"video\"])],\n]);\n\nexport default function isDocumentLinkAttr(\n doc: TextDocument,\n tag: Node.ParentTag,\n attr: Node.AttrNode\n): attr is Node.AttrNamed & { value: Node.AttrValue } {\n return (\n (tag.nameText &&\n attr.type === NodeType.AttrNamed &&\n attr.value?.type === NodeType.AttrValue &&\n /^['\"]$/.test(doc.getText()[attr.value.value.start]) &&\n linkedAttrs\n .get(doc.getText().slice(attr.name.start, attr.name.end))\n ?.has(tag.nameText)) ||\n false\n );\n}\n", "import fs from \"fs/promises\";\nimport { type FileStat, FileType } from \"vscode-css-languageservice\";\nimport { fileURLToPath } from \"url\";\n\nexport { FileStat, FileType };\nexport default {\n stat,\n readDirectory,\n};\nasync function stat(uri: string): Promise<FileStat> {\n let type = FileType.Unknown;\n let ctime = -1;\n let mtime = -1;\n let size = -1;\n\n try {\n const stat = await fs.stat(fileURLToPath(uri));\n if (stat.isDirectory()) type = FileType.Directory;\n else if (stat.isFile()) type = FileType.File;\n ctime = stat.ctimeMs;\n mtime = stat.mtimeMs;\n size = stat.size;\n } catch {\n // ignore\n }\n\n return {\n type,\n ctime,\n mtime,\n size,\n };\n}\n\nasync function readDirectory(uri: string): Promise<[string, FileType][]> {\n try {\n const entries = await fs.readdir(fileURLToPath(uri));\n const base = uri.at(-1) === \"/\" ? uri : `${uri}/`;\n return (\n await Promise.all(\n entries.map(\n async (entry) =>\n [entry, (await stat(new URL(entry, base).toString())).type] as [\n string,\n FileType\n ]\n )\n )\n ).filter(([, type]) => type !== FileType.Unknown);\n } catch {\n return [];\n }\n}\n", "export default function resolveUrl(to: string, base: string) {\n try {\n const url = new URL(to, base);\n if (url.protocol === \"file:\") return url.toString();\n } catch {\n return undefined;\n }\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 translator,\n code: false,\n output: \"source\",\n sourceMaps: false,\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 type { TaglibLookup } from \"@marko/babel-utils\";\nimport { DocumentLink } from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport { URI } from \"vscode-uri\";\nimport {\n type Node,\n type Range,\n type parse,\n NodeType,\n} from \"../../../utils/parser\";\nimport resolveUrl from \"../../../utils/resolve-url\";\nimport isDocumentLinkAttr from \"../util/is-document-link-attr\";\n\nconst importTagReg = /(['\"])<((?:[^\\1\\\\>]+|\\\\.)*)>?\\1/g;\n\n/**\n * Iterate over the Marko CST and extract all the file links in the document.\n */\nexport function extractDocumentLinks(\n doc: TextDocument,\n parsed: ReturnType<typeof parse>,\n lookup: TaglibLookup\n): DocumentLink[] {\n if (URI.parse(doc.uri).scheme === \"untitled\") {\n return [];\n }\n\n const links: DocumentLink[] = [];\n const { program } = parsed;\n const code = doc.getText();\n const read = (range: Range) => code.slice(range.start, range.end);\n const visit = (node: Node.ChildNode) => {\n switch (node.type) {\n case NodeType.Tag:\n if (node.attrs && node.nameText) {\n for (const attr of node.attrs) {\n if (isDocumentLinkAttr(doc, node, attr)) {\n links.push(\n DocumentLink.create(\n {\n start: parsed.positionAt(attr.value.value.start),\n end: parsed.positionAt(attr.value.value.end),\n },\n resolveUrl(read(attr.value.value).slice(1, -1), doc.uri)\n )\n );\n }\n }\n }\n if (node.body) {\n for (const child of node.body) {\n visit(child);\n }\n }\n\n break;\n }\n };\n\n for (const item of program.static) {\n // check for import statement (this currently only support the tag import shorthand).\n if (item.type === NodeType.Statement && code[item.start] === \"i\") {\n importTagReg.lastIndex = 0;\n const value = parsed.read(item);\n const match = importTagReg.exec(value);\n if (match) {\n const [{ length }, , tagName] = match;\n const tagDef = lookup.getTag(tagName);\n const fileForTag = tagDef && (tagDef.template || tagDef.renderer);\n\n if (fileForTag) {\n links.push(\n DocumentLink.create(\n {\n start: parsed.positionAt(item.start + match.index),\n end: parsed.positionAt(item.start + match.index + length),\n },\n fileForTag\n )\n );\n }\n }\n }\n }\n\n for (const item of program.body) {\n visit(item);\n }\n\n return links;\n}\n", "import type { DocumentLink } from \"vscode-languageserver\";\nimport { getCompilerInfo, parse } from \"../../../utils/compiler\";\nimport type { Plugin } from \"../../types\";\nimport { extractDocumentLinks } from \"./extract\";\n\nconst cache = new WeakMap<ReturnType<typeof parse>, DocumentLink[]>();\n\nexport const findDocumentLinks: Plugin[\"findDocumentLinks\"] = async (doc) => {\n const parsed = parse(doc);\n let result = cache.get(parsed);\n if (!result) {\n result = extractDocumentLinks(doc, parsed, getCompilerInfo(doc).lookup);\n cache.set(parsed, result);\n }\n return result;\n};\n", "import { 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\nexport const format: Plugin[\"format\"] = async (doc, params, cancel) => {\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 (cancel.isCancellationRequested) return;\n\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 } catch (e) {\n displayError(e);\n }\n};\n", "import type { Plugin } from \"../types\";\nimport { doComplete } from \"./complete\";\nimport { doValidate } from \"./validate\";\nimport { findDefinition } from \"./definition\";\nimport { findDocumentLinks } from \"./document-links\";\nimport { format } from \"./format\";\n\nexport default {\n doComplete,\n doValidate,\n findDefinition,\n findDocumentLinks,\n format,\n} as Plugin;\n", "import {\n ColorInformation,\n CompletionList,\n Diagnostic,\n DocumentHighlight,\n InsertReplaceEdit,\n Range,\n TextDocumentEdit,\n Location,\n TextEdit,\n DocumentLink,\n InitializeParams,\n ColorPresentation,\n} from \"vscode-languageserver\";\nimport {\n getCSSLanguageService,\n getLESSLanguageService,\n getSCSSLanguageService,\n type LanguageService,\n type LanguageServiceOptions,\n} from \"vscode-css-languageservice\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport { getCompilerInfo, parse } from \"../../utils/compiler\";\nimport type { Plugin } from \"../types\";\nimport { extractStyleSheets } from \"./extract\";\nimport resolveReference from \"../../utils/resolve-url\";\nimport fileSystemProvider from \"../../utils/file-system\";\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<\n string,\n (options: LanguageServiceOptions) => LanguageService\n> = {\n css: getCSSLanguageService,\n less: getLESSLanguageService,\n scss: getSCSSLanguageService,\n};\nlet clientCapabilities: InitializeParams[\"capabilities\"] | undefined;\n\nconst StyleSheetService: Partial<Plugin> = {\n initialize(params) {\n clientCapabilities = params.capabilities;\n },\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 = await service.doComplete2(\n virtualDoc,\n virtualDoc.positionAt(generatedOffset),\n info.parsed,\n { resolveReference }\n );\n\n if (result.itemDefaults) {\n const { editRange } = result.itemDefaults;\n if (editRange) {\n if (\"start\" in editRange) {\n result.itemDefaults.editRange = getSourceRange(\n doc,\n info,\n editRange\n );\n } else {\n editRange.insert = getSourceRange(doc, info, editRange.insert)!;\n editRange.replace = getSourceRange(doc, info, editRange.replace)!;\n }\n }\n }\n\n for (const item of result.items) {\n if (item.textEdit) {\n item.textEdit = getSourceInsertReplaceEdit(doc, info, item.textEdit);\n }\n\n if (item.additionalTextEdits) {\n item.additionalTextEdits = getSourceEdits(\n doc,\n info,\n item.additionalTextEdits\n );\n }\n }\n\n return result;\n }\n\n return CompletionList.create([], true);\n },\n 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) {\n const range = getSourceRange(doc, info, result.range);\n if (range) {\n return {\n range,\n uri: doc.uri,\n };\n }\n }\n\n break;\n }\n },\n findReferences(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: Location[] = [];\n\n for (const location of service.findReferences(\n virtualDoc,\n virtualDoc.positionAt(generatedOffset),\n info.parsed\n )) {\n const range = getSourceRange(doc, info, location.range);\n if (range) {\n result.push({\n range,\n uri: location.uri,\n });\n }\n }\n\n return result.length ? result : undefined;\n }\n },\n async findDocumentLinks(doc) {\n const infoByExt = getStyleSheetInfo(doc);\n const result: DocumentLink[] = [];\n\n for (const ext in infoByExt) {\n const info = infoByExt[ext];\n const { service, virtualDoc } = info;\n\n for (const link of await service.findDocumentLinks2(\n virtualDoc,\n info.parsed,\n { resolveReference }\n )) {\n const range = getSourceRange(doc, info, link.range);\n if (range) {\n result.push({\n range,\n target: link.target,\n tooltip: link.tooltip,\n data: link.data,\n });\n }\n }\n }\n\n return result.length ? result : undefined;\n },\n findDocumentHighlights(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: DocumentHighlight[] = [];\n\n for (const highlight of service.findDocumentHighlights(\n virtualDoc,\n virtualDoc.positionAt(generatedOffset),\n info.parsed\n )) {\n const range = getSourceRange(doc, info, highlight.range);\n if (range) {\n result.push({\n range,\n kind: highlight.kind,\n });\n }\n }\n\n return result.length ? result : undefined;\n }\n },\n findDocumentColors(doc) {\n const infoByExt = getStyleSheetInfo(doc);\n const result: ColorInformation[] = [];\n\n for (const ext in infoByExt) {\n const info = infoByExt[ext];\n const { service, virtualDoc } = info;\n\n for (const colorInfo of service.findDocumentColors(\n virtualDoc,\n info.parsed\n )) {\n const range = getSourceRange(doc, info, colorInfo.range);\n if (range) {\n result.push({\n range,\n color: colorInfo.color,\n });\n }\n }\n }\n\n return result.length ? result : undefined;\n },\n getColorPresentations(doc, params) {\n const infoByExt = getStyleSheetInfo(doc);\n const sourceOffset = doc.offsetAt(params.range.start);\n\n for (const ext in infoByExt) {\n const info = infoByExt[ext];\n // Find the first stylesheet data that contains the offset.\n const generatedOffsetStart = info.generatedOffsetAt(sourceOffset);\n if (generatedOffsetStart === undefined) continue;\n\n const generatedOffsetEnd = info.generatedOffsetAt(\n doc.offsetAt(params.range.end)\n );\n if (generatedOffsetEnd === undefined) continue;\n\n const { service, virtualDoc } = info;\n const result: ColorPresentation[] = [];\n\n for (const colorPresentation of service.getColorPresentations(\n virtualDoc,\n info.parsed,\n params.color,\n Range.create(\n virtualDoc.positionAt(generatedOffsetStart),\n virtualDoc.positionAt(generatedOffsetEnd)\n )\n )) {\n const textEdit =\n colorPresentation.textEdit &&\n getSourceEdit(doc, info, colorPresentation.textEdit);\n const additionalTextEdits =\n colorPresentation.additionalTextEdits &&\n getSourceEdits(doc, info, colorPresentation.additionalTextEdits);\n\n if (textEdit || additionalTextEdits) {\n result.push({\n label: colorPresentation.label,\n textEdit,\n additionalTextEdits,\n });\n }\n }\n\n return result.length ? result : undefined;\n }\n },\n 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 info.parsed\n );\n\n if (result) {\n if (result.range) {\n const range = getSourceRange(doc, info, result.range);\n if (range) {\n return {\n range,\n contents: result.contents,\n };\n }\n } else {\n return result;\n }\n }\n }\n },\n async doRename(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.doRename(\n virtualDoc,\n virtualDoc.positionAt(generatedOffset),\n params.newName,\n info.parsed\n );\n\n if (result.changes) {\n for (const uri in result.changes) {\n if (uri === doc.uri) {\n result.changes[uri] =\n getSourceEdits(doc, info, result.changes[uri]) || [];\n }\n }\n }\n\n if (result.documentChanges) {\n for (const change of result.documentChanges) {\n if (TextDocumentEdit.is(change)) {\n if (change.textDocument.uri === doc.uri) {\n change.edits = getSourceEdits(doc, info, change.edits) || [];\n }\n }\n }\n }\n\n return result;\n }\n },\n doCodeActions(doc, params) {\n const infoByExt = getStyleSheetInfo(doc);\n const sourceOffset = doc.offsetAt(params.range.start);\n\n for (const ext in infoByExt) {\n const info = infoByExt[ext];\n // Find the first stylesheet data that contains the offset.\n const generatedOffsetStart = info.generatedOffsetAt(sourceOffset);\n if (generatedOffsetStart === undefined) continue;\n\n const generatedOffsetEnd = info.generatedOffsetAt(\n doc.offsetAt(params.range.end)\n );\n if (generatedOffsetEnd === undefined) continue;\n\n const { service, virtualDoc } = info;\n const result = service.doCodeActions(\n virtualDoc,\n Range.create(\n virtualDoc.positionAt(generatedOffsetStart),\n virtualDoc.positionAt(generatedOffsetEnd)\n ),\n params.context,\n info.parsed\n );\n\n for (const command of result) {\n const edits = command.arguments?.[2];\n if (edits && Array.isArray(edits) && isTextEdit(edits[0])) {\n command.arguments![2] = getSourceEdits(doc, info, edits);\n }\n }\n\n return result;\n }\n },\n 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 const range = getSourceRange(doc, info, diag.range);\n if (range) {\n diag.range = range;\n result.push(diag);\n }\n }\n }\n\n return result.length ? result : undefined;\n },\n};\n\nexport { StyleSheetService as default };\n\nfunction getSourceEdits(\n doc: TextDocument,\n info: StyleSheetInfo,\n edits: TextEdit[]\n): TextEdit[] | undefined {\n const result: TextEdit[] = [];\n\n for (const edit of edits) {\n const sourceEdit = getSourceEdit(doc, info, edit);\n if (sourceEdit) {\n result.push(sourceEdit);\n }\n }\n\n return result.length ? result : undefined;\n}\n\nfunction getSourceEdit(\n doc: TextDocument,\n info: StyleSheetInfo,\n textEdit: TextEdit\n): TextEdit | undefined {\n const range = getSourceRange(doc, info, textEdit.range);\n if (range) {\n return {\n newText: textEdit.newText,\n range,\n };\n }\n}\n\nfunction getSourceInsertReplaceEdit(\n doc: TextDocument,\n info: StyleSheetInfo,\n textEdit: TextEdit | InsertReplaceEdit\n): TextEdit | InsertReplaceEdit | undefined {\n if (isTextEdit(textEdit)) {\n return getSourceEdit(doc, info, textEdit);\n } else if (textEdit.replace) {\n const range = getSourceRange(doc, info, textEdit.replace);\n if (range) {\n return {\n newText: textEdit.newText,\n replace: range,\n } as InsertReplaceEdit;\n }\n } else {\n const range = getSourceRange(doc, info, textEdit.insert);\n if (range) {\n return {\n newText: textEdit.newText,\n insert: range,\n } as InsertReplaceEdit;\n }\n }\n}\n\nfunction getSourceRange(\n doc: TextDocument,\n info: StyleSheetInfo,\n range: Range\n): Range | undefined {\n const start = info.sourceOffsetAt(info.virtualDoc.offsetAt(range.start));\n if (start === undefined) return;\n\n let end: number | undefined = start;\n\n if (\n range.start.line !== range.end.line ||\n range.start.character !== range.end.character\n ) {\n end = info.sourceOffsetAt(info.virtualDoc.offsetAt(range.end));\n if (end === undefined) return;\n }\n\n const pos = doc.positionAt(start);\n return {\n start: pos,\n end: start === end ? pos : doc.positionAt(end),\n };\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 fileSystemProvider,\n clientCapabilities,\n });\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\nfunction isTextEdit(edit: TextEdit | InsertReplaceEdit): edit is TextEdit {\n return (edit as TextEdit).range !== undefined;\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\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.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 break;\n }\n }\n\n if (node.body) {\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 for (const child of node.body) {\n visit(child);\n }\n }\n }\n\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 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 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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",
|
|
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/util/get-tag-name-completion.ts", "../src/service/marko/complete/OpenTagName.ts", "../src/service/marko/complete/AttrName.ts", "../src/service/marko/complete/AttrValue.ts", "../src/service/marko/util/is-document-link-attr.ts", "../src/utils/file-system.ts", "../src/utils/resolve-url.ts", "../src/service/marko/complete/Statement.ts", "../src/service/marko/validate.ts", "../src/utils/utils.ts", "../src/service/marko/hover/OpenTagName.ts", "../src/service/marko/hover/index.ts", "../src/service/marko/definition/OpenTagName.ts", "../src/utils/regexp-builder.ts", "../src/service/marko/definition/AttrName.ts", "../src/service/marko/definition/index.ts", "../src/service/marko/document-links.ts", "../src/service/marko/document-symbols.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 { clearCompilerCache } 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 prevDiags = new WeakMap<TextDocument, Diagnostic[]>();\nconst pendingDiags = new WeakSet<TextDocument>();\nlet diagnosticTimeout: ReturnType<typeof setTimeout> | undefined;\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(async (params) => {\n setupMessages(connection);\n await service.initialize(params);\n\n return {\n capabilities: {\n textDocumentSync: TextDocumentSyncKind.Incremental,\n documentFormattingProvider: true,\n definitionProvider: true,\n hoverProvider: true,\n renameProvider: true,\n codeActionProvider: true,\n referencesProvider: true,\n documentLinkProvider: { resolveProvider: false },\n colorProvider: true,\n documentHighlightProvider: true,\n documentSymbolProvider: 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.onDidChangeConfiguration(validateDocs);\nconnection.onDidChangeWatchedFiles(validateDocs);\ndocuments.onDidChangeContent(({ document }) => {\n queueDiagnostic();\n pendingDiags.add(document);\n clearCompilerCache(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.onReferences(async (params, cancel) => {\n return (\n (await service.findReferences(\n documents.get(params.textDocument.uri)!,\n params,\n cancel\n )) || null\n );\n});\n\nconnection.onDocumentLinks(async (params, cancel) => {\n return (\n (await service.findDocumentLinks(\n documents.get(params.textDocument.uri)!,\n params,\n cancel\n )) || null\n );\n});\n\nconnection.onDocumentSymbol(async (params, cancel) => {\n return (\n (await service.findDocumentSymbols(\n documents.get(params.textDocument.uri)!,\n params,\n cancel\n )) || null\n );\n});\n\nconnection.onDocumentHighlight(async (params, cancel) => {\n return (\n (await service.findDocumentHighlights(\n documents.get(params.textDocument.uri)!,\n params,\n cancel\n )) || null\n );\n});\n\nconnection.onDocumentColor(async (params, cancel) => {\n return (\n (await service.findDocumentColors(\n documents.get(params.textDocument.uri)!,\n params,\n cancel\n )) || null\n );\n});\n\nconnection.onColorPresentation(async (params, cancel) => {\n return (\n (await service.getColorPresentations(\n documents.get(params.textDocument.uri)!,\n params,\n cancel\n )) || 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.onRenameRequest(async (params, cancel) => {\n return (\n (await service.doRename(\n documents.get(params.textDocument.uri)!,\n params,\n cancel\n )) || null\n );\n});\n\nconnection.onCodeAction(async (params, cancel) => {\n return (\n (await service.doCodeActions(\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 validateDocs() {\n queueDiagnostic();\n clearCompilerCache();\n for (const doc of documents.all()) {\n pendingDiags.add(doc);\n }\n}\n\nfunction queueDiagnostic() {\n clearTimeout(diagnosticTimeout);\n const id = (diagnosticTimeout = setTimeout(async () => {\n const results = await Promise.all(\n documents.all().map(async (doc) => {\n if (!pendingDiags.delete(doc)) return;\n const prevDiag = prevDiags.get(doc) || [];\n const nextDiag = (await service.doValidate(doc)) || [];\n if (isDeepStrictEqual(prevDiag, nextDiag)) return;\n return [doc, nextDiag] as const;\n })\n );\n\n // Check that it wasn't canceled.\n if (id === diagnosticTimeout) {\n for (const result of results) {\n if (result) {\n const [doc, diag] = result;\n prevDiags.set(doc, diag);\n connection.sendDiagnostics({\n uri: doc.uri,\n diagnostics: diag,\n });\n }\n }\n }\n }, 400));\n}\n\ndocuments.listen(connection);\nconnection.listen();\n", "import 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\";\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 function clearCompilerCache(doc?: TextDocument) {\n if (doc) {\n getCompilerInfo(doc).cache.delete(doc);\n } else {\n for (const [, info] of compilerInfoByDir) {\n info.cache.clear();\n info.compiler.taglib.clearCaches();\n }\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 CodeAction,\n ColorInformation,\n ColorPresentation,\n Command,\n CompletionItem,\n CompletionList,\n DefinitionLink,\n Diagnostic,\n DocumentHighlight,\n DocumentLink,\n Location,\n SymbolInformation,\n WorkspaceEdit,\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 initialize(params) {\n await Promise.all(plugins.map((plugin) => plugin.initialize?.(params)));\n },\n async doComplete(doc, params, cancel) {\n let items: CompletionItem[] | undefined;\n let isIncomplete = false;\n // TODO: this should handle CompletionList.itemDefaults.\n // If there is a single responding plugin, pass through, otherwise need to apply the defaults to the completion items for the plugin.\n\n try {\n for (const pending of plugins.map((plugin) =>\n plugin.doComplete?.(doc, params, cancel)\n )) {\n const cur = await pending;\n if (cancel.isCancellationRequested) return;\n if (cur) {\n let curItems!: CompletionItem[];\n if (Array.isArray(cur)) {\n curItems = cur;\n } else {\n curItems = cur.items;\n isIncomplete ||= cur.isIncomplete;\n }\n\n items = items ? items.concat(curItems) : curItems;\n }\n }\n } catch (err) {\n isIncomplete = true;\n displayError(err);\n }\n\n if (items) {\n return CompletionList.create(items, isIncomplete);\n }\n },\n async findDefinition(doc, params, cancel) {\n let result: (Location | DefinitionLink)[] | undefined;\n\n try {\n for (const pending of plugins.map((plugin) =>\n plugin.findDefinition?.(doc, params, cancel)\n )) {\n const cur = await pending;\n if (cancel.isCancellationRequested) return;\n if (cur) result = (result || []).concat(cur);\n }\n } catch (err) {\n displayError(err);\n }\n\n return result;\n },\n async findReferences(doc, params, cancel) {\n let result: Location[] | undefined;\n\n try {\n for (const pending of plugins.map((plugin) =>\n plugin.findReferences?.(doc, params, cancel)\n )) {\n const cur = await pending;\n if (cancel.isCancellationRequested) return;\n if (cur) result = result ? result.concat(cur) : cur;\n }\n } catch (err) {\n displayError(err);\n }\n\n return result;\n },\n async findDocumentSymbols(doc, params, cancel) {\n let result: SymbolInformation[] | undefined;\n\n try {\n for (const pending of plugins.map((plugin) =>\n plugin.findDocumentSymbols?.(doc, params, cancel)\n )) {\n const cur = await pending;\n if (cancel.isCancellationRequested) return;\n if (cur) result = result ? result.concat(cur) : cur;\n }\n } catch (err) {\n displayError(err);\n }\n\n return result;\n },\n async findDocumentLinks(doc, params, cancel) {\n let result: DocumentLink[] | undefined;\n\n try {\n for (const pending of plugins.map((plugin) =>\n plugin.findDocumentLinks?.(doc, params, cancel)\n )) {\n const cur = await pending;\n if (cancel.isCancellationRequested) return;\n if (cur) result = result ? result.concat(cur) : cur;\n }\n } catch (err) {\n displayError(err);\n }\n\n return result;\n },\n async findDocumentHighlights(doc, params, cancel) {\n let result: DocumentHighlight[] | undefined;\n\n try {\n for (const pending of plugins.map((plugin) =>\n plugin.findDocumentHighlights?.(doc, params, cancel)\n )) {\n const cur = await pending;\n if (cancel.isCancellationRequested) return;\n if (cur) result = result ? result.concat(cur) : cur;\n }\n } catch (err) {\n displayError(err);\n }\n\n return result;\n },\n async findDocumentColors(doc, params, cancel) {\n let result: ColorInformation[] | undefined;\n\n try {\n for (const pending of plugins.map((plugin) =>\n plugin.findDocumentColors?.(doc, params, cancel)\n )) {\n const cur = await pending;\n if (cancel.isCancellationRequested) return;\n if (cur) result = result ? result.concat(cur) : cur;\n }\n } catch (err) {\n displayError(err);\n }\n\n return result;\n },\n async getColorPresentations(doc, params, cancel) {\n let result: ColorPresentation[] | undefined;\n\n try {\n for (const pending of plugins.map((plugin) =>\n plugin.getColorPresentations?.(doc, params, cancel)\n )) {\n const cur = await pending;\n if (cancel.isCancellationRequested) return;\n if (cur) result = result ? result.concat(cur) : cur;\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 doRename(doc, params, cancel) {\n let changes: WorkspaceEdit[\"changes\"];\n let changeAnnotations: WorkspaceEdit[\"changeAnnotations\"];\n let documentChanges: WorkspaceEdit[\"documentChanges\"];\n\n try {\n for (const pending of plugins.map((plugin) =>\n plugin.doRename?.(doc, params, cancel)\n )) {\n const cur = await pending;\n if (cancel.isCancellationRequested) return;\n\n if (cur) {\n if (cur.changes) {\n if (changes) {\n changes = { ...changes };\n\n for (const uri in cur.changes) {\n changes[uri] = changes[uri]\n ? changes[uri].concat(cur.changes[uri])\n : cur.changes[uri];\n }\n } else {\n changes = cur.changes;\n }\n }\n\n if (cur.changeAnnotations) {\n changeAnnotations = changeAnnotations\n ? {\n ...changeAnnotations,\n ...cur.changeAnnotations,\n }\n : cur.changeAnnotations;\n }\n\n if (cur.documentChanges) {\n documentChanges = documentChanges\n ? documentChanges.concat(cur.documentChanges)\n : cur.documentChanges;\n }\n }\n }\n } catch (err) {\n displayError(err);\n }\n\n if (changes || changeAnnotations || documentChanges) {\n return {\n changes,\n changeAnnotations,\n documentChanges,\n };\n }\n },\n async doCodeActions(doc, params, cancel) {\n let result: (Command | CodeAction)[] | undefined;\n\n try {\n for (const pending of plugins.map((plugin) =>\n plugin.doCodeActions?.(doc, params, cancel)\n )) {\n const cur = await pending;\n if (cancel.isCancellationRequested) return;\n if (cur) result = result ? result.concat(cur) : cur;\n }\n } catch (err) {\n displayError(err);\n }\n\n return result;\n },\n async doValidate(doc) {\n let result: Diagnostic[] | undefined;\n try {\n for (const pending of plugins.map((plugin) => plugin.doValidate?.(doc))) {\n const cur = await pending;\n if (cur) result = result ? result.concat(cur) : 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 { AttrValue } from \"./AttrValue\";\nimport { Statement } from \"./Statement\";\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 AttrValue,\n Statement,\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 type { TagDefinition } from \"@marko/babel-utils\";\nimport {\n type CompletionItem,\n type Range,\n CompletionItemKind,\n CompletionItemTag,\n InsertTextFormat,\n MarkupKind,\n TextEdit,\n} from \"vscode-languageserver\";\nimport { URI } from \"vscode-uri\";\n\nconst deprecated = [CompletionItemTag.Deprecated] as CompletionItemTag[];\n\nexport default function getTagNameCompletion({\n tag,\n range,\n showAutoComplete,\n importer,\n}: {\n tag: TagDefinition;\n range?: Range;\n importer?: string;\n showAutoComplete?: true;\n}): CompletionItem {\n let label = tag.isNestedTag ? `@${tag.name}` : tag.name;\n const fileForTag = tag.template || tag.renderer || tag.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 =\n /^@?marko[/-]/.test(tag.taglibId) || nodeModuleName === \"marko\";\n const documentation = {\n kind: MarkupKind.Markdown,\n value: tag.html\n ? `Built in [<${tag.name}>](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/${tag.name}) HTML tag.`\n : isCoreTag\n ? `Core Marko <${tag.name}> tag.`\n : nodeModuleName\n ? `Custom Marko tag discovered from the [\"${nodeModuleName}\"](${fileURIForTag}) npm package.`\n : `Custom Marko tag discovered from:\\n\\n[${\n importer ? path.relative(importer, fileForTag) : fileForTag\n }](${fileURIForTag})`,\n };\n\n if (tag.description) {\n documentation.value += `\\n\\n${tag.description}`;\n }\n\n const autocomplete = showAutoComplete ? tag.autocomplete?.[0] : undefined;\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 tags: tag.deprecated ? deprecated : undefined,\n insertTextFormat: autocomplete ? InsertTextFormat.Snippet : undefined,\n kind: tag.html ? CompletionItemKind.Property : CompletionItemKind.Class,\n textEdit: range && TextEdit.replace(range, autocomplete?.snippet || label),\n };\n}\n", "import { type Node, NodeType } from \"../../../utils/parser\";\nimport { getDocFile } from \"../../../utils/doc-file\";\nimport type { CompletionMeta, CompletionResult } from \".\";\nimport getTagNameCompletion from \"../util/get-tag-name-completion\";\nimport type { CompletionItem } from \"vscode-languageserver\";\n\nexport function OpenTagName({\n document,\n lookup,\n parsed,\n node,\n}: CompletionMeta<Node.OpenTagName>): CompletionResult {\n const importer = getDocFile(document);\n const tag = node.parent;\n const range = parsed.locationAt(node);\n const isAttrTag = tag.type === NodeType.AttrTag;\n const result: CompletionItem[] = [];\n\n if (isAttrTag) {\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\n if (parentTagDef) {\n const { nestedTags } = parentTagDef;\n for (const key in nestedTags) {\n if (key !== \"*\") {\n const tag = nestedTags[key];\n result.push(\n getTagNameCompletion({\n tag,\n range,\n importer,\n showAutoComplete: true,\n })\n );\n }\n }\n }\n } else {\n const skipStatements = !(\n tag.concise && tag.parent.type === NodeType.Program\n );\n for (const tag of lookup.getTagsSorted()) {\n if (\n !(\n tag.name === \"*\" ||\n tag.isNestedTag ||\n (skipStatements && tag.parseOptions?.statement) ||\n (tag.name[0] === \"_\" &&\n /^@?marko[/-]|[\\\\/]node_modules[\\\\/]/.test(tag.filePath))\n )\n ) {\n result.push(\n getTagNameCompletion({\n tag,\n range,\n importer,\n showAutoComplete: true,\n })\n );\n }\n }\n }\n\n return result;\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 path from \"path\";\nimport {\n CompletionItem,\n CompletionItemKind,\n Range,\n TextEdit,\n} from \"vscode-languageserver\";\nimport type { Node } from \"../../../utils/parser\";\nimport isDocumentLinkAttr from \"../util/is-document-link-attr\";\nimport fileSystem, { FileType } from \"../../../utils/file-system\";\nimport resolveUrl from \"../../../utils/resolve-url\";\nimport type { CompletionMeta } from \".\";\n\nexport async function AttrValue({\n document,\n offset,\n node,\n parsed,\n code,\n}: CompletionMeta<Node.AttrValue>): Promise<void | CompletionItem[]> {\n const attr = node.parent;\n if (isDocumentLinkAttr(document, attr.parent, attr)) {\n const start = node.value.start + 1;\n if (code[start] !== \".\") return; // only resolve relative paths\n\n const end = node.value.end - 1;\n const relativeOffset = offset - start;\n const rawValue = parsed.read({\n start,\n end,\n });\n\n const segmentStart = rawValue.lastIndexOf(\"/\", relativeOffset);\n if (segmentStart === -1) return; // only resolve after a slash.\n\n const req = rawValue.slice(0, segmentStart);\n const uri = resolveUrl(req, document.uri);\n\n if (uri) {\n const result: CompletionItem[] = [];\n const curFile = req === \".\" ? path.basename(document.uri) : undefined;\n const replaceRange = Range.create(\n document.positionAt(start + segmentStart + 1),\n document.positionAt(start + rawValue.length)\n );\n\n for (const [entry, type] of await fileSystem.readDirectory(uri)) {\n if (entry[0] !== \".\" && entry !== curFile) {\n result.push(\n type === FileType.Directory\n ? {\n label: `${entry}/`,\n kind: CompletionItemKind.Folder,\n textEdit: TextEdit.replace(replaceRange, `${entry}/`),\n command: {\n title: \"Suggest\",\n command: \"editor.action.triggerSuggest\",\n },\n }\n : {\n label: entry,\n kind: CompletionItemKind.File,\n textEdit: TextEdit.replace(replaceRange, entry),\n }\n );\n }\n }\n\n return result;\n }\n }\n}\n", "import type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport { type Node, NodeType } from \"../../../utils/parser\";\n\nconst linkedAttrs: Map<string, Set<string>> = new Map([\n [\n \"src\",\n new Set([\n \"audio\",\n \"embed\",\n \"iframe\",\n \"img\",\n \"input\",\n \"script\",\n \"source\",\n \"track\",\n \"video\",\n ]),\n ],\n [\"href\", new Set([\"a\", \"area\", \"link\"])],\n [\"data\", new Set([\"object\"])],\n [\"poster\", new Set([\"video\"])],\n]);\n\nexport default function isDocumentLinkAttr(\n doc: TextDocument,\n tag: Node.ParentTag,\n attr: Node.AttrNode\n): attr is Node.AttrNamed & { value: Node.AttrValue } {\n return (\n (tag.nameText &&\n attr.type === NodeType.AttrNamed &&\n attr.value?.type === NodeType.AttrValue &&\n /^['\"]$/.test(doc.getText()[attr.value.value.start]) &&\n linkedAttrs\n .get(doc.getText().slice(attr.name.start, attr.name.end))\n ?.has(tag.nameText)) ||\n false\n );\n}\n", "import fs from \"fs/promises\";\nimport { type FileStat, FileType } from \"vscode-css-languageservice\";\nimport { fileURLToPath } from \"url\";\n\nexport { FileStat, FileType };\nexport default {\n stat,\n readDirectory,\n};\nasync function stat(uri: string): Promise<FileStat> {\n let type = FileType.Unknown;\n let ctime = -1;\n let mtime = -1;\n let size = -1;\n\n try {\n const stat = await fs.stat(fileURLToPath(uri));\n if (stat.isDirectory()) type = FileType.Directory;\n else if (stat.isFile()) type = FileType.File;\n ctime = stat.ctimeMs;\n mtime = stat.mtimeMs;\n size = stat.size;\n } catch {\n // ignore\n }\n\n return {\n type,\n ctime,\n mtime,\n size,\n };\n}\n\nasync function readDirectory(uri: string): Promise<[string, FileType][]> {\n try {\n const entries = await fs.readdir(fileURLToPath(uri));\n const base = uri.at(-1) === \"/\" ? uri : `${uri}/`;\n return (\n await Promise.all(\n entries.map(\n async (entry) =>\n [entry, (await stat(new URL(entry, base).toString())).type] as [\n string,\n FileType\n ]\n )\n )\n ).filter(([, type]) => type !== FileType.Unknown);\n } catch {\n return [];\n }\n}\n", "export default function resolveUrl(to: string, base: string) {\n try {\n const url = new URL(to, base);\n if (url.protocol === \"file:\") return url.toString();\n } catch {\n return undefined;\n }\n}\n", "import type { Node } from \"../../../utils/parser\";\nimport type { CompletionMeta, CompletionResult } from \".\";\nimport { CompletionItem, TextEdit } from \"vscode-languageserver\";\nimport getTagNameCompletion from \"../util/get-tag-name-completion\";\nimport { getDocFile } from \"../../../utils/doc-file\";\n\nconst importTagReg = /(['\"])<((?:[^\\1\\\\>]+|\\\\.)*)>?\\1/g;\n\nexport function Statement({\n code,\n node,\n parsed,\n lookup,\n document,\n}: CompletionMeta<Node.Statement>): CompletionResult {\n // check for import statement\n if (code[node.start] === \"i\") {\n importTagReg.lastIndex = 0;\n const value = parsed.read(node);\n const match = importTagReg.exec(value);\n if (match) {\n const importer = getDocFile(document);\n const [{ length }] = match;\n const range = parsed.locationAt({\n start: node.start + match.index + 1,\n end: node.start + match.index + length - 1,\n });\n\n const result: CompletionItem[] = [];\n\n for (const tag of lookup.getTagsSorted()) {\n if (\n (tag.template || tag.renderer) &&\n !(\n tag.html ||\n tag.parser ||\n tag.translator ||\n tag.isNestedTag ||\n tag.name === \"*\" ||\n tag.parseOptions?.statement ||\n /^@?marko[/-]/.test(tag.taglibId) ||\n (tag.name[0] === \"_\" && /[\\\\/]node_modules[\\\\/]/.test(tag.filePath))\n )\n ) {\n const completion = getTagNameCompletion({\n tag,\n importer,\n });\n\n completion.label = `<${completion.label}>`;\n completion.textEdit = TextEdit.replace(range, completion.label);\n result.push(completion);\n }\n }\n\n return result;\n }\n }\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 translator,\n code: false,\n output: \"source\",\n sourceMaps: false,\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 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 type { Node } from \"../../../utils/parser\";\nimport { getDocFile } from \"../../../utils/doc-file\";\nimport type { HoverMeta, HoverResult } from \".\";\nimport getTagNameCompletion from \"../util/get-tag-name-completion\";\nimport { START_OF_FILE } from \"../../../utils/utils\";\nimport type { MarkupContent } from \"vscode-languageserver\";\n\nexport function OpenTagName({\n document,\n lookup,\n parsed,\n node,\n}: HoverMeta<Node.OpenTagName>): HoverResult {\n const importer = getDocFile(document);\n const tag = node.parent;\n const range = parsed.locationAt(node);\n const tagDef = tag.nameText && lookup.getTag(tag.nameText);\n\n if (tagDef) {\n const completion = getTagNameCompletion({\n tag: tagDef,\n range: START_OF_FILE,\n importer,\n });\n return {\n range,\n contents: completion.documentation as MarkupContent,\n };\n }\n}\n", "import type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport type { HoverParams, Hover } from \"vscode-languageserver\";\nimport { getCompilerInfo, parse } from \"../../../utils/compiler\";\nimport type { Plugin, Result } from \"../../types\";\nimport { NodeType } from \"../../../utils/parser\";\nimport { OpenTagName } from \"./OpenTagName\";\n\nexport type HoverResult = Result<Hover>;\nexport interface HoverMeta<N = unknown>\n extends ReturnType<typeof getCompilerInfo> {\n document: TextDocument;\n params: HoverParams;\n parsed: ReturnType<typeof parse>;\n offset: number;\n code: string;\n node: N;\n}\n\nconst handlers: Record<string, (data: HoverMeta<any>) => HoverResult> = {\n OpenTagName,\n};\n\nexport const doHover: Plugin[\"doHover\"] = async (doc, params) => {\n const parsed = parse(doc);\n const offset = doc.offsetAt(params.position);\n const node = parsed.nodeAt(offset);\n return 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", "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 { 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 type { TaglibLookup } from \"@marko/babel-utils\";\nimport { DocumentLink } from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport { URI } from \"vscode-uri\";\nimport { getCompilerInfo, parse } from \"../../utils/compiler\";\nimport { type Node, type Range, NodeType } from \"../../utils/parser\";\nimport resolveUrl from \"../../utils/resolve-url\";\nimport type { Plugin } from \"../types\";\nimport isDocumentLinkAttr from \"./util/is-document-link-attr\";\n\nconst importTagReg = /(['\"])<((?:[^\\1\\\\>]+|\\\\.)*)>?\\1/g;\nconst cache = new WeakMap<ReturnType<typeof parse>, DocumentLink[]>();\n\nexport const findDocumentLinks: Plugin[\"findDocumentLinks\"] = async (doc) => {\n const parsed = parse(doc);\n let result = cache.get(parsed);\n if (!result) {\n result = extractDocumentLinks(doc, parsed, getCompilerInfo(doc).lookup);\n cache.set(parsed, result);\n }\n return result;\n};\n\n/**\n * Iterate over the Marko CST and extract all the file links in the document.\n */\nfunction extractDocumentLinks(\n doc: TextDocument,\n parsed: ReturnType<typeof parse>,\n lookup: TaglibLookup\n): DocumentLink[] {\n if (URI.parse(doc.uri).scheme === \"untitled\") {\n return [];\n }\n\n const links: DocumentLink[] = [];\n const { program } = parsed;\n const code = doc.getText();\n const read = (range: Range) => code.slice(range.start, range.end);\n const visit = (node: Node.ChildNode) => {\n switch (node.type) {\n case NodeType.AttrTag:\n if (node.body) {\n for (const child of node.body) {\n visit(child);\n }\n }\n break;\n case NodeType.Tag:\n if (node.attrs && node.nameText) {\n for (const attr of node.attrs) {\n if (isDocumentLinkAttr(doc, node, attr)) {\n const resolved = resolveUrl(\n read(attr.value.value).slice(1, -1),\n doc.uri\n );\n if (resolved) {\n links.push(\n DocumentLink.create(\n parsed.locationAt(attr.value.value),\n resolveUrl(read(attr.value.value).slice(1, -1), doc.uri)\n )\n );\n }\n }\n }\n }\n if (node.body) {\n for (const child of node.body) {\n visit(child);\n }\n }\n\n break;\n }\n };\n\n for (const item of program.static) {\n // check for import statement (this currently only support the tag import shorthand).\n if (item.type === NodeType.Statement && code[item.start] === \"i\") {\n importTagReg.lastIndex = 0;\n const value = parsed.read(item);\n const match = importTagReg.exec(value);\n if (match) {\n const [{ length }, , tagName] = match;\n const tagDef = lookup.getTag(tagName);\n const fileForTag = tagDef && (tagDef.template || tagDef.renderer);\n\n if (fileForTag) {\n links.push(\n DocumentLink.create(\n parsed.locationAt({\n start: item.start + match.index,\n end: item.start + match.index + length,\n }),\n fileForTag\n )\n );\n }\n }\n }\n }\n\n for (const item of program.body) {\n visit(item);\n }\n\n return links;\n}\n", "import { URI } from \"vscode-uri\";\nimport type { TaglibLookup } from \"@marko/babel-utils\";\nimport { SymbolInformation, SymbolKind } from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport { type Node, NodeType } from \"../../utils/parser\";\nimport { getCompilerInfo, parse } from \"../../utils/compiler\";\nimport type { Plugin } from \"../types\";\n\nconst cache = new WeakMap<ReturnType<typeof parse>, SymbolInformation[]>();\n\nexport const findDocumentSymbols: Plugin[\"findDocumentSymbols\"] = async (\n doc\n) => {\n const parsed = parse(doc);\n let result = cache.get(parsed);\n if (!result) {\n result = extractDocumentSymbols(doc, parsed, getCompilerInfo(doc).lookup);\n cache.set(parsed, result);\n }\n return result;\n};\n\n/**\n * Iterate over the Marko CST and extract all the symbols (mostly tags) in the document.\n */\nfunction extractDocumentSymbols(\n doc: TextDocument,\n parsed: ReturnType<typeof parse>,\n lookup: TaglibLookup\n): SymbolInformation[] {\n if (URI.parse(doc.uri).scheme === \"untitled\") {\n return [];\n }\n\n const symbols: SymbolInformation[] = [];\n const { program } = parsed;\n const visit = (node: Node.ChildNode) => {\n switch (node.type) {\n case NodeType.Tag:\n case NodeType.AttrTag:\n symbols.push(\n SymbolInformation.create(\n (node.type === NodeType.AttrTag\n ? node.nameText?.slice(node.nameText.indexOf(\"@\"))\n : node.nameText) || \"<${...}>\",\n (node.nameText &&\n lookup.getTag(node.nameText)?.html &&\n SymbolKind.Property) ||\n SymbolKind.Class,\n parsed.locationAt(node),\n doc.uri\n )\n );\n\n if (node.body) {\n for (const child of node.body) {\n visit(child);\n }\n }\n\n break;\n }\n };\n\n for (const item of program.body) {\n visit(item);\n }\n\n return symbols;\n}\n", "import { 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\nexport const format: Plugin[\"format\"] = async (doc, params, cancel) => {\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 (cancel.isCancellationRequested) return;\n\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 } catch (e) {\n displayError(e);\n }\n};\n", "import type { Plugin } from \"../types\";\nimport { doComplete } from \"./complete\";\nimport { doValidate } from \"./validate\";\nimport { doHover } from \"./hover\";\nimport { findDefinition } from \"./definition\";\nimport { findDocumentLinks } from \"./document-links\";\nimport { findDocumentSymbols } from \"./document-symbols\";\nimport { format } from \"./format\";\n\nexport default {\n doComplete,\n doValidate,\n doHover,\n findDefinition,\n findDocumentLinks,\n findDocumentSymbols,\n format,\n} as Plugin;\n", "import {\n ColorInformation,\n CompletionList,\n Diagnostic,\n DocumentHighlight,\n InsertReplaceEdit,\n Range,\n TextDocumentEdit,\n Location,\n TextEdit,\n DocumentLink,\n InitializeParams,\n ColorPresentation,\n SymbolInformation,\n} from \"vscode-languageserver\";\nimport {\n getCSSLanguageService,\n getLESSLanguageService,\n getSCSSLanguageService,\n type LanguageService,\n type LanguageServiceOptions,\n} from \"vscode-css-languageservice\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport { getCompilerInfo, parse } from \"../../utils/compiler\";\nimport type { Plugin } from \"../types\";\nimport { extractStyleSheets } from \"./extract\";\nimport resolveReference from \"../../utils/resolve-url\";\nimport fileSystemProvider from \"../../utils/file-system\";\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<\n string,\n (options: LanguageServiceOptions) => LanguageService\n> = {\n css: getCSSLanguageService,\n less: getLESSLanguageService,\n scss: getSCSSLanguageService,\n};\nlet clientCapabilities: InitializeParams[\"capabilities\"] | undefined;\n\nconst StyleSheetService: Partial<Plugin> = {\n initialize(params) {\n clientCapabilities = params.capabilities;\n },\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 = await service.doComplete2(\n virtualDoc,\n virtualDoc.positionAt(generatedOffset),\n info.parsed,\n { resolveReference }\n );\n\n if (result.itemDefaults) {\n const { editRange } = result.itemDefaults;\n if (editRange) {\n if (\"start\" in editRange) {\n result.itemDefaults.editRange = getSourceRange(\n doc,\n info,\n editRange\n );\n } else {\n editRange.insert = getSourceRange(doc, info, editRange.insert)!;\n editRange.replace = getSourceRange(doc, info, editRange.replace)!;\n }\n }\n }\n\n for (const item of result.items) {\n if (item.textEdit) {\n item.textEdit = getSourceInsertReplaceEdit(doc, info, item.textEdit);\n }\n\n if (item.additionalTextEdits) {\n item.additionalTextEdits = getSourceEdits(\n doc,\n info,\n item.additionalTextEdits\n );\n }\n }\n\n return result;\n }\n\n return CompletionList.create([], true);\n },\n 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) {\n const range = getSourceRange(doc, info, result.range);\n if (range) {\n return {\n range,\n uri: doc.uri,\n };\n }\n }\n\n break;\n }\n },\n findReferences(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: Location[] = [];\n\n for (const location of service.findReferences(\n virtualDoc,\n virtualDoc.positionAt(generatedOffset),\n info.parsed\n )) {\n const range = getSourceRange(doc, info, location.range);\n if (range) {\n result.push({\n range,\n uri: location.uri,\n });\n }\n }\n\n return result.length ? result : undefined;\n }\n },\n findDocumentSymbols(doc) {\n const infoByExt = getStyleSheetInfo(doc);\n const result: SymbolInformation[] = [];\n\n for (const ext in infoByExt) {\n const info = infoByExt[ext];\n const { service, virtualDoc } = info;\n\n for (const symbol of service.findDocumentSymbols(\n virtualDoc,\n info.parsed\n )) {\n if (symbol.location.uri === doc.uri) {\n const range = getSourceRange(doc, info, symbol.location.range);\n if (range) {\n result.push({\n kind: symbol.kind,\n name: symbol.name,\n tags: symbol.tags,\n deprecated: symbol.deprecated,\n containerName: symbol.containerName,\n location: { uri: doc.uri, range },\n });\n }\n } else {\n result.push(symbol);\n }\n }\n }\n\n return result.length ? result : undefined;\n },\n async findDocumentLinks(doc) {\n const infoByExt = getStyleSheetInfo(doc);\n const result: DocumentLink[] = [];\n\n for (const ext in infoByExt) {\n const info = infoByExt[ext];\n const { service, virtualDoc } = info;\n\n for (const link of await service.findDocumentLinks2(\n virtualDoc,\n info.parsed,\n { resolveReference }\n )) {\n const range = getSourceRange(doc, info, link.range);\n if (range) {\n result.push({\n range,\n target: link.target,\n tooltip: link.tooltip,\n data: link.data,\n });\n }\n }\n }\n\n return result.length ? result : undefined;\n },\n findDocumentHighlights(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: DocumentHighlight[] = [];\n\n for (const highlight of service.findDocumentHighlights(\n virtualDoc,\n virtualDoc.positionAt(generatedOffset),\n info.parsed\n )) {\n const range = getSourceRange(doc, info, highlight.range);\n if (range) {\n result.push({\n range,\n kind: highlight.kind,\n });\n }\n }\n\n return result.length ? result : undefined;\n }\n },\n findDocumentColors(doc) {\n const infoByExt = getStyleSheetInfo(doc);\n const result: ColorInformation[] = [];\n\n for (const ext in infoByExt) {\n const info = infoByExt[ext];\n const { service, virtualDoc } = info;\n\n for (const colorInfo of service.findDocumentColors(\n virtualDoc,\n info.parsed\n )) {\n const range = getSourceRange(doc, info, colorInfo.range);\n if (range) {\n result.push({\n range,\n color: colorInfo.color,\n });\n }\n }\n }\n\n return result.length ? result : undefined;\n },\n getColorPresentations(doc, params) {\n const infoByExt = getStyleSheetInfo(doc);\n const sourceOffset = doc.offsetAt(params.range.start);\n\n for (const ext in infoByExt) {\n const info = infoByExt[ext];\n // Find the first stylesheet data that contains the offset.\n const generatedOffsetStart = info.generatedOffsetAt(sourceOffset);\n if (generatedOffsetStart === undefined) continue;\n\n const generatedOffsetEnd = info.generatedOffsetAt(\n doc.offsetAt(params.range.end)\n );\n if (generatedOffsetEnd === undefined) continue;\n\n const { service, virtualDoc } = info;\n const result: ColorPresentation[] = [];\n\n for (const colorPresentation of service.getColorPresentations(\n virtualDoc,\n info.parsed,\n params.color,\n Range.create(\n virtualDoc.positionAt(generatedOffsetStart),\n virtualDoc.positionAt(generatedOffsetEnd)\n )\n )) {\n const textEdit =\n colorPresentation.textEdit &&\n getSourceEdit(doc, info, colorPresentation.textEdit);\n const additionalTextEdits =\n colorPresentation.additionalTextEdits &&\n getSourceEdits(doc, info, colorPresentation.additionalTextEdits);\n\n if (textEdit || additionalTextEdits) {\n result.push({\n label: colorPresentation.label,\n textEdit,\n additionalTextEdits,\n });\n }\n }\n\n return result.length ? result : undefined;\n }\n },\n 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 info.parsed\n );\n\n if (result) {\n if (result.range) {\n const range = getSourceRange(doc, info, result.range);\n if (range) {\n return {\n range,\n contents: result.contents,\n };\n }\n } else {\n return result;\n }\n }\n }\n },\n async doRename(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.doRename(\n virtualDoc,\n virtualDoc.positionAt(generatedOffset),\n params.newName,\n info.parsed\n );\n\n if (result.changes) {\n for (const uri in result.changes) {\n if (uri === doc.uri) {\n result.changes[uri] =\n getSourceEdits(doc, info, result.changes[uri]) || [];\n }\n }\n }\n\n if (result.documentChanges) {\n for (const change of result.documentChanges) {\n if (TextDocumentEdit.is(change)) {\n if (change.textDocument.uri === doc.uri) {\n change.edits = getSourceEdits(doc, info, change.edits) || [];\n }\n }\n }\n }\n\n return result;\n }\n },\n doCodeActions(doc, params) {\n const infoByExt = getStyleSheetInfo(doc);\n const sourceOffset = doc.offsetAt(params.range.start);\n\n for (const ext in infoByExt) {\n const info = infoByExt[ext];\n // Find the first stylesheet data that contains the offset.\n const generatedOffsetStart = info.generatedOffsetAt(sourceOffset);\n if (generatedOffsetStart === undefined) continue;\n\n const generatedOffsetEnd = info.generatedOffsetAt(\n doc.offsetAt(params.range.end)\n );\n if (generatedOffsetEnd === undefined) continue;\n\n const { service, virtualDoc } = info;\n const result = service.doCodeActions(\n virtualDoc,\n Range.create(\n virtualDoc.positionAt(generatedOffsetStart),\n virtualDoc.positionAt(generatedOffsetEnd)\n ),\n params.context,\n info.parsed\n );\n\n for (const command of result) {\n const edits = command.arguments?.[2];\n if (edits && Array.isArray(edits) && isTextEdit(edits[0])) {\n command.arguments![2] = getSourceEdits(doc, info, edits);\n }\n }\n\n return result;\n }\n },\n 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 const range = getSourceRange(doc, info, diag.range);\n if (range) {\n diag.range = range;\n result.push(diag);\n }\n }\n }\n\n return result.length ? result : undefined;\n },\n};\n\nexport { StyleSheetService as default };\n\nfunction getSourceEdits(\n doc: TextDocument,\n info: StyleSheetInfo,\n edits: TextEdit[]\n): TextEdit[] | undefined {\n const result: TextEdit[] = [];\n\n for (const edit of edits) {\n const sourceEdit = getSourceEdit(doc, info, edit);\n if (sourceEdit) {\n result.push(sourceEdit);\n }\n }\n\n return result.length ? result : undefined;\n}\n\nfunction getSourceEdit(\n doc: TextDocument,\n info: StyleSheetInfo,\n textEdit: TextEdit\n): TextEdit | undefined {\n const range = getSourceRange(doc, info, textEdit.range);\n if (range) {\n return {\n newText: textEdit.newText,\n range,\n };\n }\n}\n\nfunction getSourceInsertReplaceEdit(\n doc: TextDocument,\n info: StyleSheetInfo,\n textEdit: TextEdit | InsertReplaceEdit\n): TextEdit | InsertReplaceEdit | undefined {\n if (isTextEdit(textEdit)) {\n return getSourceEdit(doc, info, textEdit);\n } else if (textEdit.replace) {\n const range = getSourceRange(doc, info, textEdit.replace);\n if (range) {\n return {\n newText: textEdit.newText,\n replace: range,\n } as InsertReplaceEdit;\n }\n } else {\n const range = getSourceRange(doc, info, textEdit.insert);\n if (range) {\n return {\n newText: textEdit.newText,\n insert: range,\n } as InsertReplaceEdit;\n }\n }\n}\n\nfunction getSourceRange(\n doc: TextDocument,\n info: StyleSheetInfo,\n range: Range\n): Range | undefined {\n const start = info.sourceOffsetAt(info.virtualDoc.offsetAt(range.start));\n if (start === undefined) return;\n\n let end: number | undefined = start;\n\n if (\n range.start.line !== range.end.line ||\n range.start.character !== range.end.character\n ) {\n end = info.sourceOffsetAt(info.virtualDoc.offsetAt(range.end));\n if (end === undefined) return;\n }\n\n const pos = doc.positionAt(start);\n return {\n start: pos,\n end: start === end ? pos : doc.positionAt(end),\n };\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 fileSystemProvider,\n clientCapabilities,\n });\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\nfunction isTextEdit(edit: TextEdit | InsertReplaceEdit): edit is TextEdit {\n return (edit as TextEdit).range !== undefined;\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\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.AttrTag:\n if (node.body) {\n for (const child of node.body) {\n visit(child);\n }\n }\n break;\n case NodeType.Tag:\n 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 break;\n }\n }\n\n if (node.body) {\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 for (const child of node.body) {\n visit(child);\n }\n }\n }\n\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 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 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
|
}
|