@zanobijs/core 1.0.0-beta.1
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/CHANGELOG.md +8 -0
- package/LICENSE +33 -0
- package/README.md +11 -0
- package/__test__/factory.spec.d.ts +1 -0
- package/__test__/factory.spec.js +33 -0
- package/__test__/factory.spec.ts +37 -0
- package/__test__/injector/injector.spec.d.ts +1 -0
- package/__test__/injector/injector.spec.js +32 -0
- package/__test__/injector/injector.spec.ts +32 -0
- package/__test__/injector/module.spec.d.ts +1 -0
- package/__test__/injector/module.spec.js +60 -0
- package/__test__/injector/module.spec.ts +66 -0
- package/__test__/metadata.spec.d.ts +1 -0
- package/__test__/metadata.spec.js +70 -0
- package/__test__/metadata.spec.ts +71 -0
- package/__test__/mocks/classModule.mock.d.ts +10 -0
- package/__test__/mocks/classModule.mock.js +74 -0
- package/__test__/mocks/classModule.mock.ts +55 -0
- package/__test__/mocks/classWithDependeciesClass.mock.d.ts +13 -0
- package/__test__/mocks/classWithDependeciesClass.mock.js +40 -0
- package/__test__/mocks/classWithDependeciesClass.mock.ts +21 -0
- package/__test__/mocks/classWithDependeciesInject.mock.d.ts +24 -0
- package/__test__/mocks/classWithDependeciesInject.mock.js +74 -0
- package/__test__/mocks/classWithDependeciesInject.mock.ts +47 -0
- package/__test__/mocks/index.d.ts +1 -0
- package/__test__/mocks/index.js +4 -0
- package/__test__/mocks/index.ts +1 -0
- package/exceptions/constant.message.d.ts +1 -0
- package/exceptions/constant.message.js +5 -0
- package/exceptions/constant.message.ts +1 -0
- package/exceptions/index.d.ts +2 -0
- package/exceptions/index.js +5 -0
- package/exceptions/index.ts +2 -0
- package/exceptions/invalid.module.exception.d.ts +12 -0
- package/exceptions/invalid.module.exception.js +19 -0
- package/exceptions/invalid.module.exception.ts +16 -0
- package/factory.d.ts +37 -0
- package/factory.js +64 -0
- package/factory.ts +69 -0
- package/index.d.ts +2 -0
- package/index.js +7 -0
- package/index.ts +2 -0
- package/injector/index.d.ts +2 -0
- package/injector/index.js +5 -0
- package/injector/index.ts +2 -0
- package/injector/injector.d.ts +60 -0
- package/injector/injector.js +83 -0
- package/injector/injector.ts +89 -0
- package/injector/module.d.ts +76 -0
- package/injector/module.js +135 -0
- package/injector/module.ts +149 -0
- package/interface/index.d.ts +0 -0
- package/interface/index.js +1 -0
- package/interface/index.ts +1 -0
- package/metadata.d.ts +106 -0
- package/metadata.js +155 -0
- package/metadata.ts +178 -0
- package/package.json +34 -0
- package/tsconfig.build.json +17 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- package/tsconfig.json +11 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ControllerWithDepenClass = exports.ServiceToController = exports.Service = exports.ServiceToService = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const zanobijs_common_1 = require("zanobijs-common");
|
|
6
|
+
let ServiceToService = class ServiceToService {
|
|
7
|
+
constructor() { }
|
|
8
|
+
};
|
|
9
|
+
exports.ServiceToService = ServiceToService;
|
|
10
|
+
exports.ServiceToService = ServiceToService = tslib_1.__decorate([
|
|
11
|
+
(0, zanobijs_common_1.Injectable)(),
|
|
12
|
+
tslib_1.__metadata("design:paramtypes", [])
|
|
13
|
+
], ServiceToService);
|
|
14
|
+
let Service = class Service {
|
|
15
|
+
constructor() { }
|
|
16
|
+
};
|
|
17
|
+
exports.Service = Service;
|
|
18
|
+
exports.Service = Service = tslib_1.__decorate([
|
|
19
|
+
(0, zanobijs_common_1.Injectable)(),
|
|
20
|
+
tslib_1.__metadata("design:paramtypes", [])
|
|
21
|
+
], Service);
|
|
22
|
+
let ServiceToController = class ServiceToController {
|
|
23
|
+
constructor() { }
|
|
24
|
+
};
|
|
25
|
+
exports.ServiceToController = ServiceToController;
|
|
26
|
+
exports.ServiceToController = ServiceToController = tslib_1.__decorate([
|
|
27
|
+
(0, zanobijs_common_1.Injectable)(),
|
|
28
|
+
tslib_1.__metadata("design:paramtypes", [])
|
|
29
|
+
], ServiceToController);
|
|
30
|
+
let ControllerWithDepenClass = class ControllerWithDepenClass {
|
|
31
|
+
servicio;
|
|
32
|
+
constructor(servicio) {
|
|
33
|
+
this.servicio = servicio;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
exports.ControllerWithDepenClass = ControllerWithDepenClass;
|
|
37
|
+
exports.ControllerWithDepenClass = ControllerWithDepenClass = tslib_1.__decorate([
|
|
38
|
+
(0, zanobijs_common_1.Controller)(),
|
|
39
|
+
tslib_1.__metadata("design:paramtypes", [ServiceToController])
|
|
40
|
+
], ControllerWithDepenClass);
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Controller, Injectable } from "zanobijs-common";
|
|
2
|
+
|
|
3
|
+
@Injectable()
|
|
4
|
+
export class ServiceToService {
|
|
5
|
+
constructor() {}
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
@Injectable()
|
|
9
|
+
export class Service {
|
|
10
|
+
constructor() {}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
@Injectable()
|
|
14
|
+
export class ServiceToController {
|
|
15
|
+
constructor() {}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
@Controller()
|
|
19
|
+
export class ControllerWithDepenClass {
|
|
20
|
+
constructor(private servicio: ServiceToController) {}
|
|
21
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export declare class ServiceToController2 {
|
|
2
|
+
constructor();
|
|
3
|
+
getHello(): string;
|
|
4
|
+
}
|
|
5
|
+
export declare class ServiceWithDepenParam {
|
|
6
|
+
private servicio;
|
|
7
|
+
private userName;
|
|
8
|
+
private userAge;
|
|
9
|
+
private userLogin;
|
|
10
|
+
private userHobbis;
|
|
11
|
+
constructor(servicio: ServiceToController2, userName: string, userAge: number, userLogin: boolean, userHobbis: string[]);
|
|
12
|
+
}
|
|
13
|
+
export declare class ControllerWithDepen2 {
|
|
14
|
+
private sContro2;
|
|
15
|
+
private apiKey;
|
|
16
|
+
constructor(sContro2: ServiceToController2, apiKey: string);
|
|
17
|
+
getApiKey(): string;
|
|
18
|
+
getHelloService(): string;
|
|
19
|
+
}
|
|
20
|
+
export declare class ServiceWithDepen2 {
|
|
21
|
+
private serviceWithDepenParam;
|
|
22
|
+
private api_key;
|
|
23
|
+
constructor(serviceWithDepenParam: ServiceWithDepenParam, api_key: string);
|
|
24
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ServiceWithDepen2 = exports.ControllerWithDepen2 = exports.ServiceWithDepenParam = exports.ServiceToController2 = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const zanobijs_common_1 = require("zanobijs-common");
|
|
6
|
+
let ServiceToController2 = class ServiceToController2 {
|
|
7
|
+
constructor() { }
|
|
8
|
+
getHello() {
|
|
9
|
+
return "Hello ServiceToController2";
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
exports.ServiceToController2 = ServiceToController2;
|
|
13
|
+
exports.ServiceToController2 = ServiceToController2 = tslib_1.__decorate([
|
|
14
|
+
(0, zanobijs_common_1.Injectable)(),
|
|
15
|
+
tslib_1.__metadata("design:paramtypes", [])
|
|
16
|
+
], ServiceToController2);
|
|
17
|
+
let ServiceWithDepenParam = class ServiceWithDepenParam {
|
|
18
|
+
servicio;
|
|
19
|
+
userName;
|
|
20
|
+
userAge;
|
|
21
|
+
userLogin;
|
|
22
|
+
userHobbis;
|
|
23
|
+
constructor(servicio, userName, userAge, userLogin, userHobbis) {
|
|
24
|
+
this.servicio = servicio;
|
|
25
|
+
this.userName = userName;
|
|
26
|
+
this.userAge = userAge;
|
|
27
|
+
this.userLogin = userLogin;
|
|
28
|
+
this.userHobbis = userHobbis;
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
exports.ServiceWithDepenParam = ServiceWithDepenParam;
|
|
32
|
+
exports.ServiceWithDepenParam = ServiceWithDepenParam = tslib_1.__decorate([
|
|
33
|
+
(0, zanobijs_common_1.Injectable)(),
|
|
34
|
+
tslib_1.__param(1, (0, zanobijs_common_1.Inject)("USER_NAME")),
|
|
35
|
+
tslib_1.__param(2, (0, zanobijs_common_1.Inject)("USER_AGE")),
|
|
36
|
+
tslib_1.__param(3, (0, zanobijs_common_1.Inject)("USER_LOGIN")),
|
|
37
|
+
tslib_1.__param(4, (0, zanobijs_common_1.Inject)("USER_LIKE")),
|
|
38
|
+
tslib_1.__metadata("design:paramtypes", [ServiceToController2, String, Number, Boolean, Array])
|
|
39
|
+
], ServiceWithDepenParam);
|
|
40
|
+
let ControllerWithDepen2 = class ControllerWithDepen2 {
|
|
41
|
+
sContro2;
|
|
42
|
+
apiKey;
|
|
43
|
+
constructor(sContro2, apiKey) {
|
|
44
|
+
this.sContro2 = sContro2;
|
|
45
|
+
this.apiKey = apiKey;
|
|
46
|
+
this.apiKey = apiKey;
|
|
47
|
+
}
|
|
48
|
+
getApiKey() {
|
|
49
|
+
return this.apiKey;
|
|
50
|
+
}
|
|
51
|
+
getHelloService() {
|
|
52
|
+
return this.sContro2.getHello();
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
exports.ControllerWithDepen2 = ControllerWithDepen2;
|
|
56
|
+
exports.ControllerWithDepen2 = ControllerWithDepen2 = tslib_1.__decorate([
|
|
57
|
+
(0, zanobijs_common_1.Controller)(),
|
|
58
|
+
tslib_1.__param(1, (0, zanobijs_common_1.Inject)("API_KEY")),
|
|
59
|
+
tslib_1.__metadata("design:paramtypes", [ServiceToController2, String])
|
|
60
|
+
], ControllerWithDepen2);
|
|
61
|
+
let ServiceWithDepen2 = class ServiceWithDepen2 {
|
|
62
|
+
serviceWithDepenParam;
|
|
63
|
+
api_key;
|
|
64
|
+
constructor(serviceWithDepenParam, api_key) {
|
|
65
|
+
this.serviceWithDepenParam = serviceWithDepenParam;
|
|
66
|
+
this.api_key = api_key;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
exports.ServiceWithDepen2 = ServiceWithDepen2;
|
|
70
|
+
exports.ServiceWithDepen2 = ServiceWithDepen2 = tslib_1.__decorate([
|
|
71
|
+
(0, zanobijs_common_1.Injectable)(),
|
|
72
|
+
tslib_1.__param(1, (0, zanobijs_common_1.Inject)("API_KEY")),
|
|
73
|
+
tslib_1.__metadata("design:paramtypes", [ServiceWithDepenParam, String])
|
|
74
|
+
], ServiceWithDepen2);
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Controller, Inject, Injectable } from "zanobijs-common";
|
|
2
|
+
|
|
3
|
+
@Injectable()
|
|
4
|
+
export class ServiceToController2 {
|
|
5
|
+
constructor() {}
|
|
6
|
+
getHello(){
|
|
7
|
+
return "Hello ServiceToController2";
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@Injectable()
|
|
13
|
+
export class ServiceWithDepenParam {
|
|
14
|
+
constructor(
|
|
15
|
+
private servicio: ServiceToController2,
|
|
16
|
+
@Inject("USER_NAME") private userName: string,
|
|
17
|
+
@Inject("USER_AGE") private userAge: number,
|
|
18
|
+
@Inject("USER_LOGIN") private userLogin: boolean,
|
|
19
|
+
@Inject("USER_LIKE") private userHobbis: string[],
|
|
20
|
+
) {}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@Controller()
|
|
25
|
+
export class ControllerWithDepen2 {
|
|
26
|
+
constructor(
|
|
27
|
+
private sContro2: ServiceToController2,
|
|
28
|
+
@Inject("API_KEY") private apiKey: string,
|
|
29
|
+
) {
|
|
30
|
+
this.apiKey = apiKey;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
getApiKey() {
|
|
34
|
+
return this.apiKey;
|
|
35
|
+
}
|
|
36
|
+
getHelloService() {
|
|
37
|
+
return this.sContro2.getHello();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@Injectable()
|
|
42
|
+
export class ServiceWithDepen2 {
|
|
43
|
+
constructor(
|
|
44
|
+
private serviceWithDepenParam: ServiceWithDepenParam,
|
|
45
|
+
@Inject("API_KEY") private api_key: string,
|
|
46
|
+
) {}
|
|
47
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./classModule.mock";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./classModule.mock"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const MODULE_INVALID_ANNOTATION_ERROR: () => string;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MODULE_INVALID_ANNOTATION_ERROR = void 0;
|
|
4
|
+
const MODULE_INVALID_ANNOTATION_ERROR = () => `The class must have an annotation @Module()`;
|
|
5
|
+
exports.MODULE_INVALID_ANNOTATION_ERROR = MODULE_INVALID_ANNOTATION_ERROR;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const MODULE_INVALID_ANNOTATION_ERROR = () => `The class must have an annotation @Module()`;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { RuntimeException } from "zanobijs-common/exceptions/runtime.exception";
|
|
2
|
+
/**
|
|
3
|
+
* Excepción lanzada cuando una clase Modulo no tiene el decorador `@Module`
|
|
4
|
+
* de zanobijs-common
|
|
5
|
+
*
|
|
6
|
+
* @remarks
|
|
7
|
+
* Esta clase extiende la base `RuntimeException`de zanobijs-common
|
|
8
|
+
* para proporcionar detalles adicionales específicos a esquemas de módulos inválidos.
|
|
9
|
+
*/
|
|
10
|
+
export declare class InvalidModuleAnnotationException extends RuntimeException {
|
|
11
|
+
constructor(detail?: any);
|
|
12
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InvalidModuleAnnotationException = void 0;
|
|
4
|
+
const runtime_exception_1 = require("zanobijs-common/exceptions/runtime.exception");
|
|
5
|
+
const constant_message_1 = require("./constant.message");
|
|
6
|
+
/**
|
|
7
|
+
* Excepción lanzada cuando una clase Modulo no tiene el decorador `@Module`
|
|
8
|
+
* de zanobijs-common
|
|
9
|
+
*
|
|
10
|
+
* @remarks
|
|
11
|
+
* Esta clase extiende la base `RuntimeException`de zanobijs-common
|
|
12
|
+
* para proporcionar detalles adicionales específicos a esquemas de módulos inválidos.
|
|
13
|
+
*/
|
|
14
|
+
class InvalidModuleAnnotationException extends runtime_exception_1.RuntimeException {
|
|
15
|
+
constructor(detail = ``) {
|
|
16
|
+
super((0, constant_message_1.MODULE_INVALID_ANNOTATION_ERROR)(), detail);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.InvalidModuleAnnotationException = InvalidModuleAnnotationException;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { RuntimeException } from "zanobijs-common/exceptions/runtime.exception";
|
|
2
|
+
import { MODULE_INVALID_ANNOTATION_ERROR } from "./constant.message";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Excepción lanzada cuando una clase Modulo no tiene el decorador `@Module`
|
|
6
|
+
* de zanobijs-common
|
|
7
|
+
*
|
|
8
|
+
* @remarks
|
|
9
|
+
* Esta clase extiende la base `RuntimeException`de zanobijs-common
|
|
10
|
+
* para proporcionar detalles adicionales específicos a esquemas de módulos inválidos.
|
|
11
|
+
*/
|
|
12
|
+
export class InvalidModuleAnnotationException extends RuntimeException {
|
|
13
|
+
constructor(detail: any = ``) {
|
|
14
|
+
super(MODULE_INVALID_ANNOTATION_ERROR(), detail);
|
|
15
|
+
}
|
|
16
|
+
}
|
package/factory.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
/**
|
|
3
|
+
* Factory es una clase que facilita la creación y configuración de
|
|
4
|
+
* contenedores de inyección de dependencias utilizando metadatos y
|
|
5
|
+
* la librería `awilix` para registrar y resolver controladores y
|
|
6
|
+
* servicios.
|
|
7
|
+
*/
|
|
8
|
+
export declare class Factory {
|
|
9
|
+
private moduleHandler;
|
|
10
|
+
private registeredClasses;
|
|
11
|
+
private container;
|
|
12
|
+
constructor(appModule: any);
|
|
13
|
+
/**
|
|
14
|
+
* Este método registra clases desde el módulo proporcionado
|
|
15
|
+
* y recorre sus importaciones de forma recursiva para registrar
|
|
16
|
+
* las clases necesarias de importación.
|
|
17
|
+
* @private
|
|
18
|
+
*/
|
|
19
|
+
private registerClassesFromModule;
|
|
20
|
+
/**
|
|
21
|
+
* Registra clases desde un módulo específico.
|
|
22
|
+
* @param {any} module - Módulo desde el que se registrarán las clases.
|
|
23
|
+
* @private
|
|
24
|
+
*/
|
|
25
|
+
private registerFromModule;
|
|
26
|
+
/**
|
|
27
|
+
* Crea el contenedor de inyección de dependencias y registra las clases.
|
|
28
|
+
* @returns {Factory} - Instancia actual de la fábrica.
|
|
29
|
+
*/
|
|
30
|
+
create(): Factory;
|
|
31
|
+
/**
|
|
32
|
+
* Resuelve y devuelve una instancia del contenedor basado en la entidad proporcionada.
|
|
33
|
+
* @param {string} entity - Nombre de la entidad a resolver.
|
|
34
|
+
* @returns {any} - Instancia resuelta.
|
|
35
|
+
*/
|
|
36
|
+
get<T>(entity: string): T;
|
|
37
|
+
}
|
package/factory.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Factory = void 0;
|
|
4
|
+
require("reflect-metadata");
|
|
5
|
+
const awilix_1 = require("awilix");
|
|
6
|
+
const module_1 = require("./injector/module");
|
|
7
|
+
/**
|
|
8
|
+
* Factory es una clase que facilita la creación y configuración de
|
|
9
|
+
* contenedores de inyección de dependencias utilizando metadatos y
|
|
10
|
+
* la librería `awilix` para registrar y resolver controladores y
|
|
11
|
+
* servicios.
|
|
12
|
+
*/
|
|
13
|
+
class Factory {
|
|
14
|
+
moduleHandler;
|
|
15
|
+
registeredClasses = {};
|
|
16
|
+
container;
|
|
17
|
+
constructor(appModule) {
|
|
18
|
+
this.moduleHandler = new module_1.Module();
|
|
19
|
+
this.registerClassesFromModule(appModule);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Este método registra clases desde el módulo proporcionado
|
|
23
|
+
* y recorre sus importaciones de forma recursiva para registrar
|
|
24
|
+
* las clases necesarias de importación.
|
|
25
|
+
* @private
|
|
26
|
+
*/
|
|
27
|
+
registerClassesFromModule(module) {
|
|
28
|
+
this.registerFromModule(module);
|
|
29
|
+
const importedModules = this.moduleHandler.getImports();
|
|
30
|
+
if (importedModules && importedModules.length) {
|
|
31
|
+
importedModules.forEach((moduleImport) => {
|
|
32
|
+
this.registerClassesFromModule(moduleImport);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Registra clases desde un módulo específico.
|
|
38
|
+
* @param {any} module - Módulo desde el que se registrarán las clases.
|
|
39
|
+
* @private
|
|
40
|
+
*/
|
|
41
|
+
registerFromModule(module) {
|
|
42
|
+
this.moduleHandler.setup(module);
|
|
43
|
+
this.moduleHandler.initialize();
|
|
44
|
+
Object.assign(this.registeredClasses, this.moduleHandler.getRegisterClass());
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Crea el contenedor de inyección de dependencias y registra las clases.
|
|
48
|
+
* @returns {Factory} - Instancia actual de la fábrica.
|
|
49
|
+
*/
|
|
50
|
+
create() {
|
|
51
|
+
this.container = (0, awilix_1.createContainer)({ injectionMode: awilix_1.InjectionMode.CLASSIC });
|
|
52
|
+
this.container.register(this.registeredClasses);
|
|
53
|
+
return this;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Resuelve y devuelve una instancia del contenedor basado en la entidad proporcionada.
|
|
57
|
+
* @param {string} entity - Nombre de la entidad a resolver.
|
|
58
|
+
* @returns {any} - Instancia resuelta.
|
|
59
|
+
*/
|
|
60
|
+
get(entity) {
|
|
61
|
+
return this.container.resolve(entity);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.Factory = Factory;
|
package/factory.ts
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
import {AwilixContainer, InjectionMode, createContainer } from "awilix";
|
|
3
|
+
import { Module } from "./injector/module";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Factory es una clase que facilita la creación y configuración de
|
|
7
|
+
* contenedores de inyección de dependencias utilizando metadatos y
|
|
8
|
+
* la librería `awilix` para registrar y resolver controladores y
|
|
9
|
+
* servicios.
|
|
10
|
+
*/
|
|
11
|
+
export class Factory {
|
|
12
|
+
private moduleHandler: Module;
|
|
13
|
+
private registeredClasses = {};
|
|
14
|
+
private container: AwilixContainer<any>;
|
|
15
|
+
|
|
16
|
+
constructor(appModule: any) {
|
|
17
|
+
this.moduleHandler = new Module();
|
|
18
|
+
this.registerClassesFromModule(appModule);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Este método registra clases desde el módulo proporcionado
|
|
23
|
+
* y recorre sus importaciones de forma recursiva para registrar
|
|
24
|
+
* las clases necesarias de importación.
|
|
25
|
+
* @private
|
|
26
|
+
*/
|
|
27
|
+
private registerClassesFromModule(module: any): void {
|
|
28
|
+
this.registerFromModule(module);
|
|
29
|
+
const importedModules = this.moduleHandler.getImports();
|
|
30
|
+
if (importedModules && importedModules.length) {
|
|
31
|
+
importedModules.forEach((moduleImport) => {
|
|
32
|
+
this.registerClassesFromModule(moduleImport);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Registra clases desde un módulo específico.
|
|
39
|
+
* @param {any} module - Módulo desde el que se registrarán las clases.
|
|
40
|
+
* @private
|
|
41
|
+
*/
|
|
42
|
+
private registerFromModule(module: any): void {
|
|
43
|
+
this.moduleHandler.setup(module);
|
|
44
|
+
this.moduleHandler.initialize();
|
|
45
|
+
Object.assign(
|
|
46
|
+
this.registeredClasses,
|
|
47
|
+
this.moduleHandler.getRegisterClass(),
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Crea el contenedor de inyección de dependencias y registra las clases.
|
|
53
|
+
* @returns {Factory} - Instancia actual de la fábrica.
|
|
54
|
+
*/
|
|
55
|
+
create(): Factory {
|
|
56
|
+
this.container = createContainer({ injectionMode: InjectionMode.CLASSIC });
|
|
57
|
+
this.container.register(this.registeredClasses);
|
|
58
|
+
return this;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Resuelve y devuelve una instancia del contenedor basado en la entidad proporcionada.
|
|
63
|
+
* @param {string} entity - Nombre de la entidad a resolver.
|
|
64
|
+
* @returns {any} - Instancia resuelta.
|
|
65
|
+
*/
|
|
66
|
+
get<T>(entity: string): T {
|
|
67
|
+
return this.container.resolve(entity)
|
|
68
|
+
}
|
|
69
|
+
}
|
package/index.d.ts
ADDED
package/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Factory = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
var factory_1 = require("./factory");
|
|
6
|
+
Object.defineProperty(exports, "Factory", { enumerable: true, get: function () { return factory_1.Factory; } });
|
|
7
|
+
tslib_1.__exportStar(require("./injector"), exports);
|
package/index.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export type Constructor<T> = {
|
|
2
|
+
new (...args: any[]): T;
|
|
3
|
+
};
|
|
4
|
+
/**
|
|
5
|
+
* La clase `Injector` es la encargada de manejar la inyección de dependencias
|
|
6
|
+
* solo para parametros tipo objecto { provider, useValue }
|
|
7
|
+
*/
|
|
8
|
+
export declare class Injector {
|
|
9
|
+
private module;
|
|
10
|
+
private listProviders;
|
|
11
|
+
private metadata;
|
|
12
|
+
private logger;
|
|
13
|
+
/**
|
|
14
|
+
* En Constructor de la clase Injector obtenermos las instancias
|
|
15
|
+
* de Metadata y Logger e inciamos el escaneo de proveedores.
|
|
16
|
+
* @param {Module} module - El módulo debe tener el decorador `@Module`
|
|
17
|
+
* para poderlo procesar.
|
|
18
|
+
*/
|
|
19
|
+
constructor(module: any);
|
|
20
|
+
/**
|
|
21
|
+
* Este método privado recorre el array de los servicios del modulo para
|
|
22
|
+
* buscar los proveedores tipo objeto a injectar y los almacena en una
|
|
23
|
+
* lista de proveedores.
|
|
24
|
+
* @private
|
|
25
|
+
*/
|
|
26
|
+
private scanProviders;
|
|
27
|
+
/**
|
|
28
|
+
* Método para obtener un objeto con los parámetros y valores
|
|
29
|
+
* que se inyectarán en la clase (target).
|
|
30
|
+
*
|
|
31
|
+
* @param {Class} target - La clase objetivo.
|
|
32
|
+
* @returns {object} - Objeto con datos a inyectar.
|
|
33
|
+
*/
|
|
34
|
+
getInjectData(target: Function): object;
|
|
35
|
+
/**
|
|
36
|
+
* Método para obtener el injector apropiado para la clase objetivo.
|
|
37
|
+
*
|
|
38
|
+
* @param {any} target - La clase objetivo.
|
|
39
|
+
* @returns - El injector configurado.
|
|
40
|
+
*/
|
|
41
|
+
getInjector(target: any): {
|
|
42
|
+
interface: any;
|
|
43
|
+
injectionMode?: import("awilix").InjectionModeType;
|
|
44
|
+
injector?: import("awilix").InjectorFunction;
|
|
45
|
+
setLifetime(lifetime: import("awilix").LifetimeType): import("awilix").BuildResolver<object> & import("awilix").DisposableResolver<object>;
|
|
46
|
+
setInjectionMode(mode: import("awilix").InjectionModeType): import("awilix").BuildResolver<object> & import("awilix").DisposableResolver<object>;
|
|
47
|
+
singleton(): import("awilix").BuildResolver<object> & import("awilix").DisposableResolver<object>;
|
|
48
|
+
scoped(): import("awilix").BuildResolver<object> & import("awilix").DisposableResolver<object>;
|
|
49
|
+
transient(): import("awilix").BuildResolver<object> & import("awilix").DisposableResolver<object>;
|
|
50
|
+
proxy(): import("awilix").BuildResolver<object> & import("awilix").DisposableResolver<object>;
|
|
51
|
+
classic(): import("awilix").BuildResolver<object> & import("awilix").DisposableResolver<object>;
|
|
52
|
+
inject(injector: import("awilix").InjectorFunction): import("awilix").BuildResolver<object> & import("awilix").DisposableResolver<object>;
|
|
53
|
+
resolve<U extends object>(container: import("awilix").AwilixContainer<U>): object;
|
|
54
|
+
name?: string;
|
|
55
|
+
lifetime?: import("awilix").LifetimeType;
|
|
56
|
+
register?: (...args: any[]) => import("awilix").Resolver<object>;
|
|
57
|
+
dispose?: import("awilix").Disposer<object>;
|
|
58
|
+
disposer(dispose: import("awilix").Disposer<object>): import("awilix").BuildResolver<object> & import("awilix").DisposableResolver<object>;
|
|
59
|
+
};
|
|
60
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Injector = void 0;
|
|
4
|
+
const metadata_1 = require("../metadata");
|
|
5
|
+
const utils_1 = require("zanobijs-common/utils");
|
|
6
|
+
const shared_utils_1 = require("zanobijs-common/utils/shared.utils");
|
|
7
|
+
const awilix_1 = require("awilix");
|
|
8
|
+
/**
|
|
9
|
+
* La clase `Injector` es la encargada de manejar la inyección de dependencias
|
|
10
|
+
* solo para parametros tipo objecto { provider, useValue }
|
|
11
|
+
*/
|
|
12
|
+
class Injector {
|
|
13
|
+
module;
|
|
14
|
+
listProviders = new Map();
|
|
15
|
+
metadata;
|
|
16
|
+
logger;
|
|
17
|
+
/**
|
|
18
|
+
* En Constructor de la clase Injector obtenermos las instancias
|
|
19
|
+
* de Metadata y Logger e inciamos el escaneo de proveedores.
|
|
20
|
+
* @param {Module} module - El módulo debe tener el decorador `@Module`
|
|
21
|
+
* para poderlo procesar.
|
|
22
|
+
*/
|
|
23
|
+
constructor(module) {
|
|
24
|
+
this.metadata = metadata_1.Metadata.getInstance();
|
|
25
|
+
this.logger = (0, utils_1.Logger)();
|
|
26
|
+
this.module = module;
|
|
27
|
+
this.scanProviders();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Este método privado recorre el array de los servicios del modulo para
|
|
31
|
+
* buscar los proveedores tipo objeto a injectar y los almacena en una
|
|
32
|
+
* lista de proveedores.
|
|
33
|
+
* @private
|
|
34
|
+
*/
|
|
35
|
+
scanProviders() {
|
|
36
|
+
const { services } = this.metadata.getMetadataModule(this.module);
|
|
37
|
+
services.forEach((service) => {
|
|
38
|
+
if (typeof service === "object")
|
|
39
|
+
this.listProviders.set(service.provider, service.useValue);
|
|
40
|
+
});
|
|
41
|
+
this.logger.debug("Injector - list provider", this.listProviders);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Método para obtener un objeto con los parámetros y valores
|
|
45
|
+
* que se inyectarán en la clase (target).
|
|
46
|
+
*
|
|
47
|
+
* @param {Class} target - La clase objetivo.
|
|
48
|
+
* @returns {object} - Objeto con datos a inyectar.
|
|
49
|
+
*/
|
|
50
|
+
getInjectData(target) {
|
|
51
|
+
const injectData = {};
|
|
52
|
+
const dInject = this.metadata.getInjectionDependencies(target);
|
|
53
|
+
if (dInject.size > 0) {
|
|
54
|
+
for (const key of dInject.keys()) {
|
|
55
|
+
if (this.listProviders.has(key)) {
|
|
56
|
+
this.logger.info(`"${key}" is on providers list.`);
|
|
57
|
+
const paramName = dInject.get(key);
|
|
58
|
+
const useValue = this.listProviders.get(key);
|
|
59
|
+
injectData[paramName] = useValue;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return injectData;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Método para obtener el injector apropiado para la clase objetivo.
|
|
67
|
+
*
|
|
68
|
+
* @param {any} target - La clase objetivo.
|
|
69
|
+
* @returns - El injector configurado.
|
|
70
|
+
*/
|
|
71
|
+
getInjector(target) {
|
|
72
|
+
const injectData = this.getInjectData(target);
|
|
73
|
+
let injector = (0, awilix_1.asClass)(target).scoped();
|
|
74
|
+
if (!(0, shared_utils_1.isEmpty)(injectData)) {
|
|
75
|
+
injector = injector.inject(() => injectData);
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
...injector,
|
|
79
|
+
interface: target,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.Injector = Injector;
|