@zerooneit/expressive-tea 1.3.0-beta.1 → 1.3.0-beta.2
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/classes/Boot.js +2 -1
- package/classes/MetaData.js +1 -1
- package/classes/Settings.js +2 -2
- package/decorators/proxy.d.ts +13 -0
- package/decorators/proxy.js +70 -0
- package/decorators/router.d.ts +3 -2
- package/decorators/router.js +2 -2
- package/decorators/server.d.ts +1 -0
- package/decorators/server.js +11 -1
- package/engines/http/index.d.ts +2 -0
- package/engines/http/index.js +16 -6
- package/engines/teacup/index.js +7 -6
- package/engines/teapot/index.js +7 -6
- package/engines/websocket/index.js +6 -5
- package/helpers/boot-helper.d.ts +1 -0
- package/helpers/boot-helper.js +6 -1
- package/helpers/object-helper.d.ts +1 -0
- package/helpers/object-helper.js +5 -1
- package/helpers/server.d.ts +2 -2
- package/helpers/server.js +4 -4
- package/helpers/teapot-helper.d.ts +1 -0
- package/helpers/websocket-helper.d.ts +1 -0
- package/libs/classNames.d.ts +1 -0
- package/libs/classNames.js +4 -0
- package/libs/constants.d.ts +23 -0
- package/libs/constants.js +28 -1
- package/libs/interfaces.d.ts +14 -1
- package/libs/types.d.ts +2 -0
- package/package.json +24 -26
- package/services/WebsocketService.d.ts +1 -0
- package/yarn-error.log +0 -5906
package/classes/Boot.js
CHANGED
|
@@ -71,7 +71,7 @@ class Boot {
|
|
|
71
71
|
}, this.server);
|
|
72
72
|
// Injectables
|
|
73
73
|
localContainer.bind('server').toConstantValue(server);
|
|
74
|
-
localContainer.bind('secureServer').toConstantValue(secureServer);
|
|
74
|
+
localContainer.bind('secureServer').toConstantValue(secureServer || undefined);
|
|
75
75
|
localContainer.bind('context').toConstantValue(this);
|
|
76
76
|
localContainer.bind('settings').toConstantValue(this.settings);
|
|
77
77
|
const httpEngine = localContainer.resolve(index_1.default);
|
|
@@ -80,6 +80,7 @@ class Boot {
|
|
|
80
80
|
const teacupEngine = localContainer.resolve(teacup_1.default);
|
|
81
81
|
await websocketEngine.init();
|
|
82
82
|
await httpEngine.init();
|
|
83
|
+
await httpEngine.resolveProxyContainers();
|
|
83
84
|
await httpEngine.resolveStages(constants_1.BOOT_ORDER);
|
|
84
85
|
await httpEngine.resolveStages([constants_1.BOOT_STAGES.AFTER_APPLICATION_MIDDLEWARES, constants_1.BOOT_STAGES.ON_HTTP_CREATION], server, secureServer);
|
|
85
86
|
const listenerServers = await httpEngine.start();
|
package/classes/MetaData.js
CHANGED
|
@@ -32,8 +32,8 @@ class Metadata {
|
|
|
32
32
|
return Reflect.hasMetadata(key, (0, object_helper_1.getClass)(target), propertyKey);
|
|
33
33
|
}
|
|
34
34
|
catch (er) {
|
|
35
|
+
return false;
|
|
35
36
|
}
|
|
36
|
-
return false;
|
|
37
37
|
}
|
|
38
38
|
static hasOwn(key, target, propertyKey) {
|
|
39
39
|
return Reflect.hasOwnMetadata(key, (0, object_helper_1.getClass)(target), propertyKey);
|
package/classes/Settings.js
CHANGED
|
@@ -112,8 +112,8 @@ let Settings = Settings_1 = class Settings {
|
|
|
112
112
|
}
|
|
113
113
|
};
|
|
114
114
|
Settings.isolatedContext = new Map();
|
|
115
|
-
Settings = Settings_1 =
|
|
115
|
+
Settings = Settings_1 = tslib_1.__decorate([
|
|
116
116
|
(0, inversify_1.injectable)(),
|
|
117
|
-
|
|
117
|
+
tslib_1.__metadata("design:paramtypes", [Object, Boolean])
|
|
118
118
|
], Settings);
|
|
119
119
|
exports.default = Settings;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ExpressiveTeaProxyOptions, ExpressiveTeaProxyProperty, MethodDecorator } from '../libs/types';
|
|
2
|
+
import { Express, RequestHandler } from 'express';
|
|
3
|
+
export declare function ProxyContainer(source: string, targetUrl: string): <T extends new (...args: any[]) => any>(ProxyContainerClass: T) => {
|
|
4
|
+
new (...args: any[]): {
|
|
5
|
+
[x: string]: any;
|
|
6
|
+
readonly source: string;
|
|
7
|
+
readonly target: string;
|
|
8
|
+
readonly proxyHandler: RequestHandler;
|
|
9
|
+
__register(server: Express): void;
|
|
10
|
+
};
|
|
11
|
+
} & T;
|
|
12
|
+
export declare function ProxyOption(option: ExpressiveTeaProxyOptions): MethodDecorator;
|
|
13
|
+
export declare function ProxyProperty(option: ExpressiveTeaProxyProperty, value: any): PropertyDecorator;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ProxyProperty = exports.ProxyOption = exports.ProxyContainer = void 0;
|
|
4
|
+
const MetaData_1 = require("../classes/MetaData");
|
|
5
|
+
const httpProxy = require("express-http-proxy");
|
|
6
|
+
const object_helper_1 = require("../helpers/object-helper");
|
|
7
|
+
const lodash_1 = require("lodash");
|
|
8
|
+
const RequestExceptions_1 = require("../exceptions/RequestExceptions");
|
|
9
|
+
const constants_1 = require("../libs/constants");
|
|
10
|
+
const NON_ASYNC_METHODS = ['host'];
|
|
11
|
+
function ProxyContainer(source, targetUrl) {
|
|
12
|
+
return (ProxyContainerClass) => {
|
|
13
|
+
class ExpressiveTeaProxy extends ProxyContainerClass {
|
|
14
|
+
constructor(...args) {
|
|
15
|
+
super(...args);
|
|
16
|
+
this.source = source;
|
|
17
|
+
this.target = targetUrl;
|
|
18
|
+
const options = {};
|
|
19
|
+
const host = MetaData_1.default.get(constants_1.PROXY_SETTING_KEY, this, constants_1.PROXY_METHODS.HOST);
|
|
20
|
+
for (const value of Object.values(constants_1.PROXY_METHODS)) {
|
|
21
|
+
if (value !== constants_1.PROXY_METHODS.HOST) {
|
|
22
|
+
options[value] = MetaData_1.default.get(constants_1.PROXY_SETTING_KEY, this, value);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
for (const value of Object.values(constants_1.PROXY_PROPERTIES)) {
|
|
26
|
+
const key = MetaData_1.default.get(constants_1.PROXY_SETTING_KEY, this, value);
|
|
27
|
+
if (!(0, lodash_1.isUndefined)(key)) {
|
|
28
|
+
// @ts-ignore:next-line
|
|
29
|
+
options[value] = this[key];
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
this.proxyHandler = httpProxy(host ? host.value.bind(this) : this.target);
|
|
33
|
+
}
|
|
34
|
+
__register(server) {
|
|
35
|
+
const proxyMetadata = MetaData_1.default.get(constants_1.PROXY_SETTING_KEY, (0, object_helper_1.getClass)(this));
|
|
36
|
+
console.info(`[PROXY - ${proxyMetadata.name}] ${this.source} -> ${this.target}`);
|
|
37
|
+
server.use(this.source, this.proxyHandler);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
;
|
|
41
|
+
const settings = {
|
|
42
|
+
source,
|
|
43
|
+
targetUrl,
|
|
44
|
+
name: ProxyContainerClass.name
|
|
45
|
+
};
|
|
46
|
+
MetaData_1.default.set(constants_1.PROXY_SETTING_KEY, settings, ProxyContainerClass);
|
|
47
|
+
return ExpressiveTeaProxy;
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
exports.ProxyContainer = ProxyContainer;
|
|
51
|
+
function ProxyOption(option) {
|
|
52
|
+
return (target, propertyKey, descriptor) => {
|
|
53
|
+
if (NON_ASYNC_METHODS.includes(option) && (0, object_helper_1.isAsyncFunction)(descriptor.value)) {
|
|
54
|
+
throw new RequestExceptions_1.GenericRequestException(`${String(propertyKey)} must not be declared as Async Function.`);
|
|
55
|
+
}
|
|
56
|
+
MetaData_1.default.set(constants_1.PROXY_SETTING_KEY, descriptor, target, option);
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
exports.ProxyOption = ProxyOption;
|
|
60
|
+
function ProxyProperty(option, value) {
|
|
61
|
+
return (target, propertyKey) => {
|
|
62
|
+
MetaData_1.default.set(constants_1.PROXY_SETTING_KEY, propertyKey, target, option);
|
|
63
|
+
let currentValue = target[propertyKey];
|
|
64
|
+
Object.defineProperty(target, propertyKey, {
|
|
65
|
+
get: () => value,
|
|
66
|
+
set: () => { currentValue = value; }
|
|
67
|
+
});
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
exports.ProxyProperty = ProxyProperty;
|
package/decorators/router.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Router } from 'express';
|
|
2
2
|
import { ExpressiveTeaHandlerOptions } from '../libs/interfaces';
|
|
3
|
-
import { ExpressMiddlewareHandler, MethodDecorator } from '../libs/types';
|
|
3
|
+
import { ClassDecorator, ExpressMiddlewareHandler, MethodDecorator } from '../libs/types';
|
|
4
4
|
/**
|
|
5
5
|
* @module Decorators/Router
|
|
6
6
|
*/
|
|
@@ -17,8 +17,9 @@ import { ExpressMiddlewareHandler, MethodDecorator } from '../libs/types';
|
|
|
17
17
|
* {REPLACE-AT}Route('/)
|
|
18
18
|
* class Example {}
|
|
19
19
|
*/
|
|
20
|
-
export declare function Route(mountpoint?: string): <T extends new (...args: any[]) =>
|
|
20
|
+
export declare function Route(mountpoint?: string): <T extends new (...args: any[]) => any>(RouterClass: T) => {
|
|
21
21
|
new (...args: any[]): {
|
|
22
|
+
[x: string]: any;
|
|
22
23
|
readonly router: Router;
|
|
23
24
|
readonly mountpoint: string;
|
|
24
25
|
__mount(parent: Router): any;
|
package/decorators/router.js
CHANGED
|
@@ -24,8 +24,8 @@ const constants_1 = require("../libs/constants");
|
|
|
24
24
|
* class Example {}
|
|
25
25
|
*/
|
|
26
26
|
function Route(mountpoint = '/') {
|
|
27
|
-
return (
|
|
28
|
-
return class ExpressiveTeaRoute extends
|
|
27
|
+
return (RouterClass) => {
|
|
28
|
+
return class ExpressiveTeaRoute extends RouterClass {
|
|
29
29
|
constructor(...args) {
|
|
30
30
|
super(...args);
|
|
31
31
|
const handlers = MetaData_1.default.get(constants_1.ROUTER_HANDLERS_KEY, this) || [];
|
package/decorators/server.d.ts
CHANGED
|
@@ -78,6 +78,7 @@ export declare function Setting(settingName: string): (target: any, propertyName
|
|
|
78
78
|
* @param Modules
|
|
79
79
|
*/
|
|
80
80
|
export declare function Modules(Modules: any[]): (target: any) => void;
|
|
81
|
+
export declare function Proxies(proxyContainers: any[]): (target: any) => void;
|
|
81
82
|
/**
|
|
82
83
|
* Register Module Method Decorator this Method Decorator is used at bootstrap level and should decorate the start
|
|
83
84
|
* method with a Module Class.
|
package/decorators/server.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Teacup = exports.Teapot = exports.RegisterModule = exports.Modules = exports.Setting = exports.ExpressDirective = exports.Static = exports.ServerSettings = exports.Pour = exports.Plug = void 0;
|
|
3
|
+
exports.Teacup = exports.Teapot = exports.RegisterModule = exports.Proxies = exports.Modules = exports.Setting = exports.ExpressDirective = exports.Static = exports.ServerSettings = exports.Pour = exports.Plug = void 0;
|
|
4
4
|
const lodash_1 = require("lodash");
|
|
5
5
|
const MetaData_1 = require("../classes/MetaData");
|
|
6
6
|
const Settings_1 = require("../classes/Settings");
|
|
@@ -204,6 +204,16 @@ function Modules(Modules) {
|
|
|
204
204
|
};
|
|
205
205
|
}
|
|
206
206
|
exports.Modules = Modules;
|
|
207
|
+
function Proxies(proxyContainers) {
|
|
208
|
+
return target => {
|
|
209
|
+
for (const proxyContainer of proxyContainers) {
|
|
210
|
+
const registeredProxyContainers = MetaData_1.default.get(constants_1.ROUTER_PROXIES_KEY, target) || [];
|
|
211
|
+
registeredProxyContainers.unshift(proxyContainer);
|
|
212
|
+
MetaData_1.default.set(constants_1.ROUTER_PROXIES_KEY, registeredProxyContainers, target);
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
exports.Proxies = Proxies;
|
|
207
217
|
/**
|
|
208
218
|
* Register Module Method Decorator this Method Decorator is used at bootstrap level and should decorate the start
|
|
209
219
|
* method with a Module Class.
|
package/engines/http/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
2
3
|
import * as http from 'http';
|
|
3
4
|
import * as https from 'https';
|
|
4
5
|
import { BOOT_STAGES } from '../../libs/constants';
|
|
@@ -12,4 +13,5 @@ export default class HTTPEngine {
|
|
|
12
13
|
start(): Promise<(http.Server | https.Server)[]>;
|
|
13
14
|
init(): Promise<void>;
|
|
14
15
|
resolveStages(stages: BOOT_STAGES[], ...extraArgs: any[]): Promise<void[]>;
|
|
16
|
+
resolveProxyContainers(): Promise<void>;
|
|
15
17
|
}
|
package/engines/http/index.js
CHANGED
|
@@ -4,6 +4,9 @@ const tslib_1 = require("tslib");
|
|
|
4
4
|
const $P = require("bluebird");
|
|
5
5
|
const inversify_1 = require("inversify");
|
|
6
6
|
const boot_helper_1 = require("../../helpers/boot-helper");
|
|
7
|
+
const constants_1 = require("../../libs/constants");
|
|
8
|
+
const object_helper_1 = require("../../helpers/object-helper");
|
|
9
|
+
const MetaData_1 = require("../../classes/MetaData");
|
|
7
10
|
let HTTPEngine = class HTTPEngine {
|
|
8
11
|
constructor(ctx, server, serverSecure, settings) {
|
|
9
12
|
this.context = ctx;
|
|
@@ -38,13 +41,20 @@ let HTTPEngine = class HTTPEngine {
|
|
|
38
41
|
return (0, boot_helper_1.resolveStage)(s, this.context, this.context.getApplication(), ...extraArgs);
|
|
39
42
|
});
|
|
40
43
|
}
|
|
44
|
+
async resolveProxyContainers() {
|
|
45
|
+
const ProxyContainers = MetaData_1.default.get(constants_1.ROUTER_PROXIES_KEY, (0, object_helper_1.getClass)(this.context)) || [];
|
|
46
|
+
for (const Container of ProxyContainers) {
|
|
47
|
+
(0, boot_helper_1.resolveProxy)(Container, this.context.getApplication());
|
|
48
|
+
}
|
|
49
|
+
}
|
|
41
50
|
};
|
|
42
|
-
HTTPEngine =
|
|
51
|
+
HTTPEngine = tslib_1.__decorate([
|
|
43
52
|
(0, inversify_1.injectable)(),
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
(0,
|
|
53
|
+
tslib_1.__param(0, (0, inversify_1.inject)('context')),
|
|
54
|
+
tslib_1.__param(1, (0, inversify_1.inject)('server')),
|
|
55
|
+
tslib_1.__param(2, (0, inversify_1.inject)('secureServer')),
|
|
56
|
+
tslib_1.__param(2, (0, inversify_1.optional)()),
|
|
57
|
+
tslib_1.__param(3, (0, inversify_1.inject)('settings')),
|
|
58
|
+
tslib_1.__metadata("design:paramtypes", [Object, Object, Object, Object])
|
|
49
59
|
], HTTPEngine);
|
|
50
60
|
exports.default = HTTPEngine;
|
package/engines/teacup/index.js
CHANGED
|
@@ -95,12 +95,13 @@ All Communication are encrypted to ensure intruder can not connected, however, p
|
|
|
95
95
|
this.client.connect();
|
|
96
96
|
}
|
|
97
97
|
};
|
|
98
|
-
TeacupEngine =
|
|
98
|
+
TeacupEngine = tslib_1.__decorate([
|
|
99
99
|
(0, inversify_1.injectable)(),
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
(0,
|
|
100
|
+
tslib_1.__param(0, (0, inversify_1.inject)('context')),
|
|
101
|
+
tslib_1.__param(1, (0, inversify_1.inject)('settings')),
|
|
102
|
+
tslib_1.__param(2, (0, inversify_1.inject)('server')),
|
|
103
|
+
tslib_1.__param(3, (0, inversify_1.inject)('secureServer')),
|
|
104
|
+
tslib_1.__param(3, (0, inversify_1.optional)()),
|
|
105
|
+
tslib_1.__metadata("design:paramtypes", [Object, Object, Object, Object])
|
|
105
106
|
], TeacupEngine);
|
|
106
107
|
exports.default = TeacupEngine;
|
package/engines/teapot/index.js
CHANGED
|
@@ -145,12 +145,13 @@ All Communication are encrypted to ensure intruder can not connected, however, p
|
|
|
145
145
|
this.socketServer.listen(this.server);
|
|
146
146
|
}
|
|
147
147
|
};
|
|
148
|
-
TeapotEngine = TeapotEngine_1 =
|
|
148
|
+
TeapotEngine = TeapotEngine_1 = tslib_1.__decorate([
|
|
149
149
|
(0, inversify_1.injectable)(),
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
(0,
|
|
150
|
+
tslib_1.__param(0, (0, inversify_1.inject)('context')),
|
|
151
|
+
tslib_1.__param(1, (0, inversify_1.inject)('server')),
|
|
152
|
+
tslib_1.__param(2, (0, inversify_1.inject)('secureServer')),
|
|
153
|
+
tslib_1.__param(2, (0, inversify_1.optional)()),
|
|
154
|
+
tslib_1.__param(3, (0, inversify_1.inject)('settings')),
|
|
155
|
+
tslib_1.__metadata("design:paramtypes", [Object, Object, Object, Object])
|
|
155
156
|
], TeapotEngine);
|
|
156
157
|
exports.default = TeapotEngine;
|
|
@@ -26,11 +26,12 @@ let WebsocketEngine = class WebsocketEngine {
|
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
};
|
|
29
|
-
WebsocketEngine =
|
|
29
|
+
WebsocketEngine = tslib_1.__decorate([
|
|
30
30
|
(0, inversify_1.injectable)(),
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
(0,
|
|
31
|
+
tslib_1.__param(0, (0, inversify_1.inject)('server')),
|
|
32
|
+
tslib_1.__param(1, (0, inversify_1.inject)('secureServer')),
|
|
33
|
+
tslib_1.__param(1, (0, inversify_1.optional)()),
|
|
34
|
+
tslib_1.__param(2, (0, inversify_1.inject)('settings')),
|
|
35
|
+
tslib_1.__metadata("design:paramtypes", [Object, Object, Object])
|
|
35
36
|
], WebsocketEngine);
|
|
36
37
|
exports.default = WebsocketEngine;
|
package/helpers/boot-helper.d.ts
CHANGED
|
@@ -4,3 +4,4 @@ import Boot from '../classes/Boot';
|
|
|
4
4
|
export declare function resolveStage(stage: BOOT_STAGES, ctx: Boot, server: Express, ...extraArgs: unknown[]): Promise<void>;
|
|
5
5
|
export declare function resolveDirectives(instance: typeof Boot | Boot, server: Express): Promise<void>;
|
|
6
6
|
export declare function resolveStatic(instance: typeof Boot | Boot, server: Express): Promise<void>;
|
|
7
|
+
export declare function resolveProxy(ProxyContainer: any, server: Express): Promise<void>;
|
package/helpers/boot-helper.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// tslint:disable:no-duplicate-imports
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.resolveStatic = exports.resolveDirectives = exports.resolveStage = void 0;
|
|
4
|
+
exports.resolveProxy = exports.resolveStatic = exports.resolveDirectives = exports.resolveStage = void 0;
|
|
5
5
|
const constants_1 = require("../libs/constants");
|
|
6
6
|
const express = require("express");
|
|
7
7
|
const MetaData_1 = require("../classes/MetaData");
|
|
@@ -40,6 +40,11 @@ async function resolveStatic(instance, server) {
|
|
|
40
40
|
});
|
|
41
41
|
}
|
|
42
42
|
exports.resolveStatic = resolveStatic;
|
|
43
|
+
async function resolveProxy(ProxyContainer, server) {
|
|
44
|
+
const proxyContainer = new ProxyContainer();
|
|
45
|
+
proxyContainer.__register(server);
|
|
46
|
+
}
|
|
47
|
+
exports.resolveProxy = resolveProxy;
|
|
43
48
|
async function resolveModules(instance, server) {
|
|
44
49
|
const registeredModules = MetaData_1.default.get(constants_1.REGISTERED_MODULE_KEY, instance, 'start') || [];
|
|
45
50
|
registeredModules.forEach(Module => {
|
|
@@ -164,3 +164,4 @@ export declare function descriptorOf(target: any, propertyKey: string): Property
|
|
|
164
164
|
*/
|
|
165
165
|
export declare function prototypeOf(target: any): any;
|
|
166
166
|
export declare function getOwnArgumentNames(fn: Function): string[];
|
|
167
|
+
export declare function isAsyncFunction(fn: () => any): boolean;
|
package/helpers/object-helper.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getOwnArgumentNames = exports.prototypeOf = exports.descriptorOf = exports.nameOfSymbol = exports.nameOfClass = exports.nameOf = exports.ancestorsOf = exports.getInheritedClass = exports.isPromise = exports.isEmpty = exports.isClass = exports.isObject = exports.isDate = exports.isCollection = exports.isArrayOrArrayClass = exports.isArray = exports.isBoolean = exports.isNumber = exports.isString = exports.primitiveOf = exports.isPrimitiveOrPrimitiveClass = exports.getClassOrSymbol = exports.classOf = exports.getClass = exports.getConstructor = void 0;
|
|
3
|
+
exports.isAsyncFunction = exports.getOwnArgumentNames = exports.prototypeOf = exports.descriptorOf = exports.nameOfSymbol = exports.nameOfClass = exports.nameOf = exports.ancestorsOf = exports.getInheritedClass = exports.isPromise = exports.isEmpty = exports.isClass = exports.isObject = exports.isDate = exports.isCollection = exports.isArrayOrArrayClass = exports.isArray = exports.isBoolean = exports.isNumber = exports.isString = exports.primitiveOf = exports.isPrimitiveOrPrimitiveClass = exports.getClassOrSymbol = exports.classOf = exports.getClass = exports.getConstructor = void 0;
|
|
4
4
|
/* istanbul ignore file */
|
|
5
5
|
/**
|
|
6
6
|
* Get the provide constructor.
|
|
@@ -286,3 +286,7 @@ function getOwnArgumentNames(fn) {
|
|
|
286
286
|
return fnArguments && fnArguments.length ? fnArguments.split(replaceRegExp) : [];
|
|
287
287
|
}
|
|
288
288
|
exports.getOwnArgumentNames = getOwnArgumentNames;
|
|
289
|
+
function isAsyncFunction(fn) {
|
|
290
|
+
return fn.constructor.name === 'AsyncFunction' || fn.constructor.name.includes('__awaiter');
|
|
291
|
+
}
|
|
292
|
+
exports.isAsyncFunction = isAsyncFunction;
|
package/helpers/server.d.ts
CHANGED
|
@@ -4,6 +4,6 @@ export declare function autoResponse(request: Request, response: Response, annot
|
|
|
4
4
|
export declare function executeRequest(request: Request, response: Response, next: NextFunction): Promise<void>;
|
|
5
5
|
export declare function mapArguments(decoratedArguments: ExpressiveTeaArgumentOptions[], request: Request, response: Response, next: NextFunction, introspectedArgs?: string[]): unknown[];
|
|
6
6
|
export declare function extractParameters(target: unknown, args?: string | string[], propertyName?: string | symbol): any;
|
|
7
|
-
export declare function generateRoute(route: string, verb: string): (target: object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => void;
|
|
8
|
-
export declare function router(verb: string, route: string, target: any, handler: (...args: any[]) => void | any | Promise<any>, propertyKey: string | symbol): void;
|
|
7
|
+
export declare function generateRoute(route: string, verb: string, ...settings: any): (target: object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => void;
|
|
8
|
+
export declare function router(verb: string, route: string, target: any, handler: (...args: any[]) => void | any | Promise<any>, propertyKey: string | symbol, settings?: any): void;
|
|
9
9
|
export declare function fileSettings(): any;
|
package/helpers/server.js
CHANGED
|
@@ -77,13 +77,13 @@ function extractParameters(target, args, propertyName) {
|
|
|
77
77
|
return target;
|
|
78
78
|
}
|
|
79
79
|
exports.extractParameters = extractParameters;
|
|
80
|
-
function generateRoute(route, verb) {
|
|
81
|
-
return (target, propertyKey, descriptor) => router(verb, route, target, descriptor.value, propertyKey);
|
|
80
|
+
function generateRoute(route, verb, ...settings) {
|
|
81
|
+
return (target, propertyKey, descriptor) => router(verb, route, target, descriptor.value, propertyKey, settings);
|
|
82
82
|
}
|
|
83
83
|
exports.generateRoute = generateRoute;
|
|
84
|
-
function router(verb, route, target, handler, propertyKey) {
|
|
84
|
+
function router(verb, route, target, handler, propertyKey, settings) {
|
|
85
85
|
const existedRoutesHandlers = MetaData_1.default.get(constants_1.ROUTER_HANDLERS_KEY, target) || [];
|
|
86
|
-
existedRoutesHandlers.unshift({ verb, route, handler, target, propertyKey });
|
|
86
|
+
existedRoutesHandlers.unshift({ verb, route, handler, target, propertyKey, settings });
|
|
87
87
|
MetaData_1.default.set(constants_1.ROUTER_HANDLERS_KEY, existedRoutesHandlers, target);
|
|
88
88
|
}
|
|
89
89
|
exports.router = router;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const EXPRESSIVE_TEA_PROXY_CLASS = "ExpressiveTeaProxy";
|
package/libs/constants.d.ts
CHANGED
|
@@ -50,6 +50,8 @@ export declare const EXPRESS_DIRECTIVES: string[];
|
|
|
50
50
|
export declare const BOOT_STAGES_KEY = "boot:stage-settings";
|
|
51
51
|
export declare const ROUTER_HANDLERS_KEY = "app:routes:handlers";
|
|
52
52
|
export declare const ROUTER_MIDDLEWARES_KEY = "app:routes:middlewares";
|
|
53
|
+
export declare const ROUTER_PROXIES_KEY = "app:routes:proxies";
|
|
54
|
+
export declare const PROXY_SETTING_KEY = "app:proxy:settings";
|
|
53
55
|
export declare const REGISTERED_MODEL_KEY = "app:models:registered";
|
|
54
56
|
export declare const REGISTERED_MODULE_KEY = "app:modules:registered";
|
|
55
57
|
export declare const PLUGINS_KEY = "boot:app-plugins";
|
|
@@ -67,3 +69,24 @@ export declare const ARGUMENT_TYPES: {
|
|
|
67
69
|
REQUEST: symbol;
|
|
68
70
|
RESPONSE: symbol;
|
|
69
71
|
};
|
|
72
|
+
export declare enum PROXY_METHODS {
|
|
73
|
+
HOST = "host",
|
|
74
|
+
PROXY_REQ_PATH_RESOLVER = "proxyReqPathResolver",
|
|
75
|
+
FILTER = "filter",
|
|
76
|
+
USER_RES_DECORATOR = "userResDecorator",
|
|
77
|
+
USER_RES_HEADER_DECORATOR = "userResHeaderDecorator",
|
|
78
|
+
SKIP_TO_NEXT_HANDLER_FILTER = "skipToNextHandlerFilter",
|
|
79
|
+
PROXY_ERROR_HANDLER = "proxyErrorHandler",
|
|
80
|
+
PROXY_REQ_OPT_DECORATOR = "proxyReqOptDecorator",
|
|
81
|
+
PROXY_REQ_BODY_DECORATOR = "proxyReqBodyDecorator"
|
|
82
|
+
}
|
|
83
|
+
export declare enum PROXY_PROPERTIES {
|
|
84
|
+
LIMIT = "limit",
|
|
85
|
+
MEMOIZE_HOST = "memoizeHost",
|
|
86
|
+
HTTPS = "https",
|
|
87
|
+
PRESERVE_HOST_HDR = "preserveHostHdr",
|
|
88
|
+
PARSE_REQ_BODY = "parseReqBody",
|
|
89
|
+
REQ_AS_BUFFER = "reqAsBuffer",
|
|
90
|
+
REQ_BODY_ENCODING = "reqBodyEncoding",
|
|
91
|
+
TIMEOUT = "timeout"
|
|
92
|
+
}
|
package/libs/constants.js
CHANGED
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
* @summary Available Boot Stages
|
|
22
22
|
*/
|
|
23
23
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
-
exports.ARGUMENT_TYPES = exports.ASSIGN_TEACUP_KEY = exports.ASSIGN_TEAPOT_KEY = exports.ROUTER_ANNOTATIONS_KEY = exports.ARGUMENTS_KEY = exports.REGISTERED_DIRECTIVES_KEY = exports.REGISTERED_STATIC_KEY = exports.PLUGINS_KEY = exports.REGISTERED_MODULE_KEY = exports.REGISTERED_MODEL_KEY = exports.ROUTER_MIDDLEWARES_KEY = exports.ROUTER_HANDLERS_KEY = exports.BOOT_STAGES_KEY = exports.EXPRESS_DIRECTIVES = exports.STAGES_INIT = exports.BOOT_STAGES_LIST = exports.BOOT_ORDER = exports.BOOT_STAGES = void 0;
|
|
24
|
+
exports.PROXY_PROPERTIES = exports.PROXY_METHODS = exports.ARGUMENT_TYPES = exports.ASSIGN_TEACUP_KEY = exports.ASSIGN_TEAPOT_KEY = exports.ROUTER_ANNOTATIONS_KEY = exports.ARGUMENTS_KEY = exports.REGISTERED_DIRECTIVES_KEY = exports.REGISTERED_STATIC_KEY = exports.PLUGINS_KEY = exports.REGISTERED_MODULE_KEY = exports.REGISTERED_MODEL_KEY = exports.PROXY_SETTING_KEY = exports.ROUTER_PROXIES_KEY = exports.ROUTER_MIDDLEWARES_KEY = exports.ROUTER_HANDLERS_KEY = exports.BOOT_STAGES_KEY = exports.EXPRESS_DIRECTIVES = exports.STAGES_INIT = exports.BOOT_STAGES_LIST = exports.BOOT_ORDER = exports.BOOT_STAGES = void 0;
|
|
25
25
|
// tslint:enable:max-line-length
|
|
26
26
|
var BOOT_STAGES;
|
|
27
27
|
(function (BOOT_STAGES) {
|
|
@@ -82,6 +82,8 @@ exports.EXPRESS_DIRECTIVES = [
|
|
|
82
82
|
exports.BOOT_STAGES_KEY = 'boot:stage-settings';
|
|
83
83
|
exports.ROUTER_HANDLERS_KEY = 'app:routes:handlers';
|
|
84
84
|
exports.ROUTER_MIDDLEWARES_KEY = 'app:routes:middlewares';
|
|
85
|
+
exports.ROUTER_PROXIES_KEY = 'app:routes:proxies';
|
|
86
|
+
exports.PROXY_SETTING_KEY = 'app:proxy:settings';
|
|
85
87
|
exports.REGISTERED_MODEL_KEY = 'app:models:registered';
|
|
86
88
|
exports.REGISTERED_MODULE_KEY = 'app:modules:registered';
|
|
87
89
|
exports.PLUGINS_KEY = 'boot:app-plugins';
|
|
@@ -99,3 +101,28 @@ exports.ARGUMENT_TYPES = {
|
|
|
99
101
|
REQUEST: Symbol('REQUEST'),
|
|
100
102
|
RESPONSE: Symbol('RESPONSE')
|
|
101
103
|
};
|
|
104
|
+
var PROXY_METHODS;
|
|
105
|
+
(function (PROXY_METHODS) {
|
|
106
|
+
PROXY_METHODS["HOST"] = "host";
|
|
107
|
+
PROXY_METHODS["PROXY_REQ_PATH_RESOLVER"] = "proxyReqPathResolver";
|
|
108
|
+
PROXY_METHODS["FILTER"] = "filter";
|
|
109
|
+
PROXY_METHODS["USER_RES_DECORATOR"] = "userResDecorator";
|
|
110
|
+
PROXY_METHODS["USER_RES_HEADER_DECORATOR"] = "userResHeaderDecorator";
|
|
111
|
+
PROXY_METHODS["SKIP_TO_NEXT_HANDLER_FILTER"] = "skipToNextHandlerFilter";
|
|
112
|
+
PROXY_METHODS["PROXY_ERROR_HANDLER"] = "proxyErrorHandler";
|
|
113
|
+
PROXY_METHODS["PROXY_REQ_OPT_DECORATOR"] = "proxyReqOptDecorator";
|
|
114
|
+
PROXY_METHODS["PROXY_REQ_BODY_DECORATOR"] = "proxyReqBodyDecorator";
|
|
115
|
+
})(PROXY_METHODS = exports.PROXY_METHODS || (exports.PROXY_METHODS = {}));
|
|
116
|
+
// 'limit' | 'memoizeHost' | 'https' | 'preserveHostHdr' | 'parseReqBody' |
|
|
117
|
+
// 'reqAsBuffer' | 'reqBodyEncoding' | 'timeout';
|
|
118
|
+
var PROXY_PROPERTIES;
|
|
119
|
+
(function (PROXY_PROPERTIES) {
|
|
120
|
+
PROXY_PROPERTIES["LIMIT"] = "limit";
|
|
121
|
+
PROXY_PROPERTIES["MEMOIZE_HOST"] = "memoizeHost";
|
|
122
|
+
PROXY_PROPERTIES["HTTPS"] = "https";
|
|
123
|
+
PROXY_PROPERTIES["PRESERVE_HOST_HDR"] = "preserveHostHdr";
|
|
124
|
+
PROXY_PROPERTIES["PARSE_REQ_BODY"] = "parseReqBody";
|
|
125
|
+
PROXY_PROPERTIES["REQ_AS_BUFFER"] = "reqAsBuffer";
|
|
126
|
+
PROXY_PROPERTIES["REQ_BODY_ENCODING"] = "reqBodyEncoding";
|
|
127
|
+
PROXY_PROPERTIES["TIMEOUT"] = "timeout";
|
|
128
|
+
})(PROXY_PROPERTIES = exports.PROXY_PROPERTIES || (exports.PROXY_PROPERTIES = {}));
|
package/libs/interfaces.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
-
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
import { Express, RequestHandler, Router } from 'express';
|
|
3
4
|
import * as http from 'http';
|
|
4
5
|
import * as https from 'https';
|
|
5
6
|
import { ExpressiveTeaMiddleware, ExpressMiddlewareHandler } from './types';
|
|
@@ -76,6 +77,17 @@ export interface IExpressiveTeaModule {
|
|
|
76
77
|
readonly controllers: any[];
|
|
77
78
|
__register(server: Express): void;
|
|
78
79
|
}
|
|
80
|
+
export interface IExpressiveTeaProxySettings {
|
|
81
|
+
name: string;
|
|
82
|
+
source: string;
|
|
83
|
+
targetUrl: string;
|
|
84
|
+
}
|
|
85
|
+
export interface IExpressiveTeaProxy {
|
|
86
|
+
readonly source: string;
|
|
87
|
+
readonly target: string;
|
|
88
|
+
readonly proxyHandler: RequestHandler;
|
|
89
|
+
__register(server: Express): void;
|
|
90
|
+
}
|
|
79
91
|
export interface IExpressiveTeaRoute {
|
|
80
92
|
readonly router: Router;
|
|
81
93
|
readonly mountpoint: string;
|
|
@@ -111,6 +123,7 @@ export interface ExpressiveTeaHandlerOptions {
|
|
|
111
123
|
handler: ExpressiveTeaMiddleware & ExpressiveTeaMiddlewareExtends;
|
|
112
124
|
target: unknown;
|
|
113
125
|
propertyKey: string | symbol;
|
|
126
|
+
settings?: any;
|
|
114
127
|
}
|
|
115
128
|
export interface ExpressiveTeaArgumentOptions {
|
|
116
129
|
key: string | symbol;
|
package/libs/types.d.ts
CHANGED
|
@@ -10,3 +10,5 @@ export declare type ClassDecorator = <TFunction extends Function>(target: TFunct
|
|
|
10
10
|
export declare type PropertyDecorator = (target: Object, propertyKey: string | symbol) => void;
|
|
11
11
|
export declare type MethodDecorator = (target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => PropertyDescriptor | void;
|
|
12
12
|
export declare type ParameterDecorator = (target: Object, propertyKey: string | symbol, parameterIndex: number) => void;
|
|
13
|
+
export declare type ExpressiveTeaProxyOptions = 'proxyReqPathResolver' | 'host' | 'filter' | 'userResDecorator' | 'userResHeaderDecorator' | 'skipToNextHandlerFilter' | 'proxyErrorHandler' | 'proxyReqOptDecorator' | 'proxyReqBodyDecorator';
|
|
14
|
+
export declare type ExpressiveTeaProxyProperty = 'limit' | 'memoizeHost' | 'https' | 'preserveHostHdr' | 'parseReqBody' | 'reqAsBuffer' | 'reqBodyEncoding' | 'timeout';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zerooneit/expressive-tea",
|
|
3
|
-
"version": "1.3.0-beta.
|
|
3
|
+
"version": "1.3.0-beta.2",
|
|
4
4
|
"description": "A REST API over Express and Typescript",
|
|
5
5
|
"main": "classes/Boot.js",
|
|
6
6
|
"engines": {
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"linter": "tslint -c tslint.json -p tsconfig.json",
|
|
13
13
|
"build:dev": "tsc --project tsconfig.json --watch",
|
|
14
14
|
"build": "tsc --project tsconfig.json",
|
|
15
|
-
"clean:build": "
|
|
15
|
+
"clean:build": "trash '**/*.js' '**/*.d.ts' '**/*.js.map' '**/*.d.ts.map' '!node_modules/**/*' '!docs/**/*' '!coverage/**/*' '!gulpfile.js' '!tasks/*.js' '!jest.config.js' '!tools/**/*'",
|
|
16
16
|
"publish:prepare": "npm run clean:build && npm run build",
|
|
17
17
|
"postpublish": "npm run clean:build",
|
|
18
18
|
"prepublishOnly": "npm test && npm run publish:prepare"
|
|
@@ -29,42 +29,40 @@
|
|
|
29
29
|
"@types/bluebird": "3.5.36",
|
|
30
30
|
"@types/express": "4.17.13",
|
|
31
31
|
"@types/express-http-proxy": "1.6.3",
|
|
32
|
-
"@types/express-serve-static-core": "4.17.
|
|
33
|
-
"@types/jest": "27.
|
|
34
|
-
"@types/lodash": "4.14.
|
|
35
|
-
"@types/node": "
|
|
32
|
+
"@types/express-serve-static-core": "4.17.28",
|
|
33
|
+
"@types/jest": "27.5.1",
|
|
34
|
+
"@types/lodash": "4.14.182",
|
|
35
|
+
"@types/node": "17.0.36",
|
|
36
36
|
"@types/reflect-metadata": "0.1.0",
|
|
37
37
|
"@types/socket.io": "3.0.2",
|
|
38
38
|
"@types/socket.io-client": "3.0.0",
|
|
39
|
-
"@types/ws": "8.
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
"http-terminator": "3.0.3",
|
|
44
|
-
"jest": "27.3.1",
|
|
39
|
+
"@types/ws": "8.5.3",
|
|
40
|
+
"trash-cli":"5.0.0",
|
|
41
|
+
"http-terminator": "3.2.0",
|
|
42
|
+
"jest": "28.1.0",
|
|
45
43
|
"jest-express": "1.12.0",
|
|
46
|
-
"jest-junit": "13.
|
|
44
|
+
"jest-junit": "13.2.0",
|
|
47
45
|
"reflect-metadata": "0.1.13",
|
|
48
46
|
"rimraf": "3.0.2",
|
|
49
|
-
"supertest": "6.
|
|
47
|
+
"supertest": "6.2.3",
|
|
50
48
|
"toast-jsdoc": "1.0.2",
|
|
51
|
-
"ts-jest": "
|
|
52
|
-
"ts-node": "10.
|
|
49
|
+
"ts-jest": "28.0.3",
|
|
50
|
+
"ts-node": "10.8.0",
|
|
53
51
|
"tslint": "6.1.3",
|
|
54
|
-
"typescript": "4.
|
|
52
|
+
"typescript": "4.7.2"
|
|
55
53
|
},
|
|
56
54
|
"dependencies": {
|
|
57
55
|
"bluebird": "3.7.2",
|
|
58
|
-
"eiows": "
|
|
59
|
-
"express": "4.
|
|
56
|
+
"eiows": "4.1.2",
|
|
57
|
+
"express": "4.18.1",
|
|
60
58
|
"express-http-proxy": "1.6.3",
|
|
61
|
-
"inversify": "
|
|
59
|
+
"inversify": "6.0.1",
|
|
62
60
|
"inversify-inject-decorators": "3.1.0",
|
|
63
61
|
"lodash": "4.17.21",
|
|
64
|
-
"socket.io": "4.
|
|
65
|
-
"socket.io-client": "4.
|
|
62
|
+
"socket.io": "4.5.1",
|
|
63
|
+
"socket.io-client": "4.5.1",
|
|
66
64
|
"url-scheme": "1.0.5",
|
|
67
|
-
"ws": "8.
|
|
65
|
+
"ws": "8.7.0"
|
|
68
66
|
},
|
|
69
67
|
"repository": {
|
|
70
68
|
"type": "git",
|
|
@@ -107,11 +105,11 @@
|
|
|
107
105
|
},
|
|
108
106
|
"homepage": "https://github.com/Expressive-Tea/expresive-tea#readme",
|
|
109
107
|
"optionalDependencies": {
|
|
110
|
-
"bufferutil": "
|
|
111
|
-
"utf-8-validate": "^5.0.
|
|
108
|
+
"bufferutil": "4.0.6",
|
|
109
|
+
"utf-8-validate": "^5.0.9"
|
|
112
110
|
},
|
|
113
111
|
"resolutions": {
|
|
114
112
|
"set-value": "4.1.0",
|
|
115
|
-
"glob-parent": "
|
|
113
|
+
"glob-parent": "6.0.2"
|
|
116
114
|
}
|
|
117
115
|
}
|