diff --git a/packages/compiler-sfc/__tests__/compileScript.spec.ts b/packages/compiler-sfc/__tests__/compileScript.spec.ts index 90dc31bd..f9ae4cd5 100644 --- a/packages/compiler-sfc/__tests__/compileScript.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScript.spec.ts @@ -290,23 +290,24 @@ describe('SFC compile `) - ).toThrow(``) + .errors[0].message + ).toMatch(``) - ).toThrow(`Cannot export locally defined variable as default`) + `).errors[0].message + ).toMatch(`Cannot export locally defined variable as default`) }) test('export default referencing local var', () => { - expect(() => - compile(``) - ).toThrow(`cannot reference locally declared variables`) + `).errors[0].message + ).toMatch(`cannot reference locally declared variables`) }) test('export default referencing exports', () => { - expect(() => - compile(``) - ).toThrow(`cannot reference locally declared variables`) + `).errors[0].message + ).toMatch(`cannot reference locally declared variables`) }) test('should allow export default referencing scope var', () => { @@ -377,19 +378,19 @@ describe('SFC compile - `) - ).toThrow(`Default export is already declared`) + `).errors[0].message + ).toMatch(`Default export is already declared`) - expect(() => - compile(` + expect( + parse(` @@ -397,33 +398,33 @@ describe('SFC compile - `) - ).toThrow(`Default export is already declared`) + `).errors[0].message + ).toMatch(`Default export is already declared`) - expect(() => - compile(` + expect( + parse(` - `) - ).toThrow(`Default export is already declared`) + `).errors[0].message + ).toMatch(`Default export is already declared`) - expect(() => - compile(` + expect( + parse(` - `) - ).toThrow(`Default export is already declared`) + `).errors[0].message + ).toMatch(`Default export is already declared`) - expect(() => - compile(` + expect( + parse(` - `) - ).toThrow(`Default export is already declared`) + `).errors[0].message + ).toMatch(`Default export is already declared`) }) }) }) diff --git a/packages/compiler-sfc/src/compileScript.ts b/packages/compiler-sfc/src/compileScript.ts index 2f8fbe40..0efe3848 100644 --- a/packages/compiler-sfc/src/compileScript.ts +++ b/packages/compiler-sfc/src/compileScript.ts @@ -20,6 +20,9 @@ import { walk } from 'estree-walker' import { RawSourceMap } from 'source-map' export interface SFCScriptCompileOptions { + /** + * https://babeljs.io/docs/en/babel-parser#plugins + */ babelParserPlugins?: ParserPlugin[] } @@ -63,6 +66,7 @@ export function compileScript( ) } + const defaultTempVar = `__default__` const bindings: BindingMetadata = {} const imports: Record = {} const setupScopeVars: Record = {} @@ -121,7 +125,7 @@ export function compileScript( s.overwrite( start, start + `export default`.length, - `const __default__ =` + `const ${defaultTempVar} =` ) } else if (node.type === 'ExportNamedDeclaration' && node.specifiers) { const defaultSpecifier = node.specifiers.find( @@ -146,14 +150,16 @@ export function compileScript( // rewrite to `import { x as __default__ } from './x'` and // add to top s.prepend( - `import { ${defaultSpecifier.local.name} as __default__ } from '${ - node.source.value - }'\n` + `import { ${ + defaultSpecifier.local.name + } as ${defaultTempVar} } from '${node.source.value}'\n` ) } else { // export { x as default } // rewrite to `const __default__ = x` and move to end - s.append(`\nconst __default__ = ${defaultSpecifier.local.name}\n`) + s.append( + `\nconst ${defaultTempVar} = ${defaultSpecifier.local.name}\n` + ) } } } @@ -283,7 +289,7 @@ export function compileScript( s.overwrite( specifier.exported.start! + startOffset, specifier.exported.start! + startOffset + 7, - '__default__' + defaultTempVar ) } else if (specifier.type === 'ExportSpecifier') { if (specifier.exported.name === 'default') { @@ -319,15 +325,15 @@ export function compileScript( ) } // rewrite to `const __default__ = x` and move to end - s.append(`\nconst __default__ = ${local}\n`) + s.append(`\nconst ${defaultTempVar} = ${local}\n`) } else { // export { x as default } from './x' // rewrite to `import { x as __default__ } from './x'` and // add to top s.prepend( - `import { ${specifier.local.name} as __default__ } from '${ - node.source.value - }'\n` + `import { ${ + specifier.local.name + } as ${defaultTempVar} } from '${node.source.value}'\n` ) } } else { @@ -514,7 +520,7 @@ export function compileScript( s.prepend(`import { defineComponent as __define__ } from 'vue'\n`) // we have to use object spread for types to be merged properly // user's TS setting should compile it down to proper targets - const def = defaultExport ? `\n ...__default__,` : `` + const def = defaultExport ? `\n ...${defaultTempVar},` : `` const runtimeProps = genRuntimeProps(typeDeclaredProps) const runtimeEmits = genRuntimeEmits(typeDeclaredEmits) s.append( @@ -522,7 +528,9 @@ export function compileScript( ) } else { if (defaultExport) { - s.append(`__default__.setup = setup\nexport default __default__`) + s.append( + `${defaultTempVar}.setup = setup\nexport default ${defaultTempVar}` + ) } else { s.append(`export default { setup }`) } diff --git a/packages/compiler-sfc/src/parse.ts b/packages/compiler-sfc/src/parse.ts index 1985b9b6..0fd3896e 100644 --- a/packages/compiler-sfc/src/parse.ts +++ b/packages/compiler-sfc/src/parse.ts @@ -9,16 +9,18 @@ import * as CompilerDOM from '@vue/compiler-dom' import { RawSourceMap, SourceMapGenerator } from 'source-map' import { generateCodeFrame } from '@vue/shared' import { TemplateCompiler } from './compileTemplate' -import { compileScript, BindingMetadata } from './compileScript' -import { ParserPlugin } from '@babel/parser' +import { + compileScript, + BindingMetadata, + SFCScriptCompileOptions +} from './compileScript' -export interface SFCParseOptions { +export interface SFCParseOptions extends SFCScriptCompileOptions { filename?: string sourceMap?: boolean sourceRoot?: string pad?: boolean | 'line' | 'space' compiler?: TemplateCompiler - babelParserPlugins?: ParserPlugin[] } export interface SFCBlock {