exisjs 0.6.0 → 0.7.0

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 (519) hide show
  1. package/dist/cli/commands/build.d.ts.map +1 -1
  2. package/dist/cli/commands/build.js +11 -9
  3. package/dist/cli/commands/build.js.map +1 -1
  4. package/dist/cli/commands/dev.d.ts.map +1 -1
  5. package/dist/cli/commands/dev.js +34 -36
  6. package/dist/cli/commands/dev.js.map +1 -1
  7. package/dist/cli/commands/exports.d.ts.map +1 -1
  8. package/dist/cli/commands/exports.js +5 -32
  9. package/dist/cli/commands/exports.js.map +1 -1
  10. package/dist/cli/commands/generate.d.ts +2 -13
  11. package/dist/cli/commands/generate.d.ts.map +1 -1
  12. package/dist/cli/commands/generate.js +27 -60
  13. package/dist/cli/commands/generate.js.map +1 -1
  14. package/dist/cli/commands/init.d.ts.map +1 -1
  15. package/dist/cli/commands/init.js +4 -4
  16. package/dist/cli/commands/init.js.map +1 -1
  17. package/dist/cli/commands/start.d.ts.map +1 -1
  18. package/dist/cli/commands/start.js +2 -6
  19. package/dist/cli/commands/start.js.map +1 -1
  20. package/dist/cli/index.js +11 -23
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/cli/routes.d.ts.map +1 -1
  23. package/dist/cli/routes.js +20 -8
  24. package/dist/cli/routes.js.map +1 -1
  25. package/dist/config/config.d.ts +2 -1
  26. package/dist/config/config.d.ts.map +1 -1
  27. package/dist/config/config.js +3 -2
  28. package/dist/config/config.js.map +1 -1
  29. package/dist/config/types.d.ts +7 -2
  30. package/dist/config/types.d.ts.map +1 -1
  31. package/dist/decorators/constants.d.ts +2 -2
  32. package/dist/decorators/constants.d.ts.map +1 -1
  33. package/dist/decorators/constants.js +2 -2
  34. package/dist/decorators/constants.js.map +1 -1
  35. package/dist/decorators/core.d.ts +4 -3
  36. package/dist/decorators/core.d.ts.map +1 -1
  37. package/dist/decorators/core.js +7 -4
  38. package/dist/decorators/core.js.map +1 -1
  39. package/dist/decorators/middleware.d.ts +0 -10
  40. package/dist/decorators/middleware.d.ts.map +1 -1
  41. package/dist/decorators/middleware.js +0 -25
  42. package/dist/decorators/middleware.js.map +1 -1
  43. package/dist/decorators/routing.d.ts +0 -2
  44. package/dist/decorators/routing.d.ts.map +1 -1
  45. package/dist/decorators/routing.js +1 -3
  46. package/dist/decorators/routing.js.map +1 -1
  47. package/dist/di/inject.d.ts +1 -2
  48. package/dist/di/inject.d.ts.map +1 -1
  49. package/dist/di/inject.js.map +1 -1
  50. package/dist/docs/ARCHITECTURE.md +46 -285
  51. package/dist/docs/BENCHMARKS.md +5 -5
  52. package/dist/docs/README.md +8 -11
  53. package/dist/docs/content/boundaries.mdx +151 -0
  54. package/dist/docs/content/cli/commands.mdx +66 -104
  55. package/dist/docs/content/cli/overview.mdx +37 -47
  56. package/dist/docs/content/cli/usage.mdx +29 -15
  57. package/dist/docs/content/decorators.mdx +107 -80
  58. package/dist/docs/content/installation.mdx +20 -1
  59. package/dist/docs/content/middleware.mdx +65 -291
  60. package/dist/docs/content/security.mdx +44 -246
  61. package/dist/docs/content/structure.mdx +227 -100
  62. package/dist/docs/content/validation.mdx +0 -17
  63. package/dist/docs/reference/decorators.mdx +24 -217
  64. package/dist/docs/reference/middleware.mdx +41 -217
  65. package/dist/docs/reference/validator.mdx +2 -5
  66. package/dist/error/errors.d.ts.map +1 -1
  67. package/dist/error/errors.js +16 -0
  68. package/dist/error/errors.js.map +1 -1
  69. package/dist/index.d.ts +1 -1
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js +5 -2
  72. package/dist/index.js.map +1 -1
  73. package/dist/lib/start-repl.js +2 -4
  74. package/dist/lib/start-repl.js.map +1 -1
  75. package/dist/lib/start-server.js +12 -4
  76. package/dist/lib/start-server.js.map +1 -1
  77. package/dist/logger/index.d.ts +81 -0
  78. package/dist/logger/index.d.ts.map +1 -0
  79. package/dist/logger/index.js +142 -0
  80. package/dist/logger/index.js.map +1 -0
  81. package/dist/middleware/dedupe.d.ts +1 -1
  82. package/dist/middleware/dedupe.js +1 -1
  83. package/dist/middleware/middleware.d.ts +3 -5
  84. package/dist/middleware/middleware.d.ts.map +1 -1
  85. package/dist/middleware/middleware.js +2 -6
  86. package/dist/middleware/middleware.js.map +1 -1
  87. package/dist/router/{gateway.d.ts → boundary.d.ts} +21 -13
  88. package/dist/router/boundary.d.ts.map +1 -0
  89. package/dist/router/boundary.js +11 -0
  90. package/dist/router/boundary.js.map +1 -0
  91. package/dist/router/index.d.ts +3 -6
  92. package/dist/router/index.d.ts.map +1 -1
  93. package/dist/router/index.js +3 -7
  94. package/dist/router/index.js.map +1 -1
  95. package/dist/router/route-builder.d.ts +0 -28
  96. package/dist/router/route-builder.d.ts.map +1 -1
  97. package/dist/router/route-builder.js +0 -4
  98. package/dist/router/route-builder.js.map +1 -1
  99. package/dist/router/route-scanner.d.ts +1 -2
  100. package/dist/router/route-scanner.d.ts.map +1 -1
  101. package/dist/router/route-scanner.js +216 -193
  102. package/dist/router/route-scanner.js.map +1 -1
  103. package/dist/router/router.d.ts +4 -6
  104. package/dist/router/router.d.ts.map +1 -1
  105. package/dist/router/router.js +36 -72
  106. package/dist/router/router.js.map +1 -1
  107. package/dist/router/types.d.ts +2 -6
  108. package/dist/router/types.d.ts.map +1 -1
  109. package/dist/server/{bun-adapter.d.ts → adapters/bun-adapter.d.ts} +1 -1
  110. package/dist/server/adapters/bun-adapter.d.ts.map +1 -0
  111. package/dist/server/{bun-adapter.js → adapters/bun-adapter.js} +2 -24
  112. package/dist/server/adapters/bun-adapter.js.map +1 -0
  113. package/dist/server/{uws-adapter.d.ts → adapters/uws-adapter.d.ts} +1 -1
  114. package/dist/server/adapters/uws-adapter.d.ts.map +1 -0
  115. package/dist/server/{uws-adapter.js → adapters/uws-adapter.js} +1 -28
  116. package/dist/server/adapters/uws-adapter.js.map +1 -0
  117. package/dist/server/app.d.ts +9 -30
  118. package/dist/server/app.d.ts.map +1 -1
  119. package/dist/server/app.js +19 -134
  120. package/dist/server/app.js.map +1 -1
  121. package/dist/server/bootstrapper.d.ts +4 -15
  122. package/dist/server/bootstrapper.d.ts.map +1 -1
  123. package/dist/server/bootstrapper.js +31 -222
  124. package/dist/server/bootstrapper.js.map +1 -1
  125. package/dist/server/define.d.ts +2 -2
  126. package/dist/server/define.d.ts.map +1 -1
  127. package/dist/server/define.js +3 -3
  128. package/dist/server/define.js.map +1 -1
  129. package/dist/server/engines/bun-engine.d.ts +16 -0
  130. package/dist/server/engines/bun-engine.d.ts.map +1 -0
  131. package/dist/server/engines/bun-engine.js +41 -0
  132. package/dist/server/engines/bun-engine.js.map +1 -0
  133. package/dist/server/engines/engine.d.ts +16 -0
  134. package/dist/server/engines/engine.d.ts.map +1 -0
  135. package/dist/{queue/types.js → server/engines/engine.js} +1 -1
  136. package/dist/server/engines/engine.js.map +1 -0
  137. package/dist/server/engines/node-engine.d.ts +22 -0
  138. package/dist/server/engines/node-engine.d.ts.map +1 -0
  139. package/dist/server/engines/node-engine.js +130 -0
  140. package/dist/server/engines/node-engine.js.map +1 -0
  141. package/dist/server/engines/uws-engine.d.ts +16 -0
  142. package/dist/server/engines/uws-engine.d.ts.map +1 -0
  143. package/dist/server/engines/uws-engine.js +48 -0
  144. package/dist/server/engines/uws-engine.js.map +1 -0
  145. package/dist/server/request-handler.d.ts +0 -1
  146. package/dist/server/request-handler.d.ts.map +1 -1
  147. package/dist/server/request-handler.js +74 -48
  148. package/dist/server/request-handler.js.map +1 -1
  149. package/dist/server/request.d.ts +0 -8
  150. package/dist/server/request.d.ts.map +1 -1
  151. package/dist/server/request.js +0 -16
  152. package/dist/server/request.js.map +1 -1
  153. package/dist/utils/time.d.ts +6 -0
  154. package/dist/utils/time.d.ts.map +1 -0
  155. package/dist/utils/time.js +15 -0
  156. package/dist/utils/time.js.map +1 -0
  157. package/dist/validator/index.d.ts +1 -7
  158. package/dist/validator/index.d.ts.map +1 -1
  159. package/dist/validator/index.js +1 -5
  160. package/dist/validator/index.js.map +1 -1
  161. package/dist/validator/tex-types.d.ts +15 -2
  162. package/dist/validator/tex-types.d.ts.map +1 -1
  163. package/dist/validator/tex-types.js +8 -0
  164. package/dist/validator/tex-types.js.map +1 -1
  165. package/dist/validator/tex.d.ts.map +1 -1
  166. package/dist/validator/tex.js +21 -2
  167. package/dist/validator/tex.js.map +1 -1
  168. package/package.json +9 -151
  169. package/dist/adapters/aws-lambda.d.ts +0 -21
  170. package/dist/adapters/aws-lambda.d.ts.map +0 -1
  171. package/dist/adapters/aws-lambda.js +0 -125
  172. package/dist/adapters/aws-lambda.js.map +0 -1
  173. package/dist/adapters/bun.d.ts +0 -9
  174. package/dist/adapters/bun.d.ts.map +0 -1
  175. package/dist/adapters/bun.js +0 -23
  176. package/dist/adapters/bun.js.map +0 -1
  177. package/dist/adapters/cloudflare.d.ts +0 -10
  178. package/dist/adapters/cloudflare.d.ts.map +0 -1
  179. package/dist/adapters/cloudflare.js +0 -22
  180. package/dist/adapters/cloudflare.js.map +0 -1
  181. package/dist/adapters/deno.d.ts +0 -7
  182. package/dist/adapters/deno.d.ts.map +0 -1
  183. package/dist/adapters/deno.js +0 -21
  184. package/dist/adapters/deno.js.map +0 -1
  185. package/dist/adapters/fastly.d.ts +0 -6
  186. package/dist/adapters/fastly.d.ts.map +0 -1
  187. package/dist/adapters/fastly.js +0 -20
  188. package/dist/adapters/fastly.js.map +0 -1
  189. package/dist/adapters/fetch.d.ts +0 -30
  190. package/dist/adapters/fetch.d.ts.map +0 -1
  191. package/dist/adapters/fetch.js +0 -119
  192. package/dist/adapters/fetch.js.map +0 -1
  193. package/dist/adapters/index.d.ts +0 -9
  194. package/dist/adapters/index.d.ts.map +0 -1
  195. package/dist/adapters/index.js +0 -28
  196. package/dist/adapters/index.js.map +0 -1
  197. package/dist/adapters/netlify.d.ts +0 -8
  198. package/dist/adapters/netlify.d.ts.map +0 -1
  199. package/dist/adapters/netlify.js +0 -20
  200. package/dist/adapters/netlify.js.map +0 -1
  201. package/dist/adapters/vercel.d.ts +0 -17
  202. package/dist/adapters/vercel.d.ts.map +0 -1
  203. package/dist/adapters/vercel.js +0 -23
  204. package/dist/adapters/vercel.js.map +0 -1
  205. package/dist/auth/index.d.ts +0 -8
  206. package/dist/auth/index.d.ts.map +0 -1
  207. package/dist/auth/index.js +0 -49
  208. package/dist/auth/index.js.map +0 -1
  209. package/dist/auth/jwt.d.ts +0 -20
  210. package/dist/auth/jwt.d.ts.map +0 -1
  211. package/dist/auth/jwt.js +0 -59
  212. package/dist/auth/jwt.js.map +0 -1
  213. package/dist/auth/oauth/core.d.ts +0 -96
  214. package/dist/auth/oauth/core.d.ts.map +0 -1
  215. package/dist/auth/oauth/core.js +0 -203
  216. package/dist/auth/oauth/core.js.map +0 -1
  217. package/dist/auth/oauth/index.d.ts +0 -45
  218. package/dist/auth/oauth/index.d.ts.map +0 -1
  219. package/dist/auth/oauth/index.js +0 -64
  220. package/dist/auth/oauth/index.js.map +0 -1
  221. package/dist/auth/oauth/middleware.d.ts +0 -63
  222. package/dist/auth/oauth/middleware.d.ts.map +0 -1
  223. package/dist/auth/oauth/middleware.js +0 -164
  224. package/dist/auth/oauth/middleware.js.map +0 -1
  225. package/dist/auth/oauth/providers/custom.d.ts +0 -41
  226. package/dist/auth/oauth/providers/custom.d.ts.map +0 -1
  227. package/dist/auth/oauth/providers/custom.js +0 -204
  228. package/dist/auth/oauth/providers/custom.js.map +0 -1
  229. package/dist/auth/oauth/providers/discord.d.ts +0 -23
  230. package/dist/auth/oauth/providers/discord.d.ts.map +0 -1
  231. package/dist/auth/oauth/providers/discord.js +0 -130
  232. package/dist/auth/oauth/providers/discord.js.map +0 -1
  233. package/dist/auth/oauth/providers/facebook.d.ts +0 -28
  234. package/dist/auth/oauth/providers/facebook.d.ts.map +0 -1
  235. package/dist/auth/oauth/providers/facebook.js +0 -124
  236. package/dist/auth/oauth/providers/facebook.js.map +0 -1
  237. package/dist/auth/oauth/providers/github.d.ts +0 -25
  238. package/dist/auth/oauth/providers/github.d.ts.map +0 -1
  239. package/dist/auth/oauth/providers/github.js +0 -132
  240. package/dist/auth/oauth/providers/github.js.map +0 -1
  241. package/dist/auth/oauth/providers/google.d.ts +0 -23
  242. package/dist/auth/oauth/providers/google.d.ts.map +0 -1
  243. package/dist/auth/oauth/providers/google.js +0 -134
  244. package/dist/auth/oauth/providers/google.js.map +0 -1
  245. package/dist/auth/oauth/providers/microsoft.d.ts +0 -28
  246. package/dist/auth/oauth/providers/microsoft.d.ts.map +0 -1
  247. package/dist/auth/oauth/providers/microsoft.js +0 -136
  248. package/dist/auth/oauth/providers/microsoft.js.map +0 -1
  249. package/dist/auth/oauth/types.d.ts +0 -158
  250. package/dist/auth/oauth/types.d.ts.map +0 -1
  251. package/dist/auth/oauth/types.js +0 -4
  252. package/dist/auth/oauth/types.js.map +0 -1
  253. package/dist/auth/password.d.ts +0 -25
  254. package/dist/auth/password.d.ts.map +0 -1
  255. package/dist/auth/password.js +0 -93
  256. package/dist/auth/password.js.map +0 -1
  257. package/dist/auth/rbac.d.ts +0 -10
  258. package/dist/auth/rbac.d.ts.map +0 -1
  259. package/dist/auth/rbac.js +0 -34
  260. package/dist/auth/rbac.js.map +0 -1
  261. package/dist/auth/session.d.ts +0 -26
  262. package/dist/auth/session.d.ts.map +0 -1
  263. package/dist/auth/session.js +0 -134
  264. package/dist/auth/session.js.map +0 -1
  265. package/dist/cache/index.d.ts +0 -4
  266. package/dist/cache/index.d.ts.map +0 -1
  267. package/dist/cache/index.js +0 -25
  268. package/dist/cache/index.js.map +0 -1
  269. package/dist/cache/store.d.ts +0 -58
  270. package/dist/cache/store.d.ts.map +0 -1
  271. package/dist/cache/store.js +0 -298
  272. package/dist/cache/store.js.map +0 -1
  273. package/dist/cron/parser.d.ts +0 -2
  274. package/dist/cron/parser.d.ts.map +0 -1
  275. package/dist/cron/parser.js +0 -52
  276. package/dist/cron/parser.js.map +0 -1
  277. package/dist/cron/scheduler.d.ts +0 -23
  278. package/dist/cron/scheduler.d.ts.map +0 -1
  279. package/dist/cron/scheduler.js +0 -114
  280. package/dist/cron/scheduler.js.map +0 -1
  281. package/dist/database/adapters/mongodb.d.ts +0 -58
  282. package/dist/database/adapters/mongodb.d.ts.map +0 -1
  283. package/dist/database/adapters/mongodb.js +0 -264
  284. package/dist/database/adapters/mongodb.js.map +0 -1
  285. package/dist/database/adapters/mysql.d.ts +0 -27
  286. package/dist/database/adapters/mysql.d.ts.map +0 -1
  287. package/dist/database/adapters/mysql.js +0 -188
  288. package/dist/database/adapters/mysql.js.map +0 -1
  289. package/dist/database/adapters/postgres.d.ts +0 -28
  290. package/dist/database/adapters/postgres.d.ts.map +0 -1
  291. package/dist/database/adapters/postgres.js +0 -174
  292. package/dist/database/adapters/postgres.js.map +0 -1
  293. package/dist/database/adapters/sqlite.d.ts +0 -27
  294. package/dist/database/adapters/sqlite.d.ts.map +0 -1
  295. package/dist/database/adapters/sqlite.js +0 -149
  296. package/dist/database/adapters/sqlite.js.map +0 -1
  297. package/dist/database/index.d.ts +0 -42
  298. package/dist/database/index.d.ts.map +0 -1
  299. package/dist/database/index.js +0 -58
  300. package/dist/database/index.js.map +0 -1
  301. package/dist/database/manager.d.ts +0 -141
  302. package/dist/database/manager.d.ts.map +0 -1
  303. package/dist/database/manager.js +0 -337
  304. package/dist/database/manager.js.map +0 -1
  305. package/dist/database/migration.d.ts +0 -57
  306. package/dist/database/migration.d.ts.map +0 -1
  307. package/dist/database/migration.js +0 -329
  308. package/dist/database/migration.js.map +0 -1
  309. package/dist/database/query-builder.d.ts +0 -95
  310. package/dist/database/query-builder.d.ts.map +0 -1
  311. package/dist/database/query-builder.js +0 -404
  312. package/dist/database/query-builder.js.map +0 -1
  313. package/dist/database/sql/index.d.ts +0 -18
  314. package/dist/database/sql/index.d.ts.map +0 -1
  315. package/dist/database/sql/index.js +0 -74
  316. package/dist/database/sql/index.js.map +0 -1
  317. package/dist/database/sql/schema.d.ts +0 -38
  318. package/dist/database/sql/schema.d.ts.map +0 -1
  319. package/dist/database/sql/schema.js +0 -80
  320. package/dist/database/sql/schema.js.map +0 -1
  321. package/dist/database/synchronizer.d.ts +0 -12
  322. package/dist/database/synchronizer.d.ts.map +0 -1
  323. package/dist/database/synchronizer.js +0 -82
  324. package/dist/database/synchronizer.js.map +0 -1
  325. package/dist/database/types.d.ts +0 -184
  326. package/dist/database/types.d.ts.map +0 -1
  327. package/dist/database/types.js +0 -4
  328. package/dist/database/types.js.map +0 -1
  329. package/dist/dataloader/dataloader.d.ts +0 -23
  330. package/dist/dataloader/dataloader.d.ts.map +0 -1
  331. package/dist/dataloader/dataloader.js +0 -98
  332. package/dist/dataloader/dataloader.js.map +0 -1
  333. package/dist/dataloader/index.d.ts +0 -3
  334. package/dist/dataloader/index.d.ts.map +0 -1
  335. package/dist/dataloader/index.js +0 -19
  336. package/dist/dataloader/index.js.map +0 -1
  337. package/dist/dataloader/registry.d.ts +0 -17
  338. package/dist/dataloader/registry.d.ts.map +0 -1
  339. package/dist/dataloader/registry.js +0 -47
  340. package/dist/dataloader/registry.js.map +0 -1
  341. package/dist/dev/dep-graph.d.ts +0 -2
  342. package/dist/dev/dep-graph.d.ts.map +0 -1
  343. package/dist/dev/dep-graph.js +0 -111
  344. package/dist/dev/dep-graph.js.map +0 -1
  345. package/dist/dev/hot-reload.d.ts +0 -30
  346. package/dist/dev/hot-reload.d.ts.map +0 -1
  347. package/dist/dev/hot-reload.js +0 -262
  348. package/dist/dev/hot-reload.js.map +0 -1
  349. package/dist/docs/content/adapters.mdx +0 -199
  350. package/dist/docs/content/cache.mdx +0 -239
  351. package/dist/docs/content/circuit-breaker.mdx +0 -130
  352. package/dist/docs/content/cron.mdx +0 -109
  353. package/dist/docs/content/database.mdx +0 -278
  354. package/dist/docs/content/gateways.mdx +0 -376
  355. package/dist/docs/content/oauth.mdx +0 -179
  356. package/dist/docs/content/queues.mdx +0 -177
  357. package/dist/docs/content/rpc.mdx +0 -146
  358. package/dist/docs/content/sse.mdx +0 -159
  359. package/dist/docs/content/websockets.mdx +0 -289
  360. package/dist/docs/integrations/README.md +0 -23
  361. package/dist/docs/integrations/jwt.mdx +0 -151
  362. package/dist/docs/integrations/mongo.mdx +0 -183
  363. package/dist/docs/integrations/observability.mdx +0 -125
  364. package/dist/docs/integrations/openai.mdx +0 -108
  365. package/dist/docs/integrations/postgres.mdx +0 -190
  366. package/dist/docs/integrations/posthog.mdx +0 -122
  367. package/dist/docs/integrations/redis.mdx +0 -141
  368. package/dist/docs/integrations/resend.mdx +0 -117
  369. package/dist/docs/integrations/s3.mdx +0 -122
  370. package/dist/docs/integrations/swagger.mdx +0 -113
  371. package/dist/docs/reference/adapters.mdx +0 -130
  372. package/dist/docs/reference/auth.mdx +0 -183
  373. package/dist/docs/reference/cache.mdx +0 -132
  374. package/dist/docs/reference/circuit-breaker.mdx +0 -71
  375. package/dist/docs/reference/queue.mdx +0 -155
  376. package/dist/docs/reference/storage.mdx +0 -116
  377. package/dist/docs/reference/swagger.mdx +0 -132
  378. package/dist/integrations/drizzle.d.ts +0 -10
  379. package/dist/integrations/drizzle.d.ts.map +0 -1
  380. package/dist/integrations/drizzle.js +0 -34
  381. package/dist/integrations/drizzle.js.map +0 -1
  382. package/dist/integrations/jwt.d.ts +0 -12
  383. package/dist/integrations/jwt.d.ts.map +0 -1
  384. package/dist/integrations/jwt.js +0 -29
  385. package/dist/integrations/jwt.js.map +0 -1
  386. package/dist/integrations/mongodb.d.ts +0 -13
  387. package/dist/integrations/mongodb.d.ts.map +0 -1
  388. package/dist/integrations/mongodb.js +0 -48
  389. package/dist/integrations/mongodb.js.map +0 -1
  390. package/dist/integrations/mongoose.d.ts +0 -13
  391. package/dist/integrations/mongoose.d.ts.map +0 -1
  392. package/dist/integrations/mongoose.js +0 -84
  393. package/dist/integrations/mongoose.js.map +0 -1
  394. package/dist/integrations/openai.d.ts +0 -12
  395. package/dist/integrations/openai.d.ts.map +0 -1
  396. package/dist/integrations/openai.js +0 -47
  397. package/dist/integrations/openai.js.map +0 -1
  398. package/dist/integrations/postgres.d.ts +0 -13
  399. package/dist/integrations/postgres.d.ts.map +0 -1
  400. package/dist/integrations/postgres.js +0 -55
  401. package/dist/integrations/postgres.js.map +0 -1
  402. package/dist/integrations/posthog.d.ts +0 -13
  403. package/dist/integrations/posthog.d.ts.map +0 -1
  404. package/dist/integrations/posthog.js +0 -49
  405. package/dist/integrations/posthog.js.map +0 -1
  406. package/dist/integrations/prisma.d.ts +0 -10
  407. package/dist/integrations/prisma.d.ts.map +0 -1
  408. package/dist/integrations/prisma.js +0 -39
  409. package/dist/integrations/prisma.js.map +0 -1
  410. package/dist/integrations/redis.d.ts +0 -12
  411. package/dist/integrations/redis.d.ts.map +0 -1
  412. package/dist/integrations/redis.js +0 -48
  413. package/dist/integrations/redis.js.map +0 -1
  414. package/dist/integrations/resend.d.ts +0 -12
  415. package/dist/integrations/resend.d.ts.map +0 -1
  416. package/dist/integrations/resend.js +0 -47
  417. package/dist/integrations/resend.js.map +0 -1
  418. package/dist/integrations/s3.d.ts +0 -15
  419. package/dist/integrations/s3.d.ts.map +0 -1
  420. package/dist/integrations/s3.js +0 -60
  421. package/dist/integrations/s3.js.map +0 -1
  422. package/dist/integrations/supabase.d.ts +0 -13
  423. package/dist/integrations/supabase.d.ts.map +0 -1
  424. package/dist/integrations/supabase.js +0 -51
  425. package/dist/integrations/supabase.js.map +0 -1
  426. package/dist/middleware/cache.d.ts +0 -21
  427. package/dist/middleware/cache.d.ts.map +0 -1
  428. package/dist/middleware/cache.js +0 -156
  429. package/dist/middleware/cache.js.map +0 -1
  430. package/dist/observability/health.d.ts +0 -23
  431. package/dist/observability/health.d.ts.map +0 -1
  432. package/dist/observability/health.js +0 -49
  433. package/dist/observability/health.js.map +0 -1
  434. package/dist/observability/index.d.ts +0 -4
  435. package/dist/observability/index.d.ts.map +0 -1
  436. package/dist/observability/index.js +0 -10
  437. package/dist/observability/index.js.map +0 -1
  438. package/dist/observability/metrics.d.ts +0 -6
  439. package/dist/observability/metrics.d.ts.map +0 -1
  440. package/dist/observability/metrics.js +0 -60
  441. package/dist/observability/metrics.js.map +0 -1
  442. package/dist/observability/otel.d.ts +0 -27
  443. package/dist/observability/otel.d.ts.map +0 -1
  444. package/dist/observability/otel.js +0 -45
  445. package/dist/observability/otel.js.map +0 -1
  446. package/dist/observability/prometheus.d.ts +0 -30
  447. package/dist/observability/prometheus.d.ts.map +0 -1
  448. package/dist/observability/prometheus.js +0 -31
  449. package/dist/observability/prometheus.js.map +0 -1
  450. package/dist/queue/client.d.ts +0 -13
  451. package/dist/queue/client.d.ts.map +0 -1
  452. package/dist/queue/client.js +0 -83
  453. package/dist/queue/client.js.map +0 -1
  454. package/dist/queue/drivers/MemoryDriver.d.ts +0 -21
  455. package/dist/queue/drivers/MemoryDriver.d.ts.map +0 -1
  456. package/dist/queue/drivers/MemoryDriver.js +0 -176
  457. package/dist/queue/drivers/MemoryDriver.js.map +0 -1
  458. package/dist/queue/drivers/RedisDriver.d.ts +0 -19
  459. package/dist/queue/drivers/RedisDriver.d.ts.map +0 -1
  460. package/dist/queue/drivers/RedisDriver.js +0 -130
  461. package/dist/queue/drivers/RedisDriver.js.map +0 -1
  462. package/dist/queue/index.d.ts +0 -18
  463. package/dist/queue/index.d.ts.map +0 -1
  464. package/dist/queue/index.js +0 -37
  465. package/dist/queue/index.js.map +0 -1
  466. package/dist/queue/manager.d.ts +0 -18
  467. package/dist/queue/manager.d.ts.map +0 -1
  468. package/dist/queue/manager.js +0 -59
  469. package/dist/queue/manager.js.map +0 -1
  470. package/dist/queue/types.d.ts +0 -55
  471. package/dist/queue/types.d.ts.map +0 -1
  472. package/dist/queue/types.js.map +0 -1
  473. package/dist/queue/worker.d.ts +0 -18
  474. package/dist/queue/worker.d.ts.map +0 -1
  475. package/dist/queue/worker.js +0 -176
  476. package/dist/queue/worker.js.map +0 -1
  477. package/dist/router/gateway.d.ts.map +0 -1
  478. package/dist/router/gateway.js +0 -11
  479. package/dist/router/gateway.js.map +0 -1
  480. package/dist/server/bun-adapter.d.ts.map +0 -1
  481. package/dist/server/bun-adapter.js.map +0 -1
  482. package/dist/server/sse.d.ts +0 -16
  483. package/dist/server/sse.d.ts.map +0 -1
  484. package/dist/server/sse.js +0 -51
  485. package/dist/server/sse.js.map +0 -1
  486. package/dist/server/uws-adapter.d.ts.map +0 -1
  487. package/dist/server/uws-adapter.js.map +0 -1
  488. package/dist/storage/index.d.ts +0 -15
  489. package/dist/storage/index.d.ts.map +0 -1
  490. package/dist/storage/index.js +0 -7
  491. package/dist/storage/index.js.map +0 -1
  492. package/dist/swagger/index.d.ts +0 -9
  493. package/dist/swagger/index.d.ts.map +0 -1
  494. package/dist/swagger/index.js +0 -165
  495. package/dist/swagger/index.js.map +0 -1
  496. package/dist/threads/pool.d.ts +0 -14
  497. package/dist/threads/pool.d.ts.map +0 -1
  498. package/dist/threads/pool.js +0 -93
  499. package/dist/threads/pool.js.map +0 -1
  500. package/dist/threads/worker-runner.d.ts +0 -2
  501. package/dist/threads/worker-runner.d.ts.map +0 -1
  502. package/dist/threads/worker-runner.js +0 -71
  503. package/dist/threads/worker-runner.js.map +0 -1
  504. package/dist/validator/validator.d.ts +0 -360
  505. package/dist/validator/validator.d.ts.map +0 -1
  506. package/dist/validator/validator.js +0 -931
  507. package/dist/validator/validator.js.map +0 -1
  508. package/dist/websocket/orchestrator.d.ts +0 -11
  509. package/dist/websocket/orchestrator.d.ts.map +0 -1
  510. package/dist/websocket/orchestrator.js +0 -238
  511. package/dist/websocket/orchestrator.js.map +0 -1
  512. package/dist/websocket/server.d.ts +0 -66
  513. package/dist/websocket/server.d.ts.map +0 -1
  514. package/dist/websocket/server.js +0 -158
  515. package/dist/websocket/server.js.map +0 -1
  516. package/dist/websocket/socket.d.ts +0 -119
  517. package/dist/websocket/socket.d.ts.map +0 -1
  518. package/dist/websocket/socket.js +0 -242
  519. package/dist/websocket/socket.js.map +0 -1
@@ -3,11 +3,11 @@ title: "Decorators"
3
3
  description: "API Reference for ExisJS Class-Based Routing and Decorators."
4
4
  ---
5
5
 
6
- # Decorators (OOP)
6
+ # Decorators (`exisjs/decorators`)
7
7
 
8
- ExisJS provides a robust Object-Oriented Programming (OOP) paradigm via the `exisjs/decorators` module.
8
+ ExisJS provides a robust Object-Oriented Programming (OOP) paradigm via the `exisjs/decorators` module.
9
9
 
10
- Unlike many other frameworks (such as NestJS or TypeDI), ExisJS decorators are built completely on standard ECMAScript decorators and **do not require `reflect-metadata`**. This makes them incredibly lightweight, extremely fast, and completely free of legacy metadata bloat.
10
+ Unlike frameworks that depend on heavy reflection libraries, ExisJS decorators are built completely on standard ECMAScript decorators and **do not require `reflect-metadata`**.
11
11
 
12
12
  ---
13
13
 
@@ -20,8 +20,7 @@ Marks a class as a Controller. All route handler methods within the class will b
20
20
  ```typescript filename="src/http/users/route.ts"
21
21
  import { Controller } from 'exisjs/decorators'
22
22
 
23
- // Routes will be mounted at /api/users
24
- @Controller('/api/users')
23
+ @Controller('/users')
25
24
  export default class UserController {
26
25
  // ...
27
26
  }
@@ -40,7 +39,6 @@ Defines an HTTP route handler on a class method. You can optionally pass a schem
40
39
  - `@Connect(path?, schema?)`
41
40
  - `@Trace(path?, schema?)`
42
41
  - `@All(path?, schema?)`
43
- - `@Query(path?, schema?)`: Can be used as a method decorator to handle custom `QUERY` method requests (e.g., RPC or GraphQL-like endpoints).
44
42
 
45
43
  ```typescript filename="src/http/users/route.ts"
46
44
  import { Controller, Get, Post } from 'exisjs/decorators'
@@ -60,234 +58,43 @@ export default class UserController {
60
58
  }
61
59
  ```
62
60
 
63
- ### Real-Time Methods
64
- - `@Ws(path?, schema?)`: Maps the handler to a WebSocket connection.
65
- - `@Sse(path?, schema?)`: Maps the handler to a Server-Sent Events stream.
66
-
67
61
  ---
68
62
 
69
63
  ## 2. Parameter Injection
70
64
 
71
- Parameter decorators automatically extract data from the incoming request and inject them directly into your method arguments, drastically reducing boilerplate.
65
+ Parameter decorators automatically extract data from the incoming request and inject them directly into your method arguments:
72
66
 
73
- - `@Body()`: Parses and injects the JSON request body.
74
- - `@Param(name?)`: Injects a URL path parameter (e.g., `id` from `/:id`).
75
- - `@Query(name?)`: Injects a query string parameter. (Note: `@Query` doubles as a route decorator if used on a method).
76
- - `@Headers(name?)`: Injects an HTTP header by name.
77
- - `@HostParam(name?)`: Injects a subdomain parameter (e.g., extracted from `@Hosts(':tenant.example.com')`).
67
+ - `@Body(nameOrPipe?)`: Parses and injects the JSON request body (or passes it through a validator/pipe).
68
+ - `@Param(nameOrPipe?)`: Injects a URL path parameter (e.g., `id` from `/:id`).
69
+ - `@Headers(nameOrPipe?)`: Injects an HTTP header by name.
70
+ - `@HostParam(nameOrPipe?)`: Injects a subdomain parameter.
78
71
  - `@Req()`: Injects the raw ExisJS Request object.
79
- - `@Res(options?)`: Injects the raw ExisJS Response object. Use `@Res({ passthrough: true })` if you want ExisJS to still handle the final response serialization.
72
+ - `@Res(options?)`: Injects the raw ExisJS Response object (`{ passthrough: true }`).
80
73
  - `@Ip()`: Injects the client's IP address.
81
- - `@Session()`: Injects the active session object (requires session middleware).
82
74
  - `@Next()`: Injects the Next function.
83
- - `@Socket()`: Injects the active WebSocket instance (for `@Ws`).
84
- - `@Stream()`: Injects the active SSE instance (for `@Sse`).
85
- - `@UploadedFile() / @UploadedFiles()`: Injects multipart/form-data files.
86
-
87
- ```typescript filename="src/http/users/route.ts"
88
- import { Controller, Get, Post, Param, Body, Ip } from 'exisjs/decorators'
89
-
90
- @Controller('/users')
91
- export default class UserController {
92
- @Get('/:id')
93
- getUser(@Param('id') id: string, @Ip() ip: string) {
94
- return { id, requestedBy: ip }
95
- }
96
-
97
- @Post('/')
98
- createUser(@Body() body: { email: string }) {
99
- return { email: body.email }
100
- }
101
- }
102
- ```
103
75
 
104
76
  ---
105
77
 
106
- ## 3. Middleware & Configuration
107
-
108
- ### `@Use(...middlewares)`
109
- Applies Express-style middleware functions to a specific route handler or an entire controller class.
110
-
111
- ```typescript filename="src/http/secure/route.ts"
112
- import { Controller, Get, Use } from 'exisjs/decorators'
113
- import { authMiddleware } from '../middleware/auth'
114
-
115
- @Controller('/secure')
116
- @Use(authMiddleware)
117
- export default class SecureController {
118
- @Get('/')
119
- getSecureData() {
120
- return { secure: true }
121
- }
122
- }
123
- ```
124
-
125
- ### `@Cache(options)`
126
- Automatically caches `GET` responses in memory or Redis.
78
+ ## 3. Middleware & Pipeline Decorators
127
79
 
128
- ### `@Idempotent(options)`
129
- Enforces idempotency based on the `Idempotency-Key` header, preventing duplicate mutations (e.g., duplicate payments).
130
-
131
- ```typescript filename="src/http/payments/route.ts"
132
- import { Controller, Post, Idempotent } from 'exisjs/decorators'
133
-
134
- @Controller('/payments')
135
- export default class PaymentController {
136
- @Post('/checkout')
137
- @Idempotent()
138
- checkout() {
139
- return { status: 'processing' }
140
- }
141
- }
142
- ```
80
+ - `@Use(...middlewares)`: Binds standard Express-style or ExisJS middleware to a controller class or method.
81
+ - `@Idempotent(options?)`: Caches responses based on the `Idempotency-Key` header using native in-memory off-heap storage.
143
82
 
144
83
  ---
145
84
 
146
- ## 4. Responses & Metadata
147
-
148
- ### `@HttpCode(code)`
149
- Forces a specific HTTP status code for successful responses.
150
-
151
- ### `@Header(name, value)`
152
- Automatically injects a specific response header before sending the response.
153
-
154
- ### `@Redirect(url, statusCode?)`
155
- Redirects the request to the specified URL.
85
+ ## 4. Response & Metadata Modifiers
156
86
 
157
- ### `@Returns(schema)`
158
- Explicitly defines the response schema for OpenAPI (Swagger) generation.
159
-
160
- ```typescript filename="src/http/documents/route.ts"
161
- import { Controller, Post, HttpCode, Header } from 'exisjs/decorators'
162
-
163
- @Controller('/documents')
164
- export default class DocumentController {
165
- @Post('/')
166
- @HttpCode(201)
167
- @Header('X-Custom-Status', 'Processed')
168
- createDoc() {
169
- return { created: true }
170
- }
171
- }
172
- ```
173
-
174
- ---
175
-
176
- ## 5. Security & Lifecycle
177
-
178
- These decorators allow you to attach ExisJS lifecycle hooks to your OOP routes.
179
-
180
- - `@Permissions(...flags)`: Restricts the route to users with specific permission flags.
181
- - `@Hosts(...hosts)`: Restricts the route to a specific subdomain/host.
182
- - `@UseGuards(...guards)`: Attaches Guards (authentication/authorization checks).
183
- - `@UseInterceptors(...interceptors)`: Attaches Interceptors (request/response mutation).
184
- - `@UseFilters(...filters)`: Attaches Exception Filters (custom error handling).
87
+ - `@HttpCode(code: number)`: Enforces a custom HTTP status code on success.
88
+ - `@Header(name: string, value: string)`: Appends an HTTP header to the response.
89
+ - `@Returns(schema)`: Attaches response schema for OpenAPI documentation.
90
+ - `@Redirect(url: string, statusCode?: number)`: Redirects request to target URL.
91
+ - `@Permissions(...permissions: string[])`: Sets required permissions on the route.
92
+ - `@Hosts(...hosts: string[])`: Restricts routes to specific Host headers.
185
93
 
186
94
  ---
187
95
 
188
- ## 6. Global Setup
189
-
190
- ### `@Server(options?)`
191
- Marks a class as the root Server entry point. Used to register global configuration and dependencies.
192
-
193
- **Options Interface:**
194
- ```typescript
195
- interface ServerConfig {
196
- plugins?: any[]
197
- providers?: any[]
198
- cron?: any[]
199
- queue?: any[]
200
- }
201
- ```
202
-
203
- ```typescript filename="src/http/server.ts"
204
- import { Server } from 'exisjs/decorators'
205
- import { corsPlugin } from 'exisjs/middleware'
206
-
207
- @Server({
208
- plugins: [corsPlugin]
209
- })
210
- export default class RootServer {
211
- async onStart(app) {
212
- app.log.info("App booted!")
213
- }
214
- }
215
- ```
216
-
217
- ### `@Gateway(options?)`
218
- Marks a class as a Gateway module. Gateways are used to apply massive configuration blocks across an entire directory of routes (e.g., applying an auth guard to all routes inside `src/http/admin`).
96
+ ## 5. Dependency Injection
219
97
 
220
- **Options Interface:**
221
- ```typescript
222
- interface GatewayConfig {
223
- exclude?: any[]
224
- middleware?: any[]
225
- filters?: any[]
226
- guards?: any[]
227
- interceptors?: any[]
228
- timeout?: number | ((req: any) => number)
229
- metadata?: Record<string, any>
230
- cors?: any
231
- headers?: Record<string, string>
232
- imports?: any[]
233
- providers?: any[]
234
- }
235
- ```
236
-
237
- ```typescript filename="src/http/gateway.ts"
238
- import { Gateway } from 'exisjs/decorators'
239
- import { helmet, hpp } from 'exisjs/middleware'
240
-
241
- /**
242
- * Root Gateway (gatekeeper for the entire application)
243
- *
244
- * Gateways apply configuration to all routes within their directory and subdirectories.
245
- * This acts as the global security and infrastructure layer.
246
- */
247
- @Gateway({
248
- // 1. Cross-Origin Resource Sharing (CORS)
249
- cors: {
250
- origin: ['https://myapp.com', /localhost:\d+/],
251
- credentials: true,
252
- },
253
-
254
- // 2. Global Headers
255
- headers: {
256
- 'X-Powered-By': 'ExisJS',
257
- 'X-Application-Version': '1.0.0',
258
- },
259
-
260
- // 3. Global Middleware
261
- middleware: [
262
- helmet(), // Sets secure HTTP headers
263
- hpp(), // Prevents HTTP Parameter Pollution
264
- ],
265
-
266
- // 4. Exclude Paths
267
- exclude: [{ path: '/health', method: 'GET' }],
268
-
269
- // 5. Dependency Injection Providers
270
- providers: [
271
- ['ConfigService', { useValue: { apiKey: process.env.API_KEY || 'default' } }],
272
- ],
273
-
274
- // 6. Global Metadata
275
- metadata: {
276
- tenant: 'root',
277
- },
278
-
279
- // 7. Request Timeout
280
- timeout: 10000,
281
- })
282
- export default class RootGateway {}
283
- ```
284
-
285
- ### `@Injectable(options?)`
286
- Marks a class as a provider for Dependency Injection, meaning it can be automatically injected into controllers or other services by the IoC container.
287
-
288
- **Options Interface:**
289
- ```typescript
290
- interface InjectableOptions {
291
- scope?: 'singleton' | 'request'
292
- }
293
- ```
98
+ - `@Injectable(options?)`: Marks a service class as an IoC provider managed by the container.
99
+ - `@Boundary(config)`: Marks a class as a folder-scoped Boundary configuring CORS, headers, exclusions, and pipeline steps.
100
+ - `@Server(config)`: Marks a class as a root server definition.
@@ -5,9 +5,11 @@ description: "API Reference for ExisJS built-in Middleware functions."
5
5
 
6
6
  # Middleware (`exisjs/middleware`)
7
7
 
8
- ExisJS ships with a massive suite of highly optimized, integrated middleware. Rather than relying on outdated Express middlewares (which are often unmaintained and have heavy dependency trees), ExisJS implements security and utility middleware natively.
8
+ ExisJS ships with an optimized suite of core middleware. Rather than relying on heavy external dependencies, ExisJS implements security and utility middleware directly.
9
9
 
10
- All middlewares can be applied globally in `server.ts`, directory-wide in `gateway.ts`, or locally on specific controllers/routes.
10
+ All middlewares can be applied globally in `server.ts`, folder-wide in `boundary.ts`, or locally on specific controllers/routes.
11
+
12
+ ---
11
13
 
12
14
  ## How to Apply Middleware
13
15
 
@@ -16,14 +18,12 @@ ExisJS provides first-class support for both Object-Oriented and Functional midd
16
18
  **Class-Based (OOP)**
17
19
  ```typescript filename="src/http/users/route.ts"
18
20
  import { Controller, Get, Use } from 'exisjs/decorators'
19
- import { cache, ipFilter } from 'exisjs/middleware'
21
+ import { ipFilter } from 'exisjs/middleware'
20
22
 
21
23
  @Controller('/users')
22
- @Use(ipFilter({ allow: ['192.168.1.0/24'] })) // Applies to entire class
24
+ @Use(ipFilter({ allow: ['192.168.1.0/24'] })) // Applies to entire controller
23
25
  export default class UserController {
24
-
25
26
  @Get('/stats')
26
- @Use(cache(60)) // Applies only to this method
27
27
  getStats() {
28
28
  return { users: 100 }
29
29
  }
@@ -33,15 +33,12 @@ export default class UserController {
33
33
  **Functional**
34
34
  ```typescript filename="src/http/users/route.ts"
35
35
  import { controller, route } from 'exisjs/router'
36
- import { cache, ipFilter } from 'exisjs/middleware'
36
+ import { ipFilter } from 'exisjs/middleware'
37
37
 
38
38
  export default controller({
39
- // Applies to entire controller block
40
39
  middleware: [ipFilter({ allow: ['192.168.1.0/24'] })],
41
-
40
+
42
41
  getStats: route.get('/stats', {
43
- // Applies only to this specific route
44
- middleware: [cache(60)],
45
42
  async handle() {
46
43
  return { users: 100 }
47
44
  }
@@ -54,251 +51,78 @@ export default controller({
54
51
  ## Security Middleware
55
52
 
56
53
  ### `helmet(options?)`
57
- A native implementation of the popular Helmet middleware. It automatically sets 14+ strict security headers (HSTS, CSP, XSS Protection, No Sniff, etc.) to protect your application from common web vulnerabilities.
58
-
59
- ```typescript
60
- interface HelmetOptions {
61
- contentSecurityPolicy?: string
62
- hsts?: boolean | { maxAge: number; includeSubDomains: boolean }
63
- noSniff?: boolean
64
- xssFilter?: boolean
65
- hidePoweredBy?: boolean
66
- frameguard?: boolean | { action: 'DENY' | 'SAMEORIGIN' }
67
- }
68
- ```
54
+ Sets 14+ strict security headers (HSTS, CSP, XSS Protection, No Sniff, Frameguard) to protect your application.
69
55
 
70
56
  ```typescript
71
57
  import { helmet } from 'exisjs/middleware'
72
58
 
73
- @Gateway({
74
- middleware: [
75
- helmet({
76
- hsts: { maxAge: 31536000, includeSubDomains: true },
77
- xssFilter: true,
78
- hidePoweredBy: true
79
- })
80
- ]
81
- })
59
+ app.use(helmet())
82
60
  ```
83
61
 
84
62
  ### `csrf(options)`
85
- Implements the Signed Double Submit Cookie pattern for Cross-Site Request Forgery (CSRF) protection. Generates a random token on GET requests, sets it as a signed cookie, and strictly requires the client to send the same unsigned token in a header on all state-changing requests (POST, PUT, DELETE).
86
-
87
- ```typescript
88
- interface CsrfOptions {
89
- secret: string
90
- cookieName?: string
91
- headerName?: string
92
- cookieOptions?: {
93
- httpOnly?: boolean
94
- secure?: boolean
95
- sameSite?: 'Strict' | 'Lax' | 'None'
96
- path?: string
97
- maxAge?: number
98
- }
99
- }
100
- ```
63
+ Implements the Signed Double Submit Cookie pattern for Cross-Site Request Forgery (CSRF) protection.
101
64
 
102
- ```typescript
103
- import { csrf } from 'exisjs/middleware'
104
-
105
- app.use(csrf({
106
- secret: process.env.CSRF_SECRET, // Must be 32+ chars
107
- cookieName: 'csrf-token',
108
- headerName: 'x-csrf-token'
109
- }))
110
- ```
65
+ ### `timeout(ms)`
66
+ Automatically times out requests that exceed the specified milliseconds, returning a 503 response.
111
67
 
112
68
  ### `hpp()`
113
- Protects against HTTP Parameter Pollution attacks. If a client maliciously sends an array of values where a string is expected (e.g., `?id=1&id=2`), `hpp()` will automatically intercept the request and only take the *last* provided value, preventing backend crashes or logic bypasses.
114
-
115
- ### `mongoSanitize()` / `dbSanitize(options)`
116
- Recursively scans incoming `req.body`, `req.query`, and `req.params` and immediately strips any keys containing dangerous NoSQL characters (like `$` or `.`). This definitively prevents NoSQL Injection attacks.
69
+ HTTP Parameter Pollution protection.
117
70
 
118
- ```typescript
119
- interface DbSanitizeOptions {
120
- mongo?: boolean // Default: true
121
- }
122
- ```
123
-
124
- ### `ipFilter(options)`
125
- Restricts access based on the client's IP address. Supports exact matches, CIDR blocks, and custom validation functions.
126
-
127
- ```typescript
128
- import { ipFilter } from 'exisjs/middleware'
129
-
130
- // Only allow internal network traffic
131
- app.use(ipFilter({
132
- allow: ['10.0.0.0/8', '192.168.1.100'],
133
- message: 'Access denied from external networks'
134
- }))
135
- ```
71
+ ### `dbSanitize(options?)`
72
+ Sanitizes query and body payloads from NoSQL injection attempts.
136
73
 
137
74
  ---
138
75
 
139
- ## Rate Limiting & Idempotency
76
+ ## Traffic & Reliability Middleware
140
77
 
141
- ### `rateLimit(options)`
142
- Limits the number of requests a single IP (or custom key) can make within a time window.
78
+ ### `rateLimit(options?)`
79
+ High-performance rate limiter running in-memory and off-heap via Rust native bindings (`NativeRateLimiter`).
143
80
 
144
- ```typescript
145
- interface RateLimitOptions {
146
- windowMs?: number // Time window in ms (default: 60000)
147
- max?: number // Max requests per windowMs (default: 100)
148
- message?: string // Error message (default: 'Too many requests...')
149
- statusCode?: number // HTTP Status Code (default: 429)
150
- keyGenerator?: Function // Custom IP extraction logic
151
- redis?: any // Optional ioredis client for distributed limits
152
- prefix?: string // Redis key prefix
153
- }
154
- ```
81
+ > [!NOTE]
82
+ > Core rate limiting is scoped to in-memory native execution. Distributed multi-instance Redis rate limiting moves to `@exisjs/cache`.
155
83
 
156
84
  ```typescript
157
85
  import { rateLimit } from 'exisjs/middleware'
158
86
 
159
87
  app.use(rateLimit({
160
- windowMs: 15 * 60 * 1000, // 15 minutes
161
- max: 100, // Limit each IP to 100 requests per windowMs
162
- message: 'Too many requests, please try again later.'
88
+ windowMs: 60000,
89
+ max: 100
163
90
  }))
164
91
  ```
165
92
 
166
- ### `idempotent(options)`
167
- Prevents duplicate identical state-changing requests (like creating a payment or order twice). Requires the client to send an `Idempotency-Key` header. If the same key is sent twice, ExisJS intercepts the second request and returns the exact same response as the first, without hitting your database again.
93
+ ### `idempotent(options?)`
94
+ Caches responses based on the `Idempotency-Key` header into off-heap native memory to prevent duplicate mutations.
168
95
 
169
96
  ```typescript
170
97
  import { idempotent } from 'exisjs/middleware'
171
98
 
172
- @Post('/payments')
173
- @Use(idempotent({ ttlMs: 86400000 })) // Keep keys for 24 hours
174
- chargeCard() {
175
- return stripe.charges.create(...)
176
- }
99
+ export const handlePayment = [
100
+ idempotent({ ttlMs: 86400000 }),
101
+ async (req, res) => { ... }
102
+ ]
177
103
  ```
178
104
 
179
- ---
180
-
181
- ## Performance & Reliability
182
-
183
- ### `cache(ttl)`
184
- Caches identical GET request responses in memory (or Redis, depending on the active adapter) for a specified number of seconds (`ttl`). Highly effective for public APIs and computationally expensive routes.
105
+ ### `dedupe(options?)`
106
+ Prevents duplicate identical in-flight requests from being computed simultaneously.
185
107
 
186
- ```typescript
187
- import { cache } from 'exisjs/middleware'
188
-
189
- // Cache this endpoint for 60 seconds
190
- @Get('/stats')
191
- @Use(cache(60))
192
- getStats() {
193
- return db.computeHeavyStats()
194
- }
195
- ```
196
-
197
- ### `dedupe(ttl)`
198
- Prevents duplicate identical requests from being processed simultaneously. If 1,000 clients request the exact same expensive resource at the exact same millisecond, `dedupe` forces 999 of them to wait for the 1st request to finish, and then serves the exact same response to all 1,000 clients simultaneously.
199
-
200
- ### `compress()`
201
- A highly optimized payload compression middleware natively supporting `gzip`, `deflate`, and `brotli`. Automatically compresses responses based on the client's `Accept-Encoding` header.
202
-
203
- ### `timeout(ms)`
204
- Automatically times out any request that hangs longer than the specified milliseconds, returning a clean 503 response. Crucial for preventing stalled requests from exhausting the Node.js event loop or database connection pools.
108
+ ### `backpressure(options?)`
109
+ Monitors the Node.js Event Loop delay in real-time, shedding load when overloaded.
205
110
 
206
- ```typescript
207
- interface TimeoutOptions {
208
- ms: number
209
- message?: string
210
- }
211
- ```
212
-
213
- ```typescript
214
- import { timeout } from 'exisjs/middleware'
215
-
216
- @Gateway({
217
- middleware: [timeout(10000)] // 10 second global timeout
218
- })
219
- ```
220
-
221
- ### `backpressure(options)`
222
- Monitors the Node.js Event Loop Delay in real-time. If the event loop gets too backed up (e.g., CPU is pegged at 100%), it will start returning 503 Service Unavailable to new requests until the CPU catches its breath.
111
+ ### `ipFilter(options)`
112
+ Fast CIDR-based IP whitelist/blacklist filter.
223
113
 
224
114
  ---
225
115
 
226
116
  ## Utility Middleware
227
117
 
228
- ### `cors(options)`
229
- Native, integrated Cross-Origin Resource Sharing (CORS) handler. Features full support for preflight (`OPTIONS`), dynamic regex origins, and exposed headers.
230
-
231
- ```typescript
232
- import { cors } from 'exisjs/middleware'
233
-
234
- app.use(cors({
235
- origin: ['https://myapp.com', /localhost:\d+/],
236
- credentials: true,
237
- methods: ['GET', 'POST']
238
- }))
239
- ```
118
+ ### `cors(options?)`
119
+ Cross-Origin Resource Sharing handler supporting preflight, dynamic origin matching, and credential headers.
240
120
 
241
121
  ### `requestId()`
242
- Injects a unique `X-Request-Id` into every incoming request and attaches it to `req.requestId`. Seamlessly respects incoming tracing headers (`traceparent`, `x-b3-traceid`) for distributed microservice tracing.
122
+ Injects a unique `X-Request-Id` into every incoming request and outgoing response header.
243
123
 
244
- ### `requestLogger(config)`
245
- A efficient request logger powered by Pino. Automatically logs method, URL, status code, and response time. Integrates perfectly with `requestId()` to attach trace IDs to every single log line.
246
-
247
- ```typescript
248
- import { requestLogger } from 'exisjs/middleware'
249
-
250
- app.use(requestLogger({ level: 'info' }))
251
- ```
124
+ ### `requestLogger(options?)`
125
+ High-performance request logger powered by Pino.
252
126
 
253
127
  ### `serveStatic(root, options?)`
254
- A highly optimized static file server. Supports ETags, `HEAD` requests, conditional GETs, streaming file reads, and deep path resolution. Perfect for serving SPAs or assets.
255
-
256
- ```typescript
257
- import { serveStatic } from 'exisjs/middleware'
258
-
259
- app.use('/public', serveStatic('./public', { maxAge: 86400 }))
260
- ```
261
-
262
- ---
263
-
264
- ## Architectural Middleware
265
-
266
- ExisJS provides utility wrappers that convert NestJS-style architectural patterns into standard Express middlewares, bridging the gap between OOP metadata and pure functional execution.
267
-
268
- ### `guard(fn)`
269
- Wraps an authorization or validation function. If the guard returns `false`, it throws an automatic `403 Forbidden` response.
270
-
271
- ```typescript
272
- import { guard } from 'exisjs/middleware'
273
-
274
- const RequireAdmin = guard((req) => req.user?.role === 'admin')
275
- ```
276
-
277
- ### `pipe(fn)`
278
- A synchronous transformation function. Takes the incoming request data, transforms it, and overwrites the body before passing it down the chain.
279
-
280
- ### `intercept(fn)`
281
- Wraps the entire request-response lifecycle. Interceptors can manipulate the response right before it gets sent to the client. Highly useful for standardizing JSON response shapes.
282
-
283
- ```typescript
284
- import { intercept } from 'exisjs/middleware'
285
-
286
- // Standardize all responses to { data: <payload> }
287
- const WrapResponse = intercept((req, res, data) => ({
288
- data
289
- }))
290
- ```
291
-
292
- ### `catchError(handler)`
293
- An exception filter wrapper. Catches any errors thrown by the route or previous middlewares and handles them gracefully.
294
-
295
- ```typescript
296
- import { catchError } from 'exisjs/middleware'
297
-
298
- const HandlePrismaErrors = catchError((err, req, res) => {
299
- if (err.code === 'P2002') {
300
- return res.status(409).json({ error: 'Unique constraint failed' })
301
- }
302
- throw err // Pass to default error handler
303
- })
304
- ```
128
+ Static file server supporting streaming and caching headers.
@@ -160,12 +160,9 @@ type Profile = ResolveSchema<typeof ProfileSchema>
160
160
 
161
161
  ---
162
162
 
163
- ## Integrations
163
+ ## OpenAPI Generation
164
164
 
165
- Because the ExisJS Validator is native to the framework, it is tightly coupled with our database and documentation adapters.
166
-
167
- ### OpenAPI Generation
168
- The `TexEngine` automatically converts validation schemas into strictly compliant OpenAPI/Swagger JSON schemas when attached to routes. This powers the zero-config ExisJS Swagger integration without any manual YAML authoring.
165
+ The `TexEngine` automatically converts validation schemas into strictly compliant OpenAPI/Swagger JSON schemas when attached to routes. This powers zero-config Swagger documentation once `@exisjs/swagger` is added.
169
166
 
170
167
  ---
171
168
 
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/error/errors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAIrD,qBAAa,SAAU,SAAQ,KAAK;IAClC,SAAgB,UAAU,EAAE,MAAM,CAAA;IAClC,SAAgB,IAAI,EAAE,MAAM,CAAA;IAC5B,SAAgB,aAAa,EAAE,OAAO,CAAA;IACtC,SAAgB,OAAO,CAAC,EAAE,OAAO,CAAA;gBAG/B,OAAO,EAAE,MAAM,EACf,UAAU,SAAM,EAChB,IAAI,SAAmB,EACvB,OAAO,CAAC,EAAE,OAAO;IAenB,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS;IAIhE,MAAM,CAAC,YAAY,CAAC,OAAO,SAAiB,GAAG,SAAS;IAIxD,MAAM,CAAC,SAAS,CAAC,OAAO,SAAc,GAAG,SAAS;IAIlD,MAAM,CAAC,QAAQ,CAAC,QAAQ,SAAa,GAAG,SAAS;IAIjD,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS;IAI3C,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS;IAInE,MAAM,CAAC,eAAe,CAAC,OAAO,SAAsB,GAAG,SAAS;IAIhE,MAAM,CAAC,QAAQ,CAAC,OAAO,SAA0B,GAAG,SAAS;IAI7D,MAAM,CAAC,kBAAkB,CAAC,OAAO,SAAwB,GAAG,SAAS;IAIrE,MAAM,CAAC,cAAc,CAAC,OAAO,SAAoB,GAAG,SAAS;IAI7D,MAAM,IAAI,MAAM;CAUjB;AAED,qBAAa,eAAgB,SAAQ,SAAS;gBAChC,OAAO,SAAgB,EAAE,OAAO,CAAC,EAAE,OAAO;CAIvD;AAED,qBAAa,iBAAkB,SAAQ,SAAS;gBAClC,OAAO,SAAiB;CAIrC;AAED,qBAAa,cAAe,SAAQ,SAAS;gBAC/B,OAAO,SAAc;CAIlC;AAED,qBAAa,aAAc,SAAQ,SAAS;gBAC9B,QAAQ,SAAa;CAIlC;AAED,qBAAa,aAAc,SAAQ,SAAS;gBAC9B,OAAO,SAAa;CAIjC;AAED,qBAAa,kBAAmB,SAAQ,SAAS;gBACnC,OAAO,SAAyB,EAAE,OAAO,CAAC,EAAE,OAAO;CAIhE;AAED,qBAAa,cAAe,SAAQ,SAAS;gBAC/B,OAAO,SAAsB;CAI1C;AAED,qBAAa,aAAc,SAAQ,SAAS;gBAC9B,OAAO,SAA0B;CAI9C;AAED,qBAAa,uBAAwB,SAAQ,SAAS;gBACxC,OAAO,SAAwB;CAI5C;AAED,qBAAa,mBAAoB,SAAQ,SAAS;gBACpC,OAAO,SAAoB;CAIxC;AAGD,eAAO,MAAM,aAAa,kBAAY,CAAA;AACtC,eAAO,MAAM,mBAAmB,wBAAkB,CAAA;AAClD,eAAO,MAAM,qBAAqB,0BAAoB,CAAA;AACtD,eAAO,MAAM,kBAAkB,uBAAiB,CAAA;AAChD,eAAO,MAAM,iBAAiB,sBAAgB,CAAA;AAC9C,eAAO,MAAM,iBAAiB,sBAAgB,CAAA;AAC9C,eAAO,MAAM,sBAAsB,2BAAqB,CAAA;AACxD,eAAO,MAAM,kBAAkB,uBAAiB,CAAA;AAChD,eAAO,MAAM,iBAAiB,sBAAgB,CAAA;AAC9C,eAAO,MAAM,2BAA2B,gCAA0B,CAAA;AAClE,eAAO,MAAM,uBAAuB,4BAAsB,CAAA;AA6G1D,wBAAgB,kBAAkB,CAAC,KAAK,UAAQ,GAAG,YAAY,CAsG9D;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAIjD"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/error/errors.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAIrD,qBAAa,SAAU,SAAQ,KAAK;IAClC,SAAgB,UAAU,EAAE,MAAM,CAAA;IAClC,SAAgB,IAAI,EAAE,MAAM,CAAA;IAC5B,SAAgB,aAAa,EAAE,OAAO,CAAA;IACtC,SAAgB,OAAO,CAAC,EAAE,OAAO,CAAA;gBAG/B,OAAO,EAAE,MAAM,EACf,UAAU,SAAM,EAChB,IAAI,SAAmB,EACvB,OAAO,CAAC,EAAE,OAAO;IAenB,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS;IAIhE,MAAM,CAAC,YAAY,CAAC,OAAO,SAAiB,GAAG,SAAS;IAIxD,MAAM,CAAC,SAAS,CAAC,OAAO,SAAc,GAAG,SAAS;IAIlD,MAAM,CAAC,QAAQ,CAAC,QAAQ,SAAa,GAAG,SAAS;IAIjD,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS;IAI3C,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS;IAInE,MAAM,CAAC,eAAe,CAAC,OAAO,SAAsB,GAAG,SAAS;IAIhE,MAAM,CAAC,QAAQ,CAAC,OAAO,SAA0B,GAAG,SAAS;IAI7D,MAAM,CAAC,kBAAkB,CAAC,OAAO,SAAwB,GAAG,SAAS;IAIrE,MAAM,CAAC,cAAc,CAAC,OAAO,SAAoB,GAAG,SAAS;IAI7D,MAAM,IAAI,MAAM;CAUjB;AAED,qBAAa,eAAgB,SAAQ,SAAS;gBAChC,OAAO,SAAgB,EAAE,OAAO,CAAC,EAAE,OAAO;CAIvD;AAED,qBAAa,iBAAkB,SAAQ,SAAS;gBAClC,OAAO,SAAiB;CAIrC;AAED,qBAAa,cAAe,SAAQ,SAAS;gBAC/B,OAAO,SAAc;CAIlC;AAED,qBAAa,aAAc,SAAQ,SAAS;gBAC9B,QAAQ,SAAa;CAIlC;AAED,qBAAa,aAAc,SAAQ,SAAS;gBAC9B,OAAO,SAAa;CAIjC;AAED,qBAAa,kBAAmB,SAAQ,SAAS;gBACnC,OAAO,SAAyB,EAAE,OAAO,CAAC,EAAE,OAAO;CAIhE;AAED,qBAAa,cAAe,SAAQ,SAAS;gBAC/B,OAAO,SAAsB;CAI1C;AAED,qBAAa,aAAc,SAAQ,SAAS;gBAC9B,OAAO,SAA0B;CAI9C;AAED,qBAAa,uBAAwB,SAAQ,SAAS;gBACxC,OAAO,SAAwB;CAI5C;AAED,qBAAa,mBAAoB,SAAQ,SAAS;gBACpC,OAAO,SAAoB;CAIxC;AAGD,eAAO,MAAM,aAAa,kBAAY,CAAA;AACtC,eAAO,MAAM,mBAAmB,wBAAkB,CAAA;AAClD,eAAO,MAAM,qBAAqB,0BAAoB,CAAA;AACtD,eAAO,MAAM,kBAAkB,uBAAiB,CAAA;AAChD,eAAO,MAAM,iBAAiB,sBAAgB,CAAA;AAC9C,eAAO,MAAM,iBAAiB,sBAAgB,CAAA;AAC9C,eAAO,MAAM,sBAAsB,2BAAqB,CAAA;AACxD,eAAO,MAAM,kBAAkB,uBAAiB,CAAA;AAChD,eAAO,MAAM,iBAAiB,sBAAgB,CAAA;AAC9C,eAAO,MAAM,2BAA2B,gCAA0B,CAAA;AAClE,eAAO,MAAM,uBAAuB,4BAAsB,CAAA;AA6G1D,wBAAgB,kBAAkB,CAAC,KAAK,UAAQ,GAAG,YAAY,CAuH9D;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAIjD"}
@@ -281,6 +281,22 @@ function createErrorHandler(isDev = false) {
281
281
  'Validation Error: ' +
282
282
  yupErrors.map((e) => `${e.path}: ${e.message}`).join(', ');
283
283
  }
284
+ // Normalize Tex ValidatorError
285
+ else if (err.name === 'ValidatorError' &&
286
+ 'errors' in err &&
287
+ Array.isArray(err.errors)) {
288
+ const texErrors = err.errors;
289
+ res.status(400).json({
290
+ statusCode: 400,
291
+ error: 'Bad Request',
292
+ message: 'Validation Error',
293
+ errors: texErrors.reduce((acc, e) => {
294
+ acc[e.path] = e.message;
295
+ return acc;
296
+ }, {}),
297
+ });
298
+ return;
299
+ }
284
300
  res.status(400).json({
285
301
  statusCode: 400,
286
302
  error: 'Bad Request',