Skip to content

Commit ee4e093

Browse files
committed
refactor(define-props-refs): import withDefault manually
1 parent 38b579c commit ee4e093

File tree

23 files changed

+205
-93
lines changed

23 files changed

+205
-93
lines changed

.changeset/shy-buckets-tell.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
'@vue-macros/define-props-refs': minor
3+
'@vue-macros/common': minor
4+
'unplugin-vue-macros': minor
5+
'@vue-macros/volar': minor
6+
---
7+
8+
should import withDefault manually when using `definePropsRefs`

docs/macros/define-props-refs.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,23 @@ console.log(foo.value, bar.value)
2727
</script>
2828
```
2929

30+
## With Default Value
31+
32+
```vue {2-3,8}
33+
<script setup lang="ts">
34+
import { withDefaults } from 'unplugin-vue-macros/macros' assert { type: 'macro' }
35+
36+
const { foo } = withDefaults(
37+
definePropsRefs<{
38+
foo?: string
39+
}>(),
40+
{ foo: 'test' }
41+
)
42+
// ⬇️ Ref<string>
43+
console.log(foo.value)
44+
</script>
45+
```
46+
3047
## Volar Configuration
3148

3249
```jsonc {6}

docs/zh-CN/macros/define-props-refs.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,23 @@ console.log(foo.value, bar.value)
2727
</script>
2828
```
2929

30+
## 默认值
31+
32+
```vue {2-3,8}
33+
<script setup lang="ts">
34+
import { withDefaults } from 'unplugin-vue-macros/macros' assert { type: 'macro' }
35+
36+
const { foo } = withDefaults(
37+
definePropsRefs<{
38+
foo?: string
39+
}>(),
40+
{ foo: 'test' }
41+
)
42+
// ⬇️ Ref<string>
43+
console.log(foo.value)
44+
</script>
45+
```
46+
3047
## Volar 配置
3148

3249
```jsonc {6}

packages/common/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
"@babel/types": "^7.22.4",
5555
"@rollup/pluginutils": "^5.0.2",
5656
"@vue/compiler-sfc": "^3.3.4",
57-
"ast-kit": "^0.5.1",
57+
"ast-kit": "^0.5.2",
5858
"local-pkg": "^0.4.3",
5959
"magic-string-ast": "^0.1.2"
6060
},

packages/common/src/types.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,10 @@ export type MarkRequired<T, K extends keyof T> = Omit<T, K> &
22
Required<Pick<T, K>>
33

44
export type Overwrite<T, U> = Pick<T, Exclude<keyof T, keyof U>> & U
5+
6+
export type RecordToUnion<T extends Record<string, any>> = T[keyof T]
7+
export type UnionToIntersection<U> = (
8+
U extends unknown ? (arg: U) => 0 : never
9+
) extends (arg: infer I) => 0
10+
? I
11+
: never

packages/common/src/vue.ts

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ import {
44
type SFCScriptBlock as SFCScriptBlockMixed,
55
parse,
66
} from '@vue/compiler-sfc'
7-
import { type Program } from '@babel/types'
8-
import { type MagicStringBase } from 'magic-string-ast'
9-
import { babelParse, getLang } from 'ast-kit'
7+
import { type Node, type Program } from '@babel/types'
8+
import { type MagicString, type MagicStringBase } from 'magic-string-ast'
9+
import { babelParse, getLang, resolveString } from 'ast-kit'
1010
import { REGEX_VUE_SFC } from './constants'
1111

1212
export type SFCScriptBlock = Omit<
@@ -51,11 +51,15 @@ export function parseSFC(code: string, id: string): SFC {
5151
errors,
5252
getSetupAst() {
5353
if (!descriptor.scriptSetup) return
54-
return babelParse(descriptor.scriptSetup.content, lang)
54+
return babelParse(descriptor.scriptSetup.content, lang, {
55+
plugins: [['importAttributes', { deprecatedAssertSyntax: true }]],
56+
})
5557
},
5658
getScriptAst() {
5759
if (!descriptor.script) return
58-
return babelParse(descriptor.script.content, lang)
60+
return babelParse(descriptor.script.content, lang, {
61+
plugins: [['importAttributes', { deprecatedAssertSyntax: true }]],
62+
})
5963
},
6064
}
6165
}
@@ -96,3 +100,14 @@ export function addNormalScript({ script, lang }: SFC, s: MagicStringBase) {
96100
},
97101
}
98102
}
103+
104+
export function removeMacroImport(node: Node, s: MagicString, offset: number) {
105+
if (
106+
node.type === 'ImportDeclaration' &&
107+
node.attributes?.some(
108+
(attr) =>
109+
resolveString(attr.key) === 'type' && attr.value.value === 'macro'
110+
)
111+
)
112+
s.removeNode(node, { offset })
113+
}
Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
11
declare const definePropsRefs: typeof import('./macros').definePropsRefs
2-
// @ts-ignore
3-
declare const withDefaults: typeof import('./macros').withDefaults

packages/define-props-refs/macros.d.ts

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ export declare type PropRefs<T> = {
1010
[K in keyof T]-?: ComputedRef<DeepReadonly<T[K]>>
1111
}
1212

13-
export declare type NotUndefined<T> = T extends undefined ? never : T
13+
export type NotUndefined<T> = T extends undefined ? never : T
1414

15-
export declare type InferDefault<P, T> = T extends
15+
declare type InferDefault<P, T> = T extends
1616
| null
1717
| number
1818
| string
@@ -22,31 +22,20 @@ export declare type InferDefault<P, T> = T extends
2222
? T | ((props: P) => T)
2323
: (props: P) => T
2424

25-
export declare type InferDefaults<T> = {
25+
declare type InferDefaults<T> = {
2626
[K in keyof T]?: InferDefault<T, NotUndefined<T[K]>>
2727
}
2828

29-
export declare type PropsWithDefaults<Base, Defaults> = Base & {
30-
[K in keyof Defaults]: K extends keyof Base
31-
? Defaults[K] extends undefined
32-
? Base[K]
33-
: NotUndefined<Base[K]>
34-
: never
35-
}
36-
37-
export declare function withDefaults<
38-
Props,
39-
Defaults extends InferDefaults<Props>
40-
>(props: Props, defaults: Defaults): PropsWithDefaults<Props, Defaults>
41-
4229
export declare function withDefaults<
4330
PropsWithRefs extends PropRefs<Record<string, any>>,
4431
Defaults extends InferDefaults<Props>,
4532
Props = {
4633
-readonly [K in keyof PropsWithRefs]: PropsWithRefs[K] extends Readonly<
4734
Ref<infer T>
4835
>
49-
? T
36+
? K extends keyof Defaults
37+
? NotUndefined<T>
38+
: T
5039
: PropsWithRefs[K]
5140
}
5241
>(props: PropsWithRefs, defaults: Defaults): PropRefs<Props>

packages/define-props-refs/src/core/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
importHelperFn,
99
isCallOf,
1010
parseSFC,
11+
removeMacroImport,
1112
walkAST,
1213
} from '@vue-macros/common'
1314
import { type CallExpression, type Node } from '@babel/types'
@@ -24,6 +25,8 @@ export function transformDefinePropsRefs(code: string, id: string) {
2425

2526
walkAST<Node>(setupAst, {
2627
enter(node) {
28+
removeMacroImport(node, s, offset)
29+
2730
if (isCallOf(node, WITH_DEFAULTS) && node.arguments) {
2831
processDefinePropsRefs(node.arguments[0] as CallExpression, node)
2932
this.skip()

packages/define-props-refs/tests/__snapshots__/fixtures.test.ts.snap

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,20 @@ expectTypeOf(bar).toEqualTypeOf<ComputedRef<number>>()
2424
exports[`fixtures > ./fixtures/with-defaults.vue 1`] = `
2525
"<script setup lang=\\"ts\\">
2626
const __MACROS_props = withDefaults(defineProps<{
27-
foo: string
28-
bar: number[]
27+
foo?: string
28+
bar?: number[]
2929
}>(), {
3030
foo: 'foo',
31-
bar: () => [1, 2, 3],
3231
})
3332
import { toRefs as __MACROS_toRefs } from \\"vue\\";
3433
import { expectTypeOf } from 'expect-type'
3534
import { ComputedRef } from 'vue'
3635
36+
3737
const { foo, bar } = __MACROS_toRefs(__MACROS_props)
3838
3939
expectTypeOf(foo).toEqualTypeOf<ComputedRef<string>>()
40-
expectTypeOf(bar).toEqualTypeOf<ComputedRef<readonly number[]>>()
40+
expectTypeOf(bar).toEqualTypeOf<ComputedRef<readonly number[] | undefined>>()
4141
</script>
4242
"
4343
`;

0 commit comments

Comments
 (0)