ts-ioc-container 31.6.1 → 31.8.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
@@ -670,11 +670,17 @@ import {
670
670
  by,
671
671
  Container,
672
672
  DependencyNotFoundError,
673
+ IMemo,
674
+ IMemoKey,
673
675
  inject,
674
676
  MetadataInjector,
677
+ Provider,
675
678
  provider,
679
+ register,
676
680
  Registration as R,
681
+ scope,
677
682
  } from 'ts-ioc-container';
683
+ import { constant } from '../../lib/utils.ts';
678
684
 
679
685
  describe('alias', () => {
680
686
  const IMiddlewareKey = 'IMiddleware';
@@ -747,6 +753,55 @@ describe('alias', () => {
747
753
  expect(by.alias((aliases) => aliases.has('ILogger'))(container)).toBeInstanceOf(FileLogger);
748
754
  expect(() => by.alias((aliases) => aliases.has('logger'))(container)).toThrowError(DependencyNotFoundError);
749
755
  });
756
+
757
+ it('should resolve by memoized alias', () => {
758
+ @provider(alias('ILogger'))
759
+ @register(scope((s) => s.hasTag('root')))
760
+ class FileLogger {}
761
+
762
+ @provider(alias('ILogger'))
763
+ @register(scope((s) => s.hasTag('child')))
764
+ class DbLogger {}
765
+
766
+ const container = new Container(new MetadataInjector(), { tags: ['root'] })
767
+ .register(IMemoKey, Provider.fromValue<IMemo>(new Map()))
768
+ .add(R.fromClass(FileLogger))
769
+ .add(R.fromClass(DbLogger));
770
+
771
+ const result1 = by.alias((aliases) => aliases.has('ILogger'), constant('ILogger'))(container);
772
+ const child = container.createScope('child');
773
+ const result2 = by.alias((aliases) => aliases.has('ILogger'), constant('ILogger'))(child);
774
+ const result3 = by.alias((aliases) => aliases.has('ILogger'))(child);
775
+
776
+ expect(result1).toBeInstanceOf(FileLogger);
777
+ expect(result2).toBeInstanceOf(FileLogger);
778
+ expect(result3).toBeInstanceOf(DbLogger);
779
+ });
780
+
781
+ it('should resolve by memoized aliases', () => {
782
+ // eslint-disable-next-line @typescript-eslint/no-empty-interface
783
+ interface ILogger {}
784
+
785
+ @provider(alias('ILogger'))
786
+ class FileLogger implements ILogger {}
787
+
788
+ @provider(alias('ILogger'))
789
+ class DbLogger implements ILogger {}
790
+
791
+ class App {
792
+ constructor(@inject(by.aliases((it) => it.has('ILogger'), constant('ILogger'))) public loggers: ILogger[]) {}
793
+ }
794
+
795
+ const container = new Container(new MetadataInjector())
796
+ .register(IMemoKey, Provider.fromValue<IMemo>(new Map()))
797
+ .add(R.fromClass(FileLogger));
798
+
799
+ const loggers = container.resolve(App).loggers;
800
+ container.add(R.fromClass(DbLogger));
801
+ const loggers2 = container.resolve(App).loggers;
802
+
803
+ expect(loggers).toEqual(loggers2);
804
+ });
750
805
  });
751
806
 
752
807
  ```
package/cjm/by.js CHANGED
@@ -1,15 +1,45 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.by = exports.all = void 0;
3
+ exports.by = exports.IMemoKey = exports.all = void 0;
4
4
  const all = () => true;
5
5
  exports.all = all;
6
+ exports.IMemoKey = Symbol('IMemo');
6
7
  exports.by = {
7
- aliases: (predicate) => (c, ...args) => c.resolveManyByAlias(predicate, { args }).values(),
8
+ aliases: (predicate, memoize) => (c, ...args) => {
9
+ const predicateFn = (aliases) => predicate(aliases, c);
10
+ const memoKey = memoize?.(c);
11
+ if (memoKey) {
12
+ const memo = c.resolve(exports.IMemoKey);
13
+ const memoized = memo.get(memoKey);
14
+ if (memoized) {
15
+ return memoized.map((key) => c.resolve(key, { args }));
16
+ }
17
+ const result = c.resolveManyByAlias(predicateFn, { args });
18
+ memo.set(memoKey, Array.from(result.keys()));
19
+ return Array.from(result.values());
20
+ }
21
+ return Array.from(c.resolveManyByAlias(predicateFn, { args }).values());
22
+ },
8
23
  /**
9
24
  * Get the instance that matches the given alias or fail
10
25
  * @param predicate
26
+ * @param memoize
11
27
  */
12
- alias: (predicate) => (c, ...args) => c.resolveOneByAlias(predicate, { args }),
28
+ alias: (predicate, memoize) => (c, ...args) => {
29
+ const predicateFn = (aliases) => predicate(aliases, c);
30
+ const memoKey = memoize?.(c);
31
+ if (memoKey) {
32
+ const memo = c.resolve(exports.IMemoKey);
33
+ const memoized = memo.get(memoKey);
34
+ if (memoized) {
35
+ return c.resolve(memoized[0], { args });
36
+ }
37
+ const [key, result] = c.resolveOneByAlias(predicateFn, { args });
38
+ memo.set(memoKey, [key]);
39
+ return result;
40
+ }
41
+ return c.resolveOneByAlias(predicateFn, { args })[1];
42
+ },
13
43
  /**
14
44
  * Get all instances that match the given keys
15
45
  * @param keys
@@ -82,9 +82,9 @@ class Container {
82
82
  return this.parent.resolveManyByAlias(predicate, { args, child }, result);
83
83
  }
84
84
  resolveOneByAlias(predicate, { args = [], child = this } = {}) {
85
- for (const [, provider] of this.providers.entries()) {
85
+ for (const [key, provider] of this.providers.entries()) {
86
86
  if (provider.matchAliases(predicate) && provider.isVisible(this, child)) {
87
- return provider.resolve(this, ...args);
87
+ return [key, provider.resolve(this, ...args)];
88
88
  }
89
89
  }
90
90
  return this.parent.resolveOneByAlias(predicate, { args, child });
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.Registration = exports.register = exports.scope = exports.key = exports.AutoMockedContainer = exports.multiCache = exports.MultiCache = exports.SingletonProvider = exports.singleton = exports.ProviderDecorator = exports.Provider = exports.args = exports.argsFn = exports.alias = exports.visible = exports.provider = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.DependencyNotFoundError = exports.EmptyContainer = exports.Container = exports.isDependencyKey = void 0;
3
+ exports.getParameterMetadata = exports.getMethodMetadata = exports.setMethodMetadata = exports.setParameterMetadata = exports.getMetadata = exports.setMetadata = exports.IMemoKey = exports.by = exports.hasHooks = exports.hook = exports.getHooks = exports.ProxyInjector = exports.SimpleInjector = exports.inject = exports.MetadataInjector = exports.Registration = exports.register = exports.scope = exports.key = exports.AutoMockedContainer = exports.multiCache = exports.MultiCache = exports.SingletonProvider = exports.singleton = exports.Provider = exports.ProviderDecorator = exports.args = exports.argsFn = exports.alias = exports.visible = 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");
@@ -19,10 +19,9 @@ Object.defineProperty(exports, "visible", { enumerable: true, get: function () {
19
19
  Object.defineProperty(exports, "alias", { enumerable: true, get: function () { return IProvider_1.alias; } });
20
20
  Object.defineProperty(exports, "argsFn", { enumerable: true, get: function () { return IProvider_1.argsFn; } });
21
21
  Object.defineProperty(exports, "args", { enumerable: true, get: function () { return IProvider_1.args; } });
22
+ Object.defineProperty(exports, "ProviderDecorator", { enumerable: true, get: function () { return IProvider_1.ProviderDecorator; } });
22
23
  var Provider_1 = require("./provider/Provider");
23
24
  Object.defineProperty(exports, "Provider", { enumerable: true, get: function () { return Provider_1.Provider; } });
24
- var ProviderDecorator_1 = require("./provider/ProviderDecorator");
25
- Object.defineProperty(exports, "ProviderDecorator", { enumerable: true, get: function () { return ProviderDecorator_1.ProviderDecorator; } });
26
25
  var SingletonProvider_1 = require("./provider/singleton/SingletonProvider");
27
26
  Object.defineProperty(exports, "singleton", { enumerable: true, get: function () { return SingletonProvider_1.singleton; } });
28
27
  Object.defineProperty(exports, "SingletonProvider", { enumerable: true, get: function () { return SingletonProvider_1.SingletonProvider; } });
@@ -50,6 +49,7 @@ Object.defineProperty(exports, "hook", { enumerable: true, get: function () { re
50
49
  Object.defineProperty(exports, "hasHooks", { enumerable: true, get: function () { return hook_1.hasHooks; } });
51
50
  var by_1 = require("./by");
52
51
  Object.defineProperty(exports, "by", { enumerable: true, get: function () { return by_1.by; } });
52
+ Object.defineProperty(exports, "IMemoKey", { enumerable: true, get: function () { return by_1.IMemoKey; } });
53
53
  var metadata_1 = require("./metadata");
54
54
  Object.defineProperty(exports, "setMetadata", { enumerable: true, get: function () { return metadata_1.setMetadata; } });
55
55
  Object.defineProperty(exports, "getMetadata", { enumerable: true, get: function () { return metadata_1.getMetadata; } });
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.visible = exports.alias = exports.getTransformers = exports.provider = exports.argsFn = exports.args = void 0;
3
+ exports.ProviderDecorator = exports.visible = exports.alias = exports.getTransformers = exports.provider = exports.argsFn = exports.args = void 0;
4
+ const utils_1 = require("../utils");
4
5
  const metadata_1 = require("../metadata");
5
6
  function args(...extraArgs) {
6
7
  return (provider) => provider.setArgs(() => extraArgs);
@@ -19,3 +20,33 @@ const alias = (...aliases) => (r) => r.addAliases(...aliases);
19
20
  exports.alias = alias;
20
21
  const visible = (isVisibleWhen) => (p) => p.setVisibility(isVisibleWhen);
21
22
  exports.visible = visible;
23
+ class ProviderDecorator {
24
+ constructor(decorated) {
25
+ this.decorated = decorated;
26
+ }
27
+ setVisibility(predicate) {
28
+ this.decorated.setVisibility(predicate);
29
+ return this;
30
+ }
31
+ isVisible(parent, child) {
32
+ return this.decorated.isVisible(parent, child);
33
+ }
34
+ resolve(container, ...args) {
35
+ return this.decorated.resolve(container, ...args);
36
+ }
37
+ pipe(...mappers) {
38
+ return (0, utils_1.pipe)(...mappers)(this);
39
+ }
40
+ matchAliases(predicate) {
41
+ return this.decorated.matchAliases(predicate);
42
+ }
43
+ addAliases(...aliases) {
44
+ this.decorated.addAliases(...aliases);
45
+ return this;
46
+ }
47
+ setArgs(argsFn) {
48
+ this.decorated.setArgs(argsFn);
49
+ return this;
50
+ }
51
+ }
52
+ exports.ProviderDecorator = ProviderDecorator;
@@ -1,13 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SingletonProvider = exports.singleton = void 0;
4
- const ProviderDecorator_1 = require("../ProviderDecorator");
4
+ const IProvider_1 = require("../IProvider");
5
5
  const SingleCache_1 = require("./SingleCache");
6
6
  function singleton(cacheProvider) {
7
7
  return (provider) => new SingletonProvider(provider, cacheProvider ? cacheProvider() : new SingleCache_1.SingleCache());
8
8
  }
9
9
  exports.singleton = singleton;
10
- class SingletonProvider extends ProviderDecorator_1.ProviderDecorator {
10
+ class SingletonProvider extends IProvider_1.ProviderDecorator {
11
11
  constructor(provider, cache) {
12
12
  super(provider);
13
13
  this.provider = provider;
package/esm/by.js CHANGED
@@ -1,11 +1,41 @@
1
1
  export const all = () => true;
2
+ export const IMemoKey = Symbol('IMemo');
2
3
  export const by = {
3
- aliases: (predicate) => (c, ...args) => c.resolveManyByAlias(predicate, { args }).values(),
4
+ aliases: (predicate, memoize) => (c, ...args) => {
5
+ const predicateFn = (aliases) => predicate(aliases, c);
6
+ const memoKey = memoize?.(c);
7
+ if (memoKey) {
8
+ const memo = c.resolve(IMemoKey);
9
+ const memoized = memo.get(memoKey);
10
+ if (memoized) {
11
+ return memoized.map((key) => c.resolve(key, { args }));
12
+ }
13
+ const result = c.resolveManyByAlias(predicateFn, { args });
14
+ memo.set(memoKey, Array.from(result.keys()));
15
+ return Array.from(result.values());
16
+ }
17
+ return Array.from(c.resolveManyByAlias(predicateFn, { args }).values());
18
+ },
4
19
  /**
5
20
  * Get the instance that matches the given alias or fail
6
21
  * @param predicate
22
+ * @param memoize
7
23
  */
8
- alias: (predicate) => (c, ...args) => c.resolveOneByAlias(predicate, { args }),
24
+ alias: (predicate, memoize) => (c, ...args) => {
25
+ const predicateFn = (aliases) => predicate(aliases, c);
26
+ const memoKey = memoize?.(c);
27
+ if (memoKey) {
28
+ const memo = c.resolve(IMemoKey);
29
+ const memoized = memo.get(memoKey);
30
+ if (memoized) {
31
+ return c.resolve(memoized[0], { args });
32
+ }
33
+ const [key, result] = c.resolveOneByAlias(predicateFn, { args });
34
+ memo.set(memoKey, [key]);
35
+ return result;
36
+ }
37
+ return c.resolveOneByAlias(predicateFn, { args })[1];
38
+ },
9
39
  /**
10
40
  * Get all instances that match the given keys
11
41
  * @param keys
@@ -79,9 +79,9 @@ export class Container {
79
79
  return this.parent.resolveManyByAlias(predicate, { args, child }, result);
80
80
  }
81
81
  resolveOneByAlias(predicate, { args = [], child = this } = {}) {
82
- for (const [, provider] of this.providers.entries()) {
82
+ for (const [key, provider] of this.providers.entries()) {
83
83
  if (provider.matchAliases(predicate) && provider.isVisible(this, child)) {
84
- return provider.resolve(this, ...args);
84
+ return [key, provider.resolve(this, ...args)];
85
85
  }
86
86
  }
87
87
  return this.parent.resolveOneByAlias(predicate, { args, child });
package/esm/index.js CHANGED
@@ -4,9 +4,8 @@ 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, visible, alias, argsFn, args } from './provider/IProvider';
7
+ export { provider, visible, alias, argsFn, args, ProviderDecorator, } from './provider/IProvider';
8
8
  export { Provider } from './provider/Provider';
9
- export { ProviderDecorator } from './provider/ProviderDecorator';
10
9
  export { singleton, SingletonProvider } from './provider/singleton/SingletonProvider';
11
10
  export { MultiCache, multiCache } from './provider/singleton/MultiCache';
12
11
  export { AutoMockedContainer } from './container/AutoMockedContainer';
@@ -16,5 +15,5 @@ export { MetadataInjector, inject } from './injector/MetadataInjector';
16
15
  export { SimpleInjector } from './injector/SimpleInjector';
17
16
  export { ProxyInjector } from './injector/ProxyInjector';
18
17
  export { getHooks, hook, hasHooks } from './hook';
19
- export { by } from './by';
18
+ export { by, IMemoKey } from './by';
20
19
  export { setMetadata, getMetadata, setParameterMetadata, setMethodMetadata, getMethodMetadata, getParameterMetadata, } from './metadata';
@@ -1,3 +1,4 @@
1
+ import { pipe } from '../utils';
1
2
  import { getMetadata, setMetadata } from '../metadata';
2
3
  export function args(...extraArgs) {
3
4
  return (provider) => provider.setArgs(() => extraArgs);
@@ -10,3 +11,32 @@ export const provider = (...mappers) => setMetadata(METADATA_KEY, mappers);
10
11
  export const getTransformers = (Target) => getMetadata(Target, METADATA_KEY) ?? [];
11
12
  export const alias = (...aliases) => (r) => r.addAliases(...aliases);
12
13
  export const visible = (isVisibleWhen) => (p) => p.setVisibility(isVisibleWhen);
14
+ export class ProviderDecorator {
15
+ constructor(decorated) {
16
+ this.decorated = decorated;
17
+ }
18
+ setVisibility(predicate) {
19
+ this.decorated.setVisibility(predicate);
20
+ return this;
21
+ }
22
+ isVisible(parent, child) {
23
+ return this.decorated.isVisible(parent, child);
24
+ }
25
+ resolve(container, ...args) {
26
+ return this.decorated.resolve(container, ...args);
27
+ }
28
+ pipe(...mappers) {
29
+ return pipe(...mappers)(this);
30
+ }
31
+ matchAliases(predicate) {
32
+ return this.decorated.matchAliases(predicate);
33
+ }
34
+ addAliases(...aliases) {
35
+ this.decorated.addAliases(...aliases);
36
+ return this;
37
+ }
38
+ setArgs(argsFn) {
39
+ this.decorated.setArgs(argsFn);
40
+ return this;
41
+ }
42
+ }
@@ -1,4 +1,4 @@
1
- import { ProviderDecorator } from '../ProviderDecorator';
1
+ import { ProviderDecorator } from '../IProvider';
2
2
  import { SingleCache } from './SingleCache';
3
3
  export function singleton(cacheProvider) {
4
4
  return (provider) => new SingletonProvider(provider, cacheProvider ? cacheProvider() : new SingleCache());
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ts-ioc-container",
3
- "version": "31.6.1",
3
+ "version": "31.8.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": "737c7b3dfb38d9c4950311f46d598ff61e2f70dc"
62
+ "gitHead": "fa737f07d8b3f1bf9ab0bd33bbdd00cdcc823293"
63
63
  }
package/typings/by.d.ts CHANGED
@@ -1,13 +1,16 @@
1
- import { AliasPredicate, IContainer, InjectionToken } from './container/IContainer';
1
+ import { DependencyKey, IContainer, InjectionToken } from './container/IContainer';
2
2
  export type InstancePredicate = (dep: unknown) => boolean;
3
3
  export declare const all: InstancePredicate;
4
+ export type IMemo = Map<string, DependencyKey[]>;
5
+ export declare const IMemoKey: unique symbol;
4
6
  export declare const by: {
5
- aliases: (predicate: AliasPredicate) => (c: IContainer, ...args: unknown[]) => IterableIterator<unknown>;
7
+ aliases: (predicate: (it: Set<string>, s: IContainer) => boolean, memoize?: ((c: IContainer) => string) | undefined) => (c: IContainer, ...args: unknown[]) => unknown[];
6
8
  /**
7
9
  * Get the instance that matches the given alias or fail
8
10
  * @param predicate
11
+ * @param memoize
9
12
  */
10
- alias: (predicate: AliasPredicate) => (c: IContainer, ...args: unknown[]) => unknown;
13
+ alias: (predicate: (it: Set<string>, s: IContainer) => boolean, memoize?: ((c: IContainer) => string) | undefined) => (c: IContainer, ...args: unknown[]) => unknown;
11
14
  /**
12
15
  * Get all instances that match the given keys
13
16
  * @param keys
@@ -14,5 +14,5 @@ export declare abstract class AutoMockedContainer implements IContainer {
14
14
  hasTag(): boolean;
15
15
  add(registration: IRegistration): this;
16
16
  resolveManyByAlias(predicate: AliasPredicate, options?: ResolveOptions, result?: Map<DependencyKey, unknown>): Map<DependencyKey, unknown>;
17
- resolveOneByAlias<T>(predicate: AliasPredicate, options?: ResolveOptions): T;
17
+ resolveOneByAlias<T>(predicate: AliasPredicate, options?: ResolveOptions): [DependencyKey, T];
18
18
  }
@@ -25,7 +25,7 @@ export declare class Container implements IContainer {
25
25
  use(module: IContainerModule): this;
26
26
  hasDependency(key: DependencyKey): boolean;
27
27
  resolveManyByAlias(predicate: AliasPredicate, { args, child }?: ResolveOptions, result?: Map<DependencyKey, unknown>): Map<DependencyKey, unknown>;
28
- resolveOneByAlias<T>(predicate: AliasPredicate, { args, child }?: ResolveOptions): T;
28
+ resolveOneByAlias<T>(predicate: AliasPredicate, { args, child }?: ResolveOptions): [DependencyKey, T];
29
29
  /**
30
30
  * @private
31
31
  */
@@ -15,5 +15,5 @@ export declare class EmptyContainer implements IContainer {
15
15
  use(module: IContainerModule): this;
16
16
  add(registration: IRegistration): this;
17
17
  resolveManyByAlias(predicate: AliasPredicate, options?: ResolveOptions, result?: Map<DependencyKey, unknown>): Map<DependencyKey, unknown>;
18
- resolveOneByAlias<T>(predicate: AliasPredicate, options?: ResolveOptions): T;
18
+ resolveOneByAlias<T>(predicate: AliasPredicate, options?: ResolveOptions): [DependencyKey, T];
19
19
  }
@@ -33,5 +33,5 @@ export interface IContainer extends Resolvable, Tagged {
33
33
  getRegistrations(): IRegistration[];
34
34
  hasDependency(key: DependencyKey): boolean;
35
35
  resolveManyByAlias(predicate: AliasPredicate, options?: ResolveOptions, result?: Map<DependencyKey, unknown>): Map<DependencyKey, unknown>;
36
- resolveOneByAlias<T>(predicate: AliasPredicate, options?: ResolveOptions): T;
36
+ resolveOneByAlias<T>(predicate: AliasPredicate, options?: ResolveOptions): [DependencyKey, T];
37
37
  }
@@ -6,9 +6,8 @@ export { IInjector } from './injector/IInjector';
6
6
  export { DependencyNotFoundError } from './errors/DependencyNotFoundError';
7
7
  export { MethodNotImplementedError } from './errors/MethodNotImplementedError';
8
8
  export { ContainerDisposedError } from './errors/ContainerDisposedError';
9
- export { ResolveDependency, IProvider, provider, visible, alias, argsFn, args, ArgsFn } from './provider/IProvider';
9
+ export { ResolveDependency, IProvider, provider, visible, alias, argsFn, args, ArgsFn, ProviderDecorator, } from './provider/IProvider';
10
10
  export { Provider } from './provider/Provider';
11
- export { ProviderDecorator } from './provider/ProviderDecorator';
12
11
  export { singleton, SingletonProvider } from './provider/singleton/SingletonProvider';
13
12
  export { MultiCache, multiCache } from './provider/singleton/MultiCache';
14
13
  export { Cache } from './provider/singleton/Cache';
@@ -19,5 +18,5 @@ export { MetadataInjector, inject } from './injector/MetadataInjector';
19
18
  export { SimpleInjector } from './injector/SimpleInjector';
20
19
  export { ProxyInjector } from './injector/ProxyInjector';
21
20
  export { getHooks, hook, hasHooks } from './hook';
22
- export { by, InstancePredicate } from './by';
21
+ export { by, InstancePredicate, IMemo, IMemoKey } from './by';
23
22
  export { setMetadata, getMetadata, setParameterMetadata, setMethodMetadata, getMethodMetadata, getParameterMetadata, } from './metadata';
@@ -21,3 +21,14 @@ export declare const provider: (...mappers: MapFn<IProvider>[]) => ClassDecorato
21
21
  export declare const getTransformers: <T>(Target: constructor<T>) => MapFn<IProvider<T>>[];
22
22
  export declare const alias: (...aliases: Alias[]) => MapFn<IProvider>;
23
23
  export declare const visible: (isVisibleWhen: ChildrenVisibilityPredicate) => MapFn<IProvider>;
24
+ export declare abstract class ProviderDecorator<T> implements IProvider<T> {
25
+ private decorated;
26
+ protected constructor(decorated: IProvider<T>);
27
+ setVisibility(predicate: ChildrenVisibilityPredicate): this;
28
+ isVisible(parent: IContainer, child: Tagged): boolean;
29
+ resolve(container: IContainer, ...args: unknown[]): T;
30
+ pipe(...mappers: MapFn<IProvider<T>>[]): IProvider<T>;
31
+ matchAliases(predicate: AliasPredicate): boolean;
32
+ addAliases(...aliases: Alias[]): this;
33
+ setArgs(argsFn: ArgsFn): this;
34
+ }
@@ -1,6 +1,5 @@
1
1
  import { IContainer } from '../../container/IContainer';
2
- import { ProviderDecorator } from '../ProviderDecorator';
3
- import { IProvider } from '../IProvider';
2
+ import { IProvider, ProviderDecorator } from '../IProvider';
4
3
  import { MapFn } from '../../utils';
5
4
  import { Cache } from './Cache';
6
5
  export declare function singleton<T = unknown>(cacheProvider?: () => Cache<unknown, T>): MapFn<IProvider<T>>;
@@ -1,34 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ProviderDecorator = void 0;
4
- const utils_1 = require("../utils");
5
- class ProviderDecorator {
6
- constructor(decorated) {
7
- this.decorated = decorated;
8
- }
9
- setVisibility(predicate) {
10
- this.decorated.setVisibility(predicate);
11
- return this;
12
- }
13
- isVisible(parent, child) {
14
- return this.decorated.isVisible(parent, child);
15
- }
16
- resolve(container, ...args) {
17
- return this.decorated.resolve(container, ...args);
18
- }
19
- pipe(...mappers) {
20
- return (0, utils_1.pipe)(...mappers)(this);
21
- }
22
- matchAliases(predicate) {
23
- return this.decorated.matchAliases(predicate);
24
- }
25
- addAliases(...aliases) {
26
- this.decorated.addAliases(...aliases);
27
- return this;
28
- }
29
- setArgs(argsFn) {
30
- this.decorated.setArgs(argsFn);
31
- return this;
32
- }
33
- }
34
- exports.ProviderDecorator = ProviderDecorator;
@@ -1,30 +0,0 @@
1
- import { pipe } from '../utils';
2
- export class ProviderDecorator {
3
- constructor(decorated) {
4
- this.decorated = decorated;
5
- }
6
- setVisibility(predicate) {
7
- this.decorated.setVisibility(predicate);
8
- return this;
9
- }
10
- isVisible(parent, child) {
11
- return this.decorated.isVisible(parent, child);
12
- }
13
- resolve(container, ...args) {
14
- return this.decorated.resolve(container, ...args);
15
- }
16
- pipe(...mappers) {
17
- return pipe(...mappers)(this);
18
- }
19
- matchAliases(predicate) {
20
- return this.decorated.matchAliases(predicate);
21
- }
22
- addAliases(...aliases) {
23
- this.decorated.addAliases(...aliases);
24
- return this;
25
- }
26
- setArgs(argsFn) {
27
- this.decorated.setArgs(argsFn);
28
- return this;
29
- }
30
- }
@@ -1,14 +0,0 @@
1
- import { Alias, AliasPredicate, IContainer, Tagged } from '../container/IContainer';
2
- import { ArgsFn, ChildrenVisibilityPredicate, IProvider } from './IProvider';
3
- import { MapFn } from '../utils';
4
- export declare abstract class ProviderDecorator<T> implements IProvider<T> {
5
- private decorated;
6
- protected constructor(decorated: IProvider<T>);
7
- setVisibility(predicate: ChildrenVisibilityPredicate): this;
8
- isVisible(parent: IContainer, child: Tagged): boolean;
9
- resolve(container: IContainer, ...args: unknown[]): T;
10
- pipe(...mappers: MapFn<IProvider<T>>[]): IProvider<T>;
11
- matchAliases(predicate: AliasPredicate): boolean;
12
- addAliases(...aliases: Alias[]): this;
13
- setArgs(argsFn: ArgsFn): this;
14
- }