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 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
- - [Tagged provider](#tagged-provider)
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
- tags,
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(), tags('child'))
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(container: IContainer, public greeting: string) {}
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
- - `TaggedProvider` - provider that can be resolved only from container with certain tags and their sub scopes
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 { singleton, Container, tags, provider, MetadataInjector, Registration as R, key } from 'ts-ioc-container';
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(), tags('root'))
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, tags, Provider, MetadataInjector } from 'ts-ioc-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(), tags('root')),
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
- ### Tagged provider
530
- Sometimes you need to resolve provider only from container with certain tags and their sub scopes. Especially if you want to register dependency as singleton for some tags, for example `root`
531
- - NOTICE: It doesn't make clones in not tagged-matched scopes. Usually it's used with `SingletonProvider`.
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, tags, provider, MetadataInjector, Registration as R } from 'ts-ioc-container';
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(), tags('root')) // the same as .pipe(singleton(), tags('root'))
551
+ @provider(singleton(), whenScope(hasTags.someOf('root'))) // the same as .pipe(singleton(), tags('root'))
539
552
  class Logger {}
540
- describe('TaggedProvider', function () {
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(public name: string, public type?: string) {}
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.TaggedProvider = exports.tags = 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;
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 TaggedProvider_1 = require("./provider/TaggedProvider");
29
- Object.defineProperty(exports, "tags", { enumerable: true, get: function () { return TaggedProvider_1.tags; } });
30
- Object.defineProperty(exports, "TaggedProvider", { enumerable: true, get: function () { return TaggedProvider_1.TaggedProvider; } });
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;
@@ -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(filters) {
17
- return this.decorated.isValid(filters);
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 { tags, TaggedProvider } from './provider/TaggedProvider';
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
+ }
@@ -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(filters) {
14
- return this.decorated.isValid(filters);
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": "28.1.0",
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": "4.4.3"
61
+ "typescript": "5.4.3"
62
62
  },
63
- "gitHead": "e69612c0f14d298af86263fc197b48ee4a1d8acd"
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 declare type InstancePredicate = (dep: unknown) => boolean;
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 declare type Tag = string;
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 declare type DependencyKey = string | symbol;
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 declare type InjectionToken<T = unknown> = constructor<T> | DependencyKey;
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
  }
@@ -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 { tags, TaggedProvider } from './provider/TaggedProvider';
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
- declare type InjectFn<T = unknown> = (l: IContainer, ...args: unknown[]) => T;
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 declare type ArgsFn = (l: Resolvable) => unknown[];
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, Resolvable, Tagged } from '../container/IContainer';
1
+ import { DependencyKey, IContainer, Resolvable } from '../container/IContainer';
2
2
  import { MapFn } from '../utils';
3
- export declare type ResolveDependency<T = unknown> = (container: Resolvable, ...args: unknown[]) => T;
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(filters: Tagged): boolean;
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, Resolvable, Tagged } from '../container/IContainer';
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(filters: Tagged): boolean;
10
+ isValid(container: IContainer): boolean;
11
11
  resolve(container: Resolvable, ...args: any[]): T;
12
12
  pipe(...mappers: MapFn<IProvider<T>>[]): IProvider<T>;
13
13
  }
@@ -1,5 +1,5 @@
1
- export declare type constructor<T> = new (...args: any[]) => T;
2
- export declare type MapFn<T> = (value: T) => T;
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
- }