exisjs 0.6.1 → 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 (517) hide show
  1. package/dist/cli/commands/build.d.ts.map +1 -1
  2. package/dist/cli/commands/build.js +2 -8
  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 +33 -44
  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-server.js +10 -0
  74. package/dist/lib/start-server.js.map +1 -1
  75. package/dist/logger/index.d.ts +81 -0
  76. package/dist/logger/index.d.ts.map +1 -0
  77. package/dist/logger/index.js +142 -0
  78. package/dist/logger/index.js.map +1 -0
  79. package/dist/middleware/dedupe.d.ts +1 -1
  80. package/dist/middleware/dedupe.js +1 -1
  81. package/dist/middleware/middleware.d.ts +3 -5
  82. package/dist/middleware/middleware.d.ts.map +1 -1
  83. package/dist/middleware/middleware.js +2 -6
  84. package/dist/middleware/middleware.js.map +1 -1
  85. package/dist/router/{gateway.d.ts → boundary.d.ts} +21 -13
  86. package/dist/router/boundary.d.ts.map +1 -0
  87. package/dist/router/boundary.js +11 -0
  88. package/dist/router/boundary.js.map +1 -0
  89. package/dist/router/index.d.ts +3 -6
  90. package/dist/router/index.d.ts.map +1 -1
  91. package/dist/router/index.js +3 -7
  92. package/dist/router/index.js.map +1 -1
  93. package/dist/router/route-builder.d.ts +0 -28
  94. package/dist/router/route-builder.d.ts.map +1 -1
  95. package/dist/router/route-builder.js +0 -4
  96. package/dist/router/route-builder.js.map +1 -1
  97. package/dist/router/route-scanner.d.ts +1 -2
  98. package/dist/router/route-scanner.d.ts.map +1 -1
  99. package/dist/router/route-scanner.js +216 -193
  100. package/dist/router/route-scanner.js.map +1 -1
  101. package/dist/router/router.d.ts +4 -6
  102. package/dist/router/router.d.ts.map +1 -1
  103. package/dist/router/router.js +36 -72
  104. package/dist/router/router.js.map +1 -1
  105. package/dist/router/types.d.ts +2 -6
  106. package/dist/router/types.d.ts.map +1 -1
  107. package/dist/server/{bun-adapter.d.ts → adapters/bun-adapter.d.ts} +1 -1
  108. package/dist/server/adapters/bun-adapter.d.ts.map +1 -0
  109. package/dist/server/{bun-adapter.js → adapters/bun-adapter.js} +2 -24
  110. package/dist/server/adapters/bun-adapter.js.map +1 -0
  111. package/dist/server/{uws-adapter.d.ts → adapters/uws-adapter.d.ts} +1 -1
  112. package/dist/server/adapters/uws-adapter.d.ts.map +1 -0
  113. package/dist/server/{uws-adapter.js → adapters/uws-adapter.js} +1 -28
  114. package/dist/server/adapters/uws-adapter.js.map +1 -0
  115. package/dist/server/app.d.ts +9 -30
  116. package/dist/server/app.d.ts.map +1 -1
  117. package/dist/server/app.js +19 -134
  118. package/dist/server/app.js.map +1 -1
  119. package/dist/server/bootstrapper.d.ts +4 -15
  120. package/dist/server/bootstrapper.d.ts.map +1 -1
  121. package/dist/server/bootstrapper.js +30 -229
  122. package/dist/server/bootstrapper.js.map +1 -1
  123. package/dist/server/define.d.ts +2 -2
  124. package/dist/server/define.d.ts.map +1 -1
  125. package/dist/server/define.js +3 -3
  126. package/dist/server/define.js.map +1 -1
  127. package/dist/server/engines/bun-engine.d.ts +16 -0
  128. package/dist/server/engines/bun-engine.d.ts.map +1 -0
  129. package/dist/server/engines/bun-engine.js +41 -0
  130. package/dist/server/engines/bun-engine.js.map +1 -0
  131. package/dist/server/engines/engine.d.ts +16 -0
  132. package/dist/server/engines/engine.d.ts.map +1 -0
  133. package/dist/{queue/types.js → server/engines/engine.js} +1 -1
  134. package/dist/server/engines/engine.js.map +1 -0
  135. package/dist/server/engines/node-engine.d.ts +22 -0
  136. package/dist/server/engines/node-engine.d.ts.map +1 -0
  137. package/dist/server/engines/node-engine.js +130 -0
  138. package/dist/server/engines/node-engine.js.map +1 -0
  139. package/dist/server/engines/uws-engine.d.ts +16 -0
  140. package/dist/server/engines/uws-engine.d.ts.map +1 -0
  141. package/dist/server/engines/uws-engine.js +48 -0
  142. package/dist/server/engines/uws-engine.js.map +1 -0
  143. package/dist/server/request-handler.d.ts +0 -1
  144. package/dist/server/request-handler.d.ts.map +1 -1
  145. package/dist/server/request-handler.js +74 -48
  146. package/dist/server/request-handler.js.map +1 -1
  147. package/dist/server/request.d.ts +0 -8
  148. package/dist/server/request.d.ts.map +1 -1
  149. package/dist/server/request.js +0 -16
  150. package/dist/server/request.js.map +1 -1
  151. package/dist/utils/time.d.ts +6 -0
  152. package/dist/utils/time.d.ts.map +1 -0
  153. package/dist/utils/time.js +15 -0
  154. package/dist/utils/time.js.map +1 -0
  155. package/dist/validator/index.d.ts +1 -7
  156. package/dist/validator/index.d.ts.map +1 -1
  157. package/dist/validator/index.js +1 -5
  158. package/dist/validator/index.js.map +1 -1
  159. package/dist/validator/tex-types.d.ts +15 -2
  160. package/dist/validator/tex-types.d.ts.map +1 -1
  161. package/dist/validator/tex-types.js +8 -0
  162. package/dist/validator/tex-types.js.map +1 -1
  163. package/dist/validator/tex.d.ts.map +1 -1
  164. package/dist/validator/tex.js +21 -2
  165. package/dist/validator/tex.js.map +1 -1
  166. package/package.json +9 -151
  167. package/dist/adapters/aws-lambda.d.ts +0 -21
  168. package/dist/adapters/aws-lambda.d.ts.map +0 -1
  169. package/dist/adapters/aws-lambda.js +0 -125
  170. package/dist/adapters/aws-lambda.js.map +0 -1
  171. package/dist/adapters/bun.d.ts +0 -9
  172. package/dist/adapters/bun.d.ts.map +0 -1
  173. package/dist/adapters/bun.js +0 -23
  174. package/dist/adapters/bun.js.map +0 -1
  175. package/dist/adapters/cloudflare.d.ts +0 -10
  176. package/dist/adapters/cloudflare.d.ts.map +0 -1
  177. package/dist/adapters/cloudflare.js +0 -22
  178. package/dist/adapters/cloudflare.js.map +0 -1
  179. package/dist/adapters/deno.d.ts +0 -7
  180. package/dist/adapters/deno.d.ts.map +0 -1
  181. package/dist/adapters/deno.js +0 -21
  182. package/dist/adapters/deno.js.map +0 -1
  183. package/dist/adapters/fastly.d.ts +0 -6
  184. package/dist/adapters/fastly.d.ts.map +0 -1
  185. package/dist/adapters/fastly.js +0 -20
  186. package/dist/adapters/fastly.js.map +0 -1
  187. package/dist/adapters/fetch.d.ts +0 -30
  188. package/dist/adapters/fetch.d.ts.map +0 -1
  189. package/dist/adapters/fetch.js +0 -119
  190. package/dist/adapters/fetch.js.map +0 -1
  191. package/dist/adapters/index.d.ts +0 -9
  192. package/dist/adapters/index.d.ts.map +0 -1
  193. package/dist/adapters/index.js +0 -28
  194. package/dist/adapters/index.js.map +0 -1
  195. package/dist/adapters/netlify.d.ts +0 -8
  196. package/dist/adapters/netlify.d.ts.map +0 -1
  197. package/dist/adapters/netlify.js +0 -20
  198. package/dist/adapters/netlify.js.map +0 -1
  199. package/dist/adapters/vercel.d.ts +0 -17
  200. package/dist/adapters/vercel.d.ts.map +0 -1
  201. package/dist/adapters/vercel.js +0 -23
  202. package/dist/adapters/vercel.js.map +0 -1
  203. package/dist/auth/index.d.ts +0 -8
  204. package/dist/auth/index.d.ts.map +0 -1
  205. package/dist/auth/index.js +0 -49
  206. package/dist/auth/index.js.map +0 -1
  207. package/dist/auth/jwt.d.ts +0 -20
  208. package/dist/auth/jwt.d.ts.map +0 -1
  209. package/dist/auth/jwt.js +0 -59
  210. package/dist/auth/jwt.js.map +0 -1
  211. package/dist/auth/oauth/core.d.ts +0 -96
  212. package/dist/auth/oauth/core.d.ts.map +0 -1
  213. package/dist/auth/oauth/core.js +0 -203
  214. package/dist/auth/oauth/core.js.map +0 -1
  215. package/dist/auth/oauth/index.d.ts +0 -45
  216. package/dist/auth/oauth/index.d.ts.map +0 -1
  217. package/dist/auth/oauth/index.js +0 -64
  218. package/dist/auth/oauth/index.js.map +0 -1
  219. package/dist/auth/oauth/middleware.d.ts +0 -63
  220. package/dist/auth/oauth/middleware.d.ts.map +0 -1
  221. package/dist/auth/oauth/middleware.js +0 -164
  222. package/dist/auth/oauth/middleware.js.map +0 -1
  223. package/dist/auth/oauth/providers/custom.d.ts +0 -41
  224. package/dist/auth/oauth/providers/custom.d.ts.map +0 -1
  225. package/dist/auth/oauth/providers/custom.js +0 -204
  226. package/dist/auth/oauth/providers/custom.js.map +0 -1
  227. package/dist/auth/oauth/providers/discord.d.ts +0 -23
  228. package/dist/auth/oauth/providers/discord.d.ts.map +0 -1
  229. package/dist/auth/oauth/providers/discord.js +0 -130
  230. package/dist/auth/oauth/providers/discord.js.map +0 -1
  231. package/dist/auth/oauth/providers/facebook.d.ts +0 -28
  232. package/dist/auth/oauth/providers/facebook.d.ts.map +0 -1
  233. package/dist/auth/oauth/providers/facebook.js +0 -124
  234. package/dist/auth/oauth/providers/facebook.js.map +0 -1
  235. package/dist/auth/oauth/providers/github.d.ts +0 -25
  236. package/dist/auth/oauth/providers/github.d.ts.map +0 -1
  237. package/dist/auth/oauth/providers/github.js +0 -132
  238. package/dist/auth/oauth/providers/github.js.map +0 -1
  239. package/dist/auth/oauth/providers/google.d.ts +0 -23
  240. package/dist/auth/oauth/providers/google.d.ts.map +0 -1
  241. package/dist/auth/oauth/providers/google.js +0 -134
  242. package/dist/auth/oauth/providers/google.js.map +0 -1
  243. package/dist/auth/oauth/providers/microsoft.d.ts +0 -28
  244. package/dist/auth/oauth/providers/microsoft.d.ts.map +0 -1
  245. package/dist/auth/oauth/providers/microsoft.js +0 -136
  246. package/dist/auth/oauth/providers/microsoft.js.map +0 -1
  247. package/dist/auth/oauth/types.d.ts +0 -158
  248. package/dist/auth/oauth/types.d.ts.map +0 -1
  249. package/dist/auth/oauth/types.js +0 -4
  250. package/dist/auth/oauth/types.js.map +0 -1
  251. package/dist/auth/password.d.ts +0 -25
  252. package/dist/auth/password.d.ts.map +0 -1
  253. package/dist/auth/password.js +0 -93
  254. package/dist/auth/password.js.map +0 -1
  255. package/dist/auth/rbac.d.ts +0 -10
  256. package/dist/auth/rbac.d.ts.map +0 -1
  257. package/dist/auth/rbac.js +0 -34
  258. package/dist/auth/rbac.js.map +0 -1
  259. package/dist/auth/session.d.ts +0 -26
  260. package/dist/auth/session.d.ts.map +0 -1
  261. package/dist/auth/session.js +0 -134
  262. package/dist/auth/session.js.map +0 -1
  263. package/dist/cache/index.d.ts +0 -4
  264. package/dist/cache/index.d.ts.map +0 -1
  265. package/dist/cache/index.js +0 -25
  266. package/dist/cache/index.js.map +0 -1
  267. package/dist/cache/store.d.ts +0 -58
  268. package/dist/cache/store.d.ts.map +0 -1
  269. package/dist/cache/store.js +0 -298
  270. package/dist/cache/store.js.map +0 -1
  271. package/dist/cron/parser.d.ts +0 -2
  272. package/dist/cron/parser.d.ts.map +0 -1
  273. package/dist/cron/parser.js +0 -52
  274. package/dist/cron/parser.js.map +0 -1
  275. package/dist/cron/scheduler.d.ts +0 -23
  276. package/dist/cron/scheduler.d.ts.map +0 -1
  277. package/dist/cron/scheduler.js +0 -114
  278. package/dist/cron/scheduler.js.map +0 -1
  279. package/dist/database/adapters/mongodb.d.ts +0 -58
  280. package/dist/database/adapters/mongodb.d.ts.map +0 -1
  281. package/dist/database/adapters/mongodb.js +0 -264
  282. package/dist/database/adapters/mongodb.js.map +0 -1
  283. package/dist/database/adapters/mysql.d.ts +0 -27
  284. package/dist/database/adapters/mysql.d.ts.map +0 -1
  285. package/dist/database/adapters/mysql.js +0 -188
  286. package/dist/database/adapters/mysql.js.map +0 -1
  287. package/dist/database/adapters/postgres.d.ts +0 -28
  288. package/dist/database/adapters/postgres.d.ts.map +0 -1
  289. package/dist/database/adapters/postgres.js +0 -174
  290. package/dist/database/adapters/postgres.js.map +0 -1
  291. package/dist/database/adapters/sqlite.d.ts +0 -27
  292. package/dist/database/adapters/sqlite.d.ts.map +0 -1
  293. package/dist/database/adapters/sqlite.js +0 -149
  294. package/dist/database/adapters/sqlite.js.map +0 -1
  295. package/dist/database/index.d.ts +0 -42
  296. package/dist/database/index.d.ts.map +0 -1
  297. package/dist/database/index.js +0 -58
  298. package/dist/database/index.js.map +0 -1
  299. package/dist/database/manager.d.ts +0 -141
  300. package/dist/database/manager.d.ts.map +0 -1
  301. package/dist/database/manager.js +0 -337
  302. package/dist/database/manager.js.map +0 -1
  303. package/dist/database/migration.d.ts +0 -57
  304. package/dist/database/migration.d.ts.map +0 -1
  305. package/dist/database/migration.js +0 -329
  306. package/dist/database/migration.js.map +0 -1
  307. package/dist/database/query-builder.d.ts +0 -95
  308. package/dist/database/query-builder.d.ts.map +0 -1
  309. package/dist/database/query-builder.js +0 -404
  310. package/dist/database/query-builder.js.map +0 -1
  311. package/dist/database/sql/index.d.ts +0 -18
  312. package/dist/database/sql/index.d.ts.map +0 -1
  313. package/dist/database/sql/index.js +0 -74
  314. package/dist/database/sql/index.js.map +0 -1
  315. package/dist/database/sql/schema.d.ts +0 -38
  316. package/dist/database/sql/schema.d.ts.map +0 -1
  317. package/dist/database/sql/schema.js +0 -80
  318. package/dist/database/sql/schema.js.map +0 -1
  319. package/dist/database/synchronizer.d.ts +0 -12
  320. package/dist/database/synchronizer.d.ts.map +0 -1
  321. package/dist/database/synchronizer.js +0 -82
  322. package/dist/database/synchronizer.js.map +0 -1
  323. package/dist/database/types.d.ts +0 -184
  324. package/dist/database/types.d.ts.map +0 -1
  325. package/dist/database/types.js +0 -4
  326. package/dist/database/types.js.map +0 -1
  327. package/dist/dataloader/dataloader.d.ts +0 -23
  328. package/dist/dataloader/dataloader.d.ts.map +0 -1
  329. package/dist/dataloader/dataloader.js +0 -98
  330. package/dist/dataloader/dataloader.js.map +0 -1
  331. package/dist/dataloader/index.d.ts +0 -3
  332. package/dist/dataloader/index.d.ts.map +0 -1
  333. package/dist/dataloader/index.js +0 -19
  334. package/dist/dataloader/index.js.map +0 -1
  335. package/dist/dataloader/registry.d.ts +0 -17
  336. package/dist/dataloader/registry.d.ts.map +0 -1
  337. package/dist/dataloader/registry.js +0 -47
  338. package/dist/dataloader/registry.js.map +0 -1
  339. package/dist/dev/dep-graph.d.ts +0 -2
  340. package/dist/dev/dep-graph.d.ts.map +0 -1
  341. package/dist/dev/dep-graph.js +0 -111
  342. package/dist/dev/dep-graph.js.map +0 -1
  343. package/dist/dev/hot-reload.d.ts +0 -30
  344. package/dist/dev/hot-reload.d.ts.map +0 -1
  345. package/dist/dev/hot-reload.js +0 -262
  346. package/dist/dev/hot-reload.js.map +0 -1
  347. package/dist/docs/content/adapters.mdx +0 -199
  348. package/dist/docs/content/cache.mdx +0 -239
  349. package/dist/docs/content/circuit-breaker.mdx +0 -130
  350. package/dist/docs/content/cron.mdx +0 -109
  351. package/dist/docs/content/database.mdx +0 -278
  352. package/dist/docs/content/gateways.mdx +0 -376
  353. package/dist/docs/content/oauth.mdx +0 -179
  354. package/dist/docs/content/queues.mdx +0 -177
  355. package/dist/docs/content/rpc.mdx +0 -146
  356. package/dist/docs/content/sse.mdx +0 -159
  357. package/dist/docs/content/websockets.mdx +0 -289
  358. package/dist/docs/integrations/README.md +0 -23
  359. package/dist/docs/integrations/jwt.mdx +0 -151
  360. package/dist/docs/integrations/mongo.mdx +0 -183
  361. package/dist/docs/integrations/observability.mdx +0 -125
  362. package/dist/docs/integrations/openai.mdx +0 -108
  363. package/dist/docs/integrations/postgres.mdx +0 -190
  364. package/dist/docs/integrations/posthog.mdx +0 -122
  365. package/dist/docs/integrations/redis.mdx +0 -141
  366. package/dist/docs/integrations/resend.mdx +0 -117
  367. package/dist/docs/integrations/s3.mdx +0 -122
  368. package/dist/docs/integrations/swagger.mdx +0 -113
  369. package/dist/docs/reference/adapters.mdx +0 -130
  370. package/dist/docs/reference/auth.mdx +0 -183
  371. package/dist/docs/reference/cache.mdx +0 -132
  372. package/dist/docs/reference/circuit-breaker.mdx +0 -71
  373. package/dist/docs/reference/queue.mdx +0 -155
  374. package/dist/docs/reference/storage.mdx +0 -116
  375. package/dist/docs/reference/swagger.mdx +0 -132
  376. package/dist/integrations/drizzle.d.ts +0 -10
  377. package/dist/integrations/drizzle.d.ts.map +0 -1
  378. package/dist/integrations/drizzle.js +0 -34
  379. package/dist/integrations/drizzle.js.map +0 -1
  380. package/dist/integrations/jwt.d.ts +0 -12
  381. package/dist/integrations/jwt.d.ts.map +0 -1
  382. package/dist/integrations/jwt.js +0 -29
  383. package/dist/integrations/jwt.js.map +0 -1
  384. package/dist/integrations/mongodb.d.ts +0 -13
  385. package/dist/integrations/mongodb.d.ts.map +0 -1
  386. package/dist/integrations/mongodb.js +0 -48
  387. package/dist/integrations/mongodb.js.map +0 -1
  388. package/dist/integrations/mongoose.d.ts +0 -13
  389. package/dist/integrations/mongoose.d.ts.map +0 -1
  390. package/dist/integrations/mongoose.js +0 -84
  391. package/dist/integrations/mongoose.js.map +0 -1
  392. package/dist/integrations/openai.d.ts +0 -12
  393. package/dist/integrations/openai.d.ts.map +0 -1
  394. package/dist/integrations/openai.js +0 -47
  395. package/dist/integrations/openai.js.map +0 -1
  396. package/dist/integrations/postgres.d.ts +0 -13
  397. package/dist/integrations/postgres.d.ts.map +0 -1
  398. package/dist/integrations/postgres.js +0 -55
  399. package/dist/integrations/postgres.js.map +0 -1
  400. package/dist/integrations/posthog.d.ts +0 -13
  401. package/dist/integrations/posthog.d.ts.map +0 -1
  402. package/dist/integrations/posthog.js +0 -49
  403. package/dist/integrations/posthog.js.map +0 -1
  404. package/dist/integrations/prisma.d.ts +0 -10
  405. package/dist/integrations/prisma.d.ts.map +0 -1
  406. package/dist/integrations/prisma.js +0 -39
  407. package/dist/integrations/prisma.js.map +0 -1
  408. package/dist/integrations/redis.d.ts +0 -12
  409. package/dist/integrations/redis.d.ts.map +0 -1
  410. package/dist/integrations/redis.js +0 -48
  411. package/dist/integrations/redis.js.map +0 -1
  412. package/dist/integrations/resend.d.ts +0 -12
  413. package/dist/integrations/resend.d.ts.map +0 -1
  414. package/dist/integrations/resend.js +0 -47
  415. package/dist/integrations/resend.js.map +0 -1
  416. package/dist/integrations/s3.d.ts +0 -15
  417. package/dist/integrations/s3.d.ts.map +0 -1
  418. package/dist/integrations/s3.js +0 -60
  419. package/dist/integrations/s3.js.map +0 -1
  420. package/dist/integrations/supabase.d.ts +0 -13
  421. package/dist/integrations/supabase.d.ts.map +0 -1
  422. package/dist/integrations/supabase.js +0 -51
  423. package/dist/integrations/supabase.js.map +0 -1
  424. package/dist/middleware/cache.d.ts +0 -21
  425. package/dist/middleware/cache.d.ts.map +0 -1
  426. package/dist/middleware/cache.js +0 -156
  427. package/dist/middleware/cache.js.map +0 -1
  428. package/dist/observability/health.d.ts +0 -23
  429. package/dist/observability/health.d.ts.map +0 -1
  430. package/dist/observability/health.js +0 -49
  431. package/dist/observability/health.js.map +0 -1
  432. package/dist/observability/index.d.ts +0 -4
  433. package/dist/observability/index.d.ts.map +0 -1
  434. package/dist/observability/index.js +0 -10
  435. package/dist/observability/index.js.map +0 -1
  436. package/dist/observability/metrics.d.ts +0 -6
  437. package/dist/observability/metrics.d.ts.map +0 -1
  438. package/dist/observability/metrics.js +0 -60
  439. package/dist/observability/metrics.js.map +0 -1
  440. package/dist/observability/otel.d.ts +0 -27
  441. package/dist/observability/otel.d.ts.map +0 -1
  442. package/dist/observability/otel.js +0 -45
  443. package/dist/observability/otel.js.map +0 -1
  444. package/dist/observability/prometheus.d.ts +0 -30
  445. package/dist/observability/prometheus.d.ts.map +0 -1
  446. package/dist/observability/prometheus.js +0 -31
  447. package/dist/observability/prometheus.js.map +0 -1
  448. package/dist/queue/client.d.ts +0 -13
  449. package/dist/queue/client.d.ts.map +0 -1
  450. package/dist/queue/client.js +0 -83
  451. package/dist/queue/client.js.map +0 -1
  452. package/dist/queue/drivers/MemoryDriver.d.ts +0 -21
  453. package/dist/queue/drivers/MemoryDriver.d.ts.map +0 -1
  454. package/dist/queue/drivers/MemoryDriver.js +0 -176
  455. package/dist/queue/drivers/MemoryDriver.js.map +0 -1
  456. package/dist/queue/drivers/RedisDriver.d.ts +0 -19
  457. package/dist/queue/drivers/RedisDriver.d.ts.map +0 -1
  458. package/dist/queue/drivers/RedisDriver.js +0 -130
  459. package/dist/queue/drivers/RedisDriver.js.map +0 -1
  460. package/dist/queue/index.d.ts +0 -18
  461. package/dist/queue/index.d.ts.map +0 -1
  462. package/dist/queue/index.js +0 -37
  463. package/dist/queue/index.js.map +0 -1
  464. package/dist/queue/manager.d.ts +0 -18
  465. package/dist/queue/manager.d.ts.map +0 -1
  466. package/dist/queue/manager.js +0 -59
  467. package/dist/queue/manager.js.map +0 -1
  468. package/dist/queue/types.d.ts +0 -55
  469. package/dist/queue/types.d.ts.map +0 -1
  470. package/dist/queue/types.js.map +0 -1
  471. package/dist/queue/worker.d.ts +0 -18
  472. package/dist/queue/worker.d.ts.map +0 -1
  473. package/dist/queue/worker.js +0 -176
  474. package/dist/queue/worker.js.map +0 -1
  475. package/dist/router/gateway.d.ts.map +0 -1
  476. package/dist/router/gateway.js +0 -11
  477. package/dist/router/gateway.js.map +0 -1
  478. package/dist/server/bun-adapter.d.ts.map +0 -1
  479. package/dist/server/bun-adapter.js.map +0 -1
  480. package/dist/server/sse.d.ts +0 -16
  481. package/dist/server/sse.d.ts.map +0 -1
  482. package/dist/server/sse.js +0 -51
  483. package/dist/server/sse.js.map +0 -1
  484. package/dist/server/uws-adapter.d.ts.map +0 -1
  485. package/dist/server/uws-adapter.js.map +0 -1
  486. package/dist/storage/index.d.ts +0 -15
  487. package/dist/storage/index.d.ts.map +0 -1
  488. package/dist/storage/index.js +0 -7
  489. package/dist/storage/index.js.map +0 -1
  490. package/dist/swagger/index.d.ts +0 -9
  491. package/dist/swagger/index.d.ts.map +0 -1
  492. package/dist/swagger/index.js +0 -165
  493. package/dist/swagger/index.js.map +0 -1
  494. package/dist/threads/pool.d.ts +0 -14
  495. package/dist/threads/pool.d.ts.map +0 -1
  496. package/dist/threads/pool.js +0 -93
  497. package/dist/threads/pool.js.map +0 -1
  498. package/dist/threads/worker-runner.d.ts +0 -2
  499. package/dist/threads/worker-runner.d.ts.map +0 -1
  500. package/dist/threads/worker-runner.js +0 -71
  501. package/dist/threads/worker-runner.js.map +0 -1
  502. package/dist/validator/validator.d.ts +0 -360
  503. package/dist/validator/validator.d.ts.map +0 -1
  504. package/dist/validator/validator.js +0 -931
  505. package/dist/validator/validator.js.map +0 -1
  506. package/dist/websocket/orchestrator.d.ts +0 -11
  507. package/dist/websocket/orchestrator.d.ts.map +0 -1
  508. package/dist/websocket/orchestrator.js +0 -238
  509. package/dist/websocket/orchestrator.js.map +0 -1
  510. package/dist/websocket/server.d.ts +0 -66
  511. package/dist/websocket/server.d.ts.map +0 -1
  512. package/dist/websocket/server.js +0 -158
  513. package/dist/websocket/server.js.map +0 -1
  514. package/dist/websocket/socket.d.ts +0 -119
  515. package/dist/websocket/socket.d.ts.map +0 -1
  516. package/dist/websocket/socket.js +0 -242
  517. package/dist/websocket/socket.js.map +0 -1
@@ -1,117 +0,0 @@
1
- ---
2
- nextUrl: "/docs/integrations/openai"
3
- nextTitle: "OpenAI"
4
- ---
5
-
6
- # Resend (Email) Integration
7
-
8
- ExisJS provides an integration for Resend to send emails.
9
-
10
- Just like all our other integrations, ExisJS treats the `resend` SDK as an optional dependency. You only install it if you need it, keeping your core application lightweight.
11
-
12
- ---
13
-
14
- ## Environment Variables
15
-
16
- The Resend plugin securely reads your API key directly from your `.env` file.
17
-
18
- Before using the plugin, ensure you have your API key set:
19
-
20
- ```bash filename=".env"
21
- RESEND_API_KEY="re_123456789"
22
- ```
23
-
24
- ---
25
-
26
- ## Installation
27
-
28
- ExisJS wraps the official `resend` Node.js SDK.
29
-
30
- ```bash
31
- npm install resend
32
- ```
33
-
34
- ---
35
-
36
- ## Usage
37
-
38
- Simply import the `resend` proxy from `exisjs/resend`. ExisJS will boot the client behind the scenes the first time you attempt to send an email.
39
-
40
- #### Functional Paradigm
41
-
42
- ```typescript filename="src/http/emails/route.ts"
43
- import { controller, route } from 'exisjs/router'
44
- import { resend } from 'exisjs/resend'
45
-
46
- export default controller({
47
- sendWelcomeEmail: route.post('/welcome', {
48
- async handle(req) {
49
- const { email, name } = req.body
50
-
51
- // The resend client lazy-loads here
52
- const { data, error } = await resend.emails.send({
53
- from: 'Acme <onboarding@resend.dev>',
54
- to: [email],
55
- subject: 'Welcome to Acme!',
56
- html: `<strong>Hello ${name}, welcome aboard!</strong>`
57
- })
58
-
59
- if (error) {
60
- return { success: false, error }
61
- }
62
-
63
- return { success: true, data }
64
- }
65
- })
66
- })
67
- ```
68
-
69
- #### Class-Based (OOP) Paradigm
70
-
71
- ```typescript filename="src/http/emails/route.ts"
72
- import { Controller, Post, Body } from 'exisjs/decorators'
73
- import { resend } from 'exisjs/resend'
74
-
75
- @Controller('/emails')
76
- export default class EmailsController {
77
-
78
- @Post('/welcome')
79
- async sendWelcomeEmail(@Body() body: any) {
80
- // The resend client automatically lazy-loads here!
81
- const { data, error } = await resend.emails.send({
82
- from: 'Acme <onboarding@resend.dev>',
83
- to: [body.email],
84
- subject: 'Welcome to Acme!',
85
- html: `<strong>Hello ${body.name}, welcome aboard!</strong>`
86
- })
87
-
88
- if (error) {
89
- return { success: false, error }
90
- }
91
-
92
- return { success: true, data }
93
- }
94
- }
95
- ```
96
-
97
- ---
98
-
99
- ## Customizing Connection Options
100
-
101
- If you need to pass custom options to the Resend Client, call `configureResend(options)` inside your `server.ts` `onStart` hook.
102
-
103
- ```typescript filename="src/http/server.ts"
104
- import { exis } from 'exisjs'
105
- import { configureResend } from 'exisjs/resend'
106
-
107
- export default exis({
108
- async onStart() {
109
- // Inject custom fetch options or headers
110
- configureResend({
111
- headers: {
112
- 'X-Custom-Header': 'ExisJS'
113
- }
114
- })
115
- }
116
- })
117
- ```
@@ -1,122 +0,0 @@
1
- ---
2
- nextUrl: "/docs/integrations/resend"
3
- nextTitle: "Resend"
4
- ---
5
-
6
- # AWS S3 Integration
7
-
8
- ExisJS provides an integration for AWS S3 via the official `@aws-sdk/client-s3` package.
9
-
10
- You do **NOT** need to write boilerplate to initialize the AWS SDK. The S3 client is lazily initialized when you execute your first `PutObject` or `GetObject` command.
11
-
12
- ---
13
-
14
- ## Environment Variables
15
-
16
- The AWS S3 plugin securely reads your credentials directly from your `.env` file using the industry-standard AWS variable names.
17
-
18
- Before using the plugin, ensure you have your credentials set:
19
-
20
- ```bash filename=".env"
21
- AWS_ACCESS_KEY_ID="your_access_key"
22
- AWS_SECRET_ACCESS_KEY="your_secret_key"
23
- AWS_REGION="us-east-1"
24
- ```
25
-
26
- ---
27
-
28
- ## Installation
29
-
30
- ExisJS wraps the `@aws-sdk/client-s3` library.
31
-
32
- ```bash
33
- npm install @aws-sdk/client-s3
34
- ```
35
-
36
- ---
37
-
38
- ## Usage
39
-
40
- Simply import the `s3` proxy from `exisjs/s3` and use standard AWS SDK commands. ExisJS will boot the client behind the scenes.
41
-
42
- #### Functional Paradigm
43
-
44
- ```typescript filename="src/http/uploads/route.ts"
45
- import { controller, route } from 'exisjs/router'
46
- import { s3 } from 'exisjs/s3'
47
- import { PutObjectCommand, GetObjectCommand } from '@aws-sdk/client-s3'
48
-
49
- export default controller({
50
- // ExisJS parses multipart/form-data when you access req.files
51
- uploadFile: route.post('/', {
52
- async handle(req) {
53
- // req.files is automatically populated natively by ExisJS
54
- const file = req.files[0]
55
-
56
- const command = new PutObjectCommand({
57
- Bucket: 'my-exis-bucket',
58
- Key: file.filename,
59
- Body: file.data, // Buffer
60
- ContentType: file.mimetype,
61
- })
62
-
63
- // The s3 client lazy-loads here
64
- await s3.send(command)
65
-
66
- return { success: true, url: `https://my-exis-bucket.s3.amazonaws.com/${file.filename}` }
67
- }
68
- })
69
- })
70
- ```
71
-
72
- #### Class-Based (OOP) Paradigm
73
-
74
- ```typescript filename="src/http/uploads/route.ts"
75
- import { Controller, Post, UploadedFile, type ExisFile } from 'exisjs/decorators'
76
- import { s3 } from 'exisjs/s3'
77
- import { PutObjectCommand } from '@aws-sdk/client-s3'
78
-
79
- @Controller('/uploads')
80
- export default class UploadsController {
81
-
82
- @Post('/')
83
- async uploadFile(@UploadedFile('avatar') file: ExisFile) {
84
- const command = new PutObjectCommand({
85
- Bucket: 'my-exis-bucket',
86
- Key: file.filename,
87
- Body: file.data, // Buffer
88
- ContentType: file.mimetype,
89
- })
90
-
91
- // The s3 client automatically lazy-loads here!
92
- await s3.send(command)
93
-
94
- return { success: true, url: `https://my-exis-bucket.s3.amazonaws.com/${file.filename}` }
95
- }
96
- }
97
- ```
98
-
99
- ---
100
-
101
- ## Customizing Connection Options
102
-
103
- If you need to pass custom options to the S3 Client (like a custom Endpoint URL for Cloudflare R2 or DigitalOcean Spaces), call `configureS3(options)` inside your `server.ts` `onStart` hook.
104
-
105
- ```typescript filename="src/http/server.ts"
106
- import { exis } from 'exisjs'
107
- import { configureS3 } from 'exisjs/s3'
108
-
109
- export default exis({
110
- async onStart() {
111
- // Compatible with S3 APIs like Cloudflare R2
112
- configureS3({
113
- endpoint: 'https://<ACCOUNT_ID>.r2.cloudflarestorage.com',
114
- forcePathStyle: true
115
- })
116
- }
117
- })
118
- ```
119
-
120
- <Hint>
121
- Because ExisJS uses the official AWS SDK under the hood, the S3 integration works with Cloudflare R2, DigitalOcean Spaces, MinIO, and any other S3-compatible storage provider.
122
- </Hint>
@@ -1,113 +0,0 @@
1
- ---
2
- nextUrl: "/docs/integrations/s3"
3
- nextTitle: "AWS S3"
4
- ---
5
-
6
- # Swagger OpenAPI
7
-
8
- ExisJS comes with a native **Swagger UI & OpenAPI 3.0** generator built directly into the framework. It parses your routes, path parameters, and schema validations to generate an API explorer.
9
-
10
- You do **not** need to maintain OpenAPI YAML files or write decorators.
11
-
12
- ---
13
-
14
- ## Usage
15
-
16
- To enable Swagger UI, simply import `serveSwagger` and call it inside the `onStart` hook in your `server.ts`.
17
-
18
- ```typescript filename="src/http/server.ts"
19
- import { exis } from 'exisjs'
20
- import { serveSwagger } from 'exisjs/swagger'
21
-
22
- export default exis({
23
- async onStart(app) {
24
- // Generate and mount Swagger UI
25
- serveSwagger(app, {
26
- path: '/api-docs', // Defaults to '/docs'
27
- title: 'My Startup API',
28
- version: '1.0.0',
29
- components: {
30
- securitySchemes: {
31
- bearerAuth: {
32
- type: 'http',
33
- scheme: 'bearer',
34
- bearerFormat: 'JWT'
35
- }
36
- }
37
- }
38
- })
39
- }
40
- })
41
- ```
42
-
43
- Once your server starts, navigate to `http://localhost:4000/api-docs` to see your auto-generated Swagger UI. The raw OpenAPI JSON payload will be available at `/api-docs/json`.
44
-
45
- ---
46
-
47
- ## Automatic Schema Generation
48
-
49
- ExisJS integrates with its internal `v` validator. Any validation schemas attached to your routes (whether Functional or OOP) are automatically translated into OpenAPI specifications.
50
-
51
- #### Functional Paradigm
52
-
53
- ```typescript filename="src/http/users/route.ts"
54
- import { controller, route } from 'exisjs/router'
55
- import { tex } from 'exisjs/validator'
56
-
57
- export default controller({
58
- createUser: route.post('/', {
59
- // This schema is automatically translated to OpenAPI request body definitions
60
- body: tex.object({
61
- name: tex.string(),
62
- age: tex.number({ optional: true })
63
- }),
64
- async handle(req) {
65
- return { success: true, name: req.body.name }
66
- }
67
- })
68
- })
69
- ```
70
-
71
- #### Class-Based (OOP) Paradigm
72
-
73
- ```typescript filename="src/http/users/route.ts"
74
- import { Controller, Post, Body } from 'exisjs/decorators'
75
- import { tex } from 'exisjs/validator'
76
-
77
- const CreateUserSchema = tex.object({
78
- name: tex.string(),
79
- age: tex.number({ optional: true })
80
- })
81
-
82
- @Controller('/users')
83
- export default class UsersController {
84
- @Post('/', { body: CreateUserSchema })
85
- async createUser(@Body() body: any) {
86
- return { success: true, name: body.name }
87
- }
88
- }
89
- ```
90
-
91
- When you view Swagger UI, the `POST /users` endpoint will show the JSON body required, properly displaying the string/number types and required/optional flags.
92
-
93
- ---
94
-
95
- ## Gateway Cascading Metadata
96
-
97
- If you want to apply OpenAPI tags or security schemas to an entire folder of routes without decorating every endpoint, you can use ExisJS Gateways.
98
-
99
- ```typescript filename="src/http/admin/gateway.ts"
100
- import { defineGateway } from 'exisjs/router'
101
-
102
- export default defineGateway({
103
- // Every route in the /admin folder automatically inherits these OpenAPI tags
104
- metadata: {
105
- openapi: {
106
- tags: ['Admin Management API'],
107
- security: ['bearerAuth']
108
- }
109
- }
110
- })
111
- ```
112
-
113
- Now, every route under `/admin/*` will be grouped under the "Admin Management API" section in your Swagger UI.
@@ -1,130 +0,0 @@
1
- ---
2
- title: "Adapters"
3
- description: "Strict API Reference for all Serverless and Edge adapters."
4
- ---
5
-
6
- # Adapters (`exisjs/adapters`)
7
-
8
- This document provides the strict API signatures and TypeScript interfaces exported by the `exisjs/adapters` module. For high-level deployment guides, see the [Adapters Guide](/docs/adapters).
9
-
10
- ---
11
-
12
- ## `aws`
13
-
14
- Converts API Gateway events into a native Node.js HTTP stream.
15
-
16
- ```typescript
17
- function aws(app: App): (event: APIGatewayEvent) => Promise<APIGatewayResult>
18
- ```
19
-
20
- ### `APIGatewayEvent`
21
- ```typescript
22
- interface APIGatewayEvent {
23
- httpMethod: string;
24
- path: string;
25
- headers: Record<string, string | undefined>;
26
- body: string | null;
27
- isBase64Encoded: boolean;
28
- queryStringParameters?: Record<string, string | undefined>;
29
- }
30
- ```
31
-
32
- ### `APIGatewayResult`
33
- ```typescript
34
- interface APIGatewayResult {
35
- statusCode: number;
36
- headers: Record<string, string>;
37
- body: string;
38
- isBase64Encoded: boolean;
39
- }
40
- ```
41
-
42
- ---
43
-
44
- ## `vercel`
45
-
46
- Provides a bridge between Vercel's Node.js Serverless runtime and ExisJS.
47
-
48
- ```typescript
49
- function vercel(
50
- app: App,
51
- options?: { cwd?: string }
52
- ): (req: VercelRequest, res: VercelResponse) => void | Promise<void>
53
- ```
54
-
55
- ### `VercelRequest` & `VercelResponse`
56
- These are re-exported from `@vercel/node`. The adapter intercepts these and patches the internal socket state to satisfy the ExisJS pipeline.
57
-
58
- ---
59
-
60
- ## `fetch`
61
-
62
- The universal Web Standard adapter. Converts standard Web `Request` objects into internal HTTP pipelines and resolves back to a Web `Response`.
63
-
64
- ```typescript
65
- function fetch(
66
- app: App
67
- ): (request: Request, env?: any, ctx?: any) => Promise<Response>
68
- ```
69
-
70
- *Note: The `env` and `ctx` arguments are seamlessly injected into the ExisJS routing context, allowing you to access platform-specific bindings (e.g. Cloudflare KV).*
71
-
72
- ---
73
-
74
- ## `cloudflare`
75
-
76
- A dedicated wrapper for Cloudflare Workers that returns the expected ES Module format.
77
-
78
- ```typescript
79
- function cloudflare(
80
- app: App
81
- ): { fetch: (request: Request, env: any, ctx: ExecutionContext) => Promise<Response> }
82
- ```
83
-
84
- ---
85
-
86
- ## `bun`
87
-
88
- A dedicated wrapper for the `Bun.serve()` configuration object.
89
-
90
- ```typescript
91
- function bun(
92
- app: App
93
- ): { fetch: (request: Request) => Promise<Response> }
94
- ```
95
-
96
- ---
97
-
98
- ## `deno`
99
-
100
- A dedicated wrapper for `Deno.serve()`.
101
-
102
- ```typescript
103
- function deno(
104
- app: App
105
- ): (request: Request) => Promise<Response>
106
- ```
107
-
108
- ---
109
-
110
- ## `netlify`
111
-
112
- A dedicated wrapper for Netlify Edge Functions.
113
-
114
- ```typescript
115
- function netlify(
116
- app: App
117
- ): (request: Request, context: NetlifyContext) => Promise<Response>
118
- ```
119
-
120
- ---
121
-
122
- ## `fastly`
123
-
124
- A dedicated wrapper for Fastly Compute@Edge which binds to the global `addEventListener` fetch event.
125
-
126
- ```typescript
127
- function fastly(
128
- app: App
129
- ): (event: FetchEvent) => void
130
- ```
@@ -1,183 +0,0 @@
1
- ---
2
- title: "Authentication"
3
- description: "API Reference for ExisJS Authentication utilities (`exisjs/auth`)."
4
- ---
5
-
6
- # Authentication (`exisjs/auth`)
7
-
8
- ExisJS ships with a completely native, dependency-free `auth` module that covers the most critical security implementations: Scrypt Password Hashing, JWT (JSON Web Tokens), Session Management, and Role-Based Access Control (RBAC).
9
-
10
- ---
11
-
12
- ## 1. Password Hashing (Scrypt)
13
-
14
- ExisJS natively uses Node's highly secure `scrypt` algorithm to hash passwords. It automatically generates a cryptographically secure salt and stores the parameters in a single string format (`scrypt:N:r:p:keylen:salt:hash`) so you never have to manage them separately.
15
-
16
- ```typescript filename="src/services/AuthService.ts"
17
- import { Password } from 'exisjs/auth'
18
-
19
- // Hashing a new password
20
- const hashedPassword = await Password.hashPassword('my-super-secret-password', {
21
- cost: 16384, // Higher cost = harder to brute force, but slower to compute
22
- })
23
-
24
- // Verifying a login attempt
25
- const isValid = await Password.verifyPassword('my-super-secret-password', hashedPassword)
26
- ```
27
-
28
- ---
29
-
30
- ## 2. JSON Web Tokens (JWT)
31
-
32
- You can instantly sign and verify JWTs without needing third-party libraries like `jsonwebtoken`.
33
-
34
- ```typescript
35
- import { JWT } from 'exisjs/auth'
36
-
37
- // Sign a token valid for 2 hours
38
- const token = JWT.signJWT(
39
- { userId: '123', role: 'admin' },
40
- process.env.JWT_SECRET,
41
- { expiresIn: 2 * 60 * 60 }
42
- )
43
-
44
- try {
45
- // Verifying token returns the exact typed payload
46
- const payload = JWT.verifyJWT<{ userId: string, role: string }>(token, process.env.JWT_SECRET)
47
- console.log(payload.userId)
48
- } catch (err) {
49
- if (err.name === 'TokenExpiredError') {
50
- // Handle expired token
51
- }
52
- }
53
- ```
54
-
55
- ---
56
-
57
- ## 3. Session Middleware
58
-
59
- If you prefer stateful authentication, ExisJS provides extremely robust session middleware out of the box. It leverages signed HTTP-only cookies to track users and automatically synchronizes session state back to the store (Memory, Redis, etc.) when the request ends.
60
-
61
- ### Global Setup via Plugin (`exis.config.ts`)
62
-
63
- Because ExisJS utilizes a file-based architecture with no manual server entry point, global middlewares like `session` should be attached using a Plugin.
64
-
65
- ```typescript filename="src/plugins/session.ts"
66
- import { definePlugin } from 'exisjs/plugin'
67
- import { session } from 'exisjs/auth'
68
-
69
- export const sessionPlugin = definePlugin({
70
- name: 'global-session',
71
- register(app) {
72
- app.use(session({
73
- secret: process.env.SESSION_SECRET || 'fallback-secret-minimum-32-chars-long!',
74
- cookieName: 'exis_sid',
75
- ttl: 86400 * 1000, // 1 day in milliseconds
76
- // store: new RedisSessionStore(...)
77
- }))
78
- }
79
- })
80
- ```
81
-
82
- Then, natively register your plugin in `exis.config.ts`:
83
-
84
- ```typescript filename="exis.config.ts"
85
- import { defineConfig } from 'exisjs/config'
86
- import { sessionPlugin } from './src/plugins/session'
87
-
88
- export default defineConfig({
89
- plugins: [
90
- sessionPlugin()
91
- ]
92
- })
93
- ```
94
-
95
- Once registered, you can read and write to `req.session` anywhere in your application!
96
-
97
- ### Functional Example
98
-
99
- ```typescript filename="src/http/auth/route.ts"
100
- import { controller, route } from 'exisjs/router'
101
- import { HttpError } from 'exisjs/error'
102
-
103
- export default controller({
104
- login: route.post('/login', {
105
- async handle(ctx) {
106
- const user = await db.users.findByEmail(ctx.body.email)
107
- if (!user) throw HttpError.unauthorized('Invalid credentials')
108
-
109
- // Login the user by attaching data to the session
110
- ctx.req.session.userId = user.id
111
- ctx.req.session.role = user.role
112
-
113
- return { success: true }
114
- }
115
- })
116
- })
117
- ```
118
-
119
- ### Class-Based (OOP) Example
120
-
121
- ```typescript filename="src/http/auth/route.ts"
122
- import { Controller, Post, Body, Req } from 'exisjs/decorators'
123
- import type { Request } from 'exisjs'
124
-
125
- @Controller('/auth')
126
- export default class AuthController {
127
-
128
- @Post('/login')
129
- async login(@Body() body: any, @Req() req: Request) {
130
- const user = await db.users.findByEmail(body.email)
131
-
132
- // Attach to session
133
- req.session.userId = user.id
134
- req.session.role = user.role
135
-
136
- return { success: true }
137
- }
138
- }
139
- ```
140
-
141
- ---
142
-
143
- ## 4. Role-Based Access Control (RBAC)
144
-
145
- The `requireRole` middleware checks if the current authenticated user has the necessary permissions to access a route.
146
-
147
- *Note: This middleware expects that `req.user.role` was populated by an earlier authentication middleware (like a JWT Verifier or a Session Restorer).*
148
-
149
- ### Functional Example
150
-
151
- ```typescript filename="src/http/admin/route.ts"
152
- import { controller, route } from 'exisjs/router'
153
- import { requireRole } from 'exisjs/auth'
154
-
155
- export default controller({
156
- getDashboard: route.get('/dashboard', {
157
- middleware: [
158
- // Only users with 'admin' or 'superadmin' roles can access this route
159
- requireRole(['admin', 'superadmin'])
160
- ],
161
- async handle() {
162
- return { metrics: [] }
163
- }
164
- })
165
- })
166
- ```
167
-
168
- ### Class-Based (OOP) Example
169
-
170
- ```typescript filename="src/http/admin/route.ts"
171
- import { Controller, Get, Use } from 'exisjs/decorators'
172
- import { requireRole } from 'exisjs/auth'
173
-
174
- @Controller('/admin')
175
- export default class AdminController {
176
-
177
- @Get('/dashboard')
178
- @Use(requireRole(['admin', 'superadmin']))
179
- async getDashboard() {
180
- return { metrics: [] }
181
- }
182
- }
183
- ```