diff --git a/extensions/vscode/package.json b/extensions/vscode/package.json index d7ab925c6b..e64d52332b 100644 --- a/extensions/vscode/package.json +++ b/extensions/vscode/package.json @@ -286,10 +286,32 @@ "vue.server.includeLanguages": { "type": "array", "items": { - "type": "string" + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "properties": { + "language": { + "type": "string" + }, + "pattern": { + "type": "string" + } + }, + "required": [ + "language" + ] + } + ] }, "default": [ - "vue" + "vue", + { + "language": "markdown", + "pattern": "**/*.vue.md" + } ], "markdownDescription": "%configuration.server.includeLanguages%" }, diff --git a/extensions/vscode/schemas/vue-tsconfig.schema.json b/extensions/vscode/schemas/vue-tsconfig.schema.json index 1fffdced3e..3bd4cdde82 100644 --- a/extensions/vscode/schemas/vue-tsconfig.schema.json +++ b/extensions/vscode/schemas/vue-tsconfig.schema.json @@ -32,7 +32,7 @@ }, "vitePressExtensions": { "type": "array", - "default": [".md"], + "default": [".vue.md"], "markdownDescription": "Valid file extensions that should be considered as regular VitePress SFC." }, "petiteVueExtensions": { diff --git a/extensions/vscode/src/extension.ts b/extensions/vscode/src/extension.ts index 4334e04048..4c1f00205f 100644 --- a/extensions/vscode/src/extension.ts +++ b/extensions/vscode/src/extension.ts @@ -54,7 +54,7 @@ export = defineExtension(() => { const { stop } = watch(activeTextEditor, () => { if ( !visibleTextEditors.value.some( - editor => config.server.includeLanguages.includes(editor.document.languageId), + editor => vscode.languages.match(getIncludeLanguages(), editor.document), ) ) { return; @@ -125,7 +125,7 @@ export = defineExtension(() => { volarLabs.addLanguageClient(client); - const selectors = config.server.includeLanguages; + const selectors = getIncludeLanguages(); activateAutoInsertion(selectors, client); activateDocumentDropEdit(selectors, client); @@ -151,6 +151,10 @@ export = defineExtension(() => { return volarLabs.extensionExports; }); +function getIncludeLanguages() { + return config.server.includeLanguages as lsp.DocumentSelector; +} + function launch(serverPath: string, tsdk: string) { const args = ['--tsdk=' + tsdk]; const client = new lsp.LanguageClient( @@ -203,7 +207,7 @@ function launch(serverPath: string, tsdk: string) { return edits; }, }, - documentSelector: config.server.includeLanguages, + documentSelector: getIncludeLanguages(), markdown: { isTrusted: true, supportHtml: true, @@ -295,13 +299,14 @@ function patchTypeScriptExtension() { const { publisher, name } = require('../package.json'); const vueExtension = vscode.extensions.getExtension(`${publisher}.${name}`)!; const tsPluginName = 'vue-typescript-plugin-pack'; + const languages = getIncludeLanguages().map(lang => typeof lang === 'string' ? lang : lang.language); vueExtension.packageJSON.contributes.typescriptServerPlugins = [ { name: tsPluginName, enableForWorkspaceTypeScriptVersions: true, configNamespace: 'typescript', - languages: config.server.includeLanguages, + languages, }, { name: 'vue-reactivity-analysis-plugin-pack', diff --git a/extensions/vscode/src/generated-meta.ts b/extensions/vscode/src/generated-meta.ts index 1c879f726c..8e5095bb9e 100644 --- a/extensions/vscode/src/generated-meta.ts +++ b/extensions/vscode/src/generated-meta.ts @@ -4,7 +4,7 @@ // Meta info export const publisher = 'Vue'; export const name = 'volar'; -export const version = '3.1.5'; +export const version = '3.1.8'; export const displayName = 'Vue (Official)'; export const description = 'Language Support for Vue'; export const extensionId = `${publisher}.${name}`; @@ -17,7 +17,7 @@ export type CommandKey = | 'vue.action.restartServer'; /** - * Commands map registed by `Vue.volar` + * Commands map registered by `Vue.volar` */ export const commands = { /** @@ -32,6 +32,25 @@ export const commands = { actionRestartServer: 'vue.action.restartServer', } satisfies Record; +/** + * Type union of all languages + */ +export type LanguageKey = + | 'vue' + | 'markdown' + | 'html' + | 'jade'; + +/** + * Languages map registed by `Vue.volar` + */ +export const languages = { + vue: 'vue', + markdown: 'markdown', + html: 'html', + jade: 'jade', +} satisfies Record; + /** * Type union of all configs */ @@ -67,7 +86,7 @@ export interface ConfigKeyTypeMap { 'vue.editor.reactivityVisualization': boolean; 'vue.editor.templateInterpolationDecorators': boolean; 'vue.server.path': string | undefined; - 'vue.server.includeLanguages': string[]; + 'vue.server.includeLanguages': unknown[]; 'vue.codeActions.askNewComponentName': boolean; 'vue.suggest.componentNameCasing': 'preferKebabCase' | 'preferPascalCase' | 'alwaysKebabCase' | 'alwaysPascalCase'; 'vue.suggest.propNameCasing': 'preferKebabCase' | 'preferCamelCase' | 'alwaysKebabCase' | 'alwaysCamelCase'; @@ -128,7 +147,7 @@ export interface ConfigShorthandTypeMap { editorReactivityVisualization: boolean; editorTemplateInterpolationDecorators: boolean; serverPath: string | undefined; - serverIncludeLanguages: string[]; + serverIncludeLanguages: unknown[]; codeActionsAskNewComponentName: boolean; suggestComponentNameCasing: 'preferKebabCase' | 'preferPascalCase' | 'alwaysKebabCase' | 'alwaysPascalCase'; suggestPropNameCasing: 'preferKebabCase' | 'preferCamelCase' | 'alwaysKebabCase' | 'alwaysCamelCase'; @@ -212,12 +231,12 @@ export const configs = { } as ConfigItem<'vue.server.path'>, /** * @key `vue.server.includeLanguages` - * @default `["vue"]` + * @default `["vue",{"language":"markdown","pattern":"**\/*.vue.md"}]` * @type `array` */ serverIncludeLanguages: { key: 'vue.server.includeLanguages', - default: ['vue'], + default: ['vue', { 'language': 'markdown', 'pattern': '**/*.vue.md' }], } as ConfigItem<'vue.server.includeLanguages'>, /** * @key `vue.codeActions.askNewComponentName` @@ -389,7 +408,7 @@ export interface ScopedConfigKeyTypeMap { 'editor.reactivityVisualization': boolean; 'editor.templateInterpolationDecorators': boolean; 'server.path': string | undefined; - 'server.includeLanguages': string[]; + 'server.includeLanguages': unknown[]; 'codeActions.askNewComponentName': boolean; 'suggest.componentNameCasing': 'preferKebabCase' | 'preferPascalCase' | 'alwaysKebabCase' | 'alwaysPascalCase'; 'suggest.propNameCasing': 'preferKebabCase' | 'preferCamelCase' | 'alwaysKebabCase' | 'alwaysCamelCase'; @@ -425,7 +444,7 @@ export const scopedConfigs = { 'editor.reactivityVisualization': true, 'editor.templateInterpolationDecorators': true, 'server.path': undefined, - 'server.includeLanguages': ['vue'], + 'server.includeLanguages': ['vue', { 'language': 'markdown', 'pattern': '**/*.vue.md' }], 'codeActions.askNewComponentName': true, 'suggest.componentNameCasing': 'preferPascalCase', 'suggest.propNameCasing': 'preferKebabCase', @@ -459,7 +478,7 @@ export interface NestedConfigs { }; 'server': { 'path': string | undefined; - 'includeLanguages': string[]; + 'includeLanguages': unknown[]; }; 'codeActions': { 'askNewComponentName': boolean; @@ -516,7 +535,7 @@ export interface NestedScopedConfigs { }; 'server': { 'path': string | undefined; - 'includeLanguages': string[]; + 'includeLanguages': unknown[]; }; 'codeActions': { 'askNewComponentName': boolean; diff --git a/packages/language-core/lib/compilerOptions.ts b/packages/language-core/lib/compilerOptions.ts index 3bb62ff48e..cd3a65906e 100644 --- a/packages/language-core/lib/compilerOptions.ts +++ b/packages/language-core/lib/compilerOptions.ts @@ -252,7 +252,7 @@ export function getDefaultCompilerOptions( lib, typesRoot, extensions: ['.vue'], - vitePressExtensions: [], + vitePressExtensions: ['.vue.md'], petiteVueExtensions: [], jsxSlots: false, strictCssModules: false, diff --git a/packages/tsc/index.ts b/packages/tsc/index.ts index 703a120d49..65c9e9203a 100644 --- a/packages/tsc/index.ts +++ b/packages/tsc/index.ts @@ -4,7 +4,7 @@ import * as core from '@vue/language-core'; const windowsPathReg = /\\/g; export function run(tscPath = require.resolve('typescript/lib/tsc')) { - let runExtensions = ['.vue']; + let runExtensions = core.getAllExtensions(core.getDefaultCompilerOptions()); let extensionsChangedException: Error | undefined; const main = () =>