@nmtjs/core 0.15.0-beta.1 → 0.15.0-beta.10
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/dist/constants.d.ts +18 -0
- package/dist/constants.js +10 -0
- package/dist/constants.js.map +1 -0
- package/dist/container.d.ts +47 -0
- package/dist/container.js +329 -0
- package/dist/container.js.map +1 -0
- package/dist/enums.d.ts +6 -0
- package/dist/enums.js +8 -0
- package/dist/enums.js.map +1 -0
- package/dist/hooks.d.ts +13 -0
- package/dist/hooks.js +12 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/injectables.d.ts +88 -0
- package/dist/injectables.js +142 -0
- package/dist/injectables.js.map +1 -0
- package/dist/logger.d.ts +11 -0
- package/dist/logger.js +67 -0
- package/dist/logger.js.map +1 -0
- package/dist/metadata.d.ts +13 -0
- package/dist/metadata.js +16 -0
- package/dist/metadata.js.map +1 -0
- package/dist/plugin.d.ts +9 -0
- package/dist/plugin.js +4 -0
- package/dist/plugin.js.map +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/functions.d.ts +7 -0
- package/dist/utils/functions.js +18 -0
- package/dist/utils/functions.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/pool.d.ts +18 -0
- package/dist/utils/pool.js +106 -0
- package/dist/utils/pool.js.map +1 -0
- package/dist/utils/semaphore.d.ts +13 -0
- package/dist/utils/semaphore.js +56 -0
- package/dist/utils/semaphore.js.map +1 -0
- package/package.json +7 -6
- package/src/constants.ts +34 -0
- package/src/container.ts +509 -0
- package/src/enums.ts +6 -0
- package/src/hooks.ts +24 -0
- package/src/index.ts +14 -0
- package/src/injectables.ts +359 -0
- package/src/logger.ts +103 -0
- package/src/metadata.ts +24 -0
- package/src/plugin.ts +16 -0
- package/src/types.ts +3 -0
- package/src/utils/functions.ts +31 -0
- package/src/utils/index.ts +3 -0
- package/src/utils/pool.ts +111 -0
- package/src/utils/semaphore.ts +63 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare const kOptionalDependency: unique symbol;
|
|
2
|
+
export type kOptionalDependency = typeof kOptionalDependency;
|
|
3
|
+
export declare const kInjectable: unique symbol;
|
|
4
|
+
export type kInjectable = typeof kInjectable;
|
|
5
|
+
export declare const kLazyInjectable: unique symbol;
|
|
6
|
+
export type kLazyInjectable = typeof kLazyInjectable;
|
|
7
|
+
export declare const kValueInjectable: unique symbol;
|
|
8
|
+
export type kValueInjectable = typeof kValueInjectable;
|
|
9
|
+
export declare const kFactoryInjectable: unique symbol;
|
|
10
|
+
export type kFactoryInjectable = typeof kFactoryInjectable;
|
|
11
|
+
export declare const kProvider: unique symbol;
|
|
12
|
+
export type kProvider = typeof kProvider;
|
|
13
|
+
export declare const kPlugin: unique symbol;
|
|
14
|
+
export type kPlugin = typeof kPlugin;
|
|
15
|
+
export declare const kMetadata: unique symbol;
|
|
16
|
+
export type kMetadata = typeof kMetadata;
|
|
17
|
+
export declare const kHook: unique symbol;
|
|
18
|
+
export type kHook = typeof kHook;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export const kOptionalDependency = Symbol.for('neemata:OptionalDependencyKey');
|
|
2
|
+
export const kInjectable = Symbol.for('neemata:InjectableKey');
|
|
3
|
+
export const kLazyInjectable = Symbol.for('neemata:LazyInjectableKey');
|
|
4
|
+
export const kValueInjectable = Symbol.for('neemata:ValueInjectableKey');
|
|
5
|
+
export const kFactoryInjectable = Symbol.for('neemata:FactoryInjectableKey');
|
|
6
|
+
export const kProvider = Symbol.for('neemata:ProviderKey');
|
|
7
|
+
export const kPlugin = Symbol.for('neemata:PluginKey');
|
|
8
|
+
export const kMetadata = Symbol.for('neemata:MetadataKey');
|
|
9
|
+
export const kHook = Symbol.for('neemata:HookKey');
|
|
10
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAkB,MAAM,CAAC,GAAG,CAC1D,+BAA+B,CAChC,CAAA;AAGD,MAAM,CAAC,MAAM,WAAW,GAAkB,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;AAG7E,MAAM,CAAC,MAAM,eAAe,GAAkB,MAAM,CAAC,GAAG,CACtD,2BAA2B,CAC5B,CAAA;AAGD,MAAM,CAAC,MAAM,gBAAgB,GAAkB,MAAM,CAAC,GAAG,CACvD,4BAA4B,CAC7B,CAAA;AAGD,MAAM,CAAC,MAAM,kBAAkB,GAAkB,MAAM,CAAC,GAAG,CACzD,8BAA8B,CAC/B,CAAA;AAGD,MAAM,CAAC,MAAM,SAAS,GAAkB,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;AAGzE,MAAM,CAAC,MAAM,OAAO,GAAkB,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;AAGrE,MAAM,CAAC,MAAM,SAAS,GAAkB,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;AAGzE,MAAM,CAAC,MAAM,KAAK,GAAkB,MAAM,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { PerformanceMeasure } from 'node:perf_hooks';
|
|
2
|
+
import type { AnyInjectable, Dependencies, DependencyContext, Injection, ResolveInjectableType } from './injectables.ts';
|
|
3
|
+
import type { Logger } from './logger.ts';
|
|
4
|
+
import { Scope } from './enums.ts';
|
|
5
|
+
type InstanceWrapper = {
|
|
6
|
+
private: any;
|
|
7
|
+
public: any;
|
|
8
|
+
context: any;
|
|
9
|
+
};
|
|
10
|
+
type ContainerOptions = {
|
|
11
|
+
logger: Logger;
|
|
12
|
+
};
|
|
13
|
+
export declare class Container {
|
|
14
|
+
private readonly runtime;
|
|
15
|
+
readonly scope: Exclude<Scope, Scope.Transient>;
|
|
16
|
+
private readonly parent?;
|
|
17
|
+
readonly instances: Map<AnyInjectable, InstanceWrapper[]>;
|
|
18
|
+
private readonly resolvers;
|
|
19
|
+
private readonly injectables;
|
|
20
|
+
private readonly dependants;
|
|
21
|
+
private disposing;
|
|
22
|
+
constructor(runtime: ContainerOptions, scope?: Exclude<Scope, Scope.Transient>, parent?: Container | undefined);
|
|
23
|
+
initialize(injectables: Iterable<AnyInjectable>): Promise<PerformanceMeasure[]>;
|
|
24
|
+
fork(scope: Exclude<Scope, Scope.Transient>): Container;
|
|
25
|
+
find(scope: Exclude<Scope, Scope.Transient>): Container | undefined;
|
|
26
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
27
|
+
dispose(): Promise<void>;
|
|
28
|
+
containsWithinSelf(injectable: AnyInjectable): boolean;
|
|
29
|
+
contains(injectable: AnyInjectable): boolean;
|
|
30
|
+
get<T extends AnyInjectable>(injectable: T): ResolveInjectableType<T>;
|
|
31
|
+
resolve<T extends AnyInjectable>(injectable: T, measurements?: PerformanceMeasure[]): Promise<ResolveInjectableType<T>>;
|
|
32
|
+
createContext<T extends Dependencies>(dependencies: T): Promise<DependencyContext<T>>;
|
|
33
|
+
provide<T extends Injection[]>(injections: T): any;
|
|
34
|
+
provide<T extends AnyInjectable>(injectable: T, value: ResolveInjectableType<T> | AnyInjectable<ResolveInjectableType<T>>): any;
|
|
35
|
+
satisfies(injectable: AnyInjectable): boolean;
|
|
36
|
+
disposeInjectableInstances(injectable: AnyInjectable): Promise<void>;
|
|
37
|
+
disposeInjectableInstance(injectable: AnyInjectable, instance: any, context: any): Promise<void>;
|
|
38
|
+
private createInjectableContext;
|
|
39
|
+
private resolveInjectable;
|
|
40
|
+
private createResolution;
|
|
41
|
+
private createInjectFunction;
|
|
42
|
+
private createDisposeFunction;
|
|
43
|
+
private getDisposalOrder;
|
|
44
|
+
}
|
|
45
|
+
export type InjectFn = ReturnType<Container['createInjectFunction']>;
|
|
46
|
+
export type DisposeFn = ReturnType<Container['createDisposeFunction']>;
|
|
47
|
+
export {};
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import assert from 'node:assert';
|
|
2
|
+
import { tryCaptureStackTrace } from '@nmtjs/common';
|
|
3
|
+
import { Scope } from "./enums.js";
|
|
4
|
+
import { CoreInjectables, compareScope, createValueInjectable, getDepedencencyInjectable, isFactoryInjectable, isInjectable, isLazyInjectable, isOptionalInjectable, isValueInjectable, provide, } from "./injectables.js";
|
|
5
|
+
export class Container {
|
|
6
|
+
runtime;
|
|
7
|
+
scope;
|
|
8
|
+
parent;
|
|
9
|
+
instances = new Map();
|
|
10
|
+
resolvers = new Map();
|
|
11
|
+
injectables = new Set();
|
|
12
|
+
dependants = new Map();
|
|
13
|
+
disposing = false;
|
|
14
|
+
constructor(runtime, scope = Scope.Global, parent) {
|
|
15
|
+
this.runtime = runtime;
|
|
16
|
+
this.scope = scope;
|
|
17
|
+
this.parent = parent;
|
|
18
|
+
if (scope === Scope.Transient) {
|
|
19
|
+
throw new Error('Invalid scope');
|
|
20
|
+
}
|
|
21
|
+
this.provide(CoreInjectables.inject, this.createInjectFunction());
|
|
22
|
+
this.provide(CoreInjectables.dispose, this.createDisposeFunction());
|
|
23
|
+
}
|
|
24
|
+
async initialize(injectables) {
|
|
25
|
+
const measurements = [];
|
|
26
|
+
const traverse = (dependencies) => {
|
|
27
|
+
for (const key in dependencies) {
|
|
28
|
+
const dependency = dependencies[key];
|
|
29
|
+
const injectable = getDepedencencyInjectable(dependency);
|
|
30
|
+
if (injectable.scope === this.scope) {
|
|
31
|
+
this.injectables.add(injectable);
|
|
32
|
+
}
|
|
33
|
+
traverse(injectable.dependencies);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
for (const dependant of injectables) {
|
|
37
|
+
traverse(dependant.dependencies);
|
|
38
|
+
}
|
|
39
|
+
await Promise.all([...this.injectables].map((injectable) => this.resolve(injectable, measurements)));
|
|
40
|
+
return measurements;
|
|
41
|
+
}
|
|
42
|
+
fork(scope) {
|
|
43
|
+
return new Container(this.runtime, scope, this);
|
|
44
|
+
}
|
|
45
|
+
find(scope) {
|
|
46
|
+
if (this.scope === scope) {
|
|
47
|
+
return this;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
return this.parent?.find(scope);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async [Symbol.asyncDispose]() {
|
|
54
|
+
await this.dispose();
|
|
55
|
+
}
|
|
56
|
+
async dispose() {
|
|
57
|
+
this.runtime.logger.trace('Disposing [%s] scope context...', this.scope);
|
|
58
|
+
// Prevent new resolutions during disposal
|
|
59
|
+
this.disposing = true;
|
|
60
|
+
// Get proper disposal order using topological sort
|
|
61
|
+
const disposalOrder = this.getDisposalOrder();
|
|
62
|
+
try {
|
|
63
|
+
// Dispose in the correct order
|
|
64
|
+
for (const injectable of disposalOrder) {
|
|
65
|
+
if (this.instances.has(injectable)) {
|
|
66
|
+
await this.disposeInjectableInstances(injectable);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
this.runtime.logger.fatal({ error }, 'Potential memory leak: error during container disposal');
|
|
72
|
+
}
|
|
73
|
+
this.instances.clear();
|
|
74
|
+
this.injectables.clear();
|
|
75
|
+
this.resolvers.clear();
|
|
76
|
+
this.dependants.clear();
|
|
77
|
+
this.disposing = false;
|
|
78
|
+
}
|
|
79
|
+
containsWithinSelf(injectable) {
|
|
80
|
+
return this.instances.has(injectable) || this.resolvers.has(injectable);
|
|
81
|
+
}
|
|
82
|
+
contains(injectable) {
|
|
83
|
+
return (this.containsWithinSelf(injectable) ||
|
|
84
|
+
(this.parent?.contains(injectable) ?? false));
|
|
85
|
+
}
|
|
86
|
+
get(injectable) {
|
|
87
|
+
if (injectable.scope === Scope.Transient) {
|
|
88
|
+
throw new Error('Cannot get transient injectable directly');
|
|
89
|
+
}
|
|
90
|
+
if (this.instances.has(injectable)) {
|
|
91
|
+
return this.instances.get(injectable).at(0).public;
|
|
92
|
+
}
|
|
93
|
+
if (this.parent?.contains(injectable)) {
|
|
94
|
+
return this.parent.get(injectable);
|
|
95
|
+
}
|
|
96
|
+
throw new Error('No instance found');
|
|
97
|
+
}
|
|
98
|
+
resolve(injectable, measurements) {
|
|
99
|
+
return this.resolveInjectable(injectable, undefined, undefined, measurements);
|
|
100
|
+
}
|
|
101
|
+
async createContext(dependencies) {
|
|
102
|
+
return this.createInjectableContext(dependencies);
|
|
103
|
+
}
|
|
104
|
+
async provide(injectable, ...[value]) {
|
|
105
|
+
const injections = Array.isArray(injectable)
|
|
106
|
+
? injectable
|
|
107
|
+
: [provide(injectable, value)];
|
|
108
|
+
await Promise.all(injections.map(async ({ token, value }) => {
|
|
109
|
+
if (compareScope(token.scope, '>', this.scope)) {
|
|
110
|
+
// TODO: more informative error
|
|
111
|
+
throw new Error('Invalid scope');
|
|
112
|
+
}
|
|
113
|
+
const _value = isInjectable(value) ? await this.resolve(value) : value;
|
|
114
|
+
this.instances.set(token, [
|
|
115
|
+
{ private: _value, public: _value, context: undefined },
|
|
116
|
+
]);
|
|
117
|
+
}));
|
|
118
|
+
}
|
|
119
|
+
satisfies(injectable) {
|
|
120
|
+
return compareScope(injectable.scope, '<=', this.scope);
|
|
121
|
+
}
|
|
122
|
+
async disposeInjectableInstances(injectable) {
|
|
123
|
+
try {
|
|
124
|
+
if (this.instances.has(injectable)) {
|
|
125
|
+
const wrappers = this.instances.get(injectable);
|
|
126
|
+
await Promise.all(wrappers.map((wrapper) => this.disposeInjectableInstance(injectable, wrapper.private, wrapper.context)));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch (cause) {
|
|
130
|
+
const error = new Error('Injectable disposal error. Potential memory leak', { cause });
|
|
131
|
+
this.runtime.logger.error(error);
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
this.instances.delete(injectable);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
async disposeInjectableInstance(injectable, instance, context) {
|
|
138
|
+
if (isFactoryInjectable(injectable)) {
|
|
139
|
+
const { dispose } = injectable;
|
|
140
|
+
if (dispose)
|
|
141
|
+
await dispose(instance, context);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
async createInjectableContext(dependencies, dependant, measurements) {
|
|
145
|
+
const injections = {};
|
|
146
|
+
const deps = Object.entries(dependencies);
|
|
147
|
+
const resolvers = Array(deps.length);
|
|
148
|
+
for (let i = 0; i < deps.length; i++) {
|
|
149
|
+
const [key, dependency] = deps[i];
|
|
150
|
+
const isOptional = isOptionalInjectable(dependency);
|
|
151
|
+
const injectable = getDepedencencyInjectable(dependency);
|
|
152
|
+
const resolver = this.resolveInjectable(injectable, dependant, isOptional, measurements);
|
|
153
|
+
resolvers[i] = resolver.then((value) => (injections[key] = value));
|
|
154
|
+
}
|
|
155
|
+
await Promise.all(resolvers);
|
|
156
|
+
return Object.freeze(injections);
|
|
157
|
+
}
|
|
158
|
+
resolveInjectable(injectable, dependant, isOptional, measurements) {
|
|
159
|
+
if (this.disposing) {
|
|
160
|
+
return Promise.reject(new Error('Cannot resolve during disposal'));
|
|
161
|
+
}
|
|
162
|
+
if (dependant && compareScope(dependant.scope, '<', injectable.scope)) {
|
|
163
|
+
// TODO: more informative error
|
|
164
|
+
return Promise.reject(new Error('Invalid scope: dependant is looser than injectable'));
|
|
165
|
+
}
|
|
166
|
+
if (isValueInjectable(injectable)) {
|
|
167
|
+
return Promise.resolve(injectable.value);
|
|
168
|
+
}
|
|
169
|
+
else if (this.parent?.contains(injectable) ||
|
|
170
|
+
(this.parent?.satisfies(injectable) &&
|
|
171
|
+
compareScope(this.parent.scope, '<', this.scope))) {
|
|
172
|
+
return this.parent.resolveInjectable(injectable, dependant, undefined, measurements);
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
const { stack, label } = injectable;
|
|
176
|
+
if (dependant) {
|
|
177
|
+
let dependants = this.dependants.get(injectable);
|
|
178
|
+
if (!dependants) {
|
|
179
|
+
this.dependants.set(injectable, (dependants = new Set()));
|
|
180
|
+
}
|
|
181
|
+
dependants.add(dependant);
|
|
182
|
+
}
|
|
183
|
+
const isTransient = injectable.scope === Scope.Transient;
|
|
184
|
+
if (!isTransient && this.instances.has(injectable)) {
|
|
185
|
+
return Promise.resolve(this.instances.get(injectable).at(0).public);
|
|
186
|
+
}
|
|
187
|
+
else if (!isTransient && this.resolvers.has(injectable)) {
|
|
188
|
+
return this.resolvers.get(injectable);
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
const isLazy = isLazyInjectable(injectable);
|
|
192
|
+
if (isLazy) {
|
|
193
|
+
if (isOptional)
|
|
194
|
+
return Promise.resolve(undefined);
|
|
195
|
+
return Promise.reject(new Error(`No instance provided for ${label || 'an'} injectable:\n${stack}`));
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
const measure = measurements
|
|
199
|
+
? performance.measure(injectable.label || injectable.stack || '')
|
|
200
|
+
: null;
|
|
201
|
+
const resolution = this.createResolution(injectable, measurements).finally(() => {
|
|
202
|
+
this.resolvers.delete(injectable);
|
|
203
|
+
// biome-ignore lint: false
|
|
204
|
+
// @ts-ignore
|
|
205
|
+
if (measurements && measure)
|
|
206
|
+
measurements.push(measure);
|
|
207
|
+
});
|
|
208
|
+
if (injectable.scope !== Scope.Transient) {
|
|
209
|
+
this.resolvers.set(injectable, resolution);
|
|
210
|
+
}
|
|
211
|
+
return resolution;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
async createResolution(injectable, measurements) {
|
|
217
|
+
const { dependencies } = injectable;
|
|
218
|
+
const context = await this.createInjectableContext(dependencies, injectable, measurements);
|
|
219
|
+
const wrapper = {
|
|
220
|
+
private: null,
|
|
221
|
+
public: null,
|
|
222
|
+
context,
|
|
223
|
+
};
|
|
224
|
+
if (isFactoryInjectable(injectable)) {
|
|
225
|
+
wrapper.private = await Promise.resolve(injectable.factory(wrapper.context));
|
|
226
|
+
wrapper.public = injectable.pick(wrapper.private);
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
throw new Error('Invalid injectable type');
|
|
230
|
+
}
|
|
231
|
+
let instances = this.instances.get(injectable);
|
|
232
|
+
if (!instances) {
|
|
233
|
+
instances = [];
|
|
234
|
+
this.instances.set(injectable, instances);
|
|
235
|
+
}
|
|
236
|
+
instances.push(wrapper);
|
|
237
|
+
return wrapper.public;
|
|
238
|
+
}
|
|
239
|
+
createInjectFunction() {
|
|
240
|
+
const inject = (injectable, context, scope = this.scope) => {
|
|
241
|
+
const container = this.find(scope);
|
|
242
|
+
if (!container)
|
|
243
|
+
throw new Error('No container found for the specified scope');
|
|
244
|
+
const dependencies = { ...injectable.dependencies };
|
|
245
|
+
for (const key in context) {
|
|
246
|
+
const dep = context[key];
|
|
247
|
+
if (isInjectable(dep) || isOptionalInjectable(dep)) {
|
|
248
|
+
dependencies[key] = dep;
|
|
249
|
+
}
|
|
250
|
+
else {
|
|
251
|
+
dependencies[key] = createValueInjectable(dep);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
const newInjectable = {
|
|
255
|
+
...injectable,
|
|
256
|
+
dependencies,
|
|
257
|
+
scope: Scope.Transient,
|
|
258
|
+
stack: tryCaptureStackTrace(1),
|
|
259
|
+
};
|
|
260
|
+
return container.resolve(newInjectable);
|
|
261
|
+
};
|
|
262
|
+
const explicit = async (injectable, context, scope = this.scope) => {
|
|
263
|
+
if ('asyncDispose' in Symbol === false) {
|
|
264
|
+
throw new Error('Symbol.asyncDispose is not supported in this environment');
|
|
265
|
+
}
|
|
266
|
+
const container = this.find(scope);
|
|
267
|
+
if (!container)
|
|
268
|
+
throw new Error('No container found for the specified scope');
|
|
269
|
+
const instance = await inject(injectable, context);
|
|
270
|
+
const dispose = container.createDisposeFunction();
|
|
271
|
+
return {
|
|
272
|
+
instance,
|
|
273
|
+
[Symbol.asyncDispose]: async () => {
|
|
274
|
+
await dispose(injectable, instance);
|
|
275
|
+
},
|
|
276
|
+
};
|
|
277
|
+
};
|
|
278
|
+
return Object.assign(inject, { explicit });
|
|
279
|
+
}
|
|
280
|
+
createDisposeFunction() {
|
|
281
|
+
return async (injectable, instance) => {
|
|
282
|
+
if (injectable.scope === Scope.Transient) {
|
|
283
|
+
assert(instance, 'Instance is required for transient injectable disposal');
|
|
284
|
+
const wrappers = this.instances.get(injectable);
|
|
285
|
+
if (wrappers) {
|
|
286
|
+
for (const wrapper of wrappers) {
|
|
287
|
+
if (wrapper.public === instance) {
|
|
288
|
+
await this.disposeInjectableInstance(injectable, wrapper.private, wrapper.context);
|
|
289
|
+
const index = wrappers.indexOf(wrapper);
|
|
290
|
+
wrappers.splice(index, 1);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
if (wrappers.length === 0) {
|
|
294
|
+
this.instances.delete(injectable);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
await this.disposeInjectableInstances(injectable);
|
|
300
|
+
}
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
getDisposalOrder() {
|
|
304
|
+
const visited = new Set();
|
|
305
|
+
const result = [];
|
|
306
|
+
const visit = (injectable) => {
|
|
307
|
+
if (visited.has(injectable))
|
|
308
|
+
return;
|
|
309
|
+
visited.add(injectable);
|
|
310
|
+
const dependants = this.dependants.get(injectable);
|
|
311
|
+
if (dependants) {
|
|
312
|
+
for (const dependant of dependants) {
|
|
313
|
+
if (this.instances.has(dependant)) {
|
|
314
|
+
visit(dependant);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
// Only add to result if this container owns the instance
|
|
319
|
+
if (this.instances.has(injectable)) {
|
|
320
|
+
result.push(injectable);
|
|
321
|
+
}
|
|
322
|
+
};
|
|
323
|
+
for (const injectable of this.instances.keys()) {
|
|
324
|
+
visit(injectable);
|
|
325
|
+
}
|
|
326
|
+
return result;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=container.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container.js","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"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"}
|
package/dist/enums.d.ts
ADDED
package/dist/enums.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enums.js","sourceRoot":"","sources":["../src/enums.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,KAKX;AALD,WAAY,KAAK;IACf,0BAAiB,CAAA;IACjB,kCAAyB,CAAA;IACzB,sBAAa,CAAA;IACb,gCAAuB,CAAA;AACzB,CAAC,EALW,KAAK,KAAL,KAAK,QAKhB"}
|
package/dist/hooks.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { NestedHooks } from 'hookable';
|
|
2
|
+
import { Hookable } from 'hookable';
|
|
3
|
+
import type { HookTypes } from './types.ts';
|
|
4
|
+
export declare class Hooks<T extends HookTypes = HookTypes> extends Hookable<T> {
|
|
5
|
+
_: {
|
|
6
|
+
config: NestedHooks<T>;
|
|
7
|
+
};
|
|
8
|
+
createSignal<H extends keyof T>(hook: H): {
|
|
9
|
+
controller: AbortController;
|
|
10
|
+
signal: AbortSignal;
|
|
11
|
+
unregister: () => void;
|
|
12
|
+
};
|
|
13
|
+
}
|
package/dist/hooks.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Hookable } from 'hookable';
|
|
2
|
+
export class Hooks extends Hookable {
|
|
3
|
+
_;
|
|
4
|
+
createSignal(hook) {
|
|
5
|
+
const controller = new AbortController();
|
|
6
|
+
const unregister = this.hookOnce(String(hook),
|
|
7
|
+
//@ts-expect-error
|
|
8
|
+
() => controller.abort());
|
|
9
|
+
return { controller, signal: controller.signal, unregister };
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAInC,MAAM,OAAO,KAAuC,SAAQ,QAAW;IACrE,CAAC,CAA6B;IAE9B,YAAY,CACV,IAAO;QAMP,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAC9B,MAAM,CAAC,IAAI,CAAC;QACZ,kBAAkB;QAClB,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CACzB,CAAA;QACD,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,CAAA;IAC9D,CAAC;CACF"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from './constants.ts';
|
|
2
|
+
export * from './container.ts';
|
|
3
|
+
export * from './enums.ts';
|
|
4
|
+
export * from './hooks.ts';
|
|
5
|
+
export * from './injectables.ts';
|
|
6
|
+
export * from './logger.ts';
|
|
7
|
+
export * from './metadata.ts';
|
|
8
|
+
export * from './plugin.ts';
|
|
9
|
+
export * from './types.ts';
|
|
10
|
+
export * from './utils/index.ts';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// // biome-ignore lint/correctness/noUnusedImports: TSC wants it
|
|
2
|
+
// // biome-ignore assist/source/organizeImports: TSC wants it
|
|
3
|
+
// import {} from 'pino'
|
|
4
|
+
export * from "./constants.js";
|
|
5
|
+
export * from "./container.js";
|
|
6
|
+
export * from "./enums.js";
|
|
7
|
+
export * from "./hooks.js";
|
|
8
|
+
export * from "./injectables.js";
|
|
9
|
+
export * from "./logger.js";
|
|
10
|
+
export * from "./metadata.js";
|
|
11
|
+
export * from "./plugin.js";
|
|
12
|
+
export * from "./types.js";
|
|
13
|
+
export * from "./utils/index.js";
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,8DAA8D;AAC9D,wBAAwB;AAExB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,kBAAkB,CAAA;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,kBAAkB,CAAA"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { Async } from '@nmtjs/common';
|
|
2
|
+
import type { Logger } from './logger.ts';
|
|
3
|
+
import { kFactoryInjectable, kInjectable, kLazyInjectable, kOptionalDependency, kValueInjectable } from './constants.ts';
|
|
4
|
+
import { Scope } from './enums.ts';
|
|
5
|
+
export type DependencyOptional<T extends AnyInjectable = AnyInjectable> = {
|
|
6
|
+
[kOptionalDependency]: any;
|
|
7
|
+
injectable: T;
|
|
8
|
+
};
|
|
9
|
+
export type Depedency = DependencyOptional | AnyInjectable;
|
|
10
|
+
export type Dependencies = Record<string, Depedency>;
|
|
11
|
+
export type ResolveInjectableType<T extends AnyInjectable> = T extends Injectable<infer Type, any, any> ? Type : never;
|
|
12
|
+
export interface Dependant<Deps extends Dependencies = Dependencies> {
|
|
13
|
+
dependencies: Deps;
|
|
14
|
+
label?: string;
|
|
15
|
+
stack?: string;
|
|
16
|
+
}
|
|
17
|
+
export type DependencyInjectable<T extends Depedency> = T extends AnyInjectable ? T : T extends DependencyOptional ? T['injectable'] : never;
|
|
18
|
+
export type DependencyContext<Deps extends Dependencies> = {
|
|
19
|
+
readonly [K in keyof Deps as Deps[K] extends AnyInjectable ? K : never]: Deps[K] extends AnyInjectable ? ResolveInjectableType<Deps[K]> : never;
|
|
20
|
+
} & {
|
|
21
|
+
readonly [K in keyof Deps as Deps[K] extends DependencyOptional ? K : never]?: Deps[K] extends DependencyOptional ? ResolveInjectableType<Deps[K]['injectable']> : never;
|
|
22
|
+
};
|
|
23
|
+
export type InjectableFactoryType<InjectableType, InjectableDeps extends Dependencies> = (context: DependencyContext<InjectableDeps>) => Async<InjectableType>;
|
|
24
|
+
export type InjectablePickType<Input, Output> = (injectable: Input) => Output;
|
|
25
|
+
export type InjectableDisposeType<InjectableType, InjectableDeps extends Dependencies> = (instance: InjectableType, context: DependencyContext<InjectableDeps>) => any;
|
|
26
|
+
export interface LazyInjectable<T, S extends Scope = Scope.Global> extends Dependant<{}> {
|
|
27
|
+
scope: S;
|
|
28
|
+
$withType<O extends T>(): LazyInjectable<O, S>;
|
|
29
|
+
optional(): DependencyOptional<LazyInjectable<T, S>>;
|
|
30
|
+
[kInjectable]: any;
|
|
31
|
+
[kLazyInjectable]: T;
|
|
32
|
+
}
|
|
33
|
+
export interface ValueInjectable<T> extends Dependant<{}> {
|
|
34
|
+
scope: Scope.Global;
|
|
35
|
+
value: T;
|
|
36
|
+
[kInjectable]: any;
|
|
37
|
+
[kValueInjectable]: any;
|
|
38
|
+
}
|
|
39
|
+
export interface FactoryInjectable<T, D extends Dependencies = {}, S extends Scope = Scope.Global, P = T> extends Dependant<D> {
|
|
40
|
+
scope: S;
|
|
41
|
+
factory: InjectableFactoryType<P, D>;
|
|
42
|
+
pick: InjectablePickType<P, T>;
|
|
43
|
+
dispose?: InjectableDisposeType<P, D>;
|
|
44
|
+
optional(): DependencyOptional<FactoryInjectable<T, D, S, P>>;
|
|
45
|
+
[kInjectable]: any;
|
|
46
|
+
[kFactoryInjectable]: any;
|
|
47
|
+
}
|
|
48
|
+
export type Injectable<V = any, D extends Dependencies = {}, S extends Scope = Scope> = LazyInjectable<V, S> | ValueInjectable<V> | FactoryInjectable<V, D, S, any>;
|
|
49
|
+
export type AnyInjectable<T = any, S extends Scope = Scope> = Injectable<T, any, S>;
|
|
50
|
+
export declare const isLazyInjectable: (injectable: any) => injectable is LazyInjectable<any>;
|
|
51
|
+
export declare const isFactoryInjectable: (injectable: any) => injectable is FactoryInjectable<any>;
|
|
52
|
+
export declare const isValueInjectable: (injectable: any) => injectable is ValueInjectable<any>;
|
|
53
|
+
export declare const isInjectable: (injectable: any) => injectable is AnyInjectable<any>;
|
|
54
|
+
export declare const isOptionalInjectable: (injectable: any) => injectable is DependencyOptional<any>;
|
|
55
|
+
export declare function getInjectableScope(injectable: AnyInjectable): Scope;
|
|
56
|
+
export declare function getDepedencencyInjectable(dependency: Depedency): AnyInjectable;
|
|
57
|
+
export declare function createOptionalInjectable<T extends AnyInjectable>(injectable: T): DependencyOptional<T>;
|
|
58
|
+
export declare function createLazyInjectable<T, S extends Scope = Scope.Global>(scope?: S, label?: string, stackTraceDepth?: number): LazyInjectable<T, S>;
|
|
59
|
+
export declare function createValueInjectable<T>(value: T, label?: string, stackTraceDepth?: number): ValueInjectable<T>;
|
|
60
|
+
export declare function createFactoryInjectable<T, D extends Dependencies = {}, S extends Scope = Scope.Global, P = T>(paramsOrFactory: {
|
|
61
|
+
dependencies?: D;
|
|
62
|
+
scope?: S;
|
|
63
|
+
pick?: InjectablePickType<P, T>;
|
|
64
|
+
factory: InjectableFactoryType<P, D>;
|
|
65
|
+
dispose?: InjectableDisposeType<P, D>;
|
|
66
|
+
} | InjectableFactoryType<P, D>, label?: string, stackTraceDepth?: number): FactoryInjectable<null extends T ? P : T, D, S, P>;
|
|
67
|
+
export type DependenciesSubstitution<T extends Dependencies> = {
|
|
68
|
+
[K in keyof T]?: T[K] extends AnyInjectable<infer Type> ? AnyInjectable<Type> | DependenciesSubstitution<T[K]['dependencies']> : never;
|
|
69
|
+
};
|
|
70
|
+
export declare function substitute<T extends FactoryInjectable<any, any, Scope>>(injectable: T, substitution: DependenciesSubstitution<T['dependencies']>, stackTraceDepth?: number): T;
|
|
71
|
+
export declare function compareScope(left: Scope, operator: '>' | '<' | '>=' | '<=' | '=' | '!=', right: Scope): boolean;
|
|
72
|
+
export declare const CoreInjectables: {
|
|
73
|
+
logger: ((label: string) => FactoryInjectable<Logger, {
|
|
74
|
+
logger: LazyInjectable<Logger>;
|
|
75
|
+
}>) & LazyInjectable<Logger, Scope.Global>;
|
|
76
|
+
inject: LazyInjectable<(<T extends AnyInjectable>(injectable: T, context: { [K in keyof T["dependencies"]]?: ResolveInjectableType<T["dependencies"][K]> | AnyInjectable<ResolveInjectableType<T["dependencies"][K]>> | undefined; }, scope?: Exclude<Scope, Scope.Transient>) => Promise<ResolveInjectableType<T>>) & {
|
|
77
|
+
explicit: <T extends AnyInjectable>(injectable: T, context: { [K in keyof T["dependencies"]]?: ResolveInjectableType<T["dependencies"][K]> | AnyInjectable<ResolveInjectableType<T["dependencies"][K]>> | undefined; }, scope?: Exclude<Scope, Scope.Transient>) => Promise<{
|
|
78
|
+
instance: Awaited<ResolveInjectableType<T>>;
|
|
79
|
+
[Symbol.asyncDispose]: () => Promise<void>;
|
|
80
|
+
}>;
|
|
81
|
+
}, Scope.Global>;
|
|
82
|
+
dispose: LazyInjectable<(<T extends AnyInjectable>(injectable: T, instance?: any) => Promise<void>), Scope.Global>;
|
|
83
|
+
};
|
|
84
|
+
export type Injection<T extends AnyInjectable<any, any> = AnyInjectable<any, any>> = {
|
|
85
|
+
token: T;
|
|
86
|
+
value: T extends AnyInjectable<infer R, Scope> ? R | AnyInjectable<R> : never;
|
|
87
|
+
};
|
|
88
|
+
export declare const provide: <T extends AnyInjectable<any, any>, V extends T extends AnyInjectable<infer R, Scope> ? R | AnyInjectable<R> : never>(token: T, value: V) => Injection<T>;
|