{
  "version": 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/code-actions.ts", "../src/service/marko/validate.ts", "../src/service/marko/compile.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/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"],
  "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  type 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 { markoCodeActionKinds } from \"./service/marko/code-actions\";\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: { prepareProvider: true },\n      codeActionProvider: {\n        resolveProvider: true,\n        codeActionKinds: markoCodeActionKinds,\n      },\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    )) || []\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    )) || []\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.onPrepareRename(async (params, cancel) => {\n  return (\n    (await service.prepareRename(\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.onCodeActionResolve(async (action, cancel) => {\n  return (await service.doCodeActionResolve(action, cancel)) || action;\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      for (const ref of result.value) {\n        references ||= [];\n        // Drop a reference overlapping one from an earlier plugin (eg a CSS\n        // module class found by both the script and style plugins).\n        if (\n          !references.some(\n            (it) => it.uri === ref.uri && rangesOverlap(it.range, ref.range),\n          )\n        ) {\n          references.push(ref);\n        }\n      }\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 prepareRename(doc, params, cancel) {\n    for (const plugin of plugins) {\n      try {\n        const result = await plugin.prepareRename?.(doc, params, cancel);\n        if (cancel.isCancellationRequested) return;\n        if (result) return result;\n      } catch {\n        // ignore\n      }\n    }\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        changes ||= {};\n\n        for (const uri in value.changes) {\n          const existing = (changes[uri] ||= []);\n          for (const edit of value.changes[uri]) {\n            // Drop an edit overlapping one from an earlier plugin, which would\n            // otherwise corrupt the rename.\n            if (!existing.some((it) => rangesOverlap(it.range, edit.range))) {\n              existing.push(edit);\n            }\n          }\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 doCodeActionResolve(action, cancel) {\n    for (const plugin of plugins) {\n      try {\n        const result = await plugin.doCodeActionResolve?.(action, cancel);\n        if (cancel.isCancellationRequested) return;\n        if (result) return result;\n      } catch {\n        // ignore\n      }\n    }\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 positionBefore(a: Range[\"start\"], b: Range[\"start\"]) {\n  return a.line < b.line || (a.line === b.line && a.character < b.character);\n}\n\n/** Whether two ranges overlap (ie two plugins reported the same token). */\nfunction rangesOverlap(a: Range, b: Range) {\n  return positionBefore(a.start, b.end) && positionBefore(b.start, a.end);\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  type DidChangeTextDocumentParams,\n  type DidChangeWatchedFilesParams,\n  type DidCloseTextDocumentParams,\n  type 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?.languageId !== \"marko\") 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 type { Diagnostic as CompilerDiagnostic } from \"@marko/compiler/babel-utils\";\nimport { Project } from \"@marko/language-tools\";\nimport path from \"path\";\nimport * as prettier from \"prettier\";\nimport * as markoPrettier from \"prettier-plugin-marko\";\nimport {\n  type CodeAction,\n  CodeActionKind,\n  type Diagnostic,\n  type InitializeParams,\n  type Position,\n  type Range,\n  TextEdit,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\n\nimport { getFSPath } from \"../../utils/file\";\nimport * as documents from \"../../utils/text-documents\";\nimport type { Plugin } from \"../types\";\nimport { compilerConfig, getMarkoDiagnostics } from \"./validate\";\n\ntype LocRange = Exclude<CompilerDiagnostic[\"loc\"], undefined | false>;\n\ninterface FixCandidate {\n  title: string;\n  /** Value handed to the compiler `applyFixes` map for this fix. */\n  value: unknown;\n  isPreferred: boolean;\n}\n\nconst FIX_ACTION_SOURCE = \"marko/fix\";\nconst FIX_ALL_SOURCE = \"marko/fix-all\";\n\n/** Code action kind for the batched \"fix all\" source action. */\nexport const SOURCE_FIX_ALL_KIND = \"source.fixAll.marko\";\n\n/** Title shown for the batched \"fix all\" source action. */\nconst FIX_ALL_TITLE = \"Fix all auto-fixable Marko issues\";\n\n/** Code action kinds this plugin produces, advertised to the client. */\nexport const markoCodeActionKinds = [\n  CodeActionKind.QuickFix,\n  SOURCE_FIX_ALL_KIND,\n];\n\n/**\n * Serializable payload stored on a deferred fix action so its edit can be built\n * later in `doCodeActionResolve` rather than up front.\n */\ninterface MarkoFixActionData {\n  source: typeof FIX_ACTION_SOURCE;\n  uri: string;\n  version: number;\n  index: number;\n  value: unknown;\n}\n\n/** Serializable payload for a deferred batched \"fix all\" action. */\ninterface MarkoFixAllActionData {\n  source: typeof FIX_ALL_SOURCE;\n  uri: string;\n  version: number;\n}\n\n/**\n * Whether the client can resolve a code action's `edit` lazily. When it can, we\n * defer the (relatively expensive) reprint + format until the user actually\n * engages a fix instead of building an edit for every offered action up front.\n */\nlet resolveSupported = false;\n\nexport function initialize(params: InitializeParams): void {\n  resolveSupported = Boolean(\n    params.capabilities.textDocument?.codeAction?.resolveSupport?.properties.includes(\n      \"edit\",\n    ),\n  );\n}\n\n/**\n * Surfaces the Marko compiler's diagnostic `fix`es (in place AST edits suggested\n * by compiler plugins) as in editor code actions: a quick fix per fixable\n * diagnostic in range, plus a batched \"fix all\" source action.\n *\n * A fix mutates the AST during compilation, so it can't be serialized into a\n * text edit directly. Instead we re-run the compiler asking it to apply the\n * relevant fix(es) -- via the `applyFixes` config keyed by diagnostic index --\n * reprint the result in `migrate` mode, format it with prettier, and diff it\n * against the original document to produce a minimal text edit.\n *\n * A fix is either an automatic function fix or an interactive `confirm`/`select`\n * prompt; see `getFixCandidates` and `collectBatchFixes` for how each is\n * surfaced.\n */\nexport const doCodeActions: Plugin[\"doCodeActions\"] = async (\n  doc,\n  params,\n  cancel,\n) => {\n  // Gate the per-diagnostic quick fixes and the batched \"fix all\" source action\n  // independently so a `source.fixAll`-only request (e.g. fix-on-save) returns\n  // just the batch, and a `quickfix`-only request returns just the quick fixes.\n  const { only } = params.context;\n  const wantsQuickFix = isKindRequested(only, CodeActionKind.QuickFix);\n  const wantsFixAll = isKindRequested(only, SOURCE_FIX_ALL_KIND);\n  if (!wantsQuickFix && !wantsFixAll) return;\n\n  // Reuse the diagnostics compile from `doValidate` (cached per document\n  // version) so requesting code actions doesn't compile the document again.\n  const { diagnostics } = getMarkoDiagnostics(doc);\n  if (!diagnostics?.length) return;\n\n  const filename = getFSPath(doc);\n  const compiler = Project.getCompiler(filename && path.dirname(filename));\n  const originalText = doc.getText();\n  const actions: CodeAction[] = [];\n\n  if (wantsQuickFix) {\n    // The index of a diagnostic is the key used to apply its fix, so iterate by\n    // index. The diagnostics here line up with what `doValidate` reports because\n    // both use the same `compilerConfig`.\n    for (let index = 0; index < diagnostics.length; index++) {\n      const diag = diagnostics[index];\n      if (!diag.fix || !diag.loc) continue;\n\n      const range = locToRange(diag.loc);\n      if (!rangesOverlap(range, params.range)) continue;\n\n      const relatedDiagnostics = findRelatedDiagnostics(\n        params.context.diagnostics,\n        range,\n        diag.label,\n      );\n\n      for (const candidate of getFixCandidates(diag)) {\n        if (cancel.isCancellationRequested) return;\n\n        const action: CodeAction = {\n          title: candidate.title,\n          kind: CodeActionKind.QuickFix,\n          diagnostics: relatedDiagnostics.length\n            ? relatedDiagnostics\n            : undefined,\n          isPreferred: candidate.isPreferred || undefined,\n        };\n\n        if (resolveSupported) {\n          // Defer the reprint + format until the action is resolved.\n          action.data = {\n            source: FIX_ACTION_SOURCE,\n            uri: doc.uri,\n            version: doc.version,\n            index,\n            value: candidate.value,\n          } satisfies MarkoFixActionData;\n        } else {\n          const edit = await buildFixEdit(\n            doc,\n            compiler,\n            filename,\n            originalText,\n            new Map([[index, candidate.value]]),\n          );\n          if (cancel.isCancellationRequested) return;\n          if (!edit) continue;\n          action.edit = { changes: { [doc.uri]: [edit] } };\n        }\n\n        actions.push(action);\n      }\n    }\n  }\n\n  if (wantsFixAll) {\n    // A single \"fix all\" applies every auto-fixable diagnostic in one compile\n    // pass (the `applyFixes` map takes many entries). This is both faster than\n    // and more correct than chaining the individual fixes, whose edits are each\n    // computed against the original text and would shift one another's ranges.\n    const fixes = collectBatchFixes(diagnostics);\n    if (fixes.size) {\n      const action: CodeAction = {\n        title: FIX_ALL_TITLE,\n        kind: SOURCE_FIX_ALL_KIND,\n      };\n\n      if (resolveSupported) {\n        action.data = {\n          source: FIX_ALL_SOURCE,\n          uri: doc.uri,\n          version: doc.version,\n        } satisfies MarkoFixAllActionData;\n        actions.push(action);\n      } else {\n        const edit = await buildFixEdit(\n          doc,\n          compiler,\n          filename,\n          originalText,\n          fixes,\n        );\n        if (cancel.isCancellationRequested) return;\n        if (edit) {\n          action.edit = { changes: { [doc.uri]: [edit] } };\n          actions.push(action);\n        }\n      }\n    }\n  }\n\n  return actions.length ? actions : undefined;\n};\n\n/**\n * Resolves a deferred fix (or fix-all) action by re-running the compiler to\n * apply the fix(es) and attaching the resulting text edit.\n */\nexport const doCodeActionResolve: NonNullable<\n  Plugin[\"doCodeActionResolve\"]\n> = async (action, cancel) => {\n  const data = action.data as\n    | MarkoFixActionData\n    | MarkoFixAllActionData\n    | undefined;\n  if (data?.source !== FIX_ACTION_SOURCE && data?.source !== FIX_ALL_SOURCE) {\n    return; // not one of ours\n  }\n\n  const doc = documents.get(data.uri);\n  // The action was created for a specific document version; if the document has\n  // since changed we can no longer trust the diagnostic indices, so leave it be.\n  if (!doc || doc.version !== data.version) return action;\n\n  let fixes: Map<number, unknown>;\n  if (data.source === FIX_ACTION_SOURCE) {\n    fixes = new Map([[data.index, data.value]]);\n  } else {\n    const { diagnostics } = getMarkoDiagnostics(doc);\n    if (!diagnostics) return action;\n    fixes = collectBatchFixes(diagnostics);\n  }\n  if (!fixes.size) return action;\n\n  const filename = getFSPath(doc);\n  const compiler = Project.getCompiler(filename && path.dirname(filename));\n  const edit = await buildFixEdit(\n    doc,\n    compiler,\n    filename,\n    doc.getText(),\n    fixes,\n  );\n  if (cancel.isCancellationRequested) return;\n  if (edit) action.edit = { changes: { [doc.uri]: [edit] } };\n\n  return action;\n};\n\n/**\n * Maps a diagnostic's fix to the quick fix action(s) to offer for it.\n *\n * The compiler's diagnostics API models a `fix` as one of three things:\n * - `true`: an automatic function fix (applied by the compiler in `migrate`\n *   output without asking) -> a single, preferred quick fix.\n * - a `confirm` prompt (a yes/no decision) -> a single quick fix whose\n *   invocation answers \"yes\" (`apply(true)`).\n * - a `select` prompt (pick one of N options) -> one quick fix per option\n *   (`apply(option.value)`).\n *\n * `confirm`/`select` are interactive prompts, so they are never marked preferred\n * -- the user must consciously choose, rather than have \"Auto Fix\" answer for\n * them -- and they are excluded from the batched \"fix all\".\n */\nexport function getFixCandidates(diag: CompilerDiagnostic): FixCandidate[] {\n  const { fix } = diag;\n\n  // An automatic function fix.\n  if (fix === true) {\n    return [{ title: diag.label, value: undefined, isPreferred: true }];\n  }\n\n  if (typeof fix === \"object\") {\n    switch (fix.type) {\n      // A yes/no prompt; invoking the action answers \"yes\".\n      case \"confirm\":\n        return [{ title: fix.message, value: true, isPreferred: false }];\n      // A pick-one prompt; offer one action per option.\n      case \"select\":\n        return fix.options.map((option) => ({\n          title: `${fix.message}: ${option.label ?? option.value}`,\n          value: option.value,\n          isPreferred: false,\n        }));\n    }\n  }\n\n  return [];\n}\n\n/**\n * Re-compiles the document applying the given `fixes` (one entry for a single\n * quick fix, many for \"fix all\") in a single pass and returns a minimal text\n * edit representing the change.\n */\nasync function buildFixEdit(\n  doc: TextDocument,\n  compiler: ReturnType<typeof Project.getCompiler>,\n  filename: string | undefined,\n  originalText: string,\n  fixes: Map<number, unknown>,\n): Promise<TextEdit | undefined> {\n  let fixedCode: string | undefined;\n  try {\n    ({ code: fixedCode } = compiler.compileSync(\n      originalText,\n      filename || \"untitled.marko\",\n      {\n        ...compilerConfig,\n        code: true,\n        applyFixes: fixes,\n      },\n    ));\n  } catch {\n    // Applying the fix produced a state the compiler could not print.\n    return;\n  }\n\n  if (!fixedCode) return;\n\n  const formatted = await formatMarko(fixedCode, filename);\n  return getMinimalEdit(doc, originalText, formatted ?? fixedCode);\n}\n\n/**\n * Builds the `applyFixes` map for a batched \"fix all\" from the diagnostics whose\n * fix is applied automatically -- function fixes (`fix === true`), the same set\n * the compiler applies in `migrate` output without prompting.\n *\n * `confirm`/`select` fixes are interactive prompts: the compiler only applies\n * them when given an explicit answer (with no answer their `apply` is a no-op),\n * so they're deliberately excluded here and instead offered as individual quick\n * fixes where the user makes the choice.\n */\nexport function collectBatchFixes(\n  diagnostics: CompilerDiagnostic[],\n): Map<number, unknown> {\n  const fixes = new Map<number, unknown>();\n  diagnostics.forEach((diag, index) => {\n    if (diag.fix === true) fixes.set(index, undefined);\n  });\n  return fixes;\n}\n\n/**\n * Formats reprinted Marko source with prettier (reusing the same plugin and\n * resolved config as the formatter) so applying a fix doesn't reflow the rest of\n * the document. Falls back to the unformatted source if prettier throws.\n */\nasync function formatMarko(\n  code: string,\n  filepath: string | undefined,\n): Promise<string | undefined> {\n  try {\n    return await prettier.format(code, {\n      parser: \"marko\",\n      filepath,\n      plugins: [markoPrettier],\n      ...(filepath\n        ? await prettier\n            .resolveConfig(filepath, { editorconfig: true })\n            .catch(() => null)\n        : null),\n    });\n  } catch {\n    return undefined;\n  }\n}\n\n/**\n * Produces a single text edit covering only the region that differs between the\n * original and updated text by trimming the common prefix and suffix.\n */\nfunction getMinimalEdit(\n  doc: TextDocument,\n  oldText: string,\n  newText: string,\n): TextEdit | undefined {\n  if (oldText === newText) return undefined;\n\n  const maxStart = Math.min(oldText.length, newText.length);\n  let start = 0;\n  while (\n    start < maxStart &&\n    oldText.charCodeAt(start) === newText.charCodeAt(start)\n  ) {\n    start++;\n  }\n\n  let oldEnd = oldText.length;\n  let newEnd = newText.length;\n  while (\n    oldEnd > start &&\n    newEnd > start &&\n    oldText.charCodeAt(oldEnd - 1) === newText.charCodeAt(newEnd - 1)\n  ) {\n    oldEnd--;\n    newEnd--;\n  }\n\n  return TextEdit.replace(\n    { start: doc.positionAt(start), end: doc.positionAt(oldEnd) },\n    newText.slice(start, newEnd),\n  );\n}\n\n/**\n * Finds the published diagnostics that this fix resolves so the editor can\n * associate the quick fix with the squiggle it appears on.\n */\nfunction findRelatedDiagnostics(\n  contextDiagnostics: Diagnostic[],\n  range: Range,\n  label: string,\n): Diagnostic[] {\n  return contextDiagnostics.filter(\n    (diagnostic) =>\n      diagnostic.source === \"marko\" &&\n      diagnostic.message === label &&\n      rangesEqual(diagnostic.range, range),\n  );\n}\n\nfunction locToRange(loc: LocRange): Range {\n  return {\n    start: { line: loc.start.line - 1, character: loc.start.column },\n    end: { line: loc.end.line - 1, character: loc.end.column },\n  };\n}\n\nfunction isKindRequested(only: string[] | undefined, kind: string): boolean {\n  return (\n    !only ||\n    only.some(\n      (requested) => kind === requested || kind.startsWith(`${requested}.`),\n    )\n  );\n}\n\nfunction rangesOverlap(a: Range, b: Range): boolean {\n  return (\n    comparePositions(a.start, b.end) <= 0 &&\n    comparePositions(b.start, a.end) <= 0\n  );\n}\n\nfunction rangesEqual(a: Range, b: Range): boolean {\n  return (\n    comparePositions(a.start, b.start) === 0 &&\n    comparePositions(a.end, b.end) === 0\n  );\n}\n\nfunction comparePositions(a: Position, b: Position): number {\n  return a.line - b.line || a.character - b.character;\n}\n", "import type { Config } from \"@marko/compiler\";\nimport {\n  type Diagnostic as CompilerDiagnostic,\n  DiagnosticType,\n} from \"@marko/compiler/babel-utils\";\nimport { Project } from \"@marko/language-tools\";\nimport path from \"path\";\nimport { Diagnostic, DiagnosticSeverity } from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\n\nimport { getFSPath } from \"../../utils/file\";\nimport type { Plugin } from \"../types\";\n\n/**\n * The result of compiling a document for diagnostics: either the compiler's\n * diagnostics or the error thrown while trying to compile it.\n */\nexport type MarkoDiagnosticsResult =\n  | { diagnostics: CompilerDiagnostic[]; error?: undefined }\n  | { diagnostics?: undefined; error: unknown };\n\n/**\n * Caches the compiler diagnostics per document version so that `doValidate` and\n * the code action provider can share a single compile instead of compiling the\n * same document twice.\n */\nconst diagnosticsCache = new WeakMap<\n  TextDocument,\n  { version: number; result: MarkoDiagnosticsResult }\n>();\n\nconst markoErrorRegExp =\n  /^(.+?)\\.marko(?:\\((\\d+)(?:\\s*,\\s*(\\d+))?\\))?: (.*)$/gm;\n\n/**\n * Shared compiler config used to surface diagnostics. Runs through the\n * `migrate` output (the latest stage diagnostic fixes can be registered in)\n * with error recovery so that all recoverable diagnostics are returned on\n * `meta.diagnostics` instead of being thrown. The code action provider reuses\n * this same config so the diagnostics (and their indices) line up exactly with\n * what is reported here.\n */\nexport const 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\n/**\n * Compiles the document for diagnostics, caching the result per document\n * version. Both `doValidate` and the code action provider call this so the\n * document is only compiled once per change.\n */\nexport function getMarkoDiagnostics(doc: TextDocument): MarkoDiagnosticsResult {\n  const cached = diagnosticsCache.get(doc);\n  if (cached && cached.version === doc.version) return cached.result;\n\n  const filename = getFSPath(doc);\n  let result: MarkoDiagnosticsResult;\n  try {\n    const { meta } = Project.getCompiler(\n      filename && path.dirname(filename),\n    ).compileSync(doc.getText(), filename || \"untitled.marko\", compilerConfig);\n    result = { diagnostics: meta.diagnostics };\n  } catch (error) {\n    result = { error };\n  }\n\n  diagnosticsCache.set(doc, { version: doc.version, result });\n  return result;\n}\n\nexport const doValidate: Plugin[\"doValidate\"] = (doc) => {\n  const diagnostics: Diagnostic[] = [];\n  const result = getMarkoDiagnostics(doc);\n\n  if (result.diagnostics) {\n    for (const diag of result.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  } else {\n    addDiagnosticsForError(result.error, 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 { Project } from \"@marko/language-tools\";\nimport path from \"path\";\nimport * as prettier from \"prettier\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport { URI } from \"vscode-uri\";\n\nexport type CompiledOutputTarget = \"dom\" | \"html\";\n\nexport interface CompiledOutput {\n  language: string;\n  content: string;\n}\n\n/**\n * Compiles a Marko document to its final JavaScript output for the requested\n * target (`dom` for client side or `html` for server side rendering).\n *\n * Compilation always assumes esm mode and reuses the translator/config resolved\n * for the document's project, so the output reflects whichever Marko runtime\n * (eg Marko 5 vs Marko 6) the project depends on.\n */\nexport async function compileDocument(\n  doc: TextDocument,\n  output: CompiledOutputTarget,\n): Promise<CompiledOutput> {\n  const { fsPath, scheme } = URI.parse(doc.uri);\n  // Untitled documents have no path on disk, fall back to the cwd so the\n  // compiler still has a real directory to resolve taglibs against.\n  const filename =\n    scheme === \"file\" ? fsPath : path.join(process.cwd(), \"untitled.marko\");\n  const dir = path.dirname(filename);\n  const compiler = Project.getCompiler(dir);\n  const config = Project.getConfig(dir);\n\n  try {\n    const { code } = await compiler.compile(doc.getText(), filename, {\n      ...config,\n      output,\n      modules: \"esm\",\n      sourceMaps: false,\n      ast: false,\n      code: true,\n    });\n\n    return {\n      language: \"javascript\",\n      content: await prettier\n        .format(code!, { parser: \"babel\" })\n        .catch(() => code!),\n    };\n  } catch (err) {\n    // Surface the compile error in the output document so the failure is\n    // actionable rather than silently swallowed.\n    return {\n      language: \"plaintext\",\n      content: err instanceof Error ? (err.stack ?? err.message) : String(err),\n    };\n  }\n}\n", "import { NodeType } from \"@marko/language-tools\";\nimport type { CompletionItem, CompletionParams } from \"vscode-languageserver\";\n\nimport { getMarkoFile, type 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      // Offer the allowed values as a snippet choice (a pick-list). Empty\n      // values are dropped since a choice element cannot be empty; fall back to\n      // a plain tabstop when nothing is left to choose from.\n      const choices = attr.enum.filter(Boolean).map(escapeSnippetChoice);\n      snippet += choices.length ? `=\"\\${1|${choices.join()}|}\"$0` : `=\"$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\n// Escapes the characters that are significant within a `${1|...|}` snippet\n// choice element: `\\` (escape), `,` (separator) and `|` (terminator).\nfunction escapeSnippetChoice(value: string) {\n  return value.replace(/[\\\\,|]/g, \"\\\\$&\");\n}\n\nfunction isExternalModule(file: string) {\n  return (\n    /[/\\\\]node_modules[/\\\\]/.test(file) ||\n    !/^(?:[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 { type 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/;\n// Captures the quote, the shorthand tag name, and whether the closing `>` is\n// already present (eg `\"<foo>\"`, or a half-typed `\"<fo`).\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) return;\n\n  const [, , name, close] = match;\n  // Complete just the tag name slot (between `<` and `>`) so it filters and\n  // sorts exactly like an open tag name, and append the closing `>` only when\n  // the user has not typed it yet so the shorthand stays valid.\n  const nameStart = node.start + match.index + 2; // skip the opening quote and `<`\n  const range = parsed.locationAt({\n    start: nameStart,\n    end: nameStart + name.length,\n  });\n  const suffix = close ? \"\" : \">\";\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({ tag, importer: filename });\n      // Prioritize over TypeScript's module specifier completions.\n      completion.sortText = `0${completion.label}`;\n      completion.textEdit = TextEdit.replace(range, completion.label + suffix);\n      result.push(completion);\n    }\n  }\n\n  return result;\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 =\n    /[\\\\/]node_modules[\\\\/]((?:@[^\\\\/]+[\\\\/])?[^\\\\/]+)/.exec(fileForTag);\n\n  const nodeModuleName =\n    nodeModuleMatch && nodeModuleMatch[1].replace(/\\\\/g, \"/\");\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 [&lt;${tag.name}&gt;](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/${tag.name}) HTML tag.`\n      : isCoreTag\n        ? `Core Marko &lt;${tag.name}&gt; 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 type { 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, type 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 { type 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 { type 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 * 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 { 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 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    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, type 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 * as documents from \"../../utils/text-documents\";\nimport type { Plugin } from \"../types\";\nimport { doCodeActionResolve, doCodeActions, initialize } from \"./code-actions\";\nimport { compileDocument, type CompiledOutputTarget } from \"./compile\";\nimport { doComplete } from \"./complete\";\nimport { findDefinition } from \"./definition\";\nimport { findDocumentLinks } from \"./document-links\";\nimport { findDocumentSymbols } from \"./document-symbols\";\nimport { format, formatDocument, type FormatOptions } from \"./format\";\nimport { doHover } from \"./hover\";\nimport { doValidate } from \"./validate\";\n\nexport default {\n  initialize,\n  doComplete,\n  doValidate,\n  doHover,\n  doCodeActions,\n  doCodeActionResolve,\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    \"$/showCompiledOutput\": async ({\n      uri,\n      output,\n    }: {\n      uri: string;\n      output: CompiledOutputTarget;\n    }) => {\n      const doc = documents.get(uri);\n      if (doc?.languageId !== \"marko\") return;\n      return compileDocument(doc, output);\n    },\n  },\n} as Partial<Plugin>;\n", "import {\n  type Extracted,\n  extractScript,\n  type Location,\n  type Node,\n  NodeType,\n  normalizePath,\n  type Parsed,\n  Processors,\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  type DefinitionLink,\n  Diagnostic,\n  DiagnosticSeverity,\n  DiagnosticTag,\n  type DocumentHighlight,\n  DocumentHighlightKind,\n  InsertTextFormat,\n  type Location as LSPLocation,\n  type Range,\n  TextEdit,\n} from \"vscode-languageserver\";\nimport type { TextDocument } from \"vscode-languageserver-textdocument\";\nimport { URI } from \"vscode-uri\";\n\nimport { type ExtractedSnapshot, patch } from \"../../ts-plugin/host\";\nimport { START_LOCATION } from \"../../utils/constants\";\nimport {\n  getFSPath,\n  getMarkoFile,\n  type MarkoFile,\n  processDoc,\n} 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\nexport interface 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, normalizePath(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\n    // A class/id inside a `<style/var>` block has no real definition (it is\n    // one), so navigate to its usages like a standalone CSS module.\n    if (isInStyleModuleBlock(getMarkoFile(doc), sourceOffset)) {\n      return findStyleModuleUsages(\n        project,\n        fileName,\n        extracted.generatedOffsetsAt(sourceOffset),\n      );\n    }\n\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      const links: DefinitionLink[] = [];\n      const extracted = getTargetExtracted(project, def.fileName, defDoc);\n\n      if (extracted) {\n        const sourceRanges = extracted.sourceRangesAt(\n          def.textSpan.start,\n          def.textSpan.start + def.textSpan.length,\n        );\n\n        if (sourceRanges.length) {\n          const contextRange =\n            def.contextSpan &&\n            extracted.sourceRangeAt(\n              def.contextSpan.start,\n              def.contextSpan.start + def.contextSpan.length,\n            );\n\n          for (const sourceRange of sourceRanges) {\n            const targetSelectionRange =\n              extracted.parsed.locationAt(sourceRange);\n            links.push({\n              targetUri,\n              targetRange:\n                contextRange &&\n                contextRange.start <= sourceRange.start &&\n                sourceRange.end <= contextRange.end\n                  ? extracted.parsed.locationAt(contextRange)\n                  : targetSelectionRange,\n              targetSelectionRange,\n              originSelectionRange,\n            });\n          }\n        } else {\n          links.push({\n            targetUri,\n            targetRange:\n              (def.contextSpan &&\n                sourceLocationAtTextSpan(extracted, def.contextSpan)) ||\n              START_LOCATION,\n            targetSelectionRange: START_LOCATION,\n            originSelectionRange,\n          });\n        }\n      } else {\n        links.push({\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      for (const link of links) {\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  findReferences(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 generatedOffsets = extracted.generatedOffsetsAt(sourceOffset);\n    if (!generatedOffsets.length) return;\n\n    const includeDeclaration = params.context?.includeDeclaration ?? true;\n    const result: LSPLocation[] = [];\n    const seen = new Set<string>();\n\n    for (const generatedOffset of generatedOffsets) {\n      const symbols = project.service.findReferences(fileName, generatedOffset);\n      if (!symbols) continue;\n\n      for (const symbol of symbols) {\n        for (const entry of symbol.references) {\n          if (!includeDeclaration && entry.isDefinition) continue;\n          forEachSourceLocation(project, entry, (uri, range) => {\n            const key = `${uri}:${rangeKey(range)}`;\n            if (seen.has(key)) return;\n            seen.add(key);\n            result.push({ uri, range });\n          });\n        }\n      }\n    }\n\n    return result.length ? result : undefined;\n  },\n  findDocumentHighlights(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 generatedOffsets = extracted.generatedOffsetsAt(sourceOffset);\n    if (!generatedOffsets.length) return;\n\n    const result: DocumentHighlight[] = [];\n    const seen = new Set<string>();\n\n    for (const generatedOffset of generatedOffsets) {\n      const highlights = project.service.getDocumentHighlights(\n        fileName,\n        generatedOffset,\n        [fileName],\n      );\n      if (!highlights) continue;\n\n      for (const { highlightSpans } of highlights) {\n        for (const span of highlightSpans) {\n          for (const sourceRange of extracted.sourceRangesAt(\n            span.textSpan.start,\n            span.textSpan.start + span.textSpan.length,\n          )) {\n            const range = extracted.parsed.locationAt(sourceRange);\n            const key = rangeKey(range);\n            if (seen.has(key)) continue;\n            seen.add(key);\n            result.push({\n              range,\n              kind:\n                span.kind === ts.HighlightSpanKind.writtenReference\n                  ? DocumentHighlightKind.Write\n                  : DocumentHighlightKind.Read,\n            });\n          }\n        }\n      }\n    }\n\n    return result.length ? result : undefined;\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  prepareRename(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 generatedOffsets = extracted.generatedOffsetsAt(\n      doc.offsetAt(params.position),\n    );\n\n    for (const generatedOffset of generatedOffsets) {\n      const info = project.service.getRenameInfo(fileName, generatedOffset, {});\n      if (info.canRename) {\n        // Select exactly the range we will edit, so eg a CSS module class is\n        // renamed without its leading `.`/`#`.\n        const range = sourceLocationAtTextSpan(extracted, info.triggerSpan);\n        if (range) return range;\n      }\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 generatedOffsets = extracted.generatedOffsetsAt(sourceOffset);\n    if (!generatedOffsets.length) return;\n\n    const changes: { [uri: string]: TextEdit[] } = {};\n    const seenEdits = new Set<string>();\n    let hasChanges = false;\n\n    for (const generatedOffset of generatedOffsets) {\n      const renameLocations = project.service.findRenameLocations(\n        fileName,\n        generatedOffset,\n        false,\n        false,\n        false,\n      );\n\n      if (!renameLocations) continue;\n\n      for (const rename of renameLocations) {\n        forEachSourceLocation(project, rename, (uri, range) => {\n          const key = `${uri}:${rangeKey(range)}`;\n          if (seenEdits.has(key)) return;\n          seenEdits.add(key);\n          hasChanges = true;\n\n          (changes[uri] ||= []).push({ newText: params.newName, range });\n        });\n      }\n    }\n\n    if (!hasChanges) return;\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 (\n        diag &&\n        !IGNORE_DIAG_REG.test(\n          typeof diag.message === \"string\" ? diag.message : diag.message.value,\n        )\n      ) {\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 rangeKey({ start, end }: Range) {\n  return `${start.line}:${start.character}:${end.line}:${end.character}`;\n}\n\nfunction forEachSourceLocation(\n  project: TSProject,\n  { fileName, textSpan }: ts.DocumentSpan,\n  cb: (uri: string, range: Range) => void,\n) {\n  const uri = filenameToURI(fileName);\n  const targetDoc = documents.get(uri);\n  if (!targetDoc) return;\n\n  const extracted = getTargetExtracted(project, fileName, targetDoc);\n  if (extracted) {\n    for (const sourceRange of extracted.sourceRangesAt(\n      textSpan.start,\n      textSpan.start + textSpan.length,\n    )) {\n      cb(uri, extracted.parsed.locationAt(sourceRange));\n    }\n  } else {\n    cb(uri, docLocationAtTextSpan(targetDoc, textSpan));\n  }\n}\n\n/**\n * The {@link Extracted} mapping for a target file, so generated TS locations\n * map back to source. Marko files use the marko cache; other processed files\n * (eg `.module.css`) use the TS host's extract cache.\n */\nfunction getTargetExtracted(\n  project: TSProject,\n  fileName: string,\n  doc: TextDocument,\n) {\n  if (markoFileReg.test(fileName)) {\n    return processScript(doc, project);\n  }\n\n  if (Processors.has(fileName)) {\n    // A failed extraction caches a snapshot-only placeholder (see the TS host);\n    // only return a real source-mapped extract so callers can map locations.\n    const cached = extractCache.get(normalizePath(fileName));\n    if (cached && \"sourceRangesAt\" in cached) return cached;\n  }\n}\n\n/**\n * The non-declaration usages of a CSS module class/id, used to navigate from a\n * `<style/var>` selector to its Marko/TS uses.\n */\nfunction findStyleModuleUsages(\n  project: TSProject,\n  fileName: string,\n  generatedOffsets: number[],\n) {\n  const result: LSPLocation[] = [];\n  const seen = new Set<string>();\n\n  for (const generatedOffset of generatedOffsets) {\n    const symbols = project.service.findReferences(fileName, generatedOffset);\n    if (!symbols) continue;\n\n    for (const symbol of symbols) {\n      for (const entry of symbol.references) {\n        if (entry.isDefinition) continue;\n        forEachSourceLocation(project, entry, (uri, range) => {\n          const key = `${uri}:${rangeKey(range)}`;\n          if (seen.has(key)) return;\n          seen.add(key);\n          result.push({ uri, range });\n        });\n      }\n    }\n  }\n\n  return result.length ? result : undefined;\n}\n\n/** Whether the offset is inside a `<style/var>` (CSS module) block. */\nfunction isInStyleModuleBlock({ parsed }: MarkoFile, offset: number) {\n  let node: Node.AnyNode | undefined = parsed.nodeAt(offset);\n  while (node) {\n    if (node.type === NodeType.Tag && node.nameText === \"style\" && node.var) {\n      // The tag's own `var` resolves through normal TS definition lookup; only\n      // selector content inside the block navigates to its usages.\n      const { start, end } = node.var.value;\n      return offset < start || offset >= end;\n    }\n    node = node.parent;\n  }\n\n  return false;\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\nexport function 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        const cacheKey = normalizePath(filename);\n        let snapshot = snapshotCache.get(cacheKey);\n        if (!snapshot) {\n          const doc = documents.get(filenameToURI(filename));\n          if (!doc) return;\n          snapshot = ts.ScriptSnapshot.fromString(doc.getText());\n          snapshotCache.set(cacheKey, 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  normalizePath,\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 = /^<([^>]+)>$/;\nconst markoFileReg = /\\.marko$/i;\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      const cacheKey = normalizePath(fileName);\n      let cached = extractCache.get(cacheKey);\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(cacheKey, 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        let processor =\n          moduleName[0] !== \"*\" ? getProcessor(moduleName) : undefined;\n        // A CSS module only resolves to Marko's virtual typing when imported\n        // from a Marko file. Elsewhere (eg a plain `.ts` file) we defer to the\n        // user's own resolution -- an ambient `*.module.css` declaration, a\n        // generated `.d.ts`, or another TS plugin -- so we never override an\n        // existing CSS module setup.\n        if (\n          processor &&\n          Processors.isCSSModule(moduleName) &&\n          !markoFileReg.test(containingFile)\n        ) {\n          processor = undefined;\n        }\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 = Processors.getProcessorExtension(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  type 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        // Skip a definition that points back at the cursor (eg the CSS service\n        // treats an `#id` selector as its own definition), which is noise next\n        // to the real target.\n        if (\n          sourceRange &&\n          !rangeContainsPosition(sourceRange, params.position)\n        ) {\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  prepareRename(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 range = style.service.prepareRename(\n        style.virtualDoc,\n        generatedPos,\n        style.parsed,\n      );\n\n      if (range) {\n        const sourceRange = getSourceRange(style, range);\n        if (sourceRange) return sourceRange;\n      }\n\n      return;\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 =\n                getSourceEdits(style, change.edits as TextEdit[]) || [];\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\nfunction rangeContainsPosition({ start, end }: Range, pos: Range[\"start\"]) {\n  const afterStart =\n    pos.line > start.line ||\n    (pos.line === start.line && pos.character >= start.character);\n  const beforeEnd =\n    pos.line < end.line ||\n    // LSP ranges are end-exclusive, so a caret at `end` is outside the range.\n    (pos.line === end.line && pos.character < end.character);\n  return afterStart && beforeEnd;\n}\n"],
  "mappings": "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",
  "names": ["Project", "inspect", "MarkupKind", "Project", "path", "URI", "process", "Project", "path", "Project", "path", "Project", "path", "Project", "path", "Project", "path", "prettier", "URI", "NodeType", "TextEdit", "path", "CompletionItemKind", "TextEdit", "fs", "stat", "fs", "path", "CompletionItemKind", "TextEdit", "NodeType", "TextEdit", "path", "CompletionItemKind", "InsertTextFormat", "MarkupKind", "TextEdit", "URI", "URI", "MarkupKind", "path", "InsertTextFormat", "CompletionItemKind", "TextEdit", "NodeType", "TextEdit", "NodeType", "NodeType", "tag", "CompletionItemKind", "InsertTextFormat", "TextEdit", "NodeType", "NodeType", "fs", "URI", "AttrName", "fs", "URI", "getLines", "getLocation", "NodeType", "fs", "path", "URI", "OpenTagName", "NodeType", "path", "fs", "getLocation", "getLines", "URI", "handlers", "OpenTagName", "AttrName", "NodeType", "NodeType", "importTagReg", "NodeType", "NodeType", "NodeType", "prettier", "markoPrettier", "TextEdit", "markoPrettier", "TextEdit", "format", "NodeType", "OpenTagName", "handlers", "OpenTagName", "NodeType", "format", "NodeType", "normalizePath", "Processors", "Project", "path", "prettier", "CompletionItemKind", "CompletionItemTag", "DiagnosticSeverity", "InsertTextFormat", "URI", "Project", "path", "importTagReg", "ts", "extractCache", "readDirectory", "connection", "setup", "docs", "parts", "text", "extractCache", "markoFileReg", "Project", "path", "normalizePath", "CompletionItemTag", "CompletionItemKind", "InsertTextFormat", "extracted", "NodeType", "Processors", "options", "URI", "docs", "DiagnosticSeverity", "TextDocument", "service", "TextDocument", "rangesOverlap", "MarkupKind", "connection", "inspect", "setup", "Project"]
}
