@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 @@
1
+ {"version":3,"file":"bouncer.d.ts","sourceRoot":"","sources":["../../src/auth/bouncer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAInD,MAAM,WAAW,cAAc;IAC7B,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CAClF;AAED,MAAM,MAAM,iBAAiB,GAAG,UAAU,cAAc,CAAC;AAIzD,MAAM,WAAW,eAAe;IAC9B;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAErD;;;OAGG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC5D;AAID,qBAAa,OAAO;IAClB,OAAO,CAAC,IAAI,CAAkB;IAC9B,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,YAAY,CAAyB;IAC7C,OAAO,CAAC,KAAK,CAAC,CAAkB;IAChC,OAAO,CAAC,QAAQ,CAAqC;gBAEzC,IAAI,EAAE,QAAQ,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,eAAe;IAK1D;;OAEG;YACW,SAAS;IAUvB;;OAEG;YACW,eAAe;IAU7B;;;;;OAKG;IACU,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAM/C;;;;;OAKG;IACU,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAMrD;;;;;OAKG;IACU,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAMtD;;OAEG;IACU,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIzD;;;;;;;;;;;;;OAaG;IACU,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUlE;;;;;;OAMG;IACU,YAAY,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY3E;;;;;;;OAOG;IACU,SAAS,CACpB,WAAW,EAAE,iBAAiB,EAC9B,MAAM,EAAE,MAAM,EACd,GAAG,IAAI,EAAE,GAAG,EAAE,GACb,OAAO,CAAC,IAAI,CAAC;IAqBhB;;OAEG;IACU,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMlD;;OAEG;IACU,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAK1D;AAID,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAC,CAAkB;IAEzB,SAAS,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAKvC,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,GAAG,OAAO;CAG/C;AAED,eAAO,MAAM,cAAc,gBAAuB,CAAC;AAEnD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,UAAU,CAOjE;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,UAAU,CAS1D;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAOhE"}
@@ -0,0 +1,243 @@
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 { ForbiddenError, UnauthorizedError } from '../core/errors.js';
17
+ // ─── Bouncer Core ─────────────────────────────────────────────────────────────
18
+ export class Bouncer {
19
+ user;
20
+ _roles = null;
21
+ _permissions = null;
22
+ store;
23
+ policies = new Map();
24
+ constructor(user, store) {
25
+ this.user = user;
26
+ this.store = store;
27
+ }
28
+ /**
29
+ * Lazily loads roles from the permission store.
30
+ */
31
+ async loadRoles() {
32
+ if (this._roles !== null)
33
+ return this._roles;
34
+ if (!this.user || !this.store) {
35
+ this._roles = this.user?.role ? [this.user.role] : [];
36
+ }
37
+ else {
38
+ this._roles = await this.store.getRoles(this.user.id);
39
+ }
40
+ return this._roles;
41
+ }
42
+ /**
43
+ * Lazily loads permissions from the permission store.
44
+ */
45
+ async loadPermissions() {
46
+ if (this._permissions !== null)
47
+ return this._permissions;
48
+ if (!this.user || !this.store) {
49
+ this._permissions = [];
50
+ }
51
+ else {
52
+ this._permissions = await this.store.getPermissions(this.user.id);
53
+ }
54
+ return this._permissions;
55
+ }
56
+ /**
57
+ * Check if the authenticated user has a specific role.
58
+ *
59
+ * @example
60
+ * if (await ctx.bouncer.is('supervisor')) { ... }
61
+ */
62
+ async is(role) {
63
+ if (!this.user)
64
+ return false;
65
+ const roles = await this.loadRoles();
66
+ return roles.includes(role);
67
+ }
68
+ /**
69
+ * Check if the user has any of the given roles.
70
+ *
71
+ * @example
72
+ * if (await ctx.bouncer.isAny(['ms', 'director', 'ceo'])) { ... }
73
+ */
74
+ async isAny(roles) {
75
+ if (!this.user)
76
+ return false;
77
+ const userRoles = await this.loadRoles();
78
+ return roles.some((r) => userRoles.includes(r));
79
+ }
80
+ /**
81
+ * Check if the user has a specific permission.
82
+ *
83
+ * @example
84
+ * if (await ctx.bouncer.can('billing:refund')) { ... }
85
+ */
86
+ async can(permission) {
87
+ if (!this.user)
88
+ return false;
89
+ const permissions = await this.loadPermissions();
90
+ return permissions.includes('*') || permissions.includes(permission);
91
+ }
92
+ /**
93
+ * Check if the user CANNOT perform an action.
94
+ */
95
+ async cannot(permission) {
96
+ return !(await this.can(permission));
97
+ }
98
+ /**
99
+ * Hospital-specific: Check discount approval authority.
100
+ *
101
+ * Rules (Section 22):
102
+ * cashier → 0%
103
+ * supervisor → up to 5%
104
+ * ms → up to 15%
105
+ * director/ceo → unlimited
106
+ *
107
+ * @example
108
+ * if (!await ctx.bouncer.canApproveDiscount(12.5)) {
109
+ * ctx.throw(403, 'Discount exceeds your authority');
110
+ * }
111
+ */
112
+ async canApproveDiscount(percent) {
113
+ if (!this.user)
114
+ return false;
115
+ const roles = await this.loadRoles();
116
+ if (roles.includes('ceo') || roles.includes('director') || roles.includes('admin'))
117
+ return true;
118
+ if (roles.includes('ms') || roles.includes('medical_superintendent'))
119
+ return percent <= 15;
120
+ if (roles.includes('supervisor') || roles.includes('incharge'))
121
+ return percent <= 5;
122
+ return percent <= 0; // cashier — no discount authority
123
+ }
124
+ /**
125
+ * Hospital-specific: Check if user belongs to a specific branch.
126
+ * Enforces Section 25 — branch data scoping.
127
+ *
128
+ * @example
129
+ * await ctx.bouncer.assertBranch(patient.branchId);
130
+ */
131
+ async assertBranch(resourceBranchId) {
132
+ if (!this.user)
133
+ throw new UnauthorizedError('Not authenticated');
134
+ const roles = await this.loadRoles();
135
+ // Head office roles can see all branches
136
+ if (roles.includes('admin') || roles.includes('ceo') || roles.includes('director'))
137
+ return;
138
+ if (this.user.branchId && String(this.user.branchId) !== String(resourceBranchId)) {
139
+ throw new ForbiddenError('Access denied: resource belongs to a different branch');
140
+ }
141
+ }
142
+ /**
143
+ * Policy-based authorization.
144
+ * Instantiates the policy class and calls the named action method.
145
+ *
146
+ * @example
147
+ * await ctx.bouncer.authorize(DiscountPolicy, 'approve', discount);
148
+ * await ctx.bouncer.authorize(RefundPolicy, 'check', invoice);
149
+ */
150
+ async authorize(PolicyClass, action, ...args) {
151
+ if (!this.user)
152
+ throw new UnauthorizedError('Not authenticated');
153
+ const policyKey = PolicyClass.name;
154
+ if (!this.policies.has(policyKey)) {
155
+ this.policies.set(policyKey, new PolicyClass());
156
+ }
157
+ const policy = this.policies.get(policyKey);
158
+ const method = policy[action];
159
+ if (typeof method !== 'function') {
160
+ throw new Error(`[AeroJS Bouncer] Policy "${policyKey}" does not define action "${action}"`);
161
+ }
162
+ const allowed = await method.call(policy, this.user, ...args);
163
+ if (!allowed) {
164
+ throw new ForbiddenError(`Not authorized to perform "${action}" action`);
165
+ }
166
+ }
167
+ /**
168
+ * Throws ForbiddenError if the user does NOT have the given role.
169
+ */
170
+ async assertIs(role) {
171
+ if (!(await this.is(role))) {
172
+ throw new ForbiddenError(`Role "${role}" is required`);
173
+ }
174
+ }
175
+ /**
176
+ * Throws ForbiddenError if the user does NOT have the given permission.
177
+ */
178
+ async assertCan(permission) {
179
+ if (!(await this.can(permission))) {
180
+ throw new ForbiddenError(`Permission "${permission}" is required`);
181
+ }
182
+ }
183
+ }
184
+ // ─── Bouncer Manager ──────────────────────────────────────────────────────────
185
+ export class BouncerManager {
186
+ store;
187
+ configure(store) {
188
+ this.store = store;
189
+ return this;
190
+ }
191
+ forUser(user) {
192
+ return new Bouncer(user, this.store);
193
+ }
194
+ }
195
+ export const bouncerManager = new BouncerManager();
196
+ /**
197
+ * Middleware that attaches ctx.bouncer to every request.
198
+ * Should be placed AFTER authPlugin so ctx.auth is available.
199
+ *
200
+ * @example
201
+ * app.use(bouncerPlugin(bouncerManager));
202
+ */
203
+ export function bouncerPlugin(manager) {
204
+ return async (ctx, next) => {
205
+ const authCtx = ctx.auth;
206
+ const user = authCtx ? authCtx.user() : null;
207
+ ctx.bouncer = manager.forUser(user);
208
+ await next();
209
+ };
210
+ }
211
+ /**
212
+ * Route-level middleware to require a specific role.
213
+ *
214
+ * @example
215
+ * router.delete('/invoices/:id', handler).middleware(requireRole('supervisor'));
216
+ */
217
+ export function requireRole(...roles) {
218
+ return async (ctx, next) => {
219
+ const bouncer = ctx.bouncer;
220
+ if (!bouncer)
221
+ throw new Error('[AeroJS Bouncer] bouncerPlugin is not mounted');
222
+ if (!(await bouncer.isAny(roles))) {
223
+ throw new ForbiddenError(`Requires one of roles: ${roles.join(', ')}`);
224
+ }
225
+ await next();
226
+ };
227
+ }
228
+ /**
229
+ * Route-level middleware to require a specific permission.
230
+ *
231
+ * @example
232
+ * router.post('/billing/refund', handler).middleware(requirePermission('billing:refund'));
233
+ */
234
+ export function requirePermission(permission) {
235
+ return async (ctx, next) => {
236
+ const bouncer = ctx.bouncer;
237
+ if (!bouncer)
238
+ throw new Error('[AeroJS Bouncer] bouncerPlugin is not mounted');
239
+ await bouncer.assertCan(permission);
240
+ await next();
241
+ };
242
+ }
243
+ //# sourceMappingURL=bouncer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bouncer.js","sourceRoot":"","sources":["../../src/auth/bouncer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * @file api-token-guard.ts
3
+ * @description Database-backed API Token Authentication Guard for AeroJS.
4
+ * Tokens are stored in DB, can be revoked individually, and carry scopes.
5
+ * Hospital use: LIS analyzer integration, FHIR gateway, Corporate TPA API access.
6
+ */
7
+ import type { AeroContext } from '../../core/context.js';
8
+ import type { GuardContract, AuthUser } from './guard.js';
9
+ export interface ApiToken {
10
+ id: string | number;
11
+ userId: string | number;
12
+ token: string;
13
+ name: string;
14
+ abilities: string[];
15
+ lastUsedAt?: Date | null;
16
+ expiresAt?: Date | null;
17
+ revokedAt?: Date | null;
18
+ }
19
+ export interface ApiTokenGuardConfig {
20
+ /**
21
+ * Callback to find a token record by its hash.
22
+ */
23
+ findToken: (hashedToken: string) => Promise<ApiToken | null>;
24
+ /**
25
+ * Callback to fetch the associated user by userId.
26
+ */
27
+ findUser: (userId: string | number) => Promise<AuthUser | null>;
28
+ /**
29
+ * Callback to update last_used_at timestamp after successful auth.
30
+ */
31
+ touchToken?: (tokenId: string | number) => Promise<void>;
32
+ }
33
+ export interface GeneratedToken {
34
+ plainToken: string;
35
+ hashedToken: string;
36
+ prefix: string;
37
+ }
38
+ export declare class ApiTokenGuard implements GuardContract {
39
+ private _user;
40
+ private _token;
41
+ private _checked;
42
+ private readonly config;
43
+ private ctx;
44
+ constructor(ctx: AeroContext, config: ApiTokenGuardConfig);
45
+ user(): AuthUser | null;
46
+ token(): ApiToken | null;
47
+ check(): boolean;
48
+ /**
49
+ * Checks if the token has a specific ability/scope.
50
+ * Hospital use: ctx.auth.use('api').can('lab:write')
51
+ */
52
+ can(ability: string): boolean;
53
+ private extractToken;
54
+ /**
55
+ * Hashes a plain token using SHA-256 for secure database storage.
56
+ */
57
+ private hashToken;
58
+ authenticate(): Promise<AuthUser>;
59
+ silentCheck(): Promise<boolean>;
60
+ /**
61
+ * Generates a new plain token and its SHA-256 hash.
62
+ * Store hashedToken in DB, show plainToken once to the user.
63
+ *
64
+ * Hospital use: Generate integration token for LIS analyzer, TPA system.
65
+ */
66
+ static generate(prefix?: string): GeneratedToken;
67
+ }
68
+ //# sourceMappingURL=api-token-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-token-guard.d.ts","sourceRoot":"","sources":["../../../src/auth/guards/api-token-guard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI1D,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,SAAS,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAE7D;;OAEG;IACH,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,KAAK,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAEhE;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,aAAc,YAAW,aAAa;IACjD,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,GAAG,CAAc;gBAEb,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,mBAAmB;IAKlD,IAAI,IAAI,QAAQ,GAAG,IAAI;IAIvB,KAAK,IAAI,QAAQ,GAAG,IAAI;IAIxB,KAAK,IAAI,OAAO;IAIvB;;;OAGG;IACI,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKpC,OAAO,CAAC,YAAY;IAapB;;OAEG;IACH,OAAO,CAAC,SAAS;IAIJ,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC;IAgCjC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAS5C;;;;;OAKG;WACW,QAAQ,CAAC,MAAM,SAAU,GAAG,cAAc;CAMzD"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * @file api-token-guard.ts
3
+ * @description Database-backed API Token Authentication Guard for AeroJS.
4
+ * Tokens are stored in DB, can be revoked individually, and carry scopes.
5
+ * Hospital use: LIS analyzer integration, FHIR gateway, Corporate TPA API access.
6
+ */
7
+ import { UnauthorizedError } from '../../core/errors.js';
8
+ import crypto from 'node:crypto';
9
+ export class ApiTokenGuard {
10
+ _user = null;
11
+ _token = null;
12
+ _checked = false;
13
+ config;
14
+ ctx;
15
+ constructor(ctx, config) {
16
+ this.ctx = ctx;
17
+ this.config = config;
18
+ }
19
+ user() {
20
+ return this._user;
21
+ }
22
+ token() {
23
+ return this._token;
24
+ }
25
+ check() {
26
+ return this._user !== null;
27
+ }
28
+ /**
29
+ * Checks if the token has a specific ability/scope.
30
+ * Hospital use: ctx.auth.use('api').can('lab:write')
31
+ */
32
+ can(ability) {
33
+ if (!this._token)
34
+ return false;
35
+ return this._token.abilities.includes('*') || this._token.abilities.includes(ability);
36
+ }
37
+ extractToken() {
38
+ // Authorization: Bearer aero_xxxxx
39
+ const authHeader = this.ctx.req.get('authorization');
40
+ if (authHeader) {
41
+ const parts = authHeader.split(' ');
42
+ if (parts.length === 2 && /^Bearer$/i.test(parts[0])) {
43
+ return parts[1] ?? null;
44
+ }
45
+ }
46
+ // Fallback: X-API-Token header
47
+ return this.ctx.req.get('x-api-token') ?? null;
48
+ }
49
+ /**
50
+ * Hashes a plain token using SHA-256 for secure database storage.
51
+ */
52
+ hashToken(plain) {
53
+ return crypto.createHash('sha256').update(plain).digest('hex');
54
+ }
55
+ async authenticate() {
56
+ if (this._checked) {
57
+ if (!this._user)
58
+ throw new UnauthorizedError('Invalid API token');
59
+ return this._user;
60
+ }
61
+ this._checked = true;
62
+ const plain = this.extractToken();
63
+ if (!plain)
64
+ throw new UnauthorizedError('API token not provided');
65
+ const hashed = this.hashToken(plain);
66
+ const tokenRecord = await this.config.findToken(hashed);
67
+ if (!tokenRecord)
68
+ throw new UnauthorizedError('Invalid API token');
69
+ if (tokenRecord.revokedAt)
70
+ throw new UnauthorizedError('API token has been revoked');
71
+ if (tokenRecord.expiresAt && tokenRecord.expiresAt < new Date()) {
72
+ throw new UnauthorizedError('API token has expired');
73
+ }
74
+ const user = await this.config.findUser(tokenRecord.userId);
75
+ if (!user)
76
+ throw new UnauthorizedError('Token owner not found');
77
+ // Touch last_used_at asynchronously (fire and forget)
78
+ if (this.config.touchToken) {
79
+ this.config.touchToken(tokenRecord.id).catch(() => { });
80
+ }
81
+ this._user = user;
82
+ this._token = tokenRecord;
83
+ return user;
84
+ }
85
+ async silentCheck() {
86
+ try {
87
+ await this.authenticate();
88
+ return true;
89
+ }
90
+ catch {
91
+ return false;
92
+ }
93
+ }
94
+ /**
95
+ * Generates a new plain token and its SHA-256 hash.
96
+ * Store hashedToken in DB, show plainToken once to the user.
97
+ *
98
+ * Hospital use: Generate integration token for LIS analyzer, TPA system.
99
+ */
100
+ static generate(prefix = 'aero_') {
101
+ const random = crypto.randomBytes(40).toString('hex');
102
+ const plainToken = `${prefix}${random}`;
103
+ const hashedToken = crypto.createHash('sha256').update(plainToken).digest('hex');
104
+ return { plainToken, hashedToken, prefix };
105
+ }
106
+ }
107
+ //# sourceMappingURL=api-token-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-token-guard.js","sourceRoot":"","sources":["../../../src/auth/guards/api-token-guard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,MAAM,MAAM,aAAa,CAAC;AAoCjC,MAAM,OAAO,aAAa;IAChB,KAAK,GAAoB,IAAI,CAAC;IAC9B,MAAM,GAAoB,IAAI,CAAC;IAC/B,QAAQ,GAAG,KAAK,CAAC;IACR,MAAM,CAAsB;IACrC,GAAG,CAAc;IAEzB,YAAY,GAAgB,EAAE,MAA2B;QACvD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAEM,IAAI;QACT,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAEM,KAAK;QACV,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAEM,KAAK;QACV,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACI,GAAG,CAAC,OAAe;QACxB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC/B,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACxF,CAAC;IAEO,YAAY;QAClB,mCAAmC;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACrD,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC;gBACtD,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,+BAA+B;QAC/B,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC;IACjD,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,KAAa;QAC7B,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjE,CAAC;IAEM,KAAK,CAAC,YAAY;QACvB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;YAClE,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,iBAAiB,CAAC,wBAAwB,CAAC,CAAC;QAElE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAExD,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,iBAAiB,CAAC,mBAAmB,CAAC,CAAC;QACnE,IAAI,WAAW,CAAC,SAAS;YAAE,MAAM,IAAI,iBAAiB,CAAC,4BAA4B,CAAC,CAAC;QACrF,IAAI,WAAW,CAAC,SAAS,IAAI,WAAW,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC;YAChE,MAAM,IAAI,iBAAiB,CAAC,uBAAuB,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,iBAAiB,CAAC,uBAAuB,CAAC,CAAC;QAEhE,sDAAsD;QACtD,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,KAAK,CAAC,WAAW;QACtB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,OAAO;QACrC,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC;QACxC,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjF,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;IAC7C,CAAC;CACF"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * @file guard.ts
3
+ * @description Base Auth Guard interface and shared types for AeroJS Auth System.
4
+ * Supports Session, JWT, and API Token authentication strategies.
5
+ */
6
+ export interface AuthUser {
7
+ id: string | number;
8
+ role?: string;
9
+ branchId?: string | number;
10
+ terminalId?: string | number;
11
+ [key: string]: unknown;
12
+ }
13
+ export interface GuardContract {
14
+ /**
15
+ * Returns the currently authenticated user, or null if not authenticated.
16
+ */
17
+ user(): AuthUser | null;
18
+ /**
19
+ * Checks if a user is authenticated.
20
+ */
21
+ check(): boolean;
22
+ /**
23
+ * Returns authenticated user or throws UnauthorizedError.
24
+ */
25
+ authenticate(): Promise<AuthUser>;
26
+ /**
27
+ * Silently attempts auth without throwing — returns true/false.
28
+ */
29
+ silentCheck(): Promise<boolean>;
30
+ }
31
+ export interface LoginOptions {
32
+ remember?: boolean;
33
+ rememberDuration?: number;
34
+ }
35
+ //# sourceMappingURL=guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../../src/auth/guards/guard.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,IAAI,IAAI,QAAQ,GAAG,IAAI,CAAC;IAExB;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC;IAEjB;;OAEG;IACH,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC;IAElC;;OAEG;IACH,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @file guard.ts
3
+ * @description Base Auth Guard interface and shared types for AeroJS Auth System.
4
+ * Supports Session, JWT, and API Token authentication strategies.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.js","sourceRoot":"","sources":["../../../src/auth/guards/guard.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * @file jwt-guard.ts
3
+ * @description JWT Authentication Guard for AeroJS.
4
+ * Stateless authentication for Doctor Portal API, Mobile App, and external FHIR/HL7 integrations.
5
+ * Hospital use: Doctor's mobile ward-round app authenticates via Bearer JWT token.
6
+ */
7
+ import type { AeroContext } from '../../core/context.js';
8
+ import type { GuardContract, AuthUser } from './guard.js';
9
+ import { type JwtSignOptions } from '../../security/jwt.js';
10
+ export interface JwtGuardConfig {
11
+ /**
12
+ * Secret key for signing/verifying tokens. Use a long random string in production.
13
+ */
14
+ secret: string;
15
+ /**
16
+ * Token expiry. Default: '8h' (one hospital shift).
17
+ */
18
+ expiresIn?: string | number;
19
+ /**
20
+ * Callback to fetch user by ID (sub claim) from your database.
21
+ */
22
+ provider: (id: string | number) => Promise<AuthUser | null>;
23
+ /**
24
+ * Where to extract the token from. Default: Authorization header.
25
+ */
26
+ extractFrom?: 'header' | 'cookie' | 'query';
27
+ /**
28
+ * Cookie name if extractFrom = 'cookie'. Default: 'aero_token'.
29
+ */
30
+ cookieName?: string;
31
+ /**
32
+ * Query parameter name if extractFrom = 'query'. Default: 'token'.
33
+ */
34
+ queryParam?: string;
35
+ }
36
+ export interface JwtTokenPair {
37
+ accessToken: string;
38
+ expiresIn: number | string;
39
+ tokenType: 'Bearer';
40
+ }
41
+ export declare class JwtGuard implements GuardContract {
42
+ private _user;
43
+ private _checked;
44
+ private readonly config;
45
+ private ctx;
46
+ constructor(ctx: AeroContext, config: JwtGuardConfig);
47
+ user(): AuthUser | null;
48
+ check(): boolean;
49
+ /**
50
+ * Extracts the raw token string from the request.
51
+ */
52
+ private extractToken;
53
+ /**
54
+ * Verifies the JWT token and loads the user from the provider.
55
+ */
56
+ authenticate(): Promise<AuthUser>;
57
+ silentCheck(): Promise<boolean>;
58
+ /**
59
+ * Generates a signed JWT token pair for a user.
60
+ * Hospital use: Doctor logs in → receives { accessToken, expiresIn }.
61
+ */
62
+ generate(user: AuthUser, options?: JwtSignOptions): JwtTokenPair;
63
+ }
64
+ //# sourceMappingURL=jwt-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwt-guard.d.ts","sourceRoot":"","sources":["../../../src/auth/guards/jwt-guard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG1E,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAE5B;;OAEG;IACH,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,KAAK,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAE5D;;OAEG;IACH,WAAW,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IAE5C;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,SAAS,EAAE,QAAQ,CAAC;CACrB;AAED,qBAAa,QAAS,YAAW,aAAa;IAC5C,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,GAAG,CAAc;gBAEb,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc;IAK7C,IAAI,IAAI,QAAQ,GAAG,IAAI;IAIvB,KAAK,IAAI,OAAO;IAIvB;;OAEG;IACH,OAAO,CAAC,YAAY;IAmBpB;;OAEG;IACU,YAAY,IAAI,OAAO,CAAC,QAAQ,CAAC;IAkCjC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAS5C;;;OAGG;IACI,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,GAAE,cAAmB,GAAG,YAAY;CAmB5E"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * @file jwt-guard.ts
3
+ * @description JWT Authentication Guard for AeroJS.
4
+ * Stateless authentication for Doctor Portal API, Mobile App, and external FHIR/HL7 integrations.
5
+ * Hospital use: Doctor's mobile ward-round app authenticates via Bearer JWT token.
6
+ */
7
+ import { verify, sign } from '../../security/jwt.js';
8
+ import { UnauthorizedError } from '../../core/errors.js';
9
+ export class JwtGuard {
10
+ _user = null;
11
+ _checked = false;
12
+ config;
13
+ ctx;
14
+ constructor(ctx, config) {
15
+ this.ctx = ctx;
16
+ this.config = config;
17
+ }
18
+ user() {
19
+ return this._user;
20
+ }
21
+ check() {
22
+ return this._user !== null;
23
+ }
24
+ /**
25
+ * Extracts the raw token string from the request.
26
+ */
27
+ extractToken() {
28
+ const { extractFrom = 'header', cookieName = 'aero_token', queryParam = 'token' } = this.config;
29
+ if (extractFrom === 'cookie') {
30
+ return this.ctx.cookies[cookieName] ?? null;
31
+ }
32
+ if (extractFrom === 'query') {
33
+ return this.ctx.query[queryParam] ?? null;
34
+ }
35
+ // Default: Authorization: Bearer <token>
36
+ const authHeader = this.ctx.req.get('authorization');
37
+ if (!authHeader)
38
+ return null;
39
+ const parts = authHeader.split(' ');
40
+ if (parts.length !== 2 || !/^Bearer$/i.test(parts[0]))
41
+ return null;
42
+ return parts[1] ?? null;
43
+ }
44
+ /**
45
+ * Verifies the JWT token and loads the user from the provider.
46
+ */
47
+ async authenticate() {
48
+ if (this._checked) {
49
+ if (!this._user)
50
+ throw new UnauthorizedError('Invalid or expired token');
51
+ return this._user;
52
+ }
53
+ this._checked = true;
54
+ const token = this.extractToken();
55
+ if (!token) {
56
+ throw new UnauthorizedError('No authentication token provided');
57
+ }
58
+ let payload;
59
+ try {
60
+ payload = verify(token, this.config.secret);
61
+ }
62
+ catch (err) {
63
+ const msg = err?.name === 'TokenExpiredError' ? 'Token has expired. Please log in again.' : 'Invalid token';
64
+ throw new UnauthorizedError(msg);
65
+ }
66
+ if (!payload.sub) {
67
+ throw new UnauthorizedError('Token payload missing user identifier');
68
+ }
69
+ const user = await this.config.provider(payload.sub);
70
+ if (!user) {
71
+ throw new UnauthorizedError('Authenticated user not found');
72
+ }
73
+ this._user = user;
74
+ return user;
75
+ }
76
+ async silentCheck() {
77
+ try {
78
+ await this.authenticate();
79
+ return true;
80
+ }
81
+ catch {
82
+ return false;
83
+ }
84
+ }
85
+ /**
86
+ * Generates a signed JWT token pair for a user.
87
+ * Hospital use: Doctor logs in → receives { accessToken, expiresIn }.
88
+ */
89
+ generate(user, options = {}) {
90
+ const expiresIn = options.expiresIn ?? this.config.expiresIn ?? '8h';
91
+ const token = sign({
92
+ sub: String(user.id),
93
+ role: user.role,
94
+ branchId: user.branchId,
95
+ ...user,
96
+ }, this.config.secret, { expiresIn, ...options });
97
+ return {
98
+ accessToken: token,
99
+ expiresIn,
100
+ tokenType: 'Bearer',
101
+ };
102
+ }
103
+ }
104
+ //# sourceMappingURL=jwt-guard.js.map