Skip to content

Commit 2548ebf

Browse files
committed
feat(language-core): add compileSFCScript plugin hook
close #3200
1 parent 3fea063 commit 2548ebf

File tree

4 files changed

+55
-18
lines changed

4 files changed

+55
-18
lines changed

packages/language-core/lib/plugins.ts

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,28 @@
1-
import useVueSfcCustomBlocks from './plugins/vue-sfc-customblocks';
2-
import useVueSfcScriptsFormat from './plugins/vue-sfc-scripts';
3-
import useVueSfcStyles from './plugins/vue-sfc-styles';
4-
import useVueSfcTemplate from './plugins/vue-sfc-template';
5-
import useVueTemplateHtmlPlugin from './plugins/vue-template-html';
6-
import useVueTemplateInlineCssPlugin from './plugins/vue-template-inline-css';
7-
import useVueTemplateInlineTsPlugin from './plugins/vue-template-inline-ts';
8-
import useVueTsx from './plugins/vue-tsx';
1+
import vueSfcCustomBlocks from './plugins/vue-sfc-customblocks';
2+
import vueSfcScriptsFormat from './plugins/vue-sfc-scripts';
3+
import vueSfcStyles from './plugins/vue-sfc-styles';
4+
import vueSfcTemplate from './plugins/vue-sfc-template';
5+
import vueScriptJsPlugin from './plugins/vue-script-js';
6+
import vueTemplateHtmlPlugin from './plugins/vue-template-html';
7+
import vueTemplateInlineCssPlugin from './plugins/vue-template-inline-css';
8+
import vueTemplateInlineTsPlugin from './plugins/vue-template-inline-ts';
9+
import vueTsx from './plugins/vue-tsx';
910
import { pluginVersion, type VueLanguagePlugin } from './types';
1011

1112
export * from './plugins/shared'
1213

1314
export function getBasePlugins(pluginContext: Parameters<VueLanguagePlugin>[0]) {
1415

1516
const plugins: VueLanguagePlugin[] = [
16-
useVueTemplateHtmlPlugin,
17-
useVueTemplateInlineCssPlugin,
18-
useVueTemplateInlineTsPlugin,
19-
useVueSfcStyles,
20-
useVueSfcCustomBlocks,
21-
useVueSfcScriptsFormat,
22-
useVueSfcTemplate,
23-
useVueTsx,
17+
vueScriptJsPlugin,
18+
vueTemplateHtmlPlugin,
19+
vueTemplateInlineCssPlugin,
20+
vueTemplateInlineTsPlugin,
21+
vueSfcStyles,
22+
vueSfcCustomBlocks,
23+
vueSfcScriptsFormat,
24+
vueSfcTemplate,
25+
vueTsx,
2426
...pluginContext.vueCompilerOptions.plugins,
2527
];
2628

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import type { VueLanguagePlugin } from '../types';
2+
3+
const plugin: VueLanguagePlugin = ({ modules }) => {
4+
5+
return {
6+
7+
version: 2,
8+
9+
compileSFCScript(lang, script) {
10+
if (lang === 'js' || lang === 'ts' || lang === 'jsx' || lang === 'tsx') {
11+
const ts = modules.typescript;
12+
return ts.createSourceFile('test.' + lang, script, 99 satisfies typeof ts.ScriptTarget.Latest);
13+
}
14+
},
15+
};
16+
};
17+
18+
export default plugin;

packages/language-core/lib/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ export type VueLanguagePlugin = (ctx: {
7474
parseSFC?(fileName: string, content: string): SFCParseResult | undefined;
7575
updateSFC?(oldResult: SFCParseResult, textChange: { start: number, end: number, newText: string; }): SFCParseResult | undefined;
7676
resolveTemplateCompilerOptions?(options: CompilerDOM.CompilerOptions): CompilerDOM.CompilerOptions;
77+
compileSFCScript?(lang: string, script: string): ts.SourceFile | undefined;
7778
compileSFCTemplate?(lang: string, template: string, options: CompilerDOM.CompilerOptions): CompilerDOM.CodegenResult | undefined;
7879
updateSFCTemplate?(oldResult: CompilerDOM.CodegenResult, textChange: { start: number, end: number, newText: string; }): CompilerDOM.CodegenResult | undefined;
7980
getEmbeddedCodes?(fileName: string, sfc: Sfc): { id: string; lang: string; }[];

packages/language-core/lib/virtualFile/computedSfc.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,15 @@ export function computedSfc(
4343
const _src = src();
4444
return _src ? untrackedSnapshot().getText(0, base.startTagEnd).lastIndexOf(_src) - base.startTagEnd : -1;
4545
});
46-
const ast = computed(() => ts.createSourceFile(fileName + '.' + base.lang, base.content, 99 satisfies ts.ScriptTarget.Latest));
46+
const ast = computed(() => {
47+
for (const plugin of plugins) {
48+
const ast = plugin.compileSFCScript?.(base.lang, base.content);
49+
if (ast) {
50+
return ast;;
51+
}
52+
}
53+
return ts.createSourceFile(fileName + '.' + base.lang, '', 99 satisfies ts.ScriptTarget.Latest);
54+
});
4755
return mergeObject(base, {
4856
get src() { return src(); },
4957
get srcOffset() { return srcOffset(); },
@@ -64,7 +72,15 @@ export function computedSfc(
6472
const _generic = generic();
6573
return _generic !== undefined ? untrackedSnapshot().getText(0, base.startTagEnd).lastIndexOf(_generic) - base.startTagEnd : -1;
6674
});
67-
const ast = computed(() => ts.createSourceFile(fileName + '.' + base.lang, base.content, 99 satisfies ts.ScriptTarget.Latest));
75+
const ast = computed(() => {
76+
for (const plugin of plugins) {
77+
const ast = plugin.compileSFCScript?.(base.lang, base.content);
78+
if (ast) {
79+
return ast;;
80+
}
81+
}
82+
return ts.createSourceFile(fileName + '.' + base.lang, '', 99 satisfies ts.ScriptTarget.Latest);
83+
});
6884
return mergeObject(base, {
6985
get generic() { return generic(); },
7086
get genericOffset() { return genericOffset(); },

0 commit comments

Comments
 (0)