exisjs 0.7.5 → 0.7.7

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 (321) hide show
  1. package/dist/cli/commands/build.d.ts.map +1 -1
  2. package/dist/cli/commands/build.js +12 -0
  3. package/dist/cli/commands/build.js.map +1 -1
  4. package/dist/cli/commands/clean.d.ts +5 -0
  5. package/dist/cli/commands/clean.d.ts.map +1 -0
  6. package/dist/cli/commands/clean.js +30 -0
  7. package/dist/cli/commands/clean.js.map +1 -0
  8. package/dist/cli/commands/dev.d.ts.map +1 -1
  9. package/dist/cli/commands/dev.js +171 -86
  10. package/dist/cli/commands/dev.js.map +1 -1
  11. package/dist/cli/commands/generate.d.ts +6 -1
  12. package/dist/cli/commands/generate.d.ts.map +1 -1
  13. package/dist/cli/commands/generate.js +57 -2
  14. package/dist/cli/commands/generate.js.map +1 -1
  15. package/dist/cli/commands/start.d.ts.map +1 -1
  16. package/dist/cli/commands/start.js +54 -16
  17. package/dist/cli/commands/start.js.map +1 -1
  18. package/dist/cli/index.js +26 -3
  19. package/dist/cli/index.js.map +1 -1
  20. package/dist/cli/manifest.d.ts +1 -0
  21. package/dist/cli/manifest.d.ts.map +1 -1
  22. package/dist/cli/manifest.js +264 -33
  23. package/dist/cli/manifest.js.map +1 -1
  24. package/dist/cli/resolve-aliases.d.ts +1 -1
  25. package/dist/cli/resolve-aliases.d.ts.map +1 -1
  26. package/dist/cli/resolve-aliases.js +30 -13
  27. package/dist/cli/resolve-aliases.js.map +1 -1
  28. package/dist/config/config.d.ts +3 -1
  29. package/dist/config/config.d.ts.map +1 -1
  30. package/dist/config/config.js +9 -0
  31. package/dist/config/config.js.map +1 -1
  32. package/dist/config/types.d.ts +6 -0
  33. package/dist/config/types.d.ts.map +1 -1
  34. package/dist/cron/expressions.d.ts +45 -0
  35. package/dist/cron/expressions.d.ts.map +1 -0
  36. package/dist/cron/expressions.js +87 -0
  37. package/dist/cron/expressions.js.map +1 -0
  38. package/dist/cron/index.d.ts +6 -0
  39. package/dist/cron/index.d.ts.map +1 -0
  40. package/dist/cron/index.js +22 -0
  41. package/dist/cron/index.js.map +1 -0
  42. package/dist/cron/job.d.ts +50 -0
  43. package/dist/cron/job.d.ts.map +1 -0
  44. package/dist/cron/job.js +247 -0
  45. package/dist/cron/job.js.map +1 -0
  46. package/dist/cron/manager.d.ts +105 -0
  47. package/dist/cron/manager.d.ts.map +1 -0
  48. package/dist/cron/manager.js +245 -0
  49. package/dist/cron/manager.js.map +1 -0
  50. package/dist/cron/parser.d.ts +22 -0
  51. package/dist/cron/parser.d.ts.map +1 -0
  52. package/dist/cron/parser.js +269 -0
  53. package/dist/cron/parser.js.map +1 -0
  54. package/dist/cron/types.d.ts +76 -0
  55. package/dist/cron/types.d.ts.map +1 -0
  56. package/dist/cron/types.js +3 -0
  57. package/dist/cron/types.js.map +1 -0
  58. package/dist/decorators/constants.d.ts +2 -0
  59. package/dist/decorators/constants.d.ts.map +1 -1
  60. package/dist/decorators/constants.js +3 -1
  61. package/dist/decorators/constants.js.map +1 -1
  62. package/dist/decorators/core.d.ts +29 -11
  63. package/dist/decorators/core.d.ts.map +1 -1
  64. package/dist/decorators/core.js +49 -11
  65. package/dist/decorators/core.js.map +1 -1
  66. package/dist/decorators/cron.d.ts +57 -0
  67. package/dist/decorators/cron.d.ts.map +1 -0
  68. package/dist/decorators/cron.js +143 -0
  69. package/dist/decorators/cron.js.map +1 -0
  70. package/dist/decorators/index.d.ts +2 -0
  71. package/dist/decorators/index.d.ts.map +1 -1
  72. package/dist/decorators/index.js +2 -0
  73. package/dist/decorators/index.js.map +1 -1
  74. package/dist/decorators/middleware.d.ts +65 -2
  75. package/dist/decorators/middleware.d.ts.map +1 -1
  76. package/dist/decorators/middleware.js +148 -62
  77. package/dist/decorators/middleware.js.map +1 -1
  78. package/dist/decorators/params.d.ts +102 -2
  79. package/dist/decorators/params.d.ts.map +1 -1
  80. package/dist/decorators/params.js +105 -3
  81. package/dist/decorators/params.js.map +1 -1
  82. package/dist/decorators/response.d.ts.map +1 -1
  83. package/dist/decorators/response.js +32 -22
  84. package/dist/decorators/response.js.map +1 -1
  85. package/dist/decorators/routing.d.ts +81 -16
  86. package/dist/decorators/routing.d.ts.map +1 -1
  87. package/dist/decorators/routing.js +81 -16
  88. package/dist/decorators/routing.js.map +1 -1
  89. package/dist/di/container.d.ts.map +1 -1
  90. package/dist/di/container.js +6 -1
  91. package/dist/di/container.js.map +1 -1
  92. package/dist/docs/content/cli/commands.mdx +1 -1
  93. package/dist/docs/content/controllers.mdx +127 -10
  94. package/dist/docs/content/cron.mdx +196 -0
  95. package/dist/docs/content/decorators.mdx +22 -4
  96. package/dist/docs/content/errors.mdx +58 -9
  97. package/dist/docs/content/introduction.mdx +7 -7
  98. package/dist/docs/content/middleware.mdx +269 -6
  99. package/dist/docs/content/requests.mdx +180 -6
  100. package/dist/docs/content/responses.mdx +283 -32
  101. package/dist/docs/content/routing.mdx +46 -0
  102. package/dist/docs/content/swagger.mdx +228 -0
  103. package/dist/docs/content/validation.mdx +190 -11
  104. package/dist/docs/reference/context.mdx +11 -0
  105. package/dist/docs/reference/cron.mdx +300 -0
  106. package/dist/docs/reference/decorators.mdx +22 -4
  107. package/dist/docs/reference/error.mdx +88 -0
  108. package/dist/docs/reference/logger.mdx +175 -43
  109. package/dist/docs/reference/middleware.mdx +31 -0
  110. package/dist/docs/reference/router.mdx +22 -0
  111. package/dist/docs/reference/swagger.mdx +143 -0
  112. package/dist/docs/reference/validator.mdx +83 -23
  113. package/dist/error/errors.d.ts.map +1 -1
  114. package/dist/error/errors.js +95 -43
  115. package/dist/error/errors.js.map +1 -1
  116. package/dist/error/index.d.ts +1 -0
  117. package/dist/error/index.d.ts.map +1 -1
  118. package/dist/error/index.js +11 -1
  119. package/dist/error/index.js.map +1 -1
  120. package/dist/error/overlay.d.ts +42 -0
  121. package/dist/error/overlay.d.ts.map +1 -0
  122. package/dist/error/overlay.js +306 -0
  123. package/dist/error/overlay.js.map +1 -0
  124. package/dist/index.d.ts +1 -0
  125. package/dist/index.d.ts.map +1 -1
  126. package/dist/index.js +22 -1
  127. package/dist/index.js.map +1 -1
  128. package/dist/lib/start-server.js +33 -7
  129. package/dist/lib/start-server.js.map +1 -1
  130. package/dist/logger/index.d.ts +1 -1
  131. package/dist/logger/index.d.ts.map +1 -1
  132. package/dist/logger/index.js +9 -1
  133. package/dist/logger/index.js.map +1 -1
  134. package/dist/middleware/guard.d.ts +2 -2
  135. package/dist/middleware/guard.d.ts.map +1 -1
  136. package/dist/middleware/guard.js.map +1 -1
  137. package/dist/middleware/ip-filter.d.ts +1 -0
  138. package/dist/middleware/ip-filter.d.ts.map +1 -1
  139. package/dist/middleware/ip-filter.js +2 -0
  140. package/dist/middleware/ip-filter.js.map +1 -1
  141. package/dist/middleware/middleware.d.ts +2 -2
  142. package/dist/middleware/middleware.d.ts.map +1 -1
  143. package/dist/middleware/middleware.js +20 -2
  144. package/dist/middleware/middleware.js.map +1 -1
  145. package/dist/middleware/security.d.ts +43 -1
  146. package/dist/middleware/security.d.ts.map +1 -1
  147. package/dist/middleware/security.js +101 -0
  148. package/dist/middleware/security.js.map +1 -1
  149. package/dist/response/index.d.ts +229 -6
  150. package/dist/response/index.d.ts.map +1 -1
  151. package/dist/response/index.js +272 -2
  152. package/dist/response/index.js.map +1 -1
  153. package/dist/router/boundary.d.ts +41 -11
  154. package/dist/router/boundary.d.ts.map +1 -1
  155. package/dist/router/boundary.js +24 -2
  156. package/dist/router/boundary.js.map +1 -1
  157. package/dist/router/controller-registrar.d.ts.map +1 -1
  158. package/dist/router/controller-registrar.js +108 -4
  159. package/dist/router/controller-registrar.js.map +1 -1
  160. package/dist/router/index.d.ts +2 -2
  161. package/dist/router/index.d.ts.map +1 -1
  162. package/dist/router/index.js +2 -1
  163. package/dist/router/index.js.map +1 -1
  164. package/dist/router/route-builder.d.ts +262 -65
  165. package/dist/router/route-builder.d.ts.map +1 -1
  166. package/dist/router/route-builder.js +181 -23
  167. package/dist/router/route-builder.js.map +1 -1
  168. package/dist/router/route-scanner.d.ts +6 -0
  169. package/dist/router/route-scanner.d.ts.map +1 -1
  170. package/dist/router/route-scanner.js +71 -792
  171. package/dist/router/route-scanner.js.map +1 -1
  172. package/dist/router/router.d.ts.map +1 -1
  173. package/dist/router/router.js +62 -17
  174. package/dist/router/router.js.map +1 -1
  175. package/dist/router/scanner/boundary-loader.d.ts +18 -0
  176. package/dist/router/scanner/boundary-loader.d.ts.map +1 -0
  177. package/dist/router/scanner/boundary-loader.js +539 -0
  178. package/dist/router/scanner/boundary-loader.js.map +1 -0
  179. package/dist/router/scanner/cron-mounter.d.ts +15 -0
  180. package/dist/router/scanner/cron-mounter.d.ts.map +1 -0
  181. package/dist/router/scanner/cron-mounter.js +216 -0
  182. package/dist/router/scanner/cron-mounter.js.map +1 -0
  183. package/dist/router/scanner/error-mounter.d.ts +14 -0
  184. package/dist/router/scanner/error-mounter.d.ts.map +1 -0
  185. package/dist/router/scanner/error-mounter.js +200 -0
  186. package/dist/router/scanner/error-mounter.js.map +1 -0
  187. package/dist/router/scanner/fs-scanner.d.ts +25 -0
  188. package/dist/router/scanner/fs-scanner.d.ts.map +1 -0
  189. package/dist/router/scanner/fs-scanner.js +115 -0
  190. package/dist/router/scanner/fs-scanner.js.map +1 -0
  191. package/dist/router/scanner/functional-compiler.d.ts +9 -0
  192. package/dist/router/scanner/functional-compiler.d.ts.map +1 -0
  193. package/dist/router/scanner/functional-compiler.js +233 -0
  194. package/dist/router/scanner/functional-compiler.js.map +1 -0
  195. package/dist/router/scanner/index.d.ts +9 -0
  196. package/dist/router/scanner/index.d.ts.map +1 -0
  197. package/dist/router/scanner/index.js +19 -0
  198. package/dist/router/scanner/index.js.map +1 -0
  199. package/dist/router/types.d.ts +23 -0
  200. package/dist/router/types.d.ts.map +1 -1
  201. package/dist/server/app.d.ts +3 -0
  202. package/dist/server/app.d.ts.map +1 -1
  203. package/dist/server/app.js +13 -0
  204. package/dist/server/app.js.map +1 -1
  205. package/dist/server/bootstrapper.d.ts.map +1 -1
  206. package/dist/server/bootstrapper.js +91 -30
  207. package/dist/server/bootstrapper.js.map +1 -1
  208. package/dist/server/cluster.d.ts.map +1 -1
  209. package/dist/server/cluster.js +13 -2
  210. package/dist/server/cluster.js.map +1 -1
  211. package/dist/server/context.d.ts +8 -0
  212. package/dist/server/context.d.ts.map +1 -1
  213. package/dist/server/context.js +50 -6
  214. package/dist/server/context.js.map +1 -1
  215. package/dist/server/helpers/body-parser.d.ts +18 -0
  216. package/dist/server/helpers/body-parser.d.ts.map +1 -0
  217. package/dist/server/helpers/body-parser.js +246 -0
  218. package/dist/server/helpers/body-parser.js.map +1 -0
  219. package/dist/server/helpers/cookie.d.ts +4 -0
  220. package/dist/server/helpers/cookie.d.ts.map +1 -0
  221. package/dist/server/helpers/cookie.js +61 -0
  222. package/dist/server/helpers/cookie.js.map +1 -0
  223. package/dist/server/helpers/etag.d.ts +3 -0
  224. package/dist/server/helpers/etag.d.ts.map +1 -0
  225. package/dist/server/helpers/etag.js +25 -0
  226. package/dist/server/helpers/etag.js.map +1 -0
  227. package/dist/server/helpers/index.d.ts +6 -0
  228. package/dist/server/helpers/index.d.ts.map +1 -0
  229. package/dist/server/helpers/index.js +21 -0
  230. package/dist/server/helpers/index.js.map +1 -0
  231. package/dist/server/helpers/ip.d.ts +9 -0
  232. package/dist/server/helpers/ip.d.ts.map +1 -0
  233. package/dist/server/helpers/ip.js +62 -0
  234. package/dist/server/helpers/ip.js.map +1 -0
  235. package/dist/server/helpers/stream.d.ts +4 -0
  236. package/dist/server/helpers/stream.d.ts.map +1 -0
  237. package/dist/server/helpers/stream.js +193 -0
  238. package/dist/server/helpers/stream.js.map +1 -0
  239. package/dist/server/lifecycle.d.ts +22 -0
  240. package/dist/server/lifecycle.d.ts.map +1 -0
  241. package/dist/server/lifecycle.js +106 -0
  242. package/dist/server/lifecycle.js.map +1 -0
  243. package/dist/server/request-handler.d.ts +1 -0
  244. package/dist/server/request-handler.d.ts.map +1 -1
  245. package/dist/server/request-handler.js +27 -17
  246. package/dist/server/request-handler.js.map +1 -1
  247. package/dist/server/request.d.ts +1 -139
  248. package/dist/server/request.d.ts.map +1 -1
  249. package/dist/server/request.js +37 -433
  250. package/dist/server/request.js.map +1 -1
  251. package/dist/server/response.d.ts +112 -156
  252. package/dist/server/response.d.ts.map +1 -1
  253. package/dist/server/response.js +129 -279
  254. package/dist/server/response.js.map +1 -1
  255. package/dist/swagger/decorators.d.ts +81 -0
  256. package/dist/swagger/decorators.d.ts.map +1 -0
  257. package/dist/swagger/decorators.js +172 -0
  258. package/dist/swagger/decorators.js.map +1 -0
  259. package/dist/swagger/generator.d.ts +19 -0
  260. package/dist/swagger/generator.d.ts.map +1 -0
  261. package/dist/swagger/generator.js +344 -0
  262. package/dist/swagger/generator.js.map +1 -0
  263. package/dist/swagger/index.d.ts +31 -0
  264. package/dist/swagger/index.d.ts.map +1 -0
  265. package/dist/swagger/index.js +53 -0
  266. package/dist/swagger/index.js.map +1 -0
  267. package/dist/swagger/mounter.d.ts +7 -0
  268. package/dist/swagger/mounter.d.ts.map +1 -0
  269. package/dist/swagger/mounter.js +56 -0
  270. package/dist/swagger/mounter.js.map +1 -0
  271. package/dist/swagger/types.d.ts +190 -0
  272. package/dist/swagger/types.d.ts.map +1 -0
  273. package/dist/swagger/types.js +3 -0
  274. package/dist/swagger/types.js.map +1 -0
  275. package/dist/swagger/ui.d.ts +6 -0
  276. package/dist/swagger/ui.d.ts.map +1 -0
  277. package/dist/swagger/ui.js +118 -0
  278. package/dist/swagger/ui.js.map +1 -0
  279. package/dist/testing/index.d.ts.map +1 -1
  280. package/dist/testing/index.js +6 -1
  281. package/dist/testing/index.js.map +1 -1
  282. package/dist/testing/mocks.d.ts.map +1 -1
  283. package/dist/testing/mocks.js +15 -3
  284. package/dist/testing/mocks.js.map +1 -1
  285. package/dist/utils/logger.d.ts +8 -0
  286. package/dist/utils/logger.d.ts.map +1 -1
  287. package/dist/utils/logger.js +184 -1
  288. package/dist/utils/logger.js.map +1 -1
  289. package/dist/validator/builder.d.ts +223 -0
  290. package/dist/validator/builder.d.ts.map +1 -0
  291. package/dist/validator/builder.js +517 -0
  292. package/dist/validator/builder.js.map +1 -0
  293. package/dist/validator/engine.d.ts +19 -0
  294. package/dist/validator/engine.d.ts.map +1 -0
  295. package/dist/validator/engine.js +568 -0
  296. package/dist/validator/engine.js.map +1 -0
  297. package/dist/validator/error.d.ts +12 -0
  298. package/dist/validator/error.d.ts.map +1 -0
  299. package/dist/validator/error.js +63 -0
  300. package/dist/validator/error.js.map +1 -0
  301. package/dist/validator/pagination.d.ts +40 -0
  302. package/dist/validator/pagination.d.ts.map +1 -0
  303. package/dist/validator/pagination.js +60 -0
  304. package/dist/validator/pagination.js.map +1 -0
  305. package/dist/validator/tex-types.d.ts +2 -1
  306. package/dist/validator/tex-types.d.ts.map +1 -1
  307. package/dist/validator/tex-types.js +2 -1
  308. package/dist/validator/tex-types.js.map +1 -1
  309. package/dist/validator/tex.d.ts +6 -142
  310. package/dist/validator/tex.d.ts.map +1 -1
  311. package/dist/validator/tex.js +14 -733
  312. package/dist/validator/tex.js.map +1 -1
  313. package/dist/validator/types.d.ts +83 -0
  314. package/dist/validator/types.d.ts.map +1 -0
  315. package/dist/validator/types.js +3 -0
  316. package/dist/validator/types.js.map +1 -0
  317. package/package.json +8 -4
  318. package/dist/dev/error-overlay.d.ts +0 -3
  319. package/dist/dev/error-overlay.d.ts.map +0 -1
  320. package/dist/dev/error-overlay.js +0 -118
  321. package/dist/dev/error-overlay.js.map +0 -1
@@ -1,19 +1,289 @@
1
1
  "use strict";
2
+ // ─── Standard Response Envelope Types ─────────────────────────────────────────
2
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.formatSSEEvent = exports.SSEStream = exports.ExisResponse = exports.HttpStatus = void 0;
5
+ exports.getStatusText = getStatusText;
6
+ exports.isSuccessStatus = isSuccessStatus;
7
+ exports.isRedirectStatus = isRedirectStatus;
8
+ exports.isClientError = isClientError;
9
+ exports.isServerError = isServerError;
3
10
  exports.success = success;
11
+ exports.created = created;
12
+ exports.accepted = accepted;
13
+ exports.noContent = noContent;
4
14
  exports.error = error;
5
- function success(data, message) {
15
+ exports.problem = problem;
16
+ exports.paginate = paginate;
17
+ exports.getPaginationSkip = getPaginationSkip;
18
+ exports.json = json;
19
+ exports.redirect = redirect;
20
+ // ─── HTTP Status Codes ────────────────────────────────────────────────────────
21
+ /**
22
+ * Standard HTTP Status Code Constants.
23
+ */
24
+ exports.HttpStatus = {
25
+ // 2xx Success
26
+ OK: 200,
27
+ CREATED: 201,
28
+ ACCEPTED: 202,
29
+ NON_AUTHORITATIVE_INFORMATION: 203,
30
+ NO_CONTENT: 204,
31
+ RESET_CONTENT: 205,
32
+ PARTIAL_CONTENT: 206,
33
+ // 3xx Redirection
34
+ MULTIPLE_CHOICES: 300,
35
+ MOVED_PERMANENTLY: 301,
36
+ FOUND: 302,
37
+ SEE_OTHER: 303,
38
+ NOT_MODIFIED: 304,
39
+ TEMPORARY_REDIRECT: 307,
40
+ PERMANENT_REDIRECT: 308,
41
+ // 4xx Client Errors
42
+ BAD_REQUEST: 400,
43
+ UNAUTHORIZED: 401,
44
+ PAYMENT_REQUIRED: 402,
45
+ FORBIDDEN: 403,
46
+ NOT_FOUND: 404,
47
+ METHOD_NOT_ALLOWED: 405,
48
+ NOT_ACCEPTABLE: 406,
49
+ PROXY_AUTHENTICATION_REQUIRED: 407,
50
+ REQUEST_TIMEOUT: 408,
51
+ CONFLICT: 409,
52
+ GONE: 410,
53
+ LENGTH_REQUIRED: 411,
54
+ PRECONDITION_FAILED: 412,
55
+ PAYLOAD_TOO_LARGE: 413,
56
+ URI_TOO_LONG: 414,
57
+ UNSUPPORTED_MEDIA_TYPE: 415,
58
+ RANGE_NOT_SATISFIABLE: 416,
59
+ EXPECTATION_FAILED: 417,
60
+ IM_A_TEAPOT: 418,
61
+ MISDIRECTED_REQUEST: 421,
62
+ UNPROCESSABLE_ENTITY: 422,
63
+ LOCKED: 423,
64
+ FAILED_DEPENDENCY: 424,
65
+ TOO_EARLY: 425,
66
+ UPGRADE_REQUIRED: 426,
67
+ PRECONDITION_REQUIRED: 428,
68
+ TOO_MANY_REQUESTS: 429,
69
+ REQUEST_HEADER_FIELDS_TOO_LARGE: 431,
70
+ UNAVAILABLE_FOR_LEGAL_REASONS: 451,
71
+ // 5xx Server Errors
72
+ INTERNAL_SERVER_ERROR: 500,
73
+ NOT_IMPLEMENTED: 501,
74
+ BAD_GATEWAY: 502,
75
+ SERVICE_UNAVAILABLE: 503,
76
+ GATEWAY_TIMEOUT: 504,
77
+ HTTP_VERSION_NOT_SUPPORTED: 505,
78
+ VARIANT_ALSO_NEGOTIATES: 506,
79
+ INSUFFICIENT_STORAGE: 507,
80
+ LOOP_DETECTED: 508,
81
+ NOT_EXTENDED: 510,
82
+ NETWORK_AUTHENTICATION_REQUIRED: 511,
83
+ };
84
+ const STATUS_TEXT_MAP = {
85
+ 200: 'OK',
86
+ 201: 'Created',
87
+ 202: 'Accepted',
88
+ 204: 'No Content',
89
+ 301: 'Moved Permanently',
90
+ 302: 'Found',
91
+ 304: 'Not Modified',
92
+ 307: 'Temporary Redirect',
93
+ 308: 'Permanent Redirect',
94
+ 400: 'Bad Request',
95
+ 401: 'Unauthorized',
96
+ 403: 'Forbidden',
97
+ 404: 'Not Found',
98
+ 405: 'Method Not Allowed',
99
+ 406: 'Not Acceptable',
100
+ 409: 'Conflict',
101
+ 410: 'Gone',
102
+ 413: 'Payload Too Large',
103
+ 415: 'Unsupported Media Type',
104
+ 422: 'Unprocessable Entity',
105
+ 429: 'Too Many Requests',
106
+ 500: 'Internal Server Error',
107
+ 501: 'Not Implemented',
108
+ 502: 'Bad Gateway',
109
+ 503: 'Service Unavailable',
110
+ 504: 'Gateway Timeout',
111
+ };
112
+ /**
113
+ * Returns human-readable status text for a given HTTP status code.
114
+ */
115
+ function getStatusText(status) {
116
+ return (STATUS_TEXT_MAP[status] ||
117
+ (status >= 200 && status < 300 ? 'OK' : 'Unknown Status'));
118
+ }
119
+ /**
120
+ * Determines whether a status code represents a 2xx success.
121
+ */
122
+ function isSuccessStatus(status) {
123
+ return status >= 200 && status < 300;
124
+ }
125
+ /**
126
+ * Determines whether a status code represents a 3xx redirection.
127
+ */
128
+ function isRedirectStatus(status) {
129
+ return status >= 300 && status < 400;
130
+ }
131
+ /**
132
+ * Determines whether a status code represents a 4xx client error.
133
+ */
134
+ function isClientError(status) {
135
+ return status >= 400 && status < 500;
136
+ }
137
+ /**
138
+ * Determines whether a status code represents a 5xx server error.
139
+ */
140
+ function isServerError(status) {
141
+ return status >= 500 && status < 600;
142
+ }
143
+ // ─── Response Builders ────────────────────────────────────────────────────────
144
+ /**
145
+ * Creates a standard 200 OK success response envelope.
146
+ *
147
+ * @example
148
+ * return success(user, 'User profile retrieved successfully')
149
+ */
150
+ function success(data, message, meta) {
6
151
  const res = { success: true, data };
7
152
  if (message !== undefined)
8
153
  res.message = message;
154
+ if (meta !== undefined)
155
+ res.meta = meta;
156
+ return res;
157
+ }
158
+ /**
159
+ * Creates a standard 201 Created response envelope.
160
+ *
161
+ * @example
162
+ * return created(newUser, 'User created successfully')
163
+ */
164
+ function created(data, message = 'Created', meta) {
165
+ const res = { success: true, data, message };
166
+ if (meta !== undefined)
167
+ res.meta = meta;
168
+ return res;
169
+ }
170
+ /**
171
+ * Creates a standard 202 Accepted response envelope for async background processing.
172
+ *
173
+ * @example
174
+ * return accepted({ jobId: '123' }, 'Job queued for background execution')
175
+ */
176
+ function accepted(data = null, message = 'Accepted', meta) {
177
+ const res = { success: true, data, message };
178
+ if (meta !== undefined)
179
+ res.meta = meta;
9
180
  return res;
10
181
  }
11
- function error(message, code, details) {
182
+ /**
183
+ * Creates a standard 204 No Content response representation.
184
+ *
185
+ * @example
186
+ * return noContent()
187
+ */
188
+ function noContent() {
189
+ return { success: true, data: null };
190
+ }
191
+ /**
192
+ * Creates a standard error response envelope.
193
+ *
194
+ * @example
195
+ * return error('Invalid credentials', 'AUTH_INVALID_CREDENTIALS', undefined, 401)
196
+ */
197
+ function error(message, code, details, status) {
12
198
  const res = { success: false, error: { message } };
13
199
  if (code !== undefined)
14
200
  res.error.code = code;
15
201
  if (details !== undefined)
16
202
  res.error.details = details;
203
+ if (status !== undefined)
204
+ res.error.status = status;
17
205
  return res;
18
206
  }
207
+ /**
208
+ * Creates a standardized RFC 7807 / RFC 9457 Problem Details object.
209
+ *
210
+ * @example
211
+ * return problem('Invalid Request Body', 422, 'The email field is invalid', {
212
+ * invalidParams: [{ name: 'email', reason: 'Must be a valid email format' }]
213
+ * })
214
+ */
215
+ function problem(title, status, detail, options = {}) {
216
+ return {
217
+ title,
218
+ status,
219
+ ...(detail ? { detail } : {}),
220
+ ...options,
221
+ };
222
+ }
223
+ /**
224
+ * Creates a standardized paginated response envelope.
225
+ *
226
+ * @example
227
+ * return paginate(users, totalCount, { page: 1, limit: 20 })
228
+ */
229
+ function paginate(data, total, options = {}, message, meta) {
230
+ const page = Math.max(1, Number(options.page) || 1);
231
+ const limit = Math.max(1, Number(options.limit) || 20);
232
+ const totalPages = Math.ceil(total / limit);
233
+ const hasNext = page < totalPages;
234
+ const hasPrev = page > 1;
235
+ const res = {
236
+ success: true,
237
+ data,
238
+ pagination: {
239
+ page,
240
+ limit,
241
+ total,
242
+ totalPages,
243
+ hasNextPage: hasNext,
244
+ hasPrevPage: hasPrev,
245
+ hasNext,
246
+ hasPrev,
247
+ },
248
+ };
249
+ if (message !== undefined)
250
+ res.message = message;
251
+ if (meta !== undefined)
252
+ res.meta = meta;
253
+ return res;
254
+ }
255
+ /**
256
+ * Calculates SQL/Database `skip` (offset) and `limit` from pagination query parameters.
257
+ *
258
+ * @example
259
+ * const { skip, limit, page } = getPaginationSkip(req.query)
260
+ * const users = await db.user.findMany({ skip, take: limit })
261
+ */
262
+ function getPaginationSkip(query = {}) {
263
+ const page = Math.max(1, Number(query.page) || 1);
264
+ const limit = Math.max(1, Number(query.limit) || 20);
265
+ return {
266
+ skip: (page - 1) * limit,
267
+ limit,
268
+ page,
269
+ };
270
+ }
271
+ /**
272
+ * Helper to build custom JSON payload structure with optional status code and headers hint.
273
+ */
274
+ function json(data, status = 200, headers = {}) {
275
+ return { data, status, headers };
276
+ }
277
+ /**
278
+ * Helper to create a redirection descriptor.
279
+ */
280
+ function redirect(url, status = 302) {
281
+ return { redirect: url, status };
282
+ }
283
+ // ─── Direct Re-exports ────────────────────────────────────────────────────────
284
+ var response_1 = require("../server/response");
285
+ Object.defineProperty(exports, "ExisResponse", { enumerable: true, get: function () { return response_1.ExisResponse; } });
286
+ var sse_1 = require("../server/sse");
287
+ Object.defineProperty(exports, "SSEStream", { enumerable: true, get: function () { return sse_1.SSEStream; } });
288
+ Object.defineProperty(exports, "formatSSEEvent", { enumerable: true, get: function () { return sse_1.formatSSEEvent; } });
19
289
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/response/index.ts"],"names":[],"mappings":";;AAeA,0BAIC;AAED,sBASC;AAfD,SAAgB,OAAO,CAAI,IAAO,EAAE,OAAgB;IAClD,MAAM,GAAG,GAAuB,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;IACvD,IAAI,OAAO,KAAK,SAAS;QAAE,GAAG,CAAC,OAAO,GAAG,OAAO,CAAA;IAChD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,SAAgB,KAAK,CACnB,OAAe,EACf,IAAa,EACb,OAAiB;IAEjB,MAAM,GAAG,GAAkB,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,CAAA;IACjE,IAAI,IAAI,KAAK,SAAS;QAAE,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAA;IAC7C,IAAI,OAAO,KAAK,SAAS;QAAE,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAA;IACtD,OAAO,GAAG,CAAA;AACZ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/response/index.ts"],"names":[],"mappings":"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"}
@@ -11,16 +11,16 @@ export interface BoundaryExcludeRule {
11
11
  methods?: HttpMethod[];
12
12
  method?: HttpMethod;
13
13
  }
14
- export interface BoundaryConfig {
14
+ export interface BoundaryConfig<TContext = Record<string, any>> {
15
15
  /**
16
16
  * Middleware to apply to all routes in this directory and subdirectories.
17
17
  * Replaces the old router.use() globally for a folder.
18
18
  */
19
- middleware?: Handler[] | Handler;
19
+ middleware?: Handler<any, any, any, any, TContext>[] | Handler<any, any, any, any, TContext>;
20
20
  /**
21
21
  * Alias for `middleware`. Supports plural naming.
22
22
  */
23
- middlewares?: Handler[] | Handler;
23
+ middlewares?: Handler<any, any, any, any, TContext>[] | Handler<any, any, any, any, TContext>;
24
24
  /**
25
25
  * CORS configuration applied to all routes in this directory and subdirectories.
26
26
  */
@@ -62,27 +62,57 @@ export interface BoundaryConfig {
62
62
  * Folder-scoped request timeout (in milliseconds).
63
63
  * Can be a static number or a dynamic function evaluated per-request.
64
64
  */
65
- timeout?: number | ((req: import('../types').Request<any, any, any>) => number | undefined);
65
+ timeout?: number | ((req: import('../types').Request<any, any, any, TContext>) => number | undefined);
66
66
  /**
67
67
  * Cascading metadata (e.g., OpenAPI tags, roles) applied to all routes in this directory.
68
68
  */
69
69
  metadata?: Record<string, any>;
70
+ /**
71
+ * Opt-in security scanner noise suppression & exploit probe blocker.
72
+ * Intercepts automated vulnerability scanner probes (e.g. `/.env`, `/.git`, `/.DS_Store`)
73
+ * and blackholes them immediately without running downstream handlers or flooding error logs.
74
+ */
75
+ blockProbes?: boolean | import('../middleware/security').BlockProbesOptions;
76
+ blockSuspiciousProbes?: boolean | import('../middleware/security').BlockProbesOptions;
70
77
  /**
71
78
  * Hook executed immediately before any route handler in this boundary.
72
79
  * Can short-circuit execution by returning `false` or sending a response directly.
73
80
  */
74
- beforeHandle?: BoundaryBeforeHandleHook | BoundaryBeforeHandleHook[];
81
+ beforeHandle?: BoundaryBeforeHandleHook<TContext> | BoundaryBeforeHandleHook<TContext>[];
75
82
  /**
76
83
  * Hook executed immediately after a route handler in this boundary successfully returns.
77
84
  * Receives `(req, res, data)` and can transform the outgoing payload or perform audit logging.
78
85
  */
79
- afterHandle?: BoundaryAfterHandleHook | BoundaryAfterHandleHook[];
86
+ afterHandle?: BoundaryAfterHandleHook<any, TContext> | BoundaryAfterHandleHook<any, TContext>[];
80
87
  }
81
- export type BoundaryBeforeHandleHook = (req: import('../types').Request<any, any, any>, res: import('../types').Response) => void | boolean | Promise<void | boolean>;
82
- export type BoundaryAfterHandleHook<T = any> = (req: import('../types').Request<any, any, any>, res: import('../types').Response, data?: T) => void | any | Promise<void | any>;
88
+ export type { BlockProbesOptions } from '../middleware/security';
89
+ export type BoundaryBeforeHandleHook<TContext = Record<string, any>> = (req: import('../types').Request<any, any, any, TContext>, res: import('../types').Response) => void | boolean | Promise<void | boolean>;
90
+ export type BoundaryAfterHandleHook<T = any, TContext = Record<string, any>> = (req: import('../types').Request<any, any, any, TContext>, res: import('../types').Response, data?: T) => void | any | Promise<void | any>;
83
91
  /**
84
- * Defines a boundary that acts as folder-scoped config + request pipeline for
85
- * everything in this directory and subdirectories.
92
+ * Defines a boundary configuration that acts as a folder-scoped request pipeline
93
+ * for all routes in its directory and subdirectories.
94
+ *
95
+ * @param config Boundary options (middleware, guards, interceptors, CORS, hooks, exclusions)
96
+ * @returns Strongly typed `BoundaryConfig`
97
+ *
98
+ * @example
99
+ * ```ts
100
+ * // src/http/api/admin/boundary.ts
101
+ * export default defineBoundary({
102
+ * guards: [AdminGuard],
103
+ * cors: { origin: 'https://admin.example.com' },
104
+ * beforeHandle(req, res) {
105
+ * if (!req.user) {
106
+ * res.status(401).json({ error: 'Unauthorized' })
107
+ * return false // halts execution
108
+ * }
109
+ * },
110
+ * afterHandle(req, res, data) {
111
+ * // Audit logging / payload wrapping
112
+ * return { data, timestamp: Date.now() }
113
+ * }
114
+ * })
115
+ * ```
86
116
  */
87
- export declare function defineBoundary(config: BoundaryConfig): BoundaryConfig;
117
+ export declare function defineBoundary<TContext = Record<string, any>>(config: BoundaryConfig<TContext>): BoundaryConfig<TContext>;
88
118
  //# sourceMappingURL=boundary.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"boundary.d.ts","sourceRoot":"","sources":["../../src/router/boundary.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"boundary.d.ts","sourceRoot":"","sources":["../../src/router/boundary.ts"],"names":[],"mappings":"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"}
@@ -2,8 +2,30 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.defineBoundary = defineBoundary;
4
4
  /**
5
- * Defines a boundary that acts as folder-scoped config + request pipeline for
6
- * everything in this directory and subdirectories.
5
+ * Defines a boundary configuration that acts as a folder-scoped request pipeline
6
+ * for all routes in its directory and subdirectories.
7
+ *
8
+ * @param config Boundary options (middleware, guards, interceptors, CORS, hooks, exclusions)
9
+ * @returns Strongly typed `BoundaryConfig`
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * // src/http/api/admin/boundary.ts
14
+ * export default defineBoundary({
15
+ * guards: [AdminGuard],
16
+ * cors: { origin: 'https://admin.example.com' },
17
+ * beforeHandle(req, res) {
18
+ * if (!req.user) {
19
+ * res.status(401).json({ error: 'Unauthorized' })
20
+ * return false // halts execution
21
+ * }
22
+ * },
23
+ * afterHandle(req, res, data) {
24
+ * // Audit logging / payload wrapping
25
+ * return { data, timestamp: Date.now() }
26
+ * }
27
+ * })
28
+ * ```
7
29
  */
8
30
  function defineBoundary(config) {
9
31
  return config;
@@ -1 +1 @@
1
- {"version":3,"file":"boundary.js","sourceRoot":"","sources":["../../src/router/boundary.ts"],"names":[],"mappings":";;AAsHA,wCAEC;AAND;;;GAGG;AACH,SAAgB,cAAc,CAAC,MAAsB;IACnD,OAAO,MAAM,CAAA;AACf,CAAC"}
1
+ {"version":3,"file":"boundary.js","sourceRoot":"","sources":["../../src/router/boundary.ts"],"names":[],"mappings":";;AAgKA,wCAIC;AA9BD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,SAAgB,cAAc,CAC5B,MAAgC;IAEhC,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"controller-registrar.d.ts","sourceRoot":"","sources":["../../src/router/controller-registrar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAA;AAGxC,qBAAa,mBAAmB;IAClB,OAAO,CAAC,GAAG;gBAAH,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC;IAI1B,mBAAmB,CACxB,WAAW,EAAE,GAAG,EAAE,EAClB,QAAQ,SAAK,EACb,iBAAiB,GAAE,GAAG,EAAO,GAC5B,GAAG,CAAC,GAAG,CAAC;IAIX,OAAO,CAAC,oBAAoB;CAyb7B"}
1
+ {"version":3,"file":"controller-registrar.d.ts","sourceRoot":"","sources":["../../src/router/controller-registrar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAA;AAGxC,qBAAa,mBAAmB;IAClB,OAAO,CAAC,GAAG;gBAAH,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC;IAI1B,mBAAmB,CACxB,WAAW,EAAE,GAAG,EAAE,EAClB,QAAQ,SAAK,EACb,iBAAiB,GAAE,GAAG,EAAO,GAC5B,GAAG,CAAC,GAAG,CAAC;IAIX,OAAO,CAAC,oBAAoB;CAoiB7B"}
@@ -191,6 +191,30 @@ class ControllerRegistrar {
191
191
  rawArg = isMulti ? files : files[0];
192
192
  }
193
193
  break;
194
+ case 'cookies':
195
+ case 'cookie':
196
+ rawArg = param.name
197
+ ? req.cookies?.[param.name]
198
+ : req.cookies;
199
+ break;
200
+ case 'state': {
201
+ const storeState = context_1.executionContext.getStore()?.state;
202
+ const reqState = req.state;
203
+ const stateObj = {
204
+ ...(storeState || {}),
205
+ ...(reqState || {}),
206
+ };
207
+ rawArg = param.name ? stateObj[param.name] : stateObj;
208
+ break;
209
+ }
210
+ case 'app':
211
+ rawArg = this.app;
212
+ break;
213
+ case 'fields':
214
+ rawArg = param.name
215
+ ? req.fields?.[param.name]
216
+ : req.fields;
217
+ break;
194
218
  case 'customParam':
195
219
  if (typeof param.customFactory === 'function') {
196
220
  const executionCtx = {
@@ -284,7 +308,20 @@ class ControllerRegistrar {
284
308
  res.status(routeMeta.httpCode);
285
309
  }
286
310
  if (result !== undefined) {
287
- res.json(result);
311
+ if (result &&
312
+ (typeof result.pipe === 'function' ||
313
+ (typeof result.getReader === 'function' &&
314
+ typeof result.tee === 'function') ||
315
+ (typeof result[Symbol.asyncIterator] === 'function' &&
316
+ !Array.isArray(result)))) {
317
+ ;
318
+ res.sendStream(result);
319
+ }
320
+ else if (!(result &&
321
+ typeof result.send === 'function' &&
322
+ typeof result.onClose === 'function')) {
323
+ res.json(result);
324
+ }
288
325
  }
289
326
  }
290
327
  }
@@ -300,13 +337,26 @@ class ControllerRegistrar {
300
337
  let filterInstance = this.app.container.resolve(filter);
301
338
  if (!filterInstance)
302
339
  filterInstance = new filter();
303
- await filterInstance.catch(err, { req, res });
340
+ await filterInstance.catch(err, { req, res, next });
304
341
  handled = true;
305
342
  break;
306
343
  }
307
344
  else if (typeof filter === 'object' &&
308
345
  typeof filter.catch === 'function') {
309
- await filter.catch(err, { req, res });
346
+ await filter.catch(err, { req, res, next });
347
+ handled = true;
348
+ break;
349
+ }
350
+ else if (typeof filter === 'function') {
351
+ if (filter.length >= 3) {
352
+ await filter(err, req, res, next);
353
+ }
354
+ else if (filter.length === 2) {
355
+ await filter(err, { req, res, next });
356
+ }
357
+ else {
358
+ await filter(err);
359
+ }
310
360
  handled = true;
311
361
  break;
312
362
  }
@@ -343,6 +393,8 @@ class ControllerRegistrar {
343
393
  const paramMetadata = paramMetadataMap[route.handlerName] || [];
344
394
  let extractedBodySchema = undefined;
345
395
  let extractedQuerySchema = undefined;
396
+ let extractedParamsSchema = undefined;
397
+ let extractedHeadersSchema = undefined;
346
398
  for (const param of paramMetadata) {
347
399
  if (!param)
348
400
  continue;
@@ -356,13 +408,44 @@ class ControllerRegistrar {
356
408
  if (queryPipe)
357
409
  extractedQuerySchema = queryPipe;
358
410
  }
411
+ if (param.type === 'param') {
412
+ const paramPipe = param.pipes?.find((p) => p && typeof p.parse === 'function');
413
+ if (paramPipe)
414
+ extractedParamsSchema = paramPipe;
415
+ }
416
+ if (param.type === 'header') {
417
+ const headerPipe = param.pipes?.find((p) => p && typeof p.parse === 'function');
418
+ if (headerPipe)
419
+ extractedHeadersSchema = headerPipe;
420
+ }
359
421
  }
360
422
  const extractedResponseSchema = routeMeta.responseSchema;
423
+ const classOpenApi = ControllerClass[Symbol.for('exisjs:openapi_class_meta')] ||
424
+ {};
425
+ const mergedTags = [
426
+ ...(classOpenApi.tags || []),
427
+ ...(routeMeta.tags || []),
428
+ ];
429
+ const mergedSecurity = [
430
+ ...(classOpenApi.security || []),
431
+ ...(routeMeta.security || []),
432
+ ];
361
433
  if (schema ||
362
434
  finalHost ||
363
435
  extractedBodySchema ||
364
436
  extractedQuerySchema ||
365
- extractedResponseSchema) {
437
+ extractedParamsSchema ||
438
+ extractedHeadersSchema ||
439
+ extractedResponseSchema ||
440
+ mergedTags.length > 0 ||
441
+ mergedSecurity.length > 0 ||
442
+ routeMeta.summary ||
443
+ routeMeta.description ||
444
+ routeMeta.operationId ||
445
+ routeMeta.deprecated !== undefined ||
446
+ routeMeta.responses ||
447
+ routeMeta.excludeFromDocs ||
448
+ classOpenApi.excludeFromDocs) {
366
449
  schema = schema || {};
367
450
  if (finalHost)
368
451
  schema.host = finalHost;
@@ -370,8 +453,29 @@ class ControllerRegistrar {
370
453
  schema.body = extractedBodySchema;
371
454
  if (extractedQuerySchema && !schema.query)
372
455
  schema.query = extractedQuerySchema;
456
+ if (extractedParamsSchema && !schema.params)
457
+ schema.params = extractedParamsSchema;
458
+ if (extractedHeadersSchema && !schema.headers)
459
+ schema.headers = extractedHeadersSchema;
373
460
  if (extractedResponseSchema && !schema.response)
374
461
  schema.response = extractedResponseSchema;
462
+ if (mergedTags.length > 0 && !schema.tags)
463
+ schema.tags = mergedTags;
464
+ if (mergedSecurity.length > 0 && !schema.security)
465
+ schema.security = mergedSecurity;
466
+ if (routeMeta.summary && !schema.summary)
467
+ schema.summary = routeMeta.summary;
468
+ if (routeMeta.description && !schema.description)
469
+ schema.description = routeMeta.description;
470
+ if (routeMeta.operationId && !schema.operationId)
471
+ schema.operationId = routeMeta.operationId;
472
+ if (routeMeta.deprecated !== undefined &&
473
+ schema.deprecated === undefined)
474
+ schema.deprecated = routeMeta.deprecated;
475
+ if (routeMeta.responses && !schema.responses)
476
+ schema.responses = routeMeta.responses;
477
+ if (routeMeta.excludeFromDocs || classOpenApi.excludeFromDocs)
478
+ schema.excludeFromDocs = true;
375
479
  this.app.router[method](fullPath, ...allMiddlewares, schema, finalHandler);
376
480
  }
377
481
  else {