alepha 0.13.6 → 0.13.8

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 (487) hide show
  1. package/README.md +5 -2
  2. package/assets/swagger-ui/swagger-ui-bundle.js +1 -1
  3. package/assets/swagger-ui/swagger-ui-standalone-preset.js +1 -1
  4. package/assets/swagger-ui/swagger-ui.css +1 -1
  5. package/dist/api/audits/index.browser.js +116 -0
  6. package/dist/api/audits/index.browser.js.map +1 -0
  7. package/dist/api/audits/index.d.ts +1194 -0
  8. package/dist/api/audits/index.js +674 -0
  9. package/dist/api/audits/index.js.map +1 -0
  10. package/dist/{api-files → api/files}/index.browser.js +5 -5
  11. package/dist/api/files/index.browser.js.map +1 -0
  12. package/dist/{api-files → api/files}/index.d.ts +16 -9
  13. package/dist/{api-files → api/files}/index.js +10 -10
  14. package/dist/api/files/index.js.map +1 -0
  15. package/dist/{api-jobs → api/jobs}/index.browser.js +5 -5
  16. package/dist/api/jobs/index.browser.js.map +1 -0
  17. package/dist/{api-jobs → api/jobs}/index.d.ts +35 -35
  18. package/dist/{api-jobs → api/jobs}/index.js +9 -9
  19. package/dist/api/jobs/index.js.map +1 -0
  20. package/dist/{api-notifications → api/notifications}/index.browser.js +11 -11
  21. package/dist/api/notifications/index.browser.js.map +1 -0
  22. package/dist/api/notifications/index.d.ts +327 -0
  23. package/dist/{api-notifications → api/notifications}/index.js +11 -11
  24. package/dist/api/notifications/index.js.map +1 -0
  25. package/dist/api/parameters/index.browser.js +60 -0
  26. package/dist/api/parameters/index.browser.js.map +1 -0
  27. package/dist/api/parameters/index.d.ts +761 -0
  28. package/dist/api/parameters/index.js +877 -0
  29. package/dist/api/parameters/index.js.map +1 -0
  30. package/dist/{api-users → api/users}/index.browser.js +6 -6
  31. package/dist/api/users/index.browser.js.map +1 -0
  32. package/dist/{api-users → api/users}/index.d.ts +259 -247
  33. package/dist/{api-users → api/users}/index.js +125 -112
  34. package/dist/api/users/index.js.map +1 -0
  35. package/dist/{api-verifications → api/verifications}/index.browser.js +5 -5
  36. package/dist/api/verifications/index.browser.js.map +1 -0
  37. package/dist/api/verifications/index.d.ts +248 -0
  38. package/dist/{api-verifications → api/verifications}/index.js +13 -12
  39. package/dist/api/verifications/index.js.map +1 -0
  40. package/dist/bin/index.js +1 -0
  41. package/dist/bin/index.js.map +1 -1
  42. package/dist/cache/{index.d.ts → core/index.d.ts} +4 -4
  43. package/dist/cache/{index.js → core/index.js} +5 -5
  44. package/dist/cache/core/index.js.map +1 -0
  45. package/dist/{cache-redis → cache/redis}/index.d.ts +2 -2
  46. package/dist/{cache-redis → cache/redis}/index.js +2 -2
  47. package/dist/cache/redis/index.js.map +1 -0
  48. package/dist/cli/index.d.ts +71 -9
  49. package/dist/cli/index.js +280 -79
  50. package/dist/cli/index.js.map +1 -1
  51. package/dist/command/index.d.ts +63 -2
  52. package/dist/command/index.js +30 -3
  53. package/dist/command/index.js.map +1 -1
  54. package/dist/core/index.browser.js +241 -61
  55. package/dist/core/index.browser.js.map +1 -1
  56. package/dist/core/index.d.ts +170 -90
  57. package/dist/core/index.js +264 -67
  58. package/dist/core/index.js.map +1 -1
  59. package/dist/core/index.native.js +248 -65
  60. package/dist/core/index.native.js.map +1 -1
  61. package/dist/email/index.js +15 -10554
  62. package/dist/email/index.js.map +1 -1
  63. package/dist/lock/{index.d.ts → core/index.d.ts} +5 -5
  64. package/dist/lock/{index.js → core/index.js} +5 -5
  65. package/dist/lock/core/index.js.map +1 -0
  66. package/dist/{lock-redis → lock/redis}/index.d.ts +2 -2
  67. package/dist/{lock-redis → lock/redis}/index.js +2 -2
  68. package/dist/lock/redis/index.js.map +1 -0
  69. package/dist/logger/index.d.ts +4 -4
  70. package/dist/logger/index.js +77 -72
  71. package/dist/logger/index.js.map +1 -1
  72. package/dist/orm/index.d.ts +5 -1
  73. package/dist/orm/index.js +24 -7
  74. package/dist/orm/index.js.map +1 -1
  75. package/dist/queue/core/index.d.ts +548 -0
  76. package/dist/queue/core/index.js +391 -0
  77. package/dist/queue/core/index.js.map +1 -0
  78. package/dist/queue/redis/index.d.ts +28 -0
  79. package/dist/queue/redis/index.js +43 -0
  80. package/dist/queue/redis/index.js.map +1 -0
  81. package/dist/scheduler/index.d.ts +7 -7
  82. package/dist/scheduler/index.js +1 -393
  83. package/dist/scheduler/index.js.map +1 -1
  84. package/dist/security/index.d.ts +1 -1
  85. package/dist/security/index.js +2 -1413
  86. package/dist/security/index.js.map +1 -1
  87. package/dist/{server-auth → server/auth}/index.browser.js +6 -6
  88. package/dist/server/auth/index.browser.js.map +1 -0
  89. package/dist/{server-auth → server/auth}/index.d.ts +175 -164
  90. package/dist/server/auth/index.js +742 -0
  91. package/dist/server/auth/index.js.map +1 -0
  92. package/dist/{server-cache → server/cache}/index.d.ts +2 -2
  93. package/dist/{server-cache → server/cache}/index.js +2 -2
  94. package/dist/server/cache/index.js.map +1 -0
  95. package/dist/{server-compress → server/compress}/index.d.ts +2 -2
  96. package/dist/{server-compress → server/compress}/index.js +2 -2
  97. package/dist/server/compress/index.js.map +1 -0
  98. package/dist/{server-cookies → server/cookies}/index.browser.js +3 -3
  99. package/dist/server/cookies/index.browser.js.map +1 -0
  100. package/dist/{server-cookies → server/cookies}/index.d.ts +4 -4
  101. package/dist/{server-cookies → server/cookies}/index.js +9 -5
  102. package/dist/server/cookies/index.js.map +1 -0
  103. package/dist/server/{index.browser.js → core/index.browser.js} +14 -14
  104. package/dist/server/core/index.browser.js.map +1 -0
  105. package/dist/server/{index.d.ts → core/index.d.ts} +46 -37
  106. package/dist/server/{index.js → core/index.js} +47 -33
  107. package/dist/server/core/index.js.map +1 -0
  108. package/dist/{server-cors → server/cors}/index.d.ts +3 -3
  109. package/dist/{server-cors → server/cors}/index.js +3 -3
  110. package/dist/server/cors/index.js.map +1 -0
  111. package/dist/{server-health → server/health}/index.d.ts +3 -3
  112. package/dist/{server-health → server/health}/index.js +3 -3
  113. package/dist/server/health/index.js.map +1 -0
  114. package/dist/{server-helmet → server/helmet}/index.d.ts +2 -2
  115. package/dist/{server-helmet → server/helmet}/index.js +2 -2
  116. package/dist/server/helmet/index.js.map +1 -0
  117. package/dist/{server-links → server/links}/index.browser.js +5 -5
  118. package/dist/server/links/index.browser.js.map +1 -0
  119. package/dist/{server-links → server/links}/index.d.ts +40 -40
  120. package/dist/{server-links → server/links}/index.js +7 -7
  121. package/dist/server/links/index.js.map +1 -0
  122. package/dist/{server-metrics → server/metrics}/index.d.ts +2 -2
  123. package/dist/server/metrics/index.js +74 -0
  124. package/dist/server/metrics/index.js.map +1 -0
  125. package/dist/{server-multipart → server/multipart}/index.d.ts +2 -2
  126. package/dist/{server-multipart → server/multipart}/index.js +2 -2
  127. package/dist/server/multipart/index.js.map +1 -0
  128. package/dist/{server-proxy → server/proxy}/index.d.ts +3 -3
  129. package/dist/{server-proxy → server/proxy}/index.js +3 -3
  130. package/dist/server/proxy/index.js.map +1 -0
  131. package/dist/{server-rate-limit → server/rate-limit}/index.d.ts +4 -4
  132. package/dist/{server-rate-limit → server/rate-limit}/index.js +4 -4
  133. package/dist/server/rate-limit/index.js.map +1 -0
  134. package/dist/{server-security → server/security}/index.browser.js +1 -1
  135. package/dist/server/security/index.browser.js.map +1 -0
  136. package/dist/{server-security → server/security}/index.d.ts +4 -4
  137. package/dist/{server-security → server/security}/index.js +4 -4
  138. package/dist/server/security/index.js.map +1 -0
  139. package/dist/{server-static → server/static}/index.d.ts +3 -3
  140. package/dist/{server-static → server/static}/index.js +3 -3
  141. package/dist/server/static/index.js.map +1 -0
  142. package/dist/{server-swagger → server/swagger}/index.d.ts +3 -3
  143. package/dist/{server-swagger → server/swagger}/index.js +4 -4
  144. package/dist/server/swagger/index.js.map +1 -0
  145. package/dist/thread/index.js +2 -2
  146. package/dist/thread/index.js.map +1 -1
  147. package/dist/topic/{index.d.ts → core/index.d.ts} +6 -6
  148. package/dist/topic/{index.js → core/index.js} +6 -6
  149. package/dist/topic/core/index.js.map +1 -0
  150. package/dist/{topic-redis → topic/redis}/index.d.ts +2 -2
  151. package/dist/{topic-redis → topic/redis}/index.js +2 -2
  152. package/dist/topic/redis/index.js.map +1 -0
  153. package/dist/vite/index.d.ts +13 -2
  154. package/dist/vite/index.js +114 -50
  155. package/dist/vite/index.js.map +1 -1
  156. package/dist/websocket/index.browser.js +3 -3
  157. package/dist/websocket/index.browser.js.map +1 -1
  158. package/dist/websocket/index.js +4 -4
  159. package/dist/websocket/index.js.map +1 -1
  160. package/package.json +160 -156
  161. package/src/api/audits/controllers/AuditController.ts +186 -0
  162. package/src/api/audits/entities/audits.ts +132 -0
  163. package/src/api/audits/index.browser.ts +18 -0
  164. package/src/api/audits/index.ts +58 -0
  165. package/src/api/audits/primitives/$audit.ts +159 -0
  166. package/src/api/audits/schemas/auditQuerySchema.ts +23 -0
  167. package/src/api/audits/schemas/auditResourceSchema.ts +9 -0
  168. package/src/api/audits/schemas/createAuditSchema.ts +27 -0
  169. package/src/api/audits/services/AuditService.ts +412 -0
  170. package/src/{api-files → api/files}/index.ts +1 -0
  171. package/src/api/parameters/controllers/ConfigController.ts +324 -0
  172. package/src/api/parameters/entities/parameters.ts +113 -0
  173. package/src/api/parameters/index.ts +60 -0
  174. package/src/api/parameters/primitives/$config.ts +351 -0
  175. package/src/api/parameters/schedulers/ConfigActivationScheduler.ts +30 -0
  176. package/src/api/parameters/services/ConfigStore.ts +491 -0
  177. package/src/{api-users → api/users}/atoms/realmAuthSettingsAtom.ts +19 -0
  178. package/src/{api-users → api/users}/controllers/UserRealmController.ts +0 -2
  179. package/src/{api-users → api/users}/index.ts +2 -0
  180. package/src/{api-users → api/users}/primitives/$userRealm.ts +18 -3
  181. package/src/{api-users → api/users}/providers/UserRealmProvider.ts +12 -10
  182. package/src/{api-users → api/users}/services/RegistrationService.ts +2 -1
  183. package/src/{api-users → api/users}/services/SessionService.ts +4 -0
  184. package/src/{api-users → api/users}/services/UserService.ts +3 -0
  185. package/src/{api-verifications → api/verifications}/index.ts +9 -1
  186. package/src/bin/index.ts +1 -0
  187. package/src/cli/apps/AlephaPackageBuilderCli.ts +73 -48
  188. package/src/cli/assets/appRouterTs.ts +1 -1
  189. package/src/cli/assets/biomeJson.ts +2 -2
  190. package/src/cli/assets/dummySpecTs.ts +7 -0
  191. package/src/cli/assets/editorconfig.ts +13 -0
  192. package/src/cli/assets/indexHtml.ts +1 -1
  193. package/src/cli/assets/mainBrowserTs.ts +1 -1
  194. package/src/cli/assets/mainTs.ts +14 -0
  195. package/src/cli/assets/viteConfigTs.ts +1 -1
  196. package/src/cli/commands/BiomeCommands.ts +2 -0
  197. package/src/cli/commands/CoreCommands.ts +38 -15
  198. package/src/cli/commands/VerifyCommands.ts +6 -2
  199. package/src/cli/commands/ViteCommands.ts +28 -18
  200. package/src/cli/services/AlephaCliUtils.ts +243 -37
  201. package/src/command/helpers/Asker.ts +0 -1
  202. package/src/command/primitives/$command.ts +67 -0
  203. package/src/command/providers/CliProvider.ts +39 -8
  204. package/src/core/Alepha.ts +40 -30
  205. package/src/core/helpers/jsonSchemaToTypeBox.ts +307 -0
  206. package/src/core/index.shared.ts +1 -0
  207. package/src/core/index.ts +30 -3
  208. package/src/core/providers/EventManager.ts +1 -1
  209. package/src/core/providers/SchemaValidator.ts +1 -1
  210. package/src/core/providers/StateManager.ts +23 -12
  211. package/src/core/providers/TypeProvider.ts +26 -34
  212. package/src/logger/index.ts +8 -6
  213. package/src/logger/primitives/$logger.ts +1 -1
  214. package/src/logger/providers/{SimpleFormatterProvider.ts → PrettyFormatterProvider.ts} +10 -1
  215. package/src/orm/index.ts +6 -0
  216. package/src/orm/services/PgRelationManager.ts +2 -2
  217. package/src/orm/services/PostgresModelBuilder.ts +11 -7
  218. package/src/orm/services/Repository.ts +16 -7
  219. package/src/orm/services/SqliteModelBuilder.ts +10 -0
  220. package/src/queue/{index.ts → core/index.ts} +2 -3
  221. package/src/queue/{primitives → core/primitives}/$queue.ts +17 -162
  222. package/src/queue/core/providers/MemoryQueueProvider.ts +19 -0
  223. package/src/queue/core/providers/QueueProvider.ts +23 -0
  224. package/src/queue/core/providers/WorkerProvider.ts +244 -0
  225. package/src/queue/redis/providers/RedisQueueProvider.ts +31 -0
  226. package/src/{server-auth → server/auth}/primitives/$auth.ts +7 -0
  227. package/src/{server-auth → server/auth}/providers/ServerAuthProvider.ts +51 -8
  228. package/src/{server-cookies → server/cookies}/index.ts +2 -1
  229. package/src/server/{index.ts → core/index.ts} +7 -0
  230. package/src/server/{primitives → core/primitives}/$action.ts +10 -1
  231. package/src/server/{providers → core/providers}/ServerBodyParserProvider.ts +11 -5
  232. package/src/server/{providers → core/providers}/ServerRouterProvider.ts +13 -7
  233. package/src/{server-rate-limit → server/rate-limit}/index.ts +1 -1
  234. package/src/{server-swagger → server/swagger}/providers/ServerSwaggerProvider.ts +1 -0
  235. package/src/thread/primitives/$thread.ts +2 -2
  236. package/src/vite/index.ts +0 -2
  237. package/src/vite/tasks/buildServer.ts +3 -4
  238. package/src/vite/tasks/copyAssets.ts +32 -8
  239. package/src/vite/tasks/generateCloudflare.ts +35 -19
  240. package/src/vite/tasks/generateDocker.ts +18 -4
  241. package/src/vite/tasks/generateSitemap.ts +5 -7
  242. package/src/vite/tasks/generateVercel.ts +76 -41
  243. package/src/vite/tasks/runAlepha.ts +16 -1
  244. package/src/websocket/providers/NodeWebSocketServerProvider.ts +3 -11
  245. package/src/websocket/services/WebSocketClient.ts +3 -3
  246. package/dist/api-files/index.browser.js.map +0 -1
  247. package/dist/api-files/index.js.map +0 -1
  248. package/dist/api-jobs/index.browser.js.map +0 -1
  249. package/dist/api-jobs/index.js.map +0 -1
  250. package/dist/api-notifications/index.browser.js.map +0 -1
  251. package/dist/api-notifications/index.d.ts +0 -327
  252. package/dist/api-notifications/index.js.map +0 -1
  253. package/dist/api-parameters/index.browser.js +0 -29
  254. package/dist/api-parameters/index.browser.js.map +0 -1
  255. package/dist/api-parameters/index.d.ts +0 -83
  256. package/dist/api-parameters/index.js +0 -63
  257. package/dist/api-parameters/index.js.map +0 -1
  258. package/dist/api-users/index.browser.js.map +0 -1
  259. package/dist/api-users/index.js.map +0 -1
  260. package/dist/api-verifications/index.browser.js.map +0 -1
  261. package/dist/api-verifications/index.d.ts +0 -229
  262. package/dist/api-verifications/index.js.map +0 -1
  263. package/dist/cache/index.js.map +0 -1
  264. package/dist/cache-redis/index.js.map +0 -1
  265. package/dist/cli/dist-BlfFtOk2.js +0 -2770
  266. package/dist/cli/dist-BlfFtOk2.js.map +0 -1
  267. package/dist/lock/index.js.map +0 -1
  268. package/dist/lock-redis/index.js.map +0 -1
  269. package/dist/queue/index.d.ts +0 -1265
  270. package/dist/queue/index.js +0 -1037
  271. package/dist/queue/index.js.map +0 -1
  272. package/dist/queue-redis/index.d.ts +0 -82
  273. package/dist/queue-redis/index.js +0 -872
  274. package/dist/queue-redis/index.js.map +0 -1
  275. package/dist/server/index.browser.js.map +0 -1
  276. package/dist/server/index.js.map +0 -1
  277. package/dist/server-auth/index.browser.js.map +0 -1
  278. package/dist/server-auth/index.js +0 -1943
  279. package/dist/server-auth/index.js.map +0 -1
  280. package/dist/server-cache/index.js.map +0 -1
  281. package/dist/server-compress/index.js.map +0 -1
  282. package/dist/server-cookies/index.browser.js.map +0 -1
  283. package/dist/server-cookies/index.js.map +0 -1
  284. package/dist/server-cors/index.js.map +0 -1
  285. package/dist/server-health/index.js.map +0 -1
  286. package/dist/server-helmet/index.js.map +0 -1
  287. package/dist/server-links/index.browser.js.map +0 -1
  288. package/dist/server-links/index.js.map +0 -1
  289. package/dist/server-metrics/index.js +0 -4532
  290. package/dist/server-metrics/index.js.map +0 -1
  291. package/dist/server-multipart/index.js.map +0 -1
  292. package/dist/server-proxy/index.js.map +0 -1
  293. package/dist/server-rate-limit/index.js.map +0 -1
  294. package/dist/server-security/index.browser.js.map +0 -1
  295. package/dist/server-security/index.js.map +0 -1
  296. package/dist/server-static/index.js.map +0 -1
  297. package/dist/server-swagger/index.js.map +0 -1
  298. package/dist/topic/index.js.map +0 -1
  299. package/dist/topic-redis/index.js.map +0 -1
  300. package/src/api-parameters/controllers/ParameterController.ts +0 -45
  301. package/src/api-parameters/entities/parameters.ts +0 -30
  302. package/src/api-parameters/index.ts +0 -21
  303. package/src/api-parameters/primitives/$config.ts +0 -79
  304. package/src/api-parameters/services/ParameterStore.ts +0 -23
  305. package/src/queue/interfaces/QueueJob.ts +0 -459
  306. package/src/queue/providers/MemoryQueueProvider.ts +0 -850
  307. package/src/queue/providers/QueueProvider.ts +0 -319
  308. package/src/queue/providers/WorkerProvider.ts +0 -344
  309. package/src/queue-redis/providers/RedisQueueProvider.ts +0 -1209
  310. /package/src/{api-files → api/files}/controllers/FileController.ts +0 -0
  311. /package/src/{api-files → api/files}/controllers/StorageStatsController.ts +0 -0
  312. /package/src/{api-files → api/files}/entities/files.ts +0 -0
  313. /package/src/{api-files → api/files}/index.browser.ts +0 -0
  314. /package/src/{api-files → api/files}/jobs/FileJobs.ts +0 -0
  315. /package/src/{api-files → api/files}/schemas/fileQuerySchema.ts +0 -0
  316. /package/src/{api-files → api/files}/schemas/fileResourceSchema.ts +0 -0
  317. /package/src/{api-files → api/files}/schemas/storageStatsSchema.ts +0 -0
  318. /package/src/{api-files → api/files}/services/FileService.ts +0 -0
  319. /package/src/{api-jobs → api/jobs}/controllers/JobController.ts +0 -0
  320. /package/src/{api-jobs → api/jobs}/entities/jobExecutions.ts +0 -0
  321. /package/src/{api-jobs → api/jobs}/index.browser.ts +0 -0
  322. /package/src/{api-jobs → api/jobs}/index.ts +0 -0
  323. /package/src/{api-jobs → api/jobs}/primitives/$job.ts +0 -0
  324. /package/src/{api-jobs → api/jobs}/providers/JobProvider.ts +0 -0
  325. /package/src/{api-jobs → api/jobs}/schemas/jobExecutionQuerySchema.ts +0 -0
  326. /package/src/{api-jobs → api/jobs}/schemas/jobExecutionResourceSchema.ts +0 -0
  327. /package/src/{api-jobs → api/jobs}/schemas/triggerJobSchema.ts +0 -0
  328. /package/src/{api-jobs → api/jobs}/services/JobService.ts +0 -0
  329. /package/src/{api-notifications → api/notifications}/controllers/NotificationController.ts +0 -0
  330. /package/src/{api-notifications → api/notifications}/entities/notifications.ts +0 -0
  331. /package/src/{api-notifications → api/notifications}/index.browser.ts +0 -0
  332. /package/src/{api-notifications → api/notifications}/index.ts +0 -0
  333. /package/src/{api-notifications → api/notifications}/jobs/NotificationJobs.ts +0 -0
  334. /package/src/{api-notifications → api/notifications}/primitives/$notification.ts +0 -0
  335. /package/src/{api-notifications → api/notifications}/queues/NotificationQueues.ts +0 -0
  336. /package/src/{api-notifications → api/notifications}/schemas/notificationContactPreferencesSchema.ts +0 -0
  337. /package/src/{api-notifications → api/notifications}/schemas/notificationContactSchema.ts +0 -0
  338. /package/src/{api-notifications → api/notifications}/schemas/notificationCreateSchema.ts +0 -0
  339. /package/src/{api-notifications → api/notifications}/schemas/notificationQuerySchema.ts +0 -0
  340. /package/src/{api-notifications → api/notifications}/services/NotificationSenderService.ts +0 -0
  341. /package/src/{api-notifications → api/notifications}/services/NotificationService.ts +0 -0
  342. /package/src/{api-parameters → api/parameters}/index.browser.ts +0 -0
  343. /package/src/{api-users → api/users}/controllers/IdentityController.ts +0 -0
  344. /package/src/{api-users → api/users}/controllers/SessionController.ts +0 -0
  345. /package/src/{api-users → api/users}/controllers/UserController.ts +0 -0
  346. /package/src/{api-users → api/users}/entities/identities.ts +0 -0
  347. /package/src/{api-users → api/users}/entities/sessions.ts +0 -0
  348. /package/src/{api-users → api/users}/entities/users.ts +0 -0
  349. /package/src/{api-users → api/users}/index.browser.ts +0 -0
  350. /package/src/{api-users → api/users}/notifications/UserNotifications.ts +0 -0
  351. /package/src/{api-users → api/users}/schemas/completePasswordResetRequestSchema.ts +0 -0
  352. /package/src/{api-users → api/users}/schemas/completeRegistrationRequestSchema.ts +0 -0
  353. /package/src/{api-users → api/users}/schemas/createUserSchema.ts +0 -0
  354. /package/src/{api-users → api/users}/schemas/identityQuerySchema.ts +0 -0
  355. /package/src/{api-users → api/users}/schemas/identityResourceSchema.ts +0 -0
  356. /package/src/{api-users → api/users}/schemas/loginSchema.ts +0 -0
  357. /package/src/{api-users → api/users}/schemas/passwordResetIntentResponseSchema.ts +0 -0
  358. /package/src/{api-users → api/users}/schemas/registerQuerySchema.ts +0 -0
  359. /package/src/{api-users → api/users}/schemas/registerRequestSchema.ts +0 -0
  360. /package/src/{api-users → api/users}/schemas/registerResponseSchema.ts +0 -0
  361. /package/src/{api-users → api/users}/schemas/registerSchema.ts +0 -0
  362. /package/src/{api-users → api/users}/schemas/registrationIntentResponseSchema.ts +0 -0
  363. /package/src/{api-users → api/users}/schemas/resetPasswordSchema.ts +0 -0
  364. /package/src/{api-users → api/users}/schemas/sessionQuerySchema.ts +0 -0
  365. /package/src/{api-users → api/users}/schemas/sessionResourceSchema.ts +0 -0
  366. /package/src/{api-users → api/users}/schemas/updateUserSchema.ts +0 -0
  367. /package/src/{api-users → api/users}/schemas/userQuerySchema.ts +0 -0
  368. /package/src/{api-users → api/users}/schemas/userRealmConfigSchema.ts +0 -0
  369. /package/src/{api-users → api/users}/schemas/userResourceSchema.ts +0 -0
  370. /package/src/{api-users → api/users}/services/CredentialService.ts +0 -0
  371. /package/src/{api-users → api/users}/services/IdentityService.ts +0 -0
  372. /package/src/{api-users → api/users}/services/SessionCrudService.ts +0 -0
  373. /package/src/{api-verifications → api/verifications}/controllers/VerificationController.ts +0 -0
  374. /package/src/{api-verifications → api/verifications}/entities/verifications.ts +0 -0
  375. /package/src/{api-verifications → api/verifications}/index.browser.ts +0 -0
  376. /package/src/{api-verifications → api/verifications}/jobs/VerificationJobs.ts +0 -0
  377. /package/src/{api-verifications → api/verifications}/parameters/VerificationParameters.ts +0 -0
  378. /package/src/{api-verifications → api/verifications}/schemas/requestVerificationCodeResponseSchema.ts +0 -0
  379. /package/src/{api-verifications → api/verifications}/schemas/validateVerificationCodeResponseSchema.ts +0 -0
  380. /package/src/{api-verifications → api/verifications}/schemas/verificationSettingsSchema.ts +0 -0
  381. /package/src/{api-verifications → api/verifications}/schemas/verificationTypeEnumSchema.ts +0 -0
  382. /package/src/{api-verifications → api/verifications}/services/VerificationService.ts +0 -0
  383. /package/src/cache/{errors → core/errors}/CacheError.ts +0 -0
  384. /package/src/cache/{index.ts → core/index.ts} +0 -0
  385. /package/src/cache/{primitives → core/primitives}/$cache.ts +0 -0
  386. /package/src/cache/{providers → core/providers}/CacheProvider.ts +0 -0
  387. /package/src/cache/{providers → core/providers}/MemoryCacheProvider.ts +0 -0
  388. /package/src/{cache-redis → cache/redis}/index.ts +0 -0
  389. /package/src/{cache-redis → cache/redis}/providers/RedisCacheProvider.ts +0 -0
  390. /package/src/lock/{index.ts → core/index.ts} +0 -0
  391. /package/src/lock/{primitives → core/primitives}/$lock.ts +0 -0
  392. /package/src/lock/{providers → core/providers}/LockProvider.ts +0 -0
  393. /package/src/lock/{providers → core/providers}/LockTopicProvider.ts +0 -0
  394. /package/src/lock/{providers → core/providers}/MemoryLockProvider.ts +0 -0
  395. /package/src/{lock-redis → lock/redis}/index.ts +0 -0
  396. /package/src/{lock-redis → lock/redis}/providers/RedisLockProvider.ts +0 -0
  397. /package/src/queue/{primitives → core/primitives}/$consumer.ts +0 -0
  398. /package/src/{queue-redis → queue/redis}/index.ts +0 -0
  399. /package/src/{server-auth → server/auth}/constants/routes.ts +0 -0
  400. /package/src/{server-auth → server/auth}/index.browser.ts +0 -0
  401. /package/src/{server-auth → server/auth}/index.shared.ts +0 -0
  402. /package/src/{server-auth → server/auth}/index.ts +0 -0
  403. /package/src/{server-auth → server/auth}/primitives/$authApple.ts +0 -0
  404. /package/src/{server-auth → server/auth}/primitives/$authCredentials.ts +0 -0
  405. /package/src/{server-auth → server/auth}/primitives/$authGithub.ts +0 -0
  406. /package/src/{server-auth → server/auth}/primitives/$authGoogle.ts +0 -0
  407. /package/src/{server-auth → server/auth}/schemas/authenticationProviderSchema.ts +0 -0
  408. /package/src/{server-auth → server/auth}/schemas/tokenResponseSchema.ts +0 -0
  409. /package/src/{server-auth → server/auth}/schemas/tokensSchema.ts +0 -0
  410. /package/src/{server-auth → server/auth}/schemas/userinfoResponseSchema.ts +0 -0
  411. /package/src/{server-cache → server/cache}/index.ts +0 -0
  412. /package/src/{server-cache → server/cache}/providers/ServerCacheProvider.ts +0 -0
  413. /package/src/{server-compress → server/compress}/index.ts +0 -0
  414. /package/src/{server-compress → server/compress}/providers/ServerCompressProvider.ts +0 -0
  415. /package/src/{server-cookies → server/cookies}/index.browser.ts +0 -0
  416. /package/src/{server-cookies → server/cookies}/primitives/$cookie.browser.ts +0 -0
  417. /package/src/{server-cookies → server/cookies}/primitives/$cookie.ts +0 -0
  418. /package/src/{server-cookies → server/cookies}/providers/ServerCookiesProvider.ts +0 -0
  419. /package/src/{server-cookies → server/cookies}/services/CookieParser.ts +0 -0
  420. /package/src/server/{constants → core/constants}/routeMethods.ts +0 -0
  421. /package/src/server/{errors → core/errors}/BadRequestError.ts +0 -0
  422. /package/src/server/{errors → core/errors}/ConflictError.ts +0 -0
  423. /package/src/server/{errors → core/errors}/ForbiddenError.ts +0 -0
  424. /package/src/server/{errors → core/errors}/HttpError.ts +0 -0
  425. /package/src/server/{errors → core/errors}/NotFoundError.ts +0 -0
  426. /package/src/server/{errors → core/errors}/UnauthorizedError.ts +0 -0
  427. /package/src/server/{errors → core/errors}/ValidationError.ts +0 -0
  428. /package/src/server/{helpers → core/helpers}/ServerReply.ts +0 -0
  429. /package/src/server/{helpers → core/helpers}/isMultipart.ts +0 -0
  430. /package/src/server/{index.browser.ts → core/index.browser.ts} +0 -0
  431. /package/src/server/{index.shared.ts → core/index.shared.ts} +0 -0
  432. /package/src/server/{interfaces → core/interfaces}/ServerRequest.ts +0 -0
  433. /package/src/server/{primitives → core/primitives}/$route.ts +0 -0
  434. /package/src/server/{providers → core/providers}/BunHttpServerProvider.ts +0 -0
  435. /package/src/server/{providers → core/providers}/NodeHttpServerProvider.ts +0 -0
  436. /package/src/server/{providers → core/providers}/ServerLoggerProvider.ts +0 -0
  437. /package/src/server/{providers → core/providers}/ServerNotReadyProvider.ts +0 -0
  438. /package/src/server/{providers → core/providers}/ServerProvider.ts +0 -0
  439. /package/src/server/{providers → core/providers}/ServerTimingProvider.ts +0 -0
  440. /package/src/server/{schemas → core/schemas}/errorSchema.ts +0 -0
  441. /package/src/server/{schemas → core/schemas}/okSchema.ts +0 -0
  442. /package/src/server/{services → core/services}/HttpClient.ts +0 -0
  443. /package/src/server/{services → core/services}/ServerRequestParser.ts +0 -0
  444. /package/src/server/{services → core/services}/UserAgentParser.ts +0 -0
  445. /package/src/{server-cors → server/cors}/index.ts +0 -0
  446. /package/src/{server-cors → server/cors}/primitives/$cors.ts +0 -0
  447. /package/src/{server-cors → server/cors}/providers/ServerCorsProvider.ts +0 -0
  448. /package/src/{server-health → server/health}/index.ts +0 -0
  449. /package/src/{server-health → server/health}/providers/ServerHealthProvider.ts +0 -0
  450. /package/src/{server-health → server/health}/schemas/healthSchema.ts +0 -0
  451. /package/src/{server-helmet → server/helmet}/index.ts +0 -0
  452. /package/src/{server-helmet → server/helmet}/providers/ServerHelmetProvider.ts +0 -0
  453. /package/src/{server-links → server/links}/index.browser.ts +0 -0
  454. /package/src/{server-links → server/links}/index.ts +0 -0
  455. /package/src/{server-links → server/links}/primitives/$client.ts +0 -0
  456. /package/src/{server-links → server/links}/primitives/$remote.ts +0 -0
  457. /package/src/{server-links → server/links}/providers/LinkProvider.ts +0 -0
  458. /package/src/{server-links → server/links}/providers/RemotePrimitiveProvider.ts +0 -0
  459. /package/src/{server-links → server/links}/providers/ServerLinksProvider.ts +0 -0
  460. /package/src/{server-links → server/links}/schemas/apiLinksResponseSchema.ts +0 -0
  461. /package/src/{server-metrics → server/metrics}/index.ts +0 -0
  462. /package/src/{server-metrics → server/metrics}/providers/ServerMetricsProvider.ts +0 -0
  463. /package/src/{server-multipart → server/multipart}/index.ts +0 -0
  464. /package/src/{server-multipart → server/multipart}/providers/ServerMultipartProvider.ts +0 -0
  465. /package/src/{server-proxy → server/proxy}/index.ts +0 -0
  466. /package/src/{server-proxy → server/proxy}/primitives/$proxy.ts +0 -0
  467. /package/src/{server-proxy → server/proxy}/providers/ServerProxyProvider.ts +0 -0
  468. /package/src/{server-rate-limit → server/rate-limit}/primitives/$rateLimit.ts +0 -0
  469. /package/src/{server-rate-limit → server/rate-limit}/providers/ServerRateLimitProvider.ts +0 -0
  470. /package/src/{server-security → server/security}/index.browser.ts +0 -0
  471. /package/src/{server-security → server/security}/index.ts +0 -0
  472. /package/src/{server-security → server/security}/primitives/$basicAuth.ts +0 -0
  473. /package/src/{server-security → server/security}/providers/ServerBasicAuthProvider.ts +0 -0
  474. /package/src/{server-security → server/security}/providers/ServerSecurityProvider.ts +0 -0
  475. /package/src/{server-static → server/static}/index.ts +0 -0
  476. /package/src/{server-static → server/static}/primitives/$serve.ts +0 -0
  477. /package/src/{server-static → server/static}/providers/ServerStaticProvider.ts +0 -0
  478. /package/src/{server-swagger → server/swagger}/index.ts +0 -0
  479. /package/src/{server-swagger → server/swagger}/primitives/$swagger.ts +0 -0
  480. /package/src/topic/{errors → core/errors}/TopicTimeoutError.ts +0 -0
  481. /package/src/topic/{index.ts → core/index.ts} +0 -0
  482. /package/src/topic/{primitives → core/primitives}/$subscriber.ts +0 -0
  483. /package/src/topic/{primitives → core/primitives}/$topic.ts +0 -0
  484. /package/src/topic/{providers → core/providers}/MemoryTopicProvider.ts +0 -0
  485. /package/src/topic/{providers → core/providers}/TopicProvider.ts +0 -0
  486. /package/src/{topic-redis → topic/redis}/index.ts +0 -0
  487. /package/src/{topic-redis → topic/redis}/providers/RedisTopicProvider.ts +0 -0
@@ -0,0 +1,244 @@
1
+ import {
2
+ $env,
3
+ $hook,
4
+ $inject,
5
+ Alepha,
6
+ type Static,
7
+ type TSchema,
8
+ t,
9
+ } from "alepha";
10
+ import { DateTimeProvider } from "alepha/datetime";
11
+ import { $logger } from "alepha/logger";
12
+ import { $consumer } from "../primitives/$consumer.ts";
13
+ import {
14
+ $queue,
15
+ type QueueMessage,
16
+ type QueuePrimitive,
17
+ } from "../primitives/$queue.ts";
18
+ import { QueueProvider } from "./QueueProvider.ts";
19
+
20
+ const envSchema = t.object({
21
+ /**
22
+ * The interval in milliseconds to wait before checking for new messages.
23
+ */
24
+ QUEUE_WORKER_INTERVAL: t.integer({
25
+ default: 1000,
26
+ }),
27
+ /**
28
+ * The maximum interval in milliseconds to wait before checking for new messages.
29
+ */
30
+ QUEUE_WORKER_MAX_INTERVAL: t.integer({
31
+ default: 32000,
32
+ }),
33
+ /**
34
+ * The number of workers to run concurrently. Defaults to 1.
35
+ * Useful only if you are doing a lot of I/O.
36
+ */
37
+ QUEUE_WORKER_CONCURRENCY: t.integer({
38
+ default: 1,
39
+ }),
40
+ });
41
+
42
+ declare module "alepha" {
43
+ interface Env extends Partial<Static<typeof envSchema>> {}
44
+ }
45
+
46
+ export class WorkerProvider {
47
+ protected readonly log = $logger();
48
+ protected readonly env = $env(envSchema);
49
+ protected readonly alepha = $inject(Alepha);
50
+ protected readonly queueProvider = $inject(QueueProvider);
51
+ protected readonly dateTimeProvider = $inject(DateTimeProvider);
52
+
53
+ protected workerPromises: Array<Promise<void>> = [];
54
+ protected workersRunning = 0;
55
+ protected abortController = new AbortController();
56
+ protected workerIntervals: Record<number, number> = {};
57
+ protected consumers: Array<Consumer> = [];
58
+
59
+ public get isRunning(): boolean {
60
+ return this.workersRunning > 0;
61
+ }
62
+
63
+ protected readonly start = $hook({
64
+ on: "start",
65
+ priority: "last",
66
+ handler: () => {
67
+ for (const queue of this.alepha.primitives($queue)) {
68
+ const handler = queue.options.handler;
69
+ if (handler) {
70
+ this.consumers.push({
71
+ handler,
72
+ queue,
73
+ });
74
+ }
75
+ }
76
+
77
+ for (const consumer of this.alepha.primitives($consumer)) {
78
+ this.consumers.push(consumer.options);
79
+ }
80
+
81
+ if (this.consumers.length > 0) {
82
+ this.startWorkers();
83
+ this.log.debug(
84
+ `Watching for ${this.consumers.length} queue${this.consumers.length > 1 ? "s" : ""} with ${this.env.QUEUE_WORKER_CONCURRENCY} worker${
85
+ this.env.QUEUE_WORKER_CONCURRENCY > 1 ? "s" : ""
86
+ }.`,
87
+ );
88
+ }
89
+ },
90
+ });
91
+
92
+ // -------------------------------------------------------------------------------------------------------------------
93
+
94
+ // Engine part - this is the part that will run the workers and process the messages
95
+
96
+ /**
97
+ * Start the workers.
98
+ * This method will create an endless loop that will check for new messages!
99
+ */
100
+ protected startWorkers(): void {
101
+ const workerToStart =
102
+ this.env.QUEUE_WORKER_CONCURRENCY - this.workersRunning;
103
+
104
+ for (let i = 0; i < workerToStart; i++) {
105
+ this.workersRunning += 1;
106
+ this.log.debug(`Starting worker n-${i}`);
107
+
108
+ const workerLoop = async () => {
109
+ while (this.workersRunning > 0) {
110
+ this.log.trace(`Worker n-${i} is checking for new messages`);
111
+ const next = await this.getNextMessage();
112
+ if (next) {
113
+ this.workerIntervals[i] = 0;
114
+ await this.processMessage(next);
115
+ } else {
116
+ await this.waitForNextMessage(i);
117
+ }
118
+ }
119
+ this.log.info(`Worker n-${i} has stopped`);
120
+ // Only decrement if we're not already at 0 (shutdown case)
121
+ if (this.workersRunning > 0) {
122
+ this.workersRunning -= 1;
123
+ }
124
+ };
125
+
126
+ this.workerPromises.push(
127
+ workerLoop().catch((e) => {
128
+ this.log.error(`Worker n-${i} has crashed`, e);
129
+ // Always decrement on crash, regardless of shutdown state
130
+ this.workersRunning -= 1;
131
+ }),
132
+ );
133
+ }
134
+ }
135
+
136
+ protected readonly stop = $hook({
137
+ on: "stop",
138
+ handler: async () => {
139
+ if (this.consumers.length > 0) {
140
+ await this.stopWorkers();
141
+ }
142
+ },
143
+ });
144
+
145
+ /**
146
+ * Wait for the next message, where `n` is the worker number.
147
+ *
148
+ * This method will wait for a certain amount of time, increasing the wait time again if no message is found.
149
+ */
150
+ protected async waitForNextMessage(n: number): Promise<void> {
151
+ const intervals = this.workerIntervals;
152
+ const milliseconds = intervals[n] || this.env.QUEUE_WORKER_INTERVAL;
153
+
154
+ this.log.trace(`Worker n-${n} is waiting for ${milliseconds}ms.`);
155
+
156
+ if (this.abortController.signal.aborted) {
157
+ this.log.warn(`Worker n-${n} aborted.`);
158
+ return;
159
+ }
160
+
161
+ await this.dateTimeProvider.wait(milliseconds, {
162
+ signal: this.abortController.signal,
163
+ });
164
+
165
+ if (intervals[n]) {
166
+ if (intervals[n] < this.env.QUEUE_WORKER_MAX_INTERVAL) {
167
+ intervals[n] = intervals[n] * 2;
168
+ }
169
+ } else {
170
+ intervals[n] = milliseconds;
171
+ }
172
+ }
173
+
174
+ /**
175
+ * Get the next message.
176
+ */
177
+ protected async getNextMessage(): Promise<undefined | NextMessage> {
178
+ for (const consumer of this.consumers) {
179
+ const provider = consumer.queue.provider;
180
+ const message = await provider.pop(consumer.queue.name);
181
+ if (message) {
182
+ return { message, consumer };
183
+ }
184
+ }
185
+ }
186
+
187
+ /**
188
+ * Process a message from a queue.
189
+ */
190
+ protected async processMessage(response: {
191
+ message: any;
192
+ consumer: Consumer;
193
+ }) {
194
+ const { message, consumer } = response;
195
+
196
+ try {
197
+ const json = JSON.parse(message);
198
+ const payload = this.alepha.codec.decode(
199
+ consumer.queue.options.schema,
200
+ json.payload,
201
+ );
202
+ await this.alepha.context.run(() => consumer.handler({ payload }));
203
+ } catch (e) {
204
+ this.log.error("Failed to process message", e);
205
+ }
206
+ }
207
+
208
+ /**
209
+ * Stop the workers.
210
+ *
211
+ * This method will stop the workers and wait for them to finish processing.
212
+ */
213
+ protected async stopWorkers() {
214
+ this.workersRunning = 0;
215
+
216
+ this.log.trace("Stopping workers...");
217
+ this.abortController.abort();
218
+
219
+ this.log.trace("Waiting for workers to finish...");
220
+ await Promise.all(this.workerPromises);
221
+ }
222
+
223
+ /**
224
+ * Force the workers to get back to work.
225
+ */
226
+ public wakeUp(): void {
227
+ this.log.debug("Waking up workers...");
228
+ this.abortController.abort();
229
+ this.abortController = new AbortController();
230
+
231
+ // if no workers are running, start them, (should not happen, but just in case)
232
+ this.startWorkers();
233
+ }
234
+ }
235
+
236
+ export interface Consumer<T extends TSchema = TSchema> {
237
+ queue: QueuePrimitive<T>;
238
+ handler: (message: QueueMessage<T>) => Promise<void>;
239
+ }
240
+
241
+ export interface NextMessage {
242
+ consumer: Consumer;
243
+ message: string;
244
+ }
@@ -0,0 +1,31 @@
1
+ import { $env, $inject, type Static, t } from "alepha";
2
+ import type { QueueProvider } from "alepha/queue";
3
+ import { RedisProvider } from "alepha/redis";
4
+
5
+ const envSchema = t.object({
6
+ REDIS_QUEUE_PREFIX: t.text({
7
+ default: "queue",
8
+ }),
9
+ });
10
+
11
+ export class RedisQueueProvider implements QueueProvider {
12
+ protected readonly env: Static<typeof envSchema> = $env(envSchema);
13
+ protected readonly redisProvider: RedisProvider = $inject(RedisProvider);
14
+
15
+ public prefix(queue: string): string {
16
+ return `${this.env.REDIS_QUEUE_PREFIX}:${queue}`;
17
+ }
18
+
19
+ public async push(queue: string, message: string): Promise<void> {
20
+ await this.redisProvider.publisher.LPUSH(this.prefix(queue), message);
21
+ }
22
+
23
+ public async pop(queue: string): Promise<string | undefined> {
24
+ const value = await this.redisProvider.publisher.RPOP(this.prefix(queue));
25
+ if (value == null) {
26
+ return undefined;
27
+ }
28
+
29
+ return String(value);
30
+ }
31
+ }
@@ -261,6 +261,13 @@ export class AuthPrimitive extends Primitive<AuthPrimitiveOptions> {
261
261
  return this.options.name ?? this.config.propertyKey;
262
262
  }
263
263
 
264
+ public get realm(): RealmPrimitive | undefined {
265
+ if ("realm" in this.options) {
266
+ return this.options.realm;
267
+ }
268
+ return undefined;
269
+ }
270
+
264
271
  public get jwks_uri(): string {
265
272
  const jwks = this.oauth?.serverMetadata().jwks_uri;
266
273
  if (!jwks) {
@@ -41,6 +41,7 @@ export class ServerAuthProvider {
41
41
  httpOnly: true,
42
42
  schema: t.object({
43
43
  provider: t.text(),
44
+ realm: t.optional(t.text()),
44
45
  codeVerifier: t.optional(t.text({ size: "long" })),
45
46
  redirectUri: t.optional(t.text({ size: "long" })),
46
47
  state: t.optional(t.text()),
@@ -163,7 +164,7 @@ export class ServerAuthProvider {
163
164
  protected async cookiesToTokens(
164
165
  cookies: Cookies,
165
166
  ): Promise<Tokens | undefined> {
166
- const tokens = this.tokens.get({ cookies });
167
+ const tokens = this.getTokens(cookies);
167
168
  if (!tokens) {
168
169
  // no cookie, no tokens
169
170
  this.log.trace("No tokens found in cookies");
@@ -247,7 +248,7 @@ export class ServerAuthProvider {
247
248
  response: userinfoResponseSchema,
248
249
  },
249
250
  handler: async ({ user, headers, cookies }) => {
250
- const tokens = this.tokens.get({ cookies });
251
+ const tokens = this.getTokens(cookies);
251
252
  if (tokens) {
252
253
  const provider = this.provider(tokens);
253
254
  if (!("realm" in provider.options)) {
@@ -323,6 +324,9 @@ export class ServerAuthProvider {
323
324
  schema: {
324
325
  query: t.object({
325
326
  provider: t.text(),
327
+ realm: t.optional(
328
+ t.text({ description: "Realm name for multi-realm setups" }),
329
+ ),
326
330
  }),
327
331
  body: t.object({
328
332
  username: t.text(),
@@ -331,7 +335,11 @@ export class ServerAuthProvider {
331
335
  response: tokenResponseSchema,
332
336
  },
333
337
  handler: async ({ query, body, cookies }) => {
334
- const provider = this.provider(query);
338
+ const provider = this.provider({
339
+ provider: query.provider,
340
+ realm: query.realm,
341
+ });
342
+
335
343
  const realm = "realm" in provider.options && provider.options.realm;
336
344
  if (!realm) {
337
345
  throw new SecurityError(
@@ -348,6 +356,8 @@ export class ServerAuthProvider {
348
356
  );
349
357
  }
350
358
 
359
+ console.log("->", body);
360
+
351
361
  let user: UserAccount | undefined;
352
362
  try {
353
363
  user = await credentials.account(body);
@@ -392,11 +402,17 @@ export class ServerAuthProvider {
392
402
  schema: {
393
403
  query: t.object({
394
404
  provider: t.text(),
405
+ realm: t.optional(
406
+ t.text({ description: "Realm name for multi-realm setups" }),
407
+ ),
395
408
  redirect_uri: t.optional(t.text({ size: "rich" })),
396
409
  }),
397
410
  },
398
411
  handler: async ({ query, url, reply }) => {
399
- const provider = this.provider(query);
412
+ const provider = this.provider({
413
+ provider: query.provider,
414
+ realm: query.realm,
415
+ });
400
416
  const oauth = provider.oauth;
401
417
  if (!oauth) {
402
418
  throw new SecurityError(
@@ -433,6 +449,7 @@ export class ServerAuthProvider {
433
449
  nonce: parameters.nonce,
434
450
  redirectUri: query.redirect_uri ?? "/",
435
451
  provider: query.provider,
452
+ realm: query.realm,
436
453
  });
437
454
 
438
455
  reply.redirect(buildAuthorizationUrl(oauth, parameters).toString());
@@ -456,6 +473,7 @@ export class ServerAuthProvider {
456
473
  codeVerifier,
457
474
  redirectUri: query.redirect_uri ?? "/",
458
475
  provider: query.provider,
476
+ realm: query.realm,
459
477
  });
460
478
 
461
479
  reply.redirect(buildAuthorizationUrl(oauth, parameters).toString());
@@ -543,7 +561,7 @@ export class ServerAuthProvider {
543
561
  },
544
562
  handler: async ({ query, reply, cookies }) => {
545
563
  const redirect = query.post_logout_redirect_uri ?? "/";
546
- const tokens = this.tokens.get({ cookies });
564
+ const tokens = this.getTokens(cookies);
547
565
  if (!tokens) {
548
566
  reply.redirect(redirect);
549
567
  return;
@@ -603,17 +621,42 @@ export class ServerAuthProvider {
603
621
  },
604
622
  });
605
623
 
606
- protected provider(opts: string | { provider: string }): AuthPrimitive {
624
+ /**
625
+ * Find an auth provider by name and optionally by realm.
626
+ * When realm is specified, it filters providers by both name and realm.
627
+ * This enables multi-realm setups where multiple providers share the same name (e.g., "credentials").
628
+ */
629
+ protected provider(
630
+ opts: string | { provider: string; realm?: string },
631
+ ): AuthPrimitive {
607
632
  const name = typeof opts === "string" ? opts : opts.provider;
608
- const identity = this.identities.find((identity) => identity.name === name);
633
+ const realmName = typeof opts === "string" ? undefined : opts.realm;
634
+
635
+ const identity = this.identities.find((identity) => {
636
+ if (identity.name !== name) {
637
+ return false;
638
+ }
639
+
640
+ // If realm filter is specified, match against provider's realm
641
+ if (realmName && identity.realm?.name !== realmName) {
642
+ return false;
643
+ }
644
+
645
+ return true;
646
+ });
609
647
 
610
648
  if (!identity) {
611
- throw new SecurityError(`Auth provider '${name}' not found`);
649
+ const realmInfo = realmName ? ` for realm '${realmName}'` : "";
650
+ throw new SecurityError(`Auth provider '${name}'${realmInfo} not found`);
612
651
  }
613
652
 
614
653
  return identity;
615
654
  }
616
655
 
656
+ protected getTokens(cookies?: Cookies): Tokens | undefined {
657
+ return this.tokens.get({ cookies });
658
+ }
659
+
617
660
  protected setTokens(tokens: Tokens, cookies?: Cookies): void {
618
661
  const exp =
619
662
  tokens.refresh_token_expires_in ||
@@ -2,6 +2,7 @@ import { $module } from "alepha";
2
2
  import { AlephaServer } from "alepha/server";
3
3
  import { $cookie, type Cookies } from "./primitives/$cookie.ts";
4
4
  import { ServerCookiesProvider } from "./providers/ServerCookiesProvider.ts";
5
+ import { CookieParser } from "./services/CookieParser.ts";
5
6
 
6
7
  // ---------------------------------------------------------------------------------------------------------------------
7
8
 
@@ -29,5 +30,5 @@ declare module "alepha/server" {
29
30
  export const AlephaServerCookies = $module({
30
31
  name: "alepha.server.cookies",
31
32
  primitives: [$cookie],
32
- services: [AlephaServer, ServerCookiesProvider],
33
+ services: [AlephaServer, ServerCookiesProvider, CookieParser],
33
34
  });
@@ -22,9 +22,12 @@ import { ServerBodyParserProvider } from "./providers/ServerBodyParserProvider.t
22
22
  import { ServerLoggerProvider } from "./providers/ServerLoggerProvider.ts";
23
23
  import { ServerNotReadyProvider } from "./providers/ServerNotReadyProvider.ts";
24
24
  import { ServerProvider } from "./providers/ServerProvider.ts";
25
+ import { ServerRouterProvider } from "./providers/ServerRouterProvider.ts";
25
26
  import { ServerTimingProvider } from "./providers/ServerTimingProvider.ts";
26
27
  import type { FetchOptions, HttpAction } from "./services/HttpClient.ts";
27
28
  import { HttpClient } from "./services/HttpClient.ts";
29
+ import { ServerRequestParser } from "./services/ServerRequestParser.ts";
30
+ import { UserAgentParser } from "./services/UserAgentParser.ts";
28
31
 
29
32
  // ---------------------------------------------------------------------------------------------------------------------
30
33
 
@@ -106,6 +109,7 @@ export * from "./providers/ServerNotReadyProvider.ts";
106
109
  export * from "./providers/ServerProvider.ts";
107
110
  export * from "./providers/ServerRouterProvider.ts";
108
111
  export * from "./providers/ServerTimingProvider.ts";
112
+ export * from "./services/UserAgentParser.ts";
109
113
 
110
114
  // ---------------------------------------------------------------------------------------------------------------------
111
115
 
@@ -132,6 +136,9 @@ export const AlephaServer = $module({
132
136
  ServerNotReadyProvider,
133
137
  ServerTimingProvider,
134
138
  HttpClient,
139
+ UserAgentParser,
140
+ ServerRequestParser,
141
+ ServerRouterProvider,
135
142
  ],
136
143
  register: (alepha: Alepha) => {
137
144
  if (!alepha.isServerless() && !alepha.isViteDev()) {
@@ -44,7 +44,16 @@ import {
44
44
  * - Automatic content-type handling (JSON, form-data, plain text)
45
45
  *
46
46
  * **URL Generation**
47
- * Actions are prefixed with `/api` by default (configurable via `SERVER_API_PREFIX`).
47
+ *
48
+ * **Important:** All `$action` paths are automatically prefixed with `/api`.
49
+ *
50
+ * ```ts
51
+ * $action({ path: "/users" }) // → GET /api/users
52
+ * $action({ path: "/users/:id" }) // → GET /api/users/:id
53
+ * $action({ path: "/hello" }) // → GET /api/hello
54
+ * ```
55
+ *
56
+ * This prefix is configurable via the `SERVER_API_PREFIX` environment variable.
48
57
  * HTTP method defaults to GET, or POST if body schema is provided.
49
58
  *
50
59
  * **Common Use Cases**
@@ -1,5 +1,6 @@
1
1
  import { ReadableStream as WebStream } from "node:stream/web";
2
2
  import { createBrotliDecompress, createGunzip, createInflate } from "node:zlib";
3
+ import type { TSchema } from "alepha";
3
4
  import { $env, $hook, $inject, Alepha, t } from "alepha";
4
5
  import { $logger } from "alepha/logger";
5
6
  import { HttpError } from "../errors/HttpError.ts";
@@ -44,7 +45,11 @@ export class ServerBodyParserProvider {
44
45
 
45
46
  if (route.schema?.body) {
46
47
  try {
47
- const body = await this.parse(stream, request.headers);
48
+ const body = await this.parse(
49
+ stream,
50
+ request.headers,
51
+ route.schema.body,
52
+ );
48
53
  if (body) {
49
54
  request.body = body;
50
55
  }
@@ -68,18 +73,19 @@ export class ServerBodyParserProvider {
68
73
  public async parse(
69
74
  stream: ReadableStream,
70
75
  headers: Record<string, string>,
76
+ schema: TSchema,
71
77
  ): Promise<object | string | undefined> {
72
78
  const contentType = headers["content-type"];
73
79
  const contentEncoding = headers["content-encoding"];
74
80
 
75
81
  if (!contentType) return undefined;
76
82
 
77
- if (contentType.startsWith("application/json")) {
78
- return this.parseJson(stream, contentEncoding);
83
+ if (contentType.startsWith("text/plain") || t.schema.isString(schema)) {
84
+ return this.parseText(stream, contentEncoding);
79
85
  }
80
86
 
81
- if (contentType.startsWith("text/plain")) {
82
- return this.parseText(stream, contentEncoding);
87
+ if (contentType.startsWith("application/json")) {
88
+ return this.parseJson(stream, contentEncoding);
83
89
  }
84
90
 
85
91
  if (contentType.startsWith("application/x-www-form-urlencoded")) {
@@ -391,13 +391,19 @@ export class ServerRouterProvider extends RouterProvider<ServerRouteMatcher> {
391
391
  }
392
392
 
393
393
  if (route.schema?.body) {
394
- try {
395
- request.body = this.alepha.codec.decode(
396
- route.schema.body,
397
- request.body,
398
- );
399
- } catch (error) {
400
- throw new ValidationError("Invalid request body", error);
394
+ if (t.schema.isString(route.schema.body)) {
395
+ if (typeof request.body !== "string") {
396
+ throw new ValidationError("Request body is not a string");
397
+ }
398
+ } else {
399
+ try {
400
+ request.body = this.alepha.codec.decode(
401
+ route.schema.body,
402
+ request.body,
403
+ );
404
+ } catch (error) {
405
+ throw new ValidationError("Invalid request body", error);
406
+ }
401
407
  }
402
408
  }
403
409
  }
@@ -54,7 +54,7 @@ export interface RateLimitOptions {
54
54
  *
55
55
  * @example
56
56
  * ```ts
57
- * import { $rateLimit, AlephaServerRateLimit } from "alepha/server-rate-limit";
57
+ * import { $rateLimit, AlephaServerRateLimit } from "alepha/server/rate-limit";
58
58
  *
59
59
  * class ApiService {
60
60
  * // Path-specific rate limiting
@@ -393,6 +393,7 @@ window.onload = function() {
393
393
  join(dirname, "../../assets/swagger-ui"),
394
394
  join(dirname, "../../../assets/swagger-ui"),
395
395
  join(dirname, "../../../../assets/swagger-ui"),
396
+ join(dirname, "../../../../../assets/swagger-ui"),
396
397
  );
397
398
 
398
399
  if (!root) {
@@ -1,7 +1,7 @@
1
1
  import { cpus } from "node:os";
2
2
  import { MessageChannel, type MessagePort, Worker } from "node:worker_threads";
3
3
  import type { TSchema } from "alepha";
4
- import { createPrimitive, KIND, Primitive, TypeBoxValue } from "alepha";
4
+ import { createPrimitive, KIND, Primitive, Value } from "alepha";
5
5
 
6
6
  /**
7
7
  * Creates a worker thread primitive for offloading CPU-intensive tasks to separate threads.
@@ -244,7 +244,7 @@ export class ThreadPrimitive extends Primitive<ThreadPrimitiveOptions> {
244
244
  public async execute<T = any>(data?: any, schema?: TSchema): Promise<T> {
245
245
  if (schema && data) {
246
246
  try {
247
- TypeBoxValue.Decode(schema, data);
247
+ Value.Decode(schema, data);
248
248
  } catch (error) {
249
249
  throw new Error(
250
250
  `Invalid data: ${error instanceof Error ? error.message : error}`,
package/src/vite/index.ts CHANGED
@@ -1,7 +1,5 @@
1
1
  import type { Alepha } from "alepha";
2
2
 
3
- // Vite re-exports
4
- export { defineConfig } from "vite";
5
3
  // Helpers (for advanced use)
6
4
  export * from "./helpers/boot.ts";
7
5
  export * from "./helpers/createBufferedLogger.ts";
@@ -85,6 +85,7 @@ export async function buildServer(
85
85
  noExternal: true,
86
86
  },
87
87
  build: {
88
+ sourcemap: true, // or "hidden" if you don't want to expose source maps
88
89
  ssr: opts.entry,
89
90
  outDir: `${opts.distDir}/server`,
90
91
  minify: true,
@@ -133,7 +134,7 @@ export async function buildServer(
133
134
  `${opts.distDir}/${opts.clientDir}/index.html`,
134
135
  "utf-8",
135
136
  );
136
- template = `process.env.REACT_SERVER_TEMPLATE ??= \`${index.replace(/>\s*</g, "><").trim()}\`;\n`;
137
+ template = `__alepha.set("alepha.react.server.template", \`${index.replace(/>\s*</g, "><").trim()}\`);\n`;
137
138
  }
138
139
 
139
140
  const warning =
@@ -141,11 +142,9 @@ export async function buildServer(
141
142
  "\n" +
142
143
  "// Changes to this file will be lost when the code is regenerated.\n";
143
144
 
144
- const forceProduction = "process.env.NODE_ENV ??= 'production';\n";
145
-
146
145
  await writeFile(
147
146
  `${opts.distDir}/index.js`,
148
- `${warning}\n${forceProduction}${template}\nawait import('./server/${entryFile}');`.trim(),
147
+ `${warning}\nimport './server/${entryFile}';${template}`.trim(),
149
148
  );
150
149
 
151
150
  return { entryFile };