From 001184e6bbbc85c4698f460b1f810beca3aed262 Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 10 Nov 2022 10:42:27 +0800 Subject: [PATCH] fix(compiler/v-model): catch incorrect v-model usage on prop bindings close #5584 --- .../__tests__/transforms/vModel.spec.ts | 20 ++++++++++++++++++- packages/compiler-core/src/errors.ts | 2 ++ .../compiler-core/src/transforms/vModel.ts | 10 ++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/packages/compiler-core/__tests__/transforms/vModel.spec.ts b/packages/compiler-core/__tests__/transforms/vModel.spec.ts index 96dbe2cb5fb..0af7d9eb608 100644 --- a/packages/compiler-core/__tests__/transforms/vModel.spec.ts +++ b/packages/compiler-core/__tests__/transforms/vModel.spec.ts @@ -10,7 +10,8 @@ import { ComponentNode, NodeTypes, VNodeCall, - NORMALIZE_PROPS + NORMALIZE_PROPS, + BindingTypes } from '../../src' import { ErrorCodes } from '../../src/errors' import { transformModel } from '../../src/transforms/vModel' @@ -561,5 +562,22 @@ describe('compiler: transform v-model', () => { }) ) }) + + test('used on props', () => { + const onError = jest.fn() + parseWithVModel('
', { + onError, + bindingMetadata: { + p: BindingTypes.PROPS + } + }) + + expect(onError).toHaveBeenCalledTimes(1) + expect(onError).toHaveBeenCalledWith( + expect.objectContaining({ + code: ErrorCodes.X_V_MODEL_ON_SCOPE_VARIABLE + }) + ) + }) }) }) diff --git a/packages/compiler-core/src/errors.ts b/packages/compiler-core/src/errors.ts index f0af09dda31..345aa183fc9 100644 --- a/packages/compiler-core/src/errors.ts +++ b/packages/compiler-core/src/errors.ts @@ -87,6 +87,7 @@ export const enum ErrorCodes { X_V_MODEL_NO_EXPRESSION, X_V_MODEL_MALFORMED_EXPRESSION, X_V_MODEL_ON_SCOPE_VARIABLE, + X_V_MODEL_ON_PROPS, X_INVALID_EXPRESSION, X_KEEP_ALIVE_INVALID_CHILDREN, @@ -168,6 +169,7 @@ export const errorMessages: Record = { [ErrorCodes.X_V_MODEL_NO_EXPRESSION]: `v-model is missing expression.`, [ErrorCodes.X_V_MODEL_MALFORMED_EXPRESSION]: `v-model value must be a valid JavaScript member expression.`, [ErrorCodes.X_V_MODEL_ON_SCOPE_VARIABLE]: `v-model cannot be used on v-for or v-slot scope variables because they are not writable.`, + [ErrorCodes.X_V_MODEL_ON_PROPS]: `v-model cannot be used on a prop, because local prop bindings are not writable.\nUse a v-bind binding combined with a v-on listener that emits update:x event instead.`, [ErrorCodes.X_INVALID_EXPRESSION]: `Error parsing JavaScript expression: `, [ErrorCodes.X_KEEP_ALIVE_INVALID_CHILDREN]: ` expects exactly one child component.`, diff --git a/packages/compiler-core/src/transforms/vModel.ts b/packages/compiler-core/src/transforms/vModel.ts index bcf3749bdfe..16995994699 100644 --- a/packages/compiler-core/src/transforms/vModel.ts +++ b/packages/compiler-core/src/transforms/vModel.ts @@ -35,6 +35,16 @@ export const transformModel: DirectiveTransform = (dir, node, context) => { // im SFC