diff --git a/extensions/vscode-vue-language-features/package.json b/extensions/vscode-vue-language-features/package.json index 3fa147fdb..7a3359985 100644 --- a/extensions/vscode-vue-language-features/package.json +++ b/extensions/vscode-vue-language-features/package.json @@ -299,6 +299,9 @@ "type": "boolean", "default": false }, + "volar.vueserver.json.customBlockSchemaUrls": { + "type": "object" + }, "volar.vueserver.textDocumentSync": { "type": "string", "default": "incremental", diff --git a/extensions/vscode-vue-language-features/src/common.ts b/extensions/vscode-vue-language-features/src/common.ts index 759194ad9..27aa22d83 100644 --- a/extensions/vscode-vue-language-features/src/common.ts +++ b/extensions/vscode-vue-language-features/src/common.ts @@ -278,6 +278,9 @@ function getInitializationOptions( vitePress: { processMdFile: processMd(), }, + json: { + customBlockSchemaUrls: vscode.workspace.getConfiguration('volar').get>('vueserver.json.customBlockSchemaUrls') + }, noProjectReferences: noProjectReferences(), additionalExtensions: additionalExtensions() }; diff --git a/plugins/json/src/index.ts b/plugins/json/src/index.ts index f90dca33c..2b7228f30 100644 --- a/plugins/json/src/index.ts +++ b/plugins/json/src/index.ts @@ -3,7 +3,7 @@ import * as json from 'vscode-json-languageservice'; import * as vscode from 'vscode-languageserver-protocol'; import { TextDocument } from 'vscode-languageserver-textdocument'; -export default function (): LanguageServicePlugin { +export default function (settings?: json.LanguageSettings): LanguageServicePlugin { const jsonDocuments = new WeakMap(); @@ -15,6 +15,9 @@ export default function (): LanguageServicePlugin { setup(_context) { context = _context; jsonLs = json.getLanguageService({ schemaRequestService: _context.env.schemaRequestService }); + if (settings) { + jsonLs.configure(settings); + } }, complete: { diff --git a/vue-language-tools/vue-language-server/src/languageServerPlugin.ts b/vue-language-tools/vue-language-server/src/languageServerPlugin.ts index 2cec75cf6..38f687931 100644 --- a/vue-language-tools/vue-language-server/src/languageServerPlugin.ts +++ b/vue-language-tools/vue-language-server/src/languageServerPlugin.ts @@ -51,7 +51,18 @@ const plugin: LanguageServerPlugin; + }; /** * @example ['vue1', 'vue2'] */ - additionalExtensions?: string[], + additionalExtensions?: string[]; }; diff --git a/vue-language-tools/vue-language-service/src/languageService.ts b/vue-language-tools/vue-language-service/src/languageService.ts index bd669c2e9..a261dfe33 100644 --- a/vue-language-tools/vue-language-service/src/languageService.ts +++ b/vue-language-tools/vue-language-service/src/languageService.ts @@ -20,9 +20,14 @@ import useTwoslashQueries from './plugins/vue-twoslash-queries'; import useVueTemplateLanguagePlugin from './plugins/vue-template'; import type { Data } from '@volar-plugins/typescript/src/services/completions/basic'; +export interface Settings { + json?: Parameters[0]; +} + export function getLanguageServicePlugins( host: vue.LanguageServiceHost, apis: embeddedLS.LanguageService, + settings?: Settings, ): embeddedLS.LanguageServicePlugin[] { // plugins @@ -144,7 +149,7 @@ export function getLanguageServicePlugins( getVueDocument: (document) => apis.context.documents.get(document.uri), }); const cssPlugin = useCssPlugin(); - const jsonPlugin = useJsonPlugin(); + const jsonPlugin = useJsonPlugin(settings?.json); const emmetPlugin = useEmmetPlugin(); const autoDotValuePlugin = useAutoDotValuePlugin(); const referencesCodeLensPlugin = useReferencesCodeLensPlugin({ @@ -219,6 +224,7 @@ export function createLanguageService( host: LanguageServiceHost, env: embeddedLS.LanguageServicePluginContext['env'], documentRegistry?: ts.DocumentRegistry, + settings?: Settings, ) { const vueLanguageModule = vue.createLanguageModule( @@ -233,7 +239,7 @@ export function createLanguageService( host, context: core, getPlugins() { - return getLanguageServicePlugins(host, languageService); + return getLanguageServicePlugins(host, languageService, settings); }, documentRegistry, });