Skip to content
This repository was archived by the owner on Apr 21, 2024. It is now read-only.

Commit 3442bed

Browse files
committed
feat: implement resolveGroupAsync
1 parent 87dbd96 commit 3442bed

File tree

4 files changed

+153
-24
lines changed

4 files changed

+153
-24
lines changed

lambda-ioc/deno/container.ts

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -70,16 +70,29 @@ export interface ReadableContainer<
7070

7171
export interface RedableGroupContainer<
7272
TSyncDependencies extends Record<ContainerKey, unknown>,
73+
TAsyncDependencies extends Record<ContainerKey, unknown>,
7374
> {
7475
resolveGroup<
7576
GroupName extends keyof TSyncDependencies extends ContainerKey
7677
? ExtractPrefix<keyof TSyncDependencies>
7778
: never,
7879
>(
7980
groupName: GroupName,
80-
): (keyof TSyncDependencies extends ContainerKey
81-
? ExtractPrefixedValues<GroupName, TSyncDependencies>
82-
: never)[]
81+
): keyof TSyncDependencies extends ContainerKey
82+
? ExtractPrefixedValues<GroupName, TSyncDependencies>[]
83+
: never
84+
85+
resolveGroupAsync<
86+
GroupName extends keyof TAsyncDependencies extends ContainerKey
87+
? ExtractPrefix<keyof TAsyncDependencies>
88+
: never,
89+
>(
90+
groupName: GroupName,
91+
): Promise<
92+
keyof TAsyncDependencies extends ContainerKey
93+
? ExtractPrefixedValues<GroupName, TAsyncDependencies>[]
94+
: never
95+
>
8396
}
8497

8598
/**
@@ -192,7 +205,7 @@ export interface Container<
192205
TSyncDependencies extends Record<ContainerKey, unknown>,
193206
TAsyncDependencies extends Record<ContainerKey, unknown>,
194207
> extends ReadableContainer<TSyncDependencies, TAsyncDependencies>,
195-
RedableGroupContainer<TSyncDependencies>,
208+
RedableGroupContainer<TSyncDependencies, TAsyncDependencies>,
196209
WritableContainer<TSyncDependencies, TAsyncDependencies> {}
197210

198211
/**
@@ -388,9 +401,9 @@ function __createContainer<
388401

389402
resolveGroup<GroupName extends string>(
390403
groupName: GroupName,
391-
): (keyof TSyncDependencies extends ContainerKey
392-
? ExtractPrefixedValues<GroupName, TSyncDependencies>
393-
: never)[] {
404+
): keyof TSyncDependencies extends ContainerKey
405+
? ExtractPrefixedValues<GroupName, TSyncDependencies>[]
406+
: never {
394407
return (
395408
Object.entries(syncDependencies)
396409
.filter(([key]) => {
@@ -399,10 +412,31 @@ function __createContainer<
399412
// eslint-disable-next-line @typescript-eslint/no-unused-vars
400413
.map(([_key, value]) => {
401414
return value(this)
402-
}) as (keyof TSyncDependencies extends ContainerKey
403-
? ExtractPrefixedValues<GroupName, TSyncDependencies>
404-
: never)[]
415+
}) as keyof TSyncDependencies extends ContainerKey
416+
? ExtractPrefixedValues<GroupName, TSyncDependencies>[]
417+
: never
405418
)
406419
},
420+
421+
async resolveGroupAsync<GroupName extends string>(
422+
groupName: GroupName,
423+
): Promise<
424+
keyof TAsyncDependencies extends ContainerKey
425+
? ExtractPrefixedValues<GroupName, TAsyncDependencies>[]
426+
: never
427+
> {
428+
return (await Promise.all(
429+
Object.entries(asyncDependencies)
430+
.filter(([key]) => {
431+
return key.startsWith(`${groupName}:`)
432+
})
433+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
434+
.map(([_key, value]) => {
435+
return value(this)
436+
}),
437+
)) as keyof TAsyncDependencies extends ContainerKey
438+
? ExtractPrefixedValues<GroupName, TAsyncDependencies>[]
439+
: never
440+
},
407441
}
408442
}

lambda-ioc/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@coderspirit/lambda-ioc",
3-
"version": "0.3.0",
3+
"version": "0.4.0",
44
"main": "./dist/cjs/index.js",
55
"module": "./dist/esm/index.js",
66
"types": "./dist/cjs/index.d.ts",

lambda-ioc/src/__tests__/container.test.ts

Lines changed: 64 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,26 @@ describe('container', () => {
9999
expect(g2).toContain(50)
100100
expect(g2).toContain(60)
101101
})
102+
103+
it('can register asynchronous groups by relying on prefixes', async () => {
104+
const container = createContainer()
105+
.register('a', () => 10)
106+
.register('b', () => 20)
107+
.registerAsync('g1:a', () => Promise.resolve(30))
108+
.registerAsync('g1:b', () => Promise.resolve(40))
109+
.registerAsync('g2:a', () => Promise.resolve(50))
110+
.registerAsync('g2:b', () => Promise.resolve(60))
111+
112+
const g1 = await container.resolveGroupAsync('g1')
113+
expect(g1).toHaveLength(2)
114+
expect(g1).toContain(30)
115+
expect(g1).toContain(40)
116+
117+
const g2 = await container.resolveGroupAsync('g2')
118+
expect(g2).toHaveLength(2)
119+
expect(g2).toContain(50)
120+
expect(g2).toContain(60)
121+
})
102122
})
103123

104124
// Type tests
@@ -230,12 +250,53 @@ describe('@types/container', () => {
230250
>
231251

232252
type C_resolveGroup_Parameters = Parameters<C['resolveGroup']>
233-
type C_resolve_Parameters_is_g1g2 = C_resolveGroup_Parameters extends [
253+
type C_resolveGroup_Parameters_extends_g1g2 =
254+
C_resolveGroup_Parameters extends ['g1' | 'g2'] ? true : false
255+
type g1g2_extends_C_resolveGroup_Parameters = [
234256
'g1' | 'g2',
235-
]
257+
] extends C_resolveGroup_Parameters
236258
? true
237259
: false
238-
const c_can_only_resolveGroup_g1g2: C_resolve_Parameters_is_g1g2 = true
260+
type C_resolveGroup_Parameters_is_g1g2 =
261+
C_resolveGroup_Parameters_extends_g1g2 extends true
262+
? g1g2_extends_C_resolveGroup_Parameters extends true
263+
? true
264+
: false
265+
: false
266+
const c_can_only_resolveGroup_g1g2: C_resolveGroup_Parameters_is_g1g2 = true
239267
expect(c_can_only_resolveGroup_g1g2).toBe(true)
240268
})
269+
270+
it('only resolves the async registered groups', () => {
271+
type C = Container<
272+
{
273+
a: number
274+
b: number
275+
},
276+
{
277+
'g1:a': number
278+
'g1:b': string
279+
'g2:a': string
280+
'g2:b': boolean
281+
}
282+
>
283+
284+
type C_resolveGroupAsync_Parameters = Parameters<C['resolveGroupAsync']>
285+
type C_resolveGroupAsync_Parameters_extends_g1g2 =
286+
C_resolveGroupAsync_Parameters extends ['g1' | 'g2'] ? true : false
287+
type g1g2_extends_C_resolveGroupAsync_Parameters = [
288+
'g1' | 'g2',
289+
] extends C_resolveGroupAsync_Parameters
290+
? true
291+
: false
292+
type C_resolveGroupAsync_Parameters_is_g1g2 =
293+
C_resolveGroupAsync_Parameters_extends_g1g2 extends true
294+
? g1g2_extends_C_resolveGroupAsync_Parameters extends true
295+
? true
296+
: false
297+
: false
298+
const c_can_only_resolveGroupAsync_g1g2: C_resolveGroupAsync_Parameters_is_g1g2 =
299+
true
300+
expect(c_can_only_resolveGroupAsync_g1g2).toBe(true)
301+
})
241302
})

lambda-ioc/src/container.ts

Lines changed: 44 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -70,16 +70,29 @@ export interface ReadableContainer<
7070

7171
export interface RedableGroupContainer<
7272
TSyncDependencies extends Record<ContainerKey, unknown>,
73+
TAsyncDependencies extends Record<ContainerKey, unknown>,
7374
> {
7475
resolveGroup<
7576
GroupName extends keyof TSyncDependencies extends ContainerKey
7677
? ExtractPrefix<keyof TSyncDependencies>
7778
: never,
7879
>(
7980
groupName: GroupName,
80-
): (keyof TSyncDependencies extends ContainerKey
81-
? ExtractPrefixedValues<GroupName, TSyncDependencies>
82-
: never)[]
81+
): keyof TSyncDependencies extends ContainerKey
82+
? ExtractPrefixedValues<GroupName, TSyncDependencies>[]
83+
: never
84+
85+
resolveGroupAsync<
86+
GroupName extends keyof TAsyncDependencies extends ContainerKey
87+
? ExtractPrefix<keyof TAsyncDependencies>
88+
: never,
89+
>(
90+
groupName: GroupName,
91+
): Promise<
92+
keyof TAsyncDependencies extends ContainerKey
93+
? ExtractPrefixedValues<GroupName, TAsyncDependencies>[]
94+
: never
95+
>
8396
}
8497

8598
/**
@@ -192,7 +205,7 @@ export interface Container<
192205
TSyncDependencies extends Record<ContainerKey, unknown>,
193206
TAsyncDependencies extends Record<ContainerKey, unknown>,
194207
> extends ReadableContainer<TSyncDependencies, TAsyncDependencies>,
195-
RedableGroupContainer<TSyncDependencies>,
208+
RedableGroupContainer<TSyncDependencies, TAsyncDependencies>,
196209
WritableContainer<TSyncDependencies, TAsyncDependencies> {}
197210

198211
/**
@@ -388,9 +401,9 @@ function __createContainer<
388401

389402
resolveGroup<GroupName extends string>(
390403
groupName: GroupName,
391-
): (keyof TSyncDependencies extends ContainerKey
392-
? ExtractPrefixedValues<GroupName, TSyncDependencies>
393-
: never)[] {
404+
): keyof TSyncDependencies extends ContainerKey
405+
? ExtractPrefixedValues<GroupName, TSyncDependencies>[]
406+
: never {
394407
return (
395408
Object.entries(syncDependencies)
396409
.filter(([key]) => {
@@ -399,10 +412,31 @@ function __createContainer<
399412
// eslint-disable-next-line @typescript-eslint/no-unused-vars
400413
.map(([_key, value]) => {
401414
return value(this)
402-
}) as (keyof TSyncDependencies extends ContainerKey
403-
? ExtractPrefixedValues<GroupName, TSyncDependencies>
404-
: never)[]
415+
}) as keyof TSyncDependencies extends ContainerKey
416+
? ExtractPrefixedValues<GroupName, TSyncDependencies>[]
417+
: never
405418
)
406419
},
420+
421+
async resolveGroupAsync<GroupName extends string>(
422+
groupName: GroupName,
423+
): Promise<
424+
keyof TAsyncDependencies extends ContainerKey
425+
? ExtractPrefixedValues<GroupName, TAsyncDependencies>[]
426+
: never
427+
> {
428+
return (await Promise.all(
429+
Object.entries(asyncDependencies)
430+
.filter(([key]) => {
431+
return key.startsWith(`${groupName}:`)
432+
})
433+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
434+
.map(([_key, value]) => {
435+
return value(this)
436+
}),
437+
)) as keyof TAsyncDependencies extends ContainerKey
438+
? ExtractPrefixedValues<GroupName, TAsyncDependencies>[]
439+
: never
440+
},
407441
}
408442
}

0 commit comments

Comments
 (0)