@navios/di 0.9.1 → 1.0.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 +17 -0
- package/README.md +28 -0
- package/coverage/block-navigation.js +1 -1
- package/coverage/clover.xml +1463 -3174
- package/coverage/coverage-final.json +56 -54
- package/coverage/index.html +179 -104
- package/coverage/sorter.js +21 -7
- package/coverage/src/{request-context-manager.mts.html → __tests__/gc/gc-test-utils.mts.html} +192 -231
- package/coverage/{lib → src/__tests__/gc}/index.html +25 -40
- package/coverage/src/container/abstract-container.mts.html +1066 -0
- package/coverage/src/container/container.mts.html +958 -0
- package/coverage/src/container/index.html +161 -0
- package/coverage/src/{testing → container}/index.mts.html +12 -9
- package/coverage/src/container/scoped-container.mts.html +907 -0
- package/coverage/src/decorators/factory.decorator.mts.html +68 -53
- package/coverage/src/decorators/index.html +34 -34
- package/coverage/src/decorators/index.mts.html +10 -10
- package/coverage/src/decorators/injectable.decorator.mts.html +144 -60
- package/coverage/src/enums/index.html +21 -21
- package/coverage/src/enums/index.mts.html +12 -12
- package/coverage/src/enums/injectable-scope.enum.mts.html +11 -8
- package/coverage/src/enums/injectable-type.enum.mts.html +10 -7
- package/coverage/src/errors/di-error.mts.html +380 -71
- package/coverage/src/errors/index.html +22 -127
- package/coverage/src/errors/index.mts.html +9 -33
- package/coverage/src/event-emitter.mts.html +35 -107
- package/coverage/src/index.html +14 -254
- package/coverage/src/index.mts.html +23 -50
- package/coverage/src/interfaces/container.interface.mts.html +370 -0
- package/coverage/src/interfaces/factory.interface.mts.html +12 -12
- package/coverage/src/interfaces/index.html +45 -30
- package/coverage/src/interfaces/index.mts.html +16 -13
- package/coverage/src/interfaces/on-service-destroy.interface.mts.html +1 -1
- package/coverage/src/interfaces/on-service-init.interface.mts.html +1 -1
- package/coverage/src/internal/context/async-local-storage.browser.mts.html +142 -0
- package/coverage/src/internal/context/async-local-storage.mts.html +292 -0
- package/coverage/src/{factory-context.mts.html → internal/context/async-local-storage.types.mts.html} +17 -17
- package/coverage/src/internal/context/factory-context.mts.html +142 -0
- package/coverage/src/internal/context/index.html +221 -0
- package/coverage/src/internal/context/index.mts.html +100 -0
- package/coverage/src/{service-locator-instance-holder.mts.html → internal/context/resolution-context.mts.html} +114 -78
- package/coverage/src/internal/context/service-initialization-context.mts.html +214 -0
- package/coverage/src/internal/context/sync-local-storage.mts.html +244 -0
- package/coverage/src/internal/core/index.html +206 -0
- package/coverage/src/internal/core/index.mts.html +103 -0
- package/coverage/src/internal/core/instance-resolver.mts.html +2533 -0
- package/coverage/src/{request-context-holder.mts.html → internal/core/name-resolver.mts.html} +245 -260
- package/coverage/src/{container.mts.html → internal/core/scope-tracker.mts.html} +352 -310
- package/coverage/src/{service-instantiator.mts.html → internal/core/service-initializer.mts.html} +254 -176
- package/coverage/src/internal/core/service-invalidator.mts.html +955 -0
- package/coverage/src/internal/core/token-resolver.mts.html +451 -0
- package/coverage/src/internal/holder/holder-storage.interface.mts.html +451 -0
- package/coverage/src/internal/holder/index.html +161 -0
- package/coverage/src/internal/holder/index.mts.html +94 -0
- package/coverage/src/internal/holder/instance-holder.mts.html +406 -0
- package/coverage/src/{service-locator.mts.html → internal/holder/unified-storage.mts.html} +376 -379
- package/coverage/{lib/testing → src/internal}/index.html +26 -11
- package/coverage/src/internal/index.mts.html +100 -0
- package/coverage/src/internal/lifecycle/circular-detector.mts.html +364 -0
- package/coverage/src/internal/lifecycle/index.html +146 -0
- package/coverage/src/internal/lifecycle/index.mts.html +91 -0
- package/coverage/src/{service-locator-event-bus.mts.html → internal/lifecycle/lifecycle-event-bus.mts.html} +104 -80
- package/coverage/src/internal/stub-factory-class.mts.html +133 -0
- package/coverage/src/symbols/index.html +14 -14
- package/coverage/src/symbols/index.mts.html +9 -9
- package/coverage/src/symbols/injectable-token.mts.html +9 -3
- package/coverage/src/testing/index.html +32 -32
- package/coverage/src/testing/test-container.mts.html +1576 -139
- package/coverage/src/testing/unit-test-container.mts.html +1888 -0
- package/coverage/src/token/index.html +146 -0
- package/coverage/{lib/testing/index.d.mts.html → src/token/index.mts.html} +11 -11
- package/coverage/src/{injection-token.mts.html → token/injection-token.mts.html} +225 -111
- package/coverage/src/{base-instance-holder-manager.mts.html → token/registry.mts.html} +188 -269
- package/coverage/src/{injector.mts.html → utils/default-injectors.mts.html} +31 -31
- package/coverage/src/utils/get-injectable-token.mts.html +19 -22
- package/coverage/src/utils/get-injectors.mts.html +684 -177
- package/coverage/src/utils/index.html +36 -36
- package/coverage/src/utils/index.mts.html +18 -12
- package/coverage/src/utils/types.mts.html +26 -11
- package/docs/examples/basic-usage.mts +1 -1
- package/docs/examples/factory-pattern.mts +3 -3
- package/docs/examples/request-scope-example.mts +1 -1
- package/docs/examples/service-lifecycle.mts +1 -1
- package/lib/browser/internal/core/instance-resolver.d.mts.map +1 -1
- package/lib/browser/internal/core/instance-resolver.mjs.map +1 -1
- package/lib/browser/utils/get-injectors.mjs +9 -12
- package/lib/browser/utils/get-injectors.mjs.map +1 -1
- package/lib/{container-D-0Ho3qL.d.cts → container-D3j3KuD9.d.mts} +5 -289
- package/lib/container-D3j3KuD9.d.mts.map +1 -0
- package/lib/{container-8-z89TyQ.mjs → container-qgHMgGNG.mjs} +12 -239
- package/lib/container-qgHMgGNG.mjs.map +1 -0
- package/lib/{container-CNiqesCL.d.mts → container-r1KP4F-n.d.cts} +5 -289
- package/lib/container-r1KP4F-n.d.cts.map +1 -0
- package/lib/{container-CaY2fDuk.cjs → container-ycYJgTq7.cjs} +50 -331
- package/lib/container-ycYJgTq7.cjs.map +1 -0
- package/lib/factory.decorator-D4mem6YQ.cjs +21 -0
- package/lib/factory.decorator-D4mem6YQ.cjs.map +1 -0
- package/lib/factory.decorator-_IPWcwQn.mjs +16 -0
- package/lib/factory.decorator-_IPWcwQn.mjs.map +1 -0
- package/lib/index.cjs +14 -24
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +3 -52
- package/lib/index.d.cts.map +1 -1
- package/lib/index.d.mts +3 -52
- package/lib/index.d.mts.map +1 -1
- package/lib/index.mjs +3 -13
- package/lib/index.mjs.map +1 -1
- package/lib/injectable.decorator-BNfWpjr_.d.cts +56 -0
- package/lib/injectable.decorator-BNfWpjr_.d.cts.map +1 -0
- package/lib/injectable.decorator-Bc05hRQU.d.mts +56 -0
- package/lib/injectable.decorator-Bc05hRQU.d.mts.map +1 -0
- package/lib/injectable.decorator-CyPrBzBN.mjs +227 -0
- package/lib/injectable.decorator-CyPrBzBN.mjs.map +1 -0
- package/lib/injectable.decorator-DbpiDrg-.cjs +281 -0
- package/lib/injectable.decorator-DbpiDrg-.cjs.map +1 -0
- package/lib/legacy-compat/index.cjs +114 -0
- package/lib/legacy-compat/index.cjs.map +1 -0
- package/lib/legacy-compat/index.d.cts +63 -0
- package/lib/legacy-compat/index.d.cts.map +1 -0
- package/lib/legacy-compat/index.d.mts +63 -0
- package/lib/legacy-compat/index.d.mts.map +1 -0
- package/lib/legacy-compat/index.mjs +111 -0
- package/lib/legacy-compat/index.mjs.map +1 -0
- package/lib/registry-DKbKWFvJ.d.cts +290 -0
- package/lib/registry-DKbKWFvJ.d.cts.map +1 -0
- package/lib/registry-n8JhJoxm.d.mts +290 -0
- package/lib/registry-n8JhJoxm.d.mts.map +1 -0
- package/lib/testing/index.cjs +23 -22
- package/lib/testing/index.cjs.map +1 -1
- package/lib/testing/index.d.cts +2 -1
- package/lib/testing/index.d.cts.map +1 -1
- package/lib/testing/index.d.mts +2 -1
- package/lib/testing/index.d.mts.map +1 -1
- package/lib/testing/index.mjs +2 -1
- package/lib/testing/index.mjs.map +1 -1
- package/package.json +11 -1
- package/project.json +8 -0
- package/src/__tests__/gc/basic-container.spec.mts +358 -0
- package/src/__tests__/gc/circular-dependencies.spec.mts +501 -0
- package/src/__tests__/gc/gc-test-utils.mts +136 -0
- package/src/__tests__/gc/memory-pressure.spec.mts +542 -0
- package/src/__tests__/gc/scoped-container.spec.mts +444 -0
- package/src/__tests__/gc/transient-services.spec.mts +326 -0
- package/src/__tests__/get-injectors.spec.mts +166 -0
- package/src/__tests__/scope-upgrade.spec.mts +0 -18
- package/src/internal/core/instance-resolver.mts +0 -1
- package/src/legacy-compat/context-compat.mts +95 -0
- package/src/legacy-compat/factory.decorator.mts +37 -0
- package/src/legacy-compat/index.mts +16 -0
- package/src/legacy-compat/injectable.decorator.mts +41 -0
- package/src/utils/get-injectors.mts +36 -32
- package/tsdown.config.mts +1 -1
- package/vitest.config.mts +3 -7
- package/coverage/docs/examples/basic-usage.mts.html +0 -376
- package/coverage/docs/examples/factory-pattern.mts.html +0 -1039
- package/coverage/docs/examples/index.html +0 -176
- package/coverage/docs/examples/injection-tokens.mts.html +0 -760
- package/coverage/docs/examples/request-scope-example.mts.html +0 -847
- package/coverage/docs/examples/service-lifecycle.mts.html +0 -1162
- package/coverage/lib/_tsup-dts-rollup.d.mts.html +0 -3445
- package/coverage/lib/index.d.mts.html +0 -313
- package/coverage/src/errors/errors.enum.mts.html +0 -118
- package/coverage/src/errors/factory-not-found.mts.html +0 -118
- package/coverage/src/errors/factory-token-not-resolved.mts.html +0 -118
- package/coverage/src/errors/instance-destroying.mts.html +0 -118
- package/coverage/src/errors/instance-expired.mts.html +0 -118
- package/coverage/src/errors/instance-not-found.mts.html +0 -118
- package/coverage/src/errors/unknown-error.mts.html +0 -118
- package/coverage/src/instance-resolver.mts.html +0 -1762
- package/coverage/src/registry.mts.html +0 -247
- package/coverage/src/service-invalidator.mts.html +0 -1372
- package/coverage/src/service-locator-manager.mts.html +0 -340
- package/coverage/src/token-processor.mts.html +0 -607
- package/coverage/src/utils/defer.mts.html +0 -118
- package/lib/container-8-z89TyQ.mjs.map +0 -1
- package/lib/container-CNiqesCL.d.mts.map +0 -1
- package/lib/container-CaY2fDuk.cjs.map +0 -1
- package/lib/container-D-0Ho3qL.d.cts.map +0 -1
package/lib/testing/index.cjs
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
const
|
|
1
|
+
const require_injectable_decorator = require('../injectable.decorator-DbpiDrg-.cjs');
|
|
2
|
+
const require_container = require('../container-ycYJgTq7.cjs');
|
|
2
3
|
|
|
3
4
|
//#region src/testing/test-container.mts
|
|
4
5
|
/**
|
|
@@ -48,8 +49,8 @@ const require_container = require('../container-CaY2fDuk.cjs');
|
|
|
48
49
|
* const custom = new TestContainer({ parentRegistry: myRegistry })
|
|
49
50
|
* ```
|
|
50
51
|
*/ constructor(options = {}) {
|
|
51
|
-
const { parentRegistry =
|
|
52
|
-
const testRegistry = parentRegistry ? new
|
|
52
|
+
const { parentRegistry = require_injectable_decorator.globalRegistry, logger = null } = options;
|
|
53
|
+
const testRegistry = parentRegistry ? new require_injectable_decorator.Registry(parentRegistry) : new require_injectable_decorator.Registry();
|
|
53
54
|
super(testRegistry, logger, require_container.defaultInjectors);
|
|
54
55
|
this.testRegistry = testRegistry;
|
|
55
56
|
}
|
|
@@ -109,7 +110,7 @@ const require_container = require('../container-CaY2fDuk.cjs');
|
|
|
109
110
|
const registry = this.getRegistry();
|
|
110
111
|
if (!registry.has(realToken)) throw new Error(`Expected ${realToken.toString()} to be registered, but it was not`);
|
|
111
112
|
const record = registry.get(realToken);
|
|
112
|
-
if (record.scope !==
|
|
113
|
+
if (record.scope !== require_injectable_decorator.InjectableScope.Singleton) throw new Error(`Expected ${realToken.toString()} to be Singleton scope, but it was ${record.scope}`);
|
|
113
114
|
}
|
|
114
115
|
/**
|
|
115
116
|
* Asserts that a service is registered as transient scope.
|
|
@@ -118,7 +119,7 @@ const require_container = require('../container-CaY2fDuk.cjs');
|
|
|
118
119
|
const registry = this.getRegistry();
|
|
119
120
|
if (!registry.has(realToken)) throw new Error(`Expected ${realToken.toString()} to be registered, but it was not`);
|
|
120
121
|
const record = registry.get(realToken);
|
|
121
|
-
if (record.scope !==
|
|
122
|
+
if (record.scope !== require_injectable_decorator.InjectableScope.Transient) throw new Error(`Expected ${realToken.toString()} to be Transient scope, but it was ${record.scope}`);
|
|
122
123
|
}
|
|
123
124
|
/**
|
|
124
125
|
* Asserts that a service is registered as request scope.
|
|
@@ -127,7 +128,7 @@ const require_container = require('../container-CaY2fDuk.cjs');
|
|
|
127
128
|
const registry = this.getRegistry();
|
|
128
129
|
if (!registry.has(realToken)) throw new Error(`Expected ${realToken.toString()} to be registered, but it was not`);
|
|
129
130
|
const record = registry.get(realToken);
|
|
130
|
-
if (record.scope !==
|
|
131
|
+
if (record.scope !== require_injectable_decorator.InjectableScope.Request) throw new Error(`Expected ${realToken.toString()} to be Request scope, but it was ${record.scope}`);
|
|
131
132
|
}
|
|
132
133
|
/**
|
|
133
134
|
* Asserts that two service resolutions return the same instance.
|
|
@@ -278,7 +279,7 @@ const require_container = require('../container-CaY2fDuk.cjs');
|
|
|
278
279
|
}
|
|
279
280
|
resolveToken(token) {
|
|
280
281
|
if (typeof token === "function") return require_container.getInjectableToken(token);
|
|
281
|
-
if (token instanceof
|
|
282
|
+
if (token instanceof require_injectable_decorator.BoundInjectionToken) return token.token;
|
|
282
283
|
return token;
|
|
283
284
|
}
|
|
284
285
|
registerValueBinding(token, value) {
|
|
@@ -287,13 +288,13 @@ const require_container = require('../container-CaY2fDuk.cjs');
|
|
|
287
288
|
return value;
|
|
288
289
|
}
|
|
289
290
|
};
|
|
290
|
-
this.testRegistry.set(token,
|
|
291
|
-
const instanceName = this.getNameResolver().generateInstanceName(token, void 0, void 0,
|
|
291
|
+
this.testRegistry.set(token, require_injectable_decorator.InjectableScope.Singleton, ValueHolder, require_injectable_decorator.InjectableType.Factory, 1e3);
|
|
292
|
+
const instanceName = this.getNameResolver().generateInstanceName(token, void 0, void 0, require_injectable_decorator.InjectableScope.Singleton);
|
|
292
293
|
this.getStorage().storeInstance(instanceName, value);
|
|
293
294
|
this.recordLifecycleEvent(token, "created", instanceName);
|
|
294
295
|
}
|
|
295
296
|
registerClassBinding(token, cls) {
|
|
296
|
-
this.testRegistry.set(token,
|
|
297
|
+
this.testRegistry.set(token, require_injectable_decorator.InjectableScope.Singleton, cls, require_injectable_decorator.InjectableType.Class, 1e3);
|
|
297
298
|
}
|
|
298
299
|
registerFactoryBinding(token, factory) {
|
|
299
300
|
const FactoryWrapper = class {
|
|
@@ -302,7 +303,7 @@ const require_container = require('../container-CaY2fDuk.cjs');
|
|
|
302
303
|
return await factory();
|
|
303
304
|
}
|
|
304
305
|
};
|
|
305
|
-
this.testRegistry.set(token,
|
|
306
|
+
this.testRegistry.set(token, require_injectable_decorator.InjectableScope.Singleton, FactoryWrapper, require_injectable_decorator.InjectableType.Factory, 1e3);
|
|
306
307
|
}
|
|
307
308
|
argsMatch(actual, expected) {
|
|
308
309
|
if (actual.length !== expected.length) return false;
|
|
@@ -397,7 +398,7 @@ const require_container = require('../container-CaY2fDuk.cjs');
|
|
|
397
398
|
autoMockedTokenIds = /* @__PURE__ */ new Set();
|
|
398
399
|
allowUnregistered;
|
|
399
400
|
constructor(options) {
|
|
400
|
-
const testRegistry = new
|
|
401
|
+
const testRegistry = new require_injectable_decorator.Registry();
|
|
401
402
|
super(testRegistry, options.logger ?? null, require_container.defaultInjectors);
|
|
402
403
|
this.testRegistry = testRegistry;
|
|
403
404
|
this.allowUnregistered = options.allowUnregistered ?? false;
|
|
@@ -420,7 +421,7 @@ const require_container = require('../container-CaY2fDuk.cjs');
|
|
|
420
421
|
/**
|
|
421
422
|
* Override get to wrap instances in tracking proxies.
|
|
422
423
|
*/ async get(token, args) {
|
|
423
|
-
const tokenId = token instanceof
|
|
424
|
+
const tokenId = token instanceof require_injectable_decorator.BoundInjectionToken ? token.id : void 0;
|
|
424
425
|
const realToken = this.resolveToken(token);
|
|
425
426
|
if (!(tokenId && this.registeredTokenIds.has(tokenId) || this.registeredTokenIds.has(realToken.id))) {
|
|
426
427
|
if (!this.allowUnregistered) throw require_container.DIError.factoryNotFound(`${realToken.toString()} is not in the providers list. Add it to providers or enable allowUnregistered.`);
|
|
@@ -564,21 +565,21 @@ const require_container = require('../container-CaY2fDuk.cjs');
|
|
|
564
565
|
if (typeof token === "function") try {
|
|
565
566
|
return require_container.getInjectableToken(token);
|
|
566
567
|
} catch {
|
|
567
|
-
return
|
|
568
|
+
return require_injectable_decorator.InjectionToken.create(token);
|
|
568
569
|
}
|
|
569
|
-
if (token instanceof
|
|
570
|
+
if (token instanceof require_injectable_decorator.BoundInjectionToken) return token.token;
|
|
570
571
|
return token;
|
|
571
572
|
}
|
|
572
573
|
registerProvider(provider) {
|
|
573
574
|
const providerToken = provider.token;
|
|
574
575
|
const realToken = this.resolveToken(providerToken);
|
|
575
576
|
this.registeredTokenIds.add(realToken.id);
|
|
576
|
-
if (providerToken instanceof
|
|
577
|
+
if (providerToken instanceof require_injectable_decorator.BoundInjectionToken) this.registeredTokenIds.add(providerToken.id);
|
|
577
578
|
if (provider.useValue !== void 0) this.registerValueBinding(realToken, provider.useValue);
|
|
578
579
|
else if (provider.useClass) this.registerClassBinding(realToken, provider.useClass);
|
|
579
580
|
else if (provider.useFactory) this.registerFactoryBinding(realToken, provider.useFactory);
|
|
580
|
-
else if (typeof provider.token === "function") this.testRegistry.set(realToken,
|
|
581
|
-
else if (providerToken instanceof
|
|
581
|
+
else if (typeof provider.token === "function") this.testRegistry.set(realToken, require_injectable_decorator.InjectableScope.Singleton, provider.token, require_injectable_decorator.InjectableType.Class, 1e3);
|
|
582
|
+
else if (providerToken instanceof require_injectable_decorator.BoundInjectionToken) this.registerValueBinding(realToken, providerToken.value);
|
|
582
583
|
}
|
|
583
584
|
registerValueBinding(token, value) {
|
|
584
585
|
const ValueHolder = class {
|
|
@@ -586,13 +587,13 @@ const require_container = require('../container-CaY2fDuk.cjs');
|
|
|
586
587
|
return value;
|
|
587
588
|
}
|
|
588
589
|
};
|
|
589
|
-
this.testRegistry.set(token,
|
|
590
|
-
const instanceName = this.getNameResolver().generateInstanceName(token, void 0, void 0,
|
|
590
|
+
this.testRegistry.set(token, require_injectable_decorator.InjectableScope.Singleton, ValueHolder, require_injectable_decorator.InjectableType.Factory, 1e3);
|
|
591
|
+
const instanceName = this.getNameResolver().generateInstanceName(token, void 0, void 0, require_injectable_decorator.InjectableScope.Singleton);
|
|
591
592
|
this.getStorage().storeInstance(instanceName, value);
|
|
592
593
|
this.recordLifecycleEvent(token, "created", instanceName);
|
|
593
594
|
}
|
|
594
595
|
registerClassBinding(token, cls) {
|
|
595
|
-
this.testRegistry.set(token,
|
|
596
|
+
this.testRegistry.set(token, require_injectable_decorator.InjectableScope.Singleton, cls, require_injectable_decorator.InjectableType.Class, 1e3);
|
|
596
597
|
}
|
|
597
598
|
registerFactoryBinding(token, factory) {
|
|
598
599
|
const FactoryWrapper = class {
|
|
@@ -601,7 +602,7 @@ const require_container = require('../container-CaY2fDuk.cjs');
|
|
|
601
602
|
return await factory();
|
|
602
603
|
}
|
|
603
604
|
};
|
|
604
|
-
this.testRegistry.set(token,
|
|
605
|
+
this.testRegistry.set(token, require_injectable_decorator.InjectableScope.Singleton, FactoryWrapper, require_injectable_decorator.InjectableType.Factory, 1e3);
|
|
605
606
|
}
|
|
606
607
|
argsMatch(actual, expected) {
|
|
607
608
|
if (actual.length !== expected.length) return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["Container","InjectableScope","InjectableType","BoundInjectionToken","globalRegistry","Registry","getInjectableToken","defaultInjectors","TestContainer","testRegistry","methodCalls","Map","lifecycleEvents","instanceCounts","boundTokens","Set","options","parentRegistry","logger","bind","token","realToken","resolveToken","tokenId","id","toValue","value","add","registerValueBinding","toClass","cls","registerClassBinding","toFactory","factory","registerFactoryBinding","clear","dispose","expectResolved","storage","getStorage","names","getAllNames","found","some","name","includes","Error","toString","expectNotResolved","expectSingleton","registry","getRegistry","has","record","get","scope","Singleton","expectTransient","Transient","expectRequestScoped","Request","expectSameInstance","instance1","instance2","expectDifferentInstances","expectInitialized","events","initialized","e","event","expectDestroyed","destroyed","expectNotDestroyed","recordMethodCall","method","args","result","error","calls","push","timestamp","Date","now","set","recordLifecycleEvent","instanceName","count","expectCalled","c","expectCalledWith","expectedArgs","argsMatch","JSON","stringify","expectCallCount","actualCount","filter","length","getMethodCalls","getServiceStats","instanceCount","clearMethodCalls","getDependencyGraph","nodes","rootTokens","forEach","holder","tokenMatch","match","dependencies","Array","from","deps","dependents","findDependents","getSimplifiedDependencyGraph","graph","dep","depTokenMatch","depTokenId","key","Object","keys","sort","ValueHolder","create","Factory","nameResolver","getNameResolver","generateInstanceName","undefined","storeInstance","Class","FactoryWrapper","actual","expected","every","arg","index","exp","Container","InjectableScope","InjectableType","DIError","BoundInjectionToken","InjectionToken","Registry","getInjectableToken","defaultInjectors","createTrackingProxy","target","tokenId","methodCalls","Proxy","get","obj","prop","value","Reflect","args","calls","record","method","timestamp","Date","now","result","apply","undefined","Promise","then","res","push","set","catch","err","error","createAutoMockProxy","_","Error","UnitTestContainer","testRegistry","Map","lifecycleEvents","instanceCounts","registeredTokenIds","Set","autoMockedTokenIds","allowUnregistered","options","logger","provider","providers","registerProvider","enableAutoMocking","disableAutoMocking","token","isBoundToken","id","realToken","resolveToken","isRegistered","has","factoryNotFound","toString","idToCheck","add","instance","trackingId","clear","dispose","expectResolved","storage","getStorage","names","getAllNames","found","some","name","includes","expectNotResolved","expectAutoMocked","expectNotAutoMocked","recordLifecycleEvent","event","instanceName","events","count","expectInitialized","initialized","e","expectDestroyed","destroyed","expectNotDestroyed","expectCalled","c","expectNotCalled","expectCalledWith","expectedArgs","argsMatch","filter","actualArgs","map","JSON","stringify","join","expectCallCount","actualCount","length","getMethodCalls","getServiceStats","instanceCount","clearMethodCalls","getRegisteredTokenIds","getAutoMockedTokenIds","create","providerToken","useValue","registerValueBinding","useClass","registerClassBinding","useFactory","registerFactoryBinding","Singleton","Class","ValueHolder","Factory","nameResolver","getNameResolver","generateInstanceName","storeInstance","cls","factory","FactoryWrapper","actual","expected","every","arg","index","exp"],"sources":["../../src/testing/test-container.mts","../../src/testing/unit-test-container.mts"],"sourcesContent":["import type {\n BindingBuilder,\n DependencyGraph,\n DependencyNode,\n LifecycleRecord,\n MethodCallRecord,\n MockServiceStats,\n TestContainerOptions,\n} from './types.mjs'\n\nimport { Container } from '../container/container.mjs'\nimport { InjectableScope, InjectableType } from '../enums/index.mjs'\nimport {\n BoundInjectionToken,\n InjectionToken,\n} from '../token/injection-token.mjs'\nimport { globalRegistry, Registry } from '../token/registry.mjs'\nimport { getInjectableToken } from '../utils/get-injectable-token.mjs'\nimport { defaultInjectors } from '../utils/index.mjs'\n\ntype AnyToken =\n | InjectionToken<any, any>\n | BoundInjectionToken<any, any>\n | (new (...args: any[]) => any)\n\n/**\n * TestContainer extends Container with testing utilities.\n *\n * Provides simple value/class binding for integration/e2e tests,\n * plus assertion helpers and dependency graph inspection.\n *\n * @example\n * ```ts\n * const container = new TestContainer()\n *\n * // Bind mock values\n * container.bind(DatabaseToken).toValue(mockDatabase)\n * container.bind(UserService).toClass(MockUserService)\n *\n * // Use container normally\n * const service = await container.get(MyService)\n *\n * // Assert on container state\n * container.expectResolved(MyService)\n * container.expectSingleton(MyService)\n * ```\n */\nexport class TestContainer extends Container {\n private readonly testRegistry: Registry\n private readonly methodCalls = new Map<string, MethodCallRecord[]>()\n private readonly lifecycleEvents = new Map<string, LifecycleRecord[]>()\n private readonly instanceCounts = new Map<string, number>()\n private readonly boundTokens = new Set<string>()\n\n /**\n * Creates a new TestContainer.\n *\n * @param options - Configuration options\n * @param options.parentRegistry - Parent registry. Defaults to globalRegistry.\n * Pass `null` for a completely isolated container.\n * @param options.logger - Optional logger for debugging.\n *\n * @example\n * ```ts\n * // Uses globalRegistry as parent (default)\n * const container = new TestContainer()\n *\n * // Isolated container (no access to @Injectable classes)\n * const isolated = new TestContainer({ parentRegistry: null })\n *\n * // Custom parent registry\n * const custom = new TestContainer({ parentRegistry: myRegistry })\n * ```\n */\n constructor(options: TestContainerOptions = {}) {\n const { parentRegistry = globalRegistry, logger = null } = options\n const testRegistry = parentRegistry\n ? new Registry(parentRegistry)\n : new Registry()\n super(testRegistry, logger, defaultInjectors)\n this.testRegistry = testRegistry\n }\n\n // ============================================================================\n // BINDING API\n // ============================================================================\n\n /**\n * Creates a binding builder for the given token.\n *\n * @example\n * ```ts\n * container.bind(UserService).toValue(mockUserService)\n * container.bind(DatabaseToken).toClass(MockDatabase)\n * container.bind(ConfigToken).toFactory(() => ({ apiKey: 'test' }))\n * container.bind(BOUND_CONFIG_TOKEN).toValue(overrideValue)\n * ```\n */\n bind<T>(\n token:\n | InjectionToken<T, any>\n | BoundInjectionToken<T, any>\n | (new (...args: any[]) => T),\n ): BindingBuilder<T> {\n const realToken = this.resolveToken(token)\n const tokenId = realToken.id\n\n return {\n toValue: (value: T) => {\n this.boundTokens.add(tokenId)\n this.registerValueBinding(realToken, value)\n },\n toClass: <C extends new (...args: any[]) => T>(cls: C) => {\n this.boundTokens.add(tokenId)\n this.registerClassBinding(realToken, cls)\n },\n toFactory: (factory: () => T | Promise<T>) => {\n this.boundTokens.add(tokenId)\n this.registerFactoryBinding(realToken, factory)\n },\n }\n }\n\n /**\n * Clears all bindings and resets container state.\n */\n async clear(): Promise<void> {\n await this.dispose()\n this.methodCalls.clear()\n this.lifecycleEvents.clear()\n this.instanceCounts.clear()\n this.boundTokens.clear()\n }\n\n // ============================================================================\n // ASSERTION HELPERS\n // ============================================================================\n\n /**\n * Asserts that a service has been resolved at least once.\n */\n expectResolved(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n const storage = this.getStorage()\n const names = storage.getAllNames()\n const found = names.some((name) => name.includes(realToken.id))\n\n if (!found) {\n throw new Error(\n `Expected ${realToken.toString()} to be resolved, but it was not`,\n )\n }\n }\n\n /**\n * Asserts that a service has NOT been resolved.\n */\n expectNotResolved(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n const storage = this.getStorage()\n const names = storage.getAllNames()\n const found = names.some((name) => name.includes(realToken.id))\n\n if (found) {\n throw new Error(\n `Expected ${realToken.toString()} to NOT be resolved, but it was`,\n )\n }\n }\n\n /**\n * Asserts that a service is registered as singleton scope.\n */\n expectSingleton(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n const registry = this.getRegistry()\n\n if (!registry.has(realToken)) {\n throw new Error(\n `Expected ${realToken.toString()} to be registered, but it was not`,\n )\n }\n\n const record = registry.get(realToken)\n if (record.scope !== InjectableScope.Singleton) {\n throw new Error(\n `Expected ${realToken.toString()} to be Singleton scope, but it was ${record.scope}`,\n )\n }\n }\n\n /**\n * Asserts that a service is registered as transient scope.\n */\n expectTransient(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n const registry = this.getRegistry()\n\n if (!registry.has(realToken)) {\n throw new Error(\n `Expected ${realToken.toString()} to be registered, but it was not`,\n )\n }\n\n const record = registry.get(realToken)\n if (record.scope !== InjectableScope.Transient) {\n throw new Error(\n `Expected ${realToken.toString()} to be Transient scope, but it was ${record.scope}`,\n )\n }\n }\n\n /**\n * Asserts that a service is registered as request scope.\n */\n expectRequestScoped(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n const registry = this.getRegistry()\n\n if (!registry.has(realToken)) {\n throw new Error(\n `Expected ${realToken.toString()} to be registered, but it was not`,\n )\n }\n\n const record = registry.get(realToken)\n if (record.scope !== InjectableScope.Request) {\n throw new Error(\n `Expected ${realToken.toString()} to be Request scope, but it was ${record.scope}`,\n )\n }\n }\n\n /**\n * Asserts that two service resolutions return the same instance.\n */\n async expectSameInstance(token: AnyToken): Promise<void> {\n const instance1 = await this.get(token as any)\n const instance2 = await this.get(token as any)\n\n if (instance1 !== instance2) {\n const realToken = this.resolveToken(token)\n throw new Error(\n `Expected ${realToken.toString()} to return same instance, but got different instances`,\n )\n }\n }\n\n /**\n * Asserts that two service resolutions return different instances.\n */\n async expectDifferentInstances(token: AnyToken): Promise<void> {\n const instance1 = await this.get(token as any)\n const instance2 = await this.get(token as any)\n\n if (instance1 === instance2) {\n const realToken = this.resolveToken(token)\n throw new Error(\n `Expected ${realToken.toString()} to return different instances, but got same instance`,\n )\n }\n }\n\n // ============================================================================\n // LIFECYCLE ASSERTIONS\n // ============================================================================\n\n /**\n * Asserts that a service's onServiceInit was called.\n */\n expectInitialized(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n const events = this.lifecycleEvents.get(realToken.id) || []\n const initialized = events.some((e) => e.event === 'initialized')\n\n if (!initialized) {\n throw new Error(\n `Expected ${realToken.toString()} to be initialized, but onServiceInit was not called`,\n )\n }\n }\n\n /**\n * Asserts that a service's onServiceDestroy was called.\n */\n expectDestroyed(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n const events = this.lifecycleEvents.get(realToken.id) || []\n const destroyed = events.some((e) => e.event === 'destroyed')\n\n if (!destroyed) {\n throw new Error(\n `Expected ${realToken.toString()} to be destroyed, but onServiceDestroy was not called`,\n )\n }\n }\n\n /**\n * Asserts that a service has NOT been destroyed.\n */\n expectNotDestroyed(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n const events = this.lifecycleEvents.get(realToken.id) || []\n const destroyed = events.some((e) => e.event === 'destroyed')\n\n if (destroyed) {\n throw new Error(\n `Expected ${realToken.toString()} to NOT be destroyed, but onServiceDestroy was called`,\n )\n }\n }\n\n // ============================================================================\n // CALL TRACKING\n // ============================================================================\n\n /**\n * Records a method call for tracking.\n * Call this from your mock implementations.\n */\n recordMethodCall(\n token: AnyToken,\n method: string,\n args: unknown[],\n result?: unknown,\n error?: Error,\n ): void {\n const realToken = this.resolveToken(token)\n const calls = this.methodCalls.get(realToken.id) || []\n calls.push({\n method,\n args,\n timestamp: Date.now(),\n result,\n error,\n })\n this.methodCalls.set(realToken.id, calls)\n }\n\n /**\n * Records a lifecycle event for tracking.\n */\n recordLifecycleEvent(\n token: AnyToken,\n event: 'created' | 'initialized' | 'destroyed',\n instanceName: string,\n ): void {\n const realToken = this.resolveToken(token)\n const events = this.lifecycleEvents.get(realToken.id) || []\n events.push({\n event,\n timestamp: Date.now(),\n instanceName,\n })\n this.lifecycleEvents.set(realToken.id, events)\n\n if (event === 'created') {\n const count = this.instanceCounts.get(realToken.id) || 0\n this.instanceCounts.set(realToken.id, count + 1)\n }\n }\n\n /**\n * Asserts that a method was called on a service.\n */\n expectCalled(token: AnyToken, method: string): void {\n const realToken = this.resolveToken(token)\n const calls = this.methodCalls.get(realToken.id) || []\n const found = calls.some((c) => c.method === method)\n\n if (!found) {\n throw new Error(\n `Expected ${realToken.toString()}.${method}() to be called, but it was not`,\n )\n }\n }\n\n /**\n * Asserts that a method was called with specific arguments.\n */\n expectCalledWith(\n token: AnyToken,\n method: string,\n expectedArgs: unknown[],\n ): void {\n const realToken = this.resolveToken(token)\n const calls = this.methodCalls.get(realToken.id) || []\n const found = calls.some(\n (c) => c.method === method && this.argsMatch(c.args, expectedArgs),\n )\n\n if (!found) {\n throw new Error(\n `Expected ${realToken.toString()}.${method}() to be called with ${JSON.stringify(expectedArgs)}, but it was not`,\n )\n }\n }\n\n /**\n * Asserts that a method was called a specific number of times.\n */\n expectCallCount(token: AnyToken, method: string, count: number): void {\n const realToken = this.resolveToken(token)\n const calls = this.methodCalls.get(realToken.id) || []\n const actualCount = calls.filter((c) => c.method === method).length\n\n if (actualCount !== count) {\n throw new Error(\n `Expected ${realToken.toString()}.${method}() to be called ${count} times, but was called ${actualCount} times`,\n )\n }\n }\n\n /**\n * Gets all recorded method calls for a service.\n */\n getMethodCalls(token: AnyToken): MethodCallRecord[] {\n const realToken = this.resolveToken(token)\n return this.methodCalls.get(realToken.id) || []\n }\n\n /**\n * Gets statistics about a mocked service.\n */\n getServiceStats(token: AnyToken): MockServiceStats {\n const realToken = this.resolveToken(token)\n return {\n instanceCount: this.instanceCounts.get(realToken.id) || 0,\n methodCalls: this.methodCalls.get(realToken.id) || [],\n lifecycleEvents: this.lifecycleEvents.get(realToken.id) || [],\n }\n }\n\n /**\n * Clears all recorded method calls.\n */\n clearMethodCalls(): void {\n this.methodCalls.clear()\n }\n\n // ============================================================================\n // DEPENDENCY GRAPH\n // ============================================================================\n\n /**\n * Gets the dependency graph for snapshot testing.\n * Returns a serializable structure that can be used with vitest snapshots.\n */\n getDependencyGraph(): DependencyGraph {\n const storage = this.getStorage()\n const nodes: Record<string, DependencyNode> = {}\n const rootTokens: string[] = []\n\n storage.forEach((name, holder) => {\n const tokenMatch = name.match(/^([^:]+)/)\n const tokenId = tokenMatch ? tokenMatch[1] : name\n\n nodes[name] = {\n token: tokenId,\n instanceName: name,\n scope: holder.scope,\n dependencies: Array.from(holder.deps),\n dependents: storage.findDependents(name),\n }\n\n // Root tokens have no dependents\n if (storage.findDependents(name).length === 0) {\n rootTokens.push(name)\n }\n })\n\n return { nodes, rootTokens }\n }\n\n /**\n * Gets a simplified dependency graph showing only token relationships.\n * Useful for cleaner snapshot comparisons.\n */\n getSimplifiedDependencyGraph(): Record<string, string[]> {\n const storage = this.getStorage()\n const graph: Record<string, string[]> = {}\n\n storage.forEach((name, holder) => {\n const tokenMatch = name.match(/^([^:]+)/)\n const tokenId = tokenMatch ? tokenMatch[1] : name\n\n if (!graph[tokenId]) {\n graph[tokenId] = []\n }\n\n for (const dep of holder.deps) {\n const depTokenMatch = dep.match(/^([^:]+)/)\n const depTokenId = depTokenMatch ? depTokenMatch[1] : dep\n if (!graph[tokenId].includes(depTokenId)) {\n graph[tokenId].push(depTokenId)\n }\n }\n })\n\n // Sort for consistent snapshots\n for (const key of Object.keys(graph)) {\n graph[key].sort()\n }\n\n return graph\n }\n\n // ============================================================================\n // INTERNAL HELPERS\n // ============================================================================\n\n private resolveToken(token: AnyToken): InjectionToken<any, any> {\n if (typeof token === 'function') {\n return getInjectableToken(token)\n }\n if (token instanceof BoundInjectionToken) {\n return token.token\n }\n return token\n }\n\n private registerValueBinding<T>(\n token: InjectionToken<T, any>,\n value: T,\n ): void {\n // Create a simple class that returns the value\n const ValueHolder = class {\n create(): T {\n return value\n }\n }\n\n this.testRegistry.set(\n token,\n InjectableScope.Singleton,\n ValueHolder,\n InjectableType.Factory,\n 1000, // Higher priority for test overrides\n )\n\n // Store the instance directly\n const nameResolver = this.getNameResolver()\n const instanceName = nameResolver.generateInstanceName(\n token,\n undefined,\n undefined,\n InjectableScope.Singleton,\n )\n this.getStorage().storeInstance(instanceName, value)\n this.recordLifecycleEvent(token, 'created', instanceName)\n }\n\n private registerClassBinding<T>(\n token: InjectionToken<T, any>,\n cls: new (...args: any[]) => T,\n ): void {\n this.testRegistry.set(\n token,\n InjectableScope.Singleton,\n cls,\n InjectableType.Class,\n 1000, // Higher priority for test overrides\n )\n }\n\n private registerFactoryBinding<T>(\n token: InjectionToken<T, any>,\n factory: () => T | Promise<T>,\n ): void {\n // Create a factory class wrapper\n const FactoryWrapper = class {\n static factory = factory\n async create(): Promise<T> {\n return await factory()\n }\n }\n\n this.testRegistry.set(\n token,\n InjectableScope.Singleton,\n FactoryWrapper,\n InjectableType.Factory,\n 1000, // Higher priority for test overrides\n )\n }\n\n private argsMatch(actual: unknown[], expected: unknown[]): boolean {\n if (actual.length !== expected.length) {\n return false\n }\n return actual.every((arg, index) => {\n const exp = expected[index]\n if (typeof exp === 'object' && exp !== null) {\n return JSON.stringify(arg) === JSON.stringify(exp)\n }\n return arg === exp\n })\n }\n}\n","import type {\n LifecycleRecord,\n MethodCallRecord,\n MockServiceStats,\n ProviderConfig,\n UnitTestContainerOptions,\n} from './types.mjs'\n\nimport { Container } from '../container/container.mjs'\nimport { InjectableScope, InjectableType } from '../enums/index.mjs'\nimport { DIError } from '../errors/index.mjs'\nimport {\n BoundInjectionToken,\n InjectionToken,\n} from '../token/injection-token.mjs'\nimport { Registry } from '../token/registry.mjs'\nimport { getInjectableToken } from '../utils/get-injectable-token.mjs'\nimport { defaultInjectors } from '../utils/index.mjs'\n\ntype AnyToken =\n | InjectionToken<any, any>\n | BoundInjectionToken<any, any>\n | (new (...args: any[]) => any)\n\n/**\n * Creates a tracking proxy that records method calls.\n */\nfunction createTrackingProxy<T extends object>(\n target: T,\n tokenId: string,\n methodCalls: Map<string, MethodCallRecord[]>,\n): T {\n return new Proxy(target, {\n get(obj, prop) {\n const value = Reflect.get(obj, prop)\n\n if (typeof value === 'function' && typeof prop === 'string') {\n return function (this: unknown, ...args: unknown[]) {\n const calls = methodCalls.get(tokenId) || []\n const record: MethodCallRecord = {\n method: prop,\n args,\n timestamp: Date.now(),\n }\n\n try {\n const result = value.apply(this === undefined ? obj : this, args)\n\n if (result instanceof Promise) {\n return result\n .then((res) => {\n record.result = res\n calls.push(record)\n methodCalls.set(tokenId, calls)\n return res\n })\n .catch((err) => {\n record.error = err\n calls.push(record)\n methodCalls.set(tokenId, calls)\n throw err\n })\n }\n\n record.result = result\n calls.push(record)\n methodCalls.set(tokenId, calls)\n return result\n } catch (err) {\n record.error = err as Error\n calls.push(record)\n methodCalls.set(tokenId, calls)\n throw err\n }\n }\n }\n\n return value\n },\n })\n}\n\n/**\n * Creates an auto-mock proxy that throws on method access.\n */\nfunction createAutoMockProxy(tokenId: string): object {\n return new Proxy(\n {},\n {\n get(_, prop) {\n if (prop === 'then' || prop === 'catch' || prop === 'finally') {\n return undefined\n }\n if (typeof prop === 'symbol') {\n return undefined\n }\n throw new Error(\n `[UnitTestContainer] Attempted to access '${prop}' on auto-mocked service '${tokenId}'. ` +\n `This service was not provided in the providers list. ` +\n `Add it to providers or use allowUnregistered: false to catch this earlier.`,\n )\n },\n },\n )\n}\n\n/**\n * UnitTestContainer for isolated unit testing.\n *\n * Only services explicitly listed in `providers` can be resolved.\n * All method calls are automatically tracked via proxies.\n * Unregistered dependencies throw by default, or can be auto-mocked.\n *\n * @example\n * ```ts\n * const container = new UnitTestContainer({\n * providers: [\n * { token: UserService, useClass: MockUserService },\n * { token: ConfigToken, useValue: { apiUrl: 'test' } },\n * ],\n * })\n *\n * const service = await container.get(UserService)\n *\n * // All method calls are automatically tracked\n * await service.findUser('123')\n *\n * container.expectCalled(UserService, 'findUser')\n * container.expectCalledWith(UserService, 'findUser', ['123'])\n * ```\n */\nexport class UnitTestContainer extends Container {\n private readonly testRegistry: Registry\n private readonly methodCalls = new Map<string, MethodCallRecord[]>()\n private readonly lifecycleEvents = new Map<string, LifecycleRecord[]>()\n private readonly instanceCounts = new Map<string, number>()\n private readonly registeredTokenIds = new Set<string>()\n private readonly autoMockedTokenIds = new Set<string>()\n private allowUnregistered: boolean\n\n constructor(options: UnitTestContainerOptions) {\n const testRegistry = new Registry()\n super(testRegistry, options.logger ?? null, defaultInjectors)\n this.testRegistry = testRegistry\n this.allowUnregistered = options.allowUnregistered ?? false\n\n // Register all providers\n for (const provider of options.providers) {\n this.registerProvider(provider)\n }\n }\n\n /**\n * Enables auto-mocking for unregistered dependencies.\n * Call this to switch from strict mode to auto-mock mode.\n */\n enableAutoMocking(): this {\n this.allowUnregistered = true\n return this\n }\n\n /**\n * Disables auto-mocking (strict mode).\n * Unregistered dependencies will throw.\n */\n disableAutoMocking(): this {\n this.allowUnregistered = false\n return this\n }\n\n /**\n * Override get to wrap instances in tracking proxies.\n */\n override async get(token: any, args?: unknown): Promise<any> {\n // Check if token is a BoundInjectionToken and if it's registered\n const isBoundToken = token instanceof BoundInjectionToken\n const tokenId = isBoundToken ? token.id : undefined\n const realToken = this.resolveToken(token)\n\n // Check if this is a registered provider (check both bound token ID and real token ID)\n const isRegistered =\n (tokenId && this.registeredTokenIds.has(tokenId)) ||\n this.registeredTokenIds.has(realToken.id)\n\n if (!isRegistered) {\n if (!this.allowUnregistered) {\n throw DIError.factoryNotFound(\n `${realToken.toString()} is not in the providers list. ` +\n `Add it to providers or enable allowUnregistered.`,\n )\n }\n\n // Auto-mock unregistered dependency\n const idToCheck = tokenId || realToken.id\n if (!this.autoMockedTokenIds.has(idToCheck)) {\n this.autoMockedTokenIds.add(idToCheck)\n }\n\n return createAutoMockProxy(idToCheck)\n }\n\n const instance = await super.get(token, args)\n\n // Wrap in tracking proxy if it's an object\n const trackingId = tokenId || realToken.id\n if (instance && typeof instance === 'object') {\n return createTrackingProxy(instance, trackingId, this.methodCalls)\n }\n\n return instance\n }\n\n /**\n * Clears all state and disposes the container.\n */\n async clear(): Promise<void> {\n await this.dispose()\n this.methodCalls.clear()\n this.lifecycleEvents.clear()\n this.instanceCounts.clear()\n this.autoMockedTokenIds.clear()\n }\n\n // ============================================================================\n // ASSERTION HELPERS\n // ============================================================================\n\n /**\n * Asserts that a service has been resolved at least once.\n */\n expectResolved(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n const storage = this.getStorage()\n const names = storage.getAllNames()\n const found = names.some((name) => name.includes(realToken.id))\n\n if (!found) {\n throw new Error(\n `Expected ${realToken.toString()} to be resolved, but it was not`,\n )\n }\n }\n\n /**\n * Asserts that a service has NOT been resolved.\n */\n expectNotResolved(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n const storage = this.getStorage()\n const names = storage.getAllNames()\n const found = names.some((name) => name.includes(realToken.id))\n\n if (found) {\n throw new Error(\n `Expected ${realToken.toString()} to NOT be resolved, but it was`,\n )\n }\n }\n\n /**\n * Asserts that a service was auto-mocked (not in providers list).\n */\n expectAutoMocked(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n\n if (!this.autoMockedTokenIds.has(realToken.id)) {\n throw new Error(\n `Expected ${realToken.toString()} to be auto-mocked, but it was not. ` +\n `Either it's in the providers list or hasn't been resolved.`,\n )\n }\n }\n\n /**\n * Asserts that a service was NOT auto-mocked (is in providers list).\n */\n expectNotAutoMocked(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n\n if (this.autoMockedTokenIds.has(realToken.id)) {\n throw new Error(\n `Expected ${realToken.toString()} to NOT be auto-mocked, but it was.`,\n )\n }\n }\n\n // ============================================================================\n // LIFECYCLE ASSERTIONS\n // ============================================================================\n\n /**\n * Records a lifecycle event for tracking.\n */\n recordLifecycleEvent(\n token: AnyToken,\n event: 'created' | 'initialized' | 'destroyed',\n instanceName: string,\n ): void {\n const realToken = this.resolveToken(token)\n const events = this.lifecycleEvents.get(realToken.id) || []\n events.push({\n event,\n timestamp: Date.now(),\n instanceName,\n })\n this.lifecycleEvents.set(realToken.id, events)\n\n if (event === 'created') {\n const count = this.instanceCounts.get(realToken.id) || 0\n this.instanceCounts.set(realToken.id, count + 1)\n }\n }\n\n /**\n * Asserts that a service's onServiceInit was called.\n */\n expectInitialized(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n const events = this.lifecycleEvents.get(realToken.id) || []\n const initialized = events.some((e) => e.event === 'initialized')\n\n if (!initialized) {\n throw new Error(\n `Expected ${realToken.toString()} to be initialized, but onServiceInit was not called`,\n )\n }\n }\n\n /**\n * Asserts that a service's onServiceDestroy was called.\n */\n expectDestroyed(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n const events = this.lifecycleEvents.get(realToken.id) || []\n const destroyed = events.some((e) => e.event === 'destroyed')\n\n if (!destroyed) {\n throw new Error(\n `Expected ${realToken.toString()} to be destroyed, but onServiceDestroy was not called`,\n )\n }\n }\n\n /**\n * Asserts that a service has NOT been destroyed.\n */\n expectNotDestroyed(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n const events = this.lifecycleEvents.get(realToken.id) || []\n const destroyed = events.some((e) => e.event === 'destroyed')\n\n if (destroyed) {\n throw new Error(\n `Expected ${realToken.toString()} to NOT be destroyed, but onServiceDestroy was called`,\n )\n }\n }\n\n // ============================================================================\n // CALL TRACKING (AUTO-TRACKED VIA PROXY)\n // ============================================================================\n\n /**\n * Asserts that a method was called on a service.\n */\n expectCalled(token: AnyToken, method: string): void {\n const realToken = this.resolveToken(token)\n const calls = this.methodCalls.get(realToken.id) || []\n const found = calls.some((c) => c.method === method)\n\n if (!found) {\n throw new Error(\n `Expected ${realToken.toString()}.${method}() to be called, but it was not`,\n )\n }\n }\n\n /**\n * Asserts that a method was NOT called on a service.\n */\n expectNotCalled(token: AnyToken, method: string): void {\n const realToken = this.resolveToken(token)\n const calls = this.methodCalls.get(realToken.id) || []\n const found = calls.some((c) => c.method === method)\n\n if (found) {\n throw new Error(\n `Expected ${realToken.toString()}.${method}() to NOT be called, but it was`,\n )\n }\n }\n\n /**\n * Asserts that a method was called with specific arguments.\n */\n expectCalledWith(\n token: AnyToken,\n method: string,\n expectedArgs: unknown[],\n ): void {\n const realToken = this.resolveToken(token)\n const calls = this.methodCalls.get(realToken.id) || []\n const found = calls.some(\n (c) => c.method === method && this.argsMatch(c.args, expectedArgs),\n )\n\n if (!found) {\n const methodCalls = calls.filter((c) => c.method === method)\n const actualArgs = methodCalls\n .map((c) => JSON.stringify(c.args))\n .join(', ')\n throw new Error(\n `Expected ${realToken.toString()}.${method}() to be called with ${JSON.stringify(expectedArgs)}. ` +\n `Actual calls: [${actualArgs}]`,\n )\n }\n }\n\n /**\n * Asserts that a method was called a specific number of times.\n */\n expectCallCount(token: AnyToken, method: string, count: number): void {\n const realToken = this.resolveToken(token)\n const calls = this.methodCalls.get(realToken.id) || []\n const actualCount = calls.filter((c) => c.method === method).length\n\n if (actualCount !== count) {\n throw new Error(\n `Expected ${realToken.toString()}.${method}() to be called ${count} times, but was called ${actualCount} times`,\n )\n }\n }\n\n /**\n * Gets all recorded method calls for a service.\n */\n getMethodCalls(token: AnyToken): MethodCallRecord[] {\n const realToken = this.resolveToken(token)\n return this.methodCalls.get(realToken.id) || []\n }\n\n /**\n * Gets statistics about a service.\n */\n getServiceStats(token: AnyToken): MockServiceStats {\n const realToken = this.resolveToken(token)\n return {\n instanceCount: this.instanceCounts.get(realToken.id) || 0,\n methodCalls: this.methodCalls.get(realToken.id) || [],\n lifecycleEvents: this.lifecycleEvents.get(realToken.id) || [],\n }\n }\n\n /**\n * Clears all recorded method calls.\n */\n clearMethodCalls(): void {\n this.methodCalls.clear()\n }\n\n /**\n * Gets list of all registered provider token IDs.\n */\n getRegisteredTokenIds(): ReadonlySet<string> {\n return this.registeredTokenIds\n }\n\n /**\n * Gets list of all auto-mocked token IDs.\n */\n getAutoMockedTokenIds(): ReadonlySet<string> {\n return this.autoMockedTokenIds\n }\n\n // ============================================================================\n // INTERNAL HELPERS\n // ============================================================================\n\n private resolveToken(token: AnyToken): InjectionToken<any, any> {\n if (typeof token === 'function') {\n try {\n return getInjectableToken(token)\n } catch {\n // Class doesn't have @Injectable, create a token for it\n return InjectionToken.create(token)\n }\n }\n if (token instanceof BoundInjectionToken) {\n return token.token\n }\n return token\n }\n\n private registerProvider<T>(provider: ProviderConfig<T>): void {\n const providerToken = provider.token as AnyToken\n const realToken = this.resolveToken(providerToken)\n\n // Track both the real token ID and the bound token ID if it's a bound token\n this.registeredTokenIds.add(realToken.id)\n if (providerToken instanceof BoundInjectionToken) {\n this.registeredTokenIds.add(providerToken.id)\n }\n\n if (provider.useValue !== undefined) {\n this.registerValueBinding(realToken, provider.useValue)\n } else if (provider.useClass) {\n this.registerClassBinding(realToken, provider.useClass)\n } else if (provider.useFactory) {\n this.registerFactoryBinding(realToken, provider.useFactory)\n } else {\n // Just the token - register as itself\n if (typeof provider.token === 'function') {\n this.testRegistry.set(\n realToken,\n InjectableScope.Singleton,\n provider.token,\n InjectableType.Class,\n 1000, // Higher priority for test overrides\n )\n } else if (providerToken instanceof BoundInjectionToken) {\n // If it's a bound token without override, register the bound value\n this.registerValueBinding(realToken, providerToken.value)\n }\n }\n }\n\n private registerValueBinding<T>(\n token: InjectionToken<T, any>,\n value: T,\n ): void {\n const ValueHolder = class {\n create(): T {\n return value\n }\n }\n\n this.testRegistry.set(\n token,\n InjectableScope.Singleton,\n ValueHolder,\n InjectableType.Factory,\n 1000, // Higher priority for test overrides\n )\n\n const nameResolver = this.getNameResolver()\n const instanceName = nameResolver.generateInstanceName(\n token,\n undefined,\n undefined,\n InjectableScope.Singleton,\n )\n this.getStorage().storeInstance(instanceName, value)\n this.recordLifecycleEvent(token, 'created', instanceName)\n }\n\n private registerClassBinding<T>(\n token: InjectionToken<T, any>,\n cls: new (...args: any[]) => T,\n ): void {\n this.testRegistry.set(\n token,\n InjectableScope.Singleton,\n cls,\n InjectableType.Class,\n 1000, // Higher priority for test overrides\n )\n }\n\n private registerFactoryBinding<T>(\n token: InjectionToken<T, any>,\n factory: () => T | Promise<T>,\n ): void {\n const FactoryWrapper = class {\n static factory = factory\n async create(): Promise<T> {\n return await factory()\n }\n }\n\n this.testRegistry.set(\n token,\n InjectableScope.Singleton,\n FactoryWrapper,\n InjectableType.Factory,\n 1000, // Higher priority for test overrides\n )\n }\n\n private argsMatch(actual: unknown[], expected: unknown[]): boolean {\n if (actual.length !== expected.length) {\n return false\n }\n return actual.every((arg, index) => {\n const exp = expected[index]\n if (typeof exp === 'object' && exp !== null) {\n return JSON.stringify(arg) === JSON.stringify(exp)\n }\n return arg === exp\n })\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["Container","InjectableScope","InjectableType","BoundInjectionToken","globalRegistry","Registry","getInjectableToken","defaultInjectors","TestContainer","testRegistry","methodCalls","Map","lifecycleEvents","instanceCounts","boundTokens","Set","options","parentRegistry","logger","bind","token","realToken","resolveToken","tokenId","id","toValue","value","add","registerValueBinding","toClass","cls","registerClassBinding","toFactory","factory","registerFactoryBinding","clear","dispose","expectResolved","storage","getStorage","names","getAllNames","found","some","name","includes","Error","toString","expectNotResolved","expectSingleton","registry","getRegistry","has","record","get","scope","Singleton","expectTransient","Transient","expectRequestScoped","Request","expectSameInstance","instance1","instance2","expectDifferentInstances","expectInitialized","events","initialized","e","event","expectDestroyed","destroyed","expectNotDestroyed","recordMethodCall","method","args","result","error","calls","push","timestamp","Date","now","set","recordLifecycleEvent","instanceName","count","expectCalled","c","expectCalledWith","expectedArgs","argsMatch","JSON","stringify","expectCallCount","actualCount","filter","length","getMethodCalls","getServiceStats","instanceCount","clearMethodCalls","getDependencyGraph","nodes","rootTokens","forEach","holder","tokenMatch","match","dependencies","Array","from","deps","dependents","findDependents","getSimplifiedDependencyGraph","graph","dep","depTokenMatch","depTokenId","key","Object","keys","sort","ValueHolder","create","Factory","nameResolver","getNameResolver","generateInstanceName","undefined","storeInstance","Class","FactoryWrapper","actual","expected","every","arg","index","exp","Container","InjectableScope","InjectableType","DIError","BoundInjectionToken","InjectionToken","Registry","getInjectableToken","defaultInjectors","createTrackingProxy","target","tokenId","methodCalls","Proxy","get","obj","prop","value","Reflect","args","calls","record","method","timestamp","Date","now","result","apply","undefined","Promise","then","res","push","set","catch","err","error","createAutoMockProxy","_","Error","UnitTestContainer","testRegistry","Map","lifecycleEvents","instanceCounts","registeredTokenIds","Set","autoMockedTokenIds","allowUnregistered","options","logger","provider","providers","registerProvider","enableAutoMocking","disableAutoMocking","token","isBoundToken","id","realToken","resolveToken","isRegistered","has","factoryNotFound","toString","idToCheck","add","instance","trackingId","clear","dispose","expectResolved","storage","getStorage","names","getAllNames","found","some","name","includes","expectNotResolved","expectAutoMocked","expectNotAutoMocked","recordLifecycleEvent","event","instanceName","events","count","expectInitialized","initialized","e","expectDestroyed","destroyed","expectNotDestroyed","expectCalled","c","expectNotCalled","expectCalledWith","expectedArgs","argsMatch","filter","actualArgs","map","JSON","stringify","join","expectCallCount","actualCount","length","getMethodCalls","getServiceStats","instanceCount","clearMethodCalls","getRegisteredTokenIds","getAutoMockedTokenIds","create","providerToken","useValue","registerValueBinding","useClass","registerClassBinding","useFactory","registerFactoryBinding","Singleton","Class","ValueHolder","Factory","nameResolver","getNameResolver","generateInstanceName","storeInstance","cls","factory","FactoryWrapper","actual","expected","every","arg","index","exp"],"sources":["../../src/testing/test-container.mts","../../src/testing/unit-test-container.mts"],"sourcesContent":["import type {\n BindingBuilder,\n DependencyGraph,\n DependencyNode,\n LifecycleRecord,\n MethodCallRecord,\n MockServiceStats,\n TestContainerOptions,\n} from './types.mjs'\n\nimport { Container } from '../container/container.mjs'\nimport { InjectableScope, InjectableType } from '../enums/index.mjs'\nimport {\n BoundInjectionToken,\n InjectionToken,\n} from '../token/injection-token.mjs'\nimport { globalRegistry, Registry } from '../token/registry.mjs'\nimport { getInjectableToken } from '../utils/get-injectable-token.mjs'\nimport { defaultInjectors } from '../utils/index.mjs'\n\ntype AnyToken =\n | InjectionToken<any, any>\n | BoundInjectionToken<any, any>\n | (new (...args: any[]) => any)\n\n/**\n * TestContainer extends Container with testing utilities.\n *\n * Provides simple value/class binding for integration/e2e tests,\n * plus assertion helpers and dependency graph inspection.\n *\n * @example\n * ```ts\n * const container = new TestContainer()\n *\n * // Bind mock values\n * container.bind(DatabaseToken).toValue(mockDatabase)\n * container.bind(UserService).toClass(MockUserService)\n *\n * // Use container normally\n * const service = await container.get(MyService)\n *\n * // Assert on container state\n * container.expectResolved(MyService)\n * container.expectSingleton(MyService)\n * ```\n */\nexport class TestContainer extends Container {\n private readonly testRegistry: Registry\n private readonly methodCalls = new Map<string, MethodCallRecord[]>()\n private readonly lifecycleEvents = new Map<string, LifecycleRecord[]>()\n private readonly instanceCounts = new Map<string, number>()\n private readonly boundTokens = new Set<string>()\n\n /**\n * Creates a new TestContainer.\n *\n * @param options - Configuration options\n * @param options.parentRegistry - Parent registry. Defaults to globalRegistry.\n * Pass `null` for a completely isolated container.\n * @param options.logger - Optional logger for debugging.\n *\n * @example\n * ```ts\n * // Uses globalRegistry as parent (default)\n * const container = new TestContainer()\n *\n * // Isolated container (no access to @Injectable classes)\n * const isolated = new TestContainer({ parentRegistry: null })\n *\n * // Custom parent registry\n * const custom = new TestContainer({ parentRegistry: myRegistry })\n * ```\n */\n constructor(options: TestContainerOptions = {}) {\n const { parentRegistry = globalRegistry, logger = null } = options\n const testRegistry = parentRegistry\n ? new Registry(parentRegistry)\n : new Registry()\n super(testRegistry, logger, defaultInjectors)\n this.testRegistry = testRegistry\n }\n\n // ============================================================================\n // BINDING API\n // ============================================================================\n\n /**\n * Creates a binding builder for the given token.\n *\n * @example\n * ```ts\n * container.bind(UserService).toValue(mockUserService)\n * container.bind(DatabaseToken).toClass(MockDatabase)\n * container.bind(ConfigToken).toFactory(() => ({ apiKey: 'test' }))\n * container.bind(BOUND_CONFIG_TOKEN).toValue(overrideValue)\n * ```\n */\n bind<T>(\n token:\n | InjectionToken<T, any>\n | BoundInjectionToken<T, any>\n | (new (...args: any[]) => T),\n ): BindingBuilder<T> {\n const realToken = this.resolveToken(token)\n const tokenId = realToken.id\n\n return {\n toValue: (value: T) => {\n this.boundTokens.add(tokenId)\n this.registerValueBinding(realToken, value)\n },\n toClass: <C extends new (...args: any[]) => T>(cls: C) => {\n this.boundTokens.add(tokenId)\n this.registerClassBinding(realToken, cls)\n },\n toFactory: (factory: () => T | Promise<T>) => {\n this.boundTokens.add(tokenId)\n this.registerFactoryBinding(realToken, factory)\n },\n }\n }\n\n /**\n * Clears all bindings and resets container state.\n */\n async clear(): Promise<void> {\n await this.dispose()\n this.methodCalls.clear()\n this.lifecycleEvents.clear()\n this.instanceCounts.clear()\n this.boundTokens.clear()\n }\n\n // ============================================================================\n // ASSERTION HELPERS\n // ============================================================================\n\n /**\n * Asserts that a service has been resolved at least once.\n */\n expectResolved(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n const storage = this.getStorage()\n const names = storage.getAllNames()\n const found = names.some((name) => name.includes(realToken.id))\n\n if (!found) {\n throw new Error(\n `Expected ${realToken.toString()} to be resolved, but it was not`,\n )\n }\n }\n\n /**\n * Asserts that a service has NOT been resolved.\n */\n expectNotResolved(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n const storage = this.getStorage()\n const names = storage.getAllNames()\n const found = names.some((name) => name.includes(realToken.id))\n\n if (found) {\n throw new Error(\n `Expected ${realToken.toString()} to NOT be resolved, but it was`,\n )\n }\n }\n\n /**\n * Asserts that a service is registered as singleton scope.\n */\n expectSingleton(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n const registry = this.getRegistry()\n\n if (!registry.has(realToken)) {\n throw new Error(\n `Expected ${realToken.toString()} to be registered, but it was not`,\n )\n }\n\n const record = registry.get(realToken)\n if (record.scope !== InjectableScope.Singleton) {\n throw new Error(\n `Expected ${realToken.toString()} to be Singleton scope, but it was ${record.scope}`,\n )\n }\n }\n\n /**\n * Asserts that a service is registered as transient scope.\n */\n expectTransient(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n const registry = this.getRegistry()\n\n if (!registry.has(realToken)) {\n throw new Error(\n `Expected ${realToken.toString()} to be registered, but it was not`,\n )\n }\n\n const record = registry.get(realToken)\n if (record.scope !== InjectableScope.Transient) {\n throw new Error(\n `Expected ${realToken.toString()} to be Transient scope, but it was ${record.scope}`,\n )\n }\n }\n\n /**\n * Asserts that a service is registered as request scope.\n */\n expectRequestScoped(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n const registry = this.getRegistry()\n\n if (!registry.has(realToken)) {\n throw new Error(\n `Expected ${realToken.toString()} to be registered, but it was not`,\n )\n }\n\n const record = registry.get(realToken)\n if (record.scope !== InjectableScope.Request) {\n throw new Error(\n `Expected ${realToken.toString()} to be Request scope, but it was ${record.scope}`,\n )\n }\n }\n\n /**\n * Asserts that two service resolutions return the same instance.\n */\n async expectSameInstance(token: AnyToken): Promise<void> {\n const instance1 = await this.get(token as any)\n const instance2 = await this.get(token as any)\n\n if (instance1 !== instance2) {\n const realToken = this.resolveToken(token)\n throw new Error(\n `Expected ${realToken.toString()} to return same instance, but got different instances`,\n )\n }\n }\n\n /**\n * Asserts that two service resolutions return different instances.\n */\n async expectDifferentInstances(token: AnyToken): Promise<void> {\n const instance1 = await this.get(token as any)\n const instance2 = await this.get(token as any)\n\n if (instance1 === instance2) {\n const realToken = this.resolveToken(token)\n throw new Error(\n `Expected ${realToken.toString()} to return different instances, but got same instance`,\n )\n }\n }\n\n // ============================================================================\n // LIFECYCLE ASSERTIONS\n // ============================================================================\n\n /**\n * Asserts that a service's onServiceInit was called.\n */\n expectInitialized(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n const events = this.lifecycleEvents.get(realToken.id) || []\n const initialized = events.some((e) => e.event === 'initialized')\n\n if (!initialized) {\n throw new Error(\n `Expected ${realToken.toString()} to be initialized, but onServiceInit was not called`,\n )\n }\n }\n\n /**\n * Asserts that a service's onServiceDestroy was called.\n */\n expectDestroyed(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n const events = this.lifecycleEvents.get(realToken.id) || []\n const destroyed = events.some((e) => e.event === 'destroyed')\n\n if (!destroyed) {\n throw new Error(\n `Expected ${realToken.toString()} to be destroyed, but onServiceDestroy was not called`,\n )\n }\n }\n\n /**\n * Asserts that a service has NOT been destroyed.\n */\n expectNotDestroyed(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n const events = this.lifecycleEvents.get(realToken.id) || []\n const destroyed = events.some((e) => e.event === 'destroyed')\n\n if (destroyed) {\n throw new Error(\n `Expected ${realToken.toString()} to NOT be destroyed, but onServiceDestroy was called`,\n )\n }\n }\n\n // ============================================================================\n // CALL TRACKING\n // ============================================================================\n\n /**\n * Records a method call for tracking.\n * Call this from your mock implementations.\n */\n recordMethodCall(\n token: AnyToken,\n method: string,\n args: unknown[],\n result?: unknown,\n error?: Error,\n ): void {\n const realToken = this.resolveToken(token)\n const calls = this.methodCalls.get(realToken.id) || []\n calls.push({\n method,\n args,\n timestamp: Date.now(),\n result,\n error,\n })\n this.methodCalls.set(realToken.id, calls)\n }\n\n /**\n * Records a lifecycle event for tracking.\n */\n recordLifecycleEvent(\n token: AnyToken,\n event: 'created' | 'initialized' | 'destroyed',\n instanceName: string,\n ): void {\n const realToken = this.resolveToken(token)\n const events = this.lifecycleEvents.get(realToken.id) || []\n events.push({\n event,\n timestamp: Date.now(),\n instanceName,\n })\n this.lifecycleEvents.set(realToken.id, events)\n\n if (event === 'created') {\n const count = this.instanceCounts.get(realToken.id) || 0\n this.instanceCounts.set(realToken.id, count + 1)\n }\n }\n\n /**\n * Asserts that a method was called on a service.\n */\n expectCalled(token: AnyToken, method: string): void {\n const realToken = this.resolveToken(token)\n const calls = this.methodCalls.get(realToken.id) || []\n const found = calls.some((c) => c.method === method)\n\n if (!found) {\n throw new Error(\n `Expected ${realToken.toString()}.${method}() to be called, but it was not`,\n )\n }\n }\n\n /**\n * Asserts that a method was called with specific arguments.\n */\n expectCalledWith(\n token: AnyToken,\n method: string,\n expectedArgs: unknown[],\n ): void {\n const realToken = this.resolveToken(token)\n const calls = this.methodCalls.get(realToken.id) || []\n const found = calls.some(\n (c) => c.method === method && this.argsMatch(c.args, expectedArgs),\n )\n\n if (!found) {\n throw new Error(\n `Expected ${realToken.toString()}.${method}() to be called with ${JSON.stringify(expectedArgs)}, but it was not`,\n )\n }\n }\n\n /**\n * Asserts that a method was called a specific number of times.\n */\n expectCallCount(token: AnyToken, method: string, count: number): void {\n const realToken = this.resolveToken(token)\n const calls = this.methodCalls.get(realToken.id) || []\n const actualCount = calls.filter((c) => c.method === method).length\n\n if (actualCount !== count) {\n throw new Error(\n `Expected ${realToken.toString()}.${method}() to be called ${count} times, but was called ${actualCount} times`,\n )\n }\n }\n\n /**\n * Gets all recorded method calls for a service.\n */\n getMethodCalls(token: AnyToken): MethodCallRecord[] {\n const realToken = this.resolveToken(token)\n return this.methodCalls.get(realToken.id) || []\n }\n\n /**\n * Gets statistics about a mocked service.\n */\n getServiceStats(token: AnyToken): MockServiceStats {\n const realToken = this.resolveToken(token)\n return {\n instanceCount: this.instanceCounts.get(realToken.id) || 0,\n methodCalls: this.methodCalls.get(realToken.id) || [],\n lifecycleEvents: this.lifecycleEvents.get(realToken.id) || [],\n }\n }\n\n /**\n * Clears all recorded method calls.\n */\n clearMethodCalls(): void {\n this.methodCalls.clear()\n }\n\n // ============================================================================\n // DEPENDENCY GRAPH\n // ============================================================================\n\n /**\n * Gets the dependency graph for snapshot testing.\n * Returns a serializable structure that can be used with vitest snapshots.\n */\n getDependencyGraph(): DependencyGraph {\n const storage = this.getStorage()\n const nodes: Record<string, DependencyNode> = {}\n const rootTokens: string[] = []\n\n storage.forEach((name, holder) => {\n const tokenMatch = name.match(/^([^:]+)/)\n const tokenId = tokenMatch ? tokenMatch[1] : name\n\n nodes[name] = {\n token: tokenId,\n instanceName: name,\n scope: holder.scope,\n dependencies: Array.from(holder.deps),\n dependents: storage.findDependents(name),\n }\n\n // Root tokens have no dependents\n if (storage.findDependents(name).length === 0) {\n rootTokens.push(name)\n }\n })\n\n return { nodes, rootTokens }\n }\n\n /**\n * Gets a simplified dependency graph showing only token relationships.\n * Useful for cleaner snapshot comparisons.\n */\n getSimplifiedDependencyGraph(): Record<string, string[]> {\n const storage = this.getStorage()\n const graph: Record<string, string[]> = {}\n\n storage.forEach((name, holder) => {\n const tokenMatch = name.match(/^([^:]+)/)\n const tokenId = tokenMatch ? tokenMatch[1] : name\n\n if (!graph[tokenId]) {\n graph[tokenId] = []\n }\n\n for (const dep of holder.deps) {\n const depTokenMatch = dep.match(/^([^:]+)/)\n const depTokenId = depTokenMatch ? depTokenMatch[1] : dep\n if (!graph[tokenId].includes(depTokenId)) {\n graph[tokenId].push(depTokenId)\n }\n }\n })\n\n // Sort for consistent snapshots\n for (const key of Object.keys(graph)) {\n graph[key].sort()\n }\n\n return graph\n }\n\n // ============================================================================\n // INTERNAL HELPERS\n // ============================================================================\n\n private resolveToken(token: AnyToken): InjectionToken<any, any> {\n if (typeof token === 'function') {\n return getInjectableToken(token)\n }\n if (token instanceof BoundInjectionToken) {\n return token.token\n }\n return token\n }\n\n private registerValueBinding<T>(\n token: InjectionToken<T, any>,\n value: T,\n ): void {\n // Create a simple class that returns the value\n const ValueHolder = class {\n create(): T {\n return value\n }\n }\n\n this.testRegistry.set(\n token,\n InjectableScope.Singleton,\n ValueHolder,\n InjectableType.Factory,\n 1000, // Higher priority for test overrides\n )\n\n // Store the instance directly\n const nameResolver = this.getNameResolver()\n const instanceName = nameResolver.generateInstanceName(\n token,\n undefined,\n undefined,\n InjectableScope.Singleton,\n )\n this.getStorage().storeInstance(instanceName, value)\n this.recordLifecycleEvent(token, 'created', instanceName)\n }\n\n private registerClassBinding<T>(\n token: InjectionToken<T, any>,\n cls: new (...args: any[]) => T,\n ): void {\n this.testRegistry.set(\n token,\n InjectableScope.Singleton,\n cls,\n InjectableType.Class,\n 1000, // Higher priority for test overrides\n )\n }\n\n private registerFactoryBinding<T>(\n token: InjectionToken<T, any>,\n factory: () => T | Promise<T>,\n ): void {\n // Create a factory class wrapper\n const FactoryWrapper = class {\n static factory = factory\n async create(): Promise<T> {\n return await factory()\n }\n }\n\n this.testRegistry.set(\n token,\n InjectableScope.Singleton,\n FactoryWrapper,\n InjectableType.Factory,\n 1000, // Higher priority for test overrides\n )\n }\n\n private argsMatch(actual: unknown[], expected: unknown[]): boolean {\n if (actual.length !== expected.length) {\n return false\n }\n return actual.every((arg, index) => {\n const exp = expected[index]\n if (typeof exp === 'object' && exp !== null) {\n return JSON.stringify(arg) === JSON.stringify(exp)\n }\n return arg === exp\n })\n }\n}\n","import type {\n LifecycleRecord,\n MethodCallRecord,\n MockServiceStats,\n ProviderConfig,\n UnitTestContainerOptions,\n} from './types.mjs'\n\nimport { Container } from '../container/container.mjs'\nimport { InjectableScope, InjectableType } from '../enums/index.mjs'\nimport { DIError } from '../errors/index.mjs'\nimport {\n BoundInjectionToken,\n InjectionToken,\n} from '../token/injection-token.mjs'\nimport { Registry } from '../token/registry.mjs'\nimport { getInjectableToken } from '../utils/get-injectable-token.mjs'\nimport { defaultInjectors } from '../utils/index.mjs'\n\ntype AnyToken =\n | InjectionToken<any, any>\n | BoundInjectionToken<any, any>\n | (new (...args: any[]) => any)\n\n/**\n * Creates a tracking proxy that records method calls.\n */\nfunction createTrackingProxy<T extends object>(\n target: T,\n tokenId: string,\n methodCalls: Map<string, MethodCallRecord[]>,\n): T {\n return new Proxy(target, {\n get(obj, prop) {\n const value = Reflect.get(obj, prop)\n\n if (typeof value === 'function' && typeof prop === 'string') {\n return function (this: unknown, ...args: unknown[]) {\n const calls = methodCalls.get(tokenId) || []\n const record: MethodCallRecord = {\n method: prop,\n args,\n timestamp: Date.now(),\n }\n\n try {\n const result = value.apply(this === undefined ? obj : this, args)\n\n if (result instanceof Promise) {\n return result\n .then((res) => {\n record.result = res\n calls.push(record)\n methodCalls.set(tokenId, calls)\n return res\n })\n .catch((err) => {\n record.error = err\n calls.push(record)\n methodCalls.set(tokenId, calls)\n throw err\n })\n }\n\n record.result = result\n calls.push(record)\n methodCalls.set(tokenId, calls)\n return result\n } catch (err) {\n record.error = err as Error\n calls.push(record)\n methodCalls.set(tokenId, calls)\n throw err\n }\n }\n }\n\n return value\n },\n })\n}\n\n/**\n * Creates an auto-mock proxy that throws on method access.\n */\nfunction createAutoMockProxy(tokenId: string): object {\n return new Proxy(\n {},\n {\n get(_, prop) {\n if (prop === 'then' || prop === 'catch' || prop === 'finally') {\n return undefined\n }\n if (typeof prop === 'symbol') {\n return undefined\n }\n throw new Error(\n `[UnitTestContainer] Attempted to access '${prop}' on auto-mocked service '${tokenId}'. ` +\n `This service was not provided in the providers list. ` +\n `Add it to providers or use allowUnregistered: false to catch this earlier.`,\n )\n },\n },\n )\n}\n\n/**\n * UnitTestContainer for isolated unit testing.\n *\n * Only services explicitly listed in `providers` can be resolved.\n * All method calls are automatically tracked via proxies.\n * Unregistered dependencies throw by default, or can be auto-mocked.\n *\n * @example\n * ```ts\n * const container = new UnitTestContainer({\n * providers: [\n * { token: UserService, useClass: MockUserService },\n * { token: ConfigToken, useValue: { apiUrl: 'test' } },\n * ],\n * })\n *\n * const service = await container.get(UserService)\n *\n * // All method calls are automatically tracked\n * await service.findUser('123')\n *\n * container.expectCalled(UserService, 'findUser')\n * container.expectCalledWith(UserService, 'findUser', ['123'])\n * ```\n */\nexport class UnitTestContainer extends Container {\n private readonly testRegistry: Registry\n private readonly methodCalls = new Map<string, MethodCallRecord[]>()\n private readonly lifecycleEvents = new Map<string, LifecycleRecord[]>()\n private readonly instanceCounts = new Map<string, number>()\n private readonly registeredTokenIds = new Set<string>()\n private readonly autoMockedTokenIds = new Set<string>()\n private allowUnregistered: boolean\n\n constructor(options: UnitTestContainerOptions) {\n const testRegistry = new Registry()\n super(testRegistry, options.logger ?? null, defaultInjectors)\n this.testRegistry = testRegistry\n this.allowUnregistered = options.allowUnregistered ?? false\n\n // Register all providers\n for (const provider of options.providers) {\n this.registerProvider(provider)\n }\n }\n\n /**\n * Enables auto-mocking for unregistered dependencies.\n * Call this to switch from strict mode to auto-mock mode.\n */\n enableAutoMocking(): this {\n this.allowUnregistered = true\n return this\n }\n\n /**\n * Disables auto-mocking (strict mode).\n * Unregistered dependencies will throw.\n */\n disableAutoMocking(): this {\n this.allowUnregistered = false\n return this\n }\n\n /**\n * Override get to wrap instances in tracking proxies.\n */\n override async get(token: any, args?: unknown): Promise<any> {\n // Check if token is a BoundInjectionToken and if it's registered\n const isBoundToken = token instanceof BoundInjectionToken\n const tokenId = isBoundToken ? token.id : undefined\n const realToken = this.resolveToken(token)\n\n // Check if this is a registered provider (check both bound token ID and real token ID)\n const isRegistered =\n (tokenId && this.registeredTokenIds.has(tokenId)) ||\n this.registeredTokenIds.has(realToken.id)\n\n if (!isRegistered) {\n if (!this.allowUnregistered) {\n throw DIError.factoryNotFound(\n `${realToken.toString()} is not in the providers list. ` +\n `Add it to providers or enable allowUnregistered.`,\n )\n }\n\n // Auto-mock unregistered dependency\n const idToCheck = tokenId || realToken.id\n if (!this.autoMockedTokenIds.has(idToCheck)) {\n this.autoMockedTokenIds.add(idToCheck)\n }\n\n return createAutoMockProxy(idToCheck)\n }\n\n const instance = await super.get(token, args)\n\n // Wrap in tracking proxy if it's an object\n const trackingId = tokenId || realToken.id\n if (instance && typeof instance === 'object') {\n return createTrackingProxy(instance, trackingId, this.methodCalls)\n }\n\n return instance\n }\n\n /**\n * Clears all state and disposes the container.\n */\n async clear(): Promise<void> {\n await this.dispose()\n this.methodCalls.clear()\n this.lifecycleEvents.clear()\n this.instanceCounts.clear()\n this.autoMockedTokenIds.clear()\n }\n\n // ============================================================================\n // ASSERTION HELPERS\n // ============================================================================\n\n /**\n * Asserts that a service has been resolved at least once.\n */\n expectResolved(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n const storage = this.getStorage()\n const names = storage.getAllNames()\n const found = names.some((name) => name.includes(realToken.id))\n\n if (!found) {\n throw new Error(\n `Expected ${realToken.toString()} to be resolved, but it was not`,\n )\n }\n }\n\n /**\n * Asserts that a service has NOT been resolved.\n */\n expectNotResolved(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n const storage = this.getStorage()\n const names = storage.getAllNames()\n const found = names.some((name) => name.includes(realToken.id))\n\n if (found) {\n throw new Error(\n `Expected ${realToken.toString()} to NOT be resolved, but it was`,\n )\n }\n }\n\n /**\n * Asserts that a service was auto-mocked (not in providers list).\n */\n expectAutoMocked(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n\n if (!this.autoMockedTokenIds.has(realToken.id)) {\n throw new Error(\n `Expected ${realToken.toString()} to be auto-mocked, but it was not. ` +\n `Either it's in the providers list or hasn't been resolved.`,\n )\n }\n }\n\n /**\n * Asserts that a service was NOT auto-mocked (is in providers list).\n */\n expectNotAutoMocked(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n\n if (this.autoMockedTokenIds.has(realToken.id)) {\n throw new Error(\n `Expected ${realToken.toString()} to NOT be auto-mocked, but it was.`,\n )\n }\n }\n\n // ============================================================================\n // LIFECYCLE ASSERTIONS\n // ============================================================================\n\n /**\n * Records a lifecycle event for tracking.\n */\n recordLifecycleEvent(\n token: AnyToken,\n event: 'created' | 'initialized' | 'destroyed',\n instanceName: string,\n ): void {\n const realToken = this.resolveToken(token)\n const events = this.lifecycleEvents.get(realToken.id) || []\n events.push({\n event,\n timestamp: Date.now(),\n instanceName,\n })\n this.lifecycleEvents.set(realToken.id, events)\n\n if (event === 'created') {\n const count = this.instanceCounts.get(realToken.id) || 0\n this.instanceCounts.set(realToken.id, count + 1)\n }\n }\n\n /**\n * Asserts that a service's onServiceInit was called.\n */\n expectInitialized(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n const events = this.lifecycleEvents.get(realToken.id) || []\n const initialized = events.some((e) => e.event === 'initialized')\n\n if (!initialized) {\n throw new Error(\n `Expected ${realToken.toString()} to be initialized, but onServiceInit was not called`,\n )\n }\n }\n\n /**\n * Asserts that a service's onServiceDestroy was called.\n */\n expectDestroyed(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n const events = this.lifecycleEvents.get(realToken.id) || []\n const destroyed = events.some((e) => e.event === 'destroyed')\n\n if (!destroyed) {\n throw new Error(\n `Expected ${realToken.toString()} to be destroyed, but onServiceDestroy was not called`,\n )\n }\n }\n\n /**\n * Asserts that a service has NOT been destroyed.\n */\n expectNotDestroyed(token: AnyToken): void {\n const realToken = this.resolveToken(token)\n const events = this.lifecycleEvents.get(realToken.id) || []\n const destroyed = events.some((e) => e.event === 'destroyed')\n\n if (destroyed) {\n throw new Error(\n `Expected ${realToken.toString()} to NOT be destroyed, but onServiceDestroy was called`,\n )\n }\n }\n\n // ============================================================================\n // CALL TRACKING (AUTO-TRACKED VIA PROXY)\n // ============================================================================\n\n /**\n * Asserts that a method was called on a service.\n */\n expectCalled(token: AnyToken, method: string): void {\n const realToken = this.resolveToken(token)\n const calls = this.methodCalls.get(realToken.id) || []\n const found = calls.some((c) => c.method === method)\n\n if (!found) {\n throw new Error(\n `Expected ${realToken.toString()}.${method}() to be called, but it was not`,\n )\n }\n }\n\n /**\n * Asserts that a method was NOT called on a service.\n */\n expectNotCalled(token: AnyToken, method: string): void {\n const realToken = this.resolveToken(token)\n const calls = this.methodCalls.get(realToken.id) || []\n const found = calls.some((c) => c.method === method)\n\n if (found) {\n throw new Error(\n `Expected ${realToken.toString()}.${method}() to NOT be called, but it was`,\n )\n }\n }\n\n /**\n * Asserts that a method was called with specific arguments.\n */\n expectCalledWith(\n token: AnyToken,\n method: string,\n expectedArgs: unknown[],\n ): void {\n const realToken = this.resolveToken(token)\n const calls = this.methodCalls.get(realToken.id) || []\n const found = calls.some(\n (c) => c.method === method && this.argsMatch(c.args, expectedArgs),\n )\n\n if (!found) {\n const methodCalls = calls.filter((c) => c.method === method)\n const actualArgs = methodCalls\n .map((c) => JSON.stringify(c.args))\n .join(', ')\n throw new Error(\n `Expected ${realToken.toString()}.${method}() to be called with ${JSON.stringify(expectedArgs)}. ` +\n `Actual calls: [${actualArgs}]`,\n )\n }\n }\n\n /**\n * Asserts that a method was called a specific number of times.\n */\n expectCallCount(token: AnyToken, method: string, count: number): void {\n const realToken = this.resolveToken(token)\n const calls = this.methodCalls.get(realToken.id) || []\n const actualCount = calls.filter((c) => c.method === method).length\n\n if (actualCount !== count) {\n throw new Error(\n `Expected ${realToken.toString()}.${method}() to be called ${count} times, but was called ${actualCount} times`,\n )\n }\n }\n\n /**\n * Gets all recorded method calls for a service.\n */\n getMethodCalls(token: AnyToken): MethodCallRecord[] {\n const realToken = this.resolveToken(token)\n return this.methodCalls.get(realToken.id) || []\n }\n\n /**\n * Gets statistics about a service.\n */\n getServiceStats(token: AnyToken): MockServiceStats {\n const realToken = this.resolveToken(token)\n return {\n instanceCount: this.instanceCounts.get(realToken.id) || 0,\n methodCalls: this.methodCalls.get(realToken.id) || [],\n lifecycleEvents: this.lifecycleEvents.get(realToken.id) || [],\n }\n }\n\n /**\n * Clears all recorded method calls.\n */\n clearMethodCalls(): void {\n this.methodCalls.clear()\n }\n\n /**\n * Gets list of all registered provider token IDs.\n */\n getRegisteredTokenIds(): ReadonlySet<string> {\n return this.registeredTokenIds\n }\n\n /**\n * Gets list of all auto-mocked token IDs.\n */\n getAutoMockedTokenIds(): ReadonlySet<string> {\n return this.autoMockedTokenIds\n }\n\n // ============================================================================\n // INTERNAL HELPERS\n // ============================================================================\n\n private resolveToken(token: AnyToken): InjectionToken<any, any> {\n if (typeof token === 'function') {\n try {\n return getInjectableToken(token)\n } catch {\n // Class doesn't have @Injectable, create a token for it\n return InjectionToken.create(token)\n }\n }\n if (token instanceof BoundInjectionToken) {\n return token.token\n }\n return token\n }\n\n private registerProvider<T>(provider: ProviderConfig<T>): void {\n const providerToken = provider.token as AnyToken\n const realToken = this.resolveToken(providerToken)\n\n // Track both the real token ID and the bound token ID if it's a bound token\n this.registeredTokenIds.add(realToken.id)\n if (providerToken instanceof BoundInjectionToken) {\n this.registeredTokenIds.add(providerToken.id)\n }\n\n if (provider.useValue !== undefined) {\n this.registerValueBinding(realToken, provider.useValue)\n } else if (provider.useClass) {\n this.registerClassBinding(realToken, provider.useClass)\n } else if (provider.useFactory) {\n this.registerFactoryBinding(realToken, provider.useFactory)\n } else {\n // Just the token - register as itself\n if (typeof provider.token === 'function') {\n this.testRegistry.set(\n realToken,\n InjectableScope.Singleton,\n provider.token,\n InjectableType.Class,\n 1000, // Higher priority for test overrides\n )\n } else if (providerToken instanceof BoundInjectionToken) {\n // If it's a bound token without override, register the bound value\n this.registerValueBinding(realToken, providerToken.value)\n }\n }\n }\n\n private registerValueBinding<T>(\n token: InjectionToken<T, any>,\n value: T,\n ): void {\n const ValueHolder = class {\n create(): T {\n return value\n }\n }\n\n this.testRegistry.set(\n token,\n InjectableScope.Singleton,\n ValueHolder,\n InjectableType.Factory,\n 1000, // Higher priority for test overrides\n )\n\n const nameResolver = this.getNameResolver()\n const instanceName = nameResolver.generateInstanceName(\n token,\n undefined,\n undefined,\n InjectableScope.Singleton,\n )\n this.getStorage().storeInstance(instanceName, value)\n this.recordLifecycleEvent(token, 'created', instanceName)\n }\n\n private registerClassBinding<T>(\n token: InjectionToken<T, any>,\n cls: new (...args: any[]) => T,\n ): void {\n this.testRegistry.set(\n token,\n InjectableScope.Singleton,\n cls,\n InjectableType.Class,\n 1000, // Higher priority for test overrides\n )\n }\n\n private registerFactoryBinding<T>(\n token: InjectionToken<T, any>,\n factory: () => T | Promise<T>,\n ): void {\n const FactoryWrapper = class {\n static factory = factory\n async create(): Promise<T> {\n return await factory()\n }\n }\n\n this.testRegistry.set(\n token,\n InjectableScope.Singleton,\n FactoryWrapper,\n InjectableType.Factory,\n 1000, // Higher priority for test overrides\n )\n }\n\n private argsMatch(actual: unknown[], expected: unknown[]): boolean {\n if (actual.length !== expected.length) {\n return false\n }\n return actual.every((arg, index) => {\n const exp = expected[index]\n if (typeof exp === 'object' && exp !== null) {\n return JSON.stringify(arg) === JSON.stringify(exp)\n }\n return arg === exp\n })\n }\n}\n"],"mappings":"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"}
|
package/lib/testing/index.d.cts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { C as BoundInjectionToken, M as InjectionToken, n as Registry } from "../registry-DKbKWFvJ.cjs";
|
|
2
|
+
import { t as Container } from "../container-r1KP4F-n.cjs";
|
|
2
3
|
|
|
3
4
|
//#region src/testing/types.d.mts
|
|
4
5
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/testing/types.mts","../../src/testing/test-container.mts","../../src/testing/unit-test-container.mts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/testing/types.mts","../../src/testing/test-container.mts","../../src/testing/unit-test-container.mts"],"sourcesContent":[],"mappings":"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"}
|
package/lib/testing/index.d.mts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { C as BoundInjectionToken, M as InjectionToken, n as Registry } from "../registry-n8JhJoxm.mjs";
|
|
2
|
+
import { t as Container } from "../container-D3j3KuD9.mjs";
|
|
2
3
|
|
|
3
4
|
//#region src/testing/types.d.mts
|
|
4
5
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/testing/types.mts","../../src/testing/test-container.mts","../../src/testing/unit-test-container.mts"],"sourcesContent":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/testing/types.mts","../../src/testing/test-container.mts","../../src/testing/unit-test-container.mts"],"sourcesContent":[],"mappings":"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"}
|
package/lib/testing/index.mjs
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { c as InjectableType, i as BoundInjectionToken, l as InjectableScope, n as Registry, o as InjectionToken, r as globalRegistry } from "../injectable.decorator-CyPrBzBN.mjs";
|
|
2
|
+
import { D as DIError, l as defaultInjectors, s as getInjectableToken, t as _Container } from "../container-qgHMgGNG.mjs";
|
|
2
3
|
|
|
3
4
|
//#region src/testing/test-container.mts
|
|
4
5
|
/**
|