Skip to content

Commit 563b2f0

Browse files
committed
fix(compiler): use modelValueModifiers instead of modelModifiers
1 parent dd86742 commit 563b2f0

File tree

21 files changed

+679
-425
lines changed

21 files changed

+679
-425
lines changed

docs/introduction/getting-started.md

+10-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,15 @@ We assume you are already familiar with the basic usages of Vue before you conti
88

99
- Node.js `>= v18.0.0`.
1010
- Vue `>= v3.6`.
11-
- VSCode extension [TS Macro](https://marketplace.visualstudio.com/items?itemName=zhiyuanzmj.vscode-ts-macro) and `@ts-macro/tsc`.
11+
- VSCode extension [TS Macro](https://marketplace.visualstudio.com/items?itemName=zhiyuanzmj.vscode-ts-macro) and install `@ts-macro/tsc` instead of `tsc` to typecheck.
12+
```json
13+
{
14+
"scripts": {
15+
"typecheck": "tsmc --noEmit"
16+
// ...
17+
}
18+
}
19+
```
1220

1321
### Install
1422

@@ -17,7 +25,7 @@ We assume you are already familiar with the basic usages of Vue before you conti
1725
pnpm add vue-jsx-vapor
1826

1927
# runtime
20-
pnpm add https://pkg.pr.new/vue@eeab9c4
28+
pnpm add https://pkg.pr.new/vue@3e7464f
2129
```
2230

2331
The Vue Vapor runtime is not release, so we use [pkg.pr.new](https://github.com/stackblitz-labs/pkg.pr.new) to install.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
"@sxzz/eslint-config": "^6.0.2",
4242
"@ts-macro/tsc": "^0.1.24",
4343
"@types/node": "^22.13.10",
44-
"@vue-macros/reactivity-transform": "3.0.0-beta.4",
44+
"@vue-macros/reactivity-transform": "catalog:",
4545
"bumpp": "^10.0.3",
4646
"conventional-changelog-cli": "^5.0.0",
4747
"eslint": "^9.22.0",

packages/babel/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@
5757
"dependencies": {
5858
"@babel/core": "catalog:",
5959
"@babel/parser": "catalog:",
60-
"@babel/plugin-syntax-jsx": "^7.25.9",
61-
"@babel/traverse": "^7.26.9",
60+
"@babel/plugin-syntax-jsx": "catalog:",
61+
"@babel/traverse": "catalog:",
6262
"@babel/types": "catalog:",
6363
"@vue-jsx-vapor/compiler": "workspace:*",
6464
"source-map-js": "^1.2.1"

packages/compiler/src/transform.ts

+2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
type OperationNode,
1818
type RootIRNode,
1919
type RootNode,
20+
type SetEventIRNode,
2021
} from './ir'
2122
import { newBlock, newDynamic } from './transforms/utils'
2223
import { findProp, getText, isConstantExpression, isTemplate } from './utils'
@@ -39,6 +40,7 @@ export interface DirectiveTransformResult {
3940
modifier?: '.' | '^'
4041
runtimeCamelize?: boolean
4142
handler?: boolean
43+
handlerModifiers?: SetEventIRNode['modifiers']
4244
model?: boolean
4345
modelModifiers?: string[]
4446
}

packages/compiler/test/transforms/__snapshots__/vModel.spec.ts.snap

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
22

3-
exports[`compiler: vModel transform > component > v-model for component should generate modelModifiers 1`] = `
3+
exports[`compiler: vModel transform > component > v-model for component should generate modelValueModifiers 1`] = `
44
"
55
const n0 = _createComponent(Comp, { modelValue: () => (foo),
66
"onUpdate:modelValue": () => _value => (foo = _value),
7-
modelModifiers: () => ({ trim: true, "bar-baz": true }) })
7+
modelValueModifiers: () => ({ trim: true, "bar-baz": true }) })
88
return n0
99
"
1010
`;

packages/compiler/test/transforms/vModel.spec.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -244,13 +244,13 @@ describe('compiler: vModel transform', () => {
244244
})
245245
})
246246

247-
test('v-model for component should generate modelModifiers', () => {
247+
test('v-model for component should generate modelValueModifiers', () => {
248248
const { code, ir } = compileWithVModel(
249249
'<Comp v-model_trim_bar-baz={foo} />',
250250
)
251251
expect(code).toMatchSnapshot()
252252
expect(code).contain(
253-
`modelModifiers: () => ({ trim: true, "bar-baz": true })`,
253+
`modelValueModifiers: () => ({ trim: true, "bar-baz": true })`,
254254
)
255255
expect(ir.block.dynamic.children[0].operation).toMatchObject({
256256
type: IRNodeTypes.CREATE_COMPONENT_NODE,

packages/macros/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@
172172
}
173173
},
174174
"dependencies": {
175-
"@vue-macros/common": "3.0.0-beta.4",
175+
"@vue-macros/common": "catalog:",
176176
"@vue/compiler-sfc": "catalog:",
177177
"@vue/language-core": "^2.2.8",
178178
"hash-sum": "^2.0.0",
@@ -184,7 +184,7 @@
184184
"@nuxt/kit": "catalog:",
185185
"@nuxt/schema": "catalog:",
186186
"@types/hash-sum": "^1.0.2",
187-
"@vue-macros/test-utils": "3.0.0-beta.4",
187+
"@vue-macros/test-utils": "catalog:",
188188
"vue": "catalog:"
189189
}
190190
}

packages/macros/src/core/define-component/await.ts

-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,6 @@ function processAwait(
8686
s,
8787
0,
8888
`withAsyncContext`,
89-
'vue',
9089
)}(${containsNestedAwait ? `async ` : ``}() => `,
9190
)
9291
s.appendLeft(

packages/macros/src/core/define-component/index.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ export function transformDefineComponent(
1818
defineComponentName &&
1919
!['defineComponent', 'defineVaporComponent'].includes(defineComponentName)
2020
) {
21-
// @ts-expect-error should be removed after @vue-macros/common released.
22-
importHelperFn(s, 0, 'defineComponent', 'vue', false, defineComponentName)
21+
importHelperFn(s, 0, 'defineComponent', defineComponentName)
2322
}
2423

2524
let hasRestProp = false
@@ -32,7 +31,7 @@ export function transformDefineComponent(
3231
generateRestProps: (restPropsName, index, list) => {
3332
if (index === list.length - 1) {
3433
hasRestProp = true
35-
const useAttrs = importHelperFn(s, 0, 'useAttrs', 'vue')
34+
const useAttrs = importHelperFn(s, 0, 'useAttrs')
3635
return `const ${restPropsName} = ${useAttrs}()`
3736
}
3837
},

packages/macros/src/core/define-expose.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export function transformDefineExpose(
1010
s.appendRight(
1111
node.arguments[0]?.start || node.end! - 1,
1212
lib.includes('vapor')
13-
? `${importHelperFn(s, 0, 'currentInstance', 'vue')}.exposed = `
14-
: `${importHelperFn(s, 0, 'getCurrentInstance', 'vue')}().exposed = `,
13+
? `${importHelperFn(s, 0, 'currentInstance')}.exposed = `
14+
: `${importHelperFn(s, 0, 'getCurrentInstance')}().exposed = `,
1515
)
1616
}

packages/macros/src/core/define-model.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export function transformDefineModel(
99
): void {
1010
s.overwriteNode(
1111
node.callee,
12-
importHelperFn(s, 0, 'useModel', useModelHelperId),
12+
importHelperFn(s, 0, 'useModel', undefined, useModelHelperId),
1313
)
1414
s.appendRight(
1515
node.arguments[0]?.start || node.end! - 1,

packages/macros/src/core/define-slots.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export function transformDefineSlots(
1515
`Object.assign`,
1616
)
1717
const slots = lib.includes('vue')
18-
? `${importHelperFn(s, 0, 'useSlots', 'vue')}()`
18+
? `${importHelperFn(s, 0, 'useSlots')}()`
1919
: `${propsName}.vSlots`
2020
s.appendLeft(node.end! - 1, `${node.arguments[0] ? ',' : '{}, '}${slots}`)
2121
}

packages/macros/src/core/helper/use-model.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,16 @@ export function useModel(
4747
}
4848
})
4949

50-
const modifiers =
51-
name === 'modelValue' ? props.modelModifiers : props[`${name}Modifiers`]
5250
// @ts-expect-error
5351
res[Symbol.iterator] = () => {
5452
let i = 0
5553
return {
5654
next() {
5755
if (i < 2) {
58-
return { value: i++ ? modifiers || {} : res, done: false }
56+
return {
57+
value: i++ ? props[`${name}Modifiers`] || {} : res,
58+
done: false,
59+
}
5960
} else {
6061
return { done: true }
6162
}

packages/macros/src/core/restructure.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ export function restructure(
6767
s,
6868
0,
6969
'createPropsDefaultProxy',
70+
undefined,
7071
options.withDefaultsFrom ?? withDefaultsHelperId,
7172
)
7273
const resolvedPath = path.replace(
@@ -94,7 +95,6 @@ export function restructure(
9495
s,
9596
0,
9697
'createPropsRestProxy',
97-
'vue',
9898
)}(${rest.path}, [${rest.value}])`,
9999
)
100100
}

packages/macros/src/volar/index.ts

+8-2
Original file line numberDiff line numberDiff line change
@@ -213,15 +213,21 @@ export function getRootMap(options: TransformOptions): RootMap {
213213

214214
const id = toValidAssetId(modelName, `${HELPER_PREFIX}model`)
215215
const typeString = `import('vue').UnwrapRef<typeof ${id}>`
216-
;(rootMap.get(root)!.defineModel ??= [])!.push(
216+
const defineModel = (rootMap.get(root)!.defineModel ??= [])
217+
defineModel.push(
217218
`${modelName.includes('-') ? `'${modelName}'` : modelName}${isRequired ? ':' : '?:'} ${typeString}`,
218219
`'onUpdate:${modelName}'?: ($event: ${typeString}) => any`,
219220
)
221+
if (expression.typeArguments?.[1]) {
222+
defineModel.push(
223+
`${modelName}Modifiers?: Partial<Record<${expression.typeArguments[1].getText(ast)}, boolean>>`,
224+
)
225+
}
220226
replaceRange(
221227
codes,
222228
initializer.getStart(ast),
223229
initializer.getStart(ast),
224-
`// @ts-ignore\n${id};\nlet ${id} =`,
230+
`// @ts-ignore\n${id};\nlet ${id} = `,
225231
)
226232
} else if (options.defineSlots.alias.includes(macroName)) {
227233
replaceRange(

packages/macros/tests/__snapshots__/fixtures.spec.ts.snap

+8-6
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { withAsyncContext as __MACROS_withAsyncContext } from "vue";import { def
1010
const Comp = defineComponent(
1111
(__MACROS_props) => {
1212
const __MACROS_default_props = __MACROS_createPropsDefaultProxy(__MACROS_props, {'.bar': 'bar'!});const attrs = __MACROS_useAttrs();
13+
__MACROS_useModel(__MACROS_props, 'modelValue',)
1314
const foo = $(
1415
__MACROS_useModel(__MACROS_props, 'foo', {
1516
validator: (value) => {
@@ -20,7 +21,7 @@ const __MACROS_default_props = __MACROS_createPropsDefaultProxy(__MACROS_props,
2021
)
2122
return <div>{[foo, __MACROS_default_props.bar, attrs.baz]}</div>
2223
},
23-
{props: { 'bar': { required: true }, 'foo': { required: true, validator: (value) => {
24+
{props: { 'bar': { required: true }, 'modelValue': null, 'onUpdate:modelValue': null, 'modelModifiers': null, 'foo': { required: true, validator: (value) => {
2425
return value === 'foo'
2526
}, type: String }, 'onUpdate:foo': null, 'fooModifiers': null },inheritAttrs: false, name: 'Comp' },
2627
)
@@ -79,14 +80,14 @@ export const Comp2 = ({ foo, ...__MACROS_props }: any) => {
7980
exports[`fixtures > ./fixtures/define-model.tsx 1`] = `
8081
"
8182
import { useModel as __MACROS_useModel } from "vue-jsx-vapor/macros/use-model";export const Comp = ({ bar, ...__MACROS_props }: { bar: string }) => {
82-
const foo = __MACROS_useModel(__MACROS_props, 'foo', { default: bar })
83+
const foo = __MACROS_useModel<string, 'm1' | 'm2'>(__MACROS_props, 'foo', { default: bar })
8384
return <div>{foo.value}</div>
8485
}
8586
8687
export default function (__MACROS_props) {
8788
const modelValue = $(__MACROS_useModel<string>(__MACROS_props, 'modelValue',)!)
8889
return (
89-
<Comp v-model:foo={modelValue} bar="bar">
90+
<Comp v-model:foo_m1={modelValue} bar="bar">
9091
{modelValue}
9192
</Comp>
9293
)
@@ -148,6 +149,7 @@ import { withAsyncContext as __MACROS_withAsyncContext } from "vue";import { def
148149
const Comp = defineComponent(
149150
(__MACROS_props) => {
150151
const __MACROS_default_props = __MACROS_createPropsDefaultProxy(__MACROS_props, {'.bar': 'bar'!});const attrs = __MACROS_useAttrs();
152+
__MACROS_useModel(__MACROS_props, 'modelValue',)
151153
const foo = $(
152154
__MACROS_useModel(__MACROS_props, 'foo', {
153155
validator: (value) => {
@@ -158,7 +160,7 @@ const __MACROS_default_props = __MACROS_createPropsDefaultProxy(__MACROS_props,
158160
)
159161
return <div>{[foo, __MACROS_default_props.bar, attrs.baz]}</div>
160162
},
161-
{props: { 'bar': { required: true }, 'foo': { required: true, validator: (value) => {
163+
{props: { 'bar': { required: true }, 'modelValue': null, 'onUpdate:modelValue': null, 'modelModifiers': null, 'foo': { required: true, validator: (value) => {
162164
return value === 'foo'
163165
}, type: String }, 'onUpdate:foo': null, 'fooModifiers': null },inheritAttrs: false, name: 'Comp' },
164166
)
@@ -217,14 +219,14 @@ export const Comp2 = ({ foo, ...__MACROS_props }: any) => {
217219
exports[`vue/vapor fixtures > ./fixtures/define-model.tsx 1`] = `
218220
"
219221
import { useModel as __MACROS_useModel } from "vue-jsx-vapor/macros/use-model";export const Comp = ({ bar, ...__MACROS_props }: { bar: string }) => {
220-
const foo = __MACROS_useModel(__MACROS_props, 'foo', { default: bar })
222+
const foo = __MACROS_useModel<string, 'm1' | 'm2'>(__MACROS_props, 'foo', { default: bar })
221223
return <div>{foo.value}</div>
222224
}
223225
224226
export default function (__MACROS_props) {
225227
const modelValue = $(__MACROS_useModel<string>(__MACROS_props, 'modelValue',)!)
226228
return (
227-
<Comp v-model:foo={modelValue} bar="bar">
229+
<Comp v-model:foo_m1={modelValue} bar="bar">
228230
{modelValue}
229231
</Comp>
230232
)

packages/macros/tests/fixtures/define-component.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { defineComponent, nextTick } from 'vue'
22

33
const Comp = defineComponent(
44
({ bar = 'bar'!, ...attrs }: { bar: 'bar'; baz: 'baz' }) => {
5+
defineModel()
56
const foo = $(
67
defineModel('foo', {
78
validator: (value) => {

packages/macros/tests/fixtures/define-model.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
export const Comp = ({ bar }: { bar: string }) => {
2-
const foo = defineModel('foo', { default: bar })
2+
const foo = defineModel<string, 'm1' | 'm2'>('foo', { default: bar })
33
return <div>{foo.value}</div>
44
}
55

66
export default function () {
77
const modelValue = $(defineModel<string>()!)
88
return (
9-
<Comp v-model:foo={modelValue} bar="bar">
9+
<Comp v-model:foo_m1={modelValue} bar="bar">
1010
{modelValue}
1111
</Comp>
1212
)

packages/vue-jsx-vapor/package.json

+3-4
Original file line numberDiff line numberDiff line change
@@ -216,15 +216,14 @@
216216
},
217217
"dependencies": {
218218
"@babel/core": "catalog:",
219-
"@babel/plugin-transform-typescript": "^7.26.8",
219+
"@babel/plugin-transform-typescript": "catalog:",
220220
"@vue-jsx-vapor/babel": "workspace:*",
221221
"@vue-jsx-vapor/compiler": "workspace:*",
222222
"@vue-jsx-vapor/macros": "workspace:*",
223-
"@vue-macros/volar": "^3.0.0-beta.5",
224-
"magic-string-stack": "^0.1.2",
223+
"@vue-macros/volar": "catalog:",
225224
"ts-macro": "catalog:",
226225
"unplugin": "catalog:",
227-
"unplugin-utils": "^0.2.4"
226+
"unplugin-utils": "catalog:"
228227
},
229228
"devDependencies": {
230229
"@nuxt/kit": "catalog:",

0 commit comments

Comments
 (0)