@shellicar/core-di 0.1.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -15,20 +15,25 @@ With TypeScript 5.0 generally available with non-experimental decorators, most D
15
15
  My set of features is simple, based on my current usage
16
16
 
17
17
  * Type-safe registration.
18
+
18
19
  ```ts
19
20
  const services = createServiceCollection();
20
21
  abstract class IAbstract { abstract method(): void; }
21
22
  abstract class Concrete {}
22
23
  services.register(IAbstract).to(Concrete);
23
- // ^ Error
24
+ // ^ Error
24
25
  ```
26
+
25
27
  * Type-safe resolution.
28
+
26
29
  ```ts
27
30
  const provider = services.buildProvider();
28
31
  const svc = provider.resolve(IMyService);
29
32
  // ^ IMyService
30
33
  ```
34
+
31
35
  * Provide factory methods for instantiating classes.
36
+
32
37
  ```ts
33
38
  services.register(Redis).to(Redis, x => {
34
39
  const options = x.resolve(IRedisOptions);
@@ -38,13 +43,16 @@ services.register(Redis).to(Redis, x => {
38
43
  });
39
44
  });
40
45
  ```
46
+
41
47
  * Use property injection with decorators for simple dependency definition.
48
+
42
49
  ```ts
43
50
  abstract class IDependency {}
44
51
  class Service implements IService {
45
52
  @dependsOn(IDependency) private readonly dependency!: IDependency;
46
53
  }
47
54
  ```
55
+
48
56
  * Provide multiple implementations for identifiers and provide a `resolveAll` method.
49
57
  * Define instance lifetime with simple builder pattern.
50
58
 
@@ -53,6 +61,7 @@ services.register(IAbstract).to(Concrete).singleton();
53
61
  ```
54
62
 
55
63
  * Create scopes to allow "per-request" lifetimes.
64
+
56
65
  ```ts
57
66
  const services = createServiceCollection();
58
67
  const provider = services.buildProvider();
@@ -60,11 +69,22 @@ using scope = provider.createScope();
60
69
  ```
61
70
 
62
71
  * Register classes during a scope
72
+
63
73
  ```ts
64
74
  using scope = provider.createScope();
65
75
  scope.Services.register(IContext).to(Context);
66
76
  ```
77
+
78
+ * Multiple registrations
79
+
80
+ ```ts
81
+ services.register(IAbstract1, IAbstract2).to(Concrete).singleton();
82
+ const provider = services.buildProvider();
83
+ provider.resolve(IAbstract1) === provider.resolve(IAbstract2);
84
+ ```
85
+
67
86
  * Override registrations (e.g.: for testing)
87
+
68
88
  ```ts
69
89
  import { ok } from 'node:assert/strict';
70
90
  const services = createServiceCollection({ registrationMode: ResolveMultipleMode.LastRegistered });
@@ -75,10 +95,20 @@ const provider = services.buildProvider();
75
95
  const options = provider.resolve(IOptions);
76
96
  ok(options instanceof MockOptions);
77
97
  ```
78
- * Logging options
98
+
99
+ * Override lifetimes (e.g.: for testing)
100
+
79
101
  ```ts
80
- import { createServiceCollection, ILogger, LogLevel } from '@shellicar/core-di';
102
+ const services = createServiceCollection({ logLevel: LogLevel.Debug });
103
+ services.register(IAbstract).to(Concrete).singleton();
104
+ const provider = services.buildProvider();
105
+ sp.Services.overrideLifetime(IAbstract, Lifetime.Transient);
106
+ sp.resolve(IAbstract) !== sp.resolve(IAbstract);
107
+ ```
108
+
109
+ * Logging options
81
110
 
111
+ ```ts
82
112
  class CustomLogger extends ILogger {
83
113
  public override debug(message?: any, ...optionalParams: any[]): void {
84
114
  // custom implementation
@@ -89,7 +119,9 @@ const services1 = createServiceCollection({ logger: new CustomLogger() });
89
119
  // Override default log level
90
120
  const services2 = createServiceCollection({ logLevel: LogLevel.Debug });
91
121
  ```
122
+
92
123
  * Service modules
124
+
93
125
  ```ts
94
126
  class IAbstract {}
95
127
  class Concrete extends IAbstract {}
@@ -101,7 +133,7 @@ class MyModule implements IServiceModule {
101
133
  }
102
134
 
103
135
  const services = createServiceCollection();
104
- services.registerModules([MyModule]);
136
+ services.registerModules(MyModule);
105
137
  const provider = services.buildProvider();
106
138
  const svc = provider.resolve(IAbstract);
107
139
  ```
@@ -0,0 +1,158 @@
1
+ declare enum Lifetime {
2
+ Resolve = "RESOLVE",
3
+ Transient = "TRANSIENT",
4
+ Scoped = "SCOPED",
5
+ Singleton = "SINGLETON"
6
+ }
7
+ declare enum LogLevel {
8
+ Debug = 0,
9
+ Info = 1,
10
+ Warn = 2,
11
+ Error = 3,
12
+ None = 4
13
+ }
14
+ declare enum ResolveMultipleMode {
15
+ Error = "ERROR",
16
+ LastRegistered = "LAST_REGISTERED"
17
+ }
18
+
19
+ declare abstract class ILogger {
20
+ debug(_message?: any, ..._optionalParams: any[]): void;
21
+ info(_message?: any, ..._optionalParams: any[]): void;
22
+ error(_message?: any, ..._optionalParams: any[]): void;
23
+ warn(_message?: any, ..._optionalParams: any[]): void;
24
+ }
25
+
26
+ type SourceType = object;
27
+ type AbstractNewable<T> = abstract new (...args: any[]) => T;
28
+ type Newable<T> = new (...args: any[]) => T;
29
+ type ServiceIdentifier<T extends SourceType> = {
30
+ prototype: T;
31
+ name: string;
32
+ };
33
+ type ServiceImplementation<T extends SourceType> = Newable<T>;
34
+ type InstanceFactory<T extends SourceType> = (x: IResolutionScope) => T;
35
+ type ServiceModuleType = Newable<IServiceModule>;
36
+ interface ServiceDescriptor<T extends SourceType> {
37
+ readonly implementation: ServiceImplementation<T>;
38
+ lifetime: Lifetime;
39
+ createInstance(context: IResolutionScope): T;
40
+ }
41
+ type MetadataType<T extends SourceType> = Record<string | symbol, ServiceIdentifier<T>>;
42
+ type ServiceCollectionOptions = {
43
+ /**
44
+ * Whether calling `resolve` when there are multiple registrations
45
+ * will result in an error or resolve the last registered service.
46
+ * @default ResolveMultipleMode.Error
47
+ */
48
+ registrationMode: ResolveMultipleMode;
49
+ /**
50
+ * The default log level for the console logger.
51
+ * @defaultValue {@link LogLevel.Warn}
52
+ */
53
+ logLevel: LogLevel;
54
+ /**
55
+ * Custom implementation for logger. Ignores log level.
56
+ * @defaultValue {@link ConsoleLogger}
57
+ */
58
+ logger?: ILogger;
59
+ };
60
+ type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
61
+ type EnsureObject<T> = T extends object ? T : never;
62
+ interface ILifetimeBuilder {
63
+ singleton(): ILifetimeBuilder;
64
+ scoped(): ILifetimeBuilder;
65
+ transient(): ILifetimeBuilder;
66
+ }
67
+ interface IServiceBuilder<T extends SourceType> {
68
+ to: {
69
+ (implementation: ServiceImplementation<T>): ILifetimeBuilder;
70
+ (implementation: ServiceImplementation<T>, factory: InstanceFactory<T>): ILifetimeBuilder;
71
+ };
72
+ }
73
+
74
+ interface IDisposable {
75
+ [Symbol.dispose](): void;
76
+ }
77
+ interface IServiceModule {
78
+ registerServices(services: IServiceCollection): void;
79
+ }
80
+ declare abstract class IResolutionScope {
81
+ /**
82
+ * Resolves a single implementation for the given identifier.
83
+ * @template T The type of service to resolve
84
+ * @param identifier The service identifier
85
+ * @returns The resolved instance
86
+ * @throws {MultipleRegistrationError} When multiple implementations exist (unless {@link ServiceCollectionOptions.registrationMode} is set to {@link ResolveMultipleMode.LastRegistered}).
87
+ * @throws {UnregisteredServiceError} When no implementation exists
88
+ */
89
+ abstract resolve<T extends SourceType>(identifier: ServiceIdentifier<T>): T;
90
+ /**
91
+ * Resolves all implementations for the given identifier.
92
+ * @template T The type of service to resolve
93
+ * @param identifier The service identifier
94
+ * @returns Array of resolved instances
95
+ */
96
+ abstract resolveAll<T extends SourceType>(identifier: ServiceIdentifier<T>): T[];
97
+ }
98
+ declare abstract class IScopedProvider extends IResolutionScope implements IDisposable {
99
+ abstract [Symbol.dispose](): void;
100
+ }
101
+ declare abstract class IServiceProvider extends IResolutionScope {
102
+ abstract readonly Services: IServiceCollection;
103
+ abstract createScope(): IScopedProvider;
104
+ }
105
+ interface IServiceCollection {
106
+ readonly options: ServiceCollectionOptions;
107
+ get<T extends SourceType>(identifier: ServiceIdentifier<T>): ServiceDescriptor<T>[];
108
+ register<Types extends SourceType[]>(...identifiers: {
109
+ [K in keyof Types]: ServiceIdentifier<Types[K]>;
110
+ }): IServiceBuilder<EnsureObject<UnionToIntersection<Types[number]>>>;
111
+ registerModules(...modules: ServiceModuleType[]): void;
112
+ overrideLifetime<T extends SourceType>(identifier: ServiceIdentifier<T>, lifetime: Lifetime): void;
113
+ buildProvider(): IServiceProvider;
114
+ clone(): IServiceCollection;
115
+ clone(scoped: true): IServiceCollection;
116
+ }
117
+
118
+ /**
119
+ * Creates a service collection with the (optionally) provided options
120
+ * @param options - Optional configuration for the service collection.
121
+ * @defaultValue Default options are taken from {@link DefaultServiceCollectionOptions}.
122
+ */
123
+ declare const createServiceCollection: (options?: Partial<ServiceCollectionOptions>) => IServiceCollection;
124
+
125
+ /**
126
+ * declares a dependency, use on a class field.
127
+ * Can also depend on {@link IServiceProvider}, {@link IResolutionScope}, or {@link IScopedProvider}.
128
+ * @param identifier the identifier to depend on, i.e. the interface
129
+ */
130
+ declare const dependsOn: <T extends SourceType>(identifier: ServiceIdentifier<T>) => (value: undefined, ctx: ClassFieldDecoratorContext) => (this: object, initialValue: any) => any;
131
+
132
+ declare const DefaultServiceCollectionOptions: ServiceCollectionOptions;
133
+
134
+ declare abstract class ServiceError extends Error {
135
+ }
136
+ declare class UnregisteredServiceError<T extends object> extends ServiceError {
137
+ name: string;
138
+ constructor(identifier: ServiceIdentifier<T>);
139
+ }
140
+ declare class MultipleRegistrationError<T extends object> extends ServiceError {
141
+ name: string;
142
+ constructor(identifier: ServiceIdentifier<T>);
143
+ }
144
+ declare class ServiceCreationError<T extends object> extends ServiceError {
145
+ readonly innerError: any;
146
+ name: string;
147
+ constructor(identifier: ServiceIdentifier<T>, innerError: any);
148
+ }
149
+ declare class SelfDependencyError extends ServiceError {
150
+ name: string;
151
+ constructor();
152
+ }
153
+ declare class ScopedSingletonRegistrationError extends ServiceError {
154
+ name: string;
155
+ constructor();
156
+ }
157
+
158
+ export { type AbstractNewable, DefaultServiceCollectionOptions, type IDisposable, type ILifetimeBuilder, ILogger, IResolutionScope, IScopedProvider, type IServiceBuilder, type IServiceCollection, type IServiceModule, IServiceProvider, type InstanceFactory, Lifetime, LogLevel, type MetadataType, MultipleRegistrationError, type Newable, ResolveMultipleMode, ScopedSingletonRegistrationError, SelfDependencyError, type ServiceCollectionOptions, ServiceCreationError, type ServiceDescriptor, ServiceError, type ServiceIdentifier, type ServiceImplementation, type ServiceModuleType, type SourceType, UnregisteredServiceError, createServiceCollection, dependsOn };
package/dist/index.d.ts CHANGED
@@ -4,12 +4,23 @@ declare enum Lifetime {
4
4
  Scoped = "SCOPED",
5
5
  Singleton = "SINGLETON"
6
6
  }
7
+ declare enum LogLevel {
8
+ Debug = 0,
9
+ Info = 1,
10
+ Warn = 2,
11
+ Error = 3,
12
+ None = 4
13
+ }
14
+ declare enum ResolveMultipleMode {
15
+ Error = "ERROR",
16
+ LastRegistered = "LAST_REGISTERED"
17
+ }
7
18
 
8
19
  declare abstract class ILogger {
9
- debug(message?: any, ...optionalParams: any[]): void;
10
- info(message?: any, ...optionalParams: any[]): void;
11
- error(message?: any, ...optionalParams: any[]): void;
12
- warn(message?: any, ...optionalParams: any[]): void;
20
+ debug(_message?: any, ..._optionalParams: any[]): void;
21
+ info(_message?: any, ..._optionalParams: any[]): void;
22
+ error(_message?: any, ..._optionalParams: any[]): void;
23
+ warn(_message?: any, ..._optionalParams: any[]): void;
13
24
  }
14
25
 
15
26
  type SourceType = object;
@@ -20,43 +31,14 @@ type ServiceIdentifier<T extends SourceType> = {
20
31
  name: string;
21
32
  };
22
33
  type ServiceImplementation<T extends SourceType> = Newable<T>;
23
- type InstanceFactory<T extends SourceType> = (x: IServiceScope & IServiceProvider) => T;
34
+ type InstanceFactory<T extends SourceType> = (x: IResolutionScope) => T;
24
35
  type ServiceModuleType = Newable<IServiceModule>;
25
- type ServiceDescriptorFactory<T extends SourceType> = {
26
- implementation: ServiceIdentifier<T>;
27
- factory: InstanceFactory<T>;
28
- lifetime: Lifetime;
29
- };
30
- type ServiceDescriptorConcrete<T extends SourceType> = {
31
- implementation: ServiceImplementation<T>;
36
+ interface ServiceDescriptor<T extends SourceType> {
37
+ readonly implementation: ServiceImplementation<T>;
32
38
  lifetime: Lifetime;
33
- };
34
- type ServiceDescriptor<T extends SourceType> = ServiceDescriptorConcrete<T> | ServiceDescriptorFactory<T>;
35
- type LifetimeBuilder = {
36
- singleton: () => LifetimeBuilder;
37
- scoped: () => LifetimeBuilder;
38
- transient: () => LifetimeBuilder;
39
- };
40
- type ServiceBuilder<T extends SourceType> = {
41
- to: {
42
- (implementation: ServiceImplementation<T>): LifetimeBuilder;
43
- (implementation: ServiceIdentifier<T>, factory: InstanceFactory<T>): LifetimeBuilder;
44
- };
45
- };
46
- type MetadataType<T extends SourceType> = Record<string | symbol, ServiceIdentifier<T>>;
47
- declare const ResolveMultipleMode: {
48
- readonly Error: "ERROR";
49
- readonly LastRegistered: "LAST_REGISTERED";
50
- };
51
- type ResolveMultipleMode = (typeof ResolveMultipleMode)[keyof typeof ResolveMultipleMode];
52
- declare const enum LogLevel {
53
- Debug = 0,
54
- Info = 1,
55
- Warn = 2,
56
- Error = 3,
57
- None = 4
39
+ createInstance(context: IResolutionScope): T;
58
40
  }
59
- declare const DefaultServiceCollectionOptions: ServiceCollectionOptions;
41
+ type MetadataType<T extends SourceType> = Record<string | symbol, ServiceIdentifier<T>>;
60
42
  type ServiceCollectionOptions = {
61
43
  /**
62
44
  * Whether calling `resolve` when there are multiple registrations
@@ -75,36 +57,62 @@ type ServiceCollectionOptions = {
75
57
  */
76
58
  logger?: ILogger;
77
59
  };
60
+ type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
61
+ type EnsureObject<T> = T extends object ? T : never;
62
+ interface ILifetimeBuilder {
63
+ singleton(): ILifetimeBuilder;
64
+ scoped(): ILifetimeBuilder;
65
+ transient(): ILifetimeBuilder;
66
+ }
67
+ interface IServiceBuilder<T extends SourceType> {
68
+ to: {
69
+ (implementation: ServiceImplementation<T>): ILifetimeBuilder;
70
+ (implementation: ServiceImplementation<T>, factory: InstanceFactory<T>): ILifetimeBuilder;
71
+ };
72
+ }
78
73
 
79
- declare abstract class IDisposable {
80
- abstract [Symbol.dispose]: () => void;
74
+ interface IDisposable {
75
+ [Symbol.dispose](): void;
81
76
  }
82
- declare abstract class IServiceModule {
83
- abstract registerServices(services: IServiceCollection): void;
77
+ interface IServiceModule {
78
+ registerServices(services: IServiceCollection): void;
84
79
  }
85
- declare abstract class IServiceScope {
80
+ declare abstract class IResolutionScope {
86
81
  /**
87
- * Resolves a single implementation for the identifier.
88
- * When finding multiple implementations, it will either
89
- * throw a {@link MultipleRegistrationError} or resolve the latest depending on the provided options.
82
+ * Resolves a single implementation for the given identifier.
83
+ * @template T The type of service to resolve
84
+ * @param identifier The service identifier
85
+ * @returns The resolved instance
86
+ * @throws {MultipleRegistrationError} When multiple implementations exist (unless {@link ServiceCollectionOptions.registrationMode} is set to {@link ResolveMultipleMode.LastRegistered}).
87
+ * @throws {UnregisteredServiceError} When no implementation exists
90
88
  */
91
89
  abstract resolve<T extends SourceType>(identifier: ServiceIdentifier<T>): T;
92
90
  /**
93
- * Resolves all implementations for the identifier.
91
+ * Resolves all implementations for the given identifier.
92
+ * @template T The type of service to resolve
93
+ * @param identifier The service identifier
94
+ * @returns Array of resolved instances
94
95
  */
95
96
  abstract resolveAll<T extends SourceType>(identifier: ServiceIdentifier<T>): T[];
96
97
  }
97
- declare abstract class IServiceProvider extends IServiceScope {
98
- abstract get Services(): IServiceCollection;
99
- abstract createScope(): IServiceProvider & IDisposable;
98
+ declare abstract class IScopedProvider extends IResolutionScope implements IDisposable {
99
+ abstract [Symbol.dispose](): void;
100
100
  }
101
- declare abstract class IServiceCollection {
102
- abstract readonly options: ServiceCollectionOptions;
103
- abstract get<T extends SourceType>(key: ServiceIdentifier<T>): ServiceDescriptor<T>[];
104
- abstract register<T extends SourceType>(identifier: ServiceIdentifier<T>): ServiceBuilder<T>;
105
- abstract registerModules(modules: ServiceModuleType[]): void;
106
- abstract buildProvider(): IServiceProvider;
107
- abstract clone(): IServiceCollection;
101
+ declare abstract class IServiceProvider extends IResolutionScope {
102
+ abstract readonly Services: IServiceCollection;
103
+ abstract createScope(): IScopedProvider;
104
+ }
105
+ interface IServiceCollection {
106
+ readonly options: ServiceCollectionOptions;
107
+ get<T extends SourceType>(identifier: ServiceIdentifier<T>): ServiceDescriptor<T>[];
108
+ register<Types extends SourceType[]>(...identifiers: {
109
+ [K in keyof Types]: ServiceIdentifier<Types[K]>;
110
+ }): IServiceBuilder<EnsureObject<UnionToIntersection<Types[number]>>>;
111
+ registerModules(...modules: ServiceModuleType[]): void;
112
+ overrideLifetime<T extends SourceType>(identifier: ServiceIdentifier<T>, lifetime: Lifetime): void;
113
+ buildProvider(): IServiceProvider;
114
+ clone(): IServiceCollection;
115
+ clone(scoped: true): IServiceCollection;
108
116
  }
109
117
 
110
118
  /**
@@ -115,13 +123,15 @@ declare abstract class IServiceCollection {
115
123
  declare const createServiceCollection: (options?: Partial<ServiceCollectionOptions>) => IServiceCollection;
116
124
 
117
125
  /**
118
- * declares a dependency, use on a class field
126
+ * declares a dependency, use on a class field.
127
+ * Can also depend on {@link IServiceProvider}, {@link IResolutionScope}, or {@link IScopedProvider}.
119
128
  * @param identifier the identifier to depend on, i.e. the interface
120
129
  */
121
130
  declare const dependsOn: <T extends SourceType>(identifier: ServiceIdentifier<T>) => (value: undefined, ctx: ClassFieldDecoratorContext) => (this: object, initialValue: any) => any;
122
131
 
132
+ declare const DefaultServiceCollectionOptions: ServiceCollectionOptions;
133
+
123
134
  declare abstract class ServiceError extends Error {
124
- constructor(message: string);
125
135
  }
126
136
  declare class UnregisteredServiceError<T extends object> extends ServiceError {
127
137
  name: string;
@@ -140,38 +150,9 @@ declare class SelfDependencyError extends ServiceError {
140
150
  name: string;
141
151
  constructor();
142
152
  }
143
-
144
- declare class ServiceCollection implements IServiceCollection {
145
- private readonly logger;
146
- readonly options: ServiceCollectionOptions;
147
- private readonly services;
148
- constructor(logger: ILogger, options: ServiceCollectionOptions, services?: Map<ServiceIdentifier<any>, ServiceDescriptor<any>[]>);
149
- registerModules(modules: Newable<IServiceModule>[]): void;
150
- get<T extends SourceType>(key: ServiceIdentifier<T>): ServiceDescriptor<T>[];
151
- register<T extends SourceType>(identifier: ServiceIdentifier<T>): ServiceBuilder<T>;
152
- private addService;
153
- clone(): IServiceCollection;
154
- buildProvider(): IServiceProvider;
155
- }
156
-
157
- type Id<T extends SourceType> = ServiceIdentifier<T> | ServiceImplementation<T>;
158
- type ResolveMap<T extends SourceType> = Map<ServiceIdentifier<T>, Map<Id<T>, T>>;
159
- declare class ServiceProvider implements IServiceProvider, IServiceScope {
160
- private readonly logger;
161
- private readonly services;
162
- private readonly singletons;
163
- private scoped;
164
- private created;
165
- constructor(logger: ILogger, services: IServiceCollection, singletons?: ResolveMap<object>);
166
- get Services(): IServiceCollection;
167
- [Symbol.dispose](): void;
168
- private resolveFrom;
169
- private resolveInternal;
170
- resolveAll<T extends SourceType>(identifier: ServiceIdentifier<T>, currentResolve?: ResolveMap<T>): T[];
171
- resolve<T extends SourceType>(identifier: ServiceIdentifier<T>, currentResolve?: ResolveMap<T>): T;
172
- private createInstance;
173
- createScope(): IServiceProvider & IDisposable;
174
- private setDependencies;
153
+ declare class ScopedSingletonRegistrationError extends ServiceError {
154
+ name: string;
155
+ constructor();
175
156
  }
176
157
 
177
- export { type AbstractNewable, DefaultServiceCollectionOptions, IDisposable, ILogger, IServiceCollection, IServiceModule, IServiceProvider, IServiceScope, type InstanceFactory, type LifetimeBuilder, LogLevel, type MetadataType, MultipleRegistrationError, type Newable, ResolveMultipleMode, SelfDependencyError, type ServiceBuilder, ServiceCollection, type ServiceCollectionOptions, ServiceCreationError, type ServiceDescriptor, type ServiceDescriptorConcrete, type ServiceDescriptorFactory, ServiceError, type ServiceIdentifier, type ServiceImplementation, type ServiceModuleType, ServiceProvider, type SourceType, UnregisteredServiceError, createServiceCollection, dependsOn };
158
+ export { type AbstractNewable, DefaultServiceCollectionOptions, type IDisposable, type ILifetimeBuilder, ILogger, IResolutionScope, IScopedProvider, type IServiceBuilder, type IServiceCollection, type IServiceModule, IServiceProvider, type InstanceFactory, Lifetime, LogLevel, type MetadataType, MultipleRegistrationError, type Newable, ResolveMultipleMode, ScopedSingletonRegistrationError, SelfDependencyError, type ServiceCollectionOptions, ServiceCreationError, type ServiceDescriptor, ServiceError, type ServiceIdentifier, type ServiceImplementation, type ServiceModuleType, type SourceType, UnregisteredServiceError, createServiceCollection, dependsOn };
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ "use strict";require("@abraham/reflection");var e=Object.defineProperty,t=(t,r)=>e(t,"name",{value:r,configurable:!0}),r=(e=>(e.Resolve="RESOLVE",e.Transient="TRANSIENT",e.Scoped="SCOPED",e.Singleton="SINGLETON",e))(r||{}),s=(e=>(e[e.Debug=0]="Debug",e[e.Info=1]="Info",e[e.Warn=2]="Warn",e[e.Error=3]="Error",e[e.None=4]="None",e))(s||{}),i=(e=>(e.Error="ERROR",e.LastRegistered="LAST_REGISTERED",e))(i||{}),o={registrationMode:"ERROR",logLevel:2},n=class extends Error{static{t(this,"ServiceError")}},c=class extends n{static{t(this,"UnregisteredServiceError")}name="UnregisteredServiceError";constructor(e){super(`Resolving service that has not been registered: ${e.name}`),Object.setPrototypeOf(this,new.target.prototype)}},l=class extends n{static{t(this,"MultipleRegistrationError")}name="MultipleRegistrationError";constructor(e){super(`Multiple services have been registered: ${e.name}`),Object.setPrototypeOf(this,new.target.prototype)}},a=class extends n{constructor(e,t){super(`Error creating service: ${e.name}`),this.innerError=t,Object.setPrototypeOf(this,new.target.prototype)}static{t(this,"ServiceCreationError")}name="ServiceCreationError"},p=class extends n{static{t(this,"SelfDependencyError")}name="SelfDependencyError";constructor(){super("Service depending on itself"),Object.setPrototypeOf(this,new.target.prototype)}},h=class extends n{static{t(this,"ScopedSingletonRegistrationError")}name="ScopedSingletonRegistrationError";constructor(){super("Cannot register a singleton in a scoped service collection"),Object.setPrototypeOf(this,new.target.prototype)}},g=class{constructor(e,t,r){this.identifiers=e,this.isScoped=t,this.addService=r}static{t(this,"ServiceBuilder")}descriptor;to(e,t){this.descriptor=this.createDescriptor(t,e);for(const e of this.identifiers)this.addService(e,this.descriptor);return this}createDescriptor(e,t){const r=e??(()=>new t);return{implementation:t,createInstance:r,lifetime:"RESOLVE"}}singleton(){if(this.isScoped)throw new h;return this.ensureDescriptor().lifetime="SINGLETON",this}scoped(){return this.ensureDescriptor().lifetime="SCOPED",this}transient(){return this.ensureDescriptor().lifetime="TRANSIENT",this}ensureDescriptor(){if(!this.descriptor)throw new Error("Must call to() before setting lifetime");return this.descriptor}},d=class{static{t(this,"IResolutionScope")}},u=class extends d{static{t(this,"IScopedProvider")}},v=class extends d{static{t(this,"IServiceProvider")}},S=class{constructor(e,t){this.singletons=e,this.scoped=t}static{t(this,"ResolutionContext")}transient=new Map;getFromLifetime(e,t){const r=this.getMapForLifetime(t);return r?.get(e)}setForLifetime(e,t,r){const s=this.getMapForLifetime(r);s?.set(e,t)}getMapForLifetime(e){return{SINGLETON:this.singletons,SCOPED:this.scoped,RESOLVE:this.transient}[e]}},f="design:dependencies",m=t(((e,t)=>Reflect.getMetadata(e,t)),"getMetadata"),E=t(((e,t,r)=>Reflect.defineMetadata(e,t,r)),"defineMetadata"),w=class e{constructor(e,t,r=new Map){this.logger=e,this.Services=t,this.singletons=r}static{t(this,"ServiceProvider")}scoped=new Map;created=[];[Symbol.dispose](){for(const e of this.created)e[Symbol.dispose]()}resolveInternal(e,t){let r=t.getFromLifetime(e.implementation,e.lifetime);return null==r&&(r=this.createInstance(e,t)),r}resolveAll(e,t){return this.Services.get(e).map((e=>this.resolveInternal(e,t??new S(this.singletons,this.scoped))))}resolve(e,t){if(e.prototype===d.prototype||e.prototype===u.prototype||e.prototype===v.prototype)return this;const r=this.getSingleDescriptor(e);return this.resolveInternal(r,t??new S(this.singletons,this.scoped))}getSingleDescriptor(e){const t=this.Services.get(e);if(0===t.length)throw new c(e);if(t.length>1&&"ERROR"===this.Services.options.registrationMode)throw new l(e);return t[t.length-1]}createInstance(e,t){const r=this.createInstanceInternal(e,t);return this.setDependencies(e.implementation,r,t),t.setForLifetime(e.implementation,r,e.lifetime),r}wrapContext(e){return{resolve:t((t=>this.resolve(t,e)),"resolve"),resolveAll:t((t=>this.resolveAll(t,e)),"resolveAll")}}createInstanceInternal(e,t){let r;try{r=e.createInstance(this.wrapContext(t))}catch(t){throw this.logger.error(t),new a(e.implementation,t)}return"SINGLETON"!==e.lifetime&&Symbol.dispose in r&&this.created.push(r),r}createScope(){return new e(this.logger,this.Services.clone(!0),this.singletons)}setDependencies(e,t,r){const s=m(f,e)??{};this.logger.debug("Dependencies",e.name,s);for(const[i,o]of Object.entries(s)){if(o===e)throw new p;{this.logger.debug("Resolving",o.name,"for",e.name);const s=this.resolve(o,r);t[i]=s}}return t}},R=class e{constructor(e,t,r,s=new Map){this.logger=e,this.options=t,this.isScoped=r,this.services=s}static{t(this,"ServiceCollection")}registerModules(...e){for(const t of e){(new t).registerServices(this)}}get(e){return this.services.get(e)??[]}overrideLifetime(e,t){for(const r of this.get(e))r.lifetime=t}register(...e){return new g(e,this.isScoped,((e,t)=>this.addService(e,t)))}addService(e,t){this.logger.info("Adding service",{identifier:e.name,descriptor:t});let r=this.services.get(e);null==r&&(r=[],this.services.set(e,r)),r.push(t)}clone(t){const r=new Map;for(const[e,t]of this.services){const s=t.map((e=>({...e})));r.set(e,s)}return new e(this.logger,this.options,!0===t,r)}buildProvider(){return new w(this.logger,this.clone())}},O=class{static{t(this,"ILogger")}debug(e,...t){}info(e,...t){}error(e,...t){}warn(e,...t){}},x=class extends O{constructor(e){super(),this.options=e}static{t(this,"ConsoleLogger")}debug(e,...t){this.options.logLevel<=0&&console.debug(e,...t)}info(e,...t){this.options.logLevel<=1&&console.info(e,...t)}warn(e,...t){this.options.logLevel<=2&&console.warn(e,...t)}error(e,...t){this.options.logLevel<=3&&console.error(e,...t)}},I=t((e=>({...o,...e})),"mergeOptions"),L=t((e=>{const t=I(e),r=t.logger??new x(t);return new R(r,t,!1)}),"createServiceCollection"),y=t(((e,t,r,s)=>{let i=m(e,t);void 0===i&&(i={},E(e,i,t)),i[r]=s}),"tagProperty"),b=t((e=>(t,r)=>function(t){const s=this.constructor;return y(f,s,r.name,e),t}),"dependsOn");exports.DefaultServiceCollectionOptions=o,exports.ILogger=O,exports.IResolutionScope=d,exports.IScopedProvider=u,exports.IServiceProvider=v,exports.Lifetime=r,exports.LogLevel=s,exports.MultipleRegistrationError=l,exports.ResolveMultipleMode=i,exports.ScopedSingletonRegistrationError=h,exports.SelfDependencyError=p,exports.ServiceCreationError=a,exports.ServiceError=n,exports.UnregisteredServiceError=c,exports.createServiceCollection=L,exports.dependsOn=b;//# sourceMappingURL=index.js.map
@@ -0,0 +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, 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, IServiceBuilder, ServiceCollectionOptions, ServiceDescriptor, ServiceIdentifier, ServiceModuleType, SourceType, UnionToIntersection } from './types';\n\nexport interface IDisposable {\n [Symbol.dispose](): void;\n}\n\nexport interface IServiceModule {\n 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 [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 interface IServiceCollection {\n readonly options: ServiceCollectionOptions;\n get<T extends SourceType>(identifier: ServiceIdentifier<T>): ServiceDescriptor<T>[];\n register<Types extends SourceType[]>(...identifiers: { [K in keyof Types]: ServiceIdentifier<Types[K]> }): IServiceBuilder<EnsureObject<UnionToIntersection<Types[number]>>>;\n registerModules(...modules: ServiceModuleType[]): void;\n overrideLifetime<T extends SourceType>(identifier: ServiceIdentifier<T>, lifetime: Lifetime): void;\n buildProvider(): IServiceProvider;\n clone(): IServiceCollection;\n clone(scoped: true): IServiceCollection;\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 { IServiceCollection, IServiceProvider } from '../interfaces';\nimport type { ILogger } from '../logger';\nimport type { EnsureObject, IServiceBuilder, 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/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import"@abraham/reflection";var e=Object.defineProperty,t=(t,r)=>e(t,"name",{value:r,configurable:!0}),r=class{static{t(this,"ILogger")}debug(e,...t){}info(e,...t){}error(e,...t){}warn(e,...t){}},s={Error:"ERROR",LastRegistered:"LAST_REGISTERED"},i=(e=>(e[e.Debug=0]="Debug",e[e.Info=1]="Info",e[e.Warn=2]="Warn",e[e.Error=3]="Error",e[e.None=4]="None",e))(i||{}),o={registrationMode:s.Error,logLevel:2},n=class extends r{constructor(e){super(),this.options=e}static{t(this,"ConsoleLogger")}debug(e,...t){this.options.logLevel<=0&&console.debug(e,...t)}info(e,...t){this.options.logLevel<=1&&console.info(e,...t)}warn(e,...t){this.options.logLevel<=2&&console.warn(e,...t)}error(e,...t){this.options.logLevel<=3&&console.error(e,...t)}},c="design:dependencies",l=class{static{t(this,"IDisposable")}},a=class{static{t(this,"IServiceModule")}},h=class{static{t(this,"IServiceScope")}},p=class extends h{static{t(this,"IServiceProvider")}},g=class{static{t(this,"IServiceCollection")}},d=t(((e,t)=>{if(void 0===Reflect.getMetadata)throw new Error('Please import "reflect-metadata"');const r=Reflect.getMetadata(e,t);if(void 0!==r)return r}),"getMetadata"),v=t(((e,t,r)=>{if(void 0===Reflect.defineMetadata)throw new Error('Please import "reflect-metadata"');Reflect.defineMetadata(e,t,r)}),"defineMetadata"),f=class extends Error{static{t(this,"ServiceError")}constructor(e){super(e)}},u=class extends f{static{t(this,"UnregisteredServiceError")}name="UnregisteredServiceError";constructor(e){super(`Resolving service that has not been registered: ${e}`),Object.setPrototypeOf(this,new.target.prototype)}},m=class extends f{static{t(this,"MultipleRegistrationError")}name="MultipleRegistrationError";constructor(e){super(`Multiple services have been registered: ${e}`),Object.setPrototypeOf(this,new.target.prototype)}},S=class extends f{constructor(e,t){super(`Error creating service: ${e}`),this.innerError=t,Object.setPrototypeOf(this,new.target.prototype)}static{t(this,"ServiceCreationError")}name="ServiceCreationError"},E=class extends f{static{t(this,"SelfDependencyError")}name="SelfDependencyError";constructor(){super("Service depending on itself"),Object.setPrototypeOf(this,new.target.prototype)}},w=t((()=>new Map),"createResolveMap"),y=class e{constructor(e,t,r=w()){this.logger=e,this.services=t,this.singletons=r}static{t(this,"ServiceProvider")}scoped=w();created=[];get Services(){return this.services}[Symbol.dispose](){this.created.forEach((e=>e[Symbol.dispose]()))}resolveFrom(e,t,r,s){let i=r.get(e);void 0===i&&(i=new Map,r.set(e,i));let o=i.get(t.implementation);return void 0===o&&(o=this.createInstance(t,s),i.set(t.implementation,o),this.setDependencies(t.implementation,o,s)),o}resolveInternal(e,t,r){const s={SINGLETON:this.singletons,SCOPED:this.scoped,RESOLVE:r}[t.lifetime];if(void 0===s){const e=this.createInstance(t,r);return this.setDependencies(t.implementation,e,r),e}return this.resolveFrom(e,t,s,r)}resolveAll(e,t=w()){return this.services.get(e).map((r=>this.resolveInternal(e,r,t)))}resolve(e,t=w()){if(e.prototype===h.prototype||e.prototype===p.prototype)return this;const r=this.services.get(e);if(0===r.length)throw new u(e);if(r.length>1&&this.Services.options.registrationMode===s.Error)throw new m(e);const i=r[r.length-1];return this.resolveInternal(e,i,t)}createInstance(e,r){let s;if("factory"in e){const i=e.factory,o=t((e=>this.resolve(e,r)),"resolve"),n=t((e=>this.resolveAll(e,r)),"resolveAll"),c=this.createScope.bind(this);try{s=i({resolve:o,resolveAll:n,createScope:c,get Services(){return this.Services}})}catch(t){throw this.logger.error(t),new S(e.implementation,t)}}else try{s=new e.implementation}catch(t){throw this.logger.error(t),new S(e.implementation,t)}return"SINGLETON"!==e.lifetime&&Symbol.dispose in s&&this.created.push(s),s}createScope(){return new e(this.logger,this.services.clone(),this.singletons)}setDependencies(e,t,r){const s=d(c,e)??{};this.logger.debug("Dependencies",e.name,s);for(const[i,o]of Object.entries(s)){if(o===e)throw new E;{this.logger.debug("Resolving",o,"for",e.name);const s=this.resolve(o,r);t[i]=s}}return t}},b=class e{constructor(e,t,r=new Map){this.logger=e,this.options=t,this.services=r}static{t(this,"ServiceCollection")}registerModules(e){e.forEach((e=>{(new e).registerServices(this)}))}get(e){return this.services.get(e)??[]}register(e){return{to:t(((r,s)=>{const i=void 0===s?{implementation:r,lifetime:"RESOLVE"}:{implementation:r,factory:s,lifetime:"RESOLVE"};this.addService(e,i);const o={singleton:t((()=>(i.lifetime="SINGLETON",o)),"singleton"),scoped:t((()=>(i.lifetime="SCOPED",o)),"scoped"),transient:t((()=>(i.lifetime="TRANSIENT",o)),"transient")};return o}),"to")}}addService(e,t){this.logger.info("Adding service",{identifier:e,descriptor:t});let r=this.services.get(e);null==r&&(r=[],this.services.set(e,r)),r.push(t)}clone(){const t=new Map;for(const[e,r]of this.services){const s=r.map((e=>({...e})));t.set(e,s)}return new e(this.logger,this.options,t)}buildProvider(){const e=this.clone();return new y(this.logger,e)}},O=t((e=>({...o,...e})),"mergeOptions"),I=t((e=>{const t=O(e),r=t.logger??new n(t);return new b(r,t)}),"createServiceCollection"),R=t(((e,t,r,s)=>{let i=d(e,t);void 0===i&&(i={},v(e,i,t)),i[r]=s}),"tagProperty"),M=t((e=>(t,r)=>function(t){const s=this.constructor;return R(c,s,r.name,e),t}),"dependsOn");export{o as DefaultServiceCollectionOptions,l as IDisposable,r as ILogger,g as IServiceCollection,a as IServiceModule,p as IServiceProvider,h as IServiceScope,i as LogLevel,m as MultipleRegistrationError,s as ResolveMultipleMode,E as SelfDependencyError,b as ServiceCollection,S as ServiceCreationError,f as ServiceError,y as ServiceProvider,u as UnregisteredServiceError,I as createServiceCollection,M as dependsOn};//# sourceMappingURL=index.mjs.map
1
+ import"@abraham/reflection";var e=Object.defineProperty,t=(t,r)=>e(t,"name",{value:r,configurable:!0}),r=(e=>(e.Resolve="RESOLVE",e.Transient="TRANSIENT",e.Scoped="SCOPED",e.Singleton="SINGLETON",e))(r||{}),s=(e=>(e[e.Debug=0]="Debug",e[e.Info=1]="Info",e[e.Warn=2]="Warn",e[e.Error=3]="Error",e[e.None=4]="None",e))(s||{}),i=(e=>(e.Error="ERROR",e.LastRegistered="LAST_REGISTERED",e))(i||{}),o={registrationMode:"ERROR",logLevel:2},n=class extends Error{static{t(this,"ServiceError")}},c=class extends n{static{t(this,"UnregisteredServiceError")}name="UnregisteredServiceError";constructor(e){super(`Resolving service that has not been registered: ${e.name}`),Object.setPrototypeOf(this,new.target.prototype)}},a=class extends n{static{t(this,"MultipleRegistrationError")}name="MultipleRegistrationError";constructor(e){super(`Multiple services have been registered: ${e.name}`),Object.setPrototypeOf(this,new.target.prototype)}},l=class extends n{constructor(e,t){super(`Error creating service: ${e.name}`),this.innerError=t,Object.setPrototypeOf(this,new.target.prototype)}static{t(this,"ServiceCreationError")}name="ServiceCreationError"},h=class extends n{static{t(this,"SelfDependencyError")}name="SelfDependencyError";constructor(){super("Service depending on itself"),Object.setPrototypeOf(this,new.target.prototype)}},p=class extends n{static{t(this,"ScopedSingletonRegistrationError")}name="ScopedSingletonRegistrationError";constructor(){super("Cannot register a singleton in a scoped service collection"),Object.setPrototypeOf(this,new.target.prototype)}},g=class{constructor(e,t,r){this.identifiers=e,this.isScoped=t,this.addService=r}static{t(this,"ServiceBuilder")}descriptor;to(e,t){this.descriptor=this.createDescriptor(t,e);for(const e of this.identifiers)this.addService(e,this.descriptor);return this}createDescriptor(e,t){const r=e??(()=>new t);return{implementation:t,createInstance:r,lifetime:"RESOLVE"}}singleton(){if(this.isScoped)throw new p;return this.ensureDescriptor().lifetime="SINGLETON",this}scoped(){return this.ensureDescriptor().lifetime="SCOPED",this}transient(){return this.ensureDescriptor().lifetime="TRANSIENT",this}ensureDescriptor(){if(!this.descriptor)throw new Error("Must call to() before setting lifetime");return this.descriptor}},d=class{static{t(this,"IResolutionScope")}},u=class extends d{static{t(this,"IScopedProvider")}},f=class extends d{static{t(this,"IServiceProvider")}},v=class{constructor(e,t){this.singletons=e,this.scoped=t}static{t(this,"ResolutionContext")}transient=new Map;getFromLifetime(e,t){const r=this.getMapForLifetime(t);return r?.get(e)}setForLifetime(e,t,r){const s=this.getMapForLifetime(r);s?.set(e,t)}getMapForLifetime(e){return{SINGLETON:this.singletons,SCOPED:this.scoped,RESOLVE:this.transient}[e]}},S="design:dependencies",m=t(((e,t)=>Reflect.getMetadata(e,t)),"getMetadata"),E=t(((e,t,r)=>Reflect.defineMetadata(e,t,r)),"defineMetadata"),w=class e{constructor(e,t,r=new Map){this.logger=e,this.Services=t,this.singletons=r}static{t(this,"ServiceProvider")}scoped=new Map;created=[];[Symbol.dispose](){for(const e of this.created)e[Symbol.dispose]()}resolveInternal(e,t){let r=t.getFromLifetime(e.implementation,e.lifetime);return null==r&&(r=this.createInstance(e,t)),r}resolveAll(e,t){return this.Services.get(e).map((e=>this.resolveInternal(e,t??new v(this.singletons,this.scoped))))}resolve(e,t){if(e.prototype===d.prototype||e.prototype===u.prototype||e.prototype===f.prototype)return this;const r=this.getSingleDescriptor(e);return this.resolveInternal(r,t??new v(this.singletons,this.scoped))}getSingleDescriptor(e){const t=this.Services.get(e);if(0===t.length)throw new c(e);if(t.length>1&&"ERROR"===this.Services.options.registrationMode)throw new a(e);return t[t.length-1]}createInstance(e,t){const r=this.createInstanceInternal(e,t);return this.setDependencies(e.implementation,r,t),t.setForLifetime(e.implementation,r,e.lifetime),r}wrapContext(e){return{resolve:t((t=>this.resolve(t,e)),"resolve"),resolveAll:t((t=>this.resolveAll(t,e)),"resolveAll")}}createInstanceInternal(e,t){let r;try{r=e.createInstance(this.wrapContext(t))}catch(t){throw this.logger.error(t),new l(e.implementation,t)}return"SINGLETON"!==e.lifetime&&Symbol.dispose in r&&this.created.push(r),r}createScope(){return new e(this.logger,this.Services.clone(!0),this.singletons)}setDependencies(e,t,r){const s=m(S,e)??{};this.logger.debug("Dependencies",e.name,s);for(const[i,o]of Object.entries(s)){if(o===e)throw new h;{this.logger.debug("Resolving",o.name,"for",e.name);const s=this.resolve(o,r);t[i]=s}}return t}},R=class e{constructor(e,t,r,s=new Map){this.logger=e,this.options=t,this.isScoped=r,this.services=s}static{t(this,"ServiceCollection")}registerModules(...e){for(const t of e){(new t).registerServices(this)}}get(e){return this.services.get(e)??[]}overrideLifetime(e,t){for(const r of this.get(e))r.lifetime=t}register(...e){return new g(e,this.isScoped,((e,t)=>this.addService(e,t)))}addService(e,t){this.logger.info("Adding service",{identifier:e.name,descriptor:t});let r=this.services.get(e);null==r&&(r=[],this.services.set(e,r)),r.push(t)}clone(t){const r=new Map;for(const[e,t]of this.services){const s=t.map((e=>({...e})));r.set(e,s)}return new e(this.logger,this.options,!0===t,r)}buildProvider(){return new w(this.logger,this.clone())}},O=class{static{t(this,"ILogger")}debug(e,...t){}info(e,...t){}error(e,...t){}warn(e,...t){}},y=class extends O{constructor(e){super(),this.options=e}static{t(this,"ConsoleLogger")}debug(e,...t){this.options.logLevel<=0&&console.debug(e,...t)}info(e,...t){this.options.logLevel<=1&&console.info(e,...t)}warn(e,...t){this.options.logLevel<=2&&console.warn(e,...t)}error(e,...t){this.options.logLevel<=3&&console.error(e,...t)}},I=t((e=>({...o,...e})),"mergeOptions"),L=t((e=>{const t=I(e),r=t.logger??new y(t);return new R(r,t,!1)}),"createServiceCollection"),b=t(((e,t,r,s)=>{let i=m(e,t);void 0===i&&(i={},E(e,i,t)),i[r]=s}),"tagProperty"),D=t((e=>(t,r)=>function(t){const s=this.constructor;return b(S,s,r.name,e),t}),"dependsOn");export{o as DefaultServiceCollectionOptions,O as ILogger,d as IResolutionScope,u as IScopedProvider,f as IServiceProvider,r as Lifetime,s as LogLevel,a as MultipleRegistrationError,i as ResolveMultipleMode,p as ScopedSingletonRegistrationError,h as SelfDependencyError,l as ServiceCreationError,n as ServiceError,c as UnregisteredServiceError,L as createServiceCollection,D as dependsOn};//# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/logger.ts","../src/types.ts","../src/consoleLogger.ts","../src/constants.ts","../src/interfaces.ts","../src/metadata.ts","../src/errors.ts","../src/ServiceProvider.ts","../src/ServiceCollection.ts","../src/createServiceCollection.ts","../src/dependsOn.ts"],"names":["LogLevel"],"mappings":"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","file":"index.mjs","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unused-vars */\nexport 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 type { Lifetime } from './constants';\nimport type { IServiceModule, IServiceProvider, IServiceScope } from './interfaces';\nimport type { ILogger } from './logger';\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport type { ConsoleLogger } from './consoleLogger';\n\nexport type SourceType = object;\n\nexport type AbstractNewable<T> = abstract new (...args: any[]) => T;\nexport type Newable<T> = new (...args: any[]) => T;\n\nexport type ServiceIdentifier<T extends SourceType> = { prototype: T; name: string }; //AbstractNewable<T>;\nexport type ServiceImplementation<T extends SourceType> = Newable<T>;\n\nexport type InstanceFactory<T extends SourceType> = (x: IServiceScope & IServiceProvider) => T;\n\nexport type ServiceModuleType = Newable<IServiceModule>;\n\nexport type ServiceDescriptorFactory<T extends SourceType> = {\n implementation: ServiceIdentifier<T>;\n factory: InstanceFactory<T>;\n lifetime: Lifetime;\n};\nexport type ServiceDescriptorConcrete<T extends SourceType> = {\n implementation: ServiceImplementation<T>;\n lifetime: Lifetime;\n};\n\nexport type ServiceDescriptor<T extends SourceType> = ServiceDescriptorConcrete<T> | ServiceDescriptorFactory<T>;\n\nexport type LifetimeBuilder = {\n singleton: () => LifetimeBuilder;\n scoped: () => LifetimeBuilder;\n transient: () => LifetimeBuilder;\n};\nexport type ServiceBuilder<T extends SourceType> = {\n to: {\n (implementation: ServiceImplementation<T>): LifetimeBuilder;\n (implementation: ServiceIdentifier<T>, factory: InstanceFactory<T>): LifetimeBuilder;\n };\n};\n\nexport type MetadataType<T extends SourceType> = Record<string | symbol, ServiceIdentifier<T>>;\n\nexport const ResolveMultipleMode = {\n Error: 'ERROR',\n LastRegistered: 'LAST_REGISTERED',\n} as const;\nexport type ResolveMultipleMode = (typeof ResolveMultipleMode)[keyof typeof ResolveMultipleMode];\n\nexport const enum LogLevel {\n Debug = 0,\n Info = 1,\n Warn = 2,\n Error = 3,\n None = 4,\n}\n\n// export const LogLevel = {\n// Debug: 0,\n// Info: 1,\n// Warn: 2,\n// Error: 3,\n// None: 4,\n// } as const;\n// export type LogLevel = (typeof LogLevel)[keyof typeof LogLevel];\n\n\nexport const DefaultServiceCollectionOptions: ServiceCollectionOptions = {\n registrationMode: ResolveMultipleMode.Error,\n logLevel: LogLevel.Warn,\n};\n\nexport type ServiceCollectionOptions = {\n /**\n * Whether calling `resolve` when there are multiple registrations\n * will result in an error or resolve the last registered service.\n * @default ResolveMultipleMode.Error\n */\n registrationMode: ResolveMultipleMode;\n /**\n * The default log level for the console logger.\n * @defaultValue {@link LogLevel.Warn}\n */\n logLevel: LogLevel;\n /**\n * Custom implementation for logger. Ignores log level.\n * @defaultValue {@link ConsoleLogger}\n */\n logger?: ILogger;\n};","import { ILogger } from './logger';\nimport { LogLevel, type ServiceCollectionOptions } from './types';\n\nexport class ConsoleLogger extends ILogger {\n constructor(private readonly options: ServiceCollectionOptions) { super(); }\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","export enum Lifetime {\n Resolve = 'RESOLVE',\n Transient = 'TRANSIENT',\n Scoped = 'SCOPED',\n Singleton = 'SINGLETON',\n}\n\nexport const DesignDependenciesKey = 'design:dependencies';\n","import type { SourceType, ServiceBuilder, ServiceDescriptor, ServiceIdentifier, ServiceModuleType, ServiceCollectionOptions } from './types';\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport type { MultipleRegistrationError } from './errors';\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 IServiceScope {\n /**\n * Resolves a single implementation for the identifier.\n * When finding multiple implementations, it will either\n * throw a {@link MultipleRegistrationError} or resolve the latest depending on the provided options.\n */\n public abstract resolve<T extends SourceType>(identifier: ServiceIdentifier<T>): T;\n /**\n * Resolves all implementations for the identifier.\n */\n public abstract resolveAll<T extends SourceType>(identifier: ServiceIdentifier<T>): T[];\n}\n\nexport abstract class IServiceProvider extends IServiceScope {\n public abstract get Services(): IServiceCollection;\n public abstract createScope(): IServiceProvider & IDisposable;\n}\n\nexport abstract class IServiceCollection {\n public abstract readonly options: ServiceCollectionOptions;\n public abstract get<T extends SourceType>(key: ServiceIdentifier<T>): ServiceDescriptor<T>[];\n public abstract register<T extends SourceType>(identifier: ServiceIdentifier<T>): ServiceBuilder<T>;\n public abstract registerModules(modules: ServiceModuleType[]): void;\n public abstract buildProvider(): IServiceProvider;\n public abstract clone(): IServiceCollection;\n}\n","import '@abraham/reflection';\nimport type { MetadataType, SourceType } from './types';\n\nexport const getMetadata = <T extends SourceType>(key: string, obj: object): MetadataType<T> | undefined => {\n if (Reflect.getMetadata === undefined) {\n throw new Error('Please import \"reflect-metadata\"');\n }\n const result = Reflect.getMetadata(key, obj);\n if (result === undefined) {\n return undefined;\n }\n return result as MetadataType<T>;\n};\n\nexport const defineMetadata = <T extends SourceType>(key: string, metadata: MetadataType<T>, obj: object) => {\n if (Reflect.defineMetadata === undefined) {\n throw new Error('Please import \"reflect-metadata\"');\n }\n Reflect.defineMetadata(key, metadata, obj);\n};\n","import type { ServiceIdentifier } from './types';\n\nexport abstract class ServiceError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\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}`);\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}`);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ServiceCreationError<T extends object> extends ServiceError {\n name = 'ServiceCreationError';\n constructor(identifier: ServiceIdentifier<T>, public readonly innerError: any) {\n super(`Error creating service: ${identifier}`);\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","import type { ILogger } from './logger';\nimport { DesignDependenciesKey, Lifetime } from './constants';\nimport type { IDisposable, IServiceCollection} from './interfaces';\nimport { IServiceScope, IServiceProvider} from './interfaces';\nimport { getMetadata } from './metadata';\nimport type { ServiceIdentifier, ServiceDescriptor, ServiceImplementation, SourceType} from './types';\nimport { ResolveMultipleMode } from './types';\nimport { SelfDependencyError, MultipleRegistrationError, UnregisteredServiceError, ServiceCreationError } from './errors';\n\ntype Id<T extends SourceType> = ServiceIdentifier<T> | ServiceImplementation<T>;\n\ntype ResolveMap<T extends SourceType> = Map<ServiceIdentifier<T>, Map<Id<T>, T>>;\n\nconst createResolveMap = <T extends SourceType>(): ResolveMap<T> => new Map<ServiceIdentifier<T>, Map<ServiceImplementation<T>, T>>();\n\nexport class ServiceProvider implements IServiceProvider, IServiceScope {\n private scoped = createResolveMap();\n private created: IDisposable[] = [];\n\n constructor(\n private readonly logger: ILogger,\n private readonly services: IServiceCollection,\n private readonly singletons = createResolveMap(),\n ) {}\n \n public get Services(): IServiceCollection {\n return this.services;\n }\n\n [Symbol.dispose]() {\n this.created.forEach(x => x[Symbol.dispose]());\n }\n\n private resolveFrom<T extends SourceType>(\n identifier: ServiceIdentifier<T>,\n descriptor: ServiceDescriptor<T>,\n lifetimeMap: ResolveMap<T>,\n currentResolve: ResolveMap<T>\n ): T {\n let resolvedInstances = lifetimeMap.get(identifier);\n if (resolvedInstances === undefined) {\n resolvedInstances = new Map();\n lifetimeMap.set(identifier, resolvedInstances);\n }\n\n let instance = resolvedInstances.get(descriptor.implementation);\n if (instance === undefined) {\n instance = this.createInstance(descriptor, currentResolve);\n resolvedInstances.set(descriptor.implementation, instance);\n this.setDependencies<T>(descriptor.implementation, instance, currentResolve);\n }\n return instance;\n }\n\n private resolveInternal<T extends SourceType>(\n identifier: ServiceIdentifier<T>,\n descriptor: ServiceDescriptor<T>,\n currentResolve: ResolveMap<T>,\n ): T {\n const mapping: Partial<Record<Lifetime, ResolveMap<any>>> = {\n [Lifetime.Singleton]: this.singletons,\n [Lifetime.Scoped]: this.scoped,\n [Lifetime.Resolve]: currentResolve,\n };\n const sourceMap = mapping[descriptor.lifetime];\n if (sourceMap === undefined) {\n const instance = this.createInstance(descriptor, currentResolve);\n this.setDependencies<T>(descriptor.implementation, instance, currentResolve);\n return instance;\n }\n return this.resolveFrom(identifier, descriptor, sourceMap, currentResolve);\n }\n\n public resolveAll<T extends SourceType>(\n identifier: ServiceIdentifier<T>,\n currentResolve = createResolveMap<T>(),\n ): T[] {\n const descriptors = this.services.get(identifier);\n return descriptors.map(descriptor => this.resolveInternal<T>(identifier, descriptor, currentResolve));\n }\n\n public resolve<T extends SourceType>(\n identifier: ServiceIdentifier<T>,\n currentResolve = createResolveMap<T>(),\n ): T {\n if (identifier.prototype === IServiceScope.prototype || identifier.prototype === IServiceProvider.prototype) {\n return this as unknown as T;\n }\n\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 this.resolveInternal(identifier, descriptor, currentResolve);\n }\n\n private createInstance<T extends SourceType>(descriptor: ServiceDescriptor<T>, currentResolve: ResolveMap<T>): T {\n let instance: T;\n if ('factory' in descriptor) {\n const factory = descriptor.factory;\n const resolve = (identifier: ServiceIdentifier<any>) => this.resolve(identifier, currentResolve);\n const resolveAll = (identifier: ServiceIdentifier<any>) => this.resolveAll(identifier, currentResolve);\n const createScope = this.createScope.bind(this);\n\n // proxy requests to keep current resolved types\n try {\n instance = factory({\n resolve,\n resolveAll,\n createScope,\n get Services() { return this.Services; },\n });\n }\n catch (err) {\n this.logger.error(err);\n throw new ServiceCreationError(descriptor.implementation, err);\n }\n }\n else {\n try {\n instance = new descriptor.implementation();\n }\n catch (err) {\n this.logger.error(err);\n throw new ServiceCreationError(descriptor.implementation, err);\n }\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(): IServiceProvider & IDisposable {\n return new ServiceProvider(this.logger, this.services.clone(), this.singletons);\n }\n\n private setDependencies<T extends SourceType>(\n type: Id<T>,\n instance: T,\n currentResolve: ResolveMap<T>,\n ): T {\n const dependencies = getMetadata<T>(DesignDependenciesKey, type) ?? {};\n this.logger.debug('Dependencies', type.name, dependencies);\n for (const [key, identifier] of Object.entries(dependencies)) {\n if (identifier !== type) {\n this.logger.debug('Resolving', identifier, 'for', type.name);\n const dep = this.resolve(identifier, currentResolve);\n (instance as Record<string, unknown>)[key] = dep;\n } else {\n throw new SelfDependencyError();\n }\n }\n return instance;\n }\n}\n","import { ServiceProvider } from './ServiceProvider';\nimport type { SourceType, InstanceFactory, ServiceBuilder, ServiceDescriptor, ServiceIdentifier, ServiceImplementation, Newable, ServiceCollectionOptions } from './types';\nimport type { IServiceCollection, IServiceModule, IServiceProvider } from './interfaces';\nimport { Lifetime } from './constants';\nimport type { ILogger } from './logger';\n\nexport class ServiceCollection implements IServiceCollection {\n constructor(private readonly logger: ILogger, public readonly options: ServiceCollectionOptions, private readonly services = new Map<ServiceIdentifier<any>, ServiceDescriptor<any>[]>()) {\n }\n \n public registerModules(modules: Newable<IServiceModule>[]): void {\n modules.forEach(x => {\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 register<T extends SourceType>(identifier: ServiceIdentifier<T>): ServiceBuilder<T> {\n return {\n // to: (implementation: ServiceImplementation<T>, func?: InstanceFactory<T>) => {\n to: (implementation: ServiceImplementation<T> | ServiceIdentifier<T>, factory?: InstanceFactory<T>) => {\n const descriptor: ServiceDescriptor<T>= (factory === undefined) ? { implementation: implementation as ServiceImplementation<T>, lifetime: Lifetime.Resolve } : { implementation, factory, lifetime: Lifetime.Resolve };\n this.addService(identifier, descriptor);\n const builder = {\n singleton: () => { descriptor.lifetime = Lifetime.Singleton; return builder; },\n scoped: () => { descriptor.lifetime = Lifetime.Scoped; return builder; },\n transient: () => { descriptor.lifetime = Lifetime.Transient; return builder; },\n };\n return builder;\n },\n };\n }\n\n private addService<T extends SourceType>(identifier: ServiceIdentifier<T>, descriptor: ServiceDescriptor<T>) {\n this.logger.info('Adding service', { identifier, 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(): 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, clonedMap);\n }\n\n public buildProvider(): IServiceProvider {\n const cloned = this.clone(); \n return new ServiceProvider(this.logger, cloned);\n }\n}\n","import { ConsoleLogger } from './consoleLogger';\nimport type { IServiceCollection } from './interfaces';\nimport { ServiceCollection } from './ServiceCollection';\nimport type { ServiceCollectionOptions } from './types';\nimport { DefaultServiceCollectionOptions } 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);\n};\n","import { DesignDependenciesKey } from './constants';\nimport type { ServiceIdentifier, SourceType } from './types';\nimport { defineMetadata, getMetadata } from './metadata';\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 * @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, 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, IServiceBuilder, ServiceCollectionOptions, ServiceDescriptor, ServiceIdentifier, ServiceModuleType, SourceType, UnionToIntersection } from './types';\n\nexport interface IDisposable {\n [Symbol.dispose](): void;\n}\n\nexport interface IServiceModule {\n 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 [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 interface IServiceCollection {\n readonly options: ServiceCollectionOptions;\n get<T extends SourceType>(identifier: ServiceIdentifier<T>): ServiceDescriptor<T>[];\n register<Types extends SourceType[]>(...identifiers: { [K in keyof Types]: ServiceIdentifier<Types[K]> }): IServiceBuilder<EnsureObject<UnionToIntersection<Types[number]>>>;\n registerModules(...modules: ServiceModuleType[]): void;\n overrideLifetime<T extends SourceType>(identifier: ServiceIdentifier<T>, lifetime: Lifetime): void;\n buildProvider(): IServiceProvider;\n clone(): IServiceCollection;\n clone(scoped: true): IServiceCollection;\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 { IServiceCollection, IServiceProvider } from '../interfaces';\nimport type { ILogger } from '../logger';\nimport type { EnsureObject, IServiceBuilder, 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,23 +1,25 @@
1
1
  {
2
2
  "name": "@shellicar/core-di",
3
- "version": "0.1.0",
3
+ "version": "2.0.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
- "main": "./dist/index.cjs",
10
+ "main": "./dist/index.js",
11
11
  "module": "./dist/index.mjs",
12
12
  "types": "./dist/index.d.ts",
13
13
  "exports": {
14
- "require": {
15
- "types": "./dist/index.d.ts",
16
- "default": "./dist/index.cjs"
17
- },
18
- "import": {
19
- "types": "./dist/index.d.ts",
20
- "default": "./dist/index.mjs"
14
+ ".": {
15
+ "require": {
16
+ "types": "./dist/index.d.ts",
17
+ "default": "./dist/index.js"
18
+ },
19
+ "import": {
20
+ "types": "./dist/index.d.ts",
21
+ "default": "./dist/index.mjs"
22
+ }
21
23
  }
22
24
  },
23
25
  "files": [
@@ -36,31 +38,30 @@
36
38
  },
37
39
  "homepage": "https://github.com/shellicar/core-di#readme",
38
40
  "devDependencies": {
39
- "@stylistic/eslint-plugin": "^2.8.0",
40
- "@types/mocha": "^10.0.8",
41
- "@types/node": "^22.5.5",
42
- "@typescript-eslint/parser": "^8.6.0",
43
- "eslint": "^9.11.0",
44
- "eslint-plugin-prefer-arrow-functions": "^3.4.1",
45
- "eslint-plugin-turbo": "^2.1.2",
46
- "eslint-plugin-unicorn": "^55.0.0",
47
- "mocha": "^10.7.3",
48
- "npm-run-all2": "^6.2.3",
41
+ "@biomejs/biome": "^1.9.4",
42
+ "@tsconfig/node20": "^20.1.4",
43
+ "@types/node": "^22.10.5",
44
+ "npm-check-updates": "^17.1.13",
45
+ "npm-run-all2": "^7.0.2",
49
46
  "rimraf": "^6.0.1",
50
- "terser": "^5.33.0",
51
- "tsup": "^8.3.0",
52
- "tsx": "^4.19.1",
53
- "typescript": "^5.6.2",
54
- "typescript-eslint": "^8.6.0"
47
+ "terser": "^5.37.0",
48
+ "tsup": "^8.3.5",
49
+ "tsx": "^4.19.2",
50
+ "typescript": "^5.7.2",
51
+ "vitest": "^2.1.8"
55
52
  },
56
53
  "dependencies": {
57
54
  "@abraham/reflection": "^0.12.0"
58
55
  },
59
56
  "scripts": {
60
- "build": "run-s build:source build:types",
61
- "build:source": "tsup",
62
- "build:types": "tsup --dts-only --format mjs",
63
- "test": "mocha",
64
- "lint": "eslint ."
57
+ "build": "tsup-node",
58
+ "dev": "tsup-node --watch",
59
+ "test": "vitest run",
60
+ "lint": "biome lint",
61
+ "format": "biome format",
62
+ "check": "biome check",
63
+ "ci": "biome ci",
64
+ "ci:fix": "biome check --fix --diagnostic-level=error",
65
+ "updates": "npm-check-updates"
65
66
  }
66
67
  }
package/dist/index.cjs DELETED
@@ -1 +0,0 @@
1
- "use strict";require("@abraham/reflection");var e=Object.defineProperty,t=(t,r)=>e(t,"name",{value:r,configurable:!0}),r=class{static{t(this,"ILogger")}debug(e,...t){}info(e,...t){}error(e,...t){}warn(e,...t){}},s={Error:"ERROR",LastRegistered:"LAST_REGISTERED"},o=(e=>(e[e.Debug=0]="Debug",e[e.Info=1]="Info",e[e.Warn=2]="Warn",e[e.Error=3]="Error",e[e.None=4]="None",e))(o||{}),i={registrationMode:s.Error,logLevel:2},n=class extends r{constructor(e){super(),this.options=e}static{t(this,"ConsoleLogger")}debug(e,...t){this.options.logLevel<=0&&console.debug(e,...t)}info(e,...t){this.options.logLevel<=1&&console.info(e,...t)}warn(e,...t){this.options.logLevel<=2&&console.warn(e,...t)}error(e,...t){this.options.logLevel<=3&&console.error(e,...t)}},c="design:dependencies",l=class{static{t(this,"IDisposable")}},a=class{static{t(this,"IServiceModule")}},p=class{static{t(this,"IServiceScope")}},h=class extends p{static{t(this,"IServiceProvider")}},g=class{static{t(this,"IServiceCollection")}},d=t(((e,t)=>{if(void 0===Reflect.getMetadata)throw new Error('Please import "reflect-metadata"');const r=Reflect.getMetadata(e,t);if(void 0!==r)return r}),"getMetadata"),v=t(((e,t,r)=>{if(void 0===Reflect.defineMetadata)throw new Error('Please import "reflect-metadata"');Reflect.defineMetadata(e,t,r)}),"defineMetadata"),u=class extends Error{static{t(this,"ServiceError")}constructor(e){super(e)}},f=class extends u{static{t(this,"UnregisteredServiceError")}name="UnregisteredServiceError";constructor(e){super(`Resolving service that has not been registered: ${e}`),Object.setPrototypeOf(this,new.target.prototype)}},S=class extends u{static{t(this,"MultipleRegistrationError")}name="MultipleRegistrationError";constructor(e){super(`Multiple services have been registered: ${e}`),Object.setPrototypeOf(this,new.target.prototype)}},m=class extends u{constructor(e,t){super(`Error creating service: ${e}`),this.innerError=t,Object.setPrototypeOf(this,new.target.prototype)}static{t(this,"ServiceCreationError")}name="ServiceCreationError"},E=class extends u{static{t(this,"SelfDependencyError")}name="SelfDependencyError";constructor(){super("Service depending on itself"),Object.setPrototypeOf(this,new.target.prototype)}},w=t((()=>new Map),"createResolveMap"),x=class e{constructor(e,t,r=w()){this.logger=e,this.services=t,this.singletons=r}static{t(this,"ServiceProvider")}scoped=w();created=[];get Services(){return this.services}[Symbol.dispose](){this.created.forEach((e=>e[Symbol.dispose]()))}resolveFrom(e,t,r,s){let o=r.get(e);void 0===o&&(o=new Map,r.set(e,o));let i=o.get(t.implementation);return void 0===i&&(i=this.createInstance(t,s),o.set(t.implementation,i),this.setDependencies(t.implementation,i,s)),i}resolveInternal(e,t,r){const s={SINGLETON:this.singletons,SCOPED:this.scoped,RESOLVE:r}[t.lifetime];if(void 0===s){const e=this.createInstance(t,r);return this.setDependencies(t.implementation,e,r),e}return this.resolveFrom(e,t,s,r)}resolveAll(e,t=w()){return this.services.get(e).map((r=>this.resolveInternal(e,r,t)))}resolve(e,t=w()){if(e.prototype===p.prototype||e.prototype===h.prototype)return this;const r=this.services.get(e);if(0===r.length)throw new f(e);if(r.length>1&&this.Services.options.registrationMode===s.Error)throw new S(e);const o=r[r.length-1];return this.resolveInternal(e,o,t)}createInstance(e,r){let s;if("factory"in e){const o=e.factory,i=t((e=>this.resolve(e,r)),"resolve"),n=t((e=>this.resolveAll(e,r)),"resolveAll"),c=this.createScope.bind(this);try{s=o({resolve:i,resolveAll:n,createScope:c,get Services(){return this.Services}})}catch(t){throw this.logger.error(t),new m(e.implementation,t)}}else try{s=new e.implementation}catch(t){throw this.logger.error(t),new m(e.implementation,t)}return"SINGLETON"!==e.lifetime&&Symbol.dispose in s&&this.created.push(s),s}createScope(){return new e(this.logger,this.services.clone(),this.singletons)}setDependencies(e,t,r){const s=d(c,e)??{};this.logger.debug("Dependencies",e.name,s);for(const[o,i]of Object.entries(s)){if(i===e)throw new E;{this.logger.debug("Resolving",i,"for",e.name);const s=this.resolve(i,r);t[o]=s}}return t}},y=class e{constructor(e,t,r=new Map){this.logger=e,this.options=t,this.services=r}static{t(this,"ServiceCollection")}registerModules(e){e.forEach((e=>{(new e).registerServices(this)}))}get(e){return this.services.get(e)??[]}register(e){return{to:t(((r,s)=>{const o=void 0===s?{implementation:r,lifetime:"RESOLVE"}:{implementation:r,factory:s,lifetime:"RESOLVE"};this.addService(e,o);const i={singleton:t((()=>(o.lifetime="SINGLETON",i)),"singleton"),scoped:t((()=>(o.lifetime="SCOPED",i)),"scoped"),transient:t((()=>(o.lifetime="TRANSIENT",i)),"transient")};return i}),"to")}}addService(e,t){this.logger.info("Adding service",{identifier:e,descriptor:t});let r=this.services.get(e);null==r&&(r=[],this.services.set(e,r)),r.push(t)}clone(){const t=new Map;for(const[e,r]of this.services){const s=r.map((e=>({...e})));t.set(e,s)}return new e(this.logger,this.options,t)}buildProvider(){const e=this.clone();return new x(this.logger,e)}},I=t((e=>({...i,...e})),"mergeOptions"),b=t((e=>{const t=I(e),r=t.logger??new n(t);return new y(r,t)}),"createServiceCollection"),O=t(((e,t,r,s)=>{let o=d(e,t);void 0===o&&(o={},v(e,o,t)),o[r]=s}),"tagProperty"),M=t((e=>(t,r)=>function(t){const s=this.constructor;return O(c,s,r.name,e),t}),"dependsOn");exports.DefaultServiceCollectionOptions=i,exports.IDisposable=l,exports.ILogger=r,exports.IServiceCollection=g,exports.IServiceModule=a,exports.IServiceProvider=h,exports.IServiceScope=p,exports.LogLevel=o,exports.MultipleRegistrationError=S,exports.ResolveMultipleMode=s,exports.SelfDependencyError=E,exports.ServiceCollection=y,exports.ServiceCreationError=m,exports.ServiceError=u,exports.ServiceProvider=x,exports.UnregisteredServiceError=f,exports.createServiceCollection=b,exports.dependsOn=M;//# sourceMappingURL=index.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/logger.ts","../src/types.ts","../src/consoleLogger.ts","../src/constants.ts","../src/interfaces.ts","../src/metadata.ts","../src/errors.ts","../src/ServiceProvider.ts","../src/ServiceCollection.ts","../src/createServiceCollection.ts","../src/dependsOn.ts"],"names":["LogLevel"],"mappings":"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","file":"index.cjs","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unused-vars */\nexport 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 type { Lifetime } from './constants';\nimport type { IServiceModule, IServiceProvider, IServiceScope } from './interfaces';\nimport type { ILogger } from './logger';\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport type { ConsoleLogger } from './consoleLogger';\n\nexport type SourceType = object;\n\nexport type AbstractNewable<T> = abstract new (...args: any[]) => T;\nexport type Newable<T> = new (...args: any[]) => T;\n\nexport type ServiceIdentifier<T extends SourceType> = { prototype: T; name: string }; //AbstractNewable<T>;\nexport type ServiceImplementation<T extends SourceType> = Newable<T>;\n\nexport type InstanceFactory<T extends SourceType> = (x: IServiceScope & IServiceProvider) => T;\n\nexport type ServiceModuleType = Newable<IServiceModule>;\n\nexport type ServiceDescriptorFactory<T extends SourceType> = {\n implementation: ServiceIdentifier<T>;\n factory: InstanceFactory<T>;\n lifetime: Lifetime;\n};\nexport type ServiceDescriptorConcrete<T extends SourceType> = {\n implementation: ServiceImplementation<T>;\n lifetime: Lifetime;\n};\n\nexport type ServiceDescriptor<T extends SourceType> = ServiceDescriptorConcrete<T> | ServiceDescriptorFactory<T>;\n\nexport type LifetimeBuilder = {\n singleton: () => LifetimeBuilder;\n scoped: () => LifetimeBuilder;\n transient: () => LifetimeBuilder;\n};\nexport type ServiceBuilder<T extends SourceType> = {\n to: {\n (implementation: ServiceImplementation<T>): LifetimeBuilder;\n (implementation: ServiceIdentifier<T>, factory: InstanceFactory<T>): LifetimeBuilder;\n };\n};\n\nexport type MetadataType<T extends SourceType> = Record<string | symbol, ServiceIdentifier<T>>;\n\nexport const ResolveMultipleMode = {\n Error: 'ERROR',\n LastRegistered: 'LAST_REGISTERED',\n} as const;\nexport type ResolveMultipleMode = (typeof ResolveMultipleMode)[keyof typeof ResolveMultipleMode];\n\nexport const enum LogLevel {\n Debug = 0,\n Info = 1,\n Warn = 2,\n Error = 3,\n None = 4,\n}\n\n// export const LogLevel = {\n// Debug: 0,\n// Info: 1,\n// Warn: 2,\n// Error: 3,\n// None: 4,\n// } as const;\n// export type LogLevel = (typeof LogLevel)[keyof typeof LogLevel];\n\n\nexport const DefaultServiceCollectionOptions: ServiceCollectionOptions = {\n registrationMode: ResolveMultipleMode.Error,\n logLevel: LogLevel.Warn,\n};\n\nexport type ServiceCollectionOptions = {\n /**\n * Whether calling `resolve` when there are multiple registrations\n * will result in an error or resolve the last registered service.\n * @default ResolveMultipleMode.Error\n */\n registrationMode: ResolveMultipleMode;\n /**\n * The default log level for the console logger.\n * @defaultValue {@link LogLevel.Warn}\n */\n logLevel: LogLevel;\n /**\n * Custom implementation for logger. Ignores log level.\n * @defaultValue {@link ConsoleLogger}\n */\n logger?: ILogger;\n};","import { ILogger } from './logger';\nimport { LogLevel, type ServiceCollectionOptions } from './types';\n\nexport class ConsoleLogger extends ILogger {\n constructor(private readonly options: ServiceCollectionOptions) { super(); }\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","export enum Lifetime {\n Resolve = 'RESOLVE',\n Transient = 'TRANSIENT',\n Scoped = 'SCOPED',\n Singleton = 'SINGLETON',\n}\n\nexport const DesignDependenciesKey = 'design:dependencies';\n","import type { SourceType, ServiceBuilder, ServiceDescriptor, ServiceIdentifier, ServiceModuleType, ServiceCollectionOptions } from './types';\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport type { MultipleRegistrationError } from './errors';\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 IServiceScope {\n /**\n * Resolves a single implementation for the identifier.\n * When finding multiple implementations, it will either\n * throw a {@link MultipleRegistrationError} or resolve the latest depending on the provided options.\n */\n public abstract resolve<T extends SourceType>(identifier: ServiceIdentifier<T>): T;\n /**\n * Resolves all implementations for the identifier.\n */\n public abstract resolveAll<T extends SourceType>(identifier: ServiceIdentifier<T>): T[];\n}\n\nexport abstract class IServiceProvider extends IServiceScope {\n public abstract get Services(): IServiceCollection;\n public abstract createScope(): IServiceProvider & IDisposable;\n}\n\nexport abstract class IServiceCollection {\n public abstract readonly options: ServiceCollectionOptions;\n public abstract get<T extends SourceType>(key: ServiceIdentifier<T>): ServiceDescriptor<T>[];\n public abstract register<T extends SourceType>(identifier: ServiceIdentifier<T>): ServiceBuilder<T>;\n public abstract registerModules(modules: ServiceModuleType[]): void;\n public abstract buildProvider(): IServiceProvider;\n public abstract clone(): IServiceCollection;\n}\n","import '@abraham/reflection';\nimport type { MetadataType, SourceType } from './types';\n\nexport const getMetadata = <T extends SourceType>(key: string, obj: object): MetadataType<T> | undefined => {\n if (Reflect.getMetadata === undefined) {\n throw new Error('Please import \"reflect-metadata\"');\n }\n const result = Reflect.getMetadata(key, obj);\n if (result === undefined) {\n return undefined;\n }\n return result as MetadataType<T>;\n};\n\nexport const defineMetadata = <T extends SourceType>(key: string, metadata: MetadataType<T>, obj: object) => {\n if (Reflect.defineMetadata === undefined) {\n throw new Error('Please import \"reflect-metadata\"');\n }\n Reflect.defineMetadata(key, metadata, obj);\n};\n","import type { ServiceIdentifier } from './types';\n\nexport abstract class ServiceError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\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}`);\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}`);\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ServiceCreationError<T extends object> extends ServiceError {\n name = 'ServiceCreationError';\n constructor(identifier: ServiceIdentifier<T>, public readonly innerError: any) {\n super(`Error creating service: ${identifier}`);\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","import type { ILogger } from './logger';\nimport { DesignDependenciesKey, Lifetime } from './constants';\nimport type { IDisposable, IServiceCollection} from './interfaces';\nimport { IServiceScope, IServiceProvider} from './interfaces';\nimport { getMetadata } from './metadata';\nimport type { ServiceIdentifier, ServiceDescriptor, ServiceImplementation, SourceType} from './types';\nimport { ResolveMultipleMode } from './types';\nimport { SelfDependencyError, MultipleRegistrationError, UnregisteredServiceError, ServiceCreationError } from './errors';\n\ntype Id<T extends SourceType> = ServiceIdentifier<T> | ServiceImplementation<T>;\n\ntype ResolveMap<T extends SourceType> = Map<ServiceIdentifier<T>, Map<Id<T>, T>>;\n\nconst createResolveMap = <T extends SourceType>(): ResolveMap<T> => new Map<ServiceIdentifier<T>, Map<ServiceImplementation<T>, T>>();\n\nexport class ServiceProvider implements IServiceProvider, IServiceScope {\n private scoped = createResolveMap();\n private created: IDisposable[] = [];\n\n constructor(\n private readonly logger: ILogger,\n private readonly services: IServiceCollection,\n private readonly singletons = createResolveMap(),\n ) {}\n \n public get Services(): IServiceCollection {\n return this.services;\n }\n\n [Symbol.dispose]() {\n this.created.forEach(x => x[Symbol.dispose]());\n }\n\n private resolveFrom<T extends SourceType>(\n identifier: ServiceIdentifier<T>,\n descriptor: ServiceDescriptor<T>,\n lifetimeMap: ResolveMap<T>,\n currentResolve: ResolveMap<T>\n ): T {\n let resolvedInstances = lifetimeMap.get(identifier);\n if (resolvedInstances === undefined) {\n resolvedInstances = new Map();\n lifetimeMap.set(identifier, resolvedInstances);\n }\n\n let instance = resolvedInstances.get(descriptor.implementation);\n if (instance === undefined) {\n instance = this.createInstance(descriptor, currentResolve);\n resolvedInstances.set(descriptor.implementation, instance);\n this.setDependencies<T>(descriptor.implementation, instance, currentResolve);\n }\n return instance;\n }\n\n private resolveInternal<T extends SourceType>(\n identifier: ServiceIdentifier<T>,\n descriptor: ServiceDescriptor<T>,\n currentResolve: ResolveMap<T>,\n ): T {\n const mapping: Partial<Record<Lifetime, ResolveMap<any>>> = {\n [Lifetime.Singleton]: this.singletons,\n [Lifetime.Scoped]: this.scoped,\n [Lifetime.Resolve]: currentResolve,\n };\n const sourceMap = mapping[descriptor.lifetime];\n if (sourceMap === undefined) {\n const instance = this.createInstance(descriptor, currentResolve);\n this.setDependencies<T>(descriptor.implementation, instance, currentResolve);\n return instance;\n }\n return this.resolveFrom(identifier, descriptor, sourceMap, currentResolve);\n }\n\n public resolveAll<T extends SourceType>(\n identifier: ServiceIdentifier<T>,\n currentResolve = createResolveMap<T>(),\n ): T[] {\n const descriptors = this.services.get(identifier);\n return descriptors.map(descriptor => this.resolveInternal<T>(identifier, descriptor, currentResolve));\n }\n\n public resolve<T extends SourceType>(\n identifier: ServiceIdentifier<T>,\n currentResolve = createResolveMap<T>(),\n ): T {\n if (identifier.prototype === IServiceScope.prototype || identifier.prototype === IServiceProvider.prototype) {\n return this as unknown as T;\n }\n\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 this.resolveInternal(identifier, descriptor, currentResolve);\n }\n\n private createInstance<T extends SourceType>(descriptor: ServiceDescriptor<T>, currentResolve: ResolveMap<T>): T {\n let instance: T;\n if ('factory' in descriptor) {\n const factory = descriptor.factory;\n const resolve = (identifier: ServiceIdentifier<any>) => this.resolve(identifier, currentResolve);\n const resolveAll = (identifier: ServiceIdentifier<any>) => this.resolveAll(identifier, currentResolve);\n const createScope = this.createScope.bind(this);\n\n // proxy requests to keep current resolved types\n try {\n instance = factory({\n resolve,\n resolveAll,\n createScope,\n get Services() { return this.Services; },\n });\n }\n catch (err) {\n this.logger.error(err);\n throw new ServiceCreationError(descriptor.implementation, err);\n }\n }\n else {\n try {\n instance = new descriptor.implementation();\n }\n catch (err) {\n this.logger.error(err);\n throw new ServiceCreationError(descriptor.implementation, err);\n }\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(): IServiceProvider & IDisposable {\n return new ServiceProvider(this.logger, this.services.clone(), this.singletons);\n }\n\n private setDependencies<T extends SourceType>(\n type: Id<T>,\n instance: T,\n currentResolve: ResolveMap<T>,\n ): T {\n const dependencies = getMetadata<T>(DesignDependenciesKey, type) ?? {};\n this.logger.debug('Dependencies', type.name, dependencies);\n for (const [key, identifier] of Object.entries(dependencies)) {\n if (identifier !== type) {\n this.logger.debug('Resolving', identifier, 'for', type.name);\n const dep = this.resolve(identifier, currentResolve);\n (instance as Record<string, unknown>)[key] = dep;\n } else {\n throw new SelfDependencyError();\n }\n }\n return instance;\n }\n}\n","import { ServiceProvider } from './ServiceProvider';\nimport type { SourceType, InstanceFactory, ServiceBuilder, ServiceDescriptor, ServiceIdentifier, ServiceImplementation, Newable, ServiceCollectionOptions } from './types';\nimport type { IServiceCollection, IServiceModule, IServiceProvider } from './interfaces';\nimport { Lifetime } from './constants';\nimport type { ILogger } from './logger';\n\nexport class ServiceCollection implements IServiceCollection {\n constructor(private readonly logger: ILogger, public readonly options: ServiceCollectionOptions, private readonly services = new Map<ServiceIdentifier<any>, ServiceDescriptor<any>[]>()) {\n }\n \n public registerModules(modules: Newable<IServiceModule>[]): void {\n modules.forEach(x => {\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 register<T extends SourceType>(identifier: ServiceIdentifier<T>): ServiceBuilder<T> {\n return {\n // to: (implementation: ServiceImplementation<T>, func?: InstanceFactory<T>) => {\n to: (implementation: ServiceImplementation<T> | ServiceIdentifier<T>, factory?: InstanceFactory<T>) => {\n const descriptor: ServiceDescriptor<T>= (factory === undefined) ? { implementation: implementation as ServiceImplementation<T>, lifetime: Lifetime.Resolve } : { implementation, factory, lifetime: Lifetime.Resolve };\n this.addService(identifier, descriptor);\n const builder = {\n singleton: () => { descriptor.lifetime = Lifetime.Singleton; return builder; },\n scoped: () => { descriptor.lifetime = Lifetime.Scoped; return builder; },\n transient: () => { descriptor.lifetime = Lifetime.Transient; return builder; },\n };\n return builder;\n },\n };\n }\n\n private addService<T extends SourceType>(identifier: ServiceIdentifier<T>, descriptor: ServiceDescriptor<T>) {\n this.logger.info('Adding service', { identifier, 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(): 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, clonedMap);\n }\n\n public buildProvider(): IServiceProvider {\n const cloned = this.clone(); \n return new ServiceProvider(this.logger, cloned);\n }\n}\n","import { ConsoleLogger } from './consoleLogger';\nimport type { IServiceCollection } from './interfaces';\nimport { ServiceCollection } from './ServiceCollection';\nimport type { ServiceCollectionOptions } from './types';\nimport { DefaultServiceCollectionOptions } 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);\n};\n","import { DesignDependenciesKey } from './constants';\nimport type { ServiceIdentifier, SourceType } from './types';\nimport { defineMetadata, getMetadata } from './metadata';\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 * @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"]}