@zenofolio/hyper-decor 1.0.71 → 1.0.73

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 (122) hide show
  1. package/.agent/rules/philosophy.md +103 -0
  2. package/.agent/rules/writing.md +32 -0
  3. package/README.md +78 -207
  4. package/dist/__internals/constants.d.ts +1 -62
  5. package/dist/__internals/constants.js +3 -69
  6. package/dist/__internals/creators/request.creator.d.ts +1 -10
  7. package/dist/__internals/creators/request.creator.js +141 -23
  8. package/dist/__internals/helpers/merge-metadata.d.ts +2 -3
  9. package/dist/__internals/helpers/merge-metadata.js +31 -7
  10. package/dist/__internals/helpers/prepare.helper.d.ts +4 -10
  11. package/dist/__internals/helpers/prepare.helper.js +316 -283
  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 -0
  15. package/dist/__internals/stores/index.js +20 -0
  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/serivces.store.js +4 -0
  22. package/dist/__internals/transform/middleware.transform.d.ts +1 -1
  23. package/dist/__internals/transform/middleware.transform.js +1 -1
  24. package/dist/__internals/transform/role.transform.d.ts +1 -1
  25. package/dist/__internals/transform/role.transform.js +4 -4
  26. package/dist/__internals/transform/scope.transfrom.d.ts +1 -1
  27. package/dist/__internals/transform/scope.transfrom.js +2 -2
  28. package/dist/__internals/types.d.ts +53 -4
  29. package/dist/common/bootstrap.d.ts +6 -2
  30. package/dist/common/bootstrap.js +44 -10
  31. package/dist/common/transport.d.ts +1 -0
  32. package/dist/common/transport.js +27 -14
  33. package/dist/constants.d.ts +1 -0
  34. package/dist/constants.js +2 -1
  35. package/dist/decorators/Http.d.ts +3 -43
  36. package/dist/decorators/Http.js +9 -103
  37. package/dist/decorators.d.ts +1 -0
  38. package/dist/decorators.js +17 -0
  39. package/dist/index.d.ts +6 -5
  40. package/dist/index.js +6 -5
  41. package/dist/lib/event/meta.store.d.ts +4 -0
  42. package/dist/lib/event/meta.store.js +5 -0
  43. package/dist/lib/openapi/collectors/class.collector.d.ts +5 -9
  44. package/dist/lib/openapi/collectors/class.collector.js +6 -63
  45. package/dist/lib/openapi/collectors/index.d.ts +3 -4
  46. package/dist/lib/openapi/collectors/index.js +0 -1
  47. package/dist/lib/openapi/collectors/method.collector.d.ts +6 -1
  48. package/dist/lib/openapi/collectors/method.collector.js +92 -59
  49. package/dist/lib/openapi/collectors/schema.collector.d.ts +3 -8
  50. package/dist/lib/openapi/collectors/schema.collector.js +17 -25
  51. package/dist/lib/openapi/constants.d.ts +1 -0
  52. package/dist/lib/openapi/constants.js +2 -2
  53. package/dist/lib/openapi/decorators.d.ts +16 -0
  54. package/dist/lib/openapi/decorators.js +93 -0
  55. package/dist/lib/openapi/index.d.ts +29 -5
  56. package/dist/lib/openapi/index.js +119 -5
  57. package/dist/lib/openapi/metadata.d.ts +7 -0
  58. package/dist/lib/openapi/metadata.js +8 -0
  59. package/dist/lib/openapi/metadata.registry.d.ts +1 -1
  60. package/dist/lib/server/decorators/File.d.ts +37 -0
  61. package/dist/lib/server/decorators/File.js +167 -0
  62. package/dist/lib/server/decorators/Http.d.ts +12 -0
  63. package/dist/lib/server/decorators/Http.js +56 -0
  64. package/dist/lib/server/decorators/HyperApp.d.ts +7 -0
  65. package/dist/lib/server/decorators/HyperApp.js +14 -0
  66. package/dist/lib/server/decorators/HyperController.d.ts +6 -0
  67. package/dist/lib/server/decorators/HyperController.js +27 -0
  68. package/dist/lib/server/decorators/HyperModule.d.ts +6 -0
  69. package/dist/lib/server/decorators/HyperModule.js +13 -0
  70. package/dist/lib/server/decorators/HyperService.d.ts +11 -0
  71. package/dist/lib/server/decorators/HyperService.js +30 -0
  72. package/dist/lib/server/decorators/Messaging.d.ts +8 -0
  73. package/dist/lib/server/decorators/Messaging.js +19 -0
  74. package/dist/lib/server/decorators/Middleware.d.ts +18 -0
  75. package/dist/lib/server/decorators/Middleware.js +52 -0
  76. package/dist/lib/server/decorators/Output.d.ts +6 -0
  77. package/dist/lib/server/decorators/Output.js +14 -0
  78. package/dist/lib/server/decorators/Pass.d.ts +10 -0
  79. package/dist/lib/server/decorators/Pass.js +13 -0
  80. package/dist/lib/server/decorators/Role.d.ts +7 -0
  81. package/dist/lib/server/decorators/Role.js +14 -0
  82. package/dist/lib/server/decorators/Routes.d.ts +14 -0
  83. package/dist/lib/server/decorators/Routes.js +39 -0
  84. package/dist/lib/server/decorators/Scope.d.ts +7 -0
  85. package/dist/lib/server/decorators/Scope.js +14 -0
  86. package/dist/lib/server/decorators/index.d.ts +16 -0
  87. package/dist/lib/server/decorators/index.js +32 -0
  88. package/dist/lib/server/decorators/metadata.d.ts +1 -0
  89. package/dist/lib/server/decorators/metadata.js +5 -0
  90. package/dist/lib/server/decorators/types.d.ts +125 -0
  91. package/dist/lib/server/decorators/types.js +6 -0
  92. package/dist/lib/server/exeptions/DuplicateControllerPathException.d.ts +14 -0
  93. package/dist/lib/server/exeptions/DuplicateControllerPathException.js +12 -0
  94. package/dist/lib/server/exeptions/DuplicatedException.d.ts +8 -0
  95. package/dist/lib/server/exeptions/DuplicatedException.js +12 -0
  96. package/dist/lib/server/exeptions/DuplicatedHandlerException.d.ts +4 -0
  97. package/dist/lib/server/exeptions/DuplicatedHandlerException.js +12 -0
  98. package/dist/lib/server/exeptions/HyperException.d.ts +8 -0
  99. package/dist/lib/server/exeptions/HyperException.js +14 -0
  100. package/dist/lib/server/exeptions/HyperFileException.d.ts +4 -0
  101. package/dist/lib/server/exeptions/HyperFileException.js +12 -0
  102. package/dist/lib/server/exeptions/MethodNotFountException.d.ts +4 -0
  103. package/dist/lib/server/exeptions/MethodNotFountException.js +12 -0
  104. package/dist/lib/server/exeptions/NotPropertyException.d.ts +6 -0
  105. package/dist/lib/server/exeptions/NotPropertyException.js +16 -0
  106. package/dist/lib/server/exeptions/NotRoleException.d.ts +6 -0
  107. package/dist/lib/server/exeptions/NotRoleException.js +17 -0
  108. package/dist/lib/server/exeptions/NotScopeException.d.ts +7 -0
  109. package/dist/lib/server/exeptions/NotScopeException.js +18 -0
  110. package/dist/lib/server/exeptions/WrongPlaceException.d.ts +8 -0
  111. package/dist/lib/server/exeptions/WrongPlaceException.js +21 -0
  112. package/dist/lib/server/exeptions/index.d.ts +8 -0
  113. package/dist/lib/server/exeptions/index.js +18 -0
  114. package/dist/lib/server/exeptions/types.d.ts +1 -0
  115. package/dist/lib/server/exeptions/types.js +2 -0
  116. package/dist/lib/tree/tree.d.ts +36 -0
  117. package/dist/lib/tree/tree.js +106 -0
  118. package/package.json +1 -1
  119. package/scripts/clean.js +55 -55
  120. package/scripts/test-server.ts +85 -85
  121. package/vitest.config.mjs +33 -30
  122. package/vitest.json +0 -0
@@ -1,4 +1,13 @@
1
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
+ };
2
11
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
13
  };
@@ -7,49 +16,158 @@ exports.default = createParamDecorator;
7
16
  require("reflect-metadata");
8
17
  const constants_1 = require("../constants");
9
18
  const decorator_base_1 = require("../decorator-base");
10
- const who_helper_1 = __importDefault(require("../helpers/who.helper"));
11
19
  const WrongPlaceException_1 = __importDefault(require("../../exeptions/WrongPlaceException"));
12
20
  const function_util_1 = require("../utils/function.util");
13
- /**
14
- * Creates a parameter decorator for handling request data.
15
- *
16
- * @param {keyof Request | ByPassKeys} key - The key to extract from the request.
17
- * @param {IParamsResolver} resolver - Resolver function to handle the parameter.
18
- * @returns {ParameterDecorator} - The parameter decorator function.
19
- */
20
- function createParamDecorator(key, decoratorName, resolver, schema, isWholeSource) {
21
- const _key = key;
21
+ const object_util_1 = require("../utils/object.util");
22
+ const transform_registry_1 = require("../transform/transform.registry");
23
+ const identitySelector = (value) => value;
24
+ const identityTransformer = (value) => value;
25
+ function createParamDecorator(sourceKey, decoratorName, keyOrSchema, schemaOrTransform, isWholeSource = false) {
26
+ const _sourceKey = sourceKey;
22
27
  return (0, decorator_base_1.DecoratorHelper)({
23
28
  type: constants_1.KEY_TYPE_CONTROLLER,
24
29
  key: constants_1.KEY_PARAMS_PARAM,
25
30
  options: (options, Target, propertyKey, parameterIndex) => {
26
- const { isProperty } = (0, who_helper_1.default)(Target, propertyKey, parameterIndex);
27
- if (!isProperty)
28
- throw new WrongPlaceException_1.default(decoratorName, "parameter", `${Target.constructor.name}.${propertyKey}`, Target);
31
+ const isProperty = typeof parameterIndex === "number";
32
+ if (!isProperty) {
33
+ throw new WrongPlaceException_1.default(decoratorName, "parameter", `${Target.constructor.name}.${String(propertyKey)}`, Target);
34
+ }
29
35
  const saved = options !== null && options !== void 0 ? options : { params: {} };
30
- const names = (0, function_util_1.extractArgsNames)(Target[propertyKey]);
36
+ const method = Target[propertyKey];
37
+ const names = (0, function_util_1.extractArgsNames)(method);
31
38
  const types = Reflect.getMetadata(constants_1.DESIGN_PARAMTYPES, Target, propertyKey);
32
39
  const name = names === null || names === void 0 ? void 0 : names[parameterIndex];
33
40
  const type = types === null || types === void 0 ? void 0 : types[parameterIndex];
41
+ let key = undefined;
42
+ let inputSchemaOrFn = undefined;
43
+ let wholeSource = isWholeSource;
44
+ if (typeof keyOrSchema === "string") {
45
+ key = keyOrSchema;
46
+ inputSchemaOrFn = schemaOrTransform;
47
+ }
48
+ else if (keyOrSchema !== undefined) {
49
+ inputSchemaOrFn = keyOrSchema;
50
+ wholeSource = true;
51
+ }
52
+ const hasKey = key !== undefined && key !== "";
53
+ const hasTransform = inputSchemaOrFn !== undefined;
54
+ const extractor = createExtractor(_sourceKey);
55
+ const selector = createSelector(key);
56
+ const transformer = createTransformer(inputSchemaOrFn, _sourceKey, wholeSource);
57
+ const resolver = composeResolver(extractor, selector, transformer, hasKey, hasTransform);
34
58
  if (name && saved) {
35
- if (!saved.params[propertyKey]) {
36
- saved.params[propertyKey] = [];
59
+ let methodParams = saved.params[propertyKey];
60
+ if (!methodParams) {
61
+ methodParams = saved.params[propertyKey] = [];
37
62
  }
38
- saved.params[propertyKey].push({
63
+ methodParams.push({
39
64
  name,
40
65
  type,
41
66
  index: parameterIndex,
42
- key: _key,
67
+ key: _sourceKey,
43
68
  method: propertyKey.toString(),
44
69
  resolver,
45
- schema,
46
- isWholeSource,
70
+ schema: inputSchemaOrFn,
71
+ isWholeSource: wholeSource,
47
72
  });
48
- // sort by index
49
- saved.params[propertyKey].sort((a, b) => a.index - b.index);
50
- Reflect.defineMetadata(constants_1.KEY_PARAMS_PARAM, saved, Target[propertyKey]);
73
+ if (methodParams.length > 1) {
74
+ methodParams.sort((a, b) => a.index - b.index);
75
+ }
76
+ Reflect.defineMetadata(constants_1.KEY_PARAMS_PARAM, saved, method);
51
77
  }
52
78
  return saved;
53
79
  },
54
80
  });
55
81
  }
82
+ //////////////////////////
83
+ /// Functions
84
+ /////////////////////////
85
+ function createBodyExtractor() {
86
+ return (req) => __awaiter(this, void 0, void 0, function* () {
87
+ const request = req;
88
+ const cachedBody = request.body;
89
+ if (cachedBody !== undefined) {
90
+ return cachedBody;
91
+ }
92
+ const body = yield req.json();
93
+ request.body = body;
94
+ return body;
95
+ });
96
+ }
97
+ function createReqExtractor() {
98
+ return (req) => __awaiter(this, void 0, void 0, function* () { return req; });
99
+ }
100
+ function createResExtractor() {
101
+ return (_req, res) => __awaiter(this, void 0, void 0, function* () { return res; });
102
+ }
103
+ function createGenericExtractor(sourceKey) {
104
+ return (req) => __awaiter(this, void 0, void 0, function* () { return req[sourceKey]; });
105
+ }
106
+ function createExtractor(sourceKey) {
107
+ switch (sourceKey) {
108
+ case "body":
109
+ return createBodyExtractor();
110
+ case "req":
111
+ return createReqExtractor();
112
+ case "res":
113
+ return createResExtractor();
114
+ default:
115
+ return createGenericExtractor(sourceKey);
116
+ }
117
+ }
118
+ function createSelector(key) {
119
+ if (key === undefined || key === "") {
120
+ return identitySelector;
121
+ }
122
+ return (value) => (0, object_util_1.$get)(value, key, value);
123
+ }
124
+ function createDirectTransformer(fn) {
125
+ return (value) => fn(value);
126
+ }
127
+ function createRegistryTransformer(schema, sourceKey, isWholeSource) {
128
+ const options = { isWholeSource };
129
+ const from = sourceKey;
130
+ return (value, req, res) => transform_registry_1.transformRegistry.resolve({
131
+ data: value,
132
+ schema,
133
+ options,
134
+ req,
135
+ res,
136
+ from,
137
+ });
138
+ }
139
+ function createTransformer(inputSchemaOrFn, sourceKey, isWholeSource) {
140
+ if (inputSchemaOrFn === undefined) {
141
+ return identityTransformer;
142
+ }
143
+ if (typeof inputSchemaOrFn === "function" &&
144
+ inputSchemaOrFn.prototype === undefined) {
145
+ return createDirectTransformer(inputSchemaOrFn);
146
+ }
147
+ if (typeof inputSchemaOrFn === "function" ||
148
+ typeof inputSchemaOrFn === "string") {
149
+ return createRegistryTransformer(inputSchemaOrFn, sourceKey, isWholeSource);
150
+ }
151
+ return identityTransformer;
152
+ }
153
+ function composeResolver(extractor, selector, transformer, hasKey, hasTransform) {
154
+ if (!hasKey && !hasTransform) {
155
+ return extractor;
156
+ }
157
+ if (hasKey && !hasTransform) {
158
+ return (req, res) => __awaiter(this, void 0, void 0, function* () {
159
+ const value = yield extractor(req, res);
160
+ return selector(value);
161
+ });
162
+ }
163
+ if (!hasKey && hasTransform) {
164
+ return (req, res) => __awaiter(this, void 0, void 0, function* () {
165
+ const value = yield extractor(req, res);
166
+ return transformer(value, req, res);
167
+ });
168
+ }
169
+ return (req, res) => __awaiter(this, void 0, void 0, function* () {
170
+ const value = yield extractor(req, res);
171
+ return transformer(selector(value), req, res);
172
+ });
173
+ }
@@ -1,5 +1,4 @@
1
- import "reflect-metadata";
2
- type MetadataKey = string | symbol;
1
+ import { HyperCommonMetadata } from "../types";
3
2
  type MergeOptions = {
4
3
  overwriteArrays?: boolean;
5
4
  };
@@ -10,5 +9,5 @@ type MergeOptions = {
10
9
  * @param keys Metadata keys to merge.
11
10
  * @param options Merge options (e.g., array handling).
12
11
  */
13
- export declare function mergeMetadata(target: any, source: any, keys: MetadataKey[], options?: MergeOptions): void;
12
+ export declare function mergeMetadata(target: object, source: object, keys: (keyof HyperCommonMetadata)[], options?: MergeOptions): void;
14
13
  export {};
@@ -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,13 +14,32 @@ require("reflect-metadata");
10
14
  * @param options Merge options (e.g., array handling).
11
15
  */
12
16
  function mergeMetadata(target, source, keys, options = {}) {
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;
13
25
  for (let i = 0; i < keys.length; i++) {
14
26
  const key = keys[i];
15
- const sourceMeta = Reflect.getMetadata(key, source);
16
- if (sourceMeta === undefined)
27
+ const value = sourceCommon[key]; // Narrowing complex union access
28
+ if (value === undefined)
17
29
  continue;
18
- const targetMeta = Reflect.getMetadata(key, target);
19
- Reflect.defineMetadata(key, targetMeta === undefined ? sourceMeta : deepMerge(targetMeta, sourceMeta, options), 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
+ });
20
43
  }
21
44
  }
22
45
  function deepMerge(target, source, options) {
@@ -29,10 +52,11 @@ function deepMerge(target, source, options) {
29
52
  }
30
53
  if (source && typeof source === "object" && target && typeof target === "object") {
31
54
  const result = Object.assign({}, target);
32
- const sourceKeys = Object.keys(source);
55
+ const sourceObj = source;
56
+ const sourceKeys = Object.keys(sourceObj);
33
57
  for (let i = 0; i < sourceKeys.length; i++) {
34
58
  const k = sourceKeys[i];
35
- result[k] = deepMerge(result[k], source[k], options);
59
+ result[k] = deepMerge(result[k], sourceObj[k], options);
36
60
  }
37
61
  return result;
38
62
  }
@@ -1,11 +1,5 @@
1
+ import "reflect-metadata";
1
2
  import { Server } from "hyper-express";
2
- import { HyperAppMetadata, LogSpaces } from "../../decorators/types";
3
- /**
4
- * Prepare the application with the given options.
5
- *
6
- * @param options
7
- * @param Target
8
- * @param app
9
- * @param log
10
- */
11
- export declare function prepareApplication(options: HyperAppMetadata, Target: any, app: Server, log: (space: keyof LogSpaces, message: string) => void): Promise<void>;
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>;