@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.
@@ -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,yCAAwE;AAIxE,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,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"}
1
+ {"version":3,"file":"TypedQuery.js","sourceRoot":"","sources":["../../src/decorators/TypedQuery.ts"],"names":[],"mappings":"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"}
@@ -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.name];
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,CAoD7C;AApDD,WAAiB,6BAA6B;IAC7B,uCAAS,GAClB,UAAC,OAAgC;QACjC,OAAA,UAAC,IAAa;YACd,OAAA,UAAC,SAAuB;;gBACpB,MAAM;gBACN,cAAc;gBACd,MAAM;gBACN,kBAAkB;gBAClB,IAAI,CAAC,oBAAE,CAAC,gBAAgB,CAAC,SAAS,CAAC,UAAU,CAAC;oBAAE,OAAO,SAAS,CAAC;gBAEjE,wBAAwB;gBACxB,IAAM,WAAW,GACb,MAAA,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAChC,SAAS,CAAC,UAAU,CACvB,0CAAE,WAAW,CAAC;gBACnB,IAAI,WAAW,KAAK,SAAS;oBAAE,OAAO,SAAS,CAAC;gBAEhD,YAAY;gBACZ,IAAM,IAAI,GAAW,cAAI,CAAC,OAAO,CAC7B,WAAW,CAAC,aAAa,EAAE,CAAC,QAAQ,CACvC,CAAC;gBACF,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;oBAC9D,OAAO,SAAS,CAAC;gBAErB,MAAM;gBACN,iBAAiB;gBACjB,MAAM;gBACN,kBAAkB;gBAClB,IAAM,UAAU,GACZ,QAAQ,CACJ,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,IAAI,CAC7D,CAAC;gBACN,IAAI,UAAU,KAAK,SAAS;oBAAE,OAAO,SAAS,CAAC;gBAE/C,gBAAgB;gBAChB,IAAM,QAAQ,GACV,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;gBAC/D,IAAI,QAAQ,KAAK,SAAS;oBAAE,OAAO,SAAS,CAAC;gBAE7C,eAAe;gBACf,OAAO,oBAAE,CAAC,OAAO,CAAC,eAAe,CAC7B,oBAAE,CAAC,OAAO,CAAC,oBAAoB,CAC3B,SAAS,CAAC,UAAU,EACpB,SAAS,CAAC,UAAU,CAAC,UAAU,EAC/B,SAAS,CAAC,UAAU,CAAC,aAAa,EAClC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,UAAU,CAAC,CAChD,SAAS,CAAC,UAAU,CAAC,SAAS,CACjC,CAAC,IAAI,CAAC,CACV,CACJ,CAAC;YACN,CAAC;QA/CD,CA+CC;IAhDD,CAgDC,CAAC;AACV,CAAC,EApDgB,6BAA6B,6CAA7B,6BAA6B,QAoD7C;AAUD,IAAM,QAAQ,GAA+B;IACzC,aAAa,EAAE,UAAC,OAAO,IAAK,OAAA,UAAC,MAAM,IAAK,OAAA,UAAC,UAAU,IAAK,OAAA,UAAC,IAAI;QACzD,OAAA,UAAU,CAAC,MAAM;YACb,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,CAAC,yCAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;IAF3D,CAE2D,EAHP,CAGO,EAHvB,CAGuB,EAHnC,CAGmC;IAC/D,SAAS,EAAE,UAAC,OAAO,IAAK,OAAA,UAAC,MAAM,IAAK,OAAA,UAAC,UAAU,IAAK,OAAA,UAAC,IAAI;QACrD,OAAA,UAAU,CAAC,MAAM;YACb,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,CAAC,yCAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;IAF3D,CAE2D,EAHX,CAGW,EAH3B,CAG2B,EAHvC,CAGuC;IAC/D,YAAY,EAAE,UAAC,OAAO,IAAK,OAAA,UAAC,MAAM,IAAK,OAAA,UAAC,UAAU,IAAK,OAAA,UAAC,IAAI;QACxD,OAAA,UAAU,CAAC,MAAM;YACb,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,CAAC,+CAAsB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;IAF9D,CAE8D,EAHX,CAGW,EAH3B,CAG2B,EAHvC,CAGuC;IAClE,UAAU,EAAE,UAAC,OAAO,IAAK,OAAA,2CAAoB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAtC,CAAsC;IAC/D,UAAU,EAAE,UAAC,OAAO,IAAK,OAAA,UAAC,MAAM,IAAK,OAAA,UAAC,UAAU,IAAK,OAAA,UAAC,IAAI;QACtD,OAAA,UAAU,CAAC,MAAM;YACb,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,CAAC,2CAAoB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;IAF5D,CAE4D,EAHX,CAGW,EAH3B,CAG2B,EAHvC,CAGuC;IAChE,SAAS,EAAE,UAAC,OAAO,IAAK,OAAA,UAAC,MAAM,IAAK,OAAA,UAAC,UAAU,IAAK,OAAA,UAAC,IAAI;QACrD,OAAA,UAAU,CAAC,MAAM;YACb,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,CAAC,yCAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;IAF3D,CAE2D,EAHX,CAGW,EAH3B,CAG2B,EAHvC,CAGuC;CAClE,CAAC;AAEF,IAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CACtB,cAAc,EACd,SAAS,EACT,MAAM,EACN,KAAK,EACL,YAAY,CACf,CAAC;AACF,IAAM,QAAQ,GAAG,cAAI,CAAC,OAAO,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC"}
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.1.8-dev.20231006",
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.1.8-dev.20231006",
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.1.6"
47
+ "typia": "^5.2.0"
48
48
  },
49
49
  "peerDependencies": {
50
- "@nestia/fetcher": ">=2.1.8-dev.20231006",
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.1.6 <6.0.0"
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.1.6",
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 { ExecutionContext, createParamDecorator } from "@nestjs/common";
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
- project.checker.getTypeAtLocation(declaration).symbol.name
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;