2021-06-30 03:22:26 +08:00
|
|
|
import { BindingTypes } from '@vue/compiler-core'
|
|
|
|
import { compileSFCScript as compile, assertCode } from './utils'
|
|
|
|
|
2021-08-23 10:21:42 +08:00
|
|
|
// this file only tests integration with SFC - main test case for the ref
|
|
|
|
// transform can be found in <root>/packages/ref-transform/__tests__
|
2021-06-30 03:22:26 +08:00
|
|
|
describe('<script setup> ref sugar', () => {
|
|
|
|
function compileWithRefSugar(src: string) {
|
|
|
|
return compile(src, { refSugar: true })
|
|
|
|
}
|
|
|
|
|
2021-08-23 10:21:42 +08:00
|
|
|
test('$ unwrapping', () => {
|
|
|
|
const { content, bindings } = compileWithRefSugar(`<script setup>
|
|
|
|
import { ref, shallowRef } from 'vue'
|
|
|
|
let foo = $(ref())
|
|
|
|
let a = $(ref(1))
|
|
|
|
let b = $(shallowRef({
|
|
|
|
count: 0
|
|
|
|
}))
|
|
|
|
let c = () => {}
|
|
|
|
let d
|
|
|
|
</script>`)
|
|
|
|
expect(content).not.toMatch(`$(ref())`)
|
|
|
|
expect(content).not.toMatch(`$(ref(1))`)
|
|
|
|
expect(content).not.toMatch(`$(shallowRef({`)
|
|
|
|
expect(content).toMatch(`let foo = (ref())`)
|
|
|
|
expect(content).toMatch(`let a = (ref(1))`)
|
|
|
|
expect(content).toMatch(`
|
|
|
|
let b = (shallowRef({
|
|
|
|
count: 0
|
|
|
|
}))
|
|
|
|
`)
|
|
|
|
// normal declarations left untouched
|
|
|
|
expect(content).toMatch(`let c = () => {}`)
|
|
|
|
expect(content).toMatch(`let d`)
|
|
|
|
expect(content).toMatch(`return { foo, a, b, c, d, ref, shallowRef }`)
|
|
|
|
assertCode(content)
|
|
|
|
expect(bindings).toStrictEqual({
|
|
|
|
foo: BindingTypes.SETUP_REF,
|
|
|
|
a: BindingTypes.SETUP_REF,
|
|
|
|
b: BindingTypes.SETUP_REF,
|
|
|
|
c: BindingTypes.SETUP_LET,
|
|
|
|
d: BindingTypes.SETUP_LET,
|
|
|
|
ref: BindingTypes.SETUP_CONST,
|
|
|
|
shallowRef: BindingTypes.SETUP_CONST
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
2021-08-11 22:19:58 +08:00
|
|
|
test('$ref & $shallowRef declarations', () => {
|
2021-06-30 03:22:26 +08:00
|
|
|
const { content, bindings } = compileWithRefSugar(`<script setup>
|
2021-07-15 03:35:34 +08:00
|
|
|
let foo = $ref()
|
|
|
|
let a = $ref(1)
|
2021-08-11 22:19:58 +08:00
|
|
|
let b = $shallowRef({
|
2021-06-30 03:22:26 +08:00
|
|
|
count: 0
|
2021-07-15 03:35:34 +08:00
|
|
|
})
|
2021-06-30 03:22:26 +08:00
|
|
|
let c = () => {}
|
|
|
|
let d
|
|
|
|
</script>`)
|
2021-08-11 22:19:58 +08:00
|
|
|
expect(content).toMatch(
|
|
|
|
`import { ref as _ref, shallowRef as _shallowRef } from 'vue'`
|
|
|
|
)
|
2021-07-15 03:35:34 +08:00
|
|
|
expect(content).not.toMatch(`$ref()`)
|
|
|
|
expect(content).not.toMatch(`$ref(1)`)
|
2021-08-11 22:19:58 +08:00
|
|
|
expect(content).not.toMatch(`$shallowRef({`)
|
2021-07-15 03:35:34 +08:00
|
|
|
expect(content).toMatch(`let foo = _ref()`)
|
|
|
|
expect(content).toMatch(`let a = _ref(1)`)
|
2021-06-30 03:22:26 +08:00
|
|
|
expect(content).toMatch(`
|
2021-08-11 22:19:58 +08:00
|
|
|
let b = _shallowRef({
|
2021-06-30 03:22:26 +08:00
|
|
|
count: 0
|
|
|
|
})
|
|
|
|
`)
|
|
|
|
// normal declarations left untouched
|
|
|
|
expect(content).toMatch(`let c = () => {}`)
|
|
|
|
expect(content).toMatch(`let d`)
|
|
|
|
assertCode(content)
|
|
|
|
expect(bindings).toStrictEqual({
|
|
|
|
foo: BindingTypes.SETUP_REF,
|
|
|
|
a: BindingTypes.SETUP_REF,
|
|
|
|
b: BindingTypes.SETUP_REF,
|
|
|
|
c: BindingTypes.SETUP_LET,
|
|
|
|
d: BindingTypes.SETUP_LET
|
|
|
|
})
|
|
|
|
})
|
|
|
|
|
|
|
|
describe('errors', () => {
|
|
|
|
test('defineProps/Emit() referencing ref declarations', () => {
|
|
|
|
expect(() =>
|
|
|
|
compile(
|
|
|
|
`<script setup>
|
2021-07-15 03:35:34 +08:00
|
|
|
let bar = $ref(1)
|
2021-06-30 03:22:26 +08:00
|
|
|
defineProps({
|
|
|
|
bar
|
|
|
|
})
|
|
|
|
</script>`,
|
|
|
|
{ refSugar: true }
|
|
|
|
)
|
|
|
|
).toThrow(`cannot reference locally declared variables`)
|
|
|
|
|
|
|
|
expect(() =>
|
|
|
|
compile(
|
|
|
|
`<script setup>
|
2021-07-15 03:35:34 +08:00
|
|
|
let bar = $ref(1)
|
2021-06-30 03:22:26 +08:00
|
|
|
defineEmits({
|
|
|
|
bar
|
|
|
|
})
|
|
|
|
</script>`,
|
|
|
|
{ refSugar: true }
|
|
|
|
)
|
|
|
|
).toThrow(`cannot reference locally declared variables`)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
})
|