exisjs 0.5.12 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. package/README.md +1 -1
  2. package/dist/auth/jwt.d.ts +1 -1
  3. package/dist/auth/jwt.js +1 -1
  4. package/dist/auth/oauth/middleware.js +1 -1
  5. package/dist/auth/rbac.js +1 -1
  6. package/dist/cli/commands/build.d.ts.map +1 -1
  7. package/dist/cli/commands/build.js +9 -1
  8. package/dist/cli/commands/build.js.map +1 -1
  9. package/dist/cli/commands/dev.d.ts.map +1 -1
  10. package/dist/cli/commands/dev.js +69 -5
  11. package/dist/cli/commands/dev.js.map +1 -1
  12. package/dist/cli/commands/exports.js +2 -2
  13. package/dist/cli/commands/exports.js.map +1 -1
  14. package/dist/cli/commands/generate.d.ts +22 -1
  15. package/dist/cli/commands/generate.d.ts.map +1 -1
  16. package/dist/cli/commands/generate.js +110 -52
  17. package/dist/cli/commands/generate.js.map +1 -1
  18. package/dist/cli/commands/test.js +2 -2
  19. package/dist/cli/commands/test.js.map +1 -1
  20. package/dist/cli/index.js +53 -24
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/cli/routes.js +1 -1
  23. package/dist/cli/routes.js.map +1 -1
  24. package/dist/config/config.d.ts.map +1 -0
  25. package/dist/config/config.js.map +1 -0
  26. package/dist/config/env.d.ts.map +1 -0
  27. package/dist/config/env.js.map +1 -0
  28. package/dist/config/index.d.ts +1 -1
  29. package/dist/config/index.d.ts.map +1 -1
  30. package/dist/config/index.js +3 -2
  31. package/dist/config/index.js.map +1 -1
  32. package/dist/config/types.d.ts +98 -0
  33. package/dist/config/types.d.ts.map +1 -0
  34. package/dist/config/types.js +3 -0
  35. package/dist/config/types.js.map +1 -0
  36. package/dist/cron/scheduler.d.ts.map +1 -1
  37. package/dist/cron/scheduler.js +3 -1
  38. package/dist/cron/scheduler.js.map +1 -1
  39. package/dist/database/adapters/mysql.d.ts +1 -1
  40. package/dist/database/adapters/mysql.js +1 -1
  41. package/dist/database/adapters/postgres.d.ts +1 -1
  42. package/dist/database/adapters/postgres.js +1 -1
  43. package/dist/database/adapters/sqlite.d.ts +1 -1
  44. package/dist/database/adapters/sqlite.js +1 -1
  45. package/dist/database/manager.d.ts +28 -1
  46. package/dist/database/manager.d.ts.map +1 -1
  47. package/dist/database/manager.js +69 -1
  48. package/dist/database/manager.js.map +1 -1
  49. package/dist/database/query-builder.d.ts +6 -0
  50. package/dist/database/query-builder.d.ts.map +1 -1
  51. package/dist/database/query-builder.js +56 -5
  52. package/dist/database/query-builder.js.map +1 -1
  53. package/dist/database/sql/index.d.ts +18 -0
  54. package/dist/database/sql/index.d.ts.map +1 -0
  55. package/dist/database/sql/index.js +74 -0
  56. package/dist/database/sql/index.js.map +1 -0
  57. package/dist/database/sql/schema.d.ts +38 -0
  58. package/dist/database/sql/schema.d.ts.map +1 -0
  59. package/dist/database/sql/schema.js +80 -0
  60. package/dist/database/sql/schema.js.map +1 -0
  61. package/dist/database/synchronizer.d.ts +12 -0
  62. package/dist/database/synchronizer.d.ts.map +1 -0
  63. package/dist/database/synchronizer.js +82 -0
  64. package/dist/database/synchronizer.js.map +1 -0
  65. package/dist/decorators/core/engine.d.ts +43 -0
  66. package/dist/decorators/core/engine.d.ts.map +1 -0
  67. package/dist/decorators/core/engine.js +77 -0
  68. package/dist/decorators/core/engine.js.map +1 -0
  69. package/dist/decorators/core/index.d.ts +3 -0
  70. package/dist/decorators/core/index.d.ts.map +1 -0
  71. package/dist/decorators/core/index.js +19 -0
  72. package/dist/decorators/core/index.js.map +1 -0
  73. package/dist/decorators/core/metadata.d.ts +23 -0
  74. package/dist/decorators/core/metadata.d.ts.map +1 -0
  75. package/dist/decorators/core/metadata.js +42 -0
  76. package/dist/decorators/core/metadata.js.map +1 -0
  77. package/dist/decorators/core.d.ts.map +1 -1
  78. package/dist/decorators/core.js +36 -49
  79. package/dist/decorators/core.js.map +1 -1
  80. package/dist/decorators/index.d.ts +1 -0
  81. package/dist/decorators/index.d.ts.map +1 -1
  82. package/dist/decorators/index.js +1 -0
  83. package/dist/decorators/index.js.map +1 -1
  84. package/dist/decorators/params.d.ts.map +1 -1
  85. package/dist/decorators/params.js +12 -14
  86. package/dist/decorators/params.js.map +1 -1
  87. package/dist/decorators/routing.d.ts.map +1 -1
  88. package/dist/decorators/routing.js +4 -6
  89. package/dist/decorators/routing.js.map +1 -1
  90. package/dist/dev/dep-graph.d.ts.map +1 -0
  91. package/dist/dev/dep-graph.js.map +1 -0
  92. package/dist/{server/dev-error-overlay.d.ts → dev/error-overlay.d.ts} +1 -1
  93. package/dist/dev/error-overlay.d.ts.map +1 -0
  94. package/dist/{server/dev-error-overlay.js → dev/error-overlay.js} +1 -1
  95. package/dist/dev/error-overlay.js.map +1 -0
  96. package/dist/dev/hot-reload.d.ts.map +1 -0
  97. package/dist/{server → dev}/hot-reload.js +14 -7
  98. package/dist/dev/hot-reload.js.map +1 -0
  99. package/dist/docs/ARCHITECTURE.md +5 -5
  100. package/dist/docs/content/controllers.mdx +1 -1
  101. package/dist/docs/content/cron.mdx +1 -1
  102. package/dist/docs/content/database.mdx +141 -72
  103. package/dist/docs/content/errors.mdx +1 -1
  104. package/dist/docs/content/gateways.mdx +1 -1
  105. package/dist/docs/content/providers.mdx +1 -1
  106. package/dist/docs/content/queues.mdx +2 -2
  107. package/dist/docs/content/structure.mdx +71 -21
  108. package/dist/docs/content/testing.mdx +2 -2
  109. package/dist/docs/integrations/openai.mdx +1 -1
  110. package/dist/docs/integrations/resend.mdx +1 -1
  111. package/dist/docs/integrations/s3.mdx +1 -1
  112. package/dist/docs/reference/cache.mdx +1 -1
  113. package/dist/docs/reference/config.mdx +2 -2
  114. package/dist/docs/reference/di.mdx +2 -2
  115. package/dist/docs/reference/middleware.mdx +4 -4
  116. package/dist/docs/reference/router.mdx +1 -1
  117. package/dist/docs/reference/validator.mdx +2 -2
  118. package/dist/{utils → error}/errors.d.ts.map +1 -1
  119. package/dist/{utils → error}/errors.js.map +1 -1
  120. package/dist/error/index.d.ts +1 -1
  121. package/dist/error/index.d.ts.map +1 -1
  122. package/dist/error/index.js +1 -1
  123. package/dist/error/index.js.map +1 -1
  124. package/dist/index.d.ts +3 -7
  125. package/dist/index.d.ts.map +1 -1
  126. package/dist/index.js +4 -13
  127. package/dist/index.js.map +1 -1
  128. package/dist/lib/start-repl.js +3 -5
  129. package/dist/lib/start-repl.js.map +1 -1
  130. package/dist/lib/start-server.js +5 -7
  131. package/dist/lib/start-server.js.map +1 -1
  132. package/dist/middleware/backpressure.js +1 -1
  133. package/dist/middleware/ip-filter.js +1 -1
  134. package/dist/middleware/middleware.d.ts +1 -1
  135. package/dist/middleware/middleware.d.ts.map +1 -1
  136. package/dist/middleware/middleware.js +1 -1
  137. package/dist/middleware/middleware.js.map +1 -1
  138. package/dist/middleware/rate-limit.js +1 -1
  139. package/dist/middleware/security.js +1 -1
  140. package/dist/observability/metrics.d.ts +2 -2
  141. package/dist/observability/metrics.d.ts.map +1 -1
  142. package/dist/observability/metrics.js +1 -1
  143. package/dist/observability/metrics.js.map +1 -1
  144. package/dist/observability/prometheus.d.ts +1 -1
  145. package/dist/observability/prometheus.js +1 -1
  146. package/dist/{utils/plugin.d.ts → plugin/define.d.ts} +1 -1
  147. package/dist/plugin/define.d.ts.map +1 -0
  148. package/dist/{utils/plugin.js → plugin/define.js} +1 -1
  149. package/dist/plugin/define.js.map +1 -0
  150. package/dist/plugin/index.d.ts +1 -1
  151. package/dist/plugin/index.d.ts.map +1 -1
  152. package/dist/plugin/index.js +2 -2
  153. package/dist/plugin/index.js.map +1 -1
  154. package/dist/{server/plugin-manager.d.ts → plugin/manager.d.ts} +2 -2
  155. package/dist/plugin/manager.d.ts.map +1 -0
  156. package/dist/{server/plugin-manager.js → plugin/manager.js} +1 -1
  157. package/dist/plugin/manager.js.map +1 -0
  158. package/dist/plugin/types.d.ts +23 -0
  159. package/dist/plugin/types.d.ts.map +1 -0
  160. package/dist/plugin/types.js +3 -0
  161. package/dist/plugin/types.js.map +1 -0
  162. package/dist/{server/queue-manager.d.ts → queue/manager.d.ts} +2 -2
  163. package/dist/queue/manager.d.ts.map +1 -0
  164. package/dist/{server/queue-manager.js → queue/manager.js} +1 -1
  165. package/dist/queue/manager.js.map +1 -0
  166. package/dist/{server → router}/controller-registrar.d.ts +1 -1
  167. package/dist/{server → router}/controller-registrar.d.ts.map +1 -1
  168. package/dist/{server → router}/controller-registrar.js +12 -3
  169. package/dist/router/controller-registrar.js.map +1 -0
  170. package/dist/router/index.d.ts +3 -3
  171. package/dist/router/index.js +5 -5
  172. package/dist/router/index.js.map +1 -1
  173. package/dist/{server/route.d.ts → router/route-builder.d.ts} +3 -3
  174. package/dist/router/route-builder.d.ts.map +1 -0
  175. package/dist/{server/route.js → router/route-builder.js} +1 -1
  176. package/dist/router/route-builder.js.map +1 -0
  177. package/dist/{server → router}/route-scanner.d.ts +2 -1
  178. package/dist/router/route-scanner.d.ts.map +1 -0
  179. package/dist/{server → router}/route-scanner.js +83 -13
  180. package/dist/router/route-scanner.js.map +1 -0
  181. package/dist/router/types.d.ts +89 -0
  182. package/dist/router/types.d.ts.map +1 -0
  183. package/dist/router/types.js +3 -0
  184. package/dist/router/types.js.map +1 -0
  185. package/dist/sanitize/index.d.ts +2 -2
  186. package/dist/sanitize/index.js +3 -3
  187. package/dist/sanitize/sanitize.d.ts.map +1 -0
  188. package/dist/sanitize/sanitize.js.map +1 -0
  189. package/dist/server/app.d.ts +7 -7
  190. package/dist/server/app.d.ts.map +1 -1
  191. package/dist/server/app.js +12 -12
  192. package/dist/server/app.js.map +1 -1
  193. package/dist/server/bootstrapper.d.ts.map +1 -1
  194. package/dist/server/bootstrapper.js +12 -0
  195. package/dist/server/bootstrapper.js.map +1 -1
  196. package/dist/server/request-handler.js +1 -1
  197. package/dist/server/request.js +1 -1
  198. package/dist/testing/mocks.d.ts.map +1 -1
  199. package/dist/testing/mocks.js +5 -0
  200. package/dist/testing/mocks.js.map +1 -1
  201. package/dist/types.d.ts +3 -203
  202. package/dist/types.d.ts.map +1 -1
  203. package/dist/types.js +17 -0
  204. package/dist/types.js.map +1 -1
  205. package/dist/validator/index.d.ts +2 -2
  206. package/dist/validator/index.d.ts.map +1 -1
  207. package/dist/validator/index.js +1 -1
  208. package/dist/validator/index.js.map +1 -1
  209. package/dist/validator/validator.d.ts.map +1 -0
  210. package/dist/validator/validator.js.map +1 -0
  211. package/dist/{server/ws-orchestrator.d.ts → websocket/orchestrator.d.ts} +2 -2
  212. package/dist/websocket/orchestrator.d.ts.map +1 -0
  213. package/dist/{server/ws-orchestrator.js → websocket/orchestrator.js} +3 -3
  214. package/dist/websocket/orchestrator.js.map +1 -0
  215. package/package.json +11 -3
  216. package/dist/server/controller-registrar.js.map +0 -1
  217. package/dist/server/dep-graph.d.ts.map +0 -1
  218. package/dist/server/dep-graph.js.map +0 -1
  219. package/dist/server/dev-error-overlay.d.ts.map +0 -1
  220. package/dist/server/dev-error-overlay.js.map +0 -1
  221. package/dist/server/hot-reload.d.ts.map +0 -1
  222. package/dist/server/hot-reload.js.map +0 -1
  223. package/dist/server/plugin-manager.d.ts.map +0 -1
  224. package/dist/server/plugin-manager.js.map +0 -1
  225. package/dist/server/queue-manager.d.ts.map +0 -1
  226. package/dist/server/queue-manager.js.map +0 -1
  227. package/dist/server/route-scanner.d.ts.map +0 -1
  228. package/dist/server/route-scanner.js.map +0 -1
  229. package/dist/server/route.d.ts.map +0 -1
  230. package/dist/server/route.js.map +0 -1
  231. package/dist/server/ws-orchestrator.d.ts.map +0 -1
  232. package/dist/server/ws-orchestrator.js.map +0 -1
  233. package/dist/utils/config.d.ts.map +0 -1
  234. package/dist/utils/config.js.map +0 -1
  235. package/dist/utils/env.d.ts.map +0 -1
  236. package/dist/utils/env.js.map +0 -1
  237. package/dist/utils/plugin.d.ts.map +0 -1
  238. package/dist/utils/plugin.js.map +0 -1
  239. package/dist/utils/sanitize.d.ts.map +0 -1
  240. package/dist/utils/sanitize.js.map +0 -1
  241. package/dist/utils/validator.d.ts.map +0 -1
  242. package/dist/utils/validator.js.map +0 -1
  243. /package/dist/{utils → config}/config.d.ts +0 -0
  244. /package/dist/{utils → config}/config.js +0 -0
  245. /package/dist/{utils → config}/env.d.ts +0 -0
  246. /package/dist/{utils → config}/env.js +0 -0
  247. /package/dist/{server → dev}/dep-graph.d.ts +0 -0
  248. /package/dist/{server → dev}/dep-graph.js +0 -0
  249. /package/dist/{server → dev}/hot-reload.d.ts +0 -0
  250. /package/dist/{utils → error}/errors.d.ts +0 -0
  251. /package/dist/{utils → error}/errors.js +0 -0
  252. /package/dist/{utils → sanitize}/sanitize.d.ts +0 -0
  253. /package/dist/{utils → sanitize}/sanitize.js +0 -0
  254. /package/dist/{utils → validator}/validator.d.ts +0 -0
  255. /package/dist/{utils → validator}/validator.js +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dep-graph.js","sourceRoot":"","sources":["../../src/dev/dep-graph.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  export declare function formatDevError(err: Error, routeFile?: string): void;
2
2
  export declare function devErrorResponse(err: Error, routeFile?: string): object;
3
- //# sourceMappingURL=dev-error-overlay.d.ts.map
3
+ //# sourceMappingURL=error-overlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-overlay.d.ts","sourceRoot":"","sources":["../../src/dev/error-overlay.ts"],"names":[],"mappings":"AA8FA,wBAAgB,cAAc,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CA4BnE;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAavE"}
@@ -115,4 +115,4 @@ function devErrorResponse(err, routeFile) {
115
115
  },
116
116
  };
117
117
  }
118
- //# sourceMappingURL=dev-error-overlay.js.map
118
+ //# sourceMappingURL=error-overlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-overlay.js","sourceRoot":"","sources":["../../src/dev/error-overlay.ts"],"names":[],"mappings":";;;;;AA8FA,wCA4BC;AAED,4CAaC;AAzID,sDAAwB;AAExB,MAAM,CAAC,GAAG;IACR,GAAG,EAAE,UAAU;IACf,MAAM,EAAE,UAAU;IAClB,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,UAAU;IACjB,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,SAAS;IACd,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,UAAU;CAClB,CAAA;AASD,SAAS,kBAAkB,CAAC,GAAU;IACpC,MAAM,MAAM,GAAgB,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAA;IAEpD,IAAI,CAAC,GAAG,CAAC,KAAK;QAAE,OAAO,MAAM,CAAA;IAE7B,qCAAqC;IACrC,gDAAgD;IAChD,wBAAwB;IACxB,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAExC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,6BAA6B;QAC7B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAA;QACjD,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;YACvB,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACrC,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACvC,MAAK;QACP,CAAC;QAED,0CAA0C;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAA;QAClD,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAClD,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;YACvB,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACrC,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACvC,MAAK;QACP,CAAC;QAED,4DAA4D;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAA;QACpD,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;YACvB,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACrC,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACvC,MAAK;QACP,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,cAAc,CACrB,QAAgB,EAChB,SAAiB,EACjB,YAAY,GAAG,CAAC;IAEhB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,iBAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QACjD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,YAAY,GAAG,CAAC,CAAC,CAAA;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,YAAY,CAAC,CAAA;QAE5D,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAA;QACtC,MAAM,MAAM,GAAa,EAAE,CAAA;QAE3B,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,GAAG,CAAC,CAAA;YACxD,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,CAAA;YAEvC,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,KAAK,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;YACxE,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;YAChE,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,SAAgB,cAAc,CAAC,GAAU,EAAE,SAAkB;IAC3D,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;IACtC,MAAM,IAAI,GAAG,SAAS,IAAI,MAAM,CAAC,IAAI,IAAI,SAAS,CAAA;IAClD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI;QAC1B,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QAC9D,CAAC,CAAC,EAAE,CAAA;IAEN,MAAM,KAAK,GAAG,EAAE,CAAA;IAChB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAEhC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;IACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;IAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,QAAQ,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;IAC9D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAEf,aAAa;IACb,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;QACtD,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;YAClB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACjB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;IACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;IAC7C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AACjB,CAAC;AAED,SAAgB,gBAAgB,CAAC,GAAU,EAAE,SAAkB;IAC7D,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;IAEtC,OAAO;QACL,OAAO,EAAE,KAAK;QACd,KAAK,EAAE;YACL,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI,EAAE,SAAS,IAAI,MAAM,CAAC,IAAI;YAC9B,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hot-reload.d.ts","sourceRoot":"","sources":["../../src/dev/hot-reload.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAsB9C,UAAU,kBAAkB;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC7B,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAClE,UAAU,EAAE,MAAM,IAAI,CAAA;CACvB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,UAAU,CAAwD;IAC1E,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,OAAO,CAA4C;IAC3D,OAAO,CAAC,QAAQ,CAAiC;gBAErC,IAAI,EAAE,kBAAkB;IAQ9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA+C5B,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,aAAa;YAKP,gBAAgB;YA6BhB,YAAY;YAyCZ,SAAS;IAiCvB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,mBAAmB;IAoCrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAM5B"}
@@ -38,8 +38,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.HotReloader = void 0;
40
40
  const node_path_1 = __importDefault(require("node:path"));
41
- const dev_error_overlay_1 = require("./dev-error-overlay");
42
- const dep_graph_1 = require("./dep-graph");
41
+ const error_overlay_1 = require("../dev/error-overlay");
42
+ const dep_graph_1 = require("../dev/dep-graph");
43
43
  const c = {
44
44
  green: '\x1b[32m',
45
45
  cyan: '\x1b[36m',
@@ -49,6 +49,13 @@ const c = {
49
49
  bold: '\x1b[1m',
50
50
  reset: '\x1b[0m',
51
51
  };
52
+ function ts() {
53
+ const now = new Date();
54
+ const h = String(now.getHours()).padStart(2, '0');
55
+ const m = String(now.getMinutes()).padStart(2, '0');
56
+ const s = String(now.getSeconds()).padStart(2, '0');
57
+ return `${c.gray}[${h}:${m}:${s}]${c.reset}`;
58
+ }
52
59
  class HotReloader {
53
60
  constructor(opts) {
54
61
  this.watcher = null;
@@ -157,10 +164,10 @@ class HotReloader {
157
164
  const relative = node_path_1.default
158
165
  .relative(process.cwd(), normalized)
159
166
  .replace(/\\/g, '/');
160
- console.log(` ${c.green}✓${c.reset} Hot reloaded ${c.cyan}${relative}${c.reset} in ${elapsed}ms`);
167
+ console.log(`${ts()} ${c.green}HMR:${c.reset} Reloaded ${c.cyan}${relative}${c.reset} in ${elapsed}ms`);
161
168
  }
162
169
  catch (err) {
163
- (0, dev_error_overlay_1.formatDevError)(err, normalized);
170
+ (0, error_overlay_1.formatDevError)(err, normalized);
164
171
  }
165
172
  }
166
173
  async handleAdd(filePath) {
@@ -184,10 +191,10 @@ class HotReloader {
184
191
  const relative = node_path_1.default
185
192
  .relative(process.cwd(), normalized)
186
193
  .replace(/\\/g, '/');
187
- console.log(` ${c.green}+${c.reset} Added route ${c.cyan}${relative}${c.reset} → ${c.yellow}${routePath}${c.reset}`);
194
+ console.log(`${ts()} ${c.green}HMR:${c.reset} Added route ${c.cyan}${relative}${c.reset} → ${c.yellow}${routePath}${c.reset}`);
188
195
  }
189
196
  catch (err) {
190
- (0, dev_error_overlay_1.formatDevError)(err, normalized);
197
+ (0, error_overlay_1.formatDevError)(err, normalized);
191
198
  }
192
199
  }
193
200
  handleDelete(filePath) {
@@ -198,7 +205,7 @@ class HotReloader {
198
205
  const relative = node_path_1.default
199
206
  .relative(process.cwd(), normalized)
200
207
  .replace(/\\/g, '/');
201
- console.log(` ${c.red}-${c.reset} Removed route ${c.cyan}${relative}${c.reset} (${removed} handler${removed > 1 ? 's' : ''})`);
208
+ console.log(`${ts()} ${c.red}HMR:${c.reset} Removed route ${c.cyan}${relative}${c.reset} (${removed} handler${removed > 1 ? 's' : ''})`);
202
209
  }
203
210
  }
204
211
  invalidateCache(filePath) {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hot-reload.js","sourceRoot":"","sources":["../../src/dev/hot-reload.ts"],"names":[],"mappings":"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"}
@@ -117,7 +117,7 @@ Test coverage here is dense and correctness-focused (string/number/boolean/objec
117
117
  The framework achieves production optimizations directly within its core engine rather than relying on brittle post-processing build scripts:
118
118
 
119
119
  - **AOT Routing (O(1) Boot Time)** — During `exis build`, `manifest.ts` generates a `.exis/routes-manifest.js` file. In production, `RouteScanner` detects this manifest and uses it to load routes instantly, skipping the expensive `fs.readdir` recursive scan entirely.
120
- - **JIT Fast JSON Serialization** — During route registration at boot time, the `Router` checks if `fast-json-stringify` is installed. If a route has an ExisJS `v` response schema, the router automatically converts it to JSON Schema via `.toOpenApi()` and compiles an ultra-fast serializer Just-In-Time, attaching it to the route's response handler (`res._serializer`). This eliminates the need to precompile serializers to disk.
120
+ - **JIT Fast JSON Serialization** — During route registration at boot time, the `Router` checks if `fast-json-stringify` is installed. If a route has an ExisJS `v` response schema, the router automatically converts it to JSON Schema via `.toOpenApi()` and compiles an optimized serializer Just-In-Time, attaching it to the route's response handler (`res._serializer`). This eliminates the need to precompile serializers to disk.
121
121
 
122
122
  ---
123
123
 
@@ -129,7 +129,7 @@ The framework achieves production optimizations directly within its core engine
129
129
 
130
130
  - **Redis driver** (`queue/drivers/RedisDriver.ts`): pending jobs live in a Redis **sorted set** (`{prefix}:{name}:pending`, score = ready-at timestamp) with payloads stored separately in a **hash** (`{prefix}:{name}:payloads`). `enqueue()` uses a Lua script for atomic `ZADD` + `HSET` (with an optional max-queue-size check baked into the same script for backpressure). `poll()` atomically pops the earliest-ready job via `ZRANGEBYSCORE` + moves it to a `processing` zset with a visibility-timeout score, using another Lua script. `sweep()` periodically requeues anything left in `processing` past its visibility timeout (crash recovery for workers that died mid-job).
131
131
  - **Memory driver** (`queue/drivers/MemoryDriver.ts`): the same conceptual model (pending list, processing list, sweep-based recovery) implemented with in-process arrays instead of Redis — correctly mirrors the Redis driver's semantics for single-process/dev use.
132
- - **Job execution:** `ExisWorker` (`queue/worker.ts`) polls continuously (`setImmediate`-chained, with backoff on connection errors), and for jobs with a `filePath` (rather than an inline `handler`), dispatches execution to a `ThreadPool` (`threads/pool.ts`) — a zero-dependency `worker_threads` pool — so CPU-heavy job handlers don't block the main event loop.
132
+ - **Job execution:** `ExisWorker` (`queue/worker.ts`) polls continuously (`setImmediate`-chained, with backoff on connection errors), and for jobs with a `filePath` (rather than an inline `handler`), dispatches execution to a `ThreadPool` (`threads/pool.ts`) — a integrated `worker_threads` pool — so CPU-heavy job handlers don't block the main event loop.
133
133
 
134
134
  **Retry behavior:** on failure, `attemptsMade` increments and the job is requeued (with optional exponential/fixed backoff) if under `maxAttempts`; once attempts are exhausted, the job is moved to a dead-letter queue (`{prefix}:{name}:dead` in Redis, or a `deadLetter` list in Memory) and an `onJobFailedPermanently` hook is fired, ensuring no data is lost for permanently failed jobs.
135
135
 
@@ -170,7 +170,7 @@ The framework achieves production optimizations directly within its core engine
170
170
 
171
171
  **What it is:** An optional high-throughput backend that swaps Node's native HTTP server for `uWebSockets.js`, auto-detected if installed (or forced via `server: 'uws'` config).
172
172
 
173
- **How it's implemented:** `uws-adapter.ts` provides `UwsIncomingMessage`/`UwsServerResponse` shims that emulate the subset of Node's `IncomingMessage`/`ServerResponse` interface the rest of the framework depends on. Response writes use `res.cork()` to batch header/status/body into a single write. The shim correctly emulates asynchronous Node stream semantics (e.g., buffered `data`/`end` events delivered via microtasks for late listener registration), making it a robust and high-performance drop-in replacement.
173
+ **How it's implemented:** `uws-adapter.ts` provides `UwsIncomingMessage`/`UwsServerResponse` shims that emulate the subset of Node's `IncomingMessage`/`ServerResponse` interface the rest of the framework depends on. Response writes use `res.cork()` to batch header/status/body into a single write. The shim correctly emulates asynchronous Node stream semantics (e.g., buffered `data`/`end` events delivered via microtasks for late listener registration), making it a robust and efficient drop-in replacement.
174
174
 
175
175
  ---
176
176
 
@@ -245,7 +245,7 @@ The framework achieves production optimizations directly within its core engine
245
245
 
246
246
  ## 20. Security Middleware Suite
247
247
 
248
- Split by actual strength, not lumped together as one "Advanced Security Suite":
248
+ Split by actual strength, not lumped together as one "Security Suite":
249
249
 
250
250
  ### 20a. Solid, standard-pattern implementations 🟢
251
251
 
@@ -291,7 +291,7 @@ Split by actual strength, not lumped together as one "Advanced Security Suite":
291
291
 
292
292
  ## 24. Native Test Runner Integration 🟢
293
293
 
294
- **What it is:** A zero-dependency test runner built on `node:test`, with a custom Jest/Vitest-style terminal reporter, a Jest-compatible `expect()` assertion library, and `createTestContext()` for booting a full `App` (DI container, database connections) inside tests without mocking.
294
+ **What it is:** A integrated test runner built on `node:test`, with a custom Jest/Vitest-style terminal reporter, a Jest-compatible `expect()` assertion library, and `createTestContext()` for booting a full `App` (DI container, database connections) inside tests without mocking.
295
295
 
296
296
  **How it's implemented:** `testing/reporter.mts` consumes `node:test`'s async iterable of `TestEvent`s and renders grouped, colorized, file-scoped PASS/FAIL output with a Jest-style failure summary — genuinely nicer than raw TAP output. `testing/expect.ts` implements the common Jest matcher surface (`toBe`, `toEqual`, `toMatchObject`, `toHaveBeenCalledWith`, `resolves`/`rejects`, etc.) on top of `node:assert`. `createTestContext()` (`testing/index.ts`) wires `before`/`after` hooks that boot the app, and on teardown, correctly awaits and closes Mongoose, Redis, and Prisma connections if detected in use.
297
297
 
@@ -153,7 +153,7 @@ export default class UsersController {
153
153
  }
154
154
  ```
155
155
 
156
- ## Advanced Features
156
+ ## Extended Features
157
157
 
158
158
  ExisJS provides routing enhancements like Subdomain Routing, Redirects, and Passthrough Responses. These are supported across both paradigms.
159
159
 
@@ -65,7 +65,7 @@ This guarantees that **your cron job will only execute exactly once per minute**
65
65
 
66
66
  ## 3. Supported Cron Syntax
67
67
 
68
- ExisJS implements a zero-dependency cron parser that supports all standard operations:
68
+ ExisJS implements a integrated cron parser that supports all standard operations:
69
69
 
70
70
  - `*` - Any value (e.g., run every minute)
71
71
  - `,` - Value list (e.g., `1,15,30` to run on the 1st, 15th, and 30th minute)
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  title: "Database Layer"
3
- description: "ExisJS includes a built-in, high-performance database layer with native support for PostgreSQL, MySQL, SQLite, and MongoDB, plus a powerful query builder and migration system."
3
+ description: "ExisJS includes a built-in, efficient database layer with native support for PostgreSQL, MySQL, SQLite, and MongoDB, plus a powerful SQL-First auto-sync engine."
4
4
  ---
5
5
 
6
6
  # Database Layer
7
7
 
8
- Unlike other Node.js frameworks that rely entirely on third-party ORMs like Prisma or TypeORM, **ExisJS ships with a fully integrated, high-performance Database Layer.**
8
+ Unlike other Node.js frameworks that rely entirely on third-party ORMs like Prisma or TypeORM, **ExisJS ships with a fully integrated, efficient Database Layer.**
9
9
 
10
- This provides a massive advantage in developer experience and reliability, as connections, query generation, and migrations are orchestrated directly by the framework.
10
+ This provides a massive advantage in developer experience and reliability, as connections, query generation, schema synchronization, and migrations are orchestrated directly by the framework.
11
11
 
12
12
  <Info title="Functional vs OOP">
13
13
  ExisJS natively supports both a **Functional Paradigm** and a **Class-Based OOP Paradigm** (for dependency injection and decorators). The database layer is seamlessly accessible through both approaches.
@@ -15,19 +15,23 @@ ExisJS natively supports both a **Functional Paradigm** and a **Class-Based OOP
15
15
 
16
16
  ## Setup and Connection
17
17
 
18
- You configure your database connections directly in your application entry point (`server.ts`). ExisJS manages their lifecycle (including graceful shutdown) automatically.
19
-
20
18
  #### Functional Paradigm
21
19
  ```typescript filename="src/http/server.ts"
22
- import { exis, db, createDatabase } from 'exisjs'
20
+ import { exis } from 'exisjs'
21
+ import { createDatabase } from 'exisjs/database'
22
+ import { userTable, leadCustomerTable } from '../database/schema'
23
23
 
24
24
  export default exis({
25
25
  async onStart(app) {
26
26
  const database = createDatabase({
27
27
  dialect: 'postgres',
28
28
  url: process.env.DATABASE_URL,
29
+ autoSync: true // Enables automatic schema synchronization!
29
30
  })
30
31
 
32
+ // Register schemas for Auto-Sync
33
+ database.registerSchema([userTable, leadCustomerTable])
34
+
31
35
  // Connect on boot
32
36
  await database.connect()
33
37
  }
@@ -37,7 +41,8 @@ export default exis({
37
41
  #### Class-Based (OOP) Paradigm
38
42
  ```typescript filename="src/http/server.ts"
39
43
  import { Server } from 'exisjs/decorators'
40
- import { createDatabase } from 'exisjs'
44
+ import { createDatabase } from 'exisjs/database'
45
+ import { userTable, leadCustomerTable } from '../database/schema'
41
46
 
42
47
  @Server()
43
48
  export default class RootServer {
@@ -45,33 +50,66 @@ export default class RootServer {
45
50
  const database = createDatabase({
46
51
  dialect: 'postgres',
47
52
  url: process.env.DATABASE_URL,
53
+ autoSync: true
48
54
  })
49
55
 
50
- // Connect on boot
56
+ database.registerSchema([userTable, leadCustomerTable])
51
57
  await database.connect()
52
58
  }
53
59
  }
54
60
  ```
55
61
 
56
- ## Using the Query Builder in Routes
62
+ ## SQL-First Schema Definition
57
63
 
58
- ExisJS includes a powerful, chainable Query Builder that automatically generates the correct, parameterized SQL for your chosen dialect. Here is how you use it in your route controllers or services.
64
+ ExisJS provides a strictly-typed, modern **SQL-First Schema API**. Instead of writing raw SQL migration files, you define your tables in TypeScript. When `autoSync` is enabled, ExisJS will read these definitions, diff them against your live PostgreSQL database, and automatically run `CREATE TABLE` and `ALTER TABLE` for you!
59
65
 
60
- #### Functional Paradigm
61
- In functional routes, you can easily use the global `db` object to fetch data directly, or use the `resolve` function to inject a dedicated Service that wraps the database calls.
66
+ ```typescript filename="src/database/schema.ts"
67
+ import { table, uuid, text, jsonb, timestamptz, boolean } from 'exisjs/database/sql'
68
+
69
+ export const userTable = table('user', {
70
+ user_id: uuid('user_id').primaryKey().default('gen_random_uuid()'),
71
+ name: text('name').notNull(),
72
+ phone: text('phone').unique().notNull(),
73
+ email: text('email').unique().notNull(),
74
+ address: jsonb('address'),
75
+ date_of_birth: timestamptz('date_of_birth'),
76
+ role: text('role').notNull(),
77
+ password_hash: text('password_hash').notNull(),
78
+ created_at: timestamptz('created_at').default('NOW()')
79
+ })
80
+
81
+ export const leadCustomerTable = table('leadCustomer', {
82
+ record_id: uuid('record_id').primaryKey().default('gen_random_uuid()'),
83
+ name: text('name').notNull(),
84
+ email: text('email'),
85
+ is_customer: boolean('is_customer').default('false'),
86
+ // Perfect, strict SQL Foreign Key References!
87
+ assigned_to: uuid('assigned_to').references(() => userTable.user_id),
88
+ })
89
+ ```
90
+
91
+ ## Querying
92
+
93
+ ExisJS supports **two ways** to query your database. You can use the traditional string-based builder, or the new fully-typed SQL-First builder.
62
94
 
95
+ ### Method A: Typed SQL-First Querying (Recommended)
96
+ This method gives you 100% type safety and auto-complete for your columns.
97
+
98
+ #### Functional Paradigm
63
99
  ```typescript filename="src/http/users/route.ts"
64
100
  import { controller, route } from 'exisjs/router'
65
- import { db } from 'exisjs'
101
+ import { db } from 'exisjs/database'
102
+ import { eq } from 'exisjs/database/sql'
103
+ import { userTable } from '@/database/schema'
66
104
 
67
105
  export default controller({
68
106
  list: route.get('/', {
69
107
  async handle() {
70
- // Query multiple rows
71
- const users = await db.table('users')
72
- .select('id', 'name', 'email')
73
- .where('role', '=', 'admin')
74
- .orderBy('created_at', 'desc')
108
+ // Fully typed! Auto-complete knows userTable has name, email, etc.
109
+ const users = await db
110
+ .select(userTable.user_id.name, userTable.name.name, userTable.email.name)
111
+ .from(userTable)
112
+ .where(eq(userTable.role, 'admin'))
75
113
  .limit(10)
76
114
  .rows()
77
115
 
@@ -81,69 +119,61 @@ export default controller({
81
119
 
82
120
  create: route.post('/', {
83
121
  async handle({ req }) {
84
- const { name, email } = req.body
85
-
86
- // Insert a new row
87
- const result = await db.table('users').insert({
88
- name,
89
- email,
90
- role: 'user'
91
- }).execute()
122
+ const { name, email, phone, password_hash } = req.body
92
123
 
93
- return { id: result.insertId, name, email }
124
+ const result = await db
125
+ .insert(userTable)
126
+ .values({ name, email, phone, role: 'user', password_hash })
127
+ .returning(userTable.user_id.name)
128
+ .execute()
129
+
130
+ return { id: result.rows[0].user_id }
94
131
  }
95
132
  })
96
133
  })
97
134
  ```
98
135
 
99
136
  #### Class-Based (OOP) Paradigm
100
- In the OOP paradigm, it is highly recommended to abstract database calls into `@Injectable()` services and inject them into your `@Controller()`.
101
-
102
137
  ```typescript filename="src/http/users/service.ts"
103
138
  import { Injectable } from 'exisjs/decorators'
104
- import { db } from 'exisjs'
139
+ import { db } from 'exisjs/database'
140
+ import { eq } from 'exisjs/database/sql'
141
+ import { userTable } from '@/database/schema'
105
142
 
106
143
  @Injectable()
107
144
  export class UsersService {
108
145
  async getAdmins() {
109
- return await db.table('users')
110
- .select('id', 'name', 'email')
111
- .where('role', '=', 'admin')
112
- .orderBy('created_at', 'desc')
146
+ return await db
147
+ .select(userTable.user_id.name, userTable.name.name, userTable.email.name)
148
+ .from(userTable)
149
+ .where(eq(userTable.role, 'admin'))
113
150
  .limit(10)
114
151
  .rows()
115
152
  }
116
153
 
117
- async createUser(data: { name: string, email: string }) {
118
- const result = await db.table('users').insert({
119
- ...data,
120
- role: 'user'
121
- }).execute()
122
-
123
- return { id: result.insertId, ...data }
154
+ async createUser(data: any) {
155
+ const result = await db
156
+ .insert(userTable)
157
+ .values({ ...data, role: 'user' })
158
+ .returning(userTable.user_id.name)
159
+ .execute()
160
+
161
+ return { id: result.rows[0].user_id }
124
162
  }
125
163
  }
126
164
  ```
127
165
 
128
- ```typescript filename="src/http/users/route.ts"
129
- import { Controller, Get, Post, Body } from 'exisjs/decorators'
130
- import { UsersService } from './service'
131
-
132
- @Controller()
133
- export default class UsersController {
134
- // ExisJS automatically injects the service!
135
- constructor(private usersService: UsersService) {}
136
-
137
- @Get('/')
138
- async list() {
139
- return await this.usersService.getAdmins()
140
- }
166
+ ### Method B: String-Based Query Builder
167
+ If you don't want to define schema files, you can still use the raw string builder.
141
168
 
142
- @Post('/')
143
- async create(@Body() body: any) {
144
- return await this.usersService.createUser(body)
145
- }
146
- }
169
+ ```typescript
170
+ // Query multiple rows
171
+ const users = await db.table('users')
172
+ .select('id', 'name', 'email')
173
+ .where('role', '=', 'admin')
174
+ .orderBy('created_at', 'desc')
175
+ .limit(10)
176
+ .rows()
147
177
  ```
148
178
 
149
179
  ## Transactions
@@ -151,43 +181,36 @@ export default class UsersController {
151
181
  ExisJS makes it trivial to perform safe database transactions. If the callback throws an error, the transaction is automatically rolled back.
152
182
 
153
183
  ```typescript
154
- import { db } from 'exisjs'
184
+ import { db } from 'exisjs/database'
155
185
 
156
186
  await db.transaction(async (tx) => {
157
187
  // Deduct from inventory
158
188
  await tx.execute(
159
- 'UPDATE inventory SET stock = stock - ? WHERE id = ?',
189
+ 'UPDATE inventory SET stock = stock - $1 WHERE id = $2',
160
190
  [1, itemId]
161
191
  )
162
192
 
163
193
  // Create order record
164
194
  await tx.execute(
165
- 'INSERT INTO orders (user_id, item_id) VALUES (?, ?)',
195
+ 'INSERT INTO orders (user_id, item_id) VALUES ($1, $2)',
166
196
  [userId, itemId]
167
197
  )
168
198
  })
169
199
  ```
170
200
 
171
- ## Built-in Migrations
201
+ ## Manual Migrations (Optional)
172
202
 
173
- Managing database schema changes is critical. ExisJS includes a built-in migration system that tracks applied migrations in your database automatically.
203
+ If you prefer to write raw SQL instead of using the Auto-Sync engine, ExisJS still includes a built-in migration tracker.
174
204
 
175
205
  ```typescript
176
- import { db } from 'exisjs'
206
+ import { db } from 'exisjs/database'
177
207
 
178
208
  const migrator = db.getMigrator({ directory: './migrations' })
179
209
 
180
210
  // Apply all pending migrations
181
211
  await migrator.up()
182
-
183
- // Rollback the last batch of migrations
184
- await migrator.down()
185
-
186
- // Check the status of all migrations
187
- const status = await migrator.status()
188
212
  ```
189
213
 
190
- ### Creating a Migration
191
214
  A migration file simply exports `up` and `down` methods. You write raw SQL inside them for ultimate control.
192
215
 
193
216
  ```typescript filename="migrations/001_create_users.ts"
@@ -207,3 +230,49 @@ module.exports = {
207
230
  },
208
231
  }
209
232
  ```
233
+
234
+ ## API Reference
235
+
236
+ To maintain a clean namespace, ExisJS separates the core database manager from the SQL schema utilities.
237
+
238
+ ### Core Database (`exisjs/database`)
239
+ Imports related to connection management, raw queries, and migrations.
240
+
241
+ - `db` - The global singleton database manager.
242
+ - `createDatabase` - Factory to instantiate a new database connection.
243
+ - `DatabaseManager` - The underlying class for `db`.
244
+ - `Migrator` - The migration engine class.
245
+ - `QueryBuilder` - The base query builder class.
246
+
247
+ ### SQL-First Schema & Queries (`exisjs/database/sql`)
248
+ Imports related to defining tables, column types, and writing fluent queries.
249
+
250
+ **Table Builder:**
251
+ - `table` - Define a new SQL-first table.
252
+
253
+ **Column Types:**
254
+ - `uuid`
255
+ - `text`
256
+ - `varchar`
257
+ - `integer`
258
+ - `serial`
259
+ - `bigint`
260
+ - `numeric`
261
+ - `real`
262
+ - `boolean`
263
+ - `json`
264
+ - `jsonb`
265
+ - `timestamp`
266
+ - `timestamptz`
267
+ - `date`
268
+
269
+ **Condition Operators (for `.where()`):**
270
+ - `eq` (Equal: `=`)
271
+ - `ne` (Not Equal: `!=`)
272
+ - `gt` (Greater Than: `>`)
273
+ - `gte` (Greater Than or Equal: `>=`)
274
+ - `lt` (Less Than: `<`)
275
+ - `lte` (Less Than or Equal: `<=`)
276
+ - `isNull` (IS NULL)
277
+ - `isNotNull` (IS NOT NULL)
278
+ - `inArray` (IN)
@@ -123,7 +123,7 @@ To keep your codebase clean and consistent, use this decision tree when deciding
123
123
  4. **Is it standard 4-arg middleware from the Express ecosystem?**
124
124
  👉 **Use `app.use(errorHandler)`** (where `errorHandler = (err, req, res, next) => {}`). ExisJS supports standard Connect/Express error middleware natively.
125
125
 
126
- ## Advanced Error Handling
126
+ ## Extended Error Handling
127
127
 
128
128
  ExisJS provides mechanisms for granular error handling.
129
129
 
@@ -193,7 +193,7 @@ src/
193
193
  └── route.ts <-- Runs last (Only if both gateways succeed!)
194
194
  ```
195
195
 
196
- ## Advanced Features
196
+ ## Extended Features
197
197
 
198
198
  Gateways provide features to manage cross-cutting concerns like Exception Filters or Guards for an entire folder.
199
199
 
@@ -67,7 +67,7 @@ export default class UsersController {
67
67
  ExisJS utilizes a runtime container system. By default, ExisJS does not aggressively use `reflect-metadata` for automatic constructor injection (unlike NestJS) to maintain a minimal footprint. The `inject()` function is the primary and recommended way to resolve dependencies.
68
68
  </Info>
69
69
 
70
- ### Advanced: Manual Resolution
70
+ ### Extended: Manual Resolution
71
71
  If you are operating completely outside of an ExisJS controller or route (for example, in a background worker, CRON job, or a raw script like a database seeder), you can manually resolve dependencies as an escape hatch via the app container:
72
72
 
73
73
  ```typescript filename="scripts/seed.ts"
@@ -146,7 +146,7 @@ export default class UsersController {
146
146
  }
147
147
  ```
148
148
 
149
- ## Advanced Options
149
+ ## Extended Options
150
150
 
151
151
  When enqueuing a job, or setting `defaultOptions` in your job definitions, you can configure:
152
152
 
@@ -169,7 +169,7 @@ The in-memory driver is designed for development, testing, or simple single-node
169
169
  ### The Redis Driver (`redis`)
170
170
  Designed for horizontal scale, the Redis driver powers distributed clusters.
171
171
  - **Atomic Operations**: Uses Lua scripts (`EVAL`) to atomically pop jobs from a pending `ZSET` (sorted set) into a processing state.
172
- - **Zero-Dependency Core**: It dynamically requires `ioredis` only if used, keeping the core framework lightweight.
172
+ - **integrated Core**: It dynamically requires `ioredis` only if used, keeping the core framework lightweight.
173
173
  - **Cluster Safe**: All jobs for a specific topic map to consistent Redis hash slots.
174
174
 
175
175
  ### The Sweeper