alepha 0.19.0 → 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 (638) 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/files/index.js +5 -1
  8. package/dist/api/files/index.js.map +1 -1
  9. package/dist/api/jobs/index.d.ts +528 -496
  10. package/dist/api/jobs/index.d.ts.map +1 -1
  11. package/dist/api/jobs/index.js +3 -3
  12. package/dist/api/jobs/index.js.map +1 -1
  13. package/dist/api/keys/index.d.ts +202 -202
  14. package/dist/api/keys/index.d.ts.map +1 -1
  15. package/dist/api/notifications/index.d.ts +152 -152
  16. package/dist/api/notifications/index.d.ts.map +1 -1
  17. package/dist/api/organizations/index.browser.js +48 -0
  18. package/dist/api/organizations/index.browser.js.map +1 -0
  19. package/dist/api/organizations/index.d.ts +516 -0
  20. package/dist/api/organizations/index.d.ts.map +1 -0
  21. package/dist/api/organizations/index.js +202 -0
  22. package/dist/api/organizations/index.js.map +1 -0
  23. package/dist/api/parameters/index.d.ts +391 -358
  24. package/dist/api/parameters/index.d.ts.map +1 -1
  25. package/dist/api/parameters/index.js +5 -1
  26. package/dist/api/parameters/index.js.map +1 -1
  27. package/dist/api/users/index.browser.js +7 -5
  28. package/dist/api/users/index.browser.js.map +1 -1
  29. package/dist/api/users/index.d.ts +989 -931
  30. package/dist/api/users/index.d.ts.map +1 -1
  31. package/dist/api/users/index.js +292 -146
  32. package/dist/api/users/index.js.map +1 -1
  33. package/dist/api/verifications/index.d.ts +132 -132
  34. package/dist/api/verifications/index.d.ts.map +1 -1
  35. package/dist/api/verifications/index.js +2 -2
  36. package/dist/api/verifications/index.js.map +1 -1
  37. package/dist/batch/index.d.ts +6 -6
  38. package/dist/batch/index.d.ts.map +1 -1
  39. package/dist/billing/index.d.ts +1048 -0
  40. package/dist/billing/index.d.ts.map +1 -0
  41. package/dist/billing/index.js +713 -0
  42. package/dist/billing/index.js.map +1 -0
  43. package/dist/bin/index.js +0 -2
  44. package/dist/bin/index.js.map +1 -1
  45. package/dist/bucket/index.d.ts +10 -10
  46. package/dist/bucket/index.d.ts.map +1 -1
  47. package/dist/bucket/index.js +2 -2
  48. package/dist/bucket/index.js.map +1 -1
  49. package/dist/cache/core/index.d.ts +9 -9
  50. package/dist/cache/core/index.d.ts.map +1 -1
  51. package/dist/cache/core/index.js +2 -2
  52. package/dist/cache/core/index.js.map +1 -1
  53. package/dist/cache/core/index.workerd.js +2 -2
  54. package/dist/cache/core/index.workerd.js.map +1 -1
  55. package/dist/cache/redis/index.d.ts +6 -6
  56. package/dist/cache/redis/index.d.ts.map +1 -1
  57. package/dist/cache/redis/index.js +2 -2
  58. package/dist/cache/redis/index.js.map +1 -1
  59. package/dist/cli/config/index.d.ts +12 -2
  60. package/dist/cli/config/index.d.ts.map +1 -1
  61. package/dist/cli/config/index.js +4 -0
  62. package/dist/cli/config/index.js.map +1 -1
  63. package/dist/cli/core/index.d.ts +183 -139
  64. package/dist/cli/core/index.d.ts.map +1 -1
  65. package/dist/cli/core/index.js +283 -86
  66. package/dist/cli/core/index.js.map +1 -1
  67. package/dist/cli/devtools/index.d.ts +45 -0
  68. package/dist/cli/devtools/index.d.ts.map +1 -0
  69. package/dist/cli/devtools/index.js +170 -0
  70. package/dist/cli/devtools/index.js.map +1 -0
  71. package/dist/cli/platform/index.d.ts +383 -492
  72. package/dist/cli/platform/index.d.ts.map +1 -1
  73. package/dist/cli/platform/index.js +42 -511
  74. package/dist/cli/platform/index.js.map +1 -1
  75. package/dist/cli/vendor/index.d.ts +196 -0
  76. package/dist/cli/vendor/index.d.ts.map +1 -0
  77. package/dist/cli/vendor/index.js +384 -0
  78. package/dist/cli/vendor/index.js.map +1 -0
  79. package/dist/command/index.d.ts +18 -18
  80. package/dist/command/index.d.ts.map +1 -1
  81. package/dist/command/index.js +2 -2
  82. package/dist/command/index.js.map +1 -1
  83. package/dist/core/index.browser.js +4 -4
  84. package/dist/core/index.browser.js.map +1 -1
  85. package/dist/core/index.d.ts +10 -10
  86. package/dist/core/index.d.ts.map +1 -1
  87. package/dist/core/index.js +4 -4
  88. package/dist/core/index.js.map +1 -1
  89. package/dist/core/index.native.js +4 -4
  90. package/dist/core/index.native.js.map +1 -1
  91. package/dist/core/index.workerd.js +4 -4
  92. package/dist/core/index.workerd.js.map +1 -1
  93. package/dist/crypto/index.d.ts +7 -7
  94. package/dist/crypto/index.d.ts.map +1 -1
  95. package/dist/datetime/index.d.ts +4 -4
  96. package/dist/datetime/index.d.ts.map +1 -1
  97. package/dist/email/brevo/index.d.ts +4 -4
  98. package/dist/email/brevo/index.d.ts.map +1 -1
  99. package/dist/email/core/index.d.ts +15 -11
  100. package/dist/email/core/index.d.ts.map +1 -1
  101. package/dist/email/core/index.js +12 -35
  102. package/dist/email/core/index.js.map +1 -1
  103. package/dist/email/smtp/index.d.ts +12 -12
  104. package/dist/email/smtp/index.d.ts.map +1 -1
  105. package/dist/email/smtp/index.js +7 -4
  106. package/dist/email/smtp/index.js.map +1 -1
  107. package/dist/fake/index.d.ts +4 -8
  108. package/dist/fake/index.d.ts.map +1 -1
  109. package/dist/fake/index.js +55 -889
  110. package/dist/fake/index.js.map +1 -1
  111. package/dist/lock/core/index.d.ts +13 -13
  112. package/dist/lock/core/index.d.ts.map +1 -1
  113. package/dist/lock/core/index.js +2 -2
  114. package/dist/lock/core/index.js.map +1 -1
  115. package/dist/lock/redis/index.d.ts +4 -4
  116. package/dist/lock/redis/index.d.ts.map +1 -1
  117. package/dist/logger/index.d.ts +16 -15
  118. package/dist/logger/index.d.ts.map +1 -1
  119. package/dist/logger/index.js +5 -2
  120. package/dist/logger/index.js.map +1 -1
  121. package/dist/mcp/index.d.ts +11 -11
  122. package/dist/mcp/index.d.ts.map +1 -1
  123. package/dist/mcp/index.js +2 -2
  124. package/dist/mcp/index.js.map +1 -1
  125. package/dist/orm/core/index.browser.js +11 -1
  126. package/dist/orm/core/index.browser.js.map +1 -1
  127. package/dist/orm/core/index.bun.js +53 -16
  128. package/dist/orm/core/index.bun.js.map +1 -1
  129. package/dist/orm/core/index.d.ts +95 -51
  130. package/dist/orm/core/index.d.ts.map +1 -1
  131. package/dist/orm/core/index.js +55 -14
  132. package/dist/orm/core/index.js.map +1 -1
  133. package/dist/orm/postgres/index.bun.js +17 -11
  134. package/dist/orm/postgres/index.bun.js.map +1 -1
  135. package/dist/orm/postgres/index.d.ts +21 -15
  136. package/dist/orm/postgres/index.d.ts.map +1 -1
  137. package/dist/orm/postgres/index.js +19 -13
  138. package/dist/orm/postgres/index.js.map +1 -1
  139. package/dist/queue/core/index.d.ts +14 -14
  140. package/dist/queue/core/index.d.ts.map +1 -1
  141. package/dist/queue/core/index.js +2 -2
  142. package/dist/queue/core/index.js.map +1 -1
  143. package/dist/queue/core/index.workerd.js +2 -2
  144. package/dist/queue/core/index.workerd.js.map +1 -1
  145. package/dist/queue/redis/index.d.ts +4 -4
  146. package/dist/queue/redis/index.d.ts.map +1 -1
  147. package/dist/queue/redis/index.js +2 -2
  148. package/dist/queue/redis/index.js.map +1 -1
  149. package/dist/react/auth/index.d.ts +9 -9
  150. package/dist/react/auth/index.d.ts.map +1 -1
  151. package/dist/react/core/index.d.ts +6 -6
  152. package/dist/react/core/index.d.ts.map +1 -1
  153. package/dist/react/core/index.js +5 -4
  154. package/dist/react/core/index.js.map +1 -1
  155. package/dist/react/form/index.d.ts +4 -4
  156. package/dist/react/form/index.d.ts.map +1 -1
  157. package/dist/react/head/index.d.ts +4 -4
  158. package/dist/react/head/index.d.ts.map +1 -1
  159. package/dist/react/i18n/index.d.ts +9 -9
  160. package/dist/react/i18n/index.d.ts.map +1 -1
  161. package/dist/react/intro/index.d.ts +2 -2
  162. package/dist/react/intro/index.d.ts.map +1 -1
  163. package/dist/react/intro/index.js +3 -4
  164. package/dist/react/intro/index.js.map +1 -1
  165. package/dist/react/router/index.browser.js +4 -5
  166. package/dist/react/router/index.browser.js.map +1 -1
  167. package/dist/react/router/index.d.ts +215 -215
  168. package/dist/react/router/index.d.ts.map +1 -1
  169. package/dist/react/router/index.js +6 -7
  170. package/dist/react/router/index.js.map +1 -1
  171. package/dist/react/testing/index.d.ts +2 -2
  172. package/dist/react/testing/index.d.ts.map +1 -1
  173. package/dist/react/testing/index.js +2 -4
  174. package/dist/react/testing/index.js.map +1 -1
  175. package/dist/redis/index.d.ts +19 -19
  176. package/dist/redis/index.d.ts.map +1 -1
  177. package/dist/retry/index.d.ts +4 -4
  178. package/dist/retry/index.d.ts.map +1 -1
  179. package/dist/scheduler/index.d.ts +13 -13
  180. package/dist/scheduler/index.d.ts.map +1 -1
  181. package/dist/scheduler/index.js +2 -2
  182. package/dist/scheduler/index.js.map +1 -1
  183. package/dist/scheduler/index.workerd.js +2 -2
  184. package/dist/scheduler/index.workerd.js.map +1 -1
  185. package/dist/security/index.browser.js +1 -1
  186. package/dist/security/index.browser.js.map +1 -1
  187. package/dist/security/index.d.ts +47 -47
  188. package/dist/security/index.d.ts.map +1 -1
  189. package/dist/security/index.js +9 -12
  190. package/dist/security/index.js.map +1 -1
  191. package/dist/server/auth/index.d.ts +170 -169
  192. package/dist/server/auth/index.d.ts.map +1 -1
  193. package/dist/server/auth/index.js +16 -2
  194. package/dist/server/auth/index.js.map +1 -1
  195. package/dist/server/cookies/index.d.ts +7 -7
  196. package/dist/server/cookies/index.d.ts.map +1 -1
  197. package/dist/server/core/index.d.ts +76 -76
  198. package/dist/server/core/index.d.ts.map +1 -1
  199. package/dist/server/core/index.js +23 -17
  200. package/dist/server/core/index.js.map +1 -1
  201. package/dist/server/cors/index.d.ts +13 -13
  202. package/dist/server/cors/index.d.ts.map +1 -1
  203. package/dist/server/cors/index.js +2 -2
  204. package/dist/server/cors/index.js.map +1 -1
  205. package/dist/server/etag/index.d.ts +9 -9
  206. package/dist/server/etag/index.d.ts.map +1 -1
  207. package/dist/server/health/index.d.ts +20 -20
  208. package/dist/server/health/index.d.ts.map +1 -1
  209. package/dist/server/links/index.browser.js +2 -2
  210. package/dist/server/links/index.browser.js.map +1 -1
  211. package/dist/server/links/index.d.ts +66 -66
  212. package/dist/server/links/index.d.ts.map +1 -1
  213. package/dist/server/links/index.js +4 -4
  214. package/dist/server/links/index.js.map +1 -1
  215. package/dist/server/metrics/index.d.ts +7 -7
  216. package/dist/server/metrics/index.d.ts.map +1 -1
  217. package/dist/server/proxy/index.d.ts +5 -5
  218. package/dist/server/proxy/index.d.ts.map +1 -1
  219. package/dist/server/rate-limit/index.d.ts +12 -12
  220. package/dist/server/rate-limit/index.d.ts.map +1 -1
  221. package/dist/server/rate-limit/index.js +2 -2
  222. package/dist/server/rate-limit/index.js.map +1 -1
  223. package/dist/server/static/index.d.ts +5 -5
  224. package/dist/server/static/index.d.ts.map +1 -1
  225. package/dist/server/swagger/index.d.ts +7 -7
  226. package/dist/server/swagger/index.d.ts.map +1 -1
  227. package/dist/server/swagger/index.js +2 -2
  228. package/dist/server/swagger/index.js.map +1 -1
  229. package/dist/sms/index.d.ts +11 -7
  230. package/dist/sms/index.d.ts.map +1 -1
  231. package/dist/sms/index.js +9 -15
  232. package/dist/sms/index.js.map +1 -1
  233. package/dist/system/index.d.ts +4 -4
  234. package/dist/system/index.d.ts.map +1 -1
  235. package/dist/topic/core/index.d.ts +6 -6
  236. package/dist/topic/core/index.d.ts.map +1 -1
  237. package/dist/topic/redis/index.d.ts +7 -7
  238. package/dist/topic/redis/index.d.ts.map +1 -1
  239. package/dist/topic/redis/index.js +2 -2
  240. package/dist/topic/redis/index.js.map +1 -1
  241. package/dist/websocket/index.d.ts +36 -36
  242. package/dist/websocket/index.d.ts.map +1 -1
  243. package/dist/websocket/index.js +2 -2
  244. package/dist/websocket/index.js.map +1 -1
  245. package/package.json +37 -32
  246. package/src/api/files/{controllers → __tests__}/FileController.spec.ts +189 -143
  247. package/src/api/files/{services → __tests__}/FileService.spec.ts +50 -30
  248. package/src/api/files/controllers/FileController.ts +6 -0
  249. package/src/api/jobs/{services → __tests__}/JobService.spec.ts +1 -1
  250. package/src/api/jobs/providers/JobProvider.ts +3 -3
  251. package/src/api/keys/{services → __tests__}/ApiKeyService.spec.ts +1 -1
  252. package/src/api/organizations/__tests__/OrganizationService.spec.ts +193 -0
  253. package/src/api/organizations/controllers/AdminOrganizationController.ts +103 -0
  254. package/src/api/organizations/entities/organizations.ts +20 -0
  255. package/src/api/organizations/index.browser.ts +10 -0
  256. package/src/api/organizations/index.ts +31 -0
  257. package/src/api/organizations/schemas/createOrganizationSchema.ts +10 -0
  258. package/src/api/organizations/schemas/organizationQuerySchema.ts +10 -0
  259. package/src/api/organizations/schemas/organizationResourceSchema.ts +6 -0
  260. package/src/api/organizations/schemas/updateOrganizationSchema.ts +7 -0
  261. package/src/api/organizations/services/OrganizationService.ts +75 -0
  262. package/src/api/parameters/services/ParameterProvider.ts +6 -1
  263. package/src/api/users/__tests__/$realm.spec.ts +191 -0
  264. package/src/api/users/__tests__/RealmProvider.spec.ts +53 -0
  265. package/src/api/users/__tests__/SessionService.spec.ts +778 -0
  266. package/src/api/users/{jobs → __tests__}/UserJobs.spec.ts +1 -1
  267. package/src/api/users/atoms/realmAuthSettingsAtom.ts +24 -0
  268. package/src/api/users/controllers/RealmController.ts +5 -11
  269. package/src/api/users/entities/users.ts +9 -3
  270. package/src/api/users/index.ts +23 -3
  271. package/src/api/users/primitives/$realm.ts +23 -11
  272. package/src/api/users/providers/RealmProvider.ts +23 -3
  273. package/src/api/users/services/RegistrationService.ts +3 -2
  274. package/src/api/users/services/SessionService.ts +249 -8
  275. package/src/api/users/services/UserService.ts +1 -1
  276. package/src/api/verifications/{jobs → __tests__}/VerificationJobs.spec.ts +4 -2
  277. package/src/api/verifications/parameters/VerificationParameters.ts +2 -2
  278. package/src/billing/__tests__/BillingService.spec.ts +136 -0
  279. package/src/billing/__tests__/PaymentMethodService.spec.ts +78 -0
  280. package/src/billing/controllers/AdminBillingController.ts +149 -0
  281. package/src/billing/controllers/BillingController.ts +108 -0
  282. package/src/billing/entities/paymentIntents.ts +34 -0
  283. package/src/billing/entities/paymentMethods.ts +24 -0
  284. package/src/billing/entities/refunds.ts +22 -0
  285. package/src/billing/errors/BillingError.ts +5 -0
  286. package/src/billing/index.ts +76 -0
  287. package/src/billing/providers/BillingProvider.ts +79 -0
  288. package/src/billing/providers/MemoryBillingProvider.ts +139 -0
  289. package/src/billing/schemas/intentSchemas.ts +60 -0
  290. package/src/billing/schemas/paymentMethodSchemas.ts +13 -0
  291. package/src/billing/schemas/refundSchemas.ts +6 -0
  292. package/src/billing/services/BillingService.ts +325 -0
  293. package/src/billing/services/PaymentMethodService.ts +82 -0
  294. package/src/bin/index.ts +0 -2
  295. package/src/bucket/providers/LocalFileStorageProvider.ts +2 -2
  296. package/src/cache/core/{primitives → __tests__}/$cache.middleware.spec.ts +1 -1
  297. package/src/cache/core/{providers → __tests__}/MemoryCacheProvider.spec.ts +1 -1
  298. package/src/cache/core/primitives/$cache.ts +2 -2
  299. package/src/cache/redis/providers/RedisCacheProvider.ts +2 -2
  300. package/src/cli/config/defineConfig.ts +20 -0
  301. package/src/cli/core/{services → __tests__}/ProjectScaffolder.spec.ts +1 -1
  302. package/src/cli/core/{commands/gen → __tests__}/changelog.spec.ts +1 -1
  303. package/src/cli/core/{commands → __tests__}/init.spec.ts +4 -12
  304. package/src/cli/core/assets.ts +0 -1
  305. package/src/cli/core/atoms/devOptions.ts +0 -5
  306. package/src/cli/core/commands/build.ts +2 -2
  307. package/src/cli/core/commands/dev.ts +165 -30
  308. package/src/cli/core/commands/gen/changelog.ts +2 -2
  309. package/src/cli/core/commands/init.ts +2 -7
  310. package/src/cli/core/commands/verify.ts +0 -1
  311. package/src/cli/core/providers/AppEntryProvider.ts +2 -2
  312. package/src/cli/core/providers/ViteDevServerProvider.ts +53 -46
  313. package/src/cli/core/services/PackageManagerUtils.ts +8 -3
  314. package/src/cli/core/services/ProjectScaffolder.ts +20 -20
  315. package/src/cli/core/tasks/BuildClientTask.ts +8 -0
  316. package/src/cli/core/tasks/BuildServerTask.ts +17 -4
  317. package/src/cli/core/templates/alephaConfigTs.ts +0 -6
  318. package/src/cli/core/templates/webAdminDashboardTsx.ts +17 -0
  319. package/src/cli/core/templates/webAppRouterTs.ts +85 -2
  320. package/src/cli/devtools/atoms/devtoolsOptions.ts +26 -0
  321. package/src/cli/devtools/index.ts +194 -0
  322. package/src/cli/platform/{adapters → __tests__}/CloudflareAdapter.spec.ts +2 -2
  323. package/src/cli/platform/{providers → __tests__}/GitHubSecretStore.spec.ts +1 -1
  324. package/src/cli/platform/{services → __tests__}/NamingService.spec.ts +1 -1
  325. package/src/cli/platform/{providers → __tests__}/PlatformCacheProvider.spec.ts +1 -1
  326. package/src/cli/platform/{services → __tests__}/PlatformInspector.spec.ts +1 -1
  327. package/src/cli/platform/{services → __tests__}/PlatformOrchestrator.spec.ts +3 -3
  328. package/src/cli/platform/{services → __tests__}/SecretFilterService.spec.ts +1 -1
  329. package/src/cli/platform/{commands → __tests__}/SecretsCommand.spec.ts +1 -1
  330. package/src/cli/platform/{adapters → __tests__}/VercelAdapter.spec.ts +2 -2
  331. package/src/cli/platform/atoms/platformOptions.ts +2 -10
  332. package/src/cli/platform/commands/SecretsCommand.ts +2 -2
  333. package/src/cli/platform/commands/platform.ts +2 -11
  334. package/src/cli/platform/index.ts +34 -11
  335. package/src/cli/platform/services/PlatformInspector.ts +2 -2
  336. package/src/cli/platform/services/PlatformOrchestrator.ts +0 -9
  337. package/src/cli/vendor/__tests__/VendorService.spec.ts +407 -0
  338. package/src/cli/vendor/atoms/vendorOptions.ts +41 -0
  339. package/src/cli/vendor/commands/VendorCommand.ts +204 -0
  340. package/src/cli/vendor/index.ts +43 -0
  341. package/src/cli/vendor/services/VendorService.ts +338 -0
  342. package/src/command/{providers → __tests__}/CliProvider.spec.ts +1 -1
  343. package/src/command/{helpers → __tests__}/EnvUtils.spec.ts +1 -1
  344. package/src/command/providers/CliProvider.ts +2 -2
  345. package/src/core/{primitives → __tests__}/$atom.spec.ts +2 -2
  346. package/src/core/{primitives → __tests__}/$memoize.spec.ts +1 -1
  347. package/src/core/{primitives → __tests__}/$mode.spec.ts +1 -1
  348. package/src/core/{primitives → __tests__}/$pipeline.spec.ts +1 -1
  349. package/src/core/{primitives → __tests__}/$scope.spec.ts +2 -2
  350. package/src/core/{providers → __tests__}/KeylessJsonSchemaCodec.spec.ts +1 -1
  351. package/src/core/{providers → __tests__}/SchemaValidator.spec.ts +1 -1
  352. package/src/core/{helpers → __tests__}/jsonSchemaToTypeBox.spec.ts +1 -1
  353. package/src/core/index.shared.ts +1 -1
  354. package/src/core/primitives/{$use.ts → $state.ts} +4 -4
  355. package/src/crypto/{providers → __tests__}/BrowserCryptoProvider.browser.spec.ts +1 -1
  356. package/src/crypto/{providers → __tests__}/CryptoProvider.spec.ts +1 -1
  357. package/src/datetime/{primitives → __tests__}/$debounce.spec.ts +1 -1
  358. package/src/datetime/{primitives → __tests__}/$throttle.spec.ts +1 -1
  359. package/src/datetime/{primitives → __tests__}/$timeout.spec.ts +1 -1
  360. package/src/email/brevo/{providers → __tests__}/BrevoEmailProvider.spec.ts +1 -1
  361. package/src/email/core/{providers → __tests__}/LocalEmailProvider.spec.ts +39 -150
  362. package/src/email/core/providers/LocalEmailProvider.ts +13 -51
  363. package/src/email/smtp/providers/NodemailerEmailProvider.ts +2 -2
  364. package/src/lock/core/{primitives → __tests__}/$lock.middleware.spec.ts +1 -1
  365. package/src/lock/core/primitives/$lock.ts +2 -2
  366. package/src/logger/index.ts +10 -4
  367. package/src/mcp/transports/SseMcpTransport.ts +2 -2
  368. package/src/orm/__tests__/ModelBuilder-tests.ts +53 -0
  369. package/src/orm/__tests__/ModelBuilder.spec.ts +80 -0
  370. package/src/orm/__tests__/organization-tests.ts +200 -0
  371. package/src/orm/__tests__/organization.spec.ts +103 -0
  372. package/src/orm/core/{providers/drivers → __tests__}/BunSqliteProvider.bun.spec.ts +5 -2
  373. package/src/orm/core/constants/PG_SYMBOLS.ts +2 -0
  374. package/src/orm/core/index.shared.ts +1 -0
  375. package/src/orm/core/primitives/$entity.ts +31 -0
  376. package/src/orm/core/providers/DatabaseTypeProvider.ts +11 -0
  377. package/src/orm/core/providers/DrizzleKitProvider.ts +1 -1
  378. package/src/orm/core/providers/drivers/BunSqliteProvider.ts +2 -2
  379. package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +3 -3
  380. package/src/orm/core/services/ModelBuilder.ts +11 -0
  381. package/src/orm/core/services/QueryManager.ts +16 -2
  382. package/src/orm/core/services/Repository.ts +70 -10
  383. package/src/orm/postgres/{providers → __tests__}/BunPostgresProvider.bun.spec.ts +1 -1
  384. package/src/orm/postgres/services/PostgresModelBuilder.ts +9 -1
  385. package/src/queue/core/providers/WorkerProvider.ts +2 -2
  386. package/src/queue/redis/providers/RedisQueueProvider.ts +2 -2
  387. package/src/react/core/{hooks → __tests__}/useAction.browser.spec.tsx +1 -1
  388. package/src/react/core/hooks/useAction.ts +7 -6
  389. package/src/react/head/{providers → __tests__}/BrowserHeadProvider.browser.spec.ts +1 -1
  390. package/src/react/head/{helpers → __tests__}/SeoExpander.spec.ts +1 -1
  391. package/src/react/i18n/{providers → __tests__}/I18nProvider.spec.ts +1 -1
  392. package/src/react/i18n/{hooks → __tests__}/useI18n.browser.spec.tsx +1 -1
  393. package/src/react/intro/components/GettingStartedDevtoolsSlide.tsx +3 -6
  394. package/src/react/router/{providers → __tests__}/ReactBrowserProvider.browser.spec.ts +1 -1
  395. package/src/react/router/providers/ReactBrowserProvider.ts +2 -2
  396. package/src/react/router/providers/ReactPageProvider.ts +2 -2
  397. package/src/react/router/providers/ReactServerProvider.ts +3 -3
  398. package/src/redis/{providers → __tests__}/BunRedisProvider.bun.spec.ts +4 -4
  399. package/src/retry/{primitives → __tests__}/$retry.middleware.spec.ts +1 -1
  400. package/src/router/{TemplatedPathParser.spec.ts → __tests__/TemplatedPathParser.spec.ts} +1 -1
  401. package/src/scheduler/primitives/$scheduler.ts +2 -2
  402. package/src/security/{primitives → __tests__}/$secure-browser.spec.ts +1 -1
  403. package/src/security/{primitives → __tests__}/$secure.spec.ts +1 -1
  404. package/src/security/primitives/$issuer.ts +1 -1
  405. package/src/security/providers/JwtProvider.ts +6 -10
  406. package/src/security/providers/SecurityProvider.ts +6 -11
  407. package/src/security/schemas/userAccountInfoSchema.ts +3 -3
  408. package/src/server/auth/providers/ServerAuthProvider.ts +24 -2
  409. package/src/server/cookies/{services → __tests__}/CookieParser.spec.ts +1 -1
  410. package/src/server/core/{primitives → __tests__}/$circuit.spec.ts +1 -1
  411. package/src/server/core/{providers → __tests__}/NodeHttpServerProvider.spec.ts +1 -1
  412. package/src/server/core/{providers → __tests__}/ServerBodyParserProvider.spec.ts +31 -1
  413. package/src/server/core/{providers → __tests__}/ServerCompressProvider.spec.ts +1 -1
  414. package/src/server/core/{providers → __tests__}/ServerHelmetProvider.spec.ts +4 -1
  415. package/src/server/core/{providers → __tests__}/ServerMultipartProvider.spec.ts +1 -1
  416. package/src/server/core/{services → __tests__}/ServerRequestParser.spec.ts +1 -1
  417. package/src/server/core/primitives/$action.ts +2 -2
  418. package/src/server/core/primitives/$sse.ts +2 -2
  419. package/src/server/core/providers/ServerBodyParserProvider.ts +21 -12
  420. package/src/server/core/providers/ServerCompressProvider.ts +2 -2
  421. package/src/server/core/providers/ServerHelmetProvider.ts +2 -2
  422. package/src/server/core/providers/ServerMultipartProvider.ts +2 -2
  423. package/src/server/core/providers/ServerRouterProvider.ts +1 -5
  424. package/src/server/cors/{primitives → __tests__}/$cors.spec.ts +1 -1
  425. package/src/server/cors/providers/ServerCorsProvider.ts +2 -2
  426. package/src/server/links/{services → __tests__}/BatchCollector.spec.ts +1 -1
  427. package/src/server/links/providers/LinkProvider.ts +2 -2
  428. package/src/server/links/providers/RemotePrimitiveProvider.ts +2 -2
  429. package/src/server/links/providers/ServerLinksProvider.ts +2 -2
  430. package/src/server/rate-limit/{primitives → __tests__}/$rateLimit.spec.ts +1 -1
  431. package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +2 -2
  432. package/src/server/swagger/providers/ServerSwaggerProvider.ts +2 -2
  433. package/src/sms/{providers → __tests__}/LocalSmsProvider.spec.ts +35 -29
  434. package/src/sms/providers/LocalSmsProvider.ts +13 -24
  435. package/src/system/{providers → __tests__}/MemoryFileSystemProvider.spec.ts +1 -1
  436. package/src/system/{providers → __tests__}/MemoryShellProvider.spec.ts +1 -1
  437. package/src/topic/redis/providers/RedisTopicProvider.ts +2 -2
  438. package/src/websocket/{services → __tests__}/RoomManager.spec.ts +1 -1
  439. package/src/websocket/providers/NodeWebSocketServerProvider.ts +2 -2
  440. package/tsconfig.base.json +1 -0
  441. package/assets/devtools-ui/200.html +0 -10
  442. package/assets/devtools-ui/200.html.br +0 -0
  443. package/assets/devtools-ui/404.html +0 -10
  444. package/assets/devtools-ui/404.html.br +0 -0
  445. package/assets/devtools-ui/CNAME +0 -1
  446. package/assets/devtools-ui/asset.CHpVij2M.css +0 -1
  447. package/assets/devtools-ui/asset.CHpVij2M.css.br +0 -0
  448. package/assets/devtools-ui/asset.DJ-i0UDz.css +0 -1
  449. package/assets/devtools-ui/asset.DJ-i0UDz.css.br +0 -0
  450. package/assets/devtools-ui/chunk.1jwpJORo.js +0 -1
  451. package/assets/devtools-ui/chunk.1jwpJORo.js.br +0 -0
  452. package/assets/devtools-ui/chunk.B0r2wfUL.js +0 -1
  453. package/assets/devtools-ui/chunk.B0r2wfUL.js.br +0 -0
  454. package/assets/devtools-ui/chunk.BScN4dVR.js +0 -84
  455. package/assets/devtools-ui/chunk.BScN4dVR.js.br +0 -0
  456. package/assets/devtools-ui/chunk.BispuoY4.js +0 -1
  457. package/assets/devtools-ui/chunk.BispuoY4.js.br +0 -0
  458. package/assets/devtools-ui/chunk.BtrPUUd7.js +0 -2
  459. package/assets/devtools-ui/chunk.BtrPUUd7.js.br +0 -0
  460. package/assets/devtools-ui/chunk.C-KMHgqf.js +0 -1
  461. package/assets/devtools-ui/chunk.C-KMHgqf.js.br +0 -0
  462. package/assets/devtools-ui/chunk.C2zQ3CF6.js +0 -7
  463. package/assets/devtools-ui/chunk.C2zQ3CF6.js.br +0 -0
  464. package/assets/devtools-ui/chunk.C619McpO.js +0 -1
  465. package/assets/devtools-ui/chunk.C619McpO.js.br +0 -0
  466. package/assets/devtools-ui/chunk.C9OsYsVl.js +0 -1
  467. package/assets/devtools-ui/chunk.C9OsYsVl.js.br +0 -3
  468. package/assets/devtools-ui/chunk.CAC_-151.js +0 -1
  469. package/assets/devtools-ui/chunk.CAC_-151.js.br +0 -0
  470. package/assets/devtools-ui/chunk.CCmesWfx.js +0 -1
  471. package/assets/devtools-ui/chunk.CCmesWfx.js.br +0 -0
  472. package/assets/devtools-ui/chunk.CFQDmrcV.js +0 -1
  473. package/assets/devtools-ui/chunk.CFQDmrcV.js.br +0 -0
  474. package/assets/devtools-ui/chunk.CgM71Zau.js +0 -1
  475. package/assets/devtools-ui/chunk.CgM71Zau.js.br +0 -0
  476. package/assets/devtools-ui/chunk.CmHq336a.js +0 -1
  477. package/assets/devtools-ui/chunk.CmHq336a.js.br +0 -0
  478. package/assets/devtools-ui/chunk.CthNMCar.js +0 -1
  479. package/assets/devtools-ui/chunk.CthNMCar.js.br +0 -0
  480. package/assets/devtools-ui/chunk.D2brVJP1.js +0 -1
  481. package/assets/devtools-ui/chunk.D2brVJP1.js.br +0 -0
  482. package/assets/devtools-ui/chunk.DgBKGkiw.js +0 -1
  483. package/assets/devtools-ui/chunk.DgBKGkiw.js.br +0 -0
  484. package/assets/devtools-ui/chunk.NNHHCQsa.js +0 -1
  485. package/assets/devtools-ui/chunk.NNHHCQsa.js.br +0 -0
  486. package/assets/devtools-ui/chunk._CDKKWMo.js +0 -1
  487. package/assets/devtools-ui/chunk._CDKKWMo.js.br +0 -0
  488. package/assets/devtools-ui/entry.B_nOjAod.js +0 -2
  489. package/assets/devtools-ui/entry.B_nOjAod.js.br +0 -0
  490. package/assets/devtools-ui/index.html +0 -10
  491. package/assets/devtools-ui/index.html.br +0 -0
  492. package/dist/devtools/index.browser.js +0 -224
  493. package/dist/devtools/index.browser.js.map +0 -1
  494. package/dist/devtools/index.d.ts +0 -499
  495. package/dist/devtools/index.d.ts.map +0 -1
  496. package/dist/devtools/index.js +0 -782
  497. package/dist/devtools/index.js.map +0 -1
  498. package/dist/mqtt/index.d.ts +0 -164
  499. package/dist/mqtt/index.d.ts.map +0 -1
  500. package/dist/mqtt/index.js +0 -214
  501. package/dist/mqtt/index.js.map +0 -1
  502. package/dist/topic/mqtt/index.d.ts +0 -87
  503. package/dist/topic/mqtt/index.d.ts.map +0 -1
  504. package/dist/topic/mqtt/index.js +0 -88
  505. package/dist/topic/mqtt/index.js.map +0 -1
  506. package/src/api/users/parameters/UserParameters.ts +0 -23
  507. package/src/api/users/services/SessionService.spec.ts +0 -303
  508. package/src/cli/platform/adapters/DockerAdapter.spec.ts +0 -378
  509. package/src/cli/platform/adapters/DockerAdapter.ts +0 -417
  510. package/src/cli/platform/services/DockerComposeGenerator.spec.ts +0 -490
  511. package/src/cli/platform/services/DockerComposeGenerator.ts +0 -353
  512. package/src/cli/platform/services/DockerSshService.spec.ts +0 -47
  513. package/src/cli/platform/services/DockerSshService.ts +0 -61
  514. package/src/devtools/__tests__/DevCollectorProvider.spec.ts +0 -7
  515. package/src/devtools/assets.ts +0 -6
  516. package/src/devtools/entities/logs.ts +0 -21
  517. package/src/devtools/index.browser.ts +0 -11
  518. package/src/devtools/index.shared.ts +0 -15
  519. package/src/devtools/index.ts +0 -39
  520. package/src/devtools/providers/DevToolsMetadataProvider.ts +0 -459
  521. package/src/devtools/providers/DevToolsProvider.ts +0 -280
  522. package/src/devtools/schemas/DevActionMetadata.ts +0 -30
  523. package/src/devtools/schemas/DevAtomMetadata.ts +0 -26
  524. package/src/devtools/schemas/DevBucketMetadata.ts +0 -11
  525. package/src/devtools/schemas/DevCacheMetadata.ts +0 -10
  526. package/src/devtools/schemas/DevEntityMetadata.ts +0 -60
  527. package/src/devtools/schemas/DevEnvMetadata.ts +0 -22
  528. package/src/devtools/schemas/DevMetadata.ts +0 -47
  529. package/src/devtools/schemas/DevModuleMetadata.ts +0 -8
  530. package/src/devtools/schemas/DevPageMetadata.ts +0 -24
  531. package/src/devtools/schemas/DevProviderMetadata.ts +0 -10
  532. package/src/devtools/schemas/DevQueueMetadata.ts +0 -10
  533. package/src/devtools/schemas/DevRealmMetadata.ts +0 -19
  534. package/src/devtools/schemas/DevRouteMetadata.ts +0 -8
  535. package/src/devtools/schemas/DevSchedulerMetadata.ts +0 -11
  536. package/src/devtools/schemas/DevTopicMetadata.ts +0 -11
  537. package/src/mqtt/index.ts +0 -32
  538. package/src/mqtt/providers/MqttClientProvider.ts +0 -63
  539. package/src/mqtt/providers/MqttJsClientProvider.spec.ts +0 -165
  540. package/src/mqtt/providers/MqttJsClientProvider.ts +0 -309
  541. package/src/topic/mqtt/index.ts +0 -30
  542. package/src/topic/mqtt/providers/MqttTopicProvider.spec.ts +0 -160
  543. package/src/topic/mqtt/providers/MqttTopicProvider.ts +0 -146
  544. /package/src/api/audits/{primitives → __tests__}/$audit.spec.ts +0 -0
  545. /package/src/api/audits/{services → __tests__}/AuditService.spec.ts +0 -0
  546. /package/src/api/files/{controllers → __tests__}/AdminFileStatsController.spec.ts +0 -0
  547. /package/src/api/files/{jobs → __tests__}/FileJobs.spec.ts +0 -0
  548. /package/src/api/jobs/{primitives → __tests__}/$job-middleware.spec.ts +0 -0
  549. /package/src/api/parameters/{primitives → __tests__}/$parameter.spec.ts +0 -0
  550. /package/src/api/users/{controllers → __tests__}/AdminIdentityController.spec.ts +0 -0
  551. /package/src/api/users/{controllers → __tests__}/AdminSessionController.spec.ts +0 -0
  552. /package/src/api/users/{controllers → __tests__}/AdminUserController.spec.ts +0 -0
  553. /package/src/api/users/{services → __tests__}/CredentialService.spec.ts +0 -0
  554. /package/src/api/users/{services → __tests__}/RegistrationService.spec.ts +0 -0
  555. /package/src/batch/{primitives → __tests__}/$batch.spec.ts +0 -0
  556. /package/src/batch/{providers → __tests__}/BatchProvider.spec.ts +0 -0
  557. /package/src/bucket/{primitives → __tests__}/$bucket.spec.ts +0 -0
  558. /package/src/bucket/{providers → __tests__}/FileStorageProvider.spec.ts +0 -0
  559. /package/src/bucket/{providers → __tests__}/LocalFileStorageProvider.spec.ts +0 -0
  560. /package/src/bucket/{providers → __tests__}/MemoryFileStorageProvider.spec.ts +0 -0
  561. /package/src/cache/core/{primitives → __tests__}/$cache.spec.ts +0 -0
  562. /package/src/cache/redis/{providers → __tests__}/RedisCacheProvider.spec.ts +0 -0
  563. /package/src/command/{primitives → __tests__}/$command.spec.ts +0 -0
  564. /package/src/command/{helpers → __tests__}/Asker.spec.ts +0 -0
  565. /package/src/command/{helpers → __tests__}/Runner.spec.ts +0 -0
  566. /package/src/core/{primitives → __tests__}/$context.spec.ts +0 -0
  567. /package/src/core/{primitives → __tests__}/$env.spec.ts +0 -0
  568. /package/src/core/{primitives → __tests__}/$hook.spec.ts +0 -0
  569. /package/src/core/{primitives → __tests__}/$inject.spec.ts +0 -0
  570. /package/src/core/{primitives → __tests__}/$module.spec.ts +0 -0
  571. /package/src/core/{providers → __tests__}/CodecManager.spec.ts +0 -0
  572. /package/src/core/{providers → __tests__}/EventManager.spec.ts +0 -0
  573. /package/src/core/{providers → __tests__}/StateManager.spec.ts +0 -0
  574. /package/src/core/{providers → __tests__}/TypeProvider.spec.ts +0 -0
  575. /package/src/datetime/{primitives → __tests__}/$interval.spec.ts +0 -0
  576. /package/src/datetime/{providers → __tests__}/DateTimeProvider.spec.ts +0 -0
  577. /package/src/email/core/{primitives → __tests__}/$email.spec.ts +0 -0
  578. /package/src/fake/{providers → __tests__}/FakeProvider.spec.ts +0 -0
  579. /package/src/lock/core/{providers → __tests__}/MemoryLockProvider.spec.ts +0 -0
  580. /package/src/lock/redis/{providers → __tests__}/RedisLockProvider.spec.ts +0 -0
  581. /package/src/logger/{primitives → __tests__}/$logger.spec.ts +0 -0
  582. /package/src/logger/{services → __tests__}/Logger.spec.ts +0 -0
  583. /package/src/mcp/{primitives → __tests__}/$prompt.spec.ts +0 -0
  584. /package/src/mcp/{primitives → __tests__}/$resource.spec.ts +0 -0
  585. /package/src/mcp/{primitives → __tests__}/$tool.spec.ts +0 -0
  586. /package/src/mcp/{providers → __tests__}/McpServerProvider.spec.ts +0 -0
  587. /package/src/mcp/{helpers → __tests__}/jsonrpc.spec.ts +0 -0
  588. /package/src/orm/core/{helpers → __tests__}/parseQueryString.spec.ts +0 -0
  589. /package/src/queue/core/{primitives → __tests__}/$consumer.spec.ts +0 -0
  590. /package/src/queue/core/{providers → __tests__}/MemoryQueueProvider.spec.ts +0 -0
  591. /package/src/queue/core/{providers → __tests__}/WorkerProvider.spec.ts +0 -0
  592. /package/src/queue/redis/{providers → __tests__}/RedisQueueProvider.spec.ts +0 -0
  593. /package/src/react/form/{hooks → __tests__}/useForm.browser.spec.tsx +0 -0
  594. /package/src/react/head/{hooks → __tests__}/useHead.spec.tsx +0 -0
  595. /package/src/react/i18n/{components → __tests__}/Localize.spec.tsx +0 -0
  596. /package/src/react/router/{primitives → __tests__}/$page.browser.spec.tsx +0 -0
  597. /package/src/react/router/{primitives → __tests__}/$page.middleware.spec.tsx +0 -0
  598. /package/src/react/router/{primitives → __tests__}/$page.spec.tsx +0 -0
  599. /package/src/react/router/{providers → __tests__}/ReactPreloadProvider.spec.ts +0 -0
  600. /package/src/react/router/{providers → __tests__}/ReactServerProvider.spec.tsx +0 -0
  601. /package/src/react/router/{providers → __tests__}/ReactServerTemplateProvider.spec.ts +0 -0
  602. /package/src/retry/{primitives → __tests__}/$retry.spec.ts +0 -0
  603. /package/src/retry/{providers → __tests__}/RetryProvider.spec.ts +0 -0
  604. /package/src/router/{providers → __tests__}/RouterProvider.spec.ts +0 -0
  605. /package/src/security/{primitives → __tests__}/$issuer.spec.ts +0 -0
  606. /package/src/security/{primitives → __tests__}/$permission.spec.ts +0 -0
  607. /package/src/security/{primitives → __tests__}/$role.spec.ts +0 -0
  608. /package/src/security/{primitives → __tests__}/$serviceAccount.spec.ts +0 -0
  609. /package/src/security/{providers → __tests__}/SecurityProvider.spec.ts +0 -0
  610. /package/src/server/cookies/{providers → __tests__}/ServerCookiesProvider.spec.ts +0 -0
  611. /package/src/server/core/{primitives → __tests__}/$action.spec.ts +0 -0
  612. /package/src/server/core/{primitives → __tests__}/$middleware.spec.ts +0 -0
  613. /package/src/server/core/{primitives → __tests__}/$route.spec.ts +0 -0
  614. /package/src/server/core/{primitives → __tests__}/$sse.spec.ts +0 -0
  615. /package/src/server/core/{providers → __tests__}/BunHttpServerProvider.bun.spec.ts +0 -0
  616. /package/src/server/core/{services → __tests__}/HttpClient.spec.ts +0 -0
  617. /package/src/server/core/{providers → __tests__}/ServerLoggerProvider.spec.ts +0 -0
  618. /package/src/server/core/{services → __tests__}/UserAgentParser.spec.ts +0 -0
  619. /package/src/server/cors/{providers → __tests__}/ServerCorsProvider.spec.ts +0 -0
  620. /package/src/server/etag/{providers → __tests__}/ServerEtagProvider.spec.ts +0 -0
  621. /package/src/server/health/{providers → __tests__}/ServerHealthProvider.spec.ts +0 -0
  622. /package/src/server/links/{primitives → __tests__}/$remote.spec.ts +0 -0
  623. /package/src/server/links/{services → __tests__}/BatchEndpoint.spec.ts +0 -0
  624. /package/src/server/links/{providers → __tests__}/LinkProvider.spec.ts +0 -0
  625. /package/src/server/links/{providers → __tests__}/ServerLinksProvider.spec.ts +0 -0
  626. /package/src/server/metrics/{providers → __tests__}/ServerMetricsProvider.spec.ts +0 -0
  627. /package/src/server/proxy/{primitives → __tests__}/$proxy.spec.ts +0 -0
  628. /package/src/server/rate-limit/{providers → __tests__}/ServerRateLimitProvider.spec.ts +0 -0
  629. /package/src/server/static/{primitives → __tests__}/$serve.spec.ts +0 -0
  630. /package/src/server/swagger/{primitives → __tests__}/$swagger.spec.ts +0 -0
  631. /package/src/sms/{primitives → __tests__}/$sms.spec.ts +0 -0
  632. /package/src/sms/{providers → __tests__}/MemorySmsProvider.spec.ts +0 -0
  633. /package/src/system/{services → __tests__}/FileDetector.spec.ts +0 -0
  634. /package/src/system/{providers → __tests__}/NodeFileSystemProvider.spec.ts +0 -0
  635. /package/src/topic/core/{primitives → __tests__}/$subscriber.spec.ts +0 -0
  636. /package/src/topic/core/{providers → __tests__}/MemoryTopicProvider.spec.ts +0 -0
  637. /package/src/topic/redis/{providers → __tests__}/RedisTopicProvider.spec.ts +0 -0
  638. /package/src/websocket/{primitives → __tests__}/$channel.spec.ts +0 -0
@@ -0,0 +1,778 @@
1
+ import { Alepha } from "alepha";
2
+ import { CacheProvider, MemoryCacheProvider } from "alepha/cache";
3
+ import { DateTimeProvider } from "alepha/datetime";
4
+ import { AlephaOrmPostgres } from "alepha/orm/postgres";
5
+ import {
6
+ AlephaSecurity,
7
+ CryptoProvider,
8
+ InvalidCredentialsError,
9
+ } from "alepha/security";
10
+ import { BadRequestError } from "alepha/server";
11
+ import { describe, it } from "vitest";
12
+ import {
13
+ AlephaApiUsers,
14
+ RealmProvider,
15
+ SessionService,
16
+ UserService,
17
+ } from "../index.ts";
18
+
19
+ const setup = async (options?: {
20
+ username?: "optional" | "required";
21
+ brokenCache?: boolean;
22
+ }) => {
23
+ const alepha = Alepha.create({
24
+ env: { LOG_LEVEL: "error" },
25
+ });
26
+
27
+ if (options?.brokenCache) {
28
+ class BrokenCacheProvider extends MemoryCacheProvider {
29
+ public override async getTyped(): Promise<never> {
30
+ throw new Error("Cache unavailable");
31
+ }
32
+ public override async setTyped(): Promise<never> {
33
+ throw new Error("Cache unavailable");
34
+ }
35
+ }
36
+ alepha.with({ provide: CacheProvider, use: BrokenCacheProvider });
37
+ }
38
+
39
+ alepha.with(AlephaOrmPostgres);
40
+ alepha.with(AlephaSecurity);
41
+ alepha.with(AlephaApiUsers);
42
+
43
+ await alepha.start();
44
+
45
+ const sessionService = alepha.inject(SessionService);
46
+
47
+ // Configure realm settings if provided
48
+ if (options?.username) {
49
+ const realmProvider = alepha.inject(RealmProvider);
50
+ realmProvider.register("default", {
51
+ settings: {
52
+ username: options.username,
53
+ } as never,
54
+ });
55
+ }
56
+
57
+ return {
58
+ alepha,
59
+ sessionService,
60
+ userService: alepha.inject(UserService),
61
+ cryptoProvider: alepha.inject(CryptoProvider),
62
+ identities: sessionService.identities(),
63
+ dateTimeProvider: alepha.inject(DateTimeProvider),
64
+ };
65
+ };
66
+
67
+ describe("alepha/api/users - SessionService.login", () => {
68
+ it("should login successfully with valid credentials", async ({ expect }) => {
69
+ const { sessionService, userService, cryptoProvider, identities } =
70
+ await setup();
71
+
72
+ // Create a test user
73
+ const user = await userService.users().create({
74
+ username: "loginsuccessuser",
75
+ email: "login-success@example.com",
76
+ roles: ["user"],
77
+ });
78
+
79
+ // Create identity with password
80
+ const password = "securePassword123!";
81
+ const hashedPassword = await cryptoProvider.hashPassword(password);
82
+
83
+ await identities.create({
84
+ provider: "local",
85
+ providerUserId: "login-success@example.com",
86
+ userId: user.id,
87
+ password: hashedPassword,
88
+ });
89
+
90
+ // Test login
91
+ const result = await sessionService.login(
92
+ "local",
93
+ "login-success@example.com",
94
+ password,
95
+ );
96
+
97
+ expect(result?.id).toBe(user.id);
98
+ expect(result?.email).toBe("login-success@example.com");
99
+ });
100
+
101
+ it("should throw InvalidCredentialsError when identity not found", async ({
102
+ expect,
103
+ }) => {
104
+ const { sessionService } = await setup();
105
+
106
+ await expect(
107
+ sessionService.login("local", "nonexistent@example.com", "password"),
108
+ ).rejects.toThrowError(InvalidCredentialsError);
109
+ });
110
+
111
+ it("should throw InvalidCredentialsError when password is invalid", async ({
112
+ expect,
113
+ }) => {
114
+ const { sessionService, userService, cryptoProvider, identities } =
115
+ await setup();
116
+
117
+ // Create a test user
118
+ const user = await userService.users().create({
119
+ username: "invalidpassworduser",
120
+ email: "invalid-password@example.com",
121
+ roles: ["user"],
122
+ });
123
+
124
+ // Create identity with password
125
+ const hashedPassword = await cryptoProvider.hashPassword("correctPassword");
126
+
127
+ await identities.create({
128
+ provider: "local",
129
+ providerUserId: "invalid-password@example.com",
130
+ userId: user.id,
131
+ password: hashedPassword,
132
+ });
133
+
134
+ // Test login with wrong password
135
+ await expect(
136
+ sessionService.login(
137
+ "local",
138
+ "invalid-password@example.com",
139
+ "wrongPassword",
140
+ ),
141
+ ).rejects.toThrowError(InvalidCredentialsError);
142
+ });
143
+
144
+ it("should throw InvalidCredentialsError when identity has no password configured", async ({
145
+ expect,
146
+ }) => {
147
+ const { sessionService, userService, identities } = await setup();
148
+
149
+ // Create a test user
150
+ const user = await userService.users().create({
151
+ username: "nopassworduser",
152
+ email: "no-password@example.com",
153
+ roles: ["user"],
154
+ });
155
+
156
+ // Create identity without password
157
+ await identities.create({
158
+ provider: "local",
159
+ providerUserId: "no-password@example.com",
160
+ userId: user.id,
161
+ providerData: {}, // No password
162
+ });
163
+
164
+ await expect(
165
+ sessionService.login("local", "no-password@example.com", "anyPassword"),
166
+ ).rejects.toThrowError(InvalidCredentialsError);
167
+ });
168
+
169
+ it("should throw InvalidCredentialsError when user is deleted after identity creation", async ({
170
+ expect,
171
+ }) => {
172
+ const { sessionService, userService, cryptoProvider, identities } =
173
+ await setup();
174
+
175
+ // Create a user, then delete them to simulate orphan identity
176
+ const user = await userService.users().create({
177
+ username: "orphanidentityuser",
178
+ email: "orphan-identity@example.com",
179
+ roles: ["user"],
180
+ });
181
+
182
+ const hashedPassword = await cryptoProvider.hashPassword("password123");
183
+
184
+ await identities.create({
185
+ provider: "local",
186
+ providerUserId: "orphan-identity@example.com",
187
+ userId: user.id,
188
+ password: hashedPassword,
189
+ });
190
+
191
+ // Delete the user to create orphan identity scenario
192
+ await userService.users().deleteById(user.id);
193
+
194
+ await expect(
195
+ sessionService.login(
196
+ "local",
197
+ "orphan-identity@example.com",
198
+ "password123",
199
+ ),
200
+ ).rejects.toThrowError(InvalidCredentialsError);
201
+ });
202
+
203
+ it("should throw InvalidCredentialsError with same message for all failure types", async ({
204
+ expect,
205
+ }) => {
206
+ const { sessionService, userService, cryptoProvider, identities } =
207
+ await setup();
208
+
209
+ // Setup for invalid password test
210
+ const user = await userService.users().create({
211
+ username: "sameerroruser",
212
+ email: "same-error@example.com",
213
+ roles: ["user"],
214
+ });
215
+ const hashedPassword = await cryptoProvider.hashPassword("correctPass");
216
+ await identities.create({
217
+ provider: "local",
218
+ providerUserId: "same-error@example.com",
219
+ userId: user.id,
220
+ password: hashedPassword,
221
+ });
222
+
223
+ // Test identity not found
224
+ try {
225
+ await sessionService.login("local", "notfound@example.com", "password");
226
+ } catch (error) {
227
+ expect(error).toBeInstanceOf(InvalidCredentialsError);
228
+ expect((error as Error).message).toBe("Invalid credentials");
229
+ }
230
+
231
+ // Test invalid password
232
+ try {
233
+ await sessionService.login(
234
+ "local",
235
+ "same-error@example.com",
236
+ "wrongPassword",
237
+ );
238
+ } catch (error) {
239
+ expect(error).toBeInstanceOf(InvalidCredentialsError);
240
+ expect((error as Error).message).toBe("Invalid credentials");
241
+ }
242
+ });
243
+
244
+ it("should include random delay to prevent timing attacks", async ({
245
+ expect,
246
+ }) => {
247
+ const { sessionService } = await setup();
248
+
249
+ const start = Date.now();
250
+
251
+ try {
252
+ await sessionService.login(
253
+ "local",
254
+ "timing-attack@example.com",
255
+ "password",
256
+ );
257
+ } catch {
258
+ // Expected to fail
259
+ }
260
+
261
+ const elapsed = Date.now() - start;
262
+
263
+ // Should take at least 50ms due to random delay
264
+ expect(elapsed).toBeGreaterThanOrEqual(50);
265
+ });
266
+
267
+ it("should handle different providers correctly", async ({ expect }) => {
268
+ const { sessionService, userService, cryptoProvider, identities } =
269
+ await setup({ username: "optional" });
270
+
271
+ const user = await userService.users().create({
272
+ username: "multiprovideruser",
273
+ email: "multi-provider@example.com",
274
+ roles: ["user"],
275
+ });
276
+
277
+ // Create identity for 'custom' provider
278
+ const hashedPassword = await cryptoProvider.hashPassword("customPass");
279
+ await identities.create({
280
+ provider: "custom",
281
+ userId: user.id,
282
+ password: hashedPassword,
283
+ });
284
+
285
+ // Login with correct provider
286
+ const result = await sessionService.login(
287
+ "custom",
288
+ "multiprovideruser",
289
+ "customPass",
290
+ );
291
+ expect(result?.id).toBe(user.id);
292
+
293
+ // Should fail with wrong provider
294
+ await expect(
295
+ sessionService.login("local", "custom-user-id", "customPass"),
296
+ ).rejects.toThrowError(InvalidCredentialsError);
297
+ });
298
+
299
+ it("should handle empty password correctly", async ({ expect }) => {
300
+ const { sessionService, userService, cryptoProvider, identities } =
301
+ await setup();
302
+
303
+ const user = await userService.users().create({
304
+ username: "emptypassworduser",
305
+ email: "empty-password@example.com",
306
+ roles: ["user"],
307
+ });
308
+
309
+ const hashedPassword = await cryptoProvider.hashPassword("realPassword");
310
+ await identities.create({
311
+ provider: "local",
312
+ providerUserId: "empty-password@example.com",
313
+ userId: user.id,
314
+ password: hashedPassword,
315
+ });
316
+
317
+ // Empty password should fail
318
+ await expect(
319
+ sessionService.login("local", "empty-password@example.com", ""),
320
+ ).rejects.toThrowError(InvalidCredentialsError);
321
+ });
322
+
323
+ describe("login rate limiting", () => {
324
+ it("should block account after max failed attempts", async ({ expect }) => {
325
+ const { sessionService, userService, cryptoProvider, identities } =
326
+ await setup();
327
+
328
+ const user = await userService.users().create({
329
+ email: "ratelimit@example.com",
330
+ roles: ["user"],
331
+ });
332
+
333
+ const hashedPassword = await cryptoProvider.hashPassword("correct");
334
+ await identities.create({
335
+ provider: "local",
336
+ providerUserId: "ratelimit@example.com",
337
+ userId: user.id,
338
+ password: hashedPassword,
339
+ });
340
+
341
+ // Exhaust account limit (default: 5)
342
+ for (let i = 0; i < 5; i++) {
343
+ await expect(
344
+ sessionService.login("local", "ratelimit@example.com", "wrong"),
345
+ ).rejects.toThrowError(InvalidCredentialsError);
346
+ }
347
+
348
+ // 6th attempt with CORRECT password should still be blocked
349
+ await expect(
350
+ sessionService.login("local", "ratelimit@example.com", "correct"),
351
+ ).rejects.toThrowError(InvalidCredentialsError);
352
+ });
353
+
354
+ it("should allow login after lockout window expires", async ({
355
+ expect,
356
+ }) => {
357
+ const {
358
+ sessionService,
359
+ userService,
360
+ cryptoProvider,
361
+ identities,
362
+ dateTimeProvider,
363
+ } = await setup();
364
+
365
+ const user = await userService.users().create({
366
+ email: "ratelimit-expire@example.com",
367
+ roles: ["user"],
368
+ });
369
+
370
+ const hashedPassword = await cryptoProvider.hashPassword("correct");
371
+ await identities.create({
372
+ provider: "local",
373
+ providerUserId: "ratelimit-expire@example.com",
374
+ userId: user.id,
375
+ password: hashedPassword,
376
+ });
377
+
378
+ // Exhaust account limit
379
+ for (let i = 0; i < 5; i++) {
380
+ await expect(
381
+ sessionService.login(
382
+ "local",
383
+ "ratelimit-expire@example.com",
384
+ "wrong",
385
+ ),
386
+ ).rejects.toThrowError(InvalidCredentialsError);
387
+ }
388
+
389
+ // Advance past window (15 min + 1s)
390
+ await dateTimeProvider.travel(16 * 60 * 1000);
391
+
392
+ // Should succeed now
393
+ const result = await sessionService.login(
394
+ "local",
395
+ "ratelimit-expire@example.com",
396
+ "correct",
397
+ );
398
+ expect(result.id).toBe(user.id);
399
+ });
400
+
401
+ it("should not increment counter on successful login", async ({
402
+ expect,
403
+ }) => {
404
+ const { sessionService, userService, cryptoProvider, identities } =
405
+ await setup();
406
+
407
+ const user = await userService.users().create({
408
+ email: "ratelimit-success@example.com",
409
+ roles: ["user"],
410
+ });
411
+
412
+ const hashedPassword = await cryptoProvider.hashPassword("correct");
413
+ await identities.create({
414
+ provider: "local",
415
+ providerUserId: "ratelimit-success@example.com",
416
+ userId: user.id,
417
+ password: hashedPassword,
418
+ });
419
+
420
+ // Login successfully 10 times — should never be blocked
421
+ for (let i = 0; i < 10; i++) {
422
+ const result = await sessionService.login(
423
+ "local",
424
+ "ratelimit-success@example.com",
425
+ "correct",
426
+ );
427
+ expect(result.id).toBe(user.id);
428
+ }
429
+ });
430
+
431
+ it("should isolate account lockout per realm", async ({ expect }) => {
432
+ const {
433
+ sessionService,
434
+ userService,
435
+ cryptoProvider,
436
+ identities,
437
+ alepha,
438
+ } = await setup();
439
+
440
+ // All realms share default repositories (same DB tables)
441
+ const realmProvider = alepha.inject(RealmProvider);
442
+ realmProvider.register("realm-a");
443
+ realmProvider.register("realm-b");
444
+
445
+ const userA = await userService.users("realm-a").create({
446
+ realm: "realm-a",
447
+ email: "same@example.com",
448
+ roles: ["user"],
449
+ });
450
+
451
+ const userB = await userService.users("realm-b").create({
452
+ realm: "realm-b",
453
+ email: "same@example.com",
454
+ roles: ["user"],
455
+ });
456
+
457
+ const hashedPassword = await cryptoProvider.hashPassword("correct");
458
+
459
+ await identities.create({
460
+ provider: "local",
461
+ providerUserId: "same-realm-a@example.com",
462
+ userId: userA.id,
463
+ password: hashedPassword,
464
+ });
465
+
466
+ // Exhaust realm-a account limit
467
+ for (let i = 0; i < 5; i++) {
468
+ await expect(
469
+ sessionService.login("local", "same@example.com", "wrong", "realm-a"),
470
+ ).rejects.toThrowError(InvalidCredentialsError);
471
+ }
472
+
473
+ // realm-b should NOT be blocked (different account key: login:account:realm-b:userB.id)
474
+ await identities.create({
475
+ provider: "local",
476
+ providerUserId: "same-realm-b@example.com",
477
+ userId: userB.id,
478
+ password: hashedPassword,
479
+ });
480
+
481
+ const result = await sessionService.login(
482
+ "local",
483
+ "same@example.com",
484
+ "correct",
485
+ "realm-b",
486
+ );
487
+ expect(result.id).toBe(userB.id);
488
+ });
489
+
490
+ it("should block IP after max failed attempts across different accounts", async ({
491
+ expect,
492
+ }) => {
493
+ const {
494
+ sessionService,
495
+ userService,
496
+ cryptoProvider,
497
+ identities,
498
+ alepha,
499
+ } = await setup();
500
+
501
+ const hashedPassword = await cryptoProvider.hashPassword("correct");
502
+
503
+ // Create 3 different users
504
+ for (let i = 0; i < 3; i++) {
505
+ const user = await userService.users().create({
506
+ email: `iptest-${i}@example.com`,
507
+ roles: ["user"],
508
+ });
509
+ await identities.create({
510
+ provider: "local",
511
+ providerUserId: `iptest-${i}@example.com`,
512
+ userId: user.id,
513
+ password: hashedPassword,
514
+ });
515
+ }
516
+
517
+ // Set up IP in request context
518
+ await alepha.fork(async () => {
519
+ alepha.store.set("alepha.http.request", { ip: "1.2.3.4" } as never);
520
+
521
+ // Fail 15 times across different accounts (5 per account)
522
+ for (let i = 0; i < 3; i++) {
523
+ for (let j = 0; j < 5; j++) {
524
+ await expect(
525
+ sessionService.login("local", `iptest-${i}@example.com`, "wrong"),
526
+ ).rejects.toThrowError(InvalidCredentialsError);
527
+ }
528
+ }
529
+
530
+ // 16th attempt — IP should be blocked even with correct credentials
531
+ await expect(
532
+ sessionService.login("local", "iptest-0@example.com", "correct"),
533
+ ).rejects.toThrowError(InvalidCredentialsError);
534
+ });
535
+ });
536
+
537
+ it("should skip IP check when no HTTP context", async ({ expect }) => {
538
+ const { sessionService, userService, cryptoProvider, identities } =
539
+ await setup();
540
+
541
+ const user = await userService.users().create({
542
+ email: "nohttp@example.com",
543
+ roles: ["user"],
544
+ });
545
+
546
+ const hashedPassword = await cryptoProvider.hashPassword("correct");
547
+ await identities.create({
548
+ provider: "local",
549
+ providerUserId: "nohttp@example.com",
550
+ userId: user.id,
551
+ password: hashedPassword,
552
+ });
553
+
554
+ // No HTTP request in ALS — IP check skipped, only account check applies
555
+ // Fail 4 times (under account limit of 5) then succeed
556
+ for (let i = 0; i < 4; i++) {
557
+ await expect(
558
+ sessionService.login("local", "nohttp@example.com", "wrong"),
559
+ ).rejects.toThrowError(InvalidCredentialsError);
560
+ }
561
+
562
+ const result = await sessionService.login(
563
+ "local",
564
+ "nohttp@example.com",
565
+ "correct",
566
+ );
567
+ expect(result.id).toBe(user.id);
568
+ });
569
+
570
+ it("should proceed with login when cache is unavailable", async ({
571
+ expect,
572
+ }) => {
573
+ const { sessionService, userService, cryptoProvider, identities } =
574
+ await setup({ brokenCache: true });
575
+
576
+ const user = await userService.users().create({
577
+ email: "cachefail@example.com",
578
+ roles: ["user"],
579
+ });
580
+
581
+ const hashedPassword = await cryptoProvider.hashPassword("correct");
582
+ await identities.create({
583
+ provider: "local",
584
+ providerUserId: "cachefail@example.com",
585
+ userId: user.id,
586
+ password: hashedPassword,
587
+ });
588
+
589
+ // Login should still succeed (fail-open)
590
+ const result = await sessionService.login(
591
+ "local",
592
+ "cachefail@example.com",
593
+ "correct",
594
+ );
595
+ expect(result.id).toBe(user.id);
596
+ });
597
+
598
+ it("should apply partial realm settings with defaults", async ({
599
+ expect,
600
+ }) => {
601
+ const {
602
+ sessionService,
603
+ userService,
604
+ cryptoProvider,
605
+ identities,
606
+ alepha,
607
+ } = await setup();
608
+
609
+ // Register realm with only accountMaxAttempts overridden
610
+ const realmProvider = alepha.inject(RealmProvider);
611
+ realmProvider.register("strict", {
612
+ settings: {
613
+ loginRateLimit: { accountMaxAttempts: 2 },
614
+ } as never,
615
+ });
616
+
617
+ const user = await userService.users("strict").create({
618
+ realm: "strict",
619
+ email: "strict@example.com",
620
+ roles: ["user"],
621
+ });
622
+
623
+ const hashedPassword = await cryptoProvider.hashPassword("correct");
624
+ await identities.create({
625
+ provider: "local",
626
+ providerUserId: "strict@example.com",
627
+ userId: user.id,
628
+ password: hashedPassword,
629
+ });
630
+
631
+ // Only 2 failures should lock the account
632
+ for (let i = 0; i < 2; i++) {
633
+ await expect(
634
+ sessionService.login(
635
+ "local",
636
+ "strict@example.com",
637
+ "wrong",
638
+ "strict",
639
+ ),
640
+ ).rejects.toThrowError(InvalidCredentialsError);
641
+ }
642
+
643
+ await expect(
644
+ sessionService.login(
645
+ "local",
646
+ "strict@example.com",
647
+ "correct",
648
+ "strict",
649
+ ),
650
+ ).rejects.toThrowError(InvalidCredentialsError);
651
+ });
652
+
653
+ it("should extend lockout on new failures (sliding window)", async ({
654
+ expect,
655
+ }) => {
656
+ const {
657
+ sessionService,
658
+ userService,
659
+ cryptoProvider,
660
+ identities,
661
+ dateTimeProvider,
662
+ } = await setup();
663
+
664
+ const user = await userService.users().create({
665
+ email: "sliding@example.com",
666
+ roles: ["user"],
667
+ });
668
+
669
+ const hashedPassword = await cryptoProvider.hashPassword("correct");
670
+ await identities.create({
671
+ provider: "local",
672
+ providerUserId: "sliding@example.com",
673
+ userId: user.id,
674
+ password: hashedPassword,
675
+ });
676
+
677
+ // Fail 4 times
678
+ for (let i = 0; i < 4; i++) {
679
+ await expect(
680
+ sessionService.login("local", "sliding@example.com", "wrong"),
681
+ ).rejects.toThrowError(InvalidCredentialsError);
682
+ }
683
+
684
+ // Advance 10 minutes (still inside 15min window)
685
+ await dateTimeProvider.travel(10 * 60 * 1000);
686
+
687
+ // 5th failure — triggers lockout, TTL refreshes from NOW
688
+ await expect(
689
+ sessionService.login("local", "sliding@example.com", "wrong"),
690
+ ).rejects.toThrowError(InvalidCredentialsError);
691
+
692
+ // Advance 10 more minutes (20min total from first, but only 10min from last failure)
693
+ await dateTimeProvider.travel(10 * 60 * 1000);
694
+
695
+ // Should STILL be locked — TTL was refreshed on the 5th failure
696
+ await expect(
697
+ sessionService.login("local", "sliding@example.com", "correct"),
698
+ ).rejects.toThrowError(InvalidCredentialsError);
699
+
700
+ // Advance past the remaining window
701
+ await dateTimeProvider.travel(6 * 60 * 1000);
702
+
703
+ // Now should succeed
704
+ const result = await sessionService.login(
705
+ "local",
706
+ "sliding@example.com",
707
+ "correct",
708
+ );
709
+ expect(result.id).toBe(user.id);
710
+ });
711
+ });
712
+ });
713
+
714
+ describe("alepha/api/users - SessionService.link", () => {
715
+ it("should reject OAuth2 account creation when registration is disabled", async ({
716
+ expect,
717
+ }) => {
718
+ const { sessionService, alepha } = await setup();
719
+
720
+ const realmProvider = alepha.inject(RealmProvider);
721
+ realmProvider.register("closed", {
722
+ settings: {
723
+ registrationAllowed: false,
724
+ } as never,
725
+ });
726
+
727
+ await expect(
728
+ sessionService.link(
729
+ "google",
730
+ {
731
+ sub: "google-123",
732
+ email: "newuser@example.com",
733
+ name: "New User",
734
+ },
735
+ "closed",
736
+ ),
737
+ ).rejects.toThrowError(BadRequestError);
738
+ });
739
+
740
+ it("should allow OAuth2 login for existing users when registration is disabled", async ({
741
+ expect,
742
+ }) => {
743
+ const { sessionService, userService, alepha } = await setup();
744
+
745
+ const realmProvider = alepha.inject(RealmProvider);
746
+ realmProvider.register("closed", {
747
+ settings: {
748
+ registrationAllowed: false,
749
+ } as never,
750
+ });
751
+
752
+ // Create existing user and identity
753
+ const user = await userService.users("closed").create({
754
+ realm: "closed",
755
+ email: "existing@example.com",
756
+ roles: ["user"],
757
+ });
758
+
759
+ await sessionService.identities("closed").create({
760
+ provider: "google",
761
+ providerUserId: "google-existing",
762
+ userId: user.id,
763
+ });
764
+
765
+ // Existing identity should still work
766
+ const result = await sessionService.link(
767
+ "google",
768
+ {
769
+ sub: "google-existing",
770
+ email: "existing@example.com",
771
+ name: "Existing User",
772
+ },
773
+ "closed",
774
+ );
775
+
776
+ expect(result.id).toBe(user.id);
777
+ });
778
+ });