UNPKG

@mikrokit/di

Version:

A lightweight TypeScript dependency injection container that uses only strip-tipes compliant methodologies and does not rely on reflect-metadata

1 lines 20.6 kB
{"version":3,"sources":["../src/index.ts","../src/utils.ts","../src/module.ts","../src/container.ts","../src/helpers.ts"],"sourcesContent":["import { createContainer, Container, ProvideScope } from './container.js'\nimport { createModule, Module } from './module.js'\nimport {\n createProviderToken,\n createGroupProviderToken,\n defineProviderFactory,\n defineStaticProvider,\n defineStaticProviderFactory,\n defineProvider,\n attachProviderToken,\n} from './helpers.js'\nimport type {\n Injector,\n ProviderFactory,\n ProviderToken,\n SingleProviderToken,\n GroupProviderToken,\n Tokenized,\n TokenizedProviderFactory,\n LazyInjected,\n} from './types.js'\n\nexport {\n createContainer,\n createModule,\n createProviderToken,\n createGroupProviderToken,\n defineProvider,\n defineProviderFactory,\n defineStaticProvider,\n defineStaticProviderFactory,\n attachProviderToken,\n Container,\n Module,\n ProvideScope,\n type Injector,\n type ProviderFactory,\n type ProviderToken,\n type SingleProviderToken,\n type GroupProviderToken,\n type TokenizedProviderFactory,\n type Tokenized,\n type LazyInjected,\n}\n","export const mergeDefaults = <T>(\n defaults: T,\n overrides: Partial<T> | undefined\n): T => {\n if (!overrides) {\n return defaults\n }\n\n return { ...defaults, ...overrides }\n}\n","import type {\n GroupProviderToken,\n ProvideOptions,\n ProviderFactory,\n ProviderToken,\n SingleProviderToken,\n Tokenized,\n TokenizedProviderFactory,\n} from './types.js'\nimport { mergeDefaults } from './utils.js'\n\nexport type InternalGroupProviderDefinition = {\n group: true\n factories: ProviderFactory<any>[]\n}\n\nexport type InternalSingleProviderDefinition = {\n group: false\n factory: ProviderFactory<any>\n}\n\nexport type InternalProviderDefinition =\n | InternalSingleProviderDefinition\n | InternalGroupProviderDefinition\n\nexport class Module {\n private static readonly DEFAULT_PROVIDE_OPTIONS: ProvideOptions = {\n override: false,\n }\n\n protected providers: Map<Symbol, InternalProviderDefinition>\n\n constructor(\n public moduleName?: string,\n providers?: Map<Symbol, InternalProviderDefinition>\n ) {\n this.providers = providers ?? new Map()\n }\n\n provide<T>(\n token: ProviderToken<T> | Tokenized<unknown, T>,\n factory: ProviderFactory<T>,\n options?: ProvideOptions\n ): this\n\n provide<T>(\n tokenizedFactory: TokenizedProviderFactory<T, ProviderToken<T>>\n ): this\n\n provide<T>(\n token:\n | ProviderToken<T>\n | Tokenized<unknown, T>\n | TokenizedProviderFactory<T, ProviderToken<T>>,\n factory?: ProviderFactory<T>,\n options?: Partial<ProvideOptions>\n ): this {\n const normalizedOptions = mergeDefaults(\n Module.DEFAULT_PROVIDE_OPTIONS,\n options\n )\n\n const normalizedToken: ProviderToken<T> =\n 'token' in token ? token.token : token\n\n const normalizedFactory: ProviderFactory<T> =\n typeof token === 'function' && !factory ? token : factory!\n\n if (normalizedToken._.group) {\n this.provideGroupToken(\n normalizedToken as GroupProviderToken<T>,\n normalizedFactory\n )\n } else {\n this.provideSingleToken(\n normalizedToken as SingleProviderToken<T>,\n normalizedFactory,\n normalizedOptions\n )\n }\n\n return this\n }\n\n import(module: Module): this {\n for (const token of module.providers.keys()) {\n const ownProvider = this.providers.get(token)\n const importedModuleProvider = module.providers.get(token)!\n\n if (!ownProvider) {\n this.providers.set(token, importedModuleProvider)\n continue\n }\n\n if (ownProvider.group && importedModuleProvider.group) {\n ownProvider.factories.push(...importedModuleProvider.factories)\n continue\n }\n\n if (ownProvider.group && !importedModuleProvider.group) {\n throw new Error(\n `Trying to re-provide group-type provider ${token.toString()} that was already provided as single-type provider`\n )\n }\n\n throw new Error(\n 'Trying to re-provide single-type provider for ' + token.toString()\n )\n }\n\n return this\n }\n\n private provideGroupToken<T>(\n token: GroupProviderToken<T>,\n factory: ProviderFactory<T>\n ) {\n const existingProviderDefinition = this.providers.get(token)\n\n if (\n existingProviderDefinition &&\n existingProviderDefinition.group !== token._.group\n ) {\n throw new Error(\n `Trying to re-provide group-type provider ${token.toString} that was already provided as single-type provider`\n )\n }\n\n if (existingProviderDefinition) {\n existingProviderDefinition.factories.push(factory)\n return\n }\n\n const providerDefinition = {\n group: true,\n factories: [factory],\n } satisfies InternalProviderDefinition\n\n this.providers.set(token, providerDefinition)\n }\n\n private provideSingleToken<T>(\n token: SingleProviderToken<T>,\n factory: ProviderFactory<T>,\n options: ProvideOptions\n ) {\n if (this.providers.has(token)) {\n const existingProvider = this.providers.get(token)!\n\n if (existingProvider.group !== token._.group) {\n throw new Error(\n `Trying to re-provide single-type provider ${token.toString()} as group-type provider`\n )\n }\n\n if (!options.override) {\n throw new Error(\n 'Trying to re-provide single-type provider for ' + token.toString()\n )\n }\n }\n\n this.providers.set(token, {\n group: false,\n factory,\n })\n }\n}\n\nexport const createModule = () => {\n return new Module()\n}\n","import { Module } from './module.js'\nimport type {\n GroupProviderToken,\n Injector,\n LazyInjected,\n ProviderToken,\n SingleProviderToken,\n Tokenized,\n} from './types.js'\n\nexport enum ProvideScope {\n TRANSIENT = 'transient',\n SINGLETON = 'singleton',\n}\n\nexport class Container extends Module implements Injector {\n private readonly instantiatedSingleSingletonProviders: Map<Symbol, any>\n private readonly instantiatedGroupSingletonProviders: Map<Symbol, any[]>\n\n // Tracks active injecting symbols in order to see if we stumbled upon a circular dependency\n private readonly injectionStack: Symbol[]\n\n private readonly lazyInjectionsQueue: {\n token: SingleProviderToken<any>\n scope: ProvideScope\n resolve: (value: any) => void\n }[] = []\n\n private constructor(\n parentContainer?: Container,\n injectionItem?: Symbol,\n injectionStack?: Symbol[]\n ) {\n super(parentContainer?.moduleName, parentContainer?.providers)\n\n this.instantiatedSingleSingletonProviders =\n parentContainer?.instantiatedSingleSingletonProviders ?? new Map()\n this.instantiatedGroupSingletonProviders =\n parentContainer?.instantiatedGroupSingletonProviders ?? new Map()\n\n this.injectionStack = injectionItem\n ? [\n ...(injectionStack ?? parentContainer?.injectionStack ?? []),\n injectionItem,\n ]\n : []\n }\n\n static createEmpty(): Container {\n return new Container()\n }\n\n inject<T>(token: SingleProviderToken<T>, scope?: ProvideScope): Promise<T>\n inject<T>(token: GroupProviderToken<T>, scope?: ProvideScope): Promise<T[]>\n\n inject<TOriginalTokenized, T>(\n tokenized: Tokenized<TOriginalTokenized, T, SingleProviderToken<T>>,\n scope?: ProvideScope\n ): Promise<T>\n\n inject<TOriginalTokenized, T>(\n tokenized: Tokenized<TOriginalTokenized, T, GroupProviderToken<T>>,\n scope?: ProvideScope\n ): Promise<T[]>\n\n async inject<T>(\n token: ProviderToken<T> | Tokenized<any, T>,\n scope: ProvideScope = ProvideScope.SINGLETON\n ): Promise<T | T[]> {\n const normalizedToken = 'token' in token ? token.token : token\n\n if (this.injectionStack.includes(normalizedToken)) {\n throw new Error(\n `Provider ${normalizedToken.toString()} is already being instantiated. This error can be caused by either a circular dependency or not awaiting the inject calls`\n )\n }\n\n if (normalizedToken._.group) {\n const result = await this.injectGroup(\n normalizedToken as GroupProviderToken<T>,\n scope\n )\n return result\n }\n\n const result = await this.injectSingle(\n normalizedToken as SingleProviderToken<T>,\n scope\n )\n\n return result\n }\n\n injectLazy<T>(\n token: SingleProviderToken<T>,\n scope?: ProvideScope\n ): LazyInjected<T>\n\n injectLazy<TOriginalTokenized, T>(\n token: Tokenized<TOriginalTokenized, T, SingleProviderToken<T>>,\n scope?: ProvideScope\n ): LazyInjected<T>\n\n injectLazy<T>(\n token: SingleProviderToken<T> | Tokenized<any, T>,\n scope?: ProvideScope\n ): LazyInjected<T> {\n const normalizedToken = 'token' in token ? token.token : token\n let value: T | undefined\n\n this.enqueueLazyInjection<T>(\n normalizedToken,\n scope ?? ProvideScope.SINGLETON\n ).then((resolvedProvider) => (value = resolvedProvider))\n\n return {\n get value(): T {\n if (!value) {\n throw new Error(\n 'Lazy provider is not yet resolved. Do not use lazy-injected providers before the provider construction ends.'\n )\n }\n\n return value\n },\n }\n }\n\n private async injectSingle<T>(\n token: SingleProviderToken<T>,\n scope: ProvideScope,\n injectionStack?: Symbol[]\n ): Promise<T> {\n if (scope === ProvideScope.SINGLETON) {\n const instantiatedProvider =\n this.instantiatedSingleSingletonProviders.get(token)\n\n if (instantiatedProvider) {\n return instantiatedProvider\n }\n }\n\n const definition = this.providers.get(token)\n\n if (!definition) {\n throw new Error(\n 'No factory available for the specified token ' + token.toString()\n )\n }\n\n if (token._.group !== definition.group) {\n throw new Error(\n `Trying to inject group-type provider ${token.toString()} as single-type provider`\n )\n }\n\n const container = new Container(this, token, injectionStack)\n\n const result = await definition.factory(container)\n\n if (scope === ProvideScope.SINGLETON) {\n this.instantiatedSingleSingletonProviders.set(token, result)\n }\n\n await container.dequeueLazyInjections()\n\n return result\n }\n\n private async injectGroup<T>(\n token: GroupProviderToken<T>,\n scope: ProvideScope\n ): Promise<T[]> {\n if (scope === ProvideScope.SINGLETON) {\n const instantiatedProviders =\n this.instantiatedGroupSingletonProviders.get(token)\n\n if (instantiatedProviders) {\n return instantiatedProviders\n }\n }\n\n const definition = this.providers.get(token)\n\n if (!definition) {\n return []\n }\n\n if (token._.group !== definition.group) {\n throw new Error(\n `Trying to inject single-type provider ${token.toString()} as group-type provider`\n )\n }\n\n const result: T[] = []\n for (const factory of definition.factories) {\n const container = new Container(this, token)\n\n result.push(await factory(container))\n\n await container.dequeueLazyInjections()\n }\n\n if (scope === ProvideScope.SINGLETON) {\n this.instantiatedGroupSingletonProviders.set(token, result)\n }\n\n return result\n }\n\n private enqueueLazyInjection<T>(\n token: SingleProviderToken<T>,\n scope: ProvideScope\n ): Promise<T> {\n return new Promise((resolve) => {\n const resolveLazy = (value: T) => {\n resolve(value)\n }\n\n this.lazyInjectionsQueue.push({\n token,\n scope,\n resolve: resolveLazy,\n })\n })\n }\n\n private async dequeueLazyInjections(): Promise<void> {\n for (const lazyInjection of this.lazyInjectionsQueue) {\n try {\n const resolvedValue = await this.injectSingle(\n lazyInjection.token,\n lazyInjection.scope,\n // Exclude the latest token from the stack as it is already resolved\n []\n // this.injectionStack.slice(0, -1)\n )\n lazyInjection.resolve(resolvedValue)\n } catch (error) {\n throw new Error(\n `Failed to resolve lazy injection for token ${lazyInjection.token.toString()}: ${error instanceof Error ? error.message : String(error)}`\n )\n }\n }\n }\n}\n\nexport const createContainer = () => {\n return Container.createEmpty()\n}\n","import type {\n GroupProviderToken,\n ProviderFactory,\n ProviderToken,\n SingleProviderToken,\n TokenizedProviderFactory,\n} from './types.js'\n\nexport const createProviderToken = <T>(\n _factory?: ProviderFactory<T>,\n name?: string\n): SingleProviderToken<T> => {\n const symbol = Symbol(name)\n\n const metadata: ProviderToken<T>['_'] = {\n provided: undefined as any,\n group: false,\n }\n\n return Object.assign(symbol, { _: metadata })\n}\n\nexport const createGroupProviderToken = <T>(\n name?: string\n): GroupProviderToken<T> => {\n const symbol = Symbol(name)\n\n const metadata: ProviderToken<T>['_'] = {\n provided: undefined as any,\n group: true,\n }\n\n return Object.assign(symbol, { _: metadata })\n}\n\nexport const defineProviderFactory = <T>(\n factory: ProviderFactory<T>\n): ProviderFactory<T> => factory\n\nexport const defineStaticProviderFactory =\n <T>(staticValue: T): ProviderFactory<T> =>\n () =>\n staticValue\n\nexport const attachProviderToken = <T, TToken extends ProviderToken<T>>(\n factory: ProviderFactory<T>,\n token: TToken\n): TokenizedProviderFactory<T, TToken> => {\n return Object.assign(factory, {\n token,\n })\n}\n\nexport function defineStaticProvider<T>(\n value: T\n): TokenizedProviderFactory<T, SingleProviderToken<T>>\n\nexport function defineStaticProvider<T, TToken extends ProviderToken<T>>(\n value: T,\n token: TToken\n): TokenizedProviderFactory<T, TToken>\n\nexport function defineStaticProvider<T, TToken extends ProviderToken<T>>(\n staticValue: T,\n token?: TToken\n) {\n return defineProvider(defineStaticProviderFactory(staticValue), token as any)\n}\n\nexport function defineProvider<T>(\n factory: ProviderFactory<T>,\n name?: string\n): TokenizedProviderFactory<T, SingleProviderToken<T>>\n\nexport function defineProvider<T, TToken extends ProviderToken<T>>(\n factory: ProviderFactory<T>,\n token: TToken\n): TokenizedProviderFactory<T, TToken>\n\nexport function defineProvider<T, TToken extends ProviderToken<T>>(\n factory: ProviderFactory<T>,\n tokenOrName?: TToken | string\n): TokenizedProviderFactory<T, TToken> {\n const token =\n typeof tokenOrName === 'string' || !tokenOrName\n ? createProviderToken(factory, tokenOrName)\n : tokenOrName\n\n return Object.assign(factory, {\n token,\n }) as TokenizedProviderFactory<T, TToken>\n}\n"],"mappings":"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","names":["module","ProvideScope","result"]}