@shellicar/core-di 2.0.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,221 +1,33 @@
1
1
  # @shellicar/core-di
2
2
 
3
- A basic dependency injection library.
3
+ > A basic dependency injection library for TypeScript
4
4
 
5
- <!-- BEGIN_ECOSYSTEM -->
5
+ [![npm package](https://img.shields.io/npm/v/@shellicar/core-di.svg)](https://npmjs.com/package/@shellicar/core-di)
6
+ [![build status](https://github.com/shellicar/core-di/actions/workflows/node.js.yml/badge.svg)](https://github.com/shellicar/core-di/actions/workflows/node.js.yml)
6
7
 
7
- ## @shellicar TypeScript Ecosystem
8
+ ## Installation & Quick Start
8
9
 
9
- ### Core Libraries
10
-
11
- - [`@shellicar/core-config`](https://github.com/shellicar/core-config) - A library for securely handling sensitive configuration values like connection strings, URLs, and secrets.
12
- - [`@shellicar/core-di`](https://github.com/shellicar/core-di) - A basic dependency injection library.
13
- - [`@shellicar/core-foundation`](https://github.com/shellicar/core-foundation) - A comprehensive starter repository.
14
-
15
- ### Build Tools
16
-
17
- - [`@shellicar/build-version`](https://github.com/shellicar/build-version) - Build plugin that calculates and exposes version information through a virtual module import.
18
- - [`@shellicar/build-graphql`](https://github.com/shellicar/build-graphql) - Build plugin that loads GraphQL files and makes them available through a virtual module import.
19
-
20
- ### Framework Adapters
21
-
22
- - [`@shellicar/svelte-adapter-azure-functions`](https://github.com/shellicar/svelte-adapter-azure-functions) - A [SvelteKit adapter](https://kit.svelte.dev/docs/adapters) that builds your app into an Azure Function.
23
-
24
- ### Logging & Monitoring
25
-
26
- - [`@shellicar/winston-azure-application-insights`](https://github.com/shellicar/winston-azure-application-insights) - An [Azure Application Insights](https://azure.microsoft.com/en-us/services/application-insights/) transport for [Winston](https://github.com/winstonjs/winston) logging library.
27
- - [`@shellicar/pino-applicationinsights-transport`](https://github.com/shellicar/pino-applicationinsights-transport) - [Azure Application Insights](https://azure.microsoft.com/en-us/services/application-insights) transport for [pino](https://github.com/pinojs/pino)
28
-
29
- <!-- END_ECOSYSTEM -->
30
-
31
- ## Motivation
32
-
33
- Coming from .NET I am used to DI frameworks/libraries such as `Autofac`, `Ninject`, `StructureMap`, `Unity`, and Microsoft's own `DependencyInjection`.
34
-
35
- I started using `InversifyJS`, and tried out some others along the way, such as `diod`.
36
-
37
- With TypeScript 5.0 generally available with non-experimental decorators, most DI libraries have not been updated, so I decided to create my own.
38
-
39
- ## Features
40
-
41
- My set of features is simple, based on my current usage
42
-
43
- * Type-safe registration.
44
-
45
- ```ts
46
- const services = createServiceCollection();
47
- abstract class IAbstract { abstract method(): void; }
48
- abstract class Concrete {}
49
- services.register(IAbstract).to(Concrete);
50
- // ^ Error
10
+ ```sh
11
+ npm i --save @shellicar/core-di
51
12
  ```
52
13
 
53
- * Type-safe resolution.
54
-
55
- ```ts
56
- const provider = services.buildProvider();
57
- const svc = provider.resolve(IMyService);
58
- // ^ IMyService
59
- ```
60
-
61
- * Provide factory methods for instantiating classes.
62
-
63
- ```ts
64
- services.register(Redis).to(Redis, x => {
65
- const options = x.resolve(IRedisOptions);
66
- return new Redis({
67
- port: options.port,
68
- host: options.host,
69
- });
70
- });
14
+ ```sh
15
+ pnpm add @shellicar/core-di
71
16
  ```
72
17
 
73
- * Use property injection with decorators for simple dependency definition.
74
-
75
18
  ```ts
76
- abstract class IDependency {}
77
- class Service implements IService {
78
- @dependsOn(IDependency) private readonly dependency!: IDependency;
79
- }
80
- ```
19
+ import { createServiceCollection } from '@shellicar/core-di';
81
20
 
82
- * Provide multiple implementations for identifiers and provide a `resolveAll` method.
83
- * Define instance lifetime with simple builder pattern.
21
+ abstract class IAbstract {}
22
+ class Concrete implements IAbstract {}
84
23
 
85
- ```ts
86
- services.register(IAbstract).to(Concrete).singleton();
87
- ```
88
-
89
- * Create scopes to allow "per-request" lifetimes.
90
-
91
- ```ts
92
24
  const services = createServiceCollection();
25
+ services.register(IAbstract).to(Concrete);
93
26
  const provider = services.buildProvider();
94
- using scope = provider.createScope();
95
- ```
96
-
97
- * Register classes during a scope
98
-
99
- ```ts
100
- using scope = provider.createScope();
101
- scope.Services.register(IContext).to(Context);
102
- ```
103
-
104
- * Multiple registrations
105
-
106
- ```ts
107
- services.register(IAbstract1, IAbstract2).to(Concrete).singleton();
108
- const provider = services.buildProvider();
109
- provider.resolve(IAbstract1) === provider.resolve(IAbstract2);
110
- ```
111
-
112
- * Override registrations (e.g.: for testing)
113
-
114
- ```ts
115
- import { ok } from 'node:assert/strict';
116
- const services = createServiceCollection({ registrationMode: ResolveMultipleMode.LastRegistered });
117
- services.register(IOptions).to(Options);
118
- // Later
119
- services.register(IOptions).to(MockOptions);
120
- const provider = services.buildProvider();
121
- const options = provider.resolve(IOptions);
122
- ok(options instanceof MockOptions);
123
- ```
124
-
125
- * Override lifetimes (e.g.: for testing)
126
-
127
- ```ts
128
- const services = createServiceCollection({ logLevel: LogLevel.Debug });
129
- services.register(IAbstract).to(Concrete).singleton();
130
- const provider = services.buildProvider();
131
- sp.Services.overrideLifetime(IAbstract, Lifetime.Transient);
132
- sp.resolve(IAbstract) !== sp.resolve(IAbstract);
133
- ```
134
-
135
- * Logging options
136
-
137
- ```ts
138
- class CustomLogger extends ILogger {
139
- public override debug(message?: any, ...optionalParams: any[]): void {
140
- // custom implementation
141
- }
142
- }
143
- // Override default logger
144
- const services1 = createServiceCollection({ logger: new CustomLogger() });
145
- // Override default log level
146
- const services2 = createServiceCollection({ logLevel: LogLevel.Debug });
147
- ```
148
27
 
149
- * Service modules
150
-
151
- ```ts
152
- class IAbstract {}
153
- class Concrete extends IAbstract {}
154
-
155
- class MyModule implements IServiceModule {
156
- public registerServices(services: IServiceCollection): void {
157
- services.register(IAbstract).to(Concrete);
158
- }
159
- }
160
-
161
- const services = createServiceCollection();
162
- services.registerModules(MyModule);
163
- const provider = services.buildProvider();
164
28
  const svc = provider.resolve(IAbstract);
165
29
  ```
166
30
 
167
- ## Usage
168
-
169
- Check the test files for different usage scenarios.
170
-
171
- ```ts
172
- import { dependsOn, createServiceCollection, IServiceModule, type IServiceCollection } from '@shellicar/core-di';
173
-
174
- // Define the dependency interface
175
- abstract class IClock {
176
- abstract now(): Date;
177
- }
178
- // And implementation
179
- class DefaultClock implements IClock {
180
- now(): Date {
181
- return new Date();
182
- }
183
- }
184
-
185
- // Define your interface
186
- abstract class IDatePrinter {
187
- abstract handle(): string;
188
- }
189
- // And implementation
190
- class DatePrinter implements IDatePrinter {
191
- @dependsOn(IClock) public readonly clock!: IClock;
192
-
193
- handle(): string {
194
- return `The time is: ${this.clock.now().toISOString()}`;
195
- }
196
- }
197
-
198
- class TimeModule extends IServiceModule {
199
- public registerServices(services: IServiceCollection): void {
200
- services.register(IClock).to(DefaultClock).singleton();
201
- services.register(IDatePrinter).to(DatePrinter).scoped();
202
- }
203
- }
204
-
205
- // Register and build provider
206
- const services = createServiceCollection();
207
- services.registerModules([TimeModule]);
208
- const sp = services.buildProvider();
209
-
210
- // Optionally create a scope
211
- using scope = sp.createScope();
212
-
213
- // Resolve the interface
214
- const svc = scope.resolve(IDatePrinter);
215
- console.log(svc.handle());
216
- ```
217
-
218
- ## Inspired by
31
+ ## Documentation
219
32
 
220
- * [InversifyJS](https://github.com/inversify/InversifyJS)
221
- * [Microsoft.Extensions.DependencyInjection](https://github.com/dotnet/runtime/tree/main/src/libraries/Microsoft.Extensions.DependencyInjection)
33
+ For full documentation, visit [here](https://github.com/shellicar/core-di).
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/enums.ts","../src/defaults.ts","../src/errors.ts","../src/private/ServiceBuilder.ts","../src/interfaces.ts","../src/private/ResolutionContext.ts","../src/private/constants.ts","../src/private/metadata.ts","../src/private/ServiceProvider.ts","../src/private/ServiceCollection.ts","../src/logger.ts","../src/private/consoleLogger.ts","../src/createServiceCollection.ts","../src/dependsOn.ts"],"names":["Lifetime","LogLevel","ResolveMultipleMode"],"mappings":"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","file":"index.js","sourcesContent":["export enum Lifetime {\n Resolve = 'RESOLVE',\n Transient = 'TRANSIENT',\n Scoped = 'SCOPED',\n Singleton = 'SINGLETON',\n}\n\nexport enum LogLevel {\n Debug = 0,\n Info = 1,\n Warn = 2,\n Error = 3,\n None = 4,\n}\n\nexport enum ResolveMultipleMode {\n Error = 'ERROR',\n LastRegistered = 'LAST_REGISTERED',\n}\n","import { LogLevel, ResolveMultipleMode } from './enums';\nimport type { ServiceCollectionOptions } from './types';\n\nexport const DefaultServiceCollectionOptions: ServiceCollectionOptions = {\n registrationMode: ResolveMultipleMode.Error,\n logLevel: LogLevel.Warn,\n};\n","import type { ServiceIdentifier } from './types';\n\nexport abstract class ServiceError extends Error {}\n\nexport class UnregisteredServiceError<T extends object> extends ServiceError {\n name = 'UnregisteredServiceError';\n constructor(identifier: ServiceIdentifier<T>) {\n super(`Resolving service that has not been registered: ${identifier.name}`);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class MultipleRegistrationError<T extends object> extends ServiceError {\n name = 'MultipleRegistrationError';\n constructor(identifier: ServiceIdentifier<T>) {\n super(`Multiple services have been registered: ${identifier.name}`);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ServiceCreationError<T extends object> extends ServiceError {\n name = 'ServiceCreationError';\n constructor(\n identifier: ServiceIdentifier<T>,\n public readonly innerError: any,\n ) {\n super(`Error creating service: ${identifier.name}`);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class SelfDependencyError extends ServiceError {\n name = 'SelfDependencyError';\n constructor() {\n super('Service depending on itself');\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ScopedSingletonRegistrationError extends ServiceError {\n name = 'ScopedSingletonRegistrationError';\n constructor() {\n super('Cannot register a singleton in a scoped service collection');\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { Lifetime } from '../enums';\nimport { ScopedSingletonRegistrationError } from '../errors';\nimport type { ILifetimeBuilder, IServiceBuilder } from '../interfaces';\nimport type { InstanceFactory, ServiceDescriptor, ServiceIdentifier, ServiceImplementation, SourceType } from '../types';\n\nexport class ServiceBuilder<T extends SourceType> implements IServiceBuilder<T> {\n private descriptor: ServiceDescriptor<T> | undefined;\n\n constructor(\n private readonly identifiers: ServiceIdentifier<T>[],\n private readonly isScoped: boolean,\n private readonly addService: (identifier: ServiceIdentifier<T>, descriptor: ServiceDescriptor<T>) => void,\n ) {}\n\n public to(implementation: ServiceImplementation<T>, factory?: InstanceFactory<T>): ILifetimeBuilder {\n this.descriptor = this.createDescriptor(factory, implementation);\n\n for (const identifier of this.identifiers) {\n this.addService(identifier, this.descriptor);\n }\n return this;\n }\n\n private createDescriptor(factory: InstanceFactory<T> | undefined, implementation: ServiceImplementation<T>): ServiceDescriptor<T> {\n const createInstance = factory ?? (() => new implementation());\n\n return {\n implementation,\n createInstance,\n lifetime: Lifetime.Resolve,\n };\n }\n\n public singleton(): this {\n if (this.isScoped) {\n throw new ScopedSingletonRegistrationError();\n }\n this.ensureDescriptor().lifetime = Lifetime.Singleton;\n return this;\n }\n\n public scoped(): this {\n this.ensureDescriptor().lifetime = Lifetime.Scoped;\n return this;\n }\n\n public transient(): this {\n this.ensureDescriptor().lifetime = Lifetime.Transient;\n return this;\n }\n\n private ensureDescriptor(): ServiceDescriptor<T> {\n if (!this.descriptor) {\n throw new Error('Must call to() before setting lifetime');\n }\n return this.descriptor;\n }\n}\n","import type { Lifetime } from './enums';\nimport { ResolveMultipleMode } from './enums';\nimport type { EnsureObject, ServiceBuilderOptions, ServiceCollectionOptions, ServiceDescriptor, ServiceIdentifier, ServiceModuleType, SourceType, UnionToIntersection } from './types';\n\nexport abstract class IDisposable {\n public abstract [Symbol.dispose](): void;\n}\n\nexport abstract class IServiceModule {\n public abstract registerServices(services: IServiceCollection): void;\n}\n\nexport abstract class IResolutionScope {\n /**\n * Resolves a single implementation for the given identifier.\n * @template T The type of service to resolve\n * @param identifier The service identifier\n * @returns The resolved instance\n * @throws {MultipleRegistrationError} When multiple implementations exist (unless {@link ServiceCollectionOptions.registrationMode} is set to {@link ResolveMultipleMode.LastRegistered}).\n * @throws {UnregisteredServiceError} When no implementation exists\n */\n public abstract resolve<T extends SourceType>(identifier: ServiceIdentifier<T>): T;\n\n /**\n * Resolves all implementations for the given identifier.\n * @template T The type of service to resolve\n * @param identifier The service identifier\n * @returns Array of resolved instances\n */\n public abstract resolveAll<T extends SourceType>(identifier: ServiceIdentifier<T>): T[];\n}\n\nexport abstract class IScopedProvider extends IResolutionScope implements IDisposable {\n public abstract readonly Services: IServiceCollection;\n public abstract [Symbol.dispose](): void;\n}\n\nexport abstract class IServiceProvider extends IResolutionScope {\n public abstract readonly Services: IServiceCollection;\n public abstract createScope(): IScopedProvider;\n}\n\nexport abstract class IServiceCollection {\n public abstract readonly options: ServiceCollectionOptions;\n public abstract get<T extends SourceType>(identifier: ServiceIdentifier<T>): ServiceDescriptor<T>[];\n public abstract register<Types extends SourceType[]>(...identifiers: { [K in keyof Types]: ServiceIdentifier<Types[K]> }): IServiceBuilder<EnsureObject<UnionToIntersection<Types[number]>>>;\n public abstract registerModules(...modules: ServiceModuleType[]): void;\n public abstract overrideLifetime<T extends SourceType>(identifier: ServiceIdentifier<T>, lifetime: Lifetime): void;\n public abstract buildProvider(): IServiceProvider;\n public abstract clone(): IServiceCollection;\n public abstract clone(scoped: true): IServiceCollection;\n}\n\nexport abstract class ILifetimeBuilder {\n public abstract singleton(): ILifetimeBuilder;\n public abstract scoped(): ILifetimeBuilder;\n public abstract transient(): ILifetimeBuilder;\n}\n\nexport abstract class IServiceBuilder<T extends SourceType> {\n public abstract to: ServiceBuilderOptions<T>;\n}\n","import { Lifetime } from '../enums';\nimport type { ServiceImplementation, SourceType } from '../types';\n\nexport class ResolutionContext {\n constructor(\n private readonly singletons: Map<ServiceImplementation<any>, any>,\n private readonly scoped: Map<ServiceImplementation<any>, any>,\n ) {}\n\n private readonly transient = new Map<ServiceImplementation<any>, any>();\n\n public getFromLifetime<T extends SourceType>(implementation: ServiceImplementation<T>, lifetime: Lifetime): T {\n const map = this.getMapForLifetime(lifetime);\n return map?.get(implementation);\n }\n\n public setForLifetime<T extends SourceType>(implementation: ServiceImplementation<T>, instance: T, lifetime: Lifetime): void {\n const map = this.getMapForLifetime(lifetime);\n map?.set(implementation, instance);\n }\n\n private getMapForLifetime(lifetime: Lifetime) {\n const map: Partial<Record<Lifetime, Map<ServiceImplementation<any>, any>>> = {\n [Lifetime.Singleton]: this.singletons,\n [Lifetime.Scoped]: this.scoped,\n [Lifetime.Resolve]: this.transient,\n };\n return map[lifetime];\n }\n}\n","export const DesignDependenciesKey = 'design:dependencies';\n","import '@abraham/reflection';\nimport type { MetadataType, SourceType } from '../types';\n\nexport const getMetadata = <T extends SourceType>(key: string, obj: object): MetadataType<T> | undefined => Reflect.getMetadata(key, obj);\nexport const defineMetadata = <T extends SourceType>(key: string, metadata: MetadataType<T>, obj: object) => Reflect.defineMetadata(key, metadata, obj);\n","import { Lifetime } from '../enums';\nimport { ResolveMultipleMode } from '../enums';\nimport { MultipleRegistrationError, SelfDependencyError, ServiceCreationError, UnregisteredServiceError } from '../errors';\nimport { type IDisposable, IResolutionScope, IScopedProvider, type IServiceCollection } from '../interfaces';\nimport { IServiceProvider } from '../interfaces';\nimport type { ILogger } from '../logger';\nimport type { ServiceDescriptor, ServiceIdentifier, ServiceImplementation, SourceType } from '../types';\nimport { ResolutionContext } from './ResolutionContext';\nimport { DesignDependenciesKey } from './constants';\nimport { getMetadata } from './metadata';\n\nexport class ServiceProvider implements IServiceProvider, IScopedProvider {\n private scoped = new Map<ServiceImplementation<any>, any>();\n private created: IDisposable[] = [];\n\n constructor(\n private readonly logger: ILogger,\n public readonly Services: IServiceCollection,\n private readonly singletons = new Map<ServiceImplementation<any>, any>(),\n ) {}\n\n [Symbol.dispose]() {\n for (const x of this.created) {\n x[Symbol.dispose]();\n }\n }\n\n private resolveInternal<T extends SourceType>(descriptor: ServiceDescriptor<T>, context: ResolutionContext): T {\n let instance = context.getFromLifetime(descriptor.implementation, descriptor.lifetime);\n if (instance == null) {\n instance = this.createInstance(descriptor, context);\n }\n return instance;\n }\n\n public resolveAll<T extends SourceType>(identifier: ServiceIdentifier<T>, context?: ResolutionContext): T[] {\n const descriptors = this.Services.get(identifier);\n return descriptors.map((descriptor) => this.resolveInternal<T>(descriptor, context ?? new ResolutionContext(this.singletons, this.scoped)));\n }\n\n public resolve<T extends SourceType>(identifier: ServiceIdentifier<T>, context?: ResolutionContext): T {\n if (identifier.prototype === IResolutionScope.prototype || identifier.prototype === IScopedProvider.prototype || identifier.prototype === IServiceProvider.prototype) {\n return this as IResolutionScope & IScopedProvider & IServiceProvider as T;\n }\n\n const descriptor = this.getSingleDescriptor(identifier);\n return this.resolveInternal(descriptor, context ?? new ResolutionContext(this.singletons, this.scoped));\n }\n\n private getSingleDescriptor<T extends SourceType>(identifier: ServiceIdentifier<T>) {\n const descriptors = this.Services.get(identifier);\n if (descriptors.length === 0) {\n throw new UnregisteredServiceError(identifier);\n }\n\n if (descriptors.length > 1) {\n if (this.Services.options.registrationMode === ResolveMultipleMode.Error) {\n throw new MultipleRegistrationError(identifier);\n }\n }\n const descriptor = descriptors[descriptors.length - 1];\n return descriptor;\n }\n\n private createInstance<T extends SourceType>(descriptor: ServiceDescriptor<T>, context: ResolutionContext): T {\n const instance = this.createInstanceInternal(descriptor, context);\n this.setDependencies(descriptor.implementation, instance, context);\n context.setForLifetime(descriptor.implementation, instance, descriptor.lifetime);\n return instance;\n }\n\n private wrapContext(context: ResolutionContext): IResolutionScope {\n const resolve = (identifier: ServiceIdentifier<any>) => this.resolve(identifier, context);\n const resolveAll = (identifier: ServiceIdentifier<any>) => this.resolveAll(identifier, context);\n\n return {\n resolve,\n resolveAll,\n };\n }\n\n private createInstanceInternal<T extends SourceType>(descriptor: ServiceDescriptor<T>, context: ResolutionContext) {\n let instance: T | undefined;\n try {\n instance = descriptor.createInstance(this.wrapContext(context));\n } catch (err) {\n this.logger.error(err);\n throw new ServiceCreationError(descriptor.implementation, err);\n }\n if (descriptor.lifetime !== Lifetime.Singleton && Symbol.dispose in instance) {\n this.created.push(instance as IDisposable);\n }\n return instance;\n }\n\n public createScope(): IScopedProvider {\n return new ServiceProvider(this.logger, this.Services.clone(true), this.singletons);\n }\n\n private setDependencies<T extends SourceType>(implementation: ServiceImplementation<T>, instance: T, context: ResolutionContext): T {\n const dependencies = getMetadata<T>(DesignDependenciesKey, implementation) ?? {};\n this.logger.debug('Dependencies', implementation.name, dependencies);\n for (const [key, identifier] of Object.entries(dependencies)) {\n if (identifier !== implementation) {\n this.logger.debug('Resolving', identifier.name, 'for', implementation.name);\n const dep = this.resolve(identifier, context);\n (instance as Record<string, T>)[key] = dep;\n } else {\n throw new SelfDependencyError();\n }\n }\n return instance;\n }\n}\n","import type { Lifetime } from '../enums';\nimport type { IServiceBuilder, IServiceCollection, IServiceProvider } from '../interfaces';\nimport type { ILogger } from '../logger';\nimport type { EnsureObject, ServiceCollectionOptions, ServiceDescriptor, ServiceIdentifier, ServiceModuleType, SourceType, UnionToIntersection } from '../types';\nimport { ServiceBuilder } from './ServiceBuilder';\nimport { ServiceProvider } from './ServiceProvider';\n\nexport class ServiceCollection implements IServiceCollection {\n constructor(\n private readonly logger: ILogger,\n public readonly options: ServiceCollectionOptions,\n private readonly isScoped: boolean,\n private readonly services = new Map<ServiceIdentifier<any>, ServiceDescriptor<any>[]>(),\n ) {}\n\n public registerModules(...modules: ServiceModuleType[]): void {\n for (const x of modules) {\n const module = new x();\n module.registerServices(this);\n }\n }\n\n get<T extends SourceType>(key: ServiceIdentifier<T>): ServiceDescriptor<T>[] {\n return this.services.get(key) ?? [];\n }\n\n public overrideLifetime<T extends SourceType>(identifier: ServiceIdentifier<T>, lifetime: Lifetime): void {\n for (const descriptor of this.get(identifier)) {\n descriptor.lifetime = lifetime;\n }\n }\n\n register<Types extends SourceType[]>(...identifiers: { [K in keyof Types]: ServiceIdentifier<Types[K]> }): IServiceBuilder<EnsureObject<UnionToIntersection<Types[number]>>> {\n return new ServiceBuilder(identifiers, this.isScoped, (identifier, descriptor) => this.addService(identifier, descriptor));\n }\n\n private addService<T extends SourceType>(identifier: ServiceIdentifier<T>, descriptor: ServiceDescriptor<T>) {\n this.logger.info('Adding service', { identifier: identifier.name, descriptor });\n let existing = this.services.get(identifier);\n if (existing == null) {\n existing = [];\n this.services.set(identifier, existing);\n }\n existing.push(descriptor);\n }\n\n public clone(scoped?: unknown): IServiceCollection {\n const clonedMap = new Map<ServiceIdentifier<any>, ServiceDescriptor<any>[]>();\n for (const [key, descriptors] of this.services) {\n const clonedDescriptors = descriptors.map((descriptor) => ({ ...descriptor }));\n clonedMap.set(key, clonedDescriptors);\n }\n\n return new ServiceCollection(this.logger, this.options, scoped === true, clonedMap);\n }\n\n public buildProvider(): IServiceProvider {\n return new ServiceProvider(this.logger, this.clone());\n }\n}\n","export abstract class ILogger {\n public debug(_message?: any, ..._optionalParams: any[]) {}\n public info(_message?: any, ..._optionalParams: any[]) {}\n public error(_message?: any, ..._optionalParams: any[]) {}\n public warn(_message?: any, ..._optionalParams: any[]) {}\n}\n","import { LogLevel } from '../enums';\nimport { ILogger } from '../logger';\nimport type { ServiceCollectionOptions } from '../types';\n\nexport class ConsoleLogger extends ILogger {\n constructor(private readonly options: ServiceCollectionOptions) {\n super();\n }\n\n public override debug(message?: any, ...optionalParams: any[]): void {\n if (this.options.logLevel <= LogLevel.Debug) {\n console.debug(message, ...optionalParams);\n }\n }\n\n public override info(message?: any, ...optionalParams: any[]): void {\n if (this.options.logLevel <= LogLevel.Info) {\n console.info(message, ...optionalParams);\n }\n }\n\n public override warn(message?: any, ...optionalParams: any[]): void {\n if (this.options.logLevel <= LogLevel.Warn) {\n console.warn(message, ...optionalParams);\n }\n }\n\n public override error(message?: any, ...optionalParams: any[]): void {\n if (this.options.logLevel <= LogLevel.Error) {\n console.error(message, ...optionalParams);\n }\n }\n}\n","import { DefaultServiceCollectionOptions } from './defaults';\nimport type { IServiceCollection } from './interfaces';\nimport { ServiceCollection } from './private/ServiceCollection';\nimport { ConsoleLogger } from './private/consoleLogger';\nimport type { ServiceCollectionOptions } from './types';\n\nconst mergeOptions = (options: Partial<ServiceCollectionOptions> | undefined): ServiceCollectionOptions => ({\n ...DefaultServiceCollectionOptions,\n ...options,\n});\n\n/**\n * Creates a service collection with the (optionally) provided options\n * @param options - Optional configuration for the service collection.\n * @defaultValue Default options are taken from {@link DefaultServiceCollectionOptions}.\n */\nexport const createServiceCollection = (options?: Partial<ServiceCollectionOptions>): IServiceCollection => {\n const mergedOptions = mergeOptions(options);\n const logger = mergedOptions.logger ?? new ConsoleLogger(mergedOptions);\n return new ServiceCollection(logger, mergedOptions, false);\n};\n","import { IResolutionScope, IScopedProvider, IServiceProvider } from './interfaces';\nimport { DesignDependenciesKey } from './private/constants';\nimport { defineMetadata, getMetadata } from './private/metadata';\nimport type { ServiceIdentifier, SourceType } from './types';\n\nconst tagProperty = <T extends SourceType>(metadataKey: string, annotationTarget: object, name: string | symbol, identifier: ServiceIdentifier<T>) => {\n let existing = getMetadata<T>(metadataKey, annotationTarget);\n if (existing === undefined) {\n existing = {};\n defineMetadata(metadataKey, existing, annotationTarget);\n }\n existing[name] = identifier;\n};\n\n/**\n * declares a dependency, use on a class field.\n * Can also depend on {@link IServiceProvider}, {@link IResolutionScope}, or {@link IScopedProvider}.\n * @param identifier the identifier to depend on, i.e. the interface\n */\nexport const dependsOn = <T extends SourceType>(identifier: ServiceIdentifier<T>) => {\n return (value: undefined, ctx: ClassFieldDecoratorContext) => {\n return function (this: object, initialValue: any) {\n const target = this.constructor;\n tagProperty(DesignDependenciesKey, target, ctx.name, identifier);\n return initialValue;\n };\n };\n};\n"]}
1
+ {"version":3,"sources":["../src/enums.ts","../src/defaults.ts","../src/errors.ts","../src/private/ServiceBuilder.ts","../src/interfaces.ts","../src/private/ResolutionContext.ts","../src/private/constants.ts","../src/private/metadata.ts","../src/private/ServiceProvider.ts","../src/private/ServiceCollection.ts","../src/logger.ts","../src/private/consoleLogger.ts","../src/createServiceCollection.ts","../src/dependsOn.ts"],"names":["Lifetime","LogLevel","ResolveMultipleMode"],"mappings":"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","file":"index.js","sourcesContent":["export enum Lifetime {\n Resolve = 'RESOLVE',\n Transient = 'TRANSIENT',\n Scoped = 'SCOPED',\n Singleton = 'SINGLETON',\n}\n\nexport enum LogLevel {\n Debug = 0,\n Info = 1,\n Warn = 2,\n Error = 3,\n None = 4,\n}\n\nexport enum ResolveMultipleMode {\n Error = 'ERROR',\n LastRegistered = 'LAST_REGISTERED',\n}\n","import { LogLevel, ResolveMultipleMode } from './enums';\nimport type { ServiceCollectionOptions } from './types';\n\nexport const DefaultServiceCollectionOptions: ServiceCollectionOptions = {\n registrationMode: ResolveMultipleMode.Error,\n logLevel: LogLevel.Warn,\n};\n","import type { ServiceIdentifier } from './types';\n\nexport abstract class ServiceError extends Error {}\n\nexport class UnregisteredServiceError<T extends object> extends ServiceError {\n name = 'UnregisteredServiceError';\n constructor(identifier: ServiceIdentifier<T>) {\n super(`Resolving service that has not been registered: ${identifier.name}`);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class MultipleRegistrationError<T extends object> extends ServiceError {\n name = 'MultipleRegistrationError';\n constructor(identifier: ServiceIdentifier<T>) {\n super(`Multiple services have been registered: ${identifier.name}`);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ServiceCreationError<T extends object> extends ServiceError {\n name = 'ServiceCreationError';\n constructor(\n identifier: ServiceIdentifier<T>,\n public readonly innerError: any,\n ) {\n super(`Error creating service: ${identifier.name}`);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class SelfDependencyError extends ServiceError {\n name = 'SelfDependencyError';\n constructor() {\n super('Service depending on itself');\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ScopedSingletonRegistrationError extends ServiceError {\n name = 'ScopedSingletonRegistrationError';\n constructor() {\n super('Cannot register a singleton in a scoped service collection');\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { Lifetime } from '../enums';\nimport { ScopedSingletonRegistrationError } from '../errors';\nimport type { ILifetimeBuilder, IServiceBuilder } from '../interfaces';\nimport type { InstanceFactory, ServiceDescriptor, ServiceIdentifier, ServiceImplementation, SourceType } from '../types';\n\nexport class ServiceBuilder<T extends SourceType> implements IServiceBuilder<T> {\n private descriptor: ServiceDescriptor<T> | undefined;\n\n constructor(\n private readonly identifiers: ServiceIdentifier<T>[],\n private readonly isScoped: boolean,\n private readonly addService: (identifier: ServiceIdentifier<T>, descriptor: ServiceDescriptor<T>) => void,\n ) {}\n\n public to(implementation: ServiceImplementation<T>, factory?: InstanceFactory<T>): ILifetimeBuilder {\n this.descriptor = this.createDescriptor(factory, implementation);\n\n for (const identifier of this.identifiers) {\n this.addService(identifier, this.descriptor);\n }\n return this;\n }\n\n private createDescriptor(factory: InstanceFactory<T> | undefined, implementation: ServiceImplementation<T>): ServiceDescriptor<T> {\n const createInstance = factory ?? (() => new implementation());\n\n return {\n implementation,\n createInstance,\n lifetime: Lifetime.Resolve,\n };\n }\n\n public singleton(): this {\n if (this.isScoped) {\n throw new ScopedSingletonRegistrationError();\n }\n this.ensureDescriptor().lifetime = Lifetime.Singleton;\n return this;\n }\n\n public scoped(): this {\n this.ensureDescriptor().lifetime = Lifetime.Scoped;\n return this;\n }\n\n public transient(): this {\n this.ensureDescriptor().lifetime = Lifetime.Transient;\n return this;\n }\n\n private ensureDescriptor(): ServiceDescriptor<T> {\n if (!this.descriptor) {\n throw new Error('Must call to() before setting lifetime');\n }\n return this.descriptor;\n }\n}\n","import type { Lifetime } from './enums';\nimport { ResolveMultipleMode } from './enums';\nimport type { EnsureObject, ServiceBuilderOptions, ServiceCollectionOptions, ServiceDescriptor, ServiceIdentifier, ServiceModuleType, SourceType, UnionToIntersection } from './types';\n\nexport abstract class IDisposable {\n public abstract [Symbol.dispose](): void;\n}\n\nexport abstract class IServiceModule {\n public abstract registerServices(services: IServiceCollection): void;\n}\n\nexport abstract class IResolutionScope {\n /**\n * Resolves a single implementation for the given identifier.\n * @template T The type of service to resolve\n * @param identifier The service identifier\n * @returns The resolved instance\n * @throws {MultipleRegistrationError} When multiple implementations exist (unless {@link ServiceCollectionOptions.registrationMode} is set to {@link ResolveMultipleMode.LastRegistered}).\n * @throws {UnregisteredServiceError} When no implementation exists\n */\n public abstract resolve<T extends SourceType>(identifier: ServiceIdentifier<T>): T;\n\n /**\n * Resolves all implementations for the given identifier.\n * @template T The type of service to resolve\n * @param identifier The service identifier\n * @returns Array of resolved instances\n */\n public abstract resolveAll<T extends SourceType>(identifier: ServiceIdentifier<T>): T[];\n}\n\nexport abstract class IScopedProvider extends IResolutionScope implements IDisposable {\n public abstract readonly Services: IServiceCollection;\n public abstract [Symbol.dispose](): void;\n}\n\nexport abstract class IServiceProvider extends IResolutionScope {\n public abstract readonly Services: IServiceCollection;\n public abstract createScope(): IScopedProvider;\n}\n\nexport abstract class IServiceCollection {\n public abstract readonly options: ServiceCollectionOptions;\n public abstract get<T extends SourceType>(identifier: ServiceIdentifier<T>): ServiceDescriptor<T>[];\n public abstract register<Types extends SourceType[]>(...identifiers: { [K in keyof Types]: ServiceIdentifier<Types[K]> }): IServiceBuilder<EnsureObject<UnionToIntersection<Types[number]>>>;\n public abstract registerModules(...modules: ServiceModuleType[]): void;\n public abstract overrideLifetime<T extends SourceType>(identifier: ServiceIdentifier<T>, lifetime: Lifetime): void;\n public abstract buildProvider(): IServiceProvider;\n public abstract clone(): IServiceCollection;\n public abstract clone(scoped: true): IServiceCollection;\n}\n\nexport abstract class ILifetimeBuilder {\n public abstract singleton(): ILifetimeBuilder;\n public abstract scoped(): ILifetimeBuilder;\n public abstract transient(): ILifetimeBuilder;\n}\n\nexport abstract class IServiceBuilder<T extends SourceType> {\n public abstract to: ServiceBuilderOptions<T>;\n}\n","import { Lifetime } from '../enums';\nimport type { ServiceImplementation, SourceType } from '../types';\n\nexport class ResolutionContext {\n constructor(\n private readonly singletons: Map<ServiceImplementation<any>, any>,\n private readonly scoped: Map<ServiceImplementation<any>, any>,\n ) {}\n\n private readonly transient = new Map<ServiceImplementation<any>, any>();\n\n public getFromLifetime<T extends SourceType>(implementation: ServiceImplementation<T>, lifetime: Lifetime): T {\n const map = this.getMapForLifetime(lifetime);\n return map?.get(implementation);\n }\n\n public setForLifetime<T extends SourceType>(implementation: ServiceImplementation<T>, instance: T, lifetime: Lifetime): void {\n const map = this.getMapForLifetime(lifetime);\n map?.set(implementation, instance);\n }\n\n private getMapForLifetime(lifetime: Lifetime) {\n const map: Partial<Record<Lifetime, Map<ServiceImplementation<any>, any>>> = {\n [Lifetime.Singleton]: this.singletons,\n [Lifetime.Scoped]: this.scoped,\n [Lifetime.Resolve]: this.transient,\n };\n return map[lifetime];\n }\n}\n","export const DesignDependenciesKey = 'design:dependencies';\n","import '@abraham/reflection';\nimport type { MetadataType, SourceType } from '../types';\n\nexport const getMetadata = <T extends SourceType>(key: string, obj: object): MetadataType<T> | undefined => Reflect.getMetadata(key, obj);\nexport const defineMetadata = <T extends SourceType>(key: string, metadata: MetadataType<T>, obj: object) => Reflect.defineMetadata(key, metadata, obj);\n","import { Lifetime } from '../enums';\nimport { ResolveMultipleMode } from '../enums';\nimport { MultipleRegistrationError, SelfDependencyError, ServiceCreationError, UnregisteredServiceError } from '../errors';\nimport { type IDisposable, IResolutionScope, IScopedProvider, type IServiceCollection } from '../interfaces';\nimport { IServiceProvider } from '../interfaces';\nimport type { ILogger } from '../logger';\nimport type { ServiceDescriptor, ServiceIdentifier, ServiceImplementation, SourceType } from '../types';\nimport { ResolutionContext } from './ResolutionContext';\nimport { DesignDependenciesKey } from './constants';\nimport { getMetadata } from './metadata';\n\nexport class ServiceProvider implements IServiceProvider, IScopedProvider {\n private scoped = new Map<ServiceImplementation<any>, any>();\n private created: IDisposable[] = [];\n\n constructor(\n private readonly logger: ILogger,\n public readonly Services: IServiceCollection,\n private readonly singletons = new Map<ServiceImplementation<any>, any>(),\n ) {}\n\n [Symbol.dispose]() {\n for (const x of this.created) {\n x[Symbol.dispose]();\n }\n }\n\n private resolveInternal<T extends SourceType>(descriptor: ServiceDescriptor<T>, context: ResolutionContext): T {\n let instance = context.getFromLifetime(descriptor.implementation, descriptor.lifetime);\n if (instance == null) {\n instance = this.createInstance(descriptor, context);\n }\n return instance;\n }\n\n public resolveAll<T extends SourceType>(identifier: ServiceIdentifier<T>, context?: ResolutionContext): T[] {\n const descriptors = this.Services.get(identifier);\n return descriptors.map((descriptor) => this.resolveInternal<T>(descriptor, context ?? new ResolutionContext(this.singletons, this.scoped)));\n }\n\n public resolve<T extends SourceType>(identifier: ServiceIdentifier<T>, context?: ResolutionContext): T {\n if (identifier.prototype === IResolutionScope.prototype || identifier.prototype === IScopedProvider.prototype || identifier.prototype === IServiceProvider.prototype) {\n return this as IResolutionScope & IScopedProvider & IServiceProvider as T;\n }\n\n const descriptor = this.getSingleDescriptor(identifier);\n return this.resolveInternal(descriptor, context ?? new ResolutionContext(this.singletons, this.scoped));\n }\n\n private getSingleDescriptor<T extends SourceType>(identifier: ServiceIdentifier<T>) {\n const descriptors = this.Services.get(identifier);\n if (descriptors.length === 0) {\n throw new UnregisteredServiceError(identifier);\n }\n\n if (descriptors.length > 1) {\n if (this.Services.options.registrationMode === ResolveMultipleMode.Error) {\n throw new MultipleRegistrationError(identifier);\n }\n }\n const descriptor = descriptors[descriptors.length - 1];\n return descriptor;\n }\n\n private createInstance<T extends SourceType>(descriptor: ServiceDescriptor<T>, context: ResolutionContext): T {\n const instance = this.createInstanceInternal(descriptor, context);\n this.setDependencies(descriptor.implementation, instance, context);\n context.setForLifetime(descriptor.implementation, instance, descriptor.lifetime);\n return instance;\n }\n\n private wrapContext(context: ResolutionContext): IResolutionScope {\n const resolve = (identifier: ServiceIdentifier<any>) => this.resolve(identifier, context);\n const resolveAll = (identifier: ServiceIdentifier<any>) => this.resolveAll(identifier, context);\n\n return {\n resolve,\n resolveAll,\n };\n }\n\n private createInstanceInternal<T extends SourceType>(descriptor: ServiceDescriptor<T>, context: ResolutionContext) {\n let instance: T | undefined;\n try {\n instance = descriptor.createInstance(this.wrapContext(context));\n } catch (err) {\n this.logger.error(err);\n throw new ServiceCreationError(descriptor.implementation, err);\n }\n if (descriptor.lifetime !== Lifetime.Singleton && Symbol.dispose in instance) {\n this.created.push(instance as IDisposable);\n }\n return instance;\n }\n\n public createScope(): IScopedProvider {\n return new ServiceProvider(this.logger, this.Services.clone(true), this.singletons);\n }\n\n private setDependencies<T extends SourceType>(implementation: ServiceImplementation<T>, instance: T, context: ResolutionContext): T {\n const dependencies = getMetadata<T>(DesignDependenciesKey, implementation) ?? {};\n this.logger.debug('Dependencies', implementation.name, dependencies);\n for (const [key, identifier] of Object.entries(dependencies)) {\n if (identifier !== implementation) {\n this.logger.debug('Resolving', identifier.name, 'for', implementation.name);\n const dep = this.resolve(identifier, context);\n (instance as Record<string, T>)[key] = dep;\n } else {\n throw new SelfDependencyError();\n }\n }\n return instance;\n }\n}\n","import type { Lifetime } from '../enums';\nimport type { IServiceBuilder, IServiceCollection, IServiceProvider } from '../interfaces';\nimport type { ILogger } from '../logger';\nimport type { EnsureObject, ServiceCollectionOptions, ServiceDescriptor, ServiceIdentifier, ServiceModuleType, SourceType, UnionToIntersection } from '../types';\nimport { ServiceBuilder } from './ServiceBuilder';\nimport { ServiceProvider } from './ServiceProvider';\n\nexport class ServiceCollection implements IServiceCollection {\n constructor(\n private readonly logger: ILogger,\n public readonly options: ServiceCollectionOptions,\n private readonly isScoped: boolean,\n private readonly services = new Map<ServiceIdentifier<any>, ServiceDescriptor<any>[]>(),\n ) {}\n\n public registerModules(...modules: ServiceModuleType[]): void {\n for (const x of modules) {\n const module = new x();\n module.registerServices(this);\n }\n }\n\n get<T extends SourceType>(key: ServiceIdentifier<T>): ServiceDescriptor<T>[] {\n return this.services.get(key) ?? [];\n }\n\n public overrideLifetime<T extends SourceType>(identifier: ServiceIdentifier<T>, lifetime: Lifetime): void {\n for (const descriptor of this.get(identifier)) {\n descriptor.lifetime = lifetime;\n }\n }\n\n register<Types extends SourceType[]>(...identifiers: { [K in keyof Types]: ServiceIdentifier<Types[K]> }): IServiceBuilder<EnsureObject<UnionToIntersection<Types[number]>>> {\n return new ServiceBuilder(identifiers, this.isScoped, (identifier, descriptor) => this.addService(identifier, descriptor));\n }\n\n private addService<T extends SourceType>(identifier: ServiceIdentifier<T>, descriptor: ServiceDescriptor<T>) {\n this.logger.info('Adding service', { identifier: identifier.name, descriptor });\n let existing = this.services.get(identifier);\n if (existing == null) {\n existing = [];\n this.services.set(identifier, existing);\n }\n existing.push(descriptor);\n }\n\n public clone(scoped?: unknown): IServiceCollection {\n const clonedMap = new Map<ServiceIdentifier<any>, ServiceDescriptor<any>[]>();\n for (const [key, descriptors] of this.services) {\n const clonedDescriptors = descriptors.map((descriptor) => ({ ...descriptor }));\n clonedMap.set(key, clonedDescriptors);\n }\n\n return new ServiceCollection(this.logger, this.options, scoped === true, clonedMap);\n }\n\n public buildProvider(): IServiceProvider {\n return new ServiceProvider(this.logger, this.clone());\n }\n}\n","export abstract class ILogger {\n public debug(_message?: any, ..._optionalParams: any[]) {}\n public info(_message?: any, ..._optionalParams: any[]) {}\n public error(_message?: any, ..._optionalParams: any[]) {}\n public warn(_message?: any, ..._optionalParams: any[]) {}\n}\n","import { LogLevel } from '../enums';\nimport { ILogger } from '../logger';\nimport type { ServiceCollectionOptions } from '../types';\n\nexport class ConsoleLogger extends ILogger {\n constructor(private readonly options: ServiceCollectionOptions) {\n super();\n }\n\n public override debug(message?: any, ...optionalParams: any[]): void {\n if (this.options.logLevel <= LogLevel.Debug) {\n console.debug(message, ...optionalParams);\n }\n }\n\n public override info(message?: any, ...optionalParams: any[]): void {\n if (this.options.logLevel <= LogLevel.Info) {\n console.info(message, ...optionalParams);\n }\n }\n\n public override warn(message?: any, ...optionalParams: any[]): void {\n if (this.options.logLevel <= LogLevel.Warn) {\n console.warn(message, ...optionalParams);\n }\n }\n\n public override error(message?: any, ...optionalParams: any[]): void {\n if (this.options.logLevel <= LogLevel.Error) {\n console.error(message, ...optionalParams);\n }\n }\n}\n","import { DefaultServiceCollectionOptions } from './defaults';\nimport type { IServiceCollection } from './interfaces';\nimport { ServiceCollection } from './private/ServiceCollection';\nimport { ConsoleLogger } from './private/consoleLogger';\nimport type { ServiceCollectionOptions } from './types';\n\nconst mergeOptions = (options: Partial<ServiceCollectionOptions> | undefined): ServiceCollectionOptions => ({\n ...DefaultServiceCollectionOptions,\n ...options,\n});\n\n/**\n * Creates a service collection with the (optionally) provided options\n * @param options - Optional configuration for the service collection.\n * @defaultValue Default options are taken from {@link DefaultServiceCollectionOptions}.\n */\nexport const createServiceCollection = (options?: Partial<ServiceCollectionOptions>): IServiceCollection => {\n const mergedOptions = mergeOptions(options);\n const logger = mergedOptions.logger ?? new ConsoleLogger(mergedOptions);\n return new ServiceCollection(logger, mergedOptions, false);\n};\n","import { IResolutionScope, IScopedProvider, IServiceProvider } from './interfaces';\nimport { DesignDependenciesKey } from './private/constants';\nimport { defineMetadata, getMetadata } from './private/metadata';\nimport type { ServiceIdentifier, SourceType } from './types';\n\nconst tagProperty = <T extends SourceType>(metadataKey: string, annotationTarget: object, name: string | symbol, identifier: ServiceIdentifier<T>) => {\n let existing = getMetadata<T>(metadataKey, annotationTarget);\n if (existing === undefined) {\n existing = {};\n defineMetadata(metadataKey, existing, annotationTarget);\n }\n existing[name] = identifier;\n};\n\n/**\n * declares a dependency, use on a class field.\n * Can also depend on {@link IServiceProvider}, {@link IResolutionScope}, or {@link IScopedProvider}.\n * @param identifier the identifier to depend on, i.e. the interface\n */\nexport const dependsOn = <T extends SourceType>(identifier: ServiceIdentifier<T>) => {\n return (value: undefined, ctx: ClassFieldDecoratorContext) => {\n return function (this: object, initialValue: any) {\n const target = this.constructor;\n tagProperty(DesignDependenciesKey, target, ctx.name, identifier);\n return initialValue;\n };\n };\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/enums.ts","../src/defaults.ts","../src/errors.ts","../src/private/ServiceBuilder.ts","../src/interfaces.ts","../src/private/ResolutionContext.ts","../src/private/constants.ts","../src/private/metadata.ts","../src/private/ServiceProvider.ts","../src/private/ServiceCollection.ts","../src/logger.ts","../src/private/consoleLogger.ts","../src/createServiceCollection.ts","../src/dependsOn.ts"],"names":["Lifetime","LogLevel","ResolveMultipleMode"],"mappings":"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","file":"index.mjs","sourcesContent":["export enum Lifetime {\n Resolve = 'RESOLVE',\n Transient = 'TRANSIENT',\n Scoped = 'SCOPED',\n Singleton = 'SINGLETON',\n}\n\nexport enum LogLevel {\n Debug = 0,\n Info = 1,\n Warn = 2,\n Error = 3,\n None = 4,\n}\n\nexport enum ResolveMultipleMode {\n Error = 'ERROR',\n LastRegistered = 'LAST_REGISTERED',\n}\n","import { LogLevel, ResolveMultipleMode } from './enums';\nimport type { ServiceCollectionOptions } from './types';\n\nexport const DefaultServiceCollectionOptions: ServiceCollectionOptions = {\n registrationMode: ResolveMultipleMode.Error,\n logLevel: LogLevel.Warn,\n};\n","import type { ServiceIdentifier } from './types';\n\nexport abstract class ServiceError extends Error {}\n\nexport class UnregisteredServiceError<T extends object> extends ServiceError {\n name = 'UnregisteredServiceError';\n constructor(identifier: ServiceIdentifier<T>) {\n super(`Resolving service that has not been registered: ${identifier.name}`);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class MultipleRegistrationError<T extends object> extends ServiceError {\n name = 'MultipleRegistrationError';\n constructor(identifier: ServiceIdentifier<T>) {\n super(`Multiple services have been registered: ${identifier.name}`);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ServiceCreationError<T extends object> extends ServiceError {\n name = 'ServiceCreationError';\n constructor(\n identifier: ServiceIdentifier<T>,\n public readonly innerError: any,\n ) {\n super(`Error creating service: ${identifier.name}`);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class SelfDependencyError extends ServiceError {\n name = 'SelfDependencyError';\n constructor() {\n super('Service depending on itself');\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ScopedSingletonRegistrationError extends ServiceError {\n name = 'ScopedSingletonRegistrationError';\n constructor() {\n super('Cannot register a singleton in a scoped service collection');\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { Lifetime } from '../enums';\nimport { ScopedSingletonRegistrationError } from '../errors';\nimport type { ILifetimeBuilder, IServiceBuilder } from '../interfaces';\nimport type { InstanceFactory, ServiceDescriptor, ServiceIdentifier, ServiceImplementation, SourceType } from '../types';\n\nexport class ServiceBuilder<T extends SourceType> implements IServiceBuilder<T> {\n private descriptor: ServiceDescriptor<T> | undefined;\n\n constructor(\n private readonly identifiers: ServiceIdentifier<T>[],\n private readonly isScoped: boolean,\n private readonly addService: (identifier: ServiceIdentifier<T>, descriptor: ServiceDescriptor<T>) => void,\n ) {}\n\n public to(implementation: ServiceImplementation<T>, factory?: InstanceFactory<T>): ILifetimeBuilder {\n this.descriptor = this.createDescriptor(factory, implementation);\n\n for (const identifier of this.identifiers) {\n this.addService(identifier, this.descriptor);\n }\n return this;\n }\n\n private createDescriptor(factory: InstanceFactory<T> | undefined, implementation: ServiceImplementation<T>): ServiceDescriptor<T> {\n const createInstance = factory ?? (() => new implementation());\n\n return {\n implementation,\n createInstance,\n lifetime: Lifetime.Resolve,\n };\n }\n\n public singleton(): this {\n if (this.isScoped) {\n throw new ScopedSingletonRegistrationError();\n }\n this.ensureDescriptor().lifetime = Lifetime.Singleton;\n return this;\n }\n\n public scoped(): this {\n this.ensureDescriptor().lifetime = Lifetime.Scoped;\n return this;\n }\n\n public transient(): this {\n this.ensureDescriptor().lifetime = Lifetime.Transient;\n return this;\n }\n\n private ensureDescriptor(): ServiceDescriptor<T> {\n if (!this.descriptor) {\n throw new Error('Must call to() before setting lifetime');\n }\n return this.descriptor;\n }\n}\n","import type { Lifetime } from './enums';\nimport { ResolveMultipleMode } from './enums';\nimport type { EnsureObject, ServiceBuilderOptions, ServiceCollectionOptions, ServiceDescriptor, ServiceIdentifier, ServiceModuleType, SourceType, UnionToIntersection } from './types';\n\nexport abstract class IDisposable {\n public abstract [Symbol.dispose](): void;\n}\n\nexport abstract class IServiceModule {\n public abstract registerServices(services: IServiceCollection): void;\n}\n\nexport abstract class IResolutionScope {\n /**\n * Resolves a single implementation for the given identifier.\n * @template T The type of service to resolve\n * @param identifier The service identifier\n * @returns The resolved instance\n * @throws {MultipleRegistrationError} When multiple implementations exist (unless {@link ServiceCollectionOptions.registrationMode} is set to {@link ResolveMultipleMode.LastRegistered}).\n * @throws {UnregisteredServiceError} When no implementation exists\n */\n public abstract resolve<T extends SourceType>(identifier: ServiceIdentifier<T>): T;\n\n /**\n * Resolves all implementations for the given identifier.\n * @template T The type of service to resolve\n * @param identifier The service identifier\n * @returns Array of resolved instances\n */\n public abstract resolveAll<T extends SourceType>(identifier: ServiceIdentifier<T>): T[];\n}\n\nexport abstract class IScopedProvider extends IResolutionScope implements IDisposable {\n public abstract readonly Services: IServiceCollection;\n public abstract [Symbol.dispose](): void;\n}\n\nexport abstract class IServiceProvider extends IResolutionScope {\n public abstract readonly Services: IServiceCollection;\n public abstract createScope(): IScopedProvider;\n}\n\nexport abstract class IServiceCollection {\n public abstract readonly options: ServiceCollectionOptions;\n public abstract get<T extends SourceType>(identifier: ServiceIdentifier<T>): ServiceDescriptor<T>[];\n public abstract register<Types extends SourceType[]>(...identifiers: { [K in keyof Types]: ServiceIdentifier<Types[K]> }): IServiceBuilder<EnsureObject<UnionToIntersection<Types[number]>>>;\n public abstract registerModules(...modules: ServiceModuleType[]): void;\n public abstract overrideLifetime<T extends SourceType>(identifier: ServiceIdentifier<T>, lifetime: Lifetime): void;\n public abstract buildProvider(): IServiceProvider;\n public abstract clone(): IServiceCollection;\n public abstract clone(scoped: true): IServiceCollection;\n}\n\nexport abstract class ILifetimeBuilder {\n public abstract singleton(): ILifetimeBuilder;\n public abstract scoped(): ILifetimeBuilder;\n public abstract transient(): ILifetimeBuilder;\n}\n\nexport abstract class IServiceBuilder<T extends SourceType> {\n public abstract to: ServiceBuilderOptions<T>;\n}\n","import { Lifetime } from '../enums';\nimport type { ServiceImplementation, SourceType } from '../types';\n\nexport class ResolutionContext {\n constructor(\n private readonly singletons: Map<ServiceImplementation<any>, any>,\n private readonly scoped: Map<ServiceImplementation<any>, any>,\n ) {}\n\n private readonly transient = new Map<ServiceImplementation<any>, any>();\n\n public getFromLifetime<T extends SourceType>(implementation: ServiceImplementation<T>, lifetime: Lifetime): T {\n const map = this.getMapForLifetime(lifetime);\n return map?.get(implementation);\n }\n\n public setForLifetime<T extends SourceType>(implementation: ServiceImplementation<T>, instance: T, lifetime: Lifetime): void {\n const map = this.getMapForLifetime(lifetime);\n map?.set(implementation, instance);\n }\n\n private getMapForLifetime(lifetime: Lifetime) {\n const map: Partial<Record<Lifetime, Map<ServiceImplementation<any>, any>>> = {\n [Lifetime.Singleton]: this.singletons,\n [Lifetime.Scoped]: this.scoped,\n [Lifetime.Resolve]: this.transient,\n };\n return map[lifetime];\n }\n}\n","export const DesignDependenciesKey = 'design:dependencies';\n","import '@abraham/reflection';\nimport type { MetadataType, SourceType } from '../types';\n\nexport const getMetadata = <T extends SourceType>(key: string, obj: object): MetadataType<T> | undefined => Reflect.getMetadata(key, obj);\nexport const defineMetadata = <T extends SourceType>(key: string, metadata: MetadataType<T>, obj: object) => Reflect.defineMetadata(key, metadata, obj);\n","import { Lifetime } from '../enums';\nimport { ResolveMultipleMode } from '../enums';\nimport { MultipleRegistrationError, SelfDependencyError, ServiceCreationError, UnregisteredServiceError } from '../errors';\nimport { type IDisposable, IResolutionScope, IScopedProvider, type IServiceCollection } from '../interfaces';\nimport { IServiceProvider } from '../interfaces';\nimport type { ILogger } from '../logger';\nimport type { ServiceDescriptor, ServiceIdentifier, ServiceImplementation, SourceType } from '../types';\nimport { ResolutionContext } from './ResolutionContext';\nimport { DesignDependenciesKey } from './constants';\nimport { getMetadata } from './metadata';\n\nexport class ServiceProvider implements IServiceProvider, IScopedProvider {\n private scoped = new Map<ServiceImplementation<any>, any>();\n private created: IDisposable[] = [];\n\n constructor(\n private readonly logger: ILogger,\n public readonly Services: IServiceCollection,\n private readonly singletons = new Map<ServiceImplementation<any>, any>(),\n ) {}\n\n [Symbol.dispose]() {\n for (const x of this.created) {\n x[Symbol.dispose]();\n }\n }\n\n private resolveInternal<T extends SourceType>(descriptor: ServiceDescriptor<T>, context: ResolutionContext): T {\n let instance = context.getFromLifetime(descriptor.implementation, descriptor.lifetime);\n if (instance == null) {\n instance = this.createInstance(descriptor, context);\n }\n return instance;\n }\n\n public resolveAll<T extends SourceType>(identifier: ServiceIdentifier<T>, context?: ResolutionContext): T[] {\n const descriptors = this.Services.get(identifier);\n return descriptors.map((descriptor) => this.resolveInternal<T>(descriptor, context ?? new ResolutionContext(this.singletons, this.scoped)));\n }\n\n public resolve<T extends SourceType>(identifier: ServiceIdentifier<T>, context?: ResolutionContext): T {\n if (identifier.prototype === IResolutionScope.prototype || identifier.prototype === IScopedProvider.prototype || identifier.prototype === IServiceProvider.prototype) {\n return this as IResolutionScope & IScopedProvider & IServiceProvider as T;\n }\n\n const descriptor = this.getSingleDescriptor(identifier);\n return this.resolveInternal(descriptor, context ?? new ResolutionContext(this.singletons, this.scoped));\n }\n\n private getSingleDescriptor<T extends SourceType>(identifier: ServiceIdentifier<T>) {\n const descriptors = this.Services.get(identifier);\n if (descriptors.length === 0) {\n throw new UnregisteredServiceError(identifier);\n }\n\n if (descriptors.length > 1) {\n if (this.Services.options.registrationMode === ResolveMultipleMode.Error) {\n throw new MultipleRegistrationError(identifier);\n }\n }\n const descriptor = descriptors[descriptors.length - 1];\n return descriptor;\n }\n\n private createInstance<T extends SourceType>(descriptor: ServiceDescriptor<T>, context: ResolutionContext): T {\n const instance = this.createInstanceInternal(descriptor, context);\n this.setDependencies(descriptor.implementation, instance, context);\n context.setForLifetime(descriptor.implementation, instance, descriptor.lifetime);\n return instance;\n }\n\n private wrapContext(context: ResolutionContext): IResolutionScope {\n const resolve = (identifier: ServiceIdentifier<any>) => this.resolve(identifier, context);\n const resolveAll = (identifier: ServiceIdentifier<any>) => this.resolveAll(identifier, context);\n\n return {\n resolve,\n resolveAll,\n };\n }\n\n private createInstanceInternal<T extends SourceType>(descriptor: ServiceDescriptor<T>, context: ResolutionContext) {\n let instance: T | undefined;\n try {\n instance = descriptor.createInstance(this.wrapContext(context));\n } catch (err) {\n this.logger.error(err);\n throw new ServiceCreationError(descriptor.implementation, err);\n }\n if (descriptor.lifetime !== Lifetime.Singleton && Symbol.dispose in instance) {\n this.created.push(instance as IDisposable);\n }\n return instance;\n }\n\n public createScope(): IScopedProvider {\n return new ServiceProvider(this.logger, this.Services.clone(true), this.singletons);\n }\n\n private setDependencies<T extends SourceType>(implementation: ServiceImplementation<T>, instance: T, context: ResolutionContext): T {\n const dependencies = getMetadata<T>(DesignDependenciesKey, implementation) ?? {};\n this.logger.debug('Dependencies', implementation.name, dependencies);\n for (const [key, identifier] of Object.entries(dependencies)) {\n if (identifier !== implementation) {\n this.logger.debug('Resolving', identifier.name, 'for', implementation.name);\n const dep = this.resolve(identifier, context);\n (instance as Record<string, T>)[key] = dep;\n } else {\n throw new SelfDependencyError();\n }\n }\n return instance;\n }\n}\n","import type { Lifetime } from '../enums';\nimport type { IServiceBuilder, IServiceCollection, IServiceProvider } from '../interfaces';\nimport type { ILogger } from '../logger';\nimport type { EnsureObject, ServiceCollectionOptions, ServiceDescriptor, ServiceIdentifier, ServiceModuleType, SourceType, UnionToIntersection } from '../types';\nimport { ServiceBuilder } from './ServiceBuilder';\nimport { ServiceProvider } from './ServiceProvider';\n\nexport class ServiceCollection implements IServiceCollection {\n constructor(\n private readonly logger: ILogger,\n public readonly options: ServiceCollectionOptions,\n private readonly isScoped: boolean,\n private readonly services = new Map<ServiceIdentifier<any>, ServiceDescriptor<any>[]>(),\n ) {}\n\n public registerModules(...modules: ServiceModuleType[]): void {\n for (const x of modules) {\n const module = new x();\n module.registerServices(this);\n }\n }\n\n get<T extends SourceType>(key: ServiceIdentifier<T>): ServiceDescriptor<T>[] {\n return this.services.get(key) ?? [];\n }\n\n public overrideLifetime<T extends SourceType>(identifier: ServiceIdentifier<T>, lifetime: Lifetime): void {\n for (const descriptor of this.get(identifier)) {\n descriptor.lifetime = lifetime;\n }\n }\n\n register<Types extends SourceType[]>(...identifiers: { [K in keyof Types]: ServiceIdentifier<Types[K]> }): IServiceBuilder<EnsureObject<UnionToIntersection<Types[number]>>> {\n return new ServiceBuilder(identifiers, this.isScoped, (identifier, descriptor) => this.addService(identifier, descriptor));\n }\n\n private addService<T extends SourceType>(identifier: ServiceIdentifier<T>, descriptor: ServiceDescriptor<T>) {\n this.logger.info('Adding service', { identifier: identifier.name, descriptor });\n let existing = this.services.get(identifier);\n if (existing == null) {\n existing = [];\n this.services.set(identifier, existing);\n }\n existing.push(descriptor);\n }\n\n public clone(scoped?: unknown): IServiceCollection {\n const clonedMap = new Map<ServiceIdentifier<any>, ServiceDescriptor<any>[]>();\n for (const [key, descriptors] of this.services) {\n const clonedDescriptors = descriptors.map((descriptor) => ({ ...descriptor }));\n clonedMap.set(key, clonedDescriptors);\n }\n\n return new ServiceCollection(this.logger, this.options, scoped === true, clonedMap);\n }\n\n public buildProvider(): IServiceProvider {\n return new ServiceProvider(this.logger, this.clone());\n }\n}\n","export abstract class ILogger {\n public debug(_message?: any, ..._optionalParams: any[]) {}\n public info(_message?: any, ..._optionalParams: any[]) {}\n public error(_message?: any, ..._optionalParams: any[]) {}\n public warn(_message?: any, ..._optionalParams: any[]) {}\n}\n","import { LogLevel } from '../enums';\nimport { ILogger } from '../logger';\nimport type { ServiceCollectionOptions } from '../types';\n\nexport class ConsoleLogger extends ILogger {\n constructor(private readonly options: ServiceCollectionOptions) {\n super();\n }\n\n public override debug(message?: any, ...optionalParams: any[]): void {\n if (this.options.logLevel <= LogLevel.Debug) {\n console.debug(message, ...optionalParams);\n }\n }\n\n public override info(message?: any, ...optionalParams: any[]): void {\n if (this.options.logLevel <= LogLevel.Info) {\n console.info(message, ...optionalParams);\n }\n }\n\n public override warn(message?: any, ...optionalParams: any[]): void {\n if (this.options.logLevel <= LogLevel.Warn) {\n console.warn(message, ...optionalParams);\n }\n }\n\n public override error(message?: any, ...optionalParams: any[]): void {\n if (this.options.logLevel <= LogLevel.Error) {\n console.error(message, ...optionalParams);\n }\n }\n}\n","import { DefaultServiceCollectionOptions } from './defaults';\nimport type { IServiceCollection } from './interfaces';\nimport { ServiceCollection } from './private/ServiceCollection';\nimport { ConsoleLogger } from './private/consoleLogger';\nimport type { ServiceCollectionOptions } from './types';\n\nconst mergeOptions = (options: Partial<ServiceCollectionOptions> | undefined): ServiceCollectionOptions => ({\n ...DefaultServiceCollectionOptions,\n ...options,\n});\n\n/**\n * Creates a service collection with the (optionally) provided options\n * @param options - Optional configuration for the service collection.\n * @defaultValue Default options are taken from {@link DefaultServiceCollectionOptions}.\n */\nexport const createServiceCollection = (options?: Partial<ServiceCollectionOptions>): IServiceCollection => {\n const mergedOptions = mergeOptions(options);\n const logger = mergedOptions.logger ?? new ConsoleLogger(mergedOptions);\n return new ServiceCollection(logger, mergedOptions, false);\n};\n","import { IResolutionScope, IScopedProvider, IServiceProvider } from './interfaces';\nimport { DesignDependenciesKey } from './private/constants';\nimport { defineMetadata, getMetadata } from './private/metadata';\nimport type { ServiceIdentifier, SourceType } from './types';\n\nconst tagProperty = <T extends SourceType>(metadataKey: string, annotationTarget: object, name: string | symbol, identifier: ServiceIdentifier<T>) => {\n let existing = getMetadata<T>(metadataKey, annotationTarget);\n if (existing === undefined) {\n existing = {};\n defineMetadata(metadataKey, existing, annotationTarget);\n }\n existing[name] = identifier;\n};\n\n/**\n * declares a dependency, use on a class field.\n * Can also depend on {@link IServiceProvider}, {@link IResolutionScope}, or {@link IScopedProvider}.\n * @param identifier the identifier to depend on, i.e. the interface\n */\nexport const dependsOn = <T extends SourceType>(identifier: ServiceIdentifier<T>) => {\n return (value: undefined, ctx: ClassFieldDecoratorContext) => {\n return function (this: object, initialValue: any) {\n const target = this.constructor;\n tagProperty(DesignDependenciesKey, target, ctx.name, identifier);\n return initialValue;\n };\n };\n};\n"]}
1
+ {"version":3,"sources":["../src/enums.ts","../src/defaults.ts","../src/errors.ts","../src/private/ServiceBuilder.ts","../src/interfaces.ts","../src/private/ResolutionContext.ts","../src/private/constants.ts","../src/private/metadata.ts","../src/private/ServiceProvider.ts","../src/private/ServiceCollection.ts","../src/logger.ts","../src/private/consoleLogger.ts","../src/createServiceCollection.ts","../src/dependsOn.ts"],"names":["Lifetime","LogLevel","ResolveMultipleMode"],"mappings":"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","file":"index.mjs","sourcesContent":["export enum Lifetime {\n Resolve = 'RESOLVE',\n Transient = 'TRANSIENT',\n Scoped = 'SCOPED',\n Singleton = 'SINGLETON',\n}\n\nexport enum LogLevel {\n Debug = 0,\n Info = 1,\n Warn = 2,\n Error = 3,\n None = 4,\n}\n\nexport enum ResolveMultipleMode {\n Error = 'ERROR',\n LastRegistered = 'LAST_REGISTERED',\n}\n","import { LogLevel, ResolveMultipleMode } from './enums';\nimport type { ServiceCollectionOptions } from './types';\n\nexport const DefaultServiceCollectionOptions: ServiceCollectionOptions = {\n registrationMode: ResolveMultipleMode.Error,\n logLevel: LogLevel.Warn,\n};\n","import type { ServiceIdentifier } from './types';\n\nexport abstract class ServiceError extends Error {}\n\nexport class UnregisteredServiceError<T extends object> extends ServiceError {\n name = 'UnregisteredServiceError';\n constructor(identifier: ServiceIdentifier<T>) {\n super(`Resolving service that has not been registered: ${identifier.name}`);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class MultipleRegistrationError<T extends object> extends ServiceError {\n name = 'MultipleRegistrationError';\n constructor(identifier: ServiceIdentifier<T>) {\n super(`Multiple services have been registered: ${identifier.name}`);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ServiceCreationError<T extends object> extends ServiceError {\n name = 'ServiceCreationError';\n constructor(\n identifier: ServiceIdentifier<T>,\n public readonly innerError: any,\n ) {\n super(`Error creating service: ${identifier.name}`);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class SelfDependencyError extends ServiceError {\n name = 'SelfDependencyError';\n constructor() {\n super('Service depending on itself');\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ScopedSingletonRegistrationError extends ServiceError {\n name = 'ScopedSingletonRegistrationError';\n constructor() {\n super('Cannot register a singleton in a scoped service collection');\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { Lifetime } from '../enums';\nimport { ScopedSingletonRegistrationError } from '../errors';\nimport type { ILifetimeBuilder, IServiceBuilder } from '../interfaces';\nimport type { InstanceFactory, ServiceDescriptor, ServiceIdentifier, ServiceImplementation, SourceType } from '../types';\n\nexport class ServiceBuilder<T extends SourceType> implements IServiceBuilder<T> {\n private descriptor: ServiceDescriptor<T> | undefined;\n\n constructor(\n private readonly identifiers: ServiceIdentifier<T>[],\n private readonly isScoped: boolean,\n private readonly addService: (identifier: ServiceIdentifier<T>, descriptor: ServiceDescriptor<T>) => void,\n ) {}\n\n public to(implementation: ServiceImplementation<T>, factory?: InstanceFactory<T>): ILifetimeBuilder {\n this.descriptor = this.createDescriptor(factory, implementation);\n\n for (const identifier of this.identifiers) {\n this.addService(identifier, this.descriptor);\n }\n return this;\n }\n\n private createDescriptor(factory: InstanceFactory<T> | undefined, implementation: ServiceImplementation<T>): ServiceDescriptor<T> {\n const createInstance = factory ?? (() => new implementation());\n\n return {\n implementation,\n createInstance,\n lifetime: Lifetime.Resolve,\n };\n }\n\n public singleton(): this {\n if (this.isScoped) {\n throw new ScopedSingletonRegistrationError();\n }\n this.ensureDescriptor().lifetime = Lifetime.Singleton;\n return this;\n }\n\n public scoped(): this {\n this.ensureDescriptor().lifetime = Lifetime.Scoped;\n return this;\n }\n\n public transient(): this {\n this.ensureDescriptor().lifetime = Lifetime.Transient;\n return this;\n }\n\n private ensureDescriptor(): ServiceDescriptor<T> {\n if (!this.descriptor) {\n throw new Error('Must call to() before setting lifetime');\n }\n return this.descriptor;\n }\n}\n","import type { Lifetime } from './enums';\nimport { ResolveMultipleMode } from './enums';\nimport type { EnsureObject, ServiceBuilderOptions, ServiceCollectionOptions, ServiceDescriptor, ServiceIdentifier, ServiceModuleType, SourceType, UnionToIntersection } from './types';\n\nexport abstract class IDisposable {\n public abstract [Symbol.dispose](): void;\n}\n\nexport abstract class IServiceModule {\n public abstract registerServices(services: IServiceCollection): void;\n}\n\nexport abstract class IResolutionScope {\n /**\n * Resolves a single implementation for the given identifier.\n * @template T The type of service to resolve\n * @param identifier The service identifier\n * @returns The resolved instance\n * @throws {MultipleRegistrationError} When multiple implementations exist (unless {@link ServiceCollectionOptions.registrationMode} is set to {@link ResolveMultipleMode.LastRegistered}).\n * @throws {UnregisteredServiceError} When no implementation exists\n */\n public abstract resolve<T extends SourceType>(identifier: ServiceIdentifier<T>): T;\n\n /**\n * Resolves all implementations for the given identifier.\n * @template T The type of service to resolve\n * @param identifier The service identifier\n * @returns Array of resolved instances\n */\n public abstract resolveAll<T extends SourceType>(identifier: ServiceIdentifier<T>): T[];\n}\n\nexport abstract class IScopedProvider extends IResolutionScope implements IDisposable {\n public abstract readonly Services: IServiceCollection;\n public abstract [Symbol.dispose](): void;\n}\n\nexport abstract class IServiceProvider extends IResolutionScope {\n public abstract readonly Services: IServiceCollection;\n public abstract createScope(): IScopedProvider;\n}\n\nexport abstract class IServiceCollection {\n public abstract readonly options: ServiceCollectionOptions;\n public abstract get<T extends SourceType>(identifier: ServiceIdentifier<T>): ServiceDescriptor<T>[];\n public abstract register<Types extends SourceType[]>(...identifiers: { [K in keyof Types]: ServiceIdentifier<Types[K]> }): IServiceBuilder<EnsureObject<UnionToIntersection<Types[number]>>>;\n public abstract registerModules(...modules: ServiceModuleType[]): void;\n public abstract overrideLifetime<T extends SourceType>(identifier: ServiceIdentifier<T>, lifetime: Lifetime): void;\n public abstract buildProvider(): IServiceProvider;\n public abstract clone(): IServiceCollection;\n public abstract clone(scoped: true): IServiceCollection;\n}\n\nexport abstract class ILifetimeBuilder {\n public abstract singleton(): ILifetimeBuilder;\n public abstract scoped(): ILifetimeBuilder;\n public abstract transient(): ILifetimeBuilder;\n}\n\nexport abstract class IServiceBuilder<T extends SourceType> {\n public abstract to: ServiceBuilderOptions<T>;\n}\n","import { Lifetime } from '../enums';\nimport type { ServiceImplementation, SourceType } from '../types';\n\nexport class ResolutionContext {\n constructor(\n private readonly singletons: Map<ServiceImplementation<any>, any>,\n private readonly scoped: Map<ServiceImplementation<any>, any>,\n ) {}\n\n private readonly transient = new Map<ServiceImplementation<any>, any>();\n\n public getFromLifetime<T extends SourceType>(implementation: ServiceImplementation<T>, lifetime: Lifetime): T {\n const map = this.getMapForLifetime(lifetime);\n return map?.get(implementation);\n }\n\n public setForLifetime<T extends SourceType>(implementation: ServiceImplementation<T>, instance: T, lifetime: Lifetime): void {\n const map = this.getMapForLifetime(lifetime);\n map?.set(implementation, instance);\n }\n\n private getMapForLifetime(lifetime: Lifetime) {\n const map: Partial<Record<Lifetime, Map<ServiceImplementation<any>, any>>> = {\n [Lifetime.Singleton]: this.singletons,\n [Lifetime.Scoped]: this.scoped,\n [Lifetime.Resolve]: this.transient,\n };\n return map[lifetime];\n }\n}\n","export const DesignDependenciesKey = 'design:dependencies';\n","import '@abraham/reflection';\nimport type { MetadataType, SourceType } from '../types';\n\nexport const getMetadata = <T extends SourceType>(key: string, obj: object): MetadataType<T> | undefined => Reflect.getMetadata(key, obj);\nexport const defineMetadata = <T extends SourceType>(key: string, metadata: MetadataType<T>, obj: object) => Reflect.defineMetadata(key, metadata, obj);\n","import { Lifetime } from '../enums';\nimport { ResolveMultipleMode } from '../enums';\nimport { MultipleRegistrationError, SelfDependencyError, ServiceCreationError, UnregisteredServiceError } from '../errors';\nimport { type IDisposable, IResolutionScope, IScopedProvider, type IServiceCollection } from '../interfaces';\nimport { IServiceProvider } from '../interfaces';\nimport type { ILogger } from '../logger';\nimport type { ServiceDescriptor, ServiceIdentifier, ServiceImplementation, SourceType } from '../types';\nimport { ResolutionContext } from './ResolutionContext';\nimport { DesignDependenciesKey } from './constants';\nimport { getMetadata } from './metadata';\n\nexport class ServiceProvider implements IServiceProvider, IScopedProvider {\n private scoped = new Map<ServiceImplementation<any>, any>();\n private created: IDisposable[] = [];\n\n constructor(\n private readonly logger: ILogger,\n public readonly Services: IServiceCollection,\n private readonly singletons = new Map<ServiceImplementation<any>, any>(),\n ) {}\n\n [Symbol.dispose]() {\n for (const x of this.created) {\n x[Symbol.dispose]();\n }\n }\n\n private resolveInternal<T extends SourceType>(descriptor: ServiceDescriptor<T>, context: ResolutionContext): T {\n let instance = context.getFromLifetime(descriptor.implementation, descriptor.lifetime);\n if (instance == null) {\n instance = this.createInstance(descriptor, context);\n }\n return instance;\n }\n\n public resolveAll<T extends SourceType>(identifier: ServiceIdentifier<T>, context?: ResolutionContext): T[] {\n const descriptors = this.Services.get(identifier);\n return descriptors.map((descriptor) => this.resolveInternal<T>(descriptor, context ?? new ResolutionContext(this.singletons, this.scoped)));\n }\n\n public resolve<T extends SourceType>(identifier: ServiceIdentifier<T>, context?: ResolutionContext): T {\n if (identifier.prototype === IResolutionScope.prototype || identifier.prototype === IScopedProvider.prototype || identifier.prototype === IServiceProvider.prototype) {\n return this as IResolutionScope & IScopedProvider & IServiceProvider as T;\n }\n\n const descriptor = this.getSingleDescriptor(identifier);\n return this.resolveInternal(descriptor, context ?? new ResolutionContext(this.singletons, this.scoped));\n }\n\n private getSingleDescriptor<T extends SourceType>(identifier: ServiceIdentifier<T>) {\n const descriptors = this.Services.get(identifier);\n if (descriptors.length === 0) {\n throw new UnregisteredServiceError(identifier);\n }\n\n if (descriptors.length > 1) {\n if (this.Services.options.registrationMode === ResolveMultipleMode.Error) {\n throw new MultipleRegistrationError(identifier);\n }\n }\n const descriptor = descriptors[descriptors.length - 1];\n return descriptor;\n }\n\n private createInstance<T extends SourceType>(descriptor: ServiceDescriptor<T>, context: ResolutionContext): T {\n const instance = this.createInstanceInternal(descriptor, context);\n this.setDependencies(descriptor.implementation, instance, context);\n context.setForLifetime(descriptor.implementation, instance, descriptor.lifetime);\n return instance;\n }\n\n private wrapContext(context: ResolutionContext): IResolutionScope {\n const resolve = (identifier: ServiceIdentifier<any>) => this.resolve(identifier, context);\n const resolveAll = (identifier: ServiceIdentifier<any>) => this.resolveAll(identifier, context);\n\n return {\n resolve,\n resolveAll,\n };\n }\n\n private createInstanceInternal<T extends SourceType>(descriptor: ServiceDescriptor<T>, context: ResolutionContext) {\n let instance: T | undefined;\n try {\n instance = descriptor.createInstance(this.wrapContext(context));\n } catch (err) {\n this.logger.error(err);\n throw new ServiceCreationError(descriptor.implementation, err);\n }\n if (descriptor.lifetime !== Lifetime.Singleton && Symbol.dispose in instance) {\n this.created.push(instance as IDisposable);\n }\n return instance;\n }\n\n public createScope(): IScopedProvider {\n return new ServiceProvider(this.logger, this.Services.clone(true), this.singletons);\n }\n\n private setDependencies<T extends SourceType>(implementation: ServiceImplementation<T>, instance: T, context: ResolutionContext): T {\n const dependencies = getMetadata<T>(DesignDependenciesKey, implementation) ?? {};\n this.logger.debug('Dependencies', implementation.name, dependencies);\n for (const [key, identifier] of Object.entries(dependencies)) {\n if (identifier !== implementation) {\n this.logger.debug('Resolving', identifier.name, 'for', implementation.name);\n const dep = this.resolve(identifier, context);\n (instance as Record<string, T>)[key] = dep;\n } else {\n throw new SelfDependencyError();\n }\n }\n return instance;\n }\n}\n","import type { Lifetime } from '../enums';\nimport type { IServiceBuilder, IServiceCollection, IServiceProvider } from '../interfaces';\nimport type { ILogger } from '../logger';\nimport type { EnsureObject, ServiceCollectionOptions, ServiceDescriptor, ServiceIdentifier, ServiceModuleType, SourceType, UnionToIntersection } from '../types';\nimport { ServiceBuilder } from './ServiceBuilder';\nimport { ServiceProvider } from './ServiceProvider';\n\nexport class ServiceCollection implements IServiceCollection {\n constructor(\n private readonly logger: ILogger,\n public readonly options: ServiceCollectionOptions,\n private readonly isScoped: boolean,\n private readonly services = new Map<ServiceIdentifier<any>, ServiceDescriptor<any>[]>(),\n ) {}\n\n public registerModules(...modules: ServiceModuleType[]): void {\n for (const x of modules) {\n const module = new x();\n module.registerServices(this);\n }\n }\n\n get<T extends SourceType>(key: ServiceIdentifier<T>): ServiceDescriptor<T>[] {\n return this.services.get(key) ?? [];\n }\n\n public overrideLifetime<T extends SourceType>(identifier: ServiceIdentifier<T>, lifetime: Lifetime): void {\n for (const descriptor of this.get(identifier)) {\n descriptor.lifetime = lifetime;\n }\n }\n\n register<Types extends SourceType[]>(...identifiers: { [K in keyof Types]: ServiceIdentifier<Types[K]> }): IServiceBuilder<EnsureObject<UnionToIntersection<Types[number]>>> {\n return new ServiceBuilder(identifiers, this.isScoped, (identifier, descriptor) => this.addService(identifier, descriptor));\n }\n\n private addService<T extends SourceType>(identifier: ServiceIdentifier<T>, descriptor: ServiceDescriptor<T>) {\n this.logger.info('Adding service', { identifier: identifier.name, descriptor });\n let existing = this.services.get(identifier);\n if (existing == null) {\n existing = [];\n this.services.set(identifier, existing);\n }\n existing.push(descriptor);\n }\n\n public clone(scoped?: unknown): IServiceCollection {\n const clonedMap = new Map<ServiceIdentifier<any>, ServiceDescriptor<any>[]>();\n for (const [key, descriptors] of this.services) {\n const clonedDescriptors = descriptors.map((descriptor) => ({ ...descriptor }));\n clonedMap.set(key, clonedDescriptors);\n }\n\n return new ServiceCollection(this.logger, this.options, scoped === true, clonedMap);\n }\n\n public buildProvider(): IServiceProvider {\n return new ServiceProvider(this.logger, this.clone());\n }\n}\n","export abstract class ILogger {\n public debug(_message?: any, ..._optionalParams: any[]) {}\n public info(_message?: any, ..._optionalParams: any[]) {}\n public error(_message?: any, ..._optionalParams: any[]) {}\n public warn(_message?: any, ..._optionalParams: any[]) {}\n}\n","import { LogLevel } from '../enums';\nimport { ILogger } from '../logger';\nimport type { ServiceCollectionOptions } from '../types';\n\nexport class ConsoleLogger extends ILogger {\n constructor(private readonly options: ServiceCollectionOptions) {\n super();\n }\n\n public override debug(message?: any, ...optionalParams: any[]): void {\n if (this.options.logLevel <= LogLevel.Debug) {\n console.debug(message, ...optionalParams);\n }\n }\n\n public override info(message?: any, ...optionalParams: any[]): void {\n if (this.options.logLevel <= LogLevel.Info) {\n console.info(message, ...optionalParams);\n }\n }\n\n public override warn(message?: any, ...optionalParams: any[]): void {\n if (this.options.logLevel <= LogLevel.Warn) {\n console.warn(message, ...optionalParams);\n }\n }\n\n public override error(message?: any, ...optionalParams: any[]): void {\n if (this.options.logLevel <= LogLevel.Error) {\n console.error(message, ...optionalParams);\n }\n }\n}\n","import { DefaultServiceCollectionOptions } from './defaults';\nimport type { IServiceCollection } from './interfaces';\nimport { ServiceCollection } from './private/ServiceCollection';\nimport { ConsoleLogger } from './private/consoleLogger';\nimport type { ServiceCollectionOptions } from './types';\n\nconst mergeOptions = (options: Partial<ServiceCollectionOptions> | undefined): ServiceCollectionOptions => ({\n ...DefaultServiceCollectionOptions,\n ...options,\n});\n\n/**\n * Creates a service collection with the (optionally) provided options\n * @param options - Optional configuration for the service collection.\n * @defaultValue Default options are taken from {@link DefaultServiceCollectionOptions}.\n */\nexport const createServiceCollection = (options?: Partial<ServiceCollectionOptions>): IServiceCollection => {\n const mergedOptions = mergeOptions(options);\n const logger = mergedOptions.logger ?? new ConsoleLogger(mergedOptions);\n return new ServiceCollection(logger, mergedOptions, false);\n};\n","import { IResolutionScope, IScopedProvider, IServiceProvider } from './interfaces';\nimport { DesignDependenciesKey } from './private/constants';\nimport { defineMetadata, getMetadata } from './private/metadata';\nimport type { ServiceIdentifier, SourceType } from './types';\n\nconst tagProperty = <T extends SourceType>(metadataKey: string, annotationTarget: object, name: string | symbol, identifier: ServiceIdentifier<T>) => {\n let existing = getMetadata<T>(metadataKey, annotationTarget);\n if (existing === undefined) {\n existing = {};\n defineMetadata(metadataKey, existing, annotationTarget);\n }\n existing[name] = identifier;\n};\n\n/**\n * declares a dependency, use on a class field.\n * Can also depend on {@link IServiceProvider}, {@link IResolutionScope}, or {@link IScopedProvider}.\n * @param identifier the identifier to depend on, i.e. the interface\n */\nexport const dependsOn = <T extends SourceType>(identifier: ServiceIdentifier<T>) => {\n return (value: undefined, ctx: ClassFieldDecoratorContext) => {\n return function (this: object, initialValue: any) {\n const target = this.constructor;\n tagProperty(DesignDependenciesKey, target, ctx.name, identifier);\n return initialValue;\n };\n };\n};\n"]}
package/package.json CHANGED
@@ -1,12 +1,15 @@
1
1
  {
2
2
  "name": "@shellicar/core-di",
3
- "version": "2.0.1",
3
+ "version": "2.1.0",
4
4
  "description": "A basic dependency injection library",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "git+https://github.com/shellicar/core-di.git"
8
8
  },
9
9
  "private": false,
10
+ "publishConfig": {
11
+ "access": "public"
12
+ },
10
13
  "main": "./dist/index.js",
11
14
  "module": "./dist/index.mjs",
12
15
  "types": "./dist/index.d.ts",
@@ -38,33 +41,18 @@
38
41
  },
39
42
  "homepage": "https://github.com/shellicar/core-di#readme",
40
43
  "devDependencies": {
41
- "@biomejs/biome": "^1.9.4",
44
+ "@abraham/reflection": "^0.12.0",
42
45
  "@tsconfig/node20": "^20.1.4",
43
46
  "@types/node": "^22.10.5",
44
- "lefthook": "^1.10.1",
45
- "npm-check-updates": "^17.1.13",
46
- "npm-run-all2": "^7.0.2",
47
- "rimraf": "^6.0.1",
48
47
  "terser": "^5.37.0",
49
48
  "tsup": "^8.3.5",
50
- "tsx": "^4.19.2",
51
49
  "typescript": "^5.7.2",
52
50
  "vitest": "^2.1.8"
53
51
  },
54
- "dependencies": {
55
- "@abraham/reflection": "^0.12.0"
56
- },
57
52
  "scripts": {
58
53
  "build": "tsup-node",
59
54
  "dev": "tsup-node --watch",
60
55
  "test": "vitest run",
61
- "lint": "biome lint",
62
- "format": "biome format",
63
- "check": "biome check",
64
- "type-check": "tsc -p tsconfig.check.json",
65
- "ci": "biome ci",
66
- "ci:fix": "biome check --fix --diagnostic-level=error",
67
- "updates": "npm-check-updates",
68
- "postinstall": "lefthook install"
56
+ "type-check": "tsc -p tsconfig.check.json"
69
57
  }
70
58
  }