@bepalo/spine 2.8.21 → 3.10.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/auth-middlewares.d.ts +6 -2
  2. package/dist/auth-middlewares.d.ts.map +1 -1
  3. package/dist/auth-middlewares.js +20 -7
  4. package/dist/auth-middlewares.js.map +1 -1
  5. package/dist/cjs/auth-middlewares.d.ts +6 -2
  6. package/dist/cjs/auth-middlewares.d.ts.map +1 -1
  7. package/dist/cjs/auth-middlewares.js +20 -7
  8. package/dist/cjs/auth-middlewares.js.map +1 -1
  9. package/dist/cjs/generator.js.map +1 -1
  10. package/dist/cjs/helpers.d.ts +14 -2
  11. package/dist/cjs/helpers.d.ts.map +1 -1
  12. package/dist/cjs/helpers.js +31 -3
  13. package/dist/cjs/helpers.js.map +1 -1
  14. package/dist/cjs/middlewares.d.ts +116 -6
  15. package/dist/cjs/middlewares.d.ts.map +1 -1
  16. package/dist/cjs/middlewares.js +291 -35
  17. package/dist/cjs/middlewares.js.map +1 -1
  18. package/dist/cjs/router.d.ts +51 -52
  19. package/dist/cjs/router.d.ts.map +1 -1
  20. package/dist/cjs/router.js +238 -127
  21. package/dist/cjs/router.js.map +1 -1
  22. package/dist/cjs/types.d.ts +100 -17
  23. package/dist/cjs/types.d.ts.map +1 -1
  24. package/dist/cjs/types.js +1 -0
  25. package/dist/cjs/types.js.map +1 -1
  26. package/dist/cjs/utils.d.ts +2 -0
  27. package/dist/cjs/utils.d.ts.map +1 -1
  28. package/dist/cjs/utils.js +18 -1
  29. package/dist/cjs/utils.js.map +1 -1
  30. package/dist/generator.js.map +1 -1
  31. package/dist/helpers.d.ts +14 -2
  32. package/dist/helpers.d.ts.map +1 -1
  33. package/dist/helpers.js +31 -3
  34. package/dist/helpers.js.map +1 -1
  35. package/dist/middlewares.d.ts +116 -6
  36. package/dist/middlewares.d.ts.map +1 -1
  37. package/dist/middlewares.js +291 -35
  38. package/dist/middlewares.js.map +1 -1
  39. package/dist/router.d.ts +51 -52
  40. package/dist/router.d.ts.map +1 -1
  41. package/dist/router.js +238 -127
  42. package/dist/router.js.map +1 -1
  43. package/dist/types.d.ts +100 -17
  44. package/dist/types.d.ts.map +1 -1
  45. package/dist/types.js +1 -0
  46. package/dist/types.js.map +1 -1
  47. package/dist/utils.d.ts +2 -0
  48. package/dist/utils.d.ts.map +1 -1
  49. package/dist/utils.js +18 -1
  50. package/dist/utils.js.map +1 -1
  51. package/package.json +1 -1
@@ -10,11 +10,237 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  });
11
11
  };
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
- exports.validate = exports.cors = exports.limitRate = exports.securityHeaders = exports.forceHttps = void 0;
13
+ exports.validate = exports.cors = exports.limitRate = exports.securityHeaders = exports.forceHttps = exports.logRequestsWithColor = exports.logRequests = exports.COLORS = void 0;
14
14
  const helpers_ts_1 = require("./helpers.js");
15
15
  const parsers_ts_1 = require("./parsers.js");
16
16
  const status_ts_1 = require("./status.js");
17
17
  const types_ts_1 = require("./types.js");
18
+ const utils_ts_1 = require("./utils.js");
19
+ exports.COLORS = {
20
+ reset: "\x1b[0m",
21
+ dim: "\x1b[2m",
22
+ bold: "\x1b[1m",
23
+ black: "\x1b[30m",
24
+ red: "\x1b[31m",
25
+ green: "\x1b[32m",
26
+ yellow: "\x1b[33m",
27
+ blue: "\x1b[34m",
28
+ magenta: "\x1b[35m",
29
+ cyan: "\x1b[36m",
30
+ white: "\x1b[37m",
31
+ method: {
32
+ HEAD: "\x1b[36m", // cyan
33
+ GET: "\x1b[36m",
34
+ QUERY: "\x1b[34m", // blue
35
+ POST: "\x1b[32m", // green
36
+ PUT: "\x1b[33m", // yellow
37
+ PATCH: "\x1b[33m",
38
+ DELETE: "\x1b[31m", // red
39
+ OPTIONS: "\x1b[35m", // magenta
40
+ TRACE: "\x1b[35m",
41
+ CONNECT: "\x1b[35m",
42
+ },
43
+ status: (status) => {
44
+ if (status >= 500)
45
+ return "\x1b[31m"; // red
46
+ if (status >= 400)
47
+ return "\x1b[33m"; // yellow
48
+ if (status >= 300)
49
+ return "\x1b[36m"; // cyan
50
+ return "\x1b[32m"; // green
51
+ },
52
+ };
53
+ /**
54
+ * Log requests with no color
55
+ *
56
+ * @param options Log requests options
57
+ */
58
+ const logRequests = (options) => {
59
+ const { logger = console.log, enable, enclosure, indent, pad, } = options !== null && options !== void 0 ? options : {};
60
+ const { requestTime: enReqTime = true, duration: enDur = true, status: enStatus = "status", search: enSearch = "multiline", } = enable !== null && enable !== void 0 ? enable : {};
61
+ const { requestTime: encReqTime = ["", " "], duration: encDur = ["[", "]"], status: encStatus = ["(", ")"], } = enclosure !== null && enclosure !== void 0 ? enclosure : {};
62
+ const [encReqTime0, encReqTime1] = encReqTime;
63
+ const [encDur0, encDur1] = encDur;
64
+ const [encStatus0, encStatus1] = encStatus;
65
+ const { search: indSearch = " " } = indent !== null && indent !== void 0 ? indent : {};
66
+ const { duration: padDur = -7, status: padStatus = 0, method: padMethod = 0, } = pad !== null && pad !== void 0 ? pad : {};
67
+ let statusType;
68
+ switch (enStatus) {
69
+ case "status":
70
+ statusType = 1;
71
+ break;
72
+ case "status-text":
73
+ statusType = 2;
74
+ break;
75
+ case "with-status-text":
76
+ statusType = 3;
77
+ break;
78
+ default:
79
+ statusType = 0;
80
+ break;
81
+ }
82
+ const searchType = enSearch === "multiline" ? 2 : enSearch === "singleline" ? 1 : 0;
83
+ ////////////////////////////////////////////////////////////////////////////
84
+ return ({ request, response, url, timestamps: { epoch, start, end } }) => {
85
+ // Status Str
86
+ let statusStr;
87
+ switch (statusType) {
88
+ case 1:
89
+ statusStr = response.status.toString();
90
+ break;
91
+ case 2:
92
+ statusStr = response.statusText;
93
+ break;
94
+ case 3:
95
+ statusStr = `${response.status} ${response.statusText}`;
96
+ break;
97
+ default:
98
+ statusStr = "";
99
+ break;
100
+ }
101
+ // Search Str
102
+ let searchStr;
103
+ switch (searchType) {
104
+ case 2: {
105
+ const len = url.searchParams.size;
106
+ if (len > 0) {
107
+ searchStr = "?\n";
108
+ let i = 0;
109
+ for (const [key, value] of url.searchParams) {
110
+ searchStr += `${indSearch}${key}=${value}${++i < len ? " &\n" : ""}`;
111
+ }
112
+ }
113
+ else {
114
+ searchStr = "";
115
+ }
116
+ break;
117
+ }
118
+ case 1:
119
+ searchStr = url.search;
120
+ break;
121
+ default:
122
+ searchStr = "";
123
+ break;
124
+ }
125
+ logger(`${enReqTime ? `${encReqTime0}${epoch}${encReqTime1}` : ""}${enDur
126
+ ? `${encDur0}${(0, utils_ts_1.padStr)((0, utils_ts_1.formatDuration)(end - start), padDur)}${encDur1}`
127
+ : ""}${!enStatus
128
+ ? ""
129
+ : `${encStatus0}${(0, utils_ts_1.padStr)(statusStr, padStatus)}${encStatus1}`} ${(0, utils_ts_1.padStr)(request.method, padMethod)} ${url.pathname}${searchStr}`);
130
+ };
131
+ };
132
+ exports.logRequests = logRequests;
133
+ /**
134
+ * Log requests with color
135
+ *
136
+ * @param options Log requests options
137
+ */
138
+ const logRequestsWithColor = (options) => {
139
+ const { logger = console.log, enable, enclosure, indent, pad, reqTime, duration, status, method, pathname, search, } = options !== null && options !== void 0 ? options : {};
140
+ const { requestTime: enReqTime = true, duration: enDur = true, status: enStatus = "status", search: enSearch = "multiline", } = enable !== null && enable !== void 0 ? enable : {};
141
+ const { requestTime: encReqTime = ["", " "], duration: encDur = ["[", "]"], status: encStatus = ["(", ")"], } = enclosure !== null && enclosure !== void 0 ? enclosure : {};
142
+ const [encReqTime0, encReqTime1] = encReqTime;
143
+ const [encDur0, encDur1] = encDur;
144
+ const [encStatus0, encStatus1] = encStatus;
145
+ const { search: indSearch = " " } = indent !== null && indent !== void 0 ? indent : {};
146
+ const { duration: padDur = -7, status: padStatus = 0, method: padMethod = 0, } = pad !== null && pad !== void 0 ? pad : {};
147
+ const { color: reqTimeColor = null, bold: reqTimeBold = false, dim: reqTimeDim = false, } = reqTime !== null && reqTime !== void 0 ? reqTime : {};
148
+ const { color: durColor = null, bold: durBold = false, dim: durDim = true, } = duration !== null && duration !== void 0 ? duration : {};
149
+ const { color: statusColor = "auto", bold: statusBold = true, dim: statusDim = false, } = status !== null && status !== void 0 ? status : {};
150
+ const { color: methodColor = "auto", bold: methodBold = false, dim: methodDim = false, } = method !== null && method !== void 0 ? method : {};
151
+ const { color: pathnameColor = null, bold: pathnameBold = false, dim: pathnameDim = false, } = pathname !== null && pathname !== void 0 ? pathname : {};
152
+ const { color: searchColor = null, bold: searchBold = false, dim: searchDim = true, } = search !== null && search !== void 0 ? search : {};
153
+ const reqTimeDimStr = reqTimeDim ? exports.COLORS.dim : "";
154
+ const reqTimeColorStr = reqTimeColor ? exports.COLORS[reqTimeColor] : "";
155
+ const reqTimeBoldStr = reqTimeBold ? exports.COLORS.bold : "";
156
+ const reqTimeColorReset = reqTimeDim || reqTimeColor || reqTimeBold ? exports.COLORS.reset : "";
157
+ const durDimStr = durDim ? exports.COLORS.dim : "";
158
+ const durColorStr = durColor ? exports.COLORS[durColor] : "";
159
+ const durBoldStr = durBold ? exports.COLORS.bold : "";
160
+ const durColorReset = durDim || durColor || durBold ? exports.COLORS.reset : "";
161
+ const statusDimStr = statusDim ? exports.COLORS.dim : "";
162
+ // const statusColorStr = (status: number) => statusColor === "auto" ? COLORS.status(status) : statusColor ? COLORS[statusColor] : "";
163
+ const statusBoldStr = statusBold ? exports.COLORS.bold : "";
164
+ const statusColorReset = statusDim || statusColor || statusBold ? exports.COLORS.reset : "";
165
+ const methodDimStr = methodDim ? exports.COLORS.dim : "";
166
+ // const methodColorStr = methodColor === "auto" ? COLORS.status(method) : methodColor ? COLORS[methodColor] : "";
167
+ const methodBoldStr = methodBold ? exports.COLORS.bold : "";
168
+ const methodColorReset = methodDim || methodColor || methodBold ? exports.COLORS.reset : "";
169
+ const pathnameDimStr = pathnameDim ? exports.COLORS.dim : "";
170
+ const pathnameColorStr = pathnameColor ? exports.COLORS[pathnameColor] : "";
171
+ const pathnameBoldStr = pathnameBold ? exports.COLORS.bold : "";
172
+ const pathnameColorReset = pathnameDim || pathnameColor || pathnameBold ? exports.COLORS.reset : "";
173
+ const searchDimStr = searchDim ? exports.COLORS.dim : "";
174
+ const searchColorStr = searchColor ? exports.COLORS[searchColor] : "";
175
+ const searchBoldStr = searchBold ? exports.COLORS.bold : "";
176
+ const searchColorReset = searchDim || searchColor || searchBold ? exports.COLORS.reset : "";
177
+ let statusType;
178
+ switch (enStatus) {
179
+ case "status":
180
+ statusType = 1;
181
+ break;
182
+ case "status-text":
183
+ statusType = 2;
184
+ break;
185
+ case "with-status-text":
186
+ statusType = 3;
187
+ break;
188
+ default:
189
+ statusType = 0;
190
+ break;
191
+ }
192
+ const searchType = enSearch === "multiline" ? 2 : enSearch === "singleline" ? 1 : 0;
193
+ ////////////////////////////////////////////////////////////////////////////
194
+ return ({ request, response, url, timestamps: { epoch, start, end } }) => {
195
+ var _a;
196
+ // Status Str
197
+ let statusStr;
198
+ switch (statusType) {
199
+ case 1:
200
+ statusStr = response.status.toString();
201
+ break;
202
+ case 2:
203
+ statusStr = response.statusText;
204
+ break;
205
+ case 3:
206
+ statusStr = `${response.status} ${response.statusText}`;
207
+ break;
208
+ default:
209
+ statusStr = "";
210
+ break;
211
+ }
212
+ // Search Str
213
+ let searchStr;
214
+ switch (searchType) {
215
+ case 2: {
216
+ const len = url.searchParams.size;
217
+ if (len > 0) {
218
+ searchStr = "?\n";
219
+ let i = 0;
220
+ for (const [key, value] of url.searchParams) {
221
+ searchStr += `${indSearch}${key}=${value}${++i < len ? " &\n" : ""}`;
222
+ }
223
+ }
224
+ else {
225
+ searchStr = "";
226
+ }
227
+ break;
228
+ }
229
+ case 1:
230
+ searchStr = url.search;
231
+ break;
232
+ default:
233
+ searchStr = "";
234
+ break;
235
+ }
236
+ logger(`${enReqTime ? `${reqTimeDimStr}${reqTimeColorStr}${reqTimeBoldStr}${encReqTime0}${epoch}${encReqTime1}${reqTimeColorReset}` : ""}${enDur
237
+ ? `${durDimStr}${durColorStr}${durBoldStr}${encDur0}${(0, utils_ts_1.padStr)((0, utils_ts_1.formatDuration)(end - start), padDur)}${encDur1}${durColorReset}`
238
+ : ""}${!enStatus
239
+ ? ""
240
+ : `${statusDimStr}${statusColor === "auto" ? exports.COLORS.status(response.status) : statusColor ? exports.COLORS[statusColor] : ""}${statusBoldStr}${encStatus0}${(0, utils_ts_1.padStr)(statusStr, padStatus)}${encStatus1}${statusColorReset}`} ${methodDimStr}${methodColor === "auto" ? ((_a = exports.COLORS.method[request.method]) !== null && _a !== void 0 ? _a : "\x1b[37m") : methodColor ? exports.COLORS[methodColor] : ""}${methodBoldStr}${(0, utils_ts_1.padStr)(request.method, padMethod)}${methodColorReset} ${pathnameDimStr}${pathnameColorStr}${pathnameBoldStr}${url.pathname}${pathnameColorReset}${searchDimStr}${searchColorStr}${searchBoldStr}${searchStr}${searchColorReset}`);
241
+ };
242
+ };
243
+ exports.logRequestsWithColor = logRequestsWithColor;
18
244
  /**
19
245
  * Force http into https
20
246
  *
@@ -223,7 +449,7 @@ const limitRate = (config) => {
223
449
  }
224
450
  if (entry.tokens <= 0) {
225
451
  ctx.headers.set("Retry-After", Math.ceil(refillInterval - timeElapsed).toFixed());
226
- return respond(status_ts_1.Status._429_TooManyRequests, "Rate Limited", "message", "rate-limit");
452
+ return respond(status_ts_1.Status._429_TooManyRequests, "Too Many Requests", "message", "rate-limit");
227
453
  }
228
454
  else {
229
455
  entry.tokens--;
@@ -249,7 +475,7 @@ const limitRate = (config) => {
249
475
  entry.lastRefill = now();
250
476
  if (entry.tokens <= 0) {
251
477
  ctx.headers.set("Retry-After", Math.ceil(1 / refillRate).toFixed());
252
- return respond(status_ts_1.Status._429_TooManyRequests, "Rate Limited", "message", "rate-limit");
478
+ return respond(status_ts_1.Status._429_TooManyRequests, "Too Many Requests", "message", "rate-limit");
253
479
  }
254
480
  else {
255
481
  entry.tokens--;
@@ -352,7 +578,7 @@ const cors = (config) => {
352
578
  const requestMethod = request.headers.get("Access-Control-Request-Method");
353
579
  if (requestMethod &&
354
580
  !methods.includes(requestMethod)) {
355
- return respond(status_ts_1.Status._405_MethodNotAllowed, `Method ${requestMethod} not allowed`, "error", "CORS");
581
+ return respond(status_ts_1.Status._405_MethodNotAllowed, "Method not allowed", "message", "CORS");
356
582
  }
357
583
  headers.set("Access-Control-Allow-Methods", methods.join(", "));
358
584
  }
@@ -520,10 +746,8 @@ const validate = ({ responseType = "text", errors, paramsMutation = false, param
520
746
  ctx.query = {};
521
747
  }
522
748
  const searchParams = ctx.url.searchParams;
523
- for (const key of searchParams.keys()) {
524
- const values = searchParams.getAll(key);
525
- ctx.query[key] =
526
- values.length > 1 ? values[values.length - 1] : values[0];
749
+ for (const [key, value] of searchParams) {
750
+ ctx.query[key] = value;
527
751
  }
528
752
  })
529
753
  : queryParse || undefined;
@@ -593,6 +817,7 @@ const validate = ({ responseType = "text", errors, paramsMutation = false, param
593
817
  ? bodyValidator
594
818
  : [bodyValidator]
595
819
  : undefined;
820
+ bodyParseOptions = Object.assign(Object.assign({}, bodyParseOptions), { responseType });
596
821
  if (bodyValidators) {
597
822
  if (!bodyValidatorIsFunction &&
598
823
  !bodyValidatorIsObject &&
@@ -631,10 +856,12 @@ const validate = ({ responseType = "text", errors, paramsMutation = false, param
631
856
  ? paramsValidator.bind(ctx)(params)
632
857
  : paramsValidator(params);
633
858
  if (result instanceof Error) {
634
- return respond(result.status || status_ts_1.Status._400_BadRequest, result.message, "error", "params-validator");
859
+ const status = result.status || status_ts_1.Status._400_BadRequest;
860
+ return respond(status, result.message, status >= 500 ? "error" : "message", "params-validator");
635
861
  }
636
862
  else if (paramsErrors && errorMatches(result, paramsErrors)) {
637
- return respond(result.status || status_ts_1.Status._400_BadRequest, String(result), "error", "params-validator");
863
+ const status = result.status || status_ts_1.Status._400_BadRequest;
864
+ return respond(status, String(result), status >= 500 ? "error" : "message", "params-validator");
638
865
  }
639
866
  else if (result instanceof Response ||
640
867
  result === types_ts_1.Break_Pipe ||
@@ -665,10 +892,12 @@ const validate = ({ responseType = "text", errors, paramsMutation = false, param
665
892
  ? validator.bind(ctx)(params[key])
666
893
  : validator(params[key]);
667
894
  if (result instanceof Error) {
668
- return respond(result.status || status_ts_1.Status._400_BadRequest, result.message, "error", "params-validator");
895
+ const status = result.status || status_ts_1.Status._400_BadRequest;
896
+ return respond(status, result.message, status >= 500 ? "error" : "message", "params-validator");
669
897
  }
670
898
  else if (paramsErrors && errorMatches(result, paramsErrors)) {
671
- return respond(result.status || status_ts_1.Status._400_BadRequest, String(result), "error", "params-validator");
899
+ const status = result.status || status_ts_1.Status._400_BadRequest;
900
+ return respond(status, String(result), status >= 500 ? "error" : "message", "params-validator");
672
901
  }
673
902
  else if (result instanceof Response ||
674
903
  result === types_ts_1.Break_Pipe ||
@@ -682,7 +911,10 @@ const validate = ({ responseType = "text", errors, paramsMutation = false, param
682
911
  }
683
912
  // Parse query
684
913
  if (queryParser) {
685
- yield queryParser(ctx);
914
+ const response = yield queryParser(ctx);
915
+ if (response instanceof Response) {
916
+ return response;
917
+ }
686
918
  }
687
919
  const query = ctx.query;
688
920
  // Validate Query
@@ -691,10 +923,12 @@ const validate = ({ responseType = "text", errors, paramsMutation = false, param
691
923
  ? queryValidator.bind(ctx)(query)
692
924
  : queryValidator(query);
693
925
  if (result instanceof Error) {
694
- return respond(result.status || status_ts_1.Status._400_BadRequest, result.message, "error", "query-validator");
926
+ const status = result.status || status_ts_1.Status._400_BadRequest;
927
+ return respond(status, result.message, status >= 500 ? "error" : "message", "query-validator");
695
928
  }
696
929
  else if (queryErrors && errorMatches(result, queryErrors)) {
697
- return respond(result.status || status_ts_1.Status._400_BadRequest, String(result), "error", "query-validator");
930
+ const status = result.status || status_ts_1.Status._400_BadRequest;
931
+ return respond(status, String(result), status >= 500 ? "error" : "message", "query-validator");
698
932
  }
699
933
  else if (result instanceof Response ||
700
934
  result === types_ts_1.Break_Pipe ||
@@ -725,10 +959,12 @@ const validate = ({ responseType = "text", errors, paramsMutation = false, param
725
959
  ? validator.bind(ctx)(query[key])
726
960
  : validator(query[key]);
727
961
  if (result instanceof Error) {
728
- return respond(result.status || status_ts_1.Status._400_BadRequest, result.message, "error", "query-validator");
962
+ const status = result.status || status_ts_1.Status._400_BadRequest;
963
+ return respond(status, result.message, status >= 500 ? "error" : "message", "query-validator");
729
964
  }
730
965
  else if (queryErrors && errorMatches(result, queryErrors)) {
731
- return respond(result.status || status_ts_1.Status._400_BadRequest, String(result), "error", "query-validator");
966
+ const status = result.status || status_ts_1.Status._400_BadRequest;
967
+ return respond(status, String(result), status >= 500 ? "error" : "message", "query-validator");
732
968
  }
733
969
  else if (result instanceof Response ||
734
970
  result === types_ts_1.Break_Pipe ||
@@ -742,7 +978,10 @@ const validate = ({ responseType = "text", errors, paramsMutation = false, param
742
978
  }
743
979
  // Parse cookie
744
980
  if (cookieParser) {
745
- yield cookieParser(ctx);
981
+ const response = yield cookieParser(ctx);
982
+ if (response instanceof Response) {
983
+ return response;
984
+ }
746
985
  }
747
986
  const cookie = ctx.cookie;
748
987
  // Validate Cookie
@@ -751,10 +990,12 @@ const validate = ({ responseType = "text", errors, paramsMutation = false, param
751
990
  ? cookieValidator.bind(ctx)(cookie)
752
991
  : cookieValidator(cookie);
753
992
  if (result instanceof Error) {
754
- return respond(result.status || status_ts_1.Status._400_BadRequest, result.message, "error", "cookie-validator");
993
+ const status = result.status || status_ts_1.Status._400_BadRequest;
994
+ return respond(status, result.message, status >= 500 ? "error" : "message", "cookie-validator");
755
995
  }
756
996
  else if (cookieErrors && errorMatches(result, cookieErrors)) {
757
- return respond(result.status || status_ts_1.Status._400_BadRequest, String(result), "error", "cookie-validator");
997
+ const status = result.status || status_ts_1.Status._400_BadRequest;
998
+ return respond(status, String(result), status >= 500 ? "error" : "message", "cookie-validator");
758
999
  }
759
1000
  else if (result instanceof Response ||
760
1001
  result === types_ts_1.Break_Pipe ||
@@ -785,10 +1026,12 @@ const validate = ({ responseType = "text", errors, paramsMutation = false, param
785
1026
  ? validator.bind(ctx)(cookie[key])
786
1027
  : validator(cookie[key]);
787
1028
  if (result instanceof Error) {
788
- return respond(result.status || status_ts_1.Status._400_BadRequest, result.message, "error", "cookie-validator");
1029
+ const status = result.status || status_ts_1.Status._400_BadRequest;
1030
+ return respond(status, result.message, status >= 500 ? "error" : "message", "cookie-validator");
789
1031
  }
790
1032
  else if (cookieErrors && errorMatches(result, cookieErrors)) {
791
- return respond(result.status || status_ts_1.Status._400_BadRequest, String(result), "error", "cookie-validator");
1033
+ const status = result.status || status_ts_1.Status._400_BadRequest;
1034
+ return respond(status, String(result), status >= 500 ? "error" : "message", "cookie-validator");
792
1035
  }
793
1036
  else if (result instanceof Response ||
794
1037
  result === types_ts_1.Break_Pipe ||
@@ -802,17 +1045,22 @@ const validate = ({ responseType = "text", errors, paramsMutation = false, param
802
1045
  }
803
1046
  // Parse body
804
1047
  if (bodyParser) {
805
- yield bodyParser(ctx);
1048
+ const response = yield bodyParser(ctx);
1049
+ if (response instanceof Response) {
1050
+ return response;
1051
+ }
806
1052
  }
807
1053
  const body = ctx.body;
808
1054
  // Validate Body
809
1055
  if (bodyValidators) {
810
1056
  const bodyIsArray = Array.isArray(body);
811
1057
  if (bodyValidatorIsArray && !bodyIsArray) {
812
- return respond(status_ts_1.Status._400_BadRequest, "array body type expected", "error", "body-validator");
1058
+ const status = status_ts_1.Status._400_BadRequest;
1059
+ return respond(status, "array body type expected", status >= 500 ? "error" : "message", "body-validator");
813
1060
  }
814
1061
  else if (!bodyValidatorIsArray && bodyIsArray) {
815
- return respond(status_ts_1.Status._400_BadRequest, "object body type expected", "error", "body-validator");
1062
+ const status = status_ts_1.Status._400_BadRequest;
1063
+ return respond(status, "object body type expected", status >= 500 ? "error" : "message", "body-validator");
816
1064
  }
817
1065
  if (bodyIsArray) {
818
1066
  for (let i = 0; i < body.length; i++) {
@@ -823,10 +1071,12 @@ const validate = ({ responseType = "text", errors, paramsMutation = false, param
823
1071
  ? validator.bind(ctx)(activeBody, i)
824
1072
  : validator(activeBody, i);
825
1073
  if (result instanceof Error) {
826
- return respond(result.status || status_ts_1.Status._400_BadRequest, result.message, "error", "body-validator");
1074
+ const status = result.status || status_ts_1.Status._400_BadRequest;
1075
+ return respond(status, result.message, status >= 500 ? "error" : "message", "body-validator");
827
1076
  }
828
1077
  else if (bodyErrors && errorMatches(result, bodyErrors)) {
829
- return respond(result.status || status_ts_1.Status._400_BadRequest, String(result), "error", "body-validator");
1078
+ const status = result.status || status_ts_1.Status._400_BadRequest;
1079
+ return respond(status, String(result), status >= 500 ? "error" : "message", "body-validator");
830
1080
  }
831
1081
  else if (result instanceof Response ||
832
1082
  result === types_ts_1.Break_Pipe ||
@@ -863,10 +1113,12 @@ const validate = ({ responseType = "text", errors, paramsMutation = false, param
863
1113
  ? propValidator.bind(ctx)(activeBody[key], i)
864
1114
  : propValidator(activeBody[key], i);
865
1115
  if (result instanceof Error) {
866
- return respond(result.status || status_ts_1.Status._400_BadRequest, result.message, "error", "body-validator");
1116
+ const status = result.status || status_ts_1.Status._400_BadRequest;
1117
+ return respond(status, result.message, status >= 500 ? "error" : "message", "body-validator");
867
1118
  }
868
1119
  else if (bodyErrors && errorMatches(result, bodyErrors)) {
869
- return respond(result.status || status_ts_1.Status._400_BadRequest, String(result), "error", "body-validator");
1120
+ const status = result.status || status_ts_1.Status._400_BadRequest;
1121
+ return respond(status, String(result), status >= 500 ? "error" : "message", "body-validator");
870
1122
  }
871
1123
  else if (result instanceof Response ||
872
1124
  result === types_ts_1.Break_Pipe ||
@@ -879,7 +1131,7 @@ const validate = ({ responseType = "text", errors, paramsMutation = false, param
879
1131
  }
880
1132
  }
881
1133
  else {
882
- return respond(status_ts_1.Status._400_BadRequest, `Invalid body type at index ${i}`, "error", "body-validator");
1134
+ return respond(status_ts_1.Status._400_BadRequest, `Invalid body type at index ${i}`, "message", "body-validator");
883
1135
  }
884
1136
  }
885
1137
  }
@@ -891,10 +1143,12 @@ const validate = ({ responseType = "text", errors, paramsMutation = false, param
891
1143
  ? validator.bind(ctx)(body)
892
1144
  : validator(body);
893
1145
  if (result instanceof Error) {
894
- return respond(result.status || status_ts_1.Status._400_BadRequest, result.message, "error", "body-validator");
1146
+ const status = result.status || status_ts_1.Status._400_BadRequest;
1147
+ return respond(status, result.message, status >= 500 ? "error" : "message", "body-validator");
895
1148
  }
896
1149
  else if (bodyErrors && errorMatches(result, bodyErrors)) {
897
- return respond(result.status || status_ts_1.Status._400_BadRequest, String(result), "error", "body-validator");
1150
+ const status = result.status || status_ts_1.Status._400_BadRequest;
1151
+ return respond(status, String(result), status >= 500 ? "error" : "message", "body-validator");
898
1152
  }
899
1153
  else if (result instanceof Response ||
900
1154
  result === types_ts_1.Break_Pipe ||
@@ -929,10 +1183,12 @@ const validate = ({ responseType = "text", errors, paramsMutation = false, param
929
1183
  ? propValidator.bind(ctx)(body[key])
930
1184
  : propValidator(body[key]);
931
1185
  if (result instanceof Error) {
932
- return respond(result.status || status_ts_1.Status._400_BadRequest, result.message, "error", "body-validator");
1186
+ const status = result.status || status_ts_1.Status._400_BadRequest;
1187
+ return respond(status, result.message, status >= 500 ? "error" : "message", "body-validator");
933
1188
  }
934
1189
  else if (bodyErrors && errorMatches(result, bodyErrors)) {
935
- return respond(result.status || status_ts_1.Status._400_BadRequest, String(result), "error", "body-validator");
1190
+ const status = result.status || status_ts_1.Status._400_BadRequest;
1191
+ return respond(status, String(result), status >= 500 ? "error" : "message", "body-validator");
936
1192
  }
937
1193
  else if (result instanceof Response ||
938
1194
  result === types_ts_1.Break_Pipe ||
@@ -945,7 +1201,7 @@ const validate = ({ responseType = "text", errors, paramsMutation = false, param
945
1201
  }
946
1202
  }
947
1203
  else {
948
- return respond(status_ts_1.Status._400_BadRequest, "Invalid body type", "error", "body-validator");
1204
+ return respond(status_ts_1.Status._400_BadRequest, "Invalid body type", "message", "body-validator");
949
1205
  }
950
1206
  }
951
1207
  }