@navios/di 0.1.11 → 0.1.13
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/docs/concepts/injectable.md +182 -0
- package/docs/concepts/injection-token.md +145 -0
- package/lib/_tsup-dts-rollup.d.mts +9 -9
- package/lib/_tsup-dts-rollup.d.ts +9 -9
- package/lib/index.js +37 -104
- package/lib/index.js.map +1 -1
- package/lib/index.mjs +4 -46
- package/lib/index.mjs.map +1 -1
- package/package.json +4 -4
- package/src/__type-tests__/injectable.spec-d.mts +255 -0
- package/src/decorators/injectable.decorator.mts +15 -12
- package/tsup.config.mts +1 -0
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.mts","../src/decorators/injectable.decorator.mts","../src/enums/injectable-scope.enum.mts","../src/enums/injectable-type.enum.mts","../src/injection-token.mts","../src/registry.mts","../src/proxy-service-locator.mts","../src/symbols/injectable-token.mts","../src/utils/get-injectors.mts","../src/utils/get-injectable-token.mts","../src/resolve-service.mts","../src/errors/errors.enum.mts","../src/errors/factory-not-found.mts","../src/errors/factory-token-not-resolved.mts","../src/errors/instance-destroying.mts","../src/errors/instance-expired.mts","../src/errors/instance-not-found.mts","../src/errors/unknown-error.mts","../src/interfaces/factory.interface.mts","../src/event-emitter.mts","../src/service-locator-event-bus.mts","../src/service-locator-instance-holder.mts","../src/service-locator-manager.mts","../src/service-locator.mts","../src/injector.mts"],"sourcesContent":["export * from './decorators/index.mjs'\nexport * from './enums/index.mjs'\nexport * from './errors/index.mjs'\nexport * from './interfaces/index.mjs'\nexport * from './utils/index.mjs'\nexport * from './event-emitter.mjs'\nexport * from './factory-context.mjs'\nexport * from './injection-token.mjs'\nexport * from './injector.mjs'\nexport * from './proxy-service-locator.mjs'\nexport * from './registry.mjs'\nexport * from './resolve-service.mjs'\nexport * from './service-locator.mjs'\nexport * from './service-locator-event-bus.mjs'\nexport * from './service-locator-instance-holder.mjs'\nexport * from './service-locator-manager.mjs'\nexport * from './symbols/injectable-token.mjs'\n","import { z } from 'zod'\n\nimport type {\n BaseInjectionTokenSchemaType,\n ClassType,\n ClassTypeWithArgument,\n ClassTypeWithInstance,\n ClassTypeWithInstanceAndArgument,\n ClassTypeWithInstanceAndOptionalArgument,\n ClassTypeWithOptionalArgument,\n InjectionTokenSchemaType,\n OptionalInjectionTokenSchemaType,\n} from '../injection-token.mjs'\nimport type { Factory, FactoryWithArgs } from '../interfaces/index.mjs'\nimport type { Registry } from '../registry.mjs'\n\nimport { InjectableScope, InjectableType } from '../enums/index.mjs'\nimport { InjectionToken } from '../injection-token.mjs'\nimport { globalRegistry } from '../registry.mjs'\nimport { resolveService } from '../resolve-service.mjs'\nimport { InjectableTokenMeta } from '../symbols/index.mjs'\n\nexport interface InjectableOptions {\n scope?: InjectableScope\n type?: InjectableType\n token?: InjectionToken<any, any>\n registry?: Registry\n}\n// #1 Simple constructorless class\nexport function Injectable(): <T extends ClassType>(\n target: T,\n context: ClassDecoratorContext,\n) => T\nexport function Injectable(options: {\n registry: Registry\n}): <T extends ClassType>(target: T, context: ClassDecoratorContext) => T\n\n// #2 Factory without arguments\nexport function Injectable<R>(options: {\n scope?: InjectableScope\n type: InjectableType.Factory\n registry?: Registry\n}): <T extends ClassTypeWithInstance<Factory<R>>>(\n target: T,\n context: ClassDecoratorContext,\n) => T\n\n// #3 Class with typeless token and schema\nexport function Injectable<Type, Schema>(options: {\n scope?: InjectableScope\n type?: InjectableType.Class\n token: InjectionToken<Type, Schema>\n registry?: Registry\n}): Schema extends BaseInjectionTokenSchemaType // #3.1 Check that schema is an object or a record\n ? Type extends undefined\n ? <T extends ClassTypeWithArgument<z.output<Schema>>>( // #3.1.1 Typeless token\n target: T,\n context: ClassDecoratorContext,\n ) => T\n : <T extends ClassTypeWithInstanceAndArgument<Type, z.output<Schema>>>( // #3.1.2 Typed token\n target: T,\n context: ClassDecoratorContext,\n ) => T\n : Schema extends OptionalInjectionTokenSchemaType // #3.2 Check that schema is an optional object or a record\n ? Type extends undefined\n ? <T extends ClassTypeWithOptionalArgument<z.output<Schema>>>( // #3.2.1 Typeless token\n target: T,\n context: ClassDecoratorContext,\n ) => T\n : <\n // #3.2.2 Typed token\n T extends ClassTypeWithInstanceAndOptionalArgument<\n Type,\n z.output<Schema>\n >,\n >(\n target: T,\n context: ClassDecoratorContext,\n ) => T\n : Schema extends undefined // #3.3 Check that schema is undefined\n ? <R extends ClassTypeWithInstance<Type>>( // #3.3.1 Token must have a type\n target: R,\n context: ClassDecoratorContext,\n ) => R\n : never // #3.4 Cannot use a token without a type and schema\n\n// #4 Factory with typed token\nexport function Injectable<R, S>(options: {\n scope?: InjectableScope\n type: InjectableType.Factory\n token: InjectionToken<R, S>\n registry?: Registry\n}): R extends undefined // #4.1 Check that token has a type\n ? never // #4.1.1 Token must have a type\n : S extends InjectionTokenSchemaType // #4.2 Check that schema is an object or a record\n ? <T extends ClassTypeWithInstance<FactoryWithArgs<R, S>>>( // #4.2.1 Token have a schema\n target: T,\n context: ClassDecoratorContext,\n ) => T\n : S extends undefined // #4.3 For a factory without schema\n ? <T extends ClassTypeWithInstance<Factory<R>>>( // #4.3.1 Token without a schema\n target: T,\n context: ClassDecoratorContext,\n ) => T\n : never // #4.4 Cannot use a token without a type and schema\nexport function Injectable({\n scope = InjectableScope.Singleton,\n type = InjectableType.Class,\n token,\n registry = globalRegistry,\n}: InjectableOptions = {}) {\n return <T extends ClassType>(\n target: T,\n context: ClassDecoratorContext,\n ): T => {\n if (context.kind !== 'class') {\n throw new Error(\n '[ServiceLocator] @Injectable decorator can only be used on classes.',\n )\n }\n let injectableToken: InjectionToken<any, any> =\n token ?? InjectionToken.create(target)\n if (type === InjectableType.Class) {\n registry.set(\n injectableToken,\n async (ctx, args: any) => resolveService(ctx, target, [args]),\n scope,\n )\n } else if (type === InjectableType.Factory) {\n registry.set(\n injectableToken,\n async (ctx, args: any) => {\n const builder = await resolveService(ctx, target)\n if (typeof builder.create !== 'function') {\n throw new Error(\n `[ServiceLocator] Factory ${target.name} does not implement the create method.`,\n )\n }\n return builder.create(ctx, args)\n },\n scope,\n )\n }\n\n // @ts-expect-error\n target[InjectableTokenMeta] = injectableToken\n\n return target\n }\n}\n","export enum InjectableScope {\n /**\n * Singleton scope: The instance is created once and shared across the application.\n */\n Singleton = 'Singleton',\n /**\n * Instance scope: A new instance is created for each injection.\n */\n Instance = 'Instance',\n}\n","export enum InjectableType {\n Class = 'Class',\n Factory = 'Factory',\n}\n","import type { AnyZodObject } from 'zod'\n\nimport { z, ZodOptional, ZodRecord } from 'zod'\n\nexport type ClassType = new (...args: any[]) => any\nexport type ClassTypeWithArgument<Arg> = new (arg: Arg) => any\nexport type ClassTypeWithOptionalArgument<Arg> = new (arg?: Arg) => any\n\nexport type ClassTypeWithInstance<T> = new (...args: any[]) => T\nexport type ClassTypeWithInstanceAndArgument<T, Arg> = new (arg: Arg) => T\nexport type ClassTypeWithInstanceAndOptionalArgument<T, Arg> = new (\n arg?: Arg,\n) => T\n\nexport type BaseInjectionTokenSchemaType = AnyZodObject | ZodRecord\n\nexport type OptionalInjectionTokenSchemaType =\n | ZodOptional<AnyZodObject>\n | ZodOptional<ZodRecord>\n\nexport type InjectionTokenSchemaType =\n | BaseInjectionTokenSchemaType\n | OptionalInjectionTokenSchemaType\n\nexport class InjectionToken<\n T,\n S extends InjectionTokenSchemaType | unknown = unknown,\n Required extends boolean = S extends ZodOptional<AnyZodObject>\n ? false\n : S extends ZodOptional<ZodRecord>\n ? false\n : S extends AnyZodObject\n ? true\n : S extends ZodRecord\n ? true\n : false,\n> {\n public id = globalThis.crypto.randomUUID()\n private formattedName: string | null = null\n\n constructor(\n public readonly name: string | symbol | ClassType,\n public readonly schema: AnyZodObject | undefined,\n ) {}\n\n static create<T extends ClassType>(\n name: T,\n ): InjectionToken<InstanceType<T>, undefined>\n static create<T extends ClassType, Schema extends InjectionTokenSchemaType>(\n name: T,\n schema: Schema,\n ): Schema['_def']['typeName'] extends 'ZodOptional'\n ? InjectionToken<InstanceType<T>, Schema, false>\n : InjectionToken<InstanceType<T>, Schema, true>\n static create<T>(name: string | symbol): InjectionToken<T, undefined>\n static create<T, Schema extends InjectionTokenSchemaType>(\n name: string | any,\n schema: Schema,\n ): InjectionToken<T, Schema>\n static create(name: string | symbol, schema?: unknown) {\n // @ts-expect-error\n return new InjectionToken(name, schema)\n }\n\n static bound<T, S extends InjectionTokenSchemaType>(\n token: InjectionToken<T, S>,\n value: z.input<S>,\n ): BoundInjectionToken<T, S> {\n return new BoundInjectionToken(token, value)\n }\n\n static factory<T, S extends InjectionTokenSchemaType>(\n token: InjectionToken<T, S>,\n factory: () => Promise<z.input<S>>,\n ): FactoryInjectionToken<T, S> {\n return new FactoryInjectionToken(token, factory)\n }\n\n static refineType<T>(\n token: BoundInjectionToken<any, any>,\n ): BoundInjectionToken<T, any> {\n return token as BoundInjectionToken<T, any>\n }\n\n toString() {\n if (this.formattedName) {\n return this.formattedName\n }\n const { name } = this\n if (typeof name === 'function') {\n const className = name.name\n this.formattedName = `${className}(${this.id})`\n } else if (typeof name === 'symbol') {\n this.formattedName = `${name.toString()}(${this.id})`\n } else {\n this.formattedName = `${name}(${this.id})`\n }\n\n return this.formattedName\n }\n}\n\nexport class BoundInjectionToken<T, S extends InjectionTokenSchemaType> {\n public id: string\n public name: string | symbol | ClassType\n public schema: InjectionTokenSchemaType\n\n constructor(\n public readonly token: InjectionToken<T, S>,\n public readonly value: z.input<S>,\n ) {\n this.name = token.name\n this.id = token.id\n this.schema = token.schema as InjectionTokenSchemaType\n }\n\n toString() {\n return this.token.toString()\n }\n}\n\nexport class FactoryInjectionToken<T, S extends InjectionTokenSchemaType> {\n public value?: z.input<S>\n public resolved = false\n public id: string\n public name: string | symbol | ClassType\n public schema: InjectionTokenSchemaType\n\n constructor(\n public readonly token: InjectionToken<T, S>,\n public readonly factory: () => Promise<z.input<S>>,\n ) {\n this.name = token.name\n this.id = token.id\n this.schema = token.schema as InjectionTokenSchemaType\n }\n\n async resolve(): Promise<z.input<S>> {\n if (!this.value) {\n this.value = await this.factory()\n this.resolved = true\n }\n return this.value\n }\n\n toString() {\n return this.token.toString()\n }\n}\n","import type { AnyZodObject } from 'zod'\n\nimport { z } from 'zod'\n\nimport type { FactoryContext } from './factory-context.mjs'\nimport type { InjectionToken } from './injection-token.mjs'\n\nimport { InjectableScope } from './enums/index.mjs'\n\nexport type InjectionFactory<T = unknown, Args = unknown> = (\n ctx: FactoryContext,\n args: Args,\n) => Promise<T>\n\nexport type FactoryRecord<Instance = any, Schema = any> = {\n scope: InjectableScope\n originalToken: InjectionToken<Instance, Schema>\n factory: InjectionFactory<\n Instance,\n Schema extends AnyZodObject ? z.input<Schema> : unknown\n >\n}\n\nexport class Registry {\n private readonly factories = new Map<string, FactoryRecord>()\n\n constructor(private readonly parent?: Registry) {}\n\n has(token: InjectionToken<any, any>): boolean {\n if (this.factories.has(token.id)) {\n return true\n }\n if (this.parent) {\n return this.parent.has(token)\n }\n return false\n }\n\n get<Instance, Schema>(\n token: InjectionToken<Instance, Schema>,\n ): FactoryRecord<Instance, Schema> {\n const factory = this.factories.get(token.id)\n if (!factory) {\n if (this.parent) {\n return this.parent.get(token)\n }\n throw new Error(`[Registry] No factory found for ${token.toString()}`)\n }\n return factory\n }\n\n set<Instance, Schema>(\n token: InjectionToken<Instance, Schema>,\n factory: InjectionFactory,\n scope: InjectableScope,\n ) {\n this.factories.set(token.id, { factory, scope, originalToken: token })\n }\n\n delete(token: InjectionToken<any, any>) {\n this.factories.delete(token.id)\n }\n}\n\nexport const globalRegistry = new Registry()\n","import type { AnyZodObject, z, ZodOptional } from 'zod'\n\nimport type { FactoryContext } from './factory-context.mjs'\nimport type {\n BoundInjectionToken,\n FactoryInjectionToken,\n InjectionToken,\n} from './injection-token.mjs'\nimport type { ServiceLocatorEventBus } from './service-locator-event-bus.mjs'\nimport type { ServiceLocator } from './service-locator.mjs'\n\nexport class ProxyServiceLocator implements ServiceLocator {\n constructor(\n private readonly serviceLocator: ServiceLocator,\n private readonly ctx: FactoryContext,\n ) {}\n\n getEventBus(): ServiceLocatorEventBus {\n return this.serviceLocator.getEventBus()\n }\n\n // @ts-expect-error We don't need all the properties of the class\n public getInstance(\n token:\n | InjectionToken<any, any>\n | BoundInjectionToken<any, any>\n | FactoryInjectionToken<any, any>,\n args?: any,\n ) {\n // @ts-expect-error We don't need all the properties of the class\n return this.ctx.inject(token, args).then(\n (instance) => {\n return [undefined, instance]\n },\n (error) => {\n return [error]\n },\n )\n }\n public getOrThrowInstance<\n Instance,\n Schema extends AnyZodObject | ZodOptional<AnyZodObject> | undefined,\n >(\n token: InjectionToken<Instance, Schema>,\n args: Schema extends AnyZodObject\n ? z.input<Schema>\n : Schema extends ZodOptional<AnyZodObject>\n ? z.input<Schema> | undefined\n : undefined,\n ): Promise<Instance> {\n return this.ctx.inject(token, args)\n }\n public getSyncInstance<\n Instance,\n Schema extends AnyZodObject | ZodOptional<AnyZodObject> | undefined,\n >(\n token: InjectionToken<Instance, Schema>,\n args: Schema extends AnyZodObject\n ? z.input<Schema>\n : Schema extends ZodOptional<AnyZodObject>\n ? z.input<Schema> | undefined\n : undefined,\n ): Instance | null {\n return this.serviceLocator.getSyncInstance(token, args)\n }\n invalidate(service: string, round?: number): Promise<any> {\n return this.serviceLocator.invalidate(service, round)\n }\n ready(): Promise<null> {\n return this.serviceLocator.ready()\n }\n makeInstanceName(token: InjectionToken<any, any>, args: any): string {\n return this.serviceLocator.makeInstanceName(token, args)\n }\n}\n\nexport function makeProxyServiceLocator(\n serviceLocator: ServiceLocator,\n ctx: FactoryContext,\n): ServiceLocator {\n // @ts-expect-error We don't need all the properties of the class\n return new ProxyServiceLocator(serviceLocator, ctx)\n}\n","export const InjectableTokenMeta = Symbol.for('InjectableTokenMeta')\n","import type { AnyZodObject, z, ZodType } from 'zod'\n\nimport type {\n BoundInjectionToken,\n ClassType,\n FactoryInjectionToken,\n InjectionToken,\n InjectionTokenSchemaType,\n} from '../injection-token.mjs'\nimport type { ServiceLocator } from '../service-locator.mjs'\n\nimport { InjectableTokenMeta } from '../symbols/index.mjs'\n\nexport interface CreateInjectorsOptions {\n baseLocator: ServiceLocator\n}\ntype Join<TElements, TSeparator extends string> =\n TElements extends Readonly<[infer First, ...infer Rest]>\n ? Rest extends ReadonlyArray<string>\n ? First extends string\n ? `${First}${Rest extends [] ? '' : TSeparator}${Join<Rest, TSeparator>}`\n : never\n : never\n : ''\n// credits goes to https://stackoverflow.com/a/50375286\ntype UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (\n k: infer I,\n) => void\n ? I\n : never\n\n// Converts union to overloaded function\ntype UnionToOvlds<U> = UnionToIntersection<\n U extends any ? (f: U) => void : never\n>\n\ntype PopUnion<U> = UnionToOvlds<U> extends (a: infer A) => void ? A : never\n\ntype IsUnion<T> = [T] extends [UnionToIntersection<T>] ? false : true\n\ntype UnionToArray<T, A extends unknown[] = []> =\n IsUnion<T> extends true\n ? UnionToArray<Exclude<T, PopUnion<T>>, [PopUnion<T>, ...A]>\n : [T, ...A]\n\nexport interface Injectors {\n // #1 Simple class\n inject<T extends ClassType>(token: T): Promise<InstanceType<T>>\n // #2 Token with required Schema\n inject<T, S extends InjectionTokenSchemaType>(\n token: InjectionToken<T, S>,\n args: z.input<S>,\n ): Promise<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 ? 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 inject<T>(token: InjectionToken<T, undefined>): Promise<T>\n inject<T>(token: BoundInjectionToken<T, any>): Promise<T>\n inject<T>(token: FactoryInjectionToken<T, any>): Promise<T>\n\n syncInject<T extends ClassType>(token: T): InstanceType<T>\n syncInject<T, S extends InjectionTokenSchemaType>(\n token: InjectionToken<T, S>,\n args: z.input<S>,\n ): T\n // #3 Token with optional Schema\n syncInject<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 syncInject<T>(token: InjectionToken<T, undefined>): T\n syncInject<T>(token: BoundInjectionToken<T, any>): T\n syncInject<T>(token: FactoryInjectionToken<T, any>): T\n\n wrapSyncInit(cb: () => any): () => [any, Promise<any>[]]\n\n provideServiceLocator(locator: ServiceLocator): ServiceLocator\n}\n\nexport const InjectorsBase = new Map<ServiceLocator, Injectors>()\n\nexport function getInjectors({ baseLocator }: CreateInjectorsOptions) {\n if (InjectorsBase.has(baseLocator)) {\n return InjectorsBase.get(baseLocator)!\n }\n let currentLocator: ServiceLocator = baseLocator\n\n function getServiceLocator() {\n if (!currentLocator) {\n throw new Error(\n '[Injector] Service locator is not initialized. Please provide the service locator before using the @Injectable decorator.',\n )\n }\n return currentLocator\n }\n function provideServiceLocator(locator: ServiceLocator): ServiceLocator {\n const original = currentLocator\n currentLocator = locator\n return original\n }\n\n function inject(\n token:\n | ClassType\n | InjectionToken<any>\n | BoundInjectionToken<any, any>\n | FactoryInjectionToken<any, any>,\n args?: unknown,\n ) {\n // @ts-expect-error In case we have a class\n const realToken = token[InjectableTokenMeta] ?? token\n\n // @ts-expect-error We check the type in overload\n return getServiceLocator().getOrThrowInstance(realToken, args)\n }\n\n let promiseCollector: null | ((promise: Promise<any>) => void) = null\n\n function wrapSyncInit(cb: () => any) {\n return () => {\n const promises: Promise<any>[] = []\n const originalPromiseCollector = promiseCollector\n promiseCollector = (promise) => {\n promises.push(promise)\n }\n const result = cb()\n promiseCollector = originalPromiseCollector\n return [result, promises]\n }\n }\n\n function syncInject<\n T,\n Token extends\n | InjectionToken<T>\n | BoundInjectionToken<T, any>\n | FactoryInjectionToken<T, any>,\n S extends AnyZodObject | unknown = Token['schema'],\n >(token: Token, args?: S extends AnyZodObject ? z.input<S> : never): T {\n // @ts-expect-error In case we have a class\n const realToken = token[InjectableTokenMeta] ?? token\n\n const instance = getServiceLocator().getSyncInstance(realToken, args)\n if (!instance) {\n if (promiseCollector) {\n const promise = getServiceLocator().getInstance(realToken, args)\n promiseCollector(promise)\n } else {\n throw new Error(`[Injector] Cannot initiate ${realToken.toString()}`)\n }\n return new Proxy(\n {},\n {\n get() {\n throw new Error(\n `[Injector] Trying to access ${realToken.toString()} before it's initialized, please use inject() instead of syncInject() or do not use the value outside of class methods`,\n )\n },\n },\n ) as unknown as T\n }\n return instance as unknown as T\n }\n\n const injectors: Injectors = {\n inject,\n syncInject,\n wrapSyncInit,\n provideServiceLocator,\n } as Injectors\n InjectorsBase.set(baseLocator, injectors)\n\n return injectors\n}\n","import type { ClassType, InjectionToken } from '../injection-token.mjs'\n\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 new Error(\n `[ServiceLocator] Class ${target.name} is not decorated with @Injectable.`,\n )\n }\n // @ts-expect-error We detect factory or class\n return token\n}\n","import type { FactoryContext } from './factory-context.mjs'\nimport type { ClassType } from './injection-token.mjs'\n\nimport { makeProxyServiceLocator } from './proxy-service-locator.mjs'\nimport { getInjectors } from './utils/index.mjs'\n\nexport async function resolveService<T extends ClassType>(\n ctx: FactoryContext,\n target: T,\n args: any[] = [],\n): Promise<InstanceType<T>> {\n const { wrapSyncInit, provideServiceLocator } = getInjectors({\n baseLocator: ctx.locator,\n })\n const proxyServiceLocator = makeProxyServiceLocator(ctx.locator, ctx)\n const tryLoad = wrapSyncInit(() => {\n const original = provideServiceLocator(proxyServiceLocator)\n let result = new target(...args)\n provideServiceLocator(original)\n return result\n })\n let [instance, promises] = tryLoad()\n if (promises.length > 0) {\n await Promise.allSettled(promises)\n const newRes = tryLoad()\n instance = newRes[0]\n promises = newRes[1]\n }\n if (promises.length > 0) {\n console.error(`[ServiceLocator] ${target.name} has problem with it's definition.\n\n One or more of the dependencies are registered as a InjectableScope.Instance and are used with syncInject.\n\n Please use inject instead of syncInject to load those dependencies.`)\n throw new Error(\n `[ServiceLocator] Service ${target.name} cannot be instantiated.`,\n )\n }\n\n return instance\n}\n","export enum ErrorsEnum {\n InstanceExpired = 'InstanceExpired',\n InstanceNotFound = 'InstanceNotFound',\n InstanceDestroying = 'InstanceDestroying',\n UnknownError = 'UnknownError',\n FactoryNotFound = 'FactoryNotFound',\n FactoryTokenNotResolved = 'FactoryTokenNotResolved',\n}\n","import { ErrorsEnum } from './errors.enum.mjs'\n\nexport class FactoryNotFound extends Error {\n code = ErrorsEnum.FactoryNotFound\n constructor(public name: string) {\n super(`Factory ${name} not found`)\n }\n}\n","import type { ClassType } from '../injection-token.mjs'\n\nimport { ErrorsEnum } from './errors.enum.mjs'\n\nexport class FactoryTokenNotResolved extends Error {\n code = ErrorsEnum.FactoryTokenNotResolved\n constructor(name: string | symbol | ClassType) {\n super(`Factory token not resolved: ${name.toString()}`)\n }\n}\n","import { ErrorsEnum } from './errors.enum.mjs'\n\nexport class InstanceDestroying extends Error {\n code = ErrorsEnum.InstanceDestroying\n constructor(public name: string) {\n super(`Instance ${name} destroying`)\n }\n}\n","import { ErrorsEnum } from './errors.enum.mjs'\n\nexport class InstanceExpired extends Error {\n code = ErrorsEnum.InstanceExpired\n constructor(public name: string) {\n super(`Instance ${name} expired`)\n }\n}\n","import { ErrorsEnum } from './errors.enum.mjs'\n\nexport class InstanceNotFound extends Error {\n code = ErrorsEnum.InstanceNotFound\n constructor(public name: string) {\n super(`Instance ${name} not found`)\n }\n}\n","import { ErrorsEnum } from './errors.enum.mjs'\n\nexport class UnknownError extends Error {\n code = ErrorsEnum.UnknownError\n parent?: Error\n\n constructor(message: string | Error) {\n if (message instanceof Error) {\n super(message.message)\n this.parent = message\n return\n }\n super(message)\n }\n}\n","import { z } from 'zod'\n\nimport type { FactoryContext } from '../factory-context.mjs'\nimport type { InjectionTokenSchemaType } from '../injection-token.mjs'\n\nexport interface Factory<T> {\n create(ctx?: FactoryContext): Promise<T> | T\n}\n\nexport interface FactoryWithArgs<T, A extends InjectionTokenSchemaType> {\n create(...args: [FactoryContext, z.output<A>]): Promise<T> | T\n}\n","/* eslint-disable @typescript-eslint/no-non-null-assertion */\n/* eslint-disable @typescript-eslint/no-empty-object-type */\n/* eslint-disable @typescript-eslint/no-unsafe-function-type */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport type EventsConfig = {\n [event: string]: any[]\n}\nexport type EventsNames<Events extends EventsConfig> = Exclude<keyof Events, symbol | number>\nexport type EventsArgs<\n Events extends EventsConfig,\n Name extends EventsNames<Events>,\n> = Events[Name] extends any[] ? Events[Name] : []\n\nexport type ChannelEmitter<\n Events extends EventsConfig,\n Ns extends string,\n E extends EventsNames<Events>,\n> = {\n emit<Args extends EventsArgs<Events, E>>(ns: Ns, event: E, ...args: Args): Promise<any>\n}\n\nexport interface EventEmitterInterface<Events extends EventsConfig> {\n on<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n listener: (...args: Args) => void,\n ): () => void\n emit<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n ...args: Args\n ): void\n addChannel<\n E extends EventsNames<Events>,\n Ns extends string,\n Emmiter extends ChannelEmitter<Events, Ns, E>,\n >(\n ns: Ns,\n event: E,\n target: Emmiter,\n ): () => void\n}\n\nexport class EventEmitter<Events extends EventsConfig = {}>\n implements EventEmitterInterface<Events>\n{\n private listeners: Map<EventsNames<Events>, Set<Function>> = new Map()\n\n on<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n listener: (...args: Args) => void,\n ) {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set())\n }\n\n this.listeners.get(event)!.add(listener)\n\n return () => {\n this.off(event, listener)\n }\n }\n\n off<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n listener: (...args: Args) => void,\n ) {\n if (!this.listeners.has(event)) {\n return\n }\n\n this.listeners.get(event)!.delete(listener)\n if (this.listeners.get(event)!.size === 0) {\n this.listeners.delete(event)\n }\n }\n\n once<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n listener: (...args: Args) => void,\n ) {\n const off = this.on(event, (...args) => {\n off()\n // @ts-expect-error - This is a valid call\n listener(...args)\n })\n\n return off\n }\n\n async emit<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n ...args: Args\n ): Promise<any> {\n if (!this.listeners.has(event)) {\n return\n }\n\n return Promise.all(Array.from(this.listeners.get(event)!).map(listener => listener(...args)))\n }\n\n addChannel<\n E extends EventsNames<Events>,\n Ns extends string,\n Emitter extends ChannelEmitter<Events, Ns, E>,\n >(ns: Ns, event: E, target: Emitter) {\n return this.on(event, (...args) => target.emit(ns, event, ...args))\n }\n}\n","/* eslint-disable @typescript-eslint/no-empty-object-type */\n/* eslint-disable @typescript-eslint/no-unsafe-function-type */\n\ntype ListenersMap = Map<string, Map<string, Set<Function>>>\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\nexport class ServiceLocatorEventBus {\n private listeners: ListenersMap = new Map()\n constructor(private readonly logger: Console | null = null) {}\n\n on<Event extends string | `pre:${string}` | `post:${string}`>(\n ns: string,\n event: Event,\n listener: (event: Event) => void,\n ) {\n this.logger?.debug(`[ServiceLocatorEventBus]#on(): ns:${ns} event:${event}`)\n if (!this.listeners.has(ns)) {\n this.listeners.set(ns, new Map())\n }\n\n const nsEvents = this.listeners.get(ns)!\n if (!nsEvents.has(event)) {\n nsEvents.set(event, new Set())\n }\n\n nsEvents.get(event)!.add(listener)\n\n return () => {\n nsEvents.get(event)!.delete(listener)\n if (nsEvents.get(event)?.size === 0) {\n nsEvents.delete(event)\n }\n if (nsEvents.size === 0) {\n this.listeners.delete(ns)\n }\n }\n }\n\n async emit(key: string, event: string) {\n if (!this.listeners.has(key)) {\n return\n }\n\n const events = this.listeners.get(key)!\n\n const preEvent = `pre:${event}`\n const postEvent = `post:${event}`\n this.logger?.debug(`[ServiceLocatorEventBus]#emit(): ${key}:${preEvent}`)\n await Promise.allSettled(\n [...(events.get(preEvent) ?? [])].map((listener) => listener(preEvent)),\n ).then((results) => {\n results\n .filter((result) => result.status === 'rejected')\n .forEach((result: PromiseRejectedResult) => {\n this.logger?.warn(\n `[ServiceLocatorEventBus]#emit(): ${key}:${preEvent} rejected with`,\n result.reason,\n )\n })\n })\n this.logger?.debug(`[ServiceLocatorEventBus]#emit(): ${key}:${event}`)\n\n const res = await Promise.allSettled(\n [...(events.get(event) ?? [])!].map((listener) => listener(event)),\n ).then((results) => {\n const res = results\n .filter((result) => result.status === 'rejected')\n .map((result: PromiseRejectedResult) => {\n this.logger?.warn(\n `[ServiceLocatorEventBus]#emit(): ${key}:${event} rejected with`,\n result.reason,\n )\n return result\n })\n\n if (res.length > 0) {\n return Promise.reject(res)\n }\n return results\n })\n this.logger?.debug(`[ServiceLocatorEventBus]#emit(): ${key}:${postEvent}`)\n await Promise.allSettled(\n [...(events.get(postEvent) ?? [])].map((listener) => listener(postEvent)),\n ).then((results) => {\n results\n .filter((result) => result.status === 'rejected')\n .forEach((result: PromiseRejectedResult) => {\n this.logger?.warn(\n `[ServiceLocatorEventBus]#emit(): ${key}:${postEvent} rejected with`,\n result.reason,\n )\n })\n })\n return res\n }\n}\n","/* eslint-disable @typescript-eslint/no-empty-object-type */\n\nexport enum ServiceLocatorInstanceHolderKind {\n Instance = 'instance',\n Factory = 'factory',\n AbstractFactory = 'abstractFactory',\n}\n\nexport enum ServiceLocatorInstanceHolderStatus {\n Created = 'created',\n Creating = 'creating',\n Destroying = 'destroying',\n}\n\nexport type ServiceLocatorInstanceEffect = () => void\nexport type ServiceLocatorInstanceDestroyListener = () => void | Promise<void>\n\nexport interface ServiceLocatorInstanceHolderCreating<Instance> {\n status: ServiceLocatorInstanceHolderStatus.Creating\n name: string\n instance: null\n creationPromise: Promise<[undefined, Instance]> | null\n destroyPromise: null\n kind: ServiceLocatorInstanceHolderKind\n effects: ServiceLocatorInstanceEffect[]\n deps: string[]\n destroyListeners: ServiceLocatorInstanceDestroyListener[]\n createdAt: number\n ttl: number\n}\n\nexport interface ServiceLocatorInstanceHolderCreated<Instance> {\n status: ServiceLocatorInstanceHolderStatus.Created\n name: string\n instance: Instance\n creationPromise: null\n destroyPromise: null\n kind: ServiceLocatorInstanceHolderKind\n effects: ServiceLocatorInstanceEffect[]\n deps: string[]\n destroyListeners: ServiceLocatorInstanceDestroyListener[]\n createdAt: number\n ttl: number\n}\n\nexport interface ServiceLocatorInstanceHolderDestroying<Instance> {\n status: ServiceLocatorInstanceHolderStatus.Destroying\n name: string\n instance: Instance | null\n creationPromise: null\n destroyPromise: Promise<void>\n kind: ServiceLocatorInstanceHolderKind\n effects: ServiceLocatorInstanceEffect[]\n deps: string[]\n destroyListeners: ServiceLocatorInstanceDestroyListener[]\n createdAt: number\n ttl: number\n}\n\nexport type ServiceLocatorInstanceHolder<Instance = unknown> =\n | ServiceLocatorInstanceHolderCreating<Instance>\n | ServiceLocatorInstanceHolderCreated<Instance>\n | ServiceLocatorInstanceHolderDestroying<Instance>\n","/* eslint-disable @typescript-eslint/no-empty-object-type */\nimport type { ServiceLocatorInstanceHolder } from './service-locator-instance-holder.mjs'\n\nimport {\n ErrorsEnum,\n InstanceDestroying,\n InstanceExpired,\n InstanceNotFound,\n} from './errors/index.mjs'\nimport { ServiceLocatorInstanceHolderStatus } from './service-locator-instance-holder.mjs'\n\nexport class ServiceLocatorManager {\n private readonly instancesHolders: Map<string, ServiceLocatorInstanceHolder> =\n new Map()\n\n constructor(private readonly logger: Console | null = null) {}\n\n get(\n name: string,\n ):\n | [InstanceExpired | InstanceDestroying, ServiceLocatorInstanceHolder]\n | [InstanceNotFound]\n | [undefined, ServiceLocatorInstanceHolder] {\n const holder = this.instancesHolders.get(name)\n if (holder) {\n if (holder.ttl !== Infinity) {\n const now = Date.now()\n if (now - holder.createdAt > holder.ttl) {\n this.logger?.log(\n `[ServiceLocatorManager]#getInstanceHolder() TTL expired for ${holder.name}`,\n )\n return [new InstanceExpired(holder.name), holder]\n }\n } else if (\n holder.status === ServiceLocatorInstanceHolderStatus.Destroying\n ) {\n this.logger?.log(\n `[ServiceLocatorManager]#getInstanceHolder() Instance ${holder.name} is destroying`,\n )\n return [new InstanceDestroying(holder.name), holder]\n }\n\n return [undefined, holder]\n } else {\n this.logger?.log(\n `[ServiceLocatorManager]#getInstanceHolder() Instance ${name} not found`,\n )\n return [new InstanceNotFound(name)]\n }\n }\n\n set(name: string, holder: ServiceLocatorInstanceHolder): void {\n this.instancesHolders.set(name, holder)\n }\n\n has(\n name: string,\n ): [InstanceExpired | InstanceDestroying] | [undefined, boolean] {\n const [error, holder] = this.get(name)\n if (!error) {\n return [undefined, true]\n }\n if (\n [ErrorsEnum.InstanceExpired, ErrorsEnum.InstanceDestroying].includes(\n error.code,\n )\n ) {\n return [error]\n }\n return [undefined, !!holder]\n }\n\n delete(name: string): boolean {\n return this.instancesHolders.delete(name)\n }\n\n filter(\n predicate: (\n value: ServiceLocatorInstanceHolder<any>,\n key: string,\n ) => boolean,\n ): Map<string, ServiceLocatorInstanceHolder> {\n return new Map(\n [...this.instancesHolders].filter(([key, value]) =>\n predicate(value, key),\n ),\n )\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-empty-object-type */\nimport type { AnyZodObject, z, ZodOptional } from 'zod'\n\nimport type { FactoryContext } from './factory-context.mjs'\nimport type {\n BaseInjectionTokenSchemaType,\n InjectionTokenSchemaType,\n OptionalInjectionTokenSchemaType,\n} from './injection-token.mjs'\nimport type { Registry } from './registry.mjs'\nimport type { ServiceLocatorInstanceHolder } from './service-locator-instance-holder.mjs'\n\nimport { InjectableScope } from './enums/index.mjs'\nimport {\n ErrorsEnum,\n FactoryNotFound,\n FactoryTokenNotResolved,\n UnknownError,\n} from './errors/index.mjs'\nimport {\n BoundInjectionToken,\n FactoryInjectionToken,\n InjectionToken,\n} from './injection-token.mjs'\nimport { globalRegistry } from './registry.mjs'\nimport { ServiceLocatorEventBus } from './service-locator-event-bus.mjs'\nimport {\n ServiceLocatorInstanceHolderKind,\n ServiceLocatorInstanceHolderStatus,\n} from './service-locator-instance-holder.mjs'\nimport { ServiceLocatorManager } from './service-locator-manager.mjs'\nimport { getInjectableToken } from './utils/index.mjs'\n\nexport class ServiceLocator {\n private readonly eventBus: ServiceLocatorEventBus\n private readonly manager: ServiceLocatorManager\n\n constructor(\n private readonly registry: Registry = globalRegistry,\n private readonly logger: Console | null = null,\n ) {\n this.eventBus = new ServiceLocatorEventBus(logger)\n this.manager = new ServiceLocatorManager(logger)\n }\n\n getEventBus() {\n return this.eventBus\n }\n\n public storeInstance<Instance>(\n instance: Instance,\n token: BoundInjectionToken<Instance, any>,\n ): void\n public storeInstance<Instance>(\n instance: Instance,\n token: FactoryInjectionToken<Instance, any>,\n ): void\n public storeInstance<Instance>(\n instance: Instance,\n token: InjectionToken<Instance, undefined>,\n ): void\n public storeInstance<\n Instance,\n Schema extends AnyZodObject | ZodOptional<AnyZodObject>,\n >(\n instance: Instance,\n token: InjectionToken<Instance, Schema>,\n args: z.input<Schema>,\n ): void\n public storeInstance(\n instance: any,\n token:\n | InjectionToken<any, any>\n | BoundInjectionToken<any, any>\n | FactoryInjectionToken<any, any>,\n args?: any,\n ): void {\n // @ts-expect-error We should redefine the instance name type\n const instanceName = this.getInstanceIdentifier(token, args)\n this.manager.set(instanceName, {\n name: instanceName,\n instance,\n status: ServiceLocatorInstanceHolderStatus.Created,\n kind: ServiceLocatorInstanceHolderKind.Instance,\n createdAt: Date.now(),\n ttl: Infinity,\n deps: [],\n destroyListeners: [],\n effects: [],\n destroyPromise: null,\n creationPromise: null,\n })\n this.notifyListeners(instanceName)\n }\n\n public removeInstance<Instance>(\n token: BoundInjectionToken<Instance, any>,\n ): void\n public removeInstance<Instance>(\n token: FactoryInjectionToken<Instance, any>,\n ): void\n public removeInstance<Instance>(\n token: InjectionToken<Instance, undefined>,\n ): void\n public removeInstance<Instance, Schema extends BaseInjectionTokenSchemaType>(\n token: InjectionToken<Instance, Schema>,\n args: z.input<Schema>,\n ): void\n public removeInstance<\n Instance,\n Schema extends OptionalInjectionTokenSchemaType,\n >(token: InjectionToken<Instance, Schema>, args?: z.input<Schema>): void\n\n public removeInstance(\n token:\n | InjectionToken<any, any>\n | BoundInjectionToken<any, any>\n | FactoryInjectionToken<any, any>,\n args?: any,\n ) {\n // @ts-expect-error We should redefine the instance name type\n const instanceName = this.getInstanceIdentifier(token, args)\n return this.invalidate(instanceName)\n }\n\n private resolveTokenArgs<\n Instance,\n Schema extends BaseInjectionTokenSchemaType,\n >(\n token: InjectionToken<Instance, Schema>,\n args: z.input<Schema>,\n ): [undefined, z.output<Schema>] | [UnknownError]\n private resolveTokenArgs<\n Instance,\n Schema extends OptionalInjectionTokenSchemaType,\n >(\n token: InjectionToken<Instance, Schema>,\n args?: z.input<Schema>,\n ): [undefined, z.output<Schema>] | [UnknownError]\n private resolveTokenArgs<Instance, Schema extends InjectionTokenSchemaType>(\n token: BoundInjectionToken<Instance, Schema>,\n ): [undefined, z.output<Schema>] | [UnknownError]\n private resolveTokenArgs<Instance, Schema extends InjectionTokenSchemaType>(\n token: FactoryInjectionToken<Instance, Schema>,\n ): [undefined, z.output<Schema>] | [FactoryTokenNotResolved | UnknownError]\n private resolveTokenArgs(\n token:\n | InjectionToken<any, any>\n | BoundInjectionToken<any, any>\n | FactoryInjectionToken<any, any>,\n args?: any,\n ) {\n let realArgs = args\n if (token instanceof BoundInjectionToken) {\n realArgs = token.value\n } else if (token instanceof FactoryInjectionToken) {\n if (token.resolved) {\n realArgs = token.value\n } else {\n return [new FactoryTokenNotResolved(token.name)]\n }\n }\n if (!token.schema) {\n return [undefined, realArgs]\n }\n const validatedArgs = token.schema?.safeParse(realArgs)\n if (validatedArgs && !validatedArgs.success) {\n this.logger?.error(\n `[ServiceLocator]#resolveTokenArgs(): Error validating args for ${token.name.toString()}`,\n validatedArgs.error,\n )\n return [new UnknownError(validatedArgs.error)]\n }\n return [undefined, validatedArgs?.data]\n }\n\n public getInstanceIdentifier<\n Instance,\n Schema extends BaseInjectionTokenSchemaType,\n >(token: InjectionToken<Instance, Schema>, args: z.input<Schema>): string\n public getInstanceIdentifier<\n Instance,\n Schema extends OptionalInjectionTokenSchemaType,\n >(token: InjectionToken<Instance, Schema>, args?: z.input<Schema>): string\n public getInstanceIdentifier<Instance>(\n token: InjectionToken<Instance, undefined>,\n ): string\n public getInstanceIdentifier<Instance>(\n token: BoundInjectionToken<Instance, any>,\n ): string\n public getInstanceIdentifier<Instance>(\n token: FactoryInjectionToken<Instance, any>,\n ): string\n public getInstanceIdentifier(\n token:\n | InjectionToken<any, any>\n | BoundInjectionToken<any, any>\n | FactoryInjectionToken<any, any>,\n args?: any,\n ): string {\n const [err, realArgs] = this.resolveTokenArgs(\n token as InjectionToken<any>,\n args,\n )\n if (err) {\n throw err\n }\n return this.makeInstanceName(token as InjectionToken<any>, realArgs)\n }\n\n public getInstance<Instance, Schema extends BaseInjectionTokenSchemaType>(\n token: InjectionToken<Instance, Schema>,\n args: z.input<Schema>,\n ): Promise<[undefined, Instance] | [UnknownError | FactoryNotFound]>\n public getInstance<Instance, Schema extends OptionalInjectionTokenSchemaType>(\n token: InjectionToken<Instance, Schema>,\n args?: z.input<Schema>,\n ): Promise<[undefined, Instance] | [UnknownError | FactoryNotFound]>\n public getInstance<Instance>(\n token: InjectionToken<Instance, undefined>,\n ): Promise<[undefined, Instance] | [UnknownError | FactoryNotFound]>\n public getInstance<Instance>(\n token: BoundInjectionToken<Instance, any>,\n ): Promise<[undefined, Instance] | [UnknownError | FactoryNotFound]>\n public getInstance<Instance>(\n token: FactoryInjectionToken<Instance, any>,\n ): Promise<[undefined, Instance] | [UnknownError | FactoryNotFound]>\n\n public async getInstance(\n token:\n | InjectionToken<any, any>\n | BoundInjectionToken<any, any>\n | FactoryInjectionToken<any, any>,\n args?: any,\n ) {\n const [err, realArgs] = this.resolveTokenArgs(token as any, args)\n if (err instanceof UnknownError) {\n return [err]\n } else if (\n (err as any) instanceof FactoryTokenNotResolved &&\n token instanceof FactoryInjectionToken\n ) {\n this.logger?.log(\n `[ServiceLocator]#getInstance() Factory token not resolved, resolving it`,\n )\n await token.resolve()\n return this.getInstance(token)\n }\n const instanceName = this.makeInstanceName(token, realArgs)\n const [error, holder] = this.manager.get(instanceName)\n if (!error) {\n if (holder.status === ServiceLocatorInstanceHolderStatus.Creating) {\n return holder.creationPromise\n } else if (\n holder.status === ServiceLocatorInstanceHolderStatus.Destroying\n ) {\n // Should never happen\n return [new UnknownError(ErrorsEnum.InstanceDestroying)]\n }\n return [undefined, holder.instance]\n }\n switch (error.code) {\n case ErrorsEnum.InstanceDestroying:\n this.logger?.log(\n `[ServiceLocator]#getInstance() TTL expired for ${holder?.name}`,\n )\n await holder?.destroyPromise\n //Maybe we already have a new instance\n // @ts-expect-error We should redefine the instance name type\n return this.getInstance(token, args)\n\n case ErrorsEnum.InstanceExpired:\n this.logger?.log(\n `[ServiceLocator]#getInstance() TTL expired for ${holder?.name}`,\n )\n await this.invalidate(instanceName)\n //Maybe we already have a new instance\n // @ts-expect-error We should redefine the instance name type\n return this.getInstance(token, args)\n case ErrorsEnum.InstanceNotFound:\n break\n default:\n return [error]\n }\n // @ts-expect-error TS2322 It's validated\n return this.createInstance(instanceName, token, realArgs)\n }\n\n public async getOrThrowInstance<\n Instance,\n Schema extends InjectionTokenSchemaType | undefined,\n >(\n token: InjectionToken<Instance, Schema>,\n args: Schema extends AnyZodObject\n ? z.input<Schema>\n : Schema extends ZodOptional<AnyZodObject>\n ? z.input<Schema> | undefined\n : undefined,\n ): Promise<Instance> {\n const [error, instance] = await this.getInstance(token, args)\n if (error) {\n throw error\n }\n return instance\n }\n\n private notifyListeners(\n name: string,\n event: 'create' | 'destroy' = 'create',\n ) {\n this.logger?.log(\n `[ServiceLocator]#notifyListeners() Notifying listeners for ${name} with event ${event}`,\n )\n return this.eventBus.emit(name, event)\n }\n\n private async createInstance<\n Instance,\n Schema extends InjectionTokenSchemaType | undefined,\n >(\n instanceName: string,\n token: InjectionToken<Instance, Schema>,\n args: Schema extends AnyZodObject\n ? z.input<Schema>\n : Schema extends ZodOptional<AnyZodObject>\n ? z.input<Schema> | undefined\n : undefined,\n ): Promise<[undefined, Instance] | [FactoryNotFound | UnknownError]> {\n this.logger?.log(\n `[ServiceLocator]#createInstance() Creating instance for ${instanceName}`,\n )\n let realToken =\n token instanceof BoundInjectionToken ||\n token instanceof FactoryInjectionToken\n ? token.token\n : token\n if (this.registry.has(realToken)) {\n return this.resolveInstance(instanceName, realToken, args)\n } else {\n return [new FactoryNotFound(realToken.name.toString())]\n }\n }\n\n private resolveInstance<\n Instance,\n Schema extends InjectionTokenSchemaType | undefined,\n Args extends Schema extends BaseInjectionTokenSchemaType\n ? z.input<Schema>\n : Schema extends OptionalInjectionTokenSchemaType\n ? z.input<Schema> | undefined\n : undefined,\n >(\n instanceName: string,\n token: InjectionToken<Instance, Schema>,\n args: Args,\n ): Promise<[undefined, Instance] | [FactoryNotFound]> {\n this.logger?.log(\n `[ServiceLocator]#resolveInstance(): Creating instance for ${instanceName} from abstract factory`,\n )\n const ctx = this.createFactoryContext(instanceName)\n let { factory, scope } = this.registry.get<Instance, Schema>(token)\n const holder: ServiceLocatorInstanceHolder<Instance> = {\n name: instanceName,\n instance: null,\n status: ServiceLocatorInstanceHolderStatus.Creating,\n kind: ServiceLocatorInstanceHolderKind.AbstractFactory,\n // @ts-expect-error TS2322 This is correct type\n creationPromise: factory(ctx, args)\n .then(async (instance: Instance) => {\n holder.instance = instance\n holder.status = ServiceLocatorInstanceHolderStatus.Created\n holder.deps = ctx.getDependencies()\n holder.destroyListeners = ctx.getDestroyListeners()\n holder.ttl = ctx.getTtl()\n if (holder.deps.length > 0) {\n this.logger?.log(\n `[ServiceLocator]#createInstanceFromAbstractFactory(): Adding subscriptions for ${instanceName} dependencies for their invalidations: ${holder.deps.join(\n ', ',\n )}`,\n )\n holder.deps.forEach((dependency) => {\n holder.destroyListeners.push(\n this.eventBus.on(dependency, 'destroy', () =>\n this.invalidate(instanceName),\n ),\n )\n })\n }\n if (holder.ttl === 0 || scope === InjectableScope.Instance) {\n // One time instance\n await this.invalidate(instanceName)\n }\n await this.notifyListeners(instanceName)\n return [undefined, instance as Instance]\n })\n .catch((error) => {\n this.logger?.error(\n `[ServiceLocator]#createInstanceFromAbstractFactory(): Error creating instance for ${instanceName}`,\n error,\n )\n return [new UnknownError(error)]\n }),\n effects: [],\n deps: [],\n destroyListeners: [],\n createdAt: Date.now(),\n ttl: Infinity,\n }\n\n if (scope === InjectableScope.Singleton) {\n this.logger?.debug(\n `[ServiceLocator]#resolveInstance(): Setting instance for ${instanceName}`,\n )\n this.manager.set(instanceName, holder)\n }\n // @ts-expect-error TS2322 This is correct type\n return holder.creationPromise\n }\n\n private createFactoryContext(instanceName: string): FactoryContext {\n const dependencies = new Set<string>()\n const destroyListeners = new Set<() => void>()\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this\n\n function invalidate(name = instanceName) {\n return self.invalidate(name)\n }\n function addEffect(listener: () => void) {\n destroyListeners.add(listener)\n }\n let ttl = Infinity\n function setTtl(value: number) {\n ttl = value\n }\n function getTtl() {\n return ttl\n }\n\n function on(key: string, event: string, listener: (event: string) => void) {\n destroyListeners.add(self.eventBus.on(key, event, listener))\n }\n\n return {\n // @ts-expect-error This is correct type\n async inject(token, args) {\n let injectionToken = token\n if (typeof token === 'function') {\n injectionToken = getInjectableToken(token)\n }\n if (injectionToken) {\n const [err, validatedArgs] = self.resolveTokenArgs(\n injectionToken,\n args,\n )\n if (err) {\n throw err\n }\n const instanceName = self.makeInstanceName(token, validatedArgs)\n dependencies.add(instanceName)\n return self.getOrThrowInstance(injectionToken, args as any)\n }\n throw new Error(\n `[ServiceLocator]#inject(): Invalid token type: ${typeof token}. Expected a class or an InjectionToken.`,\n )\n },\n invalidate,\n on: on as ServiceLocatorEventBus['on'],\n getDependencies: () => Array.from(dependencies),\n addEffect,\n getDestroyListeners: () => Array.from(destroyListeners),\n setTtl,\n getTtl,\n locator: self,\n }\n }\n\n public getSyncInstance<\n Instance,\n Schema extends InjectionTokenSchemaType | undefined,\n >(\n token: InjectionToken<Instance, Schema>,\n args: Schema extends AnyZodObject\n ? z.input<Schema>\n : Schema extends ZodOptional<AnyZodObject>\n ? z.input<Schema> | undefined\n : undefined,\n ): Instance | null {\n const [err, realArgs] = this.resolveTokenArgs(token, args)\n if (err) {\n return null\n }\n const instanceName = this.makeInstanceName(token, realArgs)\n const [error, holder] = this.manager.get(instanceName)\n if (error) {\n return null\n }\n return holder.instance as Instance\n }\n\n invalidate(service: string, round = 1): Promise<any> {\n this.logger?.log(\n `[ServiceLocator]#invalidate(): Starting Invalidating process of ${service}`,\n )\n const toInvalidate = this.manager.filter(\n (holder) => holder.name === service || holder.deps.includes(service),\n )\n const promises = []\n for (const [key, holder] of toInvalidate.entries()) {\n if (holder.status === ServiceLocatorInstanceHolderStatus.Destroying) {\n this.logger?.trace(\n `[ServiceLocator]#invalidate(): ${key} is already being destroyed`,\n )\n promises.push(holder.destroyPromise)\n continue\n }\n if (holder.status === ServiceLocatorInstanceHolderStatus.Creating) {\n this.logger?.trace(\n `[ServiceLocator]#invalidate(): ${key} is being created, waiting for creation to finish`,\n )\n promises.push(\n holder.creationPromise?.then(() => {\n if (round > 3) {\n this.logger?.error(\n `[ServiceLocator]#invalidate(): ${key} creation is triggering a new invalidation round, but it is still not created`,\n )\n return\n }\n return this.invalidate(key, round + 1)\n }),\n )\n continue\n }\n // @ts-expect-error TS2322 we are changing the status\n holder.status = ServiceLocatorInstanceHolderStatus.Destroying\n this.logger?.log(\n `[ServiceLocator]#invalidate(): Invalidating ${key} and notifying listeners`,\n )\n // @ts-expect-error TS2322 we are changing the status\n holder.destroyPromise = Promise.all(\n holder.destroyListeners.map((listener) => listener()),\n ).then(async () => {\n this.manager.delete(key)\n await this.notifyListeners(key, 'destroy')\n })\n promises.push(holder.destroyPromise)\n }\n return Promise.all(promises)\n }\n\n async ready() {\n return Promise.all(\n Array.from(this.manager.filter(() => true)).map(([, holder]) => {\n if (holder.status === ServiceLocatorInstanceHolderStatus.Creating) {\n return holder.creationPromise?.then(() => null)\n }\n if (holder.status === ServiceLocatorInstanceHolderStatus.Destroying) {\n return holder.destroyPromise.then(() => null)\n }\n return Promise.resolve(null)\n }),\n ).then(() => null)\n }\n\n makeInstanceName(\n token:\n | InjectionToken<any, any>\n | BoundInjectionToken<any, any>\n | FactoryInjectionToken<any, any>,\n args: any,\n ) {\n const formattedArgs = args\n ? ':' +\n Object.entries(args ?? {})\n .sort(([keyA], [keyB]) => keyA.localeCompare(keyB))\n .map(([key, value]) => {\n if (typeof value === 'function') {\n return `${key}=fn_${value.name}(${value.length})`\n }\n if (typeof value === 'symbol') {\n return `${key}=${value.toString()}`\n }\n return `${key}=${JSON.stringify(value).slice(0, 40)}`\n })\n .join(',')\n .replaceAll(/\"/g, '')\n .replaceAll(/:/g, '=')\n : ''\n return `${token.toString()}${formattedArgs}`\n }\n}\n","import type { Injectors } from './utils/index.mjs'\n\nimport { globalRegistry } from './registry.mjs'\nimport { ServiceLocator } from './service-locator.mjs'\nimport { getInjectors } from './utils/index.mjs'\n\nconst globalServiceLocator: ServiceLocator = new ServiceLocator(globalRegistry)\n\nexport function getGlobalServiceLocator(): ServiceLocator {\n if (!globalServiceLocator) {\n throw new Error(\n '[ServiceLocator] Service locator is not initialized. Please provide the service locator before using the @Injectable decorator.',\n )\n }\n return globalServiceLocator\n}\nconst values = getInjectors({\n baseLocator: globalServiceLocator,\n})\n\nexport const inject: Injectors['inject'] = values.inject\n\nexport const syncInject: Injectors['syncInject'] = values.syncInject\n\nexport const wrapSyncInit: Injectors['wrapSyncInit'] = values.wrapSyncInit\n\nexport const provideServiceLocator: Injectors['provideServiceLocator'] =\n values.provideServiceLocator\n"],"mappings":"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","names":["import_zod","InjectableScope","InjectableType","import_zod","provideServiceLocator","inject","wrapSyncInit","syncInject","wrapSyncInit","provideServiceLocator","ErrorsEnum","import_zod","res","ServiceLocatorInstanceHolderKind","ServiceLocatorInstanceHolderStatus","instanceName"]}
|
|
1
|
+
{"version":3,"sources":["../src/enums/injectable-scope.enum.mts","../src/enums/injectable-type.enum.mts","../src/injection-token.mts","../src/registry.mts","../src/proxy-service-locator.mts","../src/symbols/injectable-token.mts","../src/utils/get-injectors.mts","../src/utils/get-injectable-token.mts","../src/resolve-service.mts","../src/decorators/injectable.decorator.mts","../src/errors/errors.enum.mts","../src/errors/factory-not-found.mts","../src/errors/factory-token-not-resolved.mts","../src/errors/instance-destroying.mts","../src/errors/instance-expired.mts","../src/errors/instance-not-found.mts","../src/errors/unknown-error.mts","../src/event-emitter.mts","../src/service-locator-event-bus.mts","../src/service-locator-instance-holder.mts","../src/service-locator-manager.mts","../src/service-locator.mts","../src/injector.mts"],"names":["InjectableScope","InjectableType","provideServiceLocator","inject","wrapSyncInit","syncInject","ErrorsEnum","res","ServiceLocatorInstanceHolderKind","ServiceLocatorInstanceHolderStatus","instanceName"],"mappings":"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","file":"index.js","sourcesContent":["export enum InjectableScope {\n /**\n * Singleton scope: The instance is created once and shared across the application.\n */\n Singleton = 'Singleton',\n /**\n * Instance scope: A new instance is created for each injection.\n */\n Instance = 'Instance',\n}\n","export enum InjectableType {\n Class = 'Class',\n Factory = 'Factory',\n}\n","import type { AnyZodObject } from 'zod'\n\nimport { z, ZodOptional, ZodRecord } from 'zod'\n\nexport type ClassType = new (...args: any[]) => any\nexport type ClassTypeWithArgument<Arg> = new (arg: Arg) => any\nexport type ClassTypeWithOptionalArgument<Arg> = new (arg?: Arg) => any\n\nexport type ClassTypeWithInstance<T> = new (...args: any[]) => T\nexport type ClassTypeWithInstanceAndArgument<T, Arg> = new (arg: Arg) => T\nexport type ClassTypeWithInstanceAndOptionalArgument<T, Arg> = new (\n arg?: Arg,\n) => T\n\nexport type BaseInjectionTokenSchemaType = AnyZodObject | ZodRecord\n\nexport type OptionalInjectionTokenSchemaType =\n | ZodOptional<AnyZodObject>\n | ZodOptional<ZodRecord>\n\nexport type InjectionTokenSchemaType =\n | BaseInjectionTokenSchemaType\n | OptionalInjectionTokenSchemaType\n\nexport class InjectionToken<\n T,\n S extends InjectionTokenSchemaType | unknown = unknown,\n Required extends boolean = S extends ZodOptional<AnyZodObject>\n ? false\n : S extends ZodOptional<ZodRecord>\n ? false\n : S extends AnyZodObject\n ? true\n : S extends ZodRecord\n ? true\n : false,\n> {\n public id = globalThis.crypto.randomUUID()\n private formattedName: string | null = null\n\n constructor(\n public readonly name: string | symbol | ClassType,\n public readonly schema: AnyZodObject | undefined,\n ) {}\n\n static create<T extends ClassType>(\n name: T,\n ): InjectionToken<InstanceType<T>, undefined>\n static create<T extends ClassType, Schema extends InjectionTokenSchemaType>(\n name: T,\n schema: Schema,\n ): Schema['_def']['typeName'] extends 'ZodOptional'\n ? InjectionToken<InstanceType<T>, Schema, false>\n : InjectionToken<InstanceType<T>, Schema, true>\n static create<T>(name: string | symbol): InjectionToken<T, undefined>\n static create<T, Schema extends InjectionTokenSchemaType>(\n name: string | any,\n schema: Schema,\n ): InjectionToken<T, Schema>\n static create(name: string | symbol, schema?: unknown) {\n // @ts-expect-error\n return new InjectionToken(name, schema)\n }\n\n static bound<T, S extends InjectionTokenSchemaType>(\n token: InjectionToken<T, S>,\n value: z.input<S>,\n ): BoundInjectionToken<T, S> {\n return new BoundInjectionToken(token, value)\n }\n\n static factory<T, S extends InjectionTokenSchemaType>(\n token: InjectionToken<T, S>,\n factory: () => Promise<z.input<S>>,\n ): FactoryInjectionToken<T, S> {\n return new FactoryInjectionToken(token, factory)\n }\n\n static refineType<T>(\n token: BoundInjectionToken<any, any>,\n ): BoundInjectionToken<T, any> {\n return token as BoundInjectionToken<T, any>\n }\n\n toString() {\n if (this.formattedName) {\n return this.formattedName\n }\n const { name } = this\n if (typeof name === 'function') {\n const className = name.name\n this.formattedName = `${className}(${this.id})`\n } else if (typeof name === 'symbol') {\n this.formattedName = `${name.toString()}(${this.id})`\n } else {\n this.formattedName = `${name}(${this.id})`\n }\n\n return this.formattedName\n }\n}\n\nexport class BoundInjectionToken<T, S extends InjectionTokenSchemaType> {\n public id: string\n public name: string | symbol | ClassType\n public schema: InjectionTokenSchemaType\n\n constructor(\n public readonly token: InjectionToken<T, S>,\n public readonly value: z.input<S>,\n ) {\n this.name = token.name\n this.id = token.id\n this.schema = token.schema as InjectionTokenSchemaType\n }\n\n toString() {\n return this.token.toString()\n }\n}\n\nexport class FactoryInjectionToken<T, S extends InjectionTokenSchemaType> {\n public value?: z.input<S>\n public resolved = false\n public id: string\n public name: string | symbol | ClassType\n public schema: InjectionTokenSchemaType\n\n constructor(\n public readonly token: InjectionToken<T, S>,\n public readonly factory: () => Promise<z.input<S>>,\n ) {\n this.name = token.name\n this.id = token.id\n this.schema = token.schema as InjectionTokenSchemaType\n }\n\n async resolve(): Promise<z.input<S>> {\n if (!this.value) {\n this.value = await this.factory()\n this.resolved = true\n }\n return this.value\n }\n\n toString() {\n return this.token.toString()\n }\n}\n","import type { AnyZodObject } from 'zod'\n\nimport { z } from 'zod'\n\nimport type { FactoryContext } from './factory-context.mjs'\nimport type { InjectionToken } from './injection-token.mjs'\n\nimport { InjectableScope } from './enums/index.mjs'\n\nexport type InjectionFactory<T = unknown, Args = unknown> = (\n ctx: FactoryContext,\n args: Args,\n) => Promise<T>\n\nexport type FactoryRecord<Instance = any, Schema = any> = {\n scope: InjectableScope\n originalToken: InjectionToken<Instance, Schema>\n factory: InjectionFactory<\n Instance,\n Schema extends AnyZodObject ? z.input<Schema> : unknown\n >\n}\n\nexport class Registry {\n private readonly factories = new Map<string, FactoryRecord>()\n\n constructor(private readonly parent?: Registry) {}\n\n has(token: InjectionToken<any, any>): boolean {\n if (this.factories.has(token.id)) {\n return true\n }\n if (this.parent) {\n return this.parent.has(token)\n }\n return false\n }\n\n get<Instance, Schema>(\n token: InjectionToken<Instance, Schema>,\n ): FactoryRecord<Instance, Schema> {\n const factory = this.factories.get(token.id)\n if (!factory) {\n if (this.parent) {\n return this.parent.get(token)\n }\n throw new Error(`[Registry] No factory found for ${token.toString()}`)\n }\n return factory\n }\n\n set<Instance, Schema>(\n token: InjectionToken<Instance, Schema>,\n factory: InjectionFactory,\n scope: InjectableScope,\n ) {\n this.factories.set(token.id, { factory, scope, originalToken: token })\n }\n\n delete(token: InjectionToken<any, any>) {\n this.factories.delete(token.id)\n }\n}\n\nexport const globalRegistry = new Registry()\n","import type { AnyZodObject, z, ZodOptional } from 'zod'\n\nimport type { FactoryContext } from './factory-context.mjs'\nimport type {\n BoundInjectionToken,\n FactoryInjectionToken,\n InjectionToken,\n} from './injection-token.mjs'\nimport type { ServiceLocatorEventBus } from './service-locator-event-bus.mjs'\nimport type { ServiceLocator } from './service-locator.mjs'\n\nexport class ProxyServiceLocator implements ServiceLocator {\n constructor(\n private readonly serviceLocator: ServiceLocator,\n private readonly ctx: FactoryContext,\n ) {}\n\n getEventBus(): ServiceLocatorEventBus {\n return this.serviceLocator.getEventBus()\n }\n\n // @ts-expect-error We don't need all the properties of the class\n public getInstance(\n token:\n | InjectionToken<any, any>\n | BoundInjectionToken<any, any>\n | FactoryInjectionToken<any, any>,\n args?: any,\n ) {\n // @ts-expect-error We don't need all the properties of the class\n return this.ctx.inject(token, args).then(\n (instance) => {\n return [undefined, instance]\n },\n (error) => {\n return [error]\n },\n )\n }\n public getOrThrowInstance<\n Instance,\n Schema extends AnyZodObject | ZodOptional<AnyZodObject> | undefined,\n >(\n token: InjectionToken<Instance, Schema>,\n args: Schema extends AnyZodObject\n ? z.input<Schema>\n : Schema extends ZodOptional<AnyZodObject>\n ? z.input<Schema> | undefined\n : undefined,\n ): Promise<Instance> {\n return this.ctx.inject(token, args)\n }\n public getSyncInstance<\n Instance,\n Schema extends AnyZodObject | ZodOptional<AnyZodObject> | undefined,\n >(\n token: InjectionToken<Instance, Schema>,\n args: Schema extends AnyZodObject\n ? z.input<Schema>\n : Schema extends ZodOptional<AnyZodObject>\n ? z.input<Schema> | undefined\n : undefined,\n ): Instance | null {\n return this.serviceLocator.getSyncInstance(token, args)\n }\n invalidate(service: string, round?: number): Promise<any> {\n return this.serviceLocator.invalidate(service, round)\n }\n ready(): Promise<null> {\n return this.serviceLocator.ready()\n }\n makeInstanceName(token: InjectionToken<any, any>, args: any): string {\n return this.serviceLocator.makeInstanceName(token, args)\n }\n}\n\nexport function makeProxyServiceLocator(\n serviceLocator: ServiceLocator,\n ctx: FactoryContext,\n): ServiceLocator {\n // @ts-expect-error We don't need all the properties of the class\n return new ProxyServiceLocator(serviceLocator, ctx)\n}\n","export const InjectableTokenMeta = Symbol.for('InjectableTokenMeta')\n","import type { AnyZodObject, z, ZodType } from 'zod'\n\nimport type {\n BoundInjectionToken,\n ClassType,\n FactoryInjectionToken,\n InjectionToken,\n InjectionTokenSchemaType,\n} from '../injection-token.mjs'\nimport type { ServiceLocator } from '../service-locator.mjs'\n\nimport { InjectableTokenMeta } from '../symbols/index.mjs'\n\nexport interface CreateInjectorsOptions {\n baseLocator: ServiceLocator\n}\ntype Join<TElements, TSeparator extends string> =\n TElements extends Readonly<[infer First, ...infer Rest]>\n ? Rest extends ReadonlyArray<string>\n ? First extends string\n ? `${First}${Rest extends [] ? '' : TSeparator}${Join<Rest, TSeparator>}`\n : never\n : never\n : ''\n// credits goes to https://stackoverflow.com/a/50375286\ntype UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (\n k: infer I,\n) => void\n ? I\n : never\n\n// Converts union to overloaded function\ntype UnionToOvlds<U> = UnionToIntersection<\n U extends any ? (f: U) => void : never\n>\n\ntype PopUnion<U> = UnionToOvlds<U> extends (a: infer A) => void ? A : never\n\ntype IsUnion<T> = [T] extends [UnionToIntersection<T>] ? false : true\n\ntype UnionToArray<T, A extends unknown[] = []> =\n IsUnion<T> extends true\n ? UnionToArray<Exclude<T, PopUnion<T>>, [PopUnion<T>, ...A]>\n : [T, ...A]\n\nexport interface Injectors {\n // #1 Simple class\n inject<T extends ClassType>(token: T): Promise<InstanceType<T>>\n // #2 Token with required Schema\n inject<T, S extends InjectionTokenSchemaType>(\n token: InjectionToken<T, S>,\n args: z.input<S>,\n ): Promise<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 ? 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 inject<T>(token: InjectionToken<T, undefined>): Promise<T>\n inject<T>(token: BoundInjectionToken<T, any>): Promise<T>\n inject<T>(token: FactoryInjectionToken<T, any>): Promise<T>\n\n syncInject<T extends ClassType>(token: T): InstanceType<T>\n syncInject<T, S extends InjectionTokenSchemaType>(\n token: InjectionToken<T, S>,\n args: z.input<S>,\n ): T\n // #3 Token with optional Schema\n syncInject<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 syncInject<T>(token: InjectionToken<T, undefined>): T\n syncInject<T>(token: BoundInjectionToken<T, any>): T\n syncInject<T>(token: FactoryInjectionToken<T, any>): T\n\n wrapSyncInit(cb: () => any): () => [any, Promise<any>[]]\n\n provideServiceLocator(locator: ServiceLocator): ServiceLocator\n}\n\nexport const InjectorsBase = new Map<ServiceLocator, Injectors>()\n\nexport function getInjectors({ baseLocator }: CreateInjectorsOptions) {\n if (InjectorsBase.has(baseLocator)) {\n return InjectorsBase.get(baseLocator)!\n }\n let currentLocator: ServiceLocator = baseLocator\n\n function getServiceLocator() {\n if (!currentLocator) {\n throw new Error(\n '[Injector] Service locator is not initialized. Please provide the service locator before using the @Injectable decorator.',\n )\n }\n return currentLocator\n }\n function provideServiceLocator(locator: ServiceLocator): ServiceLocator {\n const original = currentLocator\n currentLocator = locator\n return original\n }\n\n function inject(\n token:\n | ClassType\n | InjectionToken<any>\n | BoundInjectionToken<any, any>\n | FactoryInjectionToken<any, any>,\n args?: unknown,\n ) {\n // @ts-expect-error In case we have a class\n const realToken = token[InjectableTokenMeta] ?? token\n\n // @ts-expect-error We check the type in overload\n return getServiceLocator().getOrThrowInstance(realToken, args)\n }\n\n let promiseCollector: null | ((promise: Promise<any>) => void) = null\n\n function wrapSyncInit(cb: () => any) {\n return () => {\n const promises: Promise<any>[] = []\n const originalPromiseCollector = promiseCollector\n promiseCollector = (promise) => {\n promises.push(promise)\n }\n const result = cb()\n promiseCollector = originalPromiseCollector\n return [result, promises]\n }\n }\n\n function syncInject<\n T,\n Token extends\n | InjectionToken<T>\n | BoundInjectionToken<T, any>\n | FactoryInjectionToken<T, any>,\n S extends AnyZodObject | unknown = Token['schema'],\n >(token: Token, args?: S extends AnyZodObject ? z.input<S> : never): T {\n // @ts-expect-error In case we have a class\n const realToken = token[InjectableTokenMeta] ?? token\n\n const instance = getServiceLocator().getSyncInstance(realToken, args)\n if (!instance) {\n if (promiseCollector) {\n const promise = getServiceLocator().getInstance(realToken, args)\n promiseCollector(promise)\n } else {\n throw new Error(`[Injector] Cannot initiate ${realToken.toString()}`)\n }\n return new Proxy(\n {},\n {\n get() {\n throw new Error(\n `[Injector] Trying to access ${realToken.toString()} before it's initialized, please use inject() instead of syncInject() or do not use the value outside of class methods`,\n )\n },\n },\n ) as unknown as T\n }\n return instance as unknown as T\n }\n\n const injectors: Injectors = {\n inject,\n syncInject,\n wrapSyncInit,\n provideServiceLocator,\n } as Injectors\n InjectorsBase.set(baseLocator, injectors)\n\n return injectors\n}\n","import type { ClassType, InjectionToken } from '../injection-token.mjs'\n\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 new Error(\n `[ServiceLocator] Class ${target.name} is not decorated with @Injectable.`,\n )\n }\n // @ts-expect-error We detect factory or class\n return token\n}\n","import type { FactoryContext } from './factory-context.mjs'\nimport type { ClassType } from './injection-token.mjs'\n\nimport { makeProxyServiceLocator } from './proxy-service-locator.mjs'\nimport { getInjectors } from './utils/index.mjs'\n\nexport async function resolveService<T extends ClassType>(\n ctx: FactoryContext,\n target: T,\n args: any[] = [],\n): Promise<InstanceType<T>> {\n const { wrapSyncInit, provideServiceLocator } = getInjectors({\n baseLocator: ctx.locator,\n })\n const proxyServiceLocator = makeProxyServiceLocator(ctx.locator, ctx)\n const tryLoad = wrapSyncInit(() => {\n const original = provideServiceLocator(proxyServiceLocator)\n let result = new target(...args)\n provideServiceLocator(original)\n return result\n })\n let [instance, promises] = tryLoad()\n if (promises.length > 0) {\n await Promise.allSettled(promises)\n const newRes = tryLoad()\n instance = newRes[0]\n promises = newRes[1]\n }\n if (promises.length > 0) {\n console.error(`[ServiceLocator] ${target.name} has problem with it's definition.\n\n One or more of the dependencies are registered as a InjectableScope.Instance and are used with syncInject.\n\n Please use inject instead of syncInject to load those dependencies.`)\n throw new Error(\n `[ServiceLocator] Service ${target.name} cannot be instantiated.`,\n )\n }\n\n return instance\n}\n","import { z } from 'zod'\n\nimport type {\n BaseInjectionTokenSchemaType,\n ClassType,\n ClassTypeWithArgument,\n ClassTypeWithInstance,\n ClassTypeWithInstanceAndArgument,\n ClassTypeWithInstanceAndOptionalArgument,\n ClassTypeWithOptionalArgument,\n InjectionTokenSchemaType,\n OptionalInjectionTokenSchemaType,\n} from '../injection-token.mjs'\nimport type { Factory, FactoryWithArgs } from '../interfaces/index.mjs'\nimport type { Registry } from '../registry.mjs'\n\nimport { InjectableScope, InjectableType } from '../enums/index.mjs'\nimport { InjectionToken } from '../injection-token.mjs'\nimport { globalRegistry } from '../registry.mjs'\nimport { resolveService } from '../resolve-service.mjs'\nimport { InjectableTokenMeta } from '../symbols/index.mjs'\n\nexport interface InjectableOptions {\n scope?: InjectableScope\n type?: InjectableType\n token?: InjectionToken<any, any>\n registry?: Registry\n}\n// #1 Simple constructorless class\nexport function Injectable(): <T extends ClassType>(\n target: T,\n context?: ClassDecoratorContext,\n) => T\nexport function Injectable(options: {\n registry: Registry\n}): <T extends ClassType>(target: T, context?: ClassDecoratorContext) => T\n\n// #2 Factory without arguments\nexport function Injectable<R>(options: {\n scope?: InjectableScope\n type: InjectableType.Factory\n registry?: Registry\n}): <T extends ClassTypeWithInstance<Factory<R>>>(\n target: T,\n context?: ClassDecoratorContext,\n) => T\n\n// #3 Class with typeless token and schema\nexport function Injectable<Type, Schema>(options: {\n scope?: InjectableScope\n type?: InjectableType.Class\n token: InjectionToken<Type, Schema>\n registry?: Registry\n}): Schema extends BaseInjectionTokenSchemaType // #3.1 Check that schema is an object or a record\n ? Type extends undefined\n ? <T extends ClassTypeWithArgument<z.output<Schema>>>( // #3.1.1 Typeless token\n target: T,\n context?: ClassDecoratorContext,\n ) => T\n : <T extends ClassTypeWithInstanceAndArgument<Type, z.output<Schema>>>( // #3.1.2 Typed token\n target: T,\n context?: ClassDecoratorContext,\n ) => T\n : Schema extends OptionalInjectionTokenSchemaType // #3.2 Check that schema is an optional object or a record\n ? Type extends undefined\n ? <T extends ClassTypeWithOptionalArgument<z.output<Schema>>>( // #3.2.1 Typeless token\n target: T,\n context?: ClassDecoratorContext,\n ) => T\n : <\n // #3.2.2 Typed token\n T extends ClassTypeWithInstanceAndOptionalArgument<\n Type,\n z.output<Schema>\n >,\n >(\n target: T,\n context?: ClassDecoratorContext,\n ) => T\n : Schema extends undefined // #3.3 Check that schema is undefined\n ? <R extends ClassTypeWithInstance<Type>>( // #3.3.1 Token must have a type\n target: R,\n context?: ClassDecoratorContext,\n ) => R\n : never // #3.4 Cannot use a token without a type and schema\n\n// #4 Factory with typed token\nexport function Injectable<R, S>(options: {\n scope?: InjectableScope\n type: InjectableType.Factory\n token: InjectionToken<R, S>\n registry?: Registry\n}): R extends undefined // #4.1 Check that token has a type\n ? never // #4.1.1 Token must have a type\n : S extends InjectionTokenSchemaType // #4.2 Check that schema is an object or a record\n ? <T extends ClassTypeWithInstance<FactoryWithArgs<R, S>>>( // #4.2.1 Token have a schema\n target: T,\n context?: ClassDecoratorContext,\n ) => T\n : S extends undefined // #4.3 For a factory without schema\n ? <T extends ClassTypeWithInstance<Factory<R>>>( // #4.3.1 Token without a schema\n target: T,\n context?: ClassDecoratorContext,\n ) => T\n : never // #4.4 Cannot use a token without a type and schema\nexport function Injectable({\n scope = InjectableScope.Singleton,\n type = InjectableType.Class,\n token,\n registry = globalRegistry,\n}: InjectableOptions = {}) {\n return <T extends ClassType>(\n target: T,\n context?: ClassDecoratorContext,\n ): T => {\n if (\n (context && context.kind !== 'class') ||\n (target instanceof Function && !context)\n ) {\n throw new Error(\n '[ServiceLocator] @Injectable decorator can only be used on classes.',\n )\n }\n let injectableToken: InjectionToken<any, any> =\n token ?? InjectionToken.create(target)\n if (type === InjectableType.Class) {\n registry.set(\n injectableToken,\n async (ctx, args: any) => resolveService(ctx, target, [args]),\n scope,\n )\n } else if (type === InjectableType.Factory) {\n registry.set(\n injectableToken,\n async (ctx, args: any) => {\n const builder = await resolveService(ctx, target)\n if (typeof builder.create !== 'function') {\n throw new Error(\n `[ServiceLocator] Factory ${target.name} does not implement the create method.`,\n )\n }\n return builder.create(ctx, args)\n },\n scope,\n )\n }\n\n // @ts-expect-error\n target[InjectableTokenMeta] = injectableToken\n\n return target\n }\n}\n","export enum ErrorsEnum {\n InstanceExpired = 'InstanceExpired',\n InstanceNotFound = 'InstanceNotFound',\n InstanceDestroying = 'InstanceDestroying',\n UnknownError = 'UnknownError',\n FactoryNotFound = 'FactoryNotFound',\n FactoryTokenNotResolved = 'FactoryTokenNotResolved',\n}\n","import { ErrorsEnum } from './errors.enum.mjs'\n\nexport class FactoryNotFound extends Error {\n code = ErrorsEnum.FactoryNotFound\n constructor(public name: string) {\n super(`Factory ${name} not found`)\n }\n}\n","import type { ClassType } from '../injection-token.mjs'\n\nimport { ErrorsEnum } from './errors.enum.mjs'\n\nexport class FactoryTokenNotResolved extends Error {\n code = ErrorsEnum.FactoryTokenNotResolved\n constructor(name: string | symbol | ClassType) {\n super(`Factory token not resolved: ${name.toString()}`)\n }\n}\n","import { ErrorsEnum } from './errors.enum.mjs'\n\nexport class InstanceDestroying extends Error {\n code = ErrorsEnum.InstanceDestroying\n constructor(public name: string) {\n super(`Instance ${name} destroying`)\n }\n}\n","import { ErrorsEnum } from './errors.enum.mjs'\n\nexport class InstanceExpired extends Error {\n code = ErrorsEnum.InstanceExpired\n constructor(public name: string) {\n super(`Instance ${name} expired`)\n }\n}\n","import { ErrorsEnum } from './errors.enum.mjs'\n\nexport class InstanceNotFound extends Error {\n code = ErrorsEnum.InstanceNotFound\n constructor(public name: string) {\n super(`Instance ${name} not found`)\n }\n}\n","import { ErrorsEnum } from './errors.enum.mjs'\n\nexport class UnknownError extends Error {\n code = ErrorsEnum.UnknownError\n parent?: Error\n\n constructor(message: string | Error) {\n if (message instanceof Error) {\n super(message.message)\n this.parent = message\n return\n }\n super(message)\n }\n}\n","/* eslint-disable @typescript-eslint/no-non-null-assertion */\n/* eslint-disable @typescript-eslint/no-empty-object-type */\n/* eslint-disable @typescript-eslint/no-unsafe-function-type */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport type EventsConfig = {\n [event: string]: any[]\n}\nexport type EventsNames<Events extends EventsConfig> = Exclude<keyof Events, symbol | number>\nexport type EventsArgs<\n Events extends EventsConfig,\n Name extends EventsNames<Events>,\n> = Events[Name] extends any[] ? Events[Name] : []\n\nexport type ChannelEmitter<\n Events extends EventsConfig,\n Ns extends string,\n E extends EventsNames<Events>,\n> = {\n emit<Args extends EventsArgs<Events, E>>(ns: Ns, event: E, ...args: Args): Promise<any>\n}\n\nexport interface EventEmitterInterface<Events extends EventsConfig> {\n on<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n listener: (...args: Args) => void,\n ): () => void\n emit<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n ...args: Args\n ): void\n addChannel<\n E extends EventsNames<Events>,\n Ns extends string,\n Emmiter extends ChannelEmitter<Events, Ns, E>,\n >(\n ns: Ns,\n event: E,\n target: Emmiter,\n ): () => void\n}\n\nexport class EventEmitter<Events extends EventsConfig = {}>\n implements EventEmitterInterface<Events>\n{\n private listeners: Map<EventsNames<Events>, Set<Function>> = new Map()\n\n on<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n listener: (...args: Args) => void,\n ) {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set())\n }\n\n this.listeners.get(event)!.add(listener)\n\n return () => {\n this.off(event, listener)\n }\n }\n\n off<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n listener: (...args: Args) => void,\n ) {\n if (!this.listeners.has(event)) {\n return\n }\n\n this.listeners.get(event)!.delete(listener)\n if (this.listeners.get(event)!.size === 0) {\n this.listeners.delete(event)\n }\n }\n\n once<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n listener: (...args: Args) => void,\n ) {\n const off = this.on(event, (...args) => {\n off()\n // @ts-expect-error - This is a valid call\n listener(...args)\n })\n\n return off\n }\n\n async emit<E extends EventsNames<Events>, Args extends EventsArgs<Events, E>>(\n event: E,\n ...args: Args\n ): Promise<any> {\n if (!this.listeners.has(event)) {\n return\n }\n\n return Promise.all(Array.from(this.listeners.get(event)!).map(listener => listener(...args)))\n }\n\n addChannel<\n E extends EventsNames<Events>,\n Ns extends string,\n Emitter extends ChannelEmitter<Events, Ns, E>,\n >(ns: Ns, event: E, target: Emitter) {\n return this.on(event, (...args) => target.emit(ns, event, ...args))\n }\n}\n","/* eslint-disable @typescript-eslint/no-empty-object-type */\n/* eslint-disable @typescript-eslint/no-unsafe-function-type */\n\ntype ListenersMap = Map<string, Map<string, Set<Function>>>\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\nexport class ServiceLocatorEventBus {\n private listeners: ListenersMap = new Map()\n constructor(private readonly logger: Console | null = null) {}\n\n on<Event extends string | `pre:${string}` | `post:${string}`>(\n ns: string,\n event: Event,\n listener: (event: Event) => void,\n ) {\n this.logger?.debug(`[ServiceLocatorEventBus]#on(): ns:${ns} event:${event}`)\n if (!this.listeners.has(ns)) {\n this.listeners.set(ns, new Map())\n }\n\n const nsEvents = this.listeners.get(ns)!\n if (!nsEvents.has(event)) {\n nsEvents.set(event, new Set())\n }\n\n nsEvents.get(event)!.add(listener)\n\n return () => {\n nsEvents.get(event)!.delete(listener)\n if (nsEvents.get(event)?.size === 0) {\n nsEvents.delete(event)\n }\n if (nsEvents.size === 0) {\n this.listeners.delete(ns)\n }\n }\n }\n\n async emit(key: string, event: string) {\n if (!this.listeners.has(key)) {\n return\n }\n\n const events = this.listeners.get(key)!\n\n const preEvent = `pre:${event}`\n const postEvent = `post:${event}`\n this.logger?.debug(`[ServiceLocatorEventBus]#emit(): ${key}:${preEvent}`)\n await Promise.allSettled(\n [...(events.get(preEvent) ?? [])].map((listener) => listener(preEvent)),\n ).then((results) => {\n results\n .filter((result) => result.status === 'rejected')\n .forEach((result: PromiseRejectedResult) => {\n this.logger?.warn(\n `[ServiceLocatorEventBus]#emit(): ${key}:${preEvent} rejected with`,\n result.reason,\n )\n })\n })\n this.logger?.debug(`[ServiceLocatorEventBus]#emit(): ${key}:${event}`)\n\n const res = await Promise.allSettled(\n [...(events.get(event) ?? [])!].map((listener) => listener(event)),\n ).then((results) => {\n const res = results\n .filter((result) => result.status === 'rejected')\n .map((result: PromiseRejectedResult) => {\n this.logger?.warn(\n `[ServiceLocatorEventBus]#emit(): ${key}:${event} rejected with`,\n result.reason,\n )\n return result\n })\n\n if (res.length > 0) {\n return Promise.reject(res)\n }\n return results\n })\n this.logger?.debug(`[ServiceLocatorEventBus]#emit(): ${key}:${postEvent}`)\n await Promise.allSettled(\n [...(events.get(postEvent) ?? [])].map((listener) => listener(postEvent)),\n ).then((results) => {\n results\n .filter((result) => result.status === 'rejected')\n .forEach((result: PromiseRejectedResult) => {\n this.logger?.warn(\n `[ServiceLocatorEventBus]#emit(): ${key}:${postEvent} rejected with`,\n result.reason,\n )\n })\n })\n return res\n }\n}\n","/* eslint-disable @typescript-eslint/no-empty-object-type */\n\nexport enum ServiceLocatorInstanceHolderKind {\n Instance = 'instance',\n Factory = 'factory',\n AbstractFactory = 'abstractFactory',\n}\n\nexport enum ServiceLocatorInstanceHolderStatus {\n Created = 'created',\n Creating = 'creating',\n Destroying = 'destroying',\n}\n\nexport type ServiceLocatorInstanceEffect = () => void\nexport type ServiceLocatorInstanceDestroyListener = () => void | Promise<void>\n\nexport interface ServiceLocatorInstanceHolderCreating<Instance> {\n status: ServiceLocatorInstanceHolderStatus.Creating\n name: string\n instance: null\n creationPromise: Promise<[undefined, Instance]> | null\n destroyPromise: null\n kind: ServiceLocatorInstanceHolderKind\n effects: ServiceLocatorInstanceEffect[]\n deps: string[]\n destroyListeners: ServiceLocatorInstanceDestroyListener[]\n createdAt: number\n ttl: number\n}\n\nexport interface ServiceLocatorInstanceHolderCreated<Instance> {\n status: ServiceLocatorInstanceHolderStatus.Created\n name: string\n instance: Instance\n creationPromise: null\n destroyPromise: null\n kind: ServiceLocatorInstanceHolderKind\n effects: ServiceLocatorInstanceEffect[]\n deps: string[]\n destroyListeners: ServiceLocatorInstanceDestroyListener[]\n createdAt: number\n ttl: number\n}\n\nexport interface ServiceLocatorInstanceHolderDestroying<Instance> {\n status: ServiceLocatorInstanceHolderStatus.Destroying\n name: string\n instance: Instance | null\n creationPromise: null\n destroyPromise: Promise<void>\n kind: ServiceLocatorInstanceHolderKind\n effects: ServiceLocatorInstanceEffect[]\n deps: string[]\n destroyListeners: ServiceLocatorInstanceDestroyListener[]\n createdAt: number\n ttl: number\n}\n\nexport type ServiceLocatorInstanceHolder<Instance = unknown> =\n | ServiceLocatorInstanceHolderCreating<Instance>\n | ServiceLocatorInstanceHolderCreated<Instance>\n | ServiceLocatorInstanceHolderDestroying<Instance>\n","/* eslint-disable @typescript-eslint/no-empty-object-type */\nimport type { ServiceLocatorInstanceHolder } from './service-locator-instance-holder.mjs'\n\nimport {\n ErrorsEnum,\n InstanceDestroying,\n InstanceExpired,\n InstanceNotFound,\n} from './errors/index.mjs'\nimport { ServiceLocatorInstanceHolderStatus } from './service-locator-instance-holder.mjs'\n\nexport class ServiceLocatorManager {\n private readonly instancesHolders: Map<string, ServiceLocatorInstanceHolder> =\n new Map()\n\n constructor(private readonly logger: Console | null = null) {}\n\n get(\n name: string,\n ):\n | [InstanceExpired | InstanceDestroying, ServiceLocatorInstanceHolder]\n | [InstanceNotFound]\n | [undefined, ServiceLocatorInstanceHolder] {\n const holder = this.instancesHolders.get(name)\n if (holder) {\n if (holder.ttl !== Infinity) {\n const now = Date.now()\n if (now - holder.createdAt > holder.ttl) {\n this.logger?.log(\n `[ServiceLocatorManager]#getInstanceHolder() TTL expired for ${holder.name}`,\n )\n return [new InstanceExpired(holder.name), holder]\n }\n } else if (\n holder.status === ServiceLocatorInstanceHolderStatus.Destroying\n ) {\n this.logger?.log(\n `[ServiceLocatorManager]#getInstanceHolder() Instance ${holder.name} is destroying`,\n )\n return [new InstanceDestroying(holder.name), holder]\n }\n\n return [undefined, holder]\n } else {\n this.logger?.log(\n `[ServiceLocatorManager]#getInstanceHolder() Instance ${name} not found`,\n )\n return [new InstanceNotFound(name)]\n }\n }\n\n set(name: string, holder: ServiceLocatorInstanceHolder): void {\n this.instancesHolders.set(name, holder)\n }\n\n has(\n name: string,\n ): [InstanceExpired | InstanceDestroying] | [undefined, boolean] {\n const [error, holder] = this.get(name)\n if (!error) {\n return [undefined, true]\n }\n if (\n [ErrorsEnum.InstanceExpired, ErrorsEnum.InstanceDestroying].includes(\n error.code,\n )\n ) {\n return [error]\n }\n return [undefined, !!holder]\n }\n\n delete(name: string): boolean {\n return this.instancesHolders.delete(name)\n }\n\n filter(\n predicate: (\n value: ServiceLocatorInstanceHolder<any>,\n key: string,\n ) => boolean,\n ): Map<string, ServiceLocatorInstanceHolder> {\n return new Map(\n [...this.instancesHolders].filter(([key, value]) =>\n predicate(value, key),\n ),\n )\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-empty-object-type */\nimport type { AnyZodObject, z, ZodOptional } from 'zod'\n\nimport type { FactoryContext } from './factory-context.mjs'\nimport type {\n BaseInjectionTokenSchemaType,\n InjectionTokenSchemaType,\n OptionalInjectionTokenSchemaType,\n} from './injection-token.mjs'\nimport type { Registry } from './registry.mjs'\nimport type { ServiceLocatorInstanceHolder } from './service-locator-instance-holder.mjs'\n\nimport { InjectableScope } from './enums/index.mjs'\nimport {\n ErrorsEnum,\n FactoryNotFound,\n FactoryTokenNotResolved,\n UnknownError,\n} from './errors/index.mjs'\nimport {\n BoundInjectionToken,\n FactoryInjectionToken,\n InjectionToken,\n} from './injection-token.mjs'\nimport { globalRegistry } from './registry.mjs'\nimport { ServiceLocatorEventBus } from './service-locator-event-bus.mjs'\nimport {\n ServiceLocatorInstanceHolderKind,\n ServiceLocatorInstanceHolderStatus,\n} from './service-locator-instance-holder.mjs'\nimport { ServiceLocatorManager } from './service-locator-manager.mjs'\nimport { getInjectableToken } from './utils/index.mjs'\n\nexport class ServiceLocator {\n private readonly eventBus: ServiceLocatorEventBus\n private readonly manager: ServiceLocatorManager\n\n constructor(\n private readonly registry: Registry = globalRegistry,\n private readonly logger: Console | null = null,\n ) {\n this.eventBus = new ServiceLocatorEventBus(logger)\n this.manager = new ServiceLocatorManager(logger)\n }\n\n getEventBus() {\n return this.eventBus\n }\n\n public storeInstance<Instance>(\n instance: Instance,\n token: BoundInjectionToken<Instance, any>,\n ): void\n public storeInstance<Instance>(\n instance: Instance,\n token: FactoryInjectionToken<Instance, any>,\n ): void\n public storeInstance<Instance>(\n instance: Instance,\n token: InjectionToken<Instance, undefined>,\n ): void\n public storeInstance<\n Instance,\n Schema extends AnyZodObject | ZodOptional<AnyZodObject>,\n >(\n instance: Instance,\n token: InjectionToken<Instance, Schema>,\n args: z.input<Schema>,\n ): void\n public storeInstance(\n instance: any,\n token:\n | InjectionToken<any, any>\n | BoundInjectionToken<any, any>\n | FactoryInjectionToken<any, any>,\n args?: any,\n ): void {\n // @ts-expect-error We should redefine the instance name type\n const instanceName = this.getInstanceIdentifier(token, args)\n this.manager.set(instanceName, {\n name: instanceName,\n instance,\n status: ServiceLocatorInstanceHolderStatus.Created,\n kind: ServiceLocatorInstanceHolderKind.Instance,\n createdAt: Date.now(),\n ttl: Infinity,\n deps: [],\n destroyListeners: [],\n effects: [],\n destroyPromise: null,\n creationPromise: null,\n })\n this.notifyListeners(instanceName)\n }\n\n public removeInstance<Instance>(\n token: BoundInjectionToken<Instance, any>,\n ): void\n public removeInstance<Instance>(\n token: FactoryInjectionToken<Instance, any>,\n ): void\n public removeInstance<Instance>(\n token: InjectionToken<Instance, undefined>,\n ): void\n public removeInstance<Instance, Schema extends BaseInjectionTokenSchemaType>(\n token: InjectionToken<Instance, Schema>,\n args: z.input<Schema>,\n ): void\n public removeInstance<\n Instance,\n Schema extends OptionalInjectionTokenSchemaType,\n >(token: InjectionToken<Instance, Schema>, args?: z.input<Schema>): void\n\n public removeInstance(\n token:\n | InjectionToken<any, any>\n | BoundInjectionToken<any, any>\n | FactoryInjectionToken<any, any>,\n args?: any,\n ) {\n // @ts-expect-error We should redefine the instance name type\n const instanceName = this.getInstanceIdentifier(token, args)\n return this.invalidate(instanceName)\n }\n\n private resolveTokenArgs<\n Instance,\n Schema extends BaseInjectionTokenSchemaType,\n >(\n token: InjectionToken<Instance, Schema>,\n args: z.input<Schema>,\n ): [undefined, z.output<Schema>] | [UnknownError]\n private resolveTokenArgs<\n Instance,\n Schema extends OptionalInjectionTokenSchemaType,\n >(\n token: InjectionToken<Instance, Schema>,\n args?: z.input<Schema>,\n ): [undefined, z.output<Schema>] | [UnknownError]\n private resolveTokenArgs<Instance, Schema extends InjectionTokenSchemaType>(\n token: BoundInjectionToken<Instance, Schema>,\n ): [undefined, z.output<Schema>] | [UnknownError]\n private resolveTokenArgs<Instance, Schema extends InjectionTokenSchemaType>(\n token: FactoryInjectionToken<Instance, Schema>,\n ): [undefined, z.output<Schema>] | [FactoryTokenNotResolved | UnknownError]\n private resolveTokenArgs(\n token:\n | InjectionToken<any, any>\n | BoundInjectionToken<any, any>\n | FactoryInjectionToken<any, any>,\n args?: any,\n ) {\n let realArgs = args\n if (token instanceof BoundInjectionToken) {\n realArgs = token.value\n } else if (token instanceof FactoryInjectionToken) {\n if (token.resolved) {\n realArgs = token.value\n } else {\n return [new FactoryTokenNotResolved(token.name)]\n }\n }\n if (!token.schema) {\n return [undefined, realArgs]\n }\n const validatedArgs = token.schema?.safeParse(realArgs)\n if (validatedArgs && !validatedArgs.success) {\n this.logger?.error(\n `[ServiceLocator]#resolveTokenArgs(): Error validating args for ${token.name.toString()}`,\n validatedArgs.error,\n )\n return [new UnknownError(validatedArgs.error)]\n }\n return [undefined, validatedArgs?.data]\n }\n\n public getInstanceIdentifier<\n Instance,\n Schema extends BaseInjectionTokenSchemaType,\n >(token: InjectionToken<Instance, Schema>, args: z.input<Schema>): string\n public getInstanceIdentifier<\n Instance,\n Schema extends OptionalInjectionTokenSchemaType,\n >(token: InjectionToken<Instance, Schema>, args?: z.input<Schema>): string\n public getInstanceIdentifier<Instance>(\n token: InjectionToken<Instance, undefined>,\n ): string\n public getInstanceIdentifier<Instance>(\n token: BoundInjectionToken<Instance, any>,\n ): string\n public getInstanceIdentifier<Instance>(\n token: FactoryInjectionToken<Instance, any>,\n ): string\n public getInstanceIdentifier(\n token:\n | InjectionToken<any, any>\n | BoundInjectionToken<any, any>\n | FactoryInjectionToken<any, any>,\n args?: any,\n ): string {\n const [err, realArgs] = this.resolveTokenArgs(\n token as InjectionToken<any>,\n args,\n )\n if (err) {\n throw err\n }\n return this.makeInstanceName(token as InjectionToken<any>, realArgs)\n }\n\n public getInstance<Instance, Schema extends BaseInjectionTokenSchemaType>(\n token: InjectionToken<Instance, Schema>,\n args: z.input<Schema>,\n ): Promise<[undefined, Instance] | [UnknownError | FactoryNotFound]>\n public getInstance<Instance, Schema extends OptionalInjectionTokenSchemaType>(\n token: InjectionToken<Instance, Schema>,\n args?: z.input<Schema>,\n ): Promise<[undefined, Instance] | [UnknownError | FactoryNotFound]>\n public getInstance<Instance>(\n token: InjectionToken<Instance, undefined>,\n ): Promise<[undefined, Instance] | [UnknownError | FactoryNotFound]>\n public getInstance<Instance>(\n token: BoundInjectionToken<Instance, any>,\n ): Promise<[undefined, Instance] | [UnknownError | FactoryNotFound]>\n public getInstance<Instance>(\n token: FactoryInjectionToken<Instance, any>,\n ): Promise<[undefined, Instance] | [UnknownError | FactoryNotFound]>\n\n public async getInstance(\n token:\n | InjectionToken<any, any>\n | BoundInjectionToken<any, any>\n | FactoryInjectionToken<any, any>,\n args?: any,\n ) {\n const [err, realArgs] = this.resolveTokenArgs(token as any, args)\n if (err instanceof UnknownError) {\n return [err]\n } else if (\n (err as any) instanceof FactoryTokenNotResolved &&\n token instanceof FactoryInjectionToken\n ) {\n this.logger?.log(\n `[ServiceLocator]#getInstance() Factory token not resolved, resolving it`,\n )\n await token.resolve()\n return this.getInstance(token)\n }\n const instanceName = this.makeInstanceName(token, realArgs)\n const [error, holder] = this.manager.get(instanceName)\n if (!error) {\n if (holder.status === ServiceLocatorInstanceHolderStatus.Creating) {\n return holder.creationPromise\n } else if (\n holder.status === ServiceLocatorInstanceHolderStatus.Destroying\n ) {\n // Should never happen\n return [new UnknownError(ErrorsEnum.InstanceDestroying)]\n }\n return [undefined, holder.instance]\n }\n switch (error.code) {\n case ErrorsEnum.InstanceDestroying:\n this.logger?.log(\n `[ServiceLocator]#getInstance() TTL expired for ${holder?.name}`,\n )\n await holder?.destroyPromise\n //Maybe we already have a new instance\n // @ts-expect-error We should redefine the instance name type\n return this.getInstance(token, args)\n\n case ErrorsEnum.InstanceExpired:\n this.logger?.log(\n `[ServiceLocator]#getInstance() TTL expired for ${holder?.name}`,\n )\n await this.invalidate(instanceName)\n //Maybe we already have a new instance\n // @ts-expect-error We should redefine the instance name type\n return this.getInstance(token, args)\n case ErrorsEnum.InstanceNotFound:\n break\n default:\n return [error]\n }\n // @ts-expect-error TS2322 It's validated\n return this.createInstance(instanceName, token, realArgs)\n }\n\n public async getOrThrowInstance<\n Instance,\n Schema extends InjectionTokenSchemaType | undefined,\n >(\n token: InjectionToken<Instance, Schema>,\n args: Schema extends AnyZodObject\n ? z.input<Schema>\n : Schema extends ZodOptional<AnyZodObject>\n ? z.input<Schema> | undefined\n : undefined,\n ): Promise<Instance> {\n const [error, instance] = await this.getInstance(token, args)\n if (error) {\n throw error\n }\n return instance\n }\n\n private notifyListeners(\n name: string,\n event: 'create' | 'destroy' = 'create',\n ) {\n this.logger?.log(\n `[ServiceLocator]#notifyListeners() Notifying listeners for ${name} with event ${event}`,\n )\n return this.eventBus.emit(name, event)\n }\n\n private async createInstance<\n Instance,\n Schema extends InjectionTokenSchemaType | undefined,\n >(\n instanceName: string,\n token: InjectionToken<Instance, Schema>,\n args: Schema extends AnyZodObject\n ? z.input<Schema>\n : Schema extends ZodOptional<AnyZodObject>\n ? z.input<Schema> | undefined\n : undefined,\n ): Promise<[undefined, Instance] | [FactoryNotFound | UnknownError]> {\n this.logger?.log(\n `[ServiceLocator]#createInstance() Creating instance for ${instanceName}`,\n )\n let realToken =\n token instanceof BoundInjectionToken ||\n token instanceof FactoryInjectionToken\n ? token.token\n : token\n if (this.registry.has(realToken)) {\n return this.resolveInstance(instanceName, realToken, args)\n } else {\n return [new FactoryNotFound(realToken.name.toString())]\n }\n }\n\n private resolveInstance<\n Instance,\n Schema extends InjectionTokenSchemaType | undefined,\n Args extends Schema extends BaseInjectionTokenSchemaType\n ? z.input<Schema>\n : Schema extends OptionalInjectionTokenSchemaType\n ? z.input<Schema> | undefined\n : undefined,\n >(\n instanceName: string,\n token: InjectionToken<Instance, Schema>,\n args: Args,\n ): Promise<[undefined, Instance] | [FactoryNotFound]> {\n this.logger?.log(\n `[ServiceLocator]#resolveInstance(): Creating instance for ${instanceName} from abstract factory`,\n )\n const ctx = this.createFactoryContext(instanceName)\n let { factory, scope } = this.registry.get<Instance, Schema>(token)\n const holder: ServiceLocatorInstanceHolder<Instance> = {\n name: instanceName,\n instance: null,\n status: ServiceLocatorInstanceHolderStatus.Creating,\n kind: ServiceLocatorInstanceHolderKind.AbstractFactory,\n // @ts-expect-error TS2322 This is correct type\n creationPromise: factory(ctx, args)\n .then(async (instance: Instance) => {\n holder.instance = instance\n holder.status = ServiceLocatorInstanceHolderStatus.Created\n holder.deps = ctx.getDependencies()\n holder.destroyListeners = ctx.getDestroyListeners()\n holder.ttl = ctx.getTtl()\n if (holder.deps.length > 0) {\n this.logger?.log(\n `[ServiceLocator]#createInstanceFromAbstractFactory(): Adding subscriptions for ${instanceName} dependencies for their invalidations: ${holder.deps.join(\n ', ',\n )}`,\n )\n holder.deps.forEach((dependency) => {\n holder.destroyListeners.push(\n this.eventBus.on(dependency, 'destroy', () =>\n this.invalidate(instanceName),\n ),\n )\n })\n }\n if (holder.ttl === 0 || scope === InjectableScope.Instance) {\n // One time instance\n await this.invalidate(instanceName)\n }\n await this.notifyListeners(instanceName)\n return [undefined, instance as Instance]\n })\n .catch((error) => {\n this.logger?.error(\n `[ServiceLocator]#createInstanceFromAbstractFactory(): Error creating instance for ${instanceName}`,\n error,\n )\n return [new UnknownError(error)]\n }),\n effects: [],\n deps: [],\n destroyListeners: [],\n createdAt: Date.now(),\n ttl: Infinity,\n }\n\n if (scope === InjectableScope.Singleton) {\n this.logger?.debug(\n `[ServiceLocator]#resolveInstance(): Setting instance for ${instanceName}`,\n )\n this.manager.set(instanceName, holder)\n }\n // @ts-expect-error TS2322 This is correct type\n return holder.creationPromise\n }\n\n private createFactoryContext(instanceName: string): FactoryContext {\n const dependencies = new Set<string>()\n const destroyListeners = new Set<() => void>()\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this\n\n function invalidate(name = instanceName) {\n return self.invalidate(name)\n }\n function addEffect(listener: () => void) {\n destroyListeners.add(listener)\n }\n let ttl = Infinity\n function setTtl(value: number) {\n ttl = value\n }\n function getTtl() {\n return ttl\n }\n\n function on(key: string, event: string, listener: (event: string) => void) {\n destroyListeners.add(self.eventBus.on(key, event, listener))\n }\n\n return {\n // @ts-expect-error This is correct type\n async inject(token, args) {\n let injectionToken = token\n if (typeof token === 'function') {\n injectionToken = getInjectableToken(token)\n }\n if (injectionToken) {\n const [err, validatedArgs] = self.resolveTokenArgs(\n injectionToken,\n args,\n )\n if (err) {\n throw err\n }\n const instanceName = self.makeInstanceName(token, validatedArgs)\n dependencies.add(instanceName)\n return self.getOrThrowInstance(injectionToken, args as any)\n }\n throw new Error(\n `[ServiceLocator]#inject(): Invalid token type: ${typeof token}. Expected a class or an InjectionToken.`,\n )\n },\n invalidate,\n on: on as ServiceLocatorEventBus['on'],\n getDependencies: () => Array.from(dependencies),\n addEffect,\n getDestroyListeners: () => Array.from(destroyListeners),\n setTtl,\n getTtl,\n locator: self,\n }\n }\n\n public getSyncInstance<\n Instance,\n Schema extends InjectionTokenSchemaType | undefined,\n >(\n token: InjectionToken<Instance, Schema>,\n args: Schema extends AnyZodObject\n ? z.input<Schema>\n : Schema extends ZodOptional<AnyZodObject>\n ? z.input<Schema> | undefined\n : undefined,\n ): Instance | null {\n const [err, realArgs] = this.resolveTokenArgs(token, args)\n if (err) {\n return null\n }\n const instanceName = this.makeInstanceName(token, realArgs)\n const [error, holder] = this.manager.get(instanceName)\n if (error) {\n return null\n }\n return holder.instance as Instance\n }\n\n invalidate(service: string, round = 1): Promise<any> {\n this.logger?.log(\n `[ServiceLocator]#invalidate(): Starting Invalidating process of ${service}`,\n )\n const toInvalidate = this.manager.filter(\n (holder) => holder.name === service || holder.deps.includes(service),\n )\n const promises = []\n for (const [key, holder] of toInvalidate.entries()) {\n if (holder.status === ServiceLocatorInstanceHolderStatus.Destroying) {\n this.logger?.trace(\n `[ServiceLocator]#invalidate(): ${key} is already being destroyed`,\n )\n promises.push(holder.destroyPromise)\n continue\n }\n if (holder.status === ServiceLocatorInstanceHolderStatus.Creating) {\n this.logger?.trace(\n `[ServiceLocator]#invalidate(): ${key} is being created, waiting for creation to finish`,\n )\n promises.push(\n holder.creationPromise?.then(() => {\n if (round > 3) {\n this.logger?.error(\n `[ServiceLocator]#invalidate(): ${key} creation is triggering a new invalidation round, but it is still not created`,\n )\n return\n }\n return this.invalidate(key, round + 1)\n }),\n )\n continue\n }\n // @ts-expect-error TS2322 we are changing the status\n holder.status = ServiceLocatorInstanceHolderStatus.Destroying\n this.logger?.log(\n `[ServiceLocator]#invalidate(): Invalidating ${key} and notifying listeners`,\n )\n // @ts-expect-error TS2322 we are changing the status\n holder.destroyPromise = Promise.all(\n holder.destroyListeners.map((listener) => listener()),\n ).then(async () => {\n this.manager.delete(key)\n await this.notifyListeners(key, 'destroy')\n })\n promises.push(holder.destroyPromise)\n }\n return Promise.all(promises)\n }\n\n async ready() {\n return Promise.all(\n Array.from(this.manager.filter(() => true)).map(([, holder]) => {\n if (holder.status === ServiceLocatorInstanceHolderStatus.Creating) {\n return holder.creationPromise?.then(() => null)\n }\n if (holder.status === ServiceLocatorInstanceHolderStatus.Destroying) {\n return holder.destroyPromise.then(() => null)\n }\n return Promise.resolve(null)\n }),\n ).then(() => null)\n }\n\n makeInstanceName(\n token:\n | InjectionToken<any, any>\n | BoundInjectionToken<any, any>\n | FactoryInjectionToken<any, any>,\n args: any,\n ) {\n const formattedArgs = args\n ? ':' +\n Object.entries(args ?? {})\n .sort(([keyA], [keyB]) => keyA.localeCompare(keyB))\n .map(([key, value]) => {\n if (typeof value === 'function') {\n return `${key}=fn_${value.name}(${value.length})`\n }\n if (typeof value === 'symbol') {\n return `${key}=${value.toString()}`\n }\n return `${key}=${JSON.stringify(value).slice(0, 40)}`\n })\n .join(',')\n .replaceAll(/\"/g, '')\n .replaceAll(/:/g, '=')\n : ''\n return `${token.toString()}${formattedArgs}`\n }\n}\n","import type { Injectors } from './utils/index.mjs'\n\nimport { globalRegistry } from './registry.mjs'\nimport { ServiceLocator } from './service-locator.mjs'\nimport { getInjectors } from './utils/index.mjs'\n\nconst globalServiceLocator: ServiceLocator = new ServiceLocator(globalRegistry)\n\nexport function getGlobalServiceLocator(): ServiceLocator {\n if (!globalServiceLocator) {\n throw new Error(\n '[ServiceLocator] Service locator is not initialized. Please provide the service locator before using the @Injectable decorator.',\n )\n }\n return globalServiceLocator\n}\nconst values = getInjectors({\n baseLocator: globalServiceLocator,\n})\n\nexport const inject: Injectors['inject'] = values.inject\n\nexport const syncInject: Injectors['syncInject'] = values.syncInject\n\nexport const wrapSyncInit: Injectors['wrapSyncInit'] = values.wrapSyncInit\n\nexport const provideServiceLocator: Injectors['provideServiceLocator'] =\n values.provideServiceLocator\n"]}
|
package/lib/index.mjs
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
// src/decorators/injectable.decorator.mts
|
|
2
|
-
import "zod";
|
|
3
2
|
|
|
4
3
|
// src/enums/injectable-scope.enum.mts
|
|
5
4
|
var InjectableScope = /* @__PURE__ */ ((InjectableScope3) => {
|
|
@@ -14,9 +13,6 @@ var InjectableType = /* @__PURE__ */ ((InjectableType2) => {
|
|
|
14
13
|
InjectableType2["Factory"] = "Factory";
|
|
15
14
|
return InjectableType2;
|
|
16
15
|
})(InjectableType || {});
|
|
17
|
-
|
|
18
|
-
// src/injection-token.mts
|
|
19
|
-
import "zod";
|
|
20
16
|
var InjectionToken = class _InjectionToken {
|
|
21
17
|
constructor(name, schema) {
|
|
22
18
|
this.name = name;
|
|
@@ -91,9 +87,6 @@ var FactoryInjectionToken = class {
|
|
|
91
87
|
return this.token.toString();
|
|
92
88
|
}
|
|
93
89
|
};
|
|
94
|
-
|
|
95
|
-
// src/registry.mts
|
|
96
|
-
import "zod";
|
|
97
90
|
var Registry = class {
|
|
98
91
|
constructor(parent) {
|
|
99
92
|
this.parent = parent;
|
|
@@ -291,7 +284,7 @@ function Injectable({
|
|
|
291
284
|
registry = globalRegistry
|
|
292
285
|
} = {}) {
|
|
293
286
|
return (target, context) => {
|
|
294
|
-
if (context.kind !== "class") {
|
|
287
|
+
if (context && context.kind !== "class" || target instanceof Function && !context) {
|
|
295
288
|
throw new Error(
|
|
296
289
|
"[ServiceLocator] @Injectable decorator can only be used on classes."
|
|
297
290
|
);
|
|
@@ -392,9 +385,6 @@ var UnknownError = class extends Error {
|
|
|
392
385
|
}
|
|
393
386
|
};
|
|
394
387
|
|
|
395
|
-
// src/interfaces/factory.interface.mts
|
|
396
|
-
import "zod";
|
|
397
|
-
|
|
398
388
|
// src/event-emitter.mts
|
|
399
389
|
var EventEmitter = class {
|
|
400
390
|
listeners = /* @__PURE__ */ new Map();
|
|
@@ -930,39 +920,7 @@ var inject = values.inject;
|
|
|
930
920
|
var syncInject = values.syncInject;
|
|
931
921
|
var wrapSyncInit = values.wrapSyncInit;
|
|
932
922
|
var provideServiceLocator = values.provideServiceLocator;
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
EventEmitter,
|
|
937
|
-
FactoryInjectionToken,
|
|
938
|
-
FactoryNotFound,
|
|
939
|
-
FactoryTokenNotResolved,
|
|
940
|
-
Injectable,
|
|
941
|
-
InjectableScope,
|
|
942
|
-
InjectableTokenMeta,
|
|
943
|
-
InjectableType,
|
|
944
|
-
InjectionToken,
|
|
945
|
-
InjectorsBase,
|
|
946
|
-
InstanceDestroying,
|
|
947
|
-
InstanceExpired,
|
|
948
|
-
InstanceNotFound,
|
|
949
|
-
ProxyServiceLocator,
|
|
950
|
-
Registry,
|
|
951
|
-
ServiceLocator,
|
|
952
|
-
ServiceLocatorEventBus,
|
|
953
|
-
ServiceLocatorInstanceHolderKind,
|
|
954
|
-
ServiceLocatorInstanceHolderStatus,
|
|
955
|
-
ServiceLocatorManager,
|
|
956
|
-
UnknownError,
|
|
957
|
-
getGlobalServiceLocator,
|
|
958
|
-
getInjectableToken,
|
|
959
|
-
getInjectors,
|
|
960
|
-
globalRegistry,
|
|
961
|
-
inject,
|
|
962
|
-
makeProxyServiceLocator,
|
|
963
|
-
provideServiceLocator,
|
|
964
|
-
resolveService,
|
|
965
|
-
syncInject,
|
|
966
|
-
wrapSyncInit
|
|
967
|
-
};
|
|
923
|
+
|
|
924
|
+
export { BoundInjectionToken, ErrorsEnum, EventEmitter, FactoryInjectionToken, FactoryNotFound, FactoryTokenNotResolved, Injectable, InjectableScope, InjectableTokenMeta, InjectableType, InjectionToken, InjectorsBase, InstanceDestroying, InstanceExpired, InstanceNotFound, ProxyServiceLocator, Registry, ServiceLocator, ServiceLocatorEventBus, ServiceLocatorInstanceHolderKind, ServiceLocatorInstanceHolderStatus, ServiceLocatorManager, UnknownError, getGlobalServiceLocator, getInjectableToken, getInjectors, globalRegistry, inject, makeProxyServiceLocator, provideServiceLocator, resolveService, syncInject, wrapSyncInit };
|
|
925
|
+
//# sourceMappingURL=index.mjs.map
|
|
968
926
|
//# sourceMappingURL=index.mjs.map
|