Skip to content

Commit

Permalink
feat(language-core): add compileSFCScript plugin hook
Browse files Browse the repository at this point in the history
close #3200
  • Loading branch information
johnsoncodehk committed May 13, 2024
1 parent 3fea063 commit 2548ebf
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 18 deletions.
34 changes: 18 additions & 16 deletions packages/language-core/lib/plugins.ts
Original file line number Diff line number Diff line change
@@ -1,26 +1,28 @@
import useVueSfcCustomBlocks from './plugins/vue-sfc-customblocks';
import useVueSfcScriptsFormat from './plugins/vue-sfc-scripts';
import useVueSfcStyles from './plugins/vue-sfc-styles';
import useVueSfcTemplate from './plugins/vue-sfc-template';
import useVueTemplateHtmlPlugin from './plugins/vue-template-html';
import useVueTemplateInlineCssPlugin from './plugins/vue-template-inline-css';
import useVueTemplateInlineTsPlugin from './plugins/vue-template-inline-ts';
import useVueTsx from './plugins/vue-tsx';
import vueSfcCustomBlocks from './plugins/vue-sfc-customblocks';
import vueSfcScriptsFormat from './plugins/vue-sfc-scripts';
import vueSfcStyles from './plugins/vue-sfc-styles';
import vueSfcTemplate from './plugins/vue-sfc-template';
import vueScriptJsPlugin from './plugins/vue-script-js';
import vueTemplateHtmlPlugin from './plugins/vue-template-html';
import vueTemplateInlineCssPlugin from './plugins/vue-template-inline-css';
import vueTemplateInlineTsPlugin from './plugins/vue-template-inline-ts';
import vueTsx from './plugins/vue-tsx';
import { pluginVersion, type VueLanguagePlugin } from './types';

export * from './plugins/shared'

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

const plugins: VueLanguagePlugin[] = [
useVueTemplateHtmlPlugin,
useVueTemplateInlineCssPlugin,
useVueTemplateInlineTsPlugin,
useVueSfcStyles,
useVueSfcCustomBlocks,
useVueSfcScriptsFormat,
useVueSfcTemplate,
useVueTsx,
vueScriptJsPlugin,
vueTemplateHtmlPlugin,
vueTemplateInlineCssPlugin,
vueTemplateInlineTsPlugin,
vueSfcStyles,
vueSfcCustomBlocks,
vueSfcScriptsFormat,
vueSfcTemplate,
vueTsx,
...pluginContext.vueCompilerOptions.plugins,
];

Expand Down
18 changes: 18 additions & 0 deletions packages/language-core/lib/plugins/vue-script-js.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import type { VueLanguagePlugin } from '../types';

const plugin: VueLanguagePlugin = ({ modules }) => {

return {

version: 2,

compileSFCScript(lang, script) {
if (lang === 'js' || lang === 'ts' || lang === 'jsx' || lang === 'tsx') {
const ts = modules.typescript;
return ts.createSourceFile('test.' + lang, script, 99 satisfies typeof ts.ScriptTarget.Latest);
}
},
};
};

export default plugin;
1 change: 1 addition & 0 deletions packages/language-core/lib/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ export type VueLanguagePlugin = (ctx: {
parseSFC?(fileName: string, content: string): SFCParseResult | undefined;
updateSFC?(oldResult: SFCParseResult, textChange: { start: number, end: number, newText: string; }): SFCParseResult | undefined;
resolveTemplateCompilerOptions?(options: CompilerDOM.CompilerOptions): CompilerDOM.CompilerOptions;
compileSFCScript?(lang: string, script: string): ts.SourceFile | undefined;
compileSFCTemplate?(lang: string, template: string, options: CompilerDOM.CompilerOptions): CompilerDOM.CodegenResult | undefined;
updateSFCTemplate?(oldResult: CompilerDOM.CodegenResult, textChange: { start: number, end: number, newText: string; }): CompilerDOM.CodegenResult | undefined;
getEmbeddedCodes?(fileName: string, sfc: Sfc): { id: string; lang: string; }[];
Expand Down
20 changes: 18 additions & 2 deletions packages/language-core/lib/virtualFile/computedSfc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,15 @@ export function computedSfc(
const _src = src();
return _src ? untrackedSnapshot().getText(0, base.startTagEnd).lastIndexOf(_src) - base.startTagEnd : -1;
});
const ast = computed(() => ts.createSourceFile(fileName + '.' + base.lang, base.content, 99 satisfies ts.ScriptTarget.Latest));
const ast = computed(() => {
for (const plugin of plugins) {
const ast = plugin.compileSFCScript?.(base.lang, base.content);
if (ast) {
return ast;;
}
}
return ts.createSourceFile(fileName + '.' + base.lang, '', 99 satisfies ts.ScriptTarget.Latest);
});
return mergeObject(base, {
get src() { return src(); },
get srcOffset() { return srcOffset(); },
Expand All @@ -64,7 +72,15 @@ export function computedSfc(
const _generic = generic();
return _generic !== undefined ? untrackedSnapshot().getText(0, base.startTagEnd).lastIndexOf(_generic) - base.startTagEnd : -1;
});
const ast = computed(() => ts.createSourceFile(fileName + '.' + base.lang, base.content, 99 satisfies ts.ScriptTarget.Latest));
const ast = computed(() => {
for (const plugin of plugins) {
const ast = plugin.compileSFCScript?.(base.lang, base.content);
if (ast) {
return ast;;
}
}
return ts.createSourceFile(fileName + '.' + base.lang, '', 99 satisfies ts.ScriptTarget.Latest);
});
return mergeObject(base, {
get generic() { return generic(); },
get genericOffset() { return genericOffset(); },
Expand Down

0 comments on commit 2548ebf

Please sign in to comment.