expose();
-return { n, x }
+return { n, get x() { return x } }
}
}"
x()
-return { n, x }
+return { n, get x() { return x } }
}
})"
x()
-return { n, x }
+return { n, get x() { return x } }
}
})"
x()
-return { x }
+return { get x() { return x } }
}
})"
x()
-return { n, def, x }
+return { n, def, get x() { return x } }
}
})"
x()
-return { n, x }
+return { n, get x() { return x } }
}
})"
x()
-return { n, x }
+return { n, get x() { return x } }
}
})"
-return { props, propsModel }
+return { props, get propsModel() { return propsModel } }
}
}"
const props = __props;
-return { props, x }
+return { props, get x() { return x } }
}
}"
const a = 1
function b() {}
-return { a, b, Baz }
+return { a, b, get Baz() { return Baz } }
}
})"
const cond = true
-return { cond, bar, baz }
+return { cond, get bar() { return bar }, get baz() { return baz } }
}
})"
const fooBar: FooBar = 1
-return { fooBar, FooBaz, FooQux, foo }
+return { fooBar, get FooBaz() { return FooBaz }, get FooQux() { return FooQux }, get foo() { return foo } }
}
})"
expose();
-return { vMyDir }
+return { get vMyDir() { return vMyDir } }
}
})"
expose();
-return { VAR, VAR3 }
+return { get VAR() { return VAR }, get VAR3() { return VAR3 } }
}
})"
expose();
-return { FooBaz, Last }
+return { get FooBaz() { return FooBaz }, get Last() { return Last } }
}
})"
expose();
-return { x, z, x$y }
+return { get x() { return x }, get z() { return z }, get x$y() { return x$y } }
}
})"
-return { bar }
+return { get bar() { return bar } }
}
}"
x()
-return { x }
+return { get x() { return x } }
}
}"
expose();
-return { a, b }
+return { get a() { return a }, get b() { return b } }
}
}"
function c() {}
class d {}
-return { get aa() { return aa }, bb, cc, dd, get a() { return a }, b, c, d, xx, x }
+return { get aa() { return aa }, set aa(v) { aa = v }, bb, cc, dd, get a() { return a }, set a(v) { a = v }, b, c, d, get xx() { return xx }, get x() { return x } }
}
}"
expose();
-return { Baz }
+return { get Baz() { return Baz } }
}
})"
-return { props, defaults }
+return { props, get defaults() { return defaults } }
}
})"
let c = () => {}
let d
-return { foo, a, b, get c() { return c }, get d() { return d }, ref, shallowRef }
+return { foo, a, b, get c() { return c }, set c(v) { c = v }, get d() { return d }, set d(v) { d = v }, ref, shallowRef }
}
}"
let c = () => {}
let d
-return { foo, a, b, get c() { return c }, get d() { return d } }
+return { foo, a, b, get c() { return c }, set c(v) { c = v }, get d() { return d }, set d(v) { d = v } }
}
}"
let b = 200
let foo = 300
-return { get a() { return a }, get b() { return b }, get foo() { return foo } }
+return { get a() { return a }, set a(v) { a = v }, get b() { return b }, set b(v) { b = v }, get foo() { return foo }, set foo(v) { foo = v } }
}
}"
</script>
`)
expect(content).toMatch(
- 'return { get aa() { return aa }, bb, cc, dd, get a() { return a }, b, c, d, xx, x }'
+ `return { get aa() { return aa }, set aa(v) { aa = v }, ` +
+ `bb, cc, dd, get a() { return a }, set a(v) { a = v }, b, c, d, ` +
+ `get xx() { return xx }, get x() { return x } }`
)
expect(bindings).toStrictEqual({
x: BindingTypes.SETUP_MAYBE_REF,
// FooBaz: used as PascalCase component
// FooQux: used as kebab-case component
// foo: lowercase component
- expect(content).toMatch(`return { fooBar, FooBaz, FooQux, foo }`)
+ expect(content).toMatch(
+ `return { fooBar, get FooBaz() { return FooBaz }, ` +
+ `get FooQux() { return FooQux }, get foo() { return foo } }`
+ )
assertCode(content)
})
<div v-my-dir></div>
</template>
`)
- expect(content).toMatch(`return { vMyDir }`)
+ expect(content).toMatch(`return { get vMyDir() { return vMyDir } }`)
assertCode(content)
})
<div :class="[cond ? '' : bar(), 'default']" :style="baz"></div>
</template>
`)
- expect(content).toMatch(`return { cond, bar, baz }`)
+ expect(content).toMatch(
+ `return { cond, get bar() { return bar }, get baz() { return baz } }`
+ )
assertCode(content)
})
// x: used in interpolation
// y: should not be matched by {{ yy }} or 'y' in binding exps
// x$y: #4274 should escape special chars when creating Regex
- expect(content).toMatch(`return { x, z, x$y }`)
+ expect(content).toMatch(
+ `return { get x() { return x }, get z() { return z }, get x$y() { return x$y } }`
+ )
assertCode(content)
})
</template>
`)
// VAR2 should not be matched
- expect(content).toMatch(`return { VAR, VAR3 }`)
+ expect(content).toMatch(
+ `return { get VAR() { return VAR }, get VAR3() { return VAR3 } }`
+ )
assertCode(content)
})
<Last/>
</template>
`)
- expect(content).toMatch(`return { FooBaz, Last }`)
+ expect(content).toMatch(
+ `return { get FooBaz() { return FooBaz }, get Last() { return Last } }`
+ )
assertCode(content)
})
<div v-for="{ z = x as Qux } in list as Fred"/>
</template>
`)
- expect(content).toMatch(`return { a, b, Baz }`)
+ expect(content).toMatch(`return { a, b, get Baz() { return Baz } }`)
assertCode(content)
})
import { type Bar, Baz } from './main.ts'
</script>`
)
- expect(content).toMatch(`return { Baz }`)
+ expect(content).toMatch(`return { get Baz() { return Baz } }`)
assertCode(content)
})
})
expect(content).toMatch(`let c = () => {}`)
expect(content).toMatch(`let d`)
expect(content).toMatch(
- `return { foo, a, b, get c() { return c }, get d() { return d }, ref, shallowRef }`
+ `return { foo, a, b, get c() { return c }, set c(v) { c = v }, ` +
+ `get d() { return d }, set d(v) { d = v }, ref, shallowRef }`
)
assertCode(content)
expect(bindings).toStrictEqual({
}
returned = `{ `
for (const key in allBindings) {
- if (bindingMetadata[key] === BindingTypes.SETUP_LET) {
+ if (
+ allBindings[key] === true &&
+ userImports[key].source !== 'vue' &&
+ !userImports[key].source.endsWith('.vue')
+ ) {
+ // generate getter for import bindings
+ // skip vue imports since we know they will never change
returned += `get ${key}() { return ${key} }, `
+ } else if (bindingMetadata[key] === BindingTypes.SETUP_LET) {
+ // local let binding, also add setter
+ const setArg = key === 'v' ? `_v` : `v`
+ returned +=
+ `get ${key}() { return ${key} }, ` +
+ `set ${key}(${setArg}) { ${key} = ${setArg} }, `
} else {
returned += `${key}, `
}