alepha 0.18.2 → 0.18.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 (397) hide show
  1. package/assets/devtools-ui/200.html +2 -2
  2. package/assets/devtools-ui/200.html.br +0 -0
  3. package/assets/devtools-ui/404.html +2 -2
  4. package/assets/devtools-ui/404.html.br +0 -0
  5. package/assets/devtools-ui/{asset.BfSBZ5Dd.css → asset.hG_f8HuK.css} +1 -1
  6. package/assets/devtools-ui/asset.hG_f8HuK.css.br +0 -0
  7. package/assets/devtools-ui/chunk.B3au4Lhg.js +1 -0
  8. package/assets/devtools-ui/chunk.B3au4Lhg.js.br +0 -0
  9. package/assets/devtools-ui/chunk.BLOrlnMB.js +1 -0
  10. package/assets/devtools-ui/chunk.BLOrlnMB.js.br +0 -0
  11. package/assets/devtools-ui/chunk.BLR01ljW.js +1 -0
  12. package/assets/devtools-ui/chunk.BLR01ljW.js.br +0 -0
  13. package/assets/devtools-ui/chunk.BTXaIUlA.js +1 -0
  14. package/assets/devtools-ui/chunk.BTXaIUlA.js.br +0 -0
  15. package/assets/devtools-ui/{chunk.lJL-lgnW.js → chunk.BhJaxmm8.js} +1 -1
  16. package/assets/devtools-ui/chunk.BhJaxmm8.js.br +0 -0
  17. package/assets/devtools-ui/chunk.BtoNxFuL.js +1 -0
  18. package/assets/devtools-ui/chunk.BtoNxFuL.js.br +0 -0
  19. package/assets/devtools-ui/chunk.C8YUV2Wd.js +1 -0
  20. package/assets/devtools-ui/chunk.C8YUV2Wd.js.br +0 -0
  21. package/assets/devtools-ui/{chunk.M6wyKO_3.js → chunk.CBbIgDzE.js} +2 -2
  22. package/assets/devtools-ui/chunk.CBbIgDzE.js.br +0 -0
  23. package/assets/devtools-ui/chunk.CFqIniwA.js +1 -0
  24. package/assets/devtools-ui/chunk.CFqIniwA.js.br +0 -0
  25. package/assets/devtools-ui/chunk.CLFF7f7-.js +1 -0
  26. package/assets/devtools-ui/chunk.CLFF7f7-.js.br +0 -0
  27. package/assets/devtools-ui/chunk.CRsBbA10.js +1 -0
  28. package/assets/devtools-ui/chunk.CRsBbA10.js.br +0 -0
  29. package/assets/devtools-ui/{chunk.DbEH1oOB.js → chunk.CZPo6v95.js} +1 -1
  30. package/assets/devtools-ui/chunk.CZPo6v95.js.br +0 -0
  31. package/assets/devtools-ui/chunk.D0fWgNos.js +1 -0
  32. package/assets/devtools-ui/chunk.D0fWgNos.js.br +1 -0
  33. package/assets/devtools-ui/chunk.D7-0ziQ6.js +1 -0
  34. package/assets/devtools-ui/chunk.D7-0ziQ6.js.br +0 -0
  35. package/assets/devtools-ui/chunk.DAewe0vm.js +1 -0
  36. package/assets/devtools-ui/chunk.DAewe0vm.js.br +0 -0
  37. package/assets/devtools-ui/chunk.DJRQEYqK.js +1 -0
  38. package/assets/devtools-ui/chunk.DJRQEYqK.js.br +0 -0
  39. package/assets/devtools-ui/{chunk.CZl6J9DF.js → chunk.DMAxv14p.js} +1 -1
  40. package/assets/devtools-ui/chunk.DMAxv14p.js.br +0 -0
  41. package/assets/devtools-ui/{chunk.BT2IiBkZ.js → chunk.DMImnNjU.js} +1 -1
  42. package/assets/devtools-ui/chunk.DMImnNjU.js.br +0 -0
  43. package/assets/devtools-ui/chunk.DeeQsidk.js +9 -0
  44. package/assets/devtools-ui/chunk.DeeQsidk.js.br +0 -0
  45. package/assets/devtools-ui/chunk.DqEwn9Vj.js +7 -0
  46. package/assets/devtools-ui/chunk.DqEwn9Vj.js.br +0 -0
  47. package/assets/devtools-ui/chunk.Dt8OsQey.js +1 -0
  48. package/assets/devtools-ui/chunk.Dt8OsQey.js.br +0 -0
  49. package/assets/devtools-ui/{chunk.B9pX3zit.js → chunk.Dtp8oa_f.js} +1 -1
  50. package/assets/devtools-ui/chunk.Dtp8oa_f.js.br +0 -0
  51. package/assets/devtools-ui/chunk.Dx3JzAYM.js +1 -0
  52. package/assets/devtools-ui/chunk.Dx3JzAYM.js.br +0 -0
  53. package/assets/devtools-ui/chunk.GCOj1-5E.js +1 -0
  54. package/assets/devtools-ui/chunk.GCOj1-5E.js.br +0 -0
  55. package/assets/devtools-ui/chunk.IC1LD8BH.js +1 -0
  56. package/assets/devtools-ui/chunk.IC1LD8BH.js.br +0 -0
  57. package/assets/devtools-ui/chunk.IwuB_TqW.js +1 -0
  58. package/assets/devtools-ui/chunk.IwuB_TqW.js.br +0 -0
  59. package/assets/devtools-ui/chunk.Qqapj2zq.js +1 -0
  60. package/assets/devtools-ui/chunk.Qqapj2zq.js.br +0 -0
  61. package/assets/devtools-ui/{chunk.C79YouPp.js → chunk.TKKKndOy.js} +1 -1
  62. package/assets/devtools-ui/chunk.TKKKndOy.js.br +0 -0
  63. package/assets/devtools-ui/chunk.YHTVhFQT.js +1 -0
  64. package/assets/devtools-ui/chunk.YHTVhFQT.js.br +0 -0
  65. package/assets/devtools-ui/chunk.fnod6uEi.js +1 -0
  66. package/assets/devtools-ui/chunk.fnod6uEi.js.br +0 -0
  67. package/assets/devtools-ui/chunk.mOCRmXjo.js +1 -0
  68. package/assets/devtools-ui/chunk.mOCRmXjo.js.br +0 -0
  69. package/assets/devtools-ui/chunk.qZTNEAK0.js +1 -0
  70. package/assets/devtools-ui/chunk.qZTNEAK0.js.br +0 -0
  71. package/assets/devtools-ui/chunk.rc9m0y4-.js +1 -0
  72. package/assets/devtools-ui/chunk.rc9m0y4-.js.br +0 -0
  73. package/assets/devtools-ui/entry.Cxc5QLCU.js +80 -0
  74. package/assets/devtools-ui/entry.Cxc5QLCU.js.br +0 -0
  75. package/assets/devtools-ui/index.html +2 -2
  76. package/assets/devtools-ui/index.html.br +0 -0
  77. package/assets/swagger-ui/swagger-ui-bundle.js +1 -1
  78. package/assets/swagger-ui/swagger-ui.css +1 -1
  79. package/dist/api/audits/index.d.ts +61 -5
  80. package/dist/api/audits/index.d.ts.map +1 -1
  81. package/dist/api/files/index.d.ts +61 -5
  82. package/dist/api/files/index.d.ts.map +1 -1
  83. package/dist/api/jobs/index.d.ts +61 -5
  84. package/dist/api/jobs/index.d.ts.map +1 -1
  85. package/dist/api/jobs/index.js +4 -2
  86. package/dist/api/jobs/index.js.map +1 -1
  87. package/dist/api/keys/index.d.ts +5 -5
  88. package/dist/api/notifications/index.browser.js +44 -1
  89. package/dist/api/notifications/index.browser.js.map +1 -1
  90. package/dist/api/notifications/index.d.ts +187 -2
  91. package/dist/api/notifications/index.d.ts.map +1 -1
  92. package/dist/api/notifications/index.js +143 -8
  93. package/dist/api/notifications/index.js.map +1 -1
  94. package/dist/api/parameters/index.d.ts +61 -5
  95. package/dist/api/parameters/index.d.ts.map +1 -1
  96. package/dist/api/users/index.d.ts +330 -93
  97. package/dist/api/users/index.d.ts.map +1 -1
  98. package/dist/api/users/index.js +27 -36
  99. package/dist/api/users/index.js.map +1 -1
  100. package/dist/cli/config/index.d.ts +46 -0
  101. package/dist/cli/config/index.d.ts.map +1 -0
  102. package/dist/cli/config/index.js +20 -0
  103. package/dist/cli/config/index.js.map +1 -0
  104. package/dist/cli/core/index.d.ts +69 -66
  105. package/dist/cli/core/index.d.ts.map +1 -1
  106. package/dist/cli/core/index.js +329 -196
  107. package/dist/cli/core/index.js.map +1 -1
  108. package/dist/cli/platform/index.d.ts +302 -63
  109. package/dist/cli/platform/index.d.ts.map +1 -1
  110. package/dist/cli/platform/index.js +455 -25
  111. package/dist/cli/platform/index.js.map +1 -1
  112. package/dist/core/index.browser.js +125 -87
  113. package/dist/core/index.browser.js.map +1 -1
  114. package/dist/core/index.d.ts +62 -53
  115. package/dist/core/index.d.ts.map +1 -1
  116. package/dist/core/index.js +125 -87
  117. package/dist/core/index.js.map +1 -1
  118. package/dist/core/index.native.js +125 -87
  119. package/dist/core/index.native.js.map +1 -1
  120. package/dist/core/index.workerd.js +125 -87
  121. package/dist/core/index.workerd.js.map +1 -1
  122. package/dist/crypto/index.d.ts +18 -1
  123. package/dist/crypto/index.d.ts.map +1 -1
  124. package/dist/crypto/index.js +29 -3
  125. package/dist/crypto/index.js.map +1 -1
  126. package/dist/devtools/index.js +3 -12
  127. package/dist/devtools/index.js.map +1 -1
  128. package/dist/logger/index.d.ts +10 -1
  129. package/dist/logger/index.d.ts.map +1 -1
  130. package/dist/logger/index.js +19 -9
  131. package/dist/logger/index.js.map +1 -1
  132. package/dist/orm/core/index.browser.js +57 -1
  133. package/dist/orm/core/index.browser.js.map +1 -1
  134. package/dist/orm/core/index.bun.js +378 -19
  135. package/dist/orm/core/index.bun.js.map +1 -1
  136. package/dist/orm/core/index.d.ts +328 -9
  137. package/dist/orm/core/index.d.ts.map +1 -1
  138. package/dist/orm/core/index.js +384 -21
  139. package/dist/orm/core/index.js.map +1 -1
  140. package/dist/orm/postgres/index.bun.js +49 -17
  141. package/dist/orm/postgres/index.bun.js.map +1 -1
  142. package/dist/orm/postgres/index.d.ts +47 -21
  143. package/dist/orm/postgres/index.d.ts.map +1 -1
  144. package/dist/orm/postgres/index.js +52 -17
  145. package/dist/orm/postgres/index.js.map +1 -1
  146. package/dist/react/core/index.d.ts +1 -1
  147. package/dist/react/core/index.d.ts.map +1 -1
  148. package/dist/react/core/index.js +6 -1
  149. package/dist/react/core/index.js.map +1 -1
  150. package/dist/react/form/index.d.ts +28 -18
  151. package/dist/react/form/index.d.ts.map +1 -1
  152. package/dist/react/form/index.js +92 -56
  153. package/dist/react/form/index.js.map +1 -1
  154. package/dist/react/router/index.browser.js +448 -116
  155. package/dist/react/router/index.browser.js.map +1 -1
  156. package/dist/react/router/index.d.ts +102 -40
  157. package/dist/react/router/index.d.ts.map +1 -1
  158. package/dist/react/router/index.js +453 -92
  159. package/dist/react/router/index.js.map +1 -1
  160. package/dist/security/index.d.ts +3 -11
  161. package/dist/security/index.d.ts.map +1 -1
  162. package/dist/security/index.js +6 -11
  163. package/dist/security/index.js.map +1 -1
  164. package/dist/server/auth/index.d.ts +22 -24
  165. package/dist/server/auth/index.d.ts.map +1 -1
  166. package/dist/server/auth/index.js +102 -82
  167. package/dist/server/auth/index.js.map +1 -1
  168. package/dist/server/cookies/index.d.ts +7 -4
  169. package/dist/server/cookies/index.d.ts.map +1 -1
  170. package/dist/server/cookies/index.js +13 -12
  171. package/dist/server/cookies/index.js.map +1 -1
  172. package/dist/server/core/index.d.ts +288 -4
  173. package/dist/server/core/index.d.ts.map +1 -1
  174. package/dist/server/core/index.js +375 -2
  175. package/dist/server/core/index.js.map +1 -1
  176. package/dist/server/links/index.browser.js +10 -71
  177. package/dist/server/links/index.browser.js.map +1 -1
  178. package/dist/server/links/index.d.ts +32 -49
  179. package/dist/server/links/index.d.ts.map +1 -1
  180. package/dist/server/links/index.js +73 -100
  181. package/dist/server/links/index.js.map +1 -1
  182. package/dist/system/index.browser.js +221 -2
  183. package/dist/system/index.browser.js.map +1 -1
  184. package/dist/system/index.d.ts +63 -1
  185. package/dist/system/index.d.ts.map +1 -1
  186. package/dist/system/index.js +221 -1
  187. package/dist/system/index.js.map +1 -1
  188. package/dist/system/index.workerd.js +224 -4
  189. package/dist/system/index.workerd.js.map +1 -1
  190. package/package.json +10 -5
  191. package/src/api/jobs/providers/JobProvider.ts +6 -3
  192. package/src/api/notifications/controllers/AdminNotificationController.ts +83 -0
  193. package/src/api/notifications/index.browser.ts +3 -0
  194. package/src/api/notifications/index.ts +14 -2
  195. package/src/api/notifications/jobs/NotificationJobs.ts +11 -2
  196. package/src/api/notifications/schemas/notificationDetailResourceSchema.ts +20 -0
  197. package/src/api/notifications/schemas/notificationQuerySchema.ts +19 -0
  198. package/src/api/notifications/schemas/notificationResourceSchema.ts +18 -0
  199. package/src/api/notifications/services/NotificationSenderService.ts +15 -2
  200. package/src/api/users/atoms/realmAuthSettingsAtom.ts +28 -32
  201. package/src/api/users/buckets/UserBuckets.ts +1 -1
  202. package/src/api/users/jobs/UserJobs.ts +1 -1
  203. package/src/api/users/primitives/$realm.ts +8 -49
  204. package/src/api/users/providers/RealmProvider.ts +2 -3
  205. package/src/api/users/services/RegistrationService.spec.ts +7 -7
  206. package/src/api/users/services/RegistrationService.ts +3 -3
  207. package/src/api/users/services/SessionService.spec.ts +4 -4
  208. package/src/api/users/services/SessionService.ts +3 -3
  209. package/src/cli/{core → config}/defineConfig.ts +14 -20
  210. package/src/cli/config/index.ts +1 -0
  211. package/src/cli/core/commands/db.ts +65 -1
  212. package/src/cli/core/commands/dev.ts +1 -0
  213. package/src/cli/core/commands/init.ts +2 -192
  214. package/src/cli/core/index.ts +34 -11
  215. package/src/cli/core/providers/ViteDevServerProvider.ts +52 -13
  216. package/src/cli/core/services/PackageManagerUtils.ts +43 -21
  217. package/src/cli/core/services/ProjectScaffolder.ts +214 -2
  218. package/src/cli/core/services/ViteUtils.ts +57 -0
  219. package/src/cli/core/tasks/BuildClientTask.ts +7 -2
  220. package/src/cli/core/tasks/BuildCloudflareTask.ts +4 -12
  221. package/src/cli/core/tasks/BuildServerTask.ts +2 -0
  222. package/src/cli/core/tasks/BuildVercelTask.ts +165 -168
  223. package/src/cli/core/templates/alephaConfigTs.ts +1 -1
  224. package/src/cli/core/templates/apiAppSecurityTs.ts +5 -8
  225. package/src/cli/core/templates/tsconfigJson.ts +6 -1
  226. package/src/cli/platform/adapters/CloudflareAdapter.spec.ts +1 -1
  227. package/src/cli/platform/adapters/CloudflareAdapter.ts +30 -29
  228. package/src/cli/platform/atoms/platformOptions.ts +21 -0
  229. package/src/cli/platform/commands/SecretsCommand.spec.ts +298 -0
  230. package/src/cli/platform/commands/SecretsCommand.ts +283 -0
  231. package/src/cli/platform/commands/platform.ts +12 -0
  232. package/src/cli/platform/index.ts +14 -28
  233. package/src/cli/platform/providers/GitHubSecretStore.spec.ts +153 -0
  234. package/src/cli/platform/providers/GitHubSecretStore.ts +112 -0
  235. package/src/cli/platform/providers/MemorySecretStore.ts +114 -0
  236. package/src/cli/platform/providers/SecretStoreProvider.ts +39 -0
  237. package/src/cli/platform/schemas/cloudflare.ts +2 -0
  238. package/src/cli/platform/services/CloudflareApi.ts +5 -2
  239. package/src/cli/platform/services/DockerComposeGenerator.spec.ts +115 -0
  240. package/src/cli/platform/services/DockerComposeGenerator.ts +46 -1
  241. package/src/cli/platform/services/SecretFilterService.spec.ts +111 -0
  242. package/src/cli/platform/services/SecretFilterService.ts +54 -0
  243. package/src/core/Alepha.ts +94 -25
  244. package/src/core/__tests__/Alepha-parseEnv.spec.ts +20 -0
  245. package/src/core/primitives/$memoize.ts +38 -26
  246. package/src/core/providers/AlsProvider.ts +2 -0
  247. package/src/core/providers/EventManager.ts +4 -0
  248. package/src/core/providers/KeylessJsonSchemaCodec.spec.ts +1 -4
  249. package/src/core/providers/KeylessJsonSchemaCodec.ts +19 -125
  250. package/src/core/providers/SchemaValidator.spec.ts +36 -0
  251. package/src/core/providers/SchemaValidator.ts +9 -0
  252. package/src/crypto/index.ts +6 -1
  253. package/src/crypto/providers/SecretProvider.ts +36 -0
  254. package/src/devtools/providers/DevToolsProvider.ts +3 -12
  255. package/src/logger/index.ts +33 -6
  256. package/src/logger/providers/PrettyFormatterProvider.ts +5 -3
  257. package/src/orm/__tests__/orm-next-tests.ts +492 -0
  258. package/src/orm/__tests__/orm-next.spec.ts +140 -0
  259. package/src/orm/core/constants/PG_SYMBOLS.ts +17 -0
  260. package/src/orm/core/index.bun.ts +3 -6
  261. package/src/orm/core/index.shared-server.ts +2 -0
  262. package/src/orm/core/index.shared.ts +2 -0
  263. package/src/orm/core/index.ts +5 -7
  264. package/src/orm/core/interfaces/AggregateQuery.ts +103 -0
  265. package/src/orm/core/interfaces/PgQueryWhere.ts +7 -0
  266. package/src/orm/core/primitives/$entity.ts +8 -0
  267. package/src/orm/core/primitives/$repository.ts +6 -3
  268. package/src/orm/core/primitives/$view.ts +88 -0
  269. package/src/orm/core/providers/DbCacheProvider.ts +66 -0
  270. package/src/orm/core/providers/DrizzleKitProvider.ts +42 -0
  271. package/src/orm/core/providers/drivers/BunSqliteProvider.ts +2 -3
  272. package/src/orm/core/providers/drivers/CloudflareD1Provider.ts +12 -0
  273. package/src/orm/core/providers/drivers/DatabaseProvider.ts +39 -0
  274. package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +2 -3
  275. package/src/orm/core/schemas/databaseEnvSchema.ts +31 -0
  276. package/src/orm/core/schemas/insertSchema.ts +13 -3
  277. package/src/orm/core/schemas/updateSchema.ts +14 -3
  278. package/src/orm/core/services/ModelBuilder.ts +26 -14
  279. package/src/orm/core/services/QueryManager.ts +13 -0
  280. package/src/orm/core/services/Repository.ts +307 -5
  281. package/src/orm/core/services/SqliteModelBuilder.ts +38 -0
  282. package/src/orm/postgres/index.bun.ts +4 -7
  283. package/src/orm/postgres/index.ts +4 -7
  284. package/src/orm/postgres/providers/BunPostgresProvider.ts +12 -2
  285. package/src/orm/postgres/providers/NodePostgresProvider.ts +7 -0
  286. package/src/orm/postgres/providers/PglitePostgresProvider.ts +10 -17
  287. package/src/orm/postgres/providers/PostgresProvider.ts +7 -36
  288. package/src/orm/postgres/schemas/postgresEnvSchema.ts +32 -0
  289. package/src/orm/postgres/services/PostgresModelBuilder.ts +40 -0
  290. package/src/react/core/components/ErrorBoundary.tsx +5 -2
  291. package/src/react/form/hooks/useFieldValue.ts +34 -0
  292. package/src/react/form/hooks/useForm.browser.spec.tsx +94 -9
  293. package/src/react/form/hooks/useForm.ts +14 -2
  294. package/src/react/form/hooks/useFormState.ts +10 -10
  295. package/src/react/form/hooks/useFormValues.ts +29 -0
  296. package/src/react/form/index.ts +3 -1
  297. package/src/react/form/services/FormModel.ts +53 -122
  298. package/src/react/router/components/ErrorViewer.tsx +333 -34
  299. package/src/react/router/components/NestedView.tsx +10 -3
  300. package/src/react/router/primitives/$page.browser.spec.tsx +34 -0
  301. package/src/react/router/primitives/$page.spec.tsx +20 -0
  302. package/src/react/router/primitives/$page.ts +24 -0
  303. package/src/react/router/providers/ReactBrowserRouterProvider.ts +14 -2
  304. package/src/react/router/providers/ReactPageProvider.ts +156 -73
  305. package/src/react/router/providers/ReactServerProvider.ts +40 -2
  306. package/src/react/router/providers/ReactServerTemplateProvider.ts +13 -1
  307. package/src/security/providers/SecurityProvider.ts +5 -27
  308. package/src/server/auth/primitives/$auth.ts +52 -19
  309. package/src/server/auth/providers/ServerAuthProvider.ts +145 -139
  310. package/src/server/cookies/providers/ServerCookiesProvider.ts +12 -24
  311. package/src/server/core/index.ts +3 -1
  312. package/src/server/core/primitives/$sse.spec.ts +315 -0
  313. package/src/server/core/primitives/$sse.ts +715 -0
  314. package/src/server/links/index.browser.ts +1 -3
  315. package/src/server/links/index.ts +0 -3
  316. package/src/server/links/providers/LinkProvider.spec.ts +12 -21
  317. package/src/server/links/providers/LinkProvider.ts +20 -52
  318. package/src/server/links/providers/ServerLinksProvider.spec.ts +106 -0
  319. package/src/server/links/providers/ServerLinksProvider.ts +113 -73
  320. package/src/server/links/schemas/apiLinksResponseSchema.ts +4 -21
  321. package/src/server/links/services/BatchCollector.ts +5 -3
  322. package/src/system/index.browser.ts +1 -0
  323. package/src/system/index.ts +3 -0
  324. package/src/system/index.workerd.ts +39 -1
  325. package/src/system/providers/WorkerdFileSystemProvider.ts +365 -0
  326. package/assets/devtools-ui/asset.BfSBZ5Dd.css.br +0 -0
  327. package/assets/devtools-ui/chunk.2NYaoqWt.js +0 -1
  328. package/assets/devtools-ui/chunk.2NYaoqWt.js.br +0 -0
  329. package/assets/devtools-ui/chunk.B052Z_xQ.js +0 -1
  330. package/assets/devtools-ui/chunk.B052Z_xQ.js.br +0 -0
  331. package/assets/devtools-ui/chunk.B4kVY90C.js +0 -1
  332. package/assets/devtools-ui/chunk.B4kVY90C.js.br +0 -0
  333. package/assets/devtools-ui/chunk.B7QJXctB.js +0 -1
  334. package/assets/devtools-ui/chunk.B7QJXctB.js.br +0 -0
  335. package/assets/devtools-ui/chunk.B9pX3zit.js.br +0 -0
  336. package/assets/devtools-ui/chunk.BKF9JxIo.js +0 -1
  337. package/assets/devtools-ui/chunk.BKF9JxIo.js.br +0 -0
  338. package/assets/devtools-ui/chunk.BOHgdTP-.js +0 -1
  339. package/assets/devtools-ui/chunk.BOHgdTP-.js.br +0 -0
  340. package/assets/devtools-ui/chunk.BOVFxkYC.js +0 -1
  341. package/assets/devtools-ui/chunk.BOVFxkYC.js.br +0 -0
  342. package/assets/devtools-ui/chunk.BR842zj5.js +0 -1
  343. package/assets/devtools-ui/chunk.BR842zj5.js.br +0 -0
  344. package/assets/devtools-ui/chunk.BT2IiBkZ.js.br +0 -0
  345. package/assets/devtools-ui/chunk.C79YouPp.js.br +0 -0
  346. package/assets/devtools-ui/chunk.C8mlBrjW.js +0 -9
  347. package/assets/devtools-ui/chunk.C8mlBrjW.js.br +0 -0
  348. package/assets/devtools-ui/chunk.CK0ow3AZ.js +0 -1
  349. package/assets/devtools-ui/chunk.CK0ow3AZ.js.br +0 -0
  350. package/assets/devtools-ui/chunk.CZl6J9DF.js.br +0 -0
  351. package/assets/devtools-ui/chunk.CdNr0YzS.js +0 -1
  352. package/assets/devtools-ui/chunk.CdNr0YzS.js.br +0 -0
  353. package/assets/devtools-ui/chunk.Ce6_6iIF.js +0 -1
  354. package/assets/devtools-ui/chunk.Ce6_6iIF.js.br +0 -0
  355. package/assets/devtools-ui/chunk.CpyDMr6O.js +0 -1
  356. package/assets/devtools-ui/chunk.CpyDMr6O.js.br +0 -0
  357. package/assets/devtools-ui/chunk.CyPmvPnY.js +0 -1
  358. package/assets/devtools-ui/chunk.CyPmvPnY.js.br +0 -0
  359. package/assets/devtools-ui/chunk.DTI_geWu.js +0 -1
  360. package/assets/devtools-ui/chunk.DTI_geWu.js.br +0 -0
  361. package/assets/devtools-ui/chunk.DbEH1oOB.js.br +0 -0
  362. package/assets/devtools-ui/chunk.Ddeqj5gv.js +0 -1
  363. package/assets/devtools-ui/chunk.Ddeqj5gv.js.br +0 -0
  364. package/assets/devtools-ui/chunk.DpRnB4vJ.js +0 -1
  365. package/assets/devtools-ui/chunk.DpRnB4vJ.js.br +0 -0
  366. package/assets/devtools-ui/chunk.DxPGTlsg.js +0 -1
  367. package/assets/devtools-ui/chunk.DxPGTlsg.js.br +0 -0
  368. package/assets/devtools-ui/chunk.G7_MMBJS.js +0 -1
  369. package/assets/devtools-ui/chunk.G7_MMBJS.js.br +0 -0
  370. package/assets/devtools-ui/chunk.M6wyKO_3.js.br +0 -0
  371. package/assets/devtools-ui/chunk.OUxNGmQ6.js +0 -1
  372. package/assets/devtools-ui/chunk.OUxNGmQ6.js.br +0 -0
  373. package/assets/devtools-ui/chunk.T1kle-fF.js +0 -1
  374. package/assets/devtools-ui/chunk.T1kle-fF.js.br +0 -0
  375. package/assets/devtools-ui/chunk.WjpsbQAv.js +0 -1
  376. package/assets/devtools-ui/chunk.WjpsbQAv.js.br +0 -0
  377. package/assets/devtools-ui/chunk.c6YgVx86.js +0 -1
  378. package/assets/devtools-ui/chunk.c6YgVx86.js.br +0 -0
  379. package/assets/devtools-ui/chunk.dwU3E_MU.js +0 -1
  380. package/assets/devtools-ui/chunk.dwU3E_MU.js.br +0 -0
  381. package/assets/devtools-ui/chunk.lJL-lgnW.js.br +0 -0
  382. package/assets/devtools-ui/chunk.lPWRmvA-.js +0 -7
  383. package/assets/devtools-ui/chunk.lPWRmvA-.js.br +0 -0
  384. package/assets/devtools-ui/chunk.p3HJvugM.js +0 -1
  385. package/assets/devtools-ui/chunk.p3HJvugM.js.br +0 -0
  386. package/assets/devtools-ui/chunk.r_Xoa_CI.js +0 -1
  387. package/assets/devtools-ui/chunk.r_Xoa_CI.js.br +0 -0
  388. package/assets/devtools-ui/chunk.sRNuTYXb.js +0 -1
  389. package/assets/devtools-ui/chunk.sRNuTYXb.js.br +0 -0
  390. package/assets/devtools-ui/chunk.tUjcyX5C.js +0 -1
  391. package/assets/devtools-ui/chunk.tUjcyX5C.js.br +0 -0
  392. package/assets/devtools-ui/chunk.thjBxvCA.js +0 -1
  393. package/assets/devtools-ui/chunk.thjBxvCA.js.br +0 -0
  394. package/assets/devtools-ui/entry.GYhBVRpC.js +0 -78
  395. package/assets/devtools-ui/entry.GYhBVRpC.js.br +0 -0
  396. package/src/server/links/services/DefinitionsPool.spec.ts +0 -86
  397. package/src/server/links/services/DefinitionsPool.ts +0 -43
@@ -5,8 +5,8 @@ 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 { basename, dirname, isAbsolute, join, relative, resolve } from "node:path";
9
8
  import { readFile } from "node:fs/promises";
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";
12
12
  import { KV_DEFAULT_BINDING } from "alepha/cache";
@@ -16,6 +16,18 @@ import { brotliCompress, gzip } from "node:zlib";
16
16
  import { exec } from "node:child_process";
17
17
  import { ServerSwaggerProvider } from "alepha/server/swagger";
18
18
 
19
+ //#region ../../src/cli/core/atoms/appEntryOptions.ts
20
+ const appEntryOptions = $atom({
21
+ name: "alepha.cli.appEntry.options",
22
+ schema: t.object({
23
+ server: t.optional(t.text()),
24
+ browser: t.optional(t.text()),
25
+ style: t.optional(t.text())
26
+ }),
27
+ default: {}
28
+ });
29
+
30
+ //#endregion
19
31
  //#region ../../src/cli/core/atoms/buildOptions.ts
20
32
  /**
21
33
  * Build options atom for CLI build command.
@@ -70,13 +82,19 @@ const buildOptions = $atom({
70
82
  });
71
83
 
72
84
  //#endregion
73
- //#region ../../src/cli/core/atoms/appEntryOptions.ts
74
- const appEntryOptions = $atom({
75
- name: "alepha.cli.appEntry.options",
85
+ //#region ../../src/cli/core/atoms/devOptions.ts
86
+ /**
87
+ * Dev options atom for CLI dev command.
88
+ *
89
+ * Defines the available dev configuration options with their defaults.
90
+ * Options can be overridden via alepha.config.ts or CLI flags.
91
+ */
92
+ const devOptions = $atom({
93
+ name: "alepha.cli.dev.options",
94
+ description: "Dev configuration options",
76
95
  schema: t.object({
77
- server: t.optional(t.text()),
78
- browser: t.optional(t.text()),
79
- style: t.optional(t.text())
96
+ noDevtools: t.optional(t.boolean({ default: false })),
97
+ noViteReactPlugin: t.optional(t.boolean({ default: false }))
80
98
  }),
81
99
  default: {}
82
100
  });
@@ -265,6 +283,45 @@ var ViteUtils = class {
265
283
  };
266
284
  }
267
285
  /**
286
+ * Vite plugin that reads tsconfig.json `compilerOptions.paths` and converts
287
+ * them to Vite `resolve.alias` entries. Enables `@/*` → `src/*` style imports
288
+ * with zero config beyond tsconfig.json.
289
+ */
290
+ createTsconfigPathsPlugin() {
291
+ return {
292
+ name: "alepha-tsconfig-paths",
293
+ async config(config) {
294
+ const root = config.root || process.cwd();
295
+ const tsconfigPath = join(root, "tsconfig.json");
296
+ let content;
297
+ try {
298
+ content = await readFile(tsconfigPath, "utf-8");
299
+ } catch {
300
+ return;
301
+ }
302
+ const clean = content.replace(/\/\/.*$/gm, "").replace(/\/\*[\s\S]*?\*\//g, "");
303
+ let tsconfig;
304
+ try {
305
+ tsconfig = JSON.parse(clean);
306
+ } catch {
307
+ return;
308
+ }
309
+ const paths = tsconfig?.compilerOptions?.paths;
310
+ if (!paths || typeof paths !== "object") return;
311
+ const alias = {};
312
+ for (const [pattern, targets] of Object.entries(paths)) {
313
+ if (!Array.isArray(targets) || targets.length === 0) continue;
314
+ const target = targets[0];
315
+ const aliasKey = pattern.replace(/\*$/, "");
316
+ const resolved = resolve(root, target.replace(/\*$/, "").replace(/^\.\//, ""));
317
+ alias[aliasKey] = aliasKey.endsWith("/") ? `${resolved}/` : resolved;
318
+ }
319
+ if (Object.keys(alias).length === 0) return;
320
+ return { resolve: { alias } };
321
+ }
322
+ };
323
+ }
324
+ /**
268
325
  * Vite plugin that generates a preload manifest for SSR module preloading.
269
326
  *
270
327
  * Collects lazy import paths from $page definitions during transform,
@@ -399,6 +456,7 @@ ${style ? `<link rel="stylesheet" href="/${style}" />` : ""}
399
456
  process.env.NODE_ENV = opts.mode;
400
457
  process.env.ALEPHA_CLI_IMPORT = "true";
401
458
  process.env.LOG_LEVEL ??= "warn";
459
+ process.env.APP_SECRET ??= "123456";
402
460
  /**
403
461
  * 01/26 Vite 7
404
462
  * "runnerImport" doesn't work as expected here. (e.g. build docs fail)
@@ -408,7 +466,8 @@ ${style ? `<link rel="stylesheet" href="/${style}" />` : ""}
408
466
  this.viteDevServer = await createServer({
409
467
  server: { middlewareMode: true },
410
468
  appType: "custom",
411
- logLevel: "silent"
469
+ logLevel: "silent",
470
+ plugins: [this.createTsconfigPathsPlugin()]
412
471
  });
413
472
  await this.viteDevServer.ssrLoadModule(opts.entry.server);
414
473
  delete process.env.ALEPHA_CLI_IMPORT;
@@ -538,12 +597,12 @@ var AlephaCliUtils = class {
538
597
  //#endregion
539
598
  //#region ../../package.json
540
599
  var devDependencies = {
541
- "@biomejs/biome": "^2.4.4",
600
+ "@biomejs/biome": "^2.4.5",
542
601
  "@electric-sql/pglite": "^0.3.15",
543
602
  "@faker-js/faker": "^10.3.0",
544
603
  "@testing-library/dom": "^10.4.1",
545
604
  "@testing-library/react": "^16.3.2",
546
- "@types/node": "^25.3.0",
605
+ "@types/node": "^25.3.3",
547
606
  "@types/nodemailer": "^7.0.11",
548
607
  "@types/react": "^19.2.14",
549
608
  "@types/react-dom": "^19.2.3",
@@ -558,7 +617,7 @@ var devDependencies = {
558
617
  "prom-client": "^15.1.3",
559
618
  "react": "^19.2.4",
560
619
  "react-dom": "^19.2.4",
561
- "swagger-ui-dist": "^5.31.2",
620
+ "swagger-ui-dist": "^5.32.0",
562
621
  "tsdown": "^0.20.3",
563
622
  "vite": "^7.3.1",
564
623
  "vitest": "^4.0.18"
@@ -602,35 +661,57 @@ var PackageManagerUtils = class {
602
661
  /**
603
662
  * Detect workspace context when inside a monorepo package.
604
663
  *
605
- * Checks if we're inside a workspace package (e.g., packages/my-pkg or apps/my-app)
606
- * by looking 2 levels up for workspace indicators like lockfiles and config files.
664
+ * Checks if we're inside a workspace package by walking up to 3 levels
665
+ * for workspace indicators like lockfiles and config files.
666
+ * This covers both standard layouts (packages/my-pkg) and deeper nesting
667
+ * (packages/scope/my-pkg).
607
668
  *
608
669
  * @param root - The current package directory
609
670
  * @returns Workspace context with root path, PM, and config presence
610
671
  */
611
672
  async getWorkspaceContext(root) {
612
- const workspaceRoot = this.fs.join(root, "..", "..");
673
+ const noContext = {
674
+ isPackage: false,
675
+ workspaceRoot: null,
676
+ packageManager: null,
677
+ config: {
678
+ biomeJson: false,
679
+ editorconfig: false,
680
+ tsconfigJson: false
681
+ }
682
+ };
683
+ for (let depth = 2; depth <= 3; depth++) {
684
+ const segments = Array.from({ length: depth }, () => "..");
685
+ const candidate = this.fs.join(root, ...segments);
686
+ if (candidate === root) break;
687
+ const result = await this.checkWorkspaceRoot(candidate);
688
+ if (result) return result;
689
+ }
690
+ return noContext;
691
+ }
692
+ async checkWorkspaceRoot(candidate) {
613
693
  const [hasYarnLock, hasPnpmLock, hasNpmLock, hasBunLock] = await Promise.all([
614
- this.fs.exists(this.fs.join(workspaceRoot, "yarn.lock")),
615
- this.fs.exists(this.fs.join(workspaceRoot, "pnpm-lock.yaml")),
616
- this.fs.exists(this.fs.join(workspaceRoot, "package-lock.json")),
617
- this.fs.exists(this.fs.join(workspaceRoot, "bun.lock"))
694
+ this.fs.exists(this.fs.join(candidate, "yarn.lock")),
695
+ this.fs.exists(this.fs.join(candidate, "pnpm-lock.yaml")),
696
+ this.fs.exists(this.fs.join(candidate, "package-lock.json")),
697
+ this.fs.exists(this.fs.join(candidate, "bun.lock"))
618
698
  ]);
619
- const [hasBiome, hasEditorConfig, hasTsConfig, hasWorkspacePackageJson] = await Promise.all([
620
- this.fs.exists(this.fs.join(workspaceRoot, "biome.json")),
621
- this.fs.exists(this.fs.join(workspaceRoot, ".editorconfig")),
622
- this.fs.exists(this.fs.join(workspaceRoot, "tsconfig.json")),
623
- this.fs.exists(this.fs.join(workspaceRoot, "package.json"))
699
+ if (!(hasYarnLock || hasPnpmLock || hasNpmLock || hasBunLock)) return null;
700
+ const [hasBiome, hasEditorConfig, hasTsConfig, hasPackageJson] = await Promise.all([
701
+ this.fs.exists(this.fs.join(candidate, "biome.json")),
702
+ this.fs.exists(this.fs.join(candidate, ".editorconfig")),
703
+ this.fs.exists(this.fs.join(candidate, "tsconfig.json")),
704
+ this.fs.exists(this.fs.join(candidate, "package.json"))
624
705
  ]);
625
- const isPackage = (hasYarnLock || hasPnpmLock || hasNpmLock || hasBunLock) && hasWorkspacePackageJson;
706
+ if (!hasPackageJson) return null;
626
707
  let packageManager = null;
627
708
  if (hasYarnLock) packageManager = "yarn";
628
709
  else if (hasPnpmLock) packageManager = "pnpm";
629
710
  else if (hasBunLock) packageManager = "bun";
630
711
  else if (hasNpmLock) packageManager = "npm";
631
712
  return {
632
- isPackage,
633
- workspaceRoot: isPackage ? workspaceRoot : null,
713
+ isPackage: true,
714
+ workspaceRoot: candidate,
634
715
  packageManager,
635
716
  config: {
636
717
  biomeJson: hasBiome,
@@ -887,7 +968,7 @@ alepha build # Build
887
968
  * Template for alepha.config.ts with documented options.
888
969
  */
889
970
  const alephaConfigTs = () => {
890
- return `import { defineConfig } from "alepha/cli";
971
+ return `import { defineConfig } from "alepha/cli/config";
891
972
 
892
973
  export default defineConfig({
893
974
  //
@@ -931,12 +1012,9 @@ export class AppSecurity {
931
1012
 
932
1013
  // Registration & login options
933
1014
  registrationAllowed: true,
934
- emailEnabled: true,
935
- emailRequired: true,
936
- usernameEnabled: false,
937
- usernameRequired: false,
938
- phoneEnabled: false,
939
- phoneRequired: false,
1015
+ email: "required",
1016
+ username: "none",
1017
+ phoneNumber: "none",
940
1018
 
941
1019
  // Verification (requires notifications feature)
942
1020
  verifyEmailRequired: false,
@@ -948,8 +1026,8 @@ export class AppSecurity {
948
1026
  notifications: false,
949
1027
  audits: false,
950
1028
  apiKeys: false,
951
- jobs: false,
952
- files: false,
1029
+ sessionPurge: false,
1030
+ avatars: false,
953
1031
  parameters: false,
954
1032
  },
955
1033
  identities: {
@@ -1216,7 +1294,12 @@ run(alepha);
1216
1294
  //#region ../../src/cli/core/templates/tsconfigJson.ts
1217
1295
  const tsconfigJson = () => `
1218
1296
  {
1219
- "extends": "alepha/tsconfig.base"
1297
+ "extends": "alepha/tsconfig.base",
1298
+ "compilerOptions": {
1299
+ "paths": {
1300
+ "@/*": ["./src/*"]
1301
+ }
1302
+ }
1220
1303
  }
1221
1304
  `.trim();
1222
1305
 
@@ -1325,6 +1408,7 @@ export const WebModule = $module({
1325
1408
  */
1326
1409
  var ProjectScaffolder = class {
1327
1410
  log = $logger();
1411
+ colors = $inject(ConsoleColorProvider);
1328
1412
  fs = $inject(FileSystemProvider);
1329
1413
  pm = $inject(PackageManagerUtils);
1330
1414
  utils = $inject(AlephaCliUtils);
@@ -1473,6 +1557,105 @@ var ProjectScaffolder = class {
1473
1557
  if ((await this.fs.ls(testDir)).length === 0) await this.fs.writeFile(dummyPath, dummySpecTs());
1474
1558
  }
1475
1559
  /**
1560
+ * Full project init — scaffolds files, installs deps, sets up PM and git.
1561
+ */
1562
+ async init({ run, root, flags, args }) {
1563
+ if (args) {
1564
+ root = this.fs.join(root, args);
1565
+ await this.fs.mkdir(root, { force: true });
1566
+ }
1567
+ if (flags.admin) flags.auth = true;
1568
+ if (flags.auth) {
1569
+ flags.api = true;
1570
+ flags.ui = true;
1571
+ }
1572
+ if (flags.ui) flags.react = true;
1573
+ if (flags.tailwind) flags.react = true;
1574
+ if ((flags.admin || flags.auth || flags.api || flags.ui || flags.react || flags.tailwind) && !flags.force) {
1575
+ 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.`);
1576
+ }
1577
+ const workspace = await this.pm.getWorkspaceContext(root);
1578
+ let agentType = false;
1579
+ if (!workspace.isPackage) agentType = await this.utils.isInstalledAsync("claude") ? "claude" : "agents";
1580
+ const isExpo = await this.pm.hasExpo(root);
1581
+ const adminEmail = flags.auth ? await this.utils.getGitEmail() : void 0;
1582
+ const force = !!flags.force;
1583
+ await run({
1584
+ name: "ensuring configuration files",
1585
+ handler: async () => {
1586
+ await this.ensureConfig(root, {
1587
+ force,
1588
+ packageJson: {
1589
+ ...flags,
1590
+ isPackage: workspace.isPackage
1591
+ },
1592
+ tsconfigJson: !workspace.config.tsconfigJson,
1593
+ biomeJson: !workspace.config.biomeJson,
1594
+ editorconfig: !workspace.config.editorconfig,
1595
+ agentMd: agentType ? { type: agentType } : false
1596
+ });
1597
+ await this.ensureAlephaConfig(root, { force });
1598
+ await this.ensureMainServerTs(root, {
1599
+ api: !!flags.api,
1600
+ react: !!flags.react && !isExpo,
1601
+ force
1602
+ });
1603
+ if (flags.api) await this.ensureApiProject(root, {
1604
+ auth: !!flags.auth,
1605
+ adminEmail,
1606
+ force
1607
+ });
1608
+ if (flags.react && !isExpo) await this.ensureWebProject(root, {
1609
+ api: !!flags.api,
1610
+ ui: !!flags.ui,
1611
+ auth: !!flags.auth,
1612
+ admin: !!flags.admin,
1613
+ tailwind: !!flags.tailwind,
1614
+ force
1615
+ });
1616
+ }
1617
+ });
1618
+ const pmName = await this.pm.getPackageManager(workspace.workspaceRoot ?? root, flags.pm ?? workspace.packageManager ?? void 0);
1619
+ if (!workspace.isPackage) if (pmName === "yarn") {
1620
+ await this.pm.ensureYarn(root);
1621
+ await run("yarn set version stable", { root });
1622
+ } else if (pmName === "bun") await this.pm.ensureBun(root);
1623
+ else if (pmName === "pnpm") await this.pm.ensurePnpm(root);
1624
+ else await this.pm.ensureNpm(root);
1625
+ const installRoot = workspace.workspaceRoot ?? root;
1626
+ await run(`${pmName} install`, {
1627
+ alias: `installing dependencies with ${pmName}`,
1628
+ root: installRoot
1629
+ });
1630
+ if (flags.test) await this.ensureTestDir(root);
1631
+ await run(`${pmName} run lint`, {
1632
+ alias: "running linter",
1633
+ root: installRoot
1634
+ });
1635
+ if (!workspace.isPackage) {
1636
+ if (await this.ensureGitRepo(root, { force })) await run("git add .", {
1637
+ alias: "staging generated files",
1638
+ root
1639
+ });
1640
+ }
1641
+ if (!args) return;
1642
+ run.end();
1643
+ const projectName = args || ".";
1644
+ const pmRun = pmName === "npm" ? "npm run" : pmName;
1645
+ const c = this.colors;
1646
+ this.log.info("");
1647
+ this.log.info(` ${c.set("GREEN", "✓")} Project ready!`);
1648
+ this.log.info("");
1649
+ this.log.info(` ${c.set("GREY_DARK", "$")} cd ${c.set("CYAN", projectName)}`);
1650
+ this.log.info(` ${c.set("GREY_DARK", "$")} ${c.set("CYAN", `${pmRun} dev`)}`);
1651
+ if (adminEmail) {
1652
+ this.log.info("");
1653
+ this.log.info(` Admin email: ${c.set("GREEN", adminEmail)}`);
1654
+ this.log.info(` ${c.set("GREY_DARK", "(from git config, change in src/api/AppSecurity.ts)")}`);
1655
+ }
1656
+ this.log.info("");
1657
+ }
1658
+ /**
1476
1659
  * Write a file, optionally overriding if it exists.
1477
1660
  */
1478
1661
  async ensureFile(root, relativePath, content, force) {
@@ -1578,6 +1761,7 @@ var BuildClientTask = class extends BuildTask {
1578
1761
  const plugins = [];
1579
1762
  const viteReact = await this.viteUtils.importViteReact();
1580
1763
  if (viteReact) plugins.push(viteReact());
1764
+ plugins.push(this.viteUtils.createTsconfigPathsPlugin());
1581
1765
  plugins.push(this.viteUtils.createSsrPreloadPlugin());
1582
1766
  if (opts.stats) plugins.push(analyzer({ analyzerMode: "static" }));
1583
1767
  const logger = opts.silent ? this.viteUtils.createBufferedLogger() : void 0;
@@ -1595,7 +1779,8 @@ var BuildClientTask = class extends BuildTask {
1595
1779
  output: {
1596
1780
  entryFileNames: "entry.[hash].js",
1597
1781
  chunkFileNames: "chunk.[hash].js",
1598
- assetFileNames: "asset.[hash][extname]"
1782
+ assetFileNames: "asset.[hash][extname]",
1783
+ experimentalMinChunkSize: 5e3
1599
1784
  }
1600
1785
  }
1601
1786
  },
@@ -2082,6 +2267,7 @@ var BuildServerTask = class extends BuildTask {
2082
2267
  const plugins = [];
2083
2268
  const viteReact = await this.viteUtils.importViteReact();
2084
2269
  if (viteReact && opts.clientDir) plugins.push(viteReact());
2270
+ plugins.push(this.viteUtils.createTsconfigPathsPlugin());
2085
2271
  plugins.push(this.viteUtils.createSsrPreloadPlugin());
2086
2272
  if (opts.stats) plugins.push(analyzer({ analyzerMode: "static" }));
2087
2273
  const logger = opts.silent ? this.viteUtils.createBufferedLogger() : void 0;
@@ -2117,7 +2303,8 @@ var BuildServerTask = class extends BuildTask {
2117
2303
  entryFileNames: "[hash].js",
2118
2304
  chunkFileNames: "[hash].js",
2119
2305
  assetFileNames: "[hash][extname]",
2120
- format: "esm"
2306
+ format: "esm",
2307
+ experimentalMinChunkSize: 1e4
2121
2308
  }
2122
2309
  }
2123
2310
  },
@@ -2717,8 +2904,45 @@ var DbCommand = class {
2717
2904
  title: "path",
2718
2905
  description: "Path to the Alepha server entry file"
2719
2906
  })),
2720
- flags: drizzleCommandFlags,
2907
+ flags: t.extend(drizzleCommandFlags, { dryRun: t.optional(t.boolean({ description: "Preview SQL statements without executing them" })) }),
2721
2908
  handler: async ({ root, args, flags }) => {
2909
+ if (flags.dryRun) {
2910
+ const entry = await this.entryProvider.getAppEntry(root);
2911
+ const alepha = await this.utils.loadAlephaFromServerEntryFile({
2912
+ mode: "development",
2913
+ entry
2914
+ });
2915
+ const drizzleKitProvider = alepha.inject("DrizzleKitProvider");
2916
+ const repositoryProvider = alepha.inject("RepositoryProvider");
2917
+ const accepted = /* @__PURE__ */ new Set([]);
2918
+ for (const primitive of repositoryProvider.getRepositories()) {
2919
+ const provider = primitive.provider;
2920
+ const providerName = provider.name;
2921
+ if (accepted.has(providerName)) continue;
2922
+ accepted.add(providerName);
2923
+ if (flags.provider && flags.provider !== providerName) continue;
2924
+ this.log.info("");
2925
+ this.log.info(`Dry run for '${providerName}' (${provider.dialect}) ...`);
2926
+ await provider.connect();
2927
+ try {
2928
+ const result = await drizzleKitProvider.dryRunPush(provider);
2929
+ if (result.statements.length === 0) this.log.info("No changes detected.");
2930
+ else {
2931
+ if (result.hasDataLoss) {
2932
+ this.log.warn("WARNING: These changes would cause data loss!");
2933
+ for (const warning of result.warnings) this.log.warn(` ${warning}`);
2934
+ }
2935
+ this.log.info("");
2936
+ this.log.info(`${result.statements.length} statement(s) would be executed:`);
2937
+ this.log.info("");
2938
+ for (const stmt of result.statements) this.log.info(stmt);
2939
+ }
2940
+ } finally {
2941
+ await provider.close();
2942
+ }
2943
+ }
2944
+ return;
2945
+ }
2722
2946
  await this.runDrizzleKitCommand({
2723
2947
  root,
2724
2948
  args,
@@ -2921,24 +3145,6 @@ ${models.map((it) => `export const ${it} = models["${it}"];`).join("\n")}
2921
3145
  }
2922
3146
  };
2923
3147
 
2924
- //#endregion
2925
- //#region ../../src/cli/core/atoms/devOptions.ts
2926
- /**
2927
- * Dev options atom for CLI dev command.
2928
- *
2929
- * Defines the available dev configuration options with their defaults.
2930
- * Options can be overridden via alepha.config.ts or CLI flags.
2931
- */
2932
- const devOptions = $atom({
2933
- name: "alepha.cli.dev.options",
2934
- description: "Dev configuration options",
2935
- schema: t.object({
2936
- noDevtools: t.optional(t.boolean({ default: false })),
2937
- noViteReactPlugin: t.optional(t.boolean({ default: false }))
2938
- }),
2939
- default: {}
2940
- });
2941
-
2942
3148
  //#endregion
2943
3149
  //#region ../../src/cli/core/providers/ViteDevServerProvider.ts
2944
3150
  /**
@@ -2969,6 +3175,7 @@ var ViteDevServerProvider = class {
2969
3175
  reloadDebounceTimer = null;
2970
3176
  isReloading = false;
2971
3177
  needsBrowserReload = false;
3178
+ currentReloadPromise = null;
2972
3179
  /**
2973
3180
  * Initialize the dev server and load Alepha.
2974
3181
  */
@@ -3025,6 +3232,7 @@ var ViteDevServerProvider = class {
3025
3232
  const viteReact = await this.viteUtils.importViteReact();
3026
3233
  const plugins = [];
3027
3234
  if (viteReact && !this.options.noViteReactPlugin) plugins.push(viteReact());
3235
+ plugins.push(this.viteUtils.createTsconfigPathsPlugin());
3028
3236
  plugins.push(this.viteUtils.createSsrPreloadPlugin());
3029
3237
  plugins.push(this.createAlephaPlugin());
3030
3238
  let port;
@@ -3096,6 +3304,9 @@ var ViteDevServerProvider = class {
3096
3304
  next();
3097
3305
  }
3098
3306
  });
3307
+ server.hot.on("connection", () => {
3308
+ if (this.currentError) setTimeout(() => this.sendErrorOverlay(this.currentError), 50);
3309
+ });
3099
3310
  return () => {
3100
3311
  server.middlewares.use(async (req, res, next) => {
3101
3312
  const url = req.url || "/";
@@ -3104,6 +3315,11 @@ var ViteDevServerProvider = class {
3104
3315
  return;
3105
3316
  }
3106
3317
  if (this.hasError && !this.alepha) {
3318
+ if (req.headers.accept?.includes("text/html")) {
3319
+ res.writeHead(200, { "content-type": "text/html" });
3320
+ res.end("<!DOCTYPE html><html><head><script type=\"module\" src=\"/@vite/client\"><\/script></head><body></body></html>");
3321
+ return;
3322
+ }
3107
3323
  next();
3108
3324
  return;
3109
3325
  }
@@ -3131,7 +3347,11 @@ var ViteDevServerProvider = class {
3131
3347
  if (firstModule && !firstModule._ssrModule) return;
3132
3348
  this.changedFiles.add(ctx.file);
3133
3349
  if (/\.(tsx|jsx)$/.test(ctx.file)) {
3134
- this.scheduleReload();
3350
+ if (this.reloadDebounceTimer) {
3351
+ clearTimeout(this.reloadDebounceTimer);
3352
+ this.reloadDebounceTimer = null;
3353
+ }
3354
+ await this.performReload();
3135
3355
  return;
3136
3356
  }
3137
3357
  this.needsBrowserReload = true;
@@ -3174,13 +3394,24 @@ var ViteDevServerProvider = class {
3174
3394
  }, 100);
3175
3395
  }
3176
3396
  /**
3177
- * Perform the actual reload after debounce.
3397
+ * Perform the actual reload.
3398
+ * Returns a promise that callers can await to know when reload is done.
3399
+ * If a reload is already in progress, returns that promise.
3400
+ */
3401
+ performReload() {
3402
+ if (this.changedFiles.size === 0) return this.currentReloadPromise ?? Promise.resolve();
3403
+ if (this.isReloading) return this.currentReloadPromise ?? Promise.resolve();
3404
+ this.currentReloadPromise = this.executeReload();
3405
+ return this.currentReloadPromise;
3406
+ }
3407
+ /**
3408
+ * Execute the reload work.
3178
3409
  */
3179
- async performReload() {
3180
- if (this.isReloading || this.changedFiles.size === 0) return;
3410
+ async executeReload() {
3181
3411
  this.isReloading = true;
3182
3412
  const filesToInvalidate = new Set(this.changedFiles);
3183
3413
  const sendReload = this.needsBrowserReload;
3414
+ const wasInError = this.hasError;
3184
3415
  this.changedFiles.clear();
3185
3416
  this.needsBrowserReload = false;
3186
3417
  console.log();
@@ -3190,7 +3421,7 @@ var ViteDevServerProvider = class {
3190
3421
  await this.loadAlepha(false, filesToInvalidate);
3191
3422
  await this.alepha?.start();
3192
3423
  this.currentError = null;
3193
- if (sendReload) this.sendBrowserReload();
3424
+ if (sendReload || wasInError) this.sendBrowserReload();
3194
3425
  } catch (err) {
3195
3426
  this.hasError = true;
3196
3427
  this.currentError = err instanceof Error ? err : new Error(String(err));
@@ -3199,6 +3430,7 @@ var ViteDevServerProvider = class {
3199
3430
  this.sendErrorOverlay(this.currentError);
3200
3431
  } finally {
3201
3432
  this.isReloading = false;
3433
+ this.currentReloadPromise = null;
3202
3434
  if (this.changedFiles.size > 0) this.scheduleReload();
3203
3435
  }
3204
3436
  }
@@ -3331,6 +3563,8 @@ var ViteDevServerProvider = class {
3331
3563
  this.waitingForRetry = false;
3332
3564
  this.currentError = null;
3333
3565
  this.server.watcher.off("change", onFileChange);
3566
+ this.server.watcher.off("add", onFileChange);
3567
+ this.sendBrowserReload();
3334
3568
  resolve(alepha);
3335
3569
  } catch (err) {
3336
3570
  this.hasError = true;
@@ -3341,6 +3575,7 @@ var ViteDevServerProvider = class {
3341
3575
  }
3342
3576
  };
3343
3577
  this.server.watcher.on("change", onFileChange);
3578
+ this.server.watcher.on("add", onFileChange);
3344
3579
  });
3345
3580
  }
3346
3581
  /**
@@ -3378,12 +3613,10 @@ var ViteDevServerProvider = class {
3378
3613
  /**
3379
3614
  * Log a formatted error with stack trace.
3380
3615
  */
3381
- logError(title, err) {
3616
+ logError(title, _err) {
3382
3617
  const c = this.colors;
3383
3618
  console.log();
3384
3619
  console.log(c.set("RED", ` ✗ ${title}`));
3385
- this.logErrorWithCause(err);
3386
- console.log();
3387
3620
  console.log(c.set("GREY_DARK", " Waiting for file changes to retry..."));
3388
3621
  console.log();
3389
3622
  }
@@ -3766,12 +3999,7 @@ var GenCommand = class {
3766
3999
  //#endregion
3767
4000
  //#region ../../src/cli/core/commands/init.ts
3768
4001
  var InitCommand = class {
3769
- log = $logger();
3770
- colors = $inject(ConsoleColorProvider);
3771
- utils = $inject(AlephaCliUtils);
3772
- pm = $inject(PackageManagerUtils);
3773
4002
  scaffolder = $inject(ProjectScaffolder);
3774
- fs = $inject(FileSystemProvider);
3775
4003
  /**
3776
4004
  * Ensure the project has the necessary Alepha configuration files.
3777
4005
  * Add the correct dependencies to package.json and install them.
@@ -3807,100 +4035,12 @@ var InitCommand = class {
3807
4035
  }))
3808
4036
  }),
3809
4037
  handler: async ({ run, flags, root, args }) => {
3810
- if (args) {
3811
- root = this.fs.join(root, args);
3812
- await this.fs.mkdir(root, { force: true });
3813
- }
3814
- if (flags.admin) flags.auth = true;
3815
- if (flags.auth) {
3816
- flags.api = true;
3817
- flags.ui = true;
3818
- }
3819
- if (flags.ui) flags.react = true;
3820
- if (flags.tailwind) flags.react = true;
3821
- if ((flags.admin || flags.auth || flags.api || flags.ui || flags.react || flags.tailwind) && !flags.force) {
3822
- 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.`);
3823
- }
3824
- const workspace = await this.pm.getWorkspaceContext(root);
3825
- let agentType = false;
3826
- if (!workspace.isPackage) agentType = await this.utils.isInstalledAsync("claude") ? "claude" : "agents";
3827
- const isExpo = await this.pm.hasExpo(root);
3828
- const adminEmail = flags.auth ? await this.utils.getGitEmail() : void 0;
3829
- const force = !!flags.force;
3830
- await run({
3831
- name: "ensuring configuration files",
3832
- handler: async () => {
3833
- await this.scaffolder.ensureConfig(root, {
3834
- force,
3835
- packageJson: {
3836
- ...flags,
3837
- isPackage: workspace.isPackage
3838
- },
3839
- tsconfigJson: !workspace.config.tsconfigJson,
3840
- biomeJson: !workspace.config.biomeJson,
3841
- editorconfig: !workspace.config.editorconfig,
3842
- agentMd: agentType ? { type: agentType } : false
3843
- });
3844
- await this.scaffolder.ensureAlephaConfig(root, { force });
3845
- await this.scaffolder.ensureMainServerTs(root, {
3846
- api: !!flags.api,
3847
- react: !!flags.react && !isExpo,
3848
- force
3849
- });
3850
- if (flags.api) await this.scaffolder.ensureApiProject(root, {
3851
- auth: !!flags.auth,
3852
- adminEmail,
3853
- force
3854
- });
3855
- if (flags.react && !isExpo) await this.scaffolder.ensureWebProject(root, {
3856
- api: !!flags.api,
3857
- ui: !!flags.ui,
3858
- auth: !!flags.auth,
3859
- admin: !!flags.admin,
3860
- tailwind: !!flags.tailwind,
3861
- force
3862
- });
3863
- }
3864
- });
3865
- const pmName = await this.pm.getPackageManager(workspace.workspaceRoot ?? root, flags.pm ?? workspace.packageManager ?? void 0);
3866
- if (!workspace.isPackage) if (pmName === "yarn") {
3867
- await this.pm.ensureYarn(root);
3868
- await run("yarn set version stable", { root });
3869
- } else if (pmName === "bun") await this.pm.ensureBun(root);
3870
- else if (pmName === "pnpm") await this.pm.ensurePnpm(root);
3871
- else await this.pm.ensureNpm(root);
3872
- const installRoot = workspace.workspaceRoot ?? root;
3873
- await run(`${pmName} install`, {
3874
- alias: `installing dependencies with ${pmName}`,
3875
- root: installRoot
3876
- });
3877
- if (flags.test) await this.scaffolder.ensureTestDir(root);
3878
- await run(`${pmName} run lint`, {
3879
- alias: "running linter",
3880
- root: installRoot
4038
+ await this.scaffolder.init({
4039
+ run,
4040
+ flags,
4041
+ root,
4042
+ args
3881
4043
  });
3882
- if (!workspace.isPackage) {
3883
- if (await this.scaffolder.ensureGitRepo(root, { force })) await run("git add .", {
3884
- alias: "staging generated files",
3885
- root
3886
- });
3887
- }
3888
- if (!args) return;
3889
- run.end();
3890
- const projectName = args || ".";
3891
- const pmRun = pmName === "npm" ? "npm run" : pmName;
3892
- const c = this.colors;
3893
- this.log.info("");
3894
- this.log.info(` ${c.set("GREEN", "✓")} Project ready!`);
3895
- this.log.info("");
3896
- this.log.info(` ${c.set("GREY_DARK", "$")} cd ${c.set("CYAN", projectName)}`);
3897
- this.log.info(` ${c.set("GREY_DARK", "$")} ${c.set("CYAN", `${pmRun} dev`)}`);
3898
- if (adminEmail) {
3899
- this.log.info("");
3900
- this.log.info(` Admin email: ${c.set("GREEN", adminEmail)}`);
3901
- this.log.info(` ${c.set("GREY_DARK", "(from git config, change in src/api/AppSecurity.ts)")}`);
3902
- }
3903
- this.log.info("");
3904
4044
  }
3905
4045
  });
3906
4046
  };
@@ -4062,39 +4202,38 @@ var AlephaCliExtensionProvider = class {
4062
4202
  };
4063
4203
 
4064
4204
  //#endregion
4065
- //#region ../../src/cli/core/defineConfig.ts
4066
- const configProcessors = [];
4205
+ //#region ../../src/cli/core/index.ts
4067
4206
  /**
4068
- * Register a processor that runs during config resolution.
4069
- *
4070
- * Used by submodules (e.g. platform) to handle their own config keys
4071
- * without core needing to know about them.
4207
+ * Services, providers, and build tasks no commands.
4208
+ * Use this module when you need CLI utilities without registering commands.
4072
4209
  */
4073
- function registerConfigProcessor(processor) {
4074
- configProcessors.push(processor);
4075
- }
4076
- const defineConfig = (runConfig) => {
4077
- return (alepha) => {
4078
- const config = typeof runConfig === "function" ? runConfig(alepha) : runConfig;
4079
- if (config.services) for (const it of config.services) alepha.with(it);
4080
- if (config.env) for (const [key, value] of Object.entries(config.env)) process.env[key] = String(value);
4081
- if (config.build) alepha.set(buildOptions, config.build);
4082
- if (config.dev) alepha.set(devOptions, config.dev);
4083
- if (config.entry) alepha.set(appEntryOptions, config.entry);
4084
- for (const processor of configProcessors) processor(alepha, config);
4085
- return { ...config.commands };
4086
- };
4087
- };
4088
-
4089
- //#endregion
4090
- //#region ../../src/cli/core/index.ts
4091
- const AlephaCli = $module({
4092
- name: "alepha.cli",
4210
+ const AlephaCliServices = $module({
4211
+ name: "alepha.cli.services",
4093
4212
  services: [
4094
4213
  AlephaCliUtils,
4095
4214
  PackageManagerUtils,
4096
4215
  ViteUtils,
4097
4216
  ProjectScaffolder,
4217
+ AppEntryProvider,
4218
+ GitMessageParser,
4219
+ GitProvider,
4220
+ ViteDevServerProvider,
4221
+ ViteBuildProvider
4222
+ ]
4223
+ });
4224
+ /**
4225
+ * Full CLI module — all services and commands.
4226
+ */
4227
+ const AlephaCli = $module({
4228
+ name: "alepha.cli",
4229
+ atoms: [
4230
+ appEntryOptions,
4231
+ buildOptions,
4232
+ changelogOptions,
4233
+ devOptions
4234
+ ],
4235
+ services: [
4236
+ AlephaCliExtensionProvider,
4098
4237
  BuildCommand,
4099
4238
  CleanCommand,
4100
4239
  DbCommand,
@@ -4106,12 +4245,6 @@ const AlephaCli = $module({
4106
4245
  TypecheckCommand,
4107
4246
  VerifyCommand,
4108
4247
  GenCommand,
4109
- AlephaCliExtensionProvider,
4110
- AppEntryProvider,
4111
- GitMessageParser,
4112
- GitProvider,
4113
- ViteDevServerProvider,
4114
- ViteBuildProvider,
4115
4248
  BuildAssetsTask,
4116
4249
  BuildClientTask,
4117
4250
  BuildCloudflareTask,
@@ -4126,5 +4259,5 @@ const AlephaCli = $module({
4126
4259
  });
4127
4260
 
4128
4261
  //#endregion
4129
- export { AlephaCli, AlephaCliExtensionProvider, AlephaCliUtils, AppEntryProvider, BuildAssetsTask, BuildClientTask, BuildCloudflareTask, BuildCommand, BuildCompressTask, BuildDockerTask, BuildPrerenderTask, BuildServerTask, BuildSitemapTask, BuildStaticTask, BuildTask, BuildVercelTask, ChangelogCommand, CleanCommand, DEFAULT_IGNORE, DbCommand, DevCommand, GitMessageParser, GitProvider, InitCommand, LintCommand, OpenApiCommand, PackageManagerUtils, RootCommand, TestCommand, TypecheckCommand, VerifyCommand, ViteBuildProvider, ViteDevServerProvider, ViteUtils, appEntryOptions, buildOptions, changelogOptions, defineConfig, devOptions, registerConfigProcessor, version };
4262
+ export { AlephaCli, AlephaCliExtensionProvider, AlephaCliServices, AlephaCliUtils, AppEntryProvider, BuildAssetsTask, BuildClientTask, BuildCloudflareTask, BuildCommand, BuildCompressTask, BuildDockerTask, BuildPrerenderTask, BuildServerTask, BuildSitemapTask, BuildStaticTask, BuildTask, BuildVercelTask, ChangelogCommand, CleanCommand, DEFAULT_IGNORE, DbCommand, DevCommand, GitMessageParser, GitProvider, InitCommand, LintCommand, OpenApiCommand, PackageManagerUtils, ProjectScaffolder, RootCommand, TestCommand, TypecheckCommand, VerifyCommand, ViteBuildProvider, ViteDevServerProvider, ViteUtils, appEntryOptions, buildOptions, changelogOptions, devOptions, version };
4130
4263
  //# sourceMappingURL=index.js.map