@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.
- package/.agent/rules/philosophy.md +103 -0
- package/.agent/rules/writing.md +32 -0
- package/README.md +78 -207
- package/dist/__internals/constants.d.ts +1 -62
- package/dist/__internals/constants.js +3 -69
- package/dist/__internals/creators/request.creator.d.ts +1 -10
- package/dist/__internals/creators/request.creator.js +141 -23
- package/dist/__internals/helpers/merge-metadata.d.ts +2 -3
- package/dist/__internals/helpers/merge-metadata.js +31 -7
- package/dist/__internals/helpers/prepare.helper.d.ts +4 -10
- package/dist/__internals/helpers/prepare.helper.js +316 -283
- package/dist/__internals/stores/hyper.store.d.ts +5 -0
- package/dist/__internals/stores/hyper.store.js +5 -0
- package/dist/__internals/stores/index.d.ts +4 -0
- package/dist/__internals/stores/index.js +20 -0
- package/dist/__internals/stores/meta.store.d.ts +34 -0
- package/dist/__internals/stores/meta.store.js +107 -0
- package/dist/__internals/stores/scope.store.d.ts +14 -0
- package/dist/__internals/stores/scope.store.js +29 -0
- package/dist/__internals/stores/serivces.store.d.ts +1 -0
- package/dist/__internals/stores/serivces.store.js +4 -0
- package/dist/__internals/transform/middleware.transform.d.ts +1 -1
- package/dist/__internals/transform/middleware.transform.js +1 -1
- package/dist/__internals/transform/role.transform.d.ts +1 -1
- package/dist/__internals/transform/role.transform.js +4 -4
- package/dist/__internals/transform/scope.transfrom.d.ts +1 -1
- package/dist/__internals/transform/scope.transfrom.js +2 -2
- package/dist/__internals/types.d.ts +53 -4
- package/dist/common/bootstrap.d.ts +6 -2
- package/dist/common/bootstrap.js +44 -10
- package/dist/common/transport.d.ts +1 -0
- package/dist/common/transport.js +27 -14
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +2 -1
- package/dist/decorators/Http.d.ts +3 -43
- package/dist/decorators/Http.js +9 -103
- package/dist/decorators.d.ts +1 -0
- package/dist/decorators.js +17 -0
- package/dist/index.d.ts +6 -5
- package/dist/index.js +6 -5
- package/dist/lib/event/meta.store.d.ts +4 -0
- package/dist/lib/event/meta.store.js +5 -0
- package/dist/lib/openapi/collectors/class.collector.d.ts +5 -9
- package/dist/lib/openapi/collectors/class.collector.js +6 -63
- package/dist/lib/openapi/collectors/index.d.ts +3 -4
- package/dist/lib/openapi/collectors/index.js +0 -1
- package/dist/lib/openapi/collectors/method.collector.d.ts +6 -1
- package/dist/lib/openapi/collectors/method.collector.js +92 -59
- package/dist/lib/openapi/collectors/schema.collector.d.ts +3 -8
- package/dist/lib/openapi/collectors/schema.collector.js +17 -25
- package/dist/lib/openapi/constants.d.ts +1 -0
- package/dist/lib/openapi/constants.js +2 -2
- package/dist/lib/openapi/decorators.d.ts +16 -0
- package/dist/lib/openapi/decorators.js +93 -0
- package/dist/lib/openapi/index.d.ts +29 -5
- package/dist/lib/openapi/index.js +119 -5
- package/dist/lib/openapi/metadata.d.ts +7 -0
- package/dist/lib/openapi/metadata.js +8 -0
- package/dist/lib/openapi/metadata.registry.d.ts +1 -1
- package/dist/lib/server/decorators/File.d.ts +37 -0
- package/dist/lib/server/decorators/File.js +167 -0
- package/dist/lib/server/decorators/Http.d.ts +12 -0
- package/dist/lib/server/decorators/Http.js +56 -0
- package/dist/lib/server/decorators/HyperApp.d.ts +7 -0
- package/dist/lib/server/decorators/HyperApp.js +14 -0
- package/dist/lib/server/decorators/HyperController.d.ts +6 -0
- package/dist/lib/server/decorators/HyperController.js +27 -0
- package/dist/lib/server/decorators/HyperModule.d.ts +6 -0
- package/dist/lib/server/decorators/HyperModule.js +13 -0
- package/dist/lib/server/decorators/HyperService.d.ts +11 -0
- package/dist/lib/server/decorators/HyperService.js +30 -0
- package/dist/lib/server/decorators/Messaging.d.ts +8 -0
- package/dist/lib/server/decorators/Messaging.js +19 -0
- package/dist/lib/server/decorators/Middleware.d.ts +18 -0
- package/dist/lib/server/decorators/Middleware.js +52 -0
- package/dist/lib/server/decorators/Output.d.ts +6 -0
- package/dist/lib/server/decorators/Output.js +14 -0
- package/dist/lib/server/decorators/Pass.d.ts +10 -0
- package/dist/lib/server/decorators/Pass.js +13 -0
- package/dist/lib/server/decorators/Role.d.ts +7 -0
- package/dist/lib/server/decorators/Role.js +14 -0
- package/dist/lib/server/decorators/Routes.d.ts +14 -0
- package/dist/lib/server/decorators/Routes.js +39 -0
- package/dist/lib/server/decorators/Scope.d.ts +7 -0
- package/dist/lib/server/decorators/Scope.js +14 -0
- package/dist/lib/server/decorators/index.d.ts +16 -0
- package/dist/lib/server/decorators/index.js +32 -0
- package/dist/lib/server/decorators/metadata.d.ts +1 -0
- package/dist/lib/server/decorators/metadata.js +5 -0
- package/dist/lib/server/decorators/types.d.ts +125 -0
- package/dist/lib/server/decorators/types.js +6 -0
- package/dist/lib/server/exeptions/DuplicateControllerPathException.d.ts +14 -0
- package/dist/lib/server/exeptions/DuplicateControllerPathException.js +12 -0
- package/dist/lib/server/exeptions/DuplicatedException.d.ts +8 -0
- package/dist/lib/server/exeptions/DuplicatedException.js +12 -0
- package/dist/lib/server/exeptions/DuplicatedHandlerException.d.ts +4 -0
- package/dist/lib/server/exeptions/DuplicatedHandlerException.js +12 -0
- package/dist/lib/server/exeptions/HyperException.d.ts +8 -0
- package/dist/lib/server/exeptions/HyperException.js +14 -0
- package/dist/lib/server/exeptions/HyperFileException.d.ts +4 -0
- package/dist/lib/server/exeptions/HyperFileException.js +12 -0
- package/dist/lib/server/exeptions/MethodNotFountException.d.ts +4 -0
- package/dist/lib/server/exeptions/MethodNotFountException.js +12 -0
- package/dist/lib/server/exeptions/NotPropertyException.d.ts +6 -0
- package/dist/lib/server/exeptions/NotPropertyException.js +16 -0
- package/dist/lib/server/exeptions/NotRoleException.d.ts +6 -0
- package/dist/lib/server/exeptions/NotRoleException.js +17 -0
- package/dist/lib/server/exeptions/NotScopeException.d.ts +7 -0
- package/dist/lib/server/exeptions/NotScopeException.js +18 -0
- package/dist/lib/server/exeptions/WrongPlaceException.d.ts +8 -0
- package/dist/lib/server/exeptions/WrongPlaceException.js +21 -0
- package/dist/lib/server/exeptions/index.d.ts +8 -0
- package/dist/lib/server/exeptions/index.js +18 -0
- package/dist/lib/server/exeptions/types.d.ts +1 -0
- package/dist/lib/server/exeptions/types.js +2 -0
- package/dist/lib/tree/tree.d.ts +36 -0
- package/dist/lib/tree/tree.js +106 -0
- package/package.json +1 -1
- package/scripts/clean.js +55 -55
- package/scripts/test-server.ts +85 -85
- package/vitest.config.mjs +33 -30
- package/vitest.json +0 -0
package/dist/decorators/Http.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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"
|
|
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"
|
|
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
|
-
|
|
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 "./
|
|
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 "./
|
|
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
|
-
|
|
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("./
|
|
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("./
|
|
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);
|
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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("
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
|
2
|
-
export * from
|
|
3
|
-
export * from
|
|
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
|
-
|
|
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
|
-
|
|
5
|
-
const
|
|
6
|
-
const
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
//
|
|
18
|
-
const
|
|
19
|
-
//
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
//
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
|
2
|
-
import { Schema } from "../types";
|
|
1
|
+
import { Schema } from '../types';
|
|
3
2
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
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
|
-
*
|
|
8
|
-
*
|
|
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 (
|
|
12
|
-
return { type:
|
|
9
|
+
if (typeof Target !== 'function') {
|
|
10
|
+
return { type: 'string' };
|
|
13
11
|
}
|
|
14
12
|
const schema = {
|
|
15
|
-
type:
|
|
13
|
+
type: 'object',
|
|
16
14
|
properties: {},
|
|
17
15
|
};
|
|
18
|
-
// Note: Standard
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
//
|
|
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,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;
|