@zenofolio/hyper-decor 1.0.4 → 1.0.8
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/.agent/rules/philosophy.md +103 -0
- package/.agent/rules/writing.md +32 -0
- package/README.md +107 -142
- package/dist/__internals/constants.d.ts +1 -58
- package/dist/__internals/constants.js +3 -65
- package/dist/__internals/helpers/lifecycle.helper.d.ts +3 -0
- package/dist/__internals/helpers/lifecycle.helper.js +25 -0
- package/dist/__internals/helpers/merge-metadata.d.ts +2 -3
- package/dist/__internals/helpers/merge-metadata.js +43 -23
- package/dist/__internals/helpers/prepare.helper.d.ts +5 -0
- package/dist/__internals/helpers/prepare.helper.js +392 -0
- package/dist/__internals/stores/hyper.store.d.ts +5 -0
- package/dist/__internals/stores/hyper.store.js +5 -0
- package/dist/__internals/stores/index.d.ts +4 -15
- package/dist/__internals/stores/index.js +18 -35
- package/dist/__internals/stores/meta.store.d.ts +34 -0
- package/dist/__internals/stores/meta.store.js +107 -0
- package/dist/__internals/stores/scope.store.d.ts +14 -0
- package/dist/__internals/stores/scope.store.js +29 -0
- package/dist/__internals/stores/serivces.store.d.ts +1 -0
- package/dist/__internals/stores/{store.interface.js → serivces.store.js} +2 -0
- package/dist/__internals/transform/middleware.transform.d.ts +3 -0
- package/dist/__internals/transform/middleware.transform.js +19 -0
- package/dist/__internals/transform/role.transform.d.ts +1 -1
- package/dist/__internals/transform/role.transform.js +10 -7
- package/dist/__internals/transform/scope.transfrom.d.ts +5 -7
- package/dist/__internals/transform/scope.transfrom.js +53 -39
- package/dist/__internals/transform/transform.registry.d.ts +33 -0
- package/dist/__internals/transform/transform.registry.js +59 -0
- package/dist/__internals/types.d.ts +53 -4
- package/dist/__internals/utils/function.util.d.ts +1 -4
- package/dist/__internals/utils/function.util.js +22 -10
- package/dist/common/bootstrap.d.ts +6 -2
- package/dist/common/bootstrap.js +51 -8
- package/dist/common/helpers/index.d.ts +1 -0
- package/dist/common/helpers/index.js +1 -0
- package/dist/common/helpers/scopes.d.ts +3 -3
- package/dist/common/helpers/scopes.js +7 -8
- package/dist/common/helpers/state.d.ts +17 -0
- package/dist/common/helpers/state.js +44 -0
- package/dist/common/message-bus.d.ts +11 -0
- package/dist/common/message-bus.js +51 -0
- package/dist/common/testing.d.ts +56 -0
- package/dist/common/testing.js +193 -0
- package/dist/common/transport.d.ts +10 -0
- package/dist/common/transport.js +59 -0
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +2 -1
- package/dist/decorators.d.ts +1 -0
- package/dist/{common/openapi/index.js → decorators.js} +1 -2
- package/dist/extension.js +11 -2
- package/dist/index.d.ts +11 -3
- package/dist/index.js +11 -3
- package/dist/lib/event/meta.store.d.ts +4 -0
- package/dist/lib/event/meta.store.js +5 -0
- package/dist/lib/openapi/collectors/class.collector.d.ts +5 -0
- package/dist/lib/openapi/collectors/class.collector.js +10 -0
- package/dist/lib/openapi/collectors/index.d.ts +3 -0
- package/dist/lib/openapi/collectors/index.js +19 -0
- package/dist/lib/openapi/collectors/method.collector.d.ts +7 -0
- package/dist/lib/openapi/collectors/method.collector.js +101 -0
- package/dist/lib/openapi/collectors/schema.collector.d.ts +6 -0
- package/dist/lib/openapi/collectors/schema.collector.js +29 -0
- package/dist/lib/openapi/constants.d.ts +47 -0
- package/dist/lib/openapi/constants.js +61 -0
- package/dist/lib/openapi/decorators.d.ts +16 -0
- package/dist/lib/openapi/decorators.js +93 -0
- package/dist/lib/openapi/index.d.ts +30 -0
- package/dist/lib/openapi/index.js +136 -0
- package/dist/lib/openapi/metadata.d.ts +7 -0
- package/dist/lib/openapi/metadata.js +8 -0
- package/dist/lib/openapi/metadata.registry.d.ts +29 -0
- package/dist/lib/openapi/metadata.registry.js +41 -0
- package/dist/lib/openapi/types.d.ts +131 -0
- package/dist/lib/server/decorators/File.d.ts +37 -0
- package/dist/{decorators → lib/server/decorators}/File.js +62 -75
- package/dist/lib/server/decorators/Http.d.ts +12 -0
- package/dist/lib/server/decorators/Http.js +56 -0
- package/dist/lib/server/decorators/HyperApp.d.ts +7 -0
- package/dist/lib/server/decorators/HyperApp.js +14 -0
- package/dist/lib/server/decorators/HyperController.d.ts +6 -0
- package/dist/lib/server/decorators/HyperController.js +15 -0
- package/dist/lib/server/decorators/HyperModule.d.ts +6 -0
- package/dist/lib/server/decorators/HyperModule.js +13 -0
- package/dist/lib/server/decorators/HyperService.d.ts +12 -0
- package/dist/lib/server/decorators/HyperService.js +30 -0
- package/dist/lib/server/decorators/Messaging.d.ts +8 -0
- package/dist/lib/server/decorators/Messaging.js +19 -0
- package/dist/lib/server/decorators/Middleware.d.ts +18 -0
- package/dist/lib/server/decorators/Middleware.js +52 -0
- package/dist/lib/server/decorators/Output.d.ts +6 -0
- package/dist/lib/server/decorators/Output.js +14 -0
- package/dist/lib/server/decorators/Pass.d.ts +10 -0
- package/dist/lib/server/decorators/Pass.js +13 -0
- package/dist/lib/server/decorators/Role.d.ts +7 -0
- package/dist/lib/server/decorators/Role.js +14 -0
- package/dist/lib/server/decorators/Routes.d.ts +14 -0
- package/dist/lib/server/decorators/Routes.js +39 -0
- package/dist/lib/server/decorators/Scope.d.ts +7 -0
- package/dist/lib/server/decorators/Scope.js +14 -0
- package/dist/{decorators → lib/server/decorators}/index.d.ts +9 -4
- package/dist/{decorators → lib/server/decorators}/index.js +9 -4
- package/dist/lib/server/decorators/metadata.d.ts +1 -0
- package/dist/lib/server/decorators/metadata.js +5 -0
- package/dist/lib/server/decorators/types.d.ts +125 -0
- package/dist/lib/server/decorators/types.js +6 -0
- package/dist/{exeptions → lib/server/exeptions}/HyperException.d.ts +2 -1
- package/dist/{exeptions → lib/server/exeptions}/HyperException.js +2 -1
- package/dist/{exeptions → lib/server/exeptions}/HyperFileException.js +1 -1
- package/dist/{exeptions → lib/server/exeptions}/NotRoleException.js +1 -1
- package/dist/{exeptions → lib/server/exeptions}/NotScopeException.js +1 -1
- package/dist/lib/tree/tree.d.ts +36 -0
- package/dist/lib/tree/tree.js +106 -0
- package/dist/type.d.ts +13 -2
- package/hyper-express-decorators.d.ts +1 -0
- package/package.json +81 -60
- package/scripts/clean.js +56 -0
- package/scripts/test-server.ts +85 -0
- package/tsconfig.json +18 -13
- package/vitest.config.mjs +30 -0
- package/.mocharc.js +0 -5
- package/dist/__internals/creators/request.creator.d.ts +0 -12
- package/dist/__internals/creators/request.creator.js +0 -53
- package/dist/__internals/creators/routes.creator.d.ts +0 -10
- package/dist/__internals/creators/routes.creator.js +0 -37
- package/dist/__internals/decorator-base.d.ts +0 -30
- package/dist/__internals/decorator-base.js +0 -86
- package/dist/__internals/store.d.ts +0 -10
- package/dist/__internals/store.js +0 -17
- package/dist/__internals/stores/middleware.store.d.ts +0 -7
- package/dist/__internals/stores/middleware.store.js +0 -19
- package/dist/__internals/stores/params.store.d.ts +0 -21
- package/dist/__internals/stores/params.store.js +0 -65
- package/dist/__internals/stores/routes.store.d.ts +0 -17
- package/dist/__internals/stores/routes.store.js +0 -43
- package/dist/__internals/stores/store.interface.d.ts +0 -8
- package/dist/__internals/transform/method.transform.d.ts +0 -2
- package/dist/__internals/transform/method.transform.js +0 -20
- package/dist/__internals/transform/pass.transfrom.d.ts +0 -1
- package/dist/__internals/transform/pass.transfrom.js +0 -2
- package/dist/__internals/utils/mixin.utils.d.ts +0 -11
- package/dist/__internals/utils/mixin.utils.js +0 -34
- package/dist/__internals/utils/router.d.ts +0 -1
- package/dist/__internals/utils/router.js +0 -2
- package/dist/common/openapi/collect-class-data.d.ts +0 -21
- package/dist/common/openapi/collect-class-data.js +0 -45
- package/dist/common/openapi/collect-function-data.d.ts +0 -32
- package/dist/common/openapi/collect-function-data.js +0 -70
- package/dist/common/openapi/index.d.ts +0 -2
- package/dist/decorators/File.d.ts +0 -65
- package/dist/decorators/Http.d.ts +0 -55
- package/dist/decorators/Http.js +0 -93
- package/dist/decorators/HyperApp.d.ts +0 -7
- package/dist/decorators/HyperApp.js +0 -262
- package/dist/decorators/HyperController.d.ts +0 -2
- package/dist/decorators/HyperController.js +0 -19
- package/dist/decorators/HyperModule.d.ts +0 -5
- package/dist/decorators/HyperModule.js +0 -14
- package/dist/decorators/Middleware.d.ts +0 -24
- package/dist/decorators/Middleware.js +0 -51
- package/dist/decorators/Pass.d.ts +0 -12
- package/dist/decorators/Pass.js +0 -29
- package/dist/decorators/Role.d.ts +0 -6
- package/dist/decorators/Role.js +0 -34
- package/dist/decorators/Routes.d.ts +0 -14
- package/dist/decorators/Routes.js +0 -21
- package/dist/decorators/Scope.d.ts +0 -6
- package/dist/decorators/Scope.js +0 -25
- package/dist/decorators/types.d.ts +0 -89
- /package/dist/{decorators → lib/openapi}/types.js +0 -0
- /package/dist/{exeptions → lib/server/exeptions}/DuplicateControllerPathException.d.ts +0 -0
- /package/dist/{exeptions → lib/server/exeptions}/DuplicateControllerPathException.js +0 -0
- /package/dist/{exeptions → lib/server/exeptions}/DuplicatedException.d.ts +0 -0
- /package/dist/{exeptions → lib/server/exeptions}/DuplicatedException.js +0 -0
- /package/dist/{exeptions → lib/server/exeptions}/DuplicatedHandlerException.d.ts +0 -0
- /package/dist/{exeptions → lib/server/exeptions}/DuplicatedHandlerException.js +0 -0
- /package/dist/{exeptions → lib/server/exeptions}/HyperFileException.d.ts +0 -0
- /package/dist/{exeptions → lib/server/exeptions}/MethodNotFountException.d.ts +0 -0
- /package/dist/{exeptions → lib/server/exeptions}/MethodNotFountException.js +0 -0
- /package/dist/{exeptions → lib/server/exeptions}/NotPropertyException.d.ts +0 -0
- /package/dist/{exeptions → lib/server/exeptions}/NotPropertyException.js +0 -0
- /package/dist/{exeptions → lib/server/exeptions}/NotRoleException.d.ts +0 -0
- /package/dist/{exeptions → lib/server/exeptions}/NotScopeException.d.ts +0 -0
- /package/dist/{exeptions → lib/server/exeptions}/WrongPlaceException.d.ts +0 -0
- /package/dist/{exeptions → lib/server/exeptions}/WrongPlaceException.js +0 -0
- /package/dist/{exeptions → lib/server/exeptions}/index.d.ts +0 -0
- /package/dist/{exeptions → lib/server/exeptions}/index.js +0 -0
- /package/dist/{exeptions → lib/server/exeptions}/types.d.ts +0 -0
- /package/dist/{exeptions → lib/server/exeptions}/types.js +0 -0
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.mergeMetadata = mergeMetadata;
|
|
4
|
-
require("
|
|
4
|
+
const meta_store_1 = require("../stores/meta.store");
|
|
5
|
+
/**
|
|
6
|
+
* Perform a clean merge of prefixes
|
|
7
|
+
*/
|
|
8
|
+
const HyperMeta = meta_store_1.Metadata.prefix('server');
|
|
5
9
|
/**
|
|
6
10
|
* Performs a deep merge of metadata from source to target using reflect-metadata.
|
|
7
11
|
* @param target Object where the metadata will be merged.
|
|
@@ -10,35 +14,51 @@ require("reflect-metadata");
|
|
|
10
14
|
* @param options Merge options (e.g., array handling).
|
|
11
15
|
*/
|
|
12
16
|
function mergeMetadata(target, source, keys, options = {}) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
+
const sourceRoot = meta_store_1.Metadata.get(source);
|
|
18
|
+
const targetRoot = meta_store_1.Metadata.get(target);
|
|
19
|
+
const sourceServer = sourceRoot.server;
|
|
20
|
+
if (!sourceServer)
|
|
21
|
+
return;
|
|
22
|
+
const sourceCommon = sourceServer.common;
|
|
23
|
+
const targetServer = targetRoot.server || (targetRoot.server = { common: { type: 'controller' }, methods: {} });
|
|
24
|
+
const targetCommon = targetServer.common;
|
|
25
|
+
for (let i = 0; i < keys.length; i++) {
|
|
26
|
+
const key = keys[i];
|
|
27
|
+
const value = sourceCommon[key]; // Narrowing complex union access
|
|
28
|
+
if (value === undefined)
|
|
17
29
|
continue;
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
30
|
+
const current = targetCommon[key];
|
|
31
|
+
const merged = current === undefined
|
|
32
|
+
? value
|
|
33
|
+
: deepMerge(current, value, options);
|
|
34
|
+
targetCommon[key] = merged;
|
|
35
|
+
}
|
|
36
|
+
// Also merge methods if they exist to preserve routes/params when extending
|
|
37
|
+
if (sourceServer.methods) {
|
|
38
|
+
const sourceMethods = sourceServer.methods;
|
|
39
|
+
const targetMethods = targetServer.methods || (targetServer.methods = {});
|
|
40
|
+
Object.keys(sourceMethods).forEach(methodKey => {
|
|
41
|
+
targetMethods[methodKey] = deepMerge(targetMethods[methodKey] || {}, sourceMethods[methodKey], options);
|
|
42
|
+
});
|
|
23
43
|
}
|
|
24
44
|
}
|
|
25
|
-
/**
|
|
26
|
-
* Performs a deep merge of two objects.
|
|
27
|
-
* @param target Target object.
|
|
28
|
-
* @param source Source object.
|
|
29
|
-
* @param options Merge options.
|
|
30
|
-
* @returns Merged object.
|
|
31
|
-
*/
|
|
32
45
|
function deepMerge(target, source, options) {
|
|
33
46
|
if (Array.isArray(target) && Array.isArray(source)) {
|
|
34
|
-
|
|
47
|
+
if (options.overwriteArrays)
|
|
48
|
+
return source;
|
|
49
|
+
// Faster deduplication for primitive arrays
|
|
50
|
+
const combined = target.concat(source);
|
|
51
|
+
return Array.from(new Set(combined));
|
|
35
52
|
}
|
|
36
|
-
if (typeof
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
53
|
+
if (source && typeof source === "object" && target && typeof target === "object") {
|
|
54
|
+
const result = Object.assign({}, target);
|
|
55
|
+
const sourceObj = source;
|
|
56
|
+
const sourceKeys = Object.keys(sourceObj);
|
|
57
|
+
for (let i = 0; i < sourceKeys.length; i++) {
|
|
58
|
+
const k = sourceKeys[i];
|
|
59
|
+
result[k] = deepMerge(result[k], sourceObj[k], options);
|
|
40
60
|
}
|
|
41
|
-
return
|
|
61
|
+
return result;
|
|
42
62
|
}
|
|
43
63
|
return source;
|
|
44
64
|
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
import { Server } from "hyper-express";
|
|
3
|
+
import { Constructor, HyperAppMetadata, LogSpaces } from "../../lib/server/decorators/types";
|
|
4
|
+
export declare function registerInstanceHandlers(instance: object, target: Constructor, namespace: string, log: (space: keyof LogSpaces, message: string) => void): Promise<void>;
|
|
5
|
+
export declare function prepareApplication(options: HyperAppMetadata, Target: Constructor, log: (space: keyof LogSpaces, message: string) => void): Promise<Server>;
|
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.registerInstanceHandlers = registerInstanceHandlers;
|
|
16
|
+
exports.prepareApplication = prepareApplication;
|
|
17
|
+
require("reflect-metadata");
|
|
18
|
+
const hyper_express_1 = require("hyper-express");
|
|
19
|
+
const tsyringe_1 = require("tsyringe");
|
|
20
|
+
const stores_1 = require("../stores");
|
|
21
|
+
const meta_store_1 = require("../stores/meta.store");
|
|
22
|
+
const role_transform_1 = __importDefault(require("../transform/role.transform"));
|
|
23
|
+
const scope_transfrom_1 = __importDefault(require("../transform/scope.transfrom"));
|
|
24
|
+
const middleware_transform_1 = __importDefault(require("../transform/middleware.transform"));
|
|
25
|
+
const path_util_1 = require("../utils/path.util");
|
|
26
|
+
const transform_registry_1 = require("../transform/transform.registry");
|
|
27
|
+
const message_bus_1 = require("../../common/message-bus");
|
|
28
|
+
const transport_1 = require("../../common/transport");
|
|
29
|
+
/* -------------------------------------------------------------------------- */
|
|
30
|
+
/* Helpers */
|
|
31
|
+
/* -------------------------------------------------------------------------- */
|
|
32
|
+
function createRouter(target) {
|
|
33
|
+
if (!target || !(target.prototype instanceof hyper_express_1.Router)) {
|
|
34
|
+
return new hyper_express_1.Router();
|
|
35
|
+
}
|
|
36
|
+
return new target();
|
|
37
|
+
}
|
|
38
|
+
function getServerMetadata(target) {
|
|
39
|
+
const root = meta_store_1.Metadata.get(target);
|
|
40
|
+
return root.server || {
|
|
41
|
+
common: { type: "controller" },
|
|
42
|
+
methods: {},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
function getCommonMetadata(target) {
|
|
46
|
+
const server = getServerMetadata(target);
|
|
47
|
+
return server.common || { type: "controller" };
|
|
48
|
+
}
|
|
49
|
+
function getMethodMetadataMap(target) {
|
|
50
|
+
const server = getServerMetadata(target);
|
|
51
|
+
return (server.methods || {});
|
|
52
|
+
}
|
|
53
|
+
function getData(target) {
|
|
54
|
+
var _a, _b, _c;
|
|
55
|
+
const common = getCommonMetadata(target);
|
|
56
|
+
return {
|
|
57
|
+
type: common.type,
|
|
58
|
+
metadata: common,
|
|
59
|
+
middlewares: (0, middleware_transform_1.default)((_a = common.middlewares) !== null && _a !== void 0 ? _a : []),
|
|
60
|
+
scopes: (_b = common.scopes) !== null && _b !== void 0 ? _b : [],
|
|
61
|
+
roles: (_c = common.roles) !== null && _c !== void 0 ? _c : [],
|
|
62
|
+
methods: getMethodMetadataMap(target),
|
|
63
|
+
pass: !!common.pass,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function logTargetType(type, namespace, prefix, log) {
|
|
67
|
+
if (type === "module") {
|
|
68
|
+
log("modules", `${namespace} { ${prefix} }`);
|
|
69
|
+
}
|
|
70
|
+
else if (type === "controller") {
|
|
71
|
+
log("controllers", `${namespace} { ${prefix} }`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function registerInstanceHandlers(instance, target, namespace, log) {
|
|
75
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
76
|
+
const methods = getMethodMetadataMap(target);
|
|
77
|
+
const bus = tsyringe_1.container.resolve(message_bus_1.MessageBus);
|
|
78
|
+
for (const propertyKey of Object.keys(methods)) {
|
|
79
|
+
const methodMeta = methods[propertyKey];
|
|
80
|
+
if (methodMeta.onMessage) {
|
|
81
|
+
yield bus.listen(methodMeta.onMessage.topic, (data) => __awaiter(this, void 0, void 0, function* () {
|
|
82
|
+
return yield instance[propertyKey].call(instance, data);
|
|
83
|
+
}));
|
|
84
|
+
log("messaging", `${namespace}/${propertyKey} -> ${methodMeta.onMessage.topic}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
function applyCommonPipeline(targetName, carrier, data, log) {
|
|
90
|
+
if (data.middlewares.length) {
|
|
91
|
+
carrier.use(...data.middlewares);
|
|
92
|
+
log === null || log === void 0 ? void 0 : log("middleware", `${targetName} with middlewares: ${data.middlewares.map(m => m.name).join(", ")}`);
|
|
93
|
+
}
|
|
94
|
+
if (data.scopes.length) {
|
|
95
|
+
(0, scope_transfrom_1.default)(data.scopes, (middleware, resolvedScopes) => {
|
|
96
|
+
stores_1.ScopeStore.addAll(resolvedScopes);
|
|
97
|
+
carrier.use(middleware);
|
|
98
|
+
log === null || log === void 0 ? void 0 : log("middleware", `${targetName} with scopes: ${data.scopes.join(", ")}`);
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
if (data.roles.length) {
|
|
102
|
+
(0, role_transform_1.default)(data.roles, (middleware) => {
|
|
103
|
+
carrier.use(middleware);
|
|
104
|
+
log === null || log === void 0 ? void 0 : log("middleware", `${targetName} with roles: ${data.roles.join(", ")}`);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/* -------------------------------------------------------------------------- */
|
|
109
|
+
/* Route/Handler construction */
|
|
110
|
+
/* -------------------------------------------------------------------------- */
|
|
111
|
+
function buildArgumentsResolver(paramsMeta) {
|
|
112
|
+
const sorted = [...paramsMeta].sort((a, b) => a.index - b.index);
|
|
113
|
+
const hasBody = sorted.some((p) => p.source === "body");
|
|
114
|
+
// Pre-calculate per-parameter resolution logic
|
|
115
|
+
const resolvers = sorted.map((meta) => {
|
|
116
|
+
if (meta.resolver)
|
|
117
|
+
return meta.resolver;
|
|
118
|
+
const sourceKey = meta.source;
|
|
119
|
+
if (!sourceKey)
|
|
120
|
+
return () => null;
|
|
121
|
+
const isWhole = meta.isWholeSource;
|
|
122
|
+
const picker = meta.picker;
|
|
123
|
+
const schema = meta.schema;
|
|
124
|
+
return (req, res, body) => __awaiter(this, void 0, void 0, function* () {
|
|
125
|
+
if (sourceKey === "req")
|
|
126
|
+
return req;
|
|
127
|
+
if (sourceKey === "res")
|
|
128
|
+
return res;
|
|
129
|
+
let source = sourceKey === "body" ? body : req[sourceKey];
|
|
130
|
+
if (!source)
|
|
131
|
+
return null;
|
|
132
|
+
const rawValue = isWhole ? source : picker ? source[picker] : source;
|
|
133
|
+
if (!schema)
|
|
134
|
+
return rawValue;
|
|
135
|
+
return yield transform_registry_1.transformRegistry.resolve({
|
|
136
|
+
data: rawValue,
|
|
137
|
+
schema,
|
|
138
|
+
options: {},
|
|
139
|
+
req,
|
|
140
|
+
res,
|
|
141
|
+
from: sourceKey,
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
return (req, res) => __awaiter(this, void 0, void 0, function* () {
|
|
146
|
+
if (resolvers.length === 0)
|
|
147
|
+
return [req, res];
|
|
148
|
+
const body = hasBody && typeof req.json === "function" ? yield req.json() : undefined;
|
|
149
|
+
return yield Promise.all(resolvers.map((r) => r(req, res, body)));
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
function buildResponseSender(outputSchema) {
|
|
153
|
+
const needsTransform = outputSchema && outputSchema !== Object && outputSchema !== Promise;
|
|
154
|
+
return (res, result, req) => __awaiter(this, void 0, void 0, function* () {
|
|
155
|
+
if (result === undefined || res.completed)
|
|
156
|
+
return;
|
|
157
|
+
if (needsTransform) {
|
|
158
|
+
const transformed = yield transform_registry_1.transformRegistry.resolve({
|
|
159
|
+
data: result,
|
|
160
|
+
schema: outputSchema,
|
|
161
|
+
options: {},
|
|
162
|
+
req,
|
|
163
|
+
res,
|
|
164
|
+
from: "response",
|
|
165
|
+
});
|
|
166
|
+
if (transformed !== undefined && !res.completed) {
|
|
167
|
+
res.json(transformed);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (res.completed)
|
|
172
|
+
return;
|
|
173
|
+
if (typeof result === "object" && result !== null) {
|
|
174
|
+
res.json(result);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
res.send(result);
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
function prepareRoute(target, router, route, instance, namespace, log) {
|
|
182
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
183
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
184
|
+
const { method, path, propertyKey, options } = route;
|
|
185
|
+
const methodMeta = getMethodMetadataMap(target)[propertyKey] || {};
|
|
186
|
+
const ctrlMeta = getCommonMetadata(target);
|
|
187
|
+
const roles = [...((_a = ctrlMeta.roles) !== null && _a !== void 0 ? _a : []), ...((_b = methodMeta.roles) !== null && _b !== void 0 ? _b : [])];
|
|
188
|
+
const scopes = [...((_c = ctrlMeta.scopes) !== null && _c !== void 0 ? _c : []), ...((_d = methodMeta.scopes) !== null && _d !== void 0 ? _d : [])];
|
|
189
|
+
const middlewares = (0, middleware_transform_1.default)((_e = methodMeta.middlewares) !== null && _e !== void 0 ? _e : []);
|
|
190
|
+
(0, role_transform_1.default)(roles, m => middlewares.push(m));
|
|
191
|
+
(0, scope_transfrom_1.default)(scopes, (m, s) => {
|
|
192
|
+
middlewares.push(m);
|
|
193
|
+
stores_1.ScopeStore.addAll(s);
|
|
194
|
+
});
|
|
195
|
+
log("routes", `${namespace}/${propertyKey} ${method.toUpperCase()} { ${path} }`);
|
|
196
|
+
if (method === "ws" && options) {
|
|
197
|
+
router.ws(path, options, instance[propertyKey].bind(instance));
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
const argumentResolver = buildArgumentsResolver(((_f = methodMeta.params) === null || _f === void 0 ? void 0 : _f.params) || []);
|
|
201
|
+
const responseSender = buildResponseSender(methodMeta.output || ((_g = methodMeta.reflection) === null || _g === void 0 ? void 0 : _g.output));
|
|
202
|
+
const handlerMethod = instance[propertyKey];
|
|
203
|
+
const handler = (req, res) => __awaiter(this, void 0, void 0, function* () {
|
|
204
|
+
try {
|
|
205
|
+
const args = yield argumentResolver(req, res);
|
|
206
|
+
const result = yield handlerMethod.apply(instance, args);
|
|
207
|
+
yield responseSender(res, result, req);
|
|
208
|
+
}
|
|
209
|
+
catch (err) {
|
|
210
|
+
if (res.completed)
|
|
211
|
+
return;
|
|
212
|
+
const error = err;
|
|
213
|
+
res.status(error.status || 500).json({
|
|
214
|
+
error: error.message || "Internal Server Error",
|
|
215
|
+
code: error.code,
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
const fn = Reflect.get(router, method);
|
|
220
|
+
if (fn)
|
|
221
|
+
fn.call(router, path, ...middlewares, handler);
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
/* -------------------------------------------------------------------------- */
|
|
225
|
+
/* Preparation Logic */
|
|
226
|
+
/* -------------------------------------------------------------------------- */
|
|
227
|
+
function prepareImportsInternal(imports, context, log) {
|
|
228
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
229
|
+
yield Promise.all(imports.map((item) => __awaiter(this, void 0, void 0, function* () {
|
|
230
|
+
var _a, _b;
|
|
231
|
+
let token;
|
|
232
|
+
if (typeof item === "function") {
|
|
233
|
+
token = item;
|
|
234
|
+
if (!tsyringe_1.container.isRegistered(token))
|
|
235
|
+
tsyringe_1.container.register(token, token);
|
|
236
|
+
}
|
|
237
|
+
else if (typeof item === "object" && item !== null) {
|
|
238
|
+
const obj = item;
|
|
239
|
+
token = obj.token;
|
|
240
|
+
if (obj.useClass)
|
|
241
|
+
tsyringe_1.container.register(token, { useClass: obj.useClass });
|
|
242
|
+
else if (obj.useValue)
|
|
243
|
+
tsyringe_1.container.register(token, { useValue: obj.useValue });
|
|
244
|
+
else if (obj.useFactory)
|
|
245
|
+
tsyringe_1.container.register(token, { useFactory: obj.useFactory });
|
|
246
|
+
else if (obj.useToken)
|
|
247
|
+
tsyringe_1.container.register(token, { useToken: obj.useToken });
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
token = item;
|
|
251
|
+
}
|
|
252
|
+
const instance = tsyringe_1.container.resolve(token);
|
|
253
|
+
if (instance) {
|
|
254
|
+
const itemContext = Object.assign(Object.assign({}, context), { type: "service", target: token });
|
|
255
|
+
if ((_a = context.hooks) === null || _a === void 0 ? void 0 : _a.onBeforeInit)
|
|
256
|
+
yield context.hooks.onBeforeInit(instance, token, itemContext);
|
|
257
|
+
if (typeof token === "function" && token.name) {
|
|
258
|
+
yield registerInstanceHandlers(instance, token, `imports/${token.name}`, log);
|
|
259
|
+
}
|
|
260
|
+
if (typeof instance.onInit === "function")
|
|
261
|
+
yield instance.onInit();
|
|
262
|
+
if ((_b = context.hooks) === null || _b === void 0 ? void 0 : _b.onAfterInit)
|
|
263
|
+
yield context.hooks.onAfterInit(instance, token, itemContext);
|
|
264
|
+
}
|
|
265
|
+
})));
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Ensures a class is resolvable by tsyringe even without @injectable()
|
|
270
|
+
*/
|
|
271
|
+
function ensureResolvable(target) {
|
|
272
|
+
if (!tsyringe_1.container.isRegistered(target)) {
|
|
273
|
+
// We apply injectable() at runtime to ensure metadata is picked up if not already done
|
|
274
|
+
(0, tsyringe_1.injectable)()(target);
|
|
275
|
+
tsyringe_1.container.register(target, target);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
function registerRoutes(target, instance, router, namespace, log) {
|
|
279
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
280
|
+
const methods = getMethodMetadataMap(target);
|
|
281
|
+
for (const key of Object.keys(methods)) {
|
|
282
|
+
const route = methods[key].route;
|
|
283
|
+
if (route)
|
|
284
|
+
yield prepareRoute(target, router, route, instance, namespace, log);
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
function prepareController(descriptor, context, log) {
|
|
289
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
290
|
+
var _a;
|
|
291
|
+
const { target, instance, metadata } = descriptor;
|
|
292
|
+
const data = getData(target);
|
|
293
|
+
const router = new hyper_express_1.Router();
|
|
294
|
+
logTargetType("controller", context.namespace, context.prefix, log);
|
|
295
|
+
yield prepareImportsInternal((_a = metadata.imports) !== null && _a !== void 0 ? _a : [], context, log);
|
|
296
|
+
yield registerInstanceHandlers(instance, target, context.namespace, log);
|
|
297
|
+
applyCommonPipeline(target.name, { use: (...args) => router.use(...args) }, data, log);
|
|
298
|
+
yield registerRoutes(target, instance, router, context.namespace, log);
|
|
299
|
+
context.parentRouter.use(context.prefix, router);
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
function prepareModule(descriptor, context, log) {
|
|
303
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
304
|
+
var _a, _b, _c;
|
|
305
|
+
const { target, instance, metadata } = descriptor;
|
|
306
|
+
const data = getData(target);
|
|
307
|
+
const router = new hyper_express_1.Router();
|
|
308
|
+
logTargetType("module", context.namespace, context.prefix, log);
|
|
309
|
+
yield prepareImportsInternal((_a = metadata.imports) !== null && _a !== void 0 ? _a : [], context, log);
|
|
310
|
+
yield registerInstanceHandlers(instance, target, context.namespace, log);
|
|
311
|
+
applyCommonPipeline(target.name, { use: (...args) => router.use(...args) }, data, log);
|
|
312
|
+
// Recurse modules
|
|
313
|
+
if ((_b = metadata.modules) === null || _b === void 0 ? void 0 : _b.length) {
|
|
314
|
+
for (const m of metadata.modules) {
|
|
315
|
+
const mData = getData(m).metadata;
|
|
316
|
+
ensureResolvable(m);
|
|
317
|
+
yield prepareModule({ target: m, instance: tsyringe_1.container.resolve(m), metadata: mData }, {
|
|
318
|
+
parentRouter: router,
|
|
319
|
+
namespace: `${context.namespace}/${m.name}`,
|
|
320
|
+
prefix: mData.path || "/",
|
|
321
|
+
hooks: context.hooks,
|
|
322
|
+
type: "module",
|
|
323
|
+
target: m
|
|
324
|
+
}, log);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
// Direct routes on module
|
|
328
|
+
yield registerRoutes(target, instance, router, context.namespace, log);
|
|
329
|
+
// Controllers
|
|
330
|
+
if ((_c = metadata.controllers) === null || _c === void 0 ? void 0 : _c.length) {
|
|
331
|
+
for (const c of metadata.controllers) {
|
|
332
|
+
const cData = getData(c).metadata;
|
|
333
|
+
ensureResolvable(c);
|
|
334
|
+
yield prepareController({ target: c, instance: tsyringe_1.container.resolve(c), metadata: cData }, {
|
|
335
|
+
parentRouter: router,
|
|
336
|
+
namespace: `${context.namespace}/${c.name}`,
|
|
337
|
+
prefix: cData.path || "/",
|
|
338
|
+
hooks: context.hooks,
|
|
339
|
+
type: "controller",
|
|
340
|
+
target: c
|
|
341
|
+
}, log);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
context.parentRouter.use(context.prefix, router);
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
function prepareApplication(options, Target, log) {
|
|
348
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
349
|
+
var _a, _b, _c;
|
|
350
|
+
const appServer = new hyper_express_1.Server(options.uwsOptions || options.options);
|
|
351
|
+
// Register global error handler to properly handle status codes from exceptions
|
|
352
|
+
appServer.set_error_handler((req, res, error) => {
|
|
353
|
+
const status = error.status || 500;
|
|
354
|
+
res.status(status).json(Object.assign({ error: error.message || "Internal Server Error", code: error.code || "InternalServerError" }, (error instanceof Error ? { stack: error.stack } : {})));
|
|
355
|
+
});
|
|
356
|
+
ensureResolvable(Target);
|
|
357
|
+
const appInstance = tsyringe_1.container.resolve(Target);
|
|
358
|
+
const data = getData(Target);
|
|
359
|
+
const bus = tsyringe_1.container.resolve(message_bus_1.MessageBus);
|
|
360
|
+
const transports = options.transports && options.transports.length > 0 ? options.transports : [transport_1.InternalTransport];
|
|
361
|
+
transports.forEach(t => bus.registerTransport(typeof t === "function" ? tsyringe_1.container.resolve(t) : t));
|
|
362
|
+
const hooks = (options.hooks ? (typeof options.hooks === "function" ? tsyringe_1.container.resolve(options.hooks) : options.hooks) : undefined);
|
|
363
|
+
const context = {
|
|
364
|
+
parentRouter: appServer,
|
|
365
|
+
namespace: Target.name,
|
|
366
|
+
prefix: (_a = options.prefix) !== null && _a !== void 0 ? _a : "/",
|
|
367
|
+
hooks,
|
|
368
|
+
type: "app",
|
|
369
|
+
target: Target
|
|
370
|
+
};
|
|
371
|
+
yield prepareImportsInternal((_b = options.imports) !== null && _b !== void 0 ? _b : [], context, log);
|
|
372
|
+
yield registerInstanceHandlers(appInstance, Target, context.namespace, log);
|
|
373
|
+
applyCommonPipeline(Target.name, { use: (...args) => appServer.use(...args) }, data, log);
|
|
374
|
+
// Direct routes on app
|
|
375
|
+
yield registerRoutes(Target, appInstance, appServer, context.namespace, log);
|
|
376
|
+
if ((_c = options.modules) === null || _c === void 0 ? void 0 : _c.length) {
|
|
377
|
+
for (const m of options.modules) {
|
|
378
|
+
const mData = getData(m).metadata;
|
|
379
|
+
ensureResolvable(m);
|
|
380
|
+
yield prepareModule({ target: m, instance: tsyringe_1.container.resolve(m), metadata: mData }, {
|
|
381
|
+
parentRouter: appServer,
|
|
382
|
+
namespace: `${Target.name}/${m.name}`,
|
|
383
|
+
prefix: (0, path_util_1.join)(context.prefix, mData.path || "/"),
|
|
384
|
+
hooks,
|
|
385
|
+
type: "module",
|
|
386
|
+
target: m
|
|
387
|
+
}, log);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
return appServer;
|
|
391
|
+
});
|
|
392
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { HyperCommonMetadata, HyperMethodMetadata } from "../types";
|
|
2
|
+
export declare const HyperMeta: {
|
|
3
|
+
set: (target: object, propertyKey: any, data: Partial<HyperCommonMetadata> | Partial<HyperMethodMetadata>) => void;
|
|
4
|
+
get: (target: object, propertyKey?: any) => Partial<HyperCommonMetadata> | Partial<HyperMethodMetadata>;
|
|
5
|
+
};
|
|
@@ -1,15 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
}
|
|
6
|
-
declare class MetadatStore {
|
|
7
|
-
static define(key: string | symbol, value: any, { target, propertyKey }: MetadataStoreOptions): void;
|
|
8
|
-
static get<T>(key: string | symbol, { target, propertyKey }: MetadataStoreOptions, def: T): T;
|
|
9
|
-
static list<T extends any = any>(key: string | symbol, { target, propertyKey }: MetadataStoreOptions): {
|
|
10
|
-
has: () => boolean;
|
|
11
|
-
get: () => never[];
|
|
12
|
-
set: (...value: T[]) => void;
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
export default MetadatStore;
|
|
1
|
+
export * from "./meta.store";
|
|
2
|
+
export * from "./hyper.store";
|
|
3
|
+
export * from "./scope.store";
|
|
4
|
+
export * from "./serivces.store";
|
|
@@ -1,37 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
Reflect.defineMetadata(key, value, Reflect.get(target, propertyKey));
|
|
8
|
-
}
|
|
9
|
-
else {
|
|
10
|
-
Reflect.defineMetadata(key, value, (0, object_util_1.$constructor)(target));
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
static get(key, { target, propertyKey }, def) {
|
|
14
|
-
if (target && typeof propertyKey === "string") {
|
|
15
|
-
return Reflect.getMetadata(key, Reflect.get(target, propertyKey)) || def;
|
|
16
|
-
}
|
|
17
|
-
else {
|
|
18
|
-
return Reflect.getMetadata(key, (0, object_util_1.$constructor)(target)) || def;
|
|
19
|
-
}
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
20
7
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
exports.default = MetadatStore;
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./meta.store"), exports);
|
|
18
|
+
__exportStar(require("./hyper.store"), exports);
|
|
19
|
+
__exportStar(require("./scope.store"), exports);
|
|
20
|
+
__exportStar(require("./serivces.store"), exports);
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
type MetadataRecord = Record<string, unknown>;
|
|
3
|
+
export declare class Metadata {
|
|
4
|
+
/**
|
|
5
|
+
* Resolve the real metadata target.
|
|
6
|
+
* If an instance is passed, use its constructor.
|
|
7
|
+
*/
|
|
8
|
+
private static resolveTarget;
|
|
9
|
+
/**
|
|
10
|
+
* Track class constructors for discovery.
|
|
11
|
+
*/
|
|
12
|
+
private static track;
|
|
13
|
+
/**
|
|
14
|
+
* Get metadata for a target.
|
|
15
|
+
* Auto-initializes the metadata object if missing.
|
|
16
|
+
*/
|
|
17
|
+
static get<T = MetadataRecord>(target: object): T;
|
|
18
|
+
/**
|
|
19
|
+
* Replace the full metadata object for a target.
|
|
20
|
+
*/
|
|
21
|
+
static rawSet<T extends MetadataRecord>(target: object, value: T): void;
|
|
22
|
+
/**
|
|
23
|
+
* Create a scoped metadata accessor.
|
|
24
|
+
*/
|
|
25
|
+
static prefix<TCommon extends object, TMember extends object>(name: string): {
|
|
26
|
+
set: (target: object, propertyKey: any, data: Partial<TCommon> | Partial<TMember>) => void;
|
|
27
|
+
get: (target: object, propertyKey?: any) => Partial<TCommon> | Partial<TMember>;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Get all tracked classes.
|
|
31
|
+
*/
|
|
32
|
+
static getTrackedClasses(): object[];
|
|
33
|
+
}
|
|
34
|
+
export {};
|