@navios/di 0.7.1 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +110 -0
- package/README.md +117 -17
- package/lib/browser/container/abstract-container.d.mts +112 -0
- package/lib/browser/container/abstract-container.d.mts.map +1 -0
- package/lib/browser/container/abstract-container.mjs +100 -0
- package/lib/browser/container/abstract-container.mjs.map +1 -0
- package/lib/browser/container/container.d.mts +100 -0
- package/lib/browser/container/container.d.mts.map +1 -0
- package/lib/browser/container/container.mjs +424 -0
- package/lib/browser/container/container.mjs.map +1 -0
- package/lib/browser/container/scoped-container.d.mts +93 -0
- package/lib/browser/container/scoped-container.d.mts.map +1 -0
- package/lib/browser/container/scoped-container.mjs +119 -0
- package/lib/browser/container/scoped-container.mjs.map +1 -0
- package/lib/browser/decorators/factory.decorator.d.mts +26 -0
- package/lib/browser/decorators/factory.decorator.d.mts.map +1 -0
- package/lib/browser/decorators/factory.decorator.mjs +20 -0
- package/lib/browser/decorators/factory.decorator.mjs.map +1 -0
- package/lib/browser/decorators/injectable.decorator.d.mts +38 -0
- package/lib/browser/decorators/injectable.decorator.d.mts.map +1 -0
- package/lib/browser/decorators/injectable.decorator.mjs +21 -0
- package/lib/browser/decorators/injectable.decorator.mjs.map +1 -0
- package/lib/browser/enums/injectable-scope.enum.d.mts +18 -0
- package/lib/browser/enums/injectable-scope.enum.d.mts.map +1 -0
- package/lib/browser/enums/injectable-scope.enum.mjs +20 -0
- package/lib/browser/enums/injectable-scope.enum.mjs.map +1 -0
- package/lib/browser/enums/injectable-type.enum.d.mts +8 -0
- package/lib/browser/enums/injectable-type.enum.d.mts.map +1 -0
- package/lib/browser/enums/injectable-type.enum.mjs +10 -0
- package/lib/browser/enums/injectable-type.enum.mjs.map +1 -0
- package/lib/browser/errors/di-error.d.mts +43 -0
- package/lib/browser/errors/di-error.d.mts.map +1 -0
- package/lib/browser/errors/di-error.mjs +98 -0
- package/lib/browser/errors/di-error.mjs.map +1 -0
- package/lib/browser/event-emitter.d.mts +16 -0
- package/lib/browser/event-emitter.d.mts.map +1 -0
- package/lib/browser/event-emitter.mjs +320 -0
- package/lib/browser/event-emitter.mjs.map +1 -0
- package/lib/browser/index.d.mts +37 -1508
- package/lib/browser/index.mjs +29 -2650
- package/lib/browser/interfaces/container.interface.d.mts +59 -0
- package/lib/browser/interfaces/container.interface.d.mts.map +1 -0
- package/lib/browser/interfaces/factory.interface.d.mts +14 -0
- package/lib/browser/interfaces/factory.interface.d.mts.map +1 -0
- package/lib/browser/interfaces/on-service-destroy.interface.d.mts +7 -0
- package/lib/browser/interfaces/on-service-destroy.interface.d.mts.map +1 -0
- package/lib/browser/interfaces/on-service-init.interface.d.mts +7 -0
- package/lib/browser/interfaces/on-service-init.interface.d.mts.map +1 -0
- package/lib/browser/internal/context/async-local-storage.browser.mjs +20 -0
- package/lib/browser/internal/context/async-local-storage.browser.mjs.map +1 -0
- package/lib/browser/internal/context/async-local-storage.d.mts +9 -0
- package/lib/browser/internal/context/async-local-storage.d.mts.map +1 -0
- package/lib/browser/internal/context/async-local-storage.types.d.mts +11 -0
- package/lib/browser/internal/context/async-local-storage.types.d.mts.map +1 -0
- package/lib/browser/internal/context/factory-context.d.mts +23 -0
- package/lib/browser/internal/context/factory-context.d.mts.map +1 -0
- package/lib/browser/internal/context/resolution-context.d.mts +43 -0
- package/lib/browser/internal/context/resolution-context.d.mts.map +1 -0
- package/lib/browser/internal/context/resolution-context.mjs +56 -0
- package/lib/browser/internal/context/resolution-context.mjs.map +1 -0
- package/lib/browser/internal/context/service-initialization-context.d.mts +48 -0
- package/lib/browser/internal/context/service-initialization-context.d.mts.map +1 -0
- package/lib/browser/internal/context/sync-local-storage.mjs +53 -0
- package/lib/browser/internal/context/sync-local-storage.mjs.map +1 -0
- package/lib/browser/internal/core/instance-resolver.d.mts +119 -0
- package/lib/browser/internal/core/instance-resolver.d.mts.map +1 -0
- package/lib/browser/internal/core/instance-resolver.mjs +306 -0
- package/lib/browser/internal/core/instance-resolver.mjs.map +1 -0
- package/lib/browser/internal/core/name-resolver.d.mts +52 -0
- package/lib/browser/internal/core/name-resolver.d.mts.map +1 -0
- package/lib/browser/internal/core/name-resolver.mjs +118 -0
- package/lib/browser/internal/core/name-resolver.mjs.map +1 -0
- package/lib/browser/internal/core/scope-tracker.d.mts +65 -0
- package/lib/browser/internal/core/scope-tracker.d.mts.map +1 -0
- package/lib/browser/internal/core/scope-tracker.mjs +120 -0
- package/lib/browser/internal/core/scope-tracker.mjs.map +1 -0
- package/lib/browser/internal/core/service-initializer.d.mts +44 -0
- package/lib/browser/internal/core/service-initializer.d.mts.map +1 -0
- package/lib/browser/internal/core/service-initializer.mjs +109 -0
- package/lib/browser/internal/core/service-initializer.mjs.map +1 -0
- package/lib/browser/internal/core/service-invalidator.d.mts +81 -0
- package/lib/browser/internal/core/service-invalidator.d.mts.map +1 -0
- package/lib/browser/internal/core/service-invalidator.mjs +142 -0
- package/lib/browser/internal/core/service-invalidator.mjs.map +1 -0
- package/lib/browser/internal/core/token-resolver.d.mts +54 -0
- package/lib/browser/internal/core/token-resolver.d.mts.map +1 -0
- package/lib/browser/internal/core/token-resolver.mjs +77 -0
- package/lib/browser/internal/core/token-resolver.mjs.map +1 -0
- package/lib/browser/internal/holder/holder-storage.interface.d.mts +99 -0
- package/lib/browser/internal/holder/holder-storage.interface.d.mts.map +1 -0
- package/lib/browser/internal/holder/instance-holder.d.mts +101 -0
- package/lib/browser/internal/holder/instance-holder.d.mts.map +1 -0
- package/lib/browser/internal/holder/instance-holder.mjs +19 -0
- package/lib/browser/internal/holder/instance-holder.mjs.map +1 -0
- package/lib/browser/internal/holder/unified-storage.d.mts +53 -0
- package/lib/browser/internal/holder/unified-storage.d.mts.map +1 -0
- package/lib/browser/internal/holder/unified-storage.mjs +144 -0
- package/lib/browser/internal/holder/unified-storage.mjs.map +1 -0
- package/lib/browser/internal/lifecycle/circular-detector.d.mts +39 -0
- package/lib/browser/internal/lifecycle/circular-detector.d.mts.map +1 -0
- package/lib/browser/internal/lifecycle/circular-detector.mjs +55 -0
- package/lib/browser/internal/lifecycle/circular-detector.mjs.map +1 -0
- package/lib/browser/internal/lifecycle/lifecycle-event-bus.d.mts +18 -0
- package/lib/browser/internal/lifecycle/lifecycle-event-bus.d.mts.map +1 -0
- package/lib/browser/internal/lifecycle/lifecycle-event-bus.mjs +43 -0
- package/lib/browser/internal/lifecycle/lifecycle-event-bus.mjs.map +1 -0
- package/lib/browser/internal/stub-factory-class.d.mts +14 -0
- package/lib/browser/internal/stub-factory-class.d.mts.map +1 -0
- package/lib/browser/internal/stub-factory-class.mjs +18 -0
- package/lib/browser/internal/stub-factory-class.mjs.map +1 -0
- package/lib/browser/symbols/injectable-token.d.mts +5 -0
- package/lib/browser/symbols/injectable-token.d.mts.map +1 -0
- package/lib/browser/symbols/injectable-token.mjs +6 -0
- package/lib/browser/symbols/injectable-token.mjs.map +1 -0
- package/lib/browser/token/injection-token.d.mts +55 -0
- package/lib/browser/token/injection-token.d.mts.map +1 -0
- package/lib/browser/token/injection-token.mjs +100 -0
- package/lib/browser/token/injection-token.mjs.map +1 -0
- package/lib/browser/token/registry.d.mts +37 -0
- package/lib/browser/token/registry.d.mts.map +1 -0
- package/lib/browser/token/registry.mjs +86 -0
- package/lib/browser/token/registry.mjs.map +1 -0
- package/lib/browser/utils/default-injectors.d.mts +12 -0
- package/lib/browser/utils/default-injectors.d.mts.map +1 -0
- package/lib/browser/utils/default-injectors.mjs +13 -0
- package/lib/browser/utils/default-injectors.mjs.map +1 -0
- package/lib/browser/utils/get-injectable-token.d.mts +9 -0
- package/lib/browser/utils/get-injectable-token.d.mts.map +1 -0
- package/lib/browser/utils/get-injectable-token.mjs +13 -0
- package/lib/browser/utils/get-injectable-token.mjs.map +1 -0
- package/lib/browser/utils/get-injectors.d.mts +55 -0
- package/lib/browser/utils/get-injectors.d.mts.map +1 -0
- package/lib/browser/utils/get-injectors.mjs +121 -0
- package/lib/browser/utils/get-injectors.mjs.map +1 -0
- package/lib/browser/utils/types.d.mts +23 -0
- package/lib/browser/utils/types.d.mts.map +1 -0
- package/lib/{container-Pb_Y4Z4x.mjs → container-8-z89TyQ.mjs} +1269 -1305
- package/lib/container-8-z89TyQ.mjs.map +1 -0
- package/lib/{container-BuAutHGg.d.mts → container-CNiqesCL.d.mts} +600 -569
- package/lib/container-CNiqesCL.d.mts.map +1 -0
- package/lib/{container-DnzgpfBe.cjs → container-CaY2fDuk.cjs} +1287 -1329
- package/lib/container-CaY2fDuk.cjs.map +1 -0
- package/lib/{container-oGTgX2iX.d.cts → container-D-0Ho3qL.d.cts} +601 -565
- package/lib/container-D-0Ho3qL.d.cts.map +1 -0
- package/lib/index.cjs +13 -15
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +58 -223
- package/lib/index.d.cts.map +1 -1
- package/lib/index.d.mts +62 -222
- package/lib/index.d.mts.map +1 -1
- package/lib/index.mjs +5 -6
- package/lib/index.mjs.map +1 -1
- package/lib/testing/index.cjs +569 -311
- package/lib/testing/index.cjs.map +1 -1
- package/lib/testing/index.d.cts +370 -41
- package/lib/testing/index.d.cts.map +1 -1
- package/lib/testing/index.d.mts +370 -41
- package/lib/testing/index.d.mts.map +1 -1
- package/lib/testing/index.mjs +568 -305
- package/lib/testing/index.mjs.map +1 -1
- package/package.json +2 -1
- package/src/__tests__/circular-detector.spec.mts +193 -0
- package/src/__tests__/concurrent.spec.mts +368 -0
- package/src/__tests__/container.spec.mts +32 -30
- package/src/__tests__/di-error.spec.mts +351 -0
- package/src/__tests__/e2e.browser.spec.mts +0 -4
- package/src/__tests__/e2e.spec.mts +10 -19
- package/src/__tests__/event-emitter.spec.mts +232 -109
- package/src/__tests__/get-injectors.spec.mts +250 -39
- package/src/__tests__/injection-token.spec.mts +293 -349
- package/src/__tests__/library-findings.spec.mts +8 -8
- package/src/__tests__/registry.spec.mts +358 -210
- package/src/__tests__/resolution-context.spec.mts +255 -0
- package/src/__tests__/scope-tracker.spec.mts +598 -0
- package/src/__tests__/scope-upgrade.spec.mts +808 -0
- package/src/__tests__/scoped-container.spec.mts +595 -0
- package/src/__tests__/test-container.spec.mts +293 -0
- package/src/__tests__/token-resolver.spec.mts +207 -0
- package/src/__tests__/unified-storage.spec.mts +535 -0
- package/src/__tests__/unit-test-container.spec.mts +405 -0
- package/src/__type-tests__/container.spec-d.mts +180 -0
- package/src/__type-tests__/factory.spec-d.mts +15 -3
- package/src/__type-tests__/inject.spec-d.mts +115 -20
- package/src/__type-tests__/injectable.spec-d.mts +69 -52
- package/src/__type-tests__/injection-token.spec-d.mts +176 -0
- package/src/__type-tests__/scoped-container.spec-d.mts +212 -0
- package/src/container/abstract-container.mts +327 -0
- package/src/container/container.mts +142 -170
- package/src/container/scoped-container.mts +126 -208
- package/src/decorators/factory.decorator.mts +16 -11
- package/src/decorators/injectable.decorator.mts +20 -16
- package/src/enums/index.mts +2 -2
- package/src/enums/injectable-scope.enum.mts +1 -0
- package/src/enums/injectable-type.enum.mts +1 -0
- package/src/errors/di-error.mts +96 -0
- package/src/event-emitter.mts +3 -27
- package/src/index.mts +6 -153
- package/src/interfaces/container.interface.mts +13 -0
- package/src/interfaces/factory.interface.mts +1 -1
- package/src/interfaces/index.mts +1 -1
- package/src/internal/context/async-local-storage.mts +3 -2
- package/src/internal/context/async-local-storage.types.mts +1 -0
- package/src/internal/context/factory-context.mts +1 -0
- package/src/internal/context/index.mts +3 -1
- package/src/internal/context/resolution-context.mts +1 -0
- package/src/internal/context/service-initialization-context.mts +43 -0
- package/src/internal/core/index.mts +5 -4
- package/src/internal/core/instance-resolver.mts +461 -292
- package/src/internal/core/name-resolver.mts +196 -0
- package/src/internal/core/scope-tracker.mts +242 -0
- package/src/internal/core/{instantiator.mts → service-initializer.mts} +51 -29
- package/src/internal/core/service-invalidator.mts +290 -0
- package/src/internal/core/{token-processor.mts → token-resolver.mts} +17 -88
- package/src/internal/holder/holder-storage.interface.mts +11 -5
- package/src/internal/holder/index.mts +2 -5
- package/src/internal/holder/instance-holder.mts +1 -3
- package/src/internal/holder/unified-storage.mts +245 -0
- package/src/internal/index.mts +2 -1
- package/src/internal/lifecycle/circular-detector.mts +1 -0
- package/src/internal/lifecycle/index.mts +1 -1
- package/src/internal/lifecycle/lifecycle-event-bus.mts +1 -0
- package/src/internal/stub-factory-class.mts +16 -0
- package/src/symbols/injectable-token.mts +3 -1
- package/src/testing/index.mts +2 -0
- package/src/testing/test-container.mts +546 -85
- package/src/testing/types.mts +117 -0
- package/src/testing/unit-test-container.mts +509 -0
- package/src/token/injection-token.mts +41 -4
- package/src/token/registry.mts +75 -9
- package/src/utils/default-injectors.mts +16 -0
- package/src/utils/get-injectable-token.mts +2 -3
- package/src/utils/get-injectors.mts +26 -15
- package/src/utils/index.mts +3 -1
- package/src/utils/types.mts +1 -0
- package/tsdown.config.mts +11 -1
- package/lib/browser/index.d.mts.map +0 -1
- package/lib/browser/index.mjs.map +0 -1
- package/lib/container-BuAutHGg.d.mts.map +0 -1
- package/lib/container-DnzgpfBe.cjs.map +0 -1
- package/lib/container-Pb_Y4Z4x.mjs.map +0 -1
- package/lib/container-oGTgX2iX.d.cts.map +0 -1
- package/src/__tests__/async-local-storage.browser.spec.mts +0 -166
- package/src/__tests__/async-local-storage.spec.mts +0 -333
- package/src/__tests__/errors.spec.mts +0 -87
- package/src/__tests__/factory.spec.mts +0 -137
- package/src/__tests__/injectable.spec.mts +0 -246
- package/src/__tests__/request-scope.spec.mts +0 -416
- package/src/__tests__/service-instantiator.spec.mts +0 -410
- package/src/__tests__/service-locator-event-bus.spec.mts +0 -242
- package/src/__tests__/service-locator-manager.spec.mts +0 -300
- package/src/__tests__/service-locator.spec.mts +0 -966
- package/src/__tests__/unified-api.spec.mts +0 -130
- package/src/browser.mts +0 -11
- package/src/injectors.mts +0 -18
- package/src/internal/context/request-context.mts +0 -214
- package/src/internal/core/invalidator.mts +0 -437
- package/src/internal/core/service-locator.mts +0 -202
- package/src/internal/holder/base-holder-manager.mts +0 -238
- package/src/internal/holder/holder-manager.mts +0 -85
- package/src/internal/holder/request-storage.mts +0 -134
- package/src/internal/holder/singleton-storage.mts +0 -105
- package/src/testing/README.md +0 -80
- package/src/testing/__tests__/test-container.spec.mts +0 -173
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import type { OnServiceDestroy } from '../../interfaces/index.mjs'
|
|
2
|
+
import type {
|
|
3
|
+
HolderGetResult,
|
|
4
|
+
IHolderStorage,
|
|
5
|
+
} from './holder-storage.interface.mjs'
|
|
6
|
+
import type { InstanceHolder } from './instance-holder.mjs'
|
|
7
|
+
|
|
8
|
+
import { InjectableScope, InjectableType } from '../../enums/index.mjs'
|
|
9
|
+
import { DIError } from '../../errors/index.mjs'
|
|
10
|
+
import { InstanceStatus } from './instance-holder.mjs'
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Unified storage implementation that works the same way regardless of scope.
|
|
14
|
+
* Replaces RequestContext, HolderManager, SingletonStorage, RequestStorage.
|
|
15
|
+
*
|
|
16
|
+
* Scope is just metadata - storage operations are identical for all scopes.
|
|
17
|
+
* Different storage instances are just isolated storage spaces.
|
|
18
|
+
*/
|
|
19
|
+
export class UnifiedStorage implements IHolderStorage {
|
|
20
|
+
readonly scope: InjectableScope
|
|
21
|
+
|
|
22
|
+
private readonly holders = new Map<string, InstanceHolder>()
|
|
23
|
+
/**
|
|
24
|
+
* Reverse dependency index: maps a dependency name to the set of holder names that depend on it.
|
|
25
|
+
* This allows O(1) lookup of dependents instead of O(n) iteration.
|
|
26
|
+
*/
|
|
27
|
+
private readonly dependents = new Map<string, Set<string>>()
|
|
28
|
+
|
|
29
|
+
constructor(scope: InjectableScope = InjectableScope.Singleton) {
|
|
30
|
+
this.scope = scope
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
get<T = unknown>(instanceName: string): HolderGetResult<T> {
|
|
34
|
+
const holder = this.holders.get(instanceName)
|
|
35
|
+
|
|
36
|
+
if (!holder) {
|
|
37
|
+
return null
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Check holder status for error states
|
|
41
|
+
switch (holder.status) {
|
|
42
|
+
case InstanceStatus.Destroying:
|
|
43
|
+
return [
|
|
44
|
+
DIError.instanceDestroying(instanceName),
|
|
45
|
+
holder as InstanceHolder<T>,
|
|
46
|
+
]
|
|
47
|
+
|
|
48
|
+
case InstanceStatus.Error:
|
|
49
|
+
return [
|
|
50
|
+
holder.instance as unknown as DIError,
|
|
51
|
+
holder as InstanceHolder<T>,
|
|
52
|
+
]
|
|
53
|
+
|
|
54
|
+
case InstanceStatus.Creating:
|
|
55
|
+
case InstanceStatus.Created:
|
|
56
|
+
return [undefined, holder as InstanceHolder<T>]
|
|
57
|
+
|
|
58
|
+
default:
|
|
59
|
+
return null
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
set(instanceName: string, holder: InstanceHolder): void {
|
|
64
|
+
this.holders.set(instanceName, holder)
|
|
65
|
+
// Register dependencies in reverse index
|
|
66
|
+
if (holder.deps.size > 0) {
|
|
67
|
+
this.registerDependencies(instanceName, holder.deps)
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
delete(instanceName: string): boolean {
|
|
72
|
+
const holder = this.holders.get(instanceName)
|
|
73
|
+
if (holder) {
|
|
74
|
+
// Remove this holder from the reverse index for all its dependencies
|
|
75
|
+
this.removeFromDependentsIndex(instanceName, holder.deps)
|
|
76
|
+
}
|
|
77
|
+
return this.holders.delete(instanceName)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
createHolder<T>(
|
|
81
|
+
instanceName: string,
|
|
82
|
+
type: InjectableType,
|
|
83
|
+
deps: Set<string>,
|
|
84
|
+
): [
|
|
85
|
+
ReturnType<typeof Promise.withResolvers<[undefined, T]>>,
|
|
86
|
+
InstanceHolder<T>,
|
|
87
|
+
] {
|
|
88
|
+
const deferred = Promise.withResolvers<[undefined, T]>()
|
|
89
|
+
|
|
90
|
+
const holder: InstanceHolder<T> = {
|
|
91
|
+
status: InstanceStatus.Creating,
|
|
92
|
+
name: instanceName,
|
|
93
|
+
instance: null,
|
|
94
|
+
creationPromise: deferred.promise,
|
|
95
|
+
destroyPromise: null,
|
|
96
|
+
type,
|
|
97
|
+
scope: this.scope,
|
|
98
|
+
deps,
|
|
99
|
+
destroyListeners: [],
|
|
100
|
+
createdAt: Date.now(),
|
|
101
|
+
waitingFor: new Set(),
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return [deferred, holder]
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
storeInstance(instanceName: string, instance: unknown): void {
|
|
108
|
+
const holder = this.holders.get(instanceName)
|
|
109
|
+
if (holder) {
|
|
110
|
+
throw DIError.storageError(
|
|
111
|
+
'Instance already stored',
|
|
112
|
+
'storeInstance',
|
|
113
|
+
instanceName,
|
|
114
|
+
)
|
|
115
|
+
}
|
|
116
|
+
this.set(instanceName, {
|
|
117
|
+
status: InstanceStatus.Created,
|
|
118
|
+
name: instanceName,
|
|
119
|
+
instance,
|
|
120
|
+
creationPromise: null,
|
|
121
|
+
destroyPromise: null,
|
|
122
|
+
type: InjectableType.Class,
|
|
123
|
+
scope: this.scope,
|
|
124
|
+
deps: new Set(),
|
|
125
|
+
destroyListeners:
|
|
126
|
+
typeof instance === 'object' &&
|
|
127
|
+
instance !== null &&
|
|
128
|
+
'onServiceDestroy' in instance
|
|
129
|
+
? [(instance as OnServiceDestroy).onServiceDestroy]
|
|
130
|
+
: [],
|
|
131
|
+
createdAt: Date.now(),
|
|
132
|
+
waitingFor: new Set(),
|
|
133
|
+
})
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
handles(scope: InjectableScope): boolean {
|
|
137
|
+
return scope === this.scope
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// ============================================================================
|
|
141
|
+
// ITERATION AND QUERY
|
|
142
|
+
// ============================================================================
|
|
143
|
+
|
|
144
|
+
getAllNames(): string[] {
|
|
145
|
+
return Array.from(this.holders.keys())
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
forEach(callback: (name: string, holder: InstanceHolder) => void): void {
|
|
149
|
+
for (const [name, holder] of this.holders) {
|
|
150
|
+
callback(name, holder)
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
findByInstance(instance: unknown): InstanceHolder | null {
|
|
155
|
+
for (const holder of this.holders.values()) {
|
|
156
|
+
if (holder.instance === instance) {
|
|
157
|
+
return holder
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return null
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
findDependents(instanceName: string): string[] {
|
|
164
|
+
const dependents = this.dependents.get(instanceName)
|
|
165
|
+
return dependents ? Array.from(dependents) : []
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Updates dependency references when instance names change.
|
|
170
|
+
* Used during scope upgrades when instance names are regenerated with requestId.
|
|
171
|
+
*
|
|
172
|
+
* @param oldName The old instance name
|
|
173
|
+
* @param newName The new instance name
|
|
174
|
+
*/
|
|
175
|
+
updateDependencyReference(oldName: string, newName: string): void {
|
|
176
|
+
// Update all holders that reference oldName in their deps Set
|
|
177
|
+
for (const holder of this.holders.values()) {
|
|
178
|
+
if (holder.deps.has(oldName)) {
|
|
179
|
+
holder.deps.delete(oldName)
|
|
180
|
+
holder.deps.add(newName)
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// Update reverse dependency index
|
|
185
|
+
const oldDependents = this.dependents.get(oldName)
|
|
186
|
+
if (oldDependents) {
|
|
187
|
+
// Move dependents from old name to new name
|
|
188
|
+
const newDependents = this.dependents.get(newName) || new Set<string>()
|
|
189
|
+
for (const dependent of oldDependents) {
|
|
190
|
+
newDependents.add(dependent)
|
|
191
|
+
}
|
|
192
|
+
this.dependents.set(newName, newDependents)
|
|
193
|
+
this.dependents.delete(oldName)
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Update reverse index entries - if oldName was a dependency, update all holders that depend on it
|
|
197
|
+
for (const [depName, dependents] of this.dependents.entries()) {
|
|
198
|
+
if (depName === oldName) {
|
|
199
|
+
// This shouldn't happen, but handle it just in case
|
|
200
|
+
const newDependents = this.dependents.get(newName) || new Set<string>()
|
|
201
|
+
for (const dependent of dependents) {
|
|
202
|
+
newDependents.add(dependent)
|
|
203
|
+
}
|
|
204
|
+
this.dependents.set(newName, newDependents)
|
|
205
|
+
this.dependents.delete(oldName)
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// ============================================================================
|
|
211
|
+
// INTERNAL HELPERS
|
|
212
|
+
// ============================================================================
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Registers a holder's dependencies in the reverse index.
|
|
216
|
+
*/
|
|
217
|
+
private registerDependencies(holderName: string, deps: Set<string>): void {
|
|
218
|
+
for (const dep of deps) {
|
|
219
|
+
let dependents = this.dependents.get(dep)
|
|
220
|
+
if (!dependents) {
|
|
221
|
+
dependents = new Set()
|
|
222
|
+
this.dependents.set(dep, dependents)
|
|
223
|
+
}
|
|
224
|
+
dependents.add(holderName)
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Removes a holder from the reverse dependency index.
|
|
230
|
+
*/
|
|
231
|
+
private removeFromDependentsIndex(
|
|
232
|
+
holderName: string,
|
|
233
|
+
deps: Set<string>,
|
|
234
|
+
): void {
|
|
235
|
+
for (const dep of deps) {
|
|
236
|
+
const dependents = this.dependents.get(dep)
|
|
237
|
+
if (dependents) {
|
|
238
|
+
dependents.delete(holderName)
|
|
239
|
+
if (dependents.size === 0) {
|
|
240
|
+
this.dependents.delete(dep)
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
package/src/internal/index.mts
CHANGED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { DIError } from '../errors/di-error.mjs'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Stub factory class used when registering InjectionTokens without a real class implementation.
|
|
5
|
+
* This is used in ScopedContainer.addInstance() to allow registering tokens that don't have
|
|
6
|
+
* a corresponding class, while preventing accidental instantiation.
|
|
7
|
+
*
|
|
8
|
+
* @internal
|
|
9
|
+
*/
|
|
10
|
+
export class StubFactoryClass {
|
|
11
|
+
constructor() {
|
|
12
|
+
throw DIError.factoryNotFound(
|
|
13
|
+
'Trying to get instance of factory without real implementation',
|
|
14
|
+
)
|
|
15
|
+
}
|
|
16
|
+
}
|
package/src/testing/index.mts
CHANGED