@nestia/core 3.0.5 → 3.1.0-dev.20240426
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/lib/adaptors/WebSocketAdaptor.d.ts +21 -0
- package/lib/adaptors/WebSocketAdaptor.js +277 -0
- package/lib/adaptors/WebSocketAdaptor.js.map +1 -0
- package/lib/decorators/DynamicModule.js +12 -59
- package/lib/decorators/DynamicModule.js.map +1 -1
- package/lib/decorators/EncryptedBody.js +36 -73
- package/lib/decorators/EncryptedBody.js.map +1 -1
- package/lib/decorators/EncryptedController.js +2 -2
- package/lib/decorators/EncryptedController.js.map +1 -1
- package/lib/decorators/EncryptedModule.js +24 -107
- package/lib/decorators/EncryptedModule.js.map +1 -1
- package/lib/decorators/EncryptedRoute.js +43 -119
- package/lib/decorators/EncryptedRoute.js.map +1 -1
- package/lib/decorators/PlainBody.js +24 -61
- package/lib/decorators/PlainBody.js.map +1 -1
- package/lib/decorators/SwaggerCustomizer.js +2 -2
- package/lib/decorators/SwaggerCustomizer.js.map +1 -1
- package/lib/decorators/TypedBody.js +12 -14
- package/lib/decorators/TypedBody.js.map +1 -1
- package/lib/decorators/TypedException.js +5 -5
- package/lib/decorators/TypedException.js.map +1 -1
- package/lib/decorators/TypedFormData.js +88 -291
- package/lib/decorators/TypedFormData.js.map +1 -1
- package/lib/decorators/TypedHeaders.js +6 -6
- package/lib/decorators/TypedHeaders.js.map +1 -1
- package/lib/decorators/TypedParam.d.ts +5 -6
- package/lib/decorators/TypedParam.js +14 -15
- package/lib/decorators/TypedParam.js.map +1 -1
- package/lib/decorators/TypedQuery.d.ts +2 -2
- package/lib/decorators/TypedQuery.js +52 -129
- package/lib/decorators/TypedQuery.js.map +1 -1
- package/lib/decorators/TypedRoute.js +31 -107
- package/lib/decorators/TypedRoute.js.map +1 -1
- package/lib/decorators/WebSocketRoute.d.ts +120 -0
- package/lib/decorators/WebSocketRoute.js +202 -0
- package/lib/decorators/WebSocketRoute.js.map +1 -0
- package/lib/decorators/internal/IWebSocketRouteReflect.d.ts +25 -0
- package/lib/decorators/internal/IWebSocketRouteReflect.js +3 -0
- package/lib/decorators/internal/IWebSocketRouteReflect.js.map +1 -0
- package/lib/decorators/internal/NoTransformConfigureError.js +1 -1
- package/lib/decorators/internal/NoTransformConfigureError.js.map +1 -1
- package/lib/decorators/internal/get_path_and_querify.js +67 -131
- package/lib/decorators/internal/get_path_and_querify.js.map +1 -1
- package/lib/decorators/internal/get_path_and_stringify.js +57 -71
- package/lib/decorators/internal/get_path_and_stringify.js.map +1 -1
- package/lib/decorators/internal/get_text_body.js +7 -46
- package/lib/decorators/internal/get_text_body.js.map +1 -1
- package/lib/decorators/internal/headers_to_object.js +3 -42
- package/lib/decorators/internal/headers_to_object.js.map +1 -1
- package/lib/decorators/internal/load_controller.js +29 -106
- package/lib/decorators/internal/load_controller.js.map +1 -1
- package/lib/decorators/internal/route_error.js +15 -65
- package/lib/decorators/internal/route_error.js.map +1 -1
- package/lib/decorators/internal/validate_request_body.js +44 -54
- package/lib/decorators/internal/validate_request_body.js.map +1 -1
- package/lib/decorators/internal/validate_request_form_data.js +36 -44
- package/lib/decorators/internal/validate_request_form_data.js.map +1 -1
- package/lib/decorators/internal/validate_request_headers.js +36 -44
- package/lib/decorators/internal/validate_request_headers.js.map +1 -1
- package/lib/decorators/internal/validate_request_query.js +36 -44
- package/lib/decorators/internal/validate_request_query.js.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/module.d.ts +10 -9
- package/lib/module.js +10 -9
- package/lib/module.js.map +1 -1
- package/lib/programmers/PlainBodyProgrammer.js +29 -44
- package/lib/programmers/PlainBodyProgrammer.js.map +1 -1
- package/lib/programmers/TypedBodyProgrammer.js +57 -82
- package/lib/programmers/TypedBodyProgrammer.js.map +1 -1
- package/lib/programmers/TypedExceptionProgrammer.js +51 -54
- package/lib/programmers/TypedExceptionProgrammer.js.map +1 -1
- package/lib/programmers/TypedFormDataBodyProgrammer.js +50 -73
- package/lib/programmers/TypedFormDataBodyProgrammer.js.map +1 -1
- package/lib/programmers/TypedHeadersProgrammer.js +24 -43
- package/lib/programmers/TypedHeadersProgrammer.js.map +1 -1
- package/lib/programmers/TypedParamProgrammer.js +11 -28
- package/lib/programmers/TypedParamProgrammer.js.map +1 -1
- package/lib/programmers/TypedQueryBodyProgrammer.js +24 -43
- package/lib/programmers/TypedQueryBodyProgrammer.js.map +1 -1
- package/lib/programmers/TypedQueryProgrammer.js +24 -43
- package/lib/programmers/TypedQueryProgrammer.js.map +1 -1
- package/lib/programmers/TypedQueryRouteProgrammer.js +22 -39
- package/lib/programmers/TypedQueryRouteProgrammer.js.map +1 -1
- package/lib/programmers/TypedRouteProgrammer.js +22 -39
- package/lib/programmers/TypedRouteProgrammer.js.map +1 -1
- package/lib/programmers/http/HttpAssertQuerifyProgrammer.js +12 -29
- package/lib/programmers/http/HttpAssertQuerifyProgrammer.js.map +1 -1
- package/lib/programmers/http/HttpIsQuerifyProgrammer.js +10 -27
- package/lib/programmers/http/HttpIsQuerifyProgrammer.js.map +1 -1
- package/lib/programmers/http/HttpQuerifyProgrammer.js +33 -69
- package/lib/programmers/http/HttpQuerifyProgrammer.js.map +1 -1
- package/lib/programmers/http/HttpValidateQuerifyProgrammer.js +11 -28
- package/lib/programmers/http/HttpValidateQuerifyProgrammer.js.map +1 -1
- package/lib/programmers/internal/CoreMetadataUtil.js +12 -37
- package/lib/programmers/internal/CoreMetadataUtil.js.map +1 -1
- package/lib/transform.js +8 -8
- package/lib/transform.js.map +1 -1
- package/lib/transformers/FileTransformer.js +35 -66
- package/lib/transformers/FileTransformer.js.map +1 -1
- package/lib/transformers/MethodTransformer.js +36 -50
- package/lib/transformers/MethodTransformer.js.map +1 -1
- package/lib/transformers/NodeTransformer.js +8 -12
- package/lib/transformers/NodeTransformer.js.map +1 -1
- package/lib/transformers/ParameterDecoratorTransformer.js +75 -90
- package/lib/transformers/ParameterDecoratorTransformer.js.map +1 -1
- package/lib/transformers/ParameterTransformer.js +18 -24
- package/lib/transformers/ParameterTransformer.js.map +1 -1
- package/lib/transformers/TypedExceptionTransformer.js +25 -27
- package/lib/transformers/TypedExceptionTransformer.js.map +1 -1
- package/lib/transformers/TypedRouteTransformer.js +52 -88
- package/lib/transformers/TypedRouteTransformer.js.map +1 -1
- package/lib/utils/ArrayUtil.d.ts +3 -0
- package/lib/utils/ArrayUtil.js +11 -0
- package/lib/utils/ArrayUtil.js.map +1 -0
- package/lib/utils/ExceptionManager.js +9 -31
- package/lib/utils/ExceptionManager.js.map +1 -1
- package/lib/utils/Singleton.js +6 -7
- package/lib/utils/Singleton.js.map +1 -1
- package/lib/utils/SourceFinder.js +38 -215
- package/lib/utils/SourceFinder.js.map +1 -1
- package/lib/utils/VersioningStrategy.d.ts +9 -0
- package/lib/utils/VersioningStrategy.js +17 -0
- package/lib/utils/VersioningStrategy.js.map +1 -0
- package/package.json +9 -5
- package/src/adaptors/WebSocketAdaptor.ts +414 -0
- package/src/decorators/TypedParam.ts +5 -6
- package/src/decorators/TypedQuery.ts +251 -251
- package/src/decorators/WebSocketRoute.ts +249 -0
- package/src/decorators/internal/IWebSocketRouteReflect.ts +23 -0
- package/src/decorators/internal/validate_request_body.ts +72 -72
- package/src/decorators/internal/validate_request_form_data.ts +75 -75
- package/src/decorators/internal/validate_request_headers.ts +83 -83
- package/src/decorators/internal/validate_request_query.ts +71 -71
- package/src/module.ts +20 -16
- package/src/transformers/ParameterDecoratorTransformer.ts +129 -120
- package/src/typings/get-function-location.d.ts +7 -0
- package/src/utils/ArrayUtil.ts +7 -0
- package/src/utils/VersioningStrategy.ts +27 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.WebSocketRoute = void 0;
|
|
7
|
+
const typia_1 = __importDefault(require("typia"));
|
|
8
|
+
const NoTransformConfigureError_1 = require("./internal/NoTransformConfigureError");
|
|
9
|
+
const validate_request_body_1 = require("./internal/validate_request_body");
|
|
10
|
+
const validate_request_query_1 = require("./internal/validate_request_query");
|
|
11
|
+
/**
|
|
12
|
+
* WebSocket route decorator.
|
|
13
|
+
*
|
|
14
|
+
* `@WebSocketRoute` is a route decorator function for WebSocket routes.
|
|
15
|
+
* If you want to define a WebSocket route with this `@WebSocketRoute` decorator,
|
|
16
|
+
* please don't forget to call the {@link WebSocketAdaptor.upgrade} function
|
|
17
|
+
* to the {@link INestApplication} instance.
|
|
18
|
+
*
|
|
19
|
+
* Also, `WebSocketRoute` is a module containing parameter decorator
|
|
20
|
+
* functions of below for the `@WebSocketRoute` decorated method, at the same
|
|
21
|
+
* time. Note that, every parameters must be decorated by one of the parameter
|
|
22
|
+
* decorators in the `WebSocketRoute` module. One thing more important is,
|
|
23
|
+
* {@link WebSocketRoute.Acceptor} decorated parameter must be defined in the
|
|
24
|
+
* method. If not, it would be both compilation/runtime error.
|
|
25
|
+
*
|
|
26
|
+
* - {@link WebSocketRoute.Acceptor}
|
|
27
|
+
* - {@link WebSocketRoute.Driver}
|
|
28
|
+
* - {@link WebSocketRoute.Header}
|
|
29
|
+
* - {@link WebSocketRoute.Param}
|
|
30
|
+
* - {@link WebSocketRoute.Query}
|
|
31
|
+
*
|
|
32
|
+
* For reference, key difference between `@WebSocketGateway()` of NestJS and
|
|
33
|
+
* `@WebSocketRoute()` of Nestia is, `@WebSocketRoute()` can make multiple
|
|
34
|
+
* WebSocket routes by configuring *paths*, besides `@WebSocketGateway()`
|
|
35
|
+
* can't do it.
|
|
36
|
+
*
|
|
37
|
+
* Furthermore, if you build SDK (Software Development Kit) library through
|
|
38
|
+
* `@nestia/sdk`, you can make safe WebSocket client taking advantages of
|
|
39
|
+
* TypeScript type hints and checkings.
|
|
40
|
+
*
|
|
41
|
+
* @param path Path(s) of the WebSocket request
|
|
42
|
+
* @returns Method decorator
|
|
43
|
+
* @author Jeongho Nam - https://github.com/samchon
|
|
44
|
+
*/
|
|
45
|
+
function WebSocketRoute(path) {
|
|
46
|
+
return function WebSocketRoute(_target, _propertyKey, descriptor) {
|
|
47
|
+
Reflect.defineMetadata("nestia/WebSocketRoute", {
|
|
48
|
+
paths: path === undefined ? [] : Array.isArray(path) ? path : [path],
|
|
49
|
+
}, descriptor.value);
|
|
50
|
+
return descriptor;
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
exports.WebSocketRoute = WebSocketRoute;
|
|
54
|
+
(function (WebSocketRoute) {
|
|
55
|
+
/**
|
|
56
|
+
* Acceptor parameter decorator.
|
|
57
|
+
*
|
|
58
|
+
* `@WebSocketRoute.Acceptor()` is a parameter decorator function for the
|
|
59
|
+
* `WebAcceptor<Header, Provider, Listener>` (of `tgrid`) typed parameter.
|
|
60
|
+
*
|
|
61
|
+
* In the controller method decorated by `@WebSocketRoute()` and
|
|
62
|
+
* `@WebSocketRoute.Acceptor()`, call {@link WebAcceptor.accept} function
|
|
63
|
+
* with `Provider` instance when you want to accept the WebSocket client
|
|
64
|
+
* connection. Otherwise you want to reject the connection, call
|
|
65
|
+
* {@link WebSocketAcceptor.rejcet} function instead.
|
|
66
|
+
*
|
|
67
|
+
* For reference, this `@WebSocketRoute.Acceptor()` parameter decorator is
|
|
68
|
+
* essential for the method decorated by `@WebSocketRoute()` decorator.
|
|
69
|
+
* If you forget it, it would be both compilation/runtime error.
|
|
70
|
+
*/
|
|
71
|
+
function Acceptor() {
|
|
72
|
+
return function WebSocketAcceptor(target, propertyKey, parameterIndex) {
|
|
73
|
+
emplace(target, propertyKey !== null && propertyKey !== void 0 ? propertyKey : "", {
|
|
74
|
+
category: "acceptor",
|
|
75
|
+
index: parameterIndex,
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
WebSocketRoute.Acceptor = Acceptor;
|
|
80
|
+
/**
|
|
81
|
+
* Driver parameter decorator.
|
|
82
|
+
*
|
|
83
|
+
* `@WebSocketRoute.Driver()` is a parameter decorator function for the
|
|
84
|
+
* `Driver<Listener>` (of `tgrid`) typed parameter.
|
|
85
|
+
*
|
|
86
|
+
* With the `@WebSocketRoute.Driver()` decorated parameter, you can call
|
|
87
|
+
* function of `Listener` typed instance provided by remote WebSocket client
|
|
88
|
+
* by calling the `Driver<Listener>` instance.
|
|
89
|
+
*
|
|
90
|
+
* For reference, this `@WebSocketRoute.Driver()` decorator is optional, and
|
|
91
|
+
* can be substituted by `@WebSocketRoute.Acceptor()` decorated parameter
|
|
92
|
+
* by calling the {@link WebAcceptor.getDriver} function.
|
|
93
|
+
*/
|
|
94
|
+
function Driver() {
|
|
95
|
+
return function WebSocketDriver(target, propertyKey, parameterIndex) {
|
|
96
|
+
emplace(target, propertyKey !== null && propertyKey !== void 0 ? propertyKey : "", {
|
|
97
|
+
category: "driver",
|
|
98
|
+
index: parameterIndex,
|
|
99
|
+
});
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
WebSocketRoute.Driver = Driver;
|
|
103
|
+
/**
|
|
104
|
+
* Header decorator.
|
|
105
|
+
*
|
|
106
|
+
* `@WebSocketRoute.Header()` is a parameter decorator function for the
|
|
107
|
+
* WebSocket header with type casting and assertion.
|
|
108
|
+
*
|
|
109
|
+
* For reference, `@WebSocketRoute.Header()` is different with HTTP headers.
|
|
110
|
+
* It's for WebSocket protocol, especially for TGrid's {@link WebConnector}
|
|
111
|
+
* and {@link WebAcceptor}'s special header.
|
|
112
|
+
*
|
|
113
|
+
* Also, this `@WebSocketRoute.Header()` decorator is optional, and
|
|
114
|
+
* can be substituted by `@WebSocketRoute.Acceptor()` decorated parameter
|
|
115
|
+
* by accessting to the {@link WebAcceptor.header} property.
|
|
116
|
+
*/
|
|
117
|
+
function Header(validator) {
|
|
118
|
+
const validate = (0, validate_request_body_1.validate_request_body)("WebSocketRoute.Header")(validator);
|
|
119
|
+
return function WebSocketHeader(target, propertyKey, parameterIndex) {
|
|
120
|
+
emplace(target, propertyKey !== null && propertyKey !== void 0 ? propertyKey : "", {
|
|
121
|
+
category: "header",
|
|
122
|
+
index: parameterIndex,
|
|
123
|
+
validate,
|
|
124
|
+
});
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
WebSocketRoute.Header = Header;
|
|
128
|
+
Object.assign(Header, typia_1.default.is);
|
|
129
|
+
Object.assign(Header, typia_1.default.assert);
|
|
130
|
+
Object.assign(Header, typia_1.default.validate);
|
|
131
|
+
/**
|
|
132
|
+
* URL parameter decorator.
|
|
133
|
+
*
|
|
134
|
+
* `@WebSocketRoute.Param()` is a parameter decorator function for the URL
|
|
135
|
+
* parameter with type casting and assertion.
|
|
136
|
+
*
|
|
137
|
+
* It's almost same with the {@link TypedParam}, but
|
|
138
|
+
* `@WebSocketRoute.Param()` is only for WebSocket protocol router function
|
|
139
|
+
* decorated by {@link WebSocketRoute}.
|
|
140
|
+
*
|
|
141
|
+
* @param field URL parameter field name
|
|
142
|
+
*/
|
|
143
|
+
function Param(field, assert) {
|
|
144
|
+
if (assert === undefined)
|
|
145
|
+
throw (0, NoTransformConfigureError_1.NoTransformConfigureError)("WebSocketRoute.Param");
|
|
146
|
+
return function WebSocketParam(target, propertyKey, parameterIndex) {
|
|
147
|
+
emplace(target, propertyKey !== null && propertyKey !== void 0 ? propertyKey : "", {
|
|
148
|
+
category: "param",
|
|
149
|
+
index: parameterIndex,
|
|
150
|
+
field,
|
|
151
|
+
assert,
|
|
152
|
+
});
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
WebSocketRoute.Param = Param;
|
|
156
|
+
Object.assign(Param, typia_1.default.http.parameter);
|
|
157
|
+
/**
|
|
158
|
+
* URL query decorator.
|
|
159
|
+
*
|
|
160
|
+
* `@WebSocketRoute.Query()` is a parameter decorator function for the URL
|
|
161
|
+
* query string with type casting and assertion.
|
|
162
|
+
*
|
|
163
|
+
* It is almost same with {@link TypedQuery}, but
|
|
164
|
+
* `@WebSocketRoute.Query()` is only for WebSocket protocol router function
|
|
165
|
+
* decorated by {@link WebSocketRoute}.
|
|
166
|
+
*
|
|
167
|
+
* For reference, as same with {@link TypedQuery}, `@WebSocketRoute.Query()`
|
|
168
|
+
* has same restriction for the target type `T`. If actual URL query
|
|
169
|
+
* parameter values are different with their promised type `T`,
|
|
170
|
+
* it would be runtime error.
|
|
171
|
+
*
|
|
172
|
+
* 1. Type `T` must be an object type
|
|
173
|
+
* 2. Do not allow dynamic property
|
|
174
|
+
* 3. Only `boolean`, `bigint`, `number`, `string` or their array types are allowed
|
|
175
|
+
* 4. By the way, union type never be not allowed
|
|
176
|
+
*/
|
|
177
|
+
function Query(validator) {
|
|
178
|
+
const validate = (0, validate_request_query_1.validate_request_query)("WebSocketRoute.Query")(validator);
|
|
179
|
+
return function WebSocketQuery(target, propertyKey, parameterIndex) {
|
|
180
|
+
emplace(target, propertyKey !== null && propertyKey !== void 0 ? propertyKey : "", {
|
|
181
|
+
category: "query",
|
|
182
|
+
index: parameterIndex,
|
|
183
|
+
validate,
|
|
184
|
+
});
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
WebSocketRoute.Query = Query;
|
|
188
|
+
Object.assign(Query, typia_1.default.http.assertQuery);
|
|
189
|
+
Object.assign(Query, typia_1.default.http.isQuery);
|
|
190
|
+
Object.assign(Query, typia_1.default.http.validateQuery);
|
|
191
|
+
/**
|
|
192
|
+
* @internal
|
|
193
|
+
*/
|
|
194
|
+
const emplace = (target, propertyKey, value) => {
|
|
195
|
+
const array = Reflect.getMetadata("nestia/WebSocketRoute/Parameters", target, propertyKey);
|
|
196
|
+
if (array !== undefined)
|
|
197
|
+
array.push(value);
|
|
198
|
+
else
|
|
199
|
+
Reflect.defineMetadata("nestia/WebSocketRoute/Parameters", [value], target, propertyKey);
|
|
200
|
+
};
|
|
201
|
+
})(WebSocketRoute || (exports.WebSocketRoute = WebSocketRoute = {}));
|
|
202
|
+
//# sourceMappingURL=WebSocketRoute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebSocketRoute.js","sourceRoot":"","sources":["../../src/decorators/WebSocketRoute.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface IWebSocketRouteReflect {
|
|
2
|
+
paths: string[];
|
|
3
|
+
}
|
|
4
|
+
export declare namespace IWebSocketRouteReflect {
|
|
5
|
+
export type IArgument = IAcceptor | IDriver | IHeader | IParam | IQuery;
|
|
6
|
+
export interface IAcceptor extends IBase<"acceptor"> {
|
|
7
|
+
}
|
|
8
|
+
export interface IDriver extends IBase<"driver"> {
|
|
9
|
+
}
|
|
10
|
+
export interface IHeader extends IBase<"header"> {
|
|
11
|
+
validate: (input?: any) => Error | null;
|
|
12
|
+
}
|
|
13
|
+
export interface IParam extends IBase<"param"> {
|
|
14
|
+
field: string;
|
|
15
|
+
assert: (value: string) => any;
|
|
16
|
+
}
|
|
17
|
+
export interface IQuery extends IBase<"query"> {
|
|
18
|
+
validate: (input: URLSearchParams) => any | Error;
|
|
19
|
+
}
|
|
20
|
+
interface IBase<Category extends string> {
|
|
21
|
+
category: Category;
|
|
22
|
+
index: number;
|
|
23
|
+
}
|
|
24
|
+
export {};
|
|
25
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IWebSocketRouteReflect.js","sourceRoot":"","sources":["../../../src/decorators/internal/IWebSocketRouteReflect.ts"],"names":[],"mappings":""}
|
|
@@ -5,7 +5,7 @@ exports.NoTransformConfigureError = void 0;
|
|
|
5
5
|
* @internal
|
|
6
6
|
*/
|
|
7
7
|
function NoTransformConfigureError(method) {
|
|
8
|
-
return new Error(
|
|
8
|
+
return new Error(`Error on nestia.core.${method}(): no transform has been configured. Run "npx typia setup" command, or check if you're using non-standard TypeScript compiler like Babel or SWC.`);
|
|
9
9
|
}
|
|
10
10
|
exports.NoTransformConfigureError = NoTransformConfigureError;
|
|
11
11
|
//# sourceMappingURL=NoTransformConfigureError.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NoTransformConfigureError.js","sourceRoot":"","sources":["../../../src/decorators/internal/NoTransformConfigureError.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,SAAgB,yBAAyB,CAAC,MAAc;IACtD,OAAO,IAAI,KAAK,CACd
|
|
1
|
+
{"version":3,"file":"NoTransformConfigureError.js","sourceRoot":"","sources":["../../../src/decorators/internal/NoTransformConfigureError.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,SAAgB,yBAAyB,CAAC,MAAc;IACtD,OAAO,IAAI,KAAK,CACd,wBAAwB,MAAM,mJAAmJ,CAClL,CAAC;AACJ,CAAC;AAJD,8DAIC"}
|
|
@@ -1,167 +1,103 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __values = (this && this.__values) || function(o) {
|
|
3
|
-
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
4
|
-
if (m) return m.call(o);
|
|
5
|
-
if (o && typeof o.length === "number") return {
|
|
6
|
-
next: function () {
|
|
7
|
-
if (o && i >= o.length) o = void 0;
|
|
8
|
-
return { value: o && o[i++], done: !o };
|
|
9
|
-
}
|
|
10
|
-
};
|
|
11
|
-
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
12
|
-
};
|
|
13
|
-
var __read = (this && this.__read) || function (o, n) {
|
|
14
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
15
|
-
if (!m) return o;
|
|
16
|
-
var i = m.call(o), r, ar = [], e;
|
|
17
|
-
try {
|
|
18
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
19
|
-
}
|
|
20
|
-
catch (error) { e = { error: error }; }
|
|
21
|
-
finally {
|
|
22
|
-
try {
|
|
23
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
24
|
-
}
|
|
25
|
-
finally { if (e) throw e.error; }
|
|
26
|
-
}
|
|
27
|
-
return ar;
|
|
28
|
-
};
|
|
29
2
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
30
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
31
4
|
};
|
|
32
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
33
6
|
exports.get_path_and_querify = void 0;
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
7
|
+
const common_1 = require("@nestjs/common");
|
|
8
|
+
const typia_1 = __importDefault(require("typia"));
|
|
9
|
+
const NoTransformConfigureError_1 = require("./NoTransformConfigureError");
|
|
37
10
|
/**
|
|
38
11
|
* @internal
|
|
39
12
|
*/
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
Array.isArray(args[0])
|
|
49
|
-
? args[0]
|
|
50
|
-
: null;
|
|
51
|
-
var functor = path === null ? args[0] : args[1];
|
|
52
|
-
return [path !== null && path !== void 0 ? path : undefined, take(method)(functor)];
|
|
53
|
-
};
|
|
13
|
+
const get_path_and_querify = (method) => (...args) => {
|
|
14
|
+
const path = args[0] === undefined ||
|
|
15
|
+
typeof args[0] === "string" ||
|
|
16
|
+
Array.isArray(args[0])
|
|
17
|
+
? args[0]
|
|
18
|
+
: null;
|
|
19
|
+
const functor = path === null ? args[0] : args[1];
|
|
20
|
+
return [path !== null && path !== void 0 ? path : undefined, take(method)(functor)];
|
|
54
21
|
};
|
|
55
22
|
exports.get_path_and_querify = get_path_and_querify;
|
|
56
23
|
/**
|
|
57
24
|
* @internal
|
|
58
25
|
*/
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
throw new Error("Error on nestia.core.".concat(method, "(): invalid typed stringify function."));
|
|
74
|
-
};
|
|
26
|
+
const take = (method) => (functor) => {
|
|
27
|
+
if (functor === undefined)
|
|
28
|
+
throw (0, NoTransformConfigureError_1.NoTransformConfigureError)(method);
|
|
29
|
+
else if (functor === null)
|
|
30
|
+
return querify;
|
|
31
|
+
else if (functor.type === "stringify")
|
|
32
|
+
return functor.stringify;
|
|
33
|
+
else if (functor.type === "assert")
|
|
34
|
+
return assert(functor.assert);
|
|
35
|
+
else if (functor.type === "is")
|
|
36
|
+
return is(functor.is);
|
|
37
|
+
else if (functor.type === "validate")
|
|
38
|
+
return validate(functor.validate);
|
|
39
|
+
throw new Error(`Error on nestia.core.${method}(): invalid typed stringify function.`);
|
|
75
40
|
};
|
|
76
41
|
/**
|
|
77
42
|
* @internal
|
|
78
43
|
*/
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
for (var value_1 = (e_2 = void 0, __values(value)), value_1_1 = value_1.next(); !value_1_1.done; value_1_1 = value_1.next()) {
|
|
90
|
-
var elem = value_1_1.value;
|
|
91
|
-
output.append(key, String(elem));
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
95
|
-
finally {
|
|
96
|
-
try {
|
|
97
|
-
if (value_1_1 && !value_1_1.done && (_b = value_1.return)) _b.call(value_1);
|
|
98
|
-
}
|
|
99
|
-
finally { if (e_2) throw e_2.error; }
|
|
100
|
-
}
|
|
101
|
-
else
|
|
102
|
-
output.append(key, String(value));
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
106
|
-
finally {
|
|
107
|
-
try {
|
|
108
|
-
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
109
|
-
}
|
|
110
|
-
finally { if (e_1) throw e_1.error; }
|
|
111
|
-
}
|
|
44
|
+
const querify = (input) => {
|
|
45
|
+
const output = new URLSearchParams();
|
|
46
|
+
for (const [key, value] of Object.entries(input))
|
|
47
|
+
if (key === undefined)
|
|
48
|
+
continue;
|
|
49
|
+
else if (Array.isArray(value))
|
|
50
|
+
for (const elem of value)
|
|
51
|
+
output.append(key, String(elem));
|
|
52
|
+
else
|
|
53
|
+
output.append(key, String(value));
|
|
112
54
|
return output;
|
|
113
55
|
};
|
|
114
56
|
/**
|
|
115
57
|
* @internal
|
|
116
58
|
*/
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
}
|
|
136
|
-
};
|
|
59
|
+
const assert = (closure) => (data) => {
|
|
60
|
+
try {
|
|
61
|
+
return closure(data);
|
|
62
|
+
}
|
|
63
|
+
catch (exp) {
|
|
64
|
+
if ((input => {
|
|
65
|
+
const $io0 = input => "string" === typeof input.method && (undefined === input.path || "string" === typeof input.path) && "string" === typeof input.expected && true && "string" === typeof input.name && "string" === typeof input.message && (undefined === input.stack || "string" === typeof input.stack);
|
|
66
|
+
return "object" === typeof input && null !== input && $io0(input);
|
|
67
|
+
})(exp))
|
|
68
|
+
throw new common_1.InternalServerErrorException({
|
|
69
|
+
path: exp.path,
|
|
70
|
+
reason: exp.message,
|
|
71
|
+
expected: exp.expected,
|
|
72
|
+
value: exp.value,
|
|
73
|
+
message: MESSAGE,
|
|
74
|
+
});
|
|
75
|
+
throw exp;
|
|
76
|
+
}
|
|
137
77
|
};
|
|
138
78
|
/**
|
|
139
79
|
* @internal
|
|
140
80
|
*/
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
return result;
|
|
147
|
-
};
|
|
81
|
+
const is = (closure) => (data) => {
|
|
82
|
+
const result = closure(data);
|
|
83
|
+
if (result === null)
|
|
84
|
+
throw new common_1.InternalServerErrorException(MESSAGE);
|
|
85
|
+
return result;
|
|
148
86
|
};
|
|
149
87
|
/**
|
|
150
88
|
* @internal
|
|
151
89
|
*/
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
return result.data;
|
|
161
|
-
};
|
|
90
|
+
const validate = (closure) => (data) => {
|
|
91
|
+
const result = closure(data);
|
|
92
|
+
if (result.success === false)
|
|
93
|
+
throw new common_1.InternalServerErrorException({
|
|
94
|
+
errors: result.errors,
|
|
95
|
+
message: MESSAGE,
|
|
96
|
+
});
|
|
97
|
+
return result.data;
|
|
162
98
|
};
|
|
163
99
|
/**
|
|
164
100
|
* @internal
|
|
165
101
|
*/
|
|
166
|
-
|
|
102
|
+
const MESSAGE = "Response body data is not following the promised type.";
|
|
167
103
|
//# sourceMappingURL=get_path_and_querify.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get_path_and_querify.js","sourceRoot":"","sources":["../../../src/decorators/internal/get_path_and_querify.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"get_path_and_querify.js","sourceRoot":"","sources":["../../../src/decorators/internal/get_path_and_querify.ts"],"names":[],"mappings":"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"}
|