alepha 0.19.1 → 0.19.2

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 (530) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +6 -9
  3. package/dist/api/audits/index.d.ts +378 -346
  4. package/dist/api/audits/index.d.ts.map +1 -1
  5. package/dist/api/files/index.d.ts +216 -184
  6. package/dist/api/files/index.d.ts.map +1 -1
  7. package/dist/api/jobs/index.d.ts +528 -496
  8. package/dist/api/jobs/index.d.ts.map +1 -1
  9. package/dist/api/jobs/index.js +3 -3
  10. package/dist/api/jobs/index.js.map +1 -1
  11. package/dist/api/keys/index.d.ts +207 -207
  12. package/dist/api/keys/index.d.ts.map +1 -1
  13. package/dist/api/notifications/index.d.ts +152 -152
  14. package/dist/api/notifications/index.d.ts.map +1 -1
  15. package/dist/api/organizations/index.browser.js +48 -0
  16. package/dist/api/organizations/index.browser.js.map +1 -0
  17. package/dist/api/organizations/index.d.ts +516 -0
  18. package/dist/api/organizations/index.d.ts.map +1 -0
  19. package/dist/api/organizations/index.js +202 -0
  20. package/dist/api/organizations/index.js.map +1 -0
  21. package/dist/api/parameters/index.d.ts +391 -358
  22. package/dist/api/parameters/index.d.ts.map +1 -1
  23. package/dist/api/parameters/index.js +5 -1
  24. package/dist/api/parameters/index.js.map +1 -1
  25. package/dist/api/users/index.browser.js +7 -5
  26. package/dist/api/users/index.browser.js.map +1 -1
  27. package/dist/api/users/index.d.ts +978 -913
  28. package/dist/api/users/index.d.ts.map +1 -1
  29. package/dist/api/users/index.js +160 -112
  30. package/dist/api/users/index.js.map +1 -1
  31. package/dist/api/verifications/index.d.ts +135 -135
  32. package/dist/api/verifications/index.d.ts.map +1 -1
  33. package/dist/api/verifications/index.js +2 -2
  34. package/dist/api/verifications/index.js.map +1 -1
  35. package/dist/batch/index.d.ts +6 -6
  36. package/dist/batch/index.d.ts.map +1 -1
  37. package/dist/billing/index.d.ts +1048 -0
  38. package/dist/billing/index.d.ts.map +1 -0
  39. package/dist/billing/index.js +713 -0
  40. package/dist/billing/index.js.map +1 -0
  41. package/dist/bin/index.js +0 -2
  42. package/dist/bin/index.js.map +1 -1
  43. package/dist/bucket/index.d.ts +10 -10
  44. package/dist/bucket/index.d.ts.map +1 -1
  45. package/dist/bucket/index.js +2 -2
  46. package/dist/bucket/index.js.map +1 -1
  47. package/dist/cache/core/index.d.ts +9 -9
  48. package/dist/cache/core/index.d.ts.map +1 -1
  49. package/dist/cache/core/index.js +2 -2
  50. package/dist/cache/core/index.js.map +1 -1
  51. package/dist/cache/core/index.workerd.js +2 -2
  52. package/dist/cache/core/index.workerd.js.map +1 -1
  53. package/dist/cache/redis/index.d.ts +6 -6
  54. package/dist/cache/redis/index.d.ts.map +1 -1
  55. package/dist/cache/redis/index.js +2 -2
  56. package/dist/cache/redis/index.js.map +1 -1
  57. package/dist/cli/config/index.d.ts +12 -2
  58. package/dist/cli/config/index.d.ts.map +1 -1
  59. package/dist/cli/config/index.js +4 -0
  60. package/dist/cli/config/index.js.map +1 -1
  61. package/dist/cli/core/index.d.ts +183 -140
  62. package/dist/cli/core/index.d.ts.map +1 -1
  63. package/dist/cli/core/index.js +279 -89
  64. package/dist/cli/core/index.js.map +1 -1
  65. package/dist/cli/devtools/index.d.ts +45 -0
  66. package/dist/cli/devtools/index.d.ts.map +1 -0
  67. package/dist/cli/devtools/index.js +170 -0
  68. package/dist/cli/devtools/index.js.map +1 -0
  69. package/dist/cli/platform/index.d.ts +383 -492
  70. package/dist/cli/platform/index.d.ts.map +1 -1
  71. package/dist/cli/platform/index.js +42 -511
  72. package/dist/cli/platform/index.js.map +1 -1
  73. package/dist/cli/vendor/index.d.ts +196 -0
  74. package/dist/cli/vendor/index.d.ts.map +1 -0
  75. package/dist/cli/vendor/index.js +384 -0
  76. package/dist/cli/vendor/index.js.map +1 -0
  77. package/dist/command/index.d.ts +18 -18
  78. package/dist/command/index.d.ts.map +1 -1
  79. package/dist/command/index.js +2 -2
  80. package/dist/command/index.js.map +1 -1
  81. package/dist/core/index.browser.js +4 -4
  82. package/dist/core/index.browser.js.map +1 -1
  83. package/dist/core/index.d.ts +10 -10
  84. package/dist/core/index.d.ts.map +1 -1
  85. package/dist/core/index.js +4 -4
  86. package/dist/core/index.js.map +1 -1
  87. package/dist/core/index.native.js +4 -4
  88. package/dist/core/index.native.js.map +1 -1
  89. package/dist/core/index.workerd.js +4 -4
  90. package/dist/core/index.workerd.js.map +1 -1
  91. package/dist/crypto/index.d.ts +7 -7
  92. package/dist/crypto/index.d.ts.map +1 -1
  93. package/dist/datetime/index.d.ts +4 -4
  94. package/dist/datetime/index.d.ts.map +1 -1
  95. package/dist/email/brevo/index.d.ts +4 -4
  96. package/dist/email/brevo/index.d.ts.map +1 -1
  97. package/dist/email/core/index.d.ts +15 -11
  98. package/dist/email/core/index.d.ts.map +1 -1
  99. package/dist/email/core/index.js +12 -35
  100. package/dist/email/core/index.js.map +1 -1
  101. package/dist/email/smtp/index.d.ts +12 -12
  102. package/dist/email/smtp/index.d.ts.map +1 -1
  103. package/dist/email/smtp/index.js +7 -4
  104. package/dist/email/smtp/index.js.map +1 -1
  105. package/dist/fake/index.d.ts +4 -8
  106. package/dist/fake/index.d.ts.map +1 -1
  107. package/dist/fake/index.js +55 -889
  108. package/dist/fake/index.js.map +1 -1
  109. package/dist/lock/core/index.d.ts +13 -13
  110. package/dist/lock/core/index.d.ts.map +1 -1
  111. package/dist/lock/core/index.js +2 -2
  112. package/dist/lock/core/index.js.map +1 -1
  113. package/dist/lock/redis/index.d.ts +4 -4
  114. package/dist/lock/redis/index.d.ts.map +1 -1
  115. package/dist/logger/index.d.ts +16 -15
  116. package/dist/logger/index.d.ts.map +1 -1
  117. package/dist/logger/index.js +5 -2
  118. package/dist/logger/index.js.map +1 -1
  119. package/dist/mcp/index.d.ts +11 -11
  120. package/dist/mcp/index.d.ts.map +1 -1
  121. package/dist/mcp/index.js +2 -2
  122. package/dist/mcp/index.js.map +1 -1
  123. package/dist/orm/core/index.browser.js +11 -1
  124. package/dist/orm/core/index.browser.js.map +1 -1
  125. package/dist/orm/core/index.bun.js +53 -16
  126. package/dist/orm/core/index.bun.js.map +1 -1
  127. package/dist/orm/core/index.d.ts +95 -51
  128. package/dist/orm/core/index.d.ts.map +1 -1
  129. package/dist/orm/core/index.js +55 -14
  130. package/dist/orm/core/index.js.map +1 -1
  131. package/dist/orm/postgres/index.d.ts +18 -17
  132. package/dist/orm/postgres/index.d.ts.map +1 -1
  133. package/dist/queue/core/index.d.ts +14 -14
  134. package/dist/queue/core/index.d.ts.map +1 -1
  135. package/dist/queue/core/index.js +2 -2
  136. package/dist/queue/core/index.js.map +1 -1
  137. package/dist/queue/core/index.workerd.js +2 -2
  138. package/dist/queue/core/index.workerd.js.map +1 -1
  139. package/dist/queue/redis/index.d.ts +4 -4
  140. package/dist/queue/redis/index.d.ts.map +1 -1
  141. package/dist/queue/redis/index.js +2 -2
  142. package/dist/queue/redis/index.js.map +1 -1
  143. package/dist/react/auth/index.d.ts +9 -9
  144. package/dist/react/auth/index.d.ts.map +1 -1
  145. package/dist/react/core/index.d.ts +6 -6
  146. package/dist/react/core/index.d.ts.map +1 -1
  147. package/dist/react/core/index.js +5 -4
  148. package/dist/react/core/index.js.map +1 -1
  149. package/dist/react/form/index.d.ts +4 -4
  150. package/dist/react/form/index.d.ts.map +1 -1
  151. package/dist/react/head/index.d.ts +4 -4
  152. package/dist/react/head/index.d.ts.map +1 -1
  153. package/dist/react/i18n/index.d.ts +9 -9
  154. package/dist/react/i18n/index.d.ts.map +1 -1
  155. package/dist/react/intro/index.d.ts +2 -2
  156. package/dist/react/intro/index.d.ts.map +1 -1
  157. package/dist/react/intro/index.js +1 -1
  158. package/dist/react/intro/index.js.map +1 -1
  159. package/dist/react/router/index.browser.js +4 -5
  160. package/dist/react/router/index.browser.js.map +1 -1
  161. package/dist/react/router/index.d.ts +215 -215
  162. package/dist/react/router/index.d.ts.map +1 -1
  163. package/dist/react/router/index.js +6 -7
  164. package/dist/react/router/index.js.map +1 -1
  165. package/dist/react/testing/index.d.ts +2 -2
  166. package/dist/react/testing/index.d.ts.map +1 -1
  167. package/dist/react/testing/index.js +2 -4
  168. package/dist/react/testing/index.js.map +1 -1
  169. package/dist/redis/index.d.ts +19 -19
  170. package/dist/redis/index.d.ts.map +1 -1
  171. package/dist/retry/index.d.ts +4 -4
  172. package/dist/retry/index.d.ts.map +1 -1
  173. package/dist/scheduler/index.d.ts +13 -13
  174. package/dist/scheduler/index.d.ts.map +1 -1
  175. package/dist/scheduler/index.js +2 -2
  176. package/dist/scheduler/index.js.map +1 -1
  177. package/dist/scheduler/index.workerd.js +2 -2
  178. package/dist/scheduler/index.workerd.js.map +1 -1
  179. package/dist/security/index.browser.js +1 -1
  180. package/dist/security/index.browser.js.map +1 -1
  181. package/dist/security/index.d.ts +47 -47
  182. package/dist/security/index.d.ts.map +1 -1
  183. package/dist/security/index.js +9 -12
  184. package/dist/security/index.js.map +1 -1
  185. package/dist/server/auth/index.d.ts +170 -169
  186. package/dist/server/auth/index.d.ts.map +1 -1
  187. package/dist/server/auth/index.js +16 -2
  188. package/dist/server/auth/index.js.map +1 -1
  189. package/dist/server/cookies/index.d.ts +7 -7
  190. package/dist/server/cookies/index.d.ts.map +1 -1
  191. package/dist/server/core/index.d.ts +76 -76
  192. package/dist/server/core/index.d.ts.map +1 -1
  193. package/dist/server/core/index.js +23 -17
  194. package/dist/server/core/index.js.map +1 -1
  195. package/dist/server/cors/index.d.ts +13 -13
  196. package/dist/server/cors/index.d.ts.map +1 -1
  197. package/dist/server/cors/index.js +2 -2
  198. package/dist/server/cors/index.js.map +1 -1
  199. package/dist/server/etag/index.d.ts +9 -9
  200. package/dist/server/etag/index.d.ts.map +1 -1
  201. package/dist/server/health/index.d.ts +20 -20
  202. package/dist/server/health/index.d.ts.map +1 -1
  203. package/dist/server/links/index.browser.js +2 -2
  204. package/dist/server/links/index.browser.js.map +1 -1
  205. package/dist/server/links/index.d.ts +66 -66
  206. package/dist/server/links/index.d.ts.map +1 -1
  207. package/dist/server/links/index.js +4 -4
  208. package/dist/server/links/index.js.map +1 -1
  209. package/dist/server/metrics/index.d.ts +7 -7
  210. package/dist/server/metrics/index.d.ts.map +1 -1
  211. package/dist/server/proxy/index.d.ts +5 -5
  212. package/dist/server/proxy/index.d.ts.map +1 -1
  213. package/dist/server/rate-limit/index.d.ts +12 -12
  214. package/dist/server/rate-limit/index.d.ts.map +1 -1
  215. package/dist/server/rate-limit/index.js +2 -2
  216. package/dist/server/rate-limit/index.js.map +1 -1
  217. package/dist/server/static/index.d.ts +5 -5
  218. package/dist/server/static/index.d.ts.map +1 -1
  219. package/dist/server/swagger/index.d.ts +7 -7
  220. package/dist/server/swagger/index.d.ts.map +1 -1
  221. package/dist/server/swagger/index.js +2 -2
  222. package/dist/server/swagger/index.js.map +1 -1
  223. package/dist/sms/index.d.ts +11 -7
  224. package/dist/sms/index.d.ts.map +1 -1
  225. package/dist/sms/index.js +9 -15
  226. package/dist/sms/index.js.map +1 -1
  227. package/dist/system/index.d.ts +4 -4
  228. package/dist/system/index.d.ts.map +1 -1
  229. package/dist/topic/core/index.d.ts +6 -6
  230. package/dist/topic/core/index.d.ts.map +1 -1
  231. package/dist/topic/redis/index.d.ts +7 -7
  232. package/dist/topic/redis/index.d.ts.map +1 -1
  233. package/dist/topic/redis/index.js +2 -2
  234. package/dist/topic/redis/index.js.map +1 -1
  235. package/dist/websocket/index.d.ts +36 -36
  236. package/dist/websocket/index.d.ts.map +1 -1
  237. package/dist/websocket/index.js +2 -2
  238. package/dist/websocket/index.js.map +1 -1
  239. package/package.json +36 -14
  240. package/src/api/jobs/{services → __tests__}/JobService.spec.ts +1 -1
  241. package/src/api/jobs/providers/JobProvider.ts +3 -3
  242. package/src/api/keys/{services → __tests__}/ApiKeyService.spec.ts +1 -1
  243. package/src/api/organizations/__tests__/OrganizationService.spec.ts +193 -0
  244. package/src/api/organizations/controllers/AdminOrganizationController.ts +103 -0
  245. package/src/api/organizations/entities/organizations.ts +20 -0
  246. package/src/api/organizations/index.browser.ts +10 -0
  247. package/src/api/organizations/index.ts +31 -0
  248. package/src/api/organizations/schemas/createOrganizationSchema.ts +10 -0
  249. package/src/api/organizations/schemas/organizationQuerySchema.ts +10 -0
  250. package/src/api/organizations/schemas/organizationResourceSchema.ts +6 -0
  251. package/src/api/organizations/schemas/updateOrganizationSchema.ts +7 -0
  252. package/src/api/organizations/services/OrganizationService.ts +75 -0
  253. package/src/api/parameters/services/ParameterProvider.ts +6 -1
  254. package/src/api/users/{services → __tests__}/SessionService.spec.ts +67 -0
  255. package/src/api/users/{jobs → __tests__}/UserJobs.spec.ts +1 -1
  256. package/src/api/users/entities/users.ts +9 -3
  257. package/src/api/users/index.ts +23 -4
  258. package/src/api/users/primitives/$realm.ts +6 -4
  259. package/src/api/users/providers/RealmProvider.ts +1 -1
  260. package/src/api/users/services/RegistrationService.ts +1 -1
  261. package/src/api/users/services/SessionService.ts +92 -5
  262. package/src/api/users/services/UserService.ts +1 -1
  263. package/src/api/verifications/{jobs → __tests__}/VerificationJobs.spec.ts +4 -2
  264. package/src/api/verifications/parameters/VerificationParameters.ts +2 -2
  265. package/src/billing/__tests__/BillingService.spec.ts +136 -0
  266. package/src/billing/__tests__/PaymentMethodService.spec.ts +78 -0
  267. package/src/billing/controllers/AdminBillingController.ts +149 -0
  268. package/src/billing/controllers/BillingController.ts +108 -0
  269. package/src/billing/entities/paymentIntents.ts +34 -0
  270. package/src/billing/entities/paymentMethods.ts +24 -0
  271. package/src/billing/entities/refunds.ts +22 -0
  272. package/src/billing/errors/BillingError.ts +5 -0
  273. package/src/billing/index.ts +76 -0
  274. package/src/billing/providers/BillingProvider.ts +79 -0
  275. package/src/billing/providers/MemoryBillingProvider.ts +139 -0
  276. package/src/billing/schemas/intentSchemas.ts +60 -0
  277. package/src/billing/schemas/paymentMethodSchemas.ts +13 -0
  278. package/src/billing/schemas/refundSchemas.ts +6 -0
  279. package/src/billing/services/BillingService.ts +325 -0
  280. package/src/billing/services/PaymentMethodService.ts +82 -0
  281. package/src/bin/index.ts +0 -2
  282. package/src/bucket/providers/LocalFileStorageProvider.ts +2 -2
  283. package/src/cache/core/{primitives → __tests__}/$cache.middleware.spec.ts +1 -1
  284. package/src/cache/core/{providers → __tests__}/MemoryCacheProvider.spec.ts +1 -1
  285. package/src/cache/core/primitives/$cache.ts +2 -2
  286. package/src/cache/redis/providers/RedisCacheProvider.ts +2 -2
  287. package/src/cli/config/defineConfig.ts +20 -0
  288. package/src/cli/core/{services → __tests__}/ProjectScaffolder.spec.ts +1 -1
  289. package/src/cli/core/{commands/gen → __tests__}/changelog.spec.ts +1 -1
  290. package/src/cli/core/{commands → __tests__}/init.spec.ts +2 -8
  291. package/src/cli/core/atoms/devOptions.ts +0 -5
  292. package/src/cli/core/commands/build.ts +2 -2
  293. package/src/cli/core/commands/dev.ts +165 -30
  294. package/src/cli/core/commands/gen/changelog.ts +2 -2
  295. package/src/cli/core/commands/init.ts +2 -7
  296. package/src/cli/core/commands/verify.ts +0 -1
  297. package/src/cli/core/providers/AppEntryProvider.ts +2 -2
  298. package/src/cli/core/providers/ViteDevServerProvider.ts +54 -66
  299. package/src/cli/core/services/PackageManagerUtils.ts +8 -3
  300. package/src/cli/core/services/ProjectScaffolder.ts +18 -18
  301. package/src/cli/core/tasks/BuildClientTask.ts +8 -0
  302. package/src/cli/core/tasks/BuildServerTask.ts +17 -4
  303. package/src/cli/core/templates/alephaConfigTs.ts +0 -6
  304. package/src/cli/core/templates/webAdminDashboardTsx.ts +17 -0
  305. package/src/cli/core/templates/webAppRouterTs.ts +85 -2
  306. package/src/cli/devtools/atoms/devtoolsOptions.ts +26 -0
  307. package/src/cli/devtools/index.ts +194 -0
  308. package/src/cli/platform/{adapters → __tests__}/CloudflareAdapter.spec.ts +2 -2
  309. package/src/cli/platform/{providers → __tests__}/GitHubSecretStore.spec.ts +1 -1
  310. package/src/cli/platform/{services → __tests__}/NamingService.spec.ts +1 -1
  311. package/src/cli/platform/{providers → __tests__}/PlatformCacheProvider.spec.ts +1 -1
  312. package/src/cli/platform/{services → __tests__}/PlatformInspector.spec.ts +1 -1
  313. package/src/cli/platform/{services → __tests__}/PlatformOrchestrator.spec.ts +3 -3
  314. package/src/cli/platform/{services → __tests__}/SecretFilterService.spec.ts +1 -1
  315. package/src/cli/platform/{commands → __tests__}/SecretsCommand.spec.ts +1 -1
  316. package/src/cli/platform/{adapters → __tests__}/VercelAdapter.spec.ts +2 -2
  317. package/src/cli/platform/atoms/platformOptions.ts +2 -10
  318. package/src/cli/platform/commands/SecretsCommand.ts +2 -2
  319. package/src/cli/platform/commands/platform.ts +2 -11
  320. package/src/cli/platform/index.ts +34 -11
  321. package/src/cli/platform/services/PlatformInspector.ts +2 -2
  322. package/src/cli/platform/services/PlatformOrchestrator.ts +0 -9
  323. package/src/cli/vendor/__tests__/VendorService.spec.ts +407 -0
  324. package/src/cli/vendor/atoms/vendorOptions.ts +41 -0
  325. package/src/cli/vendor/commands/VendorCommand.ts +204 -0
  326. package/src/cli/vendor/index.ts +43 -0
  327. package/src/cli/vendor/services/VendorService.ts +338 -0
  328. package/src/command/{providers → __tests__}/CliProvider.spec.ts +1 -1
  329. package/src/command/{helpers → __tests__}/EnvUtils.spec.ts +1 -1
  330. package/src/command/providers/CliProvider.ts +2 -2
  331. package/src/core/{primitives → __tests__}/$atom.spec.ts +2 -2
  332. package/src/core/{primitives → __tests__}/$memoize.spec.ts +1 -1
  333. package/src/core/{primitives → __tests__}/$mode.spec.ts +1 -1
  334. package/src/core/{primitives → __tests__}/$pipeline.spec.ts +1 -1
  335. package/src/core/{primitives → __tests__}/$scope.spec.ts +2 -2
  336. package/src/core/{providers → __tests__}/KeylessJsonSchemaCodec.spec.ts +1 -1
  337. package/src/core/{providers → __tests__}/SchemaValidator.spec.ts +1 -1
  338. package/src/core/{helpers → __tests__}/jsonSchemaToTypeBox.spec.ts +1 -1
  339. package/src/core/index.shared.ts +1 -1
  340. package/src/core/primitives/{$use.ts → $state.ts} +4 -4
  341. package/src/crypto/{providers → __tests__}/BrowserCryptoProvider.browser.spec.ts +1 -1
  342. package/src/crypto/{providers → __tests__}/CryptoProvider.spec.ts +1 -1
  343. package/src/datetime/{primitives → __tests__}/$debounce.spec.ts +1 -1
  344. package/src/datetime/{primitives → __tests__}/$throttle.spec.ts +1 -1
  345. package/src/datetime/{primitives → __tests__}/$timeout.spec.ts +1 -1
  346. package/src/email/brevo/{providers → __tests__}/BrevoEmailProvider.spec.ts +1 -1
  347. package/src/email/core/{providers → __tests__}/LocalEmailProvider.spec.ts +39 -150
  348. package/src/email/core/providers/LocalEmailProvider.ts +13 -51
  349. package/src/email/smtp/providers/NodemailerEmailProvider.ts +2 -2
  350. package/src/lock/core/{primitives → __tests__}/$lock.middleware.spec.ts +1 -1
  351. package/src/lock/core/primitives/$lock.ts +2 -2
  352. package/src/logger/index.ts +10 -4
  353. package/src/mcp/transports/SseMcpTransport.ts +2 -2
  354. package/src/orm/__tests__/ModelBuilder-tests.ts +53 -0
  355. package/src/orm/__tests__/ModelBuilder.spec.ts +80 -0
  356. package/src/orm/__tests__/organization-tests.ts +200 -0
  357. package/src/orm/__tests__/organization.spec.ts +103 -0
  358. package/src/orm/core/{providers/drivers → __tests__}/BunSqliteProvider.bun.spec.ts +5 -2
  359. package/src/orm/core/constants/PG_SYMBOLS.ts +2 -0
  360. package/src/orm/core/index.shared.ts +1 -0
  361. package/src/orm/core/primitives/$entity.ts +31 -0
  362. package/src/orm/core/providers/DatabaseTypeProvider.ts +11 -0
  363. package/src/orm/core/providers/DrizzleKitProvider.ts +1 -1
  364. package/src/orm/core/providers/drivers/BunSqliteProvider.ts +2 -2
  365. package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +3 -3
  366. package/src/orm/core/services/ModelBuilder.ts +11 -0
  367. package/src/orm/core/services/QueryManager.ts +16 -2
  368. package/src/orm/core/services/Repository.ts +70 -10
  369. package/src/orm/postgres/{providers → __tests__}/BunPostgresProvider.bun.spec.ts +1 -1
  370. package/src/queue/core/providers/WorkerProvider.ts +2 -2
  371. package/src/queue/redis/providers/RedisQueueProvider.ts +2 -2
  372. package/src/react/core/{hooks → __tests__}/useAction.browser.spec.tsx +1 -1
  373. package/src/react/core/hooks/useAction.ts +7 -6
  374. package/src/react/head/{providers → __tests__}/BrowserHeadProvider.browser.spec.ts +1 -1
  375. package/src/react/head/{helpers → __tests__}/SeoExpander.spec.ts +1 -1
  376. package/src/react/i18n/{providers → __tests__}/I18nProvider.spec.ts +1 -1
  377. package/src/react/i18n/{hooks → __tests__}/useI18n.browser.spec.tsx +1 -1
  378. package/src/react/intro/components/GettingStartedDevtoolsSlide.tsx +1 -1
  379. package/src/react/router/{providers → __tests__}/ReactBrowserProvider.browser.spec.ts +1 -1
  380. package/src/react/router/providers/ReactBrowserProvider.ts +2 -2
  381. package/src/react/router/providers/ReactPageProvider.ts +2 -2
  382. package/src/react/router/providers/ReactServerProvider.ts +3 -3
  383. package/src/redis/{providers → __tests__}/BunRedisProvider.bun.spec.ts +4 -4
  384. package/src/retry/{primitives → __tests__}/$retry.middleware.spec.ts +1 -1
  385. package/src/router/{TemplatedPathParser.spec.ts → __tests__/TemplatedPathParser.spec.ts} +1 -1
  386. package/src/scheduler/primitives/$scheduler.ts +2 -2
  387. package/src/security/{primitives → __tests__}/$secure-browser.spec.ts +1 -1
  388. package/src/security/{primitives → __tests__}/$secure.spec.ts +1 -1
  389. package/src/security/primitives/$issuer.ts +1 -1
  390. package/src/security/providers/JwtProvider.ts +6 -10
  391. package/src/security/providers/SecurityProvider.ts +6 -11
  392. package/src/security/schemas/userAccountInfoSchema.ts +3 -3
  393. package/src/server/auth/providers/ServerAuthProvider.ts +24 -2
  394. package/src/server/cookies/{services → __tests__}/CookieParser.spec.ts +1 -1
  395. package/src/server/core/{primitives → __tests__}/$circuit.spec.ts +1 -1
  396. package/src/server/core/{providers → __tests__}/NodeHttpServerProvider.spec.ts +1 -1
  397. package/src/server/core/{providers → __tests__}/ServerBodyParserProvider.spec.ts +31 -1
  398. package/src/server/core/{providers → __tests__}/ServerCompressProvider.spec.ts +1 -1
  399. package/src/server/core/{providers → __tests__}/ServerHelmetProvider.spec.ts +4 -1
  400. package/src/server/core/{providers → __tests__}/ServerMultipartProvider.spec.ts +1 -1
  401. package/src/server/core/{services → __tests__}/ServerRequestParser.spec.ts +1 -1
  402. package/src/server/core/primitives/$action.ts +2 -2
  403. package/src/server/core/primitives/$sse.ts +2 -2
  404. package/src/server/core/providers/ServerBodyParserProvider.ts +21 -12
  405. package/src/server/core/providers/ServerCompressProvider.ts +2 -2
  406. package/src/server/core/providers/ServerHelmetProvider.ts +2 -2
  407. package/src/server/core/providers/ServerMultipartProvider.ts +2 -2
  408. package/src/server/core/providers/ServerRouterProvider.ts +1 -5
  409. package/src/server/cors/{primitives → __tests__}/$cors.spec.ts +1 -1
  410. package/src/server/cors/providers/ServerCorsProvider.ts +2 -2
  411. package/src/server/links/{services → __tests__}/BatchCollector.spec.ts +1 -1
  412. package/src/server/links/providers/LinkProvider.ts +2 -2
  413. package/src/server/links/providers/RemotePrimitiveProvider.ts +2 -2
  414. package/src/server/links/providers/ServerLinksProvider.ts +2 -2
  415. package/src/server/rate-limit/{primitives → __tests__}/$rateLimit.spec.ts +1 -1
  416. package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +2 -2
  417. package/src/server/swagger/providers/ServerSwaggerProvider.ts +2 -2
  418. package/src/sms/{providers → __tests__}/LocalSmsProvider.spec.ts +35 -29
  419. package/src/sms/providers/LocalSmsProvider.ts +13 -24
  420. package/src/system/{providers → __tests__}/MemoryFileSystemProvider.spec.ts +1 -1
  421. package/src/system/{providers → __tests__}/MemoryShellProvider.spec.ts +1 -1
  422. package/src/topic/redis/providers/RedisTopicProvider.ts +2 -2
  423. package/src/websocket/{services → __tests__}/RoomManager.spec.ts +1 -1
  424. package/src/websocket/providers/NodeWebSocketServerProvider.ts +2 -2
  425. package/tsconfig.base.json +1 -0
  426. package/src/cli/platform/adapters/DockerAdapter.spec.ts +0 -378
  427. package/src/cli/platform/adapters/DockerAdapter.ts +0 -417
  428. package/src/cli/platform/services/DockerComposeGenerator.spec.ts +0 -490
  429. package/src/cli/platform/services/DockerComposeGenerator.ts +0 -353
  430. package/src/cli/platform/services/DockerSshService.spec.ts +0 -47
  431. package/src/cli/platform/services/DockerSshService.ts +0 -61
  432. /package/src/api/audits/{primitives → __tests__}/$audit.spec.ts +0 -0
  433. /package/src/api/audits/{services → __tests__}/AuditService.spec.ts +0 -0
  434. /package/src/api/files/{controllers → __tests__}/AdminFileStatsController.spec.ts +0 -0
  435. /package/src/api/files/{controllers → __tests__}/FileController.spec.ts +0 -0
  436. /package/src/api/files/{jobs → __tests__}/FileJobs.spec.ts +0 -0
  437. /package/src/api/files/{services → __tests__}/FileService.spec.ts +0 -0
  438. /package/src/api/jobs/{primitives → __tests__}/$job-middleware.spec.ts +0 -0
  439. /package/src/api/parameters/{primitives → __tests__}/$parameter.spec.ts +0 -0
  440. /package/src/api/users/{primitives → __tests__}/$realm.spec.ts +0 -0
  441. /package/src/api/users/{controllers → __tests__}/AdminIdentityController.spec.ts +0 -0
  442. /package/src/api/users/{controllers → __tests__}/AdminSessionController.spec.ts +0 -0
  443. /package/src/api/users/{controllers → __tests__}/AdminUserController.spec.ts +0 -0
  444. /package/src/api/users/{services → __tests__}/CredentialService.spec.ts +0 -0
  445. /package/src/api/users/{providers → __tests__}/RealmProvider.spec.ts +0 -0
  446. /package/src/api/users/{services → __tests__}/RegistrationService.spec.ts +0 -0
  447. /package/src/batch/{primitives → __tests__}/$batch.spec.ts +0 -0
  448. /package/src/batch/{providers → __tests__}/BatchProvider.spec.ts +0 -0
  449. /package/src/bucket/{primitives → __tests__}/$bucket.spec.ts +0 -0
  450. /package/src/bucket/{providers → __tests__}/FileStorageProvider.spec.ts +0 -0
  451. /package/src/bucket/{providers → __tests__}/LocalFileStorageProvider.spec.ts +0 -0
  452. /package/src/bucket/{providers → __tests__}/MemoryFileStorageProvider.spec.ts +0 -0
  453. /package/src/cache/core/{primitives → __tests__}/$cache.spec.ts +0 -0
  454. /package/src/cache/redis/{providers → __tests__}/RedisCacheProvider.spec.ts +0 -0
  455. /package/src/command/{primitives → __tests__}/$command.spec.ts +0 -0
  456. /package/src/command/{helpers → __tests__}/Asker.spec.ts +0 -0
  457. /package/src/command/{helpers → __tests__}/Runner.spec.ts +0 -0
  458. /package/src/core/{primitives → __tests__}/$context.spec.ts +0 -0
  459. /package/src/core/{primitives → __tests__}/$env.spec.ts +0 -0
  460. /package/src/core/{primitives → __tests__}/$hook.spec.ts +0 -0
  461. /package/src/core/{primitives → __tests__}/$inject.spec.ts +0 -0
  462. /package/src/core/{primitives → __tests__}/$module.spec.ts +0 -0
  463. /package/src/core/{providers → __tests__}/CodecManager.spec.ts +0 -0
  464. /package/src/core/{providers → __tests__}/EventManager.spec.ts +0 -0
  465. /package/src/core/{providers → __tests__}/StateManager.spec.ts +0 -0
  466. /package/src/core/{providers → __tests__}/TypeProvider.spec.ts +0 -0
  467. /package/src/datetime/{primitives → __tests__}/$interval.spec.ts +0 -0
  468. /package/src/datetime/{providers → __tests__}/DateTimeProvider.spec.ts +0 -0
  469. /package/src/email/core/{primitives → __tests__}/$email.spec.ts +0 -0
  470. /package/src/fake/{providers → __tests__}/FakeProvider.spec.ts +0 -0
  471. /package/src/lock/core/{providers → __tests__}/MemoryLockProvider.spec.ts +0 -0
  472. /package/src/lock/redis/{providers → __tests__}/RedisLockProvider.spec.ts +0 -0
  473. /package/src/logger/{primitives → __tests__}/$logger.spec.ts +0 -0
  474. /package/src/logger/{services → __tests__}/Logger.spec.ts +0 -0
  475. /package/src/mcp/{primitives → __tests__}/$prompt.spec.ts +0 -0
  476. /package/src/mcp/{primitives → __tests__}/$resource.spec.ts +0 -0
  477. /package/src/mcp/{primitives → __tests__}/$tool.spec.ts +0 -0
  478. /package/src/mcp/{providers → __tests__}/McpServerProvider.spec.ts +0 -0
  479. /package/src/mcp/{helpers → __tests__}/jsonrpc.spec.ts +0 -0
  480. /package/src/orm/core/{helpers → __tests__}/parseQueryString.spec.ts +0 -0
  481. /package/src/queue/core/{primitives → __tests__}/$consumer.spec.ts +0 -0
  482. /package/src/queue/core/{providers → __tests__}/MemoryQueueProvider.spec.ts +0 -0
  483. /package/src/queue/core/{providers → __tests__}/WorkerProvider.spec.ts +0 -0
  484. /package/src/queue/redis/{providers → __tests__}/RedisQueueProvider.spec.ts +0 -0
  485. /package/src/react/form/{hooks → __tests__}/useForm.browser.spec.tsx +0 -0
  486. /package/src/react/head/{hooks → __tests__}/useHead.spec.tsx +0 -0
  487. /package/src/react/i18n/{components → __tests__}/Localize.spec.tsx +0 -0
  488. /package/src/react/router/{primitives → __tests__}/$page.browser.spec.tsx +0 -0
  489. /package/src/react/router/{primitives → __tests__}/$page.middleware.spec.tsx +0 -0
  490. /package/src/react/router/{primitives → __tests__}/$page.spec.tsx +0 -0
  491. /package/src/react/router/{providers → __tests__}/ReactPreloadProvider.spec.ts +0 -0
  492. /package/src/react/router/{providers → __tests__}/ReactServerProvider.spec.tsx +0 -0
  493. /package/src/react/router/{providers → __tests__}/ReactServerTemplateProvider.spec.ts +0 -0
  494. /package/src/retry/{primitives → __tests__}/$retry.spec.ts +0 -0
  495. /package/src/retry/{providers → __tests__}/RetryProvider.spec.ts +0 -0
  496. /package/src/router/{providers → __tests__}/RouterProvider.spec.ts +0 -0
  497. /package/src/security/{primitives → __tests__}/$issuer.spec.ts +0 -0
  498. /package/src/security/{primitives → __tests__}/$permission.spec.ts +0 -0
  499. /package/src/security/{primitives → __tests__}/$role.spec.ts +0 -0
  500. /package/src/security/{primitives → __tests__}/$serviceAccount.spec.ts +0 -0
  501. /package/src/security/{providers → __tests__}/SecurityProvider.spec.ts +0 -0
  502. /package/src/server/cookies/{providers → __tests__}/ServerCookiesProvider.spec.ts +0 -0
  503. /package/src/server/core/{primitives → __tests__}/$action.spec.ts +0 -0
  504. /package/src/server/core/{primitives → __tests__}/$middleware.spec.ts +0 -0
  505. /package/src/server/core/{primitives → __tests__}/$route.spec.ts +0 -0
  506. /package/src/server/core/{primitives → __tests__}/$sse.spec.ts +0 -0
  507. /package/src/server/core/{providers → __tests__}/BunHttpServerProvider.bun.spec.ts +0 -0
  508. /package/src/server/core/{services → __tests__}/HttpClient.spec.ts +0 -0
  509. /package/src/server/core/{providers → __tests__}/ServerLoggerProvider.spec.ts +0 -0
  510. /package/src/server/core/{services → __tests__}/UserAgentParser.spec.ts +0 -0
  511. /package/src/server/cors/{providers → __tests__}/ServerCorsProvider.spec.ts +0 -0
  512. /package/src/server/etag/{providers → __tests__}/ServerEtagProvider.spec.ts +0 -0
  513. /package/src/server/health/{providers → __tests__}/ServerHealthProvider.spec.ts +0 -0
  514. /package/src/server/links/{primitives → __tests__}/$remote.spec.ts +0 -0
  515. /package/src/server/links/{services → __tests__}/BatchEndpoint.spec.ts +0 -0
  516. /package/src/server/links/{providers → __tests__}/LinkProvider.spec.ts +0 -0
  517. /package/src/server/links/{providers → __tests__}/ServerLinksProvider.spec.ts +0 -0
  518. /package/src/server/metrics/{providers → __tests__}/ServerMetricsProvider.spec.ts +0 -0
  519. /package/src/server/proxy/{primitives → __tests__}/$proxy.spec.ts +0 -0
  520. /package/src/server/rate-limit/{providers → __tests__}/ServerRateLimitProvider.spec.ts +0 -0
  521. /package/src/server/static/{primitives → __tests__}/$serve.spec.ts +0 -0
  522. /package/src/server/swagger/{primitives → __tests__}/$swagger.spec.ts +0 -0
  523. /package/src/sms/{primitives → __tests__}/$sms.spec.ts +0 -0
  524. /package/src/sms/{providers → __tests__}/MemorySmsProvider.spec.ts +0 -0
  525. /package/src/system/{services → __tests__}/FileDetector.spec.ts +0 -0
  526. /package/src/system/{providers → __tests__}/NodeFileSystemProvider.spec.ts +0 -0
  527. /package/src/topic/core/{primitives → __tests__}/$subscriber.spec.ts +0 -0
  528. /package/src/topic/core/{providers → __tests__}/MemoryTopicProvider.spec.ts +0 -0
  529. /package/src/topic/redis/{providers → __tests__}/RedisTopicProvider.spec.ts +0 -0
  530. /package/src/websocket/{primitives → __tests__}/$channel.spec.ts +0 -0
@@ -1,23 +1,75 @@
1
1
  import { $atom, $context, $inject, $module, Alepha, AlephaError, t } from "alepha";
2
- import { $cache, AlephaCache, CacheProvider } from "alepha/cache";
3
- import { AlephaEmail } from "alepha/email";
2
+ import { AuditService } from "alepha/api/audits";
3
+ import { $bucket } from "alepha/bucket";
4
4
  import { $issuer, $permission, $secure, CryptoProvider, InvalidCredentialsError, SecurityProvider } from "alepha/security";
5
5
  import { $action, BadRequestError, ConflictError, HttpError, UnauthorizedError, okSchema } from "alepha/server";
6
- import { $entity, $repository, db, pageQuerySchema, parseQueryString } from "alepha/orm";
6
+ import { $entity, $repository, db, pageQuerySchema, parseQueryString, sql } from "alepha/orm";
7
7
  import { $logger } from "alepha/logger";
8
- import { AuditService } from "alepha/api/audits";
9
8
  import { $client } from "alepha/server/links";
10
9
  import { $notification } from "alepha/api/notifications";
11
10
  import { $authCredentials, $authGithub, $authGoogle, ServerAuthProvider, authenticationProviderSchema } from "alepha/server/auth";
12
11
  import { $etag } from "alepha/server/etag";
13
12
  import { randomInt, randomUUID } from "node:crypto";
13
+ import { $cache, CacheProvider } from "alepha/cache";
14
14
  import { DateTimeProvider } from "alepha/datetime";
15
- import { FileSystemProvider } from "alepha/system";
16
- import { $bucket } from "alepha/bucket";
17
15
  import { $job } from "alepha/api/jobs";
16
+ import { FileSystemProvider } from "alepha/system";
18
17
  import { AlephaApiKeys, ApiKeyService } from "alepha/api/keys";
19
18
  import { $parameter, AlephaApiParameters } from "alepha/api/parameters";
20
19
  import { AlephaApiVerification } from "alepha/api/verifications";
20
+ //#region ../../src/api/users/audits/UserAudits.ts
21
+ /**
22
+ * User-specific audit wrapper service.
23
+ *
24
+ * This service wraps the core AuditService to provide user-related audit logging.
25
+ * It is lazy-loaded when the `audits` feature is enabled in the realm.
26
+ */
27
+ var UserAudits = class {
28
+ auditService = $inject(AuditService);
29
+ /**
30
+ * Record a user-related audit event.
31
+ */
32
+ recordUser(action, context) {
33
+ return this.auditService.recordUser(action, context);
34
+ }
35
+ /**
36
+ * Record an authentication-related audit event.
37
+ */
38
+ recordAuth(action, context) {
39
+ return this.auditService.recordAuth(action, context);
40
+ }
41
+ /**
42
+ * Record a generic audit event.
43
+ */
44
+ record(category, action, context) {
45
+ return this.auditService.record(category, action, context);
46
+ }
47
+ };
48
+ //#endregion
49
+ //#region ../../src/api/users/buckets/UserBuckets.ts
50
+ /**
51
+ * User-specific file storage wrapper service.
52
+ *
53
+ * This service provides file storage for user-related files such as:
54
+ * - User avatars/profile pictures
55
+ *
56
+ * It is lazy-loaded when the `avatars` feature is enabled in the realm.
57
+ */
58
+ var UserBuckets = class {
59
+ /**
60
+ * Bucket for user avatar storage.
61
+ */
62
+ avatars = $bucket({
63
+ maxSize: 5 * 1024 * 1024,
64
+ mimeTypes: [
65
+ "image/jpeg",
66
+ "image/png",
67
+ "image/gif",
68
+ "image/webp"
69
+ ]
70
+ });
71
+ };
72
+ //#endregion
21
73
  //#region ../../src/api/users/schemas/identityQuerySchema.ts
22
74
  const identityQuerySchema = t.extend(pageQuerySchema, {
23
75
  userId: t.optional(t.uuid()),
@@ -36,7 +88,7 @@ const users = $entity({
36
88
  realm: db.default(t.text(), DEFAULT_USER_REALM_NAME),
37
89
  username: t.optional(t.shortText({
38
90
  minLength: 3,
39
- maxLength: 50
91
+ maxLength: 30
40
92
  })),
41
93
  email: t.optional(t.string({ format: "email" })),
42
94
  phoneNumber: t.optional(t.e164()),
@@ -45,12 +97,14 @@ const users = $entity({
45
97
  lastName: t.optional(t.string()),
46
98
  picture: t.optional(t.string()),
47
99
  enabled: db.default(t.boolean(), true),
48
- emailVerified: db.default(t.boolean(), false)
100
+ emailVerified: db.default(t.boolean(), false),
101
+ organizationId: db.organization()
49
102
  }),
50
103
  indexes: [
51
104
  {
52
- columns: ["realm", "username"],
53
- unique: true
105
+ expressions: (self) => [self.realm, sql`LOWER(${self.username})`],
106
+ unique: true,
107
+ name: "users_realm_username_lower_idx"
54
108
  },
55
109
  {
56
110
  columns: ["realm", "email"],
@@ -91,35 +145,6 @@ const identities = $entity({
91
145
  //#region ../../src/api/users/schemas/identityResourceSchema.ts
92
146
  const identityResourceSchema = t.omit(identities.schema, ["password"]);
93
147
  //#endregion
94
- //#region ../../src/api/users/audits/UserAudits.ts
95
- /**
96
- * User-specific audit wrapper service.
97
- *
98
- * This service wraps the core AuditService to provide user-related audit logging.
99
- * It is lazy-loaded when the `audits` feature is enabled in the realm.
100
- */
101
- var UserAudits = class {
102
- auditService = $inject(AuditService);
103
- /**
104
- * Record a user-related audit event.
105
- */
106
- recordUser(action, context) {
107
- return this.auditService.recordUser(action, context);
108
- }
109
- /**
110
- * Record an authentication-related audit event.
111
- */
112
- recordAuth(action, context) {
113
- return this.auditService.recordAuth(action, context);
114
- }
115
- /**
116
- * Record a generic audit event.
117
- */
118
- record(category, action, context) {
119
- return this.auditService.record(category, action, context);
120
- }
121
- };
122
- //#endregion
123
148
  //#region ../../src/api/users/atoms/realmAuthSettingsAtom.ts
124
149
  const fieldRequirement = (description) => t.union([
125
150
  t.const("none"),
@@ -241,7 +266,7 @@ var RealmProvider = class {
241
266
  register(realmName, realmOptions = {}) {
242
267
  if (realmName.includes(".")) throw new AlephaError(`Realm name "${realmName}" must not contain dots — dots are reserved for parameter tree paths`);
243
268
  const features = {
244
- sessionPurge: false,
269
+ jobs: false,
245
270
  notifications: false,
246
271
  apiKeys: false,
247
272
  parameters: false,
@@ -912,7 +937,7 @@ var UserService = class {
912
937
  });
913
938
  const realm = this.realmProvider.getRealm(userRealmName);
914
939
  if (data.username) {
915
- if (await this.users(userRealmName).findOne({ where: { username: { eq: data.username } } })) {
940
+ if (await this.users(userRealmName).findOne({ where: { username: { ilike: data.username } } })) {
916
941
  this.log.debug("Username already taken", { username: data.username });
917
942
  throw new BadRequestError("User with this username already exists");
918
943
  }
@@ -1640,7 +1665,7 @@ var RegistrationService = class {
1640
1665
  async checkUserAvailability(body, userRealmName) {
1641
1666
  const userRepository = this.realmProvider.userRepository(userRealmName);
1642
1667
  if (body.username) {
1643
- if (await userRepository.findOne({ where: { username: { eq: body.username } } })) {
1668
+ if (await userRepository.findOne({ where: { username: { ilike: body.username } } })) {
1644
1669
  this.log.debug("Username already taken", { username: body.username });
1645
1670
  throw new ConflictError("User with this username already exists");
1646
1671
  }
@@ -1963,6 +1988,44 @@ var UserController = class {
1963
1988
  });
1964
1989
  };
1965
1990
  //#endregion
1991
+ //#region ../../src/api/users/jobs/UserJobs.ts
1992
+ /**
1993
+ * User-specific jobs wrapper service.
1994
+ *
1995
+ * This service handles user-related scheduled jobs such as:
1996
+ * - Session purge (cleaning up expired sessions)
1997
+ * - Verification code cleanup
1998
+ * - Inactive user notifications
1999
+ *
2000
+ * It is lazy-loaded when the `sessionPurge` feature is enabled in the realm.
2001
+ */
2002
+ var UserJobs = class {
2003
+ log = $logger();
2004
+ dateTimeProvider = $inject(DateTimeProvider);
2005
+ sessionRepository = $repository(sessions);
2006
+ /**
2007
+ * Purge expired sessions from the database.
2008
+ *
2009
+ * This job runs daily at 3:00 AM and removes all sessions
2010
+ * where the `expiresAt` timestamp has passed.
2011
+ */
2012
+ purgeExpiredSessions = $job({
2013
+ cron: "0 0 * * *",
2014
+ handler: async () => {
2015
+ const now = this.dateTimeProvider.nowISOString();
2016
+ this.log.info("Starting expired sessions purge", { cutoffTime: now });
2017
+ const expiredSessions = await this.sessionRepository.findMany({ where: { expiresAt: { lt: now } } });
2018
+ if (expiredSessions.length === 0) {
2019
+ this.log.info("No expired sessions found");
2020
+ return;
2021
+ }
2022
+ this.log.info("Found expired sessions", { count: expiredSessions.length });
2023
+ const deletedIds = await this.sessionRepository.deleteMany({ expiresAt: { lt: now } });
2024
+ this.log.info("Expired sessions purged successfully", { deletedCount: deletedIds.length });
2025
+ }
2026
+ });
2027
+ };
2028
+ //#endregion
1966
2029
  //#region ../../src/api/users/services/SessionService.ts
1967
2030
  var SessionService = class SessionService {
1968
2031
  alepha = $inject(Alepha);
@@ -2022,6 +2085,37 @@ var SessionService = class SessionService {
2022
2085
  return true;
2023
2086
  }
2024
2087
  /**
2088
+ * Generate a unique username from an OAuth profile.
2089
+ *
2090
+ * 1. Extract candidate from email prefix
2091
+ * 2. Sanitize against realm's usernameRegExp (strip invalid chars, truncate)
2092
+ * 3. Check case-insensitive uniqueness, append suffix (2, 3, ...) if taken
2093
+ * 4. Fall back to "user" + random 6-char alphanumeric if all else fails
2094
+ */
2095
+ async generateUniqueUsername(profile, realmSettings, users) {
2096
+ const maxLength = 30;
2097
+ const maxSuffixAttempts = 10;
2098
+ let candidate = profile.email?.split("@")[0] ?? profile.name ?? "";
2099
+ candidate = candidate.replace(/[^a-zA-Z0-9_.-]/g, "");
2100
+ if (realmSettings?.usernameRegExp) try {
2101
+ if (!new RegExp(realmSettings.usernameRegExp).test(candidate)) candidate = candidate.replace(/[^a-zA-Z0-9_]/g, "");
2102
+ } catch {}
2103
+ if (candidate.length < 3) candidate = `user${candidate}`;
2104
+ candidate = candidate.slice(0, maxLength - 2);
2105
+ const isAvailable = async (name) => {
2106
+ return !(await users.findMany({
2107
+ where: { username: { contains: name } },
2108
+ limit: 1
2109
+ })).some((u) => u.username?.toLowerCase() === name.toLowerCase());
2110
+ };
2111
+ if (await isAvailable(candidate)) return candidate;
2112
+ for (let i = 2; i <= maxSuffixAttempts + 1; i++) {
2113
+ const withSuffix = `${candidate}${i}`;
2114
+ if (withSuffix.length <= maxLength && await isAvailable(withSuffix)) return withSuffix;
2115
+ }
2116
+ return `user${Math.random().toString(36).slice(2, 8)}`;
2117
+ }
2118
+ /**
2025
2119
  * Random delay to prevent timing attacks (50-200ms)
2026
2120
  * Uses cryptographically secure random number generation
2027
2121
  */
@@ -2102,7 +2196,7 @@ var SessionService = class SessionService {
2102
2196
  throw new InvalidCredentialsError();
2103
2197
  }
2104
2198
  }
2105
- where.username = username;
2199
+ where.username = { ilike: username };
2106
2200
  } else if (settings.email !== "none" && isEmail) where.email = username;
2107
2201
  else if (settings.phoneNumber !== "none" && isPhone) where.phoneNumber = username;
2108
2202
  else {
@@ -2356,9 +2450,20 @@ var SessionService = class SessionService {
2356
2450
  await this.ensureAdminRole(existing, userRealmName);
2357
2451
  return existing;
2358
2452
  }
2453
+ const realmSettings = await realm.getSettings();
2454
+ const adminEmails = realmSettings?.adminEmails ?? [];
2455
+ const isAdmin = profile.email && adminEmails.includes(profile.email);
2456
+ if (realmSettings?.registrationAllowed === false && !isAdmin) {
2457
+ this.log.warn("Registration not allowed for realm via OAuth2", {
2458
+ provider,
2459
+ userRealmName
2460
+ });
2461
+ throw new BadRequestError("Account doesn't exist");
2462
+ }
2463
+ const username = await this.generateUniqueUsername(profile, realmSettings, users);
2359
2464
  const user = await users.create({
2360
2465
  realm: realm.name,
2361
- username: profile.email.split("@")[0],
2466
+ username,
2362
2467
  email: profile.email,
2363
2468
  emailVerified: true,
2364
2469
  roles: ["user"]
@@ -2420,68 +2525,6 @@ var SessionService = class SessionService {
2420
2525
  }
2421
2526
  };
2422
2527
  //#endregion
2423
- //#region ../../src/api/users/buckets/UserBuckets.ts
2424
- /**
2425
- * User-specific file storage wrapper service.
2426
- *
2427
- * This service provides file storage for user-related files such as:
2428
- * - User avatars/profile pictures
2429
- *
2430
- * It is lazy-loaded when the `avatars` feature is enabled in the realm.
2431
- */
2432
- var UserBuckets = class {
2433
- /**
2434
- * Bucket for user avatar storage.
2435
- */
2436
- avatars = $bucket({
2437
- maxSize: 5 * 1024 * 1024,
2438
- mimeTypes: [
2439
- "image/jpeg",
2440
- "image/png",
2441
- "image/gif",
2442
- "image/webp"
2443
- ]
2444
- });
2445
- };
2446
- //#endregion
2447
- //#region ../../src/api/users/jobs/UserJobs.ts
2448
- /**
2449
- * User-specific jobs wrapper service.
2450
- *
2451
- * This service handles user-related scheduled jobs such as:
2452
- * - Session purge (cleaning up expired sessions)
2453
- * - Verification code cleanup
2454
- * - Inactive user notifications
2455
- *
2456
- * It is lazy-loaded when the `sessionPurge` feature is enabled in the realm.
2457
- */
2458
- var UserJobs = class {
2459
- log = $logger();
2460
- dateTimeProvider = $inject(DateTimeProvider);
2461
- sessionRepository = $repository(sessions);
2462
- /**
2463
- * Purge expired sessions from the database.
2464
- *
2465
- * This job runs daily at 3:00 AM and removes all sessions
2466
- * where the `expiresAt` timestamp has passed.
2467
- */
2468
- purgeExpiredSessions = $job({
2469
- cron: "0 0 * * *",
2470
- handler: async () => {
2471
- const now = this.dateTimeProvider.nowISOString();
2472
- this.log.info("Starting expired sessions purge", { cutoffTime: now });
2473
- const expiredSessions = await this.sessionRepository.findMany({ where: { expiresAt: { lt: now } } });
2474
- if (expiredSessions.length === 0) {
2475
- this.log.info("No expired sessions found");
2476
- return;
2477
- }
2478
- this.log.info("Found expired sessions", { count: expiredSessions.length });
2479
- const deletedIds = await this.sessionRepository.deleteMany({ expiresAt: { lt: now } });
2480
- this.log.info("Expired sessions purged successfully", { deletedCount: deletedIds.length });
2481
- }
2482
- });
2483
- };
2484
- //#endregion
2485
2528
  //#region ../../src/api/users/primitives/$realm.ts
2486
2529
  /**
2487
2530
  * Already configured realm for user management.
@@ -2504,7 +2547,7 @@ const $realm = (options = {}) => {
2504
2547
  const name = options.issuer?.name ?? "default";
2505
2548
  options.settings ??= {};
2506
2549
  const features = {
2507
- sessionPurge: false,
2550
+ jobs: false,
2508
2551
  notifications: false,
2509
2552
  apiKeys: false,
2510
2553
  parameters: false,
@@ -2520,7 +2563,7 @@ const $realm = (options = {}) => {
2520
2563
  const realmRegistration = realmProvider.register(name, options);
2521
2564
  if (features.avatars) alepha.with(UserBuckets);
2522
2565
  if (features.audits) alepha.with(UserAudits);
2523
- if (features.sessionPurge) alepha.with(UserJobs);
2566
+ if (features.jobs) alepha.with(UserJobs);
2524
2567
  if (features.notifications) {
2525
2568
  alepha.with(UserNotifications);
2526
2569
  alepha.with(AlephaApiVerification);
@@ -2667,8 +2710,6 @@ const resetPasswordSchema = t.object({
2667
2710
  const AlephaApiUsers = $module({
2668
2711
  name: "alepha.api.users",
2669
2712
  services: [
2670
- AlephaEmail,
2671
- AlephaCache,
2672
2713
  RealmProvider,
2673
2714
  SessionService,
2674
2715
  SessionCrudService,
@@ -2680,8 +2721,15 @@ const AlephaApiUsers = $module({
2680
2721
  AdminUserController,
2681
2722
  AdminSessionController,
2682
2723
  AdminIdentityController,
2683
- RealmController
2684
- ]
2724
+ RealmController,
2725
+ UserJobs,
2726
+ UserNotifications,
2727
+ UserAudits,
2728
+ UserBuckets
2729
+ ],
2730
+ register: (alepha) => {
2731
+ alepha.with(RealmProvider).with(SessionService).with(SessionCrudService).with(CredentialService).with(RegistrationService).with(UserService).with(IdentityService).with(UserController).with(AdminUserController).with(AdminSessionController).with(AdminIdentityController).with(RealmController);
2732
+ }
2685
2733
  });
2686
2734
  //#endregion
2687
2735
  export { $realm, AdminIdentityController, AdminSessionController, AdminUserController, AlephaApiUsers, CredentialService, DEFAULT_USER_REALM_NAME, IdentityService, RealmController, RealmProvider, RegistrationService, SessionCrudService, SessionService, UserAudits, UserBuckets, UserController, UserJobs, UserNotifications, UserService, completePasswordResetRequestSchema, completeRegistrationRequestSchema, createUserSchema, identities, identityQuerySchema, identityResourceSchema, loginSchema, passwordResetIntentResponseSchema, realmAuthSettingsAtom, realmConfigSchema, registerSchema, registrationIntentResponseSchema, resetPasswordRequestSchema, resetPasswordSchema, sessionQuerySchema, sessionResourceSchema, sessions, updateUserSchema, userQuerySchema, userResourceSchema, users };