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 {