diff --git a/packages/language-service/lib/plugins/vue-template.ts b/packages/language-service/lib/plugins/vue-template.ts index 0c0a81de2e..7a6b8eb5f7 100644 --- a/packages/language-service/lib/plugins/vue-template.ts +++ b/packages/language-service/lib/plugins/vue-template.ts @@ -25,7 +25,7 @@ import { convertCompletionInfo, } from 'volar-service-typescript/lib/utils/lspConverters.js'; import * as html from 'vscode-html-languageservice'; -import { URI } from 'vscode-uri'; +import { URI, Utils } from 'vscode-uri'; import type { ComponentMeta, PropertyMeta } from '../../../component-meta'; import { loadModelModifiersData, loadTemplateData } from '../data'; import { format } from '../htmlFormatter'; @@ -55,6 +55,7 @@ interface TagInfo { meta: ComponentMeta | undefined | null; } +let htmlCustomData: html.IHTMLDataProvider[] | undefined = undefined; let builtInData: html.HTMLDataV1 | undefined; let modelData: html.HTMLDataV1 | undefined; @@ -115,7 +116,7 @@ export function create( useDefaultDataProvider: false, getDocumentContext, getCustomData() { - return htmlData; + return htmlCustomData ? [...htmlCustomData, ...htmlData] : htmlData; }, onDidChangeCustomData, }) @@ -124,7 +125,7 @@ export function create( useDefaultDataProvider: false, getDocumentContext, getCustomData() { - return htmlData; + return htmlCustomData ? [...htmlCustomData, ...htmlData] : htmlData; }, onDidChangeCustomData, }); @@ -210,7 +211,6 @@ export function create( builtInData ??= loadTemplateData(context.env.locale ?? 'en'); modelData ??= loadModelModifiersData(context.env.locale ?? 'en'); - // https://vuejs.org/api/built-in-directives.html#v-on const vOnModifiers = extractDirectiveModifiers(builtInData.globalAttributes?.find(x => x.name === 'v-on')); // https://vuejs.org/api/built-in-directives.html#v-bind @@ -617,6 +617,29 @@ export function create( return { result, ...lastSync }; } + async function loadHtmlCustomData(): Promise { + if (htmlCustomData) { + return htmlCustomData; + } + const newData: html.IHTMLDataProvider[] = []; + const customData: string[] = await context.env.getConfiguration?.('html.customData') ?? []; + const workspaceFolder = context.env.workspaceFolders?.[0] ?? undefined; + for (const customDataPath of customData) { + try { + const uri = Utils.resolvePath(URI.parse(workspaceFolder?.toString() ?? '.'), customDataPath); + const json = await context.env.fs?.readFile?.(uri, 'utf-8'); + if (json) { + const data = JSON.parse(json) as html.HTMLDataV1; + newData.push(html.newHTMLDataProvider(customDataPath, data)); + } + } + catch (e) { + continue; + } + } + return newData; + } + async function provideHtmlData( sourceDocumentUri: URI, root: VueVirtualCode, @@ -636,6 +659,7 @@ export function create( const tasks: Promise[] = []; const tagDataMap = new Map(); + htmlCustomData = await loadHtmlCustomData(); updateExtraCustomData([ {