return compile(src, { refSugar: true })
}
- test('$ref declarations', () => {
+ test('$ref & $shallowRef declarations', () => {
const { content, bindings } = compileWithRefSugar(`<script setup>
let foo = $ref()
let a = $ref(1)
- let b = $ref({
+ let b = $shallowRef({
count: 0
})
let c = () => {}
let d
</script>`)
- expect(content).toMatch(`import { ref as _ref } from 'vue'`)
+ expect(content).toMatch(
+ `import { ref as _ref, shallowRef as _shallowRef } from 'vue'`
+ )
expect(content).not.toMatch(`$ref()`)
expect(content).not.toMatch(`$ref(1)`)
- expect(content).not.toMatch(`$ref({`)
+ expect(content).not.toMatch(`$shallowRef({`)
expect(content).toMatch(`let foo = _ref()`)
expect(content).toMatch(`let a = _ref(1)`)
expect(content).toMatch(`
- let b = _ref({
+ let b = _shallowRef({
count: 0
})
`)
const WITH_DEFAULTS = 'withDefaults'
const $REF = `$ref`
+const $SHALLOW_REF = '$shallowRef'
const $COMPUTED = `$computed`
const $FROM_REFS = `$fromRefs`
const $RAW = `$raw`
}
function isRefSugarCall(callee: string) {
- return callee === $REF || callee === $COMPUTED || callee === $FROM_REFS
+ return (
+ callee === $REF ||
+ callee === $COMPUTED ||
+ callee === $FROM_REFS ||
+ callee === $SHALLOW_REF
+ )
}
function processRefSugar(
const callee = (decl.init.callee as Identifier).name
const start = decl.init.start! + startOffset
- if (callee === $REF) {
+ if (callee === $REF || callee === $SHALLOW_REF) {
if (statement.kind !== 'let') {
- error(`${$REF}() bindings can only be declared with let.`, decl)
+ error(`${callee}() bindings can only be declared with let.`, decl)
}
if (decl.id.type !== 'Identifier') {
error(
- `${$REF}() bindings cannot be used with destructuring. ` +
+ `${callee}() bindings cannot be used with destructuring. ` +
`If you are trying to destructure from an object of refs, ` +
`use \`let { x } = $fromRefs(obj)\`.`,
decl.id
)
}
registerRefBinding(decl.id)
- s.overwrite(start, start + $REF.length, helper('ref'))
+ s.overwrite(
+ start,
+ start + callee.length,
+ helper(callee === $REF ? 'ref' : 'shallowRef')
+ )
} else if (callee === $COMPUTED) {
if (decl.id.type !== 'Identifier') {
error(
- `${$COMPUTED}() bindings cannot be used with destructuring.`,
+ `${callee}() bindings cannot be used with destructuring.`,
decl.id
)
}
} else if (callee === $FROM_REFS) {
if (!decl.id.type.endsWith('Pattern')) {
error(
- `${$FROM_REFS}() declaration must be used with destructure patterns.`,
+ `${callee}() declaration must be used with destructure patterns.`,
decl
)
}
return false // skip walk
} else if (
parent &&
- isCallOf(
- node,
- id => id === $REF || id === $FROM_REFS || id === $COMPUTED
- ) &&
+ isCallOf(node, isRefSugarCall) &&
(parent.type !== 'VariableDeclarator' || node !== parent.init)
) {
error(