8000 fix: `__VLS_vue` leak to auto import · vuejs/language-tools@d0af8f1 · GitHub
[go: up one dir, main page]

Skip to content 8000

Commit d0af8f1

Browse files
committed
fix: __VLS_vue leak to auto import
close #584
1 parent 9b8ff38 commit d0af8f1

File tree

8 files changed

+54
-81
lines changed

8 files changed

+54
-81
lines changed

packages/server/src/features/customFeatures.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,6 @@ export function register(
3232
for (const fileName of localTypes.fileNames) {
3333
fs.writeFile(fileName, localTypes.code, () => { });
3434
}
35-
const localVues = ls.__internal__.getLocalVueFiles();
36-
for (const fileName of localVues.fileNames) {
37-
fs.writeFile(fileName, localVues.code, () => { });
38-
}
3935
const { sourceFiles } = await ls.__internal__.getContext();
4036
for (const [_, doc] of sourceFiles.getTsDocuments(lsType)) {
4137
fs.writeFile(shared.uriToFsPath(doc.uri), doc.getText(), () => { });

packages/vscode-vue-languageservice/src/generators/script.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import type * as templateGen from '../generators/template_scriptSetup';
55
import type { ScriptRanges } from '../parsers/scriptRanges';
66
import type { ScriptSetupRanges } from '../parsers/scriptSetupRanges';
77
import type { TextRange } from '../parsers/types';
8+
import { getVueLibraryName } from '../utils/localTypes';
89
import * as SourceMaps from '../utils/sourceMaps';
910

1011
export function generate(
@@ -21,6 +22,7 @@ export function generate(
2122
scriptSetupRanges: ScriptSetupRanges | undefined,
2223
getHtmlGen: () => ReturnType<typeof templateGen['generate']> | undefined,
2324
getSfcStyles: () => ReturnType<(typeof import('../use/useSfcStyles'))['useSfcStyles']>['textDocuments']['value'],
25+
isVue2: boolean,
2426
) {
2527

2628
const codeGen = createCodeGen<SourceMaps.TsMappingData>();
@@ -210,15 +212,15 @@ export function generate(
210212
function writeExportComponent() {
211213
if (shouldAddExportDefault) {
212214
const start = codeGen.getText().length;
213-
codeGen.addText(`export default (await import('./__VLS_vue')).defineComponent({\n`);
215+
codeGen.addText(`export default (await import('${getVueLibraryName(isVue2)}')).defineComponent({\n`);
214216
overlapMapRanges.push({
215217
start,
216218
end: codeGen.getText().length,
217219
});
218220
}
219221
else {
220222
codeGen.addText(`\n`);
221-
codeGen.addText(`export const __VLS_component = (await import('./__VLS_vue')).defineComponent({\n`);
223+
codeGen.addText(`export const __VLS_component = (await import('${getVueLibraryName(isVue2)}')).defineComponent({\n`);
222224
}
223225
if (script && scriptRanges?.exportDefault?.args) {
224226
const args = scriptRanges.exportDefault.args;

packages/vscode-vue-languageservice/src/languageService.ts

Lines changed: 12 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,13 @@ export function createLanguageService(
137137

138138
const { typescript: ts } = modules;
139139

140+
// TODO: not working for vue-tsc --project flag
141+
const tsconfigFile = upath.join(vueHost.getCurrentDirectory(), 'tsconfig.json');
142+
const jsconfigFile = upath.join(vueHost.getCurrentDirectory(), 'jsconfig.json');
143+
const configFile = ts.sys.fileExists(tsconfigFile) ? tsconfigFile : ts.sys.fileExists(jsconfigFile) ? jsconfigFile : undefined;
144+
const config = configFile ? shared.createParsedCommandLine(ts, ts.sys, configFile) : undefined;
145+
const isVue2 = config?.raw.vueCompilerOptions?.experimentalCompatMode === 2;
146+
140147
let vueProjectVersion: string | undefined;
141148
let scriptContentVersion = 0; // only update by `<script>` / `<script setup>` / *.ts content
142149
let scriptProjectVersion = 0; // update by script LS virtual files / *.ts
@@ -154,8 +161,7 @@ export function createLanguageService(
154161
const scriptTsLsRaw = vueHost.createTsLanguageService ? vueHost.createTsLanguageService(scriptTsHost) : ts.createLanguageService(scriptTsHost);
155162
const templateTsLs = ts2.createLanguageService(ts, templateTsHost, templateTsLsRaw);
156163
const scriptTsLs = ts2.createLanguageService(ts, scriptTsHost, scriptTsLsRaw);
157-
const localTypesScript = ts.ScriptSnapshot.fromString(localTypes.typesCode);
158-
const localVueScript = ts.ScriptSnapshot.fromString(localTypes.vueCode);
164+
const localTypesScript = ts.ScriptSnapshot.fromString(localTypes.getTypesCode(isVue2));
159165
const compilerHost = ts.createCompilerHost(vueHost.getCompilationSettings());
160166
const documentContext: html.DocumentContext = {
161167
resolveReference(ref: string, base: string) {
@@ -190,14 +196,8 @@ export function createLanguageService(
190196
},
191197
}
192198

193-
// TODO: not working for vue-tsc --project flag
194-
const tsconfigFile = upath.join(vueHost.getCurrentDirectory(), 'tsconfig.json');
195-
const jsconfigFile = upath.join(vueHost.getCurrentDirectory(), 'jsconfig.json');
196-
const configFile = ts.sys.fileExists(tsconfigFile) ? tsconfigFile : ts.sys.fileExists(jsconfigFile) ? jsconfigFile : undefined;
197-
const config = configFile ? shared.createParsedCommandLine(ts, ts.sys, configFile) : undefined;
198-
199199
const context: ApiLanguageServiceContext = {
200-
isVue2Mode: config?.raw.vueCompilerOptions?.experimentalCompatMode === 2,
200+
isVue2Mode: isVue2,
201201
modules: {
202202
typescript: modules.typescript,
203203
emmet,
@@ -278,15 +278,7 @@ export function createLanguageService(
278278
},
279279
getLocalTypesFiles: () => {
280280
const fileNames = getLocalTypesFiles();
281-
const code = localTypes.typesCode;
282-
return {
283-
fileNames,
284-
code,
285-
};
286-
},
287-
getLocalVueFiles: () => {
288-
const fileNames = getLocalVueFiles();
289-
const code = localTypes.vueCode;
281+
const code = localTypes.getTypesCode(isVue2);
290282
return {
291283
fileNames,
292284
code,
@@ -303,9 +295,6 @@ export function createLanguageService(
303295
function getLocalTypesFiles() {
304296
return sourceFiles.getDirs().map(dir => upath.join(dir, localTypes.typesFileName));
305297
}
306-
function getLocalVueFiles() {
307-
return sourceFiles.getDirs().map(dir => upath.join(dir, localTypes.vueFileName));
308-
}
309298
function createTsPluginProxy() {
310299

311300
// ts plugin proxy
@@ -560,10 +549,7 @@ export function createLanguageService(
560549
return tsHost;
561550

562551
function getScriptFileNames() {
563-
const tsFileNames = [
564-
...getLocalTypesFiles(),
565-
...getLocalVueFiles(),
566-
];
552+
const tsFileNames = getLocalTypesFiles();
567553

568554
for (const [tsUri] of sourceFiles.getTsDocuments(lsType)) {
569555
tsFileNames.push(shared.uriToFsPath(tsUri)); // virtual .ts
@@ -581,7 +567,7 @@ export function createLanguageService(
581567
function getScriptVersion(fileName: string) {
582568
const uri = shared.fsPathToUri(fileName);
583569
const basename = upath.basename(fileName);
584-
if (basename === localTypes.typesFileName || basename === localTypes.vueFileName) {
570+
if (basename === localTypes.typesFileName) {
585571
return '0';
586572
}
587573
let doc = sourceFiles.getTsDocuments(lsType).get(uri);
@@ -600,9 +586,6 @@ export function createLanguageService(
600586
if (basename === localTypes.typesFileName) {
601587
return localTypesScript;
602588
}
603-
if (basename === localTypes.vueFileName) {
604-
return localVueScript;
605-
}
606589
const uri = shared.fsPathToUri(fileName);
607590
const doc = sourceFiles.getTsDocuments(lsType).get(uri);
608591
if (doc) {

packages/vscode-vue-languageservice/src/sourceFile.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ export function createSourceFile(
125125
computed(() => scriptSetupRanges.value),
126126
sfcTemplateCompileResult,
127127
computed(() => sfcStyles.textDocuments.value),
128+
context.isVue2Mode,
128129
);
129130
const sfcScriptForScriptLs = useSfcScriptGen(
130131
'script',
@@ -136,11 +137,11 @@ export function createSourceFile(
136137
computed(() => scriptSetupRanges.value),
137138
sfcTemplateCompileResult,
138139
computed(() => sfcStyles.textDocuments.value),
140+
context.isVue2Mode,
139141
);
140142
const sfcEntryForTemplateLs = useSfcEntryForTemplateLs(
141143
uri,
142144
document,
143-
computed(() => descriptor.script),
144145
computed(() => descriptor.scriptSetup),
145146
computed(() => descriptor.template),
146147
computed(() => !!sfcScriptForTemplateLs.textDocumentTs.value),

packages/vscode-vue-languageservice/src/sourceFiles.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ export function createSourceFiles() {
179179
}),
180180
fromTsLocation: untrack(function* (lsType: 'script' | 'template', uri: string, start: vscode.Position, end?: vscode.Position) {
181181

182-
if (uri.endsWith(`/${localTypes.typesFileName}`) || uri.endsWith(`/${localTypes.vueFileName}`))
182+
if (uri.endsWith(`/${localTypes.typesFileName}`))
183183
return;
184184

185185
if (end === undefined)
@@ -209,7 +209,7 @@ export function createSourceFiles() {
209209
}),
210210
fromTsLocation2: untrack(function* (lsType: 'script' | 'template', uri: string, start: number, end?: number) {
211211

212-
if (uri.endsWith(`/${localTypes.typesFileName}`) || uri.endsWith(`/${localTypes.vueFileName}`))
212+
if (uri.endsWith(`/${localTypes.typesFileName}`))
213213
return;
214214

215215
if (end === undefined)

packages/vscode-vue-languageservice/src/use/useSfcEntryForTemplateLs.ts

Lines changed: 14 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import * as shared from '@volar/shared';
88
export function useSfcEntryForTemplateLs(
99
vueUri: string,
1010
vueDoc: Ref<TextDocument>,
11-
script: Ref<shared.Sfc['script']>,
1211
scriptSetup: Ref<shared.Sfc['scriptSetup']>,
1312
template: Ref<shared.Sfc['template']>,
1413
hasTsDoc: Ref<boolean>,
@@ -20,33 +19,24 @@ export function useSfcEntryForTemplateLs(
2019
const tsScriptFileName = hasTsDoc.value ? '__VLS_script_ts' : '__VLS_script';
2120
let content = '';
2221
content += '// @ts-nocheck\n';
23-
content += `import * as __VLS_vue from './__VLS_types';\n`;
2422
content += `import * as __VLS_types from './__VLS_types';\n`;
25-
if (scriptSetup.value || script.value) {
26-
content += `import { __VLS_options as __VLS_options_ts, __VLS_name as __VLS_name_ts } from './${vueFileName}.${tsScriptFileName}';\n`;
27-
content += `import { __VLS_options, __VLS_name } from './${vueFileName}.__VLS_script';\n`;
28-
content += `export { __VLS_options, __VLS_name } from './${vueFileName}.__VLS_script';\n`;
29-
content += `export * from './${vueFileName}.__VLS_script';\n`;
23+
content += `import { __VLS_options as __VLS_options_ts, __VLS_name as __VLS_name_ts } from './${vueFileName}.${tsScriptFileName}';\n`;
24+
content += `import { __VLS_options, __VLS_name } from './${vueFileName}.__VLS_script';\n`;
25+
content += `export { __VLS_options, __VLS_name } from './${vueFileName}.__VLS_script';\n`;
26+
content += `export * from './${vueFileName}.__VLS_script';\n`;
3027

31-
if (scriptSetup.value) {
32-
content += `import { __VLS_component as __VLS_component_ts } from './${vueFileName}.${tsScriptFileName}';\n`;
33-
content += `import { __VLS_component } from './${vueFileName}.__VLS_script';\n`;
34-
content += `export { __VLS_component } from './${vueFileName}.__VLS_script';\n`;
35-
}
36-
else if (script.value) {
37-
content += `import __VLS_component_1_ts from './${vueFileName}.${tsScriptFileName}';\n`;
38-
content += `import __VLS_component_1 from './${vueFileName}.__VLS_script';\n`;
39-
content += `import { __VLS_component as __VLS_component_2_ts } from './${vueFileName}.${tsScriptFileName}';\n`;
40-
content += `import { __VLS_component as __VLS_component_2 } from './${vueFileName}.__VLS_script';\n`;
41-
content += `declare var __VLS_component_ts: __VLS_types.SelectComponent<typeof __VLS_component_1_ts, typeof __VLS_component_2_ts>;\n`;
42-
content += `export declare var __VLS_component: __VLS_types.SelectComponent<typeof __VLS_component_1, typeof __VLS_component_2>;\n`;
43-
}
28+
if (scriptSetup.value) {
29+
content += `import { __VLS_component as __VLS_component_ts } from './${vueFileName}.${tsScriptFileName}';\n`;
30+
content += `import { __VLS_component } from './${vueFileName}.__VLS_script';\n`;
31+
content += `export { __VLS_component } from './${vueFileName}.__VLS_script';\n`;
4432
}
4533
else {
46-
content += `export var __VLS_options = {};\n`;
47-
content += `export var __VLS_name = undefined;\n`;
48-
content += `var __VLS_component_ts = __VLS_vue.defineComponent({});\n`;
49-
content += `export var __VLS_component = __VLS_vue.defineComponent({});\n`;
34+
content += `import __VLS_component_1_ts from './${vueFileName}.${tsScriptFileName}';\n`;
35+
content += `import __VLS_component_1 from './${vueFileName}.__VLS_script';\n`;
36+
content += `import { __VLS_component as __VLS_component_2_ts } from './${vueFileName}.${tsScriptFileName}';\n`;
37+
content += `import { __VLS_component as __VLS_component_2 } from './${vueFileName}.__VLS_script';\n`;
38+
content += `declare var __VLS_component_ts: __VLS_types.SelectComponent<typeof __VLS_component_1_ts, typeof __VLS_component_2_ts>;\n`;
39+
content += `export declare var __VLS_component: __VLS_types.SelectComponent<typeof __VLS_component_1, typeof __VLS_component_2>;\n`;
5040
}
5141
content += `declare var __VLS_ctx: __VLS_types.ComponentContext<typeof __VLS_component_ts>;\n`;
5242
content += `declare var __VLS_ComponentsWrap: typeof __VLS_options & { components: { } };\n`;

packages/vscode-vue-languageservice/src/use/useSfcScriptGen.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export function useSfcScriptGen(
1717
scriptSetupRanges: Ref<ReturnType<typeof parseScriptSetupRanges> | undefined>,
1818
sfcTemplateCompileResult: ReturnType<(typeof import('./useSfcTemplateCompileResult'))['useSfcTemplateCompileResult']>,
1919
sfcStyles: ReturnType<(typeof import('./useSfcStyles'))['useSfcStyles']>['textDocuments'],
20+
isVue2: boolean,
2021
) {
2122

2223
let version = 0;
@@ -36,6 +37,7 @@ export function useSfcScriptGen(
3637
scriptSetupRanges.value,
3738
() => htmlGen.value,
3839
() => sfcStyles.value,
40+
isVue2,
3941
)
4042
);
4143
const lang = computed(() => {
@@ -53,16 +55,14 @@ export function useSfcScriptGen(
5355
);
5456
});
5557
const textDocumentTs = computed(() => {
56-
if (lsType === 'template') {
57-
if (lang.value === 'js' || lang.value === 'jsx') {
58-
const tsLang = lang.value === 'jsx' ? 'tsx' : 'ts';
59-
return TextDocument.create(
60-
`${vueUri}.__VLS_script_ts.${tsLang}`,
61-
shared.syntaxToLanguageId(tsLang),
62-
textDocument.value.version,
63-
textDocument.value.getText(),
64-
);
65-
}
58+
if (lsType === 'template' && ['js', 'jsx'].includes(lang.value)) {
59+
const tsLang = lang.value === 'jsx' ? 'tsx' : 'ts';
60+
return TextDocument.create(
61+
`${vueUri}.__VLS_script_ts.${tsLang}`,
62+
shared.syntaxToLanguageId(tsLang),
63+
textDocument.value.version,
64+
textDocument.value.getText(),
65+
);
6666
}
6767
});
6868
const sourceMap = computed(() => {

packages/vscode-vue-languageservice/src/utils/localTypes.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,16 @@ const camelCaseText = [
66
': S',
77
].join('\n');
88

9-
export const vueFileName = '__VLS_vue.ts';
10-
export const typesFileName = '__VLS_types.ts';
9+
export function getVueLibraryName(isVue2: boolean) {
10+
return isVue2 ? '@vue/runtime-dom' : 'vue';
11+
}
1112

12-
export const vueCode = `
13-
export * from '@vue/runtime-dom';
14-
export * from 'vue';
15-
`.trim();
13+
export const typesFileName = '__VLS_types.ts';
1614

17-
export const typesCode = `
18-
import * as vue from './__VLS_vue';
15+
export function getTypesCode(isVue2: boolean) {
16+
const libName = getVueLibraryName(isVue2);
17+
return `
18+
import * as vue from '${libName}';
1919
import type {
2020
FunctionalComponent,
2121
HTMLAttributes,
@@ -28,7 +28,7 @@ import type {
2828
ObjectDirective,
2929
FunctionDirective,
3030
GlobalComponents as GlobalComponents_0,
31-
} from './__VLS_vue';
31+
} from '${libName}';
3232
3333
type IsAny<T> = boolean extends (T extends never ? true : false) ? true : false;
3434
type IsFunctionalComponent<T> = T extends (...args: any) => JSX.Element ? true : false;
@@ -139,6 +139,7 @@ export type SelfComponent<N, C> = string extends N ? {} : N extends string ? { [
139139
140140
export ${genConstructorOverloads()}
141141
`;
142+
}
142143

143144
// TODO: not working for overloads > n (n = 8)
144145
// see: https://github.com/johnsoncodehk/volar/issues/60

0 commit comments

Comments
 (0)
0