ts-ioc-container 26.4.5 → 26.5.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 (26) hide show
  1. package/README.md +59 -31
  2. package/cjm/container/AutoMockedContainer.js +2 -2
  3. package/cjm/container/Container.js +1 -1
  4. package/cjm/container/EmptyContainer.js +2 -2
  5. package/cjm/index.js +5 -7
  6. package/cjm/{registration → provider}/Registration.js +2 -6
  7. package/esm/container/AutoMockedContainer.js +2 -2
  8. package/esm/container/Container.js +1 -1
  9. package/esm/container/EmptyContainer.js +2 -2
  10. package/esm/index.js +4 -5
  11. package/esm/{registration → provider}/Registration.js +2 -6
  12. package/package.json +2 -2
  13. package/typings/index.d.ts +4 -5
  14. package/typings/{registration → provider}/Registration.d.ts +1 -1
  15. /package/cjm/{container → errors}/ContainerDisposedError.js +0 -0
  16. /package/cjm/{registration → errors}/DependencyMissingKeyError.js +0 -0
  17. /package/cjm/{container → errors}/DependencyNotFoundError.js +0 -0
  18. /package/cjm/{container → errors}/MethodNotImplementedError.js +0 -0
  19. /package/esm/{container → errors}/ContainerDisposedError.js +0 -0
  20. /package/esm/{registration → errors}/DependencyMissingKeyError.js +0 -0
  21. /package/esm/{container → errors}/DependencyNotFoundError.js +0 -0
  22. /package/esm/{container → errors}/MethodNotImplementedError.js +0 -0
  23. /package/typings/{container → errors}/ContainerDisposedError.d.ts +0 -0
  24. /package/typings/{registration → errors}/DependencyMissingKeyError.d.ts +0 -0
  25. /package/typings/{container → errors}/DependencyNotFoundError.d.ts +0 -0
  26. /package/typings/{container → errors}/MethodNotImplementedError.d.ts +0 -0
package/README.md CHANGED
@@ -81,11 +81,11 @@ import 'reflect-metadata';
81
81
  import { IContainer, by, Container, inject, ReflectionInjector, Provider } from 'ts-ioc-container';
82
82
 
83
83
  describe('Basic usage', function () {
84
- it('should inject dependencies', function () {
85
- class Logger {
86
- name = 'Logger';
87
- }
84
+ class Logger {
85
+ name = 'Logger';
86
+ }
88
87
 
88
+ it('should inject dependencies', function () {
89
89
  class App {
90
90
  constructor(@inject(by.key('ILogger')) public logger: Logger) {}
91
91
  }
@@ -95,6 +95,18 @@ describe('Basic usage', function () {
95
95
  expect(container.resolve(App).logger.name).toBe('Logger');
96
96
  });
97
97
 
98
+ it('should inject multiple dependencies', function () {
99
+ class App {
100
+ constructor(@inject(by.keys('ILogger1', 'ILogger2')) public loggers: Logger[]) {}
101
+ }
102
+
103
+ const container = new Container(new ReflectionInjector())
104
+ .register('ILogger1', Provider.fromClass(Logger))
105
+ .register('ILogger2', Provider.fromClass(Logger));
106
+
107
+ expect(container.resolve(App).loggers).toHaveLength(2);
108
+ });
109
+
98
110
  it('should inject current scope', function () {
99
111
  const root = new Container(new ReflectionInjector(), { tags: ['root'] });
100
112
 
@@ -539,51 +551,68 @@ Sometimes you want to register the same provider with different keys. This is wh
539
551
 
540
552
  ```typescript
541
553
  import 'reflect-metadata';
542
- import { alias, by, Container, inject, Provider, provider, ReflectionInjector } from 'ts-ioc-container';
554
+ import { alias, by, Container, inject, provider, ReflectionInjector, Registration } from 'ts-ioc-container';
543
555
 
544
556
  describe('alias', () => {
545
- interface ILogger {
546
- name: string;
557
+ const IMiddlewareKey = Symbol('IMiddleware');
558
+ const middleware = provider(alias(IMiddlewareKey));
559
+
560
+ interface IMiddleware {
561
+ applyTo(application: IApplication): void;
562
+ }
563
+
564
+ interface IApplication {
565
+ use(module: IMiddleware): void;
566
+ markMiddlewareAsApplied(name: string): void;
547
567
  }
548
568
 
549
- @provider(alias('ILogger', 'a'))
550
- class FileLogger implements ILogger {
551
- name = 'FileLogger';
569
+ @middleware
570
+ class LoggerMiddleware implements IMiddleware {
571
+ applyTo(application: IApplication): void {
572
+ application.markMiddlewareAsApplied('LoggerMiddleware');
573
+ }
552
574
  }
553
575
 
554
- @provider(alias('ILogger', 'b'))
555
- class DbLogger implements ILogger {
556
- name = 'DbLogger';
576
+ @middleware
577
+ class ErrorHandlerMiddleware implements IMiddleware {
578
+ applyTo(application: IApplication): void {
579
+ application.markMiddlewareAsApplied('ErrorHandlerMiddleware');
580
+ }
557
581
  }
558
582
 
559
583
  it('should resolve by some alias', () => {
560
- class App {
561
- constructor(@inject(by.alias.some('ILogger')) public loggers: ILogger[]) {}
562
- }
584
+ class App implements IApplication {
585
+ private appliedMiddleware: Set<string> = new Set();
586
+ constructor(@inject(by.alias.some(IMiddlewareKey)) public middleware: IMiddleware[]) {}
563
587
 
564
- const container = new Container(new ReflectionInjector())
565
- .register('IFileLogger', Provider.fromClass(FileLogger))
566
- .register('IDbLogger', Provider.fromClass(DbLogger));
588
+ markMiddlewareAsApplied(name: string): void {
589
+ this.appliedMiddleware.add(name);
590
+ }
567
591
 
568
- const app = container.resolve(App);
592
+ isMiddlewareApplied(name: string): boolean {
593
+ return this.appliedMiddleware.has(name);
594
+ }
569
595
 
570
- expect(app.loggers[0]).toBeInstanceOf(FileLogger);
571
- expect(app.loggers[1]).toBeInstanceOf(DbLogger);
572
- });
596
+ use(module: IMiddleware): void {
597
+ module.applyTo(this);
598
+ }
573
599
 
574
- it('should resolve by all alias', () => {
575
- class App {
576
- constructor(@inject(by.alias.all('ILogger', 'a')) public loggers: ILogger[]) {}
600
+ run() {
601
+ for (const module of this.middleware) {
602
+ module.applyTo(this);
603
+ }
604
+ }
577
605
  }
578
606
 
579
607
  const container = new Container(new ReflectionInjector())
580
- .register('IFileLogger', Provider.fromClass(FileLogger))
581
- .register('IDbLogger', Provider.fromClass(DbLogger));
608
+ .use(Registration.fromClass(LoggerMiddleware))
609
+ .use(Registration.fromClass(ErrorHandlerMiddleware));
582
610
 
583
611
  const app = container.resolve(App);
612
+ app.run();
584
613
 
585
- expect(app.loggers).toHaveLength(1);
586
- expect(app.loggers[0]).toBeInstanceOf(FileLogger);
614
+ expect(app.isMiddlewareApplied('LoggerMiddleware')).toBe(true);
615
+ expect(app.isMiddlewareApplied('ErrorHandlerMiddleware')).toBe(true);
587
616
  });
588
617
  });
589
618
 
@@ -826,7 +855,6 @@ describe('Mocking', () => {
826
855
  ## Errors
827
856
 
828
857
  - [DependencyNotFoundError.ts](lib%2Fcontainer%2FDependencyNotFoundError.ts)
829
- - [DependencyMissingKeyError.ts](lib%2Fregistration%2FDependencyMissingKeyError.ts)
830
858
  - [MethodNotImplementedError.ts](lib%2FMethodNotImplementedError.ts)
831
859
  - [ContainerDisposedError.ts](lib%2Fcontainer%2FContainerDisposedError.ts)
832
860
 
@@ -11,14 +11,14 @@ class AutoMockedContainer {
11
11
  }
12
12
  dispose() { }
13
13
  register() {
14
- throw new index_1.MethodNotImplementedError();
14
+ return this;
15
15
  }
16
16
  getInstances() {
17
17
  return [];
18
18
  }
19
19
  removeScope() { }
20
20
  use() {
21
- throw new index_1.MethodNotImplementedError();
21
+ return this;
22
22
  }
23
23
  getAllProviders() {
24
24
  return new Map();
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Container = void 0;
4
4
  const IContainer_1 = require("./IContainer");
5
5
  const EmptyContainer_1 = require("./EmptyContainer");
6
- const ContainerDisposedError_1 = require("./ContainerDisposedError");
6
+ const ContainerDisposedError_1 = require("../errors/ContainerDisposedError");
7
7
  class Container {
8
8
  constructor(injector, options = {}) {
9
9
  var _a, _b;
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.EmptyContainer = void 0;
4
- const MethodNotImplementedError_1 = require("./MethodNotImplementedError");
5
- const DependencyNotFoundError_1 = require("./DependencyNotFoundError");
4
+ const MethodNotImplementedError_1 = require("../errors/MethodNotImplementedError");
5
+ const DependencyNotFoundError_1 = require("../errors/DependencyNotFoundError");
6
6
  class EmptyContainer {
7
7
  getTokensByProvider() {
8
8
  return [];
package/cjm/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getMetadata = exports.setMetadata = exports.by = exports.hook = exports.getHooks = exports.ProxyInjector = exports.SimpleInjector = exports.inject = exports.ReflectionInjector = exports.DependencyMissingKeyError = exports.Registration = exports.key = exports.AutoMockedContainer = exports.TaggedProvider = exports.tags = exports.SingletonProvider = exports.singleton = exports.ArgsProvider = exports.args = exports.argsFn = exports.provider = exports.Provider = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.DependencyNotFoundError = exports.alias = exports.EmptyContainer = exports.Container = exports.isDependencyKey = void 0;
3
+ exports.getMetadata = exports.setMetadata = exports.by = exports.hook = exports.getHooks = exports.ProxyInjector = exports.SimpleInjector = exports.inject = exports.ReflectionInjector = exports.Registration = exports.key = exports.AutoMockedContainer = exports.TaggedProvider = exports.tags = exports.SingletonProvider = exports.singleton = exports.ArgsProvider = exports.args = exports.argsFn = exports.provider = exports.Provider = exports.ContainerDisposedError = exports.MethodNotImplementedError = exports.DependencyNotFoundError = exports.alias = exports.EmptyContainer = exports.Container = exports.isDependencyKey = void 0;
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");
@@ -9,11 +9,11 @@ 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
11
  Object.defineProperty(exports, "alias", { enumerable: true, get: function () { return IProvider_1.alias; } });
12
- var DependencyNotFoundError_1 = require("./container/DependencyNotFoundError");
12
+ var DependencyNotFoundError_1 = require("./errors/DependencyNotFoundError");
13
13
  Object.defineProperty(exports, "DependencyNotFoundError", { enumerable: true, get: function () { return DependencyNotFoundError_1.DependencyNotFoundError; } });
14
- var MethodNotImplementedError_1 = require("./container/MethodNotImplementedError");
14
+ var MethodNotImplementedError_1 = require("./errors/MethodNotImplementedError");
15
15
  Object.defineProperty(exports, "MethodNotImplementedError", { enumerable: true, get: function () { return MethodNotImplementedError_1.MethodNotImplementedError; } });
16
- var ContainerDisposedError_1 = require("./container/ContainerDisposedError");
16
+ var ContainerDisposedError_1 = require("./errors/ContainerDisposedError");
17
17
  Object.defineProperty(exports, "ContainerDisposedError", { enumerable: true, get: function () { return ContainerDisposedError_1.ContainerDisposedError; } });
18
18
  var Provider_1 = require("./provider/Provider");
19
19
  Object.defineProperty(exports, "Provider", { enumerable: true, get: function () { return Provider_1.Provider; } });
@@ -30,11 +30,9 @@ Object.defineProperty(exports, "tags", { enumerable: true, get: function () { re
30
30
  Object.defineProperty(exports, "TaggedProvider", { enumerable: true, get: function () { return TaggedProvider_1.TaggedProvider; } });
31
31
  var AutoMockedContainer_1 = require("./container/AutoMockedContainer");
32
32
  Object.defineProperty(exports, "AutoMockedContainer", { enumerable: true, get: function () { return AutoMockedContainer_1.AutoMockedContainer; } });
33
- var Registration_1 = require("./registration/Registration");
33
+ var Registration_1 = require("./provider/Registration");
34
34
  Object.defineProperty(exports, "key", { enumerable: true, get: function () { return Registration_1.key; } });
35
35
  Object.defineProperty(exports, "Registration", { enumerable: true, get: function () { return Registration_1.Registration; } });
36
- var DependencyMissingKeyError_1 = require("./registration/DependencyMissingKeyError");
37
- Object.defineProperty(exports, "DependencyMissingKeyError", { enumerable: true, get: function () { return DependencyMissingKeyError_1.DependencyMissingKeyError; } });
38
36
  var ReflectionInjector_1 = require("./injector/ReflectionInjector");
39
37
  Object.defineProperty(exports, "ReflectionInjector", { enumerable: true, get: function () { return ReflectionInjector_1.ReflectionInjector; } });
40
38
  Object.defineProperty(exports, "inject", { enumerable: true, get: function () { return ReflectionInjector_1.inject; } });
@@ -1,9 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Registration = exports.key = void 0;
4
- const DependencyMissingKeyError_1 = require("./DependencyMissingKeyError");
5
4
  const metadata_1 = require("../metadata");
6
- const Provider_1 = require("../provider/Provider");
5
+ const Provider_1 = require("./Provider");
7
6
  const DEPENDENCY_KEY = 'DependencyKey';
8
7
  const key = (value) => (0, metadata_1.setMetadata)(DEPENDENCY_KEY, value);
9
8
  exports.key = key;
@@ -14,10 +13,7 @@ class Registration {
14
13
  }
15
14
  static fromClass(Target) {
16
15
  const dependencyKey = (0, metadata_1.getMetadata)(Target, DEPENDENCY_KEY);
17
- if (dependencyKey === undefined) {
18
- throw new DependencyMissingKeyError_1.DependencyMissingKeyError(`Pls provide dependency key for ${Target.name}`);
19
- }
20
- return new Registration(dependencyKey, Provider_1.Provider.fromClass(Target));
16
+ return new Registration(dependencyKey !== null && dependencyKey !== void 0 ? dependencyKey : Target.name, Provider_1.Provider.fromClass(Target));
21
17
  }
22
18
  pipe(...mappers) {
23
19
  this.provider = this.provider.pipe(...mappers);
@@ -8,14 +8,14 @@ export class AutoMockedContainer {
8
8
  }
9
9
  dispose() { }
10
10
  register() {
11
- throw new MethodNotImplementedError();
11
+ return this;
12
12
  }
13
13
  getInstances() {
14
14
  return [];
15
15
  }
16
16
  removeScope() { }
17
17
  use() {
18
- throw new MethodNotImplementedError();
18
+ return this;
19
19
  }
20
20
  getAllProviders() {
21
21
  return new Map();
@@ -1,6 +1,6 @@
1
1
  import { isConstructor } from './IContainer';
2
2
  import { EmptyContainer } from './EmptyContainer';
3
- import { ContainerDisposedError } from './ContainerDisposedError';
3
+ import { ContainerDisposedError } from '../errors/ContainerDisposedError';
4
4
  export class Container {
5
5
  constructor(injector, options = {}) {
6
6
  var _a, _b;
@@ -1,5 +1,5 @@
1
- import { MethodNotImplementedError } from './MethodNotImplementedError';
2
- import { DependencyNotFoundError } from './DependencyNotFoundError';
1
+ import { MethodNotImplementedError } from '../errors/MethodNotImplementedError';
2
+ import { DependencyNotFoundError } from '../errors/DependencyNotFoundError';
3
3
  export class EmptyContainer {
4
4
  getTokensByProvider() {
5
5
  return [];
package/esm/index.js CHANGED
@@ -2,16 +2,15 @@ export { isDependencyKey, } from './container/IContainer';
2
2
  export { Container } from './container/Container';
3
3
  export { EmptyContainer } from './container/EmptyContainer';
4
4
  export { alias } from './provider/IProvider';
5
- export { DependencyNotFoundError } from './container/DependencyNotFoundError';
6
- export { MethodNotImplementedError } from './container/MethodNotImplementedError';
7
- export { ContainerDisposedError } from './container/ContainerDisposedError';
5
+ export { DependencyNotFoundError } from './errors/DependencyNotFoundError';
6
+ export { MethodNotImplementedError } from './errors/MethodNotImplementedError';
7
+ export { ContainerDisposedError } from './errors/ContainerDisposedError';
8
8
  export { Provider, provider } from './provider/Provider';
9
9
  export { argsFn, args, ArgsProvider } from './provider/ArgsProvider';
10
10
  export { singleton, SingletonProvider } from './provider/SingletonProvider';
11
11
  export { tags, TaggedProvider } from './provider/TaggedProvider';
12
12
  export { AutoMockedContainer } from './container/AutoMockedContainer';
13
- export { key, Registration } from './registration/Registration';
14
- export { DependencyMissingKeyError } from './registration/DependencyMissingKeyError';
13
+ export { key, Registration } from './provider/Registration';
15
14
  export { ReflectionInjector, inject } from './injector/ReflectionInjector';
16
15
  export { SimpleInjector } from './injector/SimpleInjector';
17
16
  export { ProxyInjector } from './injector/ProxyInjector';
@@ -1,6 +1,5 @@
1
- import { DependencyMissingKeyError } from './DependencyMissingKeyError';
2
1
  import { getMetadata, setMetadata } from '../metadata';
3
- import { Provider } from '../provider/Provider';
2
+ import { Provider } from './Provider';
4
3
  const DEPENDENCY_KEY = 'DependencyKey';
5
4
  export const key = (value) => setMetadata(DEPENDENCY_KEY, value);
6
5
  export class Registration {
@@ -10,10 +9,7 @@ export class Registration {
10
9
  }
11
10
  static fromClass(Target) {
12
11
  const dependencyKey = getMetadata(Target, DEPENDENCY_KEY);
13
- if (dependencyKey === undefined) {
14
- throw new DependencyMissingKeyError(`Pls provide dependency key for ${Target.name}`);
15
- }
16
- return new Registration(dependencyKey, Provider.fromClass(Target));
12
+ return new Registration(dependencyKey !== null && dependencyKey !== void 0 ? dependencyKey : Target.name, Provider.fromClass(Target));
17
13
  }
18
14
  pipe(...mappers) {
19
15
  this.provider = this.provider.pipe(...mappers);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ts-ioc-container",
3
- "version": "26.4.5",
3
+ "version": "26.5.0",
4
4
  "description": "Typescript IoC container",
5
5
  "publishConfig": {
6
6
  "access": "public",
@@ -60,5 +60,5 @@
60
60
  "ts-node": "^10.9.1",
61
61
  "typescript": "4.4.3"
62
62
  },
63
- "gitHead": "0b20e51c3a361f72307090f7843be9414630d34f"
63
+ "gitHead": "24de2212259dc0b0e564d1844dc5eb52244e5798"
64
64
  }
@@ -4,16 +4,15 @@ export { Container } from './container/Container';
4
4
  export { EmptyContainer } from './container/EmptyContainer';
5
5
  export { ResolveDependency, IProvider, alias } from './provider/IProvider';
6
6
  export { IInjector } from './injector/IInjector';
7
- export { DependencyNotFoundError } from './container/DependencyNotFoundError';
8
- export { MethodNotImplementedError } from './container/MethodNotImplementedError';
9
- export { ContainerDisposedError } from './container/ContainerDisposedError';
7
+ export { DependencyNotFoundError } from './errors/DependencyNotFoundError';
8
+ export { MethodNotImplementedError } from './errors/MethodNotImplementedError';
9
+ export { ContainerDisposedError } from './errors/ContainerDisposedError';
10
10
  export { Provider, provider } from './provider/Provider';
11
11
  export { ArgsFn, argsFn, args, ArgsProvider } from './provider/ArgsProvider';
12
12
  export { singleton, SingletonProvider } from './provider/SingletonProvider';
13
13
  export { tags, TaggedProvider } from './provider/TaggedProvider';
14
14
  export { AutoMockedContainer } from './container/AutoMockedContainer';
15
- export { key, Registration } from './registration/Registration';
16
- export { DependencyMissingKeyError } from './registration/DependencyMissingKeyError';
15
+ export { key, Registration } from './provider/Registration';
17
16
  export { ReflectionInjector, inject } from './injector/ReflectionInjector';
18
17
  export { SimpleInjector } from './injector/SimpleInjector';
19
18
  export { ProxyInjector } from './injector/ProxyInjector';
@@ -1,6 +1,6 @@
1
1
  import { DependencyKey, IContainer, IContainerModule } from '../container/IContainer';
2
2
  import { constructor, MapFn } from '../utils';
3
- import { IProvider } from '../provider/IProvider';
3
+ import { IProvider } from './IProvider';
4
4
  export declare const key: (value: DependencyKey) => ClassDecorator;
5
5
  export declare class Registration implements IContainerModule {
6
6
  private key;