@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.
Files changed (189) hide show
  1. package/.agent/rules/philosophy.md +103 -0
  2. package/.agent/rules/writing.md +32 -0
  3. package/README.md +107 -142
  4. package/dist/__internals/constants.d.ts +1 -58
  5. package/dist/__internals/constants.js +3 -65
  6. package/dist/__internals/helpers/lifecycle.helper.d.ts +3 -0
  7. package/dist/__internals/helpers/lifecycle.helper.js +25 -0
  8. package/dist/__internals/helpers/merge-metadata.d.ts +2 -3
  9. package/dist/__internals/helpers/merge-metadata.js +43 -23
  10. package/dist/__internals/helpers/prepare.helper.d.ts +5 -0
  11. package/dist/__internals/helpers/prepare.helper.js +392 -0
  12. package/dist/__internals/stores/hyper.store.d.ts +5 -0
  13. package/dist/__internals/stores/hyper.store.js +5 -0
  14. package/dist/__internals/stores/index.d.ts +4 -15
  15. package/dist/__internals/stores/index.js +18 -35
  16. package/dist/__internals/stores/meta.store.d.ts +34 -0
  17. package/dist/__internals/stores/meta.store.js +107 -0
  18. package/dist/__internals/stores/scope.store.d.ts +14 -0
  19. package/dist/__internals/stores/scope.store.js +29 -0
  20. package/dist/__internals/stores/serivces.store.d.ts +1 -0
  21. package/dist/__internals/stores/{store.interface.js → serivces.store.js} +2 -0
  22. package/dist/__internals/transform/middleware.transform.d.ts +3 -0
  23. package/dist/__internals/transform/middleware.transform.js +19 -0
  24. package/dist/__internals/transform/role.transform.d.ts +1 -1
  25. package/dist/__internals/transform/role.transform.js +10 -7
  26. package/dist/__internals/transform/scope.transfrom.d.ts +5 -7
  27. package/dist/__internals/transform/scope.transfrom.js +53 -39
  28. package/dist/__internals/transform/transform.registry.d.ts +33 -0
  29. package/dist/__internals/transform/transform.registry.js +59 -0
  30. package/dist/__internals/types.d.ts +53 -4
  31. package/dist/__internals/utils/function.util.d.ts +1 -4
  32. package/dist/__internals/utils/function.util.js +22 -10
  33. package/dist/common/bootstrap.d.ts +6 -2
  34. package/dist/common/bootstrap.js +51 -8
  35. package/dist/common/helpers/index.d.ts +1 -0
  36. package/dist/common/helpers/index.js +1 -0
  37. package/dist/common/helpers/scopes.d.ts +3 -3
  38. package/dist/common/helpers/scopes.js +7 -8
  39. package/dist/common/helpers/state.d.ts +17 -0
  40. package/dist/common/helpers/state.js +44 -0
  41. package/dist/common/message-bus.d.ts +11 -0
  42. package/dist/common/message-bus.js +51 -0
  43. package/dist/common/testing.d.ts +56 -0
  44. package/dist/common/testing.js +193 -0
  45. package/dist/common/transport.d.ts +10 -0
  46. package/dist/common/transport.js +59 -0
  47. package/dist/constants.d.ts +1 -0
  48. package/dist/constants.js +2 -1
  49. package/dist/decorators.d.ts +1 -0
  50. package/dist/{common/openapi/index.js → decorators.js} +1 -2
  51. package/dist/extension.js +11 -2
  52. package/dist/index.d.ts +11 -3
  53. package/dist/index.js +11 -3
  54. package/dist/lib/event/meta.store.d.ts +4 -0
  55. package/dist/lib/event/meta.store.js +5 -0
  56. package/dist/lib/openapi/collectors/class.collector.d.ts +5 -0
  57. package/dist/lib/openapi/collectors/class.collector.js +10 -0
  58. package/dist/lib/openapi/collectors/index.d.ts +3 -0
  59. package/dist/lib/openapi/collectors/index.js +19 -0
  60. package/dist/lib/openapi/collectors/method.collector.d.ts +7 -0
  61. package/dist/lib/openapi/collectors/method.collector.js +101 -0
  62. package/dist/lib/openapi/collectors/schema.collector.d.ts +6 -0
  63. package/dist/lib/openapi/collectors/schema.collector.js +29 -0
  64. package/dist/lib/openapi/constants.d.ts +47 -0
  65. package/dist/lib/openapi/constants.js +61 -0
  66. package/dist/lib/openapi/decorators.d.ts +16 -0
  67. package/dist/lib/openapi/decorators.js +93 -0
  68. package/dist/lib/openapi/index.d.ts +30 -0
  69. package/dist/lib/openapi/index.js +136 -0
  70. package/dist/lib/openapi/metadata.d.ts +7 -0
  71. package/dist/lib/openapi/metadata.js +8 -0
  72. package/dist/lib/openapi/metadata.registry.d.ts +29 -0
  73. package/dist/lib/openapi/metadata.registry.js +41 -0
  74. package/dist/lib/openapi/types.d.ts +131 -0
  75. package/dist/lib/server/decorators/File.d.ts +37 -0
  76. package/dist/{decorators → lib/server/decorators}/File.js +62 -75
  77. package/dist/lib/server/decorators/Http.d.ts +12 -0
  78. package/dist/lib/server/decorators/Http.js +56 -0
  79. package/dist/lib/server/decorators/HyperApp.d.ts +7 -0
  80. package/dist/lib/server/decorators/HyperApp.js +14 -0
  81. package/dist/lib/server/decorators/HyperController.d.ts +6 -0
  82. package/dist/lib/server/decorators/HyperController.js +15 -0
  83. package/dist/lib/server/decorators/HyperModule.d.ts +6 -0
  84. package/dist/lib/server/decorators/HyperModule.js +13 -0
  85. package/dist/lib/server/decorators/HyperService.d.ts +12 -0
  86. package/dist/lib/server/decorators/HyperService.js +30 -0
  87. package/dist/lib/server/decorators/Messaging.d.ts +8 -0
  88. package/dist/lib/server/decorators/Messaging.js +19 -0
  89. package/dist/lib/server/decorators/Middleware.d.ts +18 -0
  90. package/dist/lib/server/decorators/Middleware.js +52 -0
  91. package/dist/lib/server/decorators/Output.d.ts +6 -0
  92. package/dist/lib/server/decorators/Output.js +14 -0
  93. package/dist/lib/server/decorators/Pass.d.ts +10 -0
  94. package/dist/lib/server/decorators/Pass.js +13 -0
  95. package/dist/lib/server/decorators/Role.d.ts +7 -0
  96. package/dist/lib/server/decorators/Role.js +14 -0
  97. package/dist/lib/server/decorators/Routes.d.ts +14 -0
  98. package/dist/lib/server/decorators/Routes.js +39 -0
  99. package/dist/lib/server/decorators/Scope.d.ts +7 -0
  100. package/dist/lib/server/decorators/Scope.js +14 -0
  101. package/dist/{decorators → lib/server/decorators}/index.d.ts +9 -4
  102. package/dist/{decorators → lib/server/decorators}/index.js +9 -4
  103. package/dist/lib/server/decorators/metadata.d.ts +1 -0
  104. package/dist/lib/server/decorators/metadata.js +5 -0
  105. package/dist/lib/server/decorators/types.d.ts +125 -0
  106. package/dist/lib/server/decorators/types.js +6 -0
  107. package/dist/{exeptions → lib/server/exeptions}/HyperException.d.ts +2 -1
  108. package/dist/{exeptions → lib/server/exeptions}/HyperException.js +2 -1
  109. package/dist/{exeptions → lib/server/exeptions}/HyperFileException.js +1 -1
  110. package/dist/{exeptions → lib/server/exeptions}/NotRoleException.js +1 -1
  111. package/dist/{exeptions → lib/server/exeptions}/NotScopeException.js +1 -1
  112. package/dist/lib/tree/tree.d.ts +36 -0
  113. package/dist/lib/tree/tree.js +106 -0
  114. package/dist/type.d.ts +13 -2
  115. package/hyper-express-decorators.d.ts +1 -0
  116. package/package.json +81 -60
  117. package/scripts/clean.js +56 -0
  118. package/scripts/test-server.ts +85 -0
  119. package/tsconfig.json +18 -13
  120. package/vitest.config.mjs +30 -0
  121. package/.mocharc.js +0 -5
  122. package/dist/__internals/creators/request.creator.d.ts +0 -12
  123. package/dist/__internals/creators/request.creator.js +0 -53
  124. package/dist/__internals/creators/routes.creator.d.ts +0 -10
  125. package/dist/__internals/creators/routes.creator.js +0 -37
  126. package/dist/__internals/decorator-base.d.ts +0 -30
  127. package/dist/__internals/decorator-base.js +0 -86
  128. package/dist/__internals/store.d.ts +0 -10
  129. package/dist/__internals/store.js +0 -17
  130. package/dist/__internals/stores/middleware.store.d.ts +0 -7
  131. package/dist/__internals/stores/middleware.store.js +0 -19
  132. package/dist/__internals/stores/params.store.d.ts +0 -21
  133. package/dist/__internals/stores/params.store.js +0 -65
  134. package/dist/__internals/stores/routes.store.d.ts +0 -17
  135. package/dist/__internals/stores/routes.store.js +0 -43
  136. package/dist/__internals/stores/store.interface.d.ts +0 -8
  137. package/dist/__internals/transform/method.transform.d.ts +0 -2
  138. package/dist/__internals/transform/method.transform.js +0 -20
  139. package/dist/__internals/transform/pass.transfrom.d.ts +0 -1
  140. package/dist/__internals/transform/pass.transfrom.js +0 -2
  141. package/dist/__internals/utils/mixin.utils.d.ts +0 -11
  142. package/dist/__internals/utils/mixin.utils.js +0 -34
  143. package/dist/__internals/utils/router.d.ts +0 -1
  144. package/dist/__internals/utils/router.js +0 -2
  145. package/dist/common/openapi/collect-class-data.d.ts +0 -21
  146. package/dist/common/openapi/collect-class-data.js +0 -45
  147. package/dist/common/openapi/collect-function-data.d.ts +0 -32
  148. package/dist/common/openapi/collect-function-data.js +0 -70
  149. package/dist/common/openapi/index.d.ts +0 -2
  150. package/dist/decorators/File.d.ts +0 -65
  151. package/dist/decorators/Http.d.ts +0 -55
  152. package/dist/decorators/Http.js +0 -93
  153. package/dist/decorators/HyperApp.d.ts +0 -7
  154. package/dist/decorators/HyperApp.js +0 -262
  155. package/dist/decorators/HyperController.d.ts +0 -2
  156. package/dist/decorators/HyperController.js +0 -19
  157. package/dist/decorators/HyperModule.d.ts +0 -5
  158. package/dist/decorators/HyperModule.js +0 -14
  159. package/dist/decorators/Middleware.d.ts +0 -24
  160. package/dist/decorators/Middleware.js +0 -51
  161. package/dist/decorators/Pass.d.ts +0 -12
  162. package/dist/decorators/Pass.js +0 -29
  163. package/dist/decorators/Role.d.ts +0 -6
  164. package/dist/decorators/Role.js +0 -34
  165. package/dist/decorators/Routes.d.ts +0 -14
  166. package/dist/decorators/Routes.js +0 -21
  167. package/dist/decorators/Scope.d.ts +0 -6
  168. package/dist/decorators/Scope.js +0 -25
  169. package/dist/decorators/types.d.ts +0 -89
  170. /package/dist/{decorators → lib/openapi}/types.js +0 -0
  171. /package/dist/{exeptions → lib/server/exeptions}/DuplicateControllerPathException.d.ts +0 -0
  172. /package/dist/{exeptions → lib/server/exeptions}/DuplicateControllerPathException.js +0 -0
  173. /package/dist/{exeptions → lib/server/exeptions}/DuplicatedException.d.ts +0 -0
  174. /package/dist/{exeptions → lib/server/exeptions}/DuplicatedException.js +0 -0
  175. /package/dist/{exeptions → lib/server/exeptions}/DuplicatedHandlerException.d.ts +0 -0
  176. /package/dist/{exeptions → lib/server/exeptions}/DuplicatedHandlerException.js +0 -0
  177. /package/dist/{exeptions → lib/server/exeptions}/HyperFileException.d.ts +0 -0
  178. /package/dist/{exeptions → lib/server/exeptions}/MethodNotFountException.d.ts +0 -0
  179. /package/dist/{exeptions → lib/server/exeptions}/MethodNotFountException.js +0 -0
  180. /package/dist/{exeptions → lib/server/exeptions}/NotPropertyException.d.ts +0 -0
  181. /package/dist/{exeptions → lib/server/exeptions}/NotPropertyException.js +0 -0
  182. /package/dist/{exeptions → lib/server/exeptions}/NotRoleException.d.ts +0 -0
  183. /package/dist/{exeptions → lib/server/exeptions}/NotScopeException.d.ts +0 -0
  184. /package/dist/{exeptions → lib/server/exeptions}/WrongPlaceException.d.ts +0 -0
  185. /package/dist/{exeptions → lib/server/exeptions}/WrongPlaceException.js +0 -0
  186. /package/dist/{exeptions → lib/server/exeptions}/index.d.ts +0 -0
  187. /package/dist/{exeptions → lib/server/exeptions}/index.js +0 -0
  188. /package/dist/{exeptions → lib/server/exeptions}/types.d.ts +0 -0
  189. /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("reflect-metadata");
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
- for (const key of keys) {
14
- const sourceMeta = Reflect.getMetadata(key, source);
15
- const targetMeta = Reflect.getMetadata(key, target);
16
- if (sourceMeta === undefined)
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
- let mergedMeta = sourceMeta;
19
- if (typeof sourceMeta === "object" && typeof targetMeta === "object") {
20
- mergedMeta = deepMerge(targetMeta, sourceMeta, options);
21
- }
22
- Reflect.defineMetadata(key, mergedMeta, target);
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
- return (options.overwriteArrays ? source : Array.from(new Set([...target, ...source])));
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 target === "object" && target !== null && typeof source === "object" && source !== null) {
37
- const merged = Object.assign({}, target);
38
- for (const key of Object.keys(source)) {
39
- merged[key] = deepMerge(target[key], source[key], options);
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 merged;
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
+ };
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HyperMeta = void 0;
4
+ const meta_store_1 = require("./meta.store");
5
+ exports.HyperMeta = meta_store_1.Metadata.prefix('server');
@@ -1,15 +1,4 @@
1
- interface MetadataStoreOptions {
2
- target: any;
3
- propertyKey?: string | symbol;
4
- descriptorOrIndex?: any;
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.defineProperty(exports, "__esModule", { value: true });
3
- const object_util_1 = require("../utils/object.util");
4
- class MetadatStore {
5
- static define(key, value, { target, propertyKey }) {
6
- if (target && typeof propertyKey === "string") {
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
- static list(key, { target, propertyKey }) {
22
- return {
23
- has: () => {
24
- return this.get(key, { target, propertyKey }, []).length > 0;
25
- },
26
- get: () => {
27
- return this.get(key, { target, propertyKey }, []);
28
- },
29
- set: (...value) => {
30
- const list = this.get(key, { target, propertyKey }, []);
31
- list.push(...value);
32
- this.define(key, list, { target, propertyKey });
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 {};