@navios/di 0.7.1 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +110 -0
- package/README.md +117 -17
- package/lib/browser/container/abstract-container.d.mts +112 -0
- package/lib/browser/container/abstract-container.d.mts.map +1 -0
- package/lib/browser/container/abstract-container.mjs +100 -0
- package/lib/browser/container/abstract-container.mjs.map +1 -0
- package/lib/browser/container/container.d.mts +100 -0
- package/lib/browser/container/container.d.mts.map +1 -0
- package/lib/browser/container/container.mjs +424 -0
- package/lib/browser/container/container.mjs.map +1 -0
- package/lib/browser/container/scoped-container.d.mts +93 -0
- package/lib/browser/container/scoped-container.d.mts.map +1 -0
- package/lib/browser/container/scoped-container.mjs +119 -0
- package/lib/browser/container/scoped-container.mjs.map +1 -0
- package/lib/browser/decorators/factory.decorator.d.mts +26 -0
- package/lib/browser/decorators/factory.decorator.d.mts.map +1 -0
- package/lib/browser/decorators/factory.decorator.mjs +20 -0
- package/lib/browser/decorators/factory.decorator.mjs.map +1 -0
- package/lib/browser/decorators/injectable.decorator.d.mts +38 -0
- package/lib/browser/decorators/injectable.decorator.d.mts.map +1 -0
- package/lib/browser/decorators/injectable.decorator.mjs +21 -0
- package/lib/browser/decorators/injectable.decorator.mjs.map +1 -0
- package/lib/browser/enums/injectable-scope.enum.d.mts +18 -0
- package/lib/browser/enums/injectable-scope.enum.d.mts.map +1 -0
- package/lib/browser/enums/injectable-scope.enum.mjs +20 -0
- package/lib/browser/enums/injectable-scope.enum.mjs.map +1 -0
- package/lib/browser/enums/injectable-type.enum.d.mts +8 -0
- package/lib/browser/enums/injectable-type.enum.d.mts.map +1 -0
- package/lib/browser/enums/injectable-type.enum.mjs +10 -0
- package/lib/browser/enums/injectable-type.enum.mjs.map +1 -0
- package/lib/browser/errors/di-error.d.mts +43 -0
- package/lib/browser/errors/di-error.d.mts.map +1 -0
- package/lib/browser/errors/di-error.mjs +98 -0
- package/lib/browser/errors/di-error.mjs.map +1 -0
- package/lib/browser/event-emitter.d.mts +16 -0
- package/lib/browser/event-emitter.d.mts.map +1 -0
- package/lib/browser/event-emitter.mjs +320 -0
- package/lib/browser/event-emitter.mjs.map +1 -0
- package/lib/browser/index.d.mts +37 -1508
- package/lib/browser/index.mjs +29 -2650
- package/lib/browser/interfaces/container.interface.d.mts +59 -0
- package/lib/browser/interfaces/container.interface.d.mts.map +1 -0
- package/lib/browser/interfaces/factory.interface.d.mts +14 -0
- package/lib/browser/interfaces/factory.interface.d.mts.map +1 -0
- package/lib/browser/interfaces/on-service-destroy.interface.d.mts +7 -0
- package/lib/browser/interfaces/on-service-destroy.interface.d.mts.map +1 -0
- package/lib/browser/interfaces/on-service-init.interface.d.mts +7 -0
- package/lib/browser/interfaces/on-service-init.interface.d.mts.map +1 -0
- package/lib/browser/internal/context/async-local-storage.browser.mjs +20 -0
- package/lib/browser/internal/context/async-local-storage.browser.mjs.map +1 -0
- package/lib/browser/internal/context/async-local-storage.d.mts +9 -0
- package/lib/browser/internal/context/async-local-storage.d.mts.map +1 -0
- package/lib/browser/internal/context/async-local-storage.types.d.mts +11 -0
- package/lib/browser/internal/context/async-local-storage.types.d.mts.map +1 -0
- package/lib/browser/internal/context/factory-context.d.mts +23 -0
- package/lib/browser/internal/context/factory-context.d.mts.map +1 -0
- package/lib/browser/internal/context/resolution-context.d.mts +43 -0
- package/lib/browser/internal/context/resolution-context.d.mts.map +1 -0
- package/lib/browser/internal/context/resolution-context.mjs +56 -0
- package/lib/browser/internal/context/resolution-context.mjs.map +1 -0
- package/lib/browser/internal/context/service-initialization-context.d.mts +48 -0
- package/lib/browser/internal/context/service-initialization-context.d.mts.map +1 -0
- package/lib/browser/internal/context/sync-local-storage.mjs +53 -0
- package/lib/browser/internal/context/sync-local-storage.mjs.map +1 -0
- package/lib/browser/internal/core/instance-resolver.d.mts +119 -0
- package/lib/browser/internal/core/instance-resolver.d.mts.map +1 -0
- package/lib/browser/internal/core/instance-resolver.mjs +306 -0
- package/lib/browser/internal/core/instance-resolver.mjs.map +1 -0
- package/lib/browser/internal/core/name-resolver.d.mts +52 -0
- package/lib/browser/internal/core/name-resolver.d.mts.map +1 -0
- package/lib/browser/internal/core/name-resolver.mjs +118 -0
- package/lib/browser/internal/core/name-resolver.mjs.map +1 -0
- package/lib/browser/internal/core/scope-tracker.d.mts +65 -0
- package/lib/browser/internal/core/scope-tracker.d.mts.map +1 -0
- package/lib/browser/internal/core/scope-tracker.mjs +120 -0
- package/lib/browser/internal/core/scope-tracker.mjs.map +1 -0
- package/lib/browser/internal/core/service-initializer.d.mts +44 -0
- package/lib/browser/internal/core/service-initializer.d.mts.map +1 -0
- package/lib/browser/internal/core/service-initializer.mjs +109 -0
- package/lib/browser/internal/core/service-initializer.mjs.map +1 -0
- package/lib/browser/internal/core/service-invalidator.d.mts +81 -0
- package/lib/browser/internal/core/service-invalidator.d.mts.map +1 -0
- package/lib/browser/internal/core/service-invalidator.mjs +142 -0
- package/lib/browser/internal/core/service-invalidator.mjs.map +1 -0
- package/lib/browser/internal/core/token-resolver.d.mts +54 -0
- package/lib/browser/internal/core/token-resolver.d.mts.map +1 -0
- package/lib/browser/internal/core/token-resolver.mjs +77 -0
- package/lib/browser/internal/core/token-resolver.mjs.map +1 -0
- package/lib/browser/internal/holder/holder-storage.interface.d.mts +99 -0
- package/lib/browser/internal/holder/holder-storage.interface.d.mts.map +1 -0
- package/lib/browser/internal/holder/instance-holder.d.mts +101 -0
- package/lib/browser/internal/holder/instance-holder.d.mts.map +1 -0
- package/lib/browser/internal/holder/instance-holder.mjs +19 -0
- package/lib/browser/internal/holder/instance-holder.mjs.map +1 -0
- package/lib/browser/internal/holder/unified-storage.d.mts +53 -0
- package/lib/browser/internal/holder/unified-storage.d.mts.map +1 -0
- package/lib/browser/internal/holder/unified-storage.mjs +144 -0
- package/lib/browser/internal/holder/unified-storage.mjs.map +1 -0
- package/lib/browser/internal/lifecycle/circular-detector.d.mts +39 -0
- package/lib/browser/internal/lifecycle/circular-detector.d.mts.map +1 -0
- package/lib/browser/internal/lifecycle/circular-detector.mjs +55 -0
- package/lib/browser/internal/lifecycle/circular-detector.mjs.map +1 -0
- package/lib/browser/internal/lifecycle/lifecycle-event-bus.d.mts +18 -0
- package/lib/browser/internal/lifecycle/lifecycle-event-bus.d.mts.map +1 -0
- package/lib/browser/internal/lifecycle/lifecycle-event-bus.mjs +43 -0
- package/lib/browser/internal/lifecycle/lifecycle-event-bus.mjs.map +1 -0
- package/lib/browser/internal/stub-factory-class.d.mts +14 -0
- package/lib/browser/internal/stub-factory-class.d.mts.map +1 -0
- package/lib/browser/internal/stub-factory-class.mjs +18 -0
- package/lib/browser/internal/stub-factory-class.mjs.map +1 -0
- package/lib/browser/symbols/injectable-token.d.mts +5 -0
- package/lib/browser/symbols/injectable-token.d.mts.map +1 -0
- package/lib/browser/symbols/injectable-token.mjs +6 -0
- package/lib/browser/symbols/injectable-token.mjs.map +1 -0
- package/lib/browser/token/injection-token.d.mts +55 -0
- package/lib/browser/token/injection-token.d.mts.map +1 -0
- package/lib/browser/token/injection-token.mjs +100 -0
- package/lib/browser/token/injection-token.mjs.map +1 -0
- package/lib/browser/token/registry.d.mts +37 -0
- package/lib/browser/token/registry.d.mts.map +1 -0
- package/lib/browser/token/registry.mjs +86 -0
- package/lib/browser/token/registry.mjs.map +1 -0
- package/lib/browser/utils/default-injectors.d.mts +12 -0
- package/lib/browser/utils/default-injectors.d.mts.map +1 -0
- package/lib/browser/utils/default-injectors.mjs +13 -0
- package/lib/browser/utils/default-injectors.mjs.map +1 -0
- package/lib/browser/utils/get-injectable-token.d.mts +9 -0
- package/lib/browser/utils/get-injectable-token.d.mts.map +1 -0
- package/lib/browser/utils/get-injectable-token.mjs +13 -0
- package/lib/browser/utils/get-injectable-token.mjs.map +1 -0
- package/lib/browser/utils/get-injectors.d.mts +55 -0
- package/lib/browser/utils/get-injectors.d.mts.map +1 -0
- package/lib/browser/utils/get-injectors.mjs +121 -0
- package/lib/browser/utils/get-injectors.mjs.map +1 -0
- package/lib/browser/utils/types.d.mts +23 -0
- package/lib/browser/utils/types.d.mts.map +1 -0
- package/lib/{container-Pb_Y4Z4x.mjs → container-8-z89TyQ.mjs} +1269 -1305
- package/lib/container-8-z89TyQ.mjs.map +1 -0
- package/lib/{container-BuAutHGg.d.mts → container-CNiqesCL.d.mts} +600 -569
- package/lib/container-CNiqesCL.d.mts.map +1 -0
- package/lib/{container-DnzgpfBe.cjs → container-CaY2fDuk.cjs} +1287 -1329
- package/lib/container-CaY2fDuk.cjs.map +1 -0
- package/lib/{container-oGTgX2iX.d.cts → container-D-0Ho3qL.d.cts} +601 -565
- package/lib/container-D-0Ho3qL.d.cts.map +1 -0
- package/lib/index.cjs +13 -15
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +58 -223
- package/lib/index.d.cts.map +1 -1
- package/lib/index.d.mts +62 -222
- package/lib/index.d.mts.map +1 -1
- package/lib/index.mjs +5 -6
- package/lib/index.mjs.map +1 -1
- package/lib/testing/index.cjs +569 -311
- package/lib/testing/index.cjs.map +1 -1
- package/lib/testing/index.d.cts +370 -41
- package/lib/testing/index.d.cts.map +1 -1
- package/lib/testing/index.d.mts +370 -41
- package/lib/testing/index.d.mts.map +1 -1
- package/lib/testing/index.mjs +568 -305
- package/lib/testing/index.mjs.map +1 -1
- package/package.json +2 -1
- package/src/__tests__/circular-detector.spec.mts +193 -0
- package/src/__tests__/concurrent.spec.mts +368 -0
- package/src/__tests__/container.spec.mts +32 -30
- package/src/__tests__/di-error.spec.mts +351 -0
- package/src/__tests__/e2e.browser.spec.mts +0 -4
- package/src/__tests__/e2e.spec.mts +10 -19
- package/src/__tests__/event-emitter.spec.mts +232 -109
- package/src/__tests__/get-injectors.spec.mts +250 -39
- package/src/__tests__/injection-token.spec.mts +293 -349
- package/src/__tests__/library-findings.spec.mts +8 -8
- package/src/__tests__/registry.spec.mts +358 -210
- package/src/__tests__/resolution-context.spec.mts +255 -0
- package/src/__tests__/scope-tracker.spec.mts +598 -0
- package/src/__tests__/scope-upgrade.spec.mts +808 -0
- package/src/__tests__/scoped-container.spec.mts +595 -0
- package/src/__tests__/test-container.spec.mts +293 -0
- package/src/__tests__/token-resolver.spec.mts +207 -0
- package/src/__tests__/unified-storage.spec.mts +535 -0
- package/src/__tests__/unit-test-container.spec.mts +405 -0
- package/src/__type-tests__/container.spec-d.mts +180 -0
- package/src/__type-tests__/factory.spec-d.mts +15 -3
- package/src/__type-tests__/inject.spec-d.mts +115 -20
- package/src/__type-tests__/injectable.spec-d.mts +69 -52
- package/src/__type-tests__/injection-token.spec-d.mts +176 -0
- package/src/__type-tests__/scoped-container.spec-d.mts +212 -0
- package/src/container/abstract-container.mts +327 -0
- package/src/container/container.mts +142 -170
- package/src/container/scoped-container.mts +126 -208
- package/src/decorators/factory.decorator.mts +16 -11
- package/src/decorators/injectable.decorator.mts +20 -16
- package/src/enums/index.mts +2 -2
- package/src/enums/injectable-scope.enum.mts +1 -0
- package/src/enums/injectable-type.enum.mts +1 -0
- package/src/errors/di-error.mts +96 -0
- package/src/event-emitter.mts +3 -27
- package/src/index.mts +6 -153
- package/src/interfaces/container.interface.mts +13 -0
- package/src/interfaces/factory.interface.mts +1 -1
- package/src/interfaces/index.mts +1 -1
- package/src/internal/context/async-local-storage.mts +3 -2
- package/src/internal/context/async-local-storage.types.mts +1 -0
- package/src/internal/context/factory-context.mts +1 -0
- package/src/internal/context/index.mts +3 -1
- package/src/internal/context/resolution-context.mts +1 -0
- package/src/internal/context/service-initialization-context.mts +43 -0
- package/src/internal/core/index.mts +5 -4
- package/src/internal/core/instance-resolver.mts +461 -292
- package/src/internal/core/name-resolver.mts +196 -0
- package/src/internal/core/scope-tracker.mts +242 -0
- package/src/internal/core/{instantiator.mts → service-initializer.mts} +51 -29
- package/src/internal/core/service-invalidator.mts +290 -0
- package/src/internal/core/{token-processor.mts → token-resolver.mts} +17 -88
- package/src/internal/holder/holder-storage.interface.mts +11 -5
- package/src/internal/holder/index.mts +2 -5
- package/src/internal/holder/instance-holder.mts +1 -3
- package/src/internal/holder/unified-storage.mts +245 -0
- package/src/internal/index.mts +2 -1
- package/src/internal/lifecycle/circular-detector.mts +1 -0
- package/src/internal/lifecycle/index.mts +1 -1
- package/src/internal/lifecycle/lifecycle-event-bus.mts +1 -0
- package/src/internal/stub-factory-class.mts +16 -0
- package/src/symbols/injectable-token.mts +3 -1
- package/src/testing/index.mts +2 -0
- package/src/testing/test-container.mts +546 -85
- package/src/testing/types.mts +117 -0
- package/src/testing/unit-test-container.mts +509 -0
- package/src/token/injection-token.mts +41 -4
- package/src/token/registry.mts +75 -9
- package/src/utils/default-injectors.mts +16 -0
- package/src/utils/get-injectable-token.mts +2 -3
- package/src/utils/get-injectors.mts +26 -15
- package/src/utils/index.mts +3 -1
- package/src/utils/types.mts +1 -0
- package/tsdown.config.mts +11 -1
- package/lib/browser/index.d.mts.map +0 -1
- package/lib/browser/index.mjs.map +0 -1
- package/lib/container-BuAutHGg.d.mts.map +0 -1
- package/lib/container-DnzgpfBe.cjs.map +0 -1
- package/lib/container-Pb_Y4Z4x.mjs.map +0 -1
- package/lib/container-oGTgX2iX.d.cts.map +0 -1
- package/src/__tests__/async-local-storage.browser.spec.mts +0 -166
- package/src/__tests__/async-local-storage.spec.mts +0 -333
- package/src/__tests__/errors.spec.mts +0 -87
- package/src/__tests__/factory.spec.mts +0 -137
- package/src/__tests__/injectable.spec.mts +0 -246
- package/src/__tests__/request-scope.spec.mts +0 -416
- package/src/__tests__/service-instantiator.spec.mts +0 -410
- package/src/__tests__/service-locator-event-bus.spec.mts +0 -242
- package/src/__tests__/service-locator-manager.spec.mts +0 -300
- package/src/__tests__/service-locator.spec.mts +0 -966
- package/src/__tests__/unified-api.spec.mts +0 -130
- package/src/browser.mts +0 -11
- package/src/injectors.mts +0 -18
- package/src/internal/context/request-context.mts +0 -214
- package/src/internal/core/invalidator.mts +0 -437
- package/src/internal/core/service-locator.mts +0 -202
- package/src/internal/holder/base-holder-manager.mts +0 -238
- package/src/internal/holder/holder-manager.mts +0 -85
- package/src/internal/holder/request-storage.mts +0 -134
- package/src/internal/holder/singleton-storage.mts +0 -105
- package/src/testing/README.md +0 -80
- package/src/testing/__tests__/test-container.spec.mts +0 -173
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-injectable-token.d.mts","names":[],"sources":["../../../src/utils/get-injectable-token.mts"],"sourcesContent":[],"mappings":";;;iBAKgB,8BACN,YACP;;AAFH,CAAA,GAGI,cAHY,CAGG,CAHH,CAAA,GAIZ,cAJ8B,CAIf,CAJe,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { InjectableTokenMeta } from "../symbols/injectable-token.mjs";
|
|
2
|
+
import { DIError } from "../errors/di-error.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/utils/get-injectable-token.mts
|
|
5
|
+
function getInjectableToken(target) {
|
|
6
|
+
const token = target[InjectableTokenMeta];
|
|
7
|
+
if (!token) throw DIError.classNotInjectable(target.name);
|
|
8
|
+
return token;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
//#endregion
|
|
12
|
+
export { getInjectableToken };
|
|
13
|
+
//# sourceMappingURL=get-injectable-token.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-injectable-token.mjs","names":["DIError","InjectableTokenMeta","getInjectableToken","target","token","classNotInjectable","name"],"sources":["../../../src/utils/get-injectable-token.mts"],"sourcesContent":["import type { ClassType, InjectionToken } from '../token/injection-token.mjs'\n\nimport { DIError } from '../errors/di-error.mjs'\nimport { InjectableTokenMeta } from '../symbols/index.mjs'\n\nexport function getInjectableToken<R>(\n target: ClassType,\n): R extends { create(...args: any[]): infer V }\n ? InjectionToken<V>\n : InjectionToken<R> {\n // @ts-expect-error We inject the token into the class itself\n const token = target[InjectableTokenMeta] as InjectionToken<any, any>\n if (!token) {\n throw DIError.classNotInjectable(target.name)\n }\n // @ts-expect-error We detect factory or class\n return token\n}\n"],"mappings":";;;;AAKA,SAAgBE,mBACdC,QAAiB;CAKjB,MAAMC,QAAQD,OAAOF;AACrB,KAAI,CAACG,MACH,OAAMJ,QAAQK,mBAAmBF,OAAOG,KAAI;AAG9C,QAAOF"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { BoundInjectionToken, ClassType, ClassTypeWithArgument, ClassTypeWithoutArguments, FactoryInjectionToken, InjectionToken, InjectionTokenSchemaType } from "../token/injection-token.mjs";
|
|
2
|
+
import { InjectState, Join, UnionToArray } from "./types.mjs";
|
|
3
|
+
import { ServiceInitializationContext } from "../internal/context/service-initialization-context.mjs";
|
|
4
|
+
import { Factorable, FactorableWithArgs } from "../interfaces/factory.interface.mjs";
|
|
5
|
+
import { ZodType, z } from "zod/v4";
|
|
6
|
+
|
|
7
|
+
//#region src/utils/get-injectors.d.mts
|
|
8
|
+
interface Injectors {
|
|
9
|
+
asyncInject<T extends ClassTypeWithoutArguments>(token: T): InstanceType<T> extends Factorable<infer R> ? Promise<R> : Promise<InstanceType<T>>;
|
|
10
|
+
asyncInject<Args, T extends ClassTypeWithArgument<Args>>(token: T, args: Args): Promise<InstanceType<T>>;
|
|
11
|
+
asyncInject<Schema extends InjectionTokenSchemaType, R, T extends FactorableWithArgs<R, Schema>>(token: T, args: z.input<Schema>): Promise<R>;
|
|
12
|
+
asyncInject<T, S extends InjectionTokenSchemaType>(token: InjectionToken<T, S>, args: z.input<S>): Promise<T>;
|
|
13
|
+
asyncInject<T, S extends InjectionTokenSchemaType, R extends boolean>(token: InjectionToken<T, S, R>): R extends false ? Promise<T> : S extends ZodType<infer Type> ? `Error: Your token requires args: ${Join<UnionToArray<keyof Type>, ', '>}` : 'Error: Your token requires args';
|
|
14
|
+
asyncInject<T>(token: InjectionToken<T, undefined>): Promise<T>;
|
|
15
|
+
asyncInject<T>(token: BoundInjectionToken<T, any>): Promise<T>;
|
|
16
|
+
asyncInject<T>(token: FactoryInjectionToken<T, any>): Promise<T>;
|
|
17
|
+
inject<T extends ClassTypeWithoutArguments>(token: T): InstanceType<T> extends Factorable<infer R> ? R : InstanceType<T>;
|
|
18
|
+
inject<Args, T extends ClassTypeWithArgument<Args>>(token: T, args: Args): InstanceType<T>;
|
|
19
|
+
inject<Schema extends InjectionTokenSchemaType, R, T extends FactorableWithArgs<R, Schema>>(token: T, args: z.input<Schema>): R;
|
|
20
|
+
inject<T, S extends InjectionTokenSchemaType>(token: InjectionToken<T, S>, args: z.input<S>): T;
|
|
21
|
+
inject<T, S extends InjectionTokenSchemaType, R extends boolean>(token: InjectionToken<T, S, R>): R extends false ? T : S extends ZodType<infer Type> ? `Error: Your token requires args: ${Join<UnionToArray<keyof Type>, ', '>}` : 'Error: Your token requires args';
|
|
22
|
+
inject<T>(token: InjectionToken<T, undefined>): T;
|
|
23
|
+
inject<T>(token: BoundInjectionToken<T, any>): T;
|
|
24
|
+
inject<T>(token: FactoryInjectionToken<T, any>): T;
|
|
25
|
+
/**
|
|
26
|
+
* Optional injection that returns null if the service fails to initialize
|
|
27
|
+
* or is not available. This is useful when you want to inject a service
|
|
28
|
+
* that may not be configured or may fail gracefully.
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```ts
|
|
32
|
+
* class MyService {
|
|
33
|
+
* constructor() {
|
|
34
|
+
* const optionalService = optional(OptionalServiceToken)
|
|
35
|
+
* // optionalService will be null if initialization fails
|
|
36
|
+
* if (optionalService) {
|
|
37
|
+
* optionalService.doSomething()
|
|
38
|
+
* }
|
|
39
|
+
* }
|
|
40
|
+
* }
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
optional<T extends ClassType>(token: T): (InstanceType<T> extends Factorable<infer R> ? R : InstanceType<T>) | null;
|
|
44
|
+
optional<T, S extends InjectionTokenSchemaType>(token: InjectionToken<T, S>, args: z.input<S>): T | null;
|
|
45
|
+
optional<T, S extends InjectionTokenSchemaType, R extends boolean>(token: InjectionToken<T, S, R>): R extends false ? T | null : S extends ZodType<infer Type> ? `Error: Your token requires args: ${Join<UnionToArray<keyof Type>, ', '>}` : 'Error: Your token requires args';
|
|
46
|
+
optional<T>(token: InjectionToken<T, undefined>): T | null;
|
|
47
|
+
optional<T>(token: BoundInjectionToken<T, any>): T | null;
|
|
48
|
+
optional<T>(token: FactoryInjectionToken<T, any>): T | null;
|
|
49
|
+
wrapSyncInit(cb: () => any): (injectState?: InjectState) => [any, Promise<any>[], InjectState];
|
|
50
|
+
provideFactoryContext(context: ServiceInitializationContext | null): ServiceInitializationContext | null;
|
|
51
|
+
}
|
|
52
|
+
declare function getInjectors(): Injectors;
|
|
53
|
+
//#endregion
|
|
54
|
+
export { Injectors, getInjectors };
|
|
55
|
+
//# sourceMappingURL=get-injectors.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-injectors.d.mts","names":[],"sources":["../../../src/utils/get-injectors.mts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { InjectableTokenMeta } from "../symbols/injectable-token.mjs";
|
|
2
|
+
import { withoutResolutionContext } from "../internal/context/resolution-context.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/utils/get-injectors.mts
|
|
5
|
+
function getInjectors() {
|
|
6
|
+
let currentFactoryContext = null;
|
|
7
|
+
function provideFactoryContext(context) {
|
|
8
|
+
const original = currentFactoryContext;
|
|
9
|
+
currentFactoryContext = context;
|
|
10
|
+
return original;
|
|
11
|
+
}
|
|
12
|
+
function getFactoryContext() {
|
|
13
|
+
if (!currentFactoryContext) throw new Error("[Injector] Trying to access injection context outside of a injectable context");
|
|
14
|
+
return currentFactoryContext;
|
|
15
|
+
}
|
|
16
|
+
let promiseCollector = null;
|
|
17
|
+
let injectState = null;
|
|
18
|
+
function getRequest(token, args, skipCycleTracking = false) {
|
|
19
|
+
if (!injectState) throw new Error("[Injector] Trying to make a request outside of a injectable context");
|
|
20
|
+
if (injectState.isFrozen) {
|
|
21
|
+
const idx = injectState.currentIndex++;
|
|
22
|
+
const request$1 = injectState.requests[idx];
|
|
23
|
+
if (request$1.token !== token) throw new Error(`[Injector] Wrong token order. Expected ${request$1.token.toString()} but got ${token.toString()}`);
|
|
24
|
+
return request$1;
|
|
25
|
+
}
|
|
26
|
+
let result = null;
|
|
27
|
+
let error = null;
|
|
28
|
+
const doInject = () => getFactoryContext().inject(token, args).then((r) => {
|
|
29
|
+
result = r;
|
|
30
|
+
return r;
|
|
31
|
+
}).catch((e) => {
|
|
32
|
+
error = e;
|
|
33
|
+
});
|
|
34
|
+
const request = {
|
|
35
|
+
token,
|
|
36
|
+
promise: skipCycleTracking ? withoutResolutionContext(doInject) : doInject(),
|
|
37
|
+
get result() {
|
|
38
|
+
return result;
|
|
39
|
+
},
|
|
40
|
+
get error() {
|
|
41
|
+
return error;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
injectState.requests.push(request);
|
|
45
|
+
injectState.currentIndex++;
|
|
46
|
+
return request;
|
|
47
|
+
}
|
|
48
|
+
function asyncInject(token, args) {
|
|
49
|
+
if (!injectState) throw new Error("[Injector] Trying to access inject outside of a injectable context");
|
|
50
|
+
const request = getRequest(token[InjectableTokenMeta] ?? token, args, true);
|
|
51
|
+
return request.promise.then((result) => {
|
|
52
|
+
if (request.error) throw request.error;
|
|
53
|
+
return result;
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
function wrapSyncInit(cb) {
|
|
57
|
+
return (previousState) => {
|
|
58
|
+
const promises = [];
|
|
59
|
+
const originalPromiseCollector = promiseCollector;
|
|
60
|
+
const originalInjectState = injectState;
|
|
61
|
+
injectState = previousState ? {
|
|
62
|
+
...previousState,
|
|
63
|
+
currentIndex: 0
|
|
64
|
+
} : {
|
|
65
|
+
currentIndex: 0,
|
|
66
|
+
isFrozen: false,
|
|
67
|
+
requests: []
|
|
68
|
+
};
|
|
69
|
+
promiseCollector = (promise) => {
|
|
70
|
+
promises.push(promise);
|
|
71
|
+
};
|
|
72
|
+
const result = cb();
|
|
73
|
+
promiseCollector = originalPromiseCollector;
|
|
74
|
+
const newInjectState = {
|
|
75
|
+
...injectState,
|
|
76
|
+
isFrozen: true
|
|
77
|
+
};
|
|
78
|
+
injectState = originalInjectState;
|
|
79
|
+
return [
|
|
80
|
+
result,
|
|
81
|
+
promises,
|
|
82
|
+
newInjectState
|
|
83
|
+
];
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function inject(token, args) {
|
|
87
|
+
const realToken = token[InjectableTokenMeta] ?? token;
|
|
88
|
+
if (!injectState) throw new Error("[Injector] Trying to access inject outside of a injectable context");
|
|
89
|
+
const ctx = getFactoryContext();
|
|
90
|
+
const instance = ctx.container.tryGetSync(realToken, args);
|
|
91
|
+
if (!instance) {
|
|
92
|
+
const request = getRequest(realToken, args);
|
|
93
|
+
if (request.error) throw request.error;
|
|
94
|
+
else if (request.result) return request.result;
|
|
95
|
+
if (promiseCollector) promiseCollector(request.promise);
|
|
96
|
+
return new Proxy({}, { get() {
|
|
97
|
+
throw new Error(`[Injector] Trying to access ${realToken.toString()} before it's initialized, please move the code to a onServiceInit method`);
|
|
98
|
+
} });
|
|
99
|
+
}
|
|
100
|
+
ctx.inject(realToken, args).catch(() => {});
|
|
101
|
+
return instance;
|
|
102
|
+
}
|
|
103
|
+
function optional(token, args) {
|
|
104
|
+
try {
|
|
105
|
+
return inject(token, args);
|
|
106
|
+
} catch {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
asyncInject,
|
|
112
|
+
inject,
|
|
113
|
+
optional,
|
|
114
|
+
wrapSyncInit,
|
|
115
|
+
provideFactoryContext
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
//#endregion
|
|
120
|
+
export { getInjectors };
|
|
121
|
+
//# sourceMappingURL=get-injectors.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-injectors.mjs","names":["withoutResolutionContext","InjectableTokenMeta","getInjectors","currentFactoryContext","provideFactoryContext","context","original","getFactoryContext","Error","promiseCollector","injectState","getRequest","token","args","skipCycleTracking","isFrozen","idx","currentIndex","request","requests","toString","result","error","doInject","inject","then","r","catch","e","promise","push","asyncInject","realToken","wrapSyncInit","cb","previousState","promises","originalPromiseCollector","originalInjectState","newInjectState","ctx","instance","container","tryGetSync","Proxy","get","optional","injectors"],"sources":["../../../src/utils/get-injectors.mts"],"sourcesContent":["import type { z, ZodObject, ZodType } from 'zod/v4'\n\nimport type {\n Factorable,\n FactorableWithArgs,\n} from '../interfaces/factory.interface.mjs'\nimport type { ServiceInitializationContext } from '../internal/context/service-initialization-context.mjs'\nimport type {\n BoundInjectionToken,\n ClassType,\n ClassTypeWithArgument,\n ClassTypeWithoutArguments,\n FactoryInjectionToken,\n InjectionToken,\n InjectionTokenSchemaType,\n} from '../token/injection-token.mjs'\nimport type {\n InjectRequest,\n InjectState,\n Join,\n UnionToArray,\n} from './types.mjs'\n\nimport { withoutResolutionContext } from '../internal/context/resolution-context.mjs'\nimport { InjectableTokenMeta } from '../symbols/index.mjs'\n\nexport interface Injectors {\n // #1 Simple class\n asyncInject<T extends ClassTypeWithoutArguments>(\n token: T,\n ): InstanceType<T> extends Factorable<infer R>\n ? Promise<R>\n : Promise<InstanceType<T>>\n asyncInject<Args, T extends ClassTypeWithArgument<Args>>(\n token: T,\n args: Args,\n ): Promise<InstanceType<T>>\n asyncInject<\n Schema extends InjectionTokenSchemaType,\n R,\n T extends FactorableWithArgs<R, Schema>,\n >(\n token: T,\n args: z.input<Schema>,\n ): Promise<R>\n\n // #2 Token with required Schema\n asyncInject<T, S extends InjectionTokenSchemaType>(\n token: InjectionToken<T, S>,\n args: z.input<S>,\n ): Promise<T>\n // #3 Token with optional Schema\n asyncInject<T, S extends InjectionTokenSchemaType, R extends boolean>(\n token: InjectionToken<T, S, R>,\n ): R extends false\n ? Promise<T>\n : S extends ZodType<infer Type>\n ? `Error: Your token requires args: ${Join<\n UnionToArray<keyof Type>,\n ', '\n >}`\n : 'Error: Your token requires args'\n // #4 Token with no Schema\n asyncInject<T>(token: InjectionToken<T, undefined>): Promise<T>\n asyncInject<T>(token: BoundInjectionToken<T, any>): Promise<T>\n asyncInject<T>(token: FactoryInjectionToken<T, any>): Promise<T>\n\n inject<T extends ClassTypeWithoutArguments>(\n token: T,\n ): InstanceType<T> extends Factorable<infer R> ? R : InstanceType<T>\n inject<Args, T extends ClassTypeWithArgument<Args>>(\n token: T,\n args: Args,\n ): InstanceType<T>\n inject<\n Schema extends InjectionTokenSchemaType,\n R,\n T extends FactorableWithArgs<R, Schema>,\n >(\n token: T,\n args: z.input<Schema>,\n ): R\n\n inject<T, S extends InjectionTokenSchemaType>(\n token: InjectionToken<T, S>,\n args: z.input<S>,\n ): T\n // #3 Token with optional Schema\n inject<T, S extends InjectionTokenSchemaType, R extends boolean>(\n token: InjectionToken<T, S, R>,\n ): R extends false\n ? T\n : S extends ZodType<infer Type>\n ? `Error: Your token requires args: ${Join<\n UnionToArray<keyof Type>,\n ', '\n >}`\n : 'Error: Your token requires args'\n inject<T>(token: InjectionToken<T, undefined>): T\n inject<T>(token: BoundInjectionToken<T, any>): T\n inject<T>(token: FactoryInjectionToken<T, any>): T\n\n /**\n * Optional injection that returns null if the service fails to initialize\n * or is not available. This is useful when you want to inject a service\n * that may not be configured or may fail gracefully.\n *\n * @example\n * ```ts\n * class MyService {\n * constructor() {\n * const optionalService = optional(OptionalServiceToken)\n * // optionalService will be null if initialization fails\n * if (optionalService) {\n * optionalService.doSomething()\n * }\n * }\n * }\n * ```\n */\n optional<T extends ClassType>(\n token: T,\n ): (InstanceType<T> extends Factorable<infer R> ? R : InstanceType<T>) | null\n optional<T, S extends InjectionTokenSchemaType>(\n token: InjectionToken<T, S>,\n args: z.input<S>,\n ): T | null\n optional<T, S extends InjectionTokenSchemaType, R extends boolean>(\n token: InjectionToken<T, S, R>,\n ): R extends false\n ? T | null\n : S extends ZodType<infer Type>\n ? `Error: Your token requires args: ${Join<\n UnionToArray<keyof Type>,\n ', '\n >}`\n : 'Error: Your token requires args'\n optional<T>(token: InjectionToken<T, undefined>): T | null\n optional<T>(token: BoundInjectionToken<T, any>): T | null\n optional<T>(token: FactoryInjectionToken<T, any>): T | null\n\n wrapSyncInit(\n cb: () => any,\n ): (injectState?: InjectState) => [any, Promise<any>[], InjectState]\n\n provideFactoryContext(\n context: ServiceInitializationContext | null,\n ): ServiceInitializationContext | null\n}\n\nexport function getInjectors() {\n let currentFactoryContext: ServiceInitializationContext | null = null\n\n function provideFactoryContext(\n context: ServiceInitializationContext | null,\n ): ServiceInitializationContext | null {\n const original = currentFactoryContext\n currentFactoryContext = context\n return original\n }\n function getFactoryContext(): ServiceInitializationContext {\n if (!currentFactoryContext) {\n throw new Error(\n '[Injector] Trying to access injection context outside of a injectable context',\n )\n }\n return currentFactoryContext\n }\n\n let promiseCollector: null | ((promise: Promise<any>) => void) = null\n let injectState: InjectState | null = null\n\n function getRequest(\n token: InjectionToken<any>,\n args?: unknown,\n skipCycleTracking = false,\n ) {\n if (!injectState) {\n throw new Error(\n '[Injector] Trying to make a request outside of a injectable context',\n )\n }\n if (injectState.isFrozen) {\n const idx = injectState.currentIndex++\n const request = injectState.requests[idx]\n if (request.token !== token) {\n throw new Error(\n `[Injector] Wrong token order. Expected ${request.token.toString()} but got ${token.toString()}`,\n )\n }\n return request\n }\n let result: any = null\n let error: Error | null = null\n\n // For async inject, we run outside the resolution context to skip cycle tracking.\n // This is because asyncInject returns a promise that doesn't block the constructor,\n // so it cannot cause a deadlock even with circular dependencies.\n const doInject = () =>\n getFactoryContext()\n .inject(token as any, args as any)\n .then((r) => {\n result = r\n return r\n })\n .catch((e) => {\n // We don't throw here because we have a mechanism to handle errors\n error = e\n })\n\n const promise = skipCycleTracking\n ? withoutResolutionContext(doInject)\n : doInject()\n\n const request: InjectRequest = {\n token,\n promise,\n get result() {\n return result\n },\n get error() {\n return error\n },\n }\n injectState.requests.push(request)\n injectState.currentIndex++\n\n return request\n }\n\n function asyncInject(\n token:\n | ClassType\n | InjectionToken<any>\n | BoundInjectionToken<any, any>\n | FactoryInjectionToken<any, any>,\n args?: unknown,\n ) {\n if (!injectState) {\n throw new Error(\n '[Injector] Trying to access inject outside of a injectable context',\n )\n }\n // @ts-expect-error In case we have a class\n const realToken = token[InjectableTokenMeta] ?? token\n // Pass skipCycleTracking=true because asyncInject returns a promise that doesn't\n // block the constructor, so it cannot cause a deadlock even with circular dependencies.\n const request = getRequest(realToken, args, true)\n return request.promise.then((result) => {\n if (request.error) {\n // We throw here because we want to fail the asyncInject call if the dependency fails to initialize\n throw request.error\n }\n return result\n })\n }\n\n function wrapSyncInit(cb: () => any) {\n return (previousState?: InjectState) => {\n const promises: Promise<any>[] = []\n const originalPromiseCollector = promiseCollector\n const originalInjectState = injectState\n injectState = previousState\n ? {\n ...previousState,\n currentIndex: 0,\n }\n : {\n currentIndex: 0,\n isFrozen: false,\n requests: [],\n }\n promiseCollector = (promise) => {\n promises.push(promise)\n }\n const result = cb()\n promiseCollector = originalPromiseCollector\n const newInjectState = {\n ...injectState,\n isFrozen: true,\n }\n injectState = originalInjectState\n return [result, promises, newInjectState]\n }\n }\n\n function inject<\n T,\n Token extends\n | InjectionToken<T>\n | BoundInjectionToken<T, any>\n | FactoryInjectionToken<T, any>,\n S extends ZodObject | unknown = Token['schema'],\n >(token: Token, args?: S extends ZodObject ? z.input<S> : never): T {\n // @ts-expect-error In case we have a class\n const realToken = token[InjectableTokenMeta] ?? token\n\n if (!injectState) {\n throw new Error(\n '[Injector] Trying to access inject outside of a injectable context',\n )\n }\n\n const ctx = getFactoryContext()\n const instance = ctx.container.tryGetSync(realToken, args)\n if (!instance) {\n const request = getRequest(realToken, args)\n if (request.error) {\n throw request.error\n } else if (request.result) {\n return request.result\n }\n if (promiseCollector) {\n promiseCollector(request.promise)\n }\n // Return a dynamic proxy that looks up the instance when accessed\n return new Proxy(\n {},\n {\n get() {\n throw new Error(\n `[Injector] Trying to access ${realToken.toString()} before it's initialized, please move the code to a onServiceInit method`,\n )\n },\n },\n ) as unknown as T\n }\n\n // Even when tryGetSync returns an existing instance, we still need to\n // track the dependency for scope upgrade. This ensures that if a Singleton\n // service depends on an already-created Request-scoped service, the\n // Singleton will be properly upgraded to Request scope.\n // The ctx.inject call handles dependency tracking and scope upgrades.\n // We fire-and-forget this since we already have the instance.\n ctx.inject(realToken, args).catch(() => {\n // Ignore errors - we already have the instance\n })\n\n return instance as unknown as T\n }\n\n function optional<\n T,\n Token extends\n | InjectionToken<T>\n | BoundInjectionToken<T, any>\n | FactoryInjectionToken<T, any>,\n S extends ZodObject | unknown = Token['schema'],\n >(token: Token, args?: S extends ZodObject ? z.input<S> : never): T | null {\n try {\n return inject(token, args)\n } catch {\n // If injection fails, return null instead of throwing\n return null\n }\n }\n\n const injectors: Injectors = {\n asyncInject,\n inject,\n optional,\n wrapSyncInit,\n provideFactoryContext,\n } as Injectors\n\n return injectors\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { BoundInjectionToken, ClassType, FactoryInjectionToken, InjectionToken } from "../token/injection-token.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/utils/types.d.mts
|
|
4
|
+
type Join<TElements, TSeparator extends string> = TElements extends Readonly<[infer First, ...infer Rest]> ? Rest extends ReadonlyArray<string> ? First extends string ? `${First}${Rest extends [] ? '' : TSeparator}${Join<Rest, TSeparator>}` : never : never : '';
|
|
5
|
+
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never;
|
|
6
|
+
type UnionToOvlds<U> = UnionToIntersection<U extends any ? (f: U) => void : never>;
|
|
7
|
+
type PopUnion<U> = UnionToOvlds<U> extends ((a: infer A) => void) ? A : never;
|
|
8
|
+
type IsUnion<T> = [T] extends [UnionToIntersection<T>] ? false : true;
|
|
9
|
+
type UnionToArray<T, A extends unknown[] = []> = IsUnion<T> extends true ? UnionToArray<Exclude<T, PopUnion<T>>, [PopUnion<T>, ...A]> : [T, ...A];
|
|
10
|
+
type InjectRequest = {
|
|
11
|
+
token: InjectionToken<any> | BoundInjectionToken<any, any> | FactoryInjectionToken<any, any> | ClassType;
|
|
12
|
+
promise: Promise<any>;
|
|
13
|
+
readonly result: any;
|
|
14
|
+
readonly error: Error | null;
|
|
15
|
+
};
|
|
16
|
+
interface InjectState {
|
|
17
|
+
currentIndex: number;
|
|
18
|
+
isFrozen: boolean;
|
|
19
|
+
requests: InjectRequest[];
|
|
20
|
+
}
|
|
21
|
+
//#endregion
|
|
22
|
+
export { InjectRequest, InjectState, IsUnion, Join, PopUnion, UnionToArray, UnionToIntersection, UnionToOvlds };
|
|
23
|
+
//# sourceMappingURL=types.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../../src/utils/types.mts"],"sourcesContent":[],"mappings":";;;KAQY,6CACV,kBAAkB,sDACD,kDAEN,+BAA+B,aAAa,KAAK,MAAM;KAMxD,0BACV,oBAAoB;AAXV,KAiBA,YAjBI,CAAA,CAAA,CAAA,GAiBc,mBAjBd,CAkBd,CAlBc,SAAA,GAAA,GAAA,CAAA,CAAA,EAkBM,CAlBN,EAAA,GAAA,IAAA,GAAA,KAAA,CAAA;AACd,KAoBU,QApBV,CAAA,CAAA,CAAA,GAqBA,YArBA,CAqBa,CArBb,CAAA,UAAA,CAAA,CAAA,EAAA,KAAA,EAAA,EAAA,GAAA,IAAA,IAAA,CAAA,GAAA,KAAA;AAAkB,KAuBR,OAvBQ,CAAA,CAAA,CAAA,GAAA,CAuBM,CAvBN,CAAA,SAAA,CAuBkB,mBAvBlB,CAuBsC,CAvBtC,CAAA,CAAA,GAAA,KAAA,GAAA,IAAA;AACD,KAwBP,YAxBO,CAAA,CAAA,EAAA,UAAA,OAAA,EAAA,GAAA,EAAA,CAAA,GAyBjB,OAzBiB,CAyBT,CAzBS,CAAA,SAAA,IAAA,GA0Bb,YA1Ba,CA0BA,OA1BA,CA0BQ,CA1BR,EA0BW,QA1BX,CA0BoB,CA1BpB,CAAA,CAAA,EAAA,CA0B0B,QA1B1B,CA0BmC,CA1BnC,CAAA,EAAA,GA0B0C,CA1B1C,CAAA,CAAA,GAAA,CA2BZ,CA3BY,EAAA,GA2BN,CA3BM,CAAA;AAEN,KA2BD,aAAA,GA3BC;EAA+B,KAAA,EA6BtC,cA7BsC,CAAA,GAAA,CAAA,GA8BtC,mBA9BsC,CAAA,GAAA,EAAA,GAAA,CAAA,GA+BtC,qBA/BsC,CAAA,GAAA,EAAA,GAAA,CAAA,GAgCtC,SAhCsC;EAAkB,OAAA,EAiCnD,OAjCmD,CAAA,GAAA,CAAA;EAAM,SAAA,MAAA,EAAA,GAAA;EAAX,SAAA,KAAA,EAmCvC,KAnCuC,GAAA,IAAA;CAAI;AAMjD,UAiCK,WAAA,CAjCc;EAOnB,YAAA,EAAA,MAAY;EACtB,QAAA,EAAA,OAAA;EAAoB,QAAA,EA4BV,aA5BU,EAAA"}
|