@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,13 +1,4 @@
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
- };
11
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
12
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
4
  };
@@ -18,7 +9,6 @@ exports.Body = Body;
18
9
  exports.Param = Param;
19
10
  exports.Headers = Headers;
20
11
  const request_creator_1 = __importDefault(require("../__internals/creators/request.creator"));
21
- const object_util_1 = require("../__internals/utils/object.util");
22
12
  /**
23
13
  * Get the value of a key from the request object
24
14
  *
@@ -34,105 +24,21 @@ const object_util_1 = require("../__internals/utils/object.util");
34
24
  * \@Query(UserQueryDto)
35
25
  */
36
26
  function Query(keyOrSchema, schemaOrTransform) {
37
- // Case: @Query(UserQueryDto)
38
- if (typeof keyOrSchema === 'function' && !schemaOrTransform) {
39
- return (0, request_creator_1.default)("query", "Query", (request) => request.query, keyOrSchema, true);
40
- }
41
- // Case: @Query('id', IntSchema) or @Query('id', data => ...)
42
- const key = keyOrSchema;
43
- const resolver = (request) => (0, object_util_1.$get)(request.query, key, request.query);
44
- if (typeof schemaOrTransform === 'function' && schemaOrTransform.prototype === undefined) {
45
- // It's a legacy transform function: data => ...
46
- return (0, request_creator_1.default)("query", "Query", (request) => {
47
- const value = resolver(request);
48
- return schemaOrTransform(value);
49
- });
50
- }
51
- // It's either a schema/DTO class or just a key
52
- return (0, request_creator_1.default)("query", "Query", resolver, schemaOrTransform, false);
27
+ return (0, request_creator_1.default)("query", "Query", keyOrSchema, schemaOrTransform);
53
28
  }
54
- /**
55
- * Get the body of the request or transform it via a schema.
56
- *
57
- * @example
58
- * \@Body()
59
- * \@Body(CreateUserDto)
60
- */
61
- function Body(schemaOrResolver) {
62
- const resolver = (request) => __awaiter(this, void 0, void 0, function* () {
63
- return request.body !== undefined ? request.body : yield request.json();
64
- });
65
- if (typeof schemaOrResolver === 'function' && schemaOrResolver.prototype !== undefined) {
66
- // Case: @Body(CreateUserDto)
67
- return (0, request_creator_1.default)("req", "BODY", resolver, schemaOrResolver, true);
68
- }
69
- // Case: @Body(data => ...) (Legacy) or @Body()
70
- return (0, request_creator_1.default)("req", "BODY", (request) => __awaiter(this, void 0, void 0, function* () {
71
- const value = yield resolver(request);
72
- return typeof schemaOrResolver === 'function' ? schemaOrResolver(value) : value;
73
- }));
29
+ function Body(keyOrSchema, schemaOrTransform) {
30
+ return (0, request_creator_1.default)("body", "Body", keyOrSchema, schemaOrTransform, true);
74
31
  }
75
- /**
76
- * Get the params from the request or transform via schema.
77
- *
78
- * @example
79
- * \@Param('id')
80
- * \@Param('id', IntSchema)
81
- */
82
- function Param(keyOrSchema, schemaOrValidator) {
83
- // Case: @Param(ParamsDto)
84
- if (typeof keyOrSchema === 'function' && !schemaOrValidator) {
85
- return (0, request_creator_1.default)("params", "Param", (req) => req.params, keyOrSchema, true);
86
- }
87
- const key = keyOrSchema;
88
- const resolver = (req) => (0, object_util_1.$get)(req.params, key, req.params);
89
- if (typeof schemaOrValidator === 'function' && schemaOrValidator.prototype === undefined) {
90
- // Legacy validator function
91
- return (0, request_creator_1.default)("params", "Param", (req) => {
92
- const value = resolver(req);
93
- return schemaOrValidator(value);
94
- });
95
- }
96
- return (0, request_creator_1.default)("params", "Param", resolver, schemaOrValidator, false);
32
+ function Param(keyOrSchema, schemaOrTransform) {
33
+ return (0, request_creator_1.default)("params", "Param", keyOrSchema, schemaOrTransform);
97
34
  }
98
- /**
99
- * Get the headers from the request.
100
- */
101
- function Headers(keyOrSchema, schema) {
102
- if (typeof keyOrSchema === 'function' && !schema) {
103
- return (0, request_creator_1.default)("headers", "Headers", (req) => req.headers, keyOrSchema, true);
104
- }
105
- const key = keyOrSchema;
106
- const resolver = (req) => (0, object_util_1.$get)(req.headers, key, req.headers);
107
- return (0, request_creator_1.default)("headers", "Headers", resolver, schema, false);
35
+ function Headers(keyOrSchema, schemaOrTransform) {
36
+ return (0, request_creator_1.default)("headers", "Headers", keyOrSchema, schemaOrTransform);
108
37
  }
109
- const Req = () => (0, request_creator_1.default)("req", "Req", (req) => req);
38
+ const Req = () => (0, request_creator_1.default)("req", "Req");
110
39
  exports.Req = Req;
111
- const Res = () => (0, request_creator_1.default)("res", "Res", (req, res) => res);
40
+ const Res = () => (0, request_creator_1.default)("res", "Res");
112
41
  exports.Res = Res;
113
- /**
114
- * Create a custom request decorator
115
- * that can be used to extract data from the request object
116
- *
117
- *
118
- * @example
119
- * ```typescript
120
- *
121
- * interface LoginData {
122
- * username: string;
123
- * password: string;
124
- * }
125
- *
126
- * const LoginData = createCustomRequestDecorator<LoginData>({
127
- * resolver: async (request) => {
128
- * const data = await request.json();
129
- * return [data];
130
- * }
131
- * }
132
- *
133
- *
134
- *
135
- */
136
42
  const createCustomRequestDecorator = (decoratorName, resolver) => {
137
43
  return (0, request_creator_1.default)("req", decoratorName, resolver);
138
44
  };
@@ -0,0 +1 @@
1
+ export * from "./lib/server/decorators";
@@ -0,0 +1,17 @@
1
+ "use strict";
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]; } };
7
+ }
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("./lib/server/decorators"), exports);
package/dist/index.d.ts CHANGED
@@ -1,14 +1,15 @@
1
- export * from "./exeptions";
1
+ import "./extension";
2
+ export * from "./lib/server/exeptions";
2
3
  export * from "./constants";
3
4
  export * from "./extension";
4
- export * from "./decorators";
5
+ export * from "./lib/server/decorators";
5
6
  export * from "./common/helpers";
6
- export * from "./__internals/helpers/tree.helper";
7
+ export * from "./lib/tree/tree";
7
8
  export * from "./common/bootstrap";
8
9
  export * from "hyper-express";
9
10
  export * from "tsyringe";
10
- export * from "./stores";
11
- export * from "./type";
11
+ export * from "./__internals/stores";
12
+ export * from "./__internals/types";
12
13
  export * from "./common/transport";
13
14
  export * from "./common/message-bus";
14
15
  export * from "./__internals/transform/transform.registry";
package/dist/index.js CHANGED
@@ -14,17 +14,18 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./exeptions"), exports);
17
+ require("./extension");
18
+ __exportStar(require("./lib/server/exeptions"), exports);
18
19
  __exportStar(require("./constants"), exports);
19
20
  __exportStar(require("./extension"), exports);
20
- __exportStar(require("./decorators"), exports);
21
+ __exportStar(require("./lib/server/decorators"), exports);
21
22
  __exportStar(require("./common/helpers"), exports);
22
- __exportStar(require("./__internals/helpers/tree.helper"), exports);
23
+ __exportStar(require("./lib/tree/tree"), exports);
23
24
  __exportStar(require("./common/bootstrap"), exports);
24
25
  __exportStar(require("hyper-express"), exports);
25
26
  __exportStar(require("tsyringe"), exports);
26
- __exportStar(require("./stores"), exports);
27
- __exportStar(require("./type"), exports);
27
+ __exportStar(require("./__internals/stores"), exports);
28
+ __exportStar(require("./__internals/types"), exports);
28
29
  __exportStar(require("./common/transport"), exports);
29
30
  __exportStar(require("./common/message-bus"), exports);
30
31
  __exportStar(require("./__internals/transform/transform.registry"), exports);
@@ -0,0 +1,4 @@
1
+ export declare const EventMeta: {
2
+ set: (target: object, propertyKey: any, data: object) => void;
3
+ get: (target: object, propertyKey?: any) => object;
4
+ };
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EventMeta = void 0;
4
+ const stores_1 = require("../../__internals/stores");
5
+ exports.EventMeta = stores_1.Metadata.prefix("event");
@@ -1,9 +1,5 @@
1
- import "reflect-metadata";
2
- import { Tag, SecurityRequirement, Operation } from "../types";
3
- export declare function collectClassMetadata(target: any): {
4
- tags: Tag[];
5
- security: SecurityRequirement[];
6
- methods: {
7
- [methodName: string]: Operation;
8
- };
9
- };
1
+ import { Constructor } from '../../server/decorators/types';
2
+ /**
3
+ * 🏢 Extracts class-level OpenAPI metadata (Tags, Security, etc.)
4
+ */
5
+ export declare function collectClassMetadata(Target: Constructor): object;
@@ -1,67 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.collectClassMetadata = collectClassMetadata;
4
- require("reflect-metadata");
5
- const constants_1 = require("../constants");
6
- const method_collector_1 = require("./method.collector");
7
- const function_util_1 = require("../../../__internals/utils/function.util");
8
- const metadata_registry_1 = require("../metadata.registry");
9
- function collectClassMetadata(target) {
10
- var _a;
11
- const prototype = Reflect.getPrototypeOf(target);
12
- const constructor = prototype === null || prototype === void 0 ? void 0 : prototype.constructor;
13
- const name = target.name || (constructor === null || constructor === void 0 ? void 0 : constructor.name) || ((_a = target === null || target === void 0 ? void 0 : target.constructor) === null || _a === void 0 ? void 0 : _a.name);
14
- // Extraemos las metadata de la clase
15
- let tags = Reflect.getMetadata(constants_1.TAGS, target) || [];
16
- let security = Reflect.getMetadata(constants_1.SECURITY, target) || [];
17
- // Invoke custom class collectors
18
- metadata_registry_1.openApiRegistry.getCollectors("class").forEach(collector => {
19
- const data = collector(target);
20
- if (data === null || data === void 0 ? void 0 : data.tags)
21
- tags = [...tags, ...data.tags];
22
- if (data === null || data === void 0 ? void 0 : data.security)
23
- security = [...security, ...data.security];
24
- });
25
- // Si no tenemos tags, intentamos inferirlos
26
- if (tags.length === 0) {
27
- tags.push({ name });
28
- }
29
- // Si no tenemos seguridad, intentamos asignar un valor predeterminado
30
- if (security.length === 0) {
31
- security.push({ bearerAuth: [] });
32
- }
33
- // Obtenemos todos los métodos de la clase
34
- const methodNames = Object.getOwnPropertyNames(target.prototype || {}).filter((method) => method !== "constructor");
35
- // Creamos una lista con la metadata de cada uno de los métodos
36
- const methods = {};
37
- methodNames.forEach((methodName) => {
38
- let methodMetadata = (0, method_collector_1.collectMethodMetadata)(target.prototype, methodName);
39
- // Invoke custom method collectors
40
- metadata_registry_1.openApiRegistry.getCollectors("method").forEach(collector => {
41
- const data = collector(target.prototype, methodName);
42
- methodMetadata = Object.assign(Object.assign({}, methodMetadata), data);
43
- });
44
- // Si el método no tiene parámetros definidos, intentamos inferirlos
45
- if (!methodMetadata.parameters || methodMetadata.parameters.length === 0) {
46
- const methodParams = (0, function_util_1.extractArgsNames)(target.prototype[methodName]);
47
- methodParams === null || methodParams === void 0 ? void 0 : methodParams.forEach((paramName, index) => {
48
- const inferredParam = {
49
- name: paramName || `param${index}`,
50
- in: "query",
51
- required: true,
52
- schema: {
53
- type: "string",
54
- },
55
- };
56
- methodMetadata.parameters || (methodMetadata.parameters = []);
57
- methodMetadata.parameters.push(inferredParam);
58
- });
59
- }
60
- methods[methodName] = methodMetadata;
61
- });
62
- return {
63
- tags,
64
- security,
65
- methods,
66
- };
4
+ const metadata_1 = require("../metadata");
5
+ /**
6
+ * 🏢 Extracts class-level OpenAPI metadata (Tags, Security, etc.)
7
+ */
8
+ function collectClassMetadata(Target) {
9
+ return metadata_1.SwaggerMeta.get(Target);
67
10
  }
@@ -1,4 +1,3 @@
1
- export * from "./class.collector";
2
- export * from "./method.collector";
3
- export * from "./param.collector";
4
- export * from "./schema.collector";
1
+ export * from './class.collector';
2
+ export * from './method.collector';
3
+ export * from './schema.collector';
@@ -16,5 +16,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./class.collector"), exports);
18
18
  __exportStar(require("./method.collector"), exports);
19
- __exportStar(require("./param.collector"), exports);
20
19
  __exportStar(require("./schema.collector"), exports);
@@ -1,2 +1,7 @@
1
+ import "reflect-metadata";
1
2
  import { Operation } from '../types';
2
- export declare function collectMethodMetadata(target: any, methodName: string): Operation;
3
+ import { Constructor } from '../../server/decorators/types';
4
+ /**
5
+ * 🛠️ Consolidates framework metadata and OpenAPI decorators into a single Operation object.
6
+ */
7
+ export declare function collectMethodMetadata(target: Constructor, propertyKey?: string): Operation | undefined;
@@ -1,68 +1,101 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.collectMethodMetadata = collectMethodMetadata;
4
- const constants_1 = require("../constants");
5
- const param_collector_1 = require("./param.collector");
6
- const constants_2 = require("../../../__internals/constants");
4
+ require("reflect-metadata");
5
+ const metadata_1 = require("../metadata");
6
+ const metadata_2 = require("../../server/decorators/metadata");
7
7
  const transform_registry_1 = require("../../../__internals/transform/transform.registry");
8
- function collectMethodMetadata(target, methodName) {
9
- const methodMetadata = {};
10
- // Extraemos la metadata del método
11
- const summary = Reflect.getMetadata(constants_1.METHOD_SUMMARY, target, methodName);
12
- const operationId = Reflect.getMetadata(constants_1.METHOD_OPERATION_ID, target, methodName);
13
- const tags = Reflect.getMetadata(constants_1.METHOD_TAGS, target, methodName);
14
- const security = Reflect.getMetadata(constants_1.SECURITY, target, methodName);
15
- // Extraemos las respuestas del método
16
- const responses = Reflect.getMetadata(constants_1.RESPONSES, target, methodName) || {};
17
- // Extraemos los parámetros del método
18
- const parameters = (0, param_collector_1.collectParameterMetadata)(target, methodName);
19
- // Extraemos la información del cuerpo de la solicitud
20
- const requestBody = {
21
- description: Reflect.getMetadata(constants_1.REQUEST_BODY_DESCRIPTION, target, methodName),
22
- content: Reflect.getMetadata(constants_1.REQUEST_BODY_CONTENT, target, methodName),
23
- };
24
- // Bridge @Body to OpenAPI
25
- const hyperParams = Reflect.getMetadata(constants_2.KEY_PARAMS_PARAM, target[methodName]);
26
- if (hyperParams && hyperParams.params[methodName]) {
27
- const bodyParam = hyperParams.params[methodName].find(p => ['body', 'BODY', 'req'].includes(p.key));
28
- if (bodyParam) {
29
- const targetSchema = bodyParam.schema;
30
- if (targetSchema) {
31
- const bodySchema = transform_registry_1.transformRegistry.getOpenApiSchema(targetSchema);
32
- if (bodySchema) {
33
- requestBody.content = requestBody.content || {};
34
- requestBody.content['application/json'] = {
35
- schema: bodySchema
36
- };
37
- }
8
+ const constants_1 = require("../../../__internals/constants");
9
+ const schema_collector_1 = require("./schema.collector");
10
+ /**
11
+ * 🛠️ Consolidates framework metadata and OpenAPI decorators into a single Operation object.
12
+ */
13
+ function collectMethodMetadata(target, propertyKey) {
14
+ var _a, _b, _c, _d, _e, _f, _g;
15
+ if (!propertyKey)
16
+ return undefined;
17
+ // 1. Get user-defined OpenAPI metadata from decorators
18
+ const baseOperation = metadata_1.SwaggerMeta.get(target, propertyKey);
19
+ // 2. Get framework metadata (params, route, etc.)
20
+ const hyperMeta = metadata_2.HyperMeta.get(target, propertyKey);
21
+ const operation = Object.assign(Object.assign({}, baseOperation), { parameters: [...(baseOperation.parameters || [])], responses: Object.assign({}, (baseOperation.responses || {})) });
22
+ // 3. Bridge Parameters (@Query, @Param, @Headers)
23
+ if ((_a = hyperMeta.params) === null || _a === void 0 ? void 0 : _a.params) {
24
+ hyperMeta.params.params.forEach((param) => {
25
+ const inType = mapParamIn(param.decorator);
26
+ if (!inType)
27
+ return; // Skip 'body' or unknown
28
+ const name = param.picker || param.name || param.decorator || 'param';
29
+ const schema = param.schema
30
+ ? (transform_registry_1.transformRegistry.getOpenApiSchema(param.schema) || (0, schema_collector_1.collectSchema)(param.schema))
31
+ : { type: 'string' };
32
+ // If it's an object, we might want to explode it (if it's Query/Headers)
33
+ // Or if it's a DTO (whole source)
34
+ if (schema.type === 'object' && schema.properties && (inType === 'query' || inType === 'header')) {
35
+ Object.entries(schema.properties).forEach(([propName, prop]) => {
36
+ operation.parameters.push({
37
+ name: propName,
38
+ in: inType,
39
+ required: true,
40
+ schema: prop
41
+ });
42
+ });
38
43
  }
39
- }
44
+ else {
45
+ operation.parameters.push({
46
+ name,
47
+ in: inType,
48
+ required: inType === 'path' ? true : undefined,
49
+ schema
50
+ });
51
+ }
52
+ });
40
53
  }
41
- // Bridging @Output / return type to OpenAPI
42
- const outputSchema = Reflect.getMetadata(constants_2.KEY_OUTPUT_SCHEMA, target, methodName)
43
- || Reflect.getMetadata(constants_2.DESIGN_RETURNTYPE, target, methodName);
44
- if (outputSchema && outputSchema !== Object && outputSchema !== Promise) {
45
- const schema = transform_registry_1.transformRegistry.getOpenApiSchema(outputSchema);
46
- if (schema) {
47
- responses['200'] = responses['200'] || { description: 'Success' };
48
- responses['200'].content = responses['200'].content || {};
49
- responses['200'].content['application/json'] = { schema };
54
+ // 4. Bridge Request Body (@Body)
55
+ const bodyParam = (_c = (_b = hyperMeta.params) === null || _b === void 0 ? void 0 : _b.params) === null || _c === void 0 ? void 0 : _c.find((p) => p.decorator === 'Body');
56
+ if (bodyParam && !operation.requestBody) {
57
+ let schema = bodyParam.schema
58
+ ? (transform_registry_1.transformRegistry.getOpenApiSchema(bodyParam.schema) || (0, schema_collector_1.collectSchema)(bodyParam.schema))
59
+ : { type: 'object' };
60
+ // If a specific picker was requested, wrap the schema in an object
61
+ if (bodyParam.picker && bodyParam.picker !== 'body') {
62
+ schema = {
63
+ type: 'object',
64
+ properties: {
65
+ [bodyParam.picker]: schema
66
+ },
67
+ required: [bodyParam.picker]
68
+ };
50
69
  }
70
+ operation.requestBody = {
71
+ content: {
72
+ "application/json": { schema }
73
+ }
74
+ };
75
+ }
76
+ // 5. Bridge Responses (@Output)
77
+ const outputSchema = ((_g = (_f = (_e = (_d = baseOperation.responses) === null || _d === void 0 ? void 0 : _d["200"]) === null || _e === void 0 ? void 0 : _e.content) === null || _f === void 0 ? void 0 : _f["application/json"]) === null || _g === void 0 ? void 0 : _g.schema)
78
+ || hyperMeta[constants_1.KEY_OUTPUT_SCHEMA]
79
+ || hyperMeta.output;
80
+ if (outputSchema && !operation.responses["200"]) {
81
+ const schema = transform_registry_1.transformRegistry.getOpenApiSchema(outputSchema) || (0, schema_collector_1.collectSchema)(outputSchema);
82
+ operation.responses["200"] = {
83
+ description: "OK",
84
+ content: {
85
+ "application/json": { schema }
86
+ }
87
+ };
88
+ }
89
+ else if (Object.keys(operation.responses).length === 0) {
90
+ operation.responses["200"] = { description: "OK" };
91
+ }
92
+ return operation;
93
+ }
94
+ function mapParamIn(decorator) {
95
+ switch (decorator.toLowerCase()) {
96
+ case 'query': return 'query';
97
+ case 'param': return 'path';
98
+ case 'headers': return 'header';
99
+ default: return undefined;
51
100
  }
52
- // Asignamos las propiedades al objeto de metadata solo si existen
53
- if (summary)
54
- methodMetadata.summary = summary;
55
- if (operationId)
56
- methodMetadata.operationId = operationId;
57
- if (tags)
58
- methodMetadata.tags = tags;
59
- if (security)
60
- methodMetadata.security = security;
61
- if (responses && Object.keys(responses).length > 0)
62
- methodMetadata.responses = responses;
63
- if (parameters.length > 0)
64
- methodMetadata.parameters = parameters;
65
- if (requestBody.content)
66
- methodMetadata.requestBody = requestBody;
67
- return methodMetadata;
68
101
  }
@@ -1,11 +1,6 @@
1
- import "reflect-metadata";
2
- import { Schema } from "../types";
1
+ import { Schema } from '../types';
3
2
  /**
4
- * Collector responsible for transforming DTO classes into OpenAPI Schema objects.
5
- * Uses design:type and property inspection.
3
+ * 🔍 Extracts a basic OpenAPI schema from a DTO class.
4
+ * This is a fallback when no specific transformer (Zod, etc.) is registered.
6
5
  */
7
6
  export declare function collectSchema(Target: any): Schema;
8
- /**
9
- * Infer OpenAPI type from JavaScript constructor names.
10
- */
11
- export declare function inferType(constructorName: string): string;
@@ -1,37 +1,29 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.collectSchema = collectSchema;
4
- exports.inferType = inferType;
5
- require("reflect-metadata");
6
4
  /**
7
- * Collector responsible for transforming DTO classes into OpenAPI Schema objects.
8
- * Uses design:type and property inspection.
5
+ * 🔍 Extracts a basic OpenAPI schema from a DTO class.
6
+ * This is a fallback when no specific transformer (Zod, etc.) is registered.
9
7
  */
10
8
  function collectSchema(Target) {
11
- if (!Target || typeof Target !== "function") {
12
- return { type: "object" };
9
+ if (typeof Target !== 'function') {
10
+ return { type: 'string' };
13
11
  }
14
12
  const schema = {
15
- type: "object",
13
+ type: 'object',
16
14
  properties: {},
17
15
  };
18
- // Note: Standard reflect-metadata has limitations for property enumeration.
19
- // In a full implementation, we might use a custom decorator or
20
- // class-transformer/class-validator if available.
21
- // For now, we provide the structure to be extended.
16
+ // Note: Standard TS reflection doesn't expose fields without decorators.
17
+ // However, we can try to instantiate or use metadata if available.
18
+ // For now, we provide a placeholder that can be extended.
19
+ // If it's a primitive constructor
20
+ if (Target === String)
21
+ return { type: 'string' };
22
+ if (Target === Number)
23
+ return { type: 'number' };
24
+ if (Target === Boolean)
25
+ return { type: 'boolean' };
26
+ if (Target === Date)
27
+ return { type: 'string', format: 'date-time' };
22
28
  return schema;
23
29
  }
24
- /**
25
- * Infer OpenAPI type from JavaScript constructor names.
26
- */
27
- function inferType(constructorName) {
28
- const map = {
29
- String: "string",
30
- Number: "number",
31
- Boolean: "boolean",
32
- Array: "array",
33
- Object: "object",
34
- Date: "string", // Dates are strings in OpenAPI
35
- };
36
- return map[constructorName] || "string";
37
- }
@@ -1,3 +1,4 @@
1
+ export declare const KEY_OPENAPI = "hyper:openapi";
1
2
  export declare const OPENAPI_VERSION = "3.0.0";
2
3
  export declare const INFO_TITLE = "openapi:info:title";
3
4
  export declare const INFO_DESCRIPTION = "openapi:info:description";
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
- // constants.ts
3
2
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.SECURITY_OIDC = exports.SECURITY_OAUTH2 = exports.SECURITY_API_KEY = exports.COMPONENTS_SECURITY_SCHEMES = exports.COMPONENTS_PARAMETERS = exports.COMPONENTS_RESPONSES = exports.COMPONENTS_SCHEMAS = exports.COMPONENTS = exports.METHOD_TAGS = exports.METHOD_OPERATION_ID = exports.METHOD_SUMMARY = exports.METHOD_METADATA = exports.TAG_DESCRIPTION = exports.TAG_NAME = exports.TAGS = exports.SECURITY_SCHEME = exports.SECURITY = exports.RESPONSE_SCHEMA = exports.RESPONSE_CONTENT = exports.RESPONSE_DESCRIPTION = exports.RESPONSES = exports.REQUEST_BODY_CONTENT = exports.REQUEST_BODY_DESCRIPTION = exports.REQUEST_BODY = exports.PARAM_SCHEMA = exports.PARAM_DESCRIPTION = exports.PARAM_REQUIRED = exports.PARAM_IN = exports.PARAM_NAME = exports.PARAMETERS = exports.METHOD_TRACE = exports.METHOD_OPTIONS = exports.METHOD_HEAD = exports.METHOD_PATCH = exports.METHOD_DELETE = exports.METHOD_PUT = exports.METHOD_POST = exports.METHOD_GET = exports.PATHS = exports.INFO_LICENSE = exports.INFO_CONTACT = exports.INFO_TERMS_OF_SERVICE = exports.INFO_VERSION = exports.INFO_DESCRIPTION = exports.INFO_TITLE = exports.OPENAPI_VERSION = void 0;
3
+ exports.SECURITY_OIDC = exports.SECURITY_OAUTH2 = exports.SECURITY_API_KEY = exports.COMPONENTS_SECURITY_SCHEMES = exports.COMPONENTS_PARAMETERS = exports.COMPONENTS_RESPONSES = exports.COMPONENTS_SCHEMAS = exports.COMPONENTS = exports.METHOD_TAGS = exports.METHOD_OPERATION_ID = exports.METHOD_SUMMARY = exports.METHOD_METADATA = exports.TAG_DESCRIPTION = exports.TAG_NAME = exports.TAGS = exports.SECURITY_SCHEME = exports.SECURITY = exports.RESPONSE_SCHEMA = exports.RESPONSE_CONTENT = exports.RESPONSE_DESCRIPTION = exports.RESPONSES = exports.REQUEST_BODY_CONTENT = exports.REQUEST_BODY_DESCRIPTION = exports.REQUEST_BODY = exports.PARAM_SCHEMA = exports.PARAM_DESCRIPTION = exports.PARAM_REQUIRED = exports.PARAM_IN = exports.PARAM_NAME = exports.PARAMETERS = exports.METHOD_TRACE = exports.METHOD_OPTIONS = exports.METHOD_HEAD = exports.METHOD_PATCH = exports.METHOD_DELETE = exports.METHOD_PUT = exports.METHOD_POST = exports.METHOD_GET = exports.PATHS = exports.INFO_LICENSE = exports.INFO_CONTACT = exports.INFO_TERMS_OF_SERVICE = exports.INFO_VERSION = exports.INFO_DESCRIPTION = exports.INFO_TITLE = exports.OPENAPI_VERSION = exports.KEY_OPENAPI = void 0;
4
+ exports.KEY_OPENAPI = "hyper:openapi";
5
5
  // OpenAPI Version
6
6
  exports.OPENAPI_VERSION = "3.0.0";
7
7
  // Info Metadata (Información general sobre la API)
@@ -0,0 +1,16 @@
1
+ import { Tag, OpenApiResponses, OpenApiParameter, RequestBody, SecurityRequirement, Operation } from "./types";
2
+ /**
3
+ * 📝 OpenAPI Decorators consolidated for better performance and clean imports.
4
+ */
5
+ export declare function ApiSummary(summary: string): (target: any, propertyKey: any) => void;
6
+ export declare function ApiDescription(description: string): (target: any, propertyKey: any) => void;
7
+ export declare function ApiOperationId(operationId: string): (target: any, propertyKey: any) => void;
8
+ export declare function ApiTag(options: Tag | string): (target: any, propertyKey?: any) => void;
9
+ export declare function ApiResponse(options: OpenApiResponses): (target: any, propertyKey?: any) => void;
10
+ export declare function ApiParameter(options: OpenApiParameter): (target: any, propertyKey: any) => void;
11
+ export declare function ApiRequestBody(options: RequestBody): (target: any, propertyKey: any) => void;
12
+ export declare function ApiSecurity(options: SecurityRequirement): (target: any, propertyKey?: any) => void;
13
+ export declare function ApiBearerAuth(name?: string): (target: any, propertyKey?: any) => void;
14
+ export declare function ApiMethod(options: Partial<Operation>): (target: any, propertyKey: any) => void;
15
+ export declare function ApiNamespace(name: string): (target: any, propertyKey?: any) => void;
16
+ export declare function ApiIgnore(): (target: any, propertyKey?: any) => void;