@nestia/core 2.1.8-dev.20231006 → 2.2.0-dev.20231008
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/decorators/TypedQuery.d.ts +3 -0
- package/lib/decorators/TypedQuery.js +56 -0
- package/lib/decorators/TypedQuery.js.map +1 -1
- package/lib/programmers/TypedQueryBodyProgrammer.d.ts +5 -0
- package/lib/programmers/TypedQueryBodyProgrammer.js +51 -0
- package/lib/programmers/TypedQueryBodyProgrammer.js.map +1 -0
- package/lib/transformers/ParameterDecoratorTransformer.js +21 -1
- package/lib/transformers/ParameterDecoratorTransformer.js.map +1 -1
- package/package.json +6 -6
- package/src/decorators/TypedQuery.ts +71 -1
- package/src/programmers/TypedQueryBodyProgrammer.ts +52 -0
- package/src/transformers/ParameterDecoratorTransformer.ts +23 -1
|
@@ -19,3 +19,6 @@ import { IRequestQueryValidator } from "../options/IRequestQueryValidator";
|
|
|
19
19
|
* @author Jeongho Nam - https://github.com/samchon
|
|
20
20
|
*/
|
|
21
21
|
export declare function TypedQuery<T extends object>(validator?: IRequestQueryValidator<T>): ParameterDecorator;
|
|
22
|
+
export declare namespace TypedQuery {
|
|
23
|
+
function Body<T extends object>(validator?: IRequestQueryValidator<T>): ParameterDecorator;
|
|
24
|
+
}
|
|
@@ -40,6 +40,29 @@ function TypedQuery(validator) {
|
|
|
40
40
|
})();
|
|
41
41
|
}
|
|
42
42
|
exports.TypedQuery = TypedQuery;
|
|
43
|
+
(function (TypedQuery) {
|
|
44
|
+
function Body(validator) {
|
|
45
|
+
var checker = (0, validate_request_query_1.validate_request_query)(validator);
|
|
46
|
+
return (0, common_1.createParamDecorator)(function TypedQueryBody(_unknown, context) {
|
|
47
|
+
var request = context
|
|
48
|
+
.switchToHttp()
|
|
49
|
+
.getRequest();
|
|
50
|
+
if (isApplicationQuery(request.headers["content-type"]) === false)
|
|
51
|
+
throw new common_1.BadRequestException("Request body type is not \"application/x-www-form-urlencoded\".");
|
|
52
|
+
var params = request.body instanceof URLSearchParams
|
|
53
|
+
? request.body
|
|
54
|
+
: new FakeURLSearchParams(request.body);
|
|
55
|
+
var output = checker(params);
|
|
56
|
+
if (output instanceof Error)
|
|
57
|
+
throw output;
|
|
58
|
+
return output;
|
|
59
|
+
})();
|
|
60
|
+
}
|
|
61
|
+
TypedQuery.Body = Body;
|
|
62
|
+
Object.assign(Body, typia_1.default.http.assertQuery);
|
|
63
|
+
Object.assign(Body, typia_1.default.http.isQuery);
|
|
64
|
+
Object.assign(Body, typia_1.default.http.validateQuery);
|
|
65
|
+
})(TypedQuery || (exports.TypedQuery = TypedQuery = {}));
|
|
43
66
|
Object.assign(TypedQuery, typia_1.default.http.assertQuery);
|
|
44
67
|
Object.assign(TypedQuery, typia_1.default.http.isQuery);
|
|
45
68
|
Object.assign(TypedQuery, typia_1.default.http.validateQuery);
|
|
@@ -50,4 +73,37 @@ function tail(url) {
|
|
|
50
73
|
var index = url.indexOf("?");
|
|
51
74
|
return index === -1 ? "" : url.substring(index + 1);
|
|
52
75
|
}
|
|
76
|
+
function isApplicationQuery(text) {
|
|
77
|
+
return (text !== undefined &&
|
|
78
|
+
text
|
|
79
|
+
.split(";")
|
|
80
|
+
.map(function (str) { return str.trim(); })
|
|
81
|
+
.some(function (str) { return str === "application/x-www-form-urlencoded"; }));
|
|
82
|
+
}
|
|
83
|
+
var FakeURLSearchParams = /** @class */ (function () {
|
|
84
|
+
function FakeURLSearchParams(target) {
|
|
85
|
+
this.target = target;
|
|
86
|
+
}
|
|
87
|
+
FakeURLSearchParams.prototype.has = function (key) {
|
|
88
|
+
return this.target[key] !== undefined;
|
|
89
|
+
};
|
|
90
|
+
FakeURLSearchParams.prototype.get = function (key) {
|
|
91
|
+
var _a;
|
|
92
|
+
var value = this.target[key];
|
|
93
|
+
return value === undefined
|
|
94
|
+
? null
|
|
95
|
+
: Array.isArray(value)
|
|
96
|
+
? (_a = value[0]) !== null && _a !== void 0 ? _a : null
|
|
97
|
+
: value;
|
|
98
|
+
};
|
|
99
|
+
FakeURLSearchParams.prototype.getAll = function (key) {
|
|
100
|
+
var value = this.target[key];
|
|
101
|
+
return value === undefined
|
|
102
|
+
? []
|
|
103
|
+
: Array.isArray(value)
|
|
104
|
+
? value
|
|
105
|
+
: [value];
|
|
106
|
+
};
|
|
107
|
+
return FakeURLSearchParams;
|
|
108
|
+
}());
|
|
53
109
|
//# sourceMappingURL=TypedQuery.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TypedQuery.js","sourceRoot":"","sources":["../../src/decorators/TypedQuery.ts"],"names":[],"mappings":";;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"TypedQuery.js","sourceRoot":"","sources":["../../src/decorators/TypedQuery.ts"],"names":[],"mappings":";;;;;;AAAA,yCAIwB;AAIxB,gDAA0B;AAG1B,4EAA2E;AAE3E;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAgB,UAAU,CACtB,SAAqC;IAErC,IAAM,OAAO,GAAG,IAAA,+CAAsB,EAAC,SAAS,CAAC,CAAC;IAClD,OAAO,IAAA,6BAAoB,EAAC,SAAS,UAAU,CAC3C,QAAa,EACb,OAAyB;QAEzB,IAAM,OAAO,GAAqC,OAAO;aACpD,YAAY,EAAE;aACd,UAAU,EAAE,CAAC;QAClB,IAAM,MAAM,GAAoB,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAEvE,IAAM,MAAM,GAAc,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,MAAM,YAAY,KAAK;YAAE,MAAM,MAAM,CAAC;QAC1C,OAAO,MAAM,CAAC;IAClB,CAAC,CAAC,EAAE,CAAC;AACT,CAAC;AAjBD,gCAiBC;AACD,WAAiB,UAAU;IACvB,SAAgB,IAAI,CAChB,SAAqC;QAErC,IAAM,OAAO,GAAG,IAAA,+CAAsB,EAAC,SAAS,CAAC,CAAC;QAClD,OAAO,IAAA,6BAAoB,EAAC,SAAS,cAAc,CAC/C,QAAa,EACb,OAAyB;YAEzB,IAAM,OAAO,GAAqC,OAAO;iBACpD,YAAY,EAAE;iBACd,UAAU,EAAE,CAAC;YAClB,IAAI,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,KAAK,KAAK;gBAC7D,MAAM,IAAI,4BAAmB,CACzB,iEAA+D,CAClE,CAAC;YACN,IAAM,MAAM,GACR,OAAO,CAAC,IAAI,YAAY,eAAe;gBACnC,CAAC,CAAC,OAAO,CAAC,IAAI;gBACd,CAAC,CAAE,IAAI,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAS,CAAC;YAEzD,IAAM,MAAM,GAAc,OAAO,CAAC,MAAM,CAAC,CAAC;YAC1C,IAAI,MAAM,YAAY,KAAK;gBAAE,MAAM,MAAM,CAAC;YAC1C,OAAO,MAAM,CAAC;QAClB,CAAC,CAAC,EAAE,CAAC;IACT,CAAC;IAxBe,eAAI,OAwBnB,CAAA;IACD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AAClD,CAAC,EA7BgB,UAAU,0BAAV,UAAU,QA6B1B;AACD,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAClD,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC9C,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,eAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AAEpD;;GAEG;AACH,SAAS,IAAI,CAAC,GAAW;IACrB,IAAM,KAAK,GAAW,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACvC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAa;IACrC,OAAO,CACH,IAAI,KAAK,SAAS;QAClB,IAAI;aACC,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,UAAC,GAAG,IAAK,OAAA,GAAG,CAAC,IAAI,EAAE,EAAV,CAAU,CAAC;aACxB,IAAI,CAAC,UAAC,GAAG,IAAK,OAAA,GAAG,KAAK,mCAAmC,EAA3C,CAA2C,CAAC,CAClE,CAAC;AACN,CAAC;AAED;IACI,6BAAoC,MAAgC;QAAhC,WAAM,GAAN,MAAM,CAA0B;IAAG,CAAC;IAEjE,iCAAG,GAAV,UAAW,GAAW;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC;IAC1C,CAAC;IAEM,iCAAG,GAAV,UAAW,GAAW;;QAClB,IAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,KAAK,KAAK,SAAS;YACtB,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBACtB,CAAC,CAAC,MAAA,KAAK,CAAC,CAAC,CAAC,mCAAI,IAAI;gBAClB,CAAC,CAAC,KAAK,CAAC;IAChB,CAAC;IAEM,oCAAM,GAAb,UAAc,GAAW;QACrB,IAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,KAAK,KAAK,SAAS;YACtB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBACtB,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC;IACL,0BAAC;AAAD,CAAC,AAxBD,IAwBC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import { INestiaTransformProject } from "../options/INestiaTransformProject";
|
|
3
|
+
export declare namespace TypedQueryBodyProgrammer {
|
|
4
|
+
const generate: (project: INestiaTransformProject) => (modulo: ts.LeftHandSideExpression) => (type: ts.Type) => ts.ObjectLiteralExpression;
|
|
5
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.TypedQueryBodyProgrammer = void 0;
|
|
18
|
+
var typescript_1 = __importDefault(require("typescript"));
|
|
19
|
+
var HttpAssertQueryProgrammer_1 = require("typia/lib/programmers/http/HttpAssertQueryProgrammer");
|
|
20
|
+
var HttpIsQueryProgrammer_1 = require("typia/lib/programmers/http/HttpIsQueryProgrammer");
|
|
21
|
+
var HttpValidateQueryProgrammer_1 = require("typia/lib/programmers/http/HttpValidateQueryProgrammer");
|
|
22
|
+
var TypedQueryBodyProgrammer;
|
|
23
|
+
(function (TypedQueryBodyProgrammer) {
|
|
24
|
+
TypedQueryBodyProgrammer.generate = function (project) {
|
|
25
|
+
return function (modulo) {
|
|
26
|
+
return function (type) {
|
|
27
|
+
// GENERATE VALIDATION PLAN
|
|
28
|
+
var parameter = function (key) {
|
|
29
|
+
return function (programmer) {
|
|
30
|
+
return typescript_1.default.factory.createObjectLiteralExpression([
|
|
31
|
+
typescript_1.default.factory.createPropertyAssignment(typescript_1.default.factory.createIdentifier("type"), typescript_1.default.factory.createStringLiteral(key)),
|
|
32
|
+
typescript_1.default.factory.createPropertyAssignment(typescript_1.default.factory.createIdentifier(key), programmer(__assign(__assign({}, project), { options: {
|
|
33
|
+
numeric: false,
|
|
34
|
+
finite: false,
|
|
35
|
+
functional: false,
|
|
36
|
+
} }))(modulo)(type)),
|
|
37
|
+
]);
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
// RETURNS
|
|
41
|
+
var category = project.options.validate;
|
|
42
|
+
if (category === "is" || category === "equals")
|
|
43
|
+
return parameter("is")(HttpIsQueryProgrammer_1.HttpIsQueryProgrammer.write);
|
|
44
|
+
else if (category === "validate" || category === "validateEquals")
|
|
45
|
+
return parameter("validate")(HttpValidateQueryProgrammer_1.HttpValidateQueryProgrammer.write);
|
|
46
|
+
return parameter("assert")(HttpAssertQueryProgrammer_1.HttpAssertQueryProgrammer.write);
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
})(TypedQueryBodyProgrammer || (exports.TypedQueryBodyProgrammer = TypedQueryBodyProgrammer = {}));
|
|
51
|
+
//# sourceMappingURL=TypedQueryBodyProgrammer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TypedQueryBodyProgrammer.js","sourceRoot":"","sources":["../../src/programmers/TypedQueryBodyProgrammer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,0DAA4B;AAE5B,kGAAiG;AACjG,0FAAyF;AACzF,sGAAqG;AAMrG,IAAiB,wBAAwB,CAyCxC;AAzCD,WAAiB,wBAAwB;IACxB,iCAAQ,GACjB,UAAC,OAAgC;QACjC,OAAA,UAAC,MAAiC;YAClC,OAAA,UAAC,IAAa;gBACV,2BAA2B;gBAC3B,IAAM,SAAS,GACX,UAAC,GAAwC;oBACzC,OAAA,UACI,UAIwC;wBAExC,OAAA,oBAAE,CAAC,OAAO,CAAC,6BAA6B,CAAC;4BACrC,oBAAE,CAAC,OAAO,CAAC,wBAAwB,CAC/B,oBAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,EACnC,oBAAE,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,CACtC;4BACD,oBAAE,CAAC,OAAO,CAAC,wBAAwB,CAC/B,oBAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAChC,UAAU,uBACH,OAAO,KACV,OAAO,EAAE;oCACL,OAAO,EAAE,KAAK;oCACd,MAAM,EAAE,KAAK;oCACb,UAAU,EAAE,KAAK;iCACpB,IACH,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CACnB;yBACJ,CAAC;oBAhBF,CAgBE;gBAvBN,CAuBM,CAAC;gBAEX,UAAU;gBACV,IAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAC1C,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,QAAQ;oBAC1C,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,6CAAqB,CAAC,KAAK,CAAC,CAAC;qBACnD,IAAI,QAAQ,KAAK,UAAU,IAAI,QAAQ,KAAK,gBAAgB;oBAC7D,OAAO,SAAS,CAAC,UAAU,CAAC,CAAC,yDAA2B,CAAC,KAAK,CAAC,CAAC;gBACpE,OAAO,SAAS,CAAC,QAAQ,CAAC,CAAC,qDAAyB,CAAC,KAAK,CAAC,CAAC;YAChE,CAAC;QApCD,CAoCC;IArCD,CAqCC,CAAC;AACV,CAAC,EAzCgB,wBAAwB,wCAAxB,wBAAwB,QAyCxC"}
|
|
@@ -10,6 +10,7 @@ var PlainBodyProgrammer_1 = require("../programmers/PlainBodyProgrammer");
|
|
|
10
10
|
var TypedBodyProgrammer_1 = require("../programmers/TypedBodyProgrammer");
|
|
11
11
|
var TypedHeadersProgrammer_1 = require("../programmers/TypedHeadersProgrammer");
|
|
12
12
|
var TypedParamProgrammer_1 = require("../programmers/TypedParamProgrammer");
|
|
13
|
+
var TypedQueryBodyProgrammer_1 = require("../programmers/TypedQueryBodyProgrammer");
|
|
13
14
|
var TypedQueryProgrammer_1 = require("../programmers/TypedQueryProgrammer");
|
|
14
15
|
var ParameterDecoratorTransformer;
|
|
15
16
|
(function (ParameterDecoratorTransformer) {
|
|
@@ -35,7 +36,7 @@ var ParameterDecoratorTransformer;
|
|
|
35
36
|
// TRANSFORMATION
|
|
36
37
|
//----
|
|
37
38
|
// FIND PROGRAMMER
|
|
38
|
-
var programmer = FUNCTORS[project.checker.getTypeAtLocation(declaration).symbol
|
|
39
|
+
var programmer = FUNCTORS[getName(project.checker.getTypeAtLocation(declaration).symbol)];
|
|
39
40
|
if (programmer === undefined)
|
|
40
41
|
return decorator;
|
|
41
42
|
// GET TYPE INFO
|
|
@@ -70,6 +71,11 @@ var FUNCTORS = {
|
|
|
70
71
|
? parameters
|
|
71
72
|
: [TypedQueryProgrammer_1.TypedQueryProgrammer.generate(project)(modulo)(type)];
|
|
72
73
|
}; }; }; },
|
|
74
|
+
"TypedQuery.Body": function (project) { return function (modulo) { return function (parameters) { return function (type) {
|
|
75
|
+
return parameters.length
|
|
76
|
+
? parameters
|
|
77
|
+
: [TypedQueryBodyProgrammer_1.TypedQueryBodyProgrammer.generate(project)(modulo)(type)];
|
|
78
|
+
}; }; }; },
|
|
73
79
|
PlainBody: function (project) { return function (modulo) { return function (parameters) { return function (type) {
|
|
74
80
|
return parameters.length
|
|
75
81
|
? parameters
|
|
@@ -78,4 +84,18 @@ var FUNCTORS = {
|
|
|
78
84
|
};
|
|
79
85
|
var LIB_PATH = path_1.default.join("node_modules", "@nestia", "core", "lib", "decorators");
|
|
80
86
|
var SRC_PATH = path_1.default.resolve(path_1.default.join(__dirname, "..", "decorators"));
|
|
87
|
+
var getName = function (symbol) {
|
|
88
|
+
var _a, _b;
|
|
89
|
+
var parent = (_b = (_a = symbol.getDeclarations()) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.parent;
|
|
90
|
+
return parent
|
|
91
|
+
? exploreName(parent)(symbol.escapedName.toString())
|
|
92
|
+
: "__type";
|
|
93
|
+
};
|
|
94
|
+
var exploreName = function (decl) {
|
|
95
|
+
return function (name) {
|
|
96
|
+
return typescript_1.default.isModuleBlock(decl)
|
|
97
|
+
? exploreName(decl.parent.parent)("".concat(decl.parent.name.getFullText().trim(), ".").concat(name))
|
|
98
|
+
: name;
|
|
99
|
+
};
|
|
100
|
+
};
|
|
81
101
|
//# sourceMappingURL=ParameterDecoratorTransformer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ParameterDecoratorTransformer.js","sourceRoot":"","sources":["../../src/transformers/ParameterDecoratorTransformer.ts"],"names":[],"mappings":";;;;;;AAAA,8CAAwB;AACxB,0DAA4B;AAG5B,0EAAyE;AACzE,0EAAyE;AACzE,gFAA+E;AAC/E,4EAA2E;AAC3E,4EAA2E;AAE3E,IAAiB,6BAA6B,
|
|
1
|
+
{"version":3,"file":"ParameterDecoratorTransformer.js","sourceRoot":"","sources":["../../src/transformers/ParameterDecoratorTransformer.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nestia/core",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0-dev.20231008",
|
|
4
4
|
"description": "Super-fast validation decorators of NestJS",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"typings": "lib/index.d.ts",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
},
|
|
35
35
|
"homepage": "https://nestia.io",
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@nestia/fetcher": "^2.
|
|
37
|
+
"@nestia/fetcher": "^2.2.0-dev.20231008",
|
|
38
38
|
"@nestjs/common": ">= 7.0.1",
|
|
39
39
|
"@nestjs/core": ">= 7.0.1",
|
|
40
40
|
"@nestjs/platform-express": ">= 7.0.1",
|
|
@@ -44,10 +44,10 @@
|
|
|
44
44
|
"raw-body": ">= 2.0.0",
|
|
45
45
|
"reflect-metadata": ">= 0.1.12",
|
|
46
46
|
"rxjs": ">= 6.0.0",
|
|
47
|
-
"typia": "^5.
|
|
47
|
+
"typia": "^5.2.0"
|
|
48
48
|
},
|
|
49
49
|
"peerDependencies": {
|
|
50
|
-
"@nestia/fetcher": ">=2.
|
|
50
|
+
"@nestia/fetcher": ">=2.2.0-dev.20231008",
|
|
51
51
|
"@nestjs/common": ">=7.0.1",
|
|
52
52
|
"@nestjs/core": ">=7.0.1",
|
|
53
53
|
"@nestjs/platform-express": ">=7.0.1",
|
|
@@ -56,14 +56,14 @@
|
|
|
56
56
|
"reflect-metadata": ">=0.1.12",
|
|
57
57
|
"rxjs": ">=6.0.0",
|
|
58
58
|
"typescript": ">=4.8.0",
|
|
59
|
-
"typia": ">=5.
|
|
59
|
+
"typia": ">=5.2.0 <6.0.0"
|
|
60
60
|
},
|
|
61
61
|
"devDependencies": {
|
|
62
62
|
"@trivago/prettier-plugin-sort-imports": "^4.0.0",
|
|
63
63
|
"@types/express": "^4.17.15",
|
|
64
64
|
"@types/glob": "^7.2.0",
|
|
65
65
|
"@types/inquirer": "^9.0.3",
|
|
66
|
-
"@types/ts-expose-internals": "npm:ts-expose-internals@5.
|
|
66
|
+
"@types/ts-expose-internals": "npm:ts-expose-internals@5.2.2",
|
|
67
67
|
"@typescript-eslint/eslint-plugin": "^5.46.1",
|
|
68
68
|
"@typescript-eslint/parser": "^5.46.1",
|
|
69
69
|
"commander": "^10.0.0",
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
BadRequestException,
|
|
3
|
+
ExecutionContext,
|
|
4
|
+
createParamDecorator,
|
|
5
|
+
} from "@nestjs/common";
|
|
2
6
|
import type express from "express";
|
|
3
7
|
import type { FastifyRequest } from "fastify";
|
|
4
8
|
|
|
@@ -44,6 +48,36 @@ export function TypedQuery<T extends object>(
|
|
|
44
48
|
return output;
|
|
45
49
|
})();
|
|
46
50
|
}
|
|
51
|
+
export namespace TypedQuery {
|
|
52
|
+
export function Body<T extends object>(
|
|
53
|
+
validator?: IRequestQueryValidator<T>,
|
|
54
|
+
): ParameterDecorator {
|
|
55
|
+
const checker = validate_request_query(validator);
|
|
56
|
+
return createParamDecorator(function TypedQueryBody(
|
|
57
|
+
_unknown: any,
|
|
58
|
+
context: ExecutionContext,
|
|
59
|
+
) {
|
|
60
|
+
const request: express.Request | FastifyRequest = context
|
|
61
|
+
.switchToHttp()
|
|
62
|
+
.getRequest();
|
|
63
|
+
if (isApplicationQuery(request.headers["content-type"]) === false)
|
|
64
|
+
throw new BadRequestException(
|
|
65
|
+
`Request body type is not "application/x-www-form-urlencoded".`,
|
|
66
|
+
);
|
|
67
|
+
const params: URLSearchParams =
|
|
68
|
+
request.body instanceof URLSearchParams
|
|
69
|
+
? request.body
|
|
70
|
+
: (new FakeURLSearchParams(request.body) as any);
|
|
71
|
+
|
|
72
|
+
const output: T | Error = checker(params);
|
|
73
|
+
if (output instanceof Error) throw output;
|
|
74
|
+
return output;
|
|
75
|
+
})();
|
|
76
|
+
}
|
|
77
|
+
Object.assign(Body, typia.http.assertQuery);
|
|
78
|
+
Object.assign(Body, typia.http.isQuery);
|
|
79
|
+
Object.assign(Body, typia.http.validateQuery);
|
|
80
|
+
}
|
|
47
81
|
Object.assign(TypedQuery, typia.http.assertQuery);
|
|
48
82
|
Object.assign(TypedQuery, typia.http.isQuery);
|
|
49
83
|
Object.assign(TypedQuery, typia.http.validateQuery);
|
|
@@ -55,3 +89,39 @@ function tail(url: string): string {
|
|
|
55
89
|
const index: number = url.indexOf("?");
|
|
56
90
|
return index === -1 ? "" : url.substring(index + 1);
|
|
57
91
|
}
|
|
92
|
+
|
|
93
|
+
function isApplicationQuery(text?: string): boolean {
|
|
94
|
+
return (
|
|
95
|
+
text !== undefined &&
|
|
96
|
+
text
|
|
97
|
+
.split(";")
|
|
98
|
+
.map((str) => str.trim())
|
|
99
|
+
.some((str) => str === "application/x-www-form-urlencoded")
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
class FakeURLSearchParams {
|
|
104
|
+
public constructor(private readonly target: Record<string, string[]>) {}
|
|
105
|
+
|
|
106
|
+
public has(key: string): boolean {
|
|
107
|
+
return this.target[key] !== undefined;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
public get(key: string): string | null {
|
|
111
|
+
const value = this.target[key];
|
|
112
|
+
return value === undefined
|
|
113
|
+
? null
|
|
114
|
+
: Array.isArray(value)
|
|
115
|
+
? value[0] ?? null
|
|
116
|
+
: value;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
public getAll(key: string): string[] {
|
|
120
|
+
const value = this.target[key];
|
|
121
|
+
return value === undefined
|
|
122
|
+
? []
|
|
123
|
+
: Array.isArray(value)
|
|
124
|
+
? value
|
|
125
|
+
: [value];
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
|
|
3
|
+
import { HttpAssertQueryProgrammer } from "typia/lib/programmers/http/HttpAssertQueryProgrammer";
|
|
4
|
+
import { HttpIsQueryProgrammer } from "typia/lib/programmers/http/HttpIsQueryProgrammer";
|
|
5
|
+
import { HttpValidateQueryProgrammer } from "typia/lib/programmers/http/HttpValidateQueryProgrammer";
|
|
6
|
+
import { IProject } from "typia/lib/transformers/IProject";
|
|
7
|
+
|
|
8
|
+
import { INestiaTransformProject } from "../options/INestiaTransformProject";
|
|
9
|
+
import { IRequestQueryValidator } from "../options/IRequestQueryValidator";
|
|
10
|
+
|
|
11
|
+
export namespace TypedQueryBodyProgrammer {
|
|
12
|
+
export const generate =
|
|
13
|
+
(project: INestiaTransformProject) =>
|
|
14
|
+
(modulo: ts.LeftHandSideExpression) =>
|
|
15
|
+
(type: ts.Type): ts.ObjectLiteralExpression => {
|
|
16
|
+
// GENERATE VALIDATION PLAN
|
|
17
|
+
const parameter =
|
|
18
|
+
(key: IRequestQueryValidator<any>["type"]) =>
|
|
19
|
+
(
|
|
20
|
+
programmer: (
|
|
21
|
+
project: IProject,
|
|
22
|
+
) => (
|
|
23
|
+
modulo: ts.LeftHandSideExpression,
|
|
24
|
+
) => (type: ts.Type) => ts.ArrowFunction,
|
|
25
|
+
) =>
|
|
26
|
+
ts.factory.createObjectLiteralExpression([
|
|
27
|
+
ts.factory.createPropertyAssignment(
|
|
28
|
+
ts.factory.createIdentifier("type"),
|
|
29
|
+
ts.factory.createStringLiteral(key),
|
|
30
|
+
),
|
|
31
|
+
ts.factory.createPropertyAssignment(
|
|
32
|
+
ts.factory.createIdentifier(key),
|
|
33
|
+
programmer({
|
|
34
|
+
...project,
|
|
35
|
+
options: {
|
|
36
|
+
numeric: false,
|
|
37
|
+
finite: false,
|
|
38
|
+
functional: false,
|
|
39
|
+
},
|
|
40
|
+
})(modulo)(type),
|
|
41
|
+
),
|
|
42
|
+
]);
|
|
43
|
+
|
|
44
|
+
// RETURNS
|
|
45
|
+
const category = project.options.validate;
|
|
46
|
+
if (category === "is" || category === "equals")
|
|
47
|
+
return parameter("is")(HttpIsQueryProgrammer.write);
|
|
48
|
+
else if (category === "validate" || category === "validateEquals")
|
|
49
|
+
return parameter("validate")(HttpValidateQueryProgrammer.write);
|
|
50
|
+
return parameter("assert")(HttpAssertQueryProgrammer.write);
|
|
51
|
+
};
|
|
52
|
+
}
|
|
@@ -6,6 +6,7 @@ import { PlainBodyProgrammer } from "../programmers/PlainBodyProgrammer";
|
|
|
6
6
|
import { TypedBodyProgrammer } from "../programmers/TypedBodyProgrammer";
|
|
7
7
|
import { TypedHeadersProgrammer } from "../programmers/TypedHeadersProgrammer";
|
|
8
8
|
import { TypedParamProgrammer } from "../programmers/TypedParamProgrammer";
|
|
9
|
+
import { TypedQueryBodyProgrammer } from "../programmers/TypedQueryBodyProgrammer";
|
|
9
10
|
import { TypedQueryProgrammer } from "../programmers/TypedQueryProgrammer";
|
|
10
11
|
|
|
11
12
|
export namespace ParameterDecoratorTransformer {
|
|
@@ -39,7 +40,9 @@ export namespace ParameterDecoratorTransformer {
|
|
|
39
40
|
// FIND PROGRAMMER
|
|
40
41
|
const programmer: Programmer | undefined =
|
|
41
42
|
FUNCTORS[
|
|
42
|
-
|
|
43
|
+
getName(
|
|
44
|
+
project.checker.getTypeAtLocation(declaration).symbol,
|
|
45
|
+
)
|
|
43
46
|
];
|
|
44
47
|
if (programmer === undefined) return decorator;
|
|
45
48
|
|
|
@@ -88,6 +91,10 @@ const FUNCTORS: Record<string, Programmer> = {
|
|
|
88
91
|
parameters.length
|
|
89
92
|
? parameters
|
|
90
93
|
: [TypedQueryProgrammer.generate(project)(modulo)(type)],
|
|
94
|
+
"TypedQuery.Body": (project) => (modulo) => (parameters) => (type) =>
|
|
95
|
+
parameters.length
|
|
96
|
+
? parameters
|
|
97
|
+
: [TypedQueryBodyProgrammer.generate(project)(modulo)(type)],
|
|
91
98
|
PlainBody: (project) => (modulo) => (parameters) => (type) =>
|
|
92
99
|
parameters.length
|
|
93
100
|
? parameters
|
|
@@ -102,3 +109,18 @@ const LIB_PATH = path.join(
|
|
|
102
109
|
"decorators",
|
|
103
110
|
);
|
|
104
111
|
const SRC_PATH = path.resolve(path.join(__dirname, "..", "decorators"));
|
|
112
|
+
|
|
113
|
+
const getName = (symbol: ts.Symbol): string => {
|
|
114
|
+
const parent = symbol.getDeclarations()?.[0]?.parent;
|
|
115
|
+
return parent
|
|
116
|
+
? exploreName(parent)(symbol.escapedName.toString())
|
|
117
|
+
: "__type";
|
|
118
|
+
};
|
|
119
|
+
const exploreName =
|
|
120
|
+
(decl: ts.Node) =>
|
|
121
|
+
(name: string): string =>
|
|
122
|
+
ts.isModuleBlock(decl)
|
|
123
|
+
? exploreName(decl.parent.parent)(
|
|
124
|
+
`${decl.parent.name.getFullText().trim()}.${name}`,
|
|
125
|
+
)
|
|
126
|
+
: name;
|