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

Commit 876a83a

Browse files
committed
fix: registerValue constrains
1 parent 039f33a commit 876a83a

File tree

3 files changed

+61
-20
lines changed

3 files changed

+61
-20
lines changed

lambda-ioc/deno/container.ts

Lines changed: 50 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,14 @@ export interface WritableContainer<
141141
* @param name The "name" of the dependency (can be a symbol).
142142
* @param dependency An already instantiated value.
143143
*/
144-
registerValue<TName extends ContainerKey, TDependency>(
144+
registerValue<
145+
TName extends ContainerKey,
146+
TDependency extends TName extends keyof TSyncDependencies
147+
? TSyncDependencies[TName]
148+
: TName extends keyof TAsyncDependencies
149+
? never
150+
: unknown,
151+
>(
145152
name: TName,
146153
dependency: TDependency,
147154
): Container<
@@ -280,13 +287,21 @@ function __createContainer<
280287
Container<TSyncDependencies, {}>
281288
>,
282289
): ContainerWithNewSyncDep<TName, TDependency> {
283-
return __createContainer(
284-
{
285-
...syncDependencies,
286-
[name]: dependency,
287-
},
288-
asyncDependencies,
289-
) as ContainerWithNewSyncDep<TName, TDependency>
290+
if (name in syncDependencies) {
291+
return __createContainer(
292+
{
293+
...syncDependencies,
294+
[name]: dependency,
295+
},
296+
asyncDependencies,
297+
) as ContainerWithNewSyncDep<TName, TDependency>
298+
} else {
299+
;(syncDependencies as Record<TName, unknown>)[name] = dependency
300+
return __createContainer(
301+
syncDependencies,
302+
asyncDependencies,
303+
) as ContainerWithNewSyncDep<TName, TDependency>
304+
}
290305
},
291306

292307
registerAsync<TName extends ContainerKey, TDependency>(
@@ -296,23 +311,39 @@ function __createContainer<
296311
Container<TSyncDependencies, TAsyncDependencies>
297312
>,
298313
): ContainerWithNewAsyncDep<TName, TDependency> {
299-
return __createContainer(syncDependencies, {
300-
...asyncDependencies,
301-
[name]: dependency,
302-
}) as ContainerWithNewAsyncDep<TName, TDependency>
314+
if (name in asyncDependencies) {
315+
return __createContainer(syncDependencies, {
316+
...asyncDependencies,
317+
[name]: dependency,
318+
}) as ContainerWithNewAsyncDep<TName, TDependency>
319+
} else {
320+
;(asyncDependencies as Record<TName, unknown>)[name] = dependency
321+
return __createContainer(
322+
syncDependencies,
323+
asyncDependencies,
324+
) as ContainerWithNewAsyncDep<TName, TDependency>
325+
}
303326
},
304327

305328
registerValue<TName extends ContainerKey, TDependency>(
306329
name: TName,
307330
dependency: TDependency,
308331
): ContainerWithNewSyncDep<TName, TDependency> {
309-
return __createContainer(
310-
{
311-
...syncDependencies,
312-
[name]: () => dependency,
313-
},
314-
asyncDependencies,
315-
) as ContainerWithNewSyncDep<TName, TDependency>
332+
if (name in syncDependencies) {
333+
return __createContainer(
334+
{
335+
...syncDependencies,
336+
[name]: () => dependency,
337+
},
338+
asyncDependencies,
339+
) as ContainerWithNewSyncDep<TName, TDependency>
340+
} else {
341+
;(syncDependencies as Record<TName, unknown>)[name] = () => dependency
342+
return __createContainer(
343+
syncDependencies,
344+
asyncDependencies,
345+
) as ContainerWithNewSyncDep<TName, TDependency>
346+
}
316347
},
317348

318349
resolve<TName extends keyof TSyncDependencies>(

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,15 @@ describe('container', () => {
5555
async (c) => c.resolve('a') * (await c.resolveAsync('c')),
5656
)
5757
const c2 = c1.register('a', () => 7)
58+
const c3 = c2.registerValue('a', 13)
5859

5960
expect(c1.resolve('ab')).toBe(15)
6061
expect(c2.resolve('ab')).toBe(35)
62+
expect(c3.resolve('ab')).toBe(65)
6163

6264
expect(await c1.resolveAsync('ac')).toBe(33)
6365
expect(await c2.resolveAsync('ac')).toBe(77)
66+
expect(await c3.resolveAsync('ac')).toBe(143)
6467
})
6568

6669
it('can re-register async dependencies (without changing the "original" container)', async () => {

lambda-ioc/src/container.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,14 @@ export interface WritableContainer<
141141
* @param name The "name" of the dependency (can be a symbol).
142142
* @param dependency An already instantiated value.
143143
*/
144-
registerValue<TName extends ContainerKey, TDependency>(
144+
registerValue<
145+
TName extends ContainerKey,
146+
TDependency extends TName extends keyof TSyncDependencies
147+
? TSyncDependencies[TName]
148+
: TName extends keyof TAsyncDependencies
149+
? never
150+
: unknown,
151+
>(
145152
name: TName,
146153
dependency: TDependency,
147154
): Container<

0 commit comments

Comments
 (0)