@orpc/server 0.0.0-next.e9dc36e → 0.0.0-next.ee0aeaf
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/chunk-VARUID7X.js +273 -0
- package/dist/fetch.js +80 -650
- package/dist/index.js +193 -140
- package/dist/src/builder.d.ts +9 -4
- package/dist/src/fetch/handle.d.ts +7 -0
- package/dist/src/fetch/handler.d.ts +3 -0
- package/dist/src/fetch/index.d.ts +4 -0
- package/dist/src/fetch/types.d.ts +28 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/lazy.d.ts +23 -0
- package/dist/src/procedure-caller.d.ts +18 -11
- package/dist/src/procedure-implementer.d.ts +5 -1
- package/dist/src/procedure.d.ts +5 -2
- package/dist/src/router-builder.d.ts +5 -0
- package/dist/src/router-caller.d.ts +7 -4
- package/dist/src/router-implementer.d.ts +7 -3
- package/dist/src/router.d.ts +7 -7
- package/dist/src/types.d.ts +7 -1
- package/package.json +15 -19
- package/dist/chunk-TDFYNRZV.js +0 -190
- package/dist/chunk-TDFYNRZV.js.map +0 -1
- package/dist/fetch.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/src/adapters/fetch.d.ts +0 -42
- package/dist/src/adapters/fetch.d.ts.map +0 -1
- package/dist/src/builder.d.ts.map +0 -1
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/middleware.d.ts.map +0 -1
- package/dist/src/procedure-builder.d.ts.map +0 -1
- package/dist/src/procedure-caller.d.ts.map +0 -1
- package/dist/src/procedure-implementer.d.ts.map +0 -1
- package/dist/src/procedure.d.ts.map +0 -1
- package/dist/src/router-builder.d.ts.map +0 -1
- package/dist/src/router-caller.d.ts.map +0 -1
- package/dist/src/router-implementer.d.ts.map +0 -1
- package/dist/src/router.d.ts.map +0 -1
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/utils.d.ts.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/src/adapters/fetch.test.ts +0 -629
- package/src/adapters/fetch.ts +0 -290
- package/src/builder.test.ts +0 -371
- package/src/builder.ts +0 -238
- package/src/index.ts +0 -16
- package/src/middleware.test.ts +0 -260
- package/src/middleware.ts +0 -136
- package/src/procedure-builder.test.ts +0 -223
- package/src/procedure-builder.ts +0 -158
- package/src/procedure-caller.test.ts +0 -171
- package/src/procedure-caller.ts +0 -138
- package/src/procedure-implementer.test.ts +0 -220
- package/src/procedure-implementer.ts +0 -102
- package/src/procedure.test.ts +0 -317
- package/src/procedure.ts +0 -237
- package/src/router-builder.test.ts +0 -106
- package/src/router-builder.ts +0 -122
- package/src/router-caller.test.ts +0 -126
- package/src/router-caller.ts +0 -64
- package/src/router-implementer.test.ts +0 -116
- package/src/router-implementer.ts +0 -113
- package/src/router.test-d.ts +0 -48
- package/src/router.test.ts +0 -142
- package/src/router.ts +0 -91
- package/src/types.test.ts +0 -18
- package/src/types.ts +0 -13
- package/src/utils.test.ts +0 -16
- package/src/utils.ts +0 -16
@@ -1,116 +0,0 @@
|
|
1
|
-
import { oc } from '@orpc/contract'
|
2
|
-
import { z } from 'zod'
|
3
|
-
import { os, RouterImplementer } from '.'
|
4
|
-
|
5
|
-
const cp1 = oc.input(z.string()).output(z.string())
|
6
|
-
const cp2 = oc.output(z.string())
|
7
|
-
const cp3 = oc.route({ method: 'GET', path: '/test' })
|
8
|
-
const cr = oc.router({
|
9
|
-
p1: cp1,
|
10
|
-
nested: oc.router({
|
11
|
-
p2: cp2,
|
12
|
-
}),
|
13
|
-
nested2: {
|
14
|
-
p3: cp3,
|
15
|
-
},
|
16
|
-
})
|
17
|
-
|
18
|
-
const osw = os.context<{ auth: boolean }>().contract(cr)
|
19
|
-
|
20
|
-
const p1 = osw.p1.func(() => {
|
21
|
-
return 'unnoq'
|
22
|
-
})
|
23
|
-
|
24
|
-
const p2 = osw.nested.p2.func(() => {
|
25
|
-
return 'unnoq'
|
26
|
-
})
|
27
|
-
|
28
|
-
const p3 = osw.nested2.p3.func(() => {
|
29
|
-
return 'unnoq'
|
30
|
-
})
|
31
|
-
|
32
|
-
it('required all procedure match', () => {
|
33
|
-
const implementer = new RouterImplementer<{ auth: boolean }, typeof cr>({
|
34
|
-
contract: cr,
|
35
|
-
})
|
36
|
-
|
37
|
-
implementer.router({
|
38
|
-
p1,
|
39
|
-
nested: {
|
40
|
-
p2: os.contract(cp2).func(() => ''),
|
41
|
-
},
|
42
|
-
nested2: {
|
43
|
-
p3,
|
44
|
-
},
|
45
|
-
})
|
46
|
-
|
47
|
-
expect(() => {
|
48
|
-
implementer.router({
|
49
|
-
// @ts-expect-error p1 is mismatch
|
50
|
-
p1: os.func(() => {}),
|
51
|
-
nested: {
|
52
|
-
p2,
|
53
|
-
},
|
54
|
-
nested2: {
|
55
|
-
p3,
|
56
|
-
},
|
57
|
-
})
|
58
|
-
}).toThrowError('Mismatch implementation for procedure at [p1]')
|
59
|
-
|
60
|
-
expect(() => {
|
61
|
-
implementer.router({
|
62
|
-
// @ts-expect-error p1 is mismatch
|
63
|
-
p1: osw,
|
64
|
-
nested: {
|
65
|
-
p2,
|
66
|
-
},
|
67
|
-
nested2: {
|
68
|
-
p3,
|
69
|
-
},
|
70
|
-
})
|
71
|
-
}).toThrowError('Mismatch implementation for procedure at [p1]')
|
72
|
-
|
73
|
-
expect(() => {
|
74
|
-
implementer.router({
|
75
|
-
// Not allow manual specification
|
76
|
-
p1: os
|
77
|
-
.input(z.string())
|
78
|
-
.output(z.string())
|
79
|
-
.func(() => 'unnoq'),
|
80
|
-
nested: {
|
81
|
-
p2,
|
82
|
-
},
|
83
|
-
nested2: {
|
84
|
-
p3,
|
85
|
-
},
|
86
|
-
})
|
87
|
-
}).toThrowError('Mismatch implementation for procedure at [p1]')
|
88
|
-
|
89
|
-
expect(() => {
|
90
|
-
// @ts-expect-error required all procedure match
|
91
|
-
implementer.router({})
|
92
|
-
}).toThrowError('Missing implementation for procedure at [p1]')
|
93
|
-
|
94
|
-
expect(() => {
|
95
|
-
implementer.router({
|
96
|
-
p1,
|
97
|
-
nested: {
|
98
|
-
p2,
|
99
|
-
},
|
100
|
-
// @ts-expect-error missing p3
|
101
|
-
nested2: {},
|
102
|
-
})
|
103
|
-
}).toThrowError('Missing implementation for procedure at [nested2.p3]')
|
104
|
-
|
105
|
-
expect(() => {
|
106
|
-
implementer.router({
|
107
|
-
p1,
|
108
|
-
nested: {
|
109
|
-
p2,
|
110
|
-
},
|
111
|
-
nested2: {
|
112
|
-
p3: p3.prefix('/test'),
|
113
|
-
},
|
114
|
-
})
|
115
|
-
}).toThrowError('Mismatch implementation for procedure at [nested2.p3]')
|
116
|
-
})
|
@@ -1,113 +0,0 @@
|
|
1
|
-
import type { Middleware } from './middleware'
|
2
|
-
import type { RouterWithContract } from './router'
|
3
|
-
import type { Context } from './types'
|
4
|
-
import {
|
5
|
-
type ContractProcedure,
|
6
|
-
type ContractRouter,
|
7
|
-
isContractProcedure,
|
8
|
-
} from '@orpc/contract'
|
9
|
-
import { isProcedure } from './procedure'
|
10
|
-
import { ProcedureImplementer } from './procedure-implementer'
|
11
|
-
|
12
|
-
export class RouterImplementer<
|
13
|
-
TContext extends Context,
|
14
|
-
TContract extends ContractRouter,
|
15
|
-
> {
|
16
|
-
constructor(
|
17
|
-
public zz$ri: {
|
18
|
-
contract: TContract
|
19
|
-
},
|
20
|
-
) {}
|
21
|
-
|
22
|
-
router(
|
23
|
-
router: RouterWithContract<TContext, TContract>,
|
24
|
-
): RouterWithContract<TContext, TContract> {
|
25
|
-
assertRouterImplementation(this.zz$ri.contract, router)
|
26
|
-
|
27
|
-
return router
|
28
|
-
}
|
29
|
-
}
|
30
|
-
|
31
|
-
export type ChainedRouterImplementer<
|
32
|
-
TContext extends Context,
|
33
|
-
TContract extends ContractRouter,
|
34
|
-
TExtraContext extends Context,
|
35
|
-
> = {
|
36
|
-
[K in keyof TContract]: TContract[K] extends ContractProcedure<
|
37
|
-
infer UInputSchema,
|
38
|
-
infer UOutputSchema
|
39
|
-
>
|
40
|
-
? ProcedureImplementer<TContext, TExtraContext, UInputSchema, UOutputSchema>
|
41
|
-
: TContract[K] extends ContractRouter
|
42
|
-
? ChainedRouterImplementer<TContext, TContract[K], TExtraContext>
|
43
|
-
: never
|
44
|
-
} & RouterImplementer<TContext, TContract>
|
45
|
-
|
46
|
-
export function chainRouterImplementer<
|
47
|
-
TContext extends Context,
|
48
|
-
TContract extends ContractRouter,
|
49
|
-
TExtraContext extends Context,
|
50
|
-
>(
|
51
|
-
contract: TContract,
|
52
|
-
middlewares?: Middleware<any, any, any, any>[],
|
53
|
-
): ChainedRouterImplementer<TContext, TContract, TExtraContext> {
|
54
|
-
const result: Record<string, unknown> = {}
|
55
|
-
|
56
|
-
for (const key in contract) {
|
57
|
-
const item = contract[key]
|
58
|
-
|
59
|
-
if (isContractProcedure(item)) {
|
60
|
-
result[key] = new ProcedureImplementer({
|
61
|
-
contract: item,
|
62
|
-
middlewares,
|
63
|
-
})
|
64
|
-
}
|
65
|
-
else {
|
66
|
-
result[key] = chainRouterImplementer(item as ContractRouter, middlewares)
|
67
|
-
}
|
68
|
-
}
|
69
|
-
|
70
|
-
const implementer = new RouterImplementer({ contract })
|
71
|
-
|
72
|
-
return Object.assign(implementer, result) as any
|
73
|
-
}
|
74
|
-
|
75
|
-
export function assertRouterImplementation(
|
76
|
-
contract: ContractRouter,
|
77
|
-
router: RouterWithContract<any, any>,
|
78
|
-
path: string[] = [],
|
79
|
-
): void {
|
80
|
-
for (const key in contract) {
|
81
|
-
const currentPath = [...path, key]
|
82
|
-
const contractItem = contract[key]
|
83
|
-
const routerItem = router[key]
|
84
|
-
|
85
|
-
if (!routerItem) {
|
86
|
-
throw new Error(
|
87
|
-
`Missing implementation for procedure at [${currentPath.join('.')}]`,
|
88
|
-
)
|
89
|
-
}
|
90
|
-
|
91
|
-
if (isContractProcedure(contractItem)) {
|
92
|
-
if (isProcedure(routerItem)) {
|
93
|
-
if (routerItem.zz$p.contract !== contractItem) {
|
94
|
-
throw new Error(
|
95
|
-
`Mismatch implementation for procedure at [${currentPath.join('.')}]`,
|
96
|
-
)
|
97
|
-
}
|
98
|
-
}
|
99
|
-
else {
|
100
|
-
throw new Error(
|
101
|
-
`Mismatch implementation for procedure at [${currentPath.join('.')}]`,
|
102
|
-
)
|
103
|
-
}
|
104
|
-
}
|
105
|
-
else {
|
106
|
-
assertRouterImplementation(
|
107
|
-
contractItem as ContractRouter,
|
108
|
-
routerItem as any,
|
109
|
-
currentPath,
|
110
|
-
)
|
111
|
-
}
|
112
|
-
}
|
113
|
-
}
|
package/src/router.test-d.ts
DELETED
@@ -1,48 +0,0 @@
|
|
1
|
-
import type { InferRouterInputs, InferRouterOutputs } from '.'
|
2
|
-
import { z } from 'zod'
|
3
|
-
import { os } from '.'
|
4
|
-
|
5
|
-
const router = os.router({
|
6
|
-
ping: os
|
7
|
-
.input(z.object({ ping: z.string().transform(() => 1) }))
|
8
|
-
.output(z.object({ pong: z.number().transform(() => '1') }))
|
9
|
-
.func(() => ({ pong: 1 })),
|
10
|
-
user: {
|
11
|
-
find: os
|
12
|
-
.input(z.object({ find: z.number().transform(() => '1') }))
|
13
|
-
.func(() => ({ user: { id: 1 } }))
|
14
|
-
,
|
15
|
-
},
|
16
|
-
})
|
17
|
-
|
18
|
-
it('InferRouterInputs', () => {
|
19
|
-
type Inputs = InferRouterInputs<typeof router>
|
20
|
-
|
21
|
-
expectTypeOf<Inputs>().toEqualTypeOf<{
|
22
|
-
ping: {
|
23
|
-
ping: string
|
24
|
-
}
|
25
|
-
user: {
|
26
|
-
find: {
|
27
|
-
find: number
|
28
|
-
}
|
29
|
-
}
|
30
|
-
}>()
|
31
|
-
})
|
32
|
-
|
33
|
-
it('InferRouterOutputs', () => {
|
34
|
-
type Outputs = InferRouterOutputs<typeof router>
|
35
|
-
|
36
|
-
expectTypeOf<Outputs>().toEqualTypeOf<{
|
37
|
-
ping: {
|
38
|
-
pong: string
|
39
|
-
}
|
40
|
-
user: {
|
41
|
-
find: {
|
42
|
-
user: {
|
43
|
-
id: number
|
44
|
-
}
|
45
|
-
}
|
46
|
-
}
|
47
|
-
}>()
|
48
|
-
})
|
package/src/router.test.ts
DELETED
@@ -1,142 +0,0 @@
|
|
1
|
-
import { oc } from '@orpc/contract'
|
2
|
-
import { z } from 'zod'
|
3
|
-
import { os, type RouterWithContract, toContractRouter } from '.'
|
4
|
-
|
5
|
-
it('require procedure match context', () => {
|
6
|
-
const osw = os.context<{ auth: boolean, userId: string }>()
|
7
|
-
|
8
|
-
osw.router({
|
9
|
-
ping: osw.context<{ auth: boolean }>().func(() => {
|
10
|
-
return { pong: 'ping' }
|
11
|
-
}),
|
12
|
-
|
13
|
-
// @ts-expect-error userId is not match
|
14
|
-
ping2: osw.context<{ userId: number }>().func(() => {
|
15
|
-
return { name: 'unnoq' }
|
16
|
-
}),
|
17
|
-
|
18
|
-
nested: {
|
19
|
-
ping: osw.context<{ auth: boolean }>().func(() => {
|
20
|
-
return { pong: 'ping' }
|
21
|
-
}),
|
22
|
-
|
23
|
-
// @ts-expect-error userId is not match
|
24
|
-
ping2: osw.context<{ userId: number }>().func(() => {
|
25
|
-
return { name: 'unnoq' }
|
26
|
-
}),
|
27
|
-
},
|
28
|
-
})
|
29
|
-
})
|
30
|
-
|
31
|
-
it('require match contract', () => {
|
32
|
-
const pingContract = oc.route({ method: 'GET', path: '/ping' })
|
33
|
-
const pongContract = oc.input(z.string()).output(z.string())
|
34
|
-
const ping = os.contract(pingContract).func(() => {
|
35
|
-
return 'ping'
|
36
|
-
})
|
37
|
-
const pong = os.contract(pongContract).func(() => {
|
38
|
-
return 'pong'
|
39
|
-
})
|
40
|
-
|
41
|
-
const contract = oc.router({
|
42
|
-
ping: pingContract,
|
43
|
-
pong: pongContract,
|
44
|
-
|
45
|
-
nested: oc.router({
|
46
|
-
ping: pingContract,
|
47
|
-
pong: pongContract,
|
48
|
-
}),
|
49
|
-
})
|
50
|
-
|
51
|
-
const _1: RouterWithContract<undefined, typeof contract> = {
|
52
|
-
ping,
|
53
|
-
pong,
|
54
|
-
|
55
|
-
nested: {
|
56
|
-
ping,
|
57
|
-
pong,
|
58
|
-
},
|
59
|
-
}
|
60
|
-
|
61
|
-
const _2: RouterWithContract<undefined, typeof contract> = {
|
62
|
-
ping,
|
63
|
-
pong,
|
64
|
-
|
65
|
-
nested: os.contract(contract.nested).router({
|
66
|
-
ping,
|
67
|
-
pong,
|
68
|
-
}),
|
69
|
-
}
|
70
|
-
|
71
|
-
const _3: RouterWithContract<undefined, typeof contract> = {
|
72
|
-
ping,
|
73
|
-
pong,
|
74
|
-
|
75
|
-
// @ts-expect-error missing nested.ping
|
76
|
-
nested: {
|
77
|
-
pong,
|
78
|
-
},
|
79
|
-
}
|
80
|
-
|
81
|
-
const _4: RouterWithContract<undefined, typeof contract> = {
|
82
|
-
ping,
|
83
|
-
pong,
|
84
|
-
|
85
|
-
nested: {
|
86
|
-
ping,
|
87
|
-
// @ts-expect-error nested.pong is mismatch
|
88
|
-
pong: os.func(() => 'ping'),
|
89
|
-
},
|
90
|
-
}
|
91
|
-
|
92
|
-
// @ts-expect-error missing pong
|
93
|
-
const _5: RouterWithContract<undefined, typeof contract> = {
|
94
|
-
ping,
|
95
|
-
|
96
|
-
nested: {
|
97
|
-
ping,
|
98
|
-
pong,
|
99
|
-
},
|
100
|
-
}
|
101
|
-
})
|
102
|
-
|
103
|
-
it('toContractRouter', () => {
|
104
|
-
const p1 = oc.input(z.string()).output(z.string())
|
105
|
-
const p2 = oc.output(z.string())
|
106
|
-
const p3 = oc.route({ method: 'GET', path: '/test' })
|
107
|
-
|
108
|
-
const contract = oc.router({
|
109
|
-
p1,
|
110
|
-
|
111
|
-
nested: oc.router({
|
112
|
-
p2,
|
113
|
-
}),
|
114
|
-
|
115
|
-
nested2: {
|
116
|
-
p3,
|
117
|
-
},
|
118
|
-
})
|
119
|
-
|
120
|
-
const osw = os.contract(contract)
|
121
|
-
|
122
|
-
const router = osw.router({
|
123
|
-
p1: osw.p1.func(() => {
|
124
|
-
return 'unnoq'
|
125
|
-
}),
|
126
|
-
|
127
|
-
nested: osw.nested.router({
|
128
|
-
p2: osw.nested.p2.func(() => {
|
129
|
-
return 'unnoq'
|
130
|
-
}),
|
131
|
-
}),
|
132
|
-
|
133
|
-
nested2: {
|
134
|
-
p3: osw.nested2.p3.func(() => {
|
135
|
-
return 'unnoq'
|
136
|
-
}),
|
137
|
-
},
|
138
|
-
})
|
139
|
-
|
140
|
-
expect(toContractRouter(router)).toEqual(contract)
|
141
|
-
expect(toContractRouter(contract)).toEqual(contract)
|
142
|
-
})
|
package/src/router.ts
DELETED
@@ -1,91 +0,0 @@
|
|
1
|
-
import type {
|
2
|
-
ContractProcedure,
|
3
|
-
ContractRouter,
|
4
|
-
SchemaInput,
|
5
|
-
SchemaOutput,
|
6
|
-
} from '@orpc/contract'
|
7
|
-
import type { Context } from './types'
|
8
|
-
import {
|
9
|
-
isContractProcedure,
|
10
|
-
} from '@orpc/contract'
|
11
|
-
import {
|
12
|
-
type DecoratedProcedure,
|
13
|
-
isProcedure,
|
14
|
-
type Procedure,
|
15
|
-
} from './procedure'
|
16
|
-
|
17
|
-
export interface Router<TContext extends Context> {
|
18
|
-
[k: string]: Procedure<TContext, any, any, any, any> | Router<TContext>
|
19
|
-
}
|
20
|
-
|
21
|
-
export type HandledRouter<TRouter extends Router<any>> = {
|
22
|
-
[K in keyof TRouter]: TRouter[K] extends Procedure<
|
23
|
-
infer UContext,
|
24
|
-
infer UExtraContext,
|
25
|
-
infer UInputSchema,
|
26
|
-
infer UOutputSchema,
|
27
|
-
infer UFuncOutput
|
28
|
-
>
|
29
|
-
? DecoratedProcedure<
|
30
|
-
UContext,
|
31
|
-
UExtraContext,
|
32
|
-
UInputSchema,
|
33
|
-
UOutputSchema,
|
34
|
-
UFuncOutput
|
35
|
-
>
|
36
|
-
: TRouter[K] extends Router<any>
|
37
|
-
? HandledRouter<TRouter[K]>
|
38
|
-
: never
|
39
|
-
}
|
40
|
-
|
41
|
-
export type RouterWithContract<
|
42
|
-
TContext extends Context,
|
43
|
-
TContract extends ContractRouter,
|
44
|
-
> = {
|
45
|
-
[K in keyof TContract]: TContract[K] extends ContractProcedure<
|
46
|
-
infer UInputSchema,
|
47
|
-
infer UOutputSchema
|
48
|
-
>
|
49
|
-
? Procedure<TContext, any, UInputSchema, UOutputSchema, any>
|
50
|
-
: TContract[K] extends ContractRouter
|
51
|
-
? RouterWithContract<TContext, TContract[K]>
|
52
|
-
: never
|
53
|
-
}
|
54
|
-
|
55
|
-
export function toContractRouter(
|
56
|
-
router: ContractRouter | Router<any>,
|
57
|
-
): ContractRouter {
|
58
|
-
const contract: ContractRouter = {}
|
59
|
-
|
60
|
-
for (const key in router) {
|
61
|
-
const item = router[key]
|
62
|
-
|
63
|
-
if (isContractProcedure(item)) {
|
64
|
-
contract[key] = item
|
65
|
-
}
|
66
|
-
else if (isProcedure(item)) {
|
67
|
-
contract[key] = item.zz$p.contract
|
68
|
-
}
|
69
|
-
else {
|
70
|
-
contract[key] = toContractRouter(item as any)
|
71
|
-
}
|
72
|
-
}
|
73
|
-
|
74
|
-
return contract
|
75
|
-
}
|
76
|
-
|
77
|
-
export type InferRouterInputs<T extends Router<any>> = {
|
78
|
-
[K in keyof T]: T[K] extends Procedure<any, any, infer UInputSchema, any, any>
|
79
|
-
? SchemaInput<UInputSchema>
|
80
|
-
: T[K] extends Router<any>
|
81
|
-
? InferRouterInputs<T[K]>
|
82
|
-
: never
|
83
|
-
}
|
84
|
-
|
85
|
-
export type InferRouterOutputs<T extends Router<any>> = {
|
86
|
-
[K in keyof T]: T[K] extends Procedure<any, any, any, infer UOutputSchema, infer UFuncOutput>
|
87
|
-
? SchemaOutput<UOutputSchema, UFuncOutput>
|
88
|
-
: T[K] extends Router<any>
|
89
|
-
? InferRouterOutputs<T[K]>
|
90
|
-
: never
|
91
|
-
}
|
package/src/types.test.ts
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
import type { MergeContext } from './types'
|
2
|
-
|
3
|
-
it('mergeContext', () => {
|
4
|
-
expectTypeOf<MergeContext<undefined, undefined>>().toEqualTypeOf<undefined>()
|
5
|
-
expectTypeOf<MergeContext<undefined, { foo: string }>>().toEqualTypeOf<{
|
6
|
-
foo: string
|
7
|
-
}>()
|
8
|
-
expectTypeOf<MergeContext<{ foo: string }, undefined>>().toEqualTypeOf<{
|
9
|
-
foo: string
|
10
|
-
}>()
|
11
|
-
expectTypeOf<MergeContext<{ foo: string }, { foo: string }>>().toEqualTypeOf<{
|
12
|
-
foo: string
|
13
|
-
}>()
|
14
|
-
expectTypeOf<MergeContext<{ foo: string }, { bar: string }>>().toMatchTypeOf<{
|
15
|
-
foo: string
|
16
|
-
bar: string
|
17
|
-
}>()
|
18
|
-
})
|
package/src/types.ts
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
import type { WELL_DEFINED_PROCEDURE } from './procedure'
|
2
|
-
|
3
|
-
export type Context = Record<string, unknown> | undefined
|
4
|
-
|
5
|
-
export type MergeContext<
|
6
|
-
TA extends Context,
|
7
|
-
TB extends Context,
|
8
|
-
> = TA extends undefined ? TB : TB extends undefined ? TA : TA & TB
|
9
|
-
|
10
|
-
export interface Meta {
|
11
|
-
path: string[]
|
12
|
-
procedure: WELL_DEFINED_PROCEDURE
|
13
|
-
}
|
package/src/utils.test.ts
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
import { mergeContext } from './utils'
|
2
|
-
|
3
|
-
it('mergeContext', () => {
|
4
|
-
expect(mergeContext(undefined, undefined)).toBe(undefined)
|
5
|
-
expect(mergeContext(undefined, { foo: 'bar' })).toEqual({ foo: 'bar' })
|
6
|
-
expect(mergeContext({ foo: 'bar' }, undefined)).toEqual({ foo: 'bar' })
|
7
|
-
expect(mergeContext({ foo: 'bar' }, { foo: 'bar' })).toEqual({ foo: 'bar' })
|
8
|
-
expect(mergeContext({ foo: 'bar' }, { bar: 'bar' })).toEqual({
|
9
|
-
foo: 'bar',
|
10
|
-
bar: 'bar',
|
11
|
-
})
|
12
|
-
expect(mergeContext({ foo: 'bar' }, { bar: 'bar', foo: 'bar1' })).toEqual({
|
13
|
-
foo: 'bar1',
|
14
|
-
bar: 'bar',
|
15
|
-
})
|
16
|
-
})
|
package/src/utils.ts
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
import type { Context, MergeContext } from './types'
|
2
|
-
|
3
|
-
export function mergeContext<A extends Context, B extends Context>(
|
4
|
-
a: A,
|
5
|
-
b: B,
|
6
|
-
): MergeContext<A, B> {
|
7
|
-
if (!a)
|
8
|
-
return b as any
|
9
|
-
if (!b)
|
10
|
-
return a as any
|
11
|
-
|
12
|
-
return {
|
13
|
-
...a,
|
14
|
-
...b,
|
15
|
-
} as any
|
16
|
-
}
|