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