ts-ioc-container 31.2.2 → 31.3.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 +29 -18
- package/cjm/index.js +2 -3
- package/cjm/provider/ArgsProvider.js +2 -3
- package/cjm/provider/IProvider.js +2 -13
- package/cjm/provider/Provider.js +2 -1
- package/cjm/provider/SingletonProvider.js +1 -2
- package/cjm/registration/IRegistration.js +1 -3
- package/cjm/registration/Registration.js +8 -9
- package/cjm/utils.js +1 -11
- package/esm/index.js +1 -1
- package/esm/provider/ArgsProvider.js +2 -3
- package/esm/provider/IProvider.js +1 -10
- package/esm/provider/Provider.js +3 -2
- package/esm/provider/SingletonProvider.js +1 -2
- package/esm/registration/IRegistration.js +0 -1
- package/esm/registration/Registration.js +9 -10
- package/esm/utils.js +0 -9
- package/package.json +2 -2
- package/typings/container/Container.d.ts +1 -1
- package/typings/container/IContainer.d.ts +1 -1
- package/typings/index.d.ts +1 -1
- package/typings/provider/IProvider.d.ts +0 -2
- package/typings/registration/IRegistration.d.ts +3 -5
- package/typings/registration/Registration.d.ts +5 -6
- package/typings/utils.d.ts +0 -1
package/README.md
CHANGED
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
- [Metadata](#metadata) `@inject`
|
|
30
30
|
- [Simple](#simple)
|
|
31
31
|
- [Proxy](#proxy)
|
|
32
|
-
- [Provider](#provider)
|
|
32
|
+
- [Provider](#provider) `@provider`
|
|
33
33
|
- [Singleton](#singleton) `singleton`
|
|
34
34
|
- [Arguments](#arguments) `args`
|
|
35
35
|
- [Visibility](#visibility) `visible`
|
|
@@ -138,6 +138,7 @@ import {
|
|
|
138
138
|
Container,
|
|
139
139
|
DependencyNotFoundError,
|
|
140
140
|
key,
|
|
141
|
+
provider,
|
|
141
142
|
MetadataInjector,
|
|
142
143
|
Registration as R,
|
|
143
144
|
by,
|
|
@@ -145,7 +146,8 @@ import {
|
|
|
145
146
|
register,
|
|
146
147
|
} from 'ts-ioc-container';
|
|
147
148
|
|
|
148
|
-
@register(key('ILogger'), scope((s) => s.hasTag('child'))
|
|
149
|
+
@register(key('ILogger'), scope((s) => s.hasTag('child')))
|
|
150
|
+
@provider(singleton())
|
|
149
151
|
class Logger {}
|
|
150
152
|
|
|
151
153
|
describe('Scopes', function () {
|
|
@@ -330,7 +332,7 @@ This type of injector injects dependencies as dictionary `Record<string, unknown
|
|
|
330
332
|
|
|
331
333
|
```typescript
|
|
332
334
|
import 'reflect-metadata';
|
|
333
|
-
import {
|
|
335
|
+
import { Container, ProxyInjector, args, Registration as R } from 'ts-ioc-container';
|
|
334
336
|
|
|
335
337
|
describe('ProxyInjector', function () {
|
|
336
338
|
it('should pass dependency to constructor as dictionary', function () {
|
|
@@ -387,6 +389,7 @@ describe('ProxyInjector', function () {
|
|
|
387
389
|
## Provider
|
|
388
390
|
Provider is dependency factory which creates dependency.
|
|
389
391
|
|
|
392
|
+
- `@provider()`
|
|
390
393
|
- `Provider.fromClass(Logger)`
|
|
391
394
|
- `Provider.fromValue(logger)`
|
|
392
395
|
- `new Provider((container, ...args) => container.resolve(Logger, {args}))`
|
|
@@ -436,9 +439,10 @@ Sometimes you need to create only one instance of dependency per scope. For exam
|
|
|
436
439
|
|
|
437
440
|
```typescript
|
|
438
441
|
import 'reflect-metadata';
|
|
439
|
-
import { singleton, Container, key, MetadataInjector, Registration as R, register } from 'ts-ioc-container';
|
|
442
|
+
import { singleton, Container, key, provider, MetadataInjector, Registration as R, register } from 'ts-ioc-container';
|
|
440
443
|
|
|
441
|
-
@register(key('logger')
|
|
444
|
+
@register(key('logger'))
|
|
445
|
+
@provider(singleton())
|
|
442
446
|
class Logger {}
|
|
443
447
|
|
|
444
448
|
describe('Singleton', function () {
|
|
@@ -471,14 +475,14 @@ describe('Singleton', function () {
|
|
|
471
475
|
|
|
472
476
|
### Arguments
|
|
473
477
|
Sometimes you want to bind some arguments to provider. This is what `ArgsProvider` is for.
|
|
474
|
-
-
|
|
475
|
-
-
|
|
478
|
+
- `@provider(args('someArgument'))`
|
|
479
|
+
- `@provider(argsFn((container) => [container.resolve(Logger), 'someValue']))`
|
|
476
480
|
- `Provider.fromClass(Logger).pipe(args('someArgument'))`
|
|
477
481
|
- NOTICE: args from this provider has higher priority than args from `resolve` method.
|
|
478
482
|
|
|
479
483
|
```typescript
|
|
480
484
|
import 'reflect-metadata';
|
|
481
|
-
import {
|
|
485
|
+
import { Container, key, argsFn, args, MetadataInjector, Registration as R, register } from 'ts-ioc-container';
|
|
482
486
|
|
|
483
487
|
@register(key('logger'))
|
|
484
488
|
class Logger {
|
|
@@ -521,7 +525,7 @@ describe('ArgsProvider', function () {
|
|
|
521
525
|
|
|
522
526
|
### Visibility
|
|
523
527
|
Sometimes you want to hide dependency if somebody wants to resolve it from certain scope
|
|
524
|
-
-
|
|
528
|
+
- `@provider(visible(({ isParent, child }) => isParent || child.hasTag('root')))` - dependency will be accessible from scope `root` or from scope where it's registered
|
|
525
529
|
- `Provider.fromClass(Logger).pipe(visible(({ isParent, child }) => isParent || child.hasTag('root')))`
|
|
526
530
|
|
|
527
531
|
```typescript
|
|
@@ -531,6 +535,7 @@ import {
|
|
|
531
535
|
DependencyNotFoundError,
|
|
532
536
|
key,
|
|
533
537
|
MetadataInjector,
|
|
538
|
+
provider,
|
|
534
539
|
register,
|
|
535
540
|
Registration as R,
|
|
536
541
|
scope,
|
|
@@ -540,7 +545,8 @@ import {
|
|
|
540
545
|
|
|
541
546
|
describe('Visibility', function () {
|
|
542
547
|
it('should hide from children', () => {
|
|
543
|
-
@register(key('logger'), scope((s) => s.hasTag('root'))
|
|
548
|
+
@register(key('logger'), scope((s) => s.hasTag('root')))
|
|
549
|
+
@provider(singleton(), visible(({ isParent }) => isParent))
|
|
544
550
|
class FileLogger {}
|
|
545
551
|
|
|
546
552
|
const parent = new Container(new MetadataInjector(), { tags: ['root'] }).add(R.fromClass(FileLogger));
|
|
@@ -564,14 +570,15 @@ Registration is provider factory which registers provider in container.
|
|
|
564
570
|
|
|
565
571
|
```typescript
|
|
566
572
|
import 'reflect-metadata';
|
|
567
|
-
import { Container, key, MetadataInjector, register, Registration as R, scope, singleton } from 'ts-ioc-container';
|
|
573
|
+
import { Container, key, MetadataInjector, provider, register, Registration as R, scope, singleton } from 'ts-ioc-container';
|
|
568
574
|
import { DependencyMissingKeyError } from '../../lib/errors/DependencyMissingKeyError';
|
|
569
575
|
|
|
570
576
|
describe('Registration module', function () {
|
|
571
577
|
const createContainer = () => new Container(new MetadataInjector(), { tags: ['root'] });
|
|
572
578
|
|
|
573
579
|
it('should register class', function () {
|
|
574
|
-
@register(key('ILogger'), scope((s) => s.hasTag('root'))
|
|
580
|
+
@register(key('ILogger'), scope((s) => s.hasTag('root')))
|
|
581
|
+
@provider(singleton())
|
|
575
582
|
class Logger {}
|
|
576
583
|
|
|
577
584
|
const root = createContainer().add(R.fromClass(Logger));
|
|
@@ -615,9 +622,10 @@ Sometimes you need to register provider only in scope which matches to certain c
|
|
|
615
622
|
|
|
616
623
|
```typescript
|
|
617
624
|
import 'reflect-metadata';
|
|
618
|
-
import { singleton, Container, key, MetadataInjector, Registration as R, scope, register } from 'ts-ioc-container';
|
|
625
|
+
import { singleton, Container, key, provider, MetadataInjector, Registration as R, scope, register } from 'ts-ioc-container';
|
|
619
626
|
|
|
620
|
-
@register(key('ILogger'), scope((s) => s.hasTag('root'))
|
|
627
|
+
@register(key('ILogger'), scope((s) => s.hasTag('root')))
|
|
628
|
+
@provider(singleton()) // the same as .pipe(singleton(), scope((s) => s.hasTag('root')))
|
|
621
629
|
class Logger {}
|
|
622
630
|
describe('ScopeProvider', function () {
|
|
623
631
|
it('should return the same instance', function () {
|
|
@@ -832,19 +840,22 @@ describe('onConstruct', function () {
|
|
|
832
840
|
```typescript
|
|
833
841
|
import 'reflect-metadata';
|
|
834
842
|
import {
|
|
843
|
+
singleton,
|
|
835
844
|
by,
|
|
836
845
|
Container,
|
|
846
|
+
key,
|
|
837
847
|
getHooks,
|
|
838
848
|
hook,
|
|
839
849
|
inject,
|
|
840
|
-
|
|
850
|
+
provider,
|
|
851
|
+
Registration as R,
|
|
841
852
|
MetadataInjector,
|
|
842
853
|
register,
|
|
843
|
-
Registration as R,
|
|
844
|
-
singleton,
|
|
845
854
|
} from 'ts-ioc-container';
|
|
855
|
+
import * as console from 'node:console';
|
|
846
856
|
|
|
847
|
-
@register(key('logsRepo')
|
|
857
|
+
@register(key('logsRepo'))
|
|
858
|
+
@provider(singleton())
|
|
848
859
|
class LogsRepo {
|
|
849
860
|
savedLogs: string[] = [];
|
|
850
861
|
|
package/cjm/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getParameterMetadata = exports.getMethodMetadata = exports.setMethodMetadata = exports.setParameterMetadata = exports.getMetadata = exports.setMetadata = exports.by = exports.hasHooks = exports.hook = exports.getHooks = exports.ProxyInjector = exports.SimpleInjector = exports.inject = exports.MetadataInjector = exports.register = exports.scope = exports.alias = exports.key = exports.Registration = exports.AutoMockedContainer = exports.SingletonProvider = exports.singleton = exports.ArgsProvider = exports.args = exports.argsFn = exports.ProviderDecorator = exports.Provider = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.DependencyNotFoundError = exports.
|
|
3
|
+
exports.getParameterMetadata = exports.getMethodMetadata = exports.setMethodMetadata = exports.setParameterMetadata = exports.getMetadata = exports.setMetadata = exports.by = exports.hasHooks = exports.hook = exports.getHooks = exports.ProxyInjector = exports.SimpleInjector = exports.inject = exports.MetadataInjector = exports.register = exports.scope = exports.alias = exports.key = exports.Registration = exports.AutoMockedContainer = exports.SingletonProvider = exports.singleton = exports.ArgsProvider = exports.args = exports.argsFn = exports.ProviderDecorator = exports.Provider = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.DependencyNotFoundError = exports.visible = exports.provider = exports.EmptyContainer = exports.Container = exports.isDependencyKey = void 0;
|
|
4
4
|
var IContainer_1 = require("./container/IContainer");
|
|
5
5
|
Object.defineProperty(exports, "isDependencyKey", { enumerable: true, get: function () { return IContainer_1.isDependencyKey; } });
|
|
6
6
|
var Container_1 = require("./container/Container");
|
|
@@ -8,9 +8,8 @@ Object.defineProperty(exports, "Container", { enumerable: true, get: function ()
|
|
|
8
8
|
var EmptyContainer_1 = require("./container/EmptyContainer");
|
|
9
9
|
Object.defineProperty(exports, "EmptyContainer", { enumerable: true, get: function () { return EmptyContainer_1.EmptyContainer; } });
|
|
10
10
|
var IProvider_1 = require("./provider/IProvider");
|
|
11
|
-
Object.defineProperty(exports, "visible", { enumerable: true, get: function () { return IProvider_1.visible; } });
|
|
12
11
|
Object.defineProperty(exports, "provider", { enumerable: true, get: function () { return IProvider_1.provider; } });
|
|
13
|
-
Object.defineProperty(exports, "
|
|
12
|
+
Object.defineProperty(exports, "visible", { enumerable: true, get: function () { return IProvider_1.visible; } });
|
|
14
13
|
var DependencyNotFoundError_1 = require("./errors/DependencyNotFoundError");
|
|
15
14
|
Object.defineProperty(exports, "DependencyNotFoundError", { enumerable: true, get: function () { return DependencyNotFoundError_1.DependencyNotFoundError; } });
|
|
16
15
|
var MethodNotImplementedError_1 = require("./errors/MethodNotImplementedError");
|
|
@@ -2,13 +2,12 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ArgsProvider = exports.argsFn = exports.args = void 0;
|
|
4
4
|
const ProviderDecorator_1 = require("./ProviderDecorator");
|
|
5
|
-
const IProvider_1 = require("./IProvider");
|
|
6
5
|
function args(...extraArgs) {
|
|
7
|
-
return (
|
|
6
|
+
return (provider) => new ArgsProvider(provider, () => extraArgs);
|
|
8
7
|
}
|
|
9
8
|
exports.args = args;
|
|
10
9
|
function argsFn(value) {
|
|
11
|
-
return (
|
|
10
|
+
return (provider) => new ArgsProvider(provider, value);
|
|
12
11
|
}
|
|
13
12
|
exports.argsFn = argsFn;
|
|
14
13
|
class ArgsProvider extends ProviderDecorator_1.ProviderDecorator {
|
|
@@ -1,22 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.visible = exports.
|
|
3
|
+
exports.visible = exports.getTransformers = exports.provider = void 0;
|
|
4
4
|
const metadata_1 = require("../metadata");
|
|
5
5
|
const METADATA_KEY = 'provider';
|
|
6
6
|
const provider = (...mappers) => (0, metadata_1.setMetadata)(METADATA_KEY, mappers);
|
|
7
7
|
exports.provider = provider;
|
|
8
8
|
const getTransformers = (Target) => (0, metadata_1.getMetadata)(Target, METADATA_KEY) ?? [];
|
|
9
9
|
exports.getTransformers = getTransformers;
|
|
10
|
-
const
|
|
11
|
-
// @ts-ignore
|
|
12
|
-
fn.__provider = true;
|
|
13
|
-
return fn;
|
|
14
|
-
};
|
|
15
|
-
exports.markAsProvider = markAsProvider;
|
|
16
|
-
const isProviderMapper = (fn) => {
|
|
17
|
-
// @ts-ignore
|
|
18
|
-
return fn.__provider === true;
|
|
19
|
-
};
|
|
20
|
-
exports.isProviderMapper = isProviderMapper;
|
|
21
|
-
const visible = (isVisibleWhen) => (0, exports.markAsProvider)((p) => p.setVisibility(isVisibleWhen));
|
|
10
|
+
const visible = (isVisibleWhen) => (p) => p.setVisibility(isVisibleWhen);
|
|
22
11
|
exports.visible = visible;
|
package/cjm/provider/Provider.js
CHANGED
|
@@ -9,7 +9,8 @@ class Provider {
|
|
|
9
9
|
return new Provider((container, ...args) => container.resolve(Target, { args })).pipe(...transformers);
|
|
10
10
|
}
|
|
11
11
|
static fromValue(value) {
|
|
12
|
-
|
|
12
|
+
const mappers = (0, utils_1.isConstructor)(value) ? (0, IProvider_1.getTransformers)(value) ?? [] : [];
|
|
13
|
+
return new Provider(() => value).pipe(...mappers);
|
|
13
14
|
}
|
|
14
15
|
constructor(resolveDependency, isVisibleWhen = () => true) {
|
|
15
16
|
this.resolveDependency = resolveDependency;
|
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SingletonProvider = exports.singleton = void 0;
|
|
4
4
|
const ProviderDecorator_1 = require("./ProviderDecorator");
|
|
5
|
-
const IProvider_1 = require("./IProvider");
|
|
6
5
|
function singleton() {
|
|
7
|
-
return (
|
|
6
|
+
return (provider) => new SingletonProvider(provider);
|
|
8
7
|
}
|
|
9
8
|
exports.singleton = singleton;
|
|
10
9
|
class SingletonProvider extends ProviderDecorator_1.ProviderDecorator {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.register = exports.getTransformers = exports.scope = exports.alias = exports.key = void 0;
|
|
4
4
|
const metadata_1 = require("../metadata");
|
|
5
5
|
const key = (key) => (r) => r.to(key);
|
|
6
6
|
exports.key = key;
|
|
@@ -13,5 +13,3 @@ const getTransformers = (Target) => (0, metadata_1.getMetadata)(Target, METADATA
|
|
|
13
13
|
exports.getTransformers = getTransformers;
|
|
14
14
|
const register = (...mappers) => (0, metadata_1.setMetadata)(METADATA_KEY, mappers);
|
|
15
15
|
exports.register = register;
|
|
16
|
-
const provider = (...mappers) => (r) => r.provider(...mappers);
|
|
17
|
-
exports.provider = provider;
|
|
@@ -3,25 +3,29 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.Registration = void 0;
|
|
4
4
|
const utils_1 = require("../utils");
|
|
5
5
|
const Provider_1 = require("../provider/Provider");
|
|
6
|
-
const IProvider_1 = require("../provider/IProvider");
|
|
7
6
|
const DependencyMissingKeyError_1 = require("../errors/DependencyMissingKeyError");
|
|
8
7
|
const IRegistration_1 = require("./IRegistration");
|
|
9
8
|
class Registration {
|
|
10
9
|
static fromClass(Target) {
|
|
11
|
-
|
|
10
|
+
const transform = (0, utils_1.pipe)(...(0, IRegistration_1.getTransformers)(Target));
|
|
11
|
+
return transform(new Registration(() => Provider_1.Provider.fromClass(Target), Target.name));
|
|
12
12
|
}
|
|
13
13
|
static fromValue(value) {
|
|
14
|
+
if ((0, utils_1.isConstructor)(value)) {
|
|
15
|
+
const transform = (0, utils_1.pipe)(...(0, IRegistration_1.getTransformers)(value));
|
|
16
|
+
return transform(new Registration(() => Provider_1.Provider.fromValue(value), value.name));
|
|
17
|
+
}
|
|
14
18
|
return new Registration(() => Provider_1.Provider.fromValue(value));
|
|
15
19
|
}
|
|
16
20
|
static fromFn(fn) {
|
|
17
21
|
return new Registration(() => new Provider_1.Provider(fn));
|
|
18
22
|
}
|
|
19
|
-
constructor(createProvider, key) {
|
|
23
|
+
constructor(createProvider, key, matchScope = () => true) {
|
|
20
24
|
this.createProvider = createProvider;
|
|
21
25
|
this.key = key;
|
|
26
|
+
this.matchScope = matchScope;
|
|
22
27
|
this.aliases = [];
|
|
23
28
|
this.mappers = [];
|
|
24
|
-
this.matchScope = () => true;
|
|
25
29
|
}
|
|
26
30
|
to(key) {
|
|
27
31
|
this.key = key;
|
|
@@ -34,11 +38,6 @@ class Registration {
|
|
|
34
38
|
return this;
|
|
35
39
|
}
|
|
36
40
|
pipe(...mappers) {
|
|
37
|
-
const [providerMappers, registrationMappers] = (0, utils_1.groupBy)(mappers, IProvider_1.isProviderMapper);
|
|
38
|
-
this.mappers.push(...providerMappers);
|
|
39
|
-
return (0, utils_1.pipe)(...registrationMappers)(this);
|
|
40
|
-
}
|
|
41
|
-
provider(...mappers) {
|
|
42
41
|
this.mappers.push(...mappers);
|
|
43
42
|
return this;
|
|
44
43
|
}
|
package/cjm/utils.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.isConstructor = exports.constant = exports.fillEmptyIndexes = exports.pipe = void 0;
|
|
4
4
|
const pipe = (...mappers) => (value) => mappers.reduce((acc, current) => current(acc), value);
|
|
5
5
|
exports.pipe = pipe;
|
|
6
6
|
function fillEmptyIndexes(baseArr, insertArr) {
|
|
@@ -18,13 +18,3 @@ const constant = (value) => () => value;
|
|
|
18
18
|
exports.constant = constant;
|
|
19
19
|
const isConstructor = (T) => typeof T === 'function' && !!T.prototype;
|
|
20
20
|
exports.isConstructor = isConstructor;
|
|
21
|
-
function groupBy(items, predicate) {
|
|
22
|
-
const [a, b] = items.reduce(([a, b], item) => {
|
|
23
|
-
if (predicate(item)) {
|
|
24
|
-
return [a.concat(item), b];
|
|
25
|
-
}
|
|
26
|
-
return [a, b.concat(item)];
|
|
27
|
-
}, [[], []]);
|
|
28
|
-
return [a, b];
|
|
29
|
-
}
|
|
30
|
-
exports.groupBy = groupBy;
|
package/esm/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { isDependencyKey, } from './container/IContainer';
|
|
2
2
|
export { Container } from './container/Container';
|
|
3
3
|
export { EmptyContainer } from './container/EmptyContainer';
|
|
4
|
-
export {
|
|
4
|
+
export { provider, visible } from './provider/IProvider';
|
|
5
5
|
export { DependencyNotFoundError } from './errors/DependencyNotFoundError';
|
|
6
6
|
export { MethodNotImplementedError } from './errors/MethodNotImplementedError';
|
|
7
7
|
export { ContainerDisposedError } from './errors/ContainerDisposedError';
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
import { ProviderDecorator } from './ProviderDecorator';
|
|
2
|
-
import { markAsProvider } from './IProvider';
|
|
3
2
|
export function args(...extraArgs) {
|
|
4
|
-
return
|
|
3
|
+
return (provider) => new ArgsProvider(provider, () => extraArgs);
|
|
5
4
|
}
|
|
6
5
|
export function argsFn(value) {
|
|
7
|
-
return
|
|
6
|
+
return (provider) => new ArgsProvider(provider, value);
|
|
8
7
|
}
|
|
9
8
|
export class ArgsProvider extends ProviderDecorator {
|
|
10
9
|
constructor(provider, argsFn) {
|
|
@@ -2,13 +2,4 @@ import { getMetadata, setMetadata } from '../metadata';
|
|
|
2
2
|
const METADATA_KEY = 'provider';
|
|
3
3
|
export const provider = (...mappers) => setMetadata(METADATA_KEY, mappers);
|
|
4
4
|
export const getTransformers = (Target) => getMetadata(Target, METADATA_KEY) ?? [];
|
|
5
|
-
export const
|
|
6
|
-
// @ts-ignore
|
|
7
|
-
fn.__provider = true;
|
|
8
|
-
return fn;
|
|
9
|
-
};
|
|
10
|
-
export const isProviderMapper = (fn) => {
|
|
11
|
-
// @ts-ignore
|
|
12
|
-
return fn.__provider === true;
|
|
13
|
-
};
|
|
14
|
-
export const visible = (isVisibleWhen) => markAsProvider((p) => p.setVisibility(isVisibleWhen));
|
|
5
|
+
export const visible = (isVisibleWhen) => (p) => p.setVisibility(isVisibleWhen);
|
package/esm/provider/Provider.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { getTransformers } from './IProvider';
|
|
2
|
-
import { pipe } from '../utils';
|
|
2
|
+
import { isConstructor, pipe } from '../utils';
|
|
3
3
|
export class Provider {
|
|
4
4
|
static fromClass(Target) {
|
|
5
5
|
const transformers = getTransformers(Target);
|
|
6
6
|
return new Provider((container, ...args) => container.resolve(Target, { args })).pipe(...transformers);
|
|
7
7
|
}
|
|
8
8
|
static fromValue(value) {
|
|
9
|
-
|
|
9
|
+
const mappers = isConstructor(value) ? getTransformers(value) ?? [] : [];
|
|
10
|
+
return new Provider(() => value).pipe(...mappers);
|
|
10
11
|
}
|
|
11
12
|
constructor(resolveDependency, isVisibleWhen = () => true) {
|
|
12
13
|
this.resolveDependency = resolveDependency;
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { ProviderDecorator } from './ProviderDecorator';
|
|
2
|
-
import { markAsProvider } from './IProvider';
|
|
3
2
|
export function singleton() {
|
|
4
|
-
return
|
|
3
|
+
return (provider) => new SingletonProvider(provider);
|
|
5
4
|
}
|
|
6
5
|
export class SingletonProvider extends ProviderDecorator {
|
|
7
6
|
constructor(provider) {
|
|
@@ -5,4 +5,3 @@ export const scope = (predicate) => (r) => r.when(predicate);
|
|
|
5
5
|
const METADATA_KEY = 'registration';
|
|
6
6
|
export const getTransformers = (Target) => getMetadata(Target, METADATA_KEY) ?? [];
|
|
7
7
|
export const register = (...mappers) => setMetadata(METADATA_KEY, mappers);
|
|
8
|
-
export const provider = (...mappers) => (r) => r.provider(...mappers);
|
|
@@ -1,24 +1,28 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isConstructor, pipe } from '../utils';
|
|
2
2
|
import { Provider } from '../provider/Provider';
|
|
3
|
-
import { isProviderMapper } from '../provider/IProvider';
|
|
4
3
|
import { DependencyMissingKeyError } from '../errors/DependencyMissingKeyError';
|
|
5
4
|
import { getTransformers } from './IRegistration';
|
|
6
5
|
export class Registration {
|
|
7
6
|
static fromClass(Target) {
|
|
8
|
-
|
|
7
|
+
const transform = pipe(...getTransformers(Target));
|
|
8
|
+
return transform(new Registration(() => Provider.fromClass(Target), Target.name));
|
|
9
9
|
}
|
|
10
10
|
static fromValue(value) {
|
|
11
|
+
if (isConstructor(value)) {
|
|
12
|
+
const transform = pipe(...getTransformers(value));
|
|
13
|
+
return transform(new Registration(() => Provider.fromValue(value), value.name));
|
|
14
|
+
}
|
|
11
15
|
return new Registration(() => Provider.fromValue(value));
|
|
12
16
|
}
|
|
13
17
|
static fromFn(fn) {
|
|
14
18
|
return new Registration(() => new Provider(fn));
|
|
15
19
|
}
|
|
16
|
-
constructor(createProvider, key) {
|
|
20
|
+
constructor(createProvider, key, matchScope = () => true) {
|
|
17
21
|
this.createProvider = createProvider;
|
|
18
22
|
this.key = key;
|
|
23
|
+
this.matchScope = matchScope;
|
|
19
24
|
this.aliases = [];
|
|
20
25
|
this.mappers = [];
|
|
21
|
-
this.matchScope = () => true;
|
|
22
26
|
}
|
|
23
27
|
to(key) {
|
|
24
28
|
this.key = key;
|
|
@@ -31,11 +35,6 @@ export class Registration {
|
|
|
31
35
|
return this;
|
|
32
36
|
}
|
|
33
37
|
pipe(...mappers) {
|
|
34
|
-
const [providerMappers, registrationMappers] = groupBy(mappers, isProviderMapper);
|
|
35
|
-
this.mappers.push(...providerMappers);
|
|
36
|
-
return pipe(...registrationMappers)(this);
|
|
37
|
-
}
|
|
38
|
-
provider(...mappers) {
|
|
39
38
|
this.mappers.push(...mappers);
|
|
40
39
|
return this;
|
|
41
40
|
}
|
package/esm/utils.js
CHANGED
|
@@ -11,12 +11,3 @@ export function fillEmptyIndexes(baseArr, insertArr) {
|
|
|
11
11
|
}
|
|
12
12
|
export const constant = (value) => () => value;
|
|
13
13
|
export const isConstructor = (T) => typeof T === 'function' && !!T.prototype;
|
|
14
|
-
export function groupBy(items, predicate) {
|
|
15
|
-
const [a, b] = items.reduce(([a, b], item) => {
|
|
16
|
-
if (predicate(item)) {
|
|
17
|
-
return [a.concat(item), b];
|
|
18
|
-
}
|
|
19
|
-
return [a, b.concat(item)];
|
|
20
|
-
}, [[], []]);
|
|
21
|
-
return [a, b];
|
|
22
|
-
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ts-ioc-container",
|
|
3
|
-
"version": "31.
|
|
3
|
+
"version": "31.3.0",
|
|
4
4
|
"description": "Typescript IoC container",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public",
|
|
@@ -59,5 +59,5 @@
|
|
|
59
59
|
"ts-node": "^10.9.1",
|
|
60
60
|
"typescript": "5.4.3"
|
|
61
61
|
},
|
|
62
|
-
"gitHead": "
|
|
62
|
+
"gitHead": "868bc567109744dd58b00f6e3a26ed77539ef55c"
|
|
63
63
|
}
|
|
@@ -16,7 +16,7 @@ export declare class Container implements IContainer {
|
|
|
16
16
|
parent?: IContainer;
|
|
17
17
|
tags?: Tag[];
|
|
18
18
|
});
|
|
19
|
-
add(registration: IRegistration
|
|
19
|
+
add(registration: IRegistration): this;
|
|
20
20
|
register(key: DependencyKey, provider: IProvider, aliases?: Alias[]): this;
|
|
21
21
|
resolve<T>(token: InjectionToken<T>, { args, child }?: ResolveOptions): T;
|
|
22
22
|
createScope(...tags: Tag[]): Container;
|
|
@@ -25,7 +25,7 @@ export interface IContainer extends Resolvable, Tagged {
|
|
|
25
25
|
readonly isDisposed: boolean;
|
|
26
26
|
createScope(...tags: Tag[]): IContainer;
|
|
27
27
|
register(key: DependencyKey, value: IProvider, aliases?: Alias[]): this;
|
|
28
|
-
add(registration: IRegistration
|
|
28
|
+
add(registration: IRegistration): this;
|
|
29
29
|
removeScope(child: IContainer): void;
|
|
30
30
|
getInstances(): unknown[];
|
|
31
31
|
dispose(): void;
|
package/typings/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ export { IContainer, Resolvable, IContainerModule, isDependencyKey, DependencyKe
|
|
|
2
2
|
export { constructor } from './utils';
|
|
3
3
|
export { Container } from './container/Container';
|
|
4
4
|
export { EmptyContainer } from './container/EmptyContainer';
|
|
5
|
-
export { ResolveDependency, IProvider,
|
|
5
|
+
export { ResolveDependency, IProvider, provider, visible } from './provider/IProvider';
|
|
6
6
|
export { IInjector } from './injector/IInjector';
|
|
7
7
|
export { DependencyNotFoundError } from './errors/DependencyNotFoundError';
|
|
8
8
|
export { MethodNotImplementedError } from './errors/MethodNotImplementedError';
|
|
@@ -13,6 +13,4 @@ export interface IProvider<T = unknown> {
|
|
|
13
13
|
}
|
|
14
14
|
export declare const provider: (...mappers: MapFn<IProvider>[]) => ClassDecorator;
|
|
15
15
|
export declare const getTransformers: <T>(Target: constructor<T>) => MapFn<IProvider<T>>[];
|
|
16
|
-
export declare const markAsProvider: <T>(fn: MapFn<IProvider<T>>) => MapFn<IProvider<T>>;
|
|
17
|
-
export declare const isProviderMapper: <T>(fn: unknown) => fn is MapFn<IProvider<T>>;
|
|
18
16
|
export declare const visible: (isVisibleWhen: ChildrenVisibilityPredicate) => MapFn<IProvider>;
|
|
@@ -6,12 +6,10 @@ export interface IRegistration<T = unknown> extends IContainerModule {
|
|
|
6
6
|
addAliases(...aliases: Alias[]): this;
|
|
7
7
|
when(isValidWhen: ScopePredicate): this;
|
|
8
8
|
to(key: DependencyKey): this;
|
|
9
|
-
pipe(...mappers:
|
|
10
|
-
provider(...mappers: MapFn<IProvider<T>>[]): this;
|
|
9
|
+
pipe(...mappers: MapFn<IProvider<T>>[]): this;
|
|
11
10
|
}
|
|
12
11
|
export declare const key: (key: DependencyKey) => MapFn<IRegistration>;
|
|
13
12
|
export declare const alias: (...aliases: Alias[]) => MapFn<IRegistration>;
|
|
14
13
|
export declare const scope: (predicate: ScopePredicate) => MapFn<IRegistration>;
|
|
15
|
-
export declare const getTransformers:
|
|
16
|
-
export declare const register: (...mappers:
|
|
17
|
-
export declare const provider: (...mappers: MapFn<IProvider>[]) => MapFn<IRegistration>;
|
|
14
|
+
export declare const getTransformers: (Target: constructor<unknown>) => MapFn<IRegistration<unknown>>[];
|
|
15
|
+
export declare const register: (...mappers: MapFn<IRegistration>[]) => ClassDecorator;
|
|
@@ -5,17 +5,16 @@ import { IRegistration, ScopePredicate } from './IRegistration';
|
|
|
5
5
|
export declare class Registration<T = unknown> implements IRegistration<T> {
|
|
6
6
|
private createProvider;
|
|
7
7
|
private key?;
|
|
8
|
-
|
|
9
|
-
static
|
|
8
|
+
private matchScope;
|
|
9
|
+
static fromClass<T>(Target: constructor<T>): IRegistration<unknown>;
|
|
10
|
+
static fromValue<T>(value: T): IRegistration<unknown>;
|
|
10
11
|
static fromFn<T>(fn: ResolveDependency<T>): Registration<T>;
|
|
11
12
|
private aliases;
|
|
12
13
|
private mappers;
|
|
13
|
-
|
|
14
|
-
constructor(createProvider: () => IProvider<T>, key?: DependencyKey | undefined);
|
|
14
|
+
constructor(createProvider: () => IProvider<T>, key?: DependencyKey | undefined, matchScope?: ScopePredicate);
|
|
15
15
|
to(key: DependencyKey): this;
|
|
16
16
|
addAliases(...aliases: Alias[]): this;
|
|
17
|
-
pipe(...mappers:
|
|
18
|
-
provider(...mappers: MapFn<IProvider<T>>[]): this;
|
|
17
|
+
pipe(...mappers: MapFn<IProvider<T>>[]): this;
|
|
19
18
|
applyTo(container: IContainer): void;
|
|
20
19
|
when(isValidWhen: ScopePredicate): this;
|
|
21
20
|
}
|
package/typings/utils.d.ts
CHANGED
|
@@ -4,4 +4,3 @@ export declare const pipe: <T>(...mappers: MapFn<T>[]) => MapFn<T>;
|
|
|
4
4
|
export declare function fillEmptyIndexes<T>(baseArr: (T | undefined)[], insertArr: T[]): T[];
|
|
5
5
|
export declare const constant: <T>(value: T) => () => T;
|
|
6
6
|
export declare const isConstructor: (T: unknown) => T is constructor<unknown>;
|
|
7
|
-
export declare function groupBy<T>(items: T[], predicate: (value: T) => boolean): T[][];
|