describe('errors', () => {
test('<script> and <script setup> must have same lang', () => {
- expect(() =>
- compile(`<script>foo()</script><script setup lang="ts">bar()</script>`)
- ).toThrow(`<script> and <script setup> must have the same language type`)
+ expect(
+ parse(`<script>foo()</script><script setup lang="ts">bar()</script>`)
+ .errors[0].message
+ ).toMatch(`<script> and <script setup> must have the same language type`)
})
test('export local as default', () => {
- expect(() =>
- compile(`<script setup>
+ expect(
+ parse(`<script setup>
const bar = 1
export { bar as default }
- </script>`)
- ).toThrow(`Cannot export locally defined variable as default`)
+ </script>`).errors[0].message
+ ).toMatch(`Cannot export locally defined variable as default`)
})
test('export default referencing local var', () => {
- expect(() =>
- compile(`<script setup>
+ expect(
+ parse(`<script setup>
const bar = 1
export default {
props: {
}
}
}
- </script>`)
- ).toThrow(`cannot reference locally declared variables`)
+ </script>`).errors[0].message
+ ).toMatch(`cannot reference locally declared variables`)
})
test('export default referencing exports', () => {
- expect(() =>
- compile(`<script setup>
+ expect(
+ parse(`<script setup>
export const bar = 1
export default {
props: bar
}
- </script>`)
- ).toThrow(`cannot reference locally declared variables`)
+ </script>`).errors[0].message
+ ).toMatch(`cannot reference locally declared variables`)
})
test('should allow export default referencing scope var', () => {
})
test('error on duplicated defalut export', () => {
- expect(() =>
- compile(`
+ expect(
+ parse(`
<script>
export default {}
</script>
<script setup>
export default {}
</script>
- `)
- ).toThrow(`Default export is already declared`)
+ `).errors[0].message
+ ).toMatch(`Default export is already declared`)
- expect(() =>
- compile(`
+ expect(
+ parse(`
<script>
export default {}
</script>
const x = {}
export { x as default }
</script>
- `)
- ).toThrow(`Default export is already declared`)
+ `).errors[0].message
+ ).toMatch(`Default export is already declared`)
- expect(() =>
- compile(`
+ expect(
+ parse(`
<script>
export default {}
</script>
<script setup>
export { x as default } from './y'
</script>
- `)
- ).toThrow(`Default export is already declared`)
+ `).errors[0].message
+ ).toMatch(`Default export is already declared`)
- expect(() =>
- compile(`
+ expect(
+ parse(`
<script>
export { x as default } from './y'
</script>
<script setup>
export default {}
</script>
- `)
- ).toThrow(`Default export is already declared`)
+ `).errors[0].message
+ ).toMatch(`Default export is already declared`)
- expect(() =>
- compile(`
+ expect(
+ parse(`
<script>
const x = {}
export { x as default }
<script setup>
export default {}
</script>
- `)
- ).toThrow(`Default export is already declared`)
+ `).errors[0].message
+ ).toMatch(`Default export is already declared`)
})
})
})
import { RawSourceMap } from 'source-map'
export interface SFCScriptCompileOptions {
+ /**
+ * https://babeljs.io/docs/en/babel-parser#plugins
+ */
babelParserPlugins?: ParserPlugin[]
}
)
}
+ const defaultTempVar = `__default__`
const bindings: BindingMetadata = {}
const imports: Record<string, string> = {}
const setupScopeVars: Record<string, boolean> = {}
s.overwrite(
start,
start + `export default`.length,
- `const __default__ =`
+ `const ${defaultTempVar} =`
)
} else if (node.type === 'ExportNamedDeclaration' && node.specifiers) {
const defaultSpecifier = node.specifiers.find(
// 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`
+ )
}
}
}
s.overwrite(
specifier.exported.start! + startOffset,
specifier.exported.start! + startOffset + 7,
- '__default__'
+ defaultTempVar
)
} else if (specifier.type === 'ExportSpecifier') {
if (specifier.exported.name === 'default') {
)
}
// 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 {
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(
)
} 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 }`)
}
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 {