})
})
+ // #10807
+ test('should not bail constant on strings w/ ()', () => {
+ const node = parseWithExpressionTransform(
+ `{{ { foo: 'ok()' } }}`,
+ ) as InterpolationNode
+ expect(node.content).toMatchObject({
+ constType: ConstantTypes.CAN_STRINGIFY,
+ })
+ })
+
describe('ES Proposals support', () => {
test('bigInt', () => {
const node = parseWithExpressionTransform(
const isLiteralWhitelisted = /*#__PURE__*/ makeMap('true,false,null,this')
-// a heuristic safeguard to bail constant expressions on presence of
-// likely function invocation and member access
-const constantBailRE = /\w\s*\(|\.[^\d]/
-
export const transformExpression: NodeTransform = (node, context) => {
if (node.type === NodeTypes.INTERPOLATION) {
node.content = processExpression(
// fast path if expression is a simple identifier.
const rawExp = node.content
- // bail constant on parens (function invocation) and dot (member access)
- const bailConstant = constantBailRE.test(rawExp)
let ast = node.ast
} else {
// The identifier is considered constant unless it's pointing to a
// local scope variable (a v-for alias, or a v-slot prop)
- if (!(needPrefix && isLocal) && !bailConstant) {
+ if (!(needPrefix && isLocal)) {
;(node as QualifiedId).isConstant = true
}
// also generate sub-expressions for other identifiers for better
ret.ast = ast
} else {
ret = node
- ret.constType = bailConstant
- ? ConstantTypes.NOT_CONSTANT
- : ConstantTypes.CAN_STRINGIFY
+ ret.constType = ConstantTypes.CAN_STRINGIFY
}
ret.identifiers = Object.keys(knownIds)
return ret