ts-ioc-container 30.1.1 → 30.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 CHANGED
@@ -318,7 +318,7 @@ describe('SimpleInjector', function () {
318
318
  }
319
319
 
320
320
  const container = new Container(new SimpleInjector()).use(R.fromClass(App).to('App'));
321
- const app = container.resolve<App>('App', 'Hello world');
321
+ const app = container.resolve<App>('App', { args: ['Hello world'] });
322
322
 
323
323
  expect(app.greeting).toBe('Hello world');
324
324
  });
@@ -378,7 +378,7 @@ describe('ProxyInjector', function () {
378
378
  .use(R.fromClass(App).to('App').pipe(args({ greetingTemplate })))
379
379
  .use(R.fromClass(Logger).to('logger'));
380
380
 
381
- const app = container.resolve<App>('App', { name: `world` });
381
+ const app = container.resolve<App>('App', { args: [{ name: `world` }] });
382
382
  expect(app.greeting).toBe('Hello world');
383
383
  });
384
384
  });
@@ -592,7 +592,7 @@ describe('ArgsProvider', function () {
592
592
  it('should set provider arguments with highest priority in compare to resolve arguments', function () {
593
593
  const root = createContainer().use(R.fromClass(Logger).pipe(args('name')));
594
594
 
595
- const logger = root.resolve<Logger>('logger', 'file');
595
+ const logger = root.resolve<Logger>('logger', { args: ['file'] });
596
596
 
597
597
  expect(logger.name).toBe('name');
598
598
  expect(logger.type).toBe('file');
@@ -855,7 +855,7 @@ import { IMock, Mock } from 'moq.ts';
855
855
  export class MoqContainer extends AutoMockedContainer {
856
856
  private mocks = new Map<DependencyKey, IMock<any>>();
857
857
 
858
- resolveFromChild<T>(key: DependencyKey): T {
858
+ resolve<T>(key: DependencyKey): T {
859
859
  return this.resolveMock<T>(key).object();
860
860
  }
861
861
 
package/cjm/by.js CHANGED
@@ -8,7 +8,7 @@ const isPresent = (value) => value !== null && value !== undefined;
8
8
  exports.isPresent = isPresent;
9
9
  const resolveSilently = (c, ...args) => (key) => {
10
10
  try {
11
- return c.resolve(key, ...args);
11
+ return c.resolve(key, { args });
12
12
  }
13
13
  catch (e) {
14
14
  if (e instanceof DependencyNotFoundError_1.DependencyNotFoundError) {
@@ -27,13 +27,13 @@ exports.by = {
27
27
  * Get all instances that match the given keys
28
28
  * @param keys
29
29
  */
30
- keys: (...keys) => (с, ...args) => keys.map((t) => с.resolve(t, ...args)),
30
+ keys: (...keys) => (с, ...args) => keys.map((t) => с.resolve(t, { args })),
31
31
  /**
32
32
  * Get the instance that matches the given key
33
33
  * @param key
34
34
  * @param deps
35
35
  */
36
- key: (key, ...deps) => (c, ...args) => c.resolve(key, ...deps, ...args),
36
+ key: (key, ...deps) => (c, ...args) => c.resolve(key, { args: [...deps, ...args] }),
37
37
  /**
38
38
  * Get all instances that match the given predicate
39
39
  * @param predicate
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AutoMockedContainer = void 0;
4
- const index_1 = require("../index");
4
+ const MethodNotImplementedError_1 = require("../errors/MethodNotImplementedError");
5
5
  class AutoMockedContainer {
6
6
  getKeysByAlias(alias) {
7
7
  return [];
@@ -10,10 +10,7 @@ class AutoMockedContainer {
10
10
  return false;
11
11
  }
12
12
  createScope() {
13
- throw new index_1.MethodNotImplementedError();
14
- }
15
- resolve(key, ...args) {
16
- throw new index_1.DependencyNotFoundError(`Cannot find ${key.toString()}`);
13
+ throw new MethodNotImplementedError_1.MethodNotImplementedError();
17
14
  }
18
15
  dispose() { }
19
16
  register() {
@@ -23,25 +23,15 @@ class Container {
23
23
  }
24
24
  return this;
25
25
  }
26
- resolve(token, ...args) {
26
+ resolve(token, { args = [], child = this } = {}) {
27
27
  this.validateContainer();
28
28
  if ((0, IContainer_1.isConstructor)(token)) {
29
29
  return this.resolveByConstructor(token, ...args);
30
30
  }
31
31
  const provider = this.providers.get(token);
32
- return provider?.isValidToResolve(this)
32
+ return provider?.isVisible(this, child)
33
33
  ? provider.resolve(this, ...args)
34
- : this.parent.resolveFromChild(token, ...args);
35
- }
36
- resolveFromChild(token, ...args) {
37
- this.validateContainer();
38
- if ((0, IContainer_1.isConstructor)(token)) {
39
- return this.resolveByConstructor(token, ...args);
40
- }
41
- const provider = this.providers.get(token);
42
- return provider?.isValidToResolve(this, true)
43
- ? provider.resolve(this, ...args)
44
- : this.parent.resolveFromChild(token, ...args);
34
+ : this.parent.resolve(token, { args, child });
45
35
  }
46
36
  resolveByConstructor(token, ...args) {
47
37
  const instance = this.injector.resolve(this, token, ...args);
@@ -22,10 +22,7 @@ class EmptyContainer {
22
22
  register(key, value) {
23
23
  throw new MethodNotImplementedError_1.MethodNotImplementedError();
24
24
  }
25
- resolve(key) {
26
- throw new DependencyNotFoundError_1.DependencyNotFoundError(`Cannot find ${key.toString()}`);
27
- }
28
- resolveFromChild(key, ...args) {
25
+ resolve(key, options) {
29
26
  throw new DependencyNotFoundError_1.DependencyNotFoundError(`Cannot find ${key.toString()}`);
30
27
  }
31
28
  getAllProviders() {
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.alias = exports.register = exports.Registration = exports.key = exports.AutoMockedContainer = exports.ScopeProvider = exports.scope = exports.SingletonProvider = exports.singleton = exports.ArgsProvider = exports.args = exports.argsFn = exports.hideFromChildren = exports.provider = exports.Provider = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.DependencyNotFoundError = 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.alias = exports.register = exports.Registration = exports.key = exports.AutoMockedContainer = exports.ScopeProvider = exports.scope = exports.SingletonProvider = exports.singleton = exports.ArgsProvider = exports.args = exports.argsFn = exports.setVisibility = exports.provider = exports.Provider = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.DependencyNotFoundError = 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");
@@ -16,7 +16,7 @@ Object.defineProperty(exports, "ContainerDisposedError", { enumerable: true, get
16
16
  var Provider_1 = require("./provider/Provider");
17
17
  Object.defineProperty(exports, "Provider", { enumerable: true, get: function () { return Provider_1.Provider; } });
18
18
  Object.defineProperty(exports, "provider", { enumerable: true, get: function () { return Provider_1.provider; } });
19
- Object.defineProperty(exports, "hideFromChildren", { enumerable: true, get: function () { return Provider_1.hideFromChildren; } });
19
+ Object.defineProperty(exports, "setVisibility", { enumerable: true, get: function () { return Provider_1.setVisibility; } });
20
20
  var ArgsProvider_1 = require("./provider/ArgsProvider");
21
21
  Object.defineProperty(exports, "argsFn", { enumerable: true, get: function () { return ArgsProvider_1.argsFn; } });
22
22
  Object.defineProperty(exports, "args", { enumerable: true, get: function () { return ArgsProvider_1.args; } });
@@ -1,40 +1,40 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Provider = exports.hideFromChildren = exports.provider = void 0;
3
+ exports.Provider = exports.setVisibility = exports.provider = void 0;
4
4
  const utils_1 = require("../utils");
5
5
  const metadata_1 = require("../metadata");
6
6
  const PROVIDER_KEY = 'provider';
7
7
  const provider = (...mappers) => (0, metadata_1.setMetadata)(PROVIDER_KEY, mappers);
8
8
  exports.provider = provider;
9
- const hideFromChildren = (p) => p.hideFromChildren();
10
- exports.hideFromChildren = hideFromChildren;
9
+ const setVisibility = (isVisibleWhen) => (p) => p.setVisibility(isVisibleWhen);
10
+ exports.setVisibility = setVisibility;
11
11
  class Provider {
12
12
  static fromClass(Target) {
13
13
  const mappers = (0, metadata_1.getMetadata)(Target, PROVIDER_KEY) ?? [];
14
- return new Provider((container, ...args) => container.resolve(Target, ...args)).pipe(...mappers);
14
+ return new Provider((container, ...args) => container.resolve(Target, { args })).pipe(...mappers);
15
15
  }
16
16
  static fromValue(value) {
17
17
  return new Provider(() => value);
18
18
  }
19
- constructor(resolveDependency, isHiddenFromChildren = false) {
19
+ constructor(resolveDependency, isVisibleWhen = () => true) {
20
20
  this.resolveDependency = resolveDependency;
21
- this.isHiddenFromChildren = isHiddenFromChildren;
21
+ this.isVisibleWhen = isVisibleWhen;
22
22
  }
23
23
  pipe(...mappers) {
24
24
  return (0, utils_1.pipe)(...mappers)(this);
25
25
  }
26
26
  clone() {
27
- return new Provider(this.resolveDependency, this.isHiddenFromChildren);
27
+ return new Provider(this.resolveDependency, this.isVisibleWhen);
28
28
  }
29
29
  resolve(container, ...args) {
30
30
  return this.resolveDependency(container, ...args);
31
31
  }
32
- hideFromChildren() {
33
- this.isHiddenFromChildren = true;
32
+ setVisibility(isVisibleWhen) {
33
+ this.isVisibleWhen = isVisibleWhen;
34
34
  return this;
35
35
  }
36
- isValidToResolve(container, fromChild) {
37
- return !(this.isHiddenFromChildren && fromChild);
36
+ isVisible(parent, child) {
37
+ return this.isVisibleWhen(parent, child);
38
38
  }
39
39
  isValidToClone() {
40
40
  return true;
@@ -6,15 +6,15 @@ class ProviderDecorator {
6
6
  constructor(decorated) {
7
7
  this.decorated = decorated;
8
8
  }
9
- hideFromChildren() {
10
- this.decorated.hideFromChildren();
9
+ setVisibility(predicate) {
10
+ this.decorated.setVisibility(predicate);
11
11
  return this;
12
12
  }
13
13
  isValidToClone(container) {
14
14
  return this.decorated.isValidToClone(container);
15
15
  }
16
- isValidToResolve(container, fromChild) {
17
- return this.decorated.isValidToResolve(container, fromChild);
16
+ isVisible(parent, child) {
17
+ return this.decorated.isVisible(parent, child);
18
18
  }
19
19
  resolve(container, ...args) {
20
20
  return this.decorated.resolve(container, ...args);
@@ -18,8 +18,8 @@ class ScopeProvider extends ProviderDecorator_1.ProviderDecorator {
18
18
  isValidToClone(container) {
19
19
  return this.predicate(container) && this.provider.isValidToClone(container);
20
20
  }
21
- isValidToResolve(container, fromChild) {
22
- return this.predicate(container) && this.provider.isValidToResolve(container, fromChild);
21
+ isVisible(container, child) {
22
+ return this.predicate(container) && this.provider.isVisible(container, child);
23
23
  }
24
24
  }
25
25
  exports.ScopeProvider = ScopeProvider;
package/esm/by.js CHANGED
@@ -3,7 +3,7 @@ export const all = () => true;
3
3
  export const isPresent = (value) => value !== null && value !== undefined;
4
4
  export const resolveSilently = (c, ...args) => (key) => {
5
5
  try {
6
- return c.resolve(key, ...args);
6
+ return c.resolve(key, { args });
7
7
  }
8
8
  catch (e) {
9
9
  if (e instanceof DependencyNotFoundError) {
@@ -21,13 +21,13 @@ export const by = {
21
21
  * Get all instances that match the given keys
22
22
  * @param keys
23
23
  */
24
- keys: (...keys) => (с, ...args) => keys.map((t) => с.resolve(t, ...args)),
24
+ keys: (...keys) => (с, ...args) => keys.map((t) => с.resolve(t, { args })),
25
25
  /**
26
26
  * Get the instance that matches the given key
27
27
  * @param key
28
28
  * @param deps
29
29
  */
30
- key: (key, ...deps) => (c, ...args) => c.resolve(key, ...deps, ...args),
30
+ key: (key, ...deps) => (c, ...args) => c.resolve(key, { args: [...deps, ...args] }),
31
31
  /**
32
32
  * Get all instances that match the given predicate
33
33
  * @param predicate
@@ -1,4 +1,4 @@
1
- import { MethodNotImplementedError, DependencyNotFoundError, } from '../index';
1
+ import { MethodNotImplementedError } from '../errors/MethodNotImplementedError';
2
2
  export class AutoMockedContainer {
3
3
  getKeysByAlias(alias) {
4
4
  return [];
@@ -9,9 +9,6 @@ export class AutoMockedContainer {
9
9
  createScope() {
10
10
  throw new MethodNotImplementedError();
11
11
  }
12
- resolve(key, ...args) {
13
- throw new DependencyNotFoundError(`Cannot find ${key.toString()}`);
14
- }
15
12
  dispose() { }
16
13
  register() {
17
14
  return this;
@@ -20,25 +20,15 @@ export class Container {
20
20
  }
21
21
  return this;
22
22
  }
23
- resolve(token, ...args) {
23
+ resolve(token, { args = [], child = this } = {}) {
24
24
  this.validateContainer();
25
25
  if (isConstructor(token)) {
26
26
  return this.resolveByConstructor(token, ...args);
27
27
  }
28
28
  const provider = this.providers.get(token);
29
- return provider?.isValidToResolve(this)
29
+ return provider?.isVisible(this, child)
30
30
  ? provider.resolve(this, ...args)
31
- : this.parent.resolveFromChild(token, ...args);
32
- }
33
- resolveFromChild(token, ...args) {
34
- this.validateContainer();
35
- if (isConstructor(token)) {
36
- return this.resolveByConstructor(token, ...args);
37
- }
38
- const provider = this.providers.get(token);
39
- return provider?.isValidToResolve(this, true)
40
- ? provider.resolve(this, ...args)
41
- : this.parent.resolveFromChild(token, ...args);
31
+ : this.parent.resolve(token, { args, child });
42
32
  }
43
33
  resolveByConstructor(token, ...args) {
44
34
  const instance = this.injector.resolve(this, token, ...args);
@@ -19,10 +19,7 @@ export class EmptyContainer {
19
19
  register(key, value) {
20
20
  throw new MethodNotImplementedError();
21
21
  }
22
- resolve(key) {
23
- throw new DependencyNotFoundError(`Cannot find ${key.toString()}`);
24
- }
25
- resolveFromChild(key, ...args) {
22
+ resolve(key, options) {
26
23
  throw new DependencyNotFoundError(`Cannot find ${key.toString()}`);
27
24
  }
28
25
  getAllProviders() {
package/esm/index.js CHANGED
@@ -4,7 +4,7 @@ export { EmptyContainer } from './container/EmptyContainer';
4
4
  export { DependencyNotFoundError } from './errors/DependencyNotFoundError';
5
5
  export { MethodNotImplementedError } from './errors/MethodNotImplementedError';
6
6
  export { ContainerDisposedError } from './errors/ContainerDisposedError';
7
- export { Provider, provider, hideFromChildren } from './provider/Provider';
7
+ export { Provider, provider, setVisibility } from './provider/Provider';
8
8
  export { argsFn, args, ArgsProvider } from './provider/ArgsProvider';
9
9
  export { singleton, SingletonProvider } from './provider/SingletonProvider';
10
10
  export { scope, ScopeProvider } from './provider/ScopeProvider';
@@ -2,34 +2,34 @@ import { pipe } from '../utils';
2
2
  import { getMetadata, setMetadata } from '../metadata';
3
3
  const PROVIDER_KEY = 'provider';
4
4
  export const provider = (...mappers) => setMetadata(PROVIDER_KEY, mappers);
5
- export const hideFromChildren = (p) => p.hideFromChildren();
5
+ export const setVisibility = (isVisibleWhen) => (p) => p.setVisibility(isVisibleWhen);
6
6
  export class Provider {
7
7
  static fromClass(Target) {
8
8
  const mappers = getMetadata(Target, PROVIDER_KEY) ?? [];
9
- return new Provider((container, ...args) => container.resolve(Target, ...args)).pipe(...mappers);
9
+ return new Provider((container, ...args) => container.resolve(Target, { args })).pipe(...mappers);
10
10
  }
11
11
  static fromValue(value) {
12
12
  return new Provider(() => value);
13
13
  }
14
- constructor(resolveDependency, isHiddenFromChildren = false) {
14
+ constructor(resolveDependency, isVisibleWhen = () => true) {
15
15
  this.resolveDependency = resolveDependency;
16
- this.isHiddenFromChildren = isHiddenFromChildren;
16
+ this.isVisibleWhen = isVisibleWhen;
17
17
  }
18
18
  pipe(...mappers) {
19
19
  return pipe(...mappers)(this);
20
20
  }
21
21
  clone() {
22
- return new Provider(this.resolveDependency, this.isHiddenFromChildren);
22
+ return new Provider(this.resolveDependency, this.isVisibleWhen);
23
23
  }
24
24
  resolve(container, ...args) {
25
25
  return this.resolveDependency(container, ...args);
26
26
  }
27
- hideFromChildren() {
28
- this.isHiddenFromChildren = true;
27
+ setVisibility(isVisibleWhen) {
28
+ this.isVisibleWhen = isVisibleWhen;
29
29
  return this;
30
30
  }
31
- isValidToResolve(container, fromChild) {
32
- return !(this.isHiddenFromChildren && fromChild);
31
+ isVisible(parent, child) {
32
+ return this.isVisibleWhen(parent, child);
33
33
  }
34
34
  isValidToClone() {
35
35
  return true;
@@ -3,15 +3,15 @@ export class ProviderDecorator {
3
3
  constructor(decorated) {
4
4
  this.decorated = decorated;
5
5
  }
6
- hideFromChildren() {
7
- this.decorated.hideFromChildren();
6
+ setVisibility(predicate) {
7
+ this.decorated.setVisibility(predicate);
8
8
  return this;
9
9
  }
10
10
  isValidToClone(container) {
11
11
  return this.decorated.isValidToClone(container);
12
12
  }
13
- isValidToResolve(container, fromChild) {
14
- return this.decorated.isValidToResolve(container, fromChild);
13
+ isVisible(parent, child) {
14
+ return this.decorated.isVisible(parent, child);
15
15
  }
16
16
  resolve(container, ...args) {
17
17
  return this.decorated.resolve(container, ...args);
@@ -14,7 +14,7 @@ export class ScopeProvider extends ProviderDecorator {
14
14
  isValidToClone(container) {
15
15
  return this.predicate(container) && this.provider.isValidToClone(container);
16
16
  }
17
- isValidToResolve(container, fromChild) {
18
- return this.predicate(container) && this.provider.isValidToResolve(container, fromChild);
17
+ isVisible(container, child) {
18
+ return this.predicate(container) && this.provider.isVisible(container, child);
19
19
  }
20
20
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ts-ioc-container",
3
- "version": "30.1.1",
3
+ "version": "30.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": "9ca59e3a16fb4683f00a01d5b0d75dc96151bc8e"
62
+ "gitHead": "d5b0081792a674f41d74a8c716482270de229e93"
63
63
  }
@@ -1,11 +1,10 @@
1
- import { IContainer, InjectionToken, IProvider, DependencyKey } from '../index';
2
- import { AliasPredicate } from './IContainer';
1
+ import { AliasPredicate, DependencyKey, IContainer, InjectionToken, ResolveOptions } from './IContainer';
2
+ import { IProvider } from '../provider/IProvider';
3
3
  export declare abstract class AutoMockedContainer implements IContainer {
4
4
  getKeysByAlias(alias: AliasPredicate): DependencyKey[];
5
5
  hasDependency(key: string): boolean;
6
6
  createScope(): IContainer;
7
- resolve<T>(key: InjectionToken<T>, ...args: unknown[]): T;
8
- abstract resolveFromChild<T>(key: InjectionToken<T>, ...args: unknown[]): T;
7
+ abstract resolve<T>(key: InjectionToken<T>, options?: ResolveOptions): T;
9
8
  dispose(): void;
10
9
  register(): this;
11
10
  getInstances(): unknown[];
@@ -1,4 +1,4 @@
1
- import { Alias, AliasPredicate, DependencyKey, IContainer, IContainerModule, InjectionToken, Tag } from './IContainer';
1
+ import { Alias, AliasPredicate, DependencyKey, IContainer, IContainerModule, InjectionToken, ResolveOptions, Tag } from './IContainer';
2
2
  import { IInjector } from '../injector/IInjector';
3
3
  import { IProvider } from '../provider/IProvider';
4
4
  export declare class Container implements IContainer {
@@ -15,8 +15,7 @@ export declare class Container implements IContainer {
15
15
  tags?: Tag[];
16
16
  });
17
17
  register(key: DependencyKey, provider: IProvider, aliases?: Alias[]): this;
18
- resolve<T>(token: InjectionToken<T>, ...args: unknown[]): T;
19
- resolveFromChild<T>(token: InjectionToken<T>, ...args: unknown[]): T;
18
+ resolve<T>(token: InjectionToken<T>, { args, child }?: ResolveOptions): T;
20
19
  private resolveByConstructor;
21
20
  createScope(...tags: Tag[]): Container;
22
21
  dispose(): void;
@@ -1,4 +1,4 @@
1
- import { AliasPredicate, DependencyKey, IContainer, IContainerModule, InjectionToken } from './IContainer';
1
+ import { AliasPredicate, DependencyKey, IContainer, IContainerModule, InjectionToken, ResolveOptions } from './IContainer';
2
2
  import { IProvider } from '../provider/IProvider';
3
3
  export declare class EmptyContainer implements IContainer {
4
4
  getKeysByAlias(alias: AliasPredicate): DependencyKey[];
@@ -7,8 +7,7 @@ export declare class EmptyContainer implements IContainer {
7
7
  createScope(): IContainer;
8
8
  dispose(): void;
9
9
  register(key: DependencyKey, value: IProvider): this;
10
- resolve<T>(key: InjectionToken<T>): T;
11
- resolveFromChild<T>(key: InjectionToken<T>, ...args: unknown[]): T;
10
+ resolve<T>(key: InjectionToken<T>, options: ResolveOptions): T;
12
11
  getAllProviders(): Map<DependencyKey, IProvider>;
13
12
  getInstances(): unknown[];
14
13
  removeScope(): void;
@@ -5,9 +5,12 @@ export type DependencyKey = string | symbol;
5
5
  export declare function isDependencyKey<T>(token: InjectionToken<T>): token is DependencyKey;
6
6
  export declare function isConstructor<T>(token: InjectionToken<T>): token is constructor<T>;
7
7
  export type InjectionToken<T = unknown> = constructor<T> | DependencyKey;
8
+ export type ResolveOptions = {
9
+ args?: unknown[];
10
+ child?: Tagged;
11
+ };
8
12
  export interface Resolvable {
9
- resolve<T>(key: InjectionToken<T>, ...args: unknown[]): T;
10
- resolveFromChild<T>(key: InjectionToken<T>, ...args: unknown[]): T;
13
+ resolve<T>(key: InjectionToken<T>, options?: ResolveOptions): T;
11
14
  }
12
15
  export interface IContainerModule {
13
16
  applyTo(container: IContainer): void;
@@ -7,7 +7,7 @@ export { IInjector } from './injector/IInjector';
7
7
  export { DependencyNotFoundError } from './errors/DependencyNotFoundError';
8
8
  export { MethodNotImplementedError } from './errors/MethodNotImplementedError';
9
9
  export { ContainerDisposedError } from './errors/ContainerDisposedError';
10
- export { Provider, provider, hideFromChildren } from './provider/Provider';
10
+ export { Provider, provider, setVisibility } from './provider/Provider';
11
11
  export { ArgsFn, argsFn, args, ArgsProvider } from './provider/ArgsProvider';
12
12
  export { singleton, SingletonProvider } from './provider/SingletonProvider';
13
13
  export { scope, ScopeProvider } from './provider/ScopeProvider';
@@ -1,11 +1,12 @@
1
- import { Resolvable, Tagged } from '../container/IContainer';
1
+ import { IContainer, Resolvable, Tagged } from '../container/IContainer';
2
2
  import { MapFn } from '../utils';
3
3
  export type ResolveDependency<T = unknown> = (container: Resolvable, ...args: unknown[]) => T;
4
+ export type VisibilityPredicate = (parent: Tagged, child: Tagged) => boolean;
4
5
  export interface IProvider<T = unknown> {
5
6
  clone(): IProvider<T>;
6
7
  resolve(container: Resolvable, ...args: unknown[]): T;
7
8
  isValidToClone(container: Tagged): boolean;
8
- isValidToResolve(container: Tagged, fromChild?: boolean): boolean;
9
+ isVisible(parent: IContainer, child: Tagged): boolean;
9
10
  pipe(...mappers: MapFn<IProvider<T>>[]): IProvider<T>;
10
- hideFromChildren(): this;
11
+ setVisibility(isVisibleWhen: VisibilityPredicate): this;
11
12
  }
@@ -1,18 +1,18 @@
1
- import { IProvider, ResolveDependency } from './IProvider';
1
+ import { VisibilityPredicate, IProvider, ResolveDependency } from './IProvider';
2
2
  import { Resolvable, Tagged } from '../container/IContainer';
3
3
  import { constructor, MapFn } from '../utils';
4
4
  export declare const provider: (...mappers: MapFn<IProvider>[]) => ClassDecorator;
5
- export declare const hideFromChildren: MapFn<IProvider>;
5
+ export declare const setVisibility: (isVisibleWhen: VisibilityPredicate) => MapFn<IProvider>;
6
6
  export declare class Provider<T> implements IProvider<T> {
7
7
  private readonly resolveDependency;
8
- private isHiddenFromChildren;
8
+ private isVisibleWhen;
9
9
  static fromClass<T>(Target: constructor<T>): IProvider<T>;
10
10
  static fromValue<T>(value: T): Provider<T>;
11
- constructor(resolveDependency: ResolveDependency<T>, isHiddenFromChildren?: boolean);
11
+ constructor(resolveDependency: ResolveDependency<T>, isVisibleWhen?: VisibilityPredicate);
12
12
  pipe(...mappers: MapFn<IProvider<T>>[]): IProvider<T>;
13
13
  clone(): Provider<T>;
14
14
  resolve(container: Resolvable, ...args: unknown[]): T;
15
- hideFromChildren(): this;
16
- isValidToResolve(container: Tagged, fromChild?: boolean): boolean;
15
+ setVisibility(isVisibleWhen: VisibilityPredicate): this;
16
+ isVisible(parent: Tagged, child: Tagged): boolean;
17
17
  isValidToClone(): boolean;
18
18
  }
@@ -1,13 +1,13 @@
1
- import { Resolvable, Tagged } from '../container/IContainer';
2
- import { IProvider } from './IProvider';
1
+ import { IContainer, Resolvable, Tagged } from '../container/IContainer';
2
+ import { VisibilityPredicate, IProvider } from './IProvider';
3
3
  import { MapFn } from '../utils';
4
4
  export declare abstract class ProviderDecorator<T> implements IProvider<T> {
5
5
  private decorated;
6
6
  protected constructor(decorated: IProvider<T>);
7
- hideFromChildren(): this;
7
+ setVisibility(predicate: VisibilityPredicate): this;
8
8
  abstract clone(): IProvider<T>;
9
9
  isValidToClone(container: Tagged): boolean;
10
- isValidToResolve(container: Tagged, fromChild?: boolean): boolean;
10
+ isVisible(parent: IContainer, child: Tagged): boolean;
11
11
  resolve(container: Resolvable, ...args: any[]): T;
12
12
  pipe(...mappers: MapFn<IProvider<T>>[]): IProvider<T>;
13
13
  }
@@ -10,6 +10,6 @@ export declare class ScopeProvider<T> extends ProviderDecorator<T> {
10
10
  constructor(provider: IProvider<T>, predicate: ContainerPredicate);
11
11
  clone(): ScopeProvider<T>;
12
12
  isValidToClone(container: IContainer): boolean;
13
- isValidToResolve(container: IContainer, fromChild?: boolean): boolean;
13
+ isVisible(container: IContainer, child: Tagged): boolean;
14
14
  }
15
15
  export {};