From f1872ff605be2d74e5e25d43389cf8c3cfcc229a Mon Sep 17 00:00:00 2001 From: Runyasak Chaengnaimuang Date: Mon, 19 May 2025 00:22:12 +0700 Subject: [PATCH 1/8] fix(compiler-sfc): add error handling for defineModel() without variable assignment --- packages/compiler-core/src/errors.ts | 3 ++- .../__tests__/compileScript/defineModel.spec.ts | 12 +++++++++++- packages/compiler-sfc/src/script/defineModel.ts | 11 ++++++++++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/packages/compiler-core/src/errors.ts b/packages/compiler-core/src/errors.ts index 58e113ab19e..1c156a5c25b 100644 --- a/packages/compiler-core/src/errors.ts +++ b/packages/compiler-core/src/errors.ts @@ -90,7 +90,7 @@ export enum ErrorCodes { X_V_MODEL_ON_PROPS, X_INVALID_EXPRESSION, X_KEEP_ALIVE_INVALID_CHILDREN, - + X_DEFINE_MODEL_NO_VARIABLE, // generic errors X_PREFIX_ID_NOT_SUPPORTED, X_MODULE_MODE_NOT_SUPPORTED, @@ -179,6 +179,7 @@ export const errorMessages: Record = { [ErrorCodes.X_INVALID_EXPRESSION]: `Error parsing JavaScript expression: `, [ErrorCodes.X_KEEP_ALIVE_INVALID_CHILDREN]: ` expects exactly one child component.`, [ErrorCodes.X_VNODE_HOOKS]: `@vnode-* hooks in templates are no longer supported. Use the vue: prefix instead. For example, @vnode-mounted should be changed to @vue:mounted. @vnode-* hooks support has been removed in 3.4.`, + [ErrorCodes.X_DEFINE_MODEL_NO_VARIABLE]: `defineModel() must be assigned to a variable. For example: const model = defineModel()`, // generic errors [ErrorCodes.X_PREFIX_ID_NOT_SUPPORTED]: `"prefixIdentifiers" option is not supported in this build of compiler.`, diff --git a/packages/compiler-sfc/__tests__/compileScript/defineModel.spec.ts b/packages/compiler-sfc/__tests__/compileScript/defineModel.spec.ts index 5d696a95d88..6752b741532 100644 --- a/packages/compiler-sfc/__tests__/compileScript/defineModel.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScript/defineModel.spec.ts @@ -1,4 +1,4 @@ -import { BindingTypes } from '@vue/compiler-core' +import { BindingTypes, ErrorCodes, errorMessages } from '@vue/compiler-core' import { assertCode, compileSFCScript as compile } from '../utils' describe('defineModel()', () => { @@ -269,4 +269,14 @@ describe('defineModel()', () => { modelValue: BindingTypes.SETUP_REF, }) }) + + test('error when defineModel is not assigned to a variable', () => { + expect(() => + compile(` + + `), + ).toThrow(errorMessages[ErrorCodes.X_DEFINE_MODEL_NO_VARIABLE]) + }) }) diff --git a/packages/compiler-sfc/src/script/defineModel.ts b/packages/compiler-sfc/src/script/defineModel.ts index 05082800284..5416cdf6c64 100644 --- a/packages/compiler-sfc/src/script/defineModel.ts +++ b/packages/compiler-sfc/src/script/defineModel.ts @@ -2,7 +2,12 @@ import type { LVal, Node, TSType } from '@babel/types' import type { ScriptCompileContext } from './context' import { inferRuntimeType } from './resolveType' import { UNKNOWN_TYPE, isCallOf, toRuntimeTypeString } from './utils' -import { BindingTypes, unwrapTSNode } from '@vue/compiler-dom' +import { + BindingTypes, + ErrorCodes, + errorMessages, + unwrapTSNode, +} from '@vue/compiler-dom' export const DEFINE_MODEL = 'defineModel' @@ -22,6 +27,10 @@ export function processDefineModel( return false } + if (!declId) { + ctx.error(errorMessages[ErrorCodes.X_DEFINE_MODEL_NO_VARIABLE], node) + } + ctx.hasDefineModelCall = true const type = From 9395a0842e209d62901d10555125f3ea23c7d173 Mon Sep 17 00:00:00 2001 From: Runyasak Chaengnaimuang Date: Mon, 19 May 2025 07:59:24 +0700 Subject: [PATCH 2/8] fix(compiler-sfc): rename to X_DEFINE_MODEL_NO_ASSIGNMENT --- packages/compiler-core/src/errors.ts | 4 ++-- .../compiler-sfc/__tests__/compileScript/defineModel.spec.ts | 2 +- packages/compiler-sfc/src/script/defineModel.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/compiler-core/src/errors.ts b/packages/compiler-core/src/errors.ts index 1c156a5c25b..bc81c22784c 100644 --- a/packages/compiler-core/src/errors.ts +++ b/packages/compiler-core/src/errors.ts @@ -90,7 +90,7 @@ export enum ErrorCodes { X_V_MODEL_ON_PROPS, X_INVALID_EXPRESSION, X_KEEP_ALIVE_INVALID_CHILDREN, - X_DEFINE_MODEL_NO_VARIABLE, + X_DEFINE_MODEL_NO_ASSIGNMENT, // generic errors X_PREFIX_ID_NOT_SUPPORTED, X_MODULE_MODE_NOT_SUPPORTED, @@ -179,7 +179,7 @@ export const errorMessages: Record = { [ErrorCodes.X_INVALID_EXPRESSION]: `Error parsing JavaScript expression: `, [ErrorCodes.X_KEEP_ALIVE_INVALID_CHILDREN]: ` expects exactly one child component.`, [ErrorCodes.X_VNODE_HOOKS]: `@vnode-* hooks in templates are no longer supported. Use the vue: prefix instead. For example, @vnode-mounted should be changed to @vue:mounted. @vnode-* hooks support has been removed in 3.4.`, - [ErrorCodes.X_DEFINE_MODEL_NO_VARIABLE]: `defineModel() must be assigned to a variable. For example: const model = defineModel()`, + [ErrorCodes.X_DEFINE_MODEL_NO_ASSIGNMENT]: `defineModel() must be assigned to a variable. For example: const model = defineModel()`, // generic errors [ErrorCodes.X_PREFIX_ID_NOT_SUPPORTED]: `"prefixIdentifiers" option is not supported in this build of compiler.`, diff --git a/packages/compiler-sfc/__tests__/compileScript/defineModel.spec.ts b/packages/compiler-sfc/__tests__/compileScript/defineModel.spec.ts index 6752b741532..349b2487d25 100644 --- a/packages/compiler-sfc/__tests__/compileScript/defineModel.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScript/defineModel.spec.ts @@ -277,6 +277,6 @@ describe('defineModel()', () => { defineModel() `), - ).toThrow(errorMessages[ErrorCodes.X_DEFINE_MODEL_NO_VARIABLE]) + ).toThrow(errorMessages[ErrorCodes.X_DEFINE_MODEL_NO_ASSIGNMENT]) }) }) diff --git a/packages/compiler-sfc/src/script/defineModel.ts b/packages/compiler-sfc/src/script/defineModel.ts index 5416cdf6c64..405c6073113 100644 --- a/packages/compiler-sfc/src/script/defineModel.ts +++ b/packages/compiler-sfc/src/script/defineModel.ts @@ -28,7 +28,7 @@ export function processDefineModel( } if (!declId) { - ctx.error(errorMessages[ErrorCodes.X_DEFINE_MODEL_NO_VARIABLE], node) + ctx.error(errorMessages[ErrorCodes.X_DEFINE_MODEL_NO_ASSIGNMENT], node) } ctx.hasDefineModelCall = true From 65b9098e225ff27c49fab3ce730d7eaa43ed3852 Mon Sep 17 00:00:00 2001 From: Runyasak Chaengnaimuang Date: Mon, 19 May 2025 08:00:59 +0700 Subject: [PATCH 3/8] fix(compiler-dom): update X_V_HTML_NO_EXPRESSION to 54 --- packages/compiler-dom/src/errors.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/compiler-dom/src/errors.ts b/packages/compiler-dom/src/errors.ts index b47624840ab..5bffa4e53a1 100644 --- a/packages/compiler-dom/src/errors.ts +++ b/packages/compiler-dom/src/errors.ts @@ -21,7 +21,7 @@ export function createDOMCompilerError( } export enum DOMErrorCodes { - X_V_HTML_NO_EXPRESSION = 53 /* ErrorCodes.__EXTEND_POINT__ */, + X_V_HTML_NO_EXPRESSION = 54 /* ErrorCodes.__EXTEND_POINT__ */, X_V_HTML_WITH_CHILDREN, X_V_TEXT_NO_EXPRESSION, X_V_TEXT_WITH_CHILDREN, From 46083c1fc50a4bea83fdd8055185bfd24fae39ea Mon Sep 17 00:00:00 2001 From: Runyasak Chaengnaimuang Date: Mon, 19 May 2025 08:27:44 +0700 Subject: [PATCH 4/8] fix(compiler-sfc): assign variable when using defineModel in tests --- packages/compiler-sfc/__tests__/compileScript.spec.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/compiler-sfc/__tests__/compileScript.spec.ts b/packages/compiler-sfc/__tests__/compileScript.spec.ts index 11b5661c16c..c87b019f22e 100644 --- a/packages/compiler-sfc/__tests__/compileScript.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScript.spec.ts @@ -980,7 +980,7 @@ describe('SFC compile `), @@ -990,7 +990,7 @@ describe('SFC compile `), @@ -1000,7 +1000,7 @@ describe('SFC compile `), From fc74eb9937545268dd20882fce5ea699a85435e5 Mon Sep 17 00:00:00 2001 From: Runyasak Chaengnaimuang Date: Mon, 19 May 2025 18:52:28 +0700 Subject: [PATCH 6/8] fix(compiler-sfc): update to inline error message --- packages/compiler-core/src/errors.ts | 2 -- .../__tests__/compileScript/defineModel.spec.ts | 6 ++++-- packages/compiler-sfc/src/script/defineModel.ts | 12 +++++------- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/packages/compiler-core/src/errors.ts b/packages/compiler-core/src/errors.ts index bc81c22784c..a43553a595b 100644 --- a/packages/compiler-core/src/errors.ts +++ b/packages/compiler-core/src/errors.ts @@ -90,7 +90,6 @@ export enum ErrorCodes { X_V_MODEL_ON_PROPS, X_INVALID_EXPRESSION, X_KEEP_ALIVE_INVALID_CHILDREN, - X_DEFINE_MODEL_NO_ASSIGNMENT, // generic errors X_PREFIX_ID_NOT_SUPPORTED, X_MODULE_MODE_NOT_SUPPORTED, @@ -179,7 +178,6 @@ export const errorMessages: Record = { [ErrorCodes.X_INVALID_EXPRESSION]: `Error parsing JavaScript expression: `, [ErrorCodes.X_KEEP_ALIVE_INVALID_CHILDREN]: ` expects exactly one child component.`, [ErrorCodes.X_VNODE_HOOKS]: `@vnode-* hooks in templates are no longer supported. Use the vue: prefix instead. For example, @vnode-mounted should be changed to @vue:mounted. @vnode-* hooks support has been removed in 3.4.`, - [ErrorCodes.X_DEFINE_MODEL_NO_ASSIGNMENT]: `defineModel() must be assigned to a variable. For example: const model = defineModel()`, // generic errors [ErrorCodes.X_PREFIX_ID_NOT_SUPPORTED]: `"prefixIdentifiers" option is not supported in this build of compiler.`, diff --git a/packages/compiler-sfc/__tests__/compileScript/defineModel.spec.ts b/packages/compiler-sfc/__tests__/compileScript/defineModel.spec.ts index 349b2487d25..104d3dc7ab7 100644 --- a/packages/compiler-sfc/__tests__/compileScript/defineModel.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScript/defineModel.spec.ts @@ -1,4 +1,4 @@ -import { BindingTypes, ErrorCodes, errorMessages } from '@vue/compiler-core' +import { BindingTypes } from '@vue/compiler-core' import { assertCode, compileSFCScript as compile } from '../utils' describe('defineModel()', () => { @@ -277,6 +277,8 @@ describe('defineModel()', () => { defineModel() `), - ).toThrow(errorMessages[ErrorCodes.X_DEFINE_MODEL_NO_ASSIGNMENT]) + ).toThrow( + 'defineModel() must be assigned to a variable. For example: const model = defineModel()', + ) }) }) diff --git a/packages/compiler-sfc/src/script/defineModel.ts b/packages/compiler-sfc/src/script/defineModel.ts index 405c6073113..746bbabe552 100644 --- a/packages/compiler-sfc/src/script/defineModel.ts +++ b/packages/compiler-sfc/src/script/defineModel.ts @@ -2,12 +2,7 @@ import type { LVal, Node, TSType } from '@babel/types' import type { ScriptCompileContext } from './context' import { inferRuntimeType } from './resolveType' import { UNKNOWN_TYPE, isCallOf, toRuntimeTypeString } from './utils' -import { - BindingTypes, - ErrorCodes, - errorMessages, - unwrapTSNode, -} from '@vue/compiler-dom' +import { BindingTypes, unwrapTSNode } from '@vue/compiler-dom' export const DEFINE_MODEL = 'defineModel' @@ -28,7 +23,10 @@ export function processDefineModel( } if (!declId) { - ctx.error(errorMessages[ErrorCodes.X_DEFINE_MODEL_NO_ASSIGNMENT], node) + ctx.error( + 'defineModel() must be assigned to a variable. For example: const model = defineModel()', + node, + ) } ctx.hasDefineModelCall = true From 1eb9f28b137c0820f3dc75afe3ce87e5a8459d37 Mon Sep 17 00:00:00 2001 From: Runyasak Chaengnaimuang Date: Mon, 19 May 2025 18:53:08 +0700 Subject: [PATCH 7/8] refactor: revert space --- packages/compiler-core/src/errors.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/compiler-core/src/errors.ts b/packages/compiler-core/src/errors.ts index a43553a595b..58e113ab19e 100644 --- a/packages/compiler-core/src/errors.ts +++ b/packages/compiler-core/src/errors.ts @@ -90,6 +90,7 @@ export enum ErrorCodes { X_V_MODEL_ON_PROPS, X_INVALID_EXPRESSION, X_KEEP_ALIVE_INVALID_CHILDREN, + // generic errors X_PREFIX_ID_NOT_SUPPORTED, X_MODULE_MODE_NOT_SUPPORTED, From 9d205dc2882f0794d91c1ee3d327f29c09891539 Mon Sep 17 00:00:00 2001 From: Runyasak Chaengnaimuang Date: Mon, 19 May 2025 19:01:17 +0700 Subject: [PATCH 8/8] fix: revert X_V_HTML_NO_EXPRESSION --- packages/compiler-dom/src/errors.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/compiler-dom/src/errors.ts b/packages/compiler-dom/src/errors.ts index 5bffa4e53a1..b47624840ab 100644 --- a/packages/compiler-dom/src/errors.ts +++ b/packages/compiler-dom/src/errors.ts @@ -21,7 +21,7 @@ export function createDOMCompilerError( } export enum DOMErrorCodes { - X_V_HTML_NO_EXPRESSION = 54 /* ErrorCodes.__EXTEND_POINT__ */, + X_V_HTML_NO_EXPRESSION = 53 /* ErrorCodes.__EXTEND_POINT__ */, X_V_HTML_WITH_CHILDREN, X_V_TEXT_NO_EXPRESSION, X_V_TEXT_WITH_CHILDREN,