Skip to content

Commit dc74c4d

Browse files
authored
chore: add vue3 dts test (#842)
1 parent ce35be1 commit dc74c4d

File tree

13 files changed

+228
-90
lines changed

13 files changed

+228
-90
lines changed

package.json

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
"lint": "prettier --write --parser typescript \"{src,test,test-dts}/**/*.ts?(x)\" && prettier --write \"{src,test}/**/*.js\"",
3939
"test": "yarn test-dts && yarn test-unit",
4040
"test-unit": "cross-env NODE_ENV=test jest",
41-
"test-dts": "tsc -p ./test-dts/tsconfig.json && yarn build && tsc -p ./test-dts/tsconfig.build.json",
41+
"test-dts": "tsc -p ./test-dts/tsconfig.json && tsc -p ./test-dts/tsconfig.vue3.json && yarn build && tsc -p ./test-dts/tsconfig.build.json",
4242
"update-readme": "node ./scripts/update-readme.js",
4343
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -s",
4444
"version": "yarn changelog && yarn update-readme && git add CHANGELOG.md README.*",
@@ -67,17 +67,18 @@
6767
"husky": "^4.3.8",
6868
"jest": "^26.6.3",
6969
"lint-staged": "^11.0.0",
70-
"prettier": "^2.3.2",
70+
"prettier": "^2.4.1",
7171
"rimraf": "^3.0.2",
7272
"rollup": "^2.52.7",
7373
"rollup-plugin-dts": "^3.0.2",
7474
"rollup-plugin-terser": "^7.0.2",
7575
"rollup-plugin-typescript2": "^0.30.0",
7676
"ts-jest": "^26.5.5",
77-
"typescript": "^4.3.5",
77+
"typescript": "^4.4.4",
7878
"vue": "^2.6.14",
7979
"vue-router": "^3.5.2",
80-
"vue-server-renderer": "^2.6.14"
80+
"vue-server-renderer": "^2.6.14",
81+
"vue3": "npm:[email protected]"
8182
},
8283
"husky": {
8384
"hooks": {

src/apis/watch.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,10 @@ function createWatcher(
228228
cleanup = () => {
229229
try {
230230
fn()
231-
} catch (error) {
231+
} catch (
232+
// FIXME: remove any
233+
error: any
234+
) {
232235
logError(error, vm, 'onCleanup()')
233236
}
234237
}

src/component/componentOptions.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export interface MethodOptions {
3131

3232
export type SetupFunction<Props, RawBindings = {}> = (
3333
this: void,
34-
props: Props,
34+
props: Readonly<Props>,
3535
ctx: SetupContext
3636
) => RawBindings | (() => VNode | null) | void
3737

src/component/componentProps.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,9 @@ type InferPropType<T> = T extends null
7070
: T
7171

7272
export type ExtractPropTypes<O> = O extends object
73-
? { [K in RequiredKeys<O>]: InferPropType<O[K]> } &
74-
{ [K in OptionalKeys<O>]?: InferPropType<O[K]> }
73+
? { [K in RequiredKeys<O>]: InferPropType<O[K]> } & {
74+
[K in OptionalKeys<O>]?: InferPropType<O[K]>
75+
}
7576
: { [K in string]: any }
7677

7778
type DefaultKeys<T> = {

src/component/defineAsyncComponent.ts

Lines changed: 37 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -74,49 +74,50 @@ export function defineAsyncComponent(
7474
let thisRequest: Promise<ComponentOrComponentOptions>
7575
return (
7676
pendingRequest ||
77-
(thisRequest = pendingRequest = loader()
78-
.catch((err) => {
79-
err = err instanceof Error ? err : new Error(String(err))
80-
if (userOnError) {
81-
return new Promise((resolve, reject) => {
82-
const userRetry = () => resolve(retry())
83-
const userFail = () => reject(err)
84-
userOnError(err, userRetry, userFail, retries + 1)
85-
})
86-
} else {
87-
throw err
88-
}
89-
})
90-
.then((comp: any) => {
91-
if (thisRequest !== pendingRequest && pendingRequest) {
92-
return pendingRequest
93-
}
94-
if (__DEV__ && !comp) {
95-
warn(
96-
`Async component loader resolved to undefined. ` +
97-
`If you are using retry(), make sure to return its return value.`
98-
)
99-
}
100-
// interop module default
101-
if (
102-
comp &&
103-
(comp.__esModule || comp[Symbol.toStringTag] === 'Module')
104-
) {
105-
comp = comp.default
106-
}
107-
if (__DEV__ && comp && !isObject(comp) && !isFunction(comp)) {
108-
throw new Error(`Invalid async component load result: ${comp}`)
109-
}
110-
return comp
111-
}))
77+
(thisRequest = pendingRequest =
78+
loader()
79+
.catch((err) => {
80+
err = err instanceof Error ? err : new Error(String(err))
81+
if (userOnError) {
82+
return new Promise((resolve, reject) => {
83+
const userRetry = () => resolve(retry())
84+
const userFail = () => reject(err)
85+
userOnError(err, userRetry, userFail, retries + 1)
86+
})
87+
} else {
88+
throw err
89+
}
90+
})
91+
.then((comp: any) => {
92+
if (thisRequest !== pendingRequest && pendingRequest) {
93+
return pendingRequest
94+
}
95+
if (__DEV__ && !comp) {
96+
warn(
97+
`Async component loader resolved to undefined. ` +
98+
`If you are using retry(), make sure to return its return value.`
99+
)
100+
}
101+
// interop module default
102+
if (
103+
comp &&
104+
(comp.__esModule || comp[Symbol.toStringTag] === 'Module')
105+
) {
106+
comp = comp.default
107+
}
108+
if (__DEV__ && comp && !isObject(comp) && !isFunction(comp)) {
109+
throw new Error(`Invalid async component load result: ${comp}`)
110+
}
111+
return comp
112+
}))
112113
)
113114
}
114115

115116
return () => {
116117
const component = load()
117118

118119
return {
119-
component: component as any, // there is a type missmatch between vue2 type and the docs
120+
component,
120121
delay,
121122
timeout,
122123
error: errorComponent,

src/utils/instance.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,10 @@ export function activateCurrentInstance(
176176
setCurrentInstance(instance)
177177
try {
178178
return fn(instance)
179-
} catch (err) {
179+
} catch (
180+
// FIXME: remove any
181+
err: any
182+
) {
180183
if (onError) {
181184
onError(err)
182185
} else {

test-dts/defineAsyncComponent.test-d.ts

Lines changed: 6 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,8 @@
1-
import { AsyncComponent } from 'vue'
2-
import { defineAsyncComponent, defineComponent, expectType } from './index'
1+
import { defineAsyncComponent, defineComponent, expectType, h } from './index'
32

4-
function asyncComponent1() {
5-
return Promise.resolve().then(() => {
6-
return defineComponent({})
7-
})
8-
}
3+
const asyncComponent1 = async () => defineComponent({})
94

10-
function asyncComponent2() {
11-
return Promise.resolve().then(() => {
12-
return {
13-
template: 'ASYNC',
14-
}
15-
})
16-
}
5+
const asyncComponent2 = async () => ({ template: 'ASYNC' })
176

187
const syncComponent1 = defineComponent({
198
template: '',
@@ -42,19 +31,9 @@ defineAsyncComponent({
4231
loadingComponent: syncComponent2,
4332
})
4433

45-
defineAsyncComponent(
46-
() =>
47-
new Promise((resolve, reject) => {
48-
resolve(syncComponent1)
49-
})
50-
)
34+
defineAsyncComponent(async () => syncComponent1)
5135

52-
defineAsyncComponent(
53-
() =>
54-
new Promise((resolve, reject) => {
55-
resolve(syncComponent2)
56-
})
57-
)
36+
defineAsyncComponent(async () => syncComponent2)
5837

5938
const component = defineAsyncComponent({
6039
loader: asyncComponent1,
@@ -71,4 +50,4 @@ const component = defineAsyncComponent({
7150
},
7251
})
7352

74-
expectType<AsyncComponent>(component)
53+
h(component)

test-dts/defineComponent.test-d.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
isNotAnyOrUndefined,
77
defineComponent,
88
PropType,
9+
h,
910
} from './index'
1011

1112
describe('with object props', () => {
@@ -126,6 +127,8 @@ describe('with object props', () => {
126127
expectType<ExpectedProps['ffff']>(props.ffff)
127128
expectType<ExpectedProps['validated']>(props.validated)
128129
expectType<ExpectedProps['date']>(props.date)
130+
// FIXME: vue 3 bug
131+
// @ts-ignore
129132
expectType<typeof props.unknown>({} as ExpectedProps['unknown'])
130133

131134
isNotAnyOrUndefined(props.a)
@@ -145,6 +148,7 @@ describe('with object props', () => {
145148
isNotAnyOrUndefined(props.hhh)
146149
isNotAnyOrUndefined(props.ffff)
147150

151+
// @ts-expect-error
148152
expectError((props.a = 1))
149153

150154
// setup context
@@ -158,7 +162,7 @@ describe('with object props', () => {
158162
}),
159163
}
160164
},
161-
render(h) {
165+
render() {
162166
const props = this.$props
163167
expectType<ExpectedProps['a']>(props.a)
164168
expectType<ExpectedProps['b']>(props.b)
@@ -177,6 +181,8 @@ describe('with object props', () => {
177181
expectType<ExpectedProps['hhh']>(props.hhh)
178182
expectType<ExpectedProps['ffff']>(props.ffff)
179183
expectType<ExpectedProps['validated']>(props.validated)
184+
// FIXME: vue 3 bug
185+
// @ts-ignore
180186
expectType<typeof props.unknown>({} as ExpectedProps['unknown'])
181187

182188
// @ts-expect-error props should be readonly
@@ -211,7 +217,7 @@ describe('with object props', () => {
211217
// setup context properties should be mutable
212218
this.c = 2
213219

214-
return h()
220+
return h('div')
215221
},
216222
})
217223
})
@@ -228,7 +234,7 @@ describe('type inference w/ array props declaration', () => {
228234
c: 1,
229235
}
230236
},
231-
render(h) {
237+
render() {
232238
expectType<any>(this.$props.a)
233239
expectType<any>(this.$props.b)
234240
// @ts-expect-error
@@ -237,7 +243,7 @@ describe('type inference w/ array props declaration', () => {
237243
expectType<any>(this.b)
238244
expectType<number>(this.c)
239245

240-
return h()
246+
return h('div')
241247
},
242248
})
243249
})
@@ -293,7 +299,7 @@ describe('type inference w/ options API', () => {
293299
expectType<number>(this.d)
294300
},
295301
},
296-
render(h) {
302+
render() {
297303
// props
298304
expectType<number | undefined>(this.a)
299305
// returned from setup()
@@ -303,7 +309,7 @@ describe('type inference w/ options API', () => {
303309
// computed
304310
expectType<number>(this.d)
305311

306-
return h()
312+
return h('div')
307313
},
308314
})
309315
})

test-dts/index.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export * from '@vue/composition-api'
2+
// export * from 'vue3'
23

34
export function describe(_name: string, _fn: () => void): void
45

test-dts/tsconfig.vue3.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"extends": "./tsconfig.json",
3+
"compilerOptions": {
4+
"paths": {
5+
"@vue/composition-api": ["../node_modules/vue3/dist/vue.d.ts"]
6+
}
7+
}
8+
}

0 commit comments

Comments
 (0)