@marko/language-server 2.0.3 → 2.1.0
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 +1 -3
- package/dist/index.js.map +2 -2
- package/dist/index.mjs +1 -3
- package/dist/index.mjs.map +2 -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/utils/project-defaults.ts", "../src/index.ts", "../src/service/index.ts", "../src/utils/text-documents.ts", "../src/service/html/index.ts", "../src/utils/file.ts", "../src/service/html/axe-rules/axe-rules.ts", "../src/service/html/axe-rules/rule-exceptions.ts", "../src/service/marko/complete/index.ts", "../src/service/marko/complete/AttrName.ts", "../src/service/marko/complete/AttrValue.ts", "../src/utils/file-system.ts", "../src/utils/resolve-url.ts", "../src/service/marko/util/is-document-link-attr.ts", "../src/service/marko/complete/Import.ts", "../src/service/marko/util/get-tag-name-completion.ts", "../src/service/marko/util/is-html.ts", "../src/service/marko/complete/OpenTagName.ts", "../src/service/marko/complete/Tag.ts", "../src/service/marko/definition/index.ts", "../src/service/marko/definition/AttrName.ts", "../src/utils/constants.ts", "../src/utils/regexp-builder.ts", "../src/service/marko/definition/OpenTagName.ts", "../src/service/marko/document-links.ts", "../src/service/marko/document-symbols.ts", "../src/service/marko/format.ts", "../src/utils/messages.ts", "../src/service/marko/hover/index.ts", "../src/service/marko/hover/OpenTagName.ts", "../src/service/marko/validate.ts", "../src/service/marko/index.ts", "../src/service/script/index.ts", "../src/ts-plugin/host.ts", "../src/utils/workspace.ts", "../src/service/script/util/print-jsdoc-tag.ts", "../src/service/style/index.ts"],
|
|
4
|
-
"sourcesContent": ["import * as defaultCompiler from \"@marko/compiler\";\nimport defaultConfig from \"@marko/compiler/config\";\nimport { Project } from \"@marko/language-tools\";\nimport * as defaultTranslator from \"marko/translator\";\nimport path from \"path\";\n\nProject.setDefaultTypePaths({\n internalTypesFile: path.join(__dirname, \"marko.internal.d.ts\"),\n markoTypesFile: path.join(__dirname, \"marko.runtime.d.ts\"),\n});\nProject.setDefaultCompilerMeta(defaultCompiler, {\n ...defaultConfig,\n translator: defaultTranslator,\n});\n", "import \"./utils/project-defaults\";\n\nimport { Project } from \"@marko/language-tools\";\nimport { inspect, isDeepStrictEqual } from \"util\";\nimport {\n createConnection,\n DefinitionLink,\n Diagnostic,\n ProposedFeatures,\n TextDocumentSyncKind,\n} from \"vscode-languageserver/node\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\n\nimport service from \"./service\";\nimport { clearMarkoCacheForFile } from \"./utils/file\";\nimport setupMessages from \"./utils/messages\";\nimport * as documents from \"./utils/text-documents\";\nimport * as workspace from \"./utils/workspace\";\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 connection = createConnection(ProposedFeatures.all);\nconst prevDiags = new WeakMap<TextDocument, Diagnostic[]>();\nlet diagnosticTimeout: ReturnType<typeof setTimeout> | undefined;\n\nconsole.log = (...args: unknown[]) => {\n connection.console.log(args.map((v) => inspect(v)).join(\" \"));\n};\nconsole.error = (...args: unknown[]) => {\n connection.console.error(args.map((v) => inspect(v)).join(\" \"));\n};\nprocess.on(\"uncaughtException\", console.error);\nprocess.on(\"unhandledRejection\", console.error);\n\nconnection.onInitialize(async (params) => {\n setupMessages(connection);\n await service.initialize(params);\n\n return {\n capabilities: {\n textDocumentSync: TextDocumentSyncKind.Incremental,\n documentFormattingProvider: true,\n definitionProvider: true,\n hoverProvider: true,\n renameProvider: true,\n codeActionProvider: true,\n referencesProvider: true,\n documentLinkProvider: { resolveProvider: false },\n colorProvider: true,\n documentHighlightProvider: true,\n documentSymbolProvider: true,\n completionProvider: {\n resolveProvider: true,\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\nworkspace.setup(connection);\nworkspace.onConfigChange(validateDocs);\n\nconnection.onDidOpenTextDocument(async (params) => {\n documents.doOpen(params);\n\n const doc = documents.get(params.textDocument.uri);\n if (doc) {\n const diagnostics = (await service.doValidate(doc)) || [];\n prevDiags.set(doc, diagnostics);\n connection.sendDiagnostics({\n uri: doc.uri,\n diagnostics,\n });\n }\n});\nconnection.onDidChangeTextDocument(documents.doChange);\nconnection.onDidCloseTextDocument(documents.doClose);\nconnection.onDidChangeWatchedFiles(documents.doChangeWatchedFiles);\n\ndocuments.onFileChange((changeDoc) => {\n if (changeDoc) {\n queueDiagnostic();\n clearMarkoCacheForFile(changeDoc);\n } else {\n validateDocs();\n }\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.onCompletionResolve(async (item, cancel) => {\n return (await service.doCompletionResolve(item, cancel)) || item;\n});\n\nconnection.onDefinition(async (params, cancel) => {\n return (\n ((await service.findDefinition(\n documents.get(params.textDocument.uri)!,\n params,\n cancel,\n )) as DefinitionLink[]) || null\n );\n});\n\nconnection.onReferences(async (params, cancel) => {\n return (\n (await service.findReferences(\n documents.get(params.textDocument.uri)!,\n params,\n cancel,\n )) || null\n );\n});\n\nconnection.onDocumentLinks(async (params, cancel) => {\n return (\n (await service.findDocumentLinks(\n documents.get(params.textDocument.uri)!,\n params,\n cancel,\n )) || null\n );\n});\n\nconnection.onDocumentSymbol(async (params, cancel) => {\n return (\n (await service.findDocumentSymbols(\n documents.get(params.textDocument.uri)!,\n params,\n cancel,\n )) || null\n );\n});\n\nconnection.onDocumentHighlight(async (params, cancel) => {\n return (\n (await service.findDocumentHighlights(\n documents.get(params.textDocument.uri)!,\n params,\n cancel,\n )) || null\n );\n});\n\nconnection.onDocumentColor(async (params, cancel) => {\n return (\n (await service.findDocumentColors(\n documents.get(params.textDocument.uri)!,\n params,\n cancel,\n )) || null\n );\n});\n\nconnection.onColorPresentation(async (params, cancel) => {\n return (\n (await service.getColorPresentations(\n documents.get(params.textDocument.uri)!,\n params,\n cancel,\n )) || null\n );\n});\n\nconnection.onHover(async (params, cancel) => {\n return (\n (await service.doHover(\n documents.get(params.textDocument.uri)!,\n params,\n cancel,\n )) || null\n );\n});\n\nconnection.onRenameRequest(async (params, cancel) => {\n return (\n (await service.doRename(\n documents.get(params.textDocument.uri)!,\n params,\n cancel,\n )) || null\n );\n});\n\nconnection.onCodeAction(async (params, cancel) => {\n return (\n (await service.doCodeActions(\n documents.get(params.textDocument.uri)!,\n params,\n cancel,\n )) || null\n );\n});\n\nconnection.onDocumentFormatting(async (params, cancel) => {\n return (\n (await service.format(\n documents.get(params.textDocument.uri)!,\n params,\n cancel,\n )) || null\n );\n});\n\nfor (const command in service.commands) {\n connection.onRequest(command, service.commands[command]);\n}\n\nfunction validateDocs() {\n queueDiagnostic();\n Project.clearCaches();\n}\n\nfunction queueDiagnostic() {\n clearTimeout(diagnosticTimeout);\n const id = (diagnosticTimeout = setTimeout(async () => {\n const results = await Promise.all(\n Array.from(documents.getAllOpen()).map(async (doc) => {\n if (!documents.isOpen(doc)) {\n prevDiags.delete(doc);\n return;\n }\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\nconnection.listen();\n", "import type {\n CodeAction,\n ColorInformation,\n ColorPresentation,\n Command,\n CompletionItem,\n DefinitionLink,\n Diagnostic,\n DocumentHighlight,\n DocumentLink,\n Hover,\n Location,\n MarkedString,\n Range,\n SymbolInformation,\n WorkspaceEdit,\n} from \"vscode-languageserver\";\nimport { MarkupContent, MarkupKind } from \"vscode-languageserver\";\n\nimport {\n doChange,\n doChangeWatchedFiles,\n doClose,\n doOpen,\n get,\n} from \"../utils/text-documents\";\nexport const documents = {\n get,\n doChange,\n doOpen,\n doClose,\n doChangeWatchedFiles,\n};\n\nimport HtmlPlugin from \"./html\";\nimport MarkoPlugin from \"./marko\";\nimport ScriptPlugin from \"./script\";\nimport StylePlugin from \"./style\";\nimport type { Plugin } from \"./types\";\n\nconst REG_MARKDOWN_CHARS = /[\\\\`*_{}[\\]<>()#+.!|-]/g;\nconst plugins = [MarkoPlugin, ScriptPlugin, StylePlugin, HtmlPlugin];\n\n/**\n * Facade to all embedded plugins, eg css, typescript and our own.\n */\nconst service: Plugin = {\n commands: Object.assign({}, ...plugins.map(({ commands }) => commands)),\n async initialize(params) {\n await Promise.allSettled(\n plugins.map((plugin) => plugin.initialize?.(params)),\n );\n },\n async doComplete(doc, params, cancel) {\n // TODO: this should handle CompletionList.itemDefaults.\n // If there is a single responding plugin, pass through, otherwise need to apply the defaults to the completion items for the plugin.\n\n // Used to filter out duplicate labels (highest sortText wins).\n const results = await Promise.allSettled(\n plugins.map((plugin) => plugin.doComplete?.(doc, params, cancel)),\n );\n\n if (cancel.isCancellationRequested) return;\n\n const itemsByLabel = new Map<string, CompletionItem>();\n for (const result of results) {\n if (result.status !== \"fulfilled\" || !result.value) continue;\n\n for (const item of Array.isArray(result.value)\n ? result.value\n : result.value.items) {\n const { label } = item;\n const existingItem = itemsByLabel.get(label);\n if (existingItem) {\n if ((existingItem.sortText || label) < (item.sortText || label)) {\n itemsByLabel.set(label, item);\n }\n } else {\n itemsByLabel.set(label, item);\n }\n }\n }\n\n return { items: [...itemsByLabel.values()], isIncomplete: true };\n },\n async doCompletionResolve(item, cancel) {\n for (const plugin of plugins) {\n try {\n const result = await plugin.doCompletionResolve?.(item, cancel);\n if (cancel.isCancellationRequested) return;\n if (result) return result;\n } catch {\n // ignore\n }\n }\n },\n async findDefinition(doc, params, cancel) {\n const results = await Promise.allSettled(\n plugins.map((plugin) => plugin.findDefinition?.(doc, params, cancel)),\n );\n\n if (cancel.isCancellationRequested) return;\n\n let links: (Location | DefinitionLink)[] | undefined;\n for (const result of results) {\n if (result.status !== \"fulfilled\" || !result.value) continue;\n links = (links || []).concat(result.value);\n }\n\n return links;\n },\n async findReferences(doc, params, cancel) {\n const results = await Promise.allSettled(\n plugins.map((plugin) => plugin.findReferences?.(doc, params, cancel)),\n );\n\n if (cancel.isCancellationRequested) return;\n\n let references: Location[] | undefined;\n for (const result of results) {\n if (result.status !== \"fulfilled\" || !result.value) continue;\n references = (references || []).concat(result.value);\n }\n\n return references;\n },\n async findDocumentSymbols(doc, params, cancel) {\n const results = await Promise.allSettled(\n plugins.map((plugin) =>\n plugin.findDocumentSymbols?.(doc, params, cancel),\n ),\n );\n\n if (cancel.isCancellationRequested) return;\n\n let symbols: SymbolInformation[] | undefined;\n for (const result of results) {\n if (result.status !== \"fulfilled\" || !result.value) continue;\n symbols = (symbols || []).concat(result.value);\n }\n\n return symbols;\n },\n async findDocumentLinks(doc, params, cancel) {\n const results = await Promise.allSettled(\n plugins.map((plugin) => plugin.findDocumentLinks?.(doc, params, cancel)),\n );\n\n if (cancel.isCancellationRequested) return;\n\n let links: DocumentLink[] | undefined;\n for (const result of results) {\n if (result.status !== \"fulfilled\" || !result.value) continue;\n links = (links || []).concat(result.value);\n }\n\n return links;\n },\n async findDocumentHighlights(doc, params, cancel) {\n const results = await Promise.allSettled(\n plugins.map((plugin) =>\n plugin.findDocumentHighlights?.(doc, params, cancel),\n ),\n );\n\n if (cancel.isCancellationRequested) return;\n\n let highlights: DocumentHighlight[] | undefined;\n for (const result of results) {\n if (result.status !== \"fulfilled\" || !result.value) continue;\n highlights = (highlights || []).concat(result.value);\n }\n\n return highlights;\n },\n async findDocumentColors(doc, params, cancel) {\n const results = await Promise.allSettled(\n plugins.map((plugin) => plugin.findDocumentColors?.(doc, params, cancel)),\n );\n\n if (cancel.isCancellationRequested) return;\n\n let colors: ColorInformation[] | undefined;\n for (const result of results) {\n if (result.status !== \"fulfilled\" || !result.value) continue;\n colors = (colors || []).concat(result.value);\n }\n\n return colors;\n },\n async getColorPresentations(doc, params, cancel) {\n const results = await Promise.allSettled(\n plugins.map((plugin) =>\n plugin.getColorPresentations?.(doc, params, cancel),\n ),\n );\n\n if (cancel.isCancellationRequested) return;\n\n let presentations: ColorPresentation[] | undefined;\n for (const result of results) {\n if (result.status !== \"fulfilled\" || !result.value) continue;\n presentations = (presentations || []).concat(result.value);\n }\n\n return presentations;\n },\n async doHover(doc, params, cancel) {\n const results = await Promise.allSettled(\n plugins.map((plugin) => plugin.doHover?.(doc, params, cancel)),\n );\n\n if (cancel.isCancellationRequested) return;\n\n let hovers: Hover | undefined;\n for (const result of results) {\n if (result.status !== \"fulfilled\" || !result.value) continue;\n if (hovers) {\n hovers.range = maxRange(hovers.range, result.value.range);\n hovers.contents = mergeHoverContents(\n hovers.contents,\n result.value.contents,\n );\n } else {\n hovers = result.value;\n }\n }\n\n return hovers;\n },\n async doRename(doc, params, cancel) {\n const results = await Promise.allSettled(\n plugins.map((plugin) => plugin.doRename?.(doc, params, cancel)),\n );\n\n if (cancel.isCancellationRequested) return;\n\n let changes: WorkspaceEdit[\"changes\"];\n let changeAnnotations: WorkspaceEdit[\"changeAnnotations\"];\n let documentChanges: WorkspaceEdit[\"documentChanges\"];\n for (const result of results) {\n if (result.status !== \"fulfilled\" || !result.value) continue;\n const { value } = result;\n if (value.changes) {\n if (changes) {\n changes = { ...changes };\n\n for (const uri in value.changes) {\n changes[uri] = changes[uri]\n ? changes[uri].concat(value.changes[uri])\n : value.changes[uri];\n }\n } else {\n changes = value.changes;\n }\n }\n\n if (value.changeAnnotations) {\n changeAnnotations = changeAnnotations\n ? {\n ...changeAnnotations,\n ...value.changeAnnotations,\n }\n : value.changeAnnotations;\n }\n\n if (value.documentChanges) {\n documentChanges = documentChanges\n ? documentChanges.concat(value.documentChanges)\n : value.documentChanges;\n }\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 results = await Promise.allSettled(\n plugins.map((plugin) => plugin.doCodeActions?.(doc, params, cancel)),\n );\n\n if (cancel.isCancellationRequested) return;\n\n let actions: (Command | CodeAction)[] | undefined;\n for (const result of results) {\n if (result.status !== \"fulfilled\" || !result.value) continue;\n actions = (actions || []).concat(result.value);\n }\n\n return actions;\n },\n async doValidate(doc) {\n const results = await Promise.allSettled(\n plugins.map((plugin) => plugin.doValidate?.(doc)),\n );\n\n let diagnostics: Diagnostic[] | undefined;\n for (const result of results) {\n if (result.status !== \"fulfilled\" || !result.value) continue;\n diagnostics = (diagnostics || []).concat(result.value);\n }\n\n return diagnostics;\n },\n format: MarkoPlugin.format!,\n};\n\nfunction maxRange(a: Range | undefined, b: Range | undefined) {\n if (!a) return b;\n if (!b) return a;\n return {\n start: {\n line: Math.min(a.start.line, b.start.line),\n character: Math.min(a.start.character, b.start.character),\n },\n end: {\n line: Math.max(a.end.line, b.end.line),\n character: Math.max(a.end.character, b.end.character),\n },\n };\n}\n\nfunction mergeHoverContents(a: Hover[\"contents\"], b: Hover[\"contents\"]) {\n if (!a) return b;\n if (!b) return a;\n\n if (!MarkupContent.is(a)) {\n a = markedStringToMarkupContent(a);\n }\n\n if (!MarkupContent.is(b)) {\n b = markedStringToMarkupContent(b);\n }\n\n if (a.kind === b.kind) {\n return {\n kind: a.kind,\n value: `${a.value}\\n${b.value}`,\n };\n }\n\n return {\n kind: MarkupKind.Markdown,\n value: `${markupContentToMarkdown(a)}\\n${markupContentToMarkdown(b)}`,\n };\n}\n\nfunction markedStringToMarkupContent(\n markedString: MarkedString | MarkedString[],\n): MarkupContent {\n return {\n kind: MarkupKind.Markdown,\n value: Array.isArray(markedString)\n ? markedString.map((it) => markedStringToString(it)).join(\"\\n\")\n : markedStringToString(markedString),\n };\n}\n\nfunction markedStringToString(markedString: MarkedString) {\n if (typeof markedString === \"string\") {\n return markedString;\n }\n\n return `\\`\\`\\`${markedString.language}\\n${markedString.value}\\n\\`\\`\\``;\n}\n\nfunction markupContentToMarkdown(content: MarkupContent): string {\n return content.kind === MarkupKind.Markdown\n ? content.value\n : escapeMarkdown(content.value);\n}\n\nfunction escapeMarkdown(str: string) {\n return str.replace(REG_MARKDOWN_CHARS, \"$1\");\n}\n\nexport { service as default };\n", "import fs from \"fs\";\nimport {\n DidChangeTextDocumentParams,\n DidChangeWatchedFilesParams,\n DidCloseTextDocumentParams,\n DidOpenTextDocumentParams,\n FileChangeType,\n} from \"vscode-languageserver\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport { URI } from \"vscode-uri\";\n\nexport type FileChangeHandler = (document: TextDocument | undefined) => void;\n\nconst docs = new Map<string, TextDocument>();\nconst openDocs = new Set<TextDocument>();\nconst fileExists = new Map<string, boolean>();\nconst fileChangeHandlers: Set<FileChangeHandler> = new Set();\n\nexport let projectVersion = 0;\n\nexport function onFileChange(handler: FileChangeHandler) {\n fileChangeHandlers.add(handler);\n}\n\nexport function getAllOpen() {\n return openDocs;\n}\n\nexport function get(uri: string) {\n const doc = docs.get(uri);\n if (doc) return doc;\n\n const { fsPath, scheme } = URI.parse(uri);\n if (scheme === \"file\") {\n if (fileExists.get(uri) === false) return undefined;\n try {\n const newDoc = TextDocument.create(\n uri,\n getLanguageId(uri),\n fs.statSync(fsPath).mtimeMs,\n fs.readFileSync(fsPath, \"utf-8\"),\n );\n\n docs.set(uri, newDoc);\n fileExists.set(uri, true);\n return newDoc;\n } catch {\n fileExists.set(uri, false);\n }\n }\n}\n\nexport function exists(uri: string) {\n const cached = fileExists.get(uri);\n if (cached !== undefined) return cached;\n\n const { fsPath, scheme } = URI.parse(uri);\n if (scheme === \"file\") {\n try {\n fs.accessSync(fsPath);\n fileExists.set(uri, true);\n return true;\n } catch {\n fileExists.set(uri, false);\n return false;\n }\n }\n\n return false;\n}\n\nexport function isOpen(doc: TextDocument) {\n return openDocs.has(doc);\n}\n\nexport function doOpen(params: DidOpenTextDocumentParams) {\n const ref = params.textDocument;\n const existingDoc = docs.get(ref.uri);\n projectVersion++;\n\n if (existingDoc) {\n if (existingDoc.version === ref.version) {\n openDocs.add(existingDoc);\n return;\n }\n\n openDocs.delete(existingDoc);\n docs.delete(ref.uri);\n }\n\n const newDoc = TextDocument.create(\n ref.uri,\n ref.languageId,\n ref.version,\n ref.text,\n );\n\n openDocs.add(newDoc);\n fileExists.set(ref.uri, true);\n docs.set(ref.uri, newDoc);\n}\n\nexport function doChange(params: DidChangeTextDocumentParams) {\n const ref = params.textDocument;\n const changes = params.contentChanges;\n const doc = docs.get(ref.uri);\n if (changes.length > 0 && ref.version != null && doc) {\n TextDocument.update(doc, changes, ref.version);\n emitFileChange(doc);\n }\n}\n\nexport function doClose(params: DidCloseTextDocumentParams) {\n const ref = params.textDocument;\n const doc = docs.get(ref.uri);\n if (doc) {\n projectVersion++;\n openDocs.delete(doc);\n\n if (URI.parse(ref.uri).scheme !== \"file\") {\n docs.delete(ref.uri);\n }\n }\n}\n\nexport function doChangeWatchedFiles(params: DidChangeWatchedFilesParams) {\n for (const change of params.changes) {\n switch (change.type) {\n case FileChangeType.Created:\n fileExists.set(change.uri, true);\n break;\n case FileChangeType.Deleted:\n case FileChangeType.Changed: {\n fileExists.set(change.uri, change.type === FileChangeType.Changed);\n\n // When a file that's in our cache is changed or deleted and not in an open editor\n // we clear the file from the cache since it will be reloaded when read.\n const doc = docs.get(change.uri);\n if (doc && !openDocs.has(doc)) {\n docs.delete(change.uri);\n }\n }\n }\n }\n\n emitFileChange(undefined);\n}\n\nfunction getLanguageId(uri: string) {\n const ext = uri.slice(uri.lastIndexOf(\".\") + 1);\n switch (ext) {\n case \"cjs\":\n case \"mjs\":\n case \"js\":\n return \"javascript\";\n case \"cts\":\n case \"mts\":\n case \"ts\":\n return \"typescript\";\n default:\n return ext;\n }\n}\n\nfunction emitFileChange(doc: TextDocument | undefined) {\n projectVersion++;\n\n for (const handler of fileChangeHandlers) {\n handler(doc);\n }\n}\n", "import { extractHTML, type Parsed } from \"@marko/language-tools\";\nimport axe from \"axe-core\";\nimport { JSDOM } from \"jsdom\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\n\nimport { getMarkoFile } from \"../../utils/file\";\nimport { get } from \"../../utils/text-documents\";\nimport type { Plugin } from \"../types\";\nimport { ruleExceptions } from \"./axe-rules/rule-exceptions\";\n\nconst extractCache = new WeakMap<Parsed, ReturnType<typeof extractHTML>>();\n\n// const axeViolationImpact: {\n// [impact in NonNullable<axe.ImpactValue>]: DiagnosticSeverity;\n// } = {\n// minor: 1,\n// moderate: 2,\n// serious: 3,\n// critical: 4,\n// };\n\nconst HTMLService: Partial<Plugin> = {\n commands: {\n \"$/showHtmlOutput\": async (uri: string) => {\n const doc = get(uri);\n if (!doc) return;\n\n const { extracted } = extract(doc);\n\n return {\n language: \"html\",\n content: extracted.toString(),\n };\n },\n },\n async doValidate(doc) {\n const { extracted, nodeDetails } = extract(doc);\n\n const jsdom = new JSDOM(extracted.toString(), {\n includeNodeLocations: true,\n });\n const { documentElement } = jsdom.window.document;\n\n const getViolationNodes = async (runOnly: string[]) =>\n (\n await axe.run(documentElement, {\n runOnly,\n rules: {\n \"color-contrast\": { enabled: false },\n },\n resultTypes: [\"violations\"],\n elementRef: true,\n })\n ).violations.flatMap(({ nodes, id }) =>\n nodes.map((node) => ({ ...node, ruleId: id })),\n );\n\n const release = await acquireMutexLock();\n const violations = await getViolationNodes(Object.keys(ruleExceptions));\n release();\n\n return violations.flatMap((result) => {\n const { element } = result;\n if (!element) return [];\n const ruleId = result.ruleId as keyof typeof ruleExceptions;\n\n if (element.dataset.markoNodeId) {\n const details = nodeDetails[element.dataset.markoNodeId];\n if (\n (ruleExceptions[ruleId].attrSpread && details.hasDynamicAttrs) ||\n (ruleExceptions[ruleId].unknownBody && details.hasDynamicBody) ||\n ruleExceptions[ruleId].dynamicAttrs?.some(\n (attr) => element.getAttribute(attr) === \"dynamic\",\n )\n ) {\n return [];\n }\n }\n\n const generatedLoc = jsdom.nodeLocation(element);\n if (!generatedLoc) return [];\n\n const sourceRange = extracted.sourceLocationAt(\n generatedLoc.startOffset + 1,\n generatedLoc.startOffset + 1 + element.tagName.length,\n );\n if (!sourceRange) return [];\n\n return [\n {\n range: sourceRange,\n severity: 3,\n source: `axe-core(${ruleId})`,\n message: result.failureSummary ?? \"unknown accessibility issue\",\n },\n ];\n });\n },\n};\n\nfunction extract(doc: TextDocument) {\n const { parsed } = getMarkoFile(doc);\n let cached = extractCache.get(parsed);\n\n if (!cached) {\n cached = extractHTML(parsed);\n extractCache.set(parsed, cached);\n }\n\n return cached;\n}\n\nlet lock: Promise<void> | undefined;\nasync function acquireMutexLock() {\n const currLock = lock;\n let resolve!: () => void;\n lock = new Promise((_) => (resolve = _));\n await currLock;\n return resolve;\n}\n\nexport default HTMLService;\n", "import type { TaglibLookup } from \"@marko/compiler/babel-utils\";\nimport { parse, type Parsed, Project } from \"@marko/language-tools\";\nimport path from \"path\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport { URI } from \"vscode-uri\";\n\nconst processorCaches = new WeakMap<Parsed, Map<unknown, unknown>>();\n\nexport interface MarkoFile {\n uri: string;\n scheme: string;\n version: number;\n lookup: TaglibLookup;\n filename: string | undefined;\n dirname: string | undefined;\n parsed: Parsed;\n code: string;\n}\n\nexport function getFSDir(doc: TextDocument): string | undefined {\n const filename = getFSPath(doc);\n return filename && path.dirname(filename);\n}\n\nexport function getFSPath(doc: TextDocument): string | undefined {\n const parsed = URI.parse(doc.uri);\n return parsed.scheme === \"file\" ? parsed.fsPath : undefined;\n}\n\nexport function getMarkoFile(doc: TextDocument): MarkoFile {\n const { uri } = doc;\n const { fsPath, scheme } = URI.parse(uri);\n const filename = scheme === \"file\" ? fsPath : undefined;\n const dirname = filename ? path.dirname(filename) : process.cwd();\n const cache = Project.getCache(dirname) as Map<TextDocument, MarkoFile>;\n let file = cache.get(doc);\n if (!file) {\n const { version } = doc;\n const code = doc.getText();\n const parsed = parse(code, filename);\n const lookup = Project.getTagLookup(dirname);\n cache.set(\n doc,\n (file = {\n uri,\n scheme,\n version,\n lookup,\n filename,\n dirname,\n parsed,\n code,\n }),\n );\n }\n\n return file;\n}\n\nexport function clearMarkoCacheForFile(doc: TextDocument) {\n (Project.getCache(getFSDir(doc)) as Map<TextDocument, MarkoFile>).delete(doc);\n}\n\n/**\n * Run some processing against a parsed document and cache the result.\n * Anytime the document changes, the cache is cleared.\n */\nexport function processDoc<T>(\n doc: TextDocument,\n process: (file: MarkoFile) => T,\n): T {\n const file = getMarkoFile(doc);\n const cache = processorCaches.get(file.parsed) as\n | Map<typeof process, T>\n | undefined;\n let result: T | undefined;\n\n if (cache) {\n result = cache.get(process);\n if (!result) {\n result = process(file);\n cache.set(process, result);\n }\n } else {\n result = process(file);\n processorCaches.set(file.parsed, new Map([[process, result]]));\n }\n\n return result;\n}\n", "export const keyboard = {\n /**\n * - Ensure every accesskey attribute value is unique\n * - accesskey attribute value should be unique ([url](https://dequeuniversity.com/rules/axe/4.10/accesskeys?application=axeAPI))\n */\n accesskeys: \"accesskeys\",\n /**\n * - Ensure each page has at least one mechanism for a user to bypass navigation and jump straight to the content\n * - Page must have means to bypass repeated blocks ([url](https://dequeuniversity.com/rules/axe/4.10/bypass?application=axeAPI))\n */\n bypass: \"bypass\",\n /**\n * - Ensure elements in the focus order have a role appropriate for interactive content\n * - Elements in the focus order should have an appropriate role ([url](https://dequeuniversity.com/rules/axe/4.10/focus-order-semantics?application=axeAPI))\n */\n focusOrderSemantics: \"focus-order-semantics\",\n /**\n * - Ensure `<frame>` and `<iframe>` elements with focusable content do not have tabindex=-1\n * - Frames with focusable content must not have tabindex=-1 ([url](https://dequeuniversity.com/rules/axe/4.10/frame-focusable-content?application=axeAPI))\n */\n frameFocusableContent: \"frame-focusable-content\",\n /**\n * - Ensure interactive controls are not nested as they are not always announced by screen readers or can cause focus problems for assistive technologies\n * - Interactive controls must not be nested ([url](https://dequeuniversity.com/rules/axe/4.10/nested-interactive?application=axeAPI))\n */\n nestedInteractive: \"nested-interactive\",\n /**\n * - Ensure all page content is contained by landmarks\n * - All page content should be contained by landmarks ([url](https://dequeuniversity.com/rules/axe/4.10/region?application=axeAPI))\n */\n region: \"region\",\n /**\n * - Ensure elements that have scrollable content are accessible by keyboard\n * - Scrollable region must have keyboard access ([url](https://dequeuniversity.com/rules/axe/4.10/scrollable-region-focusable?application=axeAPI))\n */\n scrollableRegionFocusable: \"scrollable-region-focusable\",\n /**\n * - Ensure all skip links have a focusable target\n * - The skip-link target should exist and be focusable ([url](https://dequeuniversity.com/rules/axe/4.10/skip-link?application=axeAPI))\n */\n skipLink: \"skip-link\",\n /**\n * - Ensure tabindex attribute values are not greater than 0\n * - Elements should not have tabindex greater than zero ([url](https://dequeuniversity.com/rules/axe/4.10/tabindex?application=axeAPI))\n */\n tabindex: \"tabindex\",\n} as const;\n\nexport const textAlternatives = {\n /**\n * - Ensure `<area>` elements of image maps have alternate text\n * - Active `<area>` elements must have alternate text ([url](https://dequeuniversity.com/rules/axe/4.10/area-alt?application=axeAPI))\n */\n areaAlt: \"area-alt\",\n /**\n * - Ensure each HTML document contains a non-empty `<title>` element\n * - Documents must have `<title>` element to aid in navigation ([url](https://dequeuniversity.com/rules/axe/4.10/document-title?application=axeAPI))\n */\n documentTitle: \"document-title\",\n /**\n * - Ensure `<iframe>` and `<frame>` elements contain a unique title attribute\n * - Frames must have a unique title attribute ([url](https://dequeuniversity.com/rules/axe/4.10/frame-title-unique?application=axeAPI))\n */\n frameTitleUnique: \"frame-title-unique\",\n /**\n * - Ensure `<iframe>` and `<frame>` elements have an accessible name\n * - Frames must have an accessible name ([url](https://dequeuniversity.com/rules/axe/4.10/frame-title?application=axeAPI))\n */\n frameTitle: \"frame-title\",\n /**\n * - Ensure `<img>` elements have alternate text or a role of none or presentation\n * - Images must have alternate text ([url](https://dequeuniversity.com/rules/axe/4.10/image-alt?application=axeAPI))\n */\n imageAlt: \"image-alt\",\n /**\n * - Ensure image alternative is not repeated as text\n * - Alternative text of images should not be repeated as text ([url](https://dequeuniversity.com/rules/axe/4.10/image-redundant-alt?application=axeAPI))\n */\n imageRedundantAlt: \"image-redundant-alt\",\n /**\n * - Ensure `<input type=\"image\">` elements have alternate text\n * - Image buttons must have alternate text ([url](https://dequeuniversity.com/rules/axe/4.10/input-image-alt?application=axeAPI))\n */\n inputImageAlt: \"input-image-alt\",\n /**\n * - Ensure `<object>` elements have alternate text\n * - `<object>` elements must have alternate text ([url](https://dequeuniversity.com/rules/axe/4.10/object-alt?application=axeAPI))\n */\n objectAlt: \"object-alt\",\n /**\n * - Ensure [role=\"img\"] elements have alternate text\n * - [role=\"img\"] elements must have an alternative text ([url](https://dequeuniversity.com/rules/axe/4.10/role-img-alt?application=axeAPI))\n */\n roleImgAlt: \"role-img-alt\",\n /**\n * - Ensure that server-side image maps are not used\n * - Server-side image maps must not be used ([url](https://dequeuniversity.com/rules/axe/4.10/server-side-image-map?application=axeAPI))\n */\n serverSideImageMap: \"server-side-image-map\",\n /**\n * - Ensure `<svg>` elements with an img, graphics-document or graphics-symbol role have an accessible text\n * - `<svg>` elements with an img role must have an alternative text ([url](https://dequeuniversity.com/rules/axe/4.10/svg-img-alt?application=axeAPI))\n */\n svgImgAlt: \"svg-img-alt\",\n /**\n * - Ensure `<video>` elements have captions\n * - `<video>` elements must have captions ([url](https://dequeuniversity.com/rules/axe/4.10/video-caption?application=axeAPI))\n */\n videoCaption: \"video-caption\",\n} as const;\n\nexport const aria = {\n /**\n * - Ensure an element's role supports its ARIA attributes\n * - Elements must only use supported ARIA attributes ([url](https://dequeuniversity.com/rules/axe/4.10/aria-allowed-attr?application=axeAPI))\n */\n ariaAllowedAttr: \"aria-allowed-attr\",\n /**\n * - Ensure role attribute has an appropriate value for the element\n * - ARIA role should be appropriate for the element ([url](https://dequeuniversity.com/rules/axe/4.10/aria-allowed-role?application=axeAPI))\n */\n ariaAllowedRole: \"aria-allowed-role\",\n /**\n * - Ensure aria-braillelabel and aria-brailleroledescription have a non-braille equivalent\n * - aria-braille attributes must have a non-braille equivalent ([url](https://dequeuniversity.com/rules/axe/4.10/aria-braille-equivalent?application=axeAPI))\n */\n ariaBrailleEquivalent: \"aria-braille-equivalent\",\n /**\n * - Ensure every ARIA button, link and menuitem has an accessible name\n * - ARIA commands must have an accessible name ([url](https://dequeuniversity.com/rules/axe/4.10/aria-command-name?application=axeAPI))\n */\n ariaCommandName: \"aria-command-name\",\n /**\n * - Ensure ARIA attributes are used as described in the specification of the element's role\n * - ARIA attributes must be used as specified for the element's role ([url](https://dequeuniversity.com/rules/axe/4.10/aria-conditional-attr?application=axeAPI))\n */\n ariaConditionalAttr: \"aria-conditional-attr\",\n /**\n * - Ensure elements do not use deprecated roles\n * - Deprecated ARIA roles must not be used ([url](https://dequeuniversity.com/rules/axe/4.10/aria-deprecated-role?application=axeAPI))\n */\n ariaDeprecatedRole: \"aria-deprecated-role\",\n /**\n * - Ensure every ARIA dialog and alertdialog node has an accessible name\n * - ARIA dialog and alertdialog nodes should have an accessible name ([url](https://dequeuniversity.com/rules/axe/4.10/aria-dialog-name?application=axeAPI))\n */\n ariaDialogName: \"aria-dialog-name\",\n /**\n * - Ensure aria-hidden=\"true\" is not present on the document body.\n * - aria-hidden=\"true\" must not be present on the document body ([url](https://dequeuniversity.com/rules/axe/4.10/aria-hidden-body?application=axeAPI))\n */\n ariaHiddenBody: \"aria-hidden-body\",\n /**\n * - Ensure every ARIA input field has an accessible name\n * - ARIA input fields must have an accessible name ([url](https://dequeuniversity.com/rules/axe/4.10/aria-input-field-name?application=axeAPI))\n */\n ariaInputFieldName: \"aria-input-field-name\",\n /**\n * - Ensure every ARIA meter node has an accessible name\n * - ARIA meter nodes must have an accessible name ([url](https://dequeuniversity.com/rules/axe/4.10/aria-meter-name?application=axeAPI))\n */\n ariaMeterName: \"aria-meter-name\",\n /**\n * - Ensure every ARIA progressbar node has an accessible name\n * - ARIA progressbar nodes must have an accessible name ([url](https://dequeuniversity.com/rules/axe/4.10/aria-progressbar-name?application=axeAPI))\n */\n ariaProgressbarName: \"aria-progressbar-name\",\n /**\n * - Ensure ARIA attributes are not prohibited for an element's role\n * - Elements must only use permitted ARIA attributes ([url](https://dequeuniversity.com/rules/axe/4.10/aria-prohibited-attr?application=axeAPI))\n */\n ariaProhibitedAttr: \"aria-prohibited-attr\",\n /**\n * - Ensure elements with ARIA roles have all required ARIA attributes\n * - Required ARIA attributes must be provided ([url](https://dequeuniversity.com/rules/axe/4.10/aria-required-attr?application=axeAPI))\n */\n ariaRequiredAttr: \"aria-required-attr\",\n /**\n * - Ensure elements with an ARIA role that require child roles contain them\n * - Certain ARIA roles must contain particular children ([url](https://dequeuniversity.com/rules/axe/4.10/aria-required-children?application=axeAPI))\n */\n ariaRequiredChildren: \"aria-required-children\",\n /**\n * - Ensure elements with an ARIA role that require parent roles are contained by them\n * - Certain ARIA roles must be contained by particular parents ([url](https://dequeuniversity.com/rules/axe/4.10/aria-required-parent?application=axeAPI))\n */\n ariaRequiredParent: \"aria-required-parent\",\n /**\n * - Ensure aria-roledescription is only used on elements with an implicit or explicit role\n * - aria-roledescription must be on elements with a semantic role ([url](https://dequeuniversity.com/rules/axe/4.10/aria-roledescription?application=axeAPI))\n */\n ariaRoledescription: \"aria-roledescription\",\n /**\n * - Ensure all elements with a role attribute use a valid value\n * - ARIA roles used must conform to valid values ([url](https://dequeuniversity.com/rules/axe/4.10/aria-roles?application=axeAPI))\n */\n ariaRoles: \"aria-roles\",\n /**\n * - Ensure role=\"text\" is used on elements with no focusable descendants\n * - \"role=text\" should have no focusable descendants ([url](https://dequeuniversity.com/rules/axe/4.10/aria-text?application=axeAPI))\n */\n ariaText: \"aria-text\",\n /**\n * - Ensure every ARIA toggle field has an accessible name\n * - ARIA toggle fields must have an accessible name ([url](https://dequeuniversity.com/rules/axe/4.10/aria-toggle-field-name?application=axeAPI))\n */\n ariaToggleFieldName: \"aria-toggle-field-name\",\n /**\n * - Ensure every ARIA tooltip node has an accessible name\n * - ARIA tooltip nodes must have an accessible name ([url](https://dequeuniversity.com/rules/axe/4.10/aria-tooltip-name?application=axeAPI))\n */\n ariaTooltipName: \"aria-tooltip-name\",\n /**\n * - Ensure every ARIA treeitem node has an accessible name\n * - ARIA treeitem nodes should have an accessible name ([url](https://dequeuniversity.com/rules/axe/4.10/aria-treeitem-name?application=axeAPI))\n */\n ariaTreeitemName: \"aria-treeitem-name\",\n /**\n * - Ensure all ARIA attributes have valid values\n * - ARIA attributes must conform to valid values ([url](https://dequeuniversity.com/rules/axe/4.10/aria-valid-attr-value?application=axeAPI))\n */\n ariaValidAttrValue: \"aria-valid-attr-value\",\n /**\n * - Ensure attributes that begin with aria- are valid ARIA attributes\n * - ARIA attributes must conform to valid names ([url](https://dequeuniversity.com/rules/axe/4.10/aria-valid-attr?application=axeAPI))\n */\n ariaValidAttr: \"aria-valid-attr\",\n /**\n * - Elements marked as presentational should not have global ARIA or tabindex to ensure all screen readers ignore them\n * - Ensure elements marked as presentational are consistently ignored ([url](https://dequeuniversity.com/rules/axe/4.10/presentation-role-conflict?application=axeAPI))\n */\n presentationRoleConflict: \"presentation-role-conflict\",\n} as const;\n\nexport const nameRoleValue = {\n /**\n * - Ensure aria-hidden elements are not focusable nor contain focusable elements\n * - ARIA hidden element must not be focusable or contain focusable elements ([url](https://dequeuniversity.com/rules/axe/4.10/aria-hidden-focus?application=axeAPI))\n */\n ariaHiddenFocus: \"aria-hidden-focus\",\n /**\n * - Ensure buttons have discernible text\n * - Buttons must have discernible text ([url](https://dequeuniversity.com/rules/axe/4.10/button-name?application=axeAPI))\n */\n buttonName: \"button-name\",\n /**\n * - Ensure headings have discernible text\n * - Headings should not be empty ([url](https://dequeuniversity.com/rules/axe/4.10/empty-heading?application=axeAPI))\n */\n emptyHeading: \"empty-heading\",\n /**\n * - Ensure table headers have discernible text\n * - Table header text should not be empty ([url](https://dequeuniversity.com/rules/axe/4.10/empty-table-header?application=axeAPI))\n */\n emptyTableHeader: \"empty-table-header\",\n /**\n * - Ensure input buttons have discernible text\n * - Input buttons must have discernible text ([url](https://dequeuniversity.com/rules/axe/4.10/input-button-name?application=axeAPI))\n */\n inputButtonName: \"input-button-name\",\n /**\n * - Ensure links have discernible text\n * - Links must have discernible text ([url](https://dequeuniversity.com/rules/axe/4.10/link-name?application=axeAPI))\n */\n linkName: \"link-name\",\n /**\n * - Ensure summary elements have discernible text\n * - Summary elements must have discernible text ([url](https://dequeuniversity.com/rules/axe/4.10/summary-name?application=axeAPI))\n */\n summaryName: \"summary-name\",\n} as const;\n\nexport const timeAndMedia = {\n /**\n * - Ensure `<audio>` elements have captions\n * - `<audio>` elements must have a captions track ([url](https://dequeuniversity.com/rules/axe/4.10/audio-caption?application=axeAPI))\n */\n audioCaption: \"audio-caption\",\n /**\n * - Ensure `<blink>` elements are not used\n * - `<blink>` elements are deprecated and must not be used ([url](https://dequeuniversity.com/rules/axe/4.10/blink?application=axeAPI))\n */\n blink: \"blink\",\n /**\n * - Ensure `<meta http-equiv=\"refresh\">` is not used for delayed refresh\n * - Delayed refresh must not be used ([url](https://dequeuniversity.com/rules/axe/4.10/meta-refresh-no-exceptions?application=axeAPI))\n */\n metaRefreshNoExceptions: \"meta-refresh-no-exceptions\",\n /**\n * - Ensure `<meta http-equiv=\"refresh\">` is not used for delayed refresh\n * - Delayed refresh under 20 hours must not be used ([url](https://dequeuniversity.com/rules/axe/4.10/meta-refresh?application=axeAPI))\n */\n metaRefresh: \"meta-refresh\",\n /**\n * - Ensure `<video>` or `<audio>` elements do not autoplay audio for more than 3 seconds without a control mechanism to stop or mute the audio\n * - `<video>` or `<audio>` elements must not play automatically ([url](https://dequeuniversity.com/rules/axe/4.10/no-autoplay-audio?application=axeAPI))\n */\n noAutoplayAudio: \"no-autoplay-audio\",\n} as const;\n\nexport const forms = {\n /**\n * - Ensure the autocomplete attribute is correct and suitable for the form field\n * - autocomplete attribute must be used correctly ([url](https://dequeuniversity.com/rules/axe/4.10/autocomplete-valid?application=axeAPI))\n */\n autocompleteValid: \"autocomplete-valid\",\n /**\n * - Ensure form field does not have multiple label elements\n * - Form field must not have multiple label elements ([url](https://dequeuniversity.com/rules/axe/4.10/form-field-multiple-labels?application=axeAPI))\n */\n formFieldMultipleLabels: \"form-field-multiple-labels\",\n /**\n * - Ensure that every form element has a visible label and is not solely labeled using hidden labels, or the title or aria-describedby attributes\n * - Form elements should have a visible label ([url](https://dequeuniversity.com/rules/axe/4.10/label-title-only?application=axeAPI))\n */\n labelTitleOnly: \"label-title-only\",\n /**\n * - Ensure every form element has a label\n * - Form elements must have labels ([url](https://dequeuniversity.com/rules/axe/4.10/label?application=axeAPI))\n */\n label: \"label\",\n /**\n * - Ensure select element has an accessible name\n * - Select element must have an accessible name ([url](https://dequeuniversity.com/rules/axe/4.10/select-name?application=axeAPI))\n */\n selectName: \"select-name\",\n} as const;\n\nexport const structure = {\n /**\n * - Ensure that text spacing set through style attributes can be adjusted with custom stylesheets\n * - Inline text spacing must be adjustable with custom stylesheets ([url](https://dequeuniversity.com/rules/axe/4.10/avoid-inline-spacing?application=axeAPI))\n */\n avoidInlineSpacing: \"avoid-inline-spacing\",\n /**\n * - Ensure content is not locked to any specific display orientation, and the content is operable in all display orientations\n * - CSS Media queries must not lock display orientation ([url](https://dequeuniversity.com/rules/axe/4.10/css-orientation-lock?application=axeAPI))\n */\n cssOrientationLock: \"css-orientation-lock\",\n /**\n * - Ensure `<dl>` elements are structured correctly\n * - `<dl>` elements must only directly contain properly-ordered `<dt>` and `<dd>` groups, `<script>`, `<template>` or `<div>` elements ([url](https://dequeuniversity.com/rules/axe/4.10/definition-list?application=axeAPI))\n */\n definitionList: \"definition-list\",\n /**\n * - Ensure `<dt>` and `<dd>` elements are contained by a `<dl>`\n * - `<dt>` and `<dd>` elements must be contained by a `<dl>` ([url](https://dequeuniversity.com/rules/axe/4.10/dlitem?application=axeAPI))\n */\n dlitem: \"dlitem\",\n /**\n * - Ensure `<iframe>` and `<frame>` elements contain the axe-core script\n * - Frames should be tested with axe-core ([url](https://dequeuniversity.com/rules/axe/4.10/frame-tested?application=axeAPI))\n */\n frameTested: \"frame-tested\",\n /**\n * - Informs users about hidden content.\n * - Hidden content on the page should be analyzed ([url](https://dequeuniversity.com/rules/axe/4.10/hidden-content?application=axeAPI))\n */\n hiddenContent: \"hidden-content\",\n /**\n * - Ensure that lists are structured correctly\n * - `<ul>` and `<ol>` must only directly contain `<li>`, `<script>` or `<template>` elements ([url](https://dequeuniversity.com/rules/axe/4.10/list?application=axeAPI))\n */\n list: \"list\",\n /**\n * - Ensure `<li>` elements are used semantically\n * - `<li>` elements must be contained in a `<ul>` or `<ol>` ([url](https://dequeuniversity.com/rules/axe/4.10/listitem?application=axeAPI))\n */\n listitem: \"listitem\",\n} as const;\n\nexport const color = {\n /**\n * - Ensure the contrast between foreground and background colors meets WCAG 2 AAA enhanced contrast ratio thresholds\n * - Elements must meet enhanced color contrast ratio thresholds ([url](https://dequeuniversity.com/rules/axe/4.10/color-contrast-enhanced?application=axeAPI))\n */\n colorContrastEnhanced: \"color-contrast-enhanced\",\n /**\n * - Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds\n * - Elements must meet minimum color contrast ratio thresholds ([url](https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI))\n */\n colorContrast: \"color-contrast\",\n /**\n * - Ensure links are distinguished from surrounding text in a way that does not rely on color\n * - Links must be distinguishable without relying on color ([url](https://dequeuniversity.com/rules/axe/4.10/link-in-text-block?application=axeAPI))\n */\n linkInTextBlock: \"link-in-text-block\",\n} as const;\n\nexport const parsing = {\n /**\n * - Ensure every id attribute value of active elements is unique\n * - IDs of active elements must be unique ([url](https://dequeuniversity.com/rules/axe/4.10/duplicate-id-active?application=axeAPI))\n */\n duplicateIdActive: \"duplicate-id-active\",\n /**\n * - Ensure every id attribute value used in ARIA and in labels is unique\n * - IDs used in ARIA and labels must be unique ([url](https://dequeuniversity.com/rules/axe/4.10/duplicate-id-aria?application=axeAPI))\n */\n duplicateIdAria: \"duplicate-id-aria\",\n /**\n * - Ensure every id attribute value is unique\n * - id attribute value must be unique ([url](https://dequeuniversity.com/rules/axe/4.10/duplicate-id?application=axeAPI))\n */\n duplicateId: \"duplicate-id\",\n /**\n * - Ensure `<marquee>` elements are not used\n * - `<marquee>` elements are deprecated and must not be used ([url](https://dequeuniversity.com/rules/axe/4.10/marquee?application=axeAPI))\n */\n marquee: \"marquee\",\n} as const;\n\nexport const semantics = {\n /**\n * - Ensure the order of headings is semantically correct\n * - Heading levels should only increase by one ([url](https://dequeuniversity.com/rules/axe/4.10/heading-order?application=axeAPI))\n */\n headingOrder: \"heading-order\",\n /**\n * - Ensure that links with the same accessible name serve a similar purpose\n * - Links with the same name must have a similar purpose ([url](https://dequeuniversity.com/rules/axe/4.10/identical-links-same-purpose?application=axeAPI))\n */\n identicalLinksSamePurpose: \"identical-links-same-purpose\",\n /**\n * - Ensure that elements labelled through their content must have their visible text as part of their accessible name\n * - Elements must have their visible text as part of their accessible name ([url](https://dequeuniversity.com/rules/axe/4.10/label-content-name-mismatch?application=axeAPI))\n */\n labelContentNameMismatch: \"label-content-name-mismatch\",\n /**\n * - Ensure the banner landmark is at top level\n * - Banner landmark should not be contained in another landmark ([url](https://dequeuniversity.com/rules/axe/4.10/landmark-banner-is-top-level?application=axeAPI))\n */\n landmarkBannerIsTopLevel: \"landmark-banner-is-top-level\",\n /**\n * - Ensure the complementary landmark or aside is at top level\n * - Aside should not be contained in another landmark ([url](https://dequeuniversity.com/rules/axe/4.10/landmark-complementary-is-top-level?application=axeAPI))\n */\n landmarkComplementaryIsTopLevel: \"landmark-complementary-is-top-level\",\n /**\n * - Ensure the contentinfo landmark is at top level\n * - Contentinfo landmark should not be contained in another landmark ([url](https://dequeuniversity.com/rules/axe/4.10/landmark-contentinfo-is-top-level?application=axeAPI))\n */\n landmarkContentinfoIsTopLevel: \"landmark-contentinfo-is-top-level\",\n /**\n * - Ensure the main landmark is at top level\n * - Main landmark should not be contained in another landmark ([url](https://dequeuniversity.com/rules/axe/4.10/landmark-main-is-top-level?application=axeAPI))\n */\n landmarkMainIsTopLevel: \"landmark-main-is-top-level\",\n /**\n * - Ensure the document has at most one banner landmark\n * - Document should not have more than one banner landmark ([url](https://dequeuniversity.com/rules/axe/4.10/landmark-no-duplicate-banner?application=axeAPI))\n */\n landmarkNoDuplicateBanner: \"landmark-no-duplicate-banner\",\n /**\n * - Ensure the document has at most one contentinfo landmark\n * - Document should not have more than one contentinfo landmark ([url](https://dequeuniversity.com/rules/axe/4.10/landmark-no-duplicate-contentinfo?application=axeAPI))\n */\n landmarkNoDuplicateContentinfo: \"landmark-no-duplicate-contentinfo\",\n /**\n * - Ensure the document has at most one main landmark\n * - Document should not have more than one main landmark ([url](https://dequeuniversity.com/rules/axe/4.10/landmark-no-duplicate-main?application=axeAPI))\n */\n landmarkNoDuplicateMain: \"landmark-no-duplicate-main\",\n /**\n * - Ensure the document has a main landmark\n * - Document should have one main landmark ([url](https://dequeuniversity.com/rules/axe/4.10/landmark-one-main?application=axeAPI))\n */\n landmarkOneMain: \"landmark-one-main\",\n /**\n * - Ensure landmarks are unique\n * - Landmarks should have a unique role or role/label/title (i.e. accessible name) combination ([url](https://dequeuniversity.com/rules/axe/4.10/landmark-unique?application=axeAPI))\n */\n landmarkUnique: \"landmark-unique\",\n /**\n * - Ensure bold, italic text and font-size is not used to style `<p>` elements as a heading\n * - Styled `<p>` elements must not be used as headings ([url](https://dequeuniversity.com/rules/axe/4.10/p-as-heading?application=axeAPI))\n */\n pAsHeading: \"p-as-heading\",\n /**\n * - Ensure that the page, or at least one of its frames contains a level-one heading\n * - Page should contain a level-one heading ([url](https://dequeuniversity.com/rules/axe/4.10/page-has-heading-one?application=axeAPI))\n */\n pageHasHeadingOne: \"page-has-heading-one\",\n} as const;\n\nexport const language = {\n /**\n * - Ensure every HTML document has a lang attribute\n * - `<html>` element must have a lang attribute ([url](https://dequeuniversity.com/rules/axe/4.10/html-has-lang?application=axeAPI))\n */\n htmlHasLang: \"html-has-lang\",\n /**\n * - Ensure the lang attribute of the `<html>` element has a valid value\n * - `<html>` element must have a valid value for the lang attribute ([url](https://dequeuniversity.com/rules/axe/4.10/html-lang-valid?application=axeAPI))\n */\n htmlLangValid: \"html-lang-valid\",\n /**\n * - Ensure that HTML elements with both valid lang and xml:lang attributes agree on the base language of the page\n * - HTML elements with lang and xml:lang must have the same base language ([url](https://dequeuniversity.com/rules/axe/4.10/html-xml-lang-mismatch?application=axeAPI))\n */\n htmlXmlLangMismatch: \"html-xml-lang-mismatch\",\n /**\n * - Ensure lang attributes have valid values\n * - lang attribute must have a valid value ([url](https://dequeuniversity.com/rules/axe/4.10/valid-lang?application=axeAPI))\n */\n validLang: \"valid-lang\",\n} as const;\n\nexport const sensoryAndVisualCues = {\n /**\n * - Ensure `<meta name=\"viewport\">` can scale a significant amount\n * - Users should be able to zoom and scale the text up to 500% ([url](https://dequeuniversity.com/rules/axe/4.10/meta-viewport-large?application=axeAPI))\n */\n metaViewportLarge: \"meta-viewport-large\",\n /**\n * - Ensure `<meta name=\"viewport\">` does not disable text scaling and zooming\n * - Zooming and scaling must not be disabled ([url](https://dequeuniversity.com/rules/axe/4.10/meta-viewport?application=axeAPI))\n */\n metaViewport: \"meta-viewport\",\n /**\n * - Ensure touch targets have sufficient size and space\n * - All touch targets must be 24px large, or leave sufficient space ([url](https://dequeuniversity.com/rules/axe/4.10/target-size?application=axeAPI))\n */\n targetSize: \"target-size\",\n} as const;\n\nexport const tables = {\n /**\n * - Ensure the scope attribute is used correctly on tables\n * - scope attribute should be used correctly ([url](https://dequeuniversity.com/rules/axe/4.10/scope-attr-valid?application=axeAPI))\n */\n scopeAttrValid: \"scope-attr-valid\",\n /**\n * - Ensure the `<caption>` element does not contain the same text as the summary attribute\n * - Tables should not have the same summary and caption ([url](https://dequeuniversity.com/rules/axe/4.10/table-duplicate-name?application=axeAPI))\n */\n tableDuplicateName: \"table-duplicate-name\",\n /**\n * - Ensure that tables with a caption use the `<caption>` element.\n * - Data or header cells must not be used to give caption to a data table. ([url](https://dequeuniversity.com/rules/axe/4.10/table-fake-caption?application=axeAPI))\n */\n tableFakeCaption: \"table-fake-caption\",\n /**\n * - Ensure that each non-empty data cell in a `<table>` larger than 3 by 3 has one or more table headers\n * - Non-empty `<td>` elements in larger `<table>` must have an associated table header ([url](https://dequeuniversity.com/rules/axe/4.10/td-has-header?application=axeAPI))\n */\n tdHasHeader: \"td-has-header\",\n /**\n * - Ensure that each cell in a table that uses the headers attribute refers only to other cells in that table\n * - Table cells that use the headers attribute must only refer to cells in the same table ([url](https://dequeuniversity.com/rules/axe/4.10/td-headers-attr?application=axeAPI))\n */\n tdHeadersAttr: \"td-headers-attr\",\n /**\n * - Ensure that `<th>` elements and elements with role=columnheader/rowheader have data cells they describe\n * - Table headers in a data table must refer to data cells ([url](https://dequeuniversity.com/rules/axe/4.10/th-has-data-cells?application=axeAPI))\n */\n thHasDataCells: \"th-has-data-cells\",\n} as const;\n", "import * as r from \"./axe-rules\";\n\ntype UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (\n k: infer I,\n) => void\n ? I\n : never;\ntype AllRules = UnionToIntersection<(typeof r)[keyof typeof r]>;\ntype RuleId = AllRules[keyof AllRules];\n\nexport interface Exceptions {\n /**\n * Exclude if the listed attributes have a dynamic value\n */\n dynamicAttrs?: string[];\n /**\n * Exclude if the tag has a spread attribute\n */\n attrSpread?: boolean;\n /**\n * Exclude if the body content can't be determined\n */\n unknownBody?: boolean;\n}\n\ntype Blacklist =\n // Explicitly blacklisted for Marko Language Server\n | typeof r.structure.frameTested\n // Requires a parent component to validate; we can potentially add support with child component analysis\n | typeof r.aria.ariaRequiredParent\n | typeof r.forms.label\n | typeof r.forms.labelTitleOnly\n | typeof r.forms.selectName\n | typeof r.keyboard.bypass\n | typeof r.keyboard.nestedInteractive\n | typeof r.keyboard.region\n | typeof r.semantics.headingOrder\n | typeof r.semantics.landmarkBannerIsTopLevel\n | typeof r.semantics.landmarkComplementaryIsTopLevel\n | typeof r.semantics.landmarkContentinfoIsTopLevel\n | typeof r.semantics.landmarkMainIsTopLevel\n | typeof r.semantics.landmarkOneMain\n | typeof r.semantics.pageHasHeadingOne\n | typeof r.structure.dlitem\n | typeof r.structure.listitem\n | typeof r.tables.tdHeadersAttr\n // Seemingly broken in axe-core or JSDom\n | typeof r.aria.ariaRoledescription\n | typeof r.aria.ariaValidAttr\n | typeof r.color.colorContrast\n | typeof r.color.colorContrastEnhanced\n | typeof r.color.linkInTextBlock\n | typeof r.keyboard.scrollableRegionFocusable\n | typeof r.parsing.duplicateId\n | typeof r.parsing.duplicateIdActive\n | typeof r.parsing.duplicateIdAria\n | typeof r.sensoryAndVisualCues.targetSize\n | typeof r.structure.avoidInlineSpacing\n // handled by TypeScript\n | typeof r.aria.ariaValidAttrValue\n | typeof r.aria.ariaAllowedAttr\n // blacklisted as the rules are in axe-core experimental phase\n | typeof r.structure.cssOrientationLock\n | typeof r.keyboard.focusOrderSemantics\n | typeof r.structure.hiddenContent\n | typeof r.semantics.labelContentNameMismatch\n | typeof r.semantics.pAsHeading\n | typeof r.tables.tableFakeCaption\n | typeof r.tables.tdHasHeader;\n\ntype Whitelist = Exclude<RuleId, Blacklist>;\n\n// utility variables so the objects don't all need `: true` everywhere\nconst unknownBody = true;\nconst attrSpread = true;\n\nexport const ruleExceptions: { [id in Whitelist]: Exceptions } = {\n [r.aria.ariaAllowedRole]: { dynamicAttrs: [\"role\"] },\n [r.aria.ariaBrailleEquivalent]: { attrSpread },\n [r.aria.ariaCommandName]: { unknownBody, attrSpread },\n [r.aria.ariaConditionalAttr]: { unknownBody, attrSpread },\n [r.aria.ariaDeprecatedRole]: { dynamicAttrs: [\"role\"] },\n [r.aria.ariaDialogName]: { unknownBody, attrSpread },\n [r.aria.ariaHiddenBody]: {},\n [r.aria.ariaInputFieldName]: { unknownBody, attrSpread },\n [r.aria.ariaMeterName]: { unknownBody, attrSpread },\n [r.aria.ariaProgressbarName]: { unknownBody, attrSpread },\n [r.aria.ariaProhibitedAttr]: { dynamicAttrs: [\"role\"] },\n [r.aria.ariaRequiredAttr]: { attrSpread },\n [r.aria.ariaRequiredChildren]: { unknownBody },\n [r.aria.ariaRoles]: { dynamicAttrs: [\"role\"] },\n [r.aria.ariaText]: { unknownBody },\n [r.aria.ariaToggleFieldName]: { unknownBody, attrSpread },\n [r.aria.ariaTooltipName]: { unknownBody, attrSpread },\n [r.aria.ariaTreeitemName]: { unknownBody, attrSpread },\n [r.aria.presentationRoleConflict]: {},\n [r.forms.autocompleteValid]: {},\n [r.forms.formFieldMultipleLabels]: {},\n [r.keyboard.accesskeys]: {},\n [r.keyboard.frameFocusableContent]: { unknownBody },\n [r.keyboard.skipLink]: { unknownBody },\n [r.keyboard.tabindex]: {},\n [r.language.htmlHasLang]: { attrSpread },\n [r.language.htmlLangValid]: { dynamicAttrs: [\"lang\"] },\n [r.language.htmlXmlLangMismatch]: {},\n [r.language.validLang]: { dynamicAttrs: [\"lang\"] },\n [r.nameRoleValue.ariaHiddenFocus]: { unknownBody },\n [r.nameRoleValue.buttonName]: { unknownBody, attrSpread },\n [r.nameRoleValue.emptyHeading]: { unknownBody, attrSpread },\n [r.nameRoleValue.emptyTableHeader]: { unknownBody, attrSpread },\n [r.nameRoleValue.inputButtonName]: {\n unknownBody,\n attrSpread,\n },\n [r.nameRoleValue.linkName]: { unknownBody, attrSpread },\n [r.nameRoleValue.summaryName]: { unknownBody, attrSpread },\n [r.parsing.marquee]: {},\n [r.semantics.identicalLinksSamePurpose]: {},\n [r.semantics.landmarkNoDuplicateBanner]: {},\n [r.semantics.landmarkNoDuplicateContentinfo]: {},\n [r.semantics.landmarkNoDuplicateMain]: {},\n [r.semantics.landmarkUnique]: {},\n [r.sensoryAndVisualCues.metaViewport]: {},\n [r.sensoryAndVisualCues.metaViewportLarge]: {},\n [r.structure.definitionList]: { unknownBody },\n [r.structure.list]: { unknownBody },\n [r.tables.scopeAttrValid]: {},\n [r.tables.tableDuplicateName]: { unknownBody },\n [r.tables.thHasDataCells]: { unknownBody },\n [r.textAlternatives.areaAlt]: { attrSpread },\n [r.textAlternatives.documentTitle]: { unknownBody },\n [r.textAlternatives.frameTitle]: { unknownBody },\n [r.textAlternatives.frameTitleUnique]: { unknownBody },\n [r.textAlternatives.imageAlt]: { attrSpread },\n [r.textAlternatives.imageRedundantAlt]: { attrSpread },\n [r.textAlternatives.inputImageAlt]: { attrSpread },\n [r.textAlternatives.objectAlt]: { attrSpread },\n [r.textAlternatives.roleImgAlt]: { attrSpread },\n [r.textAlternatives.serverSideImageMap]: {},\n [r.textAlternatives.svgImgAlt]: { attrSpread },\n [r.textAlternatives.videoCaption]: { unknownBody },\n [r.timeAndMedia.audioCaption]: { unknownBody },\n [r.timeAndMedia.blink]: {},\n [r.timeAndMedia.metaRefresh]: {},\n [r.timeAndMedia.metaRefreshNoExceptions]: {},\n [r.timeAndMedia.noAutoplayAudio]: {},\n};\n", "import { NodeType } from \"@marko/language-tools\";\nimport type { CompletionItem, CompletionParams } from \"vscode-languageserver\";\n\nimport { getMarkoFile, MarkoFile } from \"../../../utils/file\";\nimport type { Plugin, Result } from \"../../types\";\nimport { AttrName } from \"./AttrName\";\nimport { AttrValue } from \"./AttrValue\";\nimport { Import } from \"./Import\";\nimport { OpenTagName } from \"./OpenTagName\";\nimport { Tag } from \"./Tag\";\n\nexport type CompletionResult = Result<CompletionItem[]>;\nexport interface CompletionMeta<N = unknown> {\n file: MarkoFile;\n params: CompletionParams;\n offset: number;\n node: N;\n}\n\nconst handlers: Record<\n string,\n (data: CompletionMeta<any>) => CompletionResult\n> = {\n Tag,\n OpenTagName,\n AttrName,\n AttrValue,\n Import,\n Static: Import,\n};\n\nexport const doComplete: Plugin[\"doComplete\"] = async (doc, params) => {\n const file = getMarkoFile(doc);\n const offset = doc.offsetAt(params.position);\n const node = file.parsed.nodeAt(offset);\n return {\n items:\n (await handlers[NodeType[node.type]]?.({\n file,\n params,\n offset,\n node,\n })) || [],\n isIncomplete: true,\n };\n};\n", "import type { Node } from \"@marko/language-tools\";\nimport {\n type CompletionItem,\n CompletionItemKind,\n InsertTextFormat,\n type MarkupContent,\n MarkupKind,\n TextEdit,\n} from \"vscode-languageserver\";\n\nimport type { CompletionMeta, CompletionResult } from \".\";\n\nexport function AttrName({\n offset,\n node,\n file: { parsed, lookup },\n}: CompletionMeta<Node.AttrName>): CompletionResult {\n let name = parsed.read(node);\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\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, parent) => {\n if (\n attr.deprecated ||\n nestedTagAttrs[attr.name] ||\n attr.name === \"*\" ||\n attr.type === \"never\" ||\n (attr.name[0] === \"_\" &&\n isExternalModule(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 // TODO: We should use the following, but vscode has a regression with multi choice snippets form the language server.\n // snippet += `=\"\\${1|${attr.enum.join()}|}\"$0`;\n snippet += `=\"$1\"$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 if (!attr.required) {\n label += \"?\";\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\nfunction isExternalModule(file: string) {\n return (\n /[/\\\\]node_modules[/\\\\]/.test(file) || !/^(?:[A-Za-z]:\\\\|[./\\\\])/.test(file)\n );\n}\n", "import type { Node } from \"@marko/language-tools\";\nimport path from \"path\";\nimport {\n CompletionItem,\n CompletionItemKind,\n TextEdit,\n} from \"vscode-languageserver\";\n\nimport fileSystem, { FileType } from \"../../../utils/file-system\";\nimport resolveUrl from \"../../../utils/resolve-url\";\nimport isDocumentLinkAttr from \"../util/is-document-link-attr\";\nimport type { CompletionMeta } from \".\";\n\nexport async function AttrValue({\n offset,\n node,\n file: { uri, parsed, code },\n}: CompletionMeta<Node.AttrValue>): Promise<void | CompletionItem[]> {\n const attr = node.parent;\n if (isDocumentLinkAttr(code, attr.parent, attr)) {\n const start = node.value.start + 1;\n if (code[start] !== \".\") return; // only resolve relative paths\n\n const end = node.value.end - 1;\n const relativeOffset = offset - start;\n const rawValue = parsed.read({\n start,\n end,\n });\n\n const segmentStart = rawValue.lastIndexOf(\"/\", relativeOffset);\n if (segmentStart === -1) return; // only resolve after a slash.\n\n const req = rawValue.slice(0, segmentStart);\n const resolved = resolveUrl(req, uri);\n\n if (resolved) {\n const result: CompletionItem[] = [];\n const curFile = req === \".\" ? path.basename(uri) : undefined;\n const replaceRange = parsed.locationAt({\n start: start + segmentStart + 1,\n end: start + rawValue.length,\n });\n\n for (const [entry, type] of await fileSystem.readDirectory(resolved)) {\n if (entry[0] !== \".\" && entry !== curFile) {\n result.push(\n type === FileType.Directory\n ? {\n label: `${entry}/`,\n kind: CompletionItemKind.Folder,\n textEdit: TextEdit.replace(replaceRange, `${entry}/`),\n command: {\n title: \"Suggest\",\n command: \"editor.action.triggerSuggest\",\n },\n }\n : {\n label: entry,\n kind: CompletionItemKind.File,\n textEdit: TextEdit.replace(replaceRange, entry),\n },\n );\n }\n }\n\n return result;\n }\n }\n}\n", "import fs from \"fs/promises\";\nimport { fileURLToPath } from \"url\";\nimport { type FileStat, FileType } from \"vscode-css-languageservice\";\n\nexport { FileStat, FileType };\nexport default {\n stat,\n readDirectory,\n};\n\nasync function stat(uri: string): Promise<FileStat> {\n let type = FileType.Unknown;\n let ctime = -1;\n let mtime = -1;\n let size = -1;\n\n try {\n const stat = await fs.stat(fileURLToPath(uri));\n if (stat.isDirectory()) type = FileType.Directory;\n else if (stat.isFile()) type = FileType.File;\n ctime = stat.ctimeMs;\n mtime = stat.mtimeMs;\n size = stat.size;\n } catch {\n // ignore\n }\n\n return {\n type,\n ctime,\n mtime,\n size,\n };\n}\n\nasync function readDirectory(uri: string): Promise<[string, FileType][]> {\n const result: [string, FileType][] = [];\n\n try {\n for await (const entry of await fs.opendir(fileURLToPath(uri))) {\n if (entry.isFile()) {\n result.push([entry.name, FileType.File]);\n } else if (entry.isDirectory()) {\n result.push([entry.name, FileType.Directory]);\n }\n }\n } catch {\n // ignore\n }\n return result;\n}\n", "export default function resolveUrl(to: string, base: string) {\n try {\n const url = new URL(to, base);\n if (url.protocol === \"file:\") return url.toString();\n } catch {\n return undefined;\n }\n}\n", "import { type Node, NodeType } from \"@marko/language-tools\";\n\nconst linkedAttrs: Map<string, Set<string>> = new Map([\n [\n \"src\",\n new Set([\n \"audio\",\n \"embed\",\n \"iframe\",\n \"img\",\n \"input\",\n \"script\",\n \"html-script\",\n \"source\",\n \"track\",\n \"video\",\n ]),\n ],\n [\"href\", new Set([\"a\", \"area\", \"link\"])],\n [\"data\", new Set([\"object\"])],\n [\"poster\", new Set([\"video\"])],\n]);\n\nexport default function isDocumentLinkAttr(\n code: string,\n tag: Node.ParentTag,\n attr: Node.AttrNode,\n): attr is Node.AttrNamed & { value: Node.AttrValue } {\n return (\n (tag.nameText &&\n attr.type === NodeType.AttrNamed &&\n attr.value?.type === NodeType.AttrValue &&\n /^['\"]$/.test(code[attr.value.value.start]) &&\n linkedAttrs\n .get(code.slice(attr.name.start, attr.name.end))\n ?.has(tag.nameText)) ||\n false\n );\n}\n", "import { type Node, NodeType } from \"@marko/language-tools\";\nimport { CompletionItem, TextEdit } from \"vscode-languageserver\";\n\nimport getTagNameCompletion from \"../util/get-tag-name-completion\";\nimport type { CompletionMeta, CompletionResult } from \".\";\n\nconst staticImportReg = /^\\s*(?:static|client|server) import\\b/;\nconst importTagReg = /(['\"])<((?:[^'\"\\\\>]|\\\\.)*)>?\\1/;\n\nexport function Import({\n node,\n file: { parsed, filename, lookup },\n}: CompletionMeta<Node.Import | Node.Static>): CompletionResult {\n const value = parsed.read(node);\n if (node.type === NodeType.Static && !staticImportReg.test(value)) {\n // Checks for `static import`, `client import` and `server import`.\n return;\n }\n\n const match = importTagReg.exec(value);\n if (match) {\n const [{ length }] = match;\n const fromStart = node.start + match.index;\n const range = parsed.locationAt({\n start: fromStart + 1,\n end: fromStart + length - 1,\n });\n\n const result: CompletionItem[] = [];\n\n for (const tag of lookup.getTagsSorted()) {\n if (\n (tag.template || tag.renderer) &&\n !(\n tag.html ||\n tag.parser ||\n tag.translator ||\n tag.isNestedTag ||\n tag.name === \"*\" ||\n tag.parseOptions?.statement ||\n /^@?marko[/-]/.test(tag.taglibId) ||\n (tag.name[0] === \"_\" && /[\\\\/]node_modules[\\\\/]/.test(tag.filePath))\n )\n ) {\n const completion = getTagNameCompletion({\n tag,\n importer: filename,\n });\n\n completion.label = `<${completion.label}>`;\n completion.textEdit = TextEdit.replace(range, completion.label);\n result.push(completion);\n }\n }\n\n return result;\n }\n}\n", "import type { TagDefinition } from \"@marko/compiler/babel-utils\";\nimport path from \"path\";\nimport {\n type CompletionItem,\n CompletionItemKind,\n CompletionItemTag,\n InsertTextFormat,\n MarkupKind,\n type Range,\n TextEdit,\n} from \"vscode-languageserver\";\nimport { URI } from \"vscode-uri\";\n\nimport { isHTML } from \"./is-html\";\n\nconst deprecated = [CompletionItemTag.Deprecated] as CompletionItemTag[];\n\nexport default function getTagNameCompletion({\n tag,\n range,\n showAutoComplete,\n importer,\n}: {\n tag: TagDefinition;\n range?: Range;\n importer?: string;\n showAutoComplete?: true;\n}): CompletionItem {\n let label = tag.isNestedTag ? `@${tag.name}` : tag.name;\n const fileForTag = tag.template || tag.renderer || tag.filePath;\n const fileURIForTag = URI.file(fileForTag).toString();\n const nodeModuleMatch = /\\/node_modules\\/((?:@[^/]+\\/)?[^/]+)/.exec(\n fileForTag,\n );\n\n const nodeModuleName = nodeModuleMatch && nodeModuleMatch[1];\n const isCoreTag =\n /^@?marko[/-]/.test(tag.taglibId || tag.filePath) ||\n nodeModuleName === \"marko\";\n const html = isHTML(tag);\n const documentation = {\n kind: MarkupKind.Markdown,\n value: html\n ? `Built in [<${tag.name}>](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/${tag.name}) HTML tag.`\n : isCoreTag\n ? `Core Marko <${tag.name}> tag.`\n : nodeModuleName\n ? `Custom Marko tag discovered from the [\"${nodeModuleName}\"](${fileURIForTag}) npm package.`\n : `Custom Marko tag discovered from:\\n\\n[${\n importer ? path.relative(importer, fileForTag) : fileForTag\n }](${fileURIForTag})`,\n };\n\n if (tag.description) {\n documentation.value += `\\n\\n${tag.description}`;\n }\n\n const autocomplete = showAutoComplete ? tag.autocomplete?.[0] : undefined;\n\n if (autocomplete) {\n if (autocomplete.displayText) {\n label = autocomplete.displayText;\n }\n\n if (autocomplete.description) {\n documentation.value += `\\n\\n${autocomplete.description}`;\n }\n\n if (autocomplete.descriptionMoreURL) {\n documentation.value += `\\n\\n[More Info](${autocomplete.descriptionMoreURL})`;\n }\n }\n\n return {\n label,\n documentation,\n tags: tag.deprecated ? deprecated : undefined,\n insertTextFormat: autocomplete ? InsertTextFormat.Snippet : undefined,\n kind: html ? CompletionItemKind.Property : CompletionItemKind.Class,\n textEdit: range && TextEdit.replace(range, autocomplete?.snippet || label),\n };\n}\n", "import { TagDefinition } from \"@marko/compiler/babel-utils\";\n\nexport function isHTML(tag: TagDefinition | undefined) {\n return tag ? !(tag.types || tag.template || tag.renderer) && tag.html : false;\n}\n", "import { type Node, NodeType } from \"@marko/language-tools\";\nimport type { CompletionItem } from \"vscode-languageserver\";\n\nimport getTagNameCompletion from \"../util/get-tag-name-completion\";\nimport type { CompletionMeta, CompletionResult } from \".\";\n\nexport function OpenTagName({\n node,\n file: { parsed, filename, lookup },\n}: CompletionMeta<Node.OpenTagName>): CompletionResult {\n const tag = node.parent;\n const range = parsed.locationAt(node);\n const isAttrTag = tag.type === NodeType.AttrTag;\n const result: CompletionItem[] = [];\n\n if (isAttrTag) {\n const ownerTagDef =\n tag.owner && tag.owner.nameText && lookup.getTag(tag.owner.nameText);\n\n if (ownerTagDef) {\n const { nestedTags } = ownerTagDef;\n for (const key in nestedTags) {\n if (key !== \"*\") {\n const tag = nestedTags[key];\n result.push(\n getTagNameCompletion({\n tag,\n range,\n importer: filename,\n showAutoComplete: true,\n }),\n );\n }\n }\n }\n } else {\n const skipStatements = !(\n tag.concise && tag.parent.type === NodeType.Program\n );\n for (const tag of lookup.getTagsSorted()) {\n if (\n !(\n tag.name === \"*\" ||\n tag.isNestedTag ||\n (skipStatements && tag.parseOptions?.statement) ||\n (tag.name[0] === \"_\" &&\n /^@?marko[/-]|[\\\\/]node_modules[\\\\/]/.test(tag.filePath))\n )\n ) {\n const completion = getTagNameCompletion({\n tag,\n range,\n importer: filename,\n showAutoComplete: true,\n });\n completion.sortText = `0${completion.label}`; // Ensure higher priority than typescript.\n result.push(completion);\n }\n }\n }\n\n return result;\n}\n", "import { type Node, UNFINISHED } from \"@marko/language-tools\";\nimport {\n CompletionItemKind,\n InsertTextFormat,\n TextEdit,\n} from \"vscode-languageserver\";\n\nimport type { CompletionMeta, CompletionResult } from \".\";\n\nconst partialCloseTagReg = /<\\/(?:[^><]*>)?/iy;\n\n/**\n * Provide completion for the closing tag.\n */\nexport function Tag({\n node,\n offset,\n file: { parsed, code },\n}: CompletionMeta<Node.Tag>): CompletionResult {\n const isClosed = node.end !== UNFINISHED;\n if (isClosed || node.concise) return;\n\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 { NodeType } from \"@marko/language-tools\";\nimport type { DefinitionLink, DefinitionParams } from \"vscode-languageserver\";\n\nimport { getMarkoFile, MarkoFile } from \"../../../utils/file\";\nimport type { Plugin, Result } from \"../../types\";\nimport { AttrName } from \"./AttrName\";\nimport { OpenTagName } from \"./OpenTagName\";\n\nexport type DefinitionResult = Result<DefinitionLink[]>;\nexport interface DefinitionMeta<N = unknown> {\n file: MarkoFile;\n params: DefinitionParams;\n offset: number;\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 file = getMarkoFile(doc);\n const offset = doc.offsetAt(params.position);\n const node = file.parsed.nodeAt(offset);\n return (\n (await handlers[NodeType[node.type]]?.({\n file,\n params,\n offset,\n node,\n })) || []\n );\n};\n", "import { getLines, getLocation, type Node } from \"@marko/language-tools\";\nimport fs from \"fs\";\nimport { URI } from \"vscode-uri\";\n\nimport { START_LOCATION } from \"../../../utils/constants\";\nimport RegExpBuilder from \"../../../utils/regexp-builder\";\nimport type { DefinitionMeta, DefinitionResult } from \".\";\n\nexport function AttrName({\n node,\n file: { parsed, lookup },\n}: DefinitionMeta<Node.AttrName>): DefinitionResult {\n const tagName = node.parent.parent.nameText;\n const attrName = parsed.read(node);\n const tagDef = tagName ? lookup.getTag(tagName) : undefined;\n const attrDef = lookup.getAttribute(tagName || \"\", attrName);\n let range = START_LOCATION;\n\n if (!attrDef) {\n return;\n }\n\n const attrEntryFile = attrDef.filePath || tagDef?.filePath;\n if (!attrEntryFile) {\n return;\n }\n\n if (/\\.json$/.test(attrEntryFile)) {\n const tagDefSource = fs.readFileSync(attrEntryFile, \"utf-8\");\n const match = RegExpBuilder`/\"@${attrName}\"\\s*:\\s*[^\\r\\n,]+/g`.exec(\n tagDefSource,\n );\n\n if (match && match.index) {\n range = getLocation(\n getLines(tagDefSource),\n match.index,\n match.index + match[0].length,\n );\n }\n\n return [\n {\n targetUri: URI.file(attrEntryFile).toString(),\n targetRange: range,\n targetSelectionRange: range,\n originSelectionRange: parsed.locationAt(node),\n },\n ];\n }\n}\n", "import type { Location, Position } from \"htmljs-parser\";\n\nexport const START_POSITION: Position = {\n line: 0,\n character: 0,\n};\n\nexport const START_LOCATION: Location = {\n start: START_POSITION,\n end: START_POSITION,\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 type { TagDefinition } from \"@marko/compiler/babel-utils\";\nimport {\n getLines,\n getLocation,\n type Node,\n NodeType,\n} from \"@marko/language-tools\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { URI } from \"vscode-uri\";\n\nimport { START_LOCATION } from \"../../../utils/constants\";\nimport RegExpBuilder from \"../../../utils/regexp-builder\";\nimport type { DefinitionMeta, DefinitionResult } from \".\";\n\nexport function OpenTagName({\n node,\n file: { parsed, lookup },\n}: DefinitionMeta<Node.OpenTagName>): DefinitionResult {\n const tag = node.parent;\n let tagDef: TagDefinition | null | undefined;\n let range = START_LOCATION;\n\n if (tag.type === NodeType.AttrTag) {\n tagDef =\n tag.owner && tag.owner.nameText\n ? lookup.getTag(tag.owner.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 tagDefSource = fs.readFileSync(tagEntryFile, \"utf-8\");\n const match =\n RegExpBuilder`/\"(?:<${tag.nameText}>|${tag.nameText})\"\\s*:\\s*[^\\r\\n,]+/g`.exec(\n tagDefSource,\n );\n\n if (match && match.index) {\n range = getLocation(\n getLines(tagDefSource),\n match.index,\n match.index + match[0].length,\n );\n }\n }\n\n return [\n {\n targetUri: URI.file(tagEntryFile).toString(),\n targetRange: range,\n targetSelectionRange: range,\n originSelectionRange: parsed.locationAt(node),\n },\n ];\n}\n", "import { type Node, NodeType } from \"@marko/language-tools\";\nimport type { DocumentLink } from \"vscode-languageserver\";\n\nimport { MarkoFile, processDoc } from \"../../utils/file\";\nimport resolveUrl from \"../../utils/resolve-url\";\nimport type { Plugin } from \"../types\";\nimport isDocumentLinkAttr from \"./util/is-document-link-attr\";\n\nconst importTagReg = /(['\"])<((?:[^'\"\\\\>]|\\\\.)*)>?\\1/g;\n\nexport const findDocumentLinks: Plugin[\"findDocumentLinks\"] = async (doc) => {\n return processDoc(doc, extractDocumentLinks);\n};\n\n/**\n * Iterate over the Marko CST and extract all the file links in the document.\n */\nfunction extractDocumentLinks({\n uri,\n scheme,\n parsed,\n code,\n lookup,\n}: MarkoFile): DocumentLink[] {\n if (scheme !== \"file\") {\n return [];\n }\n\n const links: DocumentLink[] = [];\n const { program, read } = parsed;\n const visit = (node: Node.ChildNode) => {\n switch (node.type) {\n case NodeType.AttrTag:\n if (node.body) {\n for (const child of node.body) {\n visit(child);\n }\n }\n break;\n case NodeType.Tag:\n if (node.attrs && node.nameText) {\n for (const attr of node.attrs) {\n if (isDocumentLinkAttr(code, node, attr)) {\n const resolved = resolveUrl(\n read(attr.value.value).slice(1, -1),\n uri,\n );\n if (resolved) {\n links.push({\n range: parsed.locationAt(attr.value.value),\n target: resolveUrl(read(attr.value.value).slice(1, -1), uri),\n });\n }\n }\n }\n }\n if (node.body) {\n for (const child of node.body) {\n visit(child);\n }\n }\n\n break;\n }\n };\n\n for (const node of program.static) {\n // check for import statement (this currently only support the tag import shorthand).\n if (node.type === NodeType.Import) {\n importTagReg.lastIndex = 0;\n const value = parsed.read(node);\n const match = importTagReg.exec(value);\n if (match) {\n const [{ length }, , tagName] = match;\n const tagDef = lookup.getTag(tagName);\n const fileForTag = tagDef && (tagDef.template || tagDef.renderer);\n\n if (fileForTag) {\n links.push({\n range: parsed.locationAt({\n start: node.start + match.index,\n end: node.start + match.index + length,\n }),\n target: fileForTag,\n });\n }\n }\n }\n }\n\n for (const node of program.body) {\n visit(node);\n }\n\n return links;\n}\n", "import { type Node, NodeType } from \"@marko/language-tools\";\nimport { SymbolInformation, SymbolKind } from \"vscode-languageserver\";\n\nimport { MarkoFile, processDoc } from \"../../utils/file\";\nimport type { Plugin } from \"../types\";\nimport { isHTML } from \"./util/is-html\";\n\nexport const findDocumentSymbols: Plugin[\"findDocumentSymbols\"] = async (doc) =>\n processDoc(doc, extractDocumentSymbols);\n\n/**\n * Iterate over the Marko CST and extract all the symbols (mostly tags) in the document.\n */\nfunction extractDocumentSymbols({\n uri,\n scheme,\n parsed,\n lookup,\n}: MarkoFile): SymbolInformation[] {\n if (scheme !== \"file\") {\n return [];\n }\n\n const symbols: SymbolInformation[] = [];\n const { program } = parsed;\n const visit = (node: Node.ChildNode) => {\n switch (node.type) {\n case NodeType.Tag:\n case NodeType.AttrTag:\n symbols.push({\n name:\n (node.type === NodeType.AttrTag\n ? node.nameText?.slice(node.nameText.indexOf(\"@\"))\n : node.nameText) || \"<${...}>\",\n kind:\n (node.nameText &&\n isHTML(lookup.getTag(node.nameText)) &&\n SymbolKind.Property) ||\n SymbolKind.Class,\n location: {\n uri,\n range: parsed.locationAt(node),\n },\n });\n\n if (node.body) {\n for (const child of node.body) {\n visit(child);\n }\n }\n\n break;\n }\n };\n\n for (const item of program.body) {\n visit(item);\n }\n\n return symbols;\n}\n", "import { Project } from \"@marko/language-tools\";\nimport * as prettier from \"prettier\";\nimport * as markoPrettier from \"prettier-plugin-marko\";\nimport { CancellationToken, TextEdit } from \"vscode-languageserver\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\n\nimport { START_POSITION } from \"../../utils/constants\";\nimport { getFSDir, getFSPath } from \"../../utils/file\";\nimport { displayError } from \"../../utils/messages\";\nimport type { Plugin } from \"../types\";\n\nexport interface FormatOptions {\n tabSize: number;\n insertSpaces: boolean;\n mode?: \"concise\" | \"html\";\n}\n\nexport async function formatDocument(\n doc: TextDocument,\n formatOptions: FormatOptions,\n cancel?: CancellationToken,\n) {\n try {\n const dir = getFSDir(doc);\n const filepath = getFSPath(doc);\n const text = doc.getText();\n const options: prettier.Options = {\n parser: \"marko\",\n filepath,\n plugins: [markoPrettier],\n tabWidth: formatOptions.tabSize,\n useTabs: formatOptions.insertSpaces === false,\n markoSyntax: formatOptions.mode ?? \"auto\",\n ...(filepath\n ? await prettier\n .resolveConfig(filepath, {\n editorconfig: true,\n })\n .catch(() => null)\n : null),\n };\n\n markoPrettier.setCompiler(Project.getCompiler(dir), Project.getConfig(dir));\n\n if (cancel?.isCancellationRequested) return;\n\n // TODO: format selection\n return [\n TextEdit.replace(\n {\n start: START_POSITION,\n end: doc.positionAt(text.length),\n },\n await prettier.format(text, options),\n ),\n ];\n } catch (e) {\n displayError(e);\n }\n}\n\nexport const format: Plugin[\"format\"] = async (doc, params, cancel) => {\n return formatDocument(doc, params.options, cancel);\n};\n", "import { inspect } from \"util\";\nimport type { Connection } from \"vscode-languageserver\";\n\nlet connection!: Connection;\nconst previousMessagesByType = new Map<string, string[]>();\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\n const previousMessages = previousMessagesByType.get(type);\n if (previousMessages) {\n if (previousMessages.includes(msg)) return;\n\n previousMessages.push(msg);\n\n // Only keep the last 3 messages.\n if (previousMessages.length > 3) {\n previousMessages.unshift();\n }\n } else {\n previousMessagesByType.set(type, [msg]);\n }\n\n setImmediate(() => connection.sendNotification(type, msg));\n}\n", "import { NodeType } from \"@marko/language-tools\";\nimport type { Hover, HoverParams } from \"vscode-languageserver\";\n\nimport { getMarkoFile, MarkoFile } from \"../../../utils/file\";\nimport type { Plugin, Result } from \"../../types\";\nimport { OpenTagName } from \"./OpenTagName\";\n\nexport type HoverResult = Result<Hover>;\nexport interface HoverMeta<N = unknown> {\n file: MarkoFile;\n params: HoverParams;\n offset: number;\n node: N;\n}\n\nconst handlers: Record<string, (data: HoverMeta<any>) => HoverResult> = {\n OpenTagName,\n};\n\nexport const doHover: Plugin[\"doHover\"] = async (doc, params) => {\n const file = getMarkoFile(doc);\n const offset = doc.offsetAt(params.position);\n const node = file.parsed.nodeAt(offset);\n return await handlers[NodeType[node.type]]?.({\n file,\n params,\n offset,\n node,\n });\n};\n", "import type { Node } from \"@marko/language-tools\";\n\nimport { START_LOCATION } from \"../../../utils/constants\";\nimport getTagNameCompletion from \"../util/get-tag-name-completion\";\nimport type { HoverMeta, HoverResult } from \".\";\n\nexport function OpenTagName({\n node,\n file: { parsed, filename, lookup },\n}: HoverMeta<Node.OpenTagName>): HoverResult {\n const tag = node.parent;\n const range = parsed.locationAt(node);\n const tagDef = tag.nameText && lookup.getTag(tag.nameText);\n\n if (tagDef) {\n const completion = getTagNameCompletion({\n tag: tagDef,\n range: START_LOCATION,\n importer: filename,\n });\n\n if (completion.documentation) {\n return {\n range,\n contents: completion.documentation,\n };\n }\n }\n}\n", "import type { Config } from \"@marko/compiler\";\nimport { DiagnosticType } from \"@marko/compiler/babel-utils\";\nimport { Project } from \"@marko/language-tools\";\nimport path from \"path\";\nimport { Diagnostic, DiagnosticSeverity } from \"vscode-languageserver\";\n\nimport { getFSPath } from \"../../utils/file\";\nimport type { Plugin } from \"../types\";\n\nconst markoErrorRegExp =\n /^(.+?)\\.marko(?:\\((\\d+)(?:\\s*,\\s*(\\d+))?\\))?: (.*)$/gm;\nconst compilerConfig: Config = {\n code: false,\n output: \"migrate\",\n sourceMaps: false,\n errorRecovery: true,\n babelConfig: {\n babelrc: false,\n configFile: false,\n browserslistConfigFile: false,\n caller: {\n name: \"@marko/language-server\",\n supportsStaticESM: true,\n supportsDynamicImport: true,\n supportsTopLevelAwait: true,\n supportsExportNamespaceFrom: true,\n },\n },\n};\n\nexport const doValidate: Plugin[\"doValidate\"] = (doc) => {\n const filename = getFSPath(doc);\n const diagnostics: Diagnostic[] = [];\n\n try {\n const { meta } = Project.getCompiler(\n filename && path.dirname(filename),\n ).compileSync(doc.getText(), filename || \"untitled.marko\", compilerConfig);\n\n if (meta.diagnostics) {\n for (const diag of meta.diagnostics) {\n const range = diag.loc\n ? {\n start: {\n line: diag.loc.start.line - 1,\n character: diag.loc.start.column,\n },\n end: {\n line: diag.loc.end.line - 1,\n character: diag.loc.end.column,\n },\n }\n : {\n start: { line: 0, character: 0 },\n end: { line: 0, character: 0 },\n };\n\n let severity: DiagnosticSeverity | undefined;\n\n switch (diag.type) {\n case DiagnosticType.Warning:\n case DiagnosticType.Deprecation:\n severity = DiagnosticSeverity.Warning;\n break;\n case DiagnosticType.Suggestion:\n severity = DiagnosticSeverity.Hint;\n break;\n default:\n severity = DiagnosticSeverity.Error;\n break;\n }\n\n diagnostics.push({\n range,\n source: \"marko\",\n code: undefined,\n tags: undefined,\n severity,\n message: diag.label,\n });\n }\n }\n } catch (err) {\n addDiagnosticsForError(err, diagnostics);\n }\n\n return diagnostics;\n};\n\nfunction addDiagnosticsForError(err: unknown, diagnostics: Diagnostic[]) {\n if (!isError(err)) {\n diagnostics.push({\n range: {\n start: { line: 0, character: 0 },\n end: { line: 0, character: 0 },\n },\n source: \"marko\",\n code: undefined,\n tags: undefined,\n severity: DiagnosticSeverity.Error,\n message: String(err),\n });\n } else if (isAggregateError(err)) {\n for (const nestedError of err.errors) {\n addDiagnosticsForError(nestedError, diagnostics);\n }\n } else if (isErrorWithLoc(err)) {\n const message = err.label || err.message || err.stack;\n if (!message) return;\n const { loc } = err;\n\n diagnostics.push({\n range: {\n start: {\n line: loc.start.line - 1,\n character: loc.start.column,\n },\n end: {\n line: loc.end.line - 1,\n character: loc.end.column,\n },\n },\n source: \"marko\",\n code: undefined,\n tags: undefined,\n severity: DiagnosticSeverity.Error,\n message,\n });\n } else {\n let match: RegExpExecArray | null;\n while ((match = markoErrorRegExp.exec((err as Error).message))) {\n const [, , rawLine, rawCol, message] = match;\n const pos = {\n line: (parseInt(rawLine, 10) || 1) - 1,\n character: (parseInt(rawCol, 10) || 1) - 1,\n };\n diagnostics.push({\n range: { start: pos, end: pos },\n source: \"marko\",\n code: undefined,\n tags: undefined,\n severity: DiagnosticSeverity.Error,\n message,\n });\n }\n }\n}\n\nfunction isError(err: unknown): err is Error {\n return (\n err != null &&\n typeof err === \"object\" &&\n typeof (err as { message: unknown }).message === \"string\"\n );\n}\n\nfunction isAggregateError(err: unknown): err is AggregateError {\n return Array.isArray((err as { errors: unknown })?.errors);\n}\n\nfunction isErrorWithLoc(err: unknown): err is Error & {\n label?: string;\n loc: {\n start: { line: number; column: number };\n end: { line: number; column: number };\n };\n} {\n const loc = (err as undefined | { loc: unknown })?.loc;\n if (typeof loc !== \"object\") return false;\n return (\n loc !== null &&\n typeof loc === \"object\" &&\n typeof (loc as { start: unknown }).start === \"object\" &&\n typeof (loc as { end: unknown }).end === \"object\" &&\n typeof (loc as { start: { line: unknown } }).start.line === \"number\" &&\n typeof (loc as { start: { column: unknown } }).start.column === \"number\" &&\n typeof (loc as { end: { line: unknown } }).end.line === \"number\" &&\n typeof (loc as { end: { column: unknown } }).end.column === \"number\"\n );\n}\n", "import * as documents from \"../../utils/text-documents\";\nimport type { Plugin } from \"../types\";\nimport { doComplete } from \"./complete\";\nimport { findDefinition } from \"./definition\";\nimport { findDocumentLinks } from \"./document-links\";\nimport { findDocumentSymbols } from \"./document-symbols\";\nimport { format, formatDocument, FormatOptions } from \"./format\";\nimport { doHover } from \"./hover\";\nimport { doValidate } from \"./validate\";\n\nexport default {\n doComplete,\n doValidate,\n doHover,\n findDefinition,\n findDocumentLinks,\n findDocumentSymbols,\n format,\n commands: {\n \"$/formatWithMode\": async ({\n doc: docURI,\n options,\n }: {\n doc: string;\n options: FormatOptions;\n }) => {\n const doc = documents.get(docURI)!;\n const formatted = await formatDocument(doc, options);\n return formatted;\n },\n },\n} as Partial<Plugin>;\n", "import {\n type Extracted,\n extractScript,\n type Location,\n Node,\n NodeType,\n type Parsed,\n Project,\n ScriptLang,\n} from \"@marko/language-tools\";\nimport path from \"path\";\nimport * as prettier from \"prettier\";\nimport { relativeImportPath } from \"relative-import-path\";\nimport ts from \"typescript/lib/tsserverlibrary\";\nimport {\n CompletionItem,\n CompletionItemKind,\n CompletionItemTag,\n DefinitionLink,\n Diagnostic,\n DiagnosticSeverity,\n DiagnosticTag,\n InsertTextFormat,\n type Range,\n TextEdit,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport { URI } from \"vscode-uri\";\n\nimport { ExtractedSnapshot, patch } from \"../../ts-plugin/host\";\nimport { START_LOCATION } from \"../../utils/constants\";\nimport { getFSPath, getMarkoFile, processDoc } from \"../../utils/file\";\nimport * as documents from \"../../utils/text-documents\";\nimport * as workspace from \"../../utils/workspace\";\nimport type { Plugin } from \"../types\";\nimport printJSDocTag from \"./util/print-jsdoc-tag\";\n\n// Filter out some syntax errors from the TS compiler which will be surfaced from the marko compiler.\nconst IGNORE_DIAG_REG =\n /^(?:(?:Expression|Identifier|['\"][^\\w]['\"]) expected|Invalid character)\\b/i;\n\ninterface TSProject {\n rootDir: string;\n host: ts.LanguageServiceHost;\n service: ts.LanguageService;\n markoScriptLang: ScriptLang;\n}\n\nconst extractCache = new Map<string, ExtractedSnapshot>();\nconst snapshotCache = new Map<string, ts.IScriptSnapshot>();\nconst insertModuleStatementLocCache = new WeakMap<Extracted, Location>();\nconst markoFileReg = /\\.marko$/;\nconst tsTriggerChars = new Set([\".\", '\"', \"'\", \"`\", \"/\", \"@\", \"<\", \"#\", \" \"]);\nconst optionalModifierReg = /\\boptional\\b/;\nconst deprecatedModifierReg = /\\bdeprecated\\b/;\nconst colorModifierReg = /\\bcolor\\b/;\nconst localInternalsPrefix = \"__marko_internal_\";\nconst requiredTSCompilerOptions: ts.CompilerOptions = {\n module: ts.ModuleKind.ESNext,\n moduleResolution: ts.ModuleResolutionKind.Bundler,\n noEmit: true,\n allowJs: true,\n composite: false,\n declaration: false,\n skipLibCheck: true,\n importHelpers: false,\n isolatedModules: true,\n resolveJsonModule: true,\n skipDefaultLibCheck: true,\n emitDeclarationOnly: false,\n allowNonTsExtensions: true,\n emitDecoratorMetadata: false,\n};\nconst defaultTSConfig = {\n include: [],\n compilerOptions: {\n lib: [\"dom\", \"node\", \"esnext\"],\n } satisfies ts.CompilerOptions,\n};\nconst extraTSCompilerExtensions: readonly ts.FileExtensionInfo[] = [\n {\n extension: \".marko\",\n isMixedContent: false,\n scriptKind: ts.ScriptKind.Deferred,\n },\n];\n\nconst ScriptService: Partial<Plugin> = {\n commands: {\n \"$/showScriptOutput\": async (uri: string) => {\n const doc = documents.get(uri);\n if (doc?.languageId !== \"marko\") return;\n const filename = getFSPath(doc);\n if (!filename) return;\n const tsProject = getTSProject(filename);\n const extracted = processScript(doc, tsProject);\n const lang = Project.getScriptLang(\n filename,\n tsProject.markoScriptLang,\n ts,\n tsProject.host,\n );\n const generated = extracted.toString();\n const content = await prettier\n .format(generated, {\n parser: lang === ScriptLang.ts ? \"typescript\" : \"babel\",\n })\n .catch(() => generated);\n return {\n language: lang === ScriptLang.ts ? \"typescript\" : \"javascript\",\n content,\n };\n },\n },\n async initialize() {\n workspace.onConfigChange(() => {\n snapshotCache.clear();\n });\n\n documents.onFileChange((doc) => {\n if (doc) {\n const filename = getFSPath(doc)!;\n extractCache.delete(filename);\n snapshotCache.delete(filename);\n } else {\n extractCache.clear();\n snapshotCache.clear();\n }\n });\n },\n async doComplete(doc, params) {\n const fileName = getFSPath(doc);\n if (!fileName) return;\n\n const project = getTSProject(fileName);\n const extracted = processScript(doc, project);\n const sourceOffset = doc.offsetAt(params.position);\n const generatedOffset = extracted.generatedOffsetAt(sourceOffset);\n if (generatedOffset === undefined) return;\n\n const completions = project.service.getCompletionsAtPosition(\n fileName,\n generatedOffset,\n {\n ...(await getPreferences(project.markoScriptLang)),\n ...params.context,\n triggerCharacter: getTSTriggerChar(params.context?.triggerCharacter),\n },\n );\n if (!completions?.entries.length) return;\n\n const result: CompletionItem[] = [];\n\n for (const completion of completions.entries) {\n let { name: label, insertText, sortText } = completion;\n if (label.startsWith(localInternalsPrefix)) continue;\n\n const { replacementSpan } = completion;\n let textEdit: CompletionItem[\"textEdit\"];\n let detail: CompletionItem[\"detail\"];\n let kind: CompletionItem[\"kind\"];\n let tags: CompletionItem[\"tags\"];\n let labelDetails: CompletionItem[\"labelDetails\"];\n let source = completion.source;\n\n if (source && completion.hasAction) {\n if (source[0] === \".\") {\n source = path.resolve(fileName, \"..\", source);\n }\n detail = relativeImportPath(fileName, source);\n // De-prioritize auto-imported completions.\n sortText = `\\uffff${sortText}`;\n } else if (completion.sourceDisplay) {\n const description = ts.displayPartsToString(completion.sourceDisplay);\n if (description !== label) {\n labelDetails = { description };\n }\n }\n\n if (completion.kindModifiers) {\n if (optionalModifierReg.test(completion.kindModifiers)) {\n insertText = label;\n label += \"?\";\n }\n\n if (deprecatedModifierReg.test(completion.kindModifiers)) {\n tags = [CompletionItemTag.Deprecated];\n }\n\n if (colorModifierReg.test(completion.kindModifiers)) {\n kind = CompletionItemKind.Color;\n }\n }\n\n if (replacementSpan) {\n const sourceRange = sourceLocationAtTextSpan(\n extracted,\n replacementSpan,\n );\n\n if (sourceRange) {\n textEdit = {\n range: sourceRange,\n newText: insertText || label,\n };\n } else {\n continue;\n }\n }\n\n result.push({\n tags,\n label,\n detail,\n textEdit,\n sortText,\n insertText,\n labelDetails,\n filterText: insertText,\n preselect: completion.isRecommended || undefined,\n kind: kind || convertCompletionItemKind(completion.kind),\n insertTextFormat: completion.isSnippet\n ? InsertTextFormat.Snippet\n : undefined,\n data: completion.data && {\n originalData: completion.data,\n originalName: completion.name,\n originalSource: source,\n generatedOffset,\n fileName,\n },\n });\n }\n\n return {\n isIncomplete: true,\n items: result,\n };\n },\n async doCompletionResolve(item) {\n const { data } = item;\n if (!data) return;\n const { fileName } = data;\n if (!fileName) return;\n const doc = documents.get(filenameToURI(fileName));\n if (!doc) return;\n\n const project = getTSProject(fileName);\n const detail = project.service.getCompletionEntryDetails(\n fileName,\n data.generatedOffset,\n data.originalName,\n {},\n data.originalSource,\n await getPreferences(project.markoScriptLang),\n data.originalData,\n );\n\n if (!detail?.codeActions) return;\n\n const extracted = processScript(doc, project);\n const textEdits: CompletionItem[\"additionalTextEdits\"] =\n (item.additionalTextEdits = item.additionalTextEdits || []);\n\n for (const action of detail.codeActions) {\n for (const change of action.changes) {\n if (change.fileName !== fileName) continue;\n for (const { span, newText: rawText } of change.textChanges) {\n let range: Range | undefined;\n let newText = rawText;\n\n if (span.length === 0 && /^\\s*(?:import|export) /.test(newText)) {\n const cached = insertModuleStatementLocCache.get(extracted);\n newText = newText.replace(/\\n\\s*$/, \"\\n\");\n\n if (cached) {\n range = cached;\n } else {\n const { parsed } = getMarkoFile(doc);\n const offset = getInsertModuleStatementOffset(parsed);\n const start = parsed.positionAt(offset);\n range = {\n start,\n end: start,\n };\n insertModuleStatementLocCache.set(extracted, range);\n }\n } else {\n range = sourceLocationAtTextSpan(extracted, span);\n }\n\n if (range) {\n textEdits.push({ newText, range });\n }\n }\n }\n }\n\n return item;\n },\n findDefinition(doc, params) {\n const fileName = getFSPath(doc);\n if (!fileName) return;\n\n const project = getTSProject(fileName);\n const extracted = processScript(doc, project);\n const sourceOffset = doc.offsetAt(params.position);\n const generatedOffset = extracted.generatedOffsetAt(sourceOffset);\n if (generatedOffset === undefined) return;\n\n const boundary = project.service.getDefinitionAndBoundSpan(\n fileName,\n generatedOffset,\n );\n if (!boundary?.definitions) return;\n\n const originSelectionRange = sourceLocationAtTextSpan(\n extracted,\n boundary.textSpan,\n );\n let result: DefinitionLink[] | DefinitionLink | undefined;\n\n for (const def of boundary.definitions) {\n const targetUri = filenameToURI(def.fileName);\n const defDoc = documents.get(targetUri);\n if (!defDoc) continue;\n\n let link: DefinitionLink | undefined;\n\n if (markoFileReg.test(targetUri)) {\n const extracted = processScript(defDoc, project);\n const targetSelectionRange =\n sourceLocationAtTextSpan(extracted, def.textSpan) || START_LOCATION;\n const targetRange =\n (def.contextSpan &&\n sourceLocationAtTextSpan(extracted, def.contextSpan)) ||\n START_LOCATION;\n link = {\n targetUri,\n targetRange,\n targetSelectionRange,\n originSelectionRange,\n };\n } else {\n link = {\n targetUri,\n targetRange: def.contextSpan\n ? docLocationAtTextSpan(defDoc, def.contextSpan)\n : START_LOCATION,\n targetSelectionRange: docLocationAtTextSpan(defDoc, def.textSpan),\n originSelectionRange,\n };\n }\n\n if (link) {\n if (result) {\n if (Array.isArray(result)) {\n result.push(link);\n } else {\n result = [result, link];\n }\n } else {\n result = link;\n }\n }\n }\n\n return result;\n },\n doHover(doc, params) {\n const fileName = getFSPath(doc);\n if (!fileName) return;\n\n const project = getTSProject(fileName);\n const extracted = processScript(doc, project);\n const sourceOffset = doc.offsetAt(params.position);\n const generatedOffset = extracted.generatedOffsetAt(sourceOffset);\n if (generatedOffset === undefined) return;\n\n const quickInfo = project.service.getQuickInfoAtPosition(\n fileName,\n generatedOffset,\n );\n if (!quickInfo) return;\n\n const sourceRange = sourceLocationAtTextSpan(extracted, quickInfo.textSpan);\n if (!sourceRange) return;\n\n let contents = \"\";\n\n const displayParts = ts.displayPartsToString(quickInfo.displayParts);\n if (displayParts) {\n contents += `\\`\\`\\`typescript\\n${displayParts}\\n\\`\\`\\``;\n }\n\n const documentation = printDocumentation(\n quickInfo.documentation,\n quickInfo.tags,\n );\n if (documentation) {\n contents += `\\n---\\n${documentation}`;\n }\n\n return {\n range: sourceRange,\n contents,\n };\n },\n doRename(doc, params) {\n const fileName = getFSPath(doc);\n if (!fileName) return;\n\n const project = getTSProject(fileName);\n const extracted = processScript(doc, project);\n const sourceOffset = doc.offsetAt(params.position);\n const generatedOffset = extracted.generatedOffsetAt(sourceOffset);\n if (generatedOffset === undefined) return;\n\n const renameLocations = project.service.findRenameLocations(\n fileName,\n generatedOffset,\n false,\n false,\n false,\n );\n\n if (!renameLocations) return;\n\n const changes: { [uri: string]: TextEdit[] } = {};\n\n for (const rename of renameLocations) {\n const renameURI = filenameToURI(rename.fileName);\n const renameDoc = documents.get(renameURI);\n let edit: TextEdit | undefined;\n if (!renameDoc) continue;\n if (markoFileReg.test(renameURI)) {\n const extracted = processScript(renameDoc, project);\n const sourceRange = sourceLocationAtTextSpan(\n extracted,\n rename.textSpan,\n );\n if (sourceRange) {\n edit = {\n newText: params.newName,\n range: sourceRange,\n };\n }\n } else {\n edit = {\n newText: params.newName,\n range: docLocationAtTextSpan(renameDoc, rename.textSpan),\n };\n }\n\n if (edit) {\n if (changes[renameURI]) {\n changes[renameURI].push(edit);\n } else {\n changes[renameURI] = [edit];\n }\n }\n }\n\n return {\n changes,\n };\n },\n doValidate(doc) {\n const fileName = getFSPath(doc);\n if (!fileName) return;\n\n const project = getTSProject(fileName);\n const extracted = processScript(doc, project);\n\n let results: Diagnostic[] | undefined;\n for (const tsDiag of project.service.getSuggestionDiagnostics(fileName)) {\n addDiag(tsDiag);\n }\n\n for (const tsDiag of project.service.getSyntacticDiagnostics(fileName)) {\n addDiag(tsDiag);\n }\n\n for (const tsDiag of project.service.getSemanticDiagnostics(fileName)) {\n addDiag(tsDiag);\n }\n\n return results;\n\n function addDiag(tsDiag: ts.Diagnostic) {\n const diag = convertDiag(extracted, tsDiag);\n if (diag && !IGNORE_DIAG_REG.test(diag.message)) {\n if (results) {\n results.push(diag);\n } else {\n results = [diag];\n }\n }\n }\n },\n};\n\nfunction processScript(doc: TextDocument, tsProject: TSProject) {\n return processDoc(doc, ({ filename, parsed, lookup, dirname }) => {\n const { host, markoScriptLang } = tsProject;\n return extractScript({\n ts,\n parsed,\n lookup,\n translator: Project.getConfig(dirname).translator,\n scriptLang: filename\n ? Project.getScriptLang(filename, markoScriptLang, ts, host)\n : markoScriptLang,\n runtimeTypesCode: Project.getTypeLibs(tsProject.rootDir, ts, host)\n ?.markoTypesCode,\n });\n });\n}\n\nfunction getInsertModuleStatementOffset(parsed: Parsed) {\n const { program } = parsed;\n let firstNode: Node.AnyNode | undefined;\n\n if (program.static.length) {\n // Prefer before the first export, or after the last import.\n let lastImport: Node.Import | undefined;\n for (const node of program.static) {\n switch (node.type) {\n case NodeType.Export:\n return node.start;\n case NodeType.Import:\n lastImport = node;\n break;\n }\n }\n\n if (lastImport) {\n return lastImport.end + 1;\n }\n\n firstNode = program.static[0];\n }\n\n if (program.body.length) {\n if (!firstNode || firstNode.start > program.body[0].start) {\n firstNode = program.body[0];\n }\n }\n\n // Fall back to after the comments of the first node,\n // or the start of the document.\n if (firstNode) {\n return getOffsetAfterComments(firstNode);\n }\n\n return 0;\n}\n\nfunction getOffsetAfterComments(node: Node.AnyNode) {\n const { comments } = node as Node.Commentable;\n if (comments) {\n return comments.at(-1)!.end + 1;\n }\n\n return Math.max(0, node.start - 1);\n}\n\nfunction sourceLocationAtTextSpan(\n extracted: Extracted,\n { start, length }: ts.TextSpan,\n) {\n if (start === 0 && length === 0) return START_LOCATION;\n return extracted.sourceLocationAt(start, start + length);\n}\n\nfunction docLocationAtTextSpan(\n doc: TextDocument,\n { start, length }: ts.TextSpan,\n) {\n return {\n start: doc.positionAt(start),\n end: doc.positionAt(start + length),\n };\n}\n\nfunction getTSConfigFile(fileName: string) {\n let configFile: string | undefined;\n const docFsDir = path.dirname(fileName);\n const cache = Project.getCache(docFsDir);\n let configFileCache = cache.get(getTSConfigFile) as\n | Map<string, string | undefined>\n | undefined;\n\n if (configFileCache) {\n configFile = configFileCache.get(docFsDir);\n } else {\n configFileCache = new Map();\n cache.set(getTSConfigFile, configFileCache);\n }\n\n if (!configFile) {\n configFile =\n ts.findConfigFile(fileName, ts.sys.fileExists, \"tsconfig.json\") ||\n ts.findConfigFile(fileName, ts.sys.fileExists, \"jsconfig.json\");\n }\n\n configFileCache.set(docFsDir, configFile);\n\n return configFile;\n}\n\nfunction getTSProject(docFsPath: string): TSProject {\n let configFile: string | undefined;\n let markoScriptLang = ScriptLang.js;\n\n if (docFsPath) {\n configFile = getTSConfigFile(docFsPath);\n if (configFile?.endsWith(\"tsconfig.json\")) {\n markoScriptLang = ScriptLang.ts;\n }\n }\n\n const basePath = (configFile && path.dirname(configFile)) || process.cwd();\n const cache = Project.getCache(configFile && basePath);\n let projectCache = cache.get(getTSProject) as\n | Map<string, TSProject>\n | undefined;\n let cached: TSProject | undefined;\n\n // The typescript project and it's language service is\n // cached with the Marko compiler cache.\n // This causes the cache to be properly cleared when files change.\n if (projectCache) {\n cached = projectCache.get(basePath);\n if (cached) return cached;\n } else {\n // Within the compiler cache we store a map\n // of project paths to project info.\n projectCache = new Map();\n cache.set(getTSProject, projectCache);\n }\n\n const { fileNames, options, projectReferences } =\n ts.parseJsonConfigFileContent(\n (configFile && ts.readConfigFile(configFile, ts.sys.readFile).config) ||\n defaultTSConfig,\n ts.sys,\n basePath,\n requiredTSCompilerOptions,\n configFile,\n undefined,\n extraTSCompilerExtensions,\n );\n\n options.rootDir = basePath;\n\n // Only ts like files can inject globals into the project, so we filter out everything else.\n const potentialGlobalFiles = new Set<string>(\n fileNames.filter((file) => /\\.[cm]?ts$/.test(file)),\n );\n\n const tsPkgFile =\n configFile &&\n ts.resolveModuleName(\"typescript/package.json\", configFile, options, ts.sys)\n .resolvedModule?.resolvedFileName;\n const defaultLibFile = path.join(\n tsPkgFile ? path.join(tsPkgFile, \"../lib\") : __dirname,\n ts.getDefaultLibFileName(options),\n );\n\n const resolutionCache = ts.createModuleResolutionCache(\n basePath,\n getCanonicalFileName,\n options,\n );\n\n const host: ts.LanguageServiceHost = patch(\n ts,\n configFile,\n extractCache,\n resolutionCache,\n {\n getNewLine() {\n return ts.sys.newLine;\n },\n\n useCaseSensitiveFileNames() {\n return ts.sys.useCaseSensitiveFileNames;\n },\n\n getCompilationSettings() {\n return options;\n },\n\n getCurrentDirectory() {\n return options.rootDir!;\n },\n\n getProjectVersion() {\n return documents.projectVersion.toString(32);\n },\n\n getDefaultLibFileName() {\n return defaultLibFile;\n },\n\n getProjectReferences() {\n return projectReferences;\n },\n\n resolveModuleNameLiterals(\n moduleLiterals,\n containingFile,\n redirectedReference,\n options,\n _containingSourceFile,\n _reusedNames,\n ) {\n return moduleLiterals.map((moduleLiteral) => {\n return ts.bundlerModuleNameResolver(\n moduleLiteral.text,\n containingFile,\n options,\n host,\n resolutionCache,\n redirectedReference,\n );\n });\n },\n\n readDirectory: ts.sys.readDirectory,\n\n readFile: (filename) => documents.get(filenameToURI(filename))?.getText(),\n\n fileExists: (filename) => documents.exists(filenameToURI(filename)),\n\n getScriptFileNames() {\n const result = new Set(potentialGlobalFiles);\n for (const doc of documents.getAllOpen()) {\n const { scheme, fsPath } = URI.parse(doc.uri);\n if (scheme === \"file\") {\n const projectForFile = getTSProject(fsPath);\n if (projectForFile === tsProject) {\n result.add(fsPath);\n }\n }\n }\n\n return [...result];\n },\n\n getScriptVersion(filename) {\n return `${documents.get(filenameToURI(filename))?.version ?? -1}`;\n },\n\n getScriptKind(filename) {\n switch (path.extname(filename)) {\n case ts.Extension.Js:\n case ts.Extension.Cjs:\n case ts.Extension.Mjs:\n return ts.ScriptKind.JS;\n case ts.Extension.Jsx:\n return ts.ScriptKind.JSX;\n case ts.Extension.Ts:\n case ts.Extension.Cts:\n case ts.Extension.Mts:\n return ts.ScriptKind.TS;\n case ts.Extension.Tsx:\n return ts.ScriptKind.TSX;\n case ts.Extension.Json:\n return ts.ScriptKind.JSON;\n default:\n return ts.ScriptKind.Unknown;\n }\n },\n\n getScriptSnapshot(filename) {\n let snapshot = snapshotCache.get(filename);\n if (!snapshot) {\n const doc = documents.get(filenameToURI(filename));\n if (!doc) return;\n snapshot = ts.ScriptSnapshot.fromString(doc.getText());\n snapshotCache.set(filename, snapshot);\n }\n\n return snapshot;\n },\n },\n );\n\n const tsProject: TSProject = {\n host,\n rootDir: options.rootDir!,\n service: ts.createLanguageService(host),\n markoScriptLang,\n };\n\n projectCache.set(basePath, tsProject);\n return tsProject;\n}\n\nfunction filenameToURI(filename: string) {\n return URI.file(filename).toString();\n}\n\nasync function getPreferences(\n scriptLang: ScriptLang,\n): Promise<ts.UserPreferences> {\n const configName = scriptLang === ScriptLang.js ? \"javascript\" : \"typescript\";\n const [preferencesConfig, suggestConfig, inlayHintsConfig] =\n await Promise.all([\n workspace.getConfig(`${configName}.preferences`),\n workspace.getConfig(`${configName}.suggest`),\n workspace.getConfig(`${configName}.inlayHints`),\n ]);\n\n return {\n disableSuggestions: suggestConfig.enabled === false,\n quotePreference: preferencesConfig.quoteStyle || \"auto\",\n includeCompletionsForModuleExports: suggestConfig.autoImports ?? true,\n includeCompletionsForImportStatements:\n suggestConfig.includeCompletionsForImportStatements ?? true,\n includeCompletionsWithSnippetText:\n suggestConfig.includeCompletionsWithSnippetText ?? true,\n includeAutomaticOptionalChainCompletions:\n suggestConfig.includeAutomaticOptionalChainCompletions ?? true,\n includeCompletionsWithInsertText: true,\n includeCompletionsWithClassMemberSnippets:\n suggestConfig.classMemberSnippets?.enabled ?? true,\n includeCompletionsWithObjectLiteralMethodSnippets:\n suggestConfig.objectLiteralMethodSnippets?.enabled ?? true,\n useLabelDetailsInCompletionEntries: true,\n allowIncompleteCompletions: true,\n importModuleSpecifierPreference:\n preferencesConfig.importModuleSpecifierPreference,\n importModuleSpecifierEnding:\n preferencesConfig.importModuleSpecifierEnding || \"auto\",\n allowTextChangesInNewFiles: true,\n providePrefixAndSuffixTextForRename: true,\n includePackageJsonAutoImports:\n preferencesConfig.includePackageJsonAutoImports ?? true,\n provideRefactorNotApplicableReason: true,\n jsxAttributeCompletionStyle:\n preferencesConfig.jsxAttributeCompletionStyle ?? \"auto\",\n includeInlayParameterNameHints:\n inlayHintsConfig.parameterNames?.enabled ?? \"none\",\n includeInlayParameterNameHintsWhenArgumentMatchesName:\n !inlayHintsConfig.parameterNames?.suppressWhenArgumentMatchesName,\n includeInlayFunctionParameterTypeHints:\n inlayHintsConfig.parameterTypes?.enabled ?? true,\n includeInlayVariableTypeHints:\n inlayHintsConfig.variableTypes?.enabled ?? true,\n includeInlayPropertyDeclarationTypeHints:\n inlayHintsConfig.propertyDeclarationTypes?.enabled ?? true,\n includeInlayFunctionLikeReturnTypeHints:\n inlayHintsConfig.functionLikeReturnTypes?.enabled ?? true,\n includeInlayEnumMemberValueHints:\n inlayHintsConfig.enumMemberValues?.enabled ?? true,\n };\n}\n\nfunction printDocumentation(\n docs: ts.SymbolDisplayPart[] | undefined,\n tags: ts.JSDocTagInfo[] | undefined,\n) {\n let result = \"\";\n let sep = \"\";\n if (docs) {\n result += ts.displayPartsToString(docs);\n sep = \" \\n\\n\";\n }\n\n if (tags) {\n for (const tag of tags) {\n result += sep + printJSDocTag(tag);\n sep = \" \\n\\n\";\n }\n }\n\n return result;\n}\n\nfunction convertDiag(\n extracted: Extracted,\n tsDiag: ts.Diagnostic,\n): Diagnostic | undefined {\n const sourceRange =\n tsDiag.start === undefined\n ? START_LOCATION\n : sourceLocationAtTextSpan(extracted, tsDiag as ts.TextSpan);\n\n if (sourceRange) {\n return {\n range: sourceRange,\n source: \"script\",\n code: tsDiag.code,\n tags: convertDiagTags(tsDiag),\n severity: convertDiagSeverity(tsDiag),\n message: ts.flattenDiagnosticMessageText(tsDiag.messageText, \"\\n\"),\n };\n }\n}\n\nfunction convertDiagSeverity(tsDiag: ts.Diagnostic) {\n switch (tsDiag.category) {\n case ts.DiagnosticCategory.Error:\n return DiagnosticSeverity.Error;\n case ts.DiagnosticCategory.Warning:\n return DiagnosticSeverity.Warning;\n case ts.DiagnosticCategory.Suggestion:\n return DiagnosticSeverity.Hint;\n default:\n return DiagnosticSeverity.Information;\n }\n}\n\nfunction convertDiagTags(tsDiag: ts.Diagnostic) {\n let tags: DiagnosticTag[] | undefined;\n\n if (tsDiag.reportsDeprecated) {\n tags = [DiagnosticTag.Deprecated];\n }\n\n if (tsDiag.reportsUnnecessary) {\n if (tags) tags.push(DiagnosticTag.Unnecessary);\n else tags = [DiagnosticTag.Unnecessary];\n }\n\n return tags;\n}\n\nfunction convertCompletionItemKind(kind: ts.ScriptElementKind) {\n switch (kind) {\n case ts.ScriptElementKind.warning:\n case ts.ScriptElementKind.linkText:\n return CompletionItemKind.Text;\n\n case ts.ScriptElementKind.keyword:\n case ts.ScriptElementKind.primitiveType:\n return CompletionItemKind.Keyword;\n\n case ts.ScriptElementKind.scriptElement:\n return CompletionItemKind.File;\n\n case ts.ScriptElementKind.directory:\n return CompletionItemKind.Folder;\n\n case ts.ScriptElementKind.label:\n case ts.ScriptElementKind.string:\n return CompletionItemKind.Constant;\n\n case ts.ScriptElementKind.moduleElement:\n case ts.ScriptElementKind.externalModuleName:\n return CompletionItemKind.Module;\n\n case ts.ScriptElementKind.typeElement:\n case ts.ScriptElementKind.classElement:\n case ts.ScriptElementKind.localClassElement:\n return CompletionItemKind.Class;\n\n case ts.ScriptElementKind.interfaceElement:\n return CompletionItemKind.Interface;\n\n case ts.ScriptElementKind.enumElement:\n return CompletionItemKind.Enum;\n\n case ts.ScriptElementKind.enumMemberElement:\n return CompletionItemKind.EnumMember;\n\n case ts.ScriptElementKind.alias:\n case ts.ScriptElementKind.letElement:\n case ts.ScriptElementKind.constElement:\n case ts.ScriptElementKind.variableElement:\n case ts.ScriptElementKind.parameterElement:\n case ts.ScriptElementKind.localVariableElement:\n return CompletionItemKind.Variable;\n\n case ts.ScriptElementKind.functionElement:\n case ts.ScriptElementKind.localFunctionElement:\n return CompletionItemKind.Function;\n\n case ts.ScriptElementKind.callSignatureElement:\n case ts.ScriptElementKind.memberFunctionElement:\n case ts.ScriptElementKind.indexSignatureElement:\n case ts.ScriptElementKind.constructSignatureElement:\n return CompletionItemKind.Method;\n\n case ts.ScriptElementKind.memberGetAccessorElement:\n case ts.ScriptElementKind.memberSetAccessorElement:\n case ts.ScriptElementKind.memberVariableElement:\n return CompletionItemKind.Field;\n\n case ts.ScriptElementKind.constructorImplementationElement:\n return CompletionItemKind.Constructor;\n\n case ts.ScriptElementKind.typeParameterElement:\n return CompletionItemKind.TypeParameter;\n\n case ts.ScriptElementKind.link:\n case ts.ScriptElementKind.linkName:\n return CompletionItemKind.Reference;\n\n default:\n return CompletionItemKind.Property;\n }\n}\n\nfunction getTSTriggerChar(char: string | undefined) {\n if (char && tsTriggerChars.has(char))\n return char as ts.CompletionsTriggerCharacter;\n}\n\nfunction getCanonicalFileName(fileName: string) {\n return ts.sys.useCaseSensitiveFileNames ? fileName : fileName.toLowerCase();\n}\n\nexport { ScriptService as default };\n", "import {\n type Extracted,\n getExt,\n isDefinitionFile,\n Processors,\n Project,\n} from \"@marko/language-tools\";\nimport path from \"path\";\nimport type ts from \"typescript/lib/tsserverlibrary\";\n\nconst fsPathReg = /^(?:[./\\\\]|[A-Z]:)/i;\nconst modulePartsReg = /^((?:@(?:[^/]+)\\/)?(?:[^/]+))(.*)$/;\nconst importTagReg = /^<([^>]+)>$/;\n\nexport interface ExtractedSnapshot extends Extracted {\n snapshot: ts.IScriptSnapshot;\n}\n\nexport function patch(\n ts: typeof import(\"typescript/lib/tsserverlibrary\"),\n configFile: string | undefined,\n extractCache: Map<\n string,\n ExtractedSnapshot | { snapshot: ts.IScriptSnapshot }\n >,\n resolutionCache: ts.ModuleResolutionCache | undefined,\n host: ts.LanguageServiceHost,\n ps?: InstanceType<typeof ts.server.ProjectService>,\n) {\n const processors = Processors.create({\n ts,\n host,\n configFile,\n });\n const rootNames = Object.values(processors)\n .map((processor) => processor.getRootNames?.())\n .flat()\n .filter(Boolean) as string[];\n\n const trackFile = ps\n ? (fileName: string) => {\n // Ensure the project service knows about the file.\n // Without this the project never registers a `ScriptInfo`.\n // TODO: maybe we should patch readFile instead of getScriptSnapshot?\n\n ps.getOrCreateScriptInfoForNormalizedPath(\n fileName as any,\n true,\n undefined,\n ts.ScriptKind.Deferred,\n false,\n host,\n );\n }\n : () => {};\n\n /**\n * Ensure the processor runtime definitions are always loaded.\n */\n const getScriptFileNames = host.getScriptFileNames.bind(host);\n host.getScriptFileNames = () => [\n ...new Set(rootNames.concat(getScriptFileNames())),\n ];\n\n /**\n * Trick TypeScript into thinking Marko files are TS/JS files.\n */\n const getScriptKind = host.getScriptKind?.bind(host);\n if (getScriptKind) {\n host.getScriptKind = (fileName: string) => {\n const processor = getProcessor(fileName);\n if (processor) return processor.getScriptKind(fileName);\n return getScriptKind(fileName);\n };\n }\n\n /**\n * A script snapshot is an immutable string of text representing the contents of a file.\n * We patch it so that Marko files instead return their extracted ts code.\n */\n const getScriptSnapshot = host.getScriptSnapshot.bind(host);\n host.getScriptSnapshot = (fileName: string) => {\n const processor = getProcessor(fileName);\n if (processor) {\n let cached = extractCache.get(fileName);\n\n if (!cached) {\n const code = host.readFile(fileName, \"utf-8\") || \"\";\n\n try {\n cached = processor.extract(fileName, code) as ExtractedSnapshot;\n cached.snapshot = ts.ScriptSnapshot.fromString(cached.toString());\n } catch {\n cached = { snapshot: ts.ScriptSnapshot.fromString(\"\") };\n }\n\n trackFile(fileName);\n extractCache.set(fileName, cached);\n }\n\n return cached.snapshot;\n }\n\n return getScriptSnapshot(fileName);\n };\n\n if (host.getProjectVersion) {\n const getScriptVersion = host.getScriptVersion.bind(host);\n host.getScriptVersion = (fileName: string) => {\n const processor = getProcessor(fileName);\n if (processor) return host.getProjectVersion!();\n return getScriptVersion(fileName);\n };\n }\n\n /**\n * This ensures that any directory reads with specific file extensions also include Marko.\n * It is used for example when completing the `from` property of the `import` statement.\n */\n const readDirectory = host.readDirectory?.bind(host);\n if (readDirectory) {\n host.readDirectory = (path, extensions, exclude, include, depth) => {\n return readDirectory(\n path,\n extensions?.concat(Processors.extensions),\n exclude,\n include,\n depth,\n );\n };\n }\n\n /**\n * TypeScript doesn't know how to resolve `.marko` files.\n * Below we first try to use TypeScripts normal resolution, and then fallback\n * to seeing if a `.marko` file exists at the same location.\n */\n const resolveModuleNameLiterals = host.resolveModuleNameLiterals?.bind(host);\n\n if (resolveModuleNameLiterals) {\n host.resolveModuleNameLiterals = (\n moduleLiterals,\n containingFile,\n redirectedReference,\n options,\n containingSourceFile,\n reusedNames,\n ) => {\n let normalModuleLiterals = moduleLiterals as ts.StringLiteralLike[];\n let resolvedModules:\n | undefined\n | (ts.ResolvedModuleWithFailedLookupLocations | undefined)[];\n\n for (let i = 0; i < moduleLiterals.length; i++) {\n const moduleLiteral = moduleLiterals[i];\n let moduleName = moduleLiteral.text;\n\n const tagNameMatch = importTagReg.exec(moduleName);\n if (tagNameMatch) {\n // Try to resolve `import Tag from \"<tag>\"` style imports.\n const [, tagName] = tagNameMatch;\n const tagDef = Project.getTagLookup(\n path.dirname(containingFile),\n ).getTag(tagName);\n const tagFileName = tagDef && (tagDef.template || tagDef.renderer);\n if (tagFileName) {\n moduleName = tagFileName;\n }\n }\n\n const processor =\n moduleName[0] !== \"*\" ? getProcessor(moduleName) : undefined;\n if (processor) {\n let resolvedFileName: string | undefined;\n if (fsPathReg.test(moduleName)) {\n // For fs paths just see if it exists on disk.\n resolvedFileName = path.resolve(containingFile, \"..\", moduleName);\n } else {\n // For other paths we treat it as a node_module and try resolving\n // that modules `marko.json`. If the `marko.json` exists then we'll\n // try resolving the `.marko` file relative to that.\n const [, nodeModuleName, relativeModulePath] =\n modulePartsReg.exec(moduleName)!;\n const { resolvedModule } = ts.nodeModuleNameResolver(\n `${nodeModuleName}/package.json`,\n containingFile,\n options,\n host,\n resolutionCache,\n redirectedReference,\n );\n\n if (resolvedModule) {\n resolvedFileName = path.join(\n resolvedModule.resolvedFileName,\n \"..\",\n relativeModulePath,\n );\n }\n }\n\n if (!resolvedModules) {\n resolvedModules = [];\n normalModuleLiterals = [];\n for (let j = 0; j < i; j++) {\n resolvedModules.push(undefined);\n normalModuleLiterals.push(moduleLiterals[j]);\n }\n }\n\n if (resolvedFileName) {\n if (isDefinitionFile(resolvedFileName)) {\n if (!host.fileExists(resolvedFileName)) {\n resolvedFileName = undefined;\n }\n } else {\n const ext = getExt(resolvedFileName)!;\n const definitionFile = `${resolvedFileName.slice(\n 0,\n -ext.length,\n )}.d${ext}`;\n if (host.fileExists(definitionFile)) {\n resolvedFileName = definitionFile;\n } else if (!host.fileExists(resolvedFileName)) {\n resolvedFileName = undefined;\n }\n }\n }\n\n resolvedModules.push({\n resolvedModule: resolvedFileName\n ? {\n resolvedFileName,\n extension: processor.getScriptExtension(resolvedFileName),\n isExternalLibraryImport: false,\n }\n : undefined,\n });\n } else if (resolvedModules) {\n resolvedModules.push(undefined);\n normalModuleLiterals.push(moduleLiteral);\n }\n }\n\n const normalResolvedModules = normalModuleLiterals.length\n ? resolveModuleNameLiterals(\n normalModuleLiterals,\n containingFile,\n redirectedReference,\n options,\n containingSourceFile,\n reusedNames,\n )\n : undefined;\n\n if (resolvedModules) {\n if (normalResolvedModules) {\n for (let i = 0, j = 0; i < resolvedModules.length; i++) {\n if (!resolvedModules[i]) {\n resolvedModules[i] = normalResolvedModules[j++];\n }\n }\n }\n return resolvedModules as readonly ts.ResolvedModuleWithFailedLookupLocations[];\n } else {\n return normalResolvedModules!;\n }\n };\n }\n\n return host;\n\n function getProcessor(fileName: string) {\n const ext = getExt(fileName);\n return ext ? processors[ext] : undefined;\n }\n}\n", "import type { Connection } from \"vscode-languageserver\";\n\nlet isInitialized = false;\nlet connection!: Connection;\nconst configChangeHandlers: Set<ConfigChangeHandler> = new Set();\nconst settingsCache = new Map<string, any>();\n\nexport async function getConfig<T = any>(section: string): Promise<T> {\n let cached = settingsCache.get(section);\n if (!cached) {\n try {\n cached = (await connection.workspace.getConfiguration(section)) || {};\n settingsCache.set(section, cached);\n } catch {\n // ignore\n }\n }\n\n return cached;\n}\n\nexport type ConfigChangeHandler = () => void;\nexport function onConfigChange(handler: ConfigChangeHandler) {\n configChangeHandlers.add(handler);\n}\n\nexport function setup(_: Connection) {\n connection = _;\n connection.onDidChangeConfiguration(() => {\n if (isInitialized) {\n settingsCache.clear();\n emitConfigChange();\n } else {\n isInitialized = true;\n }\n });\n}\n\nfunction emitConfigChange() {\n for (const handler of configChangeHandlers) {\n handler();\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See \"Notice\" file in this package for license information.\n *--------------------------------------------------------------------------------------------*/\n\n/**\n * adopted from https://github.com/microsoft/vscode/blob/b9202b64081bb1267792a8d2d023e4c746ed0f73/extensions/typescript-language-features/src/languageFeatures/util/textRendering.ts\n */\n\nimport type ts from \"typescript/lib/tsserverlibrary\";\n\nconst REG_BACK_TICK = /`/g;\nconst REG_LINE = /\\r\\n|\\n/;\nconst REG_CODE_BLOCK = /^\\s*[~`]{3}/m;\nconst REG_CAPTION = /^<caption>(.*?)<\\/caption>\\s*(\\r\\n|\\n)/;\n\nexport default function printJSDocTag(\n tag: ts.JSDocTagInfo,\n): string | undefined {\n switch (tag.name) {\n case \"augments\":\n case \"extends\":\n case \"param\":\n case \"template\": {\n const body = getTagBodyParts(tag);\n if (body?.length === 3) {\n const [, param, text] = body;\n return `${printTagName(tag.name)} \\`${param}\\`${printTagBody(\n replaceLinks(text),\n )}`;\n }\n break;\n }\n\n case \"return\":\n case \"returns\": {\n if (!tag.text?.length) return undefined;\n break;\n }\n }\n\n return printTagName(tag.name) + printTagBody(getTagBodyText(tag));\n}\n\nfunction getTagBodyParts(tag: ts.JSDocTagInfo): Array<string> | undefined {\n if (tag.name === \"template\") {\n const parts = tag.text;\n if (parts) {\n const params = parts\n .filter((p) => p.kind === \"typeParameterName\")\n .map((p) => p.text)\n .join(\", \");\n const docs = parts\n .filter((p) => p.kind === \"text\")\n .map((p) => convertLinkTags(p.text.replace(/^\\s*-?\\s*/, \"\")))\n .join(\" \");\n return params ? [\"\", params, docs] : undefined;\n }\n }\n return convertLinkTags(tag.text).split(/^(\\S+)\\s*-?\\s*/);\n}\n\nfunction getTagBodyText(tag: ts.JSDocTagInfo): string {\n if (!tag.text) return \"\";\n\n const text = convertLinkTags(tag.text);\n switch (tag.name) {\n case \"example\": {\n const captionTagMatches = REG_CAPTION.exec(text);\n if (captionTagMatches) {\n const [captionMatch, captionText] = captionTagMatches;\n return `${captionText}\\n${ensureCodeblock(\n captionText.slice(captionMatch.length),\n )}`;\n } else {\n return ensureCodeblock(text);\n }\n }\n case \"author\": {\n const emailMatch = text.match(/(.+)\\s<([-.\\w]+@[-.\\w]+)>/);\n\n if (emailMatch) {\n return `${emailMatch[1]} ${emailMatch[2]}`;\n }\n\n return text;\n }\n case \"default\":\n return ensureCodeblock(text);\n }\n\n return replaceLinks(text);\n}\n\nfunction convertLinkTags(\n parts: readonly ts.SymbolDisplayPart[] | string | undefined,\n): string {\n if (!parts) return \"\";\n if (typeof parts === \"string\") return parts;\n\n let result = \"\";\n let currentLink:\n | { name?: string; target?: any; text?: string; readonly linkcode: boolean }\n | undefined;\n\n for (const part of parts) {\n switch (part.kind) {\n case \"link\":\n if (currentLink) {\n if (currentLink.target) {\n const linkText = currentLink.text\n ? currentLink.text\n : escapeBackTicks(currentLink.name ?? \"\");\n result += `[${\n currentLink.linkcode ? \"`\" + linkText + \"`\" : linkText\n }](${currentLink.target.file})`;\n } else {\n const text = currentLink.text ?? currentLink.name;\n if (text) {\n if (/^https?:/.test(text)) {\n const parts = text.split(\" \");\n if (parts.length === 1) {\n result += parts[0];\n } else if (parts.length > 1) {\n const linkText = escapeBackTicks(parts.slice(1).join(\" \"));\n result += `[${\n currentLink.linkcode ? \"`\" + linkText + \"`\" : linkText\n }](${parts[0]})`;\n }\n } else {\n result += escapeBackTicks(text);\n }\n }\n }\n currentLink = undefined;\n } else {\n currentLink = {\n linkcode: part.text === \"{@linkcode \",\n };\n }\n break;\n\n case \"linkName\":\n if (currentLink) {\n currentLink.name = part.text;\n currentLink.target = (part as ts.JSDocLinkDisplayPart).target;\n }\n break;\n\n case \"linkText\":\n if (currentLink) {\n currentLink.text = part.text;\n }\n break;\n\n default:\n result += part.text;\n break;\n }\n }\n return replaceLinks(result);\n}\n\nfunction replaceLinks(text: string): string {\n return text.replace(\n /\\{@(link|linkplain|linkcode) (https?:\\/\\/[^ |}]+?)(?:[| ]([^{}\\n]+?))?\\}/gi,\n (_, tag: string, link: string, text?: string) => {\n const alt = text ? text.trim() : link;\n return `[${tag === \"linkcode\" ? `\\`${alt}\\`` : alt}](${link})`;\n },\n );\n}\n\nfunction printTagBody(text: string | undefined) {\n if (text) {\n return (REG_LINE.test(text) ? \" \\n\" : \" \u2014 \") + text;\n }\n\n return \"\";\n}\n\nfunction printTagName(name: string) {\n return `*@${name}*`;\n}\n\nfunction ensureCodeblock(text: string): string {\n return REG_CODE_BLOCK.test(text) ? text : \"```\\n\" + text + \"\\n```\";\n}\n\nfunction escapeBackTicks(text: string): string {\n return text.replace(REG_BACK_TICK, \"\\\\$&\");\n}\n", "import { type Extracted, extractStyle } from \"@marko/language-tools\";\nimport {\n getCSSLanguageService,\n getLESSLanguageService,\n getSCSSLanguageService,\n type LanguageService,\n type LanguageServiceOptions,\n type Stylesheet,\n} from \"vscode-css-languageservice\";\nimport {\n ColorInformation,\n ColorPresentation,\n Diagnostic,\n DocumentHighlight,\n DocumentLink,\n InitializeParams,\n InsertReplaceEdit,\n Location,\n Range,\n SymbolInformation,\n TextDocumentEdit,\n TextEdit,\n} from \"vscode-languageserver\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\n\nimport { processDoc } from \"../../utils/file\";\nimport fileSystemProvider from \"../../utils/file-system\";\nimport resolveReference from \"../../utils/resolve-url\";\nimport type { Plugin } from \"../types\";\n\ninterface ProcessedStyle {\n parsed: Stylesheet;\n extracted: Extracted;\n virtualDoc: TextDocument;\n service: LanguageService;\n}\n\nconst services: Record<\n string,\n (options: LanguageServiceOptions) => LanguageService\n> = {\n \".css\": getCSSLanguageService,\n \".less\": getLESSLanguageService,\n \".scss\": getSCSSLanguageService,\n};\nlet clientCapabilities: InitializeParams[\"capabilities\"] | undefined;\n\nconst StyleSheetService: Partial<Plugin> = {\n initialize(params) {\n clientCapabilities = params.capabilities;\n },\n async doComplete(doc, params) {\n const sourceOffset = doc.offsetAt(params.position);\n for (const style of processStyle(doc)) {\n // Find the first stylesheet data that contains the offset.\n const generatedPos = style.extracted.generatedPositionAt(sourceOffset);\n if (generatedPos === undefined) continue;\n\n const result = await style.service.doComplete2(\n style.virtualDoc,\n generatedPos,\n style.parsed,\n { resolveReference },\n );\n\n if (result.itemDefaults) {\n const { editRange } = result.itemDefaults;\n if (editRange) {\n if (\"start\" in editRange) {\n result.itemDefaults.editRange = getSourceRange(style, editRange);\n } else {\n editRange.insert = getSourceRange(style, editRange.insert)!;\n editRange.replace = getSourceRange(style, editRange.replace)!;\n }\n }\n }\n\n for (const item of result.items) {\n if (item.textEdit) {\n item.textEdit = getSourceInsertReplaceEdit(style, item.textEdit);\n }\n\n if (item.additionalTextEdits) {\n item.additionalTextEdits = getSourceEdits(\n style,\n item.additionalTextEdits,\n );\n }\n }\n\n return result;\n }\n },\n findDefinition(doc, params) {\n const sourceOffset = doc.offsetAt(params.position);\n for (const style of processStyle(doc)) {\n // Find the first stylesheet data that contains the offset.\n const generatedPos = style.extracted.generatedPositionAt(sourceOffset);\n if (generatedPos === undefined) continue;\n\n const result = style.service.findDefinition(\n style.virtualDoc,\n generatedPos,\n style.parsed,\n );\n\n if (result) {\n const sourceRange = getSourceRange(style, result.range);\n if (sourceRange) {\n return {\n range: sourceRange,\n uri: doc.uri,\n };\n }\n }\n\n break;\n }\n },\n findReferences(doc, params) {\n const sourceOffset = doc.offsetAt(params.position);\n for (const style of processStyle(doc)) {\n // Find the first stylesheet data that contains the offset.\n const generatedPos = style.extracted.generatedPositionAt(sourceOffset);\n if (generatedPos === undefined) continue;\n\n const result: Location[] = [];\n for (const location of style.service.findReferences(\n style.virtualDoc,\n generatedPos,\n style.parsed,\n )) {\n const sourceRange = getSourceRange(style, location.range);\n if (sourceRange) {\n result.push({\n range: sourceRange,\n uri: location.uri,\n });\n }\n }\n\n return result.length ? result : undefined;\n }\n },\n findDocumentSymbols(doc) {\n const result: SymbolInformation[] = [];\n for (const extracted of processStyle(doc)) {\n for (const symbol of extracted.service.findDocumentSymbols(\n extracted.virtualDoc,\n extracted.parsed,\n )) {\n if (symbol.location.uri === doc.uri) {\n const sourceRange = getSourceRange(extracted, symbol.location.range);\n if (sourceRange) {\n result.push({\n kind: symbol.kind,\n name: symbol.name,\n tags: symbol.tags,\n deprecated: symbol.deprecated,\n containerName: symbol.containerName,\n location: { uri: doc.uri, range: sourceRange },\n });\n }\n } else {\n result.push(symbol);\n }\n }\n }\n\n return result.length ? result : undefined;\n },\n async findDocumentLinks(doc) {\n const result: DocumentLink[] = [];\n for (const extracted of processStyle(doc)) {\n for (const link of await extracted.service.findDocumentLinks2(\n extracted.virtualDoc,\n extracted.parsed,\n { resolveReference },\n )) {\n const sourceRange = getSourceRange(extracted, link.range);\n if (sourceRange) {\n result.push({\n range: sourceRange,\n target: link.target,\n tooltip: link.tooltip,\n data: link.data,\n });\n }\n }\n }\n\n return result.length ? result : undefined;\n },\n findDocumentHighlights(doc, params) {\n const sourceOffset = doc.offsetAt(params.position);\n for (const style of processStyle(doc)) {\n // Find the first stylesheet data that contains the offset.\n const generatedPos = style.extracted.generatedPositionAt(sourceOffset);\n if (generatedPos === undefined) continue;\n\n const result: DocumentHighlight[] = [];\n for (const highlight of style.service.findDocumentHighlights(\n style.virtualDoc,\n generatedPos,\n style.parsed,\n )) {\n const sourceRange = getSourceRange(style, highlight.range);\n if (sourceRange) {\n result.push({\n range: sourceRange,\n kind: highlight.kind,\n });\n }\n }\n\n return result.length ? result : undefined;\n }\n },\n findDocumentColors(doc) {\n const result: ColorInformation[] = [];\n for (const extracted of processStyle(doc)) {\n for (const colorInfo of extracted.service.findDocumentColors(\n extracted.virtualDoc,\n extracted.parsed,\n )) {\n const sourceRange = getSourceRange(extracted, colorInfo.range);\n if (sourceRange) {\n result.push({\n range: sourceRange,\n color: colorInfo.color,\n });\n }\n }\n }\n\n return result.length ? result : undefined;\n },\n getColorPresentations(doc, params) {\n for (const extracted of processStyle(doc)) {\n const generatedRange = getGeneratedRange(doc, extracted, params.range);\n // Find the first stylesheet data that contains the offset.\n if (generatedRange === undefined) continue;\n\n const result: ColorPresentation[] = [];\n for (const colorPresentation of extracted.service.getColorPresentations(\n extracted.virtualDoc,\n extracted.parsed,\n params.color,\n generatedRange,\n )) {\n const textEdit =\n colorPresentation.textEdit &&\n getSourceEdit(extracted, colorPresentation.textEdit);\n const additionalTextEdits =\n colorPresentation.additionalTextEdits &&\n getSourceEdits(extracted, colorPresentation.additionalTextEdits);\n\n if (textEdit || additionalTextEdits) {\n result.push({\n label: colorPresentation.label,\n textEdit,\n additionalTextEdits,\n });\n }\n }\n\n return result.length ? result : undefined;\n }\n },\n doHover(doc, params) {\n const sourceOffset = doc.offsetAt(params.position);\n for (const style of processStyle(doc)) {\n // Find the first stylesheet data that contains the offset.\n const generatedPos = style.extracted.generatedPositionAt(sourceOffset);\n if (generatedPos === undefined) continue;\n\n const result = style.service.doHover(\n style.virtualDoc,\n generatedPos,\n style.parsed,\n );\n\n if (result) {\n if (result.range) {\n const sourceRange = getSourceRange(style, result.range);\n if (sourceRange) {\n return {\n range: sourceRange,\n contents: result.contents,\n };\n }\n } else {\n return result;\n }\n }\n }\n },\n async doRename(doc, params) {\n const sourceOffset = doc.offsetAt(params.position);\n for (const style of processStyle(doc)) {\n // Find the first stylesheet data that contains the offset.\n const generatedOffset = style.extracted.generatedOffsetAt(sourceOffset);\n if (generatedOffset === undefined) continue;\n\n const result = style.service.doRename(\n style.virtualDoc,\n style.virtualDoc.positionAt(generatedOffset),\n params.newName,\n style.parsed,\n );\n\n if (result.changes) {\n for (const uri in result.changes) {\n if (uri === doc.uri) {\n result.changes[uri] =\n getSourceEdits(style, result.changes[uri]) || [];\n }\n }\n }\n\n if (result.documentChanges) {\n for (const change of result.documentChanges) {\n if (TextDocumentEdit.is(change)) {\n if (change.textDocument.uri === doc.uri) {\n change.edits = getSourceEdits(style, change.edits) || [];\n }\n }\n }\n }\n\n return result;\n }\n },\n doCodeActions(doc, params) {\n for (const extracted of processStyle(doc)) {\n // Find the first stylesheet data that contains the offset.\n const generatedRange = getGeneratedRange(doc, extracted, params.range);\n if (generatedRange === undefined) continue;\n\n const result = extracted.service.doCodeActions(\n extracted.virtualDoc,\n generatedRange,\n params.context,\n extracted.parsed,\n );\n\n for (const command of result) {\n const edits = command.arguments?.[2];\n if (edits && Array.isArray(edits) && isTextEdit(edits[0])) {\n command.arguments![2] = getSourceEdits(extracted, edits);\n }\n }\n\n return result;\n }\n },\n doValidate(doc) {\n const result: Diagnostic[] = [];\n for (const extracted of processStyle(doc)) {\n for (const diag of extracted.service.doValidation(\n extracted.virtualDoc,\n extracted.parsed,\n )) {\n const sourceRange = getSourceRange(extracted, diag.range);\n if (sourceRange) {\n diag.source = \"style\";\n diag.range = sourceRange;\n result.push(diag);\n }\n }\n }\n\n return result.length ? result : undefined;\n },\n};\n\nexport { StyleSheetService as default };\n\nfunction processStyle(doc: TextDocument) {\n return processDoc(doc, ({ uri, version, parsed, lookup }) => {\n const result: ProcessedStyle[] = [];\n for (const [ext, extracted] of extractStyle({\n parsed,\n lookup,\n })) {\n const service = services[ext]?.({\n fileSystemProvider,\n clientCapabilities,\n });\n if (service) {\n const virtualDoc = TextDocument.create(\n uri,\n \"css\",\n version,\n extracted.toString(),\n );\n result.push({\n service,\n extracted,\n virtualDoc,\n parsed: service.parseStylesheet(virtualDoc),\n });\n }\n }\n\n return result;\n });\n}\n\nfunction getSourceEdits(\n extracted: ProcessedStyle,\n edits: TextEdit[],\n): TextEdit[] | undefined {\n const result: TextEdit[] = [];\n\n for (const edit of edits) {\n const sourceEdit = getSourceEdit(extracted, edit);\n if (sourceEdit) {\n result.push(sourceEdit);\n }\n }\n\n return result.length ? result : undefined;\n}\n\nfunction getSourceEdit(\n extracted: ProcessedStyle,\n textEdit: TextEdit,\n): TextEdit | undefined {\n const sourceRange = getSourceRange(extracted, textEdit.range);\n if (sourceRange) {\n return {\n newText: textEdit.newText,\n range: sourceRange,\n };\n }\n}\n\nfunction getSourceInsertReplaceEdit(\n extracted: ProcessedStyle,\n textEdit: TextEdit | InsertReplaceEdit,\n): TextEdit | InsertReplaceEdit | undefined {\n if (isTextEdit(textEdit)) {\n return getSourceEdit(extracted, textEdit);\n } else if (textEdit.replace) {\n const sourceRange = getSourceRange(extracted, textEdit.replace);\n if (sourceRange) {\n return {\n newText: textEdit.newText,\n replace: sourceRange,\n } as InsertReplaceEdit;\n }\n } else {\n const sourceRange = getSourceRange(extracted, textEdit.insert);\n if (sourceRange) {\n return {\n newText: textEdit.newText,\n insert: sourceRange,\n } as InsertReplaceEdit;\n }\n }\n}\n\nfunction getSourceRange(\n style: ProcessedStyle,\n range: Range,\n): Range | undefined {\n return style.extracted.sourceLocationAt(\n style.virtualDoc.offsetAt(range.start),\n style.virtualDoc.offsetAt(range.end),\n );\n}\n\nfunction getGeneratedRange(\n doc: TextDocument,\n style: ProcessedStyle,\n range: Range,\n): Range | undefined {\n return style.extracted.generatedLocationAt(\n doc.offsetAt(range.start),\n doc.offsetAt(range.end),\n );\n}\n\nfunction isTextEdit(edit: TextEdit | InsertReplaceEdit): edit is TextEdit {\n return (edit as TextEdit).range !== undefined;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import * as defaultCompiler from \"@marko/compiler\";\nimport defaultConfig from \"@marko/compiler/config\";\nimport { Project } from \"@marko/language-tools\";\nimport * as defaultTranslator from \"marko/translator\";\nimport path from \"path\";\n\nProject.setDefaultTypePaths({\n internalTypesFile: path.join(__dirname, \"marko.internal.d.ts\"),\n markoTypesFile: path.join(__dirname, \"marko.runtime.d.ts\"),\n});\nProject.setDefaultCompilerMeta(defaultCompiler, {\n ...defaultConfig,\n translator: defaultTranslator,\n});\n", "import \"./utils/project-defaults\";\n\nimport { Project } from \"@marko/language-tools\";\nimport { inspect, isDeepStrictEqual } from \"util\";\nimport {\n createConnection,\n DefinitionLink,\n Diagnostic,\n ProposedFeatures,\n TextDocumentSyncKind,\n} from \"vscode-languageserver/node\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\n\nimport service from \"./service\";\nimport { clearMarkoCacheForFile } from \"./utils/file\";\nimport setupMessages from \"./utils/messages\";\nimport * as documents from \"./utils/text-documents\";\nimport * as workspace from \"./utils/workspace\";\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 connection = createConnection(ProposedFeatures.all);\nconst prevDiags = new WeakMap<TextDocument, Diagnostic[]>();\nlet diagnosticTimeout: ReturnType<typeof setTimeout> | undefined;\n\nconsole.log = (...args: unknown[]) => {\n connection.console.log(args.map((v) => inspect(v)).join(\" \"));\n};\nconsole.error = (...args: unknown[]) => {\n connection.console.error(args.map((v) => inspect(v)).join(\" \"));\n};\nprocess.on(\"uncaughtException\", console.error);\nprocess.on(\"unhandledRejection\", console.error);\n\nconnection.onInitialize(async (params) => {\n setupMessages(connection);\n await service.initialize(params);\n\n return {\n capabilities: {\n textDocumentSync: TextDocumentSyncKind.Incremental,\n documentFormattingProvider: true,\n definitionProvider: true,\n hoverProvider: true,\n renameProvider: true,\n codeActionProvider: true,\n referencesProvider: true,\n documentLinkProvider: { resolveProvider: false },\n colorProvider: true,\n documentHighlightProvider: true,\n documentSymbolProvider: true,\n completionProvider: {\n resolveProvider: true,\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\nworkspace.setup(connection);\nworkspace.onConfigChange(validateDocs);\n\nconnection.onDidOpenTextDocument(async (params) => {\n documents.doOpen(params);\n\n const doc = documents.get(params.textDocument.uri);\n if (doc) {\n const diagnostics = (await service.doValidate(doc)) || [];\n prevDiags.set(doc, diagnostics);\n connection.sendDiagnostics({\n uri: doc.uri,\n diagnostics,\n });\n }\n});\nconnection.onDidChangeTextDocument(documents.doChange);\nconnection.onDidCloseTextDocument(documents.doClose);\nconnection.onDidChangeWatchedFiles(documents.doChangeWatchedFiles);\n\ndocuments.onFileChange((changeDoc) => {\n if (changeDoc) {\n queueDiagnostic();\n clearMarkoCacheForFile(changeDoc);\n } else {\n validateDocs();\n }\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.onCompletionResolve(async (item, cancel) => {\n return (await service.doCompletionResolve(item, cancel)) || item;\n});\n\nconnection.onDefinition(async (params, cancel) => {\n return (\n ((await service.findDefinition(\n documents.get(params.textDocument.uri)!,\n params,\n cancel,\n )) as DefinitionLink[]) || null\n );\n});\n\nconnection.onReferences(async (params, cancel) => {\n return (\n (await service.findReferences(\n documents.get(params.textDocument.uri)!,\n params,\n cancel,\n )) || null\n );\n});\n\nconnection.onDocumentLinks(async (params, cancel) => {\n return (\n (await service.findDocumentLinks(\n documents.get(params.textDocument.uri)!,\n params,\n cancel,\n )) || null\n );\n});\n\nconnection.onDocumentSymbol(async (params, cancel) => {\n return (\n (await service.findDocumentSymbols(\n documents.get(params.textDocument.uri)!,\n params,\n cancel,\n )) || null\n );\n});\n\nconnection.onDocumentHighlight(async (params, cancel) => {\n return (\n (await service.findDocumentHighlights(\n documents.get(params.textDocument.uri)!,\n params,\n cancel,\n )) || null\n );\n});\n\nconnection.onDocumentColor(async (params, cancel) => {\n return (\n (await service.findDocumentColors(\n documents.get(params.textDocument.uri)!,\n params,\n cancel,\n )) || null\n );\n});\n\nconnection.onColorPresentation(async (params, cancel) => {\n return (\n (await service.getColorPresentations(\n documents.get(params.textDocument.uri)!,\n params,\n cancel,\n )) || null\n );\n});\n\nconnection.onHover(async (params, cancel) => {\n return (\n (await service.doHover(\n documents.get(params.textDocument.uri)!,\n params,\n cancel,\n )) || null\n );\n});\n\nconnection.onRenameRequest(async (params, cancel) => {\n return (\n (await service.doRename(\n documents.get(params.textDocument.uri)!,\n params,\n cancel,\n )) || null\n );\n});\n\nconnection.onCodeAction(async (params, cancel) => {\n return (\n (await service.doCodeActions(\n documents.get(params.textDocument.uri)!,\n params,\n cancel,\n )) || null\n );\n});\n\nconnection.onDocumentFormatting(async (params, cancel) => {\n return (\n (await service.format(\n documents.get(params.textDocument.uri)!,\n params,\n cancel,\n )) || null\n );\n});\n\nfor (const command in service.commands) {\n connection.onRequest(command, service.commands[command]);\n}\n\nfunction validateDocs() {\n queueDiagnostic();\n Project.clearCaches();\n}\n\nfunction queueDiagnostic() {\n clearTimeout(diagnosticTimeout);\n const id = (diagnosticTimeout = setTimeout(async () => {\n const results = await Promise.all(\n Array.from(documents.getAllOpen()).map(async (doc) => {\n if (!documents.isOpen(doc)) {\n prevDiags.delete(doc);\n return;\n }\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\nconnection.listen();\n", "import type {\n CodeAction,\n ColorInformation,\n ColorPresentation,\n Command,\n CompletionItem,\n DefinitionLink,\n Diagnostic,\n DocumentHighlight,\n DocumentLink,\n Hover,\n Location,\n MarkedString,\n Range,\n SymbolInformation,\n WorkspaceEdit,\n} from \"vscode-languageserver\";\nimport { MarkupContent, MarkupKind } from \"vscode-languageserver\";\n\nimport {\n doChange,\n doChangeWatchedFiles,\n doClose,\n doOpen,\n get,\n} from \"../utils/text-documents\";\nexport const documents = {\n get,\n doChange,\n doOpen,\n doClose,\n doChangeWatchedFiles,\n};\n\nimport HtmlPlugin from \"./html\";\nimport MarkoPlugin from \"./marko\";\nimport ScriptPlugin from \"./script\";\nimport StylePlugin from \"./style\";\nimport type { Plugin } from \"./types\";\n\nconst REG_MARKDOWN_CHARS = /[\\\\`*_{}[\\]<>()#+.!|-]/g;\nconst plugins = [MarkoPlugin, ScriptPlugin, StylePlugin, HtmlPlugin];\n\n/**\n * Facade to all embedded plugins, eg css, typescript and our own.\n */\nconst service: Plugin = {\n commands: Object.assign({}, ...plugins.map(({ commands }) => commands)),\n async initialize(params) {\n await Promise.allSettled(\n plugins.map((plugin) => plugin.initialize?.(params)),\n );\n },\n async doComplete(doc, params, cancel) {\n // TODO: this should handle CompletionList.itemDefaults.\n // If there is a single responding plugin, pass through, otherwise need to apply the defaults to the completion items for the plugin.\n\n // Used to filter out duplicate labels (highest sortText wins).\n const results = await Promise.allSettled(\n plugins.map((plugin) => plugin.doComplete?.(doc, params, cancel)),\n );\n\n if (cancel.isCancellationRequested) return;\n\n const itemsByLabel = new Map<string, CompletionItem>();\n for (const result of results) {\n if (result.status !== \"fulfilled\" || !result.value) continue;\n\n for (const item of Array.isArray(result.value)\n ? result.value\n : result.value.items) {\n const { label } = item;\n const existingItem = itemsByLabel.get(label);\n if (existingItem) {\n if ((existingItem.sortText || label) < (item.sortText || label)) {\n itemsByLabel.set(label, item);\n }\n } else {\n itemsByLabel.set(label, item);\n }\n }\n }\n\n return { items: [...itemsByLabel.values()], isIncomplete: true };\n },\n async doCompletionResolve(item, cancel) {\n for (const plugin of plugins) {\n try {\n const result = await plugin.doCompletionResolve?.(item, cancel);\n if (cancel.isCancellationRequested) return;\n if (result) return result;\n } catch {\n // ignore\n }\n }\n },\n async findDefinition(doc, params, cancel) {\n const results = await Promise.allSettled(\n plugins.map((plugin) => plugin.findDefinition?.(doc, params, cancel)),\n );\n\n if (cancel.isCancellationRequested) return;\n\n let links: (Location | DefinitionLink)[] | undefined;\n for (const result of results) {\n if (result.status !== \"fulfilled\" || !result.value) continue;\n links = (links || []).concat(result.value);\n }\n\n return links;\n },\n async findReferences(doc, params, cancel) {\n const results = await Promise.allSettled(\n plugins.map((plugin) => plugin.findReferences?.(doc, params, cancel)),\n );\n\n if (cancel.isCancellationRequested) return;\n\n let references: Location[] | undefined;\n for (const result of results) {\n if (result.status !== \"fulfilled\" || !result.value) continue;\n references = (references || []).concat(result.value);\n }\n\n return references;\n },\n async findDocumentSymbols(doc, params, cancel) {\n const results = await Promise.allSettled(\n plugins.map((plugin) =>\n plugin.findDocumentSymbols?.(doc, params, cancel),\n ),\n );\n\n if (cancel.isCancellationRequested) return;\n\n let symbols: SymbolInformation[] | undefined;\n for (const result of results) {\n if (result.status !== \"fulfilled\" || !result.value) continue;\n symbols = (symbols || []).concat(result.value);\n }\n\n return symbols;\n },\n async findDocumentLinks(doc, params, cancel) {\n const results = await Promise.allSettled(\n plugins.map((plugin) => plugin.findDocumentLinks?.(doc, params, cancel)),\n );\n\n if (cancel.isCancellationRequested) return;\n\n let links: DocumentLink[] | undefined;\n for (const result of results) {\n if (result.status !== \"fulfilled\" || !result.value) continue;\n links = (links || []).concat(result.value);\n }\n\n return links;\n },\n async findDocumentHighlights(doc, params, cancel) {\n const results = await Promise.allSettled(\n plugins.map((plugin) =>\n plugin.findDocumentHighlights?.(doc, params, cancel),\n ),\n );\n\n if (cancel.isCancellationRequested) return;\n\n let highlights: DocumentHighlight[] | undefined;\n for (const result of results) {\n if (result.status !== \"fulfilled\" || !result.value) continue;\n highlights = (highlights || []).concat(result.value);\n }\n\n return highlights;\n },\n async findDocumentColors(doc, params, cancel) {\n const results = await Promise.allSettled(\n plugins.map((plugin) => plugin.findDocumentColors?.(doc, params, cancel)),\n );\n\n if (cancel.isCancellationRequested) return;\n\n let colors: ColorInformation[] | undefined;\n for (const result of results) {\n if (result.status !== \"fulfilled\" || !result.value) continue;\n colors = (colors || []).concat(result.value);\n }\n\n return colors;\n },\n async getColorPresentations(doc, params, cancel) {\n const results = await Promise.allSettled(\n plugins.map((plugin) =>\n plugin.getColorPresentations?.(doc, params, cancel),\n ),\n );\n\n if (cancel.isCancellationRequested) return;\n\n let presentations: ColorPresentation[] | undefined;\n for (const result of results) {\n if (result.status !== \"fulfilled\" || !result.value) continue;\n presentations = (presentations || []).concat(result.value);\n }\n\n return presentations;\n },\n async doHover(doc, params, cancel) {\n const results = await Promise.allSettled(\n plugins.map((plugin) => plugin.doHover?.(doc, params, cancel)),\n );\n\n if (cancel.isCancellationRequested) return;\n\n let hovers: Hover | undefined;\n for (const result of results) {\n if (result.status !== \"fulfilled\" || !result.value) continue;\n if (hovers) {\n hovers.range = maxRange(hovers.range, result.value.range);\n hovers.contents = mergeHoverContents(\n hovers.contents,\n result.value.contents,\n );\n } else {\n hovers = result.value;\n }\n }\n\n return hovers;\n },\n async doRename(doc, params, cancel) {\n const results = await Promise.allSettled(\n plugins.map((plugin) => plugin.doRename?.(doc, params, cancel)),\n );\n\n if (cancel.isCancellationRequested) return;\n\n let changes: WorkspaceEdit[\"changes\"];\n let changeAnnotations: WorkspaceEdit[\"changeAnnotations\"];\n let documentChanges: WorkspaceEdit[\"documentChanges\"];\n for (const result of results) {\n if (result.status !== \"fulfilled\" || !result.value) continue;\n const { value } = result;\n if (value.changes) {\n if (changes) {\n changes = { ...changes };\n\n for (const uri in value.changes) {\n changes[uri] = changes[uri]\n ? changes[uri].concat(value.changes[uri])\n : value.changes[uri];\n }\n } else {\n changes = value.changes;\n }\n }\n\n if (value.changeAnnotations) {\n changeAnnotations = changeAnnotations\n ? {\n ...changeAnnotations,\n ...value.changeAnnotations,\n }\n : value.changeAnnotations;\n }\n\n if (value.documentChanges) {\n documentChanges = documentChanges\n ? documentChanges.concat(value.documentChanges)\n : value.documentChanges;\n }\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 results = await Promise.allSettled(\n plugins.map((plugin) => plugin.doCodeActions?.(doc, params, cancel)),\n );\n\n if (cancel.isCancellationRequested) return;\n\n let actions: (Command | CodeAction)[] | undefined;\n for (const result of results) {\n if (result.status !== \"fulfilled\" || !result.value) continue;\n actions = (actions || []).concat(result.value);\n }\n\n return actions;\n },\n async doValidate(doc) {\n const results = await Promise.allSettled(\n plugins.map((plugin) => plugin.doValidate?.(doc)),\n );\n\n let diagnostics: Diagnostic[] | undefined;\n for (const result of results) {\n if (result.status !== \"fulfilled\" || !result.value) continue;\n diagnostics = (diagnostics || []).concat(result.value);\n }\n\n return diagnostics;\n },\n format: MarkoPlugin.format!,\n};\n\nfunction maxRange(a: Range | undefined, b: Range | undefined) {\n if (!a) return b;\n if (!b) return a;\n return {\n start: {\n line: Math.min(a.start.line, b.start.line),\n character: Math.min(a.start.character, b.start.character),\n },\n end: {\n line: Math.max(a.end.line, b.end.line),\n character: Math.max(a.end.character, b.end.character),\n },\n };\n}\n\nfunction mergeHoverContents(a: Hover[\"contents\"], b: Hover[\"contents\"]) {\n if (!a) return b;\n if (!b) return a;\n\n if (!MarkupContent.is(a)) {\n a = markedStringToMarkupContent(a);\n }\n\n if (!MarkupContent.is(b)) {\n b = markedStringToMarkupContent(b);\n }\n\n if (a.kind === b.kind) {\n return {\n kind: a.kind,\n value: `${a.value}\\n${b.value}`,\n };\n }\n\n return {\n kind: MarkupKind.Markdown,\n value: `${markupContentToMarkdown(a)}\\n${markupContentToMarkdown(b)}`,\n };\n}\n\nfunction markedStringToMarkupContent(\n markedString: MarkedString | MarkedString[],\n): MarkupContent {\n return {\n kind: MarkupKind.Markdown,\n value: Array.isArray(markedString)\n ? markedString.map((it) => markedStringToString(it)).join(\"\\n\")\n : markedStringToString(markedString),\n };\n}\n\nfunction markedStringToString(markedString: MarkedString) {\n if (typeof markedString === \"string\") {\n return markedString;\n }\n\n return `\\`\\`\\`${markedString.language}\\n${markedString.value}\\n\\`\\`\\``;\n}\n\nfunction markupContentToMarkdown(content: MarkupContent): string {\n return content.kind === MarkupKind.Markdown\n ? content.value\n : escapeMarkdown(content.value);\n}\n\nfunction escapeMarkdown(str: string) {\n return str.replace(REG_MARKDOWN_CHARS, \"$1\");\n}\n\nexport { service as default };\n", "import fs from \"fs\";\nimport {\n DidChangeTextDocumentParams,\n DidChangeWatchedFilesParams,\n DidCloseTextDocumentParams,\n DidOpenTextDocumentParams,\n FileChangeType,\n} from \"vscode-languageserver\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\nimport { URI } from \"vscode-uri\";\n\nexport type FileChangeHandler = (document: TextDocument | undefined) => void;\n\nconst docs = new Map<string, TextDocument>();\nconst openDocs = new Set<TextDocument>();\nconst fileExists = new Map<string, boolean>();\nconst fileChangeHandlers: Set<FileChangeHandler> = new Set();\n\nexport let projectVersion = 0;\n\nexport function onFileChange(handler: FileChangeHandler) {\n fileChangeHandlers.add(handler);\n}\n\nexport function getAllOpen() {\n return openDocs;\n}\n\nexport function get(uri: string) {\n const doc = docs.get(uri);\n if (doc) return doc;\n\n const { fsPath, scheme } = URI.parse(uri);\n if (scheme === \"file\") {\n if (fileExists.get(uri) === false) return undefined;\n try {\n const newDoc = TextDocument.create(\n uri,\n getLanguageId(uri),\n fs.statSync(fsPath).mtimeMs,\n fs.readFileSync(fsPath, \"utf-8\"),\n );\n\n docs.set(uri, newDoc);\n fileExists.set(uri, true);\n return newDoc;\n } catch {\n fileExists.set(uri, false);\n }\n }\n}\n\nexport function exists(uri: string) {\n const cached = fileExists.get(uri);\n if (cached !== undefined) return cached;\n\n const { fsPath, scheme } = URI.parse(uri);\n if (scheme === \"file\") {\n try {\n fs.accessSync(fsPath);\n fileExists.set(uri, true);\n return true;\n } catch {\n fileExists.set(uri, false);\n return false;\n }\n }\n\n return false;\n}\n\nexport function isOpen(doc: TextDocument) {\n return openDocs.has(doc);\n}\n\nexport function doOpen(params: DidOpenTextDocumentParams) {\n const ref = params.textDocument;\n const existingDoc = docs.get(ref.uri);\n projectVersion++;\n\n if (existingDoc) {\n if (existingDoc.version === ref.version) {\n openDocs.add(existingDoc);\n return;\n }\n\n openDocs.delete(existingDoc);\n docs.delete(ref.uri);\n }\n\n const newDoc = TextDocument.create(\n ref.uri,\n ref.languageId,\n ref.version,\n ref.text,\n );\n\n openDocs.add(newDoc);\n fileExists.set(ref.uri, true);\n docs.set(ref.uri, newDoc);\n}\n\nexport function doChange(params: DidChangeTextDocumentParams) {\n const ref = params.textDocument;\n const changes = params.contentChanges;\n const doc = docs.get(ref.uri);\n if (changes.length > 0 && ref.version != null && doc) {\n TextDocument.update(doc, changes, ref.version);\n emitFileChange(doc);\n }\n}\n\nexport function doClose(params: DidCloseTextDocumentParams) {\n const ref = params.textDocument;\n const doc = docs.get(ref.uri);\n if (doc) {\n projectVersion++;\n openDocs.delete(doc);\n\n if (URI.parse(ref.uri).scheme !== \"file\") {\n docs.delete(ref.uri);\n }\n }\n}\n\nexport function doChangeWatchedFiles(params: DidChangeWatchedFilesParams) {\n for (const change of params.changes) {\n switch (change.type) {\n case FileChangeType.Created:\n fileExists.set(change.uri, true);\n break;\n case FileChangeType.Deleted:\n case FileChangeType.Changed: {\n fileExists.set(change.uri, change.type === FileChangeType.Changed);\n\n // When a file that's in our cache is changed or deleted and not in an open editor\n // we clear the file from the cache since it will be reloaded when read.\n const doc = docs.get(change.uri);\n if (doc && !openDocs.has(doc)) {\n docs.delete(change.uri);\n }\n }\n }\n }\n\n emitFileChange(undefined);\n}\n\nfunction getLanguageId(uri: string) {\n const ext = uri.slice(uri.lastIndexOf(\".\") + 1);\n switch (ext) {\n case \"cjs\":\n case \"mjs\":\n case \"js\":\n return \"javascript\";\n case \"cts\":\n case \"mts\":\n case \"ts\":\n return \"typescript\";\n default:\n return ext;\n }\n}\n\nfunction emitFileChange(doc: TextDocument | undefined) {\n projectVersion++;\n\n for (const handler of fileChangeHandlers) {\n handler(doc);\n }\n}\n", "import { extractHTML, type Parsed } from \"@marko/language-tools\";\nimport axe from \"axe-core\";\nimport { JSDOM } from \"jsdom\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\n\nimport { getMarkoFile } from \"../../utils/file\";\nimport { get } from \"../../utils/text-documents\";\nimport type { Plugin } from \"../types\";\nimport { ruleExceptions } from \"./axe-rules/rule-exceptions\";\n\nconst extractCache = new WeakMap<Parsed, ReturnType<typeof extractHTML>>();\n\n// const axeViolationImpact: {\n// [impact in NonNullable<axe.ImpactValue>]: DiagnosticSeverity;\n// } = {\n// minor: 1,\n// moderate: 2,\n// serious: 3,\n// critical: 4,\n// };\n\nconst HTMLService: Partial<Plugin> = {\n commands: {\n \"$/showHtmlOutput\": async (uri: string) => {\n const doc = get(uri);\n if (!doc) return;\n\n const { extracted } = extract(doc);\n\n return {\n language: \"html\",\n content: extracted.toString(),\n };\n },\n },\n async doValidate(doc) {\n const { extracted, nodeDetails } = extract(doc);\n\n const jsdom = new JSDOM(extracted.toString(), {\n includeNodeLocations: true,\n });\n const { documentElement } = jsdom.window.document;\n\n const getViolationNodes = async (runOnly: string[]) =>\n (\n await axe.run(documentElement, {\n runOnly,\n rules: {\n \"color-contrast\": { enabled: false },\n },\n resultTypes: [\"violations\"],\n elementRef: true,\n })\n ).violations.flatMap(({ nodes, id }) =>\n nodes.map((node) => ({ ...node, ruleId: id })),\n );\n\n const release = await acquireMutexLock();\n const violations = await getViolationNodes(Object.keys(ruleExceptions));\n release();\n\n return violations.flatMap((result) => {\n const { element } = result;\n if (!element) return [];\n const ruleId = result.ruleId as keyof typeof ruleExceptions;\n\n if (element.dataset.markoNodeId) {\n const details = nodeDetails[element.dataset.markoNodeId];\n if (\n (ruleExceptions[ruleId].attrSpread && details.hasDynamicAttrs) ||\n (ruleExceptions[ruleId].unknownBody && details.hasDynamicBody) ||\n ruleExceptions[ruleId].dynamicAttrs?.some(\n (attr) => element.getAttribute(attr) === \"dynamic\",\n )\n ) {\n return [];\n }\n }\n\n const generatedLoc = jsdom.nodeLocation(element);\n if (!generatedLoc) return [];\n\n const sourceRange = extracted.sourceLocationAt(\n generatedLoc.startOffset + 1,\n generatedLoc.startOffset + 1 + element.tagName.length,\n );\n if (!sourceRange) return [];\n\n return [\n {\n range: sourceRange,\n severity: 3,\n source: `axe-core(${ruleId})`,\n message: result.failureSummary ?? \"unknown accessibility issue\",\n },\n ];\n });\n },\n};\n\nfunction extract(doc: TextDocument) {\n const { parsed } = getMarkoFile(doc);\n let cached = extractCache.get(parsed);\n\n if (!cached) {\n cached = extractHTML(parsed);\n extractCache.set(parsed, cached);\n }\n\n return cached;\n}\n\nlet lock: Promise<void> | undefined;\nasync function acquireMutexLock() {\n const currLock = lock;\n let resolve!: () => void;\n lock = new Promise((_) => (resolve = _));\n await currLock;\n return resolve;\n}\n\nexport default HTMLService;\n", "import type { TaglibLookup } from \"@marko/compiler/babel-utils\";\nimport { parse, type Parsed, Project } from \"@marko/language-tools\";\nimport path from \"path\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport { URI } from \"vscode-uri\";\n\nconst processorCaches = new WeakMap<Parsed, Map<unknown, unknown>>();\n\nexport interface MarkoFile {\n uri: string;\n scheme: string;\n version: number;\n lookup: TaglibLookup;\n filename: string | undefined;\n dirname: string | undefined;\n parsed: Parsed;\n code: string;\n}\n\nexport function getFSDir(doc: TextDocument): string | undefined {\n const filename = getFSPath(doc);\n return filename && path.dirname(filename);\n}\n\nexport function getFSPath(doc: TextDocument): string | undefined {\n const parsed = URI.parse(doc.uri);\n return parsed.scheme === \"file\" ? parsed.fsPath : undefined;\n}\n\nexport function getMarkoFile(doc: TextDocument): MarkoFile {\n const { uri } = doc;\n const { fsPath, scheme } = URI.parse(uri);\n const filename = scheme === \"file\" ? fsPath : undefined;\n const dirname = filename ? path.dirname(filename) : process.cwd();\n const cache = Project.getCache(dirname) as Map<TextDocument, MarkoFile>;\n let file = cache.get(doc);\n if (!file) {\n const { version } = doc;\n const code = doc.getText();\n const parsed = parse(code, filename);\n const lookup = Project.getTagLookup(dirname);\n cache.set(\n doc,\n (file = {\n uri,\n scheme,\n version,\n lookup,\n filename,\n dirname,\n parsed,\n code,\n }),\n );\n }\n\n return file;\n}\n\nexport function clearMarkoCacheForFile(doc: TextDocument) {\n (Project.getCache(getFSDir(doc)) as Map<TextDocument, MarkoFile>).delete(doc);\n}\n\n/**\n * Run some processing against a parsed document and cache the result.\n * Anytime the document changes, the cache is cleared.\n */\nexport function processDoc<T>(\n doc: TextDocument,\n process: (file: MarkoFile) => T,\n): T {\n const file = getMarkoFile(doc);\n const cache = processorCaches.get(file.parsed) as\n | Map<typeof process, T>\n | undefined;\n let result: T | undefined;\n\n if (cache) {\n result = cache.get(process);\n if (!result) {\n result = process(file);\n cache.set(process, result);\n }\n } else {\n result = process(file);\n processorCaches.set(file.parsed, new Map([[process, result]]));\n }\n\n return result;\n}\n", "export const keyboard = {\n /**\n * - Ensure every accesskey attribute value is unique\n * - accesskey attribute value should be unique ([url](https://dequeuniversity.com/rules/axe/4.10/accesskeys?application=axeAPI))\n */\n accesskeys: \"accesskeys\",\n /**\n * - Ensure each page has at least one mechanism for a user to bypass navigation and jump straight to the content\n * - Page must have means to bypass repeated blocks ([url](https://dequeuniversity.com/rules/axe/4.10/bypass?application=axeAPI))\n */\n bypass: \"bypass\",\n /**\n * - Ensure elements in the focus order have a role appropriate for interactive content\n * - Elements in the focus order should have an appropriate role ([url](https://dequeuniversity.com/rules/axe/4.10/focus-order-semantics?application=axeAPI))\n */\n focusOrderSemantics: \"focus-order-semantics\",\n /**\n * - Ensure `<frame>` and `<iframe>` elements with focusable content do not have tabindex=-1\n * - Frames with focusable content must not have tabindex=-1 ([url](https://dequeuniversity.com/rules/axe/4.10/frame-focusable-content?application=axeAPI))\n */\n frameFocusableContent: \"frame-focusable-content\",\n /**\n * - Ensure interactive controls are not nested as they are not always announced by screen readers or can cause focus problems for assistive technologies\n * - Interactive controls must not be nested ([url](https://dequeuniversity.com/rules/axe/4.10/nested-interactive?application=axeAPI))\n */\n nestedInteractive: \"nested-interactive\",\n /**\n * - Ensure all page content is contained by landmarks\n * - All page content should be contained by landmarks ([url](https://dequeuniversity.com/rules/axe/4.10/region?application=axeAPI))\n */\n region: \"region\",\n /**\n * - Ensure elements that have scrollable content are accessible by keyboard\n * - Scrollable region must have keyboard access ([url](https://dequeuniversity.com/rules/axe/4.10/scrollable-region-focusable?application=axeAPI))\n */\n scrollableRegionFocusable: \"scrollable-region-focusable\",\n /**\n * - Ensure all skip links have a focusable target\n * - The skip-link target should exist and be focusable ([url](https://dequeuniversity.com/rules/axe/4.10/skip-link?application=axeAPI))\n */\n skipLink: \"skip-link\",\n /**\n * - Ensure tabindex attribute values are not greater than 0\n * - Elements should not have tabindex greater than zero ([url](https://dequeuniversity.com/rules/axe/4.10/tabindex?application=axeAPI))\n */\n tabindex: \"tabindex\",\n} as const;\n\nexport const textAlternatives = {\n /**\n * - Ensure `<area>` elements of image maps have alternate text\n * - Active `<area>` elements must have alternate text ([url](https://dequeuniversity.com/rules/axe/4.10/area-alt?application=axeAPI))\n */\n areaAlt: \"area-alt\",\n /**\n * - Ensure each HTML document contains a non-empty `<title>` element\n * - Documents must have `<title>` element to aid in navigation ([url](https://dequeuniversity.com/rules/axe/4.10/document-title?application=axeAPI))\n */\n documentTitle: \"document-title\",\n /**\n * - Ensure `<iframe>` and `<frame>` elements contain a unique title attribute\n * - Frames must have a unique title attribute ([url](https://dequeuniversity.com/rules/axe/4.10/frame-title-unique?application=axeAPI))\n */\n frameTitleUnique: \"frame-title-unique\",\n /**\n * - Ensure `<iframe>` and `<frame>` elements have an accessible name\n * - Frames must have an accessible name ([url](https://dequeuniversity.com/rules/axe/4.10/frame-title?application=axeAPI))\n */\n frameTitle: \"frame-title\",\n /**\n * - Ensure `<img>` elements have alternate text or a role of none or presentation\n * - Images must have alternate text ([url](https://dequeuniversity.com/rules/axe/4.10/image-alt?application=axeAPI))\n */\n imageAlt: \"image-alt\",\n /**\n * - Ensure image alternative is not repeated as text\n * - Alternative text of images should not be repeated as text ([url](https://dequeuniversity.com/rules/axe/4.10/image-redundant-alt?application=axeAPI))\n */\n imageRedundantAlt: \"image-redundant-alt\",\n /**\n * - Ensure `<input type=\"image\">` elements have alternate text\n * - Image buttons must have alternate text ([url](https://dequeuniversity.com/rules/axe/4.10/input-image-alt?application=axeAPI))\n */\n inputImageAlt: \"input-image-alt\",\n /**\n * - Ensure `<object>` elements have alternate text\n * - `<object>` elements must have alternate text ([url](https://dequeuniversity.com/rules/axe/4.10/object-alt?application=axeAPI))\n */\n objectAlt: \"object-alt\",\n /**\n * - Ensure [role=\"img\"] elements have alternate text\n * - [role=\"img\"] elements must have an alternative text ([url](https://dequeuniversity.com/rules/axe/4.10/role-img-alt?application=axeAPI))\n */\n roleImgAlt: \"role-img-alt\",\n /**\n * - Ensure that server-side image maps are not used\n * - Server-side image maps must not be used ([url](https://dequeuniversity.com/rules/axe/4.10/server-side-image-map?application=axeAPI))\n */\n serverSideImageMap: \"server-side-image-map\",\n /**\n * - Ensure `<svg>` elements with an img, graphics-document or graphics-symbol role have an accessible text\n * - `<svg>` elements with an img role must have an alternative text ([url](https://dequeuniversity.com/rules/axe/4.10/svg-img-alt?application=axeAPI))\n */\n svgImgAlt: \"svg-img-alt\",\n /**\n * - Ensure `<video>` elements have captions\n * - `<video>` elements must have captions ([url](https://dequeuniversity.com/rules/axe/4.10/video-caption?application=axeAPI))\n */\n videoCaption: \"video-caption\",\n} as const;\n\nexport const aria = {\n /**\n * - Ensure an element's role supports its ARIA attributes\n * - Elements must only use supported ARIA attributes ([url](https://dequeuniversity.com/rules/axe/4.10/aria-allowed-attr?application=axeAPI))\n */\n ariaAllowedAttr: \"aria-allowed-attr\",\n /**\n * - Ensure role attribute has an appropriate value for the element\n * - ARIA role should be appropriate for the element ([url](https://dequeuniversity.com/rules/axe/4.10/aria-allowed-role?application=axeAPI))\n */\n ariaAllowedRole: \"aria-allowed-role\",\n /**\n * - Ensure aria-braillelabel and aria-brailleroledescription have a non-braille equivalent\n * - aria-braille attributes must have a non-braille equivalent ([url](https://dequeuniversity.com/rules/axe/4.10/aria-braille-equivalent?application=axeAPI))\n */\n ariaBrailleEquivalent: \"aria-braille-equivalent\",\n /**\n * - Ensure every ARIA button, link and menuitem has an accessible name\n * - ARIA commands must have an accessible name ([url](https://dequeuniversity.com/rules/axe/4.10/aria-command-name?application=axeAPI))\n */\n ariaCommandName: \"aria-command-name\",\n /**\n * - Ensure ARIA attributes are used as described in the specification of the element's role\n * - ARIA attributes must be used as specified for the element's role ([url](https://dequeuniversity.com/rules/axe/4.10/aria-conditional-attr?application=axeAPI))\n */\n ariaConditionalAttr: \"aria-conditional-attr\",\n /**\n * - Ensure elements do not use deprecated roles\n * - Deprecated ARIA roles must not be used ([url](https://dequeuniversity.com/rules/axe/4.10/aria-deprecated-role?application=axeAPI))\n */\n ariaDeprecatedRole: \"aria-deprecated-role\",\n /**\n * - Ensure every ARIA dialog and alertdialog node has an accessible name\n * - ARIA dialog and alertdialog nodes should have an accessible name ([url](https://dequeuniversity.com/rules/axe/4.10/aria-dialog-name?application=axeAPI))\n */\n ariaDialogName: \"aria-dialog-name\",\n /**\n * - Ensure aria-hidden=\"true\" is not present on the document body.\n * - aria-hidden=\"true\" must not be present on the document body ([url](https://dequeuniversity.com/rules/axe/4.10/aria-hidden-body?application=axeAPI))\n */\n ariaHiddenBody: \"aria-hidden-body\",\n /**\n * - Ensure every ARIA input field has an accessible name\n * - ARIA input fields must have an accessible name ([url](https://dequeuniversity.com/rules/axe/4.10/aria-input-field-name?application=axeAPI))\n */\n ariaInputFieldName: \"aria-input-field-name\",\n /**\n * - Ensure every ARIA meter node has an accessible name\n * - ARIA meter nodes must have an accessible name ([url](https://dequeuniversity.com/rules/axe/4.10/aria-meter-name?application=axeAPI))\n */\n ariaMeterName: \"aria-meter-name\",\n /**\n * - Ensure every ARIA progressbar node has an accessible name\n * - ARIA progressbar nodes must have an accessible name ([url](https://dequeuniversity.com/rules/axe/4.10/aria-progressbar-name?application=axeAPI))\n */\n ariaProgressbarName: \"aria-progressbar-name\",\n /**\n * - Ensure ARIA attributes are not prohibited for an element's role\n * - Elements must only use permitted ARIA attributes ([url](https://dequeuniversity.com/rules/axe/4.10/aria-prohibited-attr?application=axeAPI))\n */\n ariaProhibitedAttr: \"aria-prohibited-attr\",\n /**\n * - Ensure elements with ARIA roles have all required ARIA attributes\n * - Required ARIA attributes must be provided ([url](https://dequeuniversity.com/rules/axe/4.10/aria-required-attr?application=axeAPI))\n */\n ariaRequiredAttr: \"aria-required-attr\",\n /**\n * - Ensure elements with an ARIA role that require child roles contain them\n * - Certain ARIA roles must contain particular children ([url](https://dequeuniversity.com/rules/axe/4.10/aria-required-children?application=axeAPI))\n */\n ariaRequiredChildren: \"aria-required-children\",\n /**\n * - Ensure elements with an ARIA role that require parent roles are contained by them\n * - Certain ARIA roles must be contained by particular parents ([url](https://dequeuniversity.com/rules/axe/4.10/aria-required-parent?application=axeAPI))\n */\n ariaRequiredParent: \"aria-required-parent\",\n /**\n * - Ensure aria-roledescription is only used on elements with an implicit or explicit role\n * - aria-roledescription must be on elements with a semantic role ([url](https://dequeuniversity.com/rules/axe/4.10/aria-roledescription?application=axeAPI))\n */\n ariaRoledescription: \"aria-roledescription\",\n /**\n * - Ensure all elements with a role attribute use a valid value\n * - ARIA roles used must conform to valid values ([url](https://dequeuniversity.com/rules/axe/4.10/aria-roles?application=axeAPI))\n */\n ariaRoles: \"aria-roles\",\n /**\n * - Ensure role=\"text\" is used on elements with no focusable descendants\n * - \"role=text\" should have no focusable descendants ([url](https://dequeuniversity.com/rules/axe/4.10/aria-text?application=axeAPI))\n */\n ariaText: \"aria-text\",\n /**\n * - Ensure every ARIA toggle field has an accessible name\n * - ARIA toggle fields must have an accessible name ([url](https://dequeuniversity.com/rules/axe/4.10/aria-toggle-field-name?application=axeAPI))\n */\n ariaToggleFieldName: \"aria-toggle-field-name\",\n /**\n * - Ensure every ARIA tooltip node has an accessible name\n * - ARIA tooltip nodes must have an accessible name ([url](https://dequeuniversity.com/rules/axe/4.10/aria-tooltip-name?application=axeAPI))\n */\n ariaTooltipName: \"aria-tooltip-name\",\n /**\n * - Ensure every ARIA treeitem node has an accessible name\n * - ARIA treeitem nodes should have an accessible name ([url](https://dequeuniversity.com/rules/axe/4.10/aria-treeitem-name?application=axeAPI))\n */\n ariaTreeitemName: \"aria-treeitem-name\",\n /**\n * - Ensure all ARIA attributes have valid values\n * - ARIA attributes must conform to valid values ([url](https://dequeuniversity.com/rules/axe/4.10/aria-valid-attr-value?application=axeAPI))\n */\n ariaValidAttrValue: \"aria-valid-attr-value\",\n /**\n * - Ensure attributes that begin with aria- are valid ARIA attributes\n * - ARIA attributes must conform to valid names ([url](https://dequeuniversity.com/rules/axe/4.10/aria-valid-attr?application=axeAPI))\n */\n ariaValidAttr: \"aria-valid-attr\",\n /**\n * - Elements marked as presentational should not have global ARIA or tabindex to ensure all screen readers ignore them\n * - Ensure elements marked as presentational are consistently ignored ([url](https://dequeuniversity.com/rules/axe/4.10/presentation-role-conflict?application=axeAPI))\n */\n presentationRoleConflict: \"presentation-role-conflict\",\n} as const;\n\nexport const nameRoleValue = {\n /**\n * - Ensure aria-hidden elements are not focusable nor contain focusable elements\n * - ARIA hidden element must not be focusable or contain focusable elements ([url](https://dequeuniversity.com/rules/axe/4.10/aria-hidden-focus?application=axeAPI))\n */\n ariaHiddenFocus: \"aria-hidden-focus\",\n /**\n * - Ensure buttons have discernible text\n * - Buttons must have discernible text ([url](https://dequeuniversity.com/rules/axe/4.10/button-name?application=axeAPI))\n */\n buttonName: \"button-name\",\n /**\n * - Ensure headings have discernible text\n * - Headings should not be empty ([url](https://dequeuniversity.com/rules/axe/4.10/empty-heading?application=axeAPI))\n */\n emptyHeading: \"empty-heading\",\n /**\n * - Ensure table headers have discernible text\n * - Table header text should not be empty ([url](https://dequeuniversity.com/rules/axe/4.10/empty-table-header?application=axeAPI))\n */\n emptyTableHeader: \"empty-table-header\",\n /**\n * - Ensure input buttons have discernible text\n * - Input buttons must have discernible text ([url](https://dequeuniversity.com/rules/axe/4.10/input-button-name?application=axeAPI))\n */\n inputButtonName: \"input-button-name\",\n /**\n * - Ensure links have discernible text\n * - Links must have discernible text ([url](https://dequeuniversity.com/rules/axe/4.10/link-name?application=axeAPI))\n */\n linkName: \"link-name\",\n /**\n * - Ensure summary elements have discernible text\n * - Summary elements must have discernible text ([url](https://dequeuniversity.com/rules/axe/4.10/summary-name?application=axeAPI))\n */\n summaryName: \"summary-name\",\n} as const;\n\nexport const timeAndMedia = {\n /**\n * - Ensure `<audio>` elements have captions\n * - `<audio>` elements must have a captions track ([url](https://dequeuniversity.com/rules/axe/4.10/audio-caption?application=axeAPI))\n */\n audioCaption: \"audio-caption\",\n /**\n * - Ensure `<blink>` elements are not used\n * - `<blink>` elements are deprecated and must not be used ([url](https://dequeuniversity.com/rules/axe/4.10/blink?application=axeAPI))\n */\n blink: \"blink\",\n /**\n * - Ensure `<meta http-equiv=\"refresh\">` is not used for delayed refresh\n * - Delayed refresh must not be used ([url](https://dequeuniversity.com/rules/axe/4.10/meta-refresh-no-exceptions?application=axeAPI))\n */\n metaRefreshNoExceptions: \"meta-refresh-no-exceptions\",\n /**\n * - Ensure `<meta http-equiv=\"refresh\">` is not used for delayed refresh\n * - Delayed refresh under 20 hours must not be used ([url](https://dequeuniversity.com/rules/axe/4.10/meta-refresh?application=axeAPI))\n */\n metaRefresh: \"meta-refresh\",\n /**\n * - Ensure `<video>` or `<audio>` elements do not autoplay audio for more than 3 seconds without a control mechanism to stop or mute the audio\n * - `<video>` or `<audio>` elements must not play automatically ([url](https://dequeuniversity.com/rules/axe/4.10/no-autoplay-audio?application=axeAPI))\n */\n noAutoplayAudio: \"no-autoplay-audio\",\n} as const;\n\nexport const forms = {\n /**\n * - Ensure the autocomplete attribute is correct and suitable for the form field\n * - autocomplete attribute must be used correctly ([url](https://dequeuniversity.com/rules/axe/4.10/autocomplete-valid?application=axeAPI))\n */\n autocompleteValid: \"autocomplete-valid\",\n /**\n * - Ensure form field does not have multiple label elements\n * - Form field must not have multiple label elements ([url](https://dequeuniversity.com/rules/axe/4.10/form-field-multiple-labels?application=axeAPI))\n */\n formFieldMultipleLabels: \"form-field-multiple-labels\",\n /**\n * - Ensure that every form element has a visible label and is not solely labeled using hidden labels, or the title or aria-describedby attributes\n * - Form elements should have a visible label ([url](https://dequeuniversity.com/rules/axe/4.10/label-title-only?application=axeAPI))\n */\n labelTitleOnly: \"label-title-only\",\n /**\n * - Ensure every form element has a label\n * - Form elements must have labels ([url](https://dequeuniversity.com/rules/axe/4.10/label?application=axeAPI))\n */\n label: \"label\",\n /**\n * - Ensure select element has an accessible name\n * - Select element must have an accessible name ([url](https://dequeuniversity.com/rules/axe/4.10/select-name?application=axeAPI))\n */\n selectName: \"select-name\",\n} as const;\n\nexport const structure = {\n /**\n * - Ensure that text spacing set through style attributes can be adjusted with custom stylesheets\n * - Inline text spacing must be adjustable with custom stylesheets ([url](https://dequeuniversity.com/rules/axe/4.10/avoid-inline-spacing?application=axeAPI))\n */\n avoidInlineSpacing: \"avoid-inline-spacing\",\n /**\n * - Ensure content is not locked to any specific display orientation, and the content is operable in all display orientations\n * - CSS Media queries must not lock display orientation ([url](https://dequeuniversity.com/rules/axe/4.10/css-orientation-lock?application=axeAPI))\n */\n cssOrientationLock: \"css-orientation-lock\",\n /**\n * - Ensure `<dl>` elements are structured correctly\n * - `<dl>` elements must only directly contain properly-ordered `<dt>` and `<dd>` groups, `<script>`, `<template>` or `<div>` elements ([url](https://dequeuniversity.com/rules/axe/4.10/definition-list?application=axeAPI))\n */\n definitionList: \"definition-list\",\n /**\n * - Ensure `<dt>` and `<dd>` elements are contained by a `<dl>`\n * - `<dt>` and `<dd>` elements must be contained by a `<dl>` ([url](https://dequeuniversity.com/rules/axe/4.10/dlitem?application=axeAPI))\n */\n dlitem: \"dlitem\",\n /**\n * - Ensure `<iframe>` and `<frame>` elements contain the axe-core script\n * - Frames should be tested with axe-core ([url](https://dequeuniversity.com/rules/axe/4.10/frame-tested?application=axeAPI))\n */\n frameTested: \"frame-tested\",\n /**\n * - Informs users about hidden content.\n * - Hidden content on the page should be analyzed ([url](https://dequeuniversity.com/rules/axe/4.10/hidden-content?application=axeAPI))\n */\n hiddenContent: \"hidden-content\",\n /**\n * - Ensure that lists are structured correctly\n * - `<ul>` and `<ol>` must only directly contain `<li>`, `<script>` or `<template>` elements ([url](https://dequeuniversity.com/rules/axe/4.10/list?application=axeAPI))\n */\n list: \"list\",\n /**\n * - Ensure `<li>` elements are used semantically\n * - `<li>` elements must be contained in a `<ul>` or `<ol>` ([url](https://dequeuniversity.com/rules/axe/4.10/listitem?application=axeAPI))\n */\n listitem: \"listitem\",\n} as const;\n\nexport const color = {\n /**\n * - Ensure the contrast between foreground and background colors meets WCAG 2 AAA enhanced contrast ratio thresholds\n * - Elements must meet enhanced color contrast ratio thresholds ([url](https://dequeuniversity.com/rules/axe/4.10/color-contrast-enhanced?application=axeAPI))\n */\n colorContrastEnhanced: \"color-contrast-enhanced\",\n /**\n * - Ensure the contrast between foreground and background colors meets WCAG 2 AA minimum contrast ratio thresholds\n * - Elements must meet minimum color contrast ratio thresholds ([url](https://dequeuniversity.com/rules/axe/4.10/color-contrast?application=axeAPI))\n */\n colorContrast: \"color-contrast\",\n /**\n * - Ensure links are distinguished from surrounding text in a way that does not rely on color\n * - Links must be distinguishable without relying on color ([url](https://dequeuniversity.com/rules/axe/4.10/link-in-text-block?application=axeAPI))\n */\n linkInTextBlock: \"link-in-text-block\",\n} as const;\n\nexport const parsing = {\n /**\n * - Ensure every id attribute value of active elements is unique\n * - IDs of active elements must be unique ([url](https://dequeuniversity.com/rules/axe/4.10/duplicate-id-active?application=axeAPI))\n */\n duplicateIdActive: \"duplicate-id-active\",\n /**\n * - Ensure every id attribute value used in ARIA and in labels is unique\n * - IDs used in ARIA and labels must be unique ([url](https://dequeuniversity.com/rules/axe/4.10/duplicate-id-aria?application=axeAPI))\n */\n duplicateIdAria: \"duplicate-id-aria\",\n /**\n * - Ensure every id attribute value is unique\n * - id attribute value must be unique ([url](https://dequeuniversity.com/rules/axe/4.10/duplicate-id?application=axeAPI))\n */\n duplicateId: \"duplicate-id\",\n /**\n * - Ensure `<marquee>` elements are not used\n * - `<marquee>` elements are deprecated and must not be used ([url](https://dequeuniversity.com/rules/axe/4.10/marquee?application=axeAPI))\n */\n marquee: \"marquee\",\n} as const;\n\nexport const semantics = {\n /**\n * - Ensure the order of headings is semantically correct\n * - Heading levels should only increase by one ([url](https://dequeuniversity.com/rules/axe/4.10/heading-order?application=axeAPI))\n */\n headingOrder: \"heading-order\",\n /**\n * - Ensure that links with the same accessible name serve a similar purpose\n * - Links with the same name must have a similar purpose ([url](https://dequeuniversity.com/rules/axe/4.10/identical-links-same-purpose?application=axeAPI))\n */\n identicalLinksSamePurpose: \"identical-links-same-purpose\",\n /**\n * - Ensure that elements labelled through their content must have their visible text as part of their accessible name\n * - Elements must have their visible text as part of their accessible name ([url](https://dequeuniversity.com/rules/axe/4.10/label-content-name-mismatch?application=axeAPI))\n */\n labelContentNameMismatch: \"label-content-name-mismatch\",\n /**\n * - Ensure the banner landmark is at top level\n * - Banner landmark should not be contained in another landmark ([url](https://dequeuniversity.com/rules/axe/4.10/landmark-banner-is-top-level?application=axeAPI))\n */\n landmarkBannerIsTopLevel: \"landmark-banner-is-top-level\",\n /**\n * - Ensure the complementary landmark or aside is at top level\n * - Aside should not be contained in another landmark ([url](https://dequeuniversity.com/rules/axe/4.10/landmark-complementary-is-top-level?application=axeAPI))\n */\n landmarkComplementaryIsTopLevel: \"landmark-complementary-is-top-level\",\n /**\n * - Ensure the contentinfo landmark is at top level\n * - Contentinfo landmark should not be contained in another landmark ([url](https://dequeuniversity.com/rules/axe/4.10/landmark-contentinfo-is-top-level?application=axeAPI))\n */\n landmarkContentinfoIsTopLevel: \"landmark-contentinfo-is-top-level\",\n /**\n * - Ensure the main landmark is at top level\n * - Main landmark should not be contained in another landmark ([url](https://dequeuniversity.com/rules/axe/4.10/landmark-main-is-top-level?application=axeAPI))\n */\n landmarkMainIsTopLevel: \"landmark-main-is-top-level\",\n /**\n * - Ensure the document has at most one banner landmark\n * - Document should not have more than one banner landmark ([url](https://dequeuniversity.com/rules/axe/4.10/landmark-no-duplicate-banner?application=axeAPI))\n */\n landmarkNoDuplicateBanner: \"landmark-no-duplicate-banner\",\n /**\n * - Ensure the document has at most one contentinfo landmark\n * - Document should not have more than one contentinfo landmark ([url](https://dequeuniversity.com/rules/axe/4.10/landmark-no-duplicate-contentinfo?application=axeAPI))\n */\n landmarkNoDuplicateContentinfo: \"landmark-no-duplicate-contentinfo\",\n /**\n * - Ensure the document has at most one main landmark\n * - Document should not have more than one main landmark ([url](https://dequeuniversity.com/rules/axe/4.10/landmark-no-duplicate-main?application=axeAPI))\n */\n landmarkNoDuplicateMain: \"landmark-no-duplicate-main\",\n /**\n * - Ensure the document has a main landmark\n * - Document should have one main landmark ([url](https://dequeuniversity.com/rules/axe/4.10/landmark-one-main?application=axeAPI))\n */\n landmarkOneMain: \"landmark-one-main\",\n /**\n * - Ensure landmarks are unique\n * - Landmarks should have a unique role or role/label/title (i.e. accessible name) combination ([url](https://dequeuniversity.com/rules/axe/4.10/landmark-unique?application=axeAPI))\n */\n landmarkUnique: \"landmark-unique\",\n /**\n * - Ensure bold, italic text and font-size is not used to style `<p>` elements as a heading\n * - Styled `<p>` elements must not be used as headings ([url](https://dequeuniversity.com/rules/axe/4.10/p-as-heading?application=axeAPI))\n */\n pAsHeading: \"p-as-heading\",\n /**\n * - Ensure that the page, or at least one of its frames contains a level-one heading\n * - Page should contain a level-one heading ([url](https://dequeuniversity.com/rules/axe/4.10/page-has-heading-one?application=axeAPI))\n */\n pageHasHeadingOne: \"page-has-heading-one\",\n} as const;\n\nexport const language = {\n /**\n * - Ensure every HTML document has a lang attribute\n * - `<html>` element must have a lang attribute ([url](https://dequeuniversity.com/rules/axe/4.10/html-has-lang?application=axeAPI))\n */\n htmlHasLang: \"html-has-lang\",\n /**\n * - Ensure the lang attribute of the `<html>` element has a valid value\n * - `<html>` element must have a valid value for the lang attribute ([url](https://dequeuniversity.com/rules/axe/4.10/html-lang-valid?application=axeAPI))\n */\n htmlLangValid: \"html-lang-valid\",\n /**\n * - Ensure that HTML elements with both valid lang and xml:lang attributes agree on the base language of the page\n * - HTML elements with lang and xml:lang must have the same base language ([url](https://dequeuniversity.com/rules/axe/4.10/html-xml-lang-mismatch?application=axeAPI))\n */\n htmlXmlLangMismatch: \"html-xml-lang-mismatch\",\n /**\n * - Ensure lang attributes have valid values\n * - lang attribute must have a valid value ([url](https://dequeuniversity.com/rules/axe/4.10/valid-lang?application=axeAPI))\n */\n validLang: \"valid-lang\",\n} as const;\n\nexport const sensoryAndVisualCues = {\n /**\n * - Ensure `<meta name=\"viewport\">` can scale a significant amount\n * - Users should be able to zoom and scale the text up to 500% ([url](https://dequeuniversity.com/rules/axe/4.10/meta-viewport-large?application=axeAPI))\n */\n metaViewportLarge: \"meta-viewport-large\",\n /**\n * - Ensure `<meta name=\"viewport\">` does not disable text scaling and zooming\n * - Zooming and scaling must not be disabled ([url](https://dequeuniversity.com/rules/axe/4.10/meta-viewport?application=axeAPI))\n */\n metaViewport: \"meta-viewport\",\n /**\n * - Ensure touch targets have sufficient size and space\n * - All touch targets must be 24px large, or leave sufficient space ([url](https://dequeuniversity.com/rules/axe/4.10/target-size?application=axeAPI))\n */\n targetSize: \"target-size\",\n} as const;\n\nexport const tables = {\n /**\n * - Ensure the scope attribute is used correctly on tables\n * - scope attribute should be used correctly ([url](https://dequeuniversity.com/rules/axe/4.10/scope-attr-valid?application=axeAPI))\n */\n scopeAttrValid: \"scope-attr-valid\",\n /**\n * - Ensure the `<caption>` element does not contain the same text as the summary attribute\n * - Tables should not have the same summary and caption ([url](https://dequeuniversity.com/rules/axe/4.10/table-duplicate-name?application=axeAPI))\n */\n tableDuplicateName: \"table-duplicate-name\",\n /**\n * - Ensure that tables with a caption use the `<caption>` element.\n * - Data or header cells must not be used to give caption to a data table. ([url](https://dequeuniversity.com/rules/axe/4.10/table-fake-caption?application=axeAPI))\n */\n tableFakeCaption: \"table-fake-caption\",\n /**\n * - Ensure that each non-empty data cell in a `<table>` larger than 3 by 3 has one or more table headers\n * - Non-empty `<td>` elements in larger `<table>` must have an associated table header ([url](https://dequeuniversity.com/rules/axe/4.10/td-has-header?application=axeAPI))\n */\n tdHasHeader: \"td-has-header\",\n /**\n * - Ensure that each cell in a table that uses the headers attribute refers only to other cells in that table\n * - Table cells that use the headers attribute must only refer to cells in the same table ([url](https://dequeuniversity.com/rules/axe/4.10/td-headers-attr?application=axeAPI))\n */\n tdHeadersAttr: \"td-headers-attr\",\n /**\n * - Ensure that `<th>` elements and elements with role=columnheader/rowheader have data cells they describe\n * - Table headers in a data table must refer to data cells ([url](https://dequeuniversity.com/rules/axe/4.10/th-has-data-cells?application=axeAPI))\n */\n thHasDataCells: \"th-has-data-cells\",\n} as const;\n", "import * as r from \"./axe-rules\";\n\ntype UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (\n k: infer I,\n) => void\n ? I\n : never;\ntype AllRules = UnionToIntersection<(typeof r)[keyof typeof r]>;\ntype RuleId = AllRules[keyof AllRules];\n\nexport interface Exceptions {\n /**\n * Exclude if the listed attributes have a dynamic value\n */\n dynamicAttrs?: string[];\n /**\n * Exclude if the tag has a spread attribute\n */\n attrSpread?: boolean;\n /**\n * Exclude if the body content can't be determined\n */\n unknownBody?: boolean;\n}\n\ntype Blacklist =\n // Explicitly blacklisted for Marko Language Server\n | typeof r.structure.frameTested\n // Requires a parent component to validate; we can potentially add support with child component analysis\n | typeof r.aria.ariaRequiredParent\n | typeof r.forms.label\n | typeof r.forms.labelTitleOnly\n | typeof r.forms.selectName\n | typeof r.keyboard.bypass\n | typeof r.keyboard.nestedInteractive\n | typeof r.keyboard.region\n | typeof r.semantics.headingOrder\n | typeof r.semantics.landmarkBannerIsTopLevel\n | typeof r.semantics.landmarkComplementaryIsTopLevel\n | typeof r.semantics.landmarkContentinfoIsTopLevel\n | typeof r.semantics.landmarkMainIsTopLevel\n | typeof r.semantics.landmarkOneMain\n | typeof r.semantics.pageHasHeadingOne\n | typeof r.structure.dlitem\n | typeof r.structure.listitem\n | typeof r.tables.tdHeadersAttr\n // Seemingly broken in axe-core or JSDom\n | typeof r.aria.ariaRoledescription\n | typeof r.aria.ariaValidAttr\n | typeof r.color.colorContrast\n | typeof r.color.colorContrastEnhanced\n | typeof r.color.linkInTextBlock\n | typeof r.keyboard.scrollableRegionFocusable\n | typeof r.parsing.duplicateId\n | typeof r.parsing.duplicateIdActive\n | typeof r.parsing.duplicateIdAria\n | typeof r.sensoryAndVisualCues.targetSize\n | typeof r.structure.avoidInlineSpacing\n // handled by TypeScript\n | typeof r.aria.ariaValidAttrValue\n | typeof r.aria.ariaAllowedAttr\n // blacklisted as the rules are in axe-core experimental phase\n | typeof r.structure.cssOrientationLock\n | typeof r.keyboard.focusOrderSemantics\n | typeof r.structure.hiddenContent\n | typeof r.semantics.labelContentNameMismatch\n | typeof r.semantics.pAsHeading\n | typeof r.tables.tableFakeCaption\n | typeof r.tables.tdHasHeader;\n\ntype Whitelist = Exclude<RuleId, Blacklist>;\n\n// utility variables so the objects don't all need `: true` everywhere\nconst unknownBody = true;\nconst attrSpread = true;\n\nexport const ruleExceptions: { [id in Whitelist]: Exceptions } = {\n [r.aria.ariaAllowedRole]: { dynamicAttrs: [\"role\"] },\n [r.aria.ariaBrailleEquivalent]: { attrSpread },\n [r.aria.ariaCommandName]: { unknownBody, attrSpread },\n [r.aria.ariaConditionalAttr]: { unknownBody, attrSpread },\n [r.aria.ariaDeprecatedRole]: { dynamicAttrs: [\"role\"] },\n [r.aria.ariaDialogName]: { unknownBody, attrSpread },\n [r.aria.ariaHiddenBody]: {},\n [r.aria.ariaInputFieldName]: { unknownBody, attrSpread },\n [r.aria.ariaMeterName]: { unknownBody, attrSpread },\n [r.aria.ariaProgressbarName]: { unknownBody, attrSpread },\n [r.aria.ariaProhibitedAttr]: { dynamicAttrs: [\"role\"] },\n [r.aria.ariaRequiredAttr]: { attrSpread },\n [r.aria.ariaRequiredChildren]: { unknownBody },\n [r.aria.ariaRoles]: { dynamicAttrs: [\"role\"] },\n [r.aria.ariaText]: { unknownBody },\n [r.aria.ariaToggleFieldName]: { unknownBody, attrSpread },\n [r.aria.ariaTooltipName]: { unknownBody, attrSpread },\n [r.aria.ariaTreeitemName]: { unknownBody, attrSpread },\n [r.aria.presentationRoleConflict]: {},\n [r.forms.autocompleteValid]: {},\n [r.forms.formFieldMultipleLabels]: {},\n [r.keyboard.accesskeys]: {},\n [r.keyboard.frameFocusableContent]: { unknownBody },\n [r.keyboard.skipLink]: { unknownBody },\n [r.keyboard.tabindex]: {},\n [r.language.htmlHasLang]: { attrSpread },\n [r.language.htmlLangValid]: { dynamicAttrs: [\"lang\"] },\n [r.language.htmlXmlLangMismatch]: {},\n [r.language.validLang]: { dynamicAttrs: [\"lang\"] },\n [r.nameRoleValue.ariaHiddenFocus]: { unknownBody },\n [r.nameRoleValue.buttonName]: { unknownBody, attrSpread },\n [r.nameRoleValue.emptyHeading]: { unknownBody, attrSpread },\n [r.nameRoleValue.emptyTableHeader]: { unknownBody, attrSpread },\n [r.nameRoleValue.inputButtonName]: {\n unknownBody,\n attrSpread,\n },\n [r.nameRoleValue.linkName]: { unknownBody, attrSpread },\n [r.nameRoleValue.summaryName]: { unknownBody, attrSpread },\n [r.parsing.marquee]: {},\n [r.semantics.identicalLinksSamePurpose]: {},\n [r.semantics.landmarkNoDuplicateBanner]: {},\n [r.semantics.landmarkNoDuplicateContentinfo]: {},\n [r.semantics.landmarkNoDuplicateMain]: {},\n [r.semantics.landmarkUnique]: {},\n [r.sensoryAndVisualCues.metaViewport]: {},\n [r.sensoryAndVisualCues.metaViewportLarge]: {},\n [r.structure.definitionList]: { unknownBody },\n [r.structure.list]: { unknownBody },\n [r.tables.scopeAttrValid]: {},\n [r.tables.tableDuplicateName]: { unknownBody },\n [r.tables.thHasDataCells]: { unknownBody },\n [r.textAlternatives.areaAlt]: { attrSpread },\n [r.textAlternatives.documentTitle]: { unknownBody },\n [r.textAlternatives.frameTitle]: { unknownBody },\n [r.textAlternatives.frameTitleUnique]: { unknownBody },\n [r.textAlternatives.imageAlt]: { attrSpread },\n [r.textAlternatives.imageRedundantAlt]: { attrSpread },\n [r.textAlternatives.inputImageAlt]: { attrSpread },\n [r.textAlternatives.objectAlt]: { attrSpread },\n [r.textAlternatives.roleImgAlt]: { attrSpread },\n [r.textAlternatives.serverSideImageMap]: {},\n [r.textAlternatives.svgImgAlt]: { attrSpread },\n [r.textAlternatives.videoCaption]: { unknownBody },\n [r.timeAndMedia.audioCaption]: { unknownBody },\n [r.timeAndMedia.blink]: {},\n [r.timeAndMedia.metaRefresh]: {},\n [r.timeAndMedia.metaRefreshNoExceptions]: {},\n [r.timeAndMedia.noAutoplayAudio]: {},\n};\n", "import { NodeType } from \"@marko/language-tools\";\nimport type { CompletionItem, CompletionParams } from \"vscode-languageserver\";\n\nimport { getMarkoFile, MarkoFile } from \"../../../utils/file\";\nimport type { Plugin, Result } from \"../../types\";\nimport { AttrName } from \"./AttrName\";\nimport { AttrValue } from \"./AttrValue\";\nimport { Import } from \"./Import\";\nimport { OpenTagName } from \"./OpenTagName\";\nimport { Tag } from \"./Tag\";\n\nexport type CompletionResult = Result<CompletionItem[]>;\nexport interface CompletionMeta<N = unknown> {\n file: MarkoFile;\n params: CompletionParams;\n offset: number;\n node: N;\n}\n\nconst handlers: Record<\n string,\n (data: CompletionMeta<any>) => CompletionResult\n> = {\n Tag,\n OpenTagName,\n AttrName,\n AttrValue,\n Import,\n Static: Import,\n};\n\nexport const doComplete: Plugin[\"doComplete\"] = async (doc, params) => {\n const file = getMarkoFile(doc);\n const offset = doc.offsetAt(params.position);\n const node = file.parsed.nodeAt(offset);\n return {\n items:\n (await handlers[NodeType[node.type]]?.({\n file,\n params,\n offset,\n node,\n })) || [],\n isIncomplete: true,\n };\n};\n", "import type { Node } from \"@marko/language-tools\";\nimport {\n type CompletionItem,\n CompletionItemKind,\n InsertTextFormat,\n type MarkupContent,\n MarkupKind,\n TextEdit,\n} from \"vscode-languageserver\";\n\nimport type { CompletionMeta, CompletionResult } from \".\";\n\nexport function AttrName({\n offset,\n node,\n file: { parsed, lookup },\n}: CompletionMeta<Node.AttrName>): CompletionResult {\n let name = parsed.read(node);\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\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, parent) => {\n if (\n attr.deprecated ||\n nestedTagAttrs[attr.name] ||\n attr.name === \"*\" ||\n attr.type === \"never\" ||\n (attr.name[0] === \"_\" &&\n isExternalModule(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 // TODO: We should use the following, but vscode has a regression with multi choice snippets form the language server.\n // snippet += `=\"\\${1|${attr.enum.join()}|}\"$0`;\n snippet += `=\"$1\"$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 if (!attr.required) {\n label += \"?\";\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\nfunction isExternalModule(file: string) {\n return (\n /[/\\\\]node_modules[/\\\\]/.test(file) || !/^(?:[A-Za-z]:\\\\|[./\\\\])/.test(file)\n );\n}\n", "import type { Node } from \"@marko/language-tools\";\nimport path from \"path\";\nimport {\n CompletionItem,\n CompletionItemKind,\n TextEdit,\n} from \"vscode-languageserver\";\n\nimport fileSystem, { FileType } from \"../../../utils/file-system\";\nimport resolveUrl from \"../../../utils/resolve-url\";\nimport isDocumentLinkAttr from \"../util/is-document-link-attr\";\nimport type { CompletionMeta } from \".\";\n\nexport async function AttrValue({\n offset,\n node,\n file: { uri, parsed, code },\n}: CompletionMeta<Node.AttrValue>): Promise<void | CompletionItem[]> {\n const attr = node.parent;\n if (isDocumentLinkAttr(code, attr.parent, attr)) {\n const start = node.value.start + 1;\n if (code[start] !== \".\") return; // only resolve relative paths\n\n const end = node.value.end - 1;\n const relativeOffset = offset - start;\n const rawValue = parsed.read({\n start,\n end,\n });\n\n const segmentStart = rawValue.lastIndexOf(\"/\", relativeOffset);\n if (segmentStart === -1) return; // only resolve after a slash.\n\n const req = rawValue.slice(0, segmentStart);\n const resolved = resolveUrl(req, uri);\n\n if (resolved) {\n const result: CompletionItem[] = [];\n const curFile = req === \".\" ? path.basename(uri) : undefined;\n const replaceRange = parsed.locationAt({\n start: start + segmentStart + 1,\n end: start + rawValue.length,\n });\n\n for (const [entry, type] of await fileSystem.readDirectory(resolved)) {\n if (entry[0] !== \".\" && entry !== curFile) {\n result.push(\n type === FileType.Directory\n ? {\n label: `${entry}/`,\n kind: CompletionItemKind.Folder,\n textEdit: TextEdit.replace(replaceRange, `${entry}/`),\n command: {\n title: \"Suggest\",\n command: \"editor.action.triggerSuggest\",\n },\n }\n : {\n label: entry,\n kind: CompletionItemKind.File,\n textEdit: TextEdit.replace(replaceRange, entry),\n },\n );\n }\n }\n\n return result;\n }\n }\n}\n", "import fs from \"fs/promises\";\nimport { fileURLToPath } from \"url\";\nimport { type FileStat, FileType } from \"vscode-css-languageservice\";\n\nexport { FileStat, FileType };\nexport default {\n stat,\n readDirectory,\n};\n\nasync function stat(uri: string): Promise<FileStat> {\n let type = FileType.Unknown;\n let ctime = -1;\n let mtime = -1;\n let size = -1;\n\n try {\n const stat = await fs.stat(fileURLToPath(uri));\n if (stat.isDirectory()) type = FileType.Directory;\n else if (stat.isFile()) type = FileType.File;\n ctime = stat.ctimeMs;\n mtime = stat.mtimeMs;\n size = stat.size;\n } catch {\n // ignore\n }\n\n return {\n type,\n ctime,\n mtime,\n size,\n };\n}\n\nasync function readDirectory(uri: string): Promise<[string, FileType][]> {\n const result: [string, FileType][] = [];\n\n try {\n for await (const entry of await fs.opendir(fileURLToPath(uri))) {\n if (entry.isFile()) {\n result.push([entry.name, FileType.File]);\n } else if (entry.isDirectory()) {\n result.push([entry.name, FileType.Directory]);\n }\n }\n } catch {\n // ignore\n }\n return result;\n}\n", "export default function resolveUrl(to: string, base: string) {\n try {\n const url = new URL(to, base);\n if (url.protocol === \"file:\") return url.toString();\n } catch {\n return undefined;\n }\n}\n", "import { type Node, NodeType } from \"@marko/language-tools\";\n\nconst linkedAttrs: Map<string, Set<string>> = new Map([\n [\n \"src\",\n new Set([\n \"audio\",\n \"embed\",\n \"iframe\",\n \"img\",\n \"input\",\n \"script\",\n \"html-script\",\n \"source\",\n \"track\",\n \"video\",\n ]),\n ],\n [\"href\", new Set([\"a\", \"area\", \"link\"])],\n [\"data\", new Set([\"object\"])],\n [\"poster\", new Set([\"video\"])],\n]);\n\nexport default function isDocumentLinkAttr(\n code: string,\n tag: Node.ParentTag,\n attr: Node.AttrNode,\n): attr is Node.AttrNamed & { value: Node.AttrValue } {\n return (\n (tag.nameText &&\n attr.type === NodeType.AttrNamed &&\n attr.value?.type === NodeType.AttrValue &&\n /^['\"]$/.test(code[attr.value.value.start]) &&\n linkedAttrs\n .get(code.slice(attr.name.start, attr.name.end))\n ?.has(tag.nameText)) ||\n false\n );\n}\n", "import { type Node, NodeType } from \"@marko/language-tools\";\nimport { CompletionItem, TextEdit } from \"vscode-languageserver\";\n\nimport getTagNameCompletion from \"../util/get-tag-name-completion\";\nimport type { CompletionMeta, CompletionResult } from \".\";\n\nconst staticImportReg = /^\\s*(?:static|client|server) import\\b/;\nconst importTagReg = /(['\"])<((?:[^'\"\\\\>]|\\\\.)*)>?\\1/;\n\nexport function Import({\n node,\n file: { parsed, filename, lookup },\n}: CompletionMeta<Node.Import | Node.Static>): CompletionResult {\n const value = parsed.read(node);\n if (node.type === NodeType.Static && !staticImportReg.test(value)) {\n // Checks for `static import`, `client import` and `server import`.\n return;\n }\n\n const match = importTagReg.exec(value);\n if (match) {\n const [{ length }] = match;\n const fromStart = node.start + match.index;\n const range = parsed.locationAt({\n start: fromStart + 1,\n end: fromStart + length - 1,\n });\n\n const result: CompletionItem[] = [];\n\n for (const tag of lookup.getTagsSorted()) {\n if (\n (tag.template || tag.renderer) &&\n !(\n tag.html ||\n tag.parser ||\n tag.translator ||\n tag.isNestedTag ||\n tag.name === \"*\" ||\n tag.parseOptions?.statement ||\n /^@?marko[/-]/.test(tag.taglibId) ||\n (tag.name[0] === \"_\" && /[\\\\/]node_modules[\\\\/]/.test(tag.filePath))\n )\n ) {\n const completion = getTagNameCompletion({\n tag,\n importer: filename,\n });\n\n completion.label = `<${completion.label}>`;\n completion.textEdit = TextEdit.replace(range, completion.label);\n result.push(completion);\n }\n }\n\n return result;\n }\n}\n", "import type { TagDefinition } from \"@marko/compiler/babel-utils\";\nimport path from \"path\";\nimport {\n type CompletionItem,\n CompletionItemKind,\n CompletionItemTag,\n InsertTextFormat,\n MarkupKind,\n type Range,\n TextEdit,\n} from \"vscode-languageserver\";\nimport { URI } from \"vscode-uri\";\n\nimport { isHTML } from \"./is-html\";\n\nconst deprecated = [CompletionItemTag.Deprecated] as CompletionItemTag[];\n\nexport default function getTagNameCompletion({\n tag,\n range,\n showAutoComplete,\n importer,\n}: {\n tag: TagDefinition;\n range?: Range;\n importer?: string;\n showAutoComplete?: true;\n}): CompletionItem {\n let label = tag.isNestedTag ? `@${tag.name}` : tag.name;\n const fileForTag = tag.template || tag.renderer || tag.filePath;\n const fileURIForTag = URI.file(fileForTag).toString();\n const nodeModuleMatch = /\\/node_modules\\/((?:@[^/]+\\/)?[^/]+)/.exec(\n fileForTag,\n );\n\n const nodeModuleName = nodeModuleMatch && nodeModuleMatch[1];\n const isCoreTag =\n /^@?marko[/-]/.test(tag.taglibId || tag.filePath) ||\n nodeModuleName === \"marko\";\n const html = isHTML(tag);\n const documentation = {\n kind: MarkupKind.Markdown,\n value: html\n ? `Built in [<${tag.name}>](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/${tag.name}) HTML tag.`\n : isCoreTag\n ? `Core Marko <${tag.name}> tag.`\n : nodeModuleName\n ? `Custom Marko tag discovered from the [\"${nodeModuleName}\"](${fileURIForTag}) npm package.`\n : `Custom Marko tag discovered from:\\n\\n[${\n importer ? path.relative(importer, fileForTag) : fileForTag\n }](${fileURIForTag})`,\n };\n\n if (tag.description) {\n documentation.value += `\\n\\n${tag.description}`;\n }\n\n const autocomplete = showAutoComplete ? tag.autocomplete?.[0] : undefined;\n\n if (autocomplete) {\n if (autocomplete.displayText) {\n label = autocomplete.displayText;\n }\n\n if (autocomplete.description) {\n documentation.value += `\\n\\n${autocomplete.description}`;\n }\n\n if (autocomplete.descriptionMoreURL) {\n documentation.value += `\\n\\n[More Info](${autocomplete.descriptionMoreURL})`;\n }\n }\n\n return {\n label,\n documentation,\n tags: tag.deprecated ? deprecated : undefined,\n insertTextFormat: autocomplete ? InsertTextFormat.Snippet : undefined,\n kind: html ? CompletionItemKind.Property : CompletionItemKind.Class,\n textEdit: range && TextEdit.replace(range, autocomplete?.snippet || label),\n };\n}\n", "import { TagDefinition } from \"@marko/compiler/babel-utils\";\n\nexport function isHTML(tag: TagDefinition | undefined) {\n return tag ? !(tag.types || tag.template || tag.renderer) && tag.html : false;\n}\n", "import { type Node, NodeType } from \"@marko/language-tools\";\nimport type { CompletionItem } from \"vscode-languageserver\";\n\nimport getTagNameCompletion from \"../util/get-tag-name-completion\";\nimport type { CompletionMeta, CompletionResult } from \".\";\n\nexport function OpenTagName({\n node,\n file: { parsed, filename, lookup },\n}: CompletionMeta<Node.OpenTagName>): CompletionResult {\n const tag = node.parent;\n const range = parsed.locationAt(node);\n const isAttrTag = tag.type === NodeType.AttrTag;\n const result: CompletionItem[] = [];\n\n if (isAttrTag) {\n const ownerTagDef =\n tag.owner && tag.owner.nameText && lookup.getTag(tag.owner.nameText);\n\n if (ownerTagDef) {\n const { nestedTags } = ownerTagDef;\n for (const key in nestedTags) {\n if (key !== \"*\") {\n const tag = nestedTags[key];\n result.push(\n getTagNameCompletion({\n tag,\n range,\n importer: filename,\n showAutoComplete: true,\n }),\n );\n }\n }\n }\n } else {\n const skipStatements = !(\n tag.concise && tag.parent.type === NodeType.Program\n );\n for (const tag of lookup.getTagsSorted()) {\n if (\n !(\n tag.name === \"*\" ||\n tag.isNestedTag ||\n (skipStatements && tag.parseOptions?.statement) ||\n (tag.name[0] === \"_\" &&\n /^@?marko[/-]|[\\\\/]node_modules[\\\\/]/.test(tag.filePath))\n )\n ) {\n const completion = getTagNameCompletion({\n tag,\n range,\n importer: filename,\n showAutoComplete: true,\n });\n completion.sortText = `0${completion.label}`; // Ensure higher priority than typescript.\n result.push(completion);\n }\n }\n }\n\n return result;\n}\n", "import { type Node, UNFINISHED } from \"@marko/language-tools\";\nimport {\n CompletionItemKind,\n InsertTextFormat,\n TextEdit,\n} from \"vscode-languageserver\";\n\nimport type { CompletionMeta, CompletionResult } from \".\";\n\nconst partialCloseTagReg = /<\\/(?:[^><]*>)?/iy;\n\n/**\n * Provide completion for the closing tag.\n */\nexport function Tag({\n node,\n offset,\n file: { parsed, code },\n}: CompletionMeta<Node.Tag>): CompletionResult {\n const isClosed = node.end !== UNFINISHED;\n if (isClosed || node.concise) return;\n\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 { NodeType } from \"@marko/language-tools\";\nimport type { DefinitionLink, DefinitionParams } from \"vscode-languageserver\";\n\nimport { getMarkoFile, MarkoFile } from \"../../../utils/file\";\nimport type { Plugin, Result } from \"../../types\";\nimport { AttrName } from \"./AttrName\";\nimport { OpenTagName } from \"./OpenTagName\";\n\nexport type DefinitionResult = Result<DefinitionLink[]>;\nexport interface DefinitionMeta<N = unknown> {\n file: MarkoFile;\n params: DefinitionParams;\n offset: number;\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 file = getMarkoFile(doc);\n const offset = doc.offsetAt(params.position);\n const node = file.parsed.nodeAt(offset);\n return (\n (await handlers[NodeType[node.type]]?.({\n file,\n params,\n offset,\n node,\n })) || []\n );\n};\n", "import { getLines, getLocation, type Node } from \"@marko/language-tools\";\nimport fs from \"fs\";\nimport { URI } from \"vscode-uri\";\n\nimport { START_LOCATION } from \"../../../utils/constants\";\nimport RegExpBuilder from \"../../../utils/regexp-builder\";\nimport type { DefinitionMeta, DefinitionResult } from \".\";\n\nexport function AttrName({\n node,\n file: { parsed, lookup },\n}: DefinitionMeta<Node.AttrName>): DefinitionResult {\n const tagName = node.parent.parent.nameText;\n const attrName = parsed.read(node);\n const tagDef = tagName ? lookup.getTag(tagName) : undefined;\n const attrDef = lookup.getAttribute(tagName || \"\", attrName);\n let range = START_LOCATION;\n\n if (!attrDef) {\n return;\n }\n\n const attrEntryFile = attrDef.filePath || tagDef?.filePath;\n if (!attrEntryFile) {\n return;\n }\n\n if (/\\.json$/.test(attrEntryFile)) {\n const tagDefSource = fs.readFileSync(attrEntryFile, \"utf-8\");\n const match = RegExpBuilder`/\"@${attrName}\"\\s*:\\s*[^\\r\\n,]+/g`.exec(\n tagDefSource,\n );\n\n if (match && match.index) {\n range = getLocation(\n getLines(tagDefSource),\n match.index,\n match.index + match[0].length,\n );\n }\n\n return [\n {\n targetUri: URI.file(attrEntryFile).toString(),\n targetRange: range,\n targetSelectionRange: range,\n originSelectionRange: parsed.locationAt(node),\n },\n ];\n }\n}\n", "import type { Location, Position } from \"htmljs-parser\";\n\nexport const START_POSITION: Position = {\n line: 0,\n character: 0,\n};\n\nexport const START_LOCATION: Location = {\n start: START_POSITION,\n end: START_POSITION,\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 type { TagDefinition } from \"@marko/compiler/babel-utils\";\nimport {\n getLines,\n getLocation,\n type Node,\n NodeType,\n} from \"@marko/language-tools\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { URI } from \"vscode-uri\";\n\nimport { START_LOCATION } from \"../../../utils/constants\";\nimport RegExpBuilder from \"../../../utils/regexp-builder\";\nimport type { DefinitionMeta, DefinitionResult } from \".\";\n\nexport function OpenTagName({\n node,\n file: { parsed, lookup },\n}: DefinitionMeta<Node.OpenTagName>): DefinitionResult {\n const tag = node.parent;\n let tagDef: TagDefinition | null | undefined;\n let range = START_LOCATION;\n\n if (tag.type === NodeType.AttrTag) {\n tagDef =\n tag.owner && tag.owner.nameText\n ? lookup.getTag(tag.owner.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 tagDefSource = fs.readFileSync(tagEntryFile, \"utf-8\");\n const match =\n RegExpBuilder`/\"(?:<${tag.nameText}>|${tag.nameText})\"\\s*:\\s*[^\\r\\n,]+/g`.exec(\n tagDefSource,\n );\n\n if (match && match.index) {\n range = getLocation(\n getLines(tagDefSource),\n match.index,\n match.index + match[0].length,\n );\n }\n }\n\n return [\n {\n targetUri: URI.file(tagEntryFile).toString(),\n targetRange: range,\n targetSelectionRange: range,\n originSelectionRange: parsed.locationAt(node),\n },\n ];\n}\n", "import { type Node, NodeType } from \"@marko/language-tools\";\nimport type { DocumentLink } from \"vscode-languageserver\";\n\nimport { MarkoFile, processDoc } from \"../../utils/file\";\nimport resolveUrl from \"../../utils/resolve-url\";\nimport type { Plugin } from \"../types\";\nimport isDocumentLinkAttr from \"./util/is-document-link-attr\";\n\nconst importTagReg = /(['\"])<((?:[^'\"\\\\>]|\\\\.)*)>?\\1/g;\n\nexport const findDocumentLinks: Plugin[\"findDocumentLinks\"] = async (doc) => {\n return processDoc(doc, extractDocumentLinks);\n};\n\n/**\n * Iterate over the Marko CST and extract all the file links in the document.\n */\nfunction extractDocumentLinks({\n uri,\n scheme,\n parsed,\n code,\n lookup,\n}: MarkoFile): DocumentLink[] {\n if (scheme !== \"file\") {\n return [];\n }\n\n const links: DocumentLink[] = [];\n const { program, read } = parsed;\n const visit = (node: Node.ChildNode) => {\n switch (node.type) {\n case NodeType.AttrTag:\n if (node.body) {\n for (const child of node.body) {\n visit(child);\n }\n }\n break;\n case NodeType.Tag:\n if (node.attrs && node.nameText) {\n for (const attr of node.attrs) {\n if (isDocumentLinkAttr(code, node, attr)) {\n const resolved = resolveUrl(\n read(attr.value.value).slice(1, -1),\n uri,\n );\n if (resolved) {\n links.push({\n range: parsed.locationAt(attr.value.value),\n target: resolveUrl(read(attr.value.value).slice(1, -1), uri),\n });\n }\n }\n }\n }\n if (node.body) {\n for (const child of node.body) {\n visit(child);\n }\n }\n\n break;\n }\n };\n\n for (const node of program.static) {\n // check for import statement (this currently only support the tag import shorthand).\n if (node.type === NodeType.Import) {\n importTagReg.lastIndex = 0;\n const value = parsed.read(node);\n const match = importTagReg.exec(value);\n if (match) {\n const [{ length }, , tagName] = match;\n const tagDef = lookup.getTag(tagName);\n const fileForTag = tagDef && (tagDef.template || tagDef.renderer);\n\n if (fileForTag) {\n links.push({\n range: parsed.locationAt({\n start: node.start + match.index,\n end: node.start + match.index + length,\n }),\n target: fileForTag,\n });\n }\n }\n }\n }\n\n for (const node of program.body) {\n visit(node);\n }\n\n return links;\n}\n", "import { type Node, NodeType } from \"@marko/language-tools\";\nimport { SymbolInformation, SymbolKind } from \"vscode-languageserver\";\n\nimport { MarkoFile, processDoc } from \"../../utils/file\";\nimport type { Plugin } from \"../types\";\nimport { isHTML } from \"./util/is-html\";\n\nexport const findDocumentSymbols: Plugin[\"findDocumentSymbols\"] = async (doc) =>\n processDoc(doc, extractDocumentSymbols);\n\n/**\n * Iterate over the Marko CST and extract all the symbols (mostly tags) in the document.\n */\nfunction extractDocumentSymbols({\n uri,\n scheme,\n parsed,\n lookup,\n}: MarkoFile): SymbolInformation[] {\n if (scheme !== \"file\") {\n return [];\n }\n\n const symbols: SymbolInformation[] = [];\n const { program } = parsed;\n const visit = (node: Node.ChildNode) => {\n switch (node.type) {\n case NodeType.Tag:\n case NodeType.AttrTag:\n symbols.push({\n name:\n (node.type === NodeType.AttrTag\n ? node.nameText?.slice(node.nameText.indexOf(\"@\"))\n : node.nameText) || \"<${...}>\",\n kind:\n (node.nameText &&\n isHTML(lookup.getTag(node.nameText)) &&\n SymbolKind.Property) ||\n SymbolKind.Class,\n location: {\n uri,\n range: parsed.locationAt(node),\n },\n });\n\n if (node.body) {\n for (const child of node.body) {\n visit(child);\n }\n }\n\n break;\n }\n };\n\n for (const item of program.body) {\n visit(item);\n }\n\n return symbols;\n}\n", "import { Project } from \"@marko/language-tools\";\nimport * as prettier from \"prettier\";\nimport * as markoPrettier from \"prettier-plugin-marko\";\nimport { CancellationToken, TextEdit } from \"vscode-languageserver\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\n\nimport { START_POSITION } from \"../../utils/constants\";\nimport { getFSDir, getFSPath } from \"../../utils/file\";\nimport { displayError } from \"../../utils/messages\";\nimport type { Plugin } from \"../types\";\n\nexport interface FormatOptions {\n tabSize: number;\n insertSpaces: boolean;\n mode?: \"concise\" | \"html\";\n}\n\nexport async function formatDocument(\n doc: TextDocument,\n formatOptions: FormatOptions,\n cancel?: CancellationToken,\n) {\n try {\n const dir = getFSDir(doc);\n const filepath = getFSPath(doc);\n const text = doc.getText();\n const options: prettier.Options = {\n parser: \"marko\",\n filepath,\n plugins: [markoPrettier],\n tabWidth: formatOptions.tabSize,\n useTabs: formatOptions.insertSpaces === false,\n markoSyntax: formatOptions.mode ?? \"auto\",\n ...(filepath\n ? await prettier\n .resolveConfig(filepath, {\n editorconfig: true,\n })\n .catch(() => null)\n : null),\n };\n\n markoPrettier.setCompiler(Project.getCompiler(dir), Project.getConfig(dir));\n\n if (cancel?.isCancellationRequested) return;\n\n // TODO: format selection\n return [\n TextEdit.replace(\n {\n start: START_POSITION,\n end: doc.positionAt(text.length),\n },\n await prettier.format(text, options),\n ),\n ];\n } catch (e) {\n displayError(e);\n }\n}\n\nexport const format: Plugin[\"format\"] = async (doc, params, cancel) => {\n return formatDocument(doc, params.options, cancel);\n};\n", "import { inspect } from \"util\";\nimport type { Connection } from \"vscode-languageserver\";\n\nlet connection!: Connection;\nconst previousMessagesByType = new Map<string, string[]>();\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\n const previousMessages = previousMessagesByType.get(type);\n if (previousMessages) {\n if (previousMessages.includes(msg)) return;\n\n previousMessages.push(msg);\n\n // Only keep the last 3 messages.\n if (previousMessages.length > 3) {\n previousMessages.unshift();\n }\n } else {\n previousMessagesByType.set(type, [msg]);\n }\n\n setImmediate(() => connection.sendNotification(type, msg));\n}\n", "import { NodeType } from \"@marko/language-tools\";\nimport type { Hover, HoverParams } from \"vscode-languageserver\";\n\nimport { getMarkoFile, MarkoFile } from \"../../../utils/file\";\nimport type { Plugin, Result } from \"../../types\";\nimport { OpenTagName } from \"./OpenTagName\";\n\nexport type HoverResult = Result<Hover>;\nexport interface HoverMeta<N = unknown> {\n file: MarkoFile;\n params: HoverParams;\n offset: number;\n node: N;\n}\n\nconst handlers: Record<string, (data: HoverMeta<any>) => HoverResult> = {\n OpenTagName,\n};\n\nexport const doHover: Plugin[\"doHover\"] = async (doc, params) => {\n const file = getMarkoFile(doc);\n const offset = doc.offsetAt(params.position);\n const node = file.parsed.nodeAt(offset);\n return await handlers[NodeType[node.type]]?.({\n file,\n params,\n offset,\n node,\n });\n};\n", "import type { Node } from \"@marko/language-tools\";\n\nimport { START_LOCATION } from \"../../../utils/constants\";\nimport getTagNameCompletion from \"../util/get-tag-name-completion\";\nimport type { HoverMeta, HoverResult } from \".\";\n\nexport function OpenTagName({\n node,\n file: { parsed, filename, lookup },\n}: HoverMeta<Node.OpenTagName>): HoverResult {\n const tag = node.parent;\n const range = parsed.locationAt(node);\n const tagDef = tag.nameText && lookup.getTag(tag.nameText);\n\n if (tagDef) {\n const completion = getTagNameCompletion({\n tag: tagDef,\n range: START_LOCATION,\n importer: filename,\n });\n\n if (completion.documentation) {\n return {\n range,\n contents: completion.documentation,\n };\n }\n }\n}\n", "import type { Config } from \"@marko/compiler\";\nimport { DiagnosticType } from \"@marko/compiler/babel-utils\";\nimport { Project } from \"@marko/language-tools\";\nimport path from \"path\";\nimport { Diagnostic, DiagnosticSeverity } from \"vscode-languageserver\";\n\nimport { getFSPath } from \"../../utils/file\";\nimport type { Plugin } from \"../types\";\n\nconst markoErrorRegExp =\n /^(.+?)\\.marko(?:\\((\\d+)(?:\\s*,\\s*(\\d+))?\\))?: (.*)$/gm;\nconst compilerConfig: Config = {\n code: false,\n output: \"migrate\",\n sourceMaps: false,\n errorRecovery: true,\n babelConfig: {\n babelrc: false,\n configFile: false,\n browserslistConfigFile: false,\n caller: {\n name: \"@marko/language-server\",\n supportsStaticESM: true,\n supportsDynamicImport: true,\n supportsTopLevelAwait: true,\n supportsExportNamespaceFrom: true,\n },\n },\n};\n\nexport const doValidate: Plugin[\"doValidate\"] = (doc) => {\n const filename = getFSPath(doc);\n const diagnostics: Diagnostic[] = [];\n\n try {\n const { meta } = Project.getCompiler(\n filename && path.dirname(filename),\n ).compileSync(doc.getText(), filename || \"untitled.marko\", compilerConfig);\n\n if (meta.diagnostics) {\n for (const diag of meta.diagnostics) {\n const range = diag.loc\n ? {\n start: {\n line: diag.loc.start.line - 1,\n character: diag.loc.start.column,\n },\n end: {\n line: diag.loc.end.line - 1,\n character: diag.loc.end.column,\n },\n }\n : {\n start: { line: 0, character: 0 },\n end: { line: 0, character: 0 },\n };\n\n let severity: DiagnosticSeverity | undefined;\n\n switch (diag.type) {\n case DiagnosticType.Warning:\n case DiagnosticType.Deprecation:\n severity = DiagnosticSeverity.Warning;\n break;\n case DiagnosticType.Suggestion:\n severity = DiagnosticSeverity.Hint;\n break;\n default:\n severity = DiagnosticSeverity.Error;\n break;\n }\n\n diagnostics.push({\n range,\n source: \"marko\",\n code: undefined,\n tags: undefined,\n severity,\n message: diag.label,\n });\n }\n }\n } catch (err) {\n addDiagnosticsForError(err, diagnostics);\n }\n\n return diagnostics;\n};\n\nfunction addDiagnosticsForError(err: unknown, diagnostics: Diagnostic[]) {\n if (!isError(err)) {\n diagnostics.push({\n range: {\n start: { line: 0, character: 0 },\n end: { line: 0, character: 0 },\n },\n source: \"marko\",\n code: undefined,\n tags: undefined,\n severity: DiagnosticSeverity.Error,\n message: String(err),\n });\n } else if (isAggregateError(err)) {\n for (const nestedError of err.errors) {\n addDiagnosticsForError(nestedError, diagnostics);\n }\n } else if (isErrorWithLoc(err)) {\n const message = err.label || err.message || err.stack;\n if (!message) return;\n const { loc } = err;\n\n diagnostics.push({\n range: {\n start: {\n line: loc.start.line - 1,\n character: loc.start.column,\n },\n end: {\n line: loc.end.line - 1,\n character: loc.end.column,\n },\n },\n source: \"marko\",\n code: undefined,\n tags: undefined,\n severity: DiagnosticSeverity.Error,\n message,\n });\n } else {\n let match: RegExpExecArray | null;\n while ((match = markoErrorRegExp.exec((err as Error).message))) {\n const [, , rawLine, rawCol, message] = match;\n const pos = {\n line: (parseInt(rawLine, 10) || 1) - 1,\n character: (parseInt(rawCol, 10) || 1) - 1,\n };\n diagnostics.push({\n range: { start: pos, end: pos },\n source: \"marko\",\n code: undefined,\n tags: undefined,\n severity: DiagnosticSeverity.Error,\n message,\n });\n }\n }\n}\n\nfunction isError(err: unknown): err is Error {\n return (\n err != null &&\n typeof err === \"object\" &&\n typeof (err as { message: unknown }).message === \"string\"\n );\n}\n\nfunction isAggregateError(err: unknown): err is AggregateError {\n return Array.isArray((err as { errors: unknown })?.errors);\n}\n\nfunction isErrorWithLoc(err: unknown): err is Error & {\n label?: string;\n loc: {\n start: { line: number; column: number };\n end: { line: number; column: number };\n };\n} {\n const loc = (err as undefined | { loc: unknown })?.loc;\n if (typeof loc !== \"object\") return false;\n return (\n loc !== null &&\n typeof loc === \"object\" &&\n typeof (loc as { start: unknown }).start === \"object\" &&\n typeof (loc as { end: unknown }).end === \"object\" &&\n typeof (loc as { start: { line: unknown } }).start.line === \"number\" &&\n typeof (loc as { start: { column: unknown } }).start.column === \"number\" &&\n typeof (loc as { end: { line: unknown } }).end.line === \"number\" &&\n typeof (loc as { end: { column: unknown } }).end.column === \"number\"\n );\n}\n", "import * as documents from \"../../utils/text-documents\";\nimport type { Plugin } from \"../types\";\nimport { doComplete } from \"./complete\";\nimport { findDefinition } from \"./definition\";\nimport { findDocumentLinks } from \"./document-links\";\nimport { findDocumentSymbols } from \"./document-symbols\";\nimport { format, formatDocument, FormatOptions } from \"./format\";\nimport { doHover } from \"./hover\";\nimport { doValidate } from \"./validate\";\n\nexport default {\n doComplete,\n doValidate,\n doHover,\n findDefinition,\n findDocumentLinks,\n findDocumentSymbols,\n format,\n commands: {\n \"$/formatWithMode\": async ({\n doc: docURI,\n options,\n }: {\n doc: string;\n options: FormatOptions;\n }) => {\n const doc = documents.get(docURI)!;\n const formatted = await formatDocument(doc, options);\n return formatted;\n },\n },\n} as Partial<Plugin>;\n", "import {\n type Extracted,\n extractScript,\n type Location,\n Node,\n NodeType,\n type Parsed,\n Project,\n ScriptLang,\n} from \"@marko/language-tools\";\nimport path from \"path\";\nimport * as prettier from \"prettier\";\nimport { relativeImportPath } from \"relative-import-path\";\nimport ts from \"typescript/lib/tsserverlibrary\";\nimport {\n CompletionItem,\n CompletionItemKind,\n CompletionItemTag,\n DefinitionLink,\n Diagnostic,\n DiagnosticSeverity,\n DiagnosticTag,\n InsertTextFormat,\n type Range,\n TextEdit,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport { URI } from \"vscode-uri\";\n\nimport { ExtractedSnapshot, patch } from \"../../ts-plugin/host\";\nimport { START_LOCATION } from \"../../utils/constants\";\nimport { getFSPath, getMarkoFile, processDoc } from \"../../utils/file\";\nimport * as documents from \"../../utils/text-documents\";\nimport * as workspace from \"../../utils/workspace\";\nimport type { Plugin } from \"../types\";\nimport printJSDocTag from \"./util/print-jsdoc-tag\";\n\n// Filter out some syntax errors from the TS compiler which will be surfaced from the marko compiler.\nconst IGNORE_DIAG_REG =\n /^(?:(?:Expression|Identifier|['\"][^\\w]['\"]) expected|Invalid character)\\b/i;\n\ninterface TSProject {\n rootDir: string;\n host: ts.LanguageServiceHost;\n service: ts.LanguageService;\n markoScriptLang: ScriptLang;\n}\n\nconst extractCache = new Map<string, ExtractedSnapshot>();\nconst snapshotCache = new Map<string, ts.IScriptSnapshot>();\nconst insertModuleStatementLocCache = new WeakMap<Extracted, Location>();\nconst markoFileReg = /\\.marko$/;\nconst tsTriggerChars = new Set([\".\", '\"', \"'\", \"`\", \"/\", \"@\", \"<\", \"#\", \" \"]);\nconst optionalModifierReg = /\\boptional\\b/;\nconst deprecatedModifierReg = /\\bdeprecated\\b/;\nconst colorModifierReg = /\\bcolor\\b/;\nconst localInternalsPrefix = \"__marko_internal_\";\nconst getCanonicalFileName = ts.sys.useCaseSensitiveFileNames\n ? (fileName: string) => fileName\n : (fileName: string) => fileName.toLocaleLowerCase();\nconst requiredTSCompilerOptions: ts.CompilerOptions = {\n module: ts.ModuleKind.ESNext,\n moduleResolution: ts.ModuleResolutionKind.Bundler,\n noEmit: true,\n allowJs: true,\n composite: false,\n declaration: false,\n skipLibCheck: true,\n importHelpers: false,\n isolatedModules: true,\n resolveJsonModule: true,\n skipDefaultLibCheck: true,\n emitDeclarationOnly: false,\n allowNonTsExtensions: true,\n emitDecoratorMetadata: false,\n};\nconst defaultTSConfig = {\n include: [],\n compilerOptions: {\n lib: [\"dom\", \"node\", \"esnext\"],\n } satisfies ts.CompilerOptions,\n};\nconst extraTSCompilerExtensions: readonly ts.FileExtensionInfo[] = [\n {\n extension: \".marko\",\n isMixedContent: false,\n scriptKind: ts.ScriptKind.Deferred,\n },\n];\n\nconst ScriptService: Partial<Plugin> = {\n commands: {\n \"$/showScriptOutput\": async (uri: string) => {\n const doc = documents.get(uri);\n if (doc?.languageId !== \"marko\") return;\n const filename = getFSPath(doc);\n if (!filename) return;\n const tsProject = getTSProject(filename);\n const extracted = processScript(doc, tsProject);\n const lang = Project.getScriptLang(\n filename,\n tsProject.markoScriptLang,\n ts,\n tsProject.host,\n );\n const generated = extracted.toString();\n const content = await prettier\n .format(generated, {\n parser: lang === ScriptLang.ts ? \"typescript\" : \"babel\",\n })\n .catch(() => generated);\n return {\n language: lang === ScriptLang.ts ? \"typescript\" : \"javascript\",\n content,\n };\n },\n },\n async initialize() {\n workspace.onConfigChange(() => {\n snapshotCache.clear();\n });\n\n documents.onFileChange((doc) => {\n if (doc) {\n const filename = getFSPath(doc)!;\n extractCache.delete(filename);\n snapshotCache.delete(filename);\n } else {\n extractCache.clear();\n snapshotCache.clear();\n }\n });\n },\n async doComplete(doc, params) {\n const fileName = getFSPath(doc);\n if (!fileName) return;\n\n const project = getTSProject(fileName);\n const extracted = processScript(doc, project);\n const sourceOffset = doc.offsetAt(params.position);\n const generatedOffset = extracted.generatedOffsetAt(sourceOffset);\n if (generatedOffset === undefined) return;\n\n const completions = project.service.getCompletionsAtPosition(\n fileName,\n generatedOffset,\n {\n ...(await getPreferences(project.markoScriptLang)),\n ...params.context,\n triggerCharacter: getTSTriggerChar(params.context?.triggerCharacter),\n },\n );\n if (!completions?.entries.length) return;\n\n const result: CompletionItem[] = [];\n\n for (const completion of completions.entries) {\n let { name: label, insertText, sortText } = completion;\n if (label.startsWith(localInternalsPrefix)) continue;\n\n const { replacementSpan } = completion;\n let textEdit: CompletionItem[\"textEdit\"];\n let detail: CompletionItem[\"detail\"];\n let kind: CompletionItem[\"kind\"];\n let tags: CompletionItem[\"tags\"];\n let labelDetails: CompletionItem[\"labelDetails\"];\n let source = completion.source;\n\n if (source && completion.hasAction) {\n if (source[0] === \".\") {\n source = path.resolve(fileName, \"..\", source);\n }\n detail = relativeImportPath(fileName, source);\n // De-prioritize auto-imported completions.\n sortText = `\\uffff${sortText}`;\n } else if (completion.sourceDisplay) {\n const description = ts.displayPartsToString(completion.sourceDisplay);\n if (description !== label) {\n labelDetails = { description };\n }\n }\n\n if (completion.kindModifiers) {\n if (optionalModifierReg.test(completion.kindModifiers)) {\n insertText = label;\n label += \"?\";\n }\n\n if (deprecatedModifierReg.test(completion.kindModifiers)) {\n tags = [CompletionItemTag.Deprecated];\n }\n\n if (colorModifierReg.test(completion.kindModifiers)) {\n kind = CompletionItemKind.Color;\n }\n }\n\n if (replacementSpan) {\n const sourceRange = sourceLocationAtTextSpan(\n extracted,\n replacementSpan,\n );\n\n if (sourceRange) {\n textEdit = {\n range: sourceRange,\n newText: insertText || label,\n };\n } else {\n continue;\n }\n }\n\n result.push({\n tags,\n label,\n detail,\n textEdit,\n sortText,\n insertText,\n labelDetails,\n filterText: insertText,\n preselect: completion.isRecommended || undefined,\n kind: kind || convertCompletionItemKind(completion.kind),\n insertTextFormat: completion.isSnippet\n ? InsertTextFormat.Snippet\n : undefined,\n data: completion.data && {\n originalData: completion.data,\n originalName: completion.name,\n originalSource: source,\n generatedOffset,\n fileName,\n },\n });\n }\n\n return {\n isIncomplete: true,\n items: result,\n };\n },\n async doCompletionResolve(item) {\n const { data } = item;\n if (!data) return;\n const { fileName } = data;\n if (!fileName) return;\n const doc = documents.get(filenameToURI(fileName));\n if (!doc) return;\n\n const project = getTSProject(fileName);\n const detail = project.service.getCompletionEntryDetails(\n fileName,\n data.generatedOffset,\n data.originalName,\n {},\n data.originalSource,\n await getPreferences(project.markoScriptLang),\n data.originalData,\n );\n\n if (!detail?.codeActions) return;\n\n const extracted = processScript(doc, project);\n const textEdits: CompletionItem[\"additionalTextEdits\"] =\n (item.additionalTextEdits = item.additionalTextEdits || []);\n\n for (const action of detail.codeActions) {\n for (const change of action.changes) {\n if (change.fileName !== fileName) continue;\n for (const { span, newText: rawText } of change.textChanges) {\n let range: Range | undefined;\n let newText = rawText;\n\n if (span.length === 0 && /^\\s*(?:import|export) /.test(newText)) {\n const cached = insertModuleStatementLocCache.get(extracted);\n newText = newText.replace(/\\n\\s*$/, \"\\n\");\n\n if (cached) {\n range = cached;\n } else {\n const { parsed } = getMarkoFile(doc);\n const offset = getInsertModuleStatementOffset(parsed);\n const start = parsed.positionAt(offset);\n range = {\n start,\n end: start,\n };\n insertModuleStatementLocCache.set(extracted, range);\n }\n } else {\n range = sourceLocationAtTextSpan(extracted, span);\n }\n\n if (range) {\n textEdits.push({ newText, range });\n }\n }\n }\n }\n\n return item;\n },\n findDefinition(doc, params) {\n const fileName = getFSPath(doc);\n if (!fileName) return;\n\n const project = getTSProject(fileName);\n const extracted = processScript(doc, project);\n const sourceOffset = doc.offsetAt(params.position);\n const generatedOffset = extracted.generatedOffsetAt(sourceOffset);\n if (generatedOffset === undefined) return;\n\n const boundary = project.service.getDefinitionAndBoundSpan(\n fileName,\n generatedOffset,\n );\n if (!boundary?.definitions) return;\n\n const originSelectionRange = sourceLocationAtTextSpan(\n extracted,\n boundary.textSpan,\n );\n let result: DefinitionLink[] | DefinitionLink | undefined;\n\n for (const def of boundary.definitions) {\n const targetUri = filenameToURI(def.fileName);\n const defDoc = documents.get(targetUri);\n if (!defDoc) continue;\n\n let link: DefinitionLink | undefined;\n\n if (markoFileReg.test(targetUri)) {\n const extracted = processScript(defDoc, project);\n const targetSelectionRange =\n sourceLocationAtTextSpan(extracted, def.textSpan) || START_LOCATION;\n const targetRange =\n (def.contextSpan &&\n sourceLocationAtTextSpan(extracted, def.contextSpan)) ||\n START_LOCATION;\n link = {\n targetUri,\n targetRange,\n targetSelectionRange,\n originSelectionRange,\n };\n } else {\n link = {\n targetUri,\n targetRange: def.contextSpan\n ? docLocationAtTextSpan(defDoc, def.contextSpan)\n : START_LOCATION,\n targetSelectionRange: docLocationAtTextSpan(defDoc, def.textSpan),\n originSelectionRange,\n };\n }\n\n if (link) {\n if (result) {\n if (Array.isArray(result)) {\n result.push(link);\n } else {\n result = [result, link];\n }\n } else {\n result = link;\n }\n }\n }\n\n return result;\n },\n doHover(doc, params) {\n const fileName = getFSPath(doc);\n if (!fileName) return;\n\n const project = getTSProject(fileName);\n const extracted = processScript(doc, project);\n const sourceOffset = doc.offsetAt(params.position);\n const generatedOffset = extracted.generatedOffsetAt(sourceOffset);\n if (generatedOffset === undefined) return;\n\n const quickInfo = project.service.getQuickInfoAtPosition(\n fileName,\n generatedOffset,\n );\n if (!quickInfo) return;\n\n const sourceRange = sourceLocationAtTextSpan(extracted, quickInfo.textSpan);\n if (!sourceRange) return;\n\n let contents = \"\";\n\n const displayParts = ts.displayPartsToString(quickInfo.displayParts);\n if (displayParts) {\n contents += `\\`\\`\\`typescript\\n${displayParts}\\n\\`\\`\\``;\n }\n\n const documentation = printDocumentation(\n quickInfo.documentation,\n quickInfo.tags,\n );\n if (documentation) {\n contents += `\\n---\\n${documentation}`;\n }\n\n return {\n range: sourceRange,\n contents,\n };\n },\n doRename(doc, params) {\n const fileName = getFSPath(doc);\n if (!fileName) return;\n\n const project = getTSProject(fileName);\n const extracted = processScript(doc, project);\n const sourceOffset = doc.offsetAt(params.position);\n const generatedOffset = extracted.generatedOffsetAt(sourceOffset);\n if (generatedOffset === undefined) return;\n\n const renameLocations = project.service.findRenameLocations(\n fileName,\n generatedOffset,\n false,\n false,\n false,\n );\n\n if (!renameLocations) return;\n\n const changes: { [uri: string]: TextEdit[] } = {};\n\n for (const rename of renameLocations) {\n const renameURI = filenameToURI(rename.fileName);\n const renameDoc = documents.get(renameURI);\n let edit: TextEdit | undefined;\n if (!renameDoc) continue;\n if (markoFileReg.test(renameURI)) {\n const extracted = processScript(renameDoc, project);\n const sourceRange = sourceLocationAtTextSpan(\n extracted,\n rename.textSpan,\n );\n if (sourceRange) {\n edit = {\n newText: params.newName,\n range: sourceRange,\n };\n }\n } else {\n edit = {\n newText: params.newName,\n range: docLocationAtTextSpan(renameDoc, rename.textSpan),\n };\n }\n\n if (edit) {\n if (changes[renameURI]) {\n changes[renameURI].push(edit);\n } else {\n changes[renameURI] = [edit];\n }\n }\n }\n\n return {\n changes,\n };\n },\n doValidate(doc) {\n const fileName = getFSPath(doc);\n if (!fileName) return;\n\n const project = getTSProject(fileName);\n const extracted = processScript(doc, project);\n\n let results: Diagnostic[] | undefined;\n for (const tsDiag of project.service.getSuggestionDiagnostics(fileName)) {\n addDiag(tsDiag);\n }\n\n for (const tsDiag of project.service.getSyntacticDiagnostics(fileName)) {\n addDiag(tsDiag);\n }\n\n for (const tsDiag of project.service.getSemanticDiagnostics(fileName)) {\n addDiag(tsDiag);\n }\n\n return results;\n\n function addDiag(tsDiag: ts.Diagnostic) {\n const diag = convertDiag(extracted, tsDiag);\n if (diag && !IGNORE_DIAG_REG.test(diag.message)) {\n if (results) {\n results.push(diag);\n } else {\n results = [diag];\n }\n }\n }\n },\n};\n\nfunction processScript(doc: TextDocument, tsProject: TSProject) {\n return processDoc(doc, ({ filename, parsed, lookup, dirname }) => {\n const { host, markoScriptLang } = tsProject;\n return extractScript({\n ts,\n parsed,\n lookup,\n translator: Project.getConfig(dirname).translator,\n scriptLang: filename\n ? Project.getScriptLang(filename, markoScriptLang, ts, host)\n : markoScriptLang,\n runtimeTypesCode: Project.getTypeLibs(tsProject.rootDir, ts, host)\n ?.markoTypesCode,\n });\n });\n}\n\nfunction getInsertModuleStatementOffset(parsed: Parsed) {\n const { program } = parsed;\n let firstNode: Node.AnyNode | undefined;\n\n if (program.static.length) {\n // Prefer before the first export, or after the last import.\n let lastImport: Node.Import | undefined;\n for (const node of program.static) {\n switch (node.type) {\n case NodeType.Export:\n return node.start;\n case NodeType.Import:\n lastImport = node;\n break;\n }\n }\n\n if (lastImport) {\n return lastImport.end + 1;\n }\n\n firstNode = program.static[0];\n }\n\n if (program.body.length) {\n if (!firstNode || firstNode.start > program.body[0].start) {\n firstNode = program.body[0];\n }\n }\n\n // Fall back to after the comments of the first node,\n // or the start of the document.\n if (firstNode) {\n return getOffsetAfterComments(firstNode);\n }\n\n return 0;\n}\n\nfunction getOffsetAfterComments(node: Node.AnyNode) {\n const { comments } = node as Node.Commentable;\n if (comments) {\n return comments.at(-1)!.end + 1;\n }\n\n return Math.max(0, node.start - 1);\n}\n\nfunction sourceLocationAtTextSpan(\n extracted: Extracted,\n { start, length }: ts.TextSpan,\n) {\n if (start === 0 && length === 0) return START_LOCATION;\n return extracted.sourceLocationAt(start, start + length);\n}\n\nfunction docLocationAtTextSpan(\n doc: TextDocument,\n { start, length }: ts.TextSpan,\n) {\n return {\n start: doc.positionAt(start),\n end: doc.positionAt(start + length),\n };\n}\n\nfunction getTSConfigFile(fileName: string) {\n let configFile: string | undefined;\n const docFsDir = path.dirname(fileName);\n const cache = Project.getCache(docFsDir);\n let configFileCache = cache.get(getTSConfigFile) as\n | Map<string, string | undefined>\n | undefined;\n\n if (configFileCache) {\n configFile = configFileCache.get(docFsDir);\n } else {\n configFileCache = new Map();\n cache.set(getTSConfigFile, configFileCache);\n }\n\n if (!configFile) {\n configFile =\n ts.findConfigFile(fileName, ts.sys.fileExists, \"tsconfig.json\") ||\n ts.findConfigFile(fileName, ts.sys.fileExists, \"jsconfig.json\");\n }\n\n configFileCache.set(docFsDir, configFile);\n\n return configFile;\n}\n\nfunction getTSProject(docFsPath: string): TSProject {\n let configFile: string | undefined;\n let markoScriptLang = ScriptLang.js;\n\n if (docFsPath) {\n configFile = getTSConfigFile(docFsPath);\n if (configFile?.endsWith(\"tsconfig.json\")) {\n markoScriptLang = ScriptLang.ts;\n }\n }\n\n const basePath = (configFile && path.dirname(configFile)) || process.cwd();\n const cache = Project.getCache(configFile && basePath);\n let projectCache = cache.get(getTSProject) as\n | Map<string, TSProject>\n | undefined;\n let cached: TSProject | undefined;\n\n // The typescript project and it's language service is\n // cached with the Marko compiler cache.\n // This causes the cache to be properly cleared when files change.\n if (projectCache) {\n cached = projectCache.get(basePath);\n if (cached) return cached;\n } else {\n // Within the compiler cache we store a map\n // of project paths to project info.\n projectCache = new Map();\n cache.set(getTSProject, projectCache);\n }\n\n const { fileNames, options, projectReferences } =\n ts.parseJsonConfigFileContent(\n (configFile && ts.readConfigFile(configFile, ts.sys.readFile).config) ||\n defaultTSConfig,\n ts.sys,\n basePath,\n requiredTSCompilerOptions,\n configFile,\n undefined,\n extraTSCompilerExtensions,\n );\n\n options.rootDir = basePath;\n\n // Only ts like files can inject globals into the project, so we filter out everything else.\n const potentialGlobalFiles = new Set<string>(\n fileNames.filter((file) => /\\.[cm]?ts$/.test(file)),\n );\n\n const tsPkgFile =\n configFile &&\n ts.resolveModuleName(\"typescript/package.json\", configFile, options, ts.sys)\n .resolvedModule?.resolvedFileName;\n const defaultLibFile = path.join(\n tsPkgFile ? path.join(tsPkgFile, \"../lib\") : __dirname,\n ts.getDefaultLibFileName(options),\n );\n\n const resolutionCache = ts.createModuleResolutionCache(\n basePath,\n getCanonicalFileName,\n options,\n );\n\n const host: ts.LanguageServiceHost = patch(\n ts,\n configFile,\n extractCache,\n resolutionCache,\n {\n getNewLine() {\n return ts.sys.newLine;\n },\n\n useCaseSensitiveFileNames() {\n return ts.sys.useCaseSensitiveFileNames;\n },\n\n getCompilationSettings() {\n return options;\n },\n\n getCurrentDirectory() {\n return options.rootDir!;\n },\n\n getProjectVersion() {\n return documents.projectVersion.toString(32);\n },\n\n getDefaultLibFileName() {\n return defaultLibFile;\n },\n\n getProjectReferences() {\n return projectReferences;\n },\n\n resolveModuleNameLiterals(\n moduleLiterals,\n containingFile,\n redirectedReference,\n options,\n _containingSourceFile,\n _reusedNames,\n ) {\n return moduleLiterals.map((moduleLiteral) => {\n return ts.bundlerModuleNameResolver(\n moduleLiteral.text,\n containingFile,\n options,\n host,\n resolutionCache,\n redirectedReference,\n );\n });\n },\n\n readDirectory: ts.sys.readDirectory,\n\n readFile: (filename) => documents.get(filenameToURI(filename))?.getText(),\n\n fileExists: (filename) => documents.exists(filenameToURI(filename)),\n\n getScriptFileNames() {\n const result = new Set(potentialGlobalFiles);\n for (const doc of documents.getAllOpen()) {\n const { scheme, fsPath } = URI.parse(doc.uri);\n if (scheme === \"file\") {\n const projectForFile = getTSProject(fsPath);\n if (projectForFile === tsProject) {\n result.add(fsPath);\n }\n }\n }\n\n return [...result];\n },\n\n getScriptVersion(filename) {\n return `${documents.get(filenameToURI(filename))?.version ?? -1}`;\n },\n\n getScriptKind(filename) {\n switch (path.extname(filename)) {\n case ts.Extension.Js:\n case ts.Extension.Cjs:\n case ts.Extension.Mjs:\n return ts.ScriptKind.JS;\n case ts.Extension.Jsx:\n return ts.ScriptKind.JSX;\n case ts.Extension.Ts:\n case ts.Extension.Cts:\n case ts.Extension.Mts:\n return ts.ScriptKind.TS;\n case ts.Extension.Tsx:\n return ts.ScriptKind.TSX;\n case ts.Extension.Json:\n return ts.ScriptKind.JSON;\n default:\n return ts.ScriptKind.Unknown;\n }\n },\n\n getScriptSnapshot(filename) {\n let snapshot = snapshotCache.get(filename);\n if (!snapshot) {\n const doc = documents.get(filenameToURI(filename));\n if (!doc) return;\n snapshot = ts.ScriptSnapshot.fromString(doc.getText());\n snapshotCache.set(filename, snapshot);\n }\n\n return snapshot;\n },\n },\n );\n\n const tsProject: TSProject = {\n host,\n rootDir: options.rootDir!,\n service: ts.createLanguageService(host),\n markoScriptLang,\n };\n\n projectCache.set(basePath, tsProject);\n return tsProject;\n}\n\nfunction filenameToURI(filename: string) {\n return URI.file(filename).toString();\n}\n\nasync function getPreferences(\n scriptLang: ScriptLang,\n): Promise<ts.UserPreferences> {\n const configName = scriptLang === ScriptLang.js ? \"javascript\" : \"typescript\";\n const [preferencesConfig, suggestConfig, inlayHintsConfig] =\n await Promise.all([\n workspace.getConfig(`${configName}.preferences`),\n workspace.getConfig(`${configName}.suggest`),\n workspace.getConfig(`${configName}.inlayHints`),\n ]);\n\n return {\n disableSuggestions: suggestConfig.enabled === false,\n quotePreference: preferencesConfig.quoteStyle || \"auto\",\n includeCompletionsForModuleExports: suggestConfig.autoImports ?? true,\n includeCompletionsForImportStatements:\n suggestConfig.includeCompletionsForImportStatements ?? true,\n includeCompletionsWithSnippetText:\n suggestConfig.includeCompletionsWithSnippetText ?? true,\n includeAutomaticOptionalChainCompletions:\n suggestConfig.includeAutomaticOptionalChainCompletions ?? true,\n includeCompletionsWithInsertText: true,\n includeCompletionsWithClassMemberSnippets:\n suggestConfig.classMemberSnippets?.enabled ?? true,\n includeCompletionsWithObjectLiteralMethodSnippets:\n suggestConfig.objectLiteralMethodSnippets?.enabled ?? true,\n useLabelDetailsInCompletionEntries: true,\n allowIncompleteCompletions: true,\n importModuleSpecifierPreference:\n preferencesConfig.importModuleSpecifierPreference,\n importModuleSpecifierEnding:\n preferencesConfig.importModuleSpecifierEnding || \"auto\",\n allowTextChangesInNewFiles: true,\n providePrefixAndSuffixTextForRename: true,\n includePackageJsonAutoImports:\n preferencesConfig.includePackageJsonAutoImports ?? true,\n provideRefactorNotApplicableReason: true,\n jsxAttributeCompletionStyle:\n preferencesConfig.jsxAttributeCompletionStyle ?? \"auto\",\n includeInlayParameterNameHints:\n inlayHintsConfig.parameterNames?.enabled ?? \"none\",\n includeInlayParameterNameHintsWhenArgumentMatchesName:\n !inlayHintsConfig.parameterNames?.suppressWhenArgumentMatchesName,\n includeInlayFunctionParameterTypeHints:\n inlayHintsConfig.parameterTypes?.enabled ?? true,\n includeInlayVariableTypeHints:\n inlayHintsConfig.variableTypes?.enabled ?? true,\n includeInlayPropertyDeclarationTypeHints:\n inlayHintsConfig.propertyDeclarationTypes?.enabled ?? true,\n includeInlayFunctionLikeReturnTypeHints:\n inlayHintsConfig.functionLikeReturnTypes?.enabled ?? true,\n includeInlayEnumMemberValueHints:\n inlayHintsConfig.enumMemberValues?.enabled ?? true,\n };\n}\n\nfunction printDocumentation(\n docs: ts.SymbolDisplayPart[] | undefined,\n tags: ts.JSDocTagInfo[] | undefined,\n) {\n let result = \"\";\n let sep = \"\";\n if (docs) {\n result += ts.displayPartsToString(docs);\n sep = \" \\n\\n\";\n }\n\n if (tags) {\n for (const tag of tags) {\n result += sep + printJSDocTag(tag);\n sep = \" \\n\\n\";\n }\n }\n\n return result;\n}\n\nfunction convertDiag(\n extracted: Extracted,\n tsDiag: ts.Diagnostic,\n): Diagnostic | undefined {\n const sourceRange =\n tsDiag.start === undefined\n ? START_LOCATION\n : sourceLocationAtTextSpan(extracted, tsDiag as ts.TextSpan);\n\n if (sourceRange) {\n return {\n range: sourceRange,\n source: \"script\",\n code: tsDiag.code,\n tags: convertDiagTags(tsDiag),\n severity: convertDiagSeverity(tsDiag),\n message: ts.flattenDiagnosticMessageText(tsDiag.messageText, \"\\n\"),\n };\n }\n}\n\nfunction convertDiagSeverity(tsDiag: ts.Diagnostic) {\n switch (tsDiag.category) {\n case ts.DiagnosticCategory.Error:\n return DiagnosticSeverity.Error;\n case ts.DiagnosticCategory.Warning:\n return DiagnosticSeverity.Warning;\n case ts.DiagnosticCategory.Suggestion:\n return DiagnosticSeverity.Hint;\n default:\n return DiagnosticSeverity.Information;\n }\n}\n\nfunction convertDiagTags(tsDiag: ts.Diagnostic) {\n let tags: DiagnosticTag[] | undefined;\n\n if (tsDiag.reportsDeprecated) {\n tags = [DiagnosticTag.Deprecated];\n }\n\n if (tsDiag.reportsUnnecessary) {\n if (tags) tags.push(DiagnosticTag.Unnecessary);\n else tags = [DiagnosticTag.Unnecessary];\n }\n\n return tags;\n}\n\nfunction convertCompletionItemKind(kind: ts.ScriptElementKind) {\n switch (kind) {\n case ts.ScriptElementKind.warning:\n case ts.ScriptElementKind.linkText:\n return CompletionItemKind.Text;\n\n case ts.ScriptElementKind.keyword:\n case ts.ScriptElementKind.primitiveType:\n return CompletionItemKind.Keyword;\n\n case ts.ScriptElementKind.scriptElement:\n return CompletionItemKind.File;\n\n case ts.ScriptElementKind.directory:\n return CompletionItemKind.Folder;\n\n case ts.ScriptElementKind.label:\n case ts.ScriptElementKind.string:\n return CompletionItemKind.Constant;\n\n case ts.ScriptElementKind.moduleElement:\n case ts.ScriptElementKind.externalModuleName:\n return CompletionItemKind.Module;\n\n case ts.ScriptElementKind.typeElement:\n case ts.ScriptElementKind.classElement:\n case ts.ScriptElementKind.localClassElement:\n return CompletionItemKind.Class;\n\n case ts.ScriptElementKind.interfaceElement:\n return CompletionItemKind.Interface;\n\n case ts.ScriptElementKind.enumElement:\n return CompletionItemKind.Enum;\n\n case ts.ScriptElementKind.enumMemberElement:\n return CompletionItemKind.EnumMember;\n\n case ts.ScriptElementKind.alias:\n case ts.ScriptElementKind.letElement:\n case ts.ScriptElementKind.constElement:\n case ts.ScriptElementKind.variableElement:\n case ts.ScriptElementKind.parameterElement:\n case ts.ScriptElementKind.localVariableElement:\n return CompletionItemKind.Variable;\n\n case ts.ScriptElementKind.functionElement:\n case ts.ScriptElementKind.localFunctionElement:\n return CompletionItemKind.Function;\n\n case ts.ScriptElementKind.callSignatureElement:\n case ts.ScriptElementKind.memberFunctionElement:\n case ts.ScriptElementKind.indexSignatureElement:\n case ts.ScriptElementKind.constructSignatureElement:\n return CompletionItemKind.Method;\n\n case ts.ScriptElementKind.memberGetAccessorElement:\n case ts.ScriptElementKind.memberSetAccessorElement:\n case ts.ScriptElementKind.memberVariableElement:\n return CompletionItemKind.Field;\n\n case ts.ScriptElementKind.constructorImplementationElement:\n return CompletionItemKind.Constructor;\n\n case ts.ScriptElementKind.typeParameterElement:\n return CompletionItemKind.TypeParameter;\n\n case ts.ScriptElementKind.link:\n case ts.ScriptElementKind.linkName:\n return CompletionItemKind.Reference;\n\n default:\n return CompletionItemKind.Property;\n }\n}\n\nfunction getTSTriggerChar(char: string | undefined) {\n if (char && tsTriggerChars.has(char))\n return char as ts.CompletionsTriggerCharacter;\n}\n\nexport { ScriptService as default };\n", "import {\n type Extracted,\n getExt,\n isDefinitionFile,\n Processors,\n Project,\n} from \"@marko/language-tools\";\nimport path from \"path\";\nimport type ts from \"typescript/lib/tsserverlibrary\";\n\nconst fsPathReg = /^(?:[./\\\\]|[A-Z]:)/i;\nconst modulePartsReg = /^((?:@(?:[^/]+)\\/)?(?:[^/]+))(.*)$/;\nconst importTagReg = /^<([^>]+)>$/;\n\nexport interface ExtractedSnapshot extends Extracted {\n snapshot: ts.IScriptSnapshot;\n}\n\nexport function patch(\n ts: typeof import(\"typescript/lib/tsserverlibrary\"),\n configFile: string | undefined,\n extractCache: Map<\n string,\n ExtractedSnapshot | { snapshot: ts.IScriptSnapshot }\n >,\n resolutionCache: ts.ModuleResolutionCache | undefined,\n host: ts.LanguageServiceHost,\n ps?: InstanceType<typeof ts.server.ProjectService>,\n) {\n const processors = Processors.create({\n ts,\n host,\n configFile,\n });\n const rootNames = Object.values(processors)\n .map((processor) => processor.getRootNames?.())\n .flat()\n .filter(Boolean) as string[];\n\n const trackFile = ps\n ? (fileName: string) => {\n // Ensure the project service knows about the file.\n // Without this the project never registers a `ScriptInfo`.\n // TODO: maybe we should patch readFile instead of getScriptSnapshot?\n\n ps.getOrCreateScriptInfoForNormalizedPath(\n fileName as any,\n true,\n undefined,\n ts.ScriptKind.Deferred,\n false,\n host,\n );\n }\n : () => {};\n\n /**\n * Ensure the processor runtime definitions are always loaded.\n */\n const getScriptFileNames = host.getScriptFileNames.bind(host);\n host.getScriptFileNames = () => [\n ...new Set(rootNames.concat(getScriptFileNames())),\n ];\n\n /**\n * Trick TypeScript into thinking Marko files are TS/JS files.\n */\n const getScriptKind = host.getScriptKind?.bind(host);\n if (getScriptKind) {\n host.getScriptKind = (fileName: string) => {\n const processor = getProcessor(fileName);\n if (processor) return processor.getScriptKind(fileName);\n return getScriptKind(fileName);\n };\n }\n\n /**\n * A script snapshot is an immutable string of text representing the contents of a file.\n * We patch it so that Marko files instead return their extracted ts code.\n */\n const getScriptSnapshot = host.getScriptSnapshot.bind(host);\n host.getScriptSnapshot = (fileName: string) => {\n const processor = getProcessor(fileName);\n if (processor) {\n let cached = extractCache.get(fileName);\n\n if (!cached) {\n const code = host.readFile(fileName, \"utf-8\") || \"\";\n\n try {\n cached = processor.extract(fileName, code) as ExtractedSnapshot;\n cached.snapshot = ts.ScriptSnapshot.fromString(cached.toString());\n } catch {\n cached = { snapshot: ts.ScriptSnapshot.fromString(\"\") };\n }\n\n trackFile(fileName);\n extractCache.set(fileName, cached);\n }\n\n return cached.snapshot;\n }\n\n return getScriptSnapshot(fileName);\n };\n\n if (host.getProjectVersion) {\n const getScriptVersion = host.getScriptVersion.bind(host);\n host.getScriptVersion = (fileName: string) => {\n const processor = getProcessor(fileName);\n if (processor) return host.getProjectVersion!();\n return getScriptVersion(fileName);\n };\n }\n\n /**\n * This ensures that any directory reads with specific file extensions also include Marko.\n * It is used for example when completing the `from` property of the `import` statement.\n */\n const readDirectory = host.readDirectory?.bind(host);\n if (readDirectory) {\n host.readDirectory = (path, extensions, exclude, include, depth) => {\n return readDirectory(\n path,\n extensions?.concat(Processors.extensions),\n exclude,\n include,\n depth,\n );\n };\n }\n\n /**\n * TypeScript doesn't know how to resolve `.marko` files.\n * Below we first try to use TypeScripts normal resolution, and then fallback\n * to seeing if a `.marko` file exists at the same location.\n */\n const resolveModuleNameLiterals = host.resolveModuleNameLiterals?.bind(host);\n\n if (resolveModuleNameLiterals) {\n host.resolveModuleNameLiterals = (\n moduleLiterals,\n containingFile,\n redirectedReference,\n options,\n containingSourceFile,\n reusedNames,\n ) => {\n let normalModuleLiterals = moduleLiterals as ts.StringLiteralLike[];\n let resolvedModules:\n | undefined\n | (ts.ResolvedModuleWithFailedLookupLocations | undefined)[];\n\n for (let i = 0; i < moduleLiterals.length; i++) {\n const moduleLiteral = moduleLiterals[i];\n let moduleName = moduleLiteral.text;\n\n const tagNameMatch = importTagReg.exec(moduleName);\n if (tagNameMatch) {\n // Try to resolve `import Tag from \"<tag>\"` style imports.\n const [, tagName] = tagNameMatch;\n const tagDef = Project.getTagLookup(\n path.dirname(containingFile),\n ).getTag(tagName);\n const tagFileName = tagDef && (tagDef.template || tagDef.renderer);\n if (tagFileName) {\n moduleName = tagFileName;\n }\n }\n\n const processor =\n moduleName[0] !== \"*\" ? getProcessor(moduleName) : undefined;\n if (processor) {\n let resolvedFileName: string | undefined;\n if (fsPathReg.test(moduleName)) {\n // For fs paths just see if it exists on disk.\n resolvedFileName = path.resolve(containingFile, \"..\", moduleName);\n } else {\n // For other paths we treat it as a node_module and try resolving\n // that modules `marko.json`. If the `marko.json` exists then we'll\n // try resolving the `.marko` file relative to that.\n const [, nodeModuleName, relativeModulePath] =\n modulePartsReg.exec(moduleName)!;\n const { resolvedModule } = ts.nodeModuleNameResolver(\n `${nodeModuleName}/package.json`,\n containingFile,\n options,\n host,\n resolutionCache,\n redirectedReference,\n );\n\n if (resolvedModule) {\n resolvedFileName = path.join(\n resolvedModule.resolvedFileName,\n \"..\",\n relativeModulePath,\n );\n }\n }\n\n if (!resolvedModules) {\n resolvedModules = [];\n normalModuleLiterals = [];\n for (let j = 0; j < i; j++) {\n resolvedModules.push(undefined);\n normalModuleLiterals.push(moduleLiterals[j]);\n }\n }\n\n if (resolvedFileName) {\n if (isDefinitionFile(resolvedFileName)) {\n if (!host.fileExists(resolvedFileName)) {\n resolvedFileName = undefined;\n }\n } else {\n const ext = getExt(resolvedFileName)!;\n const definitionFile = `${resolvedFileName.slice(\n 0,\n -ext.length,\n )}.d${ext}`;\n if (host.fileExists(definitionFile)) {\n resolvedFileName = definitionFile;\n } else if (!host.fileExists(resolvedFileName)) {\n resolvedFileName = undefined;\n }\n }\n }\n\n resolvedModules.push({\n resolvedModule: resolvedFileName\n ? {\n resolvedFileName,\n extension: processor.getScriptExtension(resolvedFileName),\n isExternalLibraryImport: false,\n }\n : undefined,\n });\n } else if (resolvedModules) {\n resolvedModules.push(undefined);\n normalModuleLiterals.push(moduleLiteral);\n }\n }\n\n const normalResolvedModules = normalModuleLiterals.length\n ? resolveModuleNameLiterals(\n normalModuleLiterals,\n containingFile,\n redirectedReference,\n options,\n containingSourceFile,\n reusedNames,\n )\n : undefined;\n\n if (resolvedModules) {\n if (normalResolvedModules) {\n for (let i = 0, j = 0; i < resolvedModules.length; i++) {\n if (!resolvedModules[i]) {\n resolvedModules[i] = normalResolvedModules[j++];\n }\n }\n }\n return resolvedModules as readonly ts.ResolvedModuleWithFailedLookupLocations[];\n } else {\n return normalResolvedModules!;\n }\n };\n }\n\n return host;\n\n function getProcessor(fileName: string) {\n const ext = getExt(fileName);\n return ext ? processors[ext] : undefined;\n }\n}\n", "import type { Connection } from \"vscode-languageserver\";\n\nlet isInitialized = false;\nlet connection!: Connection;\nconst configChangeHandlers: Set<ConfigChangeHandler> = new Set();\nconst settingsCache = new Map<string, any>();\n\nexport async function getConfig<T = any>(section: string): Promise<T> {\n let cached = settingsCache.get(section);\n if (!cached) {\n try {\n cached = (await connection.workspace.getConfiguration(section)) || {};\n settingsCache.set(section, cached);\n } catch {\n // ignore\n }\n }\n\n return cached;\n}\n\nexport type ConfigChangeHandler = () => void;\nexport function onConfigChange(handler: ConfigChangeHandler) {\n configChangeHandlers.add(handler);\n}\n\nexport function setup(_: Connection) {\n connection = _;\n connection.onDidChangeConfiguration(() => {\n if (isInitialized) {\n settingsCache.clear();\n emitConfigChange();\n } else {\n isInitialized = true;\n }\n });\n}\n\nfunction emitConfigChange() {\n for (const handler of configChangeHandlers) {\n handler();\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See \"Notice\" file in this package for license information.\n *--------------------------------------------------------------------------------------------*/\n\n/**\n * adopted from https://github.com/microsoft/vscode/blob/b9202b64081bb1267792a8d2d023e4c746ed0f73/extensions/typescript-language-features/src/languageFeatures/util/textRendering.ts\n */\n\nimport type ts from \"typescript/lib/tsserverlibrary\";\n\nconst REG_BACK_TICK = /`/g;\nconst REG_LINE = /\\r\\n|\\n/;\nconst REG_CODE_BLOCK = /^\\s*[~`]{3}/m;\nconst REG_CAPTION = /^<caption>(.*?)<\\/caption>\\s*(\\r\\n|\\n)/;\n\nexport default function printJSDocTag(\n tag: ts.JSDocTagInfo,\n): string | undefined {\n switch (tag.name) {\n case \"augments\":\n case \"extends\":\n case \"param\":\n case \"template\": {\n const body = getTagBodyParts(tag);\n if (body?.length === 3) {\n const [, param, text] = body;\n return `${printTagName(tag.name)} \\`${param}\\`${printTagBody(\n replaceLinks(text),\n )}`;\n }\n break;\n }\n\n case \"return\":\n case \"returns\": {\n if (!tag.text?.length) return undefined;\n break;\n }\n }\n\n return printTagName(tag.name) + printTagBody(getTagBodyText(tag));\n}\n\nfunction getTagBodyParts(tag: ts.JSDocTagInfo): Array<string> | undefined {\n if (tag.name === \"template\") {\n const parts = tag.text;\n if (parts) {\n const params = parts\n .filter((p) => p.kind === \"typeParameterName\")\n .map((p) => p.text)\n .join(\", \");\n const docs = parts\n .filter((p) => p.kind === \"text\")\n .map((p) => convertLinkTags(p.text.replace(/^\\s*-?\\s*/, \"\")))\n .join(\" \");\n return params ? [\"\", params, docs] : undefined;\n }\n }\n return convertLinkTags(tag.text).split(/^(\\S+)\\s*-?\\s*/);\n}\n\nfunction getTagBodyText(tag: ts.JSDocTagInfo): string {\n if (!tag.text) return \"\";\n\n const text = convertLinkTags(tag.text);\n switch (tag.name) {\n case \"example\": {\n const captionTagMatches = REG_CAPTION.exec(text);\n if (captionTagMatches) {\n const [captionMatch, captionText] = captionTagMatches;\n return `${captionText}\\n${ensureCodeblock(\n captionText.slice(captionMatch.length),\n )}`;\n } else {\n return ensureCodeblock(text);\n }\n }\n case \"author\": {\n const emailMatch = text.match(/(.+)\\s<([-.\\w]+@[-.\\w]+)>/);\n\n if (emailMatch) {\n return `${emailMatch[1]} ${emailMatch[2]}`;\n }\n\n return text;\n }\n case \"default\":\n return ensureCodeblock(text);\n }\n\n return replaceLinks(text);\n}\n\nfunction convertLinkTags(\n parts: readonly ts.SymbolDisplayPart[] | string | undefined,\n): string {\n if (!parts) return \"\";\n if (typeof parts === \"string\") return parts;\n\n let result = \"\";\n let currentLink:\n | { name?: string; target?: any; text?: string; readonly linkcode: boolean }\n | undefined;\n\n for (const part of parts) {\n switch (part.kind) {\n case \"link\":\n if (currentLink) {\n if (currentLink.target) {\n const linkText = currentLink.text\n ? currentLink.text\n : escapeBackTicks(currentLink.name ?? \"\");\n result += `[${\n currentLink.linkcode ? \"`\" + linkText + \"`\" : linkText\n }](${currentLink.target.file})`;\n } else {\n const text = currentLink.text ?? currentLink.name;\n if (text) {\n if (/^https?:/.test(text)) {\n const parts = text.split(\" \");\n if (parts.length === 1) {\n result += parts[0];\n } else if (parts.length > 1) {\n const linkText = escapeBackTicks(parts.slice(1).join(\" \"));\n result += `[${\n currentLink.linkcode ? \"`\" + linkText + \"`\" : linkText\n }](${parts[0]})`;\n }\n } else {\n result += escapeBackTicks(text);\n }\n }\n }\n currentLink = undefined;\n } else {\n currentLink = {\n linkcode: part.text === \"{@linkcode \",\n };\n }\n break;\n\n case \"linkName\":\n if (currentLink) {\n currentLink.name = part.text;\n currentLink.target = (part as ts.JSDocLinkDisplayPart).target;\n }\n break;\n\n case \"linkText\":\n if (currentLink) {\n currentLink.text = part.text;\n }\n break;\n\n default:\n result += part.text;\n break;\n }\n }\n return replaceLinks(result);\n}\n\nfunction replaceLinks(text: string): string {\n return text.replace(\n /\\{@(link|linkplain|linkcode) (https?:\\/\\/[^ |}]+?)(?:[| ]([^{}\\n]+?))?\\}/gi,\n (_, tag: string, link: string, text?: string) => {\n const alt = text ? text.trim() : link;\n return `[${tag === \"linkcode\" ? `\\`${alt}\\`` : alt}](${link})`;\n },\n );\n}\n\nfunction printTagBody(text: string | undefined) {\n if (text) {\n return (REG_LINE.test(text) ? \" \\n\" : \" \u2014 \") + text;\n }\n\n return \"\";\n}\n\nfunction printTagName(name: string) {\n return `*@${name}*`;\n}\n\nfunction ensureCodeblock(text: string): string {\n return REG_CODE_BLOCK.test(text) ? text : \"```\\n\" + text + \"\\n```\";\n}\n\nfunction escapeBackTicks(text: string): string {\n return text.replace(REG_BACK_TICK, \"\\\\$&\");\n}\n", "import { type Extracted, extractStyle } from \"@marko/language-tools\";\nimport {\n getCSSLanguageService,\n getLESSLanguageService,\n getSCSSLanguageService,\n type LanguageService,\n type LanguageServiceOptions,\n type Stylesheet,\n} from \"vscode-css-languageservice\";\nimport {\n ColorInformation,\n ColorPresentation,\n Diagnostic,\n DocumentHighlight,\n DocumentLink,\n InitializeParams,\n InsertReplaceEdit,\n Location,\n Range,\n SymbolInformation,\n TextDocumentEdit,\n TextEdit,\n} from \"vscode-languageserver\";\nimport { TextDocument } from \"vscode-languageserver-textdocument\";\n\nimport { processDoc } from \"../../utils/file\";\nimport fileSystemProvider from \"../../utils/file-system\";\nimport resolveReference from \"../../utils/resolve-url\";\nimport type { Plugin } from \"../types\";\n\ninterface ProcessedStyle {\n parsed: Stylesheet;\n extracted: Extracted;\n virtualDoc: TextDocument;\n service: LanguageService;\n}\n\nconst services: Record<\n string,\n (options: LanguageServiceOptions) => LanguageService\n> = {\n \".css\": getCSSLanguageService,\n \".less\": getLESSLanguageService,\n \".scss\": getSCSSLanguageService,\n};\nlet clientCapabilities: InitializeParams[\"capabilities\"] | undefined;\n\nconst StyleSheetService: Partial<Plugin> = {\n initialize(params) {\n clientCapabilities = params.capabilities;\n },\n async doComplete(doc, params) {\n const sourceOffset = doc.offsetAt(params.position);\n for (const style of processStyle(doc)) {\n // Find the first stylesheet data that contains the offset.\n const generatedPos = style.extracted.generatedPositionAt(sourceOffset);\n if (generatedPos === undefined) continue;\n\n const result = await style.service.doComplete2(\n style.virtualDoc,\n generatedPos,\n style.parsed,\n { resolveReference },\n );\n\n if (result.itemDefaults) {\n const { editRange } = result.itemDefaults;\n if (editRange) {\n if (\"start\" in editRange) {\n result.itemDefaults.editRange = getSourceRange(style, editRange);\n } else {\n editRange.insert = getSourceRange(style, editRange.insert)!;\n editRange.replace = getSourceRange(style, editRange.replace)!;\n }\n }\n }\n\n for (const item of result.items) {\n if (item.textEdit) {\n item.textEdit = getSourceInsertReplaceEdit(style, item.textEdit);\n }\n\n if (item.additionalTextEdits) {\n item.additionalTextEdits = getSourceEdits(\n style,\n item.additionalTextEdits,\n );\n }\n }\n\n return result;\n }\n },\n findDefinition(doc, params) {\n const sourceOffset = doc.offsetAt(params.position);\n for (const style of processStyle(doc)) {\n // Find the first stylesheet data that contains the offset.\n const generatedPos = style.extracted.generatedPositionAt(sourceOffset);\n if (generatedPos === undefined) continue;\n\n const result = style.service.findDefinition(\n style.virtualDoc,\n generatedPos,\n style.parsed,\n );\n\n if (result) {\n const sourceRange = getSourceRange(style, result.range);\n if (sourceRange) {\n return {\n range: sourceRange,\n uri: doc.uri,\n };\n }\n }\n\n break;\n }\n },\n findReferences(doc, params) {\n const sourceOffset = doc.offsetAt(params.position);\n for (const style of processStyle(doc)) {\n // Find the first stylesheet data that contains the offset.\n const generatedPos = style.extracted.generatedPositionAt(sourceOffset);\n if (generatedPos === undefined) continue;\n\n const result: Location[] = [];\n for (const location of style.service.findReferences(\n style.virtualDoc,\n generatedPos,\n style.parsed,\n )) {\n const sourceRange = getSourceRange(style, location.range);\n if (sourceRange) {\n result.push({\n range: sourceRange,\n uri: location.uri,\n });\n }\n }\n\n return result.length ? result : undefined;\n }\n },\n findDocumentSymbols(doc) {\n const result: SymbolInformation[] = [];\n for (const extracted of processStyle(doc)) {\n for (const symbol of extracted.service.findDocumentSymbols(\n extracted.virtualDoc,\n extracted.parsed,\n )) {\n if (symbol.location.uri === doc.uri) {\n const sourceRange = getSourceRange(extracted, symbol.location.range);\n if (sourceRange) {\n result.push({\n kind: symbol.kind,\n name: symbol.name,\n tags: symbol.tags,\n deprecated: symbol.deprecated,\n containerName: symbol.containerName,\n location: { uri: doc.uri, range: sourceRange },\n });\n }\n } else {\n result.push(symbol);\n }\n }\n }\n\n return result.length ? result : undefined;\n },\n async findDocumentLinks(doc) {\n const result: DocumentLink[] = [];\n for (const extracted of processStyle(doc)) {\n for (const link of await extracted.service.findDocumentLinks2(\n extracted.virtualDoc,\n extracted.parsed,\n { resolveReference },\n )) {\n const sourceRange = getSourceRange(extracted, link.range);\n if (sourceRange) {\n result.push({\n range: sourceRange,\n target: link.target,\n tooltip: link.tooltip,\n data: link.data,\n });\n }\n }\n }\n\n return result.length ? result : undefined;\n },\n findDocumentHighlights(doc, params) {\n const sourceOffset = doc.offsetAt(params.position);\n for (const style of processStyle(doc)) {\n // Find the first stylesheet data that contains the offset.\n const generatedPos = style.extracted.generatedPositionAt(sourceOffset);\n if (generatedPos === undefined) continue;\n\n const result: DocumentHighlight[] = [];\n for (const highlight of style.service.findDocumentHighlights(\n style.virtualDoc,\n generatedPos,\n style.parsed,\n )) {\n const sourceRange = getSourceRange(style, highlight.range);\n if (sourceRange) {\n result.push({\n range: sourceRange,\n kind: highlight.kind,\n });\n }\n }\n\n return result.length ? result : undefined;\n }\n },\n findDocumentColors(doc) {\n const result: ColorInformation[] = [];\n for (const extracted of processStyle(doc)) {\n for (const colorInfo of extracted.service.findDocumentColors(\n extracted.virtualDoc,\n extracted.parsed,\n )) {\n const sourceRange = getSourceRange(extracted, colorInfo.range);\n if (sourceRange) {\n result.push({\n range: sourceRange,\n color: colorInfo.color,\n });\n }\n }\n }\n\n return result.length ? result : undefined;\n },\n getColorPresentations(doc, params) {\n for (const extracted of processStyle(doc)) {\n const generatedRange = getGeneratedRange(doc, extracted, params.range);\n // Find the first stylesheet data that contains the offset.\n if (generatedRange === undefined) continue;\n\n const result: ColorPresentation[] = [];\n for (const colorPresentation of extracted.service.getColorPresentations(\n extracted.virtualDoc,\n extracted.parsed,\n params.color,\n generatedRange,\n )) {\n const textEdit =\n colorPresentation.textEdit &&\n getSourceEdit(extracted, colorPresentation.textEdit);\n const additionalTextEdits =\n colorPresentation.additionalTextEdits &&\n getSourceEdits(extracted, colorPresentation.additionalTextEdits);\n\n if (textEdit || additionalTextEdits) {\n result.push({\n label: colorPresentation.label,\n textEdit,\n additionalTextEdits,\n });\n }\n }\n\n return result.length ? result : undefined;\n }\n },\n doHover(doc, params) {\n const sourceOffset = doc.offsetAt(params.position);\n for (const style of processStyle(doc)) {\n // Find the first stylesheet data that contains the offset.\n const generatedPos = style.extracted.generatedPositionAt(sourceOffset);\n if (generatedPos === undefined) continue;\n\n const result = style.service.doHover(\n style.virtualDoc,\n generatedPos,\n style.parsed,\n );\n\n if (result) {\n if (result.range) {\n const sourceRange = getSourceRange(style, result.range);\n if (sourceRange) {\n return {\n range: sourceRange,\n contents: result.contents,\n };\n }\n } else {\n return result;\n }\n }\n }\n },\n async doRename(doc, params) {\n const sourceOffset = doc.offsetAt(params.position);\n for (const style of processStyle(doc)) {\n // Find the first stylesheet data that contains the offset.\n const generatedOffset = style.extracted.generatedOffsetAt(sourceOffset);\n if (generatedOffset === undefined) continue;\n\n const result = style.service.doRename(\n style.virtualDoc,\n style.virtualDoc.positionAt(generatedOffset),\n params.newName,\n style.parsed,\n );\n\n if (result.changes) {\n for (const uri in result.changes) {\n if (uri === doc.uri) {\n result.changes[uri] =\n getSourceEdits(style, result.changes[uri]) || [];\n }\n }\n }\n\n if (result.documentChanges) {\n for (const change of result.documentChanges) {\n if (TextDocumentEdit.is(change)) {\n if (change.textDocument.uri === doc.uri) {\n change.edits = getSourceEdits(style, change.edits) || [];\n }\n }\n }\n }\n\n return result;\n }\n },\n doCodeActions(doc, params) {\n for (const extracted of processStyle(doc)) {\n // Find the first stylesheet data that contains the offset.\n const generatedRange = getGeneratedRange(doc, extracted, params.range);\n if (generatedRange === undefined) continue;\n\n const result = extracted.service.doCodeActions(\n extracted.virtualDoc,\n generatedRange,\n params.context,\n extracted.parsed,\n );\n\n for (const command of result) {\n const edits = command.arguments?.[2];\n if (edits && Array.isArray(edits) && isTextEdit(edits[0])) {\n command.arguments![2] = getSourceEdits(extracted, edits);\n }\n }\n\n return result;\n }\n },\n doValidate(doc) {\n const result: Diagnostic[] = [];\n for (const extracted of processStyle(doc)) {\n for (const diag of extracted.service.doValidation(\n extracted.virtualDoc,\n extracted.parsed,\n )) {\n const sourceRange = getSourceRange(extracted, diag.range);\n if (sourceRange) {\n diag.source = \"style\";\n diag.range = sourceRange;\n result.push(diag);\n }\n }\n }\n\n return result.length ? result : undefined;\n },\n};\n\nexport { StyleSheetService as default };\n\nfunction processStyle(doc: TextDocument) {\n return processDoc(doc, ({ uri, version, parsed, lookup }) => {\n const result: ProcessedStyle[] = [];\n for (const [ext, extracted] of extractStyle({\n parsed,\n lookup,\n })) {\n const service = services[ext]?.({\n fileSystemProvider,\n clientCapabilities,\n });\n if (service) {\n const virtualDoc = TextDocument.create(\n uri,\n \"css\",\n version,\n extracted.toString(),\n );\n result.push({\n service,\n extracted,\n virtualDoc,\n parsed: service.parseStylesheet(virtualDoc),\n });\n }\n }\n\n return result;\n });\n}\n\nfunction getSourceEdits(\n extracted: ProcessedStyle,\n edits: TextEdit[],\n): TextEdit[] | undefined {\n const result: TextEdit[] = [];\n\n for (const edit of edits) {\n const sourceEdit = getSourceEdit(extracted, edit);\n if (sourceEdit) {\n result.push(sourceEdit);\n }\n }\n\n return result.length ? result : undefined;\n}\n\nfunction getSourceEdit(\n extracted: ProcessedStyle,\n textEdit: TextEdit,\n): TextEdit | undefined {\n const sourceRange = getSourceRange(extracted, textEdit.range);\n if (sourceRange) {\n return {\n newText: textEdit.newText,\n range: sourceRange,\n };\n }\n}\n\nfunction getSourceInsertReplaceEdit(\n extracted: ProcessedStyle,\n textEdit: TextEdit | InsertReplaceEdit,\n): TextEdit | InsertReplaceEdit | undefined {\n if (isTextEdit(textEdit)) {\n return getSourceEdit(extracted, textEdit);\n } else if (textEdit.replace) {\n const sourceRange = getSourceRange(extracted, textEdit.replace);\n if (sourceRange) {\n return {\n newText: textEdit.newText,\n replace: sourceRange,\n } as InsertReplaceEdit;\n }\n } else {\n const sourceRange = getSourceRange(extracted, textEdit.insert);\n if (sourceRange) {\n return {\n newText: textEdit.newText,\n insert: sourceRange,\n } as InsertReplaceEdit;\n }\n }\n}\n\nfunction getSourceRange(\n style: ProcessedStyle,\n range: Range,\n): Range | undefined {\n return style.extracted.sourceLocationAt(\n style.virtualDoc.offsetAt(range.start),\n style.virtualDoc.offsetAt(range.end),\n );\n}\n\nfunction getGeneratedRange(\n doc: TextDocument,\n style: ProcessedStyle,\n range: Range,\n): Range | undefined {\n return style.extracted.generatedLocationAt(\n doc.offsetAt(range.start),\n doc.offsetAt(range.end),\n );\n}\n\nfunction isTextEdit(edit: TextEdit | InsertReplaceEdit): edit is TextEdit {\n return (edit as TextEdit).range !== undefined;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["path", "defaultConfig", "import_language_tools", "import_util", "import_vscode_languageserver", "fs", "import_language_tools", "import_language_tools", "import_path", "import_vscode_uri", "path", "process", "axe", "import_language_tools", "import_vscode_languageserver", "import_path", "import_vscode_languageserver", "stat", "fs", "import_language_tools", "path", "import_language_tools", "import_vscode_languageserver", "import_path", "import_vscode_languageserver", "import_vscode_uri", "path", "import_language_tools", "tag", "import_language_tools", "import_vscode_languageserver", "import_language_tools", "import_language_tools", "import_fs", "import_vscode_uri", "AttrName", "fs", "import_language_tools", "import_fs", "import_path", "import_vscode_uri", "OpenTagName", "path", "fs", "handlers", "OpenTagName", "AttrName", "import_language_tools", "importTagReg", "import_language_tools", "import_vscode_languageserver", "import_language_tools", "import_vscode_languageserver", "format", "import_language_tools", "OpenTagName", "handlers", "OpenTagName", "import_language_tools", "import_path", "import_vscode_languageserver", "path", "format", "import_language_tools", "import_path", "prettier", "import_vscode_languageserver", "import_vscode_uri", "import_language_tools", "import_path", "importTagReg", "ts", "extractCache", "readDirectory", "path", "connection", "setup", "docs", "parts", "text", "extractCache", "ts", "path", "extracted", "options", "docs", "import_language_tools", "import_vscode_css_languageservice", "import_vscode_languageserver", "import_vscode_languageserver_textdocument", "service", "connection", "setup"]
|
|
7
7
|
}
|