@shohaghinfo/aerojs 0.1.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 (650) hide show
  1. package/AEROJS.md +12 -0
  2. package/AGENTS.md +709 -0
  3. package/LICENSE +21 -0
  4. package/README.md +1186 -0
  5. package/bin/aero.js +24 -0
  6. package/dist/application.d.ts +251 -0
  7. package/dist/application.d.ts.map +1 -0
  8. package/dist/application.js +658 -0
  9. package/dist/application.js.map +1 -0
  10. package/dist/audit/audit-trail.d.ts +122 -0
  11. package/dist/audit/audit-trail.d.ts.map +1 -0
  12. package/dist/audit/audit-trail.js +154 -0
  13. package/dist/audit/audit-trail.js.map +1 -0
  14. package/dist/auth/auth-manager.d.ts +95 -0
  15. package/dist/auth/auth-manager.d.ts.map +1 -0
  16. package/dist/auth/auth-manager.js +130 -0
  17. package/dist/auth/auth-manager.js.map +1 -0
  18. package/dist/auth/bouncer.d.ts +143 -0
  19. package/dist/auth/bouncer.d.ts.map +1 -0
  20. package/dist/auth/bouncer.js +243 -0
  21. package/dist/auth/bouncer.js.map +1 -0
  22. package/dist/auth/guards/api-token-guard.d.ts +68 -0
  23. package/dist/auth/guards/api-token-guard.d.ts.map +1 -0
  24. package/dist/auth/guards/api-token-guard.js +107 -0
  25. package/dist/auth/guards/api-token-guard.js.map +1 -0
  26. package/dist/auth/guards/guard.d.ts +35 -0
  27. package/dist/auth/guards/guard.d.ts.map +1 -0
  28. package/dist/auth/guards/guard.js +7 -0
  29. package/dist/auth/guards/guard.js.map +1 -0
  30. package/dist/auth/guards/jwt-guard.d.ts +64 -0
  31. package/dist/auth/guards/jwt-guard.d.ts.map +1 -0
  32. package/dist/auth/guards/jwt-guard.js +104 -0
  33. package/dist/auth/guards/jwt-guard.js.map +1 -0
  34. package/dist/auth/guards/session-guard.d.ts +57 -0
  35. package/dist/auth/guards/session-guard.d.ts.map +1 -0
  36. package/dist/auth/guards/session-guard.js +101 -0
  37. package/dist/auth/guards/session-guard.js.map +1 -0
  38. package/dist/auth/index.d.ts +2 -0
  39. package/dist/auth/index.d.ts.map +1 -0
  40. package/dist/auth/index.js +2 -0
  41. package/dist/auth/index.js.map +1 -0
  42. package/dist/auth/policy.d.ts +20 -0
  43. package/dist/auth/policy.d.ts.map +1 -0
  44. package/dist/auth/policy.js +49 -0
  45. package/dist/auth/policy.js.map +1 -0
  46. package/dist/body-parser.d.ts +40 -0
  47. package/dist/body-parser.d.ts.map +1 -0
  48. package/dist/body-parser.js +99 -0
  49. package/dist/body-parser.js.map +1 -0
  50. package/dist/cache/cache-driver.d.ts +43 -0
  51. package/dist/cache/cache-driver.d.ts.map +1 -0
  52. package/dist/cache/cache-driver.js +6 -0
  53. package/dist/cache/cache-driver.js.map +1 -0
  54. package/dist/cache/cache-manager.d.ts +44 -0
  55. package/dist/cache/cache-manager.d.ts.map +1 -0
  56. package/dist/cache/cache-manager.js +160 -0
  57. package/dist/cache/cache-manager.js.map +1 -0
  58. package/dist/cache/drivers/database-cache-driver.d.ts +18 -0
  59. package/dist/cache/drivers/database-cache-driver.d.ts.map +1 -0
  60. package/dist/cache/drivers/database-cache-driver.js +77 -0
  61. package/dist/cache/drivers/database-cache-driver.js.map +1 -0
  62. package/dist/cache/drivers/file-cache-driver.d.ts +21 -0
  63. package/dist/cache/drivers/file-cache-driver.d.ts.map +1 -0
  64. package/dist/cache/drivers/file-cache-driver.js +95 -0
  65. package/dist/cache/drivers/file-cache-driver.js.map +1 -0
  66. package/dist/cache/drivers/memory-cache-driver.d.ts +21 -0
  67. package/dist/cache/drivers/memory-cache-driver.d.ts.map +1 -0
  68. package/dist/cache/drivers/memory-cache-driver.js +82 -0
  69. package/dist/cache/drivers/memory-cache-driver.js.map +1 -0
  70. package/dist/cache/drivers/redis-cache-driver.d.ts +18 -0
  71. package/dist/cache/drivers/redis-cache-driver.d.ts.map +1 -0
  72. package/dist/cache/drivers/redis-cache-driver.js +95 -0
  73. package/dist/cache/drivers/redis-cache-driver.js.map +1 -0
  74. package/dist/cache/index.d.ts +7 -0
  75. package/dist/cache/index.d.ts.map +1 -0
  76. package/dist/cache/index.js +7 -0
  77. package/dist/cache/index.js.map +1 -0
  78. package/dist/cli/commands/init.d.ts +10 -0
  79. package/dist/cli/commands/init.d.ts.map +1 -0
  80. package/dist/cli/commands/init.js +471 -0
  81. package/dist/cli/commands/init.js.map +1 -0
  82. package/dist/cli/commands/make.d.ts +16 -0
  83. package/dist/cli/commands/make.d.ts.map +1 -0
  84. package/dist/cli/commands/make.js +157 -0
  85. package/dist/cli/commands/make.js.map +1 -0
  86. package/dist/cli/commands/new.d.ts +7 -0
  87. package/dist/cli/commands/new.d.ts.map +1 -0
  88. package/dist/cli/commands/new.js +175 -0
  89. package/dist/cli/commands/new.js.map +1 -0
  90. package/dist/cli/commands/vault.d.ts +7 -0
  91. package/dist/cli/commands/vault.d.ts.map +1 -0
  92. package/dist/cli/commands/vault.js +39 -0
  93. package/dist/cli/commands/vault.js.map +1 -0
  94. package/dist/cli/index.d.ts +8 -0
  95. package/dist/cli/index.d.ts.map +1 -0
  96. package/dist/cli/index.js +8 -0
  97. package/dist/cli/index.js.map +1 -0
  98. package/dist/cli/runner.d.ts +10 -0
  99. package/dist/cli/runner.d.ts.map +1 -0
  100. package/dist/cli/runner.js +207 -0
  101. package/dist/cli/runner.js.map +1 -0
  102. package/dist/cli/templates/ecommerce-erp.d.ts +6 -0
  103. package/dist/cli/templates/ecommerce-erp.d.ts.map +1 -0
  104. package/dist/cli/templates/ecommerce-erp.js +1760 -0
  105. package/dist/cli/templates/ecommerce-erp.js.map +1 -0
  106. package/dist/cli/templates/fullstack-templates.d.ts +17 -0
  107. package/dist/cli/templates/fullstack-templates.d.ts.map +1 -0
  108. package/dist/cli/templates/fullstack-templates.js +17 -0
  109. package/dist/cli/templates/fullstack-templates.js.map +1 -0
  110. package/dist/config/config.d.ts +25 -0
  111. package/dist/config/config.d.ts.map +1 -0
  112. package/dist/config/config.js +53 -0
  113. package/dist/config/config.js.map +1 -0
  114. package/dist/config/env-schema.d.ts +62 -0
  115. package/dist/config/env-schema.d.ts.map +1 -0
  116. package/dist/config/env-schema.js +203 -0
  117. package/dist/config/env-schema.js.map +1 -0
  118. package/dist/config/env.d.ts +31 -0
  119. package/dist/config/env.d.ts.map +1 -0
  120. package/dist/config/env.js +153 -0
  121. package/dist/config/env.js.map +1 -0
  122. package/dist/context.d.ts +181 -0
  123. package/dist/context.d.ts.map +1 -0
  124. package/dist/context.js +277 -0
  125. package/dist/context.js.map +1 -0
  126. package/dist/core/application-core.d.ts +79 -0
  127. package/dist/core/application-core.d.ts.map +1 -0
  128. package/dist/core/application-core.js +560 -0
  129. package/dist/core/application-core.js.map +1 -0
  130. package/dist/core/application.d.ts +121 -0
  131. package/dist/core/application.d.ts.map +1 -0
  132. package/dist/core/application.js +179 -0
  133. package/dist/core/application.js.map +1 -0
  134. package/dist/core/body-parser.d.ts +12 -0
  135. package/dist/core/body-parser.d.ts.map +1 -0
  136. package/dist/core/body-parser.js +85 -0
  137. package/dist/core/body-parser.js.map +1 -0
  138. package/dist/core/context.d.ts +94 -0
  139. package/dist/core/context.d.ts.map +1 -0
  140. package/dist/core/context.js +278 -0
  141. package/dist/core/context.js.map +1 -0
  142. package/dist/core/error-dashboard.d.ts +35 -0
  143. package/dist/core/error-dashboard.d.ts.map +1 -0
  144. package/dist/core/error-dashboard.js +481 -0
  145. package/dist/core/error-dashboard.js.map +1 -0
  146. package/dist/core/errors.d.ts +83 -0
  147. package/dist/core/errors.d.ts.map +1 -0
  148. package/dist/core/errors.js +117 -0
  149. package/dist/core/errors.js.map +1 -0
  150. package/dist/core/hooks.d.ts +39 -0
  151. package/dist/core/hooks.d.ts.map +1 -0
  152. package/dist/core/hooks.js +65 -0
  153. package/dist/core/hooks.js.map +1 -0
  154. package/dist/core/middleware.d.ts +15 -0
  155. package/dist/core/middleware.d.ts.map +1 -0
  156. package/dist/core/middleware.js +45 -0
  157. package/dist/core/middleware.js.map +1 -0
  158. package/dist/core/request.d.ts +50 -0
  159. package/dist/core/request.d.ts.map +1 -0
  160. package/dist/core/request.js +94 -0
  161. package/dist/core/request.js.map +1 -0
  162. package/dist/core/response.d.ts +49 -0
  163. package/dist/core/response.d.ts.map +1 -0
  164. package/dist/core/response.js +302 -0
  165. package/dist/core/response.js.map +1 -0
  166. package/dist/core/router.d.ts +58 -0
  167. package/dist/core/router.d.ts.map +1 -0
  168. package/dist/core/router.js +298 -0
  169. package/dist/core/router.js.map +1 -0
  170. package/dist/core/types.d.ts +70 -0
  171. package/dist/core/types.d.ts.map +1 -0
  172. package/dist/core/types.js +6 -0
  173. package/dist/core/types.js.map +1 -0
  174. package/dist/core/utils.d.ts +36 -0
  175. package/dist/core/utils.d.ts.map +1 -0
  176. package/dist/core/utils.js +108 -0
  177. package/dist/core/utils.js.map +1 -0
  178. package/dist/database/connection.d.ts +97 -0
  179. package/dist/database/connection.d.ts.map +1 -0
  180. package/dist/database/connection.js +251 -0
  181. package/dist/database/connection.js.map +1 -0
  182. package/dist/database/drizzle.d.ts +10 -0
  183. package/dist/database/drizzle.d.ts.map +1 -0
  184. package/dist/database/drizzle.js +13 -0
  185. package/dist/database/drizzle.js.map +1 -0
  186. package/dist/database/factory.d.ts +39 -0
  187. package/dist/database/factory.d.ts.map +1 -0
  188. package/dist/database/factory.js +74 -0
  189. package/dist/database/factory.js.map +1 -0
  190. package/dist/database/index.d.ts +16 -0
  191. package/dist/database/index.d.ts.map +1 -0
  192. package/dist/database/index.js +16 -0
  193. package/dist/database/index.js.map +1 -0
  194. package/dist/database/knex.d.ts +33 -0
  195. package/dist/database/knex.d.ts.map +1 -0
  196. package/dist/database/knex.js +123 -0
  197. package/dist/database/knex.js.map +1 -0
  198. package/dist/database/migrator.d.ts +29 -0
  199. package/dist/database/migrator.d.ts.map +1 -0
  200. package/dist/database/migrator.js +83 -0
  201. package/dist/database/migrator.js.map +1 -0
  202. package/dist/database/model-hooks.d.ts +61 -0
  203. package/dist/database/model-hooks.d.ts.map +1 -0
  204. package/dist/database/model-hooks.js +126 -0
  205. package/dist/database/model-hooks.js.map +1 -0
  206. package/dist/database/model.d.ts +279 -0
  207. package/dist/database/model.d.ts.map +1 -0
  208. package/dist/database/model.js +960 -0
  209. package/dist/database/model.js.map +1 -0
  210. package/dist/database/prisma.d.ts +13 -0
  211. package/dist/database/prisma.d.ts.map +1 -0
  212. package/dist/database/prisma.js +28 -0
  213. package/dist/database/prisma.js.map +1 -0
  214. package/dist/database/query-builder.d.ts +178 -0
  215. package/dist/database/query-builder.d.ts.map +1 -0
  216. package/dist/database/query-builder.js +607 -0
  217. package/dist/database/query-builder.js.map +1 -0
  218. package/dist/database/schema.d.ts +38 -0
  219. package/dist/database/schema.d.ts.map +1 -0
  220. package/dist/database/schema.js +134 -0
  221. package/dist/database/schema.js.map +1 -0
  222. package/dist/database/seeder.d.ts +24 -0
  223. package/dist/database/seeder.d.ts.map +1 -0
  224. package/dist/database/seeder.js +27 -0
  225. package/dist/database/seeder.js.map +1 -0
  226. package/dist/di/container.d.ts +52 -0
  227. package/dist/di/container.d.ts.map +1 -0
  228. package/dist/di/container.js +124 -0
  229. package/dist/di/container.js.map +1 -0
  230. package/dist/di/decorators.d.ts +17 -0
  231. package/dist/di/decorators.d.ts.map +1 -0
  232. package/dist/di/decorators.js +63 -0
  233. package/dist/di/decorators.js.map +1 -0
  234. package/dist/di/inject.d.ts +11 -0
  235. package/dist/di/inject.d.ts.map +1 -0
  236. package/dist/di/inject.js +30 -0
  237. package/dist/di/inject.js.map +1 -0
  238. package/dist/di/provider.d.ts +32 -0
  239. package/dist/di/provider.d.ts.map +1 -0
  240. package/dist/di/provider.js +30 -0
  241. package/dist/di/provider.js.map +1 -0
  242. package/dist/diagnostics/diagnostics-plugin.d.ts +9 -0
  243. package/dist/diagnostics/diagnostics-plugin.d.ts.map +1 -0
  244. package/dist/diagnostics/diagnostics-plugin.js +49 -0
  245. package/dist/diagnostics/diagnostics-plugin.js.map +1 -0
  246. package/dist/diagnostics/health-check.d.ts +51 -0
  247. package/dist/diagnostics/health-check.d.ts.map +1 -0
  248. package/dist/diagnostics/health-check.js +122 -0
  249. package/dist/diagnostics/health-check.js.map +1 -0
  250. package/dist/diagnostics/index.d.ts +4 -0
  251. package/dist/diagnostics/index.d.ts.map +1 -0
  252. package/dist/diagnostics/index.js +4 -0
  253. package/dist/diagnostics/index.js.map +1 -0
  254. package/dist/diagnostics/prometheus.d.ts +19 -0
  255. package/dist/diagnostics/prometheus.d.ts.map +1 -0
  256. package/dist/diagnostics/prometheus.js +99 -0
  257. package/dist/diagnostics/prometheus.js.map +1 -0
  258. package/dist/errors.d.ts +139 -0
  259. package/dist/errors.d.ts.map +1 -0
  260. package/dist/errors.js +173 -0
  261. package/dist/errors.js.map +1 -0
  262. package/dist/events/event-bus.d.ts +178 -0
  263. package/dist/events/event-bus.d.ts.map +1 -0
  264. package/dist/events/event-bus.js +182 -0
  265. package/dist/events/event-bus.js.map +1 -0
  266. package/dist/graphql/adapter.d.ts +48 -0
  267. package/dist/graphql/adapter.d.ts.map +1 -0
  268. package/dist/graphql/adapter.js +109 -0
  269. package/dist/graphql/adapter.js.map +1 -0
  270. package/dist/graphql/executor.d.ts +24 -0
  271. package/dist/graphql/executor.d.ts.map +1 -0
  272. package/dist/graphql/executor.js +124 -0
  273. package/dist/graphql/executor.js.map +1 -0
  274. package/dist/graphql/index.d.ts +8 -0
  275. package/dist/graphql/index.d.ts.map +1 -0
  276. package/dist/graphql/index.js +8 -0
  277. package/dist/graphql/index.js.map +1 -0
  278. package/dist/graphql/lexer.d.ts +52 -0
  279. package/dist/graphql/lexer.d.ts.map +1 -0
  280. package/dist/graphql/lexer.js +188 -0
  281. package/dist/graphql/lexer.js.map +1 -0
  282. package/dist/graphql/parser.d.ts +29 -0
  283. package/dist/graphql/parser.d.ts.map +1 -0
  284. package/dist/graphql/parser.js +206 -0
  285. package/dist/graphql/parser.js.map +1 -0
  286. package/dist/graphql/plugin.d.ts +13 -0
  287. package/dist/graphql/plugin.d.ts.map +1 -0
  288. package/dist/graphql/plugin.js +103 -0
  289. package/dist/graphql/plugin.js.map +1 -0
  290. package/dist/graphql/schema.d.ts +15 -0
  291. package/dist/graphql/schema.d.ts.map +1 -0
  292. package/dist/graphql/schema.js +17 -0
  293. package/dist/graphql/schema.js.map +1 -0
  294. package/dist/graphql/types.d.ts +65 -0
  295. package/dist/graphql/types.d.ts.map +1 -0
  296. package/dist/graphql/types.js +74 -0
  297. package/dist/graphql/types.js.map +1 -0
  298. package/dist/hooks.d.ts +67 -0
  299. package/dist/hooks.d.ts.map +1 -0
  300. package/dist/hooks.js +115 -0
  301. package/dist/hooks.js.map +1 -0
  302. package/dist/i18n/i18n.d.ts +42 -0
  303. package/dist/i18n/i18n.d.ts.map +1 -0
  304. package/dist/i18n/i18n.js +158 -0
  305. package/dist/i18n/i18n.js.map +1 -0
  306. package/dist/i18n/index.d.ts +2 -0
  307. package/dist/i18n/index.d.ts.map +1 -0
  308. package/dist/i18n/index.js +2 -0
  309. package/dist/i18n/index.js.map +1 -0
  310. package/dist/index.d.ts +75 -0
  311. package/dist/index.d.ts.map +1 -0
  312. package/dist/index.js +87 -0
  313. package/dist/index.js.map +1 -0
  314. package/dist/inertia/inertia.d.ts +62 -0
  315. package/dist/inertia/inertia.d.ts.map +1 -0
  316. package/dist/inertia/inertia.js +159 -0
  317. package/dist/inertia/inertia.js.map +1 -0
  318. package/dist/logging/index.d.ts +7 -0
  319. package/dist/logging/index.d.ts.map +1 -0
  320. package/dist/logging/index.js +7 -0
  321. package/dist/logging/index.js.map +1 -0
  322. package/dist/logging/logger.d.ts +62 -0
  323. package/dist/logging/logger.d.ts.map +1 -0
  324. package/dist/logging/logger.js +197 -0
  325. package/dist/logging/logger.js.map +1 -0
  326. package/dist/logging/request-context.d.ts +29 -0
  327. package/dist/logging/request-context.d.ts.map +1 -0
  328. package/dist/logging/request-context.js +29 -0
  329. package/dist/logging/request-context.js.map +1 -0
  330. package/dist/mail/drivers/log-mail-driver.d.ts +11 -0
  331. package/dist/mail/drivers/log-mail-driver.d.ts.map +1 -0
  332. package/dist/mail/drivers/log-mail-driver.js +23 -0
  333. package/dist/mail/drivers/log-mail-driver.js.map +1 -0
  334. package/dist/mail/drivers/mail-driver.d.ts +14 -0
  335. package/dist/mail/drivers/mail-driver.d.ts.map +1 -0
  336. package/dist/mail/drivers/mail-driver.js +6 -0
  337. package/dist/mail/drivers/mail-driver.js.map +1 -0
  338. package/dist/mail/drivers/memory-mail-driver.d.ts +14 -0
  339. package/dist/mail/drivers/memory-mail-driver.d.ts.map +1 -0
  340. package/dist/mail/drivers/memory-mail-driver.js +24 -0
  341. package/dist/mail/drivers/memory-mail-driver.js.map +1 -0
  342. package/dist/mail/index.d.ts +10 -0
  343. package/dist/mail/index.d.ts.map +1 -0
  344. package/dist/mail/index.js +10 -0
  345. package/dist/mail/index.js.map +1 -0
  346. package/dist/mail/mailer.d.ts +48 -0
  347. package/dist/mail/mailer.d.ts.map +1 -0
  348. package/dist/mail/mailer.js +111 -0
  349. package/dist/mail/mailer.js.map +1 -0
  350. package/dist/mail/message.d.ts +30 -0
  351. package/dist/mail/message.d.ts.map +1 -0
  352. package/dist/mail/message.js +77 -0
  353. package/dist/mail/message.js.map +1 -0
  354. package/dist/middleware/cors.d.ts +16 -0
  355. package/dist/middleware/cors.d.ts.map +1 -0
  356. package/dist/middleware/cors.js +76 -0
  357. package/dist/middleware/cors.js.map +1 -0
  358. package/dist/middleware.d.ts +26 -0
  359. package/dist/middleware.d.ts.map +1 -0
  360. package/dist/middleware.js +45 -0
  361. package/dist/middleware.js.map +1 -0
  362. package/dist/pdf/index.d.ts +2 -0
  363. package/dist/pdf/index.d.ts.map +1 -0
  364. package/dist/pdf/index.js +2 -0
  365. package/dist/pdf/index.js.map +1 -0
  366. package/dist/pdf/pdf.d.ts +86 -0
  367. package/dist/pdf/pdf.d.ts.map +1 -0
  368. package/dist/pdf/pdf.js +237 -0
  369. package/dist/pdf/pdf.js.map +1 -0
  370. package/dist/plugins/plugin.d.ts +25 -0
  371. package/dist/plugins/plugin.d.ts.map +1 -0
  372. package/dist/plugins/plugin.js +17 -0
  373. package/dist/plugins/plugin.js.map +1 -0
  374. package/dist/queue/drivers/database-queue-driver.d.ts +21 -0
  375. package/dist/queue/drivers/database-queue-driver.d.ts.map +1 -0
  376. package/dist/queue/drivers/database-queue-driver.js +84 -0
  377. package/dist/queue/drivers/database-queue-driver.js.map +1 -0
  378. package/dist/queue/drivers/memory-queue-driver.d.ts +17 -0
  379. package/dist/queue/drivers/memory-queue-driver.d.ts.map +1 -0
  380. package/dist/queue/drivers/memory-queue-driver.js +71 -0
  381. package/dist/queue/drivers/memory-queue-driver.js.map +1 -0
  382. package/dist/queue/drivers/queue-driver.d.ts +44 -0
  383. package/dist/queue/drivers/queue-driver.d.ts.map +1 -0
  384. package/dist/queue/drivers/queue-driver.js +6 -0
  385. package/dist/queue/drivers/queue-driver.js.map +1 -0
  386. package/dist/queue/drivers/redis-queue-driver.d.ts +16 -0
  387. package/dist/queue/drivers/redis-queue-driver.d.ts.map +1 -0
  388. package/dist/queue/drivers/redis-queue-driver.js +92 -0
  389. package/dist/queue/drivers/redis-queue-driver.js.map +1 -0
  390. package/dist/queue/index.d.ts +12 -0
  391. package/dist/queue/index.d.ts.map +1 -0
  392. package/dist/queue/index.js +12 -0
  393. package/dist/queue/index.js.map +1 -0
  394. package/dist/queue/job.d.ts +20 -0
  395. package/dist/queue/job.d.ts.map +1 -0
  396. package/dist/queue/job.js +19 -0
  397. package/dist/queue/job.js.map +1 -0
  398. package/dist/queue/queue-manager.d.ts +41 -0
  399. package/dist/queue/queue-manager.d.ts.map +1 -0
  400. package/dist/queue/queue-manager.js +98 -0
  401. package/dist/queue/queue-manager.js.map +1 -0
  402. package/dist/queue/worker.d.ts +57 -0
  403. package/dist/queue/worker.d.ts.map +1 -0
  404. package/dist/queue/worker.js +156 -0
  405. package/dist/queue/worker.js.map +1 -0
  406. package/dist/redis/index.d.ts +5 -0
  407. package/dist/redis/index.d.ts.map +1 -0
  408. package/dist/redis/index.js +5 -0
  409. package/dist/redis/index.js.map +1 -0
  410. package/dist/redis/redis-client.d.ts +44 -0
  411. package/dist/redis/redis-client.d.ts.map +1 -0
  412. package/dist/redis/redis-client.js +131 -0
  413. package/dist/redis/redis-client.js.map +1 -0
  414. package/dist/redis/redis-connection.d.ts +32 -0
  415. package/dist/redis/redis-connection.d.ts.map +1 -0
  416. package/dist/redis/redis-connection.js +151 -0
  417. package/dist/redis/redis-connection.js.map +1 -0
  418. package/dist/redis/redis-manager.d.ts +28 -0
  419. package/dist/redis/redis-manager.d.ts.map +1 -0
  420. package/dist/redis/redis-manager.js +68 -0
  421. package/dist/redis/redis-manager.js.map +1 -0
  422. package/dist/redis/resp-parser.d.ts +29 -0
  423. package/dist/redis/resp-parser.d.ts.map +1 -0
  424. package/dist/redis/resp-parser.js +113 -0
  425. package/dist/redis/resp-parser.js.map +1 -0
  426. package/dist/request.d.ts +122 -0
  427. package/dist/request.d.ts.map +1 -0
  428. package/dist/request.js +171 -0
  429. package/dist/request.js.map +1 -0
  430. package/dist/response.d.ts +208 -0
  431. package/dist/response.d.ts.map +1 -0
  432. package/dist/response.js +375 -0
  433. package/dist/response.js.map +1 -0
  434. package/dist/router.d.ts +146 -0
  435. package/dist/router.d.ts.map +1 -0
  436. package/dist/router.js +341 -0
  437. package/dist/router.js.map +1 -0
  438. package/dist/routing/controller.d.ts +18 -0
  439. package/dist/routing/controller.d.ts.map +1 -0
  440. package/dist/routing/controller.js +49 -0
  441. package/dist/routing/controller.js.map +1 -0
  442. package/dist/routing/named-middleware.d.ts +27 -0
  443. package/dist/routing/named-middleware.d.ts.map +1 -0
  444. package/dist/routing/named-middleware.js +41 -0
  445. package/dist/routing/named-middleware.js.map +1 -0
  446. package/dist/routing/route-builder.d.ts +54 -0
  447. package/dist/routing/route-builder.d.ts.map +1 -0
  448. package/dist/routing/route-builder.js +95 -0
  449. package/dist/routing/route-builder.js.map +1 -0
  450. package/dist/routing/route-group.d.ts +39 -0
  451. package/dist/routing/route-group.d.ts.map +1 -0
  452. package/dist/routing/route-group.js +79 -0
  453. package/dist/routing/route-group.js.map +1 -0
  454. package/dist/scheduler/scheduler.d.ts +85 -0
  455. package/dist/scheduler/scheduler.d.ts.map +1 -0
  456. package/dist/scheduler/scheduler.js +216 -0
  457. package/dist/scheduler/scheduler.js.map +1 -0
  458. package/dist/security/csrf.d.ts +19 -0
  459. package/dist/security/csrf.d.ts.map +1 -0
  460. package/dist/security/csrf.js +69 -0
  461. package/dist/security/csrf.js.map +1 -0
  462. package/dist/security/hash.d.ts +30 -0
  463. package/dist/security/hash.d.ts.map +1 -0
  464. package/dist/security/hash.js +86 -0
  465. package/dist/security/hash.js.map +1 -0
  466. package/dist/security/headers.d.ts +56 -0
  467. package/dist/security/headers.d.ts.map +1 -0
  468. package/dist/security/headers.js +81 -0
  469. package/dist/security/headers.js.map +1 -0
  470. package/dist/security/index.d.ts +13 -0
  471. package/dist/security/index.d.ts.map +1 -0
  472. package/dist/security/index.js +13 -0
  473. package/dist/security/index.js.map +1 -0
  474. package/dist/security/jwt.d.ts +96 -0
  475. package/dist/security/jwt.d.ts.map +1 -0
  476. package/dist/security/jwt.js +308 -0
  477. package/dist/security/jwt.js.map +1 -0
  478. package/dist/security/rate-limiter.d.ts +80 -0
  479. package/dist/security/rate-limiter.d.ts.map +1 -0
  480. package/dist/security/rate-limiter.js +127 -0
  481. package/dist/security/rate-limiter.js.map +1 -0
  482. package/dist/security/totp.d.ts +43 -0
  483. package/dist/security/totp.d.ts.map +1 -0
  484. package/dist/security/totp.js +122 -0
  485. package/dist/security/totp.js.map +1 -0
  486. package/dist/security/vault.d.ts +28 -0
  487. package/dist/security/vault.d.ts.map +1 -0
  488. package/dist/security/vault.js +73 -0
  489. package/dist/security/vault.js.map +1 -0
  490. package/dist/session/session-driver.d.ts +53 -0
  491. package/dist/session/session-driver.d.ts.map +1 -0
  492. package/dist/session/session-driver.js +132 -0
  493. package/dist/session/session-driver.js.map +1 -0
  494. package/dist/session/session-manager.d.ts +100 -0
  495. package/dist/session/session-manager.d.ts.map +1 -0
  496. package/dist/session/session-manager.js +186 -0
  497. package/dist/session/session-manager.js.map +1 -0
  498. package/dist/sse/index.d.ts +2 -0
  499. package/dist/sse/index.d.ts.map +1 -0
  500. package/dist/sse/index.js +2 -0
  501. package/dist/sse/index.js.map +1 -0
  502. package/dist/sse/sse.d.ts +32 -0
  503. package/dist/sse/sse.d.ts.map +1 -0
  504. package/dist/sse/sse.js +87 -0
  505. package/dist/sse/sse.js.map +1 -0
  506. package/dist/ssr/engine.d.ts +58 -0
  507. package/dist/ssr/engine.d.ts.map +1 -0
  508. package/dist/ssr/engine.js +121 -0
  509. package/dist/ssr/engine.js.map +1 -0
  510. package/dist/ssr/index.d.ts +6 -0
  511. package/dist/ssr/index.d.ts.map +1 -0
  512. package/dist/ssr/index.js +6 -0
  513. package/dist/ssr/index.js.map +1 -0
  514. package/dist/static/static.d.ts +22 -0
  515. package/dist/static/static.d.ts.map +1 -0
  516. package/dist/static/static.js +134 -0
  517. package/dist/static/static.js.map +1 -0
  518. package/dist/storage/chunked-uploader.d.ts +53 -0
  519. package/dist/storage/chunked-uploader.d.ts.map +1 -0
  520. package/dist/storage/chunked-uploader.js +135 -0
  521. package/dist/storage/chunked-uploader.js.map +1 -0
  522. package/dist/storage/drivers/local-driver.d.ts +25 -0
  523. package/dist/storage/drivers/local-driver.d.ts.map +1 -0
  524. package/dist/storage/drivers/local-driver.js +75 -0
  525. package/dist/storage/drivers/local-driver.js.map +1 -0
  526. package/dist/storage/drivers/memory-driver.d.ts +23 -0
  527. package/dist/storage/drivers/memory-driver.d.ts.map +1 -0
  528. package/dist/storage/drivers/memory-driver.js +55 -0
  529. package/dist/storage/drivers/memory-driver.js.map +1 -0
  530. package/dist/storage/drivers/s3-driver.d.ts +34 -0
  531. package/dist/storage/drivers/s3-driver.d.ts.map +1 -0
  532. package/dist/storage/drivers/s3-driver.js +186 -0
  533. package/dist/storage/drivers/s3-driver.js.map +1 -0
  534. package/dist/storage/drivers/storage-driver.d.ts +40 -0
  535. package/dist/storage/drivers/storage-driver.d.ts.map +1 -0
  536. package/dist/storage/drivers/storage-driver.js +6 -0
  537. package/dist/storage/drivers/storage-driver.js.map +1 -0
  538. package/dist/storage/index.d.ts +13 -0
  539. package/dist/storage/index.d.ts.map +1 -0
  540. package/dist/storage/index.js +13 -0
  541. package/dist/storage/index.js.map +1 -0
  542. package/dist/storage/multipart.d.ts +12 -0
  543. package/dist/storage/multipart.d.ts.map +1 -0
  544. package/dist/storage/multipart.js +79 -0
  545. package/dist/storage/multipart.js.map +1 -0
  546. package/dist/storage/storage-manager.d.ts +48 -0
  547. package/dist/storage/storage-manager.d.ts.map +1 -0
  548. package/dist/storage/storage-manager.js +106 -0
  549. package/dist/storage/storage-manager.js.map +1 -0
  550. package/dist/storage/uploaded-file.d.ts +40 -0
  551. package/dist/storage/uploaded-file.d.ts.map +1 -0
  552. package/dist/storage/uploaded-file.js +73 -0
  553. package/dist/storage/uploaded-file.js.map +1 -0
  554. package/dist/swagger/generator.d.ts +44 -0
  555. package/dist/swagger/generator.d.ts.map +1 -0
  556. package/dist/swagger/generator.js +117 -0
  557. package/dist/swagger/generator.js.map +1 -0
  558. package/dist/swagger/index.d.ts +8 -0
  559. package/dist/swagger/index.d.ts.map +1 -0
  560. package/dist/swagger/index.js +8 -0
  561. package/dist/swagger/index.js.map +1 -0
  562. package/dist/swagger/swagger.d.ts +9 -0
  563. package/dist/swagger/swagger.d.ts.map +1 -0
  564. package/dist/swagger/swagger.js +32 -0
  565. package/dist/swagger/swagger.js.map +1 -0
  566. package/dist/swagger/ui.d.ts +11 -0
  567. package/dist/swagger/ui.d.ts.map +1 -0
  568. package/dist/swagger/ui.js +93 -0
  569. package/dist/swagger/ui.js.map +1 -0
  570. package/dist/tcp/hl7.d.ts +19 -0
  571. package/dist/tcp/hl7.d.ts.map +1 -0
  572. package/dist/tcp/hl7.js +42 -0
  573. package/dist/tcp/hl7.js.map +1 -0
  574. package/dist/tcp/index.d.ts +4 -0
  575. package/dist/tcp/index.d.ts.map +1 -0
  576. package/dist/tcp/index.js +4 -0
  577. package/dist/tcp/index.js.map +1 -0
  578. package/dist/tcp/mllp.d.ts +22 -0
  579. package/dist/tcp/mllp.d.ts.map +1 -0
  580. package/dist/tcp/mllp.js +44 -0
  581. package/dist/tcp/mllp.js.map +1 -0
  582. package/dist/tcp/tcp-server.d.ts +20 -0
  583. package/dist/tcp/tcp-server.d.ts.map +1 -0
  584. package/dist/tcp/tcp-server.js +59 -0
  585. package/dist/tcp/tcp-server.js.map +1 -0
  586. package/dist/tenancy/index.d.ts +2 -0
  587. package/dist/tenancy/index.d.ts.map +1 -0
  588. package/dist/tenancy/index.js +2 -0
  589. package/dist/tenancy/index.js.map +1 -0
  590. package/dist/tenancy/tenant.d.ts +22 -0
  591. package/dist/tenancy/tenant.d.ts.map +1 -0
  592. package/dist/tenancy/tenant.js +32 -0
  593. package/dist/tenancy/tenant.js.map +1 -0
  594. package/dist/testing/test-client.d.ts +36 -0
  595. package/dist/testing/test-client.d.ts.map +1 -0
  596. package/dist/testing/test-client.js +128 -0
  597. package/dist/testing/test-client.js.map +1 -0
  598. package/dist/validation/index.d.ts +10 -0
  599. package/dist/validation/index.d.ts.map +1 -0
  600. package/dist/validation/index.js +10 -0
  601. package/dist/validation/index.js.map +1 -0
  602. package/dist/validation/rules-validator.d.ts +65 -0
  603. package/dist/validation/rules-validator.d.ts.map +1 -0
  604. package/dist/validation/rules-validator.js +301 -0
  605. package/dist/validation/rules-validator.js.map +1 -0
  606. package/dist/validation/schema.d.ts +34 -0
  607. package/dist/validation/schema.d.ts.map +1 -0
  608. package/dist/validation/schema.js +174 -0
  609. package/dist/validation/schema.js.map +1 -0
  610. package/dist/validation/vine.d.ts +23 -0
  611. package/dist/validation/vine.d.ts.map +1 -0
  612. package/dist/validation/vine.js +97 -0
  613. package/dist/validation/vine.js.map +1 -0
  614. package/dist/views/view.d.ts +51 -0
  615. package/dist/views/view.d.ts.map +1 -0
  616. package/dist/views/view.js +91 -0
  617. package/dist/views/view.js.map +1 -0
  618. package/dist/views/vite.d.ts +19 -0
  619. package/dist/views/vite.d.ts.map +1 -0
  620. package/dist/views/vite.js +60 -0
  621. package/dist/views/vite.js.map +1 -0
  622. package/dist/webhook/index.d.ts +2 -0
  623. package/dist/webhook/index.d.ts.map +1 -0
  624. package/dist/webhook/index.js +2 -0
  625. package/dist/webhook/index.js.map +1 -0
  626. package/dist/webhook/webhook.d.ts +30 -0
  627. package/dist/webhook/webhook.d.ts.map +1 -0
  628. package/dist/webhook/webhook.js +124 -0
  629. package/dist/webhook/webhook.js.map +1 -0
  630. package/dist/ws/broadcaster.d.ts +43 -0
  631. package/dist/ws/broadcaster.d.ts.map +1 -0
  632. package/dist/ws/broadcaster.js +81 -0
  633. package/dist/ws/broadcaster.js.map +1 -0
  634. package/dist/ws/channel.d.ts +23 -0
  635. package/dist/ws/channel.d.ts.map +1 -0
  636. package/dist/ws/channel.js +27 -0
  637. package/dist/ws/channel.js.map +1 -0
  638. package/dist/ws/index.d.ts +5 -0
  639. package/dist/ws/index.d.ts.map +1 -0
  640. package/dist/ws/index.js +5 -0
  641. package/dist/ws/index.js.map +1 -0
  642. package/dist/ws/websocket-hub.d.ts +52 -0
  643. package/dist/ws/websocket-hub.d.ts.map +1 -0
  644. package/dist/ws/websocket-hub.js +187 -0
  645. package/dist/ws/websocket-hub.js.map +1 -0
  646. package/dist/ws/websocket.d.ts +43 -0
  647. package/dist/ws/websocket.d.ts.map +1 -0
  648. package/dist/ws/websocket.js +214 -0
  649. package/dist/ws/websocket.js.map +1 -0
  650. package/package.json +141 -0
@@ -0,0 +1,122 @@
1
+ /**
2
+ * @file audit-trail.ts
3
+ * @description Immutable Audit Trail System for AeroJS.
4
+ *
5
+ * Hospital Architecture Section 38:
6
+ * "হাসপাতালের কোনো মেডিকেল ও ফিন্যান্সিয়াল ডাটা ডাটাবেস থেকে কখনো DELETE করা যাবে না।
7
+ * ভুল এন্ট্রি হলে তা STATUS = VOID বা CANCELLED হবে এবং রিভার্সাল এন্ট্রি পড়বে।"
8
+ *
9
+ * Stores: User ID, Table/Module, Record ID, Action, Old Value, New Value,
10
+ * IP Address, Timestamp, Cancellation Reason.
11
+ */
12
+ export type AuditAction = 'CREATE' | 'UPDATE' | 'VOID' | 'APPROVE' | 'REJECT' | 'PRINT' | 'LOGIN' | 'LOGOUT' | 'LOCK' | 'RESTORE' | 'EXPORT';
13
+ export interface AuditLogEntry {
14
+ userId: string | number;
15
+ userRole?: string;
16
+ module: string;
17
+ tableName?: string;
18
+ recordId: string | number;
19
+ action: AuditAction;
20
+ oldValue?: Record<string, unknown> | null;
21
+ newValue?: Record<string, unknown> | null;
22
+ reason?: string;
23
+ ipAddress?: string;
24
+ userAgent?: string;
25
+ branchId?: string | number;
26
+ metadata?: Record<string, unknown>;
27
+ }
28
+ export interface AuditLogRecord extends AuditLogEntry {
29
+ id: number;
30
+ createdAt: Date;
31
+ }
32
+ export interface AuditDriver {
33
+ log(entry: AuditLogEntry): Promise<void>;
34
+ getHistory(tableName: string, recordId: string | number): Promise<AuditLogRecord[]>;
35
+ getUserActivity(userId: string | number, from?: Date, to?: Date): Promise<AuditLogRecord[]>;
36
+ }
37
+ /**
38
+ * Database-backed audit driver.
39
+ * Requires `audit_logs` table (see migration below).
40
+ */
41
+ export declare class DatabaseAuditDriver implements AuditDriver {
42
+ private table;
43
+ constructor(table?: string);
44
+ log(entry: AuditLogEntry): Promise<void>;
45
+ getHistory(tableName: string, recordId: string | number): Promise<AuditLogRecord[]>;
46
+ getUserActivity(userId: string | number, from?: Date, to?: Date): Promise<AuditLogRecord[]>;
47
+ }
48
+ /**
49
+ * In-memory audit driver (testing only).
50
+ */
51
+ export declare class MemoryAuditDriver implements AuditDriver {
52
+ logs: (AuditLogEntry & {
53
+ id: number;
54
+ createdAt: Date;
55
+ })[];
56
+ private counter;
57
+ log(entry: AuditLogEntry): Promise<void>;
58
+ getHistory(tableName: string, recordId: string | number): Promise<AuditLogRecord[]>;
59
+ getUserActivity(userId: string | number): Promise<AuditLogRecord[]>;
60
+ }
61
+ export declare class AuditTrailManager {
62
+ private driver;
63
+ configure(driver: AuditDriver): this;
64
+ /**
65
+ * Log an audit event.
66
+ *
67
+ * @example
68
+ * await AuditTrail.log({
69
+ * userId: ctx.auth.user()!.id,
70
+ * module: 'billing',
71
+ * tableName: 'invoices',
72
+ * recordId: invoice.id,
73
+ * action: 'VOID',
74
+ * oldValue: { status: 'paid', amount: 5000 },
75
+ * newValue: { status: 'void', amount: 5000 },
76
+ * reason: 'Duplicate bill entry',
77
+ * ipAddress: ctx.req.ip,
78
+ * });
79
+ */
80
+ log(entry: AuditLogEntry): Promise<void>;
81
+ /**
82
+ * Get full history of changes for a specific record.
83
+ * Hospital use: "Who changed this invoice? Show all modifications."
84
+ */
85
+ getHistory(tableName: string, recordId: string | number): Promise<AuditLogRecord[]>;
86
+ /**
87
+ * Get all activity by a specific user in a time range.
88
+ * Hospital use: "What did cashier #42 do during the night shift?"
89
+ */
90
+ getUserActivity(userId: string | number, from?: Date, to?: Date): Promise<AuditLogRecord[]>;
91
+ }
92
+ export declare const AuditTrail: AuditTrailManager;
93
+ /**
94
+ * Migration SQL for audit_logs table.
95
+ *
96
+ * @example
97
+ * // In database/migrations/YYYY_create_audit_logs_table.ts:
98
+ * await Schema.create('audit_logs', (table) => {
99
+ * table.increments('id');
100
+ * table.string('user_id', 50).notNull();
101
+ * table.string('user_role', 50).nullable();
102
+ * table.string('module', 100).notNull();
103
+ * table.string('table_name', 100).nullable();
104
+ * table.string('record_id', 100).notNull();
105
+ * table.string('action', 30).notNull(); // CREATE, UPDATE, VOID, APPROVE...
106
+ * table.text('old_value').nullable(); // JSON serialized
107
+ * table.text('new_value').nullable(); // JSON serialized
108
+ * table.text('reason').nullable();
109
+ * table.string('ip_address', 45).nullable();
110
+ * table.string('user_agent', 500).nullable();
111
+ * table.string('branch_id', 50).nullable();
112
+ * table.text('metadata').nullable(); // JSON serialized
113
+ * table.timestamp('created_at').notNull(); // IMMUTABLE — no updated_at
114
+ * });
115
+ *
116
+ * // Add indexes for fast lookups:
117
+ * // CREATE INDEX idx_audit_table_record ON audit_logs (table_name, record_id);
118
+ * // CREATE INDEX idx_audit_user ON audit_logs (user_id, created_at);
119
+ * // CREATE INDEX idx_audit_module ON audit_logs (module, created_at);
120
+ */
121
+ export declare const AUDIT_LOGS_MIGRATION_HINT = "See JSDoc comment above for audit_logs table DDL";
122
+ //# sourceMappingURL=audit-trail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-trail.d.ts","sourceRoot":"","sources":["../../src/audit/audit-trail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * @file audit-trail.ts
3
+ * @description Immutable Audit Trail System for AeroJS.
4
+ *
5
+ * Hospital Architecture Section 38:
6
+ * "হাসপাতালের কোনো মেডিকেল ও ফিন্যান্সিয়াল ডাটা ডাটাবেস থেকে কখনো DELETE করা যাবে না।
7
+ * ভুল এন্ট্রি হলে তা STATUS = VOID বা CANCELLED হবে এবং রিভার্সাল এন্ট্রি পড়বে।"
8
+ *
9
+ * Stores: User ID, Table/Module, Record ID, Action, Old Value, New Value,
10
+ * IP Address, Timestamp, Cancellation Reason.
11
+ */
12
+ import { DB } from '../database/connection.js';
13
+ /**
14
+ * Database-backed audit driver.
15
+ * Requires `audit_logs` table (see migration below).
16
+ */
17
+ export class DatabaseAuditDriver {
18
+ table;
19
+ constructor(table = 'audit_logs') {
20
+ this.table = table;
21
+ }
22
+ async log(entry) {
23
+ await DB.table(this.table).insert({
24
+ user_id: entry.userId,
25
+ user_role: entry.userRole ?? null,
26
+ module: entry.module,
27
+ table_name: entry.tableName ?? null,
28
+ record_id: String(entry.recordId),
29
+ action: entry.action,
30
+ old_value: entry.oldValue ? JSON.stringify(entry.oldValue) : null,
31
+ new_value: entry.newValue ? JSON.stringify(entry.newValue) : null,
32
+ reason: entry.reason ?? null,
33
+ ip_address: entry.ipAddress ?? null,
34
+ user_agent: entry.userAgent ?? null,
35
+ branch_id: entry.branchId ?? null,
36
+ metadata: entry.metadata ? JSON.stringify(entry.metadata) : null,
37
+ created_at: new Date(),
38
+ });
39
+ }
40
+ async getHistory(tableName, recordId) {
41
+ return await DB.table(this.table)
42
+ .where('table_name', tableName)
43
+ .where('record_id', String(recordId))
44
+ .orderBy('created_at', 'DESC')
45
+ .get();
46
+ }
47
+ async getUserActivity(userId, from, to) {
48
+ let qb = DB.table(this.table).where('user_id', userId);
49
+ if (from)
50
+ qb = qb.where('created_at', '>=', from);
51
+ if (to)
52
+ qb = qb.where('created_at', '<=', to);
53
+ return await qb.orderBy('created_at', 'DESC').get();
54
+ }
55
+ }
56
+ /**
57
+ * In-memory audit driver (testing only).
58
+ */
59
+ export class MemoryAuditDriver {
60
+ logs = [];
61
+ counter = 0;
62
+ async log(entry) {
63
+ this.logs.push({ ...entry, id: ++this.counter, createdAt: new Date() });
64
+ }
65
+ async getHistory(tableName, recordId) {
66
+ return this.logs
67
+ .filter((l) => l.tableName === tableName && String(l.recordId) === String(recordId))
68
+ .reverse();
69
+ }
70
+ async getUserActivity(userId) {
71
+ return this.logs
72
+ .filter((l) => String(l.userId) === String(userId))
73
+ .reverse();
74
+ }
75
+ }
76
+ // ─── AuditTrail Facade ────────────────────────────────────────────────────────
77
+ export class AuditTrailManager {
78
+ driver = new MemoryAuditDriver();
79
+ configure(driver) {
80
+ this.driver = driver;
81
+ return this;
82
+ }
83
+ /**
84
+ * Log an audit event.
85
+ *
86
+ * @example
87
+ * await AuditTrail.log({
88
+ * userId: ctx.auth.user()!.id,
89
+ * module: 'billing',
90
+ * tableName: 'invoices',
91
+ * recordId: invoice.id,
92
+ * action: 'VOID',
93
+ * oldValue: { status: 'paid', amount: 5000 },
94
+ * newValue: { status: 'void', amount: 5000 },
95
+ * reason: 'Duplicate bill entry',
96
+ * ipAddress: ctx.req.ip,
97
+ * });
98
+ */
99
+ async log(entry) {
100
+ try {
101
+ await this.driver.log(entry);
102
+ }
103
+ catch (err) {
104
+ // Audit failures should NEVER crash the application
105
+ console.error('[AeroJS AuditTrail] Failed to write audit log:', err);
106
+ }
107
+ }
108
+ /**
109
+ * Get full history of changes for a specific record.
110
+ * Hospital use: "Who changed this invoice? Show all modifications."
111
+ */
112
+ async getHistory(tableName, recordId) {
113
+ return await this.driver.getHistory(tableName, recordId);
114
+ }
115
+ /**
116
+ * Get all activity by a specific user in a time range.
117
+ * Hospital use: "What did cashier #42 do during the night shift?"
118
+ */
119
+ async getUserActivity(userId, from, to) {
120
+ return await this.driver.getUserActivity(userId, from, to);
121
+ }
122
+ }
123
+ export const AuditTrail = new AuditTrailManager();
124
+ // ─── Auditable Model Mixin ────────────────────────────────────────────────────
125
+ /**
126
+ * Migration SQL for audit_logs table.
127
+ *
128
+ * @example
129
+ * // In database/migrations/YYYY_create_audit_logs_table.ts:
130
+ * await Schema.create('audit_logs', (table) => {
131
+ * table.increments('id');
132
+ * table.string('user_id', 50).notNull();
133
+ * table.string('user_role', 50).nullable();
134
+ * table.string('module', 100).notNull();
135
+ * table.string('table_name', 100).nullable();
136
+ * table.string('record_id', 100).notNull();
137
+ * table.string('action', 30).notNull(); // CREATE, UPDATE, VOID, APPROVE...
138
+ * table.text('old_value').nullable(); // JSON serialized
139
+ * table.text('new_value').nullable(); // JSON serialized
140
+ * table.text('reason').nullable();
141
+ * table.string('ip_address', 45).nullable();
142
+ * table.string('user_agent', 500).nullable();
143
+ * table.string('branch_id', 50).nullable();
144
+ * table.text('metadata').nullable(); // JSON serialized
145
+ * table.timestamp('created_at').notNull(); // IMMUTABLE — no updated_at
146
+ * });
147
+ *
148
+ * // Add indexes for fast lookups:
149
+ * // CREATE INDEX idx_audit_table_record ON audit_logs (table_name, record_id);
150
+ * // CREATE INDEX idx_audit_user ON audit_logs (user_id, created_at);
151
+ * // CREATE INDEX idx_audit_module ON audit_logs (module, created_at);
152
+ */
153
+ export const AUDIT_LOGS_MIGRATION_HINT = 'See JSDoc comment above for audit_logs table DDL';
154
+ //# sourceMappingURL=audit-trail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit-trail.js","sourceRoot":"","sources":["../../src/audit/audit-trail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * @file auth-manager.ts
3
+ * @description Central Auth Manager for AeroJS.
4
+ * Manages multiple named guards (session, jwt, api) and exposes ctx.auth.use('guard').
5
+ * Hospital use: ctx.auth.use('session') for cashiers, ctx.auth.use('jwt') for doctors.
6
+ */
7
+ import type { AeroContext } from '../core/context.js';
8
+ import type { AuthUser } from './guards/guard.js';
9
+ import { type SessionGuardConfig } from './guards/session-guard.js';
10
+ import { type JwtGuardConfig } from './guards/jwt-guard.js';
11
+ import { type ApiTokenGuardConfig } from './guards/api-token-guard.js';
12
+ import type { SessionManager } from '../session/session-manager.js';
13
+ import type { Middleware } from '../core/types.js';
14
+ export type GuardDriverName = 'session' | 'jwt' | 'api';
15
+ export type GuardDriverConfig = {
16
+ driver: 'session';
17
+ config: SessionGuardConfig;
18
+ } | {
19
+ driver: 'jwt';
20
+ config: JwtGuardConfig;
21
+ } | {
22
+ driver: 'api';
23
+ config: ApiTokenGuardConfig;
24
+ };
25
+ export interface AuthConfig {
26
+ /**
27
+ * Default guard to use when calling ctx.auth.use() with no arguments.
28
+ */
29
+ default?: string;
30
+ /**
31
+ * Named guard definitions.
32
+ */
33
+ guards: Record<string, GuardDriverConfig>;
34
+ }
35
+ /**
36
+ * Per-request Auth Manager — attached to ctx.auth by authPlugin.
37
+ */
38
+ export declare class Auth {
39
+ private guards;
40
+ private defaultGuardName;
41
+ private config;
42
+ private ctx;
43
+ private sessionManager?;
44
+ constructor(ctx: AeroContext, config: AuthConfig, sessionManager?: SessionManager);
45
+ /**
46
+ * Returns the named guard instance (or default if name is omitted).
47
+ * Guards are lazily instantiated per request.
48
+ *
49
+ * @example
50
+ * // Cashier session auth
51
+ * await ctx.auth.use('session').authenticate();
52
+ *
53
+ * // Doctor JWT auth
54
+ * const user = await ctx.auth.use('jwt').authenticate();
55
+ */
56
+ use(name?: string): any;
57
+ /**
58
+ * Returns the authenticated user from the default guard, or null.
59
+ */
60
+ user(): AuthUser | null;
61
+ /**
62
+ * Checks if the current user is authenticated on the default guard.
63
+ */
64
+ check(): boolean;
65
+ }
66
+ /**
67
+ * Global Auth Manager — stores config for the application lifetime.
68
+ */
69
+ export declare class AuthManager {
70
+ private config;
71
+ configure(config: AuthConfig): this;
72
+ /**
73
+ * Creates a per-request Auth instance bound to the given context.
74
+ */
75
+ forContext(ctx: AeroContext, sessionManager?: SessionManager): Auth;
76
+ }
77
+ export declare const authManager: AuthManager;
78
+ /**
79
+ * Middleware factory that attaches ctx.auth to every request.
80
+ * Must be registered early in the middleware chain.
81
+ *
82
+ * @example
83
+ * app.use(authPlugin(authManager, sessionManager));
84
+ */
85
+ export declare function authPlugin(manager: AuthManager, sessionManager?: SessionManager): Middleware;
86
+ /**
87
+ * Route-level middleware factory — protects a route for a specific guard.
88
+ * Throws UnauthorizedError if not authenticated.
89
+ *
90
+ * @example
91
+ * router.get('/cashier/dashboard', handler).middleware(auth('session'));
92
+ * router.get('/api/doctor/patients', handler).middleware(auth('jwt'));
93
+ */
94
+ export declare function auth(guardName?: string): Middleware;
95
+ //# sourceMappingURL=auth-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-manager.d.ts","sourceRoot":"","sources":["../../src/auth/auth-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAiB,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAgB,KAAK,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAClF,OAAO,EAAY,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,KAAK,GAAG,KAAK,CAAC;AAExD,MAAM,MAAM,iBAAiB,GACzB;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAA;CAAE,GACjD;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAE,GACzC;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,mBAAmB,CAAA;CAAE,CAAC;AAEnD,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CAC3C;AAED;;GAEG;AACH,qBAAa,IAAI;IACf,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,GAAG,CAAc;IACzB,OAAO,CAAC,cAAc,CAAC,CAAiB;gBAE5B,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,CAAC,EAAE,cAAc;IAOjF;;;;;;;;;;OAUG;IACI,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,GAAG;IAuC9B;;OAEG;IACI,IAAI,IAAI,QAAQ,GAAG,IAAI;IAI9B;;OAEG;IACI,KAAK,IAAI,OAAO;CAGxB;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAA8B;IAErC,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAK1C;;OAEG;IACI,UAAU,CAAC,GAAG,EAAE,WAAW,EAAE,cAAc,CAAC,EAAE,cAAc,GAAG,IAAI;CAG3E;AAED,eAAO,MAAM,WAAW,aAAoB,CAAC;AAE7C;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,cAAc,CAAC,EAAE,cAAc,GAAG,UAAU,CAK5F;AAED;;;;;;;GAOG;AACH,wBAAgB,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU,CAQnD"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * @file auth-manager.ts
3
+ * @description Central Auth Manager for AeroJS.
4
+ * Manages multiple named guards (session, jwt, api) and exposes ctx.auth.use('guard').
5
+ * Hospital use: ctx.auth.use('session') for cashiers, ctx.auth.use('jwt') for doctors.
6
+ */
7
+ import { SessionGuard } from './guards/session-guard.js';
8
+ import { JwtGuard } from './guards/jwt-guard.js';
9
+ import { ApiTokenGuard } from './guards/api-token-guard.js';
10
+ import { UnauthorizedError, ForbiddenError } from '../core/errors.js';
11
+ /**
12
+ * Per-request Auth Manager — attached to ctx.auth by authPlugin.
13
+ */
14
+ export class Auth {
15
+ guards = new Map();
16
+ defaultGuardName;
17
+ config;
18
+ ctx;
19
+ sessionManager;
20
+ constructor(ctx, config, sessionManager) {
21
+ this.ctx = ctx;
22
+ this.config = config;
23
+ this.defaultGuardName = config.default ?? Object.keys(config.guards)[0] ?? 'session';
24
+ this.sessionManager = sessionManager;
25
+ }
26
+ /**
27
+ * Returns the named guard instance (or default if name is omitted).
28
+ * Guards are lazily instantiated per request.
29
+ *
30
+ * @example
31
+ * // Cashier session auth
32
+ * await ctx.auth.use('session').authenticate();
33
+ *
34
+ * // Doctor JWT auth
35
+ * const user = await ctx.auth.use('jwt').authenticate();
36
+ */
37
+ use(name) {
38
+ const guardName = name ?? this.defaultGuardName;
39
+ if (this.guards.has(guardName)) {
40
+ return this.guards.get(guardName);
41
+ }
42
+ const guardDef = this.config.guards[guardName];
43
+ if (!guardDef) {
44
+ throw new Error(`[AeroJS Auth] Guard "${guardName}" is not configured.`);
45
+ }
46
+ let guard;
47
+ switch (guardDef.driver) {
48
+ case 'session': {
49
+ if (!this.sessionManager) {
50
+ throw new Error('[AeroJS Auth] Session guard requires a SessionManager. Did you call app.useSession()?');
51
+ }
52
+ guard = new SessionGuard(this.ctx, this.sessionManager, guardDef.config);
53
+ break;
54
+ }
55
+ case 'jwt': {
56
+ guard = new JwtGuard(this.ctx, guardDef.config);
57
+ break;
58
+ }
59
+ case 'api': {
60
+ guard = new ApiTokenGuard(this.ctx, guardDef.config);
61
+ break;
62
+ }
63
+ default: {
64
+ throw new Error(`[AeroJS Auth] Unknown guard driver: ${guardDef.driver}`);
65
+ }
66
+ }
67
+ this.guards.set(guardName, guard);
68
+ return guard;
69
+ }
70
+ /**
71
+ * Returns the authenticated user from the default guard, or null.
72
+ */
73
+ user() {
74
+ return this.use().user();
75
+ }
76
+ /**
77
+ * Checks if the current user is authenticated on the default guard.
78
+ */
79
+ check() {
80
+ return this.use().check();
81
+ }
82
+ }
83
+ /**
84
+ * Global Auth Manager — stores config for the application lifetime.
85
+ */
86
+ export class AuthManager {
87
+ config = { guards: {} };
88
+ configure(config) {
89
+ this.config = config;
90
+ return this;
91
+ }
92
+ /**
93
+ * Creates a per-request Auth instance bound to the given context.
94
+ */
95
+ forContext(ctx, sessionManager) {
96
+ return new Auth(ctx, this.config, sessionManager);
97
+ }
98
+ }
99
+ export const authManager = new AuthManager();
100
+ /**
101
+ * Middleware factory that attaches ctx.auth to every request.
102
+ * Must be registered early in the middleware chain.
103
+ *
104
+ * @example
105
+ * app.use(authPlugin(authManager, sessionManager));
106
+ */
107
+ export function authPlugin(manager, sessionManager) {
108
+ return async (ctx, next) => {
109
+ ctx.auth = manager.forContext(ctx, sessionManager);
110
+ await next();
111
+ };
112
+ }
113
+ /**
114
+ * Route-level middleware factory — protects a route for a specific guard.
115
+ * Throws UnauthorizedError if not authenticated.
116
+ *
117
+ * @example
118
+ * router.get('/cashier/dashboard', handler).middleware(auth('session'));
119
+ * router.get('/api/doctor/patients', handler).middleware(auth('jwt'));
120
+ */
121
+ export function auth(guardName) {
122
+ return async (ctx, next) => {
123
+ const authCtx = ctx.auth;
124
+ if (!authCtx)
125
+ throw new Error('[AeroJS Auth] authPlugin middleware is not mounted. Add app.use(authPlugin(...))');
126
+ await authCtx.use(guardName).authenticate();
127
+ await next();
128
+ };
129
+ }
130
+ //# sourceMappingURL=auth-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-manager.js","sourceRoot":"","sources":["../../src/auth/auth-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * @file bouncer.ts
3
+ * @description RBAC Authorization Engine (Bouncer Pattern) for AeroJS.
4
+ *
5
+ * Supports:
6
+ * - Role-based checks: ctx.bouncer.is('admin')
7
+ * - Ability checks: ctx.bouncer.can('billing:approve-discount')
8
+ * - Policy-based authorization: ctx.bouncer.authorize(DiscountPolicy, 'approve', discount)
9
+ * - Data-scoped checks: enforcing branch-level data isolation
10
+ *
11
+ * Hospital use:
12
+ * - Section 22: Discount approval matrix (cashier 0%, supervisor 5%, MS 15%, CEO any)
13
+ * - Section 37: Maker-Checker dual control for refunds, POs, supplier payments
14
+ * - Section 25: Branch-scoped data access (operator sees only own branch)
15
+ */
16
+ import type { AuthUser } from '../auth/guards/guard.js';
17
+ import type { Middleware } from '../core/types.js';
18
+ export interface PolicyContract {
19
+ [action: string]: (user: AuthUser, ...args: any[]) => Promise<boolean> | boolean;
20
+ }
21
+ export type PolicyConstructor = new () => PolicyContract;
22
+ export interface PermissionStore {
23
+ /**
24
+ * Returns all roles for a given user ID.
25
+ * Example: ['cashier', 'ipd_operator']
26
+ */
27
+ getRoles(userId: string | number): Promise<string[]>;
28
+ /**
29
+ * Returns all permission strings for a given user ID.
30
+ * Example: ['billing:view', 'billing:create', 'discount:approve:5']
31
+ */
32
+ getPermissions(userId: string | number): Promise<string[]>;
33
+ }
34
+ export declare class Bouncer {
35
+ private user;
36
+ private _roles;
37
+ private _permissions;
38
+ private store?;
39
+ private policies;
40
+ constructor(user: AuthUser | null, store?: PermissionStore);
41
+ /**
42
+ * Lazily loads roles from the permission store.
43
+ */
44
+ private loadRoles;
45
+ /**
46
+ * Lazily loads permissions from the permission store.
47
+ */
48
+ private loadPermissions;
49
+ /**
50
+ * Check if the authenticated user has a specific role.
51
+ *
52
+ * @example
53
+ * if (await ctx.bouncer.is('supervisor')) { ... }
54
+ */
55
+ is(role: string): Promise<boolean>;
56
+ /**
57
+ * Check if the user has any of the given roles.
58
+ *
59
+ * @example
60
+ * if (await ctx.bouncer.isAny(['ms', 'director', 'ceo'])) { ... }
61
+ */
62
+ isAny(roles: string[]): Promise<boolean>;
63
+ /**
64
+ * Check if the user has a specific permission.
65
+ *
66
+ * @example
67
+ * if (await ctx.bouncer.can('billing:refund')) { ... }
68
+ */
69
+ can(permission: string): Promise<boolean>;
70
+ /**
71
+ * Check if the user CANNOT perform an action.
72
+ */
73
+ cannot(permission: string): Promise<boolean>;
74
+ /**
75
+ * Hospital-specific: Check discount approval authority.
76
+ *
77
+ * Rules (Section 22):
78
+ * cashier → 0%
79
+ * supervisor → up to 5%
80
+ * ms → up to 15%
81
+ * director/ceo → unlimited
82
+ *
83
+ * @example
84
+ * if (!await ctx.bouncer.canApproveDiscount(12.5)) {
85
+ * ctx.throw(403, 'Discount exceeds your authority');
86
+ * }
87
+ */
88
+ canApproveDiscount(percent: number): Promise<boolean>;
89
+ /**
90
+ * Hospital-specific: Check if user belongs to a specific branch.
91
+ * Enforces Section 25 — branch data scoping.
92
+ *
93
+ * @example
94
+ * await ctx.bouncer.assertBranch(patient.branchId);
95
+ */
96
+ assertBranch(resourceBranchId: string | number): Promise<void>;
97
+ /**
98
+ * Policy-based authorization.
99
+ * Instantiates the policy class and calls the named action method.
100
+ *
101
+ * @example
102
+ * await ctx.bouncer.authorize(DiscountPolicy, 'approve', discount);
103
+ * await ctx.bouncer.authorize(RefundPolicy, 'check', invoice);
104
+ */
105
+ authorize(PolicyClass: PolicyConstructor, action: string, ...args: any[]): Promise<void>;
106
+ /**
107
+ * Throws ForbiddenError if the user does NOT have the given role.
108
+ */
109
+ assertIs(role: string): Promise<void>;
110
+ /**
111
+ * Throws ForbiddenError if the user does NOT have the given permission.
112
+ */
113
+ assertCan(permission: string): Promise<void>;
114
+ }
115
+ export declare class BouncerManager {
116
+ private store?;
117
+ configure(store: PermissionStore): this;
118
+ forUser(user: AuthUser | null): Bouncer;
119
+ }
120
+ export declare const bouncerManager: BouncerManager;
121
+ /**
122
+ * Middleware that attaches ctx.bouncer to every request.
123
+ * Should be placed AFTER authPlugin so ctx.auth is available.
124
+ *
125
+ * @example
126
+ * app.use(bouncerPlugin(bouncerManager));
127
+ */
128
+ export declare function bouncerPlugin(manager: BouncerManager): Middleware;
129
+ /**
130
+ * Route-level middleware to require a specific role.
131
+ *
132
+ * @example
133
+ * router.delete('/invoices/:id', handler).middleware(requireRole('supervisor'));
134
+ */
135
+ export declare function requireRole(...roles: string[]): Middleware;
136
+ /**
137
+ * Route-level middleware to require a specific permission.
138
+ *
139
+ * @example
140
+ * router.post('/billing/refund', handler).middleware(requirePermission('billing:refund'));
141
+ */
142
+ export declare function requirePermission(permission: string): Middleware;
143
+ //# sourceMappingURL=bouncer.d.ts.map