exisjs 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (519) hide show
  1. package/dist/cli/commands/build.d.ts.map +1 -1
  2. package/dist/cli/commands/build.js +11 -9
  3. package/dist/cli/commands/build.js.map +1 -1
  4. package/dist/cli/commands/dev.d.ts.map +1 -1
  5. package/dist/cli/commands/dev.js +34 -36
  6. package/dist/cli/commands/dev.js.map +1 -1
  7. package/dist/cli/commands/exports.d.ts.map +1 -1
  8. package/dist/cli/commands/exports.js +5 -32
  9. package/dist/cli/commands/exports.js.map +1 -1
  10. package/dist/cli/commands/generate.d.ts +2 -13
  11. package/dist/cli/commands/generate.d.ts.map +1 -1
  12. package/dist/cli/commands/generate.js +27 -60
  13. package/dist/cli/commands/generate.js.map +1 -1
  14. package/dist/cli/commands/init.d.ts.map +1 -1
  15. package/dist/cli/commands/init.js +4 -4
  16. package/dist/cli/commands/init.js.map +1 -1
  17. package/dist/cli/commands/start.d.ts.map +1 -1
  18. package/dist/cli/commands/start.js +2 -6
  19. package/dist/cli/commands/start.js.map +1 -1
  20. package/dist/cli/index.js +11 -23
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/cli/routes.d.ts.map +1 -1
  23. package/dist/cli/routes.js +20 -8
  24. package/dist/cli/routes.js.map +1 -1
  25. package/dist/config/config.d.ts +2 -1
  26. package/dist/config/config.d.ts.map +1 -1
  27. package/dist/config/config.js +3 -2
  28. package/dist/config/config.js.map +1 -1
  29. package/dist/config/types.d.ts +7 -2
  30. package/dist/config/types.d.ts.map +1 -1
  31. package/dist/decorators/constants.d.ts +2 -2
  32. package/dist/decorators/constants.d.ts.map +1 -1
  33. package/dist/decorators/constants.js +2 -2
  34. package/dist/decorators/constants.js.map +1 -1
  35. package/dist/decorators/core.d.ts +4 -3
  36. package/dist/decorators/core.d.ts.map +1 -1
  37. package/dist/decorators/core.js +7 -4
  38. package/dist/decorators/core.js.map +1 -1
  39. package/dist/decorators/middleware.d.ts +0 -10
  40. package/dist/decorators/middleware.d.ts.map +1 -1
  41. package/dist/decorators/middleware.js +0 -25
  42. package/dist/decorators/middleware.js.map +1 -1
  43. package/dist/decorators/routing.d.ts +0 -2
  44. package/dist/decorators/routing.d.ts.map +1 -1
  45. package/dist/decorators/routing.js +1 -3
  46. package/dist/decorators/routing.js.map +1 -1
  47. package/dist/di/inject.d.ts +1 -2
  48. package/dist/di/inject.d.ts.map +1 -1
  49. package/dist/di/inject.js.map +1 -1
  50. package/dist/docs/ARCHITECTURE.md +46 -285
  51. package/dist/docs/BENCHMARKS.md +5 -5
  52. package/dist/docs/README.md +8 -11
  53. package/dist/docs/content/boundaries.mdx +151 -0
  54. package/dist/docs/content/cli/commands.mdx +66 -104
  55. package/dist/docs/content/cli/overview.mdx +37 -47
  56. package/dist/docs/content/cli/usage.mdx +29 -15
  57. package/dist/docs/content/decorators.mdx +107 -80
  58. package/dist/docs/content/installation.mdx +20 -1
  59. package/dist/docs/content/middleware.mdx +65 -291
  60. package/dist/docs/content/security.mdx +44 -246
  61. package/dist/docs/content/structure.mdx +227 -100
  62. package/dist/docs/content/validation.mdx +0 -17
  63. package/dist/docs/reference/decorators.mdx +24 -217
  64. package/dist/docs/reference/middleware.mdx +41 -217
  65. package/dist/docs/reference/validator.mdx +2 -5
  66. package/dist/error/errors.d.ts.map +1 -1
  67. package/dist/error/errors.js +16 -0
  68. package/dist/error/errors.js.map +1 -1
  69. package/dist/index.d.ts +1 -1
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js +5 -2
  72. package/dist/index.js.map +1 -1
  73. package/dist/lib/start-repl.js +2 -4
  74. package/dist/lib/start-repl.js.map +1 -1
  75. package/dist/lib/start-server.js +12 -4
  76. package/dist/lib/start-server.js.map +1 -1
  77. package/dist/logger/index.d.ts +81 -0
  78. package/dist/logger/index.d.ts.map +1 -0
  79. package/dist/logger/index.js +142 -0
  80. package/dist/logger/index.js.map +1 -0
  81. package/dist/middleware/dedupe.d.ts +1 -1
  82. package/dist/middleware/dedupe.js +1 -1
  83. package/dist/middleware/middleware.d.ts +3 -5
  84. package/dist/middleware/middleware.d.ts.map +1 -1
  85. package/dist/middleware/middleware.js +2 -6
  86. package/dist/middleware/middleware.js.map +1 -1
  87. package/dist/router/{gateway.d.ts → boundary.d.ts} +21 -13
  88. package/dist/router/boundary.d.ts.map +1 -0
  89. package/dist/router/boundary.js +11 -0
  90. package/dist/router/boundary.js.map +1 -0
  91. package/dist/router/index.d.ts +3 -6
  92. package/dist/router/index.d.ts.map +1 -1
  93. package/dist/router/index.js +3 -7
  94. package/dist/router/index.js.map +1 -1
  95. package/dist/router/route-builder.d.ts +0 -28
  96. package/dist/router/route-builder.d.ts.map +1 -1
  97. package/dist/router/route-builder.js +0 -4
  98. package/dist/router/route-builder.js.map +1 -1
  99. package/dist/router/route-scanner.d.ts +1 -2
  100. package/dist/router/route-scanner.d.ts.map +1 -1
  101. package/dist/router/route-scanner.js +216 -193
  102. package/dist/router/route-scanner.js.map +1 -1
  103. package/dist/router/router.d.ts +4 -6
  104. package/dist/router/router.d.ts.map +1 -1
  105. package/dist/router/router.js +36 -72
  106. package/dist/router/router.js.map +1 -1
  107. package/dist/router/types.d.ts +2 -6
  108. package/dist/router/types.d.ts.map +1 -1
  109. package/dist/server/{bun-adapter.d.ts → adapters/bun-adapter.d.ts} +1 -1
  110. package/dist/server/adapters/bun-adapter.d.ts.map +1 -0
  111. package/dist/server/{bun-adapter.js → adapters/bun-adapter.js} +2 -24
  112. package/dist/server/adapters/bun-adapter.js.map +1 -0
  113. package/dist/server/{uws-adapter.d.ts → adapters/uws-adapter.d.ts} +1 -1
  114. package/dist/server/adapters/uws-adapter.d.ts.map +1 -0
  115. package/dist/server/{uws-adapter.js → adapters/uws-adapter.js} +1 -28
  116. package/dist/server/adapters/uws-adapter.js.map +1 -0
  117. package/dist/server/app.d.ts +9 -30
  118. package/dist/server/app.d.ts.map +1 -1
  119. package/dist/server/app.js +19 -134
  120. package/dist/server/app.js.map +1 -1
  121. package/dist/server/bootstrapper.d.ts +4 -15
  122. package/dist/server/bootstrapper.d.ts.map +1 -1
  123. package/dist/server/bootstrapper.js +31 -222
  124. package/dist/server/bootstrapper.js.map +1 -1
  125. package/dist/server/define.d.ts +2 -2
  126. package/dist/server/define.d.ts.map +1 -1
  127. package/dist/server/define.js +3 -3
  128. package/dist/server/define.js.map +1 -1
  129. package/dist/server/engines/bun-engine.d.ts +16 -0
  130. package/dist/server/engines/bun-engine.d.ts.map +1 -0
  131. package/dist/server/engines/bun-engine.js +41 -0
  132. package/dist/server/engines/bun-engine.js.map +1 -0
  133. package/dist/server/engines/engine.d.ts +16 -0
  134. package/dist/server/engines/engine.d.ts.map +1 -0
  135. package/dist/{queue/types.js → server/engines/engine.js} +1 -1
  136. package/dist/server/engines/engine.js.map +1 -0
  137. package/dist/server/engines/node-engine.d.ts +22 -0
  138. package/dist/server/engines/node-engine.d.ts.map +1 -0
  139. package/dist/server/engines/node-engine.js +130 -0
  140. package/dist/server/engines/node-engine.js.map +1 -0
  141. package/dist/server/engines/uws-engine.d.ts +16 -0
  142. package/dist/server/engines/uws-engine.d.ts.map +1 -0
  143. package/dist/server/engines/uws-engine.js +48 -0
  144. package/dist/server/engines/uws-engine.js.map +1 -0
  145. package/dist/server/request-handler.d.ts +0 -1
  146. package/dist/server/request-handler.d.ts.map +1 -1
  147. package/dist/server/request-handler.js +74 -48
  148. package/dist/server/request-handler.js.map +1 -1
  149. package/dist/server/request.d.ts +0 -8
  150. package/dist/server/request.d.ts.map +1 -1
  151. package/dist/server/request.js +0 -16
  152. package/dist/server/request.js.map +1 -1
  153. package/dist/utils/time.d.ts +6 -0
  154. package/dist/utils/time.d.ts.map +1 -0
  155. package/dist/utils/time.js +15 -0
  156. package/dist/utils/time.js.map +1 -0
  157. package/dist/validator/index.d.ts +1 -7
  158. package/dist/validator/index.d.ts.map +1 -1
  159. package/dist/validator/index.js +1 -5
  160. package/dist/validator/index.js.map +1 -1
  161. package/dist/validator/tex-types.d.ts +15 -2
  162. package/dist/validator/tex-types.d.ts.map +1 -1
  163. package/dist/validator/tex-types.js +8 -0
  164. package/dist/validator/tex-types.js.map +1 -1
  165. package/dist/validator/tex.d.ts.map +1 -1
  166. package/dist/validator/tex.js +21 -2
  167. package/dist/validator/tex.js.map +1 -1
  168. package/package.json +9 -151
  169. package/dist/adapters/aws-lambda.d.ts +0 -21
  170. package/dist/adapters/aws-lambda.d.ts.map +0 -1
  171. package/dist/adapters/aws-lambda.js +0 -125
  172. package/dist/adapters/aws-lambda.js.map +0 -1
  173. package/dist/adapters/bun.d.ts +0 -9
  174. package/dist/adapters/bun.d.ts.map +0 -1
  175. package/dist/adapters/bun.js +0 -23
  176. package/dist/adapters/bun.js.map +0 -1
  177. package/dist/adapters/cloudflare.d.ts +0 -10
  178. package/dist/adapters/cloudflare.d.ts.map +0 -1
  179. package/dist/adapters/cloudflare.js +0 -22
  180. package/dist/adapters/cloudflare.js.map +0 -1
  181. package/dist/adapters/deno.d.ts +0 -7
  182. package/dist/adapters/deno.d.ts.map +0 -1
  183. package/dist/adapters/deno.js +0 -21
  184. package/dist/adapters/deno.js.map +0 -1
  185. package/dist/adapters/fastly.d.ts +0 -6
  186. package/dist/adapters/fastly.d.ts.map +0 -1
  187. package/dist/adapters/fastly.js +0 -20
  188. package/dist/adapters/fastly.js.map +0 -1
  189. package/dist/adapters/fetch.d.ts +0 -30
  190. package/dist/adapters/fetch.d.ts.map +0 -1
  191. package/dist/adapters/fetch.js +0 -119
  192. package/dist/adapters/fetch.js.map +0 -1
  193. package/dist/adapters/index.d.ts +0 -9
  194. package/dist/adapters/index.d.ts.map +0 -1
  195. package/dist/adapters/index.js +0 -28
  196. package/dist/adapters/index.js.map +0 -1
  197. package/dist/adapters/netlify.d.ts +0 -8
  198. package/dist/adapters/netlify.d.ts.map +0 -1
  199. package/dist/adapters/netlify.js +0 -20
  200. package/dist/adapters/netlify.js.map +0 -1
  201. package/dist/adapters/vercel.d.ts +0 -17
  202. package/dist/adapters/vercel.d.ts.map +0 -1
  203. package/dist/adapters/vercel.js +0 -23
  204. package/dist/adapters/vercel.js.map +0 -1
  205. package/dist/auth/index.d.ts +0 -8
  206. package/dist/auth/index.d.ts.map +0 -1
  207. package/dist/auth/index.js +0 -49
  208. package/dist/auth/index.js.map +0 -1
  209. package/dist/auth/jwt.d.ts +0 -20
  210. package/dist/auth/jwt.d.ts.map +0 -1
  211. package/dist/auth/jwt.js +0 -59
  212. package/dist/auth/jwt.js.map +0 -1
  213. package/dist/auth/oauth/core.d.ts +0 -96
  214. package/dist/auth/oauth/core.d.ts.map +0 -1
  215. package/dist/auth/oauth/core.js +0 -203
  216. package/dist/auth/oauth/core.js.map +0 -1
  217. package/dist/auth/oauth/index.d.ts +0 -45
  218. package/dist/auth/oauth/index.d.ts.map +0 -1
  219. package/dist/auth/oauth/index.js +0 -64
  220. package/dist/auth/oauth/index.js.map +0 -1
  221. package/dist/auth/oauth/middleware.d.ts +0 -63
  222. package/dist/auth/oauth/middleware.d.ts.map +0 -1
  223. package/dist/auth/oauth/middleware.js +0 -164
  224. package/dist/auth/oauth/middleware.js.map +0 -1
  225. package/dist/auth/oauth/providers/custom.d.ts +0 -41
  226. package/dist/auth/oauth/providers/custom.d.ts.map +0 -1
  227. package/dist/auth/oauth/providers/custom.js +0 -204
  228. package/dist/auth/oauth/providers/custom.js.map +0 -1
  229. package/dist/auth/oauth/providers/discord.d.ts +0 -23
  230. package/dist/auth/oauth/providers/discord.d.ts.map +0 -1
  231. package/dist/auth/oauth/providers/discord.js +0 -130
  232. package/dist/auth/oauth/providers/discord.js.map +0 -1
  233. package/dist/auth/oauth/providers/facebook.d.ts +0 -28
  234. package/dist/auth/oauth/providers/facebook.d.ts.map +0 -1
  235. package/dist/auth/oauth/providers/facebook.js +0 -124
  236. package/dist/auth/oauth/providers/facebook.js.map +0 -1
  237. package/dist/auth/oauth/providers/github.d.ts +0 -25
  238. package/dist/auth/oauth/providers/github.d.ts.map +0 -1
  239. package/dist/auth/oauth/providers/github.js +0 -132
  240. package/dist/auth/oauth/providers/github.js.map +0 -1
  241. package/dist/auth/oauth/providers/google.d.ts +0 -23
  242. package/dist/auth/oauth/providers/google.d.ts.map +0 -1
  243. package/dist/auth/oauth/providers/google.js +0 -134
  244. package/dist/auth/oauth/providers/google.js.map +0 -1
  245. package/dist/auth/oauth/providers/microsoft.d.ts +0 -28
  246. package/dist/auth/oauth/providers/microsoft.d.ts.map +0 -1
  247. package/dist/auth/oauth/providers/microsoft.js +0 -136
  248. package/dist/auth/oauth/providers/microsoft.js.map +0 -1
  249. package/dist/auth/oauth/types.d.ts +0 -158
  250. package/dist/auth/oauth/types.d.ts.map +0 -1
  251. package/dist/auth/oauth/types.js +0 -4
  252. package/dist/auth/oauth/types.js.map +0 -1
  253. package/dist/auth/password.d.ts +0 -25
  254. package/dist/auth/password.d.ts.map +0 -1
  255. package/dist/auth/password.js +0 -93
  256. package/dist/auth/password.js.map +0 -1
  257. package/dist/auth/rbac.d.ts +0 -10
  258. package/dist/auth/rbac.d.ts.map +0 -1
  259. package/dist/auth/rbac.js +0 -34
  260. package/dist/auth/rbac.js.map +0 -1
  261. package/dist/auth/session.d.ts +0 -26
  262. package/dist/auth/session.d.ts.map +0 -1
  263. package/dist/auth/session.js +0 -134
  264. package/dist/auth/session.js.map +0 -1
  265. package/dist/cache/index.d.ts +0 -4
  266. package/dist/cache/index.d.ts.map +0 -1
  267. package/dist/cache/index.js +0 -25
  268. package/dist/cache/index.js.map +0 -1
  269. package/dist/cache/store.d.ts +0 -58
  270. package/dist/cache/store.d.ts.map +0 -1
  271. package/dist/cache/store.js +0 -298
  272. package/dist/cache/store.js.map +0 -1
  273. package/dist/cron/parser.d.ts +0 -2
  274. package/dist/cron/parser.d.ts.map +0 -1
  275. package/dist/cron/parser.js +0 -52
  276. package/dist/cron/parser.js.map +0 -1
  277. package/dist/cron/scheduler.d.ts +0 -23
  278. package/dist/cron/scheduler.d.ts.map +0 -1
  279. package/dist/cron/scheduler.js +0 -114
  280. package/dist/cron/scheduler.js.map +0 -1
  281. package/dist/database/adapters/mongodb.d.ts +0 -58
  282. package/dist/database/adapters/mongodb.d.ts.map +0 -1
  283. package/dist/database/adapters/mongodb.js +0 -264
  284. package/dist/database/adapters/mongodb.js.map +0 -1
  285. package/dist/database/adapters/mysql.d.ts +0 -27
  286. package/dist/database/adapters/mysql.d.ts.map +0 -1
  287. package/dist/database/adapters/mysql.js +0 -188
  288. package/dist/database/adapters/mysql.js.map +0 -1
  289. package/dist/database/adapters/postgres.d.ts +0 -28
  290. package/dist/database/adapters/postgres.d.ts.map +0 -1
  291. package/dist/database/adapters/postgres.js +0 -174
  292. package/dist/database/adapters/postgres.js.map +0 -1
  293. package/dist/database/adapters/sqlite.d.ts +0 -27
  294. package/dist/database/adapters/sqlite.d.ts.map +0 -1
  295. package/dist/database/adapters/sqlite.js +0 -149
  296. package/dist/database/adapters/sqlite.js.map +0 -1
  297. package/dist/database/index.d.ts +0 -42
  298. package/dist/database/index.d.ts.map +0 -1
  299. package/dist/database/index.js +0 -58
  300. package/dist/database/index.js.map +0 -1
  301. package/dist/database/manager.d.ts +0 -141
  302. package/dist/database/manager.d.ts.map +0 -1
  303. package/dist/database/manager.js +0 -337
  304. package/dist/database/manager.js.map +0 -1
  305. package/dist/database/migration.d.ts +0 -57
  306. package/dist/database/migration.d.ts.map +0 -1
  307. package/dist/database/migration.js +0 -329
  308. package/dist/database/migration.js.map +0 -1
  309. package/dist/database/query-builder.d.ts +0 -95
  310. package/dist/database/query-builder.d.ts.map +0 -1
  311. package/dist/database/query-builder.js +0 -404
  312. package/dist/database/query-builder.js.map +0 -1
  313. package/dist/database/sql/index.d.ts +0 -18
  314. package/dist/database/sql/index.d.ts.map +0 -1
  315. package/dist/database/sql/index.js +0 -74
  316. package/dist/database/sql/index.js.map +0 -1
  317. package/dist/database/sql/schema.d.ts +0 -38
  318. package/dist/database/sql/schema.d.ts.map +0 -1
  319. package/dist/database/sql/schema.js +0 -80
  320. package/dist/database/sql/schema.js.map +0 -1
  321. package/dist/database/synchronizer.d.ts +0 -12
  322. package/dist/database/synchronizer.d.ts.map +0 -1
  323. package/dist/database/synchronizer.js +0 -82
  324. package/dist/database/synchronizer.js.map +0 -1
  325. package/dist/database/types.d.ts +0 -184
  326. package/dist/database/types.d.ts.map +0 -1
  327. package/dist/database/types.js +0 -4
  328. package/dist/database/types.js.map +0 -1
  329. package/dist/dataloader/dataloader.d.ts +0 -23
  330. package/dist/dataloader/dataloader.d.ts.map +0 -1
  331. package/dist/dataloader/dataloader.js +0 -98
  332. package/dist/dataloader/dataloader.js.map +0 -1
  333. package/dist/dataloader/index.d.ts +0 -3
  334. package/dist/dataloader/index.d.ts.map +0 -1
  335. package/dist/dataloader/index.js +0 -19
  336. package/dist/dataloader/index.js.map +0 -1
  337. package/dist/dataloader/registry.d.ts +0 -17
  338. package/dist/dataloader/registry.d.ts.map +0 -1
  339. package/dist/dataloader/registry.js +0 -47
  340. package/dist/dataloader/registry.js.map +0 -1
  341. package/dist/dev/dep-graph.d.ts +0 -2
  342. package/dist/dev/dep-graph.d.ts.map +0 -1
  343. package/dist/dev/dep-graph.js +0 -111
  344. package/dist/dev/dep-graph.js.map +0 -1
  345. package/dist/dev/hot-reload.d.ts +0 -30
  346. package/dist/dev/hot-reload.d.ts.map +0 -1
  347. package/dist/dev/hot-reload.js +0 -262
  348. package/dist/dev/hot-reload.js.map +0 -1
  349. package/dist/docs/content/adapters.mdx +0 -199
  350. package/dist/docs/content/cache.mdx +0 -239
  351. package/dist/docs/content/circuit-breaker.mdx +0 -130
  352. package/dist/docs/content/cron.mdx +0 -109
  353. package/dist/docs/content/database.mdx +0 -278
  354. package/dist/docs/content/gateways.mdx +0 -376
  355. package/dist/docs/content/oauth.mdx +0 -179
  356. package/dist/docs/content/queues.mdx +0 -177
  357. package/dist/docs/content/rpc.mdx +0 -146
  358. package/dist/docs/content/sse.mdx +0 -159
  359. package/dist/docs/content/websockets.mdx +0 -289
  360. package/dist/docs/integrations/README.md +0 -23
  361. package/dist/docs/integrations/jwt.mdx +0 -151
  362. package/dist/docs/integrations/mongo.mdx +0 -183
  363. package/dist/docs/integrations/observability.mdx +0 -125
  364. package/dist/docs/integrations/openai.mdx +0 -108
  365. package/dist/docs/integrations/postgres.mdx +0 -190
  366. package/dist/docs/integrations/posthog.mdx +0 -122
  367. package/dist/docs/integrations/redis.mdx +0 -141
  368. package/dist/docs/integrations/resend.mdx +0 -117
  369. package/dist/docs/integrations/s3.mdx +0 -122
  370. package/dist/docs/integrations/swagger.mdx +0 -113
  371. package/dist/docs/reference/adapters.mdx +0 -130
  372. package/dist/docs/reference/auth.mdx +0 -183
  373. package/dist/docs/reference/cache.mdx +0 -132
  374. package/dist/docs/reference/circuit-breaker.mdx +0 -71
  375. package/dist/docs/reference/queue.mdx +0 -155
  376. package/dist/docs/reference/storage.mdx +0 -116
  377. package/dist/docs/reference/swagger.mdx +0 -132
  378. package/dist/integrations/drizzle.d.ts +0 -10
  379. package/dist/integrations/drizzle.d.ts.map +0 -1
  380. package/dist/integrations/drizzle.js +0 -34
  381. package/dist/integrations/drizzle.js.map +0 -1
  382. package/dist/integrations/jwt.d.ts +0 -12
  383. package/dist/integrations/jwt.d.ts.map +0 -1
  384. package/dist/integrations/jwt.js +0 -29
  385. package/dist/integrations/jwt.js.map +0 -1
  386. package/dist/integrations/mongodb.d.ts +0 -13
  387. package/dist/integrations/mongodb.d.ts.map +0 -1
  388. package/dist/integrations/mongodb.js +0 -48
  389. package/dist/integrations/mongodb.js.map +0 -1
  390. package/dist/integrations/mongoose.d.ts +0 -13
  391. package/dist/integrations/mongoose.d.ts.map +0 -1
  392. package/dist/integrations/mongoose.js +0 -84
  393. package/dist/integrations/mongoose.js.map +0 -1
  394. package/dist/integrations/openai.d.ts +0 -12
  395. package/dist/integrations/openai.d.ts.map +0 -1
  396. package/dist/integrations/openai.js +0 -47
  397. package/dist/integrations/openai.js.map +0 -1
  398. package/dist/integrations/postgres.d.ts +0 -13
  399. package/dist/integrations/postgres.d.ts.map +0 -1
  400. package/dist/integrations/postgres.js +0 -55
  401. package/dist/integrations/postgres.js.map +0 -1
  402. package/dist/integrations/posthog.d.ts +0 -13
  403. package/dist/integrations/posthog.d.ts.map +0 -1
  404. package/dist/integrations/posthog.js +0 -49
  405. package/dist/integrations/posthog.js.map +0 -1
  406. package/dist/integrations/prisma.d.ts +0 -10
  407. package/dist/integrations/prisma.d.ts.map +0 -1
  408. package/dist/integrations/prisma.js +0 -39
  409. package/dist/integrations/prisma.js.map +0 -1
  410. package/dist/integrations/redis.d.ts +0 -12
  411. package/dist/integrations/redis.d.ts.map +0 -1
  412. package/dist/integrations/redis.js +0 -48
  413. package/dist/integrations/redis.js.map +0 -1
  414. package/dist/integrations/resend.d.ts +0 -12
  415. package/dist/integrations/resend.d.ts.map +0 -1
  416. package/dist/integrations/resend.js +0 -47
  417. package/dist/integrations/resend.js.map +0 -1
  418. package/dist/integrations/s3.d.ts +0 -15
  419. package/dist/integrations/s3.d.ts.map +0 -1
  420. package/dist/integrations/s3.js +0 -60
  421. package/dist/integrations/s3.js.map +0 -1
  422. package/dist/integrations/supabase.d.ts +0 -13
  423. package/dist/integrations/supabase.d.ts.map +0 -1
  424. package/dist/integrations/supabase.js +0 -51
  425. package/dist/integrations/supabase.js.map +0 -1
  426. package/dist/middleware/cache.d.ts +0 -21
  427. package/dist/middleware/cache.d.ts.map +0 -1
  428. package/dist/middleware/cache.js +0 -156
  429. package/dist/middleware/cache.js.map +0 -1
  430. package/dist/observability/health.d.ts +0 -23
  431. package/dist/observability/health.d.ts.map +0 -1
  432. package/dist/observability/health.js +0 -49
  433. package/dist/observability/health.js.map +0 -1
  434. package/dist/observability/index.d.ts +0 -4
  435. package/dist/observability/index.d.ts.map +0 -1
  436. package/dist/observability/index.js +0 -10
  437. package/dist/observability/index.js.map +0 -1
  438. package/dist/observability/metrics.d.ts +0 -6
  439. package/dist/observability/metrics.d.ts.map +0 -1
  440. package/dist/observability/metrics.js +0 -60
  441. package/dist/observability/metrics.js.map +0 -1
  442. package/dist/observability/otel.d.ts +0 -27
  443. package/dist/observability/otel.d.ts.map +0 -1
  444. package/dist/observability/otel.js +0 -45
  445. package/dist/observability/otel.js.map +0 -1
  446. package/dist/observability/prometheus.d.ts +0 -30
  447. package/dist/observability/prometheus.d.ts.map +0 -1
  448. package/dist/observability/prometheus.js +0 -31
  449. package/dist/observability/prometheus.js.map +0 -1
  450. package/dist/queue/client.d.ts +0 -13
  451. package/dist/queue/client.d.ts.map +0 -1
  452. package/dist/queue/client.js +0 -83
  453. package/dist/queue/client.js.map +0 -1
  454. package/dist/queue/drivers/MemoryDriver.d.ts +0 -21
  455. package/dist/queue/drivers/MemoryDriver.d.ts.map +0 -1
  456. package/dist/queue/drivers/MemoryDriver.js +0 -176
  457. package/dist/queue/drivers/MemoryDriver.js.map +0 -1
  458. package/dist/queue/drivers/RedisDriver.d.ts +0 -19
  459. package/dist/queue/drivers/RedisDriver.d.ts.map +0 -1
  460. package/dist/queue/drivers/RedisDriver.js +0 -130
  461. package/dist/queue/drivers/RedisDriver.js.map +0 -1
  462. package/dist/queue/index.d.ts +0 -18
  463. package/dist/queue/index.d.ts.map +0 -1
  464. package/dist/queue/index.js +0 -37
  465. package/dist/queue/index.js.map +0 -1
  466. package/dist/queue/manager.d.ts +0 -18
  467. package/dist/queue/manager.d.ts.map +0 -1
  468. package/dist/queue/manager.js +0 -59
  469. package/dist/queue/manager.js.map +0 -1
  470. package/dist/queue/types.d.ts +0 -55
  471. package/dist/queue/types.d.ts.map +0 -1
  472. package/dist/queue/types.js.map +0 -1
  473. package/dist/queue/worker.d.ts +0 -18
  474. package/dist/queue/worker.d.ts.map +0 -1
  475. package/dist/queue/worker.js +0 -176
  476. package/dist/queue/worker.js.map +0 -1
  477. package/dist/router/gateway.d.ts.map +0 -1
  478. package/dist/router/gateway.js +0 -11
  479. package/dist/router/gateway.js.map +0 -1
  480. package/dist/server/bun-adapter.d.ts.map +0 -1
  481. package/dist/server/bun-adapter.js.map +0 -1
  482. package/dist/server/sse.d.ts +0 -16
  483. package/dist/server/sse.d.ts.map +0 -1
  484. package/dist/server/sse.js +0 -51
  485. package/dist/server/sse.js.map +0 -1
  486. package/dist/server/uws-adapter.d.ts.map +0 -1
  487. package/dist/server/uws-adapter.js.map +0 -1
  488. package/dist/storage/index.d.ts +0 -15
  489. package/dist/storage/index.d.ts.map +0 -1
  490. package/dist/storage/index.js +0 -7
  491. package/dist/storage/index.js.map +0 -1
  492. package/dist/swagger/index.d.ts +0 -9
  493. package/dist/swagger/index.d.ts.map +0 -1
  494. package/dist/swagger/index.js +0 -165
  495. package/dist/swagger/index.js.map +0 -1
  496. package/dist/threads/pool.d.ts +0 -14
  497. package/dist/threads/pool.d.ts.map +0 -1
  498. package/dist/threads/pool.js +0 -93
  499. package/dist/threads/pool.js.map +0 -1
  500. package/dist/threads/worker-runner.d.ts +0 -2
  501. package/dist/threads/worker-runner.d.ts.map +0 -1
  502. package/dist/threads/worker-runner.js +0 -71
  503. package/dist/threads/worker-runner.js.map +0 -1
  504. package/dist/validator/validator.d.ts +0 -360
  505. package/dist/validator/validator.d.ts.map +0 -1
  506. package/dist/validator/validator.js +0 -931
  507. package/dist/validator/validator.js.map +0 -1
  508. package/dist/websocket/orchestrator.d.ts +0 -11
  509. package/dist/websocket/orchestrator.d.ts.map +0 -1
  510. package/dist/websocket/orchestrator.js +0 -238
  511. package/dist/websocket/orchestrator.js.map +0 -1
  512. package/dist/websocket/server.d.ts +0 -66
  513. package/dist/websocket/server.d.ts.map +0 -1
  514. package/dist/websocket/server.js +0 -158
  515. package/dist/websocket/server.js.map +0 -1
  516. package/dist/websocket/socket.d.ts +0 -119
  517. package/dist/websocket/socket.d.ts.map +0 -1
  518. package/dist/websocket/socket.js +0 -242
  519. package/dist/websocket/socket.js.map +0 -1
@@ -1,289 +0,0 @@
1
- ---
2
- nextUrl: "/docs/queues"
3
- nextTitle: "Job Queues"
4
- ---
5
-
6
- # WebSockets
7
-
8
- ExisJS provides a built-in WebSocket engine. It includes an integrated Pub/Sub system (rooms), automatic JSON serialization, Socket.io-style event emitters, and built-in presence tracking.
9
-
10
- You can handle WebSockets using either the **Functional API** or the **Class-Based (OOP) API**.
11
-
12
- ---
13
-
14
- ## 1. Functional API
15
-
16
- For smaller applications or functional paradigms, you can define WebSocket routes directly on a router using `route.ws()`.
17
-
18
- ```typescript filename="src/http/route.ts"
19
- import { controller, route } from 'exisjs/router'
20
-
21
- export default controller({
22
- chatSocket: route.ws('/ws', {
23
- handle({ socket }) {
24
- console.log(`New connection: ${socket.id}`)
25
-
26
- // Listen for incoming messages
27
- socket.on('message', (rawData) => {
28
- const data = JSON.parse(rawData.toString())
29
-
30
- if (data.action === 'join') {
31
- // Join a room (Pub/Sub)
32
- socket.join(data.room)
33
-
34
- // Emit a named event back to the socket
35
- socket.emit('chat', {
36
- type: 'system',
37
- message: `You joined #${data.room}`,
38
- })
39
- } else if (data.action === 'message') {
40
- // Publish a message to everyone in the room (excluding sender by default)
41
- socket.publish(data.room, {
42
- event: 'chat',
43
- data: { message: data.message },
44
- })
45
- }
46
- })
47
-
48
- socket.on('close', () => {
49
- console.log(`Disconnected: ${socket.id}`)
50
- socket.leaveAll()
51
- })
52
- },
53
- }),
54
- })
55
- ```
56
-
57
- ---
58
-
59
- ## 2. Class-Based (OOP) API
60
-
61
- For larger applications, ExisJS provides the `@Ws()` decorator to map WebSocket endpoints inside your Controllers.
62
-
63
- ```typescript filename="src/http/chat/route.ts"
64
- import { Controller, Ws, Socket } from 'exisjs/decorators'
65
- import { ExisWebSocket } from 'exisjs/router'
66
-
67
- @Controller()
68
- export default class ChatController {
69
- @Ws('/ws')
70
- handleSocket(@Socket() socket: ExisWebSocket) {
71
- // Enable auto-presence for this server
72
- socket.server.enablePresence()
73
-
74
- // Listen for custom JSON events
75
- socket.onEvent('join', (data) => {
76
- // Attach custom state to the socket
77
- socket.data.userId = data.userId
78
-
79
- // Unsubscribe from previous rooms
80
- socket.leaveAll()
81
- socket.join(data.room)
82
-
83
- // Fetch the roster of active users in the room
84
- const roster = socket.server.getRoomRoster(data.room)
85
- socket.emit('roster', { roster })
86
- })
87
-
88
- socket.onEvent('message', (data) => {
89
- // Socket.io style broadcasting!
90
- socket.to(data.room).emit('chat', {
91
- userId: socket.data.userId,
92
- message: data.message,
93
- })
94
- })
95
- }
96
- }
97
- ```
98
-
99
- ---
100
-
101
- ## The `ExisWebSocket` API
102
-
103
- ExisJS wraps the native WebSocket with an `ExisWebSocket` instance that provides Socket.io-like ergonomics without the heavy client-side dependencies.
104
-
105
- ### Emitting & Sending
106
-
107
- - **`socket.send(data)`**: Sends raw data. Objects are automatically stringified.
108
- - **`socket.emit(event, data)`**: Emits a named JSON event (`{ event: "name", data: ... }`).
109
- - **`socket.emitWithAck(event, data, timeoutMs?)`**: Emits an event and returns a Promise that resolves when the client sends back an acknowledgment with the matching `ackId`.
110
- - **`socket.volatile.emit(event, data)`**: Emits an event that will be safely dropped if the connection is experiencing backpressure (network saturation).
111
-
112
- #### Example: Emitting Events
113
-
114
- **Functional API:**
115
-
116
- ```typescript
117
- route.ws('/ws', {
118
- handle({ socket }) {
119
- // Send a standard named event
120
- socket.emit('ping', { timestamp: Date.now() })
121
-
122
- // Send a volatile event that drops if network is busy
123
- socket.volatile.emit('stock-tick', { price: 100 })
124
- },
125
- })
126
- ```
127
-
128
- **Class-Based (OOP) API:**
129
-
130
- ```typescript
131
- @Ws('/ws')
132
- handleSocket(@Socket() socket: ExisWebSocket) {
133
- // Await an acknowledgment from the client
134
- socket.onEvent('request-data', async () => {
135
- try {
136
- const response = await socket.emitWithAck('data-ready', { id: 1 }, 5000)
137
- console.log('Client acknowledged:', response)
138
- } catch (err) {
139
- console.error('Client failed to ack in 5s')
140
- }
141
- })
142
- }
143
- ```
144
-
145
- ### Rooms (Pub/Sub)
146
-
147
- ExisJS has a built-in Pub/Sub engine that allows sockets to subscribe to topics (rooms).
148
-
149
- - **`socket.join(room)`** / **`socket.subscribe(room)`**: Subscribes the socket to a room.
150
- - **`socket.leave(room)`** / **`socket.unsubscribe(room)`**: Unsubscribes from a room.
151
- - **`socket.leaveAll()`** / **`socket.unsubscribeAll()`**: Unsubscribes from all joined rooms.
152
- - **`socket.publish(room, data, excludeSelf?)`**: Publishes data to all sockets in a room. By default, it excludes the sender.
153
-
154
- #### Example: Managing Rooms
155
-
156
- **Functional API:**
157
-
158
- ```typescript
159
- route.ws('/chat', {
160
- handle({ socket }) {
161
- socket.onEvent('join-room', (data) => {
162
- // Leave old rooms before joining a new one
163
- socket.leaveAll()
164
- socket.join(data.roomId)
165
-
166
- socket.publish(data.roomId, {
167
- event: 'system',
168
- data: 'A new user joined',
169
- })
170
- })
171
- },
172
- })
173
- ```
174
-
175
- **Class-Based (OOP) API:**
176
-
177
- ```typescript
178
- @Ws('/chat')
179
- handleSocket(@Socket() socket: ExisWebSocket) {
180
- socket.onEvent('leave-room', (data) => {
181
- socket.leave(data.roomId)
182
- })
183
- }
184
- ```
185
-
186
- ### Broadcasting (Socket.io Style)
187
-
188
- If you prefer Socket.io's chainable broadcasting syntax, ExisJS fully supports it:
189
-
190
- - **`socket.to(room).emit(event, data)`**: Emits an event to everyone in the specified room _except_ the sender.
191
- - **`socket.broadcast.emit(event, data)`**: Emits to every connected socket on the server _except_ the sender.
192
- - **`socket.broadcast.to(room).emit(event, data)`**: Same as `socket.to()`.
193
-
194
- #### Example: Broadcasting
195
-
196
- **Functional API:**
197
-
198
- ```typescript
199
- route.ws('/game', {
200
- handle({ socket }) {
201
- socket.onEvent('player-move', (position) => {
202
- // Tell everyone ELSE in 'game-1' that this player moved
203
- socket.to('game-1').emit('player-moved', { id: socket.id, position })
204
- })
205
- },
206
- })
207
- ```
208
-
209
- **Class-Based (OOP) API:**
210
-
211
- ```typescript
212
- @Ws('/global')
213
- handleSocket(@Socket() socket: ExisWebSocket) {
214
- socket.onEvent('global-alert', (alert) => {
215
- // Broadcast to EVERYONE on the server except the sender
216
- socket.broadcast.emit('alert', alert)
217
- })
218
- }
219
- ```
220
-
221
- ### Listening for Events
222
-
223
- - **`socket.on('message', cb)`**: Listens for raw WebSocket messages.
224
- - **`socket.onEvent(eventName, cb)`**: Automatically parses incoming JSON and triggers the callback _only_ if the JSON payload matches `{ event: "eventName" }`.
225
-
226
- #### Example: Event Listeners
227
-
228
- **Functional API:**
229
-
230
- ```typescript
231
- route.ws('/data', {
232
- handle({ socket }) {
233
- // Handle raw buffer/string messages manually
234
- socket.on('message', (raw) => {
235
- console.log('Raw data received:', raw.toString())
236
- })
237
- },
238
- })
239
- ```
240
-
241
- **Class-Based (OOP) API:**
242
-
243
- ```typescript
244
- @Ws('/api')
245
- handleSocket(@Socket() socket: ExisWebSocket) {
246
- // Handle specific JSON events
247
- socket.onEvent('auth', (credentials) => {
248
- console.log('Auth attempt:', credentials.username)
249
- })
250
- }
251
- ```
252
-
253
- ### State & Presence
254
-
255
- - **`socket.data`**: An empty object `Record<string, any>` where you can safely attach custom user data (like user IDs, roles, etc.) for the duration of the connection.
256
- - **`socket.server.enablePresence()`**: Turns on automatic presence tracking. When a socket joins or leaves a room, ExisJS will automatically broadcast `room:join` and `room:leave` events to the room.
257
- - **`socket.server.getRoomRoster(room)`**: Returns an array of all connected sockets currently in a specific room.
258
-
259
- #### Example: State & Roster Tracking
260
-
261
- **Functional API:**
262
-
263
- ```typescript
264
- route.ws('/collaboration', {
265
- handle({ socket }) {
266
- socket.server.enablePresence()
267
-
268
- socket.onEvent('identify', (user) => {
269
- // Safely store state on the socket instance
270
- socket.data.userId = user.id
271
- socket.data.role = 'editor'
272
- })
273
- },
274
- })
275
- ```
276
-
277
- **Class-Based (OOP) API:**
278
-
279
- ```typescript
280
- @Ws('/collaboration')
281
- handleSocket(@Socket() socket: ExisWebSocket) {
282
- socket.onEvent('get-users', (room) => {
283
- // Fetch everyone currently in the room
284
- const roster = socket.server.getRoomRoster(room)
285
-
286
- socket.emit('users-list', roster.map(s => s.data.userId))
287
- })
288
- }
289
- ```
@@ -1,23 +0,0 @@
1
- # ExisJS Integrations Blueprint
2
-
3
- This directory contains the documentation for integrating third-party services and tools with ExisJS. This `README.md` acts as a **blueprint** to help you understand what each integration guide covers.
4
-
5
- ## 🗄️ Databases & Storage
6
- * **`mongo.mdx`**: Connecting to MongoDB using Mongoose, leveraging the DI container, and data modeling.
7
- * **`postgres.mdx`**: Connecting to PostgreSQL databases (e.g., via Prisma or Drizzle ORM) in a type-safe manner.
8
- * **`redis.mdx`**: Using Redis for high-speed caching, rate limiting, and powering ExisJS queues.
9
- * **`s3.mdx`**: Integrating with AWS S3 (or compatible services like Cloudflare R2) for file uploads and object storage.
10
-
11
- ## 🔐 Auth & Security
12
- * **`jwt.mdx`**: Implementing JSON Web Token (JWT) authentication, signing, and protecting routes via middleware.
13
-
14
- ## 🤖 Artificial Intelligence
15
- * **`openai.mdx`**: Integrating the OpenAI SDK, streaming LLM responses using ExisJS SSE (Server-Sent Events), and managing API keys securely.
16
-
17
- ## 📧 Communications
18
- * **`resend.mdx`**: Sending transactional emails (like password resets or welcome emails) using the Resend API, ideally triggered via background Queues.
19
-
20
- ## 📊 Analytics & Observability
21
- * **`posthog.mdx`**: Capturing user events, feature flags, and product analytics using PostHog inside your ExisJS controllers.
22
- * **`observability.mdx`**: Setting up advanced monitoring, tracing (OpenTelemetry), and logging infrastructure.
23
- * **`swagger.mdx`**: Automatic OpenAPI/Swagger generation for your endpoints based on your validation schemas and route definitions.
@@ -1,151 +0,0 @@
1
- ---
2
- nextUrl: "/docs/integrations/swagger"
3
- nextTitle: "Swagger OpenAPI"
4
- ---
5
-
6
- # JWT Authentication
7
-
8
- ExisJS comes with a native JSON Web Token (JWT) integration. You do **not** need to install external dependencies like `jsonwebtoken`. It is built natively into the framework and optimized for edge environments.
9
-
10
- ---
11
-
12
- ## Environment Variables
13
-
14
- The JWT integration securely reads your secret key from your `.env` file.
15
- Before using the plugin, ensure you have your JWT secret set:
16
-
17
- ```bash filename=".env"
18
- # Your JWT signing secret
19
- JWT_SECRET="super_secret_key_123"
20
- ```
21
-
22
- ---
23
-
24
- ## Usage
25
-
26
- Import the `JWT` object from `exisjs/auth` and use `JWT.signJWT()` or `JWT.verifyJWT()`. You will need to explicitly pass your secret key.
27
-
28
- #### Functional Paradigm
29
-
30
- ```typescript filename="src/http/auth/route.ts"
31
- import { controller, route } from 'exisjs/router'
32
- import { JWT } from 'exisjs/auth'
33
- import { db, users } from '../../db'
34
-
35
- export default controller({
36
- login: route.post('/login', {
37
- async handle(req, res) {
38
- const user = await db.select().from(users).where({ email: req.body.email })
39
-
40
- if (!user) {
41
- res.status(401)
42
- return { error: 'Invalid credentials' }
43
- }
44
-
45
- // Sign the token using process.env.JWT_SECRET
46
- const token = JWT.signJWT({ userId: user.id }, process.env.JWT_SECRET!, { expiresIn: 604800 })
47
-
48
- return { token }
49
- }
50
- }),
51
-
52
- verify: route.get('/me', {
53
- async handle(req, res) {
54
- try {
55
- const token = req.headers.authorization?.split(' ')[1]
56
-
57
- // Verify using process.env.JWT_SECRET
58
- const decoded = JWT.verifyJWT<{ userId: string }>(token, process.env.JWT_SECRET!)
59
-
60
- return { userId: decoded.userId }
61
- } catch (err) {
62
- res.status(401)
63
- return { error: 'Invalid or expired token' }
64
- }
65
- }
66
- })
67
- })
68
- ```
69
-
70
- #### Class-Based (OOP) Paradigm
71
-
72
- ```typescript filename="src/http/auth/route.ts"
73
- import { Controller, Post, Get, Body, Req, Res } from 'exisjs/decorators'
74
- import { JWT } from 'exisjs/auth'
75
- import { db, users } from '../../db'
76
-
77
- @Controller('/auth')
78
- export default class AuthController {
79
- @Post('/login')
80
- async login(@Body() body: any, @Res() res: any) {
81
- const user = await db.select().from(users).where({ email: body.email })
82
-
83
- if (!user) {
84
- res.status(401)
85
- return { error: 'Invalid credentials' }
86
- }
87
-
88
- // Sign the token using process.env.JWT_SECRET
89
- const token = JWT.signJWT({ userId: user.id }, process.env.JWT_SECRET!, { expiresIn: 604800 })
90
-
91
- return { token }
92
- }
93
-
94
- @Get('/me')
95
- async verifyMe(@Req() req: any, @Res() res: any) {
96
- try {
97
- const token = req.headers.authorization?.split(' ')[1]
98
-
99
- // Verify using process.env.JWT_SECRET
100
- const decoded = JWT.verifyJWT<{ userId: string }>(token, process.env.JWT_SECRET!)
101
-
102
- return { userId: decoded.userId }
103
- } catch (err) {
104
- res.status(401)
105
- return { error: 'Invalid or expired token' }
106
- }
107
- }
108
- }
109
- ```
110
-
111
- ---
112
-
113
- ## Using JWT in Middleware & Gateways
114
-
115
- While you can verify tokens directly in your routes, ExisJS's JWT integration works well inside Middlewares to protect entire folders using **Gateways**.
116
-
117
- First, create your middleware outside of your routing tree:
118
-
119
- ```typescript filename="src/middlewares/auth.ts"
120
- import { JWT } from 'exisjs/auth'
121
-
122
- export function requireAuth(req: any, res: any, next: any) {
123
- const token = req.headers.authorization?.split(' ')[1]
124
-
125
- if (!token) {
126
- res.status(401).json({ error: 'Missing token' })
127
- return
128
- }
129
-
130
- try {
131
- const decoded = JWT.verifyJWT<{ userId: string }>(token, process.env.JWT_SECRET!)
132
- // Attach the decoded payload to the request for the route to use
133
- req.user = decoded
134
- next()
135
- } catch (err) {
136
- res.status(401).json({ error: 'Unauthorized' })
137
- }
138
- }
139
- ```
140
-
141
- Now, apply it to an entire domain using a Gateway. This prevents you from having to protect every route manually.
142
-
143
- ```typescript filename="src/http/api/gateway.ts"
144
- import { defineGateway } from 'exisjs/router'
145
- import { requireAuth } from '../../middlewares/auth'
146
-
147
- export default defineGateway({
148
- // Intercepts and protects every route inside the /api folder
149
- middleware: [requireAuth]
150
- })
151
- ```
@@ -1,183 +0,0 @@
1
- ---
2
- nextUrl: "/docs/integrations/redis"
3
- nextTitle: "Redis"
4
- ---
5
-
6
- # Database (NoSQL)
7
-
8
- ExisJS provides native integrations for MongoDB. You do **NOT** need to register the database in your `server.ts` file. The connection pools are lazily initialized when you first execute a query.
9
-
10
- The framework provides first-class plugins for **Mongoose** (the ODM) and the raw **MongoDB Node.js Driver** (`mongodb`).
11
-
12
- ---
13
-
14
- ## Environment Variables
15
-
16
- Both MongoDB plugins securely read your connection string from your `.env` file.
17
- Before using any of the plugins below, ensure you have your MongoDB URI set:
18
-
19
- ```bash filename=".env"
20
- # Your MongoDB connection string
21
- MONGODB_URI="mongodb://localhost:27017/my_database"
22
- ```
23
-
24
- ---
25
-
26
- ## Mongoose (ODM)
27
-
28
- The `@exisjs/mongoose` plugin automatically manages your database connection lifecycle.
29
-
30
- ### Basic Setup
31
- In your `server.ts` file, simply call `configureMongoose({})`:
32
-
33
- ```typescript filename="src/http/server.ts"
34
- import { exis } from "exisjs";
35
- import { configureMongoose } from "exisjs/mongoose";
36
-
37
- export default exis({
38
- async onStart(app) {
39
- configureMongoose({});
40
- }
41
- });
42
- ```
43
-
44
- ### Serverless Deployments (Vercel, AWS Lambda)
45
-
46
- When deploying to serverless platforms, bundlers (like `@vercel/node`) can accidentally create multiple unconnected instances of Mongoose in memory. To guarantee stability in serverless functions, we recommend importing Mongoose directly and passing it as the `client`:
47
-
48
- ```typescript filename="src/http/server.ts"
49
- import { exis } from "exisjs";
50
- import mongoose from "mongoose";
51
- import { configureMongoose } from "exisjs/mongoose";
52
-
53
- export default exis({
54
- async onStart(app) {
55
- configureMongoose({ client: mongoose });
56
- }
57
- });
58
- ```
59
-
60
- ---
61
- ## 1. Mongoose (Recommended)
62
-
63
- Mongoose provides a straight-forward, schema-based solution to model your application data.
64
-
65
- ### Installation
66
-
67
- ```bash
68
- npm install mongoose
69
- ```
70
-
71
- ### Usage
72
-
73
- Import the `mongoose` proxy from `exisjs/mongoose`. ExisJS will connect to your database behind the scenes (Mongoose natively buffers operations until connected).
74
-
75
- ```typescript filename="src/models/user.ts"
76
- import { mongoose } from 'exisjs/mongoose'
77
-
78
- const userSchema = new mongoose.Schema({
79
- name: String,
80
- email: { type: String, unique: true },
81
- })
82
-
83
- export const User = mongoose.model('User', userSchema)
84
- ```
85
-
86
- Now you can use your `User` model in your routes:
87
-
88
- #### Functional Paradigm
89
-
90
- ```typescript filename="src/http/users/route.ts"
91
- import { controller, route } from 'exisjs/router'
92
- import { User } from '../../models/user'
93
-
94
- export default controller({
95
- getUsers: route.get('/', {
96
- async handle() {
97
- return await User.find({})
98
- }
99
- })
100
- })
101
- ```
102
-
103
- #### Class-Based (OOP) Paradigm
104
-
105
- ```typescript filename="src/http/users/route.ts"
106
- import { Controller, Get } from 'exisjs/decorators'
107
- import { User } from '../../models/user'
108
-
109
- @Controller()
110
- export default class UsersController {
111
- @Get('/')
112
- async getUsers() {
113
- return await User.find({})
114
- }
115
- }
116
- ```
117
-
118
- ---
119
-
120
- ## 2. Raw MongoDB (`mongodb`)
121
-
122
- If you don't want to use an ODM and prefer working with raw BSON documents, ExisJS provides an integration for the native `mongodb` driver.
123
-
124
- ### Installation
125
-
126
- ```bash
127
- npm install mongodb
128
- ```
129
-
130
- ### Usage
131
-
132
- Import `mongo` from `exisjs/mongodb`. The first time you interact with it, ExisJS will boot up a MongoClient connection pool using your `MONGODB_URI`.
133
-
134
- #### Functional Paradigm
135
-
136
- ```typescript filename="src/http/users/route.ts"
137
- import { controller, route } from 'exisjs/router'
138
- import { mongo } from 'exisjs/mongodb'
139
-
140
- export default controller({
141
- getUsers: route.get('/', {
142
- async handle() {
143
- const db = mongo.db('my_database')
144
- return await db.collection('users').find({}).toArray()
145
- }
146
- })
147
- })
148
- ```
149
-
150
- #### Class-Based (OOP) Paradigm
151
-
152
- ```typescript filename="src/http/users/route.ts"
153
- import { Controller, Get } from 'exisjs/decorators'
154
- import { mongo } from 'exisjs/mongodb'
155
-
156
- @Controller()
157
- export default class UsersController {
158
- @Get('/')
159
- async getUsers() {
160
- const db = mongo.db('my_database')
161
- return await db.collection('users').find({}).toArray()
162
- }
163
- }
164
- ```
165
-
166
- ### Customizing Connection Options
167
-
168
- If you need to pass custom options to the MongoDB connection pool (like replica set configs or pool sizes), call `configureMongo(options)` or `configureMongoose(options)` inside your `server.ts` `onStart` hook.
169
-
170
- ```typescript filename="src/http/server.ts"
171
- import { exis } from 'exisjs'
172
- import { configureMongoose } from 'exisjs/mongoose'
173
-
174
- export default exis({
175
- async onStart() {
176
- // Initialize with custom connection options
177
- configureMongoose({
178
- maxPoolSize: 50,
179
- wtimeoutMS: 2500,
180
- })
181
- }
182
- })
183
- ```