alepha 0.19.1 → 0.19.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (530) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +6 -9
  3. package/dist/api/audits/index.d.ts +378 -346
  4. package/dist/api/audits/index.d.ts.map +1 -1
  5. package/dist/api/files/index.d.ts +216 -184
  6. package/dist/api/files/index.d.ts.map +1 -1
  7. package/dist/api/jobs/index.d.ts +528 -496
  8. package/dist/api/jobs/index.d.ts.map +1 -1
  9. package/dist/api/jobs/index.js +3 -3
  10. package/dist/api/jobs/index.js.map +1 -1
  11. package/dist/api/keys/index.d.ts +207 -207
  12. package/dist/api/keys/index.d.ts.map +1 -1
  13. package/dist/api/notifications/index.d.ts +152 -152
  14. package/dist/api/notifications/index.d.ts.map +1 -1
  15. package/dist/api/organizations/index.browser.js +48 -0
  16. package/dist/api/organizations/index.browser.js.map +1 -0
  17. package/dist/api/organizations/index.d.ts +516 -0
  18. package/dist/api/organizations/index.d.ts.map +1 -0
  19. package/dist/api/organizations/index.js +202 -0
  20. package/dist/api/organizations/index.js.map +1 -0
  21. package/dist/api/parameters/index.d.ts +391 -358
  22. package/dist/api/parameters/index.d.ts.map +1 -1
  23. package/dist/api/parameters/index.js +5 -1
  24. package/dist/api/parameters/index.js.map +1 -1
  25. package/dist/api/users/index.browser.js +7 -5
  26. package/dist/api/users/index.browser.js.map +1 -1
  27. package/dist/api/users/index.d.ts +978 -913
  28. package/dist/api/users/index.d.ts.map +1 -1
  29. package/dist/api/users/index.js +160 -112
  30. package/dist/api/users/index.js.map +1 -1
  31. package/dist/api/verifications/index.d.ts +135 -135
  32. package/dist/api/verifications/index.d.ts.map +1 -1
  33. package/dist/api/verifications/index.js +2 -2
  34. package/dist/api/verifications/index.js.map +1 -1
  35. package/dist/batch/index.d.ts +6 -6
  36. package/dist/batch/index.d.ts.map +1 -1
  37. package/dist/billing/index.d.ts +1048 -0
  38. package/dist/billing/index.d.ts.map +1 -0
  39. package/dist/billing/index.js +713 -0
  40. package/dist/billing/index.js.map +1 -0
  41. package/dist/bin/index.js +0 -2
  42. package/dist/bin/index.js.map +1 -1
  43. package/dist/bucket/index.d.ts +10 -10
  44. package/dist/bucket/index.d.ts.map +1 -1
  45. package/dist/bucket/index.js +2 -2
  46. package/dist/bucket/index.js.map +1 -1
  47. package/dist/cache/core/index.d.ts +9 -9
  48. package/dist/cache/core/index.d.ts.map +1 -1
  49. package/dist/cache/core/index.js +2 -2
  50. package/dist/cache/core/index.js.map +1 -1
  51. package/dist/cache/core/index.workerd.js +2 -2
  52. package/dist/cache/core/index.workerd.js.map +1 -1
  53. package/dist/cache/redis/index.d.ts +6 -6
  54. package/dist/cache/redis/index.d.ts.map +1 -1
  55. package/dist/cache/redis/index.js +2 -2
  56. package/dist/cache/redis/index.js.map +1 -1
  57. package/dist/cli/config/index.d.ts +12 -2
  58. package/dist/cli/config/index.d.ts.map +1 -1
  59. package/dist/cli/config/index.js +4 -0
  60. package/dist/cli/config/index.js.map +1 -1
  61. package/dist/cli/core/index.d.ts +183 -140
  62. package/dist/cli/core/index.d.ts.map +1 -1
  63. package/dist/cli/core/index.js +279 -89
  64. package/dist/cli/core/index.js.map +1 -1
  65. package/dist/cli/devtools/index.d.ts +45 -0
  66. package/dist/cli/devtools/index.d.ts.map +1 -0
  67. package/dist/cli/devtools/index.js +170 -0
  68. package/dist/cli/devtools/index.js.map +1 -0
  69. package/dist/cli/platform/index.d.ts +383 -492
  70. package/dist/cli/platform/index.d.ts.map +1 -1
  71. package/dist/cli/platform/index.js +42 -511
  72. package/dist/cli/platform/index.js.map +1 -1
  73. package/dist/cli/vendor/index.d.ts +196 -0
  74. package/dist/cli/vendor/index.d.ts.map +1 -0
  75. package/dist/cli/vendor/index.js +384 -0
  76. package/dist/cli/vendor/index.js.map +1 -0
  77. package/dist/command/index.d.ts +18 -18
  78. package/dist/command/index.d.ts.map +1 -1
  79. package/dist/command/index.js +2 -2
  80. package/dist/command/index.js.map +1 -1
  81. package/dist/core/index.browser.js +4 -4
  82. package/dist/core/index.browser.js.map +1 -1
  83. package/dist/core/index.d.ts +10 -10
  84. package/dist/core/index.d.ts.map +1 -1
  85. package/dist/core/index.js +4 -4
  86. package/dist/core/index.js.map +1 -1
  87. package/dist/core/index.native.js +4 -4
  88. package/dist/core/index.native.js.map +1 -1
  89. package/dist/core/index.workerd.js +4 -4
  90. package/dist/core/index.workerd.js.map +1 -1
  91. package/dist/crypto/index.d.ts +7 -7
  92. package/dist/crypto/index.d.ts.map +1 -1
  93. package/dist/datetime/index.d.ts +4 -4
  94. package/dist/datetime/index.d.ts.map +1 -1
  95. package/dist/email/brevo/index.d.ts +4 -4
  96. package/dist/email/brevo/index.d.ts.map +1 -1
  97. package/dist/email/core/index.d.ts +15 -11
  98. package/dist/email/core/index.d.ts.map +1 -1
  99. package/dist/email/core/index.js +12 -35
  100. package/dist/email/core/index.js.map +1 -1
  101. package/dist/email/smtp/index.d.ts +12 -12
  102. package/dist/email/smtp/index.d.ts.map +1 -1
  103. package/dist/email/smtp/index.js +7 -4
  104. package/dist/email/smtp/index.js.map +1 -1
  105. package/dist/fake/index.d.ts +4 -8
  106. package/dist/fake/index.d.ts.map +1 -1
  107. package/dist/fake/index.js +55 -889
  108. package/dist/fake/index.js.map +1 -1
  109. package/dist/lock/core/index.d.ts +13 -13
  110. package/dist/lock/core/index.d.ts.map +1 -1
  111. package/dist/lock/core/index.js +2 -2
  112. package/dist/lock/core/index.js.map +1 -1
  113. package/dist/lock/redis/index.d.ts +4 -4
  114. package/dist/lock/redis/index.d.ts.map +1 -1
  115. package/dist/logger/index.d.ts +16 -15
  116. package/dist/logger/index.d.ts.map +1 -1
  117. package/dist/logger/index.js +5 -2
  118. package/dist/logger/index.js.map +1 -1
  119. package/dist/mcp/index.d.ts +11 -11
  120. package/dist/mcp/index.d.ts.map +1 -1
  121. package/dist/mcp/index.js +2 -2
  122. package/dist/mcp/index.js.map +1 -1
  123. package/dist/orm/core/index.browser.js +11 -1
  124. package/dist/orm/core/index.browser.js.map +1 -1
  125. package/dist/orm/core/index.bun.js +53 -16
  126. package/dist/orm/core/index.bun.js.map +1 -1
  127. package/dist/orm/core/index.d.ts +95 -51
  128. package/dist/orm/core/index.d.ts.map +1 -1
  129. package/dist/orm/core/index.js +55 -14
  130. package/dist/orm/core/index.js.map +1 -1
  131. package/dist/orm/postgres/index.d.ts +18 -17
  132. package/dist/orm/postgres/index.d.ts.map +1 -1
  133. package/dist/queue/core/index.d.ts +14 -14
  134. package/dist/queue/core/index.d.ts.map +1 -1
  135. package/dist/queue/core/index.js +2 -2
  136. package/dist/queue/core/index.js.map +1 -1
  137. package/dist/queue/core/index.workerd.js +2 -2
  138. package/dist/queue/core/index.workerd.js.map +1 -1
  139. package/dist/queue/redis/index.d.ts +4 -4
  140. package/dist/queue/redis/index.d.ts.map +1 -1
  141. package/dist/queue/redis/index.js +2 -2
  142. package/dist/queue/redis/index.js.map +1 -1
  143. package/dist/react/auth/index.d.ts +9 -9
  144. package/dist/react/auth/index.d.ts.map +1 -1
  145. package/dist/react/core/index.d.ts +6 -6
  146. package/dist/react/core/index.d.ts.map +1 -1
  147. package/dist/react/core/index.js +5 -4
  148. package/dist/react/core/index.js.map +1 -1
  149. package/dist/react/form/index.d.ts +4 -4
  150. package/dist/react/form/index.d.ts.map +1 -1
  151. package/dist/react/head/index.d.ts +4 -4
  152. package/dist/react/head/index.d.ts.map +1 -1
  153. package/dist/react/i18n/index.d.ts +9 -9
  154. package/dist/react/i18n/index.d.ts.map +1 -1
  155. package/dist/react/intro/index.d.ts +2 -2
  156. package/dist/react/intro/index.d.ts.map +1 -1
  157. package/dist/react/intro/index.js +1 -1
  158. package/dist/react/intro/index.js.map +1 -1
  159. package/dist/react/router/index.browser.js +4 -5
  160. package/dist/react/router/index.browser.js.map +1 -1
  161. package/dist/react/router/index.d.ts +215 -215
  162. package/dist/react/router/index.d.ts.map +1 -1
  163. package/dist/react/router/index.js +6 -7
  164. package/dist/react/router/index.js.map +1 -1
  165. package/dist/react/testing/index.d.ts +2 -2
  166. package/dist/react/testing/index.d.ts.map +1 -1
  167. package/dist/react/testing/index.js +2 -4
  168. package/dist/react/testing/index.js.map +1 -1
  169. package/dist/redis/index.d.ts +19 -19
  170. package/dist/redis/index.d.ts.map +1 -1
  171. package/dist/retry/index.d.ts +4 -4
  172. package/dist/retry/index.d.ts.map +1 -1
  173. package/dist/scheduler/index.d.ts +13 -13
  174. package/dist/scheduler/index.d.ts.map +1 -1
  175. package/dist/scheduler/index.js +2 -2
  176. package/dist/scheduler/index.js.map +1 -1
  177. package/dist/scheduler/index.workerd.js +2 -2
  178. package/dist/scheduler/index.workerd.js.map +1 -1
  179. package/dist/security/index.browser.js +1 -1
  180. package/dist/security/index.browser.js.map +1 -1
  181. package/dist/security/index.d.ts +47 -47
  182. package/dist/security/index.d.ts.map +1 -1
  183. package/dist/security/index.js +9 -12
  184. package/dist/security/index.js.map +1 -1
  185. package/dist/server/auth/index.d.ts +170 -169
  186. package/dist/server/auth/index.d.ts.map +1 -1
  187. package/dist/server/auth/index.js +16 -2
  188. package/dist/server/auth/index.js.map +1 -1
  189. package/dist/server/cookies/index.d.ts +7 -7
  190. package/dist/server/cookies/index.d.ts.map +1 -1
  191. package/dist/server/core/index.d.ts +76 -76
  192. package/dist/server/core/index.d.ts.map +1 -1
  193. package/dist/server/core/index.js +23 -17
  194. package/dist/server/core/index.js.map +1 -1
  195. package/dist/server/cors/index.d.ts +13 -13
  196. package/dist/server/cors/index.d.ts.map +1 -1
  197. package/dist/server/cors/index.js +2 -2
  198. package/dist/server/cors/index.js.map +1 -1
  199. package/dist/server/etag/index.d.ts +9 -9
  200. package/dist/server/etag/index.d.ts.map +1 -1
  201. package/dist/server/health/index.d.ts +20 -20
  202. package/dist/server/health/index.d.ts.map +1 -1
  203. package/dist/server/links/index.browser.js +2 -2
  204. package/dist/server/links/index.browser.js.map +1 -1
  205. package/dist/server/links/index.d.ts +66 -66
  206. package/dist/server/links/index.d.ts.map +1 -1
  207. package/dist/server/links/index.js +4 -4
  208. package/dist/server/links/index.js.map +1 -1
  209. package/dist/server/metrics/index.d.ts +7 -7
  210. package/dist/server/metrics/index.d.ts.map +1 -1
  211. package/dist/server/proxy/index.d.ts +5 -5
  212. package/dist/server/proxy/index.d.ts.map +1 -1
  213. package/dist/server/rate-limit/index.d.ts +12 -12
  214. package/dist/server/rate-limit/index.d.ts.map +1 -1
  215. package/dist/server/rate-limit/index.js +2 -2
  216. package/dist/server/rate-limit/index.js.map +1 -1
  217. package/dist/server/static/index.d.ts +5 -5
  218. package/dist/server/static/index.d.ts.map +1 -1
  219. package/dist/server/swagger/index.d.ts +7 -7
  220. package/dist/server/swagger/index.d.ts.map +1 -1
  221. package/dist/server/swagger/index.js +2 -2
  222. package/dist/server/swagger/index.js.map +1 -1
  223. package/dist/sms/index.d.ts +11 -7
  224. package/dist/sms/index.d.ts.map +1 -1
  225. package/dist/sms/index.js +9 -15
  226. package/dist/sms/index.js.map +1 -1
  227. package/dist/system/index.d.ts +4 -4
  228. package/dist/system/index.d.ts.map +1 -1
  229. package/dist/topic/core/index.d.ts +6 -6
  230. package/dist/topic/core/index.d.ts.map +1 -1
  231. package/dist/topic/redis/index.d.ts +7 -7
  232. package/dist/topic/redis/index.d.ts.map +1 -1
  233. package/dist/topic/redis/index.js +2 -2
  234. package/dist/topic/redis/index.js.map +1 -1
  235. package/dist/websocket/index.d.ts +36 -36
  236. package/dist/websocket/index.d.ts.map +1 -1
  237. package/dist/websocket/index.js +2 -2
  238. package/dist/websocket/index.js.map +1 -1
  239. package/package.json +36 -14
  240. package/src/api/jobs/{services → __tests__}/JobService.spec.ts +1 -1
  241. package/src/api/jobs/providers/JobProvider.ts +3 -3
  242. package/src/api/keys/{services → __tests__}/ApiKeyService.spec.ts +1 -1
  243. package/src/api/organizations/__tests__/OrganizationService.spec.ts +193 -0
  244. package/src/api/organizations/controllers/AdminOrganizationController.ts +103 -0
  245. package/src/api/organizations/entities/organizations.ts +20 -0
  246. package/src/api/organizations/index.browser.ts +10 -0
  247. package/src/api/organizations/index.ts +31 -0
  248. package/src/api/organizations/schemas/createOrganizationSchema.ts +10 -0
  249. package/src/api/organizations/schemas/organizationQuerySchema.ts +10 -0
  250. package/src/api/organizations/schemas/organizationResourceSchema.ts +6 -0
  251. package/src/api/organizations/schemas/updateOrganizationSchema.ts +7 -0
  252. package/src/api/organizations/services/OrganizationService.ts +75 -0
  253. package/src/api/parameters/services/ParameterProvider.ts +6 -1
  254. package/src/api/users/{services → __tests__}/SessionService.spec.ts +67 -0
  255. package/src/api/users/{jobs → __tests__}/UserJobs.spec.ts +1 -1
  256. package/src/api/users/entities/users.ts +9 -3
  257. package/src/api/users/index.ts +23 -4
  258. package/src/api/users/primitives/$realm.ts +6 -4
  259. package/src/api/users/providers/RealmProvider.ts +1 -1
  260. package/src/api/users/services/RegistrationService.ts +1 -1
  261. package/src/api/users/services/SessionService.ts +92 -5
  262. package/src/api/users/services/UserService.ts +1 -1
  263. package/src/api/verifications/{jobs → __tests__}/VerificationJobs.spec.ts +4 -2
  264. package/src/api/verifications/parameters/VerificationParameters.ts +2 -2
  265. package/src/billing/__tests__/BillingService.spec.ts +136 -0
  266. package/src/billing/__tests__/PaymentMethodService.spec.ts +78 -0
  267. package/src/billing/controllers/AdminBillingController.ts +149 -0
  268. package/src/billing/controllers/BillingController.ts +108 -0
  269. package/src/billing/entities/paymentIntents.ts +34 -0
  270. package/src/billing/entities/paymentMethods.ts +24 -0
  271. package/src/billing/entities/refunds.ts +22 -0
  272. package/src/billing/errors/BillingError.ts +5 -0
  273. package/src/billing/index.ts +76 -0
  274. package/src/billing/providers/BillingProvider.ts +79 -0
  275. package/src/billing/providers/MemoryBillingProvider.ts +139 -0
  276. package/src/billing/schemas/intentSchemas.ts +60 -0
  277. package/src/billing/schemas/paymentMethodSchemas.ts +13 -0
  278. package/src/billing/schemas/refundSchemas.ts +6 -0
  279. package/src/billing/services/BillingService.ts +325 -0
  280. package/src/billing/services/PaymentMethodService.ts +82 -0
  281. package/src/bin/index.ts +0 -2
  282. package/src/bucket/providers/LocalFileStorageProvider.ts +2 -2
  283. package/src/cache/core/{primitives → __tests__}/$cache.middleware.spec.ts +1 -1
  284. package/src/cache/core/{providers → __tests__}/MemoryCacheProvider.spec.ts +1 -1
  285. package/src/cache/core/primitives/$cache.ts +2 -2
  286. package/src/cache/redis/providers/RedisCacheProvider.ts +2 -2
  287. package/src/cli/config/defineConfig.ts +20 -0
  288. package/src/cli/core/{services → __tests__}/ProjectScaffolder.spec.ts +1 -1
  289. package/src/cli/core/{commands/gen → __tests__}/changelog.spec.ts +1 -1
  290. package/src/cli/core/{commands → __tests__}/init.spec.ts +2 -8
  291. package/src/cli/core/atoms/devOptions.ts +0 -5
  292. package/src/cli/core/commands/build.ts +2 -2
  293. package/src/cli/core/commands/dev.ts +165 -30
  294. package/src/cli/core/commands/gen/changelog.ts +2 -2
  295. package/src/cli/core/commands/init.ts +2 -7
  296. package/src/cli/core/commands/verify.ts +0 -1
  297. package/src/cli/core/providers/AppEntryProvider.ts +2 -2
  298. package/src/cli/core/providers/ViteDevServerProvider.ts +54 -66
  299. package/src/cli/core/services/PackageManagerUtils.ts +8 -3
  300. package/src/cli/core/services/ProjectScaffolder.ts +18 -18
  301. package/src/cli/core/tasks/BuildClientTask.ts +8 -0
  302. package/src/cli/core/tasks/BuildServerTask.ts +17 -4
  303. package/src/cli/core/templates/alephaConfigTs.ts +0 -6
  304. package/src/cli/core/templates/webAdminDashboardTsx.ts +17 -0
  305. package/src/cli/core/templates/webAppRouterTs.ts +85 -2
  306. package/src/cli/devtools/atoms/devtoolsOptions.ts +26 -0
  307. package/src/cli/devtools/index.ts +194 -0
  308. package/src/cli/platform/{adapters → __tests__}/CloudflareAdapter.spec.ts +2 -2
  309. package/src/cli/platform/{providers → __tests__}/GitHubSecretStore.spec.ts +1 -1
  310. package/src/cli/platform/{services → __tests__}/NamingService.spec.ts +1 -1
  311. package/src/cli/platform/{providers → __tests__}/PlatformCacheProvider.spec.ts +1 -1
  312. package/src/cli/platform/{services → __tests__}/PlatformInspector.spec.ts +1 -1
  313. package/src/cli/platform/{services → __tests__}/PlatformOrchestrator.spec.ts +3 -3
  314. package/src/cli/platform/{services → __tests__}/SecretFilterService.spec.ts +1 -1
  315. package/src/cli/platform/{commands → __tests__}/SecretsCommand.spec.ts +1 -1
  316. package/src/cli/platform/{adapters → __tests__}/VercelAdapter.spec.ts +2 -2
  317. package/src/cli/platform/atoms/platformOptions.ts +2 -10
  318. package/src/cli/platform/commands/SecretsCommand.ts +2 -2
  319. package/src/cli/platform/commands/platform.ts +2 -11
  320. package/src/cli/platform/index.ts +34 -11
  321. package/src/cli/platform/services/PlatformInspector.ts +2 -2
  322. package/src/cli/platform/services/PlatformOrchestrator.ts +0 -9
  323. package/src/cli/vendor/__tests__/VendorService.spec.ts +407 -0
  324. package/src/cli/vendor/atoms/vendorOptions.ts +41 -0
  325. package/src/cli/vendor/commands/VendorCommand.ts +204 -0
  326. package/src/cli/vendor/index.ts +43 -0
  327. package/src/cli/vendor/services/VendorService.ts +338 -0
  328. package/src/command/{providers → __tests__}/CliProvider.spec.ts +1 -1
  329. package/src/command/{helpers → __tests__}/EnvUtils.spec.ts +1 -1
  330. package/src/command/providers/CliProvider.ts +2 -2
  331. package/src/core/{primitives → __tests__}/$atom.spec.ts +2 -2
  332. package/src/core/{primitives → __tests__}/$memoize.spec.ts +1 -1
  333. package/src/core/{primitives → __tests__}/$mode.spec.ts +1 -1
  334. package/src/core/{primitives → __tests__}/$pipeline.spec.ts +1 -1
  335. package/src/core/{primitives → __tests__}/$scope.spec.ts +2 -2
  336. package/src/core/{providers → __tests__}/KeylessJsonSchemaCodec.spec.ts +1 -1
  337. package/src/core/{providers → __tests__}/SchemaValidator.spec.ts +1 -1
  338. package/src/core/{helpers → __tests__}/jsonSchemaToTypeBox.spec.ts +1 -1
  339. package/src/core/index.shared.ts +1 -1
  340. package/src/core/primitives/{$use.ts → $state.ts} +4 -4
  341. package/src/crypto/{providers → __tests__}/BrowserCryptoProvider.browser.spec.ts +1 -1
  342. package/src/crypto/{providers → __tests__}/CryptoProvider.spec.ts +1 -1
  343. package/src/datetime/{primitives → __tests__}/$debounce.spec.ts +1 -1
  344. package/src/datetime/{primitives → __tests__}/$throttle.spec.ts +1 -1
  345. package/src/datetime/{primitives → __tests__}/$timeout.spec.ts +1 -1
  346. package/src/email/brevo/{providers → __tests__}/BrevoEmailProvider.spec.ts +1 -1
  347. package/src/email/core/{providers → __tests__}/LocalEmailProvider.spec.ts +39 -150
  348. package/src/email/core/providers/LocalEmailProvider.ts +13 -51
  349. package/src/email/smtp/providers/NodemailerEmailProvider.ts +2 -2
  350. package/src/lock/core/{primitives → __tests__}/$lock.middleware.spec.ts +1 -1
  351. package/src/lock/core/primitives/$lock.ts +2 -2
  352. package/src/logger/index.ts +10 -4
  353. package/src/mcp/transports/SseMcpTransport.ts +2 -2
  354. package/src/orm/__tests__/ModelBuilder-tests.ts +53 -0
  355. package/src/orm/__tests__/ModelBuilder.spec.ts +80 -0
  356. package/src/orm/__tests__/organization-tests.ts +200 -0
  357. package/src/orm/__tests__/organization.spec.ts +103 -0
  358. package/src/orm/core/{providers/drivers → __tests__}/BunSqliteProvider.bun.spec.ts +5 -2
  359. package/src/orm/core/constants/PG_SYMBOLS.ts +2 -0
  360. package/src/orm/core/index.shared.ts +1 -0
  361. package/src/orm/core/primitives/$entity.ts +31 -0
  362. package/src/orm/core/providers/DatabaseTypeProvider.ts +11 -0
  363. package/src/orm/core/providers/DrizzleKitProvider.ts +1 -1
  364. package/src/orm/core/providers/drivers/BunSqliteProvider.ts +2 -2
  365. package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +3 -3
  366. package/src/orm/core/services/ModelBuilder.ts +11 -0
  367. package/src/orm/core/services/QueryManager.ts +16 -2
  368. package/src/orm/core/services/Repository.ts +70 -10
  369. package/src/orm/postgres/{providers → __tests__}/BunPostgresProvider.bun.spec.ts +1 -1
  370. package/src/queue/core/providers/WorkerProvider.ts +2 -2
  371. package/src/queue/redis/providers/RedisQueueProvider.ts +2 -2
  372. package/src/react/core/{hooks → __tests__}/useAction.browser.spec.tsx +1 -1
  373. package/src/react/core/hooks/useAction.ts +7 -6
  374. package/src/react/head/{providers → __tests__}/BrowserHeadProvider.browser.spec.ts +1 -1
  375. package/src/react/head/{helpers → __tests__}/SeoExpander.spec.ts +1 -1
  376. package/src/react/i18n/{providers → __tests__}/I18nProvider.spec.ts +1 -1
  377. package/src/react/i18n/{hooks → __tests__}/useI18n.browser.spec.tsx +1 -1
  378. package/src/react/intro/components/GettingStartedDevtoolsSlide.tsx +1 -1
  379. package/src/react/router/{providers → __tests__}/ReactBrowserProvider.browser.spec.ts +1 -1
  380. package/src/react/router/providers/ReactBrowserProvider.ts +2 -2
  381. package/src/react/router/providers/ReactPageProvider.ts +2 -2
  382. package/src/react/router/providers/ReactServerProvider.ts +3 -3
  383. package/src/redis/{providers → __tests__}/BunRedisProvider.bun.spec.ts +4 -4
  384. package/src/retry/{primitives → __tests__}/$retry.middleware.spec.ts +1 -1
  385. package/src/router/{TemplatedPathParser.spec.ts → __tests__/TemplatedPathParser.spec.ts} +1 -1
  386. package/src/scheduler/primitives/$scheduler.ts +2 -2
  387. package/src/security/{primitives → __tests__}/$secure-browser.spec.ts +1 -1
  388. package/src/security/{primitives → __tests__}/$secure.spec.ts +1 -1
  389. package/src/security/primitives/$issuer.ts +1 -1
  390. package/src/security/providers/JwtProvider.ts +6 -10
  391. package/src/security/providers/SecurityProvider.ts +6 -11
  392. package/src/security/schemas/userAccountInfoSchema.ts +3 -3
  393. package/src/server/auth/providers/ServerAuthProvider.ts +24 -2
  394. package/src/server/cookies/{services → __tests__}/CookieParser.spec.ts +1 -1
  395. package/src/server/core/{primitives → __tests__}/$circuit.spec.ts +1 -1
  396. package/src/server/core/{providers → __tests__}/NodeHttpServerProvider.spec.ts +1 -1
  397. package/src/server/core/{providers → __tests__}/ServerBodyParserProvider.spec.ts +31 -1
  398. package/src/server/core/{providers → __tests__}/ServerCompressProvider.spec.ts +1 -1
  399. package/src/server/core/{providers → __tests__}/ServerHelmetProvider.spec.ts +4 -1
  400. package/src/server/core/{providers → __tests__}/ServerMultipartProvider.spec.ts +1 -1
  401. package/src/server/core/{services → __tests__}/ServerRequestParser.spec.ts +1 -1
  402. package/src/server/core/primitives/$action.ts +2 -2
  403. package/src/server/core/primitives/$sse.ts +2 -2
  404. package/src/server/core/providers/ServerBodyParserProvider.ts +21 -12
  405. package/src/server/core/providers/ServerCompressProvider.ts +2 -2
  406. package/src/server/core/providers/ServerHelmetProvider.ts +2 -2
  407. package/src/server/core/providers/ServerMultipartProvider.ts +2 -2
  408. package/src/server/core/providers/ServerRouterProvider.ts +1 -5
  409. package/src/server/cors/{primitives → __tests__}/$cors.spec.ts +1 -1
  410. package/src/server/cors/providers/ServerCorsProvider.ts +2 -2
  411. package/src/server/links/{services → __tests__}/BatchCollector.spec.ts +1 -1
  412. package/src/server/links/providers/LinkProvider.ts +2 -2
  413. package/src/server/links/providers/RemotePrimitiveProvider.ts +2 -2
  414. package/src/server/links/providers/ServerLinksProvider.ts +2 -2
  415. package/src/server/rate-limit/{primitives → __tests__}/$rateLimit.spec.ts +1 -1
  416. package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +2 -2
  417. package/src/server/swagger/providers/ServerSwaggerProvider.ts +2 -2
  418. package/src/sms/{providers → __tests__}/LocalSmsProvider.spec.ts +35 -29
  419. package/src/sms/providers/LocalSmsProvider.ts +13 -24
  420. package/src/system/{providers → __tests__}/MemoryFileSystemProvider.spec.ts +1 -1
  421. package/src/system/{providers → __tests__}/MemoryShellProvider.spec.ts +1 -1
  422. package/src/topic/redis/providers/RedisTopicProvider.ts +2 -2
  423. package/src/websocket/{services → __tests__}/RoomManager.spec.ts +1 -1
  424. package/src/websocket/providers/NodeWebSocketServerProvider.ts +2 -2
  425. package/tsconfig.base.json +1 -0
  426. package/src/cli/platform/adapters/DockerAdapter.spec.ts +0 -378
  427. package/src/cli/platform/adapters/DockerAdapter.ts +0 -417
  428. package/src/cli/platform/services/DockerComposeGenerator.spec.ts +0 -490
  429. package/src/cli/platform/services/DockerComposeGenerator.ts +0 -353
  430. package/src/cli/platform/services/DockerSshService.spec.ts +0 -47
  431. package/src/cli/platform/services/DockerSshService.ts +0 -61
  432. /package/src/api/audits/{primitives → __tests__}/$audit.spec.ts +0 -0
  433. /package/src/api/audits/{services → __tests__}/AuditService.spec.ts +0 -0
  434. /package/src/api/files/{controllers → __tests__}/AdminFileStatsController.spec.ts +0 -0
  435. /package/src/api/files/{controllers → __tests__}/FileController.spec.ts +0 -0
  436. /package/src/api/files/{jobs → __tests__}/FileJobs.spec.ts +0 -0
  437. /package/src/api/files/{services → __tests__}/FileService.spec.ts +0 -0
  438. /package/src/api/jobs/{primitives → __tests__}/$job-middleware.spec.ts +0 -0
  439. /package/src/api/parameters/{primitives → __tests__}/$parameter.spec.ts +0 -0
  440. /package/src/api/users/{primitives → __tests__}/$realm.spec.ts +0 -0
  441. /package/src/api/users/{controllers → __tests__}/AdminIdentityController.spec.ts +0 -0
  442. /package/src/api/users/{controllers → __tests__}/AdminSessionController.spec.ts +0 -0
  443. /package/src/api/users/{controllers → __tests__}/AdminUserController.spec.ts +0 -0
  444. /package/src/api/users/{services → __tests__}/CredentialService.spec.ts +0 -0
  445. /package/src/api/users/{providers → __tests__}/RealmProvider.spec.ts +0 -0
  446. /package/src/api/users/{services → __tests__}/RegistrationService.spec.ts +0 -0
  447. /package/src/batch/{primitives → __tests__}/$batch.spec.ts +0 -0
  448. /package/src/batch/{providers → __tests__}/BatchProvider.spec.ts +0 -0
  449. /package/src/bucket/{primitives → __tests__}/$bucket.spec.ts +0 -0
  450. /package/src/bucket/{providers → __tests__}/FileStorageProvider.spec.ts +0 -0
  451. /package/src/bucket/{providers → __tests__}/LocalFileStorageProvider.spec.ts +0 -0
  452. /package/src/bucket/{providers → __tests__}/MemoryFileStorageProvider.spec.ts +0 -0
  453. /package/src/cache/core/{primitives → __tests__}/$cache.spec.ts +0 -0
  454. /package/src/cache/redis/{providers → __tests__}/RedisCacheProvider.spec.ts +0 -0
  455. /package/src/command/{primitives → __tests__}/$command.spec.ts +0 -0
  456. /package/src/command/{helpers → __tests__}/Asker.spec.ts +0 -0
  457. /package/src/command/{helpers → __tests__}/Runner.spec.ts +0 -0
  458. /package/src/core/{primitives → __tests__}/$context.spec.ts +0 -0
  459. /package/src/core/{primitives → __tests__}/$env.spec.ts +0 -0
  460. /package/src/core/{primitives → __tests__}/$hook.spec.ts +0 -0
  461. /package/src/core/{primitives → __tests__}/$inject.spec.ts +0 -0
  462. /package/src/core/{primitives → __tests__}/$module.spec.ts +0 -0
  463. /package/src/core/{providers → __tests__}/CodecManager.spec.ts +0 -0
  464. /package/src/core/{providers → __tests__}/EventManager.spec.ts +0 -0
  465. /package/src/core/{providers → __tests__}/StateManager.spec.ts +0 -0
  466. /package/src/core/{providers → __tests__}/TypeProvider.spec.ts +0 -0
  467. /package/src/datetime/{primitives → __tests__}/$interval.spec.ts +0 -0
  468. /package/src/datetime/{providers → __tests__}/DateTimeProvider.spec.ts +0 -0
  469. /package/src/email/core/{primitives → __tests__}/$email.spec.ts +0 -0
  470. /package/src/fake/{providers → __tests__}/FakeProvider.spec.ts +0 -0
  471. /package/src/lock/core/{providers → __tests__}/MemoryLockProvider.spec.ts +0 -0
  472. /package/src/lock/redis/{providers → __tests__}/RedisLockProvider.spec.ts +0 -0
  473. /package/src/logger/{primitives → __tests__}/$logger.spec.ts +0 -0
  474. /package/src/logger/{services → __tests__}/Logger.spec.ts +0 -0
  475. /package/src/mcp/{primitives → __tests__}/$prompt.spec.ts +0 -0
  476. /package/src/mcp/{primitives → __tests__}/$resource.spec.ts +0 -0
  477. /package/src/mcp/{primitives → __tests__}/$tool.spec.ts +0 -0
  478. /package/src/mcp/{providers → __tests__}/McpServerProvider.spec.ts +0 -0
  479. /package/src/mcp/{helpers → __tests__}/jsonrpc.spec.ts +0 -0
  480. /package/src/orm/core/{helpers → __tests__}/parseQueryString.spec.ts +0 -0
  481. /package/src/queue/core/{primitives → __tests__}/$consumer.spec.ts +0 -0
  482. /package/src/queue/core/{providers → __tests__}/MemoryQueueProvider.spec.ts +0 -0
  483. /package/src/queue/core/{providers → __tests__}/WorkerProvider.spec.ts +0 -0
  484. /package/src/queue/redis/{providers → __tests__}/RedisQueueProvider.spec.ts +0 -0
  485. /package/src/react/form/{hooks → __tests__}/useForm.browser.spec.tsx +0 -0
  486. /package/src/react/head/{hooks → __tests__}/useHead.spec.tsx +0 -0
  487. /package/src/react/i18n/{components → __tests__}/Localize.spec.tsx +0 -0
  488. /package/src/react/router/{primitives → __tests__}/$page.browser.spec.tsx +0 -0
  489. /package/src/react/router/{primitives → __tests__}/$page.middleware.spec.tsx +0 -0
  490. /package/src/react/router/{primitives → __tests__}/$page.spec.tsx +0 -0
  491. /package/src/react/router/{providers → __tests__}/ReactPreloadProvider.spec.ts +0 -0
  492. /package/src/react/router/{providers → __tests__}/ReactServerProvider.spec.tsx +0 -0
  493. /package/src/react/router/{providers → __tests__}/ReactServerTemplateProvider.spec.ts +0 -0
  494. /package/src/retry/{primitives → __tests__}/$retry.spec.ts +0 -0
  495. /package/src/retry/{providers → __tests__}/RetryProvider.spec.ts +0 -0
  496. /package/src/router/{providers → __tests__}/RouterProvider.spec.ts +0 -0
  497. /package/src/security/{primitives → __tests__}/$issuer.spec.ts +0 -0
  498. /package/src/security/{primitives → __tests__}/$permission.spec.ts +0 -0
  499. /package/src/security/{primitives → __tests__}/$role.spec.ts +0 -0
  500. /package/src/security/{primitives → __tests__}/$serviceAccount.spec.ts +0 -0
  501. /package/src/security/{providers → __tests__}/SecurityProvider.spec.ts +0 -0
  502. /package/src/server/cookies/{providers → __tests__}/ServerCookiesProvider.spec.ts +0 -0
  503. /package/src/server/core/{primitives → __tests__}/$action.spec.ts +0 -0
  504. /package/src/server/core/{primitives → __tests__}/$middleware.spec.ts +0 -0
  505. /package/src/server/core/{primitives → __tests__}/$route.spec.ts +0 -0
  506. /package/src/server/core/{primitives → __tests__}/$sse.spec.ts +0 -0
  507. /package/src/server/core/{providers → __tests__}/BunHttpServerProvider.bun.spec.ts +0 -0
  508. /package/src/server/core/{services → __tests__}/HttpClient.spec.ts +0 -0
  509. /package/src/server/core/{providers → __tests__}/ServerLoggerProvider.spec.ts +0 -0
  510. /package/src/server/core/{services → __tests__}/UserAgentParser.spec.ts +0 -0
  511. /package/src/server/cors/{providers → __tests__}/ServerCorsProvider.spec.ts +0 -0
  512. /package/src/server/etag/{providers → __tests__}/ServerEtagProvider.spec.ts +0 -0
  513. /package/src/server/health/{providers → __tests__}/ServerHealthProvider.spec.ts +0 -0
  514. /package/src/server/links/{primitives → __tests__}/$remote.spec.ts +0 -0
  515. /package/src/server/links/{services → __tests__}/BatchEndpoint.spec.ts +0 -0
  516. /package/src/server/links/{providers → __tests__}/LinkProvider.spec.ts +0 -0
  517. /package/src/server/links/{providers → __tests__}/ServerLinksProvider.spec.ts +0 -0
  518. /package/src/server/metrics/{providers → __tests__}/ServerMetricsProvider.spec.ts +0 -0
  519. /package/src/server/proxy/{primitives → __tests__}/$proxy.spec.ts +0 -0
  520. /package/src/server/rate-limit/{providers → __tests__}/ServerRateLimitProvider.spec.ts +0 -0
  521. /package/src/server/static/{primitives → __tests__}/$serve.spec.ts +0 -0
  522. /package/src/server/swagger/{primitives → __tests__}/$swagger.spec.ts +0 -0
  523. /package/src/sms/{primitives → __tests__}/$sms.spec.ts +0 -0
  524. /package/src/sms/{providers → __tests__}/MemorySmsProvider.spec.ts +0 -0
  525. /package/src/system/{services → __tests__}/FileDetector.spec.ts +0 -0
  526. /package/src/system/{providers → __tests__}/NodeFileSystemProvider.spec.ts +0 -0
  527. /package/src/topic/core/{primitives → __tests__}/$subscriber.spec.ts +0 -0
  528. /package/src/topic/core/{providers → __tests__}/MemoryTopicProvider.spec.ts +0 -0
  529. /package/src/topic/redis/{providers → __tests__}/RedisTopicProvider.spec.ts +0 -0
  530. /package/src/websocket/{primitives → __tests__}/$channel.spec.ts +0 -0
@@ -2,7 +2,7 @@ import {
2
2
  $atom,
3
3
  $hook,
4
4
  $inject,
5
- $use,
5
+ $state,
6
6
  Alepha,
7
7
  type Static,
8
8
  type TSchema,
@@ -61,7 +61,7 @@ declare module "alepha" {
61
61
 
62
62
  export class WorkerProvider {
63
63
  protected readonly log = $logger();
64
- protected readonly options = $use(queueWorkerOptions);
64
+ protected readonly options = $state(queueWorkerOptions);
65
65
  protected readonly alepha = $inject(Alepha);
66
66
  protected readonly queueProvider = $inject(QueueProvider);
67
67
  protected readonly dateTimeProvider = $inject(DateTimeProvider);
@@ -1,4 +1,4 @@
1
- import { $atom, $inject, $use, type Static, t } from "alepha";
1
+ import { $atom, $inject, $state, type Static, t } from "alepha";
2
2
  import type { QueueProvider } from "alepha/queue";
3
3
  import { RedisProvider } from "alepha/redis";
4
4
 
@@ -31,7 +31,7 @@ declare module "alepha" {
31
31
  // ---------------------------------------------------------------------------------------------------------------------
32
32
 
33
33
  export class RedisQueueProvider implements QueueProvider {
34
- protected readonly options = $use(redisQueueOptions);
34
+ protected readonly options = $state(redisQueueOptions);
35
35
  protected readonly redisProvider: RedisProvider = $inject(RedisProvider);
36
36
 
37
37
  public prefix(queue: string): string {
@@ -4,7 +4,7 @@ import { AlephaDateTime } from "alepha/datetime";
4
4
  import type { ReactNode } from "react";
5
5
  import { describe, test, vi } from "vitest";
6
6
  import { AlephaContext } from "../contexts/AlephaContext.ts";
7
- import { useAction } from "./useAction.ts";
7
+ import { useAction } from "../hooks/useAction.ts";
8
8
 
9
9
  describe("useAction", () => {
10
10
  test("should handle successful action", async ({ expect }) => {
@@ -134,8 +134,10 @@ export function useAction<Args extends any[], Result = void>(
134
134
  const isMountedRef = useRef(true);
135
135
  const intervalRef = useRef<Interval | undefined>(undefined);
136
136
 
137
- // Cleanup on unmount
137
+ // Track mount state — must set true in body for React StrictMode double-invoke
138
138
  useEffect(() => {
139
+ isMountedRef.current = true;
140
+
139
141
  return () => {
140
142
  isMountedRef.current = false;
141
143
 
@@ -179,12 +181,11 @@ export function useAction<Args extends any[], Result = void>(
179
181
  setLoading(true);
180
182
  setError(undefined);
181
183
 
182
- await alepha.events.emit("react:action:begin", {
183
- type: "custom",
184
- id: options.id,
185
- });
186
-
187
184
  try {
185
+ await alepha.events.emit("react:action:begin", {
186
+ type: "custom",
187
+ id: options.id,
188
+ });
188
189
  // Pass abort signal as last argument to handler
189
190
  const result = await options.handler(...args, {
190
191
  signal: abortController.signal,
@@ -1,7 +1,7 @@
1
1
  import { Alepha } from "alepha";
2
2
  import { beforeEach, describe, expect, it } from "vitest";
3
3
  import type { Head } from "../interfaces/Head.ts";
4
- import { BrowserHeadProvider } from "./BrowserHeadProvider.ts";
4
+ import { BrowserHeadProvider } from "../providers/BrowserHeadProvider.ts";
5
5
 
6
6
  describe("BrowserHeadProvider", () => {
7
7
  let alepha: Alepha;
@@ -1,6 +1,6 @@
1
1
  import { Alepha } from "alepha";
2
2
  import { describe, it } from "vitest";
3
- import { SeoExpander } from "./SeoExpander.ts";
3
+ import { SeoExpander } from "../helpers/SeoExpander.ts";
4
4
 
5
5
  describe("SeoExpander", () => {
6
6
  it("should expand basic SEO configuration", ({ expect }) => {
@@ -2,7 +2,7 @@ import { Alepha } from "alepha";
2
2
  import { describe, test } from "vitest";
3
3
  import { AlephaReactI18n } from "../index.ts";
4
4
  import { $dictionary } from "../primitives/$dictionary.ts";
5
- import { I18nProvider } from "./I18nProvider.ts";
5
+ import { I18nProvider } from "../providers/I18nProvider.ts";
6
6
 
7
7
  describe("I18nProvider", () => {
8
8
  test("should register dictionaries on initialization", async ({ expect }) => {
@@ -4,10 +4,10 @@ import { AlephaContext } from "alepha/react";
4
4
  import type { ReactNode } from "react";
5
5
  import { act } from "react";
6
6
  import { describe, test } from "vitest";
7
+ import { useI18n } from "../hooks/useI18n.ts";
7
8
  import { AlephaReactI18n } from "../index.ts";
8
9
  import { $dictionary } from "../primitives/$dictionary.ts";
9
10
  import { I18nProvider } from "../providers/I18nProvider.ts";
10
- import { useI18n } from "./useI18n.ts";
11
11
 
12
12
  describe("useI18n hook", () => {
13
13
  const renderWithAlepha = (alepha: Alepha, element: ReactNode) => {
@@ -6,7 +6,7 @@ import type { GettingStartedSlide } from "./GettingStarted.tsx";
6
6
  * Returns undefined if devtools are not available.
7
7
  */
8
8
  export const useDevtoolsSlide = (): GettingStartedSlide | undefined => {
9
- if (!import.meta.env.VITE_ALEPHA_DEVTOOLS) {
9
+ if (!import.meta.env?.VITE_ALEPHA_DEVTOOLS) {
10
10
  return undefined;
11
11
  }
12
12
 
@@ -1,6 +1,6 @@
1
1
  import { Alepha } from "alepha";
2
2
  import { beforeEach, describe, expect, it, vi } from "vitest";
3
- import { ReactBrowserProvider } from "./ReactBrowserProvider.ts";
3
+ import { ReactBrowserProvider } from "../providers/ReactBrowserProvider.ts";
4
4
 
5
5
  class TestReactBrowserProvider extends ReactBrowserProvider {
6
6
  public testGetHydrationState = this.getHydrationState.bind(this);
@@ -2,7 +2,7 @@ import {
2
2
  $atom,
3
3
  $hook,
4
4
  $inject,
5
- $use,
5
+ $state,
6
6
  Alepha,
7
7
  type State,
8
8
  type Static,
@@ -54,7 +54,7 @@ export class ReactBrowserProvider {
54
54
  protected readonly dateTimeProvider = $inject(DateTimeProvider);
55
55
  protected readonly browserHeadProvider = $inject(BrowserHeadProvider);
56
56
 
57
- protected readonly options = $use(reactBrowserOptions);
57
+ protected readonly options = $state(reactBrowserOptions);
58
58
 
59
59
  public get rootId() {
60
60
  return "root";
@@ -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