ts-ioc-container 28.1.0 → 29.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 +32 -16
- package/cjm/by.js +0 -10
- package/cjm/errors/ContainerDisposedError.js +5 -5
- package/cjm/index.js +5 -4
- package/cjm/provider/PredicateProvider.js +30 -0
- package/cjm/provider/Provider.js +4 -4
- package/cjm/provider/ProviderDecorator.js +2 -2
- package/cjm/provider/Registration.js +4 -4
- package/esm/by.js +0 -10
- package/esm/errors/ContainerDisposedError.js +5 -5
- package/esm/index.js +1 -1
- package/esm/provider/PredicateProvider.js +25 -0
- package/esm/provider/Provider.js +4 -4
- package/esm/provider/ProviderDecorator.js +2 -2
- package/esm/provider/Registration.js +4 -4
- package/package.json +3 -3
- package/typings/by.d.ts +1 -5
- package/typings/container/IContainer.d.ts +3 -3
- package/typings/index.d.ts +1 -1
- package/typings/injector/MetadataInjector.d.ts +1 -1
- package/typings/provider/ArgsProvider.d.ts +1 -1
- package/typings/provider/IProvider.d.ts +3 -3
- package/typings/provider/PredicateProvider.d.ts +18 -0
- package/typings/provider/ProviderDecorator.d.ts +2 -2
- package/typings/utils.d.ts +2 -2
- package/cjm/provider/TaggedProvider.js +0 -22
- package/esm/provider/TaggedProvider.js +0 -17
- package/typings/provider/TaggedProvider.d.ts +0 -12
package/README.md
CHANGED
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
- [Registration module (Provider + DependencyKey)](#registration-and-providers) `@key`
|
|
34
34
|
- [Provider](#provider) `@provider`
|
|
35
35
|
- [Singleton provider](#singleton-provider)
|
|
36
|
-
- [
|
|
36
|
+
- [Predicate provider](#predicate-provider)
|
|
37
37
|
- [Args provider](#args-provider)
|
|
38
38
|
- [Aliases](#aliases) `alias`
|
|
39
39
|
- [Container modules](#container-modules)
|
|
@@ -137,15 +137,16 @@ import {
|
|
|
137
137
|
Container,
|
|
138
138
|
DependencyNotFoundError,
|
|
139
139
|
key,
|
|
140
|
-
|
|
140
|
+
whenScope,
|
|
141
141
|
provider,
|
|
142
142
|
MetadataInjector,
|
|
143
143
|
Registration as R,
|
|
144
144
|
by,
|
|
145
|
+
hasTags,
|
|
145
146
|
} from 'ts-ioc-container';
|
|
146
147
|
|
|
147
148
|
@key('ILogger')
|
|
148
|
-
@provider(singleton(),
|
|
149
|
+
@provider(singleton(), whenScope(hasTags.someOf('child')))
|
|
149
150
|
class Logger {}
|
|
150
151
|
|
|
151
152
|
describe('Scopes', function () {
|
|
@@ -310,7 +311,10 @@ describe('SimpleInjector', function () {
|
|
|
310
311
|
|
|
311
312
|
it('should pass parameters alongside with container', function () {
|
|
312
313
|
class App {
|
|
313
|
-
constructor(
|
|
314
|
+
constructor(
|
|
315
|
+
container: IContainer,
|
|
316
|
+
public greeting: string,
|
|
317
|
+
) {}
|
|
314
318
|
}
|
|
315
319
|
|
|
316
320
|
const container = new Container(new SimpleInjector()).use(R.fromClass(App).to('App'));
|
|
@@ -390,7 +394,7 @@ describe('ProxyInjector', function () {
|
|
|
390
394
|
There are next types of providers:
|
|
391
395
|
- `Provider` - basic provider. It can be used with `@provider` decorator
|
|
392
396
|
- `SingletonProvider` - provider that creates only one instance in every scope where it's resolved
|
|
393
|
-
- `
|
|
397
|
+
- `PredicateProvider` - provider that can be resolved only from container with certain tags and their sub scopes
|
|
394
398
|
- `ArgsProvider` - provider that encapsulates arguments to pass it to constructor.
|
|
395
399
|
|
|
396
400
|
`Registration` - just a helper to register provider with certain key. `(preferrably to use)`
|
|
@@ -400,7 +404,16 @@ Sometimes you need to keep dependency key with class together. For example, you
|
|
|
400
404
|
|
|
401
405
|
```typescript
|
|
402
406
|
import 'reflect-metadata';
|
|
403
|
-
import {
|
|
407
|
+
import {
|
|
408
|
+
singleton,
|
|
409
|
+
Container,
|
|
410
|
+
provider,
|
|
411
|
+
MetadataInjector,
|
|
412
|
+
Registration as R,
|
|
413
|
+
key,
|
|
414
|
+
whenScope,
|
|
415
|
+
hasTags,
|
|
416
|
+
} from 'ts-ioc-container';
|
|
404
417
|
import { DependencyMissingKeyError } from '../../lib/errors/DependencyMissingKeyError';
|
|
405
418
|
|
|
406
419
|
describe('Registration module', function () {
|
|
@@ -408,7 +421,7 @@ describe('Registration module', function () {
|
|
|
408
421
|
|
|
409
422
|
it('should register class', function () {
|
|
410
423
|
@key('ILogger')
|
|
411
|
-
@provider(singleton(),
|
|
424
|
+
@provider(singleton(), whenScope(hasTags.someOf('root')))
|
|
412
425
|
class Logger {}
|
|
413
426
|
|
|
414
427
|
const root = createContainer().use(R.fromClass(Logger));
|
|
@@ -449,7 +462,7 @@ describe('Registration module', function () {
|
|
|
449
462
|
|
|
450
463
|
```typescript
|
|
451
464
|
import 'reflect-metadata';
|
|
452
|
-
import { singleton, Container,
|
|
465
|
+
import { singleton, Container, Provider, MetadataInjector, whenScope, hasTags } from 'ts-ioc-container';
|
|
453
466
|
|
|
454
467
|
class Logger {}
|
|
455
468
|
|
|
@@ -475,7 +488,7 @@ describe('Provider', function () {
|
|
|
475
488
|
it('can be featured by pipe method', function () {
|
|
476
489
|
const root = new Container(new MetadataInjector(), { tags: ['root'] }).register(
|
|
477
490
|
'ILogger',
|
|
478
|
-
Provider.fromClass(Logger).pipe(singleton(),
|
|
491
|
+
Provider.fromClass(Logger).pipe(singleton(), whenScope(hasTags.someOf('root'))),
|
|
479
492
|
);
|
|
480
493
|
|
|
481
494
|
expect(root.resolve('ILogger')).toBe(root.resolve('ILogger'));
|
|
@@ -526,18 +539,18 @@ describe('Singleton', function () {
|
|
|
526
539
|
|
|
527
540
|
```
|
|
528
541
|
|
|
529
|
-
###
|
|
530
|
-
Sometimes you need to resolve provider only from container
|
|
531
|
-
- NOTICE: It doesn't make clones in not
|
|
542
|
+
### Predicate provider
|
|
543
|
+
Sometimes you need to resolve provider only from container which matches to certain predicate and their sub scopes. Especially if you want to register dependency as singleton for some tags, for example `root`
|
|
544
|
+
- NOTICE: It doesn't make clones in not predicate-matched scopes. Usually it's used with `SingletonProvider`.
|
|
532
545
|
|
|
533
546
|
```typescript
|
|
534
547
|
import 'reflect-metadata';
|
|
535
|
-
import { singleton, Container, key,
|
|
548
|
+
import { singleton, Container, key, whenScope, hasTags, provider, MetadataInjector, Registration as R } from 'ts-ioc-container';
|
|
536
549
|
|
|
537
550
|
@key('ILogger')
|
|
538
|
-
@provider(singleton(),
|
|
551
|
+
@provider(singleton(), whenScope(hasTags.someOf('root'))) // the same as .pipe(singleton(), tags('root'))
|
|
539
552
|
class Logger {}
|
|
540
|
-
describe('
|
|
553
|
+
describe('PredicateProvider', function () {
|
|
541
554
|
it('should return the same instance', function () {
|
|
542
555
|
const root = new Container(new MetadataInjector(), { tags: ['root'] }).use(R.fromClass(Logger));
|
|
543
556
|
const child = root.createScope();
|
|
@@ -557,7 +570,10 @@ import { Container, key, argsFn, args, MetadataInjector, Registration as R } fro
|
|
|
557
570
|
|
|
558
571
|
@key('logger')
|
|
559
572
|
class Logger {
|
|
560
|
-
constructor(
|
|
573
|
+
constructor(
|
|
574
|
+
public name: string,
|
|
575
|
+
public type?: string,
|
|
576
|
+
) {}
|
|
561
577
|
}
|
|
562
578
|
|
|
563
579
|
describe('ArgsProvider', function () {
|
package/cjm/by.js
CHANGED
|
@@ -16,16 +16,6 @@ exports.by = {
|
|
|
16
16
|
*/
|
|
17
17
|
all: (...aliases) => (c, ...args) => c.getTokensByProvider((p) => aliases.every((alias) => p.hasAlias(alias))).map((t) => c.resolve(t, ...args)),
|
|
18
18
|
},
|
|
19
|
-
scopedAliases: {
|
|
20
|
-
some: (c, ...args) => {
|
|
21
|
-
const aliases = c.tags;
|
|
22
|
-
return exports.by.alias.some(...aliases)(c, ...args);
|
|
23
|
-
},
|
|
24
|
-
all: (c, ...args) => {
|
|
25
|
-
const aliases = c.tags;
|
|
26
|
-
return exports.by.alias.all(...aliases)(c, ...args);
|
|
27
|
-
},
|
|
28
|
-
},
|
|
29
19
|
/**
|
|
30
20
|
* Get all instances that match the given keys
|
|
31
21
|
* @param keys
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ContainerDisposedError = void 0;
|
|
4
4
|
class ContainerDisposedError extends Error {
|
|
5
|
-
constructor(message) {
|
|
6
|
-
super(message);
|
|
7
|
-
this.name = 'ContainerDisposedError';
|
|
8
|
-
Object.setPrototypeOf(this, ContainerDisposedError.prototype);
|
|
9
|
-
}
|
|
10
5
|
static assert(isTrue, failMessage) {
|
|
11
6
|
if (!isTrue) {
|
|
12
7
|
throw new ContainerDisposedError(failMessage);
|
|
13
8
|
}
|
|
14
9
|
}
|
|
10
|
+
constructor(message) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.name = 'ContainerDisposedError';
|
|
13
|
+
Object.setPrototypeOf(this, ContainerDisposedError.prototype);
|
|
14
|
+
}
|
|
15
15
|
}
|
|
16
16
|
exports.ContainerDisposedError = ContainerDisposedError;
|
package/cjm/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.setParameterMetadata = exports.getMetadata = exports.setMetadata = exports.by = exports.hook = exports.getHooks = exports.ProxyInjector = exports.SimpleInjector = exports.inject = exports.MetadataInjector = exports.Registration = exports.key = exports.AutoMockedContainer = exports.
|
|
3
|
+
exports.setParameterMetadata = exports.getMetadata = exports.setMetadata = exports.by = exports.hook = exports.getHooks = exports.ProxyInjector = exports.SimpleInjector = exports.inject = exports.MetadataInjector = exports.Registration = exports.key = exports.AutoMockedContainer = exports.PredicateProvider = exports.hasTags = exports.whenScope = exports.SingletonProvider = exports.singleton = exports.ArgsProvider = exports.args = exports.argsFn = exports.provider = exports.Provider = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.DependencyNotFoundError = exports.alias = 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");
|
|
@@ -25,9 +25,10 @@ Object.defineProperty(exports, "ArgsProvider", { enumerable: true, get: function
|
|
|
25
25
|
var SingletonProvider_1 = require("./provider/SingletonProvider");
|
|
26
26
|
Object.defineProperty(exports, "singleton", { enumerable: true, get: function () { return SingletonProvider_1.singleton; } });
|
|
27
27
|
Object.defineProperty(exports, "SingletonProvider", { enumerable: true, get: function () { return SingletonProvider_1.SingletonProvider; } });
|
|
28
|
-
var
|
|
29
|
-
Object.defineProperty(exports, "
|
|
30
|
-
Object.defineProperty(exports, "
|
|
28
|
+
var PredicateProvider_1 = require("./provider/PredicateProvider");
|
|
29
|
+
Object.defineProperty(exports, "whenScope", { enumerable: true, get: function () { return PredicateProvider_1.whenScope; } });
|
|
30
|
+
Object.defineProperty(exports, "hasTags", { enumerable: true, get: function () { return PredicateProvider_1.hasTags; } });
|
|
31
|
+
Object.defineProperty(exports, "PredicateProvider", { enumerable: true, get: function () { return PredicateProvider_1.PredicateProvider; } });
|
|
31
32
|
var AutoMockedContainer_1 = require("./container/AutoMockedContainer");
|
|
32
33
|
Object.defineProperty(exports, "AutoMockedContainer", { enumerable: true, get: function () { return AutoMockedContainer_1.AutoMockedContainer; } });
|
|
33
34
|
var Registration_1 = require("./provider/Registration");
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PredicateProvider = exports.whenScope = exports.hasTags = void 0;
|
|
4
|
+
const ProviderDecorator_1 = require("./ProviderDecorator");
|
|
5
|
+
exports.hasTags = {
|
|
6
|
+
someOf: (...tags) => {
|
|
7
|
+
return (c) => tags.some((t) => c.hasTag(t));
|
|
8
|
+
},
|
|
9
|
+
allOf: (...tags) => {
|
|
10
|
+
return (c) => tags.every((t) => c.hasTag(t));
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
function whenScope(predicate) {
|
|
14
|
+
return (provider) => new PredicateProvider(provider, predicate);
|
|
15
|
+
}
|
|
16
|
+
exports.whenScope = whenScope;
|
|
17
|
+
class PredicateProvider extends ProviderDecorator_1.ProviderDecorator {
|
|
18
|
+
constructor(provider, predicate) {
|
|
19
|
+
super(provider);
|
|
20
|
+
this.provider = provider;
|
|
21
|
+
this.predicate = predicate;
|
|
22
|
+
}
|
|
23
|
+
clone() {
|
|
24
|
+
return new PredicateProvider(this.provider.clone(), this.predicate);
|
|
25
|
+
}
|
|
26
|
+
isValid(container) {
|
|
27
|
+
return this.predicate(container) && this.provider.isValid(container);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.PredicateProvider = PredicateProvider;
|
package/cjm/provider/Provider.js
CHANGED
|
@@ -7,10 +7,6 @@ const PROVIDER_KEY = 'provider';
|
|
|
7
7
|
const provider = (...mappers) => (0, metadata_1.setMetadata)(PROVIDER_KEY, mappers);
|
|
8
8
|
exports.provider = provider;
|
|
9
9
|
class Provider {
|
|
10
|
-
constructor(resolveDependency) {
|
|
11
|
-
this.resolveDependency = resolveDependency;
|
|
12
|
-
this.aliases = new Set();
|
|
13
|
-
}
|
|
14
10
|
static fromClass(Target) {
|
|
15
11
|
var _a;
|
|
16
12
|
const mappers = (_a = (0, metadata_1.getMetadata)(Target, PROVIDER_KEY)) !== null && _a !== void 0 ? _a : [];
|
|
@@ -19,6 +15,10 @@ class Provider {
|
|
|
19
15
|
static fromValue(value) {
|
|
20
16
|
return new Provider(() => value);
|
|
21
17
|
}
|
|
18
|
+
constructor(resolveDependency) {
|
|
19
|
+
this.resolveDependency = resolveDependency;
|
|
20
|
+
this.aliases = new Set();
|
|
21
|
+
}
|
|
22
22
|
pipe(...mappers) {
|
|
23
23
|
return (0, utils_1.pipe)(...mappers)(this);
|
|
24
24
|
}
|
|
@@ -13,8 +13,8 @@ class ProviderDecorator {
|
|
|
13
13
|
hasAlias(alias) {
|
|
14
14
|
return this.decorated.hasAlias(alias);
|
|
15
15
|
}
|
|
16
|
-
isValid(
|
|
17
|
-
return this.decorated.isValid(
|
|
16
|
+
isValid(container) {
|
|
17
|
+
return this.decorated.isValid(container);
|
|
18
18
|
}
|
|
19
19
|
resolve(container, ...args) {
|
|
20
20
|
return this.decorated.resolve(container, ...args);
|
|
@@ -8,10 +8,6 @@ const DEPENDENCY_KEY = 'DEPENDENCY_KEY';
|
|
|
8
8
|
const key = (value) => (0, metadata_1.setMetadata)(DEPENDENCY_KEY, value);
|
|
9
9
|
exports.key = key;
|
|
10
10
|
class Registration {
|
|
11
|
-
constructor(provider, key) {
|
|
12
|
-
this.provider = provider;
|
|
13
|
-
this.key = key;
|
|
14
|
-
}
|
|
15
11
|
static fromClass(Target) {
|
|
16
12
|
const dependencyKey = (0, metadata_1.getMetadata)(Target, DEPENDENCY_KEY);
|
|
17
13
|
return new Registration(Provider_1.Provider.fromClass(Target), dependencyKey !== null && dependencyKey !== void 0 ? dependencyKey : Target.name);
|
|
@@ -22,6 +18,10 @@ class Registration {
|
|
|
22
18
|
static fromFn(fn) {
|
|
23
19
|
return new Registration(new Provider_1.Provider(fn));
|
|
24
20
|
}
|
|
21
|
+
constructor(provider, key) {
|
|
22
|
+
this.provider = provider;
|
|
23
|
+
this.key = key;
|
|
24
|
+
}
|
|
25
25
|
to(key) {
|
|
26
26
|
this.key = key;
|
|
27
27
|
return this;
|
package/esm/by.js
CHANGED
|
@@ -12,16 +12,6 @@ export const by = {
|
|
|
12
12
|
*/
|
|
13
13
|
all: (...aliases) => (c, ...args) => c.getTokensByProvider((p) => aliases.every((alias) => p.hasAlias(alias))).map((t) => c.resolve(t, ...args)),
|
|
14
14
|
},
|
|
15
|
-
scopedAliases: {
|
|
16
|
-
some: (c, ...args) => {
|
|
17
|
-
const aliases = c.tags;
|
|
18
|
-
return by.alias.some(...aliases)(c, ...args);
|
|
19
|
-
},
|
|
20
|
-
all: (c, ...args) => {
|
|
21
|
-
const aliases = c.tags;
|
|
22
|
-
return by.alias.all(...aliases)(c, ...args);
|
|
23
|
-
},
|
|
24
|
-
},
|
|
25
15
|
/**
|
|
26
16
|
* Get all instances that match the given keys
|
|
27
17
|
* @param keys
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
export class ContainerDisposedError extends Error {
|
|
2
|
-
constructor(message) {
|
|
3
|
-
super(message);
|
|
4
|
-
this.name = 'ContainerDisposedError';
|
|
5
|
-
Object.setPrototypeOf(this, ContainerDisposedError.prototype);
|
|
6
|
-
}
|
|
7
2
|
static assert(isTrue, failMessage) {
|
|
8
3
|
if (!isTrue) {
|
|
9
4
|
throw new ContainerDisposedError(failMessage);
|
|
10
5
|
}
|
|
11
6
|
}
|
|
7
|
+
constructor(message) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.name = 'ContainerDisposedError';
|
|
10
|
+
Object.setPrototypeOf(this, ContainerDisposedError.prototype);
|
|
11
|
+
}
|
|
12
12
|
}
|
package/esm/index.js
CHANGED
|
@@ -8,7 +8,7 @@ export { ContainerDisposedError } from './errors/ContainerDisposedError';
|
|
|
8
8
|
export { Provider, provider } from './provider/Provider';
|
|
9
9
|
export { argsFn, args, ArgsProvider } from './provider/ArgsProvider';
|
|
10
10
|
export { singleton, SingletonProvider } from './provider/SingletonProvider';
|
|
11
|
-
export {
|
|
11
|
+
export { whenScope, hasTags, PredicateProvider } from './provider/PredicateProvider';
|
|
12
12
|
export { AutoMockedContainer } from './container/AutoMockedContainer';
|
|
13
13
|
export { key, Registration } from './provider/Registration';
|
|
14
14
|
export { MetadataInjector, inject } from './injector/MetadataInjector';
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ProviderDecorator } from './ProviderDecorator';
|
|
2
|
+
export const hasTags = {
|
|
3
|
+
someOf: (...tags) => {
|
|
4
|
+
return (c) => tags.some((t) => c.hasTag(t));
|
|
5
|
+
},
|
|
6
|
+
allOf: (...tags) => {
|
|
7
|
+
return (c) => tags.every((t) => c.hasTag(t));
|
|
8
|
+
},
|
|
9
|
+
};
|
|
10
|
+
export function whenScope(predicate) {
|
|
11
|
+
return (provider) => new PredicateProvider(provider, predicate);
|
|
12
|
+
}
|
|
13
|
+
export class PredicateProvider extends ProviderDecorator {
|
|
14
|
+
constructor(provider, predicate) {
|
|
15
|
+
super(provider);
|
|
16
|
+
this.provider = provider;
|
|
17
|
+
this.predicate = predicate;
|
|
18
|
+
}
|
|
19
|
+
clone() {
|
|
20
|
+
return new PredicateProvider(this.provider.clone(), this.predicate);
|
|
21
|
+
}
|
|
22
|
+
isValid(container) {
|
|
23
|
+
return this.predicate(container) && this.provider.isValid(container);
|
|
24
|
+
}
|
|
25
|
+
}
|
package/esm/provider/Provider.js
CHANGED
|
@@ -3,10 +3,6 @@ import { getMetadata, setMetadata } from '../metadata';
|
|
|
3
3
|
const PROVIDER_KEY = 'provider';
|
|
4
4
|
export const provider = (...mappers) => setMetadata(PROVIDER_KEY, mappers);
|
|
5
5
|
export class Provider {
|
|
6
|
-
constructor(resolveDependency) {
|
|
7
|
-
this.resolveDependency = resolveDependency;
|
|
8
|
-
this.aliases = new Set();
|
|
9
|
-
}
|
|
10
6
|
static fromClass(Target) {
|
|
11
7
|
var _a;
|
|
12
8
|
const mappers = (_a = getMetadata(Target, PROVIDER_KEY)) !== null && _a !== void 0 ? _a : [];
|
|
@@ -15,6 +11,10 @@ export class Provider {
|
|
|
15
11
|
static fromValue(value) {
|
|
16
12
|
return new Provider(() => value);
|
|
17
13
|
}
|
|
14
|
+
constructor(resolveDependency) {
|
|
15
|
+
this.resolveDependency = resolveDependency;
|
|
16
|
+
this.aliases = new Set();
|
|
17
|
+
}
|
|
18
18
|
pipe(...mappers) {
|
|
19
19
|
return pipe(...mappers)(this);
|
|
20
20
|
}
|
|
@@ -10,8 +10,8 @@ export class ProviderDecorator {
|
|
|
10
10
|
hasAlias(alias) {
|
|
11
11
|
return this.decorated.hasAlias(alias);
|
|
12
12
|
}
|
|
13
|
-
isValid(
|
|
14
|
-
return this.decorated.isValid(
|
|
13
|
+
isValid(container) {
|
|
14
|
+
return this.decorated.isValid(container);
|
|
15
15
|
}
|
|
16
16
|
resolve(container, ...args) {
|
|
17
17
|
return this.decorated.resolve(container, ...args);
|
|
@@ -4,10 +4,6 @@ import { DependencyMissingKeyError } from '../errors/DependencyMissingKeyError';
|
|
|
4
4
|
const DEPENDENCY_KEY = 'DEPENDENCY_KEY';
|
|
5
5
|
export const key = (value) => setMetadata(DEPENDENCY_KEY, value);
|
|
6
6
|
export class Registration {
|
|
7
|
-
constructor(provider, key) {
|
|
8
|
-
this.provider = provider;
|
|
9
|
-
this.key = key;
|
|
10
|
-
}
|
|
11
7
|
static fromClass(Target) {
|
|
12
8
|
const dependencyKey = getMetadata(Target, DEPENDENCY_KEY);
|
|
13
9
|
return new Registration(Provider.fromClass(Target), dependencyKey !== null && dependencyKey !== void 0 ? dependencyKey : Target.name);
|
|
@@ -18,6 +14,10 @@ export class Registration {
|
|
|
18
14
|
static fromFn(fn) {
|
|
19
15
|
return new Registration(new Provider(fn));
|
|
20
16
|
}
|
|
17
|
+
constructor(provider, key) {
|
|
18
|
+
this.provider = provider;
|
|
19
|
+
this.key = key;
|
|
20
|
+
}
|
|
21
21
|
to(key) {
|
|
22
22
|
this.key = key;
|
|
23
23
|
return this;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ts-ioc-container",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "29.0.0",
|
|
4
4
|
"description": "Typescript IoC container",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public",
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"rimraf": "3.0.2",
|
|
59
59
|
"ts-jest": "27.0.5",
|
|
60
60
|
"ts-node": "^10.9.1",
|
|
61
|
-
"typescript": "
|
|
61
|
+
"typescript": "5.4.3"
|
|
62
62
|
},
|
|
63
|
-
"gitHead": "
|
|
63
|
+
"gitHead": "9dac9e73a0d041ec58d7d2b8cdcb734cea57fc18"
|
|
64
64
|
}
|
package/typings/by.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DependencyKey, IContainer, InjectionToken } from './container/IContainer';
|
|
2
|
-
export
|
|
2
|
+
export type InstancePredicate = (dep: unknown) => boolean;
|
|
3
3
|
export declare const all: InstancePredicate;
|
|
4
4
|
export declare const by: {
|
|
5
5
|
alias: {
|
|
@@ -14,10 +14,6 @@ export declare const by: {
|
|
|
14
14
|
*/
|
|
15
15
|
all: (...aliases: DependencyKey[]) => (c: IContainer, ...args: unknown[]) => unknown[];
|
|
16
16
|
};
|
|
17
|
-
scopedAliases: {
|
|
18
|
-
some: (c: IContainer, ...args: unknown[]) => unknown[];
|
|
19
|
-
all: (c: IContainer, ...args: unknown[]) => unknown[];
|
|
20
|
-
};
|
|
21
17
|
/**
|
|
22
18
|
* Get all instances that match the given keys
|
|
23
19
|
* @param keys
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { IProvider } from '../provider/IProvider';
|
|
2
2
|
import { constructor } from '../utils';
|
|
3
|
-
export
|
|
3
|
+
export type Tag = string;
|
|
4
4
|
export interface Tagged {
|
|
5
5
|
readonly tags: Tag[];
|
|
6
6
|
hasTag(tag: Tag): boolean;
|
|
7
7
|
}
|
|
8
|
-
export
|
|
8
|
+
export type DependencyKey = string | symbol;
|
|
9
9
|
export declare function isDependencyKey<T>(token: InjectionToken<T>): token is DependencyKey;
|
|
10
10
|
export declare function isConstructor<T>(token: InjectionToken<T>): token is constructor<T>;
|
|
11
|
-
export
|
|
11
|
+
export type InjectionToken<T = unknown> = constructor<T> | DependencyKey;
|
|
12
12
|
export interface Resolvable {
|
|
13
13
|
resolve<T>(key: InjectionToken<T>, ...args: unknown[]): T;
|
|
14
14
|
}
|
package/typings/index.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export { ContainerDisposedError } from './errors/ContainerDisposedError';
|
|
|
10
10
|
export { Provider, provider } from './provider/Provider';
|
|
11
11
|
export { ArgsFn, argsFn, args, ArgsProvider } from './provider/ArgsProvider';
|
|
12
12
|
export { singleton, SingletonProvider } from './provider/SingletonProvider';
|
|
13
|
-
export {
|
|
13
|
+
export { whenScope, hasTags, PredicateProvider } from './provider/PredicateProvider';
|
|
14
14
|
export { AutoMockedContainer } from './container/AutoMockedContainer';
|
|
15
15
|
export { key, Registration } from './provider/Registration';
|
|
16
16
|
export { MetadataInjector, inject } from './injector/MetadataInjector';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { IInjector } from './IInjector';
|
|
2
2
|
import { IContainer } from '../container/IContainer';
|
|
3
3
|
import { constructor } from '../utils';
|
|
4
|
-
|
|
4
|
+
type InjectFn<T = unknown> = (l: IContainer, ...args: unknown[]) => T;
|
|
5
5
|
export declare const inject: (fn: InjectFn) => ParameterDecorator;
|
|
6
6
|
export declare class MetadataInjector implements IInjector {
|
|
7
7
|
resolve<T>(container: IContainer, Target: constructor<T>, ...deps: unknown[]): T;
|
|
@@ -2,7 +2,7 @@ import { ProviderDecorator } from './ProviderDecorator';
|
|
|
2
2
|
import { Resolvable } from '../container/IContainer';
|
|
3
3
|
import { IProvider } from './IProvider';
|
|
4
4
|
import { MapFn } from '../utils';
|
|
5
|
-
export
|
|
5
|
+
export type ArgsFn = (l: Resolvable) => unknown[];
|
|
6
6
|
export declare function args<T = unknown>(...extraArgs: unknown[]): MapFn<IProvider<T>>;
|
|
7
7
|
export declare function argsFn<T = unknown>(value: ArgsFn): MapFn<IProvider<T>>;
|
|
8
8
|
export declare class ArgsProvider<T> extends ProviderDecorator<T> {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { DependencyKey,
|
|
1
|
+
import { DependencyKey, IContainer, Resolvable } from '../container/IContainer';
|
|
2
2
|
import { MapFn } from '../utils';
|
|
3
|
-
export
|
|
3
|
+
export type ResolveDependency<T = unknown> = (container: Resolvable, ...args: unknown[]) => T;
|
|
4
4
|
export interface IProvider<T = unknown> {
|
|
5
5
|
clone(): IProvider<T>;
|
|
6
6
|
resolve(container: Resolvable, ...args: unknown[]): T;
|
|
7
|
-
isValid(
|
|
7
|
+
isValid(container: IContainer): boolean;
|
|
8
8
|
pipe(...mappers: MapFn<IProvider<T>>[]): IProvider<T>;
|
|
9
9
|
hasAlias(alias: DependencyKey): boolean;
|
|
10
10
|
addAliases(...aliases: DependencyKey[]): this;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { IProvider } from './IProvider';
|
|
2
|
+
import { ProviderDecorator } from './ProviderDecorator';
|
|
3
|
+
import { IContainer, Tag } from '../container/IContainer';
|
|
4
|
+
import { MapFn } from '../utils';
|
|
5
|
+
type ContainerPredicate = (c: IContainer) => boolean;
|
|
6
|
+
export declare const hasTags: {
|
|
7
|
+
someOf: (...tags: Tag[]) => ContainerPredicate;
|
|
8
|
+
allOf: (...tags: Tag[]) => ContainerPredicate;
|
|
9
|
+
};
|
|
10
|
+
export declare function whenScope<T = unknown>(predicate: ContainerPredicate): MapFn<IProvider<T>>;
|
|
11
|
+
export declare class PredicateProvider<T> extends ProviderDecorator<T> {
|
|
12
|
+
private provider;
|
|
13
|
+
private predicate;
|
|
14
|
+
constructor(provider: IProvider<T>, predicate: ContainerPredicate);
|
|
15
|
+
clone(): PredicateProvider<T>;
|
|
16
|
+
isValid(container: IContainer): boolean;
|
|
17
|
+
}
|
|
18
|
+
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DependencyKey,
|
|
1
|
+
import { DependencyKey, IContainer, Resolvable } from '../container/IContainer';
|
|
2
2
|
import { IProvider } from './IProvider';
|
|
3
3
|
import { MapFn } from '../utils';
|
|
4
4
|
export declare abstract class ProviderDecorator<T> implements IProvider<T> {
|
|
@@ -7,7 +7,7 @@ export declare abstract class ProviderDecorator<T> implements IProvider<T> {
|
|
|
7
7
|
addAliases(...aliases: DependencyKey[]): this;
|
|
8
8
|
hasAlias(alias: DependencyKey): boolean;
|
|
9
9
|
abstract clone(): IProvider<T>;
|
|
10
|
-
isValid(
|
|
10
|
+
isValid(container: IContainer): boolean;
|
|
11
11
|
resolve(container: Resolvable, ...args: any[]): T;
|
|
12
12
|
pipe(...mappers: MapFn<IProvider<T>>[]): IProvider<T>;
|
|
13
13
|
}
|
package/typings/utils.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
1
|
+
export type constructor<T> = new (...args: any[]) => T;
|
|
2
|
+
export type MapFn<T> = (value: T) => T;
|
|
3
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;
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.TaggedProvider = exports.tags = void 0;
|
|
4
|
-
const ProviderDecorator_1 = require("./ProviderDecorator");
|
|
5
|
-
function tags(...values) {
|
|
6
|
-
return (provider) => new TaggedProvider(provider, values);
|
|
7
|
-
}
|
|
8
|
-
exports.tags = tags;
|
|
9
|
-
class TaggedProvider extends ProviderDecorator_1.ProviderDecorator {
|
|
10
|
-
constructor(provider, tags) {
|
|
11
|
-
super(provider);
|
|
12
|
-
this.provider = provider;
|
|
13
|
-
this.tags = tags;
|
|
14
|
-
}
|
|
15
|
-
clone() {
|
|
16
|
-
return new TaggedProvider(this.provider.clone(), this.tags);
|
|
17
|
-
}
|
|
18
|
-
isValid(filters) {
|
|
19
|
-
return this.tags.some((t) => filters.hasTag(t)) && this.provider.isValid(filters);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
exports.TaggedProvider = TaggedProvider;
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { ProviderDecorator } from './ProviderDecorator';
|
|
2
|
-
export function tags(...values) {
|
|
3
|
-
return (provider) => new TaggedProvider(provider, values);
|
|
4
|
-
}
|
|
5
|
-
export class TaggedProvider extends ProviderDecorator {
|
|
6
|
-
constructor(provider, tags) {
|
|
7
|
-
super(provider);
|
|
8
|
-
this.provider = provider;
|
|
9
|
-
this.tags = tags;
|
|
10
|
-
}
|
|
11
|
-
clone() {
|
|
12
|
-
return new TaggedProvider(this.provider.clone(), this.tags);
|
|
13
|
-
}
|
|
14
|
-
isValid(filters) {
|
|
15
|
-
return this.tags.some((t) => filters.hasTag(t)) && this.provider.isValid(filters);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { IProvider } from './IProvider';
|
|
2
|
-
import { ProviderDecorator } from './ProviderDecorator';
|
|
3
|
-
import { Tag, Tagged } from '../container/IContainer';
|
|
4
|
-
import { MapFn } from '../utils';
|
|
5
|
-
export declare function tags<T = unknown>(...values: Tag[]): MapFn<IProvider<T>>;
|
|
6
|
-
export declare class TaggedProvider<T> extends ProviderDecorator<T> {
|
|
7
|
-
private provider;
|
|
8
|
-
private readonly tags;
|
|
9
|
-
constructor(provider: IProvider<T>, tags: Tag[]);
|
|
10
|
-
clone(): TaggedProvider<T>;
|
|
11
|
-
isValid(filters: Tagged): boolean;
|
|
12
|
-
}
|