Skip to content

Commit 145ee73

Browse files
committed
fix(language-core): correctly resolve <script src="">
close #5838
1 parent 1159f1e commit 145ee73

File tree

11 files changed

+89
-60
lines changed

11 files changed

+89
-60
lines changed

packages/language-core/lib/codegen/script/index.ts

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import { endOfLine, generateSfcBlockSection, newLine } from '../utils';
1010
import { endBoundary, startBoundary } from '../utils/boundary';
1111
import { createScriptCodegenContext, type ScriptCodegenContext } from './context';
1212
import { generateGeneric, generateScriptSetupImports, generateSetupFunction } from './scriptSetup';
13-
import { generateSrc } from './src';
1413
import { generateTemplate } from './template';
1514

1615
const exportExpression = `{} as typeof ${names._export}`;
@@ -41,19 +40,39 @@ function* generateWorker(
4140
options: ScriptCodegenOptions,
4241
ctx: ScriptCodegenContext,
4342
): Generator<Code> {
44-
yield* generateGlobalTypesReference(options);
43+
const { script, scriptRanges, scriptSetup, scriptSetupRanges, vueCompilerOptions, fileName } = options;
4544

46-
const { script, scriptRanges, scriptSetup, scriptSetupRanges, vueCompilerOptions } = options;
45+
yield* generateGlobalTypesReference(vueCompilerOptions, fileName);
4746

48-
if (scriptSetup && scriptSetupRanges) {
49-
yield* generateScriptSetupImports(scriptSetup, scriptSetupRanges);
50-
}
51-
if (script?.src) {
52-
yield* generateSrc(script.src);
53-
}
47+
// <script src="">
48+
if (typeof script?.src === 'object') {
49+
let src = script.src.text;
50+
if (src.endsWith('.ts') && !src.endsWith('.d.ts')) {
51+
src = src.slice(0, -'.ts'.length) + '.js';
52+
}
53+
else if (src.endsWith('.tsx')) {
54+
src = src.slice(0, -'.tsx'.length) + '.jsx';
55+
}
56+
57+
yield `import __VLS_default from `;
58+
const token = yield* startBoundary('main', script.src.offset, {
59+
...codeFeatures.all,
60+
...src !== script.src.text ? codeFeatures.navigationWithoutRename : {},
61+
});
62+
yield `'`;
63+
yield [src.slice(0, script.src.text.length), 'main', script.src.offset, { __combineToken: token }];
64+
yield src.slice(script.src.text.length);
65+
yield `'`;
66+
yield endBoundary(token, script.src.offset + script.src.text.length);
67+
yield endOfLine;
68+
yield `export default __VLS_default;${endOfLine}`;
5469

70+
yield* generateTemplate(options, ctx, '__VLS_default');
71+
}
5572
// <script> + <script setup>
56-
if (script && scriptRanges && scriptSetup && scriptSetupRanges) {
73+
else if (script && scriptRanges && scriptSetup && scriptSetupRanges) {
74+
yield* generateScriptSetupImports(scriptSetup, scriptSetupRanges);
75+
5776
// <script>
5877
let selfType: string | undefined;
5978
const { exportDefault } = scriptRanges;
@@ -105,6 +124,8 @@ function* generateWorker(
105124
}
106125
// only <script setup>
107126
else if (scriptSetup && scriptSetupRanges) {
127+
yield* generateScriptSetupImports(scriptSetup, scriptSetupRanges);
128+
108129
if (scriptSetup.generic) {
109130
yield* generateExportDeclareEqual(scriptSetup, names._export);
110131
yield* generateGeneric(
@@ -217,13 +238,13 @@ function* generateScriptWithExportDefault(
217238
yield* generateSfcBlockSection(script, exportDefault.end, script.content.length, codeFeatures.all);
218239
}
219240

220-
function* generateGlobalTypesReference(options: ScriptCodegenOptions): Generator<Code> {
221-
const globalTypesPath = options.vueCompilerOptions.globalTypesPath(options.fileName);
241+
function* generateGlobalTypesReference(vueCompilerOptions: VueCompilerOptions, fileName: string): Generator<Code> {
242+
const globalTypesPath = vueCompilerOptions.globalTypesPath(fileName);
222243
if (!globalTypesPath) {
223244
yield `/* placeholder */${newLine}`;
224245
}
225246
else if (path.isAbsolute(globalTypesPath)) {
226-
let relativePath = path.relative(path.dirname(options.fileName), globalTypesPath);
247+
let relativePath = path.relative(path.dirname(fileName), globalTypesPath);
227248
if (
228249
relativePath !== globalTypesPath
229250
&& !relativePath.startsWith('./')

packages/language-core/lib/codegen/script/src.ts

Lines changed: 0 additions & 42 deletions
This file was deleted.

packages/language-core/lib/codegen/script/template.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import { endOfLine, generateSfcBlockSection, newLine } from '../utils';
55
import { generateSpreadMerge } from '../utils/merge';
66
import type { ScriptCodegenContext } from './context';
77
import type { ScriptCodegenOptions } from './index';
8-
import { resolveSrcPath } from './src';
98

109
export function* generateTemplate(
1110
options: ScriptCodegenOptions,
@@ -26,7 +25,7 @@ export function* generateTemplate(
2625
}
2726

2827
function* generateTemplateCtx(
29-
{ vueCompilerOptions, script, styleCodegen, scriptSetupRanges, fileName }: ScriptCodegenOptions,
28+
{ vueCompilerOptions, styleCodegen, scriptSetupRanges, fileName }: ScriptCodegenOptions,
3029
ctx: ScriptCodegenContext,
3130
selfType: string | undefined,
3231
): Generator<Code> {
@@ -40,9 +39,6 @@ function* generateTemplateCtx(
4039
if (selfType) {
4140
exps.push([`{} as InstanceType<__VLS_PickNotAny<typeof ${selfType}, new () => {}>>`]);
4241
}
43-
else if (typeof script?.src === 'object') {
44-
exps.push([`{} as typeof import('${resolveSrcPath(script.src.text)}').default`]);
45-
}
4642
else {
4743
exps.push([`{} as import('${vueCompilerOptions.lib}').ComponentPublicInstance`]);
4844
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { defineComponent } from 'vue';
2+
3+
export default defineComponent({
4+
setup() {
5+
return { foo: 123 };
6+
},
7+
});
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<script lang="ts" src="./typescript.js"></script>
2+
3+
<template>
4+
{{ foo }}
5+
<!-- @vue-expect-error -->
6+
{{ bar }}
7+
</template>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { defineComponent } from 'vue';
2+
3+
export default defineComponent({
4+
setup() {
5+
return { foo: 123 };
6+
},
7+
});
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<script lang="ts" src="./javascriptreact.jsx"></script>
2+
3+
<template>
4+
{{ foo }}
5+
</template>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { defineComponent } from 'vue';
2+
3+
export default defineComponent({
4+
setup() {
5+
return { foo: 123 };
6+
},
7+
});
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<script lang="ts" src="./typescript.ts"></script>
2+
3+
<template>
4+
{{ foo }}
5+
<!-- @vue-expect-error -->
6+
{{ bar }}
7+
</template>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { defineComponent } from 'vue';
2+
3+
export default defineComponent({
4+
setup() {
5+
return { foo: 123 };
6+
},
7+
});

0 commit comments

Comments
 (0)