exisjs 0.6.1 → 0.7.1

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 (564) hide show
  1. package/README.md +9 -3
  2. package/dist/cli/commands/build.d.ts.map +1 -1
  3. package/dist/cli/commands/build.js +2 -8
  4. package/dist/cli/commands/build.js.map +1 -1
  5. package/dist/cli/commands/dev.d.ts.map +1 -1
  6. package/dist/cli/commands/dev.js +33 -44
  7. package/dist/cli/commands/dev.js.map +1 -1
  8. package/dist/cli/commands/exports.d.ts.map +1 -1
  9. package/dist/cli/commands/exports.js +5 -32
  10. package/dist/cli/commands/exports.js.map +1 -1
  11. package/dist/cli/commands/generate.d.ts +2 -13
  12. package/dist/cli/commands/generate.d.ts.map +1 -1
  13. package/dist/cli/commands/generate.js +27 -60
  14. package/dist/cli/commands/generate.js.map +1 -1
  15. package/dist/cli/commands/init.d.ts.map +1 -1
  16. package/dist/cli/commands/init.js +4 -4
  17. package/dist/cli/commands/init.js.map +1 -1
  18. package/dist/cli/commands/start.d.ts.map +1 -1
  19. package/dist/cli/commands/start.js +2 -6
  20. package/dist/cli/commands/start.js.map +1 -1
  21. package/dist/cli/index.js +11 -23
  22. package/dist/cli/index.js.map +1 -1
  23. package/dist/cli/routes.d.ts.map +1 -1
  24. package/dist/cli/routes.js +20 -8
  25. package/dist/cli/routes.js.map +1 -1
  26. package/dist/config/config.d.ts +2 -1
  27. package/dist/config/config.d.ts.map +1 -1
  28. package/dist/config/config.js +7 -5
  29. package/dist/config/config.js.map +1 -1
  30. package/dist/config/env.d.ts.map +1 -1
  31. package/dist/config/env.js +3 -2
  32. package/dist/config/env.js.map +1 -1
  33. package/dist/config/types.d.ts +7 -2
  34. package/dist/config/types.d.ts.map +1 -1
  35. package/dist/decorators/constants.d.ts +9 -2
  36. package/dist/decorators/constants.d.ts.map +1 -1
  37. package/dist/decorators/constants.js +3 -2
  38. package/dist/decorators/constants.js.map +1 -1
  39. package/dist/decorators/core/metadata.d.ts +31 -0
  40. package/dist/decorators/core/metadata.d.ts.map +1 -1
  41. package/dist/decorators/core/metadata.js +110 -1
  42. package/dist/decorators/core/metadata.js.map +1 -1
  43. package/dist/decorators/core.d.ts +19 -4
  44. package/dist/decorators/core.d.ts.map +1 -1
  45. package/dist/decorators/core.js +29 -4
  46. package/dist/decorators/core.js.map +1 -1
  47. package/dist/decorators/middleware.d.ts +17 -17
  48. package/dist/decorators/middleware.d.ts.map +1 -1
  49. package/dist/decorators/middleware.js +111 -208
  50. package/dist/decorators/middleware.js.map +1 -1
  51. package/dist/decorators/params.d.ts +54 -12
  52. package/dist/decorators/params.d.ts.map +1 -1
  53. package/dist/decorators/params.js +40 -20
  54. package/dist/decorators/params.js.map +1 -1
  55. package/dist/decorators/routing.d.ts +0 -2
  56. package/dist/decorators/routing.d.ts.map +1 -1
  57. package/dist/decorators/routing.js +3 -4
  58. package/dist/decorators/routing.js.map +1 -1
  59. package/dist/di/container.d.ts +5 -1
  60. package/dist/di/container.d.ts.map +1 -1
  61. package/dist/di/container.js +56 -8
  62. package/dist/di/container.js.map +1 -1
  63. package/dist/di/decorators.d.ts +30 -0
  64. package/dist/di/decorators.d.ts.map +1 -0
  65. package/dist/di/decorators.js +59 -0
  66. package/dist/di/decorators.js.map +1 -0
  67. package/dist/di/index.d.ts +1 -0
  68. package/dist/di/index.d.ts.map +1 -1
  69. package/dist/di/index.js +4 -1
  70. package/dist/di/index.js.map +1 -1
  71. package/dist/docs/ARCHITECTURE.md +46 -285
  72. package/dist/docs/BENCHMARKS.md +5 -5
  73. package/dist/docs/README.md +8 -11
  74. package/dist/docs/content/boundaries.mdx +151 -0
  75. package/dist/docs/content/cli/commands.mdx +66 -104
  76. package/dist/docs/content/cli/overview.mdx +37 -47
  77. package/dist/docs/content/cli/usage.mdx +29 -15
  78. package/dist/docs/content/decorators.mdx +142 -81
  79. package/dist/docs/content/installation.mdx +20 -1
  80. package/dist/docs/content/middleware.mdx +65 -291
  81. package/dist/docs/content/modules.mdx +22 -1
  82. package/dist/docs/content/providers.mdx +33 -1
  83. package/dist/docs/content/security.mdx +44 -246
  84. package/dist/docs/content/structure.mdx +227 -100
  85. package/dist/docs/content/validation.mdx +0 -17
  86. package/dist/docs/reference/decorators.mdx +34 -216
  87. package/dist/docs/reference/di.mdx +35 -11
  88. package/dist/docs/reference/logger.mdx +100 -0
  89. package/dist/docs/reference/middleware.mdx +41 -217
  90. package/dist/docs/reference/router.mdx +9 -9
  91. package/dist/docs/reference/validator.mdx +2 -5
  92. package/dist/error/errors.d.ts.map +1 -1
  93. package/dist/error/errors.js +19 -5
  94. package/dist/error/errors.js.map +1 -1
  95. package/dist/index.d.ts +0 -1
  96. package/dist/index.d.ts.map +1 -1
  97. package/dist/index.js +1 -4
  98. package/dist/index.js.map +1 -1
  99. package/dist/lib/start-server.js +10 -0
  100. package/dist/lib/start-server.js.map +1 -1
  101. package/dist/logger/index.d.ts +81 -0
  102. package/dist/logger/index.d.ts.map +1 -0
  103. package/dist/logger/index.js +142 -0
  104. package/dist/logger/index.js.map +1 -0
  105. package/dist/middleware/dedupe.d.ts +1 -1
  106. package/dist/middleware/dedupe.js +1 -1
  107. package/dist/middleware/middleware.d.ts +3 -5
  108. package/dist/middleware/middleware.d.ts.map +1 -1
  109. package/dist/middleware/middleware.js +2 -6
  110. package/dist/middleware/middleware.js.map +1 -1
  111. package/dist/middleware/rate-limit.d.ts +0 -2
  112. package/dist/middleware/rate-limit.d.ts.map +1 -1
  113. package/dist/middleware/rate-limit.js +2 -14
  114. package/dist/middleware/rate-limit.js.map +1 -1
  115. package/dist/module/index.d.ts +2 -0
  116. package/dist/module/index.d.ts.map +1 -1
  117. package/dist/module/index.js +3 -1
  118. package/dist/module/index.js.map +1 -1
  119. package/dist/plugin/manager.d.ts +1 -1
  120. package/dist/plugin/manager.d.ts.map +1 -1
  121. package/dist/plugin/manager.js +47 -0
  122. package/dist/plugin/manager.js.map +1 -1
  123. package/dist/router/{gateway.d.ts → boundary.d.ts} +21 -13
  124. package/dist/router/boundary.d.ts.map +1 -0
  125. package/dist/router/boundary.js +11 -0
  126. package/dist/router/boundary.js.map +1 -0
  127. package/dist/router/controller-registrar.d.ts.map +1 -1
  128. package/dist/router/controller-registrar.js +33 -6
  129. package/dist/router/controller-registrar.js.map +1 -1
  130. package/dist/router/index.d.ts +3 -6
  131. package/dist/router/index.d.ts.map +1 -1
  132. package/dist/router/index.js +3 -7
  133. package/dist/router/index.js.map +1 -1
  134. package/dist/router/route-builder.d.ts +0 -28
  135. package/dist/router/route-builder.d.ts.map +1 -1
  136. package/dist/router/route-builder.js +2 -5
  137. package/dist/router/route-builder.js.map +1 -1
  138. package/dist/router/route-scanner.d.ts +1 -2
  139. package/dist/router/route-scanner.d.ts.map +1 -1
  140. package/dist/router/route-scanner.js +225 -203
  141. package/dist/router/route-scanner.js.map +1 -1
  142. package/dist/router/router.d.ts +4 -6
  143. package/dist/router/router.d.ts.map +1 -1
  144. package/dist/router/router.js +36 -72
  145. package/dist/router/router.js.map +1 -1
  146. package/dist/router/types.d.ts +2 -6
  147. package/dist/router/types.d.ts.map +1 -1
  148. package/dist/server/{bun-adapter.d.ts → adapters/bun-adapter.d.ts} +1 -1
  149. package/dist/server/adapters/bun-adapter.d.ts.map +1 -0
  150. package/dist/server/{bun-adapter.js → adapters/bun-adapter.js} +2 -24
  151. package/dist/server/adapters/bun-adapter.js.map +1 -0
  152. package/dist/server/{uws-adapter.d.ts → adapters/uws-adapter.d.ts} +1 -1
  153. package/dist/server/adapters/uws-adapter.d.ts.map +1 -0
  154. package/dist/server/{uws-adapter.js → adapters/uws-adapter.js} +1 -28
  155. package/dist/server/adapters/uws-adapter.js.map +1 -0
  156. package/dist/server/app.d.ts +10 -31
  157. package/dist/server/app.d.ts.map +1 -1
  158. package/dist/server/app.js +20 -135
  159. package/dist/server/app.js.map +1 -1
  160. package/dist/server/bootstrapper.d.ts +4 -15
  161. package/dist/server/bootstrapper.d.ts.map +1 -1
  162. package/dist/server/bootstrapper.js +30 -229
  163. package/dist/server/bootstrapper.js.map +1 -1
  164. package/dist/server/define.d.ts +2 -2
  165. package/dist/server/define.d.ts.map +1 -1
  166. package/dist/server/define.js +3 -3
  167. package/dist/server/define.js.map +1 -1
  168. package/dist/server/engines/bun-engine.d.ts +16 -0
  169. package/dist/server/engines/bun-engine.d.ts.map +1 -0
  170. package/dist/server/engines/bun-engine.js +41 -0
  171. package/dist/server/engines/bun-engine.js.map +1 -0
  172. package/dist/server/engines/engine.d.ts +16 -0
  173. package/dist/server/engines/engine.d.ts.map +1 -0
  174. package/dist/{queue/types.js → server/engines/engine.js} +1 -1
  175. package/dist/server/engines/engine.js.map +1 -0
  176. package/dist/server/engines/node-engine.d.ts +22 -0
  177. package/dist/server/engines/node-engine.d.ts.map +1 -0
  178. package/dist/server/engines/node-engine.js +130 -0
  179. package/dist/server/engines/node-engine.js.map +1 -0
  180. package/dist/server/engines/uws-engine.d.ts +16 -0
  181. package/dist/server/engines/uws-engine.d.ts.map +1 -0
  182. package/dist/server/engines/uws-engine.js +48 -0
  183. package/dist/server/engines/uws-engine.js.map +1 -0
  184. package/dist/server/request-handler.d.ts +0 -1
  185. package/dist/server/request-handler.d.ts.map +1 -1
  186. package/dist/server/request-handler.js +74 -48
  187. package/dist/server/request-handler.js.map +1 -1
  188. package/dist/server/request.d.ts +0 -8
  189. package/dist/server/request.d.ts.map +1 -1
  190. package/dist/server/request.js +0 -16
  191. package/dist/server/request.js.map +1 -1
  192. package/dist/server/response.d.ts.map +1 -1
  193. package/dist/server/response.js +2 -1
  194. package/dist/server/response.js.map +1 -1
  195. package/dist/utils/logger.d.ts.map +1 -1
  196. package/dist/utils/logger.js +0 -1
  197. package/dist/utils/logger.js.map +1 -1
  198. package/dist/utils/time.d.ts +6 -0
  199. package/dist/utils/time.d.ts.map +1 -0
  200. package/dist/utils/time.js +15 -0
  201. package/dist/utils/time.js.map +1 -0
  202. package/dist/validator/index.d.ts +1 -7
  203. package/dist/validator/index.d.ts.map +1 -1
  204. package/dist/validator/index.js +1 -5
  205. package/dist/validator/index.js.map +1 -1
  206. package/dist/validator/tex-types.d.ts +15 -2
  207. package/dist/validator/tex-types.d.ts.map +1 -1
  208. package/dist/validator/tex-types.js +8 -0
  209. package/dist/validator/tex-types.js.map +1 -1
  210. package/dist/validator/tex.d.ts.map +1 -1
  211. package/dist/validator/tex.js +21 -2
  212. package/dist/validator/tex.js.map +1 -1
  213. package/package.json +9 -151
  214. package/dist/adapters/aws-lambda.d.ts +0 -21
  215. package/dist/adapters/aws-lambda.d.ts.map +0 -1
  216. package/dist/adapters/aws-lambda.js +0 -125
  217. package/dist/adapters/aws-lambda.js.map +0 -1
  218. package/dist/adapters/bun.d.ts +0 -9
  219. package/dist/adapters/bun.d.ts.map +0 -1
  220. package/dist/adapters/bun.js +0 -23
  221. package/dist/adapters/bun.js.map +0 -1
  222. package/dist/adapters/cloudflare.d.ts +0 -10
  223. package/dist/adapters/cloudflare.d.ts.map +0 -1
  224. package/dist/adapters/cloudflare.js +0 -22
  225. package/dist/adapters/cloudflare.js.map +0 -1
  226. package/dist/adapters/deno.d.ts +0 -7
  227. package/dist/adapters/deno.d.ts.map +0 -1
  228. package/dist/adapters/deno.js +0 -21
  229. package/dist/adapters/deno.js.map +0 -1
  230. package/dist/adapters/fastly.d.ts +0 -6
  231. package/dist/adapters/fastly.d.ts.map +0 -1
  232. package/dist/adapters/fastly.js +0 -20
  233. package/dist/adapters/fastly.js.map +0 -1
  234. package/dist/adapters/fetch.d.ts +0 -30
  235. package/dist/adapters/fetch.d.ts.map +0 -1
  236. package/dist/adapters/fetch.js +0 -119
  237. package/dist/adapters/fetch.js.map +0 -1
  238. package/dist/adapters/index.d.ts +0 -9
  239. package/dist/adapters/index.d.ts.map +0 -1
  240. package/dist/adapters/index.js +0 -28
  241. package/dist/adapters/index.js.map +0 -1
  242. package/dist/adapters/netlify.d.ts +0 -8
  243. package/dist/adapters/netlify.d.ts.map +0 -1
  244. package/dist/adapters/netlify.js +0 -20
  245. package/dist/adapters/netlify.js.map +0 -1
  246. package/dist/adapters/vercel.d.ts +0 -17
  247. package/dist/adapters/vercel.d.ts.map +0 -1
  248. package/dist/adapters/vercel.js +0 -23
  249. package/dist/adapters/vercel.js.map +0 -1
  250. package/dist/auth/index.d.ts +0 -8
  251. package/dist/auth/index.d.ts.map +0 -1
  252. package/dist/auth/index.js +0 -49
  253. package/dist/auth/index.js.map +0 -1
  254. package/dist/auth/jwt.d.ts +0 -20
  255. package/dist/auth/jwt.d.ts.map +0 -1
  256. package/dist/auth/jwt.js +0 -59
  257. package/dist/auth/jwt.js.map +0 -1
  258. package/dist/auth/oauth/core.d.ts +0 -96
  259. package/dist/auth/oauth/core.d.ts.map +0 -1
  260. package/dist/auth/oauth/core.js +0 -203
  261. package/dist/auth/oauth/core.js.map +0 -1
  262. package/dist/auth/oauth/index.d.ts +0 -45
  263. package/dist/auth/oauth/index.d.ts.map +0 -1
  264. package/dist/auth/oauth/index.js +0 -64
  265. package/dist/auth/oauth/index.js.map +0 -1
  266. package/dist/auth/oauth/middleware.d.ts +0 -63
  267. package/dist/auth/oauth/middleware.d.ts.map +0 -1
  268. package/dist/auth/oauth/middleware.js +0 -164
  269. package/dist/auth/oauth/middleware.js.map +0 -1
  270. package/dist/auth/oauth/providers/custom.d.ts +0 -41
  271. package/dist/auth/oauth/providers/custom.d.ts.map +0 -1
  272. package/dist/auth/oauth/providers/custom.js +0 -204
  273. package/dist/auth/oauth/providers/custom.js.map +0 -1
  274. package/dist/auth/oauth/providers/discord.d.ts +0 -23
  275. package/dist/auth/oauth/providers/discord.d.ts.map +0 -1
  276. package/dist/auth/oauth/providers/discord.js +0 -130
  277. package/dist/auth/oauth/providers/discord.js.map +0 -1
  278. package/dist/auth/oauth/providers/facebook.d.ts +0 -28
  279. package/dist/auth/oauth/providers/facebook.d.ts.map +0 -1
  280. package/dist/auth/oauth/providers/facebook.js +0 -124
  281. package/dist/auth/oauth/providers/facebook.js.map +0 -1
  282. package/dist/auth/oauth/providers/github.d.ts +0 -25
  283. package/dist/auth/oauth/providers/github.d.ts.map +0 -1
  284. package/dist/auth/oauth/providers/github.js +0 -132
  285. package/dist/auth/oauth/providers/github.js.map +0 -1
  286. package/dist/auth/oauth/providers/google.d.ts +0 -23
  287. package/dist/auth/oauth/providers/google.d.ts.map +0 -1
  288. package/dist/auth/oauth/providers/google.js +0 -134
  289. package/dist/auth/oauth/providers/google.js.map +0 -1
  290. package/dist/auth/oauth/providers/microsoft.d.ts +0 -28
  291. package/dist/auth/oauth/providers/microsoft.d.ts.map +0 -1
  292. package/dist/auth/oauth/providers/microsoft.js +0 -136
  293. package/dist/auth/oauth/providers/microsoft.js.map +0 -1
  294. package/dist/auth/oauth/types.d.ts +0 -158
  295. package/dist/auth/oauth/types.d.ts.map +0 -1
  296. package/dist/auth/oauth/types.js +0 -4
  297. package/dist/auth/oauth/types.js.map +0 -1
  298. package/dist/auth/password.d.ts +0 -25
  299. package/dist/auth/password.d.ts.map +0 -1
  300. package/dist/auth/password.js +0 -93
  301. package/dist/auth/password.js.map +0 -1
  302. package/dist/auth/rbac.d.ts +0 -10
  303. package/dist/auth/rbac.d.ts.map +0 -1
  304. package/dist/auth/rbac.js +0 -34
  305. package/dist/auth/rbac.js.map +0 -1
  306. package/dist/auth/session.d.ts +0 -26
  307. package/dist/auth/session.d.ts.map +0 -1
  308. package/dist/auth/session.js +0 -134
  309. package/dist/auth/session.js.map +0 -1
  310. package/dist/cache/index.d.ts +0 -4
  311. package/dist/cache/index.d.ts.map +0 -1
  312. package/dist/cache/index.js +0 -25
  313. package/dist/cache/index.js.map +0 -1
  314. package/dist/cache/store.d.ts +0 -58
  315. package/dist/cache/store.d.ts.map +0 -1
  316. package/dist/cache/store.js +0 -298
  317. package/dist/cache/store.js.map +0 -1
  318. package/dist/cron/parser.d.ts +0 -2
  319. package/dist/cron/parser.d.ts.map +0 -1
  320. package/dist/cron/parser.js +0 -52
  321. package/dist/cron/parser.js.map +0 -1
  322. package/dist/cron/scheduler.d.ts +0 -23
  323. package/dist/cron/scheduler.d.ts.map +0 -1
  324. package/dist/cron/scheduler.js +0 -114
  325. package/dist/cron/scheduler.js.map +0 -1
  326. package/dist/database/adapters/mongodb.d.ts +0 -58
  327. package/dist/database/adapters/mongodb.d.ts.map +0 -1
  328. package/dist/database/adapters/mongodb.js +0 -264
  329. package/dist/database/adapters/mongodb.js.map +0 -1
  330. package/dist/database/adapters/mysql.d.ts +0 -27
  331. package/dist/database/adapters/mysql.d.ts.map +0 -1
  332. package/dist/database/adapters/mysql.js +0 -188
  333. package/dist/database/adapters/mysql.js.map +0 -1
  334. package/dist/database/adapters/postgres.d.ts +0 -28
  335. package/dist/database/adapters/postgres.d.ts.map +0 -1
  336. package/dist/database/adapters/postgres.js +0 -174
  337. package/dist/database/adapters/postgres.js.map +0 -1
  338. package/dist/database/adapters/sqlite.d.ts +0 -27
  339. package/dist/database/adapters/sqlite.d.ts.map +0 -1
  340. package/dist/database/adapters/sqlite.js +0 -149
  341. package/dist/database/adapters/sqlite.js.map +0 -1
  342. package/dist/database/index.d.ts +0 -42
  343. package/dist/database/index.d.ts.map +0 -1
  344. package/dist/database/index.js +0 -58
  345. package/dist/database/index.js.map +0 -1
  346. package/dist/database/manager.d.ts +0 -141
  347. package/dist/database/manager.d.ts.map +0 -1
  348. package/dist/database/manager.js +0 -337
  349. package/dist/database/manager.js.map +0 -1
  350. package/dist/database/migration.d.ts +0 -57
  351. package/dist/database/migration.d.ts.map +0 -1
  352. package/dist/database/migration.js +0 -329
  353. package/dist/database/migration.js.map +0 -1
  354. package/dist/database/query-builder.d.ts +0 -95
  355. package/dist/database/query-builder.d.ts.map +0 -1
  356. package/dist/database/query-builder.js +0 -404
  357. package/dist/database/query-builder.js.map +0 -1
  358. package/dist/database/sql/index.d.ts +0 -18
  359. package/dist/database/sql/index.d.ts.map +0 -1
  360. package/dist/database/sql/index.js +0 -74
  361. package/dist/database/sql/index.js.map +0 -1
  362. package/dist/database/sql/schema.d.ts +0 -38
  363. package/dist/database/sql/schema.d.ts.map +0 -1
  364. package/dist/database/sql/schema.js +0 -80
  365. package/dist/database/sql/schema.js.map +0 -1
  366. package/dist/database/synchronizer.d.ts +0 -12
  367. package/dist/database/synchronizer.d.ts.map +0 -1
  368. package/dist/database/synchronizer.js +0 -82
  369. package/dist/database/synchronizer.js.map +0 -1
  370. package/dist/database/types.d.ts +0 -184
  371. package/dist/database/types.d.ts.map +0 -1
  372. package/dist/database/types.js +0 -4
  373. package/dist/database/types.js.map +0 -1
  374. package/dist/dataloader/dataloader.d.ts +0 -23
  375. package/dist/dataloader/dataloader.d.ts.map +0 -1
  376. package/dist/dataloader/dataloader.js +0 -98
  377. package/dist/dataloader/dataloader.js.map +0 -1
  378. package/dist/dataloader/index.d.ts +0 -3
  379. package/dist/dataloader/index.d.ts.map +0 -1
  380. package/dist/dataloader/index.js +0 -19
  381. package/dist/dataloader/index.js.map +0 -1
  382. package/dist/dataloader/registry.d.ts +0 -17
  383. package/dist/dataloader/registry.d.ts.map +0 -1
  384. package/dist/dataloader/registry.js +0 -47
  385. package/dist/dataloader/registry.js.map +0 -1
  386. package/dist/dev/dep-graph.d.ts +0 -2
  387. package/dist/dev/dep-graph.d.ts.map +0 -1
  388. package/dist/dev/dep-graph.js +0 -111
  389. package/dist/dev/dep-graph.js.map +0 -1
  390. package/dist/dev/hot-reload.d.ts +0 -30
  391. package/dist/dev/hot-reload.d.ts.map +0 -1
  392. package/dist/dev/hot-reload.js +0 -262
  393. package/dist/dev/hot-reload.js.map +0 -1
  394. package/dist/docs/content/adapters.mdx +0 -199
  395. package/dist/docs/content/cache.mdx +0 -239
  396. package/dist/docs/content/circuit-breaker.mdx +0 -130
  397. package/dist/docs/content/cron.mdx +0 -109
  398. package/dist/docs/content/database.mdx +0 -278
  399. package/dist/docs/content/gateways.mdx +0 -376
  400. package/dist/docs/content/oauth.mdx +0 -179
  401. package/dist/docs/content/queues.mdx +0 -177
  402. package/dist/docs/content/rpc.mdx +0 -146
  403. package/dist/docs/content/sse.mdx +0 -159
  404. package/dist/docs/content/websockets.mdx +0 -289
  405. package/dist/docs/integrations/README.md +0 -23
  406. package/dist/docs/integrations/jwt.mdx +0 -151
  407. package/dist/docs/integrations/mongo.mdx +0 -183
  408. package/dist/docs/integrations/observability.mdx +0 -125
  409. package/dist/docs/integrations/openai.mdx +0 -108
  410. package/dist/docs/integrations/postgres.mdx +0 -190
  411. package/dist/docs/integrations/posthog.mdx +0 -122
  412. package/dist/docs/integrations/redis.mdx +0 -141
  413. package/dist/docs/integrations/resend.mdx +0 -117
  414. package/dist/docs/integrations/s3.mdx +0 -122
  415. package/dist/docs/integrations/swagger.mdx +0 -113
  416. package/dist/docs/reference/adapters.mdx +0 -130
  417. package/dist/docs/reference/auth.mdx +0 -183
  418. package/dist/docs/reference/cache.mdx +0 -132
  419. package/dist/docs/reference/circuit-breaker.mdx +0 -71
  420. package/dist/docs/reference/queue.mdx +0 -155
  421. package/dist/docs/reference/storage.mdx +0 -116
  422. package/dist/docs/reference/swagger.mdx +0 -132
  423. package/dist/integrations/drizzle.d.ts +0 -10
  424. package/dist/integrations/drizzle.d.ts.map +0 -1
  425. package/dist/integrations/drizzle.js +0 -34
  426. package/dist/integrations/drizzle.js.map +0 -1
  427. package/dist/integrations/jwt.d.ts +0 -12
  428. package/dist/integrations/jwt.d.ts.map +0 -1
  429. package/dist/integrations/jwt.js +0 -29
  430. package/dist/integrations/jwt.js.map +0 -1
  431. package/dist/integrations/mongodb.d.ts +0 -13
  432. package/dist/integrations/mongodb.d.ts.map +0 -1
  433. package/dist/integrations/mongodb.js +0 -48
  434. package/dist/integrations/mongodb.js.map +0 -1
  435. package/dist/integrations/mongoose.d.ts +0 -13
  436. package/dist/integrations/mongoose.d.ts.map +0 -1
  437. package/dist/integrations/mongoose.js +0 -84
  438. package/dist/integrations/mongoose.js.map +0 -1
  439. package/dist/integrations/openai.d.ts +0 -12
  440. package/dist/integrations/openai.d.ts.map +0 -1
  441. package/dist/integrations/openai.js +0 -47
  442. package/dist/integrations/openai.js.map +0 -1
  443. package/dist/integrations/postgres.d.ts +0 -13
  444. package/dist/integrations/postgres.d.ts.map +0 -1
  445. package/dist/integrations/postgres.js +0 -55
  446. package/dist/integrations/postgres.js.map +0 -1
  447. package/dist/integrations/posthog.d.ts +0 -13
  448. package/dist/integrations/posthog.d.ts.map +0 -1
  449. package/dist/integrations/posthog.js +0 -49
  450. package/dist/integrations/posthog.js.map +0 -1
  451. package/dist/integrations/prisma.d.ts +0 -10
  452. package/dist/integrations/prisma.d.ts.map +0 -1
  453. package/dist/integrations/prisma.js +0 -39
  454. package/dist/integrations/prisma.js.map +0 -1
  455. package/dist/integrations/redis.d.ts +0 -12
  456. package/dist/integrations/redis.d.ts.map +0 -1
  457. package/dist/integrations/redis.js +0 -48
  458. package/dist/integrations/redis.js.map +0 -1
  459. package/dist/integrations/resend.d.ts +0 -12
  460. package/dist/integrations/resend.d.ts.map +0 -1
  461. package/dist/integrations/resend.js +0 -47
  462. package/dist/integrations/resend.js.map +0 -1
  463. package/dist/integrations/s3.d.ts +0 -15
  464. package/dist/integrations/s3.d.ts.map +0 -1
  465. package/dist/integrations/s3.js +0 -60
  466. package/dist/integrations/s3.js.map +0 -1
  467. package/dist/integrations/supabase.d.ts +0 -13
  468. package/dist/integrations/supabase.d.ts.map +0 -1
  469. package/dist/integrations/supabase.js +0 -51
  470. package/dist/integrations/supabase.js.map +0 -1
  471. package/dist/middleware/cache.d.ts +0 -21
  472. package/dist/middleware/cache.d.ts.map +0 -1
  473. package/dist/middleware/cache.js +0 -156
  474. package/dist/middleware/cache.js.map +0 -1
  475. package/dist/observability/health.d.ts +0 -23
  476. package/dist/observability/health.d.ts.map +0 -1
  477. package/dist/observability/health.js +0 -49
  478. package/dist/observability/health.js.map +0 -1
  479. package/dist/observability/index.d.ts +0 -4
  480. package/dist/observability/index.d.ts.map +0 -1
  481. package/dist/observability/index.js +0 -10
  482. package/dist/observability/index.js.map +0 -1
  483. package/dist/observability/metrics.d.ts +0 -6
  484. package/dist/observability/metrics.d.ts.map +0 -1
  485. package/dist/observability/metrics.js +0 -60
  486. package/dist/observability/metrics.js.map +0 -1
  487. package/dist/observability/otel.d.ts +0 -27
  488. package/dist/observability/otel.d.ts.map +0 -1
  489. package/dist/observability/otel.js +0 -45
  490. package/dist/observability/otel.js.map +0 -1
  491. package/dist/observability/prometheus.d.ts +0 -30
  492. package/dist/observability/prometheus.d.ts.map +0 -1
  493. package/dist/observability/prometheus.js +0 -31
  494. package/dist/observability/prometheus.js.map +0 -1
  495. package/dist/queue/client.d.ts +0 -13
  496. package/dist/queue/client.d.ts.map +0 -1
  497. package/dist/queue/client.js +0 -83
  498. package/dist/queue/client.js.map +0 -1
  499. package/dist/queue/drivers/MemoryDriver.d.ts +0 -21
  500. package/dist/queue/drivers/MemoryDriver.d.ts.map +0 -1
  501. package/dist/queue/drivers/MemoryDriver.js +0 -176
  502. package/dist/queue/drivers/MemoryDriver.js.map +0 -1
  503. package/dist/queue/drivers/RedisDriver.d.ts +0 -19
  504. package/dist/queue/drivers/RedisDriver.d.ts.map +0 -1
  505. package/dist/queue/drivers/RedisDriver.js +0 -130
  506. package/dist/queue/drivers/RedisDriver.js.map +0 -1
  507. package/dist/queue/index.d.ts +0 -18
  508. package/dist/queue/index.d.ts.map +0 -1
  509. package/dist/queue/index.js +0 -37
  510. package/dist/queue/index.js.map +0 -1
  511. package/dist/queue/manager.d.ts +0 -18
  512. package/dist/queue/manager.d.ts.map +0 -1
  513. package/dist/queue/manager.js +0 -59
  514. package/dist/queue/manager.js.map +0 -1
  515. package/dist/queue/types.d.ts +0 -55
  516. package/dist/queue/types.d.ts.map +0 -1
  517. package/dist/queue/types.js.map +0 -1
  518. package/dist/queue/worker.d.ts +0 -18
  519. package/dist/queue/worker.d.ts.map +0 -1
  520. package/dist/queue/worker.js +0 -176
  521. package/dist/queue/worker.js.map +0 -1
  522. package/dist/router/gateway.d.ts.map +0 -1
  523. package/dist/router/gateway.js +0 -11
  524. package/dist/router/gateway.js.map +0 -1
  525. package/dist/server/bun-adapter.d.ts.map +0 -1
  526. package/dist/server/bun-adapter.js.map +0 -1
  527. package/dist/server/sse.d.ts +0 -16
  528. package/dist/server/sse.d.ts.map +0 -1
  529. package/dist/server/sse.js +0 -51
  530. package/dist/server/sse.js.map +0 -1
  531. package/dist/server/uws-adapter.d.ts.map +0 -1
  532. package/dist/server/uws-adapter.js.map +0 -1
  533. package/dist/storage/index.d.ts +0 -15
  534. package/dist/storage/index.d.ts.map +0 -1
  535. package/dist/storage/index.js +0 -7
  536. package/dist/storage/index.js.map +0 -1
  537. package/dist/swagger/index.d.ts +0 -9
  538. package/dist/swagger/index.d.ts.map +0 -1
  539. package/dist/swagger/index.js +0 -165
  540. package/dist/swagger/index.js.map +0 -1
  541. package/dist/threads/pool.d.ts +0 -14
  542. package/dist/threads/pool.d.ts.map +0 -1
  543. package/dist/threads/pool.js +0 -93
  544. package/dist/threads/pool.js.map +0 -1
  545. package/dist/threads/worker-runner.d.ts +0 -2
  546. package/dist/threads/worker-runner.d.ts.map +0 -1
  547. package/dist/threads/worker-runner.js +0 -71
  548. package/dist/threads/worker-runner.js.map +0 -1
  549. package/dist/validator/validator.d.ts +0 -360
  550. package/dist/validator/validator.d.ts.map +0 -1
  551. package/dist/validator/validator.js +0 -931
  552. package/dist/validator/validator.js.map +0 -1
  553. package/dist/websocket/orchestrator.d.ts +0 -11
  554. package/dist/websocket/orchestrator.d.ts.map +0 -1
  555. package/dist/websocket/orchestrator.js +0 -238
  556. package/dist/websocket/orchestrator.js.map +0 -1
  557. package/dist/websocket/server.d.ts +0 -66
  558. package/dist/websocket/server.d.ts.map +0 -1
  559. package/dist/websocket/server.js +0 -158
  560. package/dist/websocket/server.js.map +0 -1
  561. package/dist/websocket/socket.d.ts +0 -119
  562. package/dist/websocket/socket.d.ts.map +0 -1
  563. package/dist/websocket/socket.js +0 -242
  564. 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,54 @@ 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
+ - `@QueryParam(nameOrPipe?)` / `@Query(nameOrPipe?)`: Injects a URL query parameter (e.g., `?search=term`).
71
+ - `@HostParam(nameOrPipe?)`: Injects a subdomain parameter.
78
72
  - `@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.
73
+ - `@Res(options?)`: Injects the raw ExisJS Response object (`{ passthrough: true }`).
80
74
  - `@Ip()`: Injects the client's IP address.
81
- - `@Session()`: Injects the active session object (requires session middleware).
82
75
  - `@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
- ```
76
+ - `createParamDecorator(factory)`: Exports a factory to create custom parameter decorators (e.g. `@CurrentUser()`).
103
77
 
104
78
  ---
105
79
 
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.
127
-
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
- ```
143
-
144
- ---
145
-
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.
80
+ ## 3. Middleware & Pipeline Decorators
153
81
 
154
- ### `@Redirect(url, statusCode?)`
155
- Redirects the request to the specified URL.
156
-
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
- ```
82
+ - `@Use(...middlewaresOrGuardsOrInterceptorsOrFilters)`: Unified decorator that binds middlewares, guards (`canActivate`), interceptors (`intercept`), or exception filters (`catch`) to a controller class or method.
83
+ - `@Idempotent(options?)`: Caches responses based on the `Idempotency-Key` header using native in-memory off-heap storage.
173
84
 
174
85
  ---
175
86
 
176
- ## 5. Security & Lifecycle
87
+ ## 4. Response & Metadata Modifiers
177
88
 
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).
89
+ - `@HttpCode(code: number)`: Enforces a custom HTTP status code on success.
90
+ - `@Header(name: string, value: string)`: Appends an HTTP header to the response.
91
+ - `@Returns(schema)`: Attaches response schema for OpenAPI documentation.
92
+ - `@Redirect(url: string, statusCode?: number)`: Redirects request to target URL.
93
+ - `@Permissions(...permissions: string[])`: Sets required permissions on the route.
94
+ - `@Hosts(...hosts: string[])`: Restricts routes to specific Host headers.
95
+ - `@SetMetadata(key, value)`: Attaches arbitrary custom metadata to a class or handler method, retrievable via `Reflector`.
96
+ - `Reflector`: Utility class to inspect metadata attached by `@SetMetadata`:
97
+ - `Reflector.get(key, target)`: Retrieves metadata for a specific target.
98
+ - `Reflector.getAllAndOverride(key, targets)`: Retrieves metadata, overriding higher-level targets with lower-level targets.
99
+ - `Reflector.getAllAndMerge(key, targets)`: Merges array/object metadata across multiple targets.
185
100
 
186
101
  ---
187
102
 
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
- ```
103
+ ## 5. Dependency Injection & Modules
216
104
 
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`).
105
+ - `@Module({ imports?, controllers?, providers?, exports? })`: OOP class decorator equivalent to `defineModule()` for structuring application modules.
106
+ - `@Injectable(options?)`: Marks a service class as an IoC provider managed by the container. Supports `{ scope: 'singleton' | 'request' | 'transient' }`.
107
+ - `@Inject(token)`: Constructor parameter decorator for injecting dependencies by class, string, or symbol token.
108
+ - `@Optional()`: Constructor parameter decorator resolving missing dependencies to `undefined` without throwing.
109
+ - `@Boundary(config)`: Marks a class as a folder-scoped Boundary configuring CORS, headers, exclusions, and pipeline steps.
110
+ - `@Server(config)`: Marks a class as a root server definition.
219
111
 
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
- ```
@@ -51,17 +51,26 @@ app.provide(AuthService, AuthService)
51
51
 
52
52
  ---
53
53
 
54
- ## Scopes (`singleton` vs `request`)
54
+ ## Scopes (`singleton`, `request`, `transient`)
55
55
 
56
56
  By default, all providers in ExisJS are **Singletons**. They are instantiated once and cached for the lifetime of the application.
57
57
 
58
- If you need a new instance of a dependency for *every single incoming HTTP request*, you can change the scope to `request`.
58
+ ExisJS supports three provider scopes in the `@Injectable()` decorator and `app.provide()`:
59
+
60
+ - **`singleton` (Default)**: Instantiated once and cached for the lifetime of the application.
61
+ - **`request`**: A new instance is created exclusively for each incoming HTTP request, and garbage collected afterward.
62
+ - **`transient`**: A new instance is created every single time the dependency is injected or resolved.
59
63
 
60
64
  ```typescript
61
65
  app.provide('TraceLogger', {
62
66
  useClass: RequestScopedLogger,
63
67
  scope: 'request'
64
68
  })
69
+
70
+ app.provide('OperationContext', {
71
+ useClass: OperationContext,
72
+ scope: 'transient'
73
+ })
65
74
  ```
66
75
 
67
76
  > [!WARNING]
@@ -78,7 +87,7 @@ The true superpower of ExisJS is the `inject()` hook.
78
87
  Powered by Node.js `AsyncLocalStorage`, `inject()` can be called from **anywhere** within a request lifecycle (Controllers, Middlewares, nested utility functions) without needing to explicitly pass the `app` or `req` objects down the call chain!
79
88
 
80
89
  ```typescript filename="src/http/users/route.ts"
81
- import { route } from 'exisjs/router'
90
+ import { route, controller } from 'exisjs/router'
82
91
  import { inject } from 'exisjs/di'
83
92
  import { Database } from '../db' // The class definition
84
93
 
@@ -100,24 +109,39 @@ export default controller({
100
109
  > [!NOTE]
101
110
  > `inject()` relies on the active execution context. If you call `inject()` outside of an active HTTP request or application lifecycle hook (e.g., in a background `setInterval` without context), it will throw an error.
102
111
 
103
- ### 2. Using `inject()` in Classes (OOP)
104
-
105
- Unlike other frameworks like NestJS, ExisJS does **not** rely on slow, metadata-heavy Constructor Injection.
112
+ ### 2. Constructor Injection in Classes (OOP)
106
113
 
107
- Instead, you use the exact same `inject()` function directly inside your Controller methods! This completely eliminates the need for `@Inject()` decorators or massive constructor boilerplate.
114
+ ExisJS supports full OOP constructor parameter injection. You can inject services directly via type annotation or specify tokens with `@Inject()`, and designate optional dependencies with `@Optional()`:
108
115
 
109
116
  ```typescript filename="src/http/users/route.ts"
110
- import { Controller, Get } from 'exisjs/decorators'
111
- import { inject } from 'exisjs/di'
112
- import { Database } from '../db'
117
+ import { Controller, Get, Param, Inject, Optional } from 'exisjs/decorators'
118
+ import { UserService } from './service'
119
+
120
+ @Controller('/users')
121
+ export default class UserController {
122
+ constructor(
123
+ private userService: UserService,
124
+ @Inject('DATABASE_URL') private dbUrl: string,
125
+ @Optional() @Inject('ANALYTICS') private analytics?: any
126
+ ) {}
127
+
128
+ @Get('/:id')
129
+ async getUser(@Param('id') id: string) {
130
+ return this.userService.findById(id)
131
+ }
132
+ }
133
+ ```
113
134
 
135
+ You can also use property-level `inject()` inside your Controller methods:
136
+
137
+ ```typescript
114
138
  @Controller('/users')
115
139
  export default class UserController {
116
140
  @Get('/')
117
141
  async getUsers() {
118
- // Inject dependencies perfectly cleanly right where you need them!
119
142
  const db = inject(Database)
120
143
  return db.query('SELECT * FROM users')
121
144
  }
122
145
  }
123
146
  ```
147
+
@@ -0,0 +1,100 @@
1
+ ---
2
+ title: "Logger"
3
+ description: "API Reference for the ExisJS structured logger (exisjs/logger)."
4
+ ---
5
+
6
+ # Logger (`exisjs/logger`)
7
+
8
+ ExisJS includes a built-in, high-performance structured logger powered by Pino. It provides colored, pretty-printed logs in development and fast, structured JSON in production.
9
+
10
+ All logger APIs are imported directly from the dedicated subpath `exisjs/logger`.
11
+
12
+ ```typescript
13
+ import { logger, configureLogger, setLogger } from 'exisjs/logger'
14
+ ```
15
+
16
+ ---
17
+
18
+ ## 1. Global Logger Singleton (`logger`)
19
+
20
+ The `logger` singleton can be imported and called anywhere in your application:
21
+
22
+ ```typescript
23
+ import { logger } from 'exisjs/logger'
24
+
25
+ logger.info('Server boot sequence initiated')
26
+ logger.warn({ origin: req.headers.origin }, 'Untrusted origin detected')
27
+ logger.error({ err }, 'Failed to persist record to database')
28
+ logger.debug({ payload }, 'Parsing incoming request payload')
29
+ ```
30
+
31
+ ### Methods
32
+ - `logger.info([obj], msg, ...args)`
33
+ - `logger.warn([obj], msg, ...args)`
34
+ - `logger.error([obj], msg, ...args)`
35
+ - `logger.debug([obj], msg, ...args)`
36
+ - `logger.trace([obj], msg, ...args)`
37
+ - `logger.fatal([obj], msg, ...args)`
38
+ - `logger.child(bindings)`: Creates a child logger with bound metadata (e.g. `{ requestId: '123' }`).
39
+
40
+ ---
41
+
42
+ ## 2. Configuration (`configureLogger`)
43
+
44
+ Use `configureLogger()` to adjust log levels, toggle pretty printing, and customize sensitive field redactions across the entire application:
45
+
46
+ ```typescript filename="src/http/server.ts"
47
+ import { configureLogger } from 'exisjs/logger'
48
+
49
+ configureLogger({
50
+ level: process.env.NODE_ENV === 'production' ? 'info' : 'debug',
51
+ pretty: process.env.NODE_ENV !== 'production',
52
+ redact: ['*.password', '*.token', '*.secret', 'req.headers.cookie'],
53
+ })
54
+ ```
55
+
56
+ ### Options
57
+ - `level` (`'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal' | 'silent'`): Minimum level to output (default: `'info'`).
58
+ - `pretty` (`boolean`): Whether to format log lines with bracketed timestamp and colorized labels (`[HH:MM:ss] LEVEL: message`). Default is `true` in development and `false` in production.
59
+ - `redact` (`string[]`): Property paths to censor automatically from log payloads.
60
+ - `replaceRedact` (`boolean`): When `true`, replaces default redact paths instead of merging with them.
61
+
62
+ ---
63
+
64
+ ## 3. Custom Logger Instance (`setLogger`)
65
+
66
+ If you want to plug in your own custom Pino instance or transport (e.g., streaming logs directly to Loki, Datadog, or Elasticsearch), pass it to `setLogger()`:
67
+
68
+ ```typescript filename="src/http/server.ts"
69
+ import { setLogger } from 'exisjs/logger'
70
+ import pino from 'pino'
71
+
72
+ const customPino = pino({
73
+ level: 'info',
74
+ transport: {
75
+ target: 'pino-loki',
76
+ options: { host: 'http://localhost:3100' }
77
+ }
78
+ })
79
+
80
+ setLogger(customPino)
81
+ ```
82
+
83
+ ---
84
+
85
+ ## 4. Request-Scoped Logger (`req.log`)
86
+
87
+ Every incoming HTTP request in ExisJS automatically receives a child logger bound to `req.log`. It automatically includes request context such as `req.requestId`:
88
+
89
+ ```typescript filename="src/http/users/route.ts"
90
+ import { route, controller } from 'exisjs/router'
91
+
92
+ export default controller({
93
+ profile: route.get('/profile', {
94
+ async handle({ req }) {
95
+ req.log.info('Fetching user profile')
96
+ return { ok: true }
97
+ }
98
+ })
99
+ })
100
+ ```