alepha 0.19.1 → 0.19.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (530) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +6 -9
  3. package/dist/api/audits/index.d.ts +378 -346
  4. package/dist/api/audits/index.d.ts.map +1 -1
  5. package/dist/api/files/index.d.ts +216 -184
  6. package/dist/api/files/index.d.ts.map +1 -1
  7. package/dist/api/jobs/index.d.ts +528 -496
  8. package/dist/api/jobs/index.d.ts.map +1 -1
  9. package/dist/api/jobs/index.js +3 -3
  10. package/dist/api/jobs/index.js.map +1 -1
  11. package/dist/api/keys/index.d.ts +207 -207
  12. package/dist/api/keys/index.d.ts.map +1 -1
  13. package/dist/api/notifications/index.d.ts +152 -152
  14. package/dist/api/notifications/index.d.ts.map +1 -1
  15. package/dist/api/organizations/index.browser.js +48 -0
  16. package/dist/api/organizations/index.browser.js.map +1 -0
  17. package/dist/api/organizations/index.d.ts +516 -0
  18. package/dist/api/organizations/index.d.ts.map +1 -0
  19. package/dist/api/organizations/index.js +202 -0
  20. package/dist/api/organizations/index.js.map +1 -0
  21. package/dist/api/parameters/index.d.ts +391 -358
  22. package/dist/api/parameters/index.d.ts.map +1 -1
  23. package/dist/api/parameters/index.js +5 -1
  24. package/dist/api/parameters/index.js.map +1 -1
  25. package/dist/api/users/index.browser.js +7 -5
  26. package/dist/api/users/index.browser.js.map +1 -1
  27. package/dist/api/users/index.d.ts +978 -913
  28. package/dist/api/users/index.d.ts.map +1 -1
  29. package/dist/api/users/index.js +160 -112
  30. package/dist/api/users/index.js.map +1 -1
  31. package/dist/api/verifications/index.d.ts +135 -135
  32. package/dist/api/verifications/index.d.ts.map +1 -1
  33. package/dist/api/verifications/index.js +2 -2
  34. package/dist/api/verifications/index.js.map +1 -1
  35. package/dist/batch/index.d.ts +6 -6
  36. package/dist/batch/index.d.ts.map +1 -1
  37. package/dist/billing/index.d.ts +1048 -0
  38. package/dist/billing/index.d.ts.map +1 -0
  39. package/dist/billing/index.js +713 -0
  40. package/dist/billing/index.js.map +1 -0
  41. package/dist/bin/index.js +0 -2
  42. package/dist/bin/index.js.map +1 -1
  43. package/dist/bucket/index.d.ts +10 -10
  44. package/dist/bucket/index.d.ts.map +1 -1
  45. package/dist/bucket/index.js +2 -2
  46. package/dist/bucket/index.js.map +1 -1
  47. package/dist/cache/core/index.d.ts +9 -9
  48. package/dist/cache/core/index.d.ts.map +1 -1
  49. package/dist/cache/core/index.js +2 -2
  50. package/dist/cache/core/index.js.map +1 -1
  51. package/dist/cache/core/index.workerd.js +2 -2
  52. package/dist/cache/core/index.workerd.js.map +1 -1
  53. package/dist/cache/redis/index.d.ts +6 -6
  54. package/dist/cache/redis/index.d.ts.map +1 -1
  55. package/dist/cache/redis/index.js +2 -2
  56. package/dist/cache/redis/index.js.map +1 -1
  57. package/dist/cli/config/index.d.ts +12 -2
  58. package/dist/cli/config/index.d.ts.map +1 -1
  59. package/dist/cli/config/index.js +4 -0
  60. package/dist/cli/config/index.js.map +1 -1
  61. package/dist/cli/core/index.d.ts +183 -140
  62. package/dist/cli/core/index.d.ts.map +1 -1
  63. package/dist/cli/core/index.js +279 -89
  64. package/dist/cli/core/index.js.map +1 -1
  65. package/dist/cli/devtools/index.d.ts +45 -0
  66. package/dist/cli/devtools/index.d.ts.map +1 -0
  67. package/dist/cli/devtools/index.js +170 -0
  68. package/dist/cli/devtools/index.js.map +1 -0
  69. package/dist/cli/platform/index.d.ts +383 -492
  70. package/dist/cli/platform/index.d.ts.map +1 -1
  71. package/dist/cli/platform/index.js +42 -511
  72. package/dist/cli/platform/index.js.map +1 -1
  73. package/dist/cli/vendor/index.d.ts +196 -0
  74. package/dist/cli/vendor/index.d.ts.map +1 -0
  75. package/dist/cli/vendor/index.js +384 -0
  76. package/dist/cli/vendor/index.js.map +1 -0
  77. package/dist/command/index.d.ts +18 -18
  78. package/dist/command/index.d.ts.map +1 -1
  79. package/dist/command/index.js +2 -2
  80. package/dist/command/index.js.map +1 -1
  81. package/dist/core/index.browser.js +4 -4
  82. package/dist/core/index.browser.js.map +1 -1
  83. package/dist/core/index.d.ts +10 -10
  84. package/dist/core/index.d.ts.map +1 -1
  85. package/dist/core/index.js +4 -4
  86. package/dist/core/index.js.map +1 -1
  87. package/dist/core/index.native.js +4 -4
  88. package/dist/core/index.native.js.map +1 -1
  89. package/dist/core/index.workerd.js +4 -4
  90. package/dist/core/index.workerd.js.map +1 -1
  91. package/dist/crypto/index.d.ts +7 -7
  92. package/dist/crypto/index.d.ts.map +1 -1
  93. package/dist/datetime/index.d.ts +4 -4
  94. package/dist/datetime/index.d.ts.map +1 -1
  95. package/dist/email/brevo/index.d.ts +4 -4
  96. package/dist/email/brevo/index.d.ts.map +1 -1
  97. package/dist/email/core/index.d.ts +15 -11
  98. package/dist/email/core/index.d.ts.map +1 -1
  99. package/dist/email/core/index.js +12 -35
  100. package/dist/email/core/index.js.map +1 -1
  101. package/dist/email/smtp/index.d.ts +12 -12
  102. package/dist/email/smtp/index.d.ts.map +1 -1
  103. package/dist/email/smtp/index.js +7 -4
  104. package/dist/email/smtp/index.js.map +1 -1
  105. package/dist/fake/index.d.ts +4 -8
  106. package/dist/fake/index.d.ts.map +1 -1
  107. package/dist/fake/index.js +55 -889
  108. package/dist/fake/index.js.map +1 -1
  109. package/dist/lock/core/index.d.ts +13 -13
  110. package/dist/lock/core/index.d.ts.map +1 -1
  111. package/dist/lock/core/index.js +2 -2
  112. package/dist/lock/core/index.js.map +1 -1
  113. package/dist/lock/redis/index.d.ts +4 -4
  114. package/dist/lock/redis/index.d.ts.map +1 -1
  115. package/dist/logger/index.d.ts +16 -15
  116. package/dist/logger/index.d.ts.map +1 -1
  117. package/dist/logger/index.js +5 -2
  118. package/dist/logger/index.js.map +1 -1
  119. package/dist/mcp/index.d.ts +11 -11
  120. package/dist/mcp/index.d.ts.map +1 -1
  121. package/dist/mcp/index.js +2 -2
  122. package/dist/mcp/index.js.map +1 -1
  123. package/dist/orm/core/index.browser.js +11 -1
  124. package/dist/orm/core/index.browser.js.map +1 -1
  125. package/dist/orm/core/index.bun.js +53 -16
  126. package/dist/orm/core/index.bun.js.map +1 -1
  127. package/dist/orm/core/index.d.ts +95 -51
  128. package/dist/orm/core/index.d.ts.map +1 -1
  129. package/dist/orm/core/index.js +55 -14
  130. package/dist/orm/core/index.js.map +1 -1
  131. package/dist/orm/postgres/index.d.ts +18 -17
  132. package/dist/orm/postgres/index.d.ts.map +1 -1
  133. package/dist/queue/core/index.d.ts +14 -14
  134. package/dist/queue/core/index.d.ts.map +1 -1
  135. package/dist/queue/core/index.js +2 -2
  136. package/dist/queue/core/index.js.map +1 -1
  137. package/dist/queue/core/index.workerd.js +2 -2
  138. package/dist/queue/core/index.workerd.js.map +1 -1
  139. package/dist/queue/redis/index.d.ts +4 -4
  140. package/dist/queue/redis/index.d.ts.map +1 -1
  141. package/dist/queue/redis/index.js +2 -2
  142. package/dist/queue/redis/index.js.map +1 -1
  143. package/dist/react/auth/index.d.ts +9 -9
  144. package/dist/react/auth/index.d.ts.map +1 -1
  145. package/dist/react/core/index.d.ts +6 -6
  146. package/dist/react/core/index.d.ts.map +1 -1
  147. package/dist/react/core/index.js +5 -4
  148. package/dist/react/core/index.js.map +1 -1
  149. package/dist/react/form/index.d.ts +4 -4
  150. package/dist/react/form/index.d.ts.map +1 -1
  151. package/dist/react/head/index.d.ts +4 -4
  152. package/dist/react/head/index.d.ts.map +1 -1
  153. package/dist/react/i18n/index.d.ts +9 -9
  154. package/dist/react/i18n/index.d.ts.map +1 -1
  155. package/dist/react/intro/index.d.ts +2 -2
  156. package/dist/react/intro/index.d.ts.map +1 -1
  157. package/dist/react/intro/index.js +1 -1
  158. package/dist/react/intro/index.js.map +1 -1
  159. package/dist/react/router/index.browser.js +4 -5
  160. package/dist/react/router/index.browser.js.map +1 -1
  161. package/dist/react/router/index.d.ts +215 -215
  162. package/dist/react/router/index.d.ts.map +1 -1
  163. package/dist/react/router/index.js +6 -7
  164. package/dist/react/router/index.js.map +1 -1
  165. package/dist/react/testing/index.d.ts +2 -2
  166. package/dist/react/testing/index.d.ts.map +1 -1
  167. package/dist/react/testing/index.js +2 -4
  168. package/dist/react/testing/index.js.map +1 -1
  169. package/dist/redis/index.d.ts +19 -19
  170. package/dist/redis/index.d.ts.map +1 -1
  171. package/dist/retry/index.d.ts +4 -4
  172. package/dist/retry/index.d.ts.map +1 -1
  173. package/dist/scheduler/index.d.ts +13 -13
  174. package/dist/scheduler/index.d.ts.map +1 -1
  175. package/dist/scheduler/index.js +2 -2
  176. package/dist/scheduler/index.js.map +1 -1
  177. package/dist/scheduler/index.workerd.js +2 -2
  178. package/dist/scheduler/index.workerd.js.map +1 -1
  179. package/dist/security/index.browser.js +1 -1
  180. package/dist/security/index.browser.js.map +1 -1
  181. package/dist/security/index.d.ts +47 -47
  182. package/dist/security/index.d.ts.map +1 -1
  183. package/dist/security/index.js +9 -12
  184. package/dist/security/index.js.map +1 -1
  185. package/dist/server/auth/index.d.ts +170 -169
  186. package/dist/server/auth/index.d.ts.map +1 -1
  187. package/dist/server/auth/index.js +16 -2
  188. package/dist/server/auth/index.js.map +1 -1
  189. package/dist/server/cookies/index.d.ts +7 -7
  190. package/dist/server/cookies/index.d.ts.map +1 -1
  191. package/dist/server/core/index.d.ts +76 -76
  192. package/dist/server/core/index.d.ts.map +1 -1
  193. package/dist/server/core/index.js +23 -17
  194. package/dist/server/core/index.js.map +1 -1
  195. package/dist/server/cors/index.d.ts +13 -13
  196. package/dist/server/cors/index.d.ts.map +1 -1
  197. package/dist/server/cors/index.js +2 -2
  198. package/dist/server/cors/index.js.map +1 -1
  199. package/dist/server/etag/index.d.ts +9 -9
  200. package/dist/server/etag/index.d.ts.map +1 -1
  201. package/dist/server/health/index.d.ts +20 -20
  202. package/dist/server/health/index.d.ts.map +1 -1
  203. package/dist/server/links/index.browser.js +2 -2
  204. package/dist/server/links/index.browser.js.map +1 -1
  205. package/dist/server/links/index.d.ts +66 -66
  206. package/dist/server/links/index.d.ts.map +1 -1
  207. package/dist/server/links/index.js +4 -4
  208. package/dist/server/links/index.js.map +1 -1
  209. package/dist/server/metrics/index.d.ts +7 -7
  210. package/dist/server/metrics/index.d.ts.map +1 -1
  211. package/dist/server/proxy/index.d.ts +5 -5
  212. package/dist/server/proxy/index.d.ts.map +1 -1
  213. package/dist/server/rate-limit/index.d.ts +12 -12
  214. package/dist/server/rate-limit/index.d.ts.map +1 -1
  215. package/dist/server/rate-limit/index.js +2 -2
  216. package/dist/server/rate-limit/index.js.map +1 -1
  217. package/dist/server/static/index.d.ts +5 -5
  218. package/dist/server/static/index.d.ts.map +1 -1
  219. package/dist/server/swagger/index.d.ts +7 -7
  220. package/dist/server/swagger/index.d.ts.map +1 -1
  221. package/dist/server/swagger/index.js +2 -2
  222. package/dist/server/swagger/index.js.map +1 -1
  223. package/dist/sms/index.d.ts +11 -7
  224. package/dist/sms/index.d.ts.map +1 -1
  225. package/dist/sms/index.js +9 -15
  226. package/dist/sms/index.js.map +1 -1
  227. package/dist/system/index.d.ts +4 -4
  228. package/dist/system/index.d.ts.map +1 -1
  229. package/dist/topic/core/index.d.ts +6 -6
  230. package/dist/topic/core/index.d.ts.map +1 -1
  231. package/dist/topic/redis/index.d.ts +7 -7
  232. package/dist/topic/redis/index.d.ts.map +1 -1
  233. package/dist/topic/redis/index.js +2 -2
  234. package/dist/topic/redis/index.js.map +1 -1
  235. package/dist/websocket/index.d.ts +36 -36
  236. package/dist/websocket/index.d.ts.map +1 -1
  237. package/dist/websocket/index.js +2 -2
  238. package/dist/websocket/index.js.map +1 -1
  239. package/package.json +36 -14
  240. package/src/api/jobs/{services → __tests__}/JobService.spec.ts +1 -1
  241. package/src/api/jobs/providers/JobProvider.ts +3 -3
  242. package/src/api/keys/{services → __tests__}/ApiKeyService.spec.ts +1 -1
  243. package/src/api/organizations/__tests__/OrganizationService.spec.ts +193 -0
  244. package/src/api/organizations/controllers/AdminOrganizationController.ts +103 -0
  245. package/src/api/organizations/entities/organizations.ts +20 -0
  246. package/src/api/organizations/index.browser.ts +10 -0
  247. package/src/api/organizations/index.ts +31 -0
  248. package/src/api/organizations/schemas/createOrganizationSchema.ts +10 -0
  249. package/src/api/organizations/schemas/organizationQuerySchema.ts +10 -0
  250. package/src/api/organizations/schemas/organizationResourceSchema.ts +6 -0
  251. package/src/api/organizations/schemas/updateOrganizationSchema.ts +7 -0
  252. package/src/api/organizations/services/OrganizationService.ts +75 -0
  253. package/src/api/parameters/services/ParameterProvider.ts +6 -1
  254. package/src/api/users/{services → __tests__}/SessionService.spec.ts +67 -0
  255. package/src/api/users/{jobs → __tests__}/UserJobs.spec.ts +1 -1
  256. package/src/api/users/entities/users.ts +9 -3
  257. package/src/api/users/index.ts +23 -4
  258. package/src/api/users/primitives/$realm.ts +6 -4
  259. package/src/api/users/providers/RealmProvider.ts +1 -1
  260. package/src/api/users/services/RegistrationService.ts +1 -1
  261. package/src/api/users/services/SessionService.ts +92 -5
  262. package/src/api/users/services/UserService.ts +1 -1
  263. package/src/api/verifications/{jobs → __tests__}/VerificationJobs.spec.ts +4 -2
  264. package/src/api/verifications/parameters/VerificationParameters.ts +2 -2
  265. package/src/billing/__tests__/BillingService.spec.ts +136 -0
  266. package/src/billing/__tests__/PaymentMethodService.spec.ts +78 -0
  267. package/src/billing/controllers/AdminBillingController.ts +149 -0
  268. package/src/billing/controllers/BillingController.ts +108 -0
  269. package/src/billing/entities/paymentIntents.ts +34 -0
  270. package/src/billing/entities/paymentMethods.ts +24 -0
  271. package/src/billing/entities/refunds.ts +22 -0
  272. package/src/billing/errors/BillingError.ts +5 -0
  273. package/src/billing/index.ts +76 -0
  274. package/src/billing/providers/BillingProvider.ts +79 -0
  275. package/src/billing/providers/MemoryBillingProvider.ts +139 -0
  276. package/src/billing/schemas/intentSchemas.ts +60 -0
  277. package/src/billing/schemas/paymentMethodSchemas.ts +13 -0
  278. package/src/billing/schemas/refundSchemas.ts +6 -0
  279. package/src/billing/services/BillingService.ts +325 -0
  280. package/src/billing/services/PaymentMethodService.ts +82 -0
  281. package/src/bin/index.ts +0 -2
  282. package/src/bucket/providers/LocalFileStorageProvider.ts +2 -2
  283. package/src/cache/core/{primitives → __tests__}/$cache.middleware.spec.ts +1 -1
  284. package/src/cache/core/{providers → __tests__}/MemoryCacheProvider.spec.ts +1 -1
  285. package/src/cache/core/primitives/$cache.ts +2 -2
  286. package/src/cache/redis/providers/RedisCacheProvider.ts +2 -2
  287. package/src/cli/config/defineConfig.ts +20 -0
  288. package/src/cli/core/{services → __tests__}/ProjectScaffolder.spec.ts +1 -1
  289. package/src/cli/core/{commands/gen → __tests__}/changelog.spec.ts +1 -1
  290. package/src/cli/core/{commands → __tests__}/init.spec.ts +2 -8
  291. package/src/cli/core/atoms/devOptions.ts +0 -5
  292. package/src/cli/core/commands/build.ts +2 -2
  293. package/src/cli/core/commands/dev.ts +165 -30
  294. package/src/cli/core/commands/gen/changelog.ts +2 -2
  295. package/src/cli/core/commands/init.ts +2 -7
  296. package/src/cli/core/commands/verify.ts +0 -1
  297. package/src/cli/core/providers/AppEntryProvider.ts +2 -2
  298. package/src/cli/core/providers/ViteDevServerProvider.ts +54 -66
  299. package/src/cli/core/services/PackageManagerUtils.ts +8 -3
  300. package/src/cli/core/services/ProjectScaffolder.ts +18 -18
  301. package/src/cli/core/tasks/BuildClientTask.ts +8 -0
  302. package/src/cli/core/tasks/BuildServerTask.ts +17 -4
  303. package/src/cli/core/templates/alephaConfigTs.ts +0 -6
  304. package/src/cli/core/templates/webAdminDashboardTsx.ts +17 -0
  305. package/src/cli/core/templates/webAppRouterTs.ts +85 -2
  306. package/src/cli/devtools/atoms/devtoolsOptions.ts +26 -0
  307. package/src/cli/devtools/index.ts +194 -0
  308. package/src/cli/platform/{adapters → __tests__}/CloudflareAdapter.spec.ts +2 -2
  309. package/src/cli/platform/{providers → __tests__}/GitHubSecretStore.spec.ts +1 -1
  310. package/src/cli/platform/{services → __tests__}/NamingService.spec.ts +1 -1
  311. package/src/cli/platform/{providers → __tests__}/PlatformCacheProvider.spec.ts +1 -1
  312. package/src/cli/platform/{services → __tests__}/PlatformInspector.spec.ts +1 -1
  313. package/src/cli/platform/{services → __tests__}/PlatformOrchestrator.spec.ts +3 -3
  314. package/src/cli/platform/{services → __tests__}/SecretFilterService.spec.ts +1 -1
  315. package/src/cli/platform/{commands → __tests__}/SecretsCommand.spec.ts +1 -1
  316. package/src/cli/platform/{adapters → __tests__}/VercelAdapter.spec.ts +2 -2
  317. package/src/cli/platform/atoms/platformOptions.ts +2 -10
  318. package/src/cli/platform/commands/SecretsCommand.ts +2 -2
  319. package/src/cli/platform/commands/platform.ts +2 -11
  320. package/src/cli/platform/index.ts +34 -11
  321. package/src/cli/platform/services/PlatformInspector.ts +2 -2
  322. package/src/cli/platform/services/PlatformOrchestrator.ts +0 -9
  323. package/src/cli/vendor/__tests__/VendorService.spec.ts +407 -0
  324. package/src/cli/vendor/atoms/vendorOptions.ts +41 -0
  325. package/src/cli/vendor/commands/VendorCommand.ts +204 -0
  326. package/src/cli/vendor/index.ts +43 -0
  327. package/src/cli/vendor/services/VendorService.ts +338 -0
  328. package/src/command/{providers → __tests__}/CliProvider.spec.ts +1 -1
  329. package/src/command/{helpers → __tests__}/EnvUtils.spec.ts +1 -1
  330. package/src/command/providers/CliProvider.ts +2 -2
  331. package/src/core/{primitives → __tests__}/$atom.spec.ts +2 -2
  332. package/src/core/{primitives → __tests__}/$memoize.spec.ts +1 -1
  333. package/src/core/{primitives → __tests__}/$mode.spec.ts +1 -1
  334. package/src/core/{primitives → __tests__}/$pipeline.spec.ts +1 -1
  335. package/src/core/{primitives → __tests__}/$scope.spec.ts +2 -2
  336. package/src/core/{providers → __tests__}/KeylessJsonSchemaCodec.spec.ts +1 -1
  337. package/src/core/{providers → __tests__}/SchemaValidator.spec.ts +1 -1
  338. package/src/core/{helpers → __tests__}/jsonSchemaToTypeBox.spec.ts +1 -1
  339. package/src/core/index.shared.ts +1 -1
  340. package/src/core/primitives/{$use.ts → $state.ts} +4 -4
  341. package/src/crypto/{providers → __tests__}/BrowserCryptoProvider.browser.spec.ts +1 -1
  342. package/src/crypto/{providers → __tests__}/CryptoProvider.spec.ts +1 -1
  343. package/src/datetime/{primitives → __tests__}/$debounce.spec.ts +1 -1
  344. package/src/datetime/{primitives → __tests__}/$throttle.spec.ts +1 -1
  345. package/src/datetime/{primitives → __tests__}/$timeout.spec.ts +1 -1
  346. package/src/email/brevo/{providers → __tests__}/BrevoEmailProvider.spec.ts +1 -1
  347. package/src/email/core/{providers → __tests__}/LocalEmailProvider.spec.ts +39 -150
  348. package/src/email/core/providers/LocalEmailProvider.ts +13 -51
  349. package/src/email/smtp/providers/NodemailerEmailProvider.ts +2 -2
  350. package/src/lock/core/{primitives → __tests__}/$lock.middleware.spec.ts +1 -1
  351. package/src/lock/core/primitives/$lock.ts +2 -2
  352. package/src/logger/index.ts +10 -4
  353. package/src/mcp/transports/SseMcpTransport.ts +2 -2
  354. package/src/orm/__tests__/ModelBuilder-tests.ts +53 -0
  355. package/src/orm/__tests__/ModelBuilder.spec.ts +80 -0
  356. package/src/orm/__tests__/organization-tests.ts +200 -0
  357. package/src/orm/__tests__/organization.spec.ts +103 -0
  358. package/src/orm/core/{providers/drivers → __tests__}/BunSqliteProvider.bun.spec.ts +5 -2
  359. package/src/orm/core/constants/PG_SYMBOLS.ts +2 -0
  360. package/src/orm/core/index.shared.ts +1 -0
  361. package/src/orm/core/primitives/$entity.ts +31 -0
  362. package/src/orm/core/providers/DatabaseTypeProvider.ts +11 -0
  363. package/src/orm/core/providers/DrizzleKitProvider.ts +1 -1
  364. package/src/orm/core/providers/drivers/BunSqliteProvider.ts +2 -2
  365. package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +3 -3
  366. package/src/orm/core/services/ModelBuilder.ts +11 -0
  367. package/src/orm/core/services/QueryManager.ts +16 -2
  368. package/src/orm/core/services/Repository.ts +70 -10
  369. package/src/orm/postgres/{providers → __tests__}/BunPostgresProvider.bun.spec.ts +1 -1
  370. package/src/queue/core/providers/WorkerProvider.ts +2 -2
  371. package/src/queue/redis/providers/RedisQueueProvider.ts +2 -2
  372. package/src/react/core/{hooks → __tests__}/useAction.browser.spec.tsx +1 -1
  373. package/src/react/core/hooks/useAction.ts +7 -6
  374. package/src/react/head/{providers → __tests__}/BrowserHeadProvider.browser.spec.ts +1 -1
  375. package/src/react/head/{helpers → __tests__}/SeoExpander.spec.ts +1 -1
  376. package/src/react/i18n/{providers → __tests__}/I18nProvider.spec.ts +1 -1
  377. package/src/react/i18n/{hooks → __tests__}/useI18n.browser.spec.tsx +1 -1
  378. package/src/react/intro/components/GettingStartedDevtoolsSlide.tsx +1 -1
  379. package/src/react/router/{providers → __tests__}/ReactBrowserProvider.browser.spec.ts +1 -1
  380. package/src/react/router/providers/ReactBrowserProvider.ts +2 -2
  381. package/src/react/router/providers/ReactPageProvider.ts +2 -2
  382. package/src/react/router/providers/ReactServerProvider.ts +3 -3
  383. package/src/redis/{providers → __tests__}/BunRedisProvider.bun.spec.ts +4 -4
  384. package/src/retry/{primitives → __tests__}/$retry.middleware.spec.ts +1 -1
  385. package/src/router/{TemplatedPathParser.spec.ts → __tests__/TemplatedPathParser.spec.ts} +1 -1
  386. package/src/scheduler/primitives/$scheduler.ts +2 -2
  387. package/src/security/{primitives → __tests__}/$secure-browser.spec.ts +1 -1
  388. package/src/security/{primitives → __tests__}/$secure.spec.ts +1 -1
  389. package/src/security/primitives/$issuer.ts +1 -1
  390. package/src/security/providers/JwtProvider.ts +6 -10
  391. package/src/security/providers/SecurityProvider.ts +6 -11
  392. package/src/security/schemas/userAccountInfoSchema.ts +3 -3
  393. package/src/server/auth/providers/ServerAuthProvider.ts +24 -2
  394. package/src/server/cookies/{services → __tests__}/CookieParser.spec.ts +1 -1
  395. package/src/server/core/{primitives → __tests__}/$circuit.spec.ts +1 -1
  396. package/src/server/core/{providers → __tests__}/NodeHttpServerProvider.spec.ts +1 -1
  397. package/src/server/core/{providers → __tests__}/ServerBodyParserProvider.spec.ts +31 -1
  398. package/src/server/core/{providers → __tests__}/ServerCompressProvider.spec.ts +1 -1
  399. package/src/server/core/{providers → __tests__}/ServerHelmetProvider.spec.ts +4 -1
  400. package/src/server/core/{providers → __tests__}/ServerMultipartProvider.spec.ts +1 -1
  401. package/src/server/core/{services → __tests__}/ServerRequestParser.spec.ts +1 -1
  402. package/src/server/core/primitives/$action.ts +2 -2
  403. package/src/server/core/primitives/$sse.ts +2 -2
  404. package/src/server/core/providers/ServerBodyParserProvider.ts +21 -12
  405. package/src/server/core/providers/ServerCompressProvider.ts +2 -2
  406. package/src/server/core/providers/ServerHelmetProvider.ts +2 -2
  407. package/src/server/core/providers/ServerMultipartProvider.ts +2 -2
  408. package/src/server/core/providers/ServerRouterProvider.ts +1 -5
  409. package/src/server/cors/{primitives → __tests__}/$cors.spec.ts +1 -1
  410. package/src/server/cors/providers/ServerCorsProvider.ts +2 -2
  411. package/src/server/links/{services → __tests__}/BatchCollector.spec.ts +1 -1
  412. package/src/server/links/providers/LinkProvider.ts +2 -2
  413. package/src/server/links/providers/RemotePrimitiveProvider.ts +2 -2
  414. package/src/server/links/providers/ServerLinksProvider.ts +2 -2
  415. package/src/server/rate-limit/{primitives → __tests__}/$rateLimit.spec.ts +1 -1
  416. package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +2 -2
  417. package/src/server/swagger/providers/ServerSwaggerProvider.ts +2 -2
  418. package/src/sms/{providers → __tests__}/LocalSmsProvider.spec.ts +35 -29
  419. package/src/sms/providers/LocalSmsProvider.ts +13 -24
  420. package/src/system/{providers → __tests__}/MemoryFileSystemProvider.spec.ts +1 -1
  421. package/src/system/{providers → __tests__}/MemoryShellProvider.spec.ts +1 -1
  422. package/src/topic/redis/providers/RedisTopicProvider.ts +2 -2
  423. package/src/websocket/{services → __tests__}/RoomManager.spec.ts +1 -1
  424. package/src/websocket/providers/NodeWebSocketServerProvider.ts +2 -2
  425. package/tsconfig.base.json +1 -0
  426. package/src/cli/platform/adapters/DockerAdapter.spec.ts +0 -378
  427. package/src/cli/platform/adapters/DockerAdapter.ts +0 -417
  428. package/src/cli/platform/services/DockerComposeGenerator.spec.ts +0 -490
  429. package/src/cli/platform/services/DockerComposeGenerator.ts +0 -353
  430. package/src/cli/platform/services/DockerSshService.spec.ts +0 -47
  431. package/src/cli/platform/services/DockerSshService.ts +0 -61
  432. /package/src/api/audits/{primitives → __tests__}/$audit.spec.ts +0 -0
  433. /package/src/api/audits/{services → __tests__}/AuditService.spec.ts +0 -0
  434. /package/src/api/files/{controllers → __tests__}/AdminFileStatsController.spec.ts +0 -0
  435. /package/src/api/files/{controllers → __tests__}/FileController.spec.ts +0 -0
  436. /package/src/api/files/{jobs → __tests__}/FileJobs.spec.ts +0 -0
  437. /package/src/api/files/{services → __tests__}/FileService.spec.ts +0 -0
  438. /package/src/api/jobs/{primitives → __tests__}/$job-middleware.spec.ts +0 -0
  439. /package/src/api/parameters/{primitives → __tests__}/$parameter.spec.ts +0 -0
  440. /package/src/api/users/{primitives → __tests__}/$realm.spec.ts +0 -0
  441. /package/src/api/users/{controllers → __tests__}/AdminIdentityController.spec.ts +0 -0
  442. /package/src/api/users/{controllers → __tests__}/AdminSessionController.spec.ts +0 -0
  443. /package/src/api/users/{controllers → __tests__}/AdminUserController.spec.ts +0 -0
  444. /package/src/api/users/{services → __tests__}/CredentialService.spec.ts +0 -0
  445. /package/src/api/users/{providers → __tests__}/RealmProvider.spec.ts +0 -0
  446. /package/src/api/users/{services → __tests__}/RegistrationService.spec.ts +0 -0
  447. /package/src/batch/{primitives → __tests__}/$batch.spec.ts +0 -0
  448. /package/src/batch/{providers → __tests__}/BatchProvider.spec.ts +0 -0
  449. /package/src/bucket/{primitives → __tests__}/$bucket.spec.ts +0 -0
  450. /package/src/bucket/{providers → __tests__}/FileStorageProvider.spec.ts +0 -0
  451. /package/src/bucket/{providers → __tests__}/LocalFileStorageProvider.spec.ts +0 -0
  452. /package/src/bucket/{providers → __tests__}/MemoryFileStorageProvider.spec.ts +0 -0
  453. /package/src/cache/core/{primitives → __tests__}/$cache.spec.ts +0 -0
  454. /package/src/cache/redis/{providers → __tests__}/RedisCacheProvider.spec.ts +0 -0
  455. /package/src/command/{primitives → __tests__}/$command.spec.ts +0 -0
  456. /package/src/command/{helpers → __tests__}/Asker.spec.ts +0 -0
  457. /package/src/command/{helpers → __tests__}/Runner.spec.ts +0 -0
  458. /package/src/core/{primitives → __tests__}/$context.spec.ts +0 -0
  459. /package/src/core/{primitives → __tests__}/$env.spec.ts +0 -0
  460. /package/src/core/{primitives → __tests__}/$hook.spec.ts +0 -0
  461. /package/src/core/{primitives → __tests__}/$inject.spec.ts +0 -0
  462. /package/src/core/{primitives → __tests__}/$module.spec.ts +0 -0
  463. /package/src/core/{providers → __tests__}/CodecManager.spec.ts +0 -0
  464. /package/src/core/{providers → __tests__}/EventManager.spec.ts +0 -0
  465. /package/src/core/{providers → __tests__}/StateManager.spec.ts +0 -0
  466. /package/src/core/{providers → __tests__}/TypeProvider.spec.ts +0 -0
  467. /package/src/datetime/{primitives → __tests__}/$interval.spec.ts +0 -0
  468. /package/src/datetime/{providers → __tests__}/DateTimeProvider.spec.ts +0 -0
  469. /package/src/email/core/{primitives → __tests__}/$email.spec.ts +0 -0
  470. /package/src/fake/{providers → __tests__}/FakeProvider.spec.ts +0 -0
  471. /package/src/lock/core/{providers → __tests__}/MemoryLockProvider.spec.ts +0 -0
  472. /package/src/lock/redis/{providers → __tests__}/RedisLockProvider.spec.ts +0 -0
  473. /package/src/logger/{primitives → __tests__}/$logger.spec.ts +0 -0
  474. /package/src/logger/{services → __tests__}/Logger.spec.ts +0 -0
  475. /package/src/mcp/{primitives → __tests__}/$prompt.spec.ts +0 -0
  476. /package/src/mcp/{primitives → __tests__}/$resource.spec.ts +0 -0
  477. /package/src/mcp/{primitives → __tests__}/$tool.spec.ts +0 -0
  478. /package/src/mcp/{providers → __tests__}/McpServerProvider.spec.ts +0 -0
  479. /package/src/mcp/{helpers → __tests__}/jsonrpc.spec.ts +0 -0
  480. /package/src/orm/core/{helpers → __tests__}/parseQueryString.spec.ts +0 -0
  481. /package/src/queue/core/{primitives → __tests__}/$consumer.spec.ts +0 -0
  482. /package/src/queue/core/{providers → __tests__}/MemoryQueueProvider.spec.ts +0 -0
  483. /package/src/queue/core/{providers → __tests__}/WorkerProvider.spec.ts +0 -0
  484. /package/src/queue/redis/{providers → __tests__}/RedisQueueProvider.spec.ts +0 -0
  485. /package/src/react/form/{hooks → __tests__}/useForm.browser.spec.tsx +0 -0
  486. /package/src/react/head/{hooks → __tests__}/useHead.spec.tsx +0 -0
  487. /package/src/react/i18n/{components → __tests__}/Localize.spec.tsx +0 -0
  488. /package/src/react/router/{primitives → __tests__}/$page.browser.spec.tsx +0 -0
  489. /package/src/react/router/{primitives → __tests__}/$page.middleware.spec.tsx +0 -0
  490. /package/src/react/router/{primitives → __tests__}/$page.spec.tsx +0 -0
  491. /package/src/react/router/{providers → __tests__}/ReactPreloadProvider.spec.ts +0 -0
  492. /package/src/react/router/{providers → __tests__}/ReactServerProvider.spec.tsx +0 -0
  493. /package/src/react/router/{providers → __tests__}/ReactServerTemplateProvider.spec.ts +0 -0
  494. /package/src/retry/{primitives → __tests__}/$retry.spec.ts +0 -0
  495. /package/src/retry/{providers → __tests__}/RetryProvider.spec.ts +0 -0
  496. /package/src/router/{providers → __tests__}/RouterProvider.spec.ts +0 -0
  497. /package/src/security/{primitives → __tests__}/$issuer.spec.ts +0 -0
  498. /package/src/security/{primitives → __tests__}/$permission.spec.ts +0 -0
  499. /package/src/security/{primitives → __tests__}/$role.spec.ts +0 -0
  500. /package/src/security/{primitives → __tests__}/$serviceAccount.spec.ts +0 -0
  501. /package/src/security/{providers → __tests__}/SecurityProvider.spec.ts +0 -0
  502. /package/src/server/cookies/{providers → __tests__}/ServerCookiesProvider.spec.ts +0 -0
  503. /package/src/server/core/{primitives → __tests__}/$action.spec.ts +0 -0
  504. /package/src/server/core/{primitives → __tests__}/$middleware.spec.ts +0 -0
  505. /package/src/server/core/{primitives → __tests__}/$route.spec.ts +0 -0
  506. /package/src/server/core/{primitives → __tests__}/$sse.spec.ts +0 -0
  507. /package/src/server/core/{providers → __tests__}/BunHttpServerProvider.bun.spec.ts +0 -0
  508. /package/src/server/core/{services → __tests__}/HttpClient.spec.ts +0 -0
  509. /package/src/server/core/{providers → __tests__}/ServerLoggerProvider.spec.ts +0 -0
  510. /package/src/server/core/{services → __tests__}/UserAgentParser.spec.ts +0 -0
  511. /package/src/server/cors/{providers → __tests__}/ServerCorsProvider.spec.ts +0 -0
  512. /package/src/server/etag/{providers → __tests__}/ServerEtagProvider.spec.ts +0 -0
  513. /package/src/server/health/{providers → __tests__}/ServerHealthProvider.spec.ts +0 -0
  514. /package/src/server/links/{primitives → __tests__}/$remote.spec.ts +0 -0
  515. /package/src/server/links/{services → __tests__}/BatchEndpoint.spec.ts +0 -0
  516. /package/src/server/links/{providers → __tests__}/LinkProvider.spec.ts +0 -0
  517. /package/src/server/links/{providers → __tests__}/ServerLinksProvider.spec.ts +0 -0
  518. /package/src/server/metrics/{providers → __tests__}/ServerMetricsProvider.spec.ts +0 -0
  519. /package/src/server/proxy/{primitives → __tests__}/$proxy.spec.ts +0 -0
  520. /package/src/server/rate-limit/{providers → __tests__}/ServerRateLimitProvider.spec.ts +0 -0
  521. /package/src/server/static/{primitives → __tests__}/$serve.spec.ts +0 -0
  522. /package/src/server/swagger/{primitives → __tests__}/$swagger.spec.ts +0 -0
  523. /package/src/sms/{primitives → __tests__}/$sms.spec.ts +0 -0
  524. /package/src/sms/{providers → __tests__}/MemorySmsProvider.spec.ts +0 -0
  525. /package/src/system/{services → __tests__}/FileDetector.spec.ts +0 -0
  526. /package/src/system/{providers → __tests__}/NodeFileSystemProvider.spec.ts +0 -0
  527. /package/src/topic/core/{primitives → __tests__}/$subscriber.spec.ts +0 -0
  528. /package/src/topic/core/{providers → __tests__}/MemoryTopicProvider.spec.ts +0 -0
  529. /package/src/topic/redis/{providers → __tests__}/RedisTopicProvider.spec.ts +0 -0
  530. /package/src/websocket/{primitives → __tests__}/$channel.spec.ts +0 -0
@@ -1,11 +1,11 @@
1
1
  import { createRequire } from "node:module";
2
- import { $atom, $hook, $inject, $module, $use, Alepha, AlephaError, __alephaRef, t } from "alepha";
2
+ import { $atom, $hook, $inject, $module, $state, Alepha, AlephaError, __alephaRef, t } from "alepha";
3
3
  import { $command, CliProvider, EnvUtils, Runner } from "alepha/command";
4
4
  import { $logger, ConsoleColorProvider } from "alepha/logger";
5
5
  import { FileSystemProvider, ShellProvider } from "alepha/system";
6
6
  import { createHash } from "node:crypto";
7
7
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
8
- import { readFile } from "node:fs/promises";
8
+ import { readFile, readdir, stat } from "node:fs/promises";
9
9
  import { basename, dirname, isAbsolute, join, relative, resolve } from "node:path";
10
10
  import { fileURLToPath, pathToFileURL } from "node:url";
11
11
  import { analyzer } from "vite-bundle-analyzer";
@@ -13,7 +13,7 @@ import { KV_DEFAULT_BINDING } from "alepha/cache";
13
13
  import { QUEUE_DEFAULT_BINDING } from "alepha/queue";
14
14
  import { promisify } from "node:util";
15
15
  import { brotliCompress, gzip } from "node:zlib";
16
- import { exec } from "node:child_process";
16
+ import { exec, spawn } from "node:child_process";
17
17
  import { ServerSwaggerProvider } from "alepha/server/swagger";
18
18
  //#region ../../src/cli/core/atoms/appEntryOptions.ts
19
19
  const appEntryOptions = $atom({
@@ -89,10 +89,7 @@ const buildOptions = $atom({
89
89
  const devOptions = $atom({
90
90
  name: "alepha.cli.dev.options",
91
91
  description: "Dev configuration options",
92
- schema: t.object({
93
- noDevtools: t.optional(t.boolean({ default: false })),
94
- noViteReactPlugin: t.optional(t.boolean({ default: false }))
95
- }),
92
+ schema: t.object({ noViteReactPlugin: t.optional(t.boolean({ default: false })) }),
96
93
  default: {}
97
94
  });
98
95
  //#endregion
@@ -104,7 +101,7 @@ const devOptions = $atom({
104
101
  */
105
102
  var AppEntryProvider = class {
106
103
  fs = $inject(FileSystemProvider);
107
- options = $use(appEntryOptions);
104
+ options = $state(appEntryOptions);
108
105
  serverEntries = [
109
106
  "main.server.ts",
110
107
  "main.server.tsx",
@@ -589,9 +586,9 @@ var AlephaCliUtils = class {
589
586
  //#endregion
590
587
  //#region ../../package.json
591
588
  var devDependencies = {
592
- "@biomejs/biome": "^2.4.8",
593
- "@electric-sql/pglite": "^0.4.0",
594
- "@faker-js/faker": "^10.3.0",
589
+ "@biomejs/biome": "^2.4.9",
590
+ "@electric-sql/pglite": "^0.4.2",
591
+ "@faker-js/faker": "^10.4.0",
595
592
  "@testing-library/dom": "^10.4.1",
596
593
  "@testing-library/react": "^16.3.2",
597
594
  "@types/bun": "^1.3.11",
@@ -603,15 +600,15 @@ var devDependencies = {
603
600
  "cron-schedule": "^6.0.0",
604
601
  "drizzle-kit": "^0.31.10",
605
602
  "jose": "^6.2.2",
606
- "jsdom": "^29.0.0",
607
- "nodemailer": "^8.0.3",
603
+ "jsdom": "^29.0.1",
604
+ "nodemailer": "^8.0.4",
608
605
  "openid-client": "^6.8.2",
609
606
  "prom-client": "^15.1.3",
610
607
  "react": "^19.2.4",
611
608
  "react-dom": "^19.2.4",
612
609
  "swagger-ui-dist": "^5.32.1",
613
- "tsdown": "^0.21.4",
614
- "vitest": "^4.1.0"
610
+ "tsdown": "^0.21.7",
611
+ "vitest": "^4.1.2"
615
612
  };
616
613
  const version = JSON.parse(readFileSync(new URL("../../../package.json", import.meta.url), "utf-8")).version;
617
614
  //#endregion
@@ -864,7 +861,8 @@ var PackageManagerUtils = class {
864
861
  generatePackageJsonContent(modes) {
865
862
  const alephaDeps = devDependencies;
866
863
  const dependencies = { alepha: `^${version}` };
867
- const devDependencies$1 = { "drizzle-kit": alephaDeps["drizzle-kit"] };
864
+ const devDependencies$1 = {};
865
+ if (!(modes.react && !modes.ui)) devDependencies$1["drizzle-kit"] = alephaDeps["drizzle-kit"];
868
866
  if (!modes.isPackage) {
869
867
  devDependencies$1["@biomejs/biome"] = alephaDeps["@biomejs/biome"];
870
868
  if (modes.test) devDependencies$1.vitest = alephaDeps.vitest;
@@ -956,12 +954,6 @@ export default defineConfig({
956
954
  // runtime: "node",
957
955
  // },
958
956
  //
959
- // platform: {
960
- // environments: {
961
- // production: { adapter: "cloudflare" },
962
- // },
963
- // },
964
- //
965
957
  // env: {
966
958
  // VITE_BUILD_DATE: new Date().toISOString(),
967
959
  // VITE_VERSION: pkg.version,
@@ -1275,13 +1267,45 @@ export default defineConfig({
1275
1267
  `;
1276
1268
  };
1277
1269
  //#endregion
1270
+ //#region ../../src/cli/core/templates/webAdminDashboardTsx.ts
1271
+ const webAdminDashboardTsx = () => {
1272
+ return `import { Flex, Text } from "@alepha/ui";
1273
+
1274
+ const AdminDashboard = () => {
1275
+ return (
1276
+ <Flex direction="column" align="center" justify="center" mih="60vh" gap="md">
1277
+ <Text size="xl" fw={600}>
1278
+ Admin Panel
1279
+ </Text>
1280
+ <Text c="dimmed">Welcome to the admin panel.</Text>
1281
+ </Flex>
1282
+ );
1283
+ };
1284
+
1285
+ export default AdminDashboard;
1286
+ `;
1287
+ };
1288
+ //#endregion
1278
1289
  //#region ../../src/cli/core/templates/webAppRouterTs.ts
1279
1290
  const webAppRouterTs = (options) => {
1280
1291
  const imports = [];
1281
1292
  const classMembers = [];
1282
1293
  if (options.ui) imports.push("import { $ui } from \"@alepha/ui\";");
1283
1294
  if (options.auth) imports.push("import { $uiAuth } from \"@alepha/ui/auth\";");
1284
- if (options.admin) imports.push("import { $uiAdmin } from \"@alepha/ui/admin\";");
1295
+ if (options.admin) {
1296
+ imports.push("import { $uiAdmin } from \"@alepha/ui/admin\";");
1297
+ imports.push("import { AdminUserRouter } from \"@alepha/ui/admin-users\";");
1298
+ imports.push("import { AdminSessionRouter } from \"@alepha/ui/admin-sessions\";");
1299
+ imports.push("import { AdminAuditRouter } from \"@alepha/ui/admin-audits\";");
1300
+ imports.push("import { AdminFileRouter } from \"@alepha/ui/admin-files\";");
1301
+ imports.push("import { AdminParameterRouter } from \"@alepha/ui/admin-parameters\";");
1302
+ imports.push("import { AdminJobRouter } from \"@alepha/ui/admin-jobs\";");
1303
+ imports.push("import { AdminApiKeyRouter } from \"@alepha/ui/admin-keys\";");
1304
+ imports.push("import { AdminNotificationRouter } from \"@alepha/ui/admin-notifications\";");
1305
+ imports.push("import { AdminBillingRouter } from \"@alepha/ui/admin-billing\";");
1306
+ imports.push("import { $inject } from \"alepha\";");
1307
+ imports.push("import { IconLayoutDashboard, IconLockPassword, IconCreditCard } from \"@tabler/icons-react\";");
1308
+ }
1285
1309
  imports.push("import { $page } from \"alepha/react/router\";");
1286
1310
  if (options.api) {
1287
1311
  imports.push("import { $client } from \"alepha/server/links\";");
@@ -1291,7 +1315,69 @@ const webAppRouterTs = (options) => {
1291
1315
  if (options.ui) {
1292
1316
  classMembers.push(" ui = $ui();");
1293
1317
  if (options.auth) classMembers.push(" uiAuth = $uiAuth();");
1294
- if (options.admin) classMembers.push(" uiAdmin = $uiAdmin();");
1318
+ if (options.admin) classMembers.push(` // ── Admin Domain Routers ──────────────────────────
1319
+ protected users = $inject(AdminUserRouter);
1320
+ protected sessions = $inject(AdminSessionRouter);
1321
+ protected audits = $inject(AdminAuditRouter);
1322
+ protected files = $inject(AdminFileRouter);
1323
+ protected parameters = $inject(AdminParameterRouter);
1324
+ protected jobs = $inject(AdminJobRouter);
1325
+ protected apiKeys = $inject(AdminApiKeyRouter);
1326
+ protected notifications = $inject(AdminNotificationRouter);
1327
+ protected billing = $inject(AdminBillingRouter);
1328
+
1329
+ // ── Admin Panel ─────────────────────────────────
1330
+ admin = $uiAdmin({
1331
+ pages: [
1332
+ this.users.adminUsers,
1333
+ this.sessions.adminSessions,
1334
+ this.audits.adminAudits,
1335
+ this.files.adminFiles,
1336
+ this.parameters.adminParameters,
1337
+ this.jobs.adminJobs,
1338
+ this.apiKeys.adminApiKeys,
1339
+ this.notifications.adminNotifications,
1340
+ this.billing.adminBilling,
1341
+ ],
1342
+ sidebarItems: [
1343
+ {
1344
+ label: "Security",
1345
+ children: [
1346
+ { label: "Identity", icon: IconLockPassword, children: [
1347
+ this.users.adminUsers,
1348
+ this.sessions.adminSessions,
1349
+ this.apiKeys.adminApiKeys,
1350
+ ]},
1351
+ this.audits.adminAudits,
1352
+ ],
1353
+ },
1354
+ {
1355
+ label: "System",
1356
+ children: [
1357
+ this.files.adminFiles,
1358
+ this.jobs.adminJobs,
1359
+ this.notifications.adminNotifications,
1360
+ this.parameters.adminParameters,
1361
+ ],
1362
+ },
1363
+ {
1364
+ label: "Commerce",
1365
+ icon: IconCreditCard,
1366
+ children: [
1367
+ this.billing.adminBilling,
1368
+ ],
1369
+ },
1370
+ ],
1371
+ });
1372
+
1373
+ // ── Admin Dashboard ─────────────────────────────
1374
+ adminDashboard = $page({
1375
+ parent: this.admin.adminLayout,
1376
+ path: "/",
1377
+ label: "Dashboard",
1378
+ icon: IconLayoutDashboard,
1379
+ lazy: () => import("./components/AdminDashboard.tsx"),
1380
+ });`);
1295
1381
  classMembers.push(` layout = $page({
1296
1382
  parent: this.ui.root,
1297
1383
  children: () => [this.home],
@@ -1497,6 +1583,7 @@ var ProjectScaffolder = class {
1497
1583
  admin: opts.admin
1498
1584
  }), opts.force);
1499
1585
  await this.ensureFile(root, "src/web/components/Home.tsx", webHomeComponentTsx({ api: opts.api }), opts.force);
1586
+ if (opts.admin) await this.ensureFile(root, "src/web/components/AdminDashboard.tsx", webAdminDashboardTsx(), opts.force);
1500
1587
  await this.ensureFile(root, "src/main.browser.ts", mainBrowserTs(), opts.force);
1501
1588
  }
1502
1589
  /**
@@ -1520,21 +1607,20 @@ var ProjectScaffolder = class {
1520
1607
  root = this.fs.join(root, args);
1521
1608
  await this.fs.mkdir(root, { force: true });
1522
1609
  }
1523
- if (flags.admin) flags.auth = true;
1524
- if (flags.auth) {
1610
+ if (flags.saas) {
1525
1611
  flags.api = true;
1526
1612
  flags.ui = true;
1527
1613
  }
1528
1614
  if (flags.ui) flags.react = true;
1529
1615
  if (flags.tailwind) flags.react = true;
1530
- if ((flags.admin || flags.auth || flags.api || flags.ui || flags.react || flags.tailwind) && !flags.force) {
1616
+ if ((flags.saas || flags.api || flags.ui || flags.react || flags.tailwind) && !flags.force) {
1531
1617
  if ((await this.fs.ls(root)).filter((f) => f !== "package.json").length > 0) throw new AlephaError(`Target directory is not empty (${root}). Use --force to overwrite existing files.`);
1532
1618
  }
1533
1619
  const workspace = await this.pm.getWorkspaceContext(root);
1534
1620
  let agentType = false;
1535
1621
  if (!workspace.isPackage) agentType = await this.utils.isInstalledAsync("claude") ? "claude" : "agents";
1536
1622
  const isExpo = await this.pm.hasExpo(root);
1537
- const adminEmail = flags.auth ? await this.utils.getGitEmail() : void 0;
1623
+ const adminEmail = flags.saas ? await this.utils.getGitEmail() : void 0;
1538
1624
  const force = !!flags.force;
1539
1625
  await run({
1540
1626
  name: "ensuring configuration files",
@@ -1557,15 +1643,15 @@ var ProjectScaffolder = class {
1557
1643
  force
1558
1644
  });
1559
1645
  if (flags.api) await this.ensureApiProject(root, {
1560
- auth: !!flags.auth,
1646
+ auth: !!flags.saas,
1561
1647
  adminEmail,
1562
1648
  force
1563
1649
  });
1564
1650
  if (flags.react && !isExpo) await this.ensureWebProject(root, {
1565
1651
  api: !!flags.api,
1566
1652
  ui: !!flags.ui,
1567
- auth: !!flags.auth,
1568
- admin: !!flags.admin,
1653
+ auth: !!flags.saas,
1654
+ admin: !!flags.saas,
1569
1655
  tailwind: !!flags.tailwind,
1570
1656
  force
1571
1657
  });
@@ -1722,6 +1808,12 @@ var BuildClientTask = class extends BuildTask {
1722
1808
  mode: "production",
1723
1809
  logLevel: opts.silent ? "silent" : void 0,
1724
1810
  define: { "process.env.NODE_ENV": "\"production\"" },
1811
+ resolve: { dedupe: [
1812
+ "react",
1813
+ "react-dom",
1814
+ "react/jsx-runtime",
1815
+ "react/jsx-dev-runtime"
1816
+ ] },
1725
1817
  publicDir: "public",
1726
1818
  build: {
1727
1819
  outDir: opts.dist,
@@ -2193,6 +2285,7 @@ var BuildServerTask = class extends BuildTask {
2193
2285
  name: "build server",
2194
2286
  handler: async () => {
2195
2287
  await this.buildServer({
2288
+ root: ctx.root,
2196
2289
  entry: ctx.entry.server,
2197
2290
  distDir,
2198
2291
  clientDir: clientBuilt ? publicDir : void 0,
@@ -2225,6 +2318,12 @@ var BuildServerTask = class extends BuildTask {
2225
2318
  mode: "production",
2226
2319
  logLevel: opts.silent ? "silent" : void 0,
2227
2320
  define: { "process.env.NODE_ENV": "\"production\"" },
2321
+ resolve: { dedupe: [
2322
+ "react",
2323
+ "react-dom",
2324
+ "react/jsx-runtime",
2325
+ "react/jsx-dev-runtime"
2326
+ ] },
2228
2327
  publicDir: false,
2229
2328
  ssr: {
2230
2329
  noExternal: true,
@@ -2267,7 +2366,7 @@ var BuildServerTask = class extends BuildTask {
2267
2366
  const externals = [];
2268
2367
  if (Array.isArray(resolvedConfig?.ssr?.external)) externals.push(...resolvedConfig.ssr.external);
2269
2368
  await this.generateExternals(opts.distDir, externals);
2270
- const entryFile = this.extractEntryFromBundle(opts.entry, result);
2369
+ const entryFile = this.extractEntryFromBundle(opts.root, opts.entry, result);
2271
2370
  let manifest = "";
2272
2371
  let manifestData;
2273
2372
  if (opts.clientDir) {
@@ -2340,8 +2439,8 @@ var BuildServerTask = class extends BuildTask {
2340
2439
  };
2341
2440
  return stripped;
2342
2441
  }
2343
- extractEntryFromBundle(entry, result) {
2344
- const entryFilePath = isAbsolute(entry) ? entry : join(process.cwd(), entry);
2442
+ extractEntryFromBundle(root, entry, result) {
2443
+ const entryFilePath = isAbsolute(entry) ? entry : join(root, entry);
2345
2444
  const normalizedEntryPath = entryFilePath.replace(/\\/g, "/");
2346
2445
  const entryFile = (Array.isArray(result) ? result[0] : result).output.find((it) => "facadeModuleId" in it && it.facadeModuleId === normalizedEntryPath)?.fileName;
2347
2446
  if (!entryFile) throw new AlephaError(`Could not find the entry file "${entryFilePath}" in the build output. Please check your entry file and try again.`);
@@ -2608,7 +2707,7 @@ var BuildCommand = class {
2608
2707
  scaffolder = $inject(ProjectScaffolder);
2609
2708
  boot = $inject(AppEntryProvider);
2610
2709
  viteBuildProvider = $inject(ViteBuildProvider);
2611
- options = $use(buildOptions);
2710
+ options = $state(buildOptions);
2612
2711
  /**
2613
2712
  * Build pipeline: tasks run sequentially in this order.
2614
2713
  * Each task self-guards (checks target, hasClient, etc.).
@@ -3114,7 +3213,30 @@ var ViteDevServerProvider = class {
3114
3213
  isReloading = false;
3115
3214
  needsBrowserReload = false;
3116
3215
  currentReloadPromise = null;
3117
- devtoolsAssetsPath;
3216
+ extraVitePlugins = [];
3217
+ alephaLoadedHooks = [];
3218
+ /**
3219
+ * Register an additional Vite plugin.
3220
+ * Must be called before init().
3221
+ */
3222
+ addVitePlugin(plugin) {
3223
+ this.extraVitePlugins.push(plugin);
3224
+ }
3225
+ /**
3226
+ * Register a hook called after Alepha is loaded/reloaded.
3227
+ */
3228
+ onAlephaLoaded(hook) {
3229
+ this.alephaLoadedHooks.push(hook);
3230
+ }
3231
+ /**
3232
+ * Trigger a full Alepha reload programmatically.
3233
+ */
3234
+ reload() {
3235
+ this.hasError = true;
3236
+ this.needsBrowserReload = true;
3237
+ this.changedFiles.add("__manual_reload__");
3238
+ this.scheduleReload();
3239
+ }
3118
3240
  /**
3119
3241
  * Initialize the dev server and load Alepha.
3120
3242
  */
@@ -3138,10 +3260,8 @@ var ViteDevServerProvider = class {
3138
3260
  try {
3139
3261
  await this.alepha?.start();
3140
3262
  await this.listen();
3141
- console.log("");
3142
- this.server.printUrls();
3143
- this.server.bindCLIShortcuts({ print: true });
3144
- console.log("");
3263
+ const url = `http://localhost:${this.server.config.server.port ?? 5173}/`;
3264
+ (this.alepha?.log ?? this.log).info(`Listening on ${this.colors.set("CYAN", url)}`);
3145
3265
  } catch (err) {
3146
3266
  this.hasError = true;
3147
3267
  this.currentError = err instanceof Error ? err : new Error(String(err));
@@ -3173,6 +3293,7 @@ var ViteDevServerProvider = class {
3173
3293
  if (viteReact && !this.options.noViteReactPlugin) plugins.push(viteReact());
3174
3294
  plugins.push(this.viteUtils.createTsconfigPathsPlugin());
3175
3295
  plugins.push(this.viteUtils.createSsrPreloadPlugin());
3296
+ plugins.push(...this.extraVitePlugins);
3176
3297
  plugins.push(this.createAlephaPlugin());
3177
3298
  let port;
3178
3299
  if (process.env.SERVER_PORT) port = Number(process.env.SERVER_PORT);
@@ -3184,6 +3305,12 @@ var ViteDevServerProvider = class {
3184
3305
  root: this.options.root,
3185
3306
  plugins,
3186
3307
  appType: "custom",
3308
+ resolve: { dedupe: [
3309
+ "react",
3310
+ "react-dom",
3311
+ "react/jsx-runtime",
3312
+ "react/jsx-dev-runtime"
3313
+ ] },
3187
3314
  server: { port },
3188
3315
  optimizeDeps: { entries: [...this.options.entry.browser ? [this.options.entry.browser] : []] }
3189
3316
  });
@@ -3230,28 +3357,6 @@ var ViteDevServerProvider = class {
3230
3357
  return {
3231
3358
  name: "alepha",
3232
3359
  configureServer: (server) => {
3233
- if (!this.options.noDevtools) try {
3234
- this.devtoolsAssetsPath = join(dirname(createRequire(import.meta.url).resolve("@alepha/devtools/package.json")), "assets/ui");
3235
- process.env.VITE_ALEPHA_DEVTOOLS = "true";
3236
- } catch {
3237
- this.log.debug("@alepha/devtools not installed, skipping devtools");
3238
- }
3239
- if (this.devtoolsAssetsPath) {
3240
- const assetsPath = this.devtoolsAssetsPath;
3241
- server.middlewares.use(async (req, res, next) => {
3242
- if (!(req.url || "/").startsWith("/__devtools") || !req.headers.accept?.includes("text/html")) return next();
3243
- const indexPath = join(assetsPath, "index.html");
3244
- try {
3245
- let html = await readFile(indexPath, "utf-8");
3246
- html = html.replace("<head>", `<head><script type="module" src="/@vite/client"><\/script>`);
3247
- res.writeHead(200, { "content-type": "text/html" });
3248
- res.end(html);
3249
- } catch (err) {
3250
- this.log.error("Failed to serve devtools UI", err);
3251
- next();
3252
- }
3253
- });
3254
- }
3255
3360
  server.hot.on("connection", () => {
3256
3361
  if (this.currentError) setTimeout(() => this.sendErrorOverlay(this.currentError), 50);
3257
3362
  });
@@ -3401,12 +3506,7 @@ var ViteDevServerProvider = class {
3401
3506
  }
3402
3507
  const alepha = this.getLoadedAlepha();
3403
3508
  alepha.store.set("alepha.vite.server", this.server);
3404
- if (this.devtoolsAssetsPath) try {
3405
- const mod = await this.server.ssrLoadModule("@alepha/devtools");
3406
- alepha.with(mod.AlephaDevtools);
3407
- } catch (err) {
3408
- this.log.warn("Failed to load @alepha/devtools", err);
3409
- }
3509
+ for (const hook of this.alephaLoadedHooks) await hook(alepha, this.server);
3410
3510
  this.alepha = alepha;
3411
3511
  await this.setupAlepha();
3412
3512
  this.hasError = false;
@@ -3563,10 +3663,12 @@ var ViteDevServerProvider = class {
3563
3663
  /**
3564
3664
  * Log a formatted error with stack trace.
3565
3665
  */
3566
- logError(title, _err) {
3666
+ logError(title, err) {
3567
3667
  const c = this.colors;
3568
3668
  console.log();
3569
3669
  console.log(c.set("RED", ` ✗ ${title}`));
3670
+ this.logErrorWithCause(err);
3671
+ console.log();
3570
3672
  console.log(c.set("GREY_DARK", " Waiting for file changes to retry..."));
3571
3673
  console.log();
3572
3674
  }
@@ -3601,32 +3703,122 @@ var DevCommand = class {
3601
3703
  alepha = $inject(Alepha);
3602
3704
  viteDevServer = $inject(ViteDevServerProvider);
3603
3705
  boot = $inject(AppEntryProvider);
3604
- options = $use(devOptions);
3706
+ options = $state(devOptions);
3605
3707
  /**
3606
3708
  * Will run the project in watch mode.
3709
+ *
3710
+ * When run from a workspace root (with apps/ directory), spawns all apps in parallel.
3711
+ * When run from an app directory, starts a single Vite dev server.
3607
3712
  */
3608
3713
  dev = $command({
3609
3714
  name: "dev",
3610
3715
  mode: true,
3611
3716
  description: "Run the project in development mode",
3612
- flags: t.object({
3613
- "no-devtools": t.optional(t.boolean({ description: "Disable devtools" })),
3614
- "no-vite-react-plugin": t.optional(t.boolean({ description: "Disable Vite React plugin" }))
3615
- }),
3717
+ flags: t.object({ only: t.optional(t.string({ description: "Run only specific apps (comma-separated: --only api,companion)" })) }),
3616
3718
  handler: async ({ root, flags }) => {
3617
- await this.scaffolder.ensureConfig(root, { tsconfigJson: true });
3618
- const entry = await this.boot.getAppEntry(root);
3619
- this.log.debug("Entry file found", { entry });
3620
- const options = this.options;
3621
- await this.viteDevServer.init({
3622
- root,
3623
- entry,
3624
- noDevtools: flags["no-devtools"] ?? options.noDevtools ?? false,
3625
- noViteReactPlugin: flags["no-vite-react-plugin"] ?? options.noViteReactPlugin ?? false
3626
- });
3627
- await this.viteDevServer.start();
3719
+ const apps = await this.discoverApps(root);
3720
+ if (apps.length > 0) await this.runMultiple(root, apps, flags);
3721
+ else await this.runSingle(root);
3628
3722
  }
3629
3723
  });
3724
+ /**
3725
+ * Discover apps in the workspace root.
3726
+ *
3727
+ * Looks for directories under apps/ that contain a package.json.
3728
+ * Supports scoped directories (e.g., apps/@passeo/api).
3729
+ * Returns empty array if not in a workspace root.
3730
+ */
3731
+ async discoverApps(root) {
3732
+ const appsDir = join(root, "apps");
3733
+ if (!await this.fs.exists(appsDir)) return [];
3734
+ const entries = await readdir(appsDir);
3735
+ const apps = [];
3736
+ for (const entry of entries) {
3737
+ const appPath = join(appsDir, entry);
3738
+ const pkgPath = join(appPath, "package.json");
3739
+ if (await this.fs.exists(pkgPath)) {
3740
+ apps.push({
3741
+ name: entry,
3742
+ path: appPath
3743
+ });
3744
+ continue;
3745
+ }
3746
+ if ((await stat(appPath).catch(() => null))?.isDirectory()) {
3747
+ const scopedEntries = await readdir(appPath);
3748
+ for (const scopedEntry of scopedEntries) {
3749
+ const scopedPath = join(appPath, scopedEntry);
3750
+ const scopedPkgPath = join(scopedPath, "package.json");
3751
+ if (await this.fs.exists(scopedPkgPath)) apps.push({
3752
+ name: scopedEntry,
3753
+ path: scopedPath
3754
+ });
3755
+ }
3756
+ }
3757
+ }
3758
+ return apps;
3759
+ }
3760
+ /**
3761
+ * Run a single app (existing behavior).
3762
+ */
3763
+ async runSingle(root) {
3764
+ await this.scaffolder.ensureConfig(root, { tsconfigJson: true });
3765
+ const entry = await this.boot.getAppEntry(root);
3766
+ this.log.debug("Entry file found", { entry });
3767
+ const options = this.options;
3768
+ await this.viteDevServer.init({
3769
+ root,
3770
+ entry,
3771
+ noViteReactPlugin: options.noViteReactPlugin ?? false
3772
+ });
3773
+ await this.viteDevServer.start();
3774
+ }
3775
+ /**
3776
+ * Run multiple apps in parallel with colored prefixed output.
3777
+ */
3778
+ async runMultiple(_root, apps, flags) {
3779
+ const only = flags.only;
3780
+ if (only) {
3781
+ const filter = only.split(",").map((s) => s.trim().toLowerCase());
3782
+ apps = apps.filter((app) => filter.includes(app.name.toLowerCase()));
3783
+ }
3784
+ if (apps.length === 0) {
3785
+ this.log.warn("No apps found to run");
3786
+ return;
3787
+ }
3788
+ this.log.debug(`Starting ${apps.length} apps: ${apps.map((a) => a.name).join(", ")}`);
3789
+ const basePort = 5173;
3790
+ const processes = apps.map((app, i) => this.spawnApp(app, basePort + i));
3791
+ const cleanup = () => {
3792
+ for (const proc of processes) proc.kill("SIGTERM");
3793
+ };
3794
+ process.once("SIGINT", cleanup);
3795
+ process.once("SIGTERM", cleanup);
3796
+ await Promise.allSettled(processes.map((proc) => new Promise((resolve) => {
3797
+ proc.on("exit", () => resolve());
3798
+ })));
3799
+ }
3800
+ /**
3801
+ * Spawn a single app process with inherited stdio.
3802
+ *
3803
+ * Each child process gets APP_NAME set, so the Alepha logger
3804
+ * handles prefixing automatically.
3805
+ */
3806
+ spawnApp(app, port) {
3807
+ const proc = spawn("yarn", ["alepha", "dev"], {
3808
+ cwd: app.path,
3809
+ stdio: "inherit",
3810
+ env: {
3811
+ ...process.env,
3812
+ APP_NAME: app.name.toUpperCase(),
3813
+ SERVER_PORT: String(port),
3814
+ FORCE_COLOR: "1"
3815
+ }
3816
+ });
3817
+ proc.on("exit", (code) => {
3818
+ if (code !== 0 && code !== null) this.log.error(`${app.name} exited with code ${code}`);
3819
+ });
3820
+ return proc;
3821
+ }
3630
3822
  };
3631
3823
  //#endregion
3632
3824
  //#region ../../src/cli/core/atoms/changelogOptions.ts
@@ -3737,7 +3929,7 @@ var ChangelogCommand = class {
3737
3929
  log = $logger();
3738
3930
  git = $inject(GitProvider);
3739
3931
  parser = $inject(GitMessageParser);
3740
- config = $use(changelogOptions);
3932
+ config = $state(changelogOptions);
3741
3933
  /**
3742
3934
  * Format a single commit line.
3743
3935
  * Example: `- **cli**: add new command (\`abc1234\`)`
@@ -3967,8 +4159,7 @@ var InitCommand = class {
3967
4159
  description: "Include React dependencies and web module (src/web/)"
3968
4160
  })),
3969
4161
  ui: t.optional(t.boolean({ description: "Include @alepha/ui (components, auth portal, admin portal)" })),
3970
- auth: t.optional(t.boolean({ description: "Include authentication (AppSecurity, $uiAuth). Implies --api --ui --react" })),
3971
- admin: t.optional(t.boolean({ description: "Include admin portal ($uiAdmin). Implies --auth" })),
4162
+ saas: t.optional(t.boolean({ description: "Include authentication, admin portal, API, UI, and React. Everything you need for a SaaS app." })),
3972
4163
  tailwind: t.optional(t.boolean({ description: "Include Tailwind CSS with Vite plugin. Implies --react" })),
3973
4164
  test: t.optional(t.boolean({ description: "Include Vitest and create test directory" })),
3974
4165
  force: t.optional(t.boolean({
@@ -4109,7 +4300,6 @@ var VerifyCommand = class {
4109
4300
  description: "Verify the Alepha project",
4110
4301
  handler: async ({ root, run }) => {
4111
4302
  await run("alepha clean");
4112
- await run("alepha format");
4113
4303
  await run("alepha lint");
4114
4304
  await run("alepha typecheck");
4115
4305
  if ((await this.pm.readPackageJson(root)).devDependencies?.vitest) await run("alepha test");