-import { parse, SFCScriptCompileOptions } from '../src'
+import { parse, SFCScriptCompileOptions, compileScript } from '../src'
import { parse as babelParse } from '@babel/parser'
import { babelParserDefautPlugins } from '@vue/shared'
function compile(src: string, options?: SFCScriptCompileOptions) {
- return parse(src, options).descriptor.scriptTransformed!
+ const { descriptor } = parse(src)
+ return compileScript(descriptor, options)
}
function assertCode(code: string) {
describe('errors', () => {
test('<script> and <script setup> must have same lang', () => {
- 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`)
+ expect(() =>
+ compile(`<script>foo()</script><script setup lang="ts">bar()</script>`)
+ ).toThrow(`<script> and <script setup> must have the same language type`)
})
test('export local as default', () => {
- expect(
- parse(`<script setup>
+ expect(() =>
+ compile(`<script setup>
const bar = 1
export { bar as default }
- </script>`).errors[0].message
- ).toMatch(`Cannot export locally defined variable as default`)
+ </script>`)
+ ).toThrow(`Cannot export locally defined variable as default`)
})
test('export default referencing local var', () => {
- expect(
- parse(`<script setup>
+ expect(() =>
+ compile(`<script setup>
const bar = 1
export default {
props: {
}
}
}
- </script>`).errors[0].message
- ).toMatch(`cannot reference locally declared variables`)
+ </script>`)
+ ).toThrow(`cannot reference locally declared variables`)
})
test('export default referencing exports', () => {
- expect(
- parse(`<script setup>
+ expect(() =>
+ compile(`<script setup>
export const bar = 1
export default {
props: bar
}
- </script>`).errors[0].message
- ).toMatch(`cannot reference locally declared variables`)
+ </script>`)
+ ).toThrow(`cannot reference locally declared variables`)
})
test('should allow export default referencing scope var', () => {
})
test('error on duplicated default export', () => {
- expect(
- parse(`
+ expect(() =>
+ compile(`
<script>
export default {}
</script>
<script setup>
export default {}
</script>
- `).errors[0].message
- ).toMatch(`Default export is already declared`)
+ `)
+ ).toThrow(`Default export is already declared`)
- expect(
- parse(`
+ expect(() =>
+ compile(`
<script>
export default {}
</script>
const x = {}
export { x as default }
</script>
- `).errors[0].message
- ).toMatch(`Default export is already declared`)
+ `)
+ ).toThrow(`Default export is already declared`)
- expect(
- parse(`
+ expect(() =>
+ compile(`
<script>
export default {}
</script>
<script setup>
export { x as default } from './y'
</script>
- `).errors[0].message
- ).toMatch(`Default export is already declared`)
+ `)
+ ).toThrow(`Default export is already declared`)
- expect(
- parse(`
+ expect(() =>
+ compile(`
<script>
export { x as default } from './y'
</script>
<script setup>
export default {}
</script>
- `).errors[0].message
- ).toMatch(`Default export is already declared`)
+ `)
+ ).toThrow(`Default export is already declared`)
- expect(
- parse(`
+ expect(() =>
+ compile(`
<script>
const x = {}
export { x as default }
<script setup>
export default {}
</script>
- `).errors[0].message
- ).toMatch(`Default export is already declared`)
+ `)
+ ).toThrow(`Default export is already declared`)
})
})
})
import * as CompilerDOM from '@vue/compiler-dom'
import { RawSourceMap, SourceMapGenerator } from 'source-map'
import { TemplateCompiler } from './compileTemplate'
-import { compileScript, SFCScriptCompileOptions } from './compileScript'
-export interface SFCParseOptions extends SFCScriptCompileOptions {
+export interface SFCParseOptions {
filename?: string
sourceMap?: boolean
sourceRoot?: string
template: SFCTemplateBlock | null
script: SFCScriptBlock | null
scriptSetup: SFCScriptBlock | null
- scriptTransformed: SFCScriptBlock | null
styles: SFCStyleBlock[]
customBlocks: SFCBlock[]
}
filename = 'component.vue',
sourceRoot = '',
pad = false,
- compiler = CompilerDOM,
- babelParserPlugins
+ compiler = CompilerDOM
}: SFCParseOptions = {}
): SFCParseResult {
const sourceKey =
template: null,
script: null,
scriptSetup: null,
- scriptTransformed: null,
styles: [],
customBlocks: []
}
descriptor.styles.forEach(genMap)
}
- if (descriptor.script || descriptor.scriptSetup) {
- try {
- descriptor.scriptTransformed = compileScript(descriptor, {
- babelParserPlugins
- })
- } catch (e) {
- errors.push(e)
- }
- }
-
const result = {
descriptor,
errors