From 55f28c95609a1e7e0a26b573e8e60bb10ba3a44d Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Sat, 26 Apr 2025 23:47:41 +0800
Subject: [PATCH 1/2] fix(volar/jsx-directive): prevent convert v-model to
value for radio and checkbox (#947)
* fix(volar/jsx-directive): prevent convert v-model to value when type is radio or checkbox
* fix: test
---
.../tests/__snapshots__/v-model.test.ts.snap | 1 +
.../tests/fixtures/v-model/index.vue | 1 +
packages/volar/src/jsx-directive/v-model.ts | 34 +++++++++++++++++--
3 files changed, 34 insertions(+), 2 deletions(-)
diff --git a/packages/jsx-directive/tests/__snapshots__/v-model.test.ts.snap b/packages/jsx-directive/tests/__snapshots__/v-model.test.ts.snap
index ed8ce55e8..8f1228889 100644
--- a/packages/jsx-directive/tests/__snapshots__/v-model.test.ts.snap
+++ b/packages/jsx-directive/tests/__snapshots__/v-model.test.ts.snap
@@ -9,6 +9,7 @@ const value = ref('value')
defineRender(() => (
foo = $event, [value.value + "Modifiers"]: { trim: true, number: true }}} />
+
{foo}
))
diff --git a/packages/jsx-directive/tests/fixtures/v-model/index.vue b/packages/jsx-directive/tests/fixtures/v-model/index.vue
index 6bda8ab3a..187c68df7 100644
--- a/packages/jsx-directive/tests/fixtures/v-model/index.vue
+++ b/packages/jsx-directive/tests/fixtures/v-model/index.vue
@@ -6,6 +6,7 @@ const value = ref('value')
defineRender(() => (
+
{foo}
))
diff --git a/packages/volar/src/jsx-directive/v-model.ts b/packages/volar/src/jsx-directive/v-model.ts
index 679b75952..145d4f233 100644
--- a/packages/volar/src/jsx-directive/v-model.ts
+++ b/packages/volar/src/jsx-directive/v-model.ts
@@ -1,7 +1,12 @@
import { replaceSourceRange } from 'muggle-string'
import { allCodeFeatures, type Code } from 'ts-macro'
import { getStart, getText, isJsxExpression } from '../common'
-import { getTagName, type JsxDirective, type TransformOptions } from './index'
+import {
+ getOpeningElement,
+ getTagName,
+ type JsxDirective,
+ type TransformOptions,
+} from './index'
export const isNativeFormElement = (tag: string): boolean => {
return ['input', 'select', 'textarea'].includes(tag)
@@ -160,7 +165,9 @@ function transform(
const result = []
result.push(
...((isNative
- ? [[modelValue, source, start + 2, allCodeFeatures]]
+ ? isRadioOrCheckbox(node, options)
+ ? 'v-model'
+ : [[modelValue, source, start + 2, allCodeFeatures]]
: [
modelValue.slice(0, 3),
[modelValue.slice(3), source, start, allCodeFeatures],
@@ -218,6 +225,29 @@ function transform(
)
}
+function isRadioOrCheckbox(
+ node: import('typescript').Node,
+ options: TransformOptions,
+) {
+ const { ts } = options
+ const openingElement = getOpeningElement(node, options)
+ if (!openingElement) return false
+ const tagName = getText(openingElement.tagName, options)
+ return (
+ tagName === 'input' &&
+ openingElement.attributes.properties.some((attr) => {
+ return (
+ ts.isJsxAttribute(attr) &&
+ getText(attr.name, options) === 'type' &&
+ attr.initializer &&
+ ts.isStringLiteral(attr.initializer) &&
+ (attr.initializer.text === 'radio' ||
+ attr.initializer.text === 'checkbox')
+ )
+ })
+ )
+}
+
function getModelsType(codes: Code[]) {
codes.push(`
type __VLS_NormalizeProps = T extends object
From 120668f29b2db37e0279ffdf617c522fc194f8bb Mon Sep 17 00:00:00 2001
From: zhiyuanzmj <260480378@qq.com>
Date: Sun, 27 Apr 2025 00:23:08 +0800
Subject: [PATCH 2/2] chore: release v3.0.0-beta.10
---
package.json | 2 +-
packages/api/package.json | 2 +-
packages/astro/package.json | 2 +-
packages/better-define/package.json | 2 +-
packages/boolean-prop/package.json | 2 +-
packages/chain-call/package.json | 2 +-
packages/common/package.json | 2 +-
packages/config/package.json | 2 +-
packages/define-emit/package.json | 2 +-
packages/define-models/package.json | 2 +-
packages/define-options/package.json | 2 +-
packages/define-prop/package.json | 2 +-
packages/define-props-refs/package.json | 2 +-
packages/define-props/package.json | 2 +-
packages/define-render/package.json | 2 +-
packages/define-slots/package.json | 2 +-
packages/define-stylex/package.json | 2 +-
packages/devtools/package.json | 2 +-
packages/eslint-config/package.json | 2 +-
packages/export-expose/package.json | 2 +-
packages/export-props/package.json | 2 +-
packages/export-render/package.json | 2 +-
packages/hoist-static/package.json | 2 +-
packages/jsx-directive/package.json | 2 +-
packages/macros/package.json | 2 +-
packages/named-template/package.json | 2 +-
packages/nuxt/package.json | 2 +-
packages/reactivity-transform/package.json | 2 +-
packages/script-lang/package.json | 2 +-
packages/setup-block/package.json | 2 +-
packages/setup-component/package.json | 2 +-
packages/setup-sfc/package.json | 2 +-
packages/short-bind/package.json | 2 +-
packages/short-emits/package.json | 2 +-
packages/short-vmodel/package.json | 2 +-
packages/test-utils/package.json | 2 +-
packages/volar/package.json | 2 +-
37 files changed, 37 insertions(+), 37 deletions(-)
diff --git a/package.json b/package.json
index dfd8a7944..5bf053f4e 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "monorepo-vue-macros",
- "version": "3.0.0-beta.9",
+ "version": "3.0.0-beta.10",
"private": true,
"packageManager": "pnpm@10.9.0",
"description": "Monorepo for Vue Macros.",
diff --git a/packages/api/package.json b/packages/api/package.json
index b138b713c..48c2c4e32 100644
--- a/packages/api/package.json
+++ b/packages/api/package.json
@@ -1,6 +1,6 @@
{
"name": "@vue-macros/api",
- "version": "3.0.0-beta.9",
+ "version": "3.0.0-beta.10",
"description": "General API for Vue Macros.",
"type": "module",
"keywords": [
diff --git a/packages/astro/package.json b/packages/astro/package.json
index 35a9b66e4..14483ac89 100644
--- a/packages/astro/package.json
+++ b/packages/astro/package.json
@@ -1,6 +1,6 @@
{
"name": "@vue-macros/astro",
- "version": "3.0.0-beta.9",
+ "version": "3.0.0-beta.10",
"description": "Astro integration of Vue Macros.",
"type": "module",
"keywords": [
diff --git a/packages/better-define/package.json b/packages/better-define/package.json
index f05edd7c3..26e0f863e 100644
--- a/packages/better-define/package.json
+++ b/packages/better-define/package.json
@@ -1,6 +1,6 @@
{
"name": "@vue-macros/better-define",
- "version": "3.0.0-beta.9",
+ "version": "3.0.0-beta.10",
"description": "betterDefine feature from Vue Macros.",
"type": "module",
"keywords": [
diff --git a/packages/boolean-prop/package.json b/packages/boolean-prop/package.json
index bbabf91e9..d2401b6c7 100644
--- a/packages/boolean-prop/package.json
+++ b/packages/boolean-prop/package.json
@@ -1,6 +1,6 @@
{
"name": "@vue-macros/boolean-prop",
- "version": "3.0.0-beta.9",
+ "version": "3.0.0-beta.10",
"description": "booleanProp feature from Vue Macros.",
"type": "module",
"keywords": [
diff --git a/packages/chain-call/package.json b/packages/chain-call/package.json
index 27c42094c..b6e67f9dd 100644
--- a/packages/chain-call/package.json
+++ b/packages/chain-call/package.json
@@ -1,6 +1,6 @@
{
"name": "@vue-macros/chain-call",
- "version": "3.0.0-beta.9",
+ "version": "3.0.0-beta.10",
"description": "chainCall feature from Vue Macros.",
"type": "module",
"keywords": [
diff --git a/packages/common/package.json b/packages/common/package.json
index 268d9e559..b15c9f3c6 100644
--- a/packages/common/package.json
+++ b/packages/common/package.json
@@ -1,6 +1,6 @@
{
"name": "@vue-macros/common",
- "version": "3.0.0-beta.9",
+ "version": "3.0.0-beta.10",
"description": "common feature from Vue Macros.",
"type": "module",
"keywords": [
diff --git a/packages/config/package.json b/packages/config/package.json
index 7f8963625..0652e123d 100644
--- a/packages/config/package.json
+++ b/packages/config/package.json
@@ -1,6 +1,6 @@
{
"name": "@vue-macros/config",
- "version": "3.0.0-beta.9",
+ "version": "3.0.0-beta.10",
"description": "Config API for Vue Macros.",
"type": "module",
"keywords": [
diff --git a/packages/define-emit/package.json b/packages/define-emit/package.json
index ece86d26a..e28a8d6b4 100644
--- a/packages/define-emit/package.json
+++ b/packages/define-emit/package.json
@@ -1,6 +1,6 @@
{
"name": "@vue-macros/define-emit",
- "version": "3.0.0-beta.9",
+ "version": "3.0.0-beta.10",
"description": "defineEmit feature from Vue Macros.",
"type": "module",
"keywords": [
diff --git a/packages/define-models/package.json b/packages/define-models/package.json
index 9ddc47ee6..8b47a9a67 100644
--- a/packages/define-models/package.json
+++ b/packages/define-models/package.json
@@ -1,6 +1,6 @@
{
"name": "@vue-macros/define-models",
- "version": "3.0.0-beta.9",
+ "version": "3.0.0-beta.10",
"description": "defineModels feature from Vue Macros.",
"type": "module",
"keywords": [
diff --git a/packages/define-options/package.json b/packages/define-options/package.json
index 3dc4c03ce..709361500 100644
--- a/packages/define-options/package.json
+++ b/packages/define-options/package.json
@@ -1,6 +1,6 @@
{
"name": "unplugin-vue-define-options",
- "version": "3.0.0-beta.9",
+ "version": "3.0.0-beta.10",
"description": "Add defineOptions macro for Vue