ts-ioc-container 31.2.2 → 31.4.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.
Files changed (39) hide show
  1. package/README.md +126 -18
  2. package/cjm/index.js +5 -4
  3. package/cjm/provider/ArgsProvider.js +3 -4
  4. package/cjm/provider/IProvider.js +2 -13
  5. package/cjm/provider/Provider.js +2 -1
  6. package/cjm/provider/singleton/Cache.js +2 -0
  7. package/cjm/provider/singleton/MultiCache.js +21 -0
  8. package/cjm/provider/singleton/SingleCache.js +18 -0
  9. package/cjm/provider/singleton/SingletonProvider.js +24 -0
  10. package/cjm/registration/IRegistration.js +1 -3
  11. package/cjm/registration/Registration.js +8 -9
  12. package/cjm/utils.js +1 -11
  13. package/esm/index.js +3 -2
  14. package/esm/provider/ArgsProvider.js +3 -4
  15. package/esm/provider/IProvider.js +1 -10
  16. package/esm/provider/Provider.js +3 -2
  17. package/esm/provider/singleton/Cache.js +1 -0
  18. package/esm/provider/singleton/MultiCache.js +16 -0
  19. package/esm/provider/singleton/SingleCache.js +14 -0
  20. package/esm/provider/singleton/SingletonProvider.js +19 -0
  21. package/esm/registration/IRegistration.js +0 -1
  22. package/esm/registration/Registration.js +9 -10
  23. package/esm/utils.js +0 -9
  24. package/package.json +2 -2
  25. package/typings/container/Container.d.ts +1 -1
  26. package/typings/container/IContainer.d.ts +1 -1
  27. package/typings/index.d.ts +4 -2
  28. package/typings/provider/ArgsProvider.d.ts +1 -1
  29. package/typings/provider/IProvider.d.ts +0 -2
  30. package/typings/provider/singleton/Cache.d.ts +6 -0
  31. package/typings/provider/singleton/MultiCache.d.ts +10 -0
  32. package/typings/provider/singleton/SingleCache.d.ts +8 -0
  33. package/typings/provider/singleton/SingletonProvider.d.ts +12 -0
  34. package/typings/registration/IRegistration.d.ts +3 -5
  35. package/typings/registration/Registration.d.ts +5 -6
  36. package/typings/utils.d.ts +0 -1
  37. package/cjm/provider/SingletonProvider.js +0 -20
  38. package/esm/provider/SingletonProvider.js +0 -15
  39. package/typings/provider/SingletonProvider.d.ts +0 -11
package/README.md CHANGED
@@ -29,7 +29,7 @@
29
29
  - [Metadata](#metadata) `@inject`
30
30
  - [Simple](#simple)
31
31
  - [Proxy](#proxy)
32
- - [Provider](#provider)
32
+ - [Provider](#provider) `@provider`
33
33
  - [Singleton](#singleton) `singleton`
34
34
  - [Arguments](#arguments) `args`
35
35
  - [Visibility](#visibility) `visible`
@@ -138,6 +138,7 @@ import {
138
138
  Container,
139
139
  DependencyNotFoundError,
140
140
  key,
141
+ provider,
141
142
  MetadataInjector,
142
143
  Registration as R,
143
144
  by,
@@ -145,7 +146,8 @@ import {
145
146
  register,
146
147
  } from 'ts-ioc-container';
147
148
 
148
- @register(key('ILogger'), scope((s) => s.hasTag('child')), singleton())
149
+ @register(key('ILogger'), scope((s) => s.hasTag('child')))
150
+ @provider(singleton())
149
151
  class Logger {}
150
152
 
151
153
  describe('Scopes', function () {
@@ -330,7 +332,7 @@ This type of injector injects dependencies as dictionary `Record<string, unknown
330
332
 
331
333
  ```typescript
332
334
  import 'reflect-metadata';
333
- import { args, Container, ProxyInjector, Registration as R } from 'ts-ioc-container';
335
+ import { Container, ProxyInjector, args, Registration as R } from 'ts-ioc-container';
334
336
 
335
337
  describe('ProxyInjector', function () {
336
338
  it('should pass dependency to constructor as dictionary', function () {
@@ -387,6 +389,7 @@ describe('ProxyInjector', function () {
387
389
  ## Provider
388
390
  Provider is dependency factory which creates dependency.
389
391
 
392
+ - `@provider()`
390
393
  - `Provider.fromClass(Logger)`
391
394
  - `Provider.fromValue(logger)`
392
395
  - `new Provider((container, ...args) => container.resolve(Logger, {args}))`
@@ -436,9 +439,10 @@ Sometimes you need to create only one instance of dependency per scope. For exam
436
439
 
437
440
  ```typescript
438
441
  import 'reflect-metadata';
439
- import { singleton, Container, key, MetadataInjector, Registration as R, register } from 'ts-ioc-container';
442
+ import { singleton, Container, key, provider, MetadataInjector, Registration as R, register } from 'ts-ioc-container';
440
443
 
441
- @register(key('logger'), singleton())
444
+ @register(key('logger'))
445
+ @provider(singleton())
442
446
  class Logger {}
443
447
 
444
448
  describe('Singleton', function () {
@@ -471,14 +475,27 @@ describe('Singleton', function () {
471
475
 
472
476
  ### Arguments
473
477
  Sometimes you want to bind some arguments to provider. This is what `ArgsProvider` is for.
474
- - `args('someArgument')`
475
- - `argsFn((container) => [container.resolve(Logger), 'someValue'])`
478
+ - `@provider(args('someArgument'))`
479
+ - `@provider(argsFn((container) => [container.resolve(Logger), 'someValue']))`
476
480
  - `Provider.fromClass(Logger).pipe(args('someArgument'))`
477
481
  - NOTICE: args from this provider has higher priority than args from `resolve` method.
478
482
 
479
483
  ```typescript
480
484
  import 'reflect-metadata';
481
- import { args, argsFn, Container, key, MetadataInjector, register, Registration as R } from 'ts-ioc-container';
485
+ import {
486
+ args,
487
+ argsFn,
488
+ Container,
489
+ DependencyKey,
490
+ inject,
491
+ key,
492
+ MetadataInjector,
493
+ MultiCache,
494
+ provider,
495
+ register,
496
+ Registration as R,
497
+ singleton,
498
+ } from 'ts-ioc-container';
482
499
 
483
500
  @register(key('logger'))
484
501
  class Logger {
@@ -515,13 +532,97 @@ describe('ArgsProvider', function () {
515
532
  expect(logger.name).toBe('name');
516
533
  expect(logger.type).toBe('file');
517
534
  });
535
+
536
+ it('should resolve dependency by passing arguments resolve from container by another argument', function () {
537
+ interface IRepository {
538
+ name: string;
539
+ }
540
+
541
+ @register(key('UserRepository'))
542
+ class UserRepository implements IRepository {
543
+ name = 'UserRepository';
544
+ }
545
+
546
+ @register(key('TodoRepository'))
547
+ class TodoRepository implements IRepository {
548
+ name = 'TodoRepository';
549
+ }
550
+
551
+ @register(key('EntityManager'))
552
+ @provider(argsFn((container, token) => [container.resolve(token as DependencyKey)]))
553
+ class EntityManager {
554
+ constructor(public repository: IRepository) {}
555
+ }
556
+
557
+ class Main {
558
+ constructor(
559
+ @inject((s) => s.resolve('EntityManager', { args: ['UserRepository'] })) public userEntities: EntityManager,
560
+ @inject((s) => s.resolve('EntityManager', { args: ['TodoRepository'] })) public todoEntities: EntityManager,
561
+ ) {}
562
+ }
563
+
564
+ const root = createContainer()
565
+ .add(R.fromClass(EntityManager))
566
+ .add(R.fromClass(UserRepository))
567
+ .add(R.fromClass(TodoRepository));
568
+ const main = root.resolve(Main);
569
+
570
+ expect(main.userEntities.repository).toBeInstanceOf(UserRepository);
571
+ expect(main.todoEntities.repository).toBeInstanceOf(TodoRepository);
572
+ });
573
+
574
+ it('should resolve memoized dependency by passing arguments resolve from container by another argument', function () {
575
+ interface IRepository {
576
+ name: string;
577
+ }
578
+
579
+ @register(key('UserRepository'))
580
+ class UserRepository implements IRepository {
581
+ name = 'UserRepository';
582
+ }
583
+
584
+ @register(key('TodoRepository'))
585
+ class TodoRepository implements IRepository {
586
+ name = 'TodoRepository';
587
+ }
588
+
589
+ @register(key('EntityManager'))
590
+ @provider(
591
+ argsFn((container, token) => [container.resolve(token as DependencyKey)]),
592
+ singleton(() => new MultiCache((...args: unknown[]) => args[0] as DependencyKey)),
593
+ )
594
+ class EntityManager {
595
+ constructor(public repository: IRepository) {}
596
+ }
597
+
598
+ class Main {
599
+ constructor(
600
+ @inject((s) => s.resolve('EntityManager', { args: ['UserRepository'] })) public userEntities: EntityManager,
601
+ @inject((s) => s.resolve('EntityManager', { args: ['TodoRepository'] })) public todoEntities: EntityManager,
602
+ ) {}
603
+ }
604
+
605
+ const root = createContainer()
606
+ .add(R.fromClass(EntityManager))
607
+ .add(R.fromClass(UserRepository))
608
+ .add(R.fromClass(TodoRepository));
609
+ const main = root.resolve(Main);
610
+
611
+ const userRepository = root.resolve<EntityManager>('EntityManager', { args: ['UserRepository'] }).repository;
612
+ expect(userRepository).toBeInstanceOf(UserRepository);
613
+ expect(main.userEntities.repository).toBe(userRepository);
614
+
615
+ const todoRepository = root.resolve<EntityManager>('EntityManager', { args: ['TodoRepository'] }).repository;
616
+ expect(todoRepository).toBeInstanceOf(TodoRepository);
617
+ expect(main.todoEntities.repository).toBe(todoRepository);
618
+ });
518
619
  });
519
620
 
520
621
  ```
521
622
 
522
623
  ### Visibility
523
624
  Sometimes you want to hide dependency if somebody wants to resolve it from certain scope
524
- - `visible(({ isParent, child }) => isParent || child.hasTag('root'))` - dependency will be accessible from scope `root` or from scope where it's registered
625
+ - `@provider(visible(({ isParent, child }) => isParent || child.hasTag('root')))` - dependency will be accessible from scope `root` or from scope where it's registered
525
626
  - `Provider.fromClass(Logger).pipe(visible(({ isParent, child }) => isParent || child.hasTag('root')))`
526
627
 
527
628
  ```typescript
@@ -531,6 +632,7 @@ import {
531
632
  DependencyNotFoundError,
532
633
  key,
533
634
  MetadataInjector,
635
+ provider,
534
636
  register,
535
637
  Registration as R,
536
638
  scope,
@@ -540,7 +642,8 @@ import {
540
642
 
541
643
  describe('Visibility', function () {
542
644
  it('should hide from children', () => {
543
- @register(key('logger'), scope((s) => s.hasTag('root')), singleton(), visible(({ isParent }) => isParent))
645
+ @register(key('logger'), scope((s) => s.hasTag('root')))
646
+ @provider(singleton(), visible(({ isParent }) => isParent))
544
647
  class FileLogger {}
545
648
 
546
649
  const parent = new Container(new MetadataInjector(), { tags: ['root'] }).add(R.fromClass(FileLogger));
@@ -564,14 +667,15 @@ Registration is provider factory which registers provider in container.
564
667
 
565
668
  ```typescript
566
669
  import 'reflect-metadata';
567
- import { Container, key, MetadataInjector, register, Registration as R, scope, singleton } from 'ts-ioc-container';
670
+ import { Container, key, MetadataInjector, provider, register, Registration as R, scope, singleton } from 'ts-ioc-container';
568
671
  import { DependencyMissingKeyError } from '../../lib/errors/DependencyMissingKeyError';
569
672
 
570
673
  describe('Registration module', function () {
571
674
  const createContainer = () => new Container(new MetadataInjector(), { tags: ['root'] });
572
675
 
573
676
  it('should register class', function () {
574
- @register(key('ILogger'), scope((s) => s.hasTag('root')), singleton())
677
+ @register(key('ILogger'), scope((s) => s.hasTag('root')))
678
+ @provider(singleton())
575
679
  class Logger {}
576
680
 
577
681
  const root = createContainer().add(R.fromClass(Logger));
@@ -615,9 +719,10 @@ Sometimes you need to register provider only in scope which matches to certain c
615
719
 
616
720
  ```typescript
617
721
  import 'reflect-metadata';
618
- import { singleton, Container, key, MetadataInjector, Registration as R, scope, register } from 'ts-ioc-container';
722
+ import { singleton, Container, key, provider, MetadataInjector, Registration as R, scope, register } from 'ts-ioc-container';
619
723
 
620
- @register(key('ILogger'), scope((s) => s.hasTag('root')), singleton()) // the same as .pipe(singleton(), scope((s) => s.hasTag('root')))
724
+ @register(key('ILogger'), scope((s) => s.hasTag('root')))
725
+ @provider(singleton()) // the same as .pipe(singleton(), scope((s) => s.hasTag('root')))
621
726
  class Logger {}
622
727
  describe('ScopeProvider', function () {
623
728
  it('should return the same instance', function () {
@@ -832,19 +937,22 @@ describe('onConstruct', function () {
832
937
  ```typescript
833
938
  import 'reflect-metadata';
834
939
  import {
940
+ singleton,
835
941
  by,
836
942
  Container,
943
+ key,
837
944
  getHooks,
838
945
  hook,
839
946
  inject,
840
- key,
947
+ provider,
948
+ Registration as R,
841
949
  MetadataInjector,
842
950
  register,
843
- Registration as R,
844
- singleton,
845
951
  } from 'ts-ioc-container';
952
+ import * as console from 'node:console';
846
953
 
847
- @register(key('logsRepo'), singleton())
954
+ @register(key('logsRepo'))
955
+ @provider(singleton())
848
956
  class LogsRepo {
849
957
  savedLogs: string[] = [];
850
958
 
package/cjm/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getParameterMetadata = exports.getMethodMetadata = exports.setMethodMetadata = exports.setParameterMetadata = exports.getMetadata = exports.setMetadata = exports.by = exports.hasHooks = exports.hook = exports.getHooks = exports.ProxyInjector = exports.SimpleInjector = exports.inject = exports.MetadataInjector = exports.register = exports.scope = exports.alias = exports.key = exports.Registration = exports.AutoMockedContainer = exports.SingletonProvider = exports.singleton = exports.ArgsProvider = exports.args = exports.argsFn = exports.ProviderDecorator = exports.Provider = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.DependencyNotFoundError = exports.markAsProvider = exports.provider = exports.visible = exports.EmptyContainer = exports.Container = exports.isDependencyKey = void 0;
3
+ exports.getParameterMetadata = exports.getMethodMetadata = exports.setMethodMetadata = exports.setParameterMetadata = exports.getMetadata = exports.setMetadata = exports.by = exports.hasHooks = exports.hook = exports.getHooks = exports.ProxyInjector = exports.SimpleInjector = exports.inject = exports.MetadataInjector = exports.register = exports.scope = exports.alias = exports.key = exports.Registration = exports.AutoMockedContainer = exports.MultiCache = exports.SingletonProvider = exports.singleton = exports.ArgsProvider = exports.args = exports.argsFn = exports.ProviderDecorator = exports.Provider = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.DependencyNotFoundError = exports.visible = exports.provider = exports.EmptyContainer = exports.Container = exports.isDependencyKey = void 0;
4
4
  var IContainer_1 = require("./container/IContainer");
5
5
  Object.defineProperty(exports, "isDependencyKey", { enumerable: true, get: function () { return IContainer_1.isDependencyKey; } });
6
6
  var Container_1 = require("./container/Container");
@@ -8,9 +8,8 @@ Object.defineProperty(exports, "Container", { enumerable: true, get: function ()
8
8
  var EmptyContainer_1 = require("./container/EmptyContainer");
9
9
  Object.defineProperty(exports, "EmptyContainer", { enumerable: true, get: function () { return EmptyContainer_1.EmptyContainer; } });
10
10
  var IProvider_1 = require("./provider/IProvider");
11
- Object.defineProperty(exports, "visible", { enumerable: true, get: function () { return IProvider_1.visible; } });
12
11
  Object.defineProperty(exports, "provider", { enumerable: true, get: function () { return IProvider_1.provider; } });
13
- Object.defineProperty(exports, "markAsProvider", { enumerable: true, get: function () { return IProvider_1.markAsProvider; } });
12
+ Object.defineProperty(exports, "visible", { enumerable: true, get: function () { return IProvider_1.visible; } });
14
13
  var DependencyNotFoundError_1 = require("./errors/DependencyNotFoundError");
15
14
  Object.defineProperty(exports, "DependencyNotFoundError", { enumerable: true, get: function () { return DependencyNotFoundError_1.DependencyNotFoundError; } });
16
15
  var MethodNotImplementedError_1 = require("./errors/MethodNotImplementedError");
@@ -25,9 +24,11 @@ var ArgsProvider_1 = require("./provider/ArgsProvider");
25
24
  Object.defineProperty(exports, "argsFn", { enumerable: true, get: function () { return ArgsProvider_1.argsFn; } });
26
25
  Object.defineProperty(exports, "args", { enumerable: true, get: function () { return ArgsProvider_1.args; } });
27
26
  Object.defineProperty(exports, "ArgsProvider", { enumerable: true, get: function () { return ArgsProvider_1.ArgsProvider; } });
28
- var SingletonProvider_1 = require("./provider/SingletonProvider");
27
+ var SingletonProvider_1 = require("./provider/singleton/SingletonProvider");
29
28
  Object.defineProperty(exports, "singleton", { enumerable: true, get: function () { return SingletonProvider_1.singleton; } });
30
29
  Object.defineProperty(exports, "SingletonProvider", { enumerable: true, get: function () { return SingletonProvider_1.SingletonProvider; } });
30
+ var MultiCache_1 = require("./provider/singleton/MultiCache");
31
+ Object.defineProperty(exports, "MultiCache", { enumerable: true, get: function () { return MultiCache_1.MultiCache; } });
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("./registration/Registration");
@@ -2,13 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ArgsProvider = exports.argsFn = exports.args = void 0;
4
4
  const ProviderDecorator_1 = require("./ProviderDecorator");
5
- const IProvider_1 = require("./IProvider");
6
5
  function args(...extraArgs) {
7
- return (0, IProvider_1.markAsProvider)((provider) => new ArgsProvider(provider, () => extraArgs));
6
+ return (provider) => new ArgsProvider(provider, () => extraArgs);
8
7
  }
9
8
  exports.args = args;
10
9
  function argsFn(value) {
11
- return (0, IProvider_1.markAsProvider)((provider) => new ArgsProvider(provider, value));
10
+ return (provider) => new ArgsProvider(provider, value);
12
11
  }
13
12
  exports.argsFn = argsFn;
14
13
  class ArgsProvider extends ProviderDecorator_1.ProviderDecorator {
@@ -18,7 +17,7 @@ class ArgsProvider extends ProviderDecorator_1.ProviderDecorator {
18
17
  this.argsFn = argsFn;
19
18
  }
20
19
  resolve(container, ...args) {
21
- return this.provider.resolve(container, ...this.argsFn(container), ...args);
20
+ return this.provider.resolve(container, ...this.argsFn(container, ...args), ...args);
22
21
  }
23
22
  }
24
23
  exports.ArgsProvider = ArgsProvider;
@@ -1,22 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.visible = exports.isProviderMapper = exports.markAsProvider = exports.getTransformers = exports.provider = void 0;
3
+ exports.visible = exports.getTransformers = exports.provider = void 0;
4
4
  const metadata_1 = require("../metadata");
5
5
  const METADATA_KEY = 'provider';
6
6
  const provider = (...mappers) => (0, metadata_1.setMetadata)(METADATA_KEY, mappers);
7
7
  exports.provider = provider;
8
8
  const getTransformers = (Target) => (0, metadata_1.getMetadata)(Target, METADATA_KEY) ?? [];
9
9
  exports.getTransformers = getTransformers;
10
- const markAsProvider = (fn) => {
11
- // @ts-ignore
12
- fn.__provider = true;
13
- return fn;
14
- };
15
- exports.markAsProvider = markAsProvider;
16
- const isProviderMapper = (fn) => {
17
- // @ts-ignore
18
- return fn.__provider === true;
19
- };
20
- exports.isProviderMapper = isProviderMapper;
21
- const visible = (isVisibleWhen) => (0, exports.markAsProvider)((p) => p.setVisibility(isVisibleWhen));
10
+ const visible = (isVisibleWhen) => (p) => p.setVisibility(isVisibleWhen);
22
11
  exports.visible = visible;
@@ -9,7 +9,8 @@ class Provider {
9
9
  return new Provider((container, ...args) => container.resolve(Target, { args })).pipe(...transformers);
10
10
  }
11
11
  static fromValue(value) {
12
- return new Provider(() => value);
12
+ const mappers = (0, utils_1.isConstructor)(value) ? (0, IProvider_1.getTransformers)(value) ?? [] : [];
13
+ return new Provider(() => value).pipe(...mappers);
13
14
  }
14
15
  constructor(resolveDependency, isVisibleWhen = () => true) {
15
16
  this.resolveDependency = resolveDependency;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.multiCache = exports.MultiCache = void 0;
4
+ class MultiCache {
5
+ constructor(getKey = () => '1') {
6
+ this.getKey = getKey;
7
+ this.instances = new Map();
8
+ }
9
+ hasValue(token) {
10
+ return this.instances.has(token);
11
+ }
12
+ getValue(token) {
13
+ return this.instances.get(token);
14
+ }
15
+ setValue(token, value) {
16
+ this.instances.set(token, value);
17
+ }
18
+ }
19
+ exports.MultiCache = MultiCache;
20
+ const multiCache = (getKey) => new MultiCache(getKey);
21
+ exports.multiCache = multiCache;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SingleCache = void 0;
4
+ class SingleCache {
5
+ getKey(...args) {
6
+ return '1';
7
+ }
8
+ getValue(key) {
9
+ return this.instance.value;
10
+ }
11
+ hasValue(key) {
12
+ return this.instance !== undefined;
13
+ }
14
+ setValue(key, value) {
15
+ this.instance = { value };
16
+ }
17
+ }
18
+ exports.SingleCache = SingleCache;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SingletonProvider = exports.singleton = void 0;
4
+ const ProviderDecorator_1 = require("../ProviderDecorator");
5
+ const SingleCache_1 = require("./SingleCache");
6
+ function singleton(cacheProvider) {
7
+ return (provider) => new SingletonProvider(provider, cacheProvider ? cacheProvider() : new SingleCache_1.SingleCache());
8
+ }
9
+ exports.singleton = singleton;
10
+ class SingletonProvider extends ProviderDecorator_1.ProviderDecorator {
11
+ constructor(provider, cache) {
12
+ super(provider);
13
+ this.provider = provider;
14
+ this.cache = cache;
15
+ }
16
+ resolve(container, ...args) {
17
+ const key = this.cache.getKey(...args);
18
+ if (!this.cache.hasValue(key)) {
19
+ this.cache.setValue(key, this.provider.resolve(container, ...args));
20
+ }
21
+ return this.cache.getValue(key);
22
+ }
23
+ }
24
+ exports.SingletonProvider = SingletonProvider;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.provider = exports.register = exports.getTransformers = exports.scope = exports.alias = exports.key = void 0;
3
+ exports.register = exports.getTransformers = exports.scope = exports.alias = exports.key = void 0;
4
4
  const metadata_1 = require("../metadata");
5
5
  const key = (key) => (r) => r.to(key);
6
6
  exports.key = key;
@@ -13,5 +13,3 @@ const getTransformers = (Target) => (0, metadata_1.getMetadata)(Target, METADATA
13
13
  exports.getTransformers = getTransformers;
14
14
  const register = (...mappers) => (0, metadata_1.setMetadata)(METADATA_KEY, mappers);
15
15
  exports.register = register;
16
- const provider = (...mappers) => (r) => r.provider(...mappers);
17
- exports.provider = provider;
@@ -3,25 +3,29 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Registration = void 0;
4
4
  const utils_1 = require("../utils");
5
5
  const Provider_1 = require("../provider/Provider");
6
- const IProvider_1 = require("../provider/IProvider");
7
6
  const DependencyMissingKeyError_1 = require("../errors/DependencyMissingKeyError");
8
7
  const IRegistration_1 = require("./IRegistration");
9
8
  class Registration {
10
9
  static fromClass(Target) {
11
- return new Registration(() => Provider_1.Provider.fromClass(Target), Target.name).pipe(...(0, IRegistration_1.getTransformers)(Target));
10
+ const transform = (0, utils_1.pipe)(...(0, IRegistration_1.getTransformers)(Target));
11
+ return transform(new Registration(() => Provider_1.Provider.fromClass(Target), Target.name));
12
12
  }
13
13
  static fromValue(value) {
14
+ if ((0, utils_1.isConstructor)(value)) {
15
+ const transform = (0, utils_1.pipe)(...(0, IRegistration_1.getTransformers)(value));
16
+ return transform(new Registration(() => Provider_1.Provider.fromValue(value), value.name));
17
+ }
14
18
  return new Registration(() => Provider_1.Provider.fromValue(value));
15
19
  }
16
20
  static fromFn(fn) {
17
21
  return new Registration(() => new Provider_1.Provider(fn));
18
22
  }
19
- constructor(createProvider, key) {
23
+ constructor(createProvider, key, matchScope = () => true) {
20
24
  this.createProvider = createProvider;
21
25
  this.key = key;
26
+ this.matchScope = matchScope;
22
27
  this.aliases = [];
23
28
  this.mappers = [];
24
- this.matchScope = () => true;
25
29
  }
26
30
  to(key) {
27
31
  this.key = key;
@@ -34,11 +38,6 @@ class Registration {
34
38
  return this;
35
39
  }
36
40
  pipe(...mappers) {
37
- const [providerMappers, registrationMappers] = (0, utils_1.groupBy)(mappers, IProvider_1.isProviderMapper);
38
- this.mappers.push(...providerMappers);
39
- return (0, utils_1.pipe)(...registrationMappers)(this);
40
- }
41
- provider(...mappers) {
42
41
  this.mappers.push(...mappers);
43
42
  return this;
44
43
  }
package/cjm/utils.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.groupBy = exports.isConstructor = exports.constant = exports.fillEmptyIndexes = exports.pipe = void 0;
3
+ exports.isConstructor = exports.constant = exports.fillEmptyIndexes = exports.pipe = void 0;
4
4
  const pipe = (...mappers) => (value) => mappers.reduce((acc, current) => current(acc), value);
5
5
  exports.pipe = pipe;
6
6
  function fillEmptyIndexes(baseArr, insertArr) {
@@ -18,13 +18,3 @@ const constant = (value) => () => value;
18
18
  exports.constant = constant;
19
19
  const isConstructor = (T) => typeof T === 'function' && !!T.prototype;
20
20
  exports.isConstructor = isConstructor;
21
- function groupBy(items, predicate) {
22
- const [a, b] = items.reduce(([a, b], item) => {
23
- if (predicate(item)) {
24
- return [a.concat(item), b];
25
- }
26
- return [a, b.concat(item)];
27
- }, [[], []]);
28
- return [a, b];
29
- }
30
- exports.groupBy = groupBy;
package/esm/index.js CHANGED
@@ -1,14 +1,15 @@
1
1
  export { isDependencyKey, } from './container/IContainer';
2
2
  export { Container } from './container/Container';
3
3
  export { EmptyContainer } from './container/EmptyContainer';
4
- export { visible, provider, markAsProvider } from './provider/IProvider';
4
+ export { provider, visible } from './provider/IProvider';
5
5
  export { DependencyNotFoundError } from './errors/DependencyNotFoundError';
6
6
  export { MethodNotImplementedError } from './errors/MethodNotImplementedError';
7
7
  export { ContainerDisposedError } from './errors/ContainerDisposedError';
8
8
  export { Provider } from './provider/Provider';
9
9
  export { ProviderDecorator } from './provider/ProviderDecorator';
10
10
  export { argsFn, args, ArgsProvider } from './provider/ArgsProvider';
11
- export { singleton, SingletonProvider } from './provider/SingletonProvider';
11
+ export { singleton, SingletonProvider } from './provider/singleton/SingletonProvider';
12
+ export { MultiCache } from './provider/singleton/MultiCache';
12
13
  export { AutoMockedContainer } from './container/AutoMockedContainer';
13
14
  export { Registration } from './registration/Registration';
14
15
  export { key, alias, scope, register } from './registration/IRegistration';
@@ -1,10 +1,9 @@
1
1
  import { ProviderDecorator } from './ProviderDecorator';
2
- import { markAsProvider } from './IProvider';
3
2
  export function args(...extraArgs) {
4
- return markAsProvider((provider) => new ArgsProvider(provider, () => extraArgs));
3
+ return (provider) => new ArgsProvider(provider, () => extraArgs);
5
4
  }
6
5
  export function argsFn(value) {
7
- return markAsProvider((provider) => new ArgsProvider(provider, value));
6
+ return (provider) => new ArgsProvider(provider, value);
8
7
  }
9
8
  export class ArgsProvider extends ProviderDecorator {
10
9
  constructor(provider, argsFn) {
@@ -13,6 +12,6 @@ export class ArgsProvider extends ProviderDecorator {
13
12
  this.argsFn = argsFn;
14
13
  }
15
14
  resolve(container, ...args) {
16
- return this.provider.resolve(container, ...this.argsFn(container), ...args);
15
+ return this.provider.resolve(container, ...this.argsFn(container, ...args), ...args);
17
16
  }
18
17
  }
@@ -2,13 +2,4 @@ import { getMetadata, setMetadata } from '../metadata';
2
2
  const METADATA_KEY = 'provider';
3
3
  export const provider = (...mappers) => setMetadata(METADATA_KEY, mappers);
4
4
  export const getTransformers = (Target) => getMetadata(Target, METADATA_KEY) ?? [];
5
- export const markAsProvider = (fn) => {
6
- // @ts-ignore
7
- fn.__provider = true;
8
- return fn;
9
- };
10
- export const isProviderMapper = (fn) => {
11
- // @ts-ignore
12
- return fn.__provider === true;
13
- };
14
- export const visible = (isVisibleWhen) => markAsProvider((p) => p.setVisibility(isVisibleWhen));
5
+ export const visible = (isVisibleWhen) => (p) => p.setVisibility(isVisibleWhen);
@@ -1,12 +1,13 @@
1
1
  import { getTransformers } from './IProvider';
2
- import { pipe } from '../utils';
2
+ import { isConstructor, pipe } from '../utils';
3
3
  export class Provider {
4
4
  static fromClass(Target) {
5
5
  const transformers = getTransformers(Target);
6
6
  return new Provider((container, ...args) => container.resolve(Target, { args })).pipe(...transformers);
7
7
  }
8
8
  static fromValue(value) {
9
- return new Provider(() => value);
9
+ const mappers = isConstructor(value) ? getTransformers(value) ?? [] : [];
10
+ return new Provider(() => value).pipe(...mappers);
10
11
  }
11
12
  constructor(resolveDependency, isVisibleWhen = () => true) {
12
13
  this.resolveDependency = resolveDependency;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,16 @@
1
+ export class MultiCache {
2
+ constructor(getKey = () => '1') {
3
+ this.getKey = getKey;
4
+ this.instances = new Map();
5
+ }
6
+ hasValue(token) {
7
+ return this.instances.has(token);
8
+ }
9
+ getValue(token) {
10
+ return this.instances.get(token);
11
+ }
12
+ setValue(token, value) {
13
+ this.instances.set(token, value);
14
+ }
15
+ }
16
+ export const multiCache = (getKey) => new MultiCache(getKey);
@@ -0,0 +1,14 @@
1
+ export class SingleCache {
2
+ getKey(...args) {
3
+ return '1';
4
+ }
5
+ getValue(key) {
6
+ return this.instance.value;
7
+ }
8
+ hasValue(key) {
9
+ return this.instance !== undefined;
10
+ }
11
+ setValue(key, value) {
12
+ this.instance = { value };
13
+ }
14
+ }
@@ -0,0 +1,19 @@
1
+ import { ProviderDecorator } from '../ProviderDecorator';
2
+ import { SingleCache } from './SingleCache';
3
+ export function singleton(cacheProvider) {
4
+ return (provider) => new SingletonProvider(provider, cacheProvider ? cacheProvider() : new SingleCache());
5
+ }
6
+ export class SingletonProvider extends ProviderDecorator {
7
+ constructor(provider, cache) {
8
+ super(provider);
9
+ this.provider = provider;
10
+ this.cache = cache;
11
+ }
12
+ resolve(container, ...args) {
13
+ const key = this.cache.getKey(...args);
14
+ if (!this.cache.hasValue(key)) {
15
+ this.cache.setValue(key, this.provider.resolve(container, ...args));
16
+ }
17
+ return this.cache.getValue(key);
18
+ }
19
+ }
@@ -5,4 +5,3 @@ export const scope = (predicate) => (r) => r.when(predicate);
5
5
  const METADATA_KEY = 'registration';
6
6
  export const getTransformers = (Target) => getMetadata(Target, METADATA_KEY) ?? [];
7
7
  export const register = (...mappers) => setMetadata(METADATA_KEY, mappers);
8
- export const provider = (...mappers) => (r) => r.provider(...mappers);
@@ -1,24 +1,28 @@
1
- import { groupBy, pipe } from '../utils';
1
+ import { isConstructor, pipe } from '../utils';
2
2
  import { Provider } from '../provider/Provider';
3
- import { isProviderMapper } from '../provider/IProvider';
4
3
  import { DependencyMissingKeyError } from '../errors/DependencyMissingKeyError';
5
4
  import { getTransformers } from './IRegistration';
6
5
  export class Registration {
7
6
  static fromClass(Target) {
8
- return new Registration(() => Provider.fromClass(Target), Target.name).pipe(...getTransformers(Target));
7
+ const transform = pipe(...getTransformers(Target));
8
+ return transform(new Registration(() => Provider.fromClass(Target), Target.name));
9
9
  }
10
10
  static fromValue(value) {
11
+ if (isConstructor(value)) {
12
+ const transform = pipe(...getTransformers(value));
13
+ return transform(new Registration(() => Provider.fromValue(value), value.name));
14
+ }
11
15
  return new Registration(() => Provider.fromValue(value));
12
16
  }
13
17
  static fromFn(fn) {
14
18
  return new Registration(() => new Provider(fn));
15
19
  }
16
- constructor(createProvider, key) {
20
+ constructor(createProvider, key, matchScope = () => true) {
17
21
  this.createProvider = createProvider;
18
22
  this.key = key;
23
+ this.matchScope = matchScope;
19
24
  this.aliases = [];
20
25
  this.mappers = [];
21
- this.matchScope = () => true;
22
26
  }
23
27
  to(key) {
24
28
  this.key = key;
@@ -31,11 +35,6 @@ export class Registration {
31
35
  return this;
32
36
  }
33
37
  pipe(...mappers) {
34
- const [providerMappers, registrationMappers] = groupBy(mappers, isProviderMapper);
35
- this.mappers.push(...providerMappers);
36
- return pipe(...registrationMappers)(this);
37
- }
38
- provider(...mappers) {
39
38
  this.mappers.push(...mappers);
40
39
  return this;
41
40
  }
package/esm/utils.js CHANGED
@@ -11,12 +11,3 @@ export function fillEmptyIndexes(baseArr, insertArr) {
11
11
  }
12
12
  export const constant = (value) => () => value;
13
13
  export const isConstructor = (T) => typeof T === 'function' && !!T.prototype;
14
- export function groupBy(items, predicate) {
15
- const [a, b] = items.reduce(([a, b], item) => {
16
- if (predicate(item)) {
17
- return [a.concat(item), b];
18
- }
19
- return [a, b.concat(item)];
20
- }, [[], []]);
21
- return [a, b];
22
- }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ts-ioc-container",
3
- "version": "31.2.2",
3
+ "version": "31.4.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": "c20921fb252b08d764f03504b01d54889c873324"
62
+ "gitHead": "1374fb632851b79d7f7e119f7ea854037894d72f"
63
63
  }
@@ -16,7 +16,7 @@ export declare class Container implements IContainer {
16
16
  parent?: IContainer;
17
17
  tags?: Tag[];
18
18
  });
19
- add(registration: IRegistration<any>): this;
19
+ add(registration: IRegistration): this;
20
20
  register(key: DependencyKey, provider: IProvider, aliases?: Alias[]): this;
21
21
  resolve<T>(token: InjectionToken<T>, { args, child }?: ResolveOptions): T;
22
22
  createScope(...tags: Tag[]): Container;
@@ -25,7 +25,7 @@ export interface IContainer extends Resolvable, Tagged {
25
25
  readonly isDisposed: boolean;
26
26
  createScope(...tags: Tag[]): IContainer;
27
27
  register(key: DependencyKey, value: IProvider, aliases?: Alias[]): this;
28
- add(registration: IRegistration<any>): this;
28
+ add(registration: IRegistration): this;
29
29
  removeScope(child: IContainer): void;
30
30
  getInstances(): unknown[];
31
31
  dispose(): void;
@@ -2,7 +2,7 @@ export { IContainer, Resolvable, IContainerModule, isDependencyKey, DependencyKe
2
2
  export { constructor } from './utils';
3
3
  export { Container } from './container/Container';
4
4
  export { EmptyContainer } from './container/EmptyContainer';
5
- export { ResolveDependency, IProvider, visible, provider, markAsProvider } from './provider/IProvider';
5
+ export { ResolveDependency, IProvider, provider, visible } from './provider/IProvider';
6
6
  export { IInjector } from './injector/IInjector';
7
7
  export { DependencyNotFoundError } from './errors/DependencyNotFoundError';
8
8
  export { MethodNotImplementedError } from './errors/MethodNotImplementedError';
@@ -10,7 +10,9 @@ export { ContainerDisposedError } from './errors/ContainerDisposedError';
10
10
  export { Provider } from './provider/Provider';
11
11
  export { ProviderDecorator } from './provider/ProviderDecorator';
12
12
  export { ArgsFn, argsFn, args, ArgsProvider } from './provider/ArgsProvider';
13
- export { singleton, SingletonProvider } from './provider/SingletonProvider';
13
+ export { singleton, SingletonProvider } from './provider/singleton/SingletonProvider';
14
+ export { MultiCache } from './provider/singleton/MultiCache';
15
+ export { Cache } from './provider/singleton/Cache';
14
16
  export { AutoMockedContainer } from './container/AutoMockedContainer';
15
17
  export { Registration } from './registration/Registration';
16
18
  export { key, alias, IRegistration, scope, register } from './registration/IRegistration';
@@ -2,7 +2,7 @@ import { ProviderDecorator } from './ProviderDecorator';
2
2
  import { IContainer } from '../container/IContainer';
3
3
  import { IProvider } from './IProvider';
4
4
  import { MapFn } from '../utils';
5
- export type ArgsFn = (l: IContainer) => unknown[];
5
+ export type ArgsFn = (l: IContainer, ...args: unknown[]) => 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> {
@@ -13,6 +13,4 @@ export interface IProvider<T = unknown> {
13
13
  }
14
14
  export declare const provider: (...mappers: MapFn<IProvider>[]) => ClassDecorator;
15
15
  export declare const getTransformers: <T>(Target: constructor<T>) => MapFn<IProvider<T>>[];
16
- export declare const markAsProvider: <T>(fn: MapFn<IProvider<T>>) => MapFn<IProvider<T>>;
17
- export declare const isProviderMapper: <T>(fn: unknown) => fn is MapFn<IProvider<T>>;
18
16
  export declare const visible: (isVisibleWhen: ChildrenVisibilityPredicate) => MapFn<IProvider>;
@@ -0,0 +1,6 @@
1
+ export interface Cache<K, V> {
2
+ getKey(...args: unknown[]): K;
3
+ hasValue(key: K): boolean;
4
+ getValue(key: K): V;
5
+ setValue(key: K, value: V): void;
6
+ }
@@ -0,0 +1,10 @@
1
+ import { Cache } from './Cache';
2
+ export declare class MultiCache<K, V> implements Cache<K, V> {
3
+ readonly getKey: (...args: unknown[]) => K;
4
+ private instances;
5
+ constructor(getKey?: (...args: unknown[]) => K);
6
+ hasValue(token: K): boolean;
7
+ getValue(token: K): V;
8
+ setValue(token: K, value: V): void;
9
+ }
10
+ export declare const multiCache: <K, V>(getKey: (...args: unknown[]) => K) => MultiCache<K, V>;
@@ -0,0 +1,8 @@
1
+ import { Cache } from './Cache';
2
+ export declare class SingleCache<V> implements Cache<string, V> {
3
+ private instance?;
4
+ getKey(...args: unknown[]): string;
5
+ getValue(key: string): V;
6
+ hasValue(key: string): boolean;
7
+ setValue(key: string, value: V): void;
8
+ }
@@ -0,0 +1,12 @@
1
+ import { IContainer } from '../../container/IContainer';
2
+ import { ProviderDecorator } from '../ProviderDecorator';
3
+ import { IProvider } from '../IProvider';
4
+ import { MapFn } from '../../utils';
5
+ import { Cache } from './Cache';
6
+ export declare function singleton<T = unknown>(cacheProvider?: () => Cache<unknown, T>): MapFn<IProvider<T>>;
7
+ export declare class SingletonProvider<T> extends ProviderDecorator<T> {
8
+ private readonly provider;
9
+ private readonly cache;
10
+ constructor(provider: IProvider<T>, cache: Cache<unknown, T>);
11
+ resolve(container: IContainer, ...args: unknown[]): T;
12
+ }
@@ -6,12 +6,10 @@ export interface IRegistration<T = unknown> extends IContainerModule {
6
6
  addAliases(...aliases: Alias[]): this;
7
7
  when(isValidWhen: ScopePredicate): this;
8
8
  to(key: DependencyKey): this;
9
- pipe(...mappers: (MapFn<IRegistration<T>> | MapFn<IProvider<T>>)[]): IRegistration<T>;
10
- provider(...mappers: MapFn<IProvider<T>>[]): this;
9
+ pipe(...mappers: MapFn<IProvider<T>>[]): this;
11
10
  }
12
11
  export declare const key: (key: DependencyKey) => MapFn<IRegistration>;
13
12
  export declare const alias: (...aliases: Alias[]) => MapFn<IRegistration>;
14
13
  export declare const scope: (predicate: ScopePredicate) => MapFn<IRegistration>;
15
- export declare const getTransformers: <T>(Target: constructor<T>) => MapFn<IRegistration<T>>[];
16
- export declare const register: (...mappers: (MapFn<IRegistration> | MapFn<IProvider>)[]) => ClassDecorator;
17
- export declare const provider: (...mappers: MapFn<IProvider>[]) => MapFn<IRegistration>;
14
+ export declare const getTransformers: (Target: constructor<unknown>) => MapFn<IRegistration<unknown>>[];
15
+ export declare const register: (...mappers: MapFn<IRegistration>[]) => ClassDecorator;
@@ -5,17 +5,16 @@ import { IRegistration, ScopePredicate } from './IRegistration';
5
5
  export declare class Registration<T = unknown> implements IRegistration<T> {
6
6
  private createProvider;
7
7
  private key?;
8
- static fromClass<T>(Target: constructor<T>): IRegistration<T>;
9
- static fromValue<T>(value: T): Registration<T>;
8
+ private matchScope;
9
+ static fromClass<T>(Target: constructor<T>): IRegistration<unknown>;
10
+ static fromValue<T>(value: T): IRegistration<unknown>;
10
11
  static fromFn<T>(fn: ResolveDependency<T>): Registration<T>;
11
12
  private aliases;
12
13
  private mappers;
13
- private matchScope;
14
- constructor(createProvider: () => IProvider<T>, key?: DependencyKey | undefined);
14
+ constructor(createProvider: () => IProvider<T>, key?: DependencyKey | undefined, matchScope?: ScopePredicate);
15
15
  to(key: DependencyKey): this;
16
16
  addAliases(...aliases: Alias[]): this;
17
- pipe(...mappers: (MapFn<IRegistration<T>> | MapFn<IProvider<T>>)[]): IRegistration<T>;
18
- provider(...mappers: MapFn<IProvider<T>>[]): this;
17
+ pipe(...mappers: MapFn<IProvider<T>>[]): this;
19
18
  applyTo(container: IContainer): void;
20
19
  when(isValidWhen: ScopePredicate): this;
21
20
  }
@@ -4,4 +4,3 @@ export declare const pipe: <T>(...mappers: MapFn<T>[]) => MapFn<T>;
4
4
  export declare function fillEmptyIndexes<T>(baseArr: (T | undefined)[], insertArr: T[]): T[];
5
5
  export declare const constant: <T>(value: T) => () => T;
6
6
  export declare const isConstructor: (T: unknown) => T is constructor<unknown>;
7
- export declare function groupBy<T>(items: T[], predicate: (value: T) => boolean): T[][];
@@ -1,20 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SingletonProvider = exports.singleton = void 0;
4
- const ProviderDecorator_1 = require("./ProviderDecorator");
5
- const IProvider_1 = require("./IProvider");
6
- function singleton() {
7
- return (0, IProvider_1.markAsProvider)((provider) => new SingletonProvider(provider));
8
- }
9
- exports.singleton = singleton;
10
- class SingletonProvider extends ProviderDecorator_1.ProviderDecorator {
11
- constructor(provider) {
12
- super(provider);
13
- this.provider = provider;
14
- }
15
- resolve(container, ...args) {
16
- this.instance = this.instance ?? { value: this.provider.resolve(container, ...args) };
17
- return this.instance.value;
18
- }
19
- }
20
- exports.SingletonProvider = SingletonProvider;
@@ -1,15 +0,0 @@
1
- import { ProviderDecorator } from './ProviderDecorator';
2
- import { markAsProvider } from './IProvider';
3
- export function singleton() {
4
- return markAsProvider((provider) => new SingletonProvider(provider));
5
- }
6
- export class SingletonProvider extends ProviderDecorator {
7
- constructor(provider) {
8
- super(provider);
9
- this.provider = provider;
10
- }
11
- resolve(container, ...args) {
12
- this.instance = this.instance ?? { value: this.provider.resolve(container, ...args) };
13
- return this.instance.value;
14
- }
15
- }
@@ -1,11 +0,0 @@
1
- import { IContainer } from '../container/IContainer';
2
- import { ProviderDecorator } from './ProviderDecorator';
3
- import { IProvider } from './IProvider';
4
- import { MapFn } from '../utils';
5
- export declare function singleton<T = unknown>(): MapFn<IProvider<T>>;
6
- export declare class SingletonProvider<T> extends ProviderDecorator<T> {
7
- private readonly provider;
8
- private instance?;
9
- constructor(provider: IProvider<T>);
10
- resolve(container: IContainer, ...args: unknown[]): T;
11
- }