From 7e4f0a869498e7dce601e7c150f402045ea2e79b Mon Sep 17 00:00:00 2001 From: Evan You Date: Sun, 12 Dec 2021 09:53:52 +0800 Subject: [PATCH] fix(compiler-sfc): generate valid TS in script and script setup co-usage with TS fix #5094 --- .../__snapshots__/compileScript.spec.ts.snap | 79 ++++++++----- .../__tests__/compileScript.spec.ts | 106 ++++++++++-------- packages/compiler-sfc/src/compileScript.ts | 73 ++++++------ 3 files changed, 147 insertions(+), 111 deletions(-) diff --git a/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap b/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap index 77e8ed01..52bda6f4 100644 --- a/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap +++ b/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap @@ -4,8 +4,10 @@ exports[`SFC compile + + `) + assertCode(content) + }) + + test('script setup first', () => { + const { content } = compile(` + + + `) + assertCode(content) + }) + + test('script setup first, named default export', () => { + const { content } = compile(` + + + `) + assertCode(content) + }) + + // #4395 + test('script setup first, lang="ts", script block content export default', () => { + const { content } = compile(` + + + `) + // ensure __default__ is declared before used + expect(content).toMatch(/const __default__[\S\s]*\.\.\.__default__/m) + assertCode(content) + }) + describe('spaces in ExportDefaultDeclaration node', () => { // #4371 test('with many spaces and newline', () => { @@ -205,50 +267,6 @@ defineExpose({ foo: 123 }) assertCode(content) }) }) - - test('script first', () => { - const { content } = compile(` - - - `) - assertCode(content) - }) - - test('script setup first', () => { - const { content } = compile(` - - - `) - assertCode(content) - }) - - // #4395 - test('script setup first, lang="ts", script block content export default', () => { - const { content } = compile(` - - - `) - // ensure __default__ is declared before used - expect(content).toMatch(/const __default__[\S\s]*\.\.\.__default__/m) - assertCode(content) - }) }) describe('imports', () => { diff --git a/packages/compiler-sfc/src/compileScript.ts b/packages/compiler-sfc/src/compileScript.ts index 9aa10811..75203d42 100644 --- a/packages/compiler-sfc/src/compileScript.ts +++ b/packages/compiler-sfc/src/compileScript.ts @@ -59,6 +59,9 @@ const DEFINE_EMITS = 'defineEmits' const DEFINE_EXPOSE = 'defineExpose' const WITH_DEFAULTS = 'withDefaults' +// constants +const DEFAULT_VAR = `__default__` + const isBuiltInDir = makeMap( `once,memo,if,else,else-if,slot,text,html,on,bind,model,show,cloak,is` ) @@ -214,14 +217,14 @@ export function compileScript( } } if (cssVars.length) { - content = rewriteDefault(content, `__default__`, plugins) + content = rewriteDefault(content, DEFAULT_VAR, plugins) content += genNormalScriptCssVarsCode( cssVars, bindings, scopeId, isProd ) - content += `\nexport default __default__` + content += `\nexport default ${DEFAULT_VAR}` } return { ...script, @@ -251,7 +254,6 @@ export function compileScript( // metadata that needs to be returned const bindingMetadata: BindingMetadata = {} - const defaultTempVar = `__default__` const helperImports: Set = new Set() const userImports: Record = Object.create(null) const userImportAlias: Record = Object.create(null) @@ -780,7 +782,6 @@ export function compileScript( // 1. process normal