describe('ref: syntax sugar', () => {
test('convert ref declarations', () => {
const { content, bindings } = compile(`<script setup>
+ ref: foo
ref: a = 1
ref: b = {
count: 0
let d
</script>`)
expect(content).toMatch(`import { ref } from 'vue'`)
+ expect(content).not.toMatch(`ref: foo`)
expect(content).not.toMatch(`ref: a`)
+ expect(content).not.toMatch(`ref: b`)
+ expect(content).toMatch(`const foo = ref()`)
expect(content).toMatch(`const a = ref(1)`)
expect(content).toMatch(`
const b = ref({
expect(content).toMatch(`let d`)
assertCode(content)
expect(bindings).toStrictEqual({
+ foo: 'setup',
a: 'setup',
b: 'setup',
c: 'setup',
helperImports.add('ref')
const { left, right } = exp
if (left.type === 'Identifier') {
- if (left.name[0] === '$') {
- error(`ref variable identifiers cannot start with $.`, left)
- }
- refBindings[left.name] = setupBindings[left.name] = true
- refIdentifiers.add(left)
+ registerRefBinding(left)
s.prependRight(right.start! + startOffset, `ref(`)
s.appendLeft(right.end! + startOffset, ')')
} else if (left.type === 'ObjectPattern') {
// possible multiple declarations
// ref: x = 1, y = 2
exp.expressions.forEach(e => processRefExpression(e, statement))
+ } else if (exp.type === 'Identifier') {
+ registerRefBinding(exp)
+ s.appendLeft(exp.end! + startOffset, ` = ref()`)
} else {
error(`ref: statements can only contain assignment expressions.`, exp)
}
}
+ function registerRefBinding(id: Identifier) {
+ if (id.name[0] === '$') {
+ error(`ref variable identifiers cannot start with $.`, id)
+ }
+ refBindings[id.name] = setupBindings[id.name] = true
+ refIdentifiers.add(id)
+ }
+
function processRefObjectPattern(
pattern: ObjectPattern,
statement: LabeledStatement
s.prependRight(nameId.start! + startOffset, `__`)
}
if (nameId) {
- // register binding
- refBindings[nameId.name] = setupBindings[nameId.name] = true
- refIdentifiers.add(nameId)
+ registerRefBinding(nameId)
// append binding declarations after the parent statement
s.appendLeft(
statement.end! + startOffset,
processRefArrayPattern(e, statement)
}
if (nameId) {
+ registerRefBinding(nameId)
+ // prefix original
s.prependRight(nameId.start! + startOffset, `__`)
- // register binding
- refBindings[nameId.name] = setupBindings[nameId.name] = true
- refIdentifiers.add(nameId)
// append binding declarations after the parent statement
s.appendLeft(
statement.end! + startOffset,