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