alepha 0.19.1 → 0.19.3

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 (531) 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 +534 -502
  8. package/dist/api/jobs/index.d.ts.map +1 -1
  9. package/dist/api/jobs/index.js +13 -7
  10. package/dist/api/jobs/index.js.map +1 -1
  11. package/dist/api/keys/index.d.ts +202 -202
  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 +986 -931
  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 +137 -137
  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 +6 -18
  58. package/dist/cli/config/index.d.ts.map +1 -1
  59. package/dist/cli/config/index.js +5 -6
  60. package/dist/cli/config/index.js.map +1 -1
  61. package/dist/cli/core/index.d.ts +11811 -323
  62. package/dist/cli/core/index.d.ts.map +1 -1
  63. package/dist/cli/core/index.js +324 -98
  64. package/dist/cli/core/index.js.map +1 -1
  65. package/dist/cli/devtools/index.d.ts +50 -0
  66. package/dist/cli/devtools/index.d.ts.map +1 -0
  67. package/dist/cli/devtools/index.js +174 -0
  68. package/dist/cli/devtools/index.js.map +1 -0
  69. package/dist/cli/platform/index.d.ts +438 -542
  70. package/dist/cli/platform/index.d.ts.map +1 -1
  71. package/dist/cli/platform/index.js +46 -511
  72. package/dist/cli/platform/index.js.map +1 -1
  73. package/dist/cli/vendor/index.d.ts +201 -0
  74. package/dist/cli/vendor/index.d.ts.map +1 -0
  75. package/dist/cli/vendor/index.js +388 -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 +8 -4
  86. package/dist/core/index.js.map +1 -1
  87. package/dist/core/index.native.js +8 -4
  88. package/dist/core/index.native.js.map +1 -1
  89. package/dist/core/index.workerd.js +8 -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 +6 -3
  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 +78 -72
  126. package/dist/orm/core/index.bun.js.map +1 -1
  127. package/dist/orm/core/index.d.ts +103 -69
  128. package/dist/orm/core/index.d.ts.map +1 -1
  129. package/dist/orm/core/index.js +80 -70
  130. package/dist/orm/core/index.js.map +1 -1
  131. package/dist/orm/postgres/index.d.ts +19 -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 +37 -15
  240. package/src/api/jobs/{services → __tests__}/JobService.spec.ts +1 -1
  241. package/src/api/jobs/providers/JobProvider.ts +13 -9
  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 +17 -26
  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 +99 -69
  299. package/src/cli/core/services/PackageManagerUtils.ts +8 -1
  300. package/src/cli/core/services/ProjectScaffolder.ts +23 -23
  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/agentMd.ts +14 -5
  304. package/src/cli/core/templates/alephaConfigTs.ts +0 -6
  305. package/src/cli/core/templates/webAdminDashboardTsx.ts +17 -0
  306. package/src/cli/core/templates/webAppRouterTs.ts +85 -2
  307. package/src/cli/devtools/atoms/devtoolsOptions.ts +26 -0
  308. package/src/cli/devtools/index.ts +214 -0
  309. package/src/cli/platform/{adapters → __tests__}/CloudflareAdapter.spec.ts +2 -2
  310. package/src/cli/platform/{providers → __tests__}/GitHubSecretStore.spec.ts +1 -1
  311. package/src/cli/platform/{services → __tests__}/NamingService.spec.ts +1 -1
  312. package/src/cli/platform/{providers → __tests__}/PlatformCacheProvider.spec.ts +1 -1
  313. package/src/cli/platform/{services → __tests__}/PlatformInspector.spec.ts +1 -1
  314. package/src/cli/platform/{services → __tests__}/PlatformOrchestrator.spec.ts +3 -3
  315. package/src/cli/platform/{services → __tests__}/SecretFilterService.spec.ts +1 -1
  316. package/src/cli/platform/{commands → __tests__}/SecretsCommand.spec.ts +1 -1
  317. package/src/cli/platform/{adapters → __tests__}/VercelAdapter.spec.ts +2 -2
  318. package/src/cli/platform/atoms/platformOptions.ts +2 -10
  319. package/src/cli/platform/commands/SecretsCommand.ts +2 -2
  320. package/src/cli/platform/commands/platform.ts +2 -11
  321. package/src/cli/platform/index.ts +55 -11
  322. package/src/cli/platform/services/PlatformInspector.ts +2 -2
  323. package/src/cli/platform/services/PlatformOrchestrator.ts +0 -9
  324. package/src/cli/vendor/__tests__/VendorService.spec.ts +407 -0
  325. package/src/cli/vendor/atoms/vendorOptions.ts +41 -0
  326. package/src/cli/vendor/commands/VendorCommand.ts +204 -0
  327. package/src/cli/vendor/index.ts +60 -0
  328. package/src/cli/vendor/services/VendorService.ts +338 -0
  329. package/src/command/{providers → __tests__}/CliProvider.spec.ts +1 -1
  330. package/src/command/{helpers → __tests__}/EnvUtils.spec.ts +1 -1
  331. package/src/command/providers/CliProvider.ts +2 -2
  332. package/src/core/Alepha.ts +10 -0
  333. package/src/core/{primitives → __tests__}/$atom.spec.ts +2 -2
  334. package/src/core/{primitives → __tests__}/$memoize.spec.ts +1 -1
  335. package/src/core/{primitives → __tests__}/$mode.spec.ts +1 -1
  336. package/src/core/{primitives → __tests__}/$pipeline.spec.ts +1 -1
  337. package/src/core/{primitives → __tests__}/$scope.spec.ts +2 -2
  338. package/src/core/{providers → __tests__}/KeylessJsonSchemaCodec.spec.ts +1 -1
  339. package/src/core/{providers → __tests__}/SchemaValidator.spec.ts +1 -1
  340. package/src/core/{helpers → __tests__}/jsonSchemaToTypeBox.spec.ts +1 -1
  341. package/src/core/index.shared.ts +1 -1
  342. package/src/core/primitives/{$use.ts → $state.ts} +4 -4
  343. package/src/crypto/{providers → __tests__}/BrowserCryptoProvider.browser.spec.ts +1 -1
  344. package/src/crypto/{providers → __tests__}/CryptoProvider.spec.ts +1 -1
  345. package/src/datetime/{primitives → __tests__}/$debounce.spec.ts +1 -1
  346. package/src/datetime/{primitives → __tests__}/$throttle.spec.ts +1 -1
  347. package/src/datetime/{primitives → __tests__}/$timeout.spec.ts +1 -1
  348. package/src/email/brevo/{providers → __tests__}/BrevoEmailProvider.spec.ts +1 -1
  349. package/src/email/core/{providers → __tests__}/LocalEmailProvider.spec.ts +39 -150
  350. package/src/email/core/providers/LocalEmailProvider.ts +13 -51
  351. package/src/email/smtp/providers/NodemailerEmailProvider.ts +2 -2
  352. package/src/lock/core/{primitives → __tests__}/$lock.middleware.spec.ts +1 -1
  353. package/src/lock/core/primitives/$lock.ts +2 -2
  354. package/src/logger/index.ts +16 -5
  355. package/src/mcp/transports/SseMcpTransport.ts +2 -2
  356. package/src/orm/__tests__/ModelBuilder-tests.ts +53 -0
  357. package/src/orm/__tests__/ModelBuilder.spec.ts +80 -0
  358. package/src/orm/__tests__/organization-tests.ts +200 -0
  359. package/src/orm/__tests__/organization.spec.ts +103 -0
  360. package/src/orm/core/{providers/drivers → __tests__}/BunSqliteProvider.bun.spec.ts +5 -2
  361. package/src/orm/core/constants/PG_SYMBOLS.ts +2 -0
  362. package/src/orm/core/index.shared.ts +1 -0
  363. package/src/orm/core/primitives/$entity.ts +31 -0
  364. package/src/orm/core/providers/DatabaseTypeProvider.ts +11 -0
  365. package/src/orm/core/providers/DrizzleKitProvider.ts +57 -106
  366. package/src/orm/core/providers/drivers/BunSqliteProvider.ts +2 -2
  367. package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +3 -3
  368. package/src/orm/core/services/ModelBuilder.ts +11 -0
  369. package/src/orm/core/services/QueryManager.ts +16 -2
  370. package/src/orm/core/services/Repository.ts +70 -10
  371. package/src/orm/postgres/{providers → __tests__}/BunPostgresProvider.bun.spec.ts +1 -1
  372. package/src/queue/core/providers/WorkerProvider.ts +2 -2
  373. package/src/queue/redis/providers/RedisQueueProvider.ts +2 -2
  374. package/src/react/core/{hooks → __tests__}/useAction.browser.spec.tsx +1 -1
  375. package/src/react/core/hooks/useAction.ts +7 -6
  376. package/src/react/head/{providers → __tests__}/BrowserHeadProvider.browser.spec.ts +1 -1
  377. package/src/react/head/{helpers → __tests__}/SeoExpander.spec.ts +1 -1
  378. package/src/react/i18n/{providers → __tests__}/I18nProvider.spec.ts +1 -1
  379. package/src/react/i18n/{hooks → __tests__}/useI18n.browser.spec.tsx +1 -1
  380. package/src/react/intro/components/GettingStartedDevtoolsSlide.tsx +1 -1
  381. package/src/react/router/{providers → __tests__}/ReactBrowserProvider.browser.spec.ts +1 -1
  382. package/src/react/router/providers/ReactBrowserProvider.ts +2 -2
  383. package/src/react/router/providers/ReactPageProvider.ts +2 -2
  384. package/src/react/router/providers/ReactServerProvider.ts +3 -3
  385. package/src/redis/{providers → __tests__}/BunRedisProvider.bun.spec.ts +4 -4
  386. package/src/retry/{primitives → __tests__}/$retry.middleware.spec.ts +1 -1
  387. package/src/router/{TemplatedPathParser.spec.ts → __tests__/TemplatedPathParser.spec.ts} +1 -1
  388. package/src/scheduler/primitives/$scheduler.ts +2 -2
  389. package/src/security/{primitives → __tests__}/$secure-browser.spec.ts +1 -1
  390. package/src/security/{primitives → __tests__}/$secure.spec.ts +1 -1
  391. package/src/security/primitives/$issuer.ts +1 -1
  392. package/src/security/providers/JwtProvider.ts +6 -10
  393. package/src/security/providers/SecurityProvider.ts +6 -11
  394. package/src/security/schemas/userAccountInfoSchema.ts +3 -3
  395. package/src/server/auth/providers/ServerAuthProvider.ts +24 -2
  396. package/src/server/cookies/{services → __tests__}/CookieParser.spec.ts +1 -1
  397. package/src/server/core/{primitives → __tests__}/$circuit.spec.ts +1 -1
  398. package/src/server/core/{providers → __tests__}/NodeHttpServerProvider.spec.ts +1 -1
  399. package/src/server/core/{providers → __tests__}/ServerBodyParserProvider.spec.ts +31 -1
  400. package/src/server/core/{providers → __tests__}/ServerCompressProvider.spec.ts +1 -1
  401. package/src/server/core/{providers → __tests__}/ServerHelmetProvider.spec.ts +4 -1
  402. package/src/server/core/{providers → __tests__}/ServerMultipartProvider.spec.ts +1 -1
  403. package/src/server/core/{services → __tests__}/ServerRequestParser.spec.ts +1 -1
  404. package/src/server/core/primitives/$action.ts +2 -2
  405. package/src/server/core/primitives/$sse.ts +2 -2
  406. package/src/server/core/providers/ServerBodyParserProvider.ts +21 -12
  407. package/src/server/core/providers/ServerCompressProvider.ts +2 -2
  408. package/src/server/core/providers/ServerHelmetProvider.ts +2 -2
  409. package/src/server/core/providers/ServerMultipartProvider.ts +2 -2
  410. package/src/server/core/providers/ServerRouterProvider.ts +1 -5
  411. package/src/server/cors/{primitives → __tests__}/$cors.spec.ts +1 -1
  412. package/src/server/cors/providers/ServerCorsProvider.ts +2 -2
  413. package/src/server/links/{services → __tests__}/BatchCollector.spec.ts +1 -1
  414. package/src/server/links/providers/LinkProvider.ts +2 -2
  415. package/src/server/links/providers/RemotePrimitiveProvider.ts +2 -2
  416. package/src/server/links/providers/ServerLinksProvider.ts +2 -2
  417. package/src/server/rate-limit/{primitives → __tests__}/$rateLimit.spec.ts +1 -1
  418. package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +2 -2
  419. package/src/server/swagger/providers/ServerSwaggerProvider.ts +2 -2
  420. package/src/sms/{providers → __tests__}/LocalSmsProvider.spec.ts +35 -29
  421. package/src/sms/providers/LocalSmsProvider.ts +13 -24
  422. package/src/system/{providers → __tests__}/MemoryFileSystemProvider.spec.ts +1 -1
  423. package/src/system/{providers → __tests__}/MemoryShellProvider.spec.ts +1 -1
  424. package/src/topic/redis/providers/RedisTopicProvider.ts +2 -2
  425. package/src/websocket/{services → __tests__}/RoomManager.spec.ts +1 -1
  426. package/src/websocket/providers/NodeWebSocketServerProvider.ts +2 -2
  427. package/src/cli/platform/adapters/DockerAdapter.spec.ts +0 -378
  428. package/src/cli/platform/adapters/DockerAdapter.ts +0 -417
  429. package/src/cli/platform/services/DockerComposeGenerator.spec.ts +0 -490
  430. package/src/cli/platform/services/DockerComposeGenerator.ts +0 -353
  431. package/src/cli/platform/services/DockerSshService.spec.ts +0 -47
  432. package/src/cli/platform/services/DockerSshService.ts +0 -61
  433. /package/src/api/audits/{primitives → __tests__}/$audit.spec.ts +0 -0
  434. /package/src/api/audits/{services → __tests__}/AuditService.spec.ts +0 -0
  435. /package/src/api/files/{controllers → __tests__}/AdminFileStatsController.spec.ts +0 -0
  436. /package/src/api/files/{controllers → __tests__}/FileController.spec.ts +0 -0
  437. /package/src/api/files/{jobs → __tests__}/FileJobs.spec.ts +0 -0
  438. /package/src/api/files/{services → __tests__}/FileService.spec.ts +0 -0
  439. /package/src/api/jobs/{primitives → __tests__}/$job-middleware.spec.ts +0 -0
  440. /package/src/api/parameters/{primitives → __tests__}/$parameter.spec.ts +0 -0
  441. /package/src/api/users/{primitives → __tests__}/$realm.spec.ts +0 -0
  442. /package/src/api/users/{controllers → __tests__}/AdminIdentityController.spec.ts +0 -0
  443. /package/src/api/users/{controllers → __tests__}/AdminSessionController.spec.ts +0 -0
  444. /package/src/api/users/{controllers → __tests__}/AdminUserController.spec.ts +0 -0
  445. /package/src/api/users/{services → __tests__}/CredentialService.spec.ts +0 -0
  446. /package/src/api/users/{providers → __tests__}/RealmProvider.spec.ts +0 -0
  447. /package/src/api/users/{services → __tests__}/RegistrationService.spec.ts +0 -0
  448. /package/src/batch/{primitives → __tests__}/$batch.spec.ts +0 -0
  449. /package/src/batch/{providers → __tests__}/BatchProvider.spec.ts +0 -0
  450. /package/src/bucket/{primitives → __tests__}/$bucket.spec.ts +0 -0
  451. /package/src/bucket/{providers → __tests__}/FileStorageProvider.spec.ts +0 -0
  452. /package/src/bucket/{providers → __tests__}/LocalFileStorageProvider.spec.ts +0 -0
  453. /package/src/bucket/{providers → __tests__}/MemoryFileStorageProvider.spec.ts +0 -0
  454. /package/src/cache/core/{primitives → __tests__}/$cache.spec.ts +0 -0
  455. /package/src/cache/redis/{providers → __tests__}/RedisCacheProvider.spec.ts +0 -0
  456. /package/src/command/{primitives → __tests__}/$command.spec.ts +0 -0
  457. /package/src/command/{helpers → __tests__}/Asker.spec.ts +0 -0
  458. /package/src/command/{helpers → __tests__}/Runner.spec.ts +0 -0
  459. /package/src/core/{primitives → __tests__}/$context.spec.ts +0 -0
  460. /package/src/core/{primitives → __tests__}/$env.spec.ts +0 -0
  461. /package/src/core/{primitives → __tests__}/$hook.spec.ts +0 -0
  462. /package/src/core/{primitives → __tests__}/$inject.spec.ts +0 -0
  463. /package/src/core/{primitives → __tests__}/$module.spec.ts +0 -0
  464. /package/src/core/{providers → __tests__}/CodecManager.spec.ts +0 -0
  465. /package/src/core/{providers → __tests__}/EventManager.spec.ts +0 -0
  466. /package/src/core/{providers → __tests__}/StateManager.spec.ts +0 -0
  467. /package/src/core/{providers → __tests__}/TypeProvider.spec.ts +0 -0
  468. /package/src/datetime/{primitives → __tests__}/$interval.spec.ts +0 -0
  469. /package/src/datetime/{providers → __tests__}/DateTimeProvider.spec.ts +0 -0
  470. /package/src/email/core/{primitives → __tests__}/$email.spec.ts +0 -0
  471. /package/src/fake/{providers → __tests__}/FakeProvider.spec.ts +0 -0
  472. /package/src/lock/core/{providers → __tests__}/MemoryLockProvider.spec.ts +0 -0
  473. /package/src/lock/redis/{providers → __tests__}/RedisLockProvider.spec.ts +0 -0
  474. /package/src/logger/{primitives → __tests__}/$logger.spec.ts +0 -0
  475. /package/src/logger/{services → __tests__}/Logger.spec.ts +0 -0
  476. /package/src/mcp/{primitives → __tests__}/$prompt.spec.ts +0 -0
  477. /package/src/mcp/{primitives → __tests__}/$resource.spec.ts +0 -0
  478. /package/src/mcp/{primitives → __tests__}/$tool.spec.ts +0 -0
  479. /package/src/mcp/{providers → __tests__}/McpServerProvider.spec.ts +0 -0
  480. /package/src/mcp/{helpers → __tests__}/jsonrpc.spec.ts +0 -0
  481. /package/src/orm/core/{helpers → __tests__}/parseQueryString.spec.ts +0 -0
  482. /package/src/queue/core/{primitives → __tests__}/$consumer.spec.ts +0 -0
  483. /package/src/queue/core/{providers → __tests__}/MemoryQueueProvider.spec.ts +0 -0
  484. /package/src/queue/core/{providers → __tests__}/WorkerProvider.spec.ts +0 -0
  485. /package/src/queue/redis/{providers → __tests__}/RedisQueueProvider.spec.ts +0 -0
  486. /package/src/react/form/{hooks → __tests__}/useForm.browser.spec.tsx +0 -0
  487. /package/src/react/head/{hooks → __tests__}/useHead.spec.tsx +0 -0
  488. /package/src/react/i18n/{components → __tests__}/Localize.spec.tsx +0 -0
  489. /package/src/react/router/{primitives → __tests__}/$page.browser.spec.tsx +0 -0
  490. /package/src/react/router/{primitives → __tests__}/$page.middleware.spec.tsx +0 -0
  491. /package/src/react/router/{primitives → __tests__}/$page.spec.tsx +0 -0
  492. /package/src/react/router/{providers → __tests__}/ReactPreloadProvider.spec.ts +0 -0
  493. /package/src/react/router/{providers → __tests__}/ReactServerProvider.spec.tsx +0 -0
  494. /package/src/react/router/{providers → __tests__}/ReactServerTemplateProvider.spec.ts +0 -0
  495. /package/src/retry/{primitives → __tests__}/$retry.spec.ts +0 -0
  496. /package/src/retry/{providers → __tests__}/RetryProvider.spec.ts +0 -0
  497. /package/src/router/{providers → __tests__}/RouterProvider.spec.ts +0 -0
  498. /package/src/security/{primitives → __tests__}/$issuer.spec.ts +0 -0
  499. /package/src/security/{primitives → __tests__}/$permission.spec.ts +0 -0
  500. /package/src/security/{primitives → __tests__}/$role.spec.ts +0 -0
  501. /package/src/security/{primitives → __tests__}/$serviceAccount.spec.ts +0 -0
  502. /package/src/security/{providers → __tests__}/SecurityProvider.spec.ts +0 -0
  503. /package/src/server/cookies/{providers → __tests__}/ServerCookiesProvider.spec.ts +0 -0
  504. /package/src/server/core/{primitives → __tests__}/$action.spec.ts +0 -0
  505. /package/src/server/core/{primitives → __tests__}/$middleware.spec.ts +0 -0
  506. /package/src/server/core/{primitives → __tests__}/$route.spec.ts +0 -0
  507. /package/src/server/core/{primitives → __tests__}/$sse.spec.ts +0 -0
  508. /package/src/server/core/{providers → __tests__}/BunHttpServerProvider.bun.spec.ts +0 -0
  509. /package/src/server/core/{services → __tests__}/HttpClient.spec.ts +0 -0
  510. /package/src/server/core/{providers → __tests__}/ServerLoggerProvider.spec.ts +0 -0
  511. /package/src/server/core/{services → __tests__}/UserAgentParser.spec.ts +0 -0
  512. /package/src/server/cors/{providers → __tests__}/ServerCorsProvider.spec.ts +0 -0
  513. /package/src/server/etag/{providers → __tests__}/ServerEtagProvider.spec.ts +0 -0
  514. /package/src/server/health/{providers → __tests__}/ServerHealthProvider.spec.ts +0 -0
  515. /package/src/server/links/{primitives → __tests__}/$remote.spec.ts +0 -0
  516. /package/src/server/links/{services → __tests__}/BatchEndpoint.spec.ts +0 -0
  517. /package/src/server/links/{providers → __tests__}/LinkProvider.spec.ts +0 -0
  518. /package/src/server/links/{providers → __tests__}/ServerLinksProvider.spec.ts +0 -0
  519. /package/src/server/metrics/{providers → __tests__}/ServerMetricsProvider.spec.ts +0 -0
  520. /package/src/server/proxy/{primitives → __tests__}/$proxy.spec.ts +0 -0
  521. /package/src/server/rate-limit/{providers → __tests__}/ServerRateLimitProvider.spec.ts +0 -0
  522. /package/src/server/static/{primitives → __tests__}/$serve.spec.ts +0 -0
  523. /package/src/server/swagger/{primitives → __tests__}/$swagger.spec.ts +0 -0
  524. /package/src/sms/{primitives → __tests__}/$sms.spec.ts +0 -0
  525. /package/src/sms/{providers → __tests__}/MemorySmsProvider.spec.ts +0 -0
  526. /package/src/system/{services → __tests__}/FileDetector.spec.ts +0 -0
  527. /package/src/system/{providers → __tests__}/NodeFileSystemProvider.spec.ts +0 -0
  528. /package/src/topic/core/{primitives → __tests__}/$subscriber.spec.ts +0 -0
  529. /package/src/topic/core/{providers → __tests__}/MemoryTopicProvider.spec.ts +0 -0
  530. /package/src/topic/redis/{providers → __tests__}/RedisTopicProvider.spec.ts +0 -0
  531. /package/src/websocket/{primitives → __tests__}/$channel.spec.ts +0 -0
@@ -2,7 +2,7 @@ import {
2
2
  $atom,
3
3
  $hook,
4
4
  $inject,
5
- $use,
5
+ $state,
6
6
  Alepha,
7
7
  AlephaError,
8
8
  type TSchema,
@@ -60,7 +60,7 @@ export const reactPageOptions = $atom({
60
60
  export class ReactPageProvider {
61
61
  protected readonly dateTimeProvider = $inject(DateTimeProvider);
62
62
  protected readonly log = $logger();
63
- protected readonly options = $use(reactPageOptions);
63
+ protected readonly options = $state(reactPageOptions);
64
64
  protected readonly alepha = $inject(Alepha);
65
65
  protected readonly pages: PageRoute[] = [];
66
66
  protected nextIdCursor = 0;
@@ -4,7 +4,7 @@ import {
4
4
  $env,
5
5
  $hook,
6
6
  $inject,
7
- $use,
7
+ $state,
8
8
  Alepha,
9
9
  type Middleware,
10
10
  OPTIONS,
@@ -72,8 +72,8 @@ export class ReactServerProvider {
72
72
  */
73
73
  protected hasServerLinksProvider = false;
74
74
 
75
- protected readonly options = $use(reactServerOptions);
76
- protected readonly pageOptions = $use(reactPageOptions);
75
+ protected readonly options = $state(reactServerOptions);
76
+ protected readonly pageOptions = $state(reactPageOptions);
77
77
 
78
78
  /**
79
79
  * Configure the React server provider.
@@ -1,10 +1,10 @@
1
1
  import { afterAll, beforeAll, describe, expect, it } from "bun:test";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { Alepha } from "alepha";
4
- import { BunRedisProvider } from "./BunRedisProvider.ts";
5
- import { BunRedisSubscriberProvider } from "./BunRedisSubscriberProvider.ts";
6
- import { RedisProvider } from "./RedisProvider.ts";
7
- import { RedisSubscriberProvider } from "./RedisSubscriberProvider.ts";
4
+ import { BunRedisProvider } from "../providers/BunRedisProvider.ts";
5
+ import { BunRedisSubscriberProvider } from "../providers/BunRedisSubscriberProvider.ts";
6
+ import { RedisProvider } from "../providers/RedisProvider.ts";
7
+ import { RedisSubscriberProvider } from "../providers/RedisSubscriberProvider.ts";
8
8
 
9
9
  // -------------------------------------------------------------------------------------------------------------------
10
10
 
@@ -1,6 +1,6 @@
1
1
  import { $pipeline, Alepha } from "alepha";
2
2
  import { describe, test } from "vitest";
3
- import { $retry } from "./$retry.ts";
3
+ import { $retry } from "../primitives/$retry.ts";
4
4
 
5
5
  describe("$retry middleware", () => {
6
6
  test("retries handler on failure", async ({ expect }) => {
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, it } from "vitest";
2
- import { TemplatedPathParser } from "./TemplatedPathParser.ts";
2
+ import { TemplatedPathParser } from "../TemplatedPathParser.ts";
3
3
 
4
4
  describe("TemplatedPathParser", () => {
5
5
  describe("normalize", () => {
@@ -2,7 +2,7 @@ import {
2
2
  $atom,
3
3
  $inject,
4
4
  $pipeline,
5
- $use,
5
+ $state,
6
6
  Alepha,
7
7
  type Async,
8
8
  createPrimitive,
@@ -93,7 +93,7 @@ declare module "alepha" {
93
93
 
94
94
  export class SchedulerPrimitive extends Primitive<SchedulerPrimitiveOptions> {
95
95
  protected readonly log = $logger();
96
- protected readonly settings = $use(schedulerOptions);
96
+ protected readonly settings = $state(schedulerOptions);
97
97
  protected readonly alepha = $inject(Alepha);
98
98
  protected readonly dateTimeProvider = $inject(DateTimeProvider);
99
99
  protected readonly cronProvider = $inject(CronProvider);
@@ -1,7 +1,7 @@
1
1
  import { $pipeline, Alepha } from "alepha";
2
2
  import { describe, it } from "vitest";
3
3
  import { currentUserAtom } from "../atoms/currentUserAtom.ts";
4
- import { $secure } from "./$secure.browser.ts";
4
+ import { $secure } from "../primitives/$secure.browser.ts";
5
5
 
6
6
  describe("$secure (browser)", () => {
7
7
  describe("authentication", () => {
@@ -3,8 +3,8 @@ import { ForbiddenError, UnauthorizedError } from "alepha/server";
3
3
  import { describe, test } from "vitest";
4
4
  import { currentUserAtom } from "../atoms/currentUserAtom.ts";
5
5
  import type { UserAccountToken } from "../interfaces/UserAccountToken.ts";
6
+ import { $secure } from "../primitives/$secure.ts";
6
7
  import { SecurityProvider } from "../providers/SecurityProvider.ts";
7
- import { $secure } from "./$secure.ts";
8
8
 
9
9
  // -----------------------------------------------------------------------------------------------------------------
10
10
  // Test helpers
@@ -311,7 +311,7 @@ export class IssuerPrimitive extends Primitive<IssuerPrimitiveOptions> {
311
311
  preferred_username: user.username,
312
312
  picture: user.picture,
313
313
  // our claims
314
- organizations: user.organizations,
314
+ organization: user.organization,
315
315
  roles: user.roles,
316
316
  },
317
317
  this.name,
@@ -37,27 +37,23 @@ export class JwtProvider {
37
37
  */
38
38
  public setKeyLoader(name: string, secretKeyOrJwks: string | JSONWebKeySet) {
39
39
  if (typeof secretKeyOrJwks === "object") {
40
- this.log.info(
41
- `will verify JWTs from key '${name}' with JWKS object (x${secretKeyOrJwks.keys.length})`,
42
- );
40
+ this.log.debug(`will verify JWTs from key '${name}' with JWKS object`);
43
41
  this.keystore.push({
44
42
  name,
45
43
  keyLoader: createLocalJWKSet(secretKeyOrJwks),
46
44
  });
47
45
  } else if (this.isSecretKey(secretKeyOrJwks)) {
48
46
  const secretKey = this.encoder.encode(secretKeyOrJwks);
49
- this.log.info(
50
- `will verify JWTs from issuer '${name}' with secret key (${secretKey.length} bytes)`,
51
- );
47
+ this.log.debug(`will verify JWTs from issuer '${name}' with secret key`);
52
48
  this.keystore.push({
53
49
  name,
54
50
  secretKey: secretKeyOrJwks,
55
51
  keyLoader: () => Promise.resolve(createSecretKey(secretKey)),
56
52
  });
57
53
  } else {
58
- this.log.info(
59
- `will verify JWTs from issuer '${name}' with JWKS ${secretKeyOrJwks}`,
60
- );
54
+ this.log.debug(`will verify JWTs from issuer '${name}' with JWKS`, {
55
+ url: secretKeyOrJwks,
56
+ });
61
57
  this.keystore.push({
62
58
  name,
63
59
  keyLoader: createRemoteJWKSet(new URL(secretKeyOrJwks)),
@@ -187,7 +183,7 @@ export interface ExtendedJWTPayload extends JWTPayload {
187
183
  name?: string;
188
184
  roles?: string[];
189
185
  email?: string;
190
- organizations?: string[];
186
+ organization?: string;
191
187
  // keycloak specific
192
188
  realm_access?: { roles: string[] };
193
189
  }
@@ -295,7 +295,7 @@ export class SecurityProvider {
295
295
  const username = this.getUsernameFromPayload(payload);
296
296
  const picture = this.getPictureFromPayload(payload);
297
297
  const name = this.getNameFromPayload(payload);
298
- const organizations = this.getOrganizationsFromPayload(payload);
298
+ const organization = this.getOrganizationFromPayload(payload);
299
299
  const rolesFromSystem = this.getRoles(realmName);
300
300
  const roles = rolesFromPayload
301
301
  .reduce<Role[]>(
@@ -317,7 +317,7 @@ export class SecurityProvider {
317
317
  email,
318
318
  username,
319
319
  picture,
320
- organizations,
320
+ organization,
321
321
  sessionId,
322
322
  };
323
323
  }
@@ -916,20 +916,15 @@ export class SecurityProvider {
916
916
  return this.UNKNOWN_USER_NAME;
917
917
  }
918
918
 
919
- public getOrganizationsFromPayload(
919
+ public getOrganizationFromPayload(
920
920
  payload: Record<string, any>,
921
- ): string[] | undefined {
921
+ ): string | undefined {
922
922
  if (!payload) {
923
923
  return;
924
924
  }
925
925
 
926
- if (payload.organization) {
927
- if (typeof payload.organization === "string") {
928
- return [payload.organization];
929
- }
930
- if (Array.isArray(payload.organization)) {
931
- return payload.organization;
932
- }
926
+ if (typeof payload.organization === "string") {
927
+ return payload.organization;
933
928
  }
934
929
  }
935
930
  }
@@ -39,9 +39,9 @@ export const userAccountInfoSchema = t.object({
39
39
 
40
40
  // -------------------------------------------------------------------------------------------------------------------
41
41
 
42
- organizations: t.optional(
43
- t.array(t.text(), {
44
- description: "List of organizations the user belongs to.",
42
+ organization: t.optional(
43
+ t.uuid({
44
+ description: "Organization the user belongs to.",
45
45
  }),
46
46
  ),
47
47
 
@@ -50,6 +50,7 @@ export class ServerAuthProvider {
50
50
  realm: t.optional(t.text()),
51
51
  codeVerifier: t.optional(t.text({ size: "long" })),
52
52
  redirectUri: t.optional(t.text({ size: "long" })),
53
+ loginUri: t.optional(t.text({ size: "long" })),
53
54
  state: t.optional(t.text()),
54
55
  nonce: t.optional(t.text()),
55
56
  }),
@@ -278,7 +279,11 @@ export class ServerAuthProvider {
278
279
  redirect_uri: t.optional(t.text({ size: "rich" })),
279
280
  }),
280
281
  },
281
- handler: async ({ query, url, reply }) => {
282
+ handler: async ({ query, url, reply, headers }) => {
283
+ const loginUri = headers.referer
284
+ ? new URL(headers.referer).pathname + new URL(headers.referer).search
285
+ : undefined;
286
+
282
287
  const provider = this.provider({
283
288
  provider: query.provider,
284
289
  realm: query.realm,
@@ -318,6 +323,7 @@ export class ServerAuthProvider {
318
323
  state,
319
324
  nonce: parameters.nonce,
320
325
  redirectUri: query.redirect_uri ?? "/",
326
+ loginUri,
321
327
  provider: query.provider,
322
328
  realm: query.realm,
323
329
  });
@@ -345,6 +351,7 @@ export class ServerAuthProvider {
345
351
  this.authorizationCode.set({
346
352
  codeVerifier,
347
353
  redirectUri: query.redirect_uri ?? "/",
354
+ loginUri,
348
355
  provider: query.provider,
349
356
  realm: query.realm,
350
357
  });
@@ -374,6 +381,7 @@ export class ServerAuthProvider {
374
381
  }
375
382
 
376
383
  const redirectUri = authorizationCode.redirectUri ?? "/";
384
+ const loginUri = authorizationCode.loginUri;
377
385
 
378
386
  const externalTokens = await authorizationCodeGrant(oauth, url, {
379
387
  pkceCodeVerifier: authorizationCode.codeVerifier,
@@ -405,7 +413,21 @@ export class ServerAuthProvider {
405
413
 
406
414
  // internal, we need to create our own tokens
407
415
 
408
- const user = await provider.user(externalTokens);
416
+ let user: UserAccount;
417
+ try {
418
+ user = await provider.user(externalTokens);
419
+ } catch (e) {
420
+ this.log.warn("OAuth2 account linking failed", e);
421
+ const errorTarget = loginUri || redirectUri;
422
+ const errorUrl = new URL(errorTarget, url.origin);
423
+ errorUrl.searchParams.set(
424
+ "error",
425
+ e instanceof BadRequestError ? e.message : "Authentication failed",
426
+ );
427
+ reply.redirect(errorUrl.pathname + errorUrl.search, 302);
428
+ return;
429
+ }
430
+
409
431
  const tokens = await issuer.createToken(user);
410
432
 
411
433
  this.setTokens(
@@ -1,6 +1,6 @@
1
1
  import { describe, it } from "vitest";
2
2
  import type { Cookie } from "../primitives/$cookie.ts";
3
- import { CookieParser } from "./CookieParser.ts";
3
+ import { CookieParser } from "../services/CookieParser.ts";
4
4
 
5
5
  const parser = new CookieParser();
6
6
 
@@ -1,7 +1,7 @@
1
1
  import { $pipeline, Alepha } from "alepha";
2
2
  import { DateTimeProvider } from "alepha/datetime";
3
3
  import { describe, test } from "vitest";
4
- import { $circuit } from "./$circuit.ts";
4
+ import { $circuit } from "../primitives/$circuit.ts";
5
5
 
6
6
  // -----------------------------------------------------------------------------------------------------------------
7
7
  // $circuit — core behavior
@@ -1,6 +1,6 @@
1
1
  import { Alepha } from "alepha";
2
2
  import { afterEach, describe, expect, test } from "vitest";
3
- import { NodeHttpServerProvider } from "./NodeHttpServerProvider.ts";
3
+ import { NodeHttpServerProvider } from "../providers/NodeHttpServerProvider.ts";
4
4
 
5
5
  describe("NodeHttpServerProvider", () => {
6
6
  describe("graceful shutdown", () => {
@@ -5,7 +5,7 @@ import { $action, HttpError } from "../index.ts";
5
5
  import {
6
6
  bodyParserOptions,
7
7
  ServerBodyParserProvider,
8
- } from "./ServerBodyParserProvider.ts";
8
+ } from "../providers/ServerBodyParserProvider.ts";
9
9
 
10
10
  describe("ServerBodyParserProvider", () => {
11
11
  it("should parse JSON body", async ({ expect }) => {
@@ -309,6 +309,36 @@ describe("ServerBodyParserProvider", () => {
309
309
  expect(result).toBeUndefined();
310
310
  });
311
311
 
312
+ it("should cancel stream reader when body exceeds limit", async ({
313
+ expect,
314
+ }) => {
315
+ const alepha = Alepha.create();
316
+ alepha.store.mut(bodyParserOptions, () => ({
317
+ inflate: true,
318
+ limit: 10,
319
+ }));
320
+ const parser = alepha.inject(ServerBodyParserProvider);
321
+ await alepha.start();
322
+
323
+ let readerCancelled = false;
324
+
325
+ // Stream must stay open (not closed) so cancel() is invocable
326
+ const stream = new ReadableStream({
327
+ pull(controller) {
328
+ controller.enqueue(new TextEncoder().encode("A".repeat(20)));
329
+ },
330
+ cancel() {
331
+ readerCancelled = true;
332
+ },
333
+ });
334
+
335
+ await expect(parser.parseText(stream)).rejects.toThrowError(
336
+ "Request body size limit exceeded",
337
+ );
338
+
339
+ expect(readerCancelled).toBe(true);
340
+ });
341
+
312
342
  it("should return undefined for unsupported content-type", async ({
313
343
  expect,
314
344
  }) => {
@@ -1,7 +1,7 @@
1
1
  import { Alepha } from "alepha";
2
2
  import { $action, $route, AlephaServer, ServerProvider } from "alepha/server";
3
3
  import { describe, it } from "vitest";
4
- import { compressOptions } from "./ServerCompressProvider.ts";
4
+ import { compressOptions } from "../providers/ServerCompressProvider.ts";
5
5
 
6
6
  class App {
7
7
  hello = $action({
@@ -1,7 +1,10 @@
1
1
  import { Alepha } from "alepha";
2
2
  import { $action, AlephaServer, ServerProvider } from "alepha/server";
3
3
  import { describe, expect, test } from "vitest";
4
- import { type HelmetOptions, helmetOptions } from "./ServerHelmetProvider.ts";
4
+ import {
5
+ type HelmetOptions,
6
+ helmetOptions,
7
+ } from "../providers/ServerHelmetProvider.ts";
5
8
 
6
9
  class TestApp {
7
10
  ping = $action({ handler: () => "pong" });
@@ -1,7 +1,7 @@
1
1
  import { Alepha, t } from "alepha";
2
2
  import { $action, AlephaServer, ServerProvider } from "alepha/server";
3
3
  import { describe, test } from "vitest";
4
- import { multipartOptions } from "./ServerMultipartProvider.ts";
4
+ import { multipartOptions } from "../providers/ServerMultipartProvider.ts";
5
5
 
6
6
  class App {
7
7
  upload = $action({
@@ -2,7 +2,7 @@ import { Alepha } from "alepha";
2
2
  import { describe, it } from "vitest";
3
3
  import { CryptoProvider } from "../../../crypto/index.ts";
4
4
  import type { ServerRequestData } from "../interfaces/ServerRequest.ts";
5
- import { ServerRequestParser } from "./ServerRequestParser.ts";
5
+ import { ServerRequestParser } from "../services/ServerRequestParser.ts";
6
6
 
7
7
  const createMockRequestData = (
8
8
  headers: Record<string, string> = {},
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  $atom,
3
3
  $inject,
4
- $use,
4
+ $state,
5
5
  AlephaError,
6
6
  type Async,
7
7
  createPrimitive,
@@ -235,7 +235,7 @@ export class ActionPrimitive<
235
235
  TConfig extends RequestConfigSchema,
236
236
  > extends PipelinePrimitive<ActionPrimitiveOptions<TConfig>> {
237
237
  protected readonly log = $logger();
238
- protected readonly settings = $use(serverApiOptions);
238
+ protected readonly settings = $state(serverApiOptions);
239
239
  protected readonly httpClient = $inject(HttpClient);
240
240
  protected readonly serverProvider = $inject(ServerProvider);
241
241
  protected readonly serverRouterProvider = $inject(ServerRouterProvider);
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  $inject,
3
- $use,
3
+ $state,
4
4
  AlephaError,
5
5
  type Async,
6
6
  createPrimitive,
@@ -392,7 +392,7 @@ export class SsePrimitive<
392
392
  TConfig extends SseConfigSchema,
393
393
  > extends PipelinePrimitive<SsePrimitiveOptions<TConfig>> {
394
394
  protected readonly log = $logger();
395
- protected readonly settings = $use(serverApiOptions);
395
+ protected readonly settings = $state(serverApiOptions);
396
396
  protected readonly serverProvider = $inject(ServerProvider);
397
397
  protected readonly serverRouterProvider = $inject(ServerRouterProvider);
398
398
 
@@ -1,7 +1,7 @@
1
1
  import { Readable } from "node:stream";
2
2
  import { createBrotliDecompress, createGunzip, createInflate } from "node:zlib";
3
3
  import type { TSchema } from "alepha";
4
- import { $atom, $hook, $inject, $use, Alepha, type Static, t } from "alepha";
4
+ import { $atom, $hook, $inject, $state, Alepha, type Static, t } from "alepha";
5
5
  import { $logger } from "alepha/logger";
6
6
  import { HttpError } from "../errors/HttpError.ts";
7
7
 
@@ -42,7 +42,7 @@ declare module "alepha" {
42
42
  export class ServerBodyParserProvider {
43
43
  protected readonly alepha = $inject(Alepha);
44
44
  protected readonly log = $logger();
45
- protected readonly options = $use(bodyParserOptions);
45
+ protected readonly options = $state(bodyParserOptions);
46
46
 
47
47
  public readonly onRequest = $hook({
48
48
  on: "server:onRequest",
@@ -99,14 +99,20 @@ export class ServerBodyParserProvider {
99
99
  }
100
100
 
101
101
  if (route.schema?.body) {
102
- const contentLength = request.headers["content-length"];
103
- if (contentLength) {
104
- const size = Number.parseInt(contentLength, 10);
105
- if (!Number.isNaN(size) && size > this.options.limit) {
106
- throw new HttpError({
107
- status: 413,
108
- message: "Request body size limit exceeded",
109
- });
102
+ const contentType = request.headers["content-type"] ?? "";
103
+
104
+ // Skip body size check for multipart requests — ServerMultipartProvider
105
+ // handles its own limits (multipartOptions.limit / fileLimit).
106
+ if (!contentType.startsWith("multipart/")) {
107
+ const contentLength = request.headers["content-length"];
108
+ if (contentLength) {
109
+ const size = Number.parseInt(contentLength, 10);
110
+ if (!Number.isNaN(size) && size > this.options.limit) {
111
+ throw new HttpError({
112
+ status: 413,
113
+ message: "Request body size limit exceeded",
114
+ });
115
+ }
110
116
  }
111
117
  }
112
118
 
@@ -260,12 +266,14 @@ export class ServerBodyParserProvider {
260
266
  let totalLength = 0;
261
267
 
262
268
  const reader = stream.getReader();
269
+ let needsCancel = true;
263
270
 
264
271
  try {
265
272
  while (true) {
266
273
  const { done, value } = await reader.read();
267
274
 
268
275
  if (done) {
276
+ needsCancel = false;
269
277
  break;
270
278
  }
271
279
 
@@ -277,8 +285,6 @@ export class ServerBodyParserProvider {
277
285
  `Body size limit exceeded: ${totalLength} > ${limit}`,
278
286
  );
279
287
 
280
- await reader.cancel();
281
-
282
288
  throw new HttpError({
283
289
  status: 413,
284
290
  message: "Request body size limit exceeded",
@@ -303,6 +309,9 @@ export class ServerBodyParserProvider {
303
309
  combined.byteLength,
304
310
  );
305
311
  } finally {
312
+ if (needsCancel) {
313
+ await reader.cancel().catch(() => {});
314
+ }
306
315
  reader.releaseLock();
307
316
  }
308
317
  }
@@ -2,7 +2,7 @@ import { Readable, type Transform } from "node:stream";
2
2
  import { ReadableStream } from "node:stream/web";
3
3
  import { promisify } from "node:util";
4
4
  import * as zlib from "node:zlib";
5
- import { $atom, $hook, $inject, $use, Alepha, type Static, t } from "alepha";
5
+ import { $atom, $hook, $inject, $state, Alepha, type Static, t } from "alepha";
6
6
  import type { ServerResponse } from "alepha/server";
7
7
 
8
8
  const gzip = promisify(zlib.gzip);
@@ -77,7 +77,7 @@ export class ServerCompressProvider {
77
77
  };
78
78
 
79
79
  protected readonly alepha = $inject(Alepha);
80
- protected readonly options = $use(compressOptions);
80
+ protected readonly options = $state(compressOptions);
81
81
 
82
82
  public readonly onResponse = $hook({
83
83
  on: "server:onResponse",
@@ -1,4 +1,4 @@
1
- import { $atom, $hook, $inject, $use, Alepha, type Static, t } from "alepha";
1
+ import { $atom, $hook, $inject, $state, Alepha, type Static, t } from "alepha";
2
2
 
3
3
  // ---------------------------------------------------------------------------------------------------------------------
4
4
 
@@ -102,7 +102,7 @@ export class ServerHelmetProvider {
102
102
  /**
103
103
  * The configuration options loaded from the atom.
104
104
  */
105
- protected readonly options = $use(helmetOptions);
105
+ protected readonly options = $state(helmetOptions);
106
106
 
107
107
  protected defaultCspDirectives(): CspDirectives {
108
108
  return {
@@ -3,7 +3,7 @@ import {
3
3
  $atom,
4
4
  $hook,
5
5
  $inject,
6
- $use,
6
+ $state,
7
7
  Alepha,
8
8
  type FileLike,
9
9
  isTypeFile,
@@ -57,7 +57,7 @@ declare module "alepha" {
57
57
  export class ServerMultipartProvider {
58
58
  protected readonly alepha = $inject(Alepha);
59
59
  protected readonly log = $logger();
60
- protected readonly options = $use(multipartOptions);
60
+ protected readonly options = $state(multipartOptions);
61
61
 
62
62
  public readonly onRequest = $hook({
63
63
  on: "server:onRequest",
@@ -310,11 +310,7 @@ export class ServerRouterProvider extends RouterProvider<ServerRouteMatcher> {
310
310
  if (responseKind === "text") {
311
311
  reply.body = String(reply.body);
312
312
  // Detect HTML responses (starts with <!DOCTYPE html>)
313
- if (
314
- reply.body.length > 15 &&
315
- reply.body.charCodeAt(0) === 60 &&
316
- reply.body.startsWith("<!DOCTYPE html>")
317
- ) {
313
+ if (reply.body.startsWith("<!DOCTYPE html>")) {
318
314
  headers["content-type"] ??= "text/html; charset=UTF-8";
319
315
  } else {
320
316
  headers["content-type"] ??= "text/plain";
@@ -2,7 +2,7 @@ import { $pipeline, Alepha } from "alepha";
2
2
  import { AlephaServer } from "alepha/server";
3
3
  import { describe, test } from "vitest";
4
4
  import { AlephaServerCors } from "../index.ts";
5
- import { $cors } from "./$cors.ts";
5
+ import { $cors } from "../primitives/$cors.ts";
6
6
 
7
7
  // -----------------------------------------------------------------------------------------------------------------
8
8
  // $cors — core behavior
@@ -1,4 +1,4 @@
1
- import { $atom, $hook, $inject, $use, type Static, t } from "alepha";
1
+ import { $atom, $hook, $inject, $state, type Static, t } from "alepha";
2
2
  import { $logger } from "alepha/logger";
3
3
  import { ServerRouterProvider } from "alepha/server";
4
4
 
@@ -69,7 +69,7 @@ export interface CorsRegistration extends Partial<CorsOptions> {
69
69
  export class ServerCorsProvider {
70
70
  protected readonly log = $logger();
71
71
  protected readonly serverRouterProvider = $inject(ServerRouterProvider);
72
- protected readonly globalOptions = $use(corsOptions);
72
+ protected readonly globalOptions = $state(corsOptions);
73
73
 
74
74
  /**
75
75
  * Registered CORS configurations with their path patterns
@@ -1,6 +1,6 @@
1
1
  import { Alepha } from "alepha";
2
2
  import { describe, it } from "vitest";
3
- import { BatchCollector } from "./BatchCollector.ts";
3
+ import { BatchCollector } from "../services/BatchCollector.ts";
4
4
 
5
5
  describe("BatchCollector", () => {
6
6
  it("should deduplicate identical entries", ({ expect }) => {
@@ -1,4 +1,4 @@
1
- import { $inject, $use, Alepha, AlephaError, type Async, t } from "alepha";
1
+ import { $inject, $state, Alepha, AlephaError, type Async, t } from "alepha";
2
2
  import { $logger } from "alepha/logger";
3
3
  import type { SecureOptions } from "alepha/security";
4
4
  import {
@@ -50,7 +50,7 @@ export class LinkProvider {
50
50
  // Browser-only: batch collector for coalescing multiple calls
51
51
  protected batchCollector?: BatchCollector;
52
52
 
53
- protected readonly options = $use(linkOptionsAtom);
53
+ protected readonly options = $state(linkOptionsAtom);
54
54
 
55
55
  /**
56
56
  * Get applicative links registered on the server.