ts-ioc-container 18.0.4 → 19.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 +13 -15
- package/cjm/automock/AutoMockedContainer.d.ts +1 -0
- package/cjm/automock/AutoMockedContainer.js +3 -0
- package/cjm/automock/AutoMockedContainer.js.map +1 -1
- package/cjm/core/IInjector.d.ts +3 -16
- package/cjm/core/IInjector.js +0 -48
- package/cjm/core/IInjector.js.map +1 -1
- package/cjm/core/container/Container.d.ts +4 -2
- package/cjm/core/container/Container.js +43 -10
- package/cjm/core/container/Container.js.map +1 -1
- package/cjm/core/container/EmptyContainer.d.ts +1 -0
- package/cjm/core/container/EmptyContainer.js +1 -0
- package/cjm/core/container/EmptyContainer.js.map +1 -1
- package/cjm/core/container/IContainer.d.ts +3 -2
- package/cjm/index.d.ts +1 -1
- package/cjm/index.js +3 -3
- package/cjm/index.js.map +1 -1
- package/esm/automock/AutoMockedContainer.d.ts +1 -0
- package/esm/automock/AutoMockedContainer.js +3 -0
- package/esm/automock/AutoMockedContainer.js.map +1 -1
- package/esm/core/IInjector.d.ts +3 -16
- package/esm/core/IInjector.js +1 -16
- package/esm/core/IInjector.js.map +1 -1
- package/esm/core/container/Container.d.ts +4 -2
- package/esm/core/container/Container.js +21 -9
- package/esm/core/container/Container.js.map +1 -1
- package/esm/core/container/EmptyContainer.d.ts +1 -0
- package/esm/core/container/EmptyContainer.js +1 -0
- package/esm/core/container/EmptyContainer.js.map +1 -1
- package/esm/core/container/IContainer.d.ts +3 -2
- package/esm/index.d.ts +1 -1
- package/esm/index.js +1 -1
- package/esm/index.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -12,8 +12,6 @@
|
|
|
12
12
|
- supports scopes
|
|
13
13
|
- fully test covered
|
|
14
14
|
- can be used with decorators `@inject`
|
|
15
|
-
- provides auto-factories
|
|
16
|
-
- supports `onConstruct` and `dispose` instance hooks
|
|
17
15
|
- composable and open to extend
|
|
18
16
|
- awesome for testing (auto mocks)
|
|
19
17
|
|
|
@@ -40,12 +38,12 @@ yarn add ts-ioc-container ts-constructor-injector reflect-metadata
|
|
|
40
38
|
How to create new container
|
|
41
39
|
|
|
42
40
|
```typescript
|
|
43
|
-
import { Container, IInjector, ProviderBuilder } from "ts-ioc-container";
|
|
41
|
+
import { Container, IContainer, IInjector, ProviderBuilder } from "ts-ioc-container";
|
|
44
42
|
import { resolve } from 'ts-constructor-injector';
|
|
45
43
|
|
|
46
44
|
const injector: IInjector = {
|
|
47
|
-
resolve<T>(
|
|
48
|
-
return resolve(
|
|
45
|
+
resolve<T>(container: IContainer, value: constructor<T>, ...deps: unknown[]): T {
|
|
46
|
+
return resolve(container)(value, ...deps);
|
|
49
47
|
},
|
|
50
48
|
};
|
|
51
49
|
const container = new Container(injector);
|
|
@@ -58,8 +56,9 @@ const logger = container.resolve<ILogger>('ILogger');
|
|
|
58
56
|
```typescript
|
|
59
57
|
import { fromClass, ProviderBuilder } from "ts-ioc-container";
|
|
60
58
|
|
|
59
|
+
const container = new Container(injector, {tags: ['root']});
|
|
61
60
|
container.register('ILogger', new ProviderBuilder((container, ...args) => new Logger(...args)).build());
|
|
62
|
-
container.register('ILogger1', ProviderBuilder.fromClass(Logger).forKey('ILogger').asSingleton().
|
|
61
|
+
container.register('ILogger1', ProviderBuilder.fromClass(Logger).forKey('ILogger').asSingleton().forTags(['root']).build()); // global singleton
|
|
63
62
|
container.register('ILogger3', ProviderBuilder.fromClass(Logger).asSingleton().forTags(['tag1', 'tag2']).build()); // singleton for scope with tag1 or tag2
|
|
64
63
|
container.register('ILogger4', ProviderBuilder.fromClass(Logger).withArgs('dev').asSingleton().build()); // singleton in every scope
|
|
65
64
|
```
|
|
@@ -107,15 +106,15 @@ class Logger {
|
|
|
107
106
|
}
|
|
108
107
|
}
|
|
109
108
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
109
|
+
const injector: IInjector = {
|
|
110
|
+
resolve<T>(container: IContainer, value: constructor<T>, ...deps: unknown[]): T {
|
|
111
|
+
const instance = resolve(container)(value, ...deps);
|
|
112
|
+
onConstructReflector.invokeHooksOf(instance)
|
|
113
|
+
return instance;
|
|
114
|
+
},
|
|
116
115
|
}
|
|
117
116
|
|
|
118
|
-
const container = new Container(
|
|
117
|
+
const container = new Container(injector);
|
|
119
118
|
container.register('ILogger', ProviderBuilder.fromClass(Logger).build());
|
|
120
119
|
const logger = container.resolve<ILogger>('ILogger');
|
|
121
120
|
for (const instance of container.getInstances()) {
|
|
@@ -140,7 +139,6 @@ scope.dispose();
|
|
|
140
139
|
import {
|
|
141
140
|
IMockRepository,
|
|
142
141
|
Container,
|
|
143
|
-
SimpleInjector,
|
|
144
142
|
} from "ts-ioc-container";
|
|
145
143
|
import { Mock } from "moq.ts";
|
|
146
144
|
|
|
@@ -165,7 +163,7 @@ export class MoqRepository implements IMockRepository {
|
|
|
165
163
|
|
|
166
164
|
describe('test', () => {
|
|
167
165
|
const mockRepository = new MoqRepository();
|
|
168
|
-
const container = new Container(
|
|
166
|
+
const container = new Container(injector).map((l) => new AutoMockedContainer(l, mockRepository));
|
|
169
167
|
|
|
170
168
|
const engineMock = mockRepository.resolveMock<IEngine>('IEngine');
|
|
171
169
|
engineMock.setup(i => i.getRegistrationNumber()).return('123');
|
|
@@ -65,6 +65,9 @@ var AutoMockedContainer = /** @class */ (function () {
|
|
|
65
65
|
AutoMockedContainer.prototype.getInstances = function () {
|
|
66
66
|
return this.decorated.getInstances();
|
|
67
67
|
};
|
|
68
|
+
AutoMockedContainer.prototype.removeScope = function (child) {
|
|
69
|
+
return this.decorated.removeScope(child);
|
|
70
|
+
};
|
|
68
71
|
return AutoMockedContainer;
|
|
69
72
|
}());
|
|
70
73
|
exports.AutoMockedContainer = AutoMockedContainer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AutoMockedContainer.js","sourceRoot":"","sources":["../../lib/automock/AutoMockedContainer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kCAA6F;AAG7F;IACI,6BAAoB,SAAqB,EAAU,cAA+B;QAA9D,cAAS,GAAT,SAAS,CAAY;QAAU,mBAAc,GAAd,cAAc,CAAiB;IAAG,CAAC;IAEtF,yCAAW,GAAX,UAAY,IAAY,EAAE,MAAyB;QAAzB,uBAAA,EAAA,aAAyB;QAC/C,OAAO,IAAI,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAClG,CAAC;IAED,qCAAO,GAAP,UAAW,GAAsB;;QAAE,cAAc;aAAd,UAAc,EAAd,qBAAc,EAAd,IAAc;YAAd,6BAAc;;QAC7C,IAAI;YACA,OAAO,CAAA,KAAA,IAAI,CAAC,SAAS,CAAA,CAAC,OAAO,0BAAC,GAAG,UAAK,IAAI,WAAE;SAC/C;QAAC,OAAO,CAAC,EAAE;YACR,IAAI,CAAC,YAAY,6BAAqB,EAAE;gBACpC,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAI,GAAG,CAAC,CAAC;aAC9C;YAED,MAAM,CAAC,CAAC;SACX;IACL,CAAC;IAED,qCAAO,GAAP;QACI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;IAClC,CAAC;IAED,0CAAY,GAAZ;QACI,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;IACzC,CAAC;IAED,sCAAQ,GAAR,UAAS,QAA4B;QACjC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,0CAAY,GAAZ;QACI,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;IACzC,CAAC;IACL,0BAAC;AAAD,CAAC,
|
|
1
|
+
{"version":3,"file":"AutoMockedContainer.js","sourceRoot":"","sources":["../../lib/automock/AutoMockedContainer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kCAA6F;AAG7F;IACI,6BAAoB,SAAqB,EAAU,cAA+B;QAA9D,cAAS,GAAT,SAAS,CAAY;QAAU,mBAAc,GAAd,cAAc,CAAiB;IAAG,CAAC;IAEtF,yCAAW,GAAX,UAAY,IAAY,EAAE,MAAyB;QAAzB,uBAAA,EAAA,aAAyB;QAC/C,OAAO,IAAI,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAClG,CAAC;IAED,qCAAO,GAAP,UAAW,GAAsB;;QAAE,cAAc;aAAd,UAAc,EAAd,qBAAc,EAAd,IAAc;YAAd,6BAAc;;QAC7C,IAAI;YACA,OAAO,CAAA,KAAA,IAAI,CAAC,SAAS,CAAA,CAAC,OAAO,0BAAC,GAAG,UAAK,IAAI,WAAE;SAC/C;QAAC,OAAO,CAAC,EAAE;YACR,IAAI,CAAC,YAAY,6BAAqB,EAAE;gBACpC,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAI,GAAG,CAAC,CAAC;aAC9C;YAED,MAAM,CAAC,CAAC;SACX;IACL,CAAC;IAED,qCAAO,GAAP;QACI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;IAClC,CAAC;IAED,0CAAY,GAAZ;QACI,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;IACzC,CAAC;IAED,sCAAQ,GAAR,UAAS,QAA4B;QACjC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,0CAAY,GAAZ;QACI,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;IACzC,CAAC;IAED,yCAAW,GAAX,UAAY,KAAiB;QACzB,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;IACL,0BAAC;AAAD,CAAC,AAvCD,IAuCC;AAvCY,kDAAmB"}
|
package/cjm/core/IInjector.d.ts
CHANGED
|
@@ -1,18 +1,5 @@
|
|
|
1
|
-
import { constructor
|
|
1
|
+
import { constructor } from './utils/types';
|
|
2
2
|
import { IContainer } from './container/IContainer';
|
|
3
|
-
export
|
|
4
|
-
|
|
5
|
-
getInstances(): unknown[];
|
|
6
|
-
}
|
|
7
|
-
export interface IInjector extends Disposable, Traversable {
|
|
8
|
-
resolve<T>(container: IContainer, value: constructor<T>, ...deps: any[]): T;
|
|
9
|
-
clone(): IInjector;
|
|
10
|
-
}
|
|
11
|
-
export declare abstract class Injector implements IInjector {
|
|
12
|
-
private values;
|
|
13
|
-
abstract clone(): IInjector;
|
|
14
|
-
getInstances(): unknown[];
|
|
15
|
-
dispose(): void;
|
|
16
|
-
resolve<T>(container: IContainer, value: constructor<T>, ...deps: any[]): T;
|
|
17
|
-
protected abstract resolver<T>(container: IContainer, value: constructor<T>, ...args: any[]): T;
|
|
3
|
+
export interface IInjector {
|
|
4
|
+
resolve<T>(container: IContainer, value: constructor<T>, ...deps: unknown[]): T;
|
|
18
5
|
}
|
package/cjm/core/IInjector.js
CHANGED
|
@@ -1,51 +1,3 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __read = (this && this.__read) || function (o, n) {
|
|
3
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
4
|
-
if (!m) return o;
|
|
5
|
-
var i = m.call(o), r, ar = [], e;
|
|
6
|
-
try {
|
|
7
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
8
|
-
}
|
|
9
|
-
catch (error) { e = { error: error }; }
|
|
10
|
-
finally {
|
|
11
|
-
try {
|
|
12
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
13
|
-
}
|
|
14
|
-
finally { if (e) throw e.error; }
|
|
15
|
-
}
|
|
16
|
-
return ar;
|
|
17
|
-
};
|
|
18
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
19
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
20
|
-
if (ar || !(i in from)) {
|
|
21
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
22
|
-
ar[i] = from[i];
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
26
|
-
};
|
|
27
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
-
exports.Injector = void 0;
|
|
29
|
-
var Injector = /** @class */ (function () {
|
|
30
|
-
function Injector() {
|
|
31
|
-
this.values = [];
|
|
32
|
-
}
|
|
33
|
-
Injector.prototype.getInstances = function () {
|
|
34
|
-
return this.values;
|
|
35
|
-
};
|
|
36
|
-
Injector.prototype.dispose = function () {
|
|
37
|
-
this.values = [];
|
|
38
|
-
};
|
|
39
|
-
Injector.prototype.resolve = function (container, value) {
|
|
40
|
-
var deps = [];
|
|
41
|
-
for (var _i = 2; _i < arguments.length; _i++) {
|
|
42
|
-
deps[_i - 2] = arguments[_i];
|
|
43
|
-
}
|
|
44
|
-
var instance = this.resolver.apply(this, __spreadArray([container, value], __read(deps), false));
|
|
45
|
-
this.values.push(instance);
|
|
46
|
-
return instance;
|
|
47
|
-
};
|
|
48
|
-
return Injector;
|
|
49
|
-
}());
|
|
50
|
-
exports.Injector = Injector;
|
|
51
3
|
//# sourceMappingURL=IInjector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IInjector.js","sourceRoot":"","sources":["../../lib/core/IInjector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"IInjector.js","sourceRoot":"","sources":["../../lib/core/IInjector.ts"],"names":[],"mappings":""}
|
|
@@ -7,16 +7,18 @@ export declare class Container implements IContainer, Tagged {
|
|
|
7
7
|
readonly tags: Tag[];
|
|
8
8
|
private isDisposed;
|
|
9
9
|
private parent;
|
|
10
|
+
private children;
|
|
11
|
+
private instances;
|
|
10
12
|
constructor(injector: IInjector, options?: {
|
|
11
13
|
parent?: IContainer;
|
|
12
14
|
tags?: Tag[];
|
|
13
15
|
});
|
|
14
16
|
register(provider: IProvider<unknown>): this;
|
|
15
17
|
resolve<T>(key: InjectionToken<T>, ...args: any[]): T;
|
|
16
|
-
createScope(tags?: Tag[]
|
|
18
|
+
createScope(tags?: Tag[]): Container;
|
|
17
19
|
dispose(): void;
|
|
18
20
|
getProviders(): IProvider<unknown>[];
|
|
19
21
|
getInstances(): unknown[];
|
|
20
|
-
|
|
22
|
+
removeScope(child: IContainer): void;
|
|
21
23
|
private validateContainer;
|
|
22
24
|
}
|
|
@@ -48,6 +48,8 @@ var Container = /** @class */ (function () {
|
|
|
48
48
|
this.injector = injector;
|
|
49
49
|
this.providers = new ProviderRepo_1.ProviderRepo();
|
|
50
50
|
this.isDisposed = false;
|
|
51
|
+
this.children = new Set();
|
|
52
|
+
this.instances = new Set();
|
|
51
53
|
this.parent = (_a = options.parent) !== null && _a !== void 0 ? _a : new EmptyContainer_1.EmptyContainer();
|
|
52
54
|
this.tags = (_b = options.tags) !== null && _b !== void 0 ? _b : [];
|
|
53
55
|
}
|
|
@@ -67,16 +69,17 @@ var Container = /** @class */ (function () {
|
|
|
67
69
|
var provider = this.providers.get(key);
|
|
68
70
|
return (provider === null || provider === void 0 ? void 0 : provider.isValid(this)) ? provider.resolve.apply(provider, __spreadArray([this], __read(args), false)) : (_a = this.parent).resolve.apply(_a, __spreadArray([key], __read(args), false));
|
|
69
71
|
}
|
|
70
|
-
|
|
72
|
+
var instance = (_b = this.injector).resolve.apply(_b, __spreadArray([this, key], __read(args), false));
|
|
73
|
+
this.instances.add(instance);
|
|
74
|
+
return instance;
|
|
71
75
|
};
|
|
72
|
-
Container.prototype.createScope = function (tags
|
|
76
|
+
Container.prototype.createScope = function (tags) {
|
|
73
77
|
var e_1, _a;
|
|
74
78
|
if (tags === void 0) { tags = []; }
|
|
75
|
-
if (parent === void 0) { parent = this; }
|
|
76
79
|
this.validateContainer();
|
|
77
|
-
var scope = new Container(this.injector
|
|
80
|
+
var scope = new Container(this.injector, { parent: this, tags: tags });
|
|
78
81
|
try {
|
|
79
|
-
for (var _b = __values(
|
|
82
|
+
for (var _b = __values(this.getProviders().filter(function (p) { return p.isValid(scope); })), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
80
83
|
var provider = _c.value;
|
|
81
84
|
scope.register(provider.clone());
|
|
82
85
|
}
|
|
@@ -88,23 +91,53 @@ var Container = /** @class */ (function () {
|
|
|
88
91
|
}
|
|
89
92
|
finally { if (e_1) throw e_1.error; }
|
|
90
93
|
}
|
|
94
|
+
this.children.add(scope);
|
|
91
95
|
return scope;
|
|
92
96
|
};
|
|
93
97
|
Container.prototype.dispose = function () {
|
|
98
|
+
var e_2, _a;
|
|
94
99
|
this.isDisposed = true;
|
|
100
|
+
this.parent.removeScope(this);
|
|
95
101
|
this.parent = new EmptyContainer_1.EmptyContainer();
|
|
102
|
+
try {
|
|
103
|
+
for (var _b = __values(this.children), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
104
|
+
var child = _c.value;
|
|
105
|
+
child.dispose();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
109
|
+
finally {
|
|
110
|
+
try {
|
|
111
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
112
|
+
}
|
|
113
|
+
finally { if (e_2) throw e_2.error; }
|
|
114
|
+
}
|
|
96
115
|
this.providers.dispose();
|
|
97
|
-
this.
|
|
116
|
+
this.instances.clear();
|
|
98
117
|
};
|
|
99
118
|
Container.prototype.getProviders = function () {
|
|
100
119
|
return this.providers.merge(this.parent.getProviders());
|
|
101
120
|
};
|
|
102
121
|
Container.prototype.getInstances = function () {
|
|
103
|
-
|
|
122
|
+
var e_3, _a;
|
|
123
|
+
var instances = Array.from(this.instances);
|
|
124
|
+
try {
|
|
125
|
+
for (var _b = __values(this.children), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
126
|
+
var child = _c.value;
|
|
127
|
+
instances = instances.concat(child.getInstances());
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
131
|
+
finally {
|
|
132
|
+
try {
|
|
133
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
134
|
+
}
|
|
135
|
+
finally { if (e_3) throw e_3.error; }
|
|
136
|
+
}
|
|
137
|
+
return instances;
|
|
104
138
|
};
|
|
105
|
-
Container.prototype.
|
|
106
|
-
this.
|
|
107
|
-
return transform(this);
|
|
139
|
+
Container.prototype.removeScope = function (child) {
|
|
140
|
+
this.children.delete(child);
|
|
108
141
|
};
|
|
109
142
|
Container.prototype.validateContainer = function () {
|
|
110
143
|
ContainerDisposedError_1.ContainerDisposedError.assert(!this.isDisposed, 'Container is already disposed');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Container.js","sourceRoot":"","sources":["../../../lib/core/container/Container.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,mDAA8E;AAC9E,mDAAkD;AAClD,yDAAwD;AACxD,mEAAkE;AAElE;
|
|
1
|
+
{"version":3,"file":"Container.js","sourceRoot":"","sources":["../../../lib/core/container/Container.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,6 +24,7 @@ var EmptyContainer = /** @class */ (function () {
|
|
|
24
24
|
EmptyContainer.prototype.getInstances = function () {
|
|
25
25
|
return [];
|
|
26
26
|
};
|
|
27
|
+
EmptyContainer.prototype.removeScope = function () { };
|
|
27
28
|
return EmptyContainer;
|
|
28
29
|
}());
|
|
29
30
|
exports.EmptyContainer = EmptyContainer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmptyContainer.js","sourceRoot":"","sources":["../../../lib/core/container/EmptyContainer.ts"],"names":[],"mappings":";;;AACA,gFAA+E;AAC/E,2EAA0E;AAG1E;IAAA;
|
|
1
|
+
{"version":3,"file":"EmptyContainer.js","sourceRoot":"","sources":["../../../lib/core/container/EmptyContainer.ts"],"names":[],"mappings":";;;AACA,gFAA+E;AAC/E,2EAA0E;AAG1E;IAAA;IA0BA,CAAC;IAzBG,oCAAW,GAAX;QACI,MAAM,IAAI,qDAAyB,EAAE,CAAC;IAC1C,CAAC;IAED,gCAAO,GAAP;QACI,MAAM,IAAI,qDAAyB,EAAE,CAAC;IAC1C,CAAC;IAED,iCAAQ,GAAR;QACI,MAAM,IAAI,qDAAyB,EAAE,CAAC;IAC1C,CAAC;IAED,gCAAO,GAAP,UAAW,GAAsB;QAC7B,MAAM,IAAI,6CAAqB,CAAC,iBAAe,GAAG,CAAC,QAAQ,EAAI,CAAC,CAAC;IACrE,CAAC;IAED,qCAAY,GAAZ;QACI,OAAO,EAAE,CAAC;IACd,CAAC;IAED,qCAAY,GAAZ;QACI,OAAO,EAAE,CAAC;IACd,CAAC;IAED,oCAAW,GAAX,cAAqB,CAAC;IAC1B,qBAAC;AAAD,CAAC,AA1BD,IA0BC;AA1BY,wCAAc"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { IProvider, ProviderKey, Tag } from '../provider/IProvider';
|
|
2
2
|
import { constructor, Disposable } from '../utils/types';
|
|
3
|
-
import { Traversable } from '../IInjector';
|
|
4
3
|
export declare type InjectionToken<T = any> = constructor<T> | ProviderKey;
|
|
5
4
|
export interface Resolveable {
|
|
6
5
|
resolve<T>(key: InjectionToken<T>, ...args: any[]): T;
|
|
7
6
|
}
|
|
8
|
-
export interface IContainer extends Disposable, Resolveable
|
|
7
|
+
export interface IContainer extends Disposable, Resolveable {
|
|
9
8
|
createScope(tags?: Tag[], parent?: IContainer): IContainer;
|
|
10
9
|
register(provider: IProvider<unknown>): this;
|
|
11
10
|
getProviders(): IProvider<unknown>[];
|
|
11
|
+
removeScope(child: IContainer): void;
|
|
12
|
+
getInstances(): unknown[];
|
|
12
13
|
}
|
package/cjm/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { IContainer, InjectionToken } from './core/container/IContainer';
|
|
2
2
|
export { ProviderReducer } from './core/provider/IProviderReflector';
|
|
3
3
|
export { IContainer, Resolveable } from './core/container/IContainer';
|
|
4
|
+
export { EmptyContainer } from './core/container/EmptyContainer';
|
|
4
5
|
export { constructor } from './core/utils/types';
|
|
5
6
|
export { Container } from './core/container/Container';
|
|
6
7
|
export { Tagged, ResolveDependency, Tag, IProvider } from './core/provider/IProvider';
|
|
@@ -27,5 +28,4 @@ export { isProviderKey } from './core/provider/IProvider';
|
|
|
27
28
|
export { perTags } from './providers/TaggedProvider';
|
|
28
29
|
export { asSingleton } from './providers/SingletonProvider';
|
|
29
30
|
export { forKey } from './core/provider/Provider';
|
|
30
|
-
export { VisitInstance, Injector } from './core/IInjector';
|
|
31
31
|
export declare const by: <T>(key: InjectionToken<T>, ...args: unknown[]) => (l: IContainer) => T;
|
package/cjm/index.js
CHANGED
|
@@ -25,7 +25,9 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
|
25
25
|
return to.concat(ar || Array.prototype.slice.call(from));
|
|
26
26
|
};
|
|
27
27
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
28
|
-
exports.by = exports.
|
|
28
|
+
exports.by = exports.forKey = exports.asSingleton = exports.perTags = exports.isProviderKey = exports.ProviderReflector = exports.ProviderBuilder = exports.SingletonProvider = exports.AutoMockedContainer = exports.TaggedProvider = exports.createArgsFnDecorator = exports.ArgsProvider = exports.Provider = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.ProviderNotFoundError = exports.AsyncMethodReflector = exports.MethodReflector = exports.Container = exports.EmptyContainer = void 0;
|
|
29
|
+
var EmptyContainer_1 = require("./core/container/EmptyContainer");
|
|
30
|
+
Object.defineProperty(exports, "EmptyContainer", { enumerable: true, get: function () { return EmptyContainer_1.EmptyContainer; } });
|
|
29
31
|
var Container_1 = require("./core/container/Container");
|
|
30
32
|
Object.defineProperty(exports, "Container", { enumerable: true, get: function () { return Container_1.Container; } });
|
|
31
33
|
var MethodReflector_1 = require("./hooks/MethodReflector");
|
|
@@ -61,8 +63,6 @@ var SingletonProvider_2 = require("./providers/SingletonProvider");
|
|
|
61
63
|
Object.defineProperty(exports, "asSingleton", { enumerable: true, get: function () { return SingletonProvider_2.asSingleton; } });
|
|
62
64
|
var Provider_2 = require("./core/provider/Provider");
|
|
63
65
|
Object.defineProperty(exports, "forKey", { enumerable: true, get: function () { return Provider_2.forKey; } });
|
|
64
|
-
var IInjector_1 = require("./core/IInjector");
|
|
65
|
-
Object.defineProperty(exports, "Injector", { enumerable: true, get: function () { return IInjector_1.Injector; } });
|
|
66
66
|
var by = function (key) {
|
|
67
67
|
var args = [];
|
|
68
68
|
for (var _i = 1; _i < arguments.length; _i++) {
|
package/cjm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,kEAAiE;AAAxD,gHAAA,cAAc,OAAA;AAEvB,wDAAuD;AAA9C,sGAAA,SAAS,OAAA;AAIlB,2DAA0D;AAAjD,kHAAA,eAAe,OAAA;AACxB,qEAAoE;AAA3D,4HAAA,oBAAoB,OAAA;AAE7B,+EAA8E;AAArE,8HAAA,qBAAqB,OAAA;AAC9B,oFAAmF;AAA1E,sIAAA,yBAAyB,OAAA;AAClC,kFAAiF;AAAxE,gIAAA,sBAAsB,OAAA;AAC/B,qDAAoD;AAA3C,oGAAA,QAAQ,OAAA;AACjB,yDAAuF;AAA9E,4GAAA,YAAY,OAAA;AAAU,qHAAA,qBAAqB,OAAA;AACpD,6DAA4D;AAAnD,gHAAA,cAAc,OAAA;AAEvB,sEAAqE;AAA5D,0HAAA,mBAAmB,OAAA;AAC5B,mEAAkE;AAAzD,sHAAA,iBAAiB,OAAA;AAC1B,+DAA8D;AAArD,kHAAA,eAAe,OAAA;AAExB,uEAAsE;AAA7D,sHAAA,iBAAiB,OAAA;AAG1B,uDAA0D;AAAjD,0GAAA,aAAa,OAAA;AACtB,6DAAqD;AAA5C,yGAAA,OAAO,OAAA;AAChB,mEAA4D;AAAnD,gHAAA,WAAW,OAAA;AACpB,qDAAkD;AAAzC,kGAAA,MAAM,OAAA;AAER,IAAM,EAAE,GACX,UAAI,GAAsB;IAAE,cAAkB;SAAlB,UAAkB,EAAlB,qBAAkB,EAAlB,IAAkB;QAAlB,6BAAkB;;IAC9C,OAAA,UAAC,CAAa;QACV,OAAA,CAAC,CAAC,OAAO,OAAT,CAAC,iBAAY,GAAG,UAAK,IAAI;IAAzB,CAA0B;AAD9B,CAC8B,CAAC;AAHtB,QAAA,EAAE,MAGoB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AutoMockedContainer.js","sourceRoot":"","sources":["../../lib/automock/AutoMockedContainer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyC,qBAAqB,EAAO,MAAM,UAAU,CAAC;AAG7F,MAAM,OAAO,mBAAmB;IAC5B,YAAoB,SAAqB,EAAU,cAA+B;QAA9D,cAAS,GAAT,SAAS,CAAY;QAAU,mBAAc,GAAd,cAAc,CAAiB;IAAG,CAAC;IAEtF,WAAW,CAAC,IAAY,EAAE,SAAqB,IAAI;QAC/C,OAAO,IAAI,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAClG,CAAC;IAED,OAAO,CAAI,GAAsB,EAAE,GAAG,IAAW;QAC7C,IAAI;YACA,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;SAC/C;QAAC,OAAO,CAAC,EAAE;YACR,IAAI,CAAC,YAAY,qBAAqB,EAAE;gBACpC,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAI,GAAG,CAAC,CAAC;aAC9C;YAED,MAAM,CAAC,CAAC;SACX;IACL,CAAC;IAED,OAAO;QACH,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;IAClC,CAAC;IAED,YAAY;QACR,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;IACzC,CAAC;IAED,QAAQ,CAAC,QAA4B;QACjC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,YAAY;QACR,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;IACzC,CAAC;CACJ"}
|
|
1
|
+
{"version":3,"file":"AutoMockedContainer.js","sourceRoot":"","sources":["../../lib/automock/AutoMockedContainer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyC,qBAAqB,EAAO,MAAM,UAAU,CAAC;AAG7F,MAAM,OAAO,mBAAmB;IAC5B,YAAoB,SAAqB,EAAU,cAA+B;QAA9D,cAAS,GAAT,SAAS,CAAY;QAAU,mBAAc,GAAd,cAAc,CAAiB;IAAG,CAAC;IAEtF,WAAW,CAAC,IAAY,EAAE,SAAqB,IAAI;QAC/C,OAAO,IAAI,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAClG,CAAC;IAED,OAAO,CAAI,GAAsB,EAAE,GAAG,IAAW;QAC7C,IAAI;YACA,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;SAC/C;QAAC,OAAO,CAAC,EAAE;YACR,IAAI,CAAC,YAAY,qBAAqB,EAAE;gBACpC,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAI,GAAG,CAAC,CAAC;aAC9C;YAED,MAAM,CAAC,CAAC;SACX;IACL,CAAC;IAED,OAAO;QACH,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;IAClC,CAAC;IAED,YAAY;QACR,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;IACzC,CAAC;IAED,QAAQ,CAAC,QAA4B;QACjC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,YAAY;QACR,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;IACzC,CAAC;IAED,WAAW,CAAC,KAAiB;QACzB,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;CACJ"}
|
package/esm/core/IInjector.d.ts
CHANGED
|
@@ -1,18 +1,5 @@
|
|
|
1
|
-
import { constructor
|
|
1
|
+
import { constructor } from './utils/types';
|
|
2
2
|
import { IContainer } from './container/IContainer';
|
|
3
|
-
export
|
|
4
|
-
|
|
5
|
-
getInstances(): unknown[];
|
|
6
|
-
}
|
|
7
|
-
export interface IInjector extends Disposable, Traversable {
|
|
8
|
-
resolve<T>(container: IContainer, value: constructor<T>, ...deps: any[]): T;
|
|
9
|
-
clone(): IInjector;
|
|
10
|
-
}
|
|
11
|
-
export declare abstract class Injector implements IInjector {
|
|
12
|
-
private values;
|
|
13
|
-
abstract clone(): IInjector;
|
|
14
|
-
getInstances(): unknown[];
|
|
15
|
-
dispose(): void;
|
|
16
|
-
resolve<T>(container: IContainer, value: constructor<T>, ...deps: any[]): T;
|
|
17
|
-
protected abstract resolver<T>(container: IContainer, value: constructor<T>, ...args: any[]): T;
|
|
3
|
+
export interface IInjector {
|
|
4
|
+
resolve<T>(container: IContainer, value: constructor<T>, ...deps: unknown[]): T;
|
|
18
5
|
}
|
package/esm/core/IInjector.js
CHANGED
|
@@ -1,17 +1,2 @@
|
|
|
1
|
-
export
|
|
2
|
-
constructor() {
|
|
3
|
-
this.values = [];
|
|
4
|
-
}
|
|
5
|
-
getInstances() {
|
|
6
|
-
return this.values;
|
|
7
|
-
}
|
|
8
|
-
dispose() {
|
|
9
|
-
this.values = [];
|
|
10
|
-
}
|
|
11
|
-
resolve(container, value, ...deps) {
|
|
12
|
-
const instance = this.resolver(container, value, ...deps);
|
|
13
|
-
this.values.push(instance);
|
|
14
|
-
return instance;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
1
|
+
export {};
|
|
17
2
|
//# sourceMappingURL=IInjector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IInjector.js","sourceRoot":"","sources":["../../lib/core/IInjector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"IInjector.js","sourceRoot":"","sources":["../../lib/core/IInjector.ts"],"names":[],"mappings":""}
|
|
@@ -7,16 +7,18 @@ export declare class Container implements IContainer, Tagged {
|
|
|
7
7
|
readonly tags: Tag[];
|
|
8
8
|
private isDisposed;
|
|
9
9
|
private parent;
|
|
10
|
+
private children;
|
|
11
|
+
private instances;
|
|
10
12
|
constructor(injector: IInjector, options?: {
|
|
11
13
|
parent?: IContainer;
|
|
12
14
|
tags?: Tag[];
|
|
13
15
|
});
|
|
14
16
|
register(provider: IProvider<unknown>): this;
|
|
15
17
|
resolve<T>(key: InjectionToken<T>, ...args: any[]): T;
|
|
16
|
-
createScope(tags?: Tag[]
|
|
18
|
+
createScope(tags?: Tag[]): Container;
|
|
17
19
|
dispose(): void;
|
|
18
20
|
getProviders(): IProvider<unknown>[];
|
|
19
21
|
getInstances(): unknown[];
|
|
20
|
-
|
|
22
|
+
removeScope(child: IContainer): void;
|
|
21
23
|
private validateContainer;
|
|
22
24
|
}
|
|
@@ -8,6 +8,8 @@ export class Container {
|
|
|
8
8
|
this.injector = injector;
|
|
9
9
|
this.providers = new ProviderRepo();
|
|
10
10
|
this.isDisposed = false;
|
|
11
|
+
this.children = new Set();
|
|
12
|
+
this.instances = new Set();
|
|
11
13
|
this.parent = (_a = options.parent) !== null && _a !== void 0 ? _a : new EmptyContainer();
|
|
12
14
|
this.tags = (_b = options.tags) !== null && _b !== void 0 ? _b : [];
|
|
13
15
|
}
|
|
@@ -22,31 +24,41 @@ export class Container {
|
|
|
22
24
|
const provider = this.providers.get(key);
|
|
23
25
|
return (provider === null || provider === void 0 ? void 0 : provider.isValid(this)) ? provider.resolve(this, ...args) : this.parent.resolve(key, ...args);
|
|
24
26
|
}
|
|
25
|
-
|
|
27
|
+
const instance = this.injector.resolve(this, key, ...args);
|
|
28
|
+
this.instances.add(instance);
|
|
29
|
+
return instance;
|
|
26
30
|
}
|
|
27
|
-
createScope(tags = []
|
|
31
|
+
createScope(tags = []) {
|
|
28
32
|
this.validateContainer();
|
|
29
|
-
const scope = new Container(this.injector
|
|
30
|
-
for (const provider of
|
|
33
|
+
const scope = new Container(this.injector, { parent: this, tags });
|
|
34
|
+
for (const provider of this.getProviders().filter((p) => p.isValid(scope))) {
|
|
31
35
|
scope.register(provider.clone());
|
|
32
36
|
}
|
|
37
|
+
this.children.add(scope);
|
|
33
38
|
return scope;
|
|
34
39
|
}
|
|
35
40
|
dispose() {
|
|
36
41
|
this.isDisposed = true;
|
|
42
|
+
this.parent.removeScope(this);
|
|
37
43
|
this.parent = new EmptyContainer();
|
|
44
|
+
for (const child of this.children) {
|
|
45
|
+
child.dispose();
|
|
46
|
+
}
|
|
38
47
|
this.providers.dispose();
|
|
39
|
-
this.
|
|
48
|
+
this.instances.clear();
|
|
40
49
|
}
|
|
41
50
|
getProviders() {
|
|
42
51
|
return this.providers.merge(this.parent.getProviders());
|
|
43
52
|
}
|
|
44
53
|
getInstances() {
|
|
45
|
-
|
|
54
|
+
let instances = Array.from(this.instances);
|
|
55
|
+
for (const child of this.children) {
|
|
56
|
+
instances = instances.concat(child.getInstances());
|
|
57
|
+
}
|
|
58
|
+
return instances;
|
|
46
59
|
}
|
|
47
|
-
|
|
48
|
-
this.
|
|
49
|
-
return transform(this);
|
|
60
|
+
removeScope(child) {
|
|
61
|
+
this.children.delete(child);
|
|
50
62
|
}
|
|
51
63
|
validateContainer() {
|
|
52
64
|
ContainerDisposedError.assert(!this.isDisposed, 'Container is already disposed');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Container.js","sourceRoot":"","sources":["../../../lib/core/container/Container.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,aAAa,EAAe,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,MAAM,OAAO,SAAS;
|
|
1
|
+
{"version":3,"file":"Container.js","sourceRoot":"","sources":["../../../lib/core/container/Container.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,aAAa,EAAe,MAAM,uBAAuB,CAAC;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,MAAM,OAAO,SAAS;IAQlB,YAA6B,QAAmB,EAAE,UAAiD,EAAE;;QAAxE,aAAQ,GAAR,QAAQ,CAAW;QAP/B,cAAS,GAAG,IAAI,YAAY,EAAE,CAAC;QAExC,eAAU,GAAG,KAAK,CAAC;QAEnB,aAAQ,GAAoB,IAAI,GAAG,EAAE,CAAC;QACtC,cAAS,GAAiB,IAAI,GAAG,EAAE,CAAC;QAGxC,IAAI,CAAC,MAAM,GAAG,MAAA,OAAO,CAAC,MAAM,mCAAI,IAAI,cAAc,EAAE,CAAC;QACrD,IAAI,CAAC,IAAI,GAAG,MAAA,OAAO,CAAC,IAAI,mCAAI,EAAE,CAAC;IACnC,CAAC;IAED,QAAQ,CAAC,QAA4B;QACjC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO,CAAI,GAAsB,EAAE,GAAG,IAAW;QAC7C,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,aAAa,CAAC,GAAG,CAAC,EAAE;YACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAI,GAAG,CAAC,CAAC;YAC5C,OAAO,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,OAAO,CAAC,IAAI,CAAC,EAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAI,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;SAC3G;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAI,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC9D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,WAAW,CAAC,OAAc,EAAE;QACxB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAEnE,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE;YACxE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;SACpC;QAED,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAEzB,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,OAAO;QACH,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACnC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE;YAC/B,KAAK,CAAC,OAAO,EAAE,CAAC;SACnB;QACD,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED,YAAY;QACR,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,YAAY;QACR,IAAI,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE;YAC/B,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;SACtD;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,WAAW,CAAC,KAAiB;QACzB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAEO,iBAAiB;QACrB,sBAAsB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,+BAA+B,CAAC,CAAC;IACrF,CAAC;CACJ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmptyContainer.js","sourceRoot":"","sources":["../../../lib/core/container/EmptyContainer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAG1E,MAAM,OAAO,cAAc;IACvB,WAAW;QACP,MAAM,IAAI,yBAAyB,EAAE,CAAC;IAC1C,CAAC;IAED,OAAO;QACH,MAAM,IAAI,yBAAyB,EAAE,CAAC;IAC1C,CAAC;IAED,QAAQ;QACJ,MAAM,IAAI,yBAAyB,EAAE,CAAC;IAC1C,CAAC;IAED,OAAO,CAAI,GAAsB;QAC7B,MAAM,IAAI,qBAAqB,CAAC,eAAe,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,YAAY;QACR,OAAO,EAAE,CAAC;IACd,CAAC;IAED,YAAY;QACR,OAAO,EAAE,CAAC;IACd,CAAC;
|
|
1
|
+
{"version":3,"file":"EmptyContainer.js","sourceRoot":"","sources":["../../../lib/core/container/EmptyContainer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAG1E,MAAM,OAAO,cAAc;IACvB,WAAW;QACP,MAAM,IAAI,yBAAyB,EAAE,CAAC;IAC1C,CAAC;IAED,OAAO;QACH,MAAM,IAAI,yBAAyB,EAAE,CAAC;IAC1C,CAAC;IAED,QAAQ;QACJ,MAAM,IAAI,yBAAyB,EAAE,CAAC;IAC1C,CAAC;IAED,OAAO,CAAI,GAAsB;QAC7B,MAAM,IAAI,qBAAqB,CAAC,eAAe,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,YAAY;QACR,OAAO,EAAE,CAAC;IACd,CAAC;IAED,YAAY;QACR,OAAO,EAAE,CAAC;IACd,CAAC;IAED,WAAW,KAAU,CAAC;CACzB"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { IProvider, ProviderKey, Tag } from '../provider/IProvider';
|
|
2
2
|
import { constructor, Disposable } from '../utils/types';
|
|
3
|
-
import { Traversable } from '../IInjector';
|
|
4
3
|
export declare type InjectionToken<T = any> = constructor<T> | ProviderKey;
|
|
5
4
|
export interface Resolveable {
|
|
6
5
|
resolve<T>(key: InjectionToken<T>, ...args: any[]): T;
|
|
7
6
|
}
|
|
8
|
-
export interface IContainer extends Disposable, Resolveable
|
|
7
|
+
export interface IContainer extends Disposable, Resolveable {
|
|
9
8
|
createScope(tags?: Tag[], parent?: IContainer): IContainer;
|
|
10
9
|
register(provider: IProvider<unknown>): this;
|
|
11
10
|
getProviders(): IProvider<unknown>[];
|
|
11
|
+
removeScope(child: IContainer): void;
|
|
12
|
+
getInstances(): unknown[];
|
|
12
13
|
}
|
package/esm/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { IContainer, InjectionToken } from './core/container/IContainer';
|
|
2
2
|
export { ProviderReducer } from './core/provider/IProviderReflector';
|
|
3
3
|
export { IContainer, Resolveable } from './core/container/IContainer';
|
|
4
|
+
export { EmptyContainer } from './core/container/EmptyContainer';
|
|
4
5
|
export { constructor } from './core/utils/types';
|
|
5
6
|
export { Container } from './core/container/Container';
|
|
6
7
|
export { Tagged, ResolveDependency, Tag, IProvider } from './core/provider/IProvider';
|
|
@@ -27,5 +28,4 @@ export { isProviderKey } from './core/provider/IProvider';
|
|
|
27
28
|
export { perTags } from './providers/TaggedProvider';
|
|
28
29
|
export { asSingleton } from './providers/SingletonProvider';
|
|
29
30
|
export { forKey } from './core/provider/Provider';
|
|
30
|
-
export { VisitInstance, Injector } from './core/IInjector';
|
|
31
31
|
export declare const by: <T>(key: InjectionToken<T>, ...args: unknown[]) => (l: IContainer) => T;
|
package/esm/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export { EmptyContainer } from './core/container/EmptyContainer';
|
|
1
2
|
export { Container } from './core/container/Container';
|
|
2
3
|
export { MethodReflector } from './hooks/MethodReflector';
|
|
3
4
|
export { AsyncMethodReflector } from './hooks/AsyncMethodReflector';
|
|
@@ -15,6 +16,5 @@ export { isProviderKey } from './core/provider/IProvider';
|
|
|
15
16
|
export { perTags } from './providers/TaggedProvider';
|
|
16
17
|
export { asSingleton } from './providers/SingletonProvider';
|
|
17
18
|
export { forKey } from './core/provider/Provider';
|
|
18
|
-
export { Injector } from './core/IInjector';
|
|
19
19
|
export const by = (key, ...args) => (l) => l.resolve(key, ...args);
|
|
20
20
|
//# sourceMappingURL=index.js.map
|
package/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEjE,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAIvD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC;AACnF,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACjF,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,YAAY,EAAU,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAGtE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAElD,MAAM,CAAC,MAAM,EAAE,GACX,CAAI,GAAsB,EAAE,GAAG,IAAe,EAAE,EAAE,CAClD,CAAC,CAAa,EAAE,EAAE,CACd,CAAC,CAAC,OAAO,CAAI,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ts-ioc-container",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "19.0.0",
|
|
4
4
|
"description": "Typescript IoC container",
|
|
5
5
|
"author": "ibabkin <igba14@gmail.com>",
|
|
6
6
|
"homepage": "https://github.com/IgorBabkin/ts-ioc-container/tree/master/packages/ts-ioc-container",
|
|
@@ -46,5 +46,5 @@
|
|
|
46
46
|
"ts-jest": "27.0.5",
|
|
47
47
|
"typescript": "4.4.3"
|
|
48
48
|
},
|
|
49
|
-
"gitHead": "
|
|
49
|
+
"gitHead": "0f37a1d8402abed2af90cd74f0e47e182899fb2f"
|
|
50
50
|
}
|