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
@@ -5,7 +5,7 @@ import {
5
5
  createMiddleware,
6
6
  type Middleware,
7
7
  PipelinePrimitive,
8
- } from "./$pipeline.ts";
8
+ } from "../primitives/$pipeline.ts";
9
9
 
10
10
  // -----------------------------------------------------------------------------------------------------------------
11
11
  // Test helpers — fake middleware factories
@@ -4,8 +4,8 @@ import {
4
4
  $pipeline,
5
5
  type Middleware,
6
6
  type MiddlewareMetadata,
7
- } from "./$pipeline.ts";
8
- import { $scope } from "./$scope.ts";
7
+ } from "../primitives/$pipeline.ts";
8
+ import { $scope } from "../primitives/$scope.ts";
9
9
 
10
10
  // -----------------------------------------------------------------------------------------------------------------
11
11
  // $scope — core behavior
@@ -1,6 +1,6 @@
1
1
  import { Alepha, t } from "alepha";
2
2
  import { describe, test } from "vitest";
3
- import { KeylessJsonSchemaCodec } from "./KeylessJsonSchemaCodec.ts";
3
+ import { KeylessJsonSchemaCodec } from "../providers/KeylessJsonSchemaCodec.ts";
4
4
 
5
5
  describe("KeylessJsonSchemaCodec", () => {
6
6
  describe("Basic types", () => {
@@ -1,6 +1,6 @@
1
1
  import { Alepha, t } from "alepha";
2
2
  import { describe, test } from "vitest";
3
- import { SchemaValidator } from "./SchemaValidator.ts";
3
+ import { SchemaValidator } from "../providers/SchemaValidator.ts";
4
4
 
5
5
  describe("SchemaValidator", () => {
6
6
  describe("Basic validation", () => {
@@ -1,7 +1,7 @@
1
1
  import * as Value from "typebox/value";
2
2
  import { describe, test } from "vitest";
3
+ import { jsonSchemaToTypeBox } from "../helpers/jsonSchemaToTypeBox.ts";
3
4
  import { t } from "../providers/TypeProvider.ts";
4
- import { jsonSchemaToTypeBox } from "./jsonSchemaToTypeBox.ts";
5
5
 
6
6
  describe("jsonSchemaToTypeBox", () => {
7
7
  describe("reserved/special property names", () => {
@@ -28,7 +28,7 @@ export * from "./primitives/$mode.ts";
28
28
  export * from "./primitives/$module.ts";
29
29
  export * from "./primitives/$pipeline.ts";
30
30
  export * from "./primitives/$scope.ts";
31
- export * from "./primitives/$use.ts";
31
+ export * from "./primitives/$state.ts";
32
32
  export * from "./providers/AlsProvider.ts";
33
33
  export * from "./providers/CodecManager.ts";
34
34
  export * from "./providers/EventManager.ts";
@@ -1,7 +1,7 @@
1
1
  import type { State } from "../Alepha.ts";
2
2
  import { OPTIONS } from "../constants/OPTIONS.ts";
3
- import type { Static, TObject } from "../providers/TypeProvider.ts";
4
- import type { Atom } from "./$atom.ts";
3
+ import type { Static } from "../providers/TypeProvider.ts";
4
+ import type { Atom, TAtomObject } from "./$atom.ts";
5
5
  import { $context } from "./$context.ts";
6
6
 
7
7
  /**
@@ -18,7 +18,7 @@ import { $context } from "./$context.ts";
18
18
  * const userState = $atom({ schema: t.object({ name: t.text(), role: t.text() }) });
19
19
  *
20
20
  * class UserComponent {
21
- * user = $use(userState); // Reactive reference to atom state
21
+ * user = $state(userState); // Reactive reference to atom state
22
22
  *
23
23
  * render() {
24
24
  * return <div>Hello {this.user.name}!</div>;
@@ -26,7 +26,7 @@ import { $context } from "./$context.ts";
26
26
  * }
27
27
  * ```
28
28
  */
29
- export const $use = <T extends TObject, N extends string>(
29
+ export const $state = <T extends TAtomObject, N extends string>(
30
30
  atom: Atom<T, N>,
31
31
  ): Readonly<Static<T>> => {
32
32
  const { alepha } = $context();
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, it } from "vitest";
2
- import { BrowserCryptoProvider } from "./BrowserCryptoProvider.ts";
2
+ import { BrowserCryptoProvider } from "../providers/BrowserCryptoProvider.ts";
3
3
 
4
4
  describe("BrowserCryptoProvider", () => {
5
5
  it("should throw on hashPassword", () => {
@@ -1,6 +1,6 @@
1
1
  import { Alepha } from "alepha";
2
2
  import { describe, expect, it } from "vitest";
3
- import { CryptoProvider } from "./CryptoProvider.ts";
3
+ import { CryptoProvider } from "../providers/CryptoProvider.ts";
4
4
 
5
5
  describe("CryptoProvider", () => {
6
6
  it("should hash and verify a password", async () => {
@@ -1,6 +1,6 @@
1
1
  import { $pipeline, Alepha } from "alepha";
2
2
  import { describe, test } from "vitest";
3
- import { $debounce } from "./$debounce.ts";
3
+ import { $debounce } from "../primitives/$debounce.ts";
4
4
 
5
5
  // -----------------------------------------------------------------------------------------------------------------
6
6
  // $debounce — core behavior
@@ -1,7 +1,7 @@
1
1
  import { $pipeline, Alepha } from "alepha";
2
2
  import { describe, test } from "vitest";
3
+ import { $throttle } from "../primitives/$throttle.ts";
3
4
  import { DateTimeProvider } from "../providers/DateTimeProvider.ts";
4
- import { $throttle } from "./$throttle.ts";
5
5
 
6
6
  // -----------------------------------------------------------------------------------------------------------------
7
7
  // $throttle — core behavior
@@ -1,7 +1,7 @@
1
1
  import { $pipeline, Alepha } from "alepha";
2
2
  import { describe, test } from "vitest";
3
+ import { $timeout } from "../primitives/$timeout.ts";
3
4
  import { DateTimeProvider } from "../providers/DateTimeProvider.ts";
4
- import { $timeout } from "./$timeout.ts";
5
5
 
6
6
  // -----------------------------------------------------------------------------------------------------------------
7
7
  // $timeout — core behavior
@@ -1,6 +1,6 @@
1
1
  import { Alepha } from "alepha";
2
2
  import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
3
- import { BrevoEmailProvider } from "./BrevoEmailProvider.ts";
3
+ import { BrevoEmailProvider } from "../providers/BrevoEmailProvider.ts";
4
4
 
5
5
  // ---------------------------------------------------------------------------------------------------------------------
6
6
 
@@ -1,6 +1,6 @@
1
1
  import { Alepha } from "alepha";
2
2
  import { FileSystemProvider, MemoryFileSystemProvider } from "alepha/system";
3
- import { beforeEach, describe, expect, test, vi } from "vitest";
3
+ import { describe, expect, it, vi } from "vitest";
4
4
  import { EmailError } from "../errors/EmailError.ts";
5
5
  import {
6
6
  LocalEmailProvider,
@@ -13,7 +13,7 @@ const DEFAULT_DIRECTORY = localEmailOptions.options.default.directory;
13
13
 
14
14
  describe("LocalEmailProvider", () => {
15
15
  describe("send", () => {
16
- test("should successfully send email to local file", async () => {
16
+ it("should successfully send email to local file", async () => {
17
17
  const alepha = Alepha.create().with({
18
18
  provide: FileSystemProvider,
19
19
  use: MemoryFileSystemProvider,
@@ -35,10 +35,15 @@ describe("LocalEmailProvider", () => {
35
35
 
36
36
  expect(memoryFs.writeFileCalls).toHaveLength(1);
37
37
  expect(memoryFs.writeFileCalls[0].path).toContain("test@example.com");
38
- expect(memoryFs.writeFileCalls[0].data).toContain(subject);
38
+
39
+ const written = JSON.parse(memoryFs.writeFileCalls[0].data as string);
40
+ expect(written.to).toBe(to);
41
+ expect(written.subject).toBe(subject);
42
+ expect(written.body).toBe(body);
43
+ expect(written.sentAt).toBeDefined();
39
44
  });
40
45
 
41
- test("should create proper filename with sanitized email and timestamp", async () => {
46
+ it("should create proper filename with sanitized email and timestamp", async () => {
42
47
  const alepha = Alepha.create().with({
43
48
  provide: FileSystemProvider,
44
49
  use: MemoryFileSystemProvider,
@@ -65,13 +70,13 @@ describe("LocalEmailProvider", () => {
65
70
  expect(memoryFs.joinCalls).toHaveLength(1);
66
71
  expect(memoryFs.joinCalls[0]).toEqual([
67
72
  DEFAULT_DIRECTORY,
68
- "user_test@example.com+2023-01-01T12-00-00-000Z.html",
73
+ "user_test@example.com,2023-01-01T12-00-00-000Z.eml.json",
69
74
  ]);
70
75
 
71
76
  vi.useRealTimers();
72
77
  });
73
78
 
74
- test("should sanitize special characters in email address", async () => {
79
+ it("should sanitize special characters in email address", async () => {
75
80
  const alepha = Alepha.create().with({
76
81
  provide: FileSystemProvider,
77
82
  use: MemoryFileSystemProvider,
@@ -93,11 +98,11 @@ describe("LocalEmailProvider", () => {
93
98
 
94
99
  expect(memoryFs.joinCalls).toHaveLength(1);
95
100
  expect(memoryFs.joinCalls[0][1]).toMatch(
96
- /user_script_@example\.com\+.+\.html/,
101
+ /user_script_@example\.com,.+\.eml\.json/,
97
102
  );
98
103
  });
99
104
 
100
- test("should create proper HTML content", async () => {
105
+ it("should create proper JSON content", async () => {
101
106
  const alepha = Alepha.create().with({
102
107
  provide: FileSystemProvider,
103
108
  use: MemoryFileSystemProvider,
@@ -107,6 +112,9 @@ describe("LocalEmailProvider", () => {
107
112
  const memoryFs = alepha.inject(MemoryFileSystemProvider);
108
113
  await alepha.start();
109
114
 
115
+ const mockDate = new Date("2023-01-01T12:00:00.000Z");
116
+ vi.setSystemTime(mockDate);
117
+
110
118
  const to = "test@example.com";
111
119
  const subject = "Test <Subject>";
112
120
  const body = "<p>Test body with <strong>HTML</strong></p>";
@@ -117,18 +125,17 @@ describe("LocalEmailProvider", () => {
117
125
  body,
118
126
  });
119
127
 
120
- const htmlContent = memoryFs.writeFileCalls[0].data;
128
+ const content = JSON.parse(memoryFs.writeFileCalls[0].data as string);
129
+
130
+ expect(content.to).toBe(to);
131
+ expect(content.subject).toBe(subject);
132
+ expect(content.body).toBe(body);
133
+ expect(content.sentAt).toBe("2023-01-01T12:00:00.000Z");
121
134
 
122
- expect(htmlContent).toContain("<!DOCTYPE html>");
123
- expect(htmlContent).toContain("Test &lt;Subject&gt;"); // escaped subject
124
- expect(htmlContent).toContain("test@example.com");
125
- expect(htmlContent).toContain(
126
- "<p>Test body with <strong>HTML</strong></p>",
127
- ); // body not escaped
128
- expect(htmlContent).toContain("Sent:");
135
+ vi.useRealTimers();
129
136
  });
130
137
 
131
- test("should throw EmailError when writeFile fails", async () => {
138
+ it("should throw EmailError when writeFile fails", async () => {
132
139
  const alepha = Alepha.create().with({
133
140
  provide: FileSystemProvider,
134
141
  use: MemoryFileSystemProvider,
@@ -161,7 +168,7 @@ describe("LocalEmailProvider", () => {
161
168
  ).rejects.toThrow("Failed to save email to local file: Disk full");
162
169
  });
163
170
 
164
- test("should handle non-Error exceptions", async () => {
171
+ it("should handle non-Error exceptions", async () => {
165
172
  const alepha = Alepha.create().with({
166
173
  provide: FileSystemProvider,
167
174
  use: MemoryFileSystemProvider,
@@ -194,7 +201,7 @@ describe("LocalEmailProvider", () => {
194
201
  ).rejects.toThrow("Failed to save email to local file: String error");
195
202
  });
196
203
 
197
- test("should handle multiple recipients", async () => {
204
+ it("should handle multiple recipients", async () => {
198
205
  const alepha = Alepha.create().with({
199
206
  provide: FileSystemProvider,
200
207
  use: MemoryFileSystemProvider,
@@ -216,150 +223,32 @@ describe("LocalEmailProvider", () => {
216
223
  });
217
224
  });
218
225
 
219
- describe("createEmailHtml", () => {
220
- let provider: LocalEmailProvider;
221
-
222
- beforeEach(async () => {
226
+ describe("createEmailJson", () => {
227
+ it("should return structured email data with sentAt timestamp", async () => {
223
228
  const alepha = Alepha.create().with({
224
229
  provide: FileSystemProvider,
225
230
  use: MemoryFileSystemProvider,
226
231
  });
227
- provider = alepha.inject(LocalEmailProvider);
232
+ const provider = alepha.inject(LocalEmailProvider);
228
233
  await alepha.start();
229
- });
230
234
 
231
- test("should create proper HTML structure", () => {
232
235
  const mockDate = new Date("2023-01-01T12:00:00.000Z");
233
236
  vi.setSystemTime(mockDate);
234
237
 
235
- const to = "test@example.com";
236
- const subject = "Test Subject";
237
- const body = "<p>Test body</p>";
238
-
239
- const html = provider.createEmailHtml({
240
- to,
241
- subject,
242
- body,
243
- });
244
-
245
- expect(html).toContain("<!DOCTYPE html>");
246
- expect(html).toContain('<html lang="en">');
247
- expect(html).toContain("<head>");
248
- expect(html).toContain("<body>");
249
- expect(html).toContain("Test Subject");
250
- expect(html).toContain("test@example.com");
251
- expect(html).toContain("<p>Test body</p>");
252
- expect(html).toContain("2023-01-01T12:00:00.000Z");
253
-
254
- vi.useRealTimers();
255
- });
256
-
257
- test("should escape HTML in subject and email address", () => {
258
- const to = "test<script>@example.com";
259
- const subject = "Test <Subject> & More";
260
- const body = "<p>Test body</p>";
261
-
262
- const html = provider.createEmailHtml({
263
- to,
264
- subject,
265
- body,
238
+ const result = provider.createEmailJson({
239
+ to: "test@example.com",
240
+ subject: "Test Subject",
241
+ body: "<p>Test body</p>",
266
242
  });
267
243
 
268
- expect(html).toContain("test&lt;script&gt;@example.com");
269
- expect(html).toContain("Test &lt;Subject&gt; &amp; More");
270
- expect(html).not.toContain("test<script>@example.com");
271
- expect(html).not.toContain("Test <Subject> & More");
272
- });
273
-
274
- test("should not escape HTML in body content", () => {
275
- const to = "test@example.com";
276
- const subject = "Test Subject";
277
- const body = "<p>Test body with <strong>HTML</strong> & entities</p>";
278
-
279
- const html = provider.createEmailHtml({
280
- to,
281
- subject,
282
- body,
244
+ expect(result).toEqual({
245
+ to: "test@example.com",
246
+ subject: "Test Subject",
247
+ body: "<p>Test body</p>",
248
+ sentAt: "2023-01-01T12:00:00.000Z",
283
249
  });
284
250
 
285
- expect(html).toContain(
286
- "<p>Test body with <strong>HTML</strong> & entities</p>",
287
- );
288
- });
289
-
290
- test("should include CSS styles", () => {
291
- const to = "test@example.com";
292
- const subject = "Test Subject";
293
- const body = "<p>Test body</p>";
294
-
295
- const html = provider.createEmailHtml({
296
- to,
297
- subject,
298
- body,
299
- });
300
-
301
- expect(html).toContain("<style>");
302
- expect(html).toContain("font-family: Arial, sans-serif");
303
- expect(html).toContain(".email-header");
304
- expect(html).toContain(".email-body");
305
- expect(html).toContain(".meta");
306
- });
307
- });
308
-
309
- describe("escapeHtml", () => {
310
- let provider: LocalEmailProvider;
311
-
312
- beforeEach(async () => {
313
- const alepha = Alepha.create().with({
314
- provide: FileSystemProvider,
315
- use: MemoryFileSystemProvider,
316
- });
317
- provider = alepha.inject(LocalEmailProvider);
318
- await alepha.start();
319
- });
320
-
321
- test("should escape ampersands", () => {
322
- const result = provider.escapeHtml("Tom & Jerry");
323
- expect(result).toBe("Tom &amp; Jerry");
324
- });
325
-
326
- test("should escape less than signs", () => {
327
- const result = provider.escapeHtml("5 < 10");
328
- expect(result).toBe("5 &lt; 10");
329
- });
330
-
331
- test("should escape greater than signs", () => {
332
- const result = provider.escapeHtml("10 > 5");
333
- expect(result).toBe("10 &gt; 5");
334
- });
335
-
336
- test("should escape double quotes", () => {
337
- const result = provider.escapeHtml('Say "Hello"');
338
- expect(result).toBe("Say &quot;Hello&quot;");
339
- });
340
-
341
- test("should escape single quotes", () => {
342
- const result = provider.escapeHtml("Don't worry");
343
- expect(result).toBe("Don&#39;t worry");
344
- });
345
-
346
- test("should escape multiple special characters", () => {
347
- const result = provider.escapeHtml(
348
- '<script>alert("Hello & goodbye")</script>',
349
- );
350
- expect(result).toBe(
351
- "&lt;script&gt;alert(&quot;Hello &amp; goodbye&quot;)&lt;/script&gt;",
352
- );
353
- });
354
-
355
- test("should handle empty string", () => {
356
- const result = provider.escapeHtml("");
357
- expect(result).toBe("");
358
- });
359
-
360
- test("should handle string with no special characters", () => {
361
- const result = provider.escapeHtml("Hello World");
362
- expect(result).toBe("Hello World");
251
+ vi.useRealTimers();
363
252
  });
364
253
  });
365
254
  });
@@ -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 { FileSystemProvider } from "alepha/system";
4
4
  import { EmailError } from "../errors/EmailError.ts";
@@ -34,7 +34,7 @@ declare module "alepha" {
34
34
  export class LocalEmailProvider implements EmailProvider {
35
35
  protected readonly log = $logger();
36
36
  protected readonly fs = $inject(FileSystemProvider);
37
- protected readonly options = $use(localEmailOptions);
37
+ protected readonly options = $state(localEmailOptions);
38
38
 
39
39
  protected get directory(): string {
40
40
  return this.options.directory;
@@ -69,22 +69,14 @@ export class LocalEmailProvider implements EmailProvider {
69
69
  });
70
70
 
71
71
  try {
72
- // Create filename: emailcontact+date
73
72
  const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
74
73
  for (const recipient of Array.isArray(to) ? to : [to]) {
75
74
  const sanitizedEmail = recipient.replace(/[^a-zA-Z0-9@.-]/g, "_");
76
- const filename = `${sanitizedEmail}+${timestamp}.html`;
75
+ const filename = `${sanitizedEmail},${timestamp}.eml.json`;
77
76
  const filepath = this.fs.join(this.directory, filename);
78
77
 
79
- // Create HTML content
80
- const htmlContent = this.createEmailHtml({
81
- to: recipient,
82
- subject,
83
- body,
84
- });
85
-
86
- // Write to file
87
- await this.fs.writeFile(filepath, htmlContent);
78
+ const content = this.createEmailJson({ to: recipient, subject, body });
79
+ await this.fs.writeFile(filepath, JSON.stringify(content, null, 2));
88
80
 
89
81
  this.log.info("Email saved to local file", { filepath, to, subject });
90
82
  }
@@ -95,46 +87,16 @@ export class LocalEmailProvider implements EmailProvider {
95
87
  }
96
88
  }
97
89
 
98
- public createEmailHtml(options: {
90
+ public createEmailJson(options: {
99
91
  to: string;
100
92
  subject: string;
101
93
  body: string;
102
- }): string {
103
- const { to, subject, body } = options;
104
- const timestamp = new Date().toISOString();
105
-
106
- return `<!DOCTYPE html>
107
- <html lang="en">
108
- <head>
109
- <meta charset="UTF-8">
110
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
111
- <title>${this.escapeHtml(subject)}</title>
112
- <style>
113
- body { font-family: Arial, sans-serif; margin: 20px; }
114
- .email-header { background-color: #f5f5f5; padding: 15px; border-radius: 5px; margin-bottom: 20px; }
115
- .email-body { background-color: #ffffff; padding: 15px; border: 1px solid #ddd; border-radius: 5px; }
116
- .meta { font-size: 12px; color: #666; margin-bottom: 10px; }
117
- </style>
118
- </head>
119
- <body>
120
- <div class="email-header">
121
- <div class="meta">Sent: ${timestamp}</div>
122
- <div class="meta">To: ${this.escapeHtml(to)}</div>
123
- <h1>${this.escapeHtml(subject)}</h1>
124
- </div>
125
- <div class="email-body">
126
- ${body}
127
- </div>
128
- </body>
129
- </html>`;
130
- }
131
-
132
- public escapeHtml(text: string): string {
133
- return text
134
- .replace(/&/g, "&amp;")
135
- .replace(/</g, "&lt;")
136
- .replace(/>/g, "&gt;")
137
- .replace(/"/g, "&quot;")
138
- .replace(/'/g, "&#39;");
94
+ }): { to: string; subject: string; body: string; sentAt: string } {
95
+ return {
96
+ to: options.to,
97
+ subject: options.subject,
98
+ body: options.body,
99
+ sentAt: new Date().toISOString(),
100
+ };
139
101
  }
140
102
  }
@@ -1,4 +1,4 @@
1
- import { $atom, $env, $hook, $use, type Static, t } from "alepha";
1
+ import { $atom, $env, $hook, $state, type Static, t } from "alepha";
2
2
  import {
3
3
  EmailError,
4
4
  type EmailProvider,
@@ -127,7 +127,7 @@ declare module "alepha" {
127
127
  export class NodemailerEmailProvider implements EmailProvider {
128
128
  protected readonly env = $env(envSchema);
129
129
  protected readonly log = $logger();
130
- protected readonly options = $use(nodemailerEmailOptions);
130
+ protected readonly options = $state(nodemailerEmailOptions);
131
131
  protected transporter: Transporter | null = null;
132
132
 
133
133
  protected get host(): string {
@@ -2,7 +2,7 @@ import { $pipeline, Alepha } from "alepha";
2
2
  import { describe, test } from "vitest";
3
3
  import { LockAcquireError } from "../errors/LockAcquireError.ts";
4
4
  import { AlephaLock } from "../index.ts";
5
- import { $lock } from "./$lock.ts";
5
+ import { $lock } from "../primitives/$lock.ts";
6
6
 
7
7
  describe("$lock middleware", () => {
8
8
  test("executes handler when lock is available", async ({ expect }) => {
@@ -2,7 +2,7 @@ import {
2
2
  $atom,
3
3
  $context,
4
4
  $inject,
5
- $use,
5
+ $state,
6
6
  AlephaError,
7
7
  type AsyncFn,
8
8
  createMiddleware,
@@ -391,7 +391,7 @@ export class LockPrimitive<TFunc extends AsyncFn> extends Primitive<
391
391
  > {
392
392
  protected readonly log = $logger();
393
393
  protected readonly provider = $inject(LockProvider);
394
- protected readonly settings = $use(lockOptions);
394
+ protected readonly settings = $state(lockOptions);
395
395
  protected readonly dateTimeProvider = $inject(DateTimeProvider);
396
396
 
397
397
  /**
@@ -57,14 +57,19 @@ export const AlephaLogger = $module({
57
57
  const env = alepha.parseEnv(envSchema);
58
58
 
59
59
  // Support DEBUG env var (debug package convention) as shorthand for LOG_LEVEL/LOG_FORMAT.
60
+ // DEBUG=1 → LOG_LEVEL=trace LOG_FORMAT=pretty
60
61
  // DEBUG=alepha:* → LOG_LEVEL=alepha.*:debug,info LOG_FORMAT=pretty
61
62
  let logLevel = env.LOG_LEVEL;
62
63
  let logFormat = env.LOG_FORMAT;
63
64
  if (env.DEBUG) {
64
- const patterns = env.DEBUG.split(",")
65
- .map((p) => p.trim().replaceAll(":", "."))
66
- .filter(Boolean);
67
- logLevel ??= `${patterns.map((p) => `${p}:debug`).join(",")},info`;
65
+ if (env.DEBUG === "1" || env.DEBUG === "true") {
66
+ logLevel ??= "trace";
67
+ } else {
68
+ const patterns = env.DEBUG.split(",")
69
+ .map((p) => p.trim().replaceAll(":", "."))
70
+ .filter(Boolean);
71
+ logLevel ??= `${patterns.map((p) => `${p}:debug`).join(",")},info`;
72
+ }
68
73
  logFormat ??= "pretty";
69
74
  }
70
75
 
@@ -134,7 +139,12 @@ export const AlephaLogger = $module({
134
139
 
135
140
  alepha.store.set(
136
141
  "alepha.logger.level",
137
- logLevel ?? (alepha.isTest() ? "trace" : "info"),
142
+ logLevel ??
143
+ (alepha.isTest()
144
+ ? "trace"
145
+ : alepha.isProduction() && alepha.isBrowser()
146
+ ? "warn"
147
+ : "info"),
138
148
  );
139
149
  },
140
150
  });
@@ -146,6 +156,7 @@ const envSchema = t.object({
146
156
  * Enable debug logging for specific modules using the `debug` package convention.
147
157
  *
148
158
  * @example
159
+ * DEBUG=1 # Shorthand for LOG_LEVEL=trace LOG_FORMAT=pretty
149
160
  * DEBUG=alepha:* # Enable debug logging for all alepha modules
150
161
  * DEBUG=alepha:orm:* # Enable debug logging for alepha.orm modules
151
162
  * DEBUG=* # Enable debug logging for all modules
@@ -1,4 +1,4 @@
1
- import { $atom, $inject, $use, t } from "alepha";
1
+ import { $atom, $inject, $state, t } from "alepha";
2
2
  import { $logger } from "alepha/logger";
3
3
  import { $route } from "alepha/server";
4
4
  import {
@@ -60,7 +60,7 @@ export const mcpSseOptions = $atom({
60
60
  */
61
61
  export class SseMcpTransport {
62
62
  protected readonly log = $logger();
63
- protected readonly options = $use(mcpSseOptions);
63
+ protected readonly options = $state(mcpSseOptions);
64
64
  protected readonly mcpServer = $inject(McpServerProvider);
65
65
 
66
66
  /**