alepha 0.14.1 → 0.14.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 (402) hide show
  1. package/README.md +3 -3
  2. package/dist/api/audits/index.browser.js +5 -5
  3. package/dist/api/audits/index.browser.js.map +1 -1
  4. package/dist/api/audits/index.d.ts +784 -784
  5. package/dist/api/audits/index.d.ts.map +1 -1
  6. package/dist/api/audits/index.js +13 -13
  7. package/dist/api/audits/index.js.map +1 -1
  8. package/dist/api/files/index.browser.js +5 -5
  9. package/dist/api/files/index.browser.js.map +1 -1
  10. package/dist/api/files/index.d.ts +57 -57
  11. package/dist/api/files/index.d.ts.map +1 -1
  12. package/dist/api/files/index.js +71 -71
  13. package/dist/api/files/index.js.map +1 -1
  14. package/dist/api/jobs/index.browser.js +5 -5
  15. package/dist/api/jobs/index.browser.js.map +1 -1
  16. package/dist/api/jobs/index.d.ts +165 -165
  17. package/dist/api/jobs/index.d.ts.map +1 -1
  18. package/dist/api/jobs/index.js +10 -10
  19. package/dist/api/jobs/index.js.map +1 -1
  20. package/dist/api/notifications/index.browser.js +10 -10
  21. package/dist/api/notifications/index.browser.js.map +1 -1
  22. package/dist/api/notifications/index.d.ts +583 -171
  23. package/dist/api/notifications/index.d.ts.map +1 -1
  24. package/dist/api/notifications/index.js +12 -12
  25. package/dist/api/notifications/index.js.map +1 -1
  26. package/dist/api/parameters/index.browser.js +163 -10
  27. package/dist/api/parameters/index.browser.js.map +1 -1
  28. package/dist/api/parameters/index.d.ts +281 -276
  29. package/dist/api/parameters/index.d.ts.map +1 -1
  30. package/dist/api/parameters/index.js +196 -91
  31. package/dist/api/parameters/index.js.map +1 -1
  32. package/dist/api/users/index.browser.js +19 -19
  33. package/dist/api/users/index.browser.js.map +1 -1
  34. package/dist/api/users/index.d.ts +778 -764
  35. package/dist/api/users/index.d.ts.map +1 -1
  36. package/dist/api/users/index.js +831 -596
  37. package/dist/api/users/index.js.map +1 -1
  38. package/dist/api/verifications/index.browser.js +6 -6
  39. package/dist/api/verifications/index.browser.js.map +1 -1
  40. package/dist/api/verifications/index.d.ts +125 -125
  41. package/dist/api/verifications/index.d.ts.map +1 -1
  42. package/dist/api/verifications/index.js +6 -6
  43. package/dist/api/verifications/index.js.map +1 -1
  44. package/dist/batch/index.js.map +1 -1
  45. package/dist/bin/index.d.ts +1 -2
  46. package/dist/bin/index.js +0 -1
  47. package/dist/bin/index.js.map +1 -1
  48. package/dist/cache/core/index.js.map +1 -1
  49. package/dist/cli/index.d.ts +249 -218
  50. package/dist/cli/index.d.ts.map +1 -1
  51. package/dist/cli/index.js +951 -821
  52. package/dist/cli/index.js.map +1 -1
  53. package/dist/command/index.d.ts +40 -0
  54. package/dist/command/index.d.ts.map +1 -1
  55. package/dist/command/index.js +97 -17
  56. package/dist/command/index.js.map +1 -1
  57. package/dist/core/index.browser.js +14 -18
  58. package/dist/core/index.browser.js.map +1 -1
  59. package/dist/core/index.d.ts +29 -0
  60. package/dist/core/index.d.ts.map +1 -1
  61. package/dist/core/index.js +21 -24
  62. package/dist/core/index.js.map +1 -1
  63. package/dist/core/index.native.js +21 -24
  64. package/dist/core/index.native.js.map +1 -1
  65. package/dist/datetime/index.js.map +1 -1
  66. package/dist/fake/index.js +195 -168
  67. package/dist/fake/index.js.map +1 -1
  68. package/dist/file/index.d.ts +8 -0
  69. package/dist/file/index.d.ts.map +1 -1
  70. package/dist/file/index.js +3 -0
  71. package/dist/file/index.js.map +1 -1
  72. package/dist/lock/redis/index.js.map +1 -1
  73. package/dist/logger/index.js.map +1 -1
  74. package/dist/mcp/index.d.ts.map +1 -1
  75. package/dist/mcp/index.js.map +1 -1
  76. package/dist/orm/index.browser.js +26 -5
  77. package/dist/orm/index.browser.js.map +1 -1
  78. package/dist/orm/index.d.ts +146 -121
  79. package/dist/orm/index.d.ts.map +1 -1
  80. package/dist/orm/index.js +49 -24
  81. package/dist/orm/index.js.map +1 -1
  82. package/dist/redis/index.js.map +1 -1
  83. package/dist/retry/index.js.map +1 -1
  84. package/dist/router/index.js.map +1 -1
  85. package/dist/scheduler/index.d.ts +6 -6
  86. package/dist/scheduler/index.js.map +1 -1
  87. package/dist/security/index.d.ts +29 -29
  88. package/dist/security/index.d.ts.map +1 -1
  89. package/dist/security/index.js +1 -1
  90. package/dist/security/index.js.map +1 -1
  91. package/dist/server/auth/index.d.ts +171 -155
  92. package/dist/server/auth/index.d.ts.map +1 -1
  93. package/dist/server/auth/index.js +0 -1
  94. package/dist/server/auth/index.js.map +1 -1
  95. package/dist/server/cache/index.js.map +1 -1
  96. package/dist/server/compress/index.d.ts.map +1 -1
  97. package/dist/server/compress/index.js +2 -0
  98. package/dist/server/compress/index.js.map +1 -1
  99. package/dist/server/cookies/index.browser.js.map +1 -1
  100. package/dist/server/cookies/index.js.map +1 -1
  101. package/dist/server/core/index.browser.js.map +1 -1
  102. package/dist/server/core/index.d.ts.map +1 -1
  103. package/dist/server/core/index.js +1 -1
  104. package/dist/server/core/index.js.map +1 -1
  105. package/dist/server/health/index.d.ts +17 -17
  106. package/dist/server/helmet/index.js.map +1 -1
  107. package/dist/server/links/index.browser.js +22 -6
  108. package/dist/server/links/index.browser.js.map +1 -1
  109. package/dist/server/links/index.d.ts +46 -44
  110. package/dist/server/links/index.d.ts.map +1 -1
  111. package/dist/server/links/index.js +24 -41
  112. package/dist/server/links/index.js.map +1 -1
  113. package/dist/server/multipart/index.js.map +1 -1
  114. package/dist/server/rate-limit/index.js.map +1 -1
  115. package/dist/server/security/index.js.map +1 -1
  116. package/dist/server/swagger/index.d.ts +2 -1
  117. package/dist/server/swagger/index.d.ts.map +1 -1
  118. package/dist/server/swagger/index.js +8 -3
  119. package/dist/server/swagger/index.js.map +1 -1
  120. package/dist/thread/index.js.map +1 -1
  121. package/dist/topic/core/index.js.map +1 -1
  122. package/dist/vite/index.d.ts.map +1 -1
  123. package/dist/vite/index.js +12 -4
  124. package/dist/vite/index.js.map +1 -1
  125. package/dist/websocket/index.browser.js.map +1 -1
  126. package/dist/websocket/index.js.map +1 -1
  127. package/package.json +7 -7
  128. package/src/api/audits/controllers/{AuditController.ts → AdminAuditController.ts} +5 -6
  129. package/src/api/audits/entities/audits.ts +5 -5
  130. package/src/api/audits/index.browser.ts +1 -1
  131. package/src/api/audits/index.ts +3 -3
  132. package/src/api/audits/primitives/$audit.spec.ts +276 -0
  133. package/src/api/audits/services/AuditService.spec.ts +495 -0
  134. package/src/api/files/__tests__/$bucket.spec.ts +91 -0
  135. package/src/api/files/controllers/AdminFileStatsController.spec.ts +166 -0
  136. package/src/api/files/controllers/{StorageStatsController.ts → AdminFileStatsController.ts} +2 -2
  137. package/src/api/files/controllers/FileController.spec.ts +558 -0
  138. package/src/api/files/controllers/FileController.ts +4 -5
  139. package/src/api/files/entities/files.ts +5 -5
  140. package/src/api/files/index.browser.ts +1 -1
  141. package/src/api/files/index.ts +4 -4
  142. package/src/api/files/jobs/FileJobs.spec.ts +52 -0
  143. package/src/api/files/services/FileService.spec.ts +109 -0
  144. package/src/api/jobs/__tests__/JobController.spec.ts +343 -0
  145. package/src/api/jobs/controllers/{JobController.ts → AdminJobController.ts} +2 -2
  146. package/src/api/jobs/entities/jobExecutions.ts +5 -5
  147. package/src/api/jobs/index.ts +3 -3
  148. package/src/api/jobs/primitives/$job.spec.ts +476 -0
  149. package/src/api/notifications/controllers/{NotificationController.ts → AdminNotificationController.ts} +4 -5
  150. package/src/api/notifications/entities/notifications.ts +5 -5
  151. package/src/api/notifications/index.browser.ts +1 -1
  152. package/src/api/notifications/index.ts +4 -4
  153. package/src/api/parameters/controllers/{ConfigController.ts → AdminConfigController.ts} +46 -107
  154. package/src/api/parameters/entities/parameters.ts +7 -17
  155. package/src/api/parameters/index.ts +3 -3
  156. package/src/api/parameters/primitives/$config.spec.ts +356 -0
  157. package/src/api/parameters/schemas/activateConfigBodySchema.ts +12 -0
  158. package/src/api/parameters/schemas/checkScheduledResponseSchema.ts +8 -0
  159. package/src/api/parameters/schemas/configCurrentResponseSchema.ts +13 -0
  160. package/src/api/parameters/schemas/configHistoryResponseSchema.ts +9 -0
  161. package/src/api/parameters/schemas/configNameParamSchema.ts +10 -0
  162. package/src/api/parameters/schemas/configNamesResponseSchema.ts +8 -0
  163. package/src/api/parameters/schemas/configTreeNodeSchema.ts +13 -0
  164. package/src/api/parameters/schemas/configVersionParamSchema.ts +9 -0
  165. package/src/api/parameters/schemas/configVersionResponseSchema.ts +9 -0
  166. package/src/api/parameters/schemas/configsByStatusResponseSchema.ts +9 -0
  167. package/src/api/parameters/schemas/createConfigVersionBodySchema.ts +24 -0
  168. package/src/api/parameters/schemas/index.ts +15 -0
  169. package/src/api/parameters/schemas/parameterResponseSchema.ts +26 -0
  170. package/src/api/parameters/schemas/parameterStatusSchema.ts +13 -0
  171. package/src/api/parameters/schemas/rollbackConfigBodySchema.ts +15 -0
  172. package/src/api/parameters/schemas/statusParamSchema.ts +9 -0
  173. package/src/api/users/__tests__/EmailVerification.spec.ts +369 -0
  174. package/src/api/users/__tests__/PasswordReset.spec.ts +550 -0
  175. package/src/api/users/controllers/AdminIdentityController.spec.ts +365 -0
  176. package/src/api/users/controllers/{IdentityController.ts → AdminIdentityController.ts} +3 -4
  177. package/src/api/users/controllers/AdminSessionController.spec.ts +274 -0
  178. package/src/api/users/controllers/{SessionController.ts → AdminSessionController.ts} +3 -4
  179. package/src/api/users/controllers/AdminUserController.spec.ts +372 -0
  180. package/src/api/users/controllers/AdminUserController.ts +116 -0
  181. package/src/api/users/controllers/UserController.ts +4 -107
  182. package/src/api/users/controllers/UserRealmController.ts +3 -0
  183. package/src/api/users/entities/identities.ts +6 -6
  184. package/src/api/users/entities/sessions.ts +6 -6
  185. package/src/api/users/entities/users.ts +9 -9
  186. package/src/api/users/index.ts +13 -6
  187. package/src/api/users/primitives/$userRealm.ts +13 -8
  188. package/src/api/users/services/CredentialService.spec.ts +509 -0
  189. package/src/api/users/services/CredentialService.ts +46 -0
  190. package/src/api/users/services/IdentityService.ts +15 -0
  191. package/src/api/users/services/RegistrationService.spec.ts +630 -0
  192. package/src/api/users/services/RegistrationService.ts +18 -0
  193. package/src/api/users/services/SessionService.spec.ts +301 -0
  194. package/src/api/users/services/SessionService.ts +110 -1
  195. package/src/api/users/services/UserService.ts +67 -2
  196. package/src/api/verifications/__tests__/CodeVerification.spec.ts +318 -0
  197. package/src/api/verifications/__tests__/LinkVerification.spec.ts +279 -0
  198. package/src/api/verifications/entities/verifications.ts +6 -6
  199. package/src/api/verifications/jobs/VerificationJobs.spec.ts +50 -0
  200. package/src/batch/__tests__/startup-buffering.spec.ts +458 -0
  201. package/src/batch/primitives/$batch.spec.ts +766 -0
  202. package/src/batch/providers/BatchProvider.spec.ts +786 -0
  203. package/src/bin/index.ts +0 -1
  204. package/src/bucket/__tests__/shared.ts +194 -0
  205. package/src/bucket/primitives/$bucket.spec.ts +104 -0
  206. package/src/bucket/providers/FileStorageProvider.spec.ts +13 -0
  207. package/src/bucket/providers/LocalFileStorageProvider.spec.ts +77 -0
  208. package/src/bucket/providers/MemoryFileStorageProvider.spec.ts +82 -0
  209. package/src/cache/core/__tests__/shared.ts +377 -0
  210. package/src/cache/core/primitives/$cache.spec.ts +111 -0
  211. package/src/cache/redis/__tests__/cache-redis.spec.ts +70 -0
  212. package/src/cli/apps/AlephaCli.ts +54 -16
  213. package/src/cli/apps/AlephaPackageBuilderCli.ts +2 -1
  214. package/src/cli/assets/appRouterTs.ts +1 -1
  215. package/src/cli/commands/{ViteCommands.ts → build.ts} +2 -105
  216. package/src/cli/commands/clean.ts +14 -0
  217. package/src/cli/commands/{DrizzleCommands.ts → db.ts} +10 -117
  218. package/src/cli/commands/{DeployCommands.ts → deploy.ts} +1 -1
  219. package/src/cli/commands/dev.ts +69 -0
  220. package/src/cli/commands/format.ts +17 -0
  221. package/src/cli/commands/gen/changelog.spec.ts +315 -0
  222. package/src/cli/commands/{ChangelogCommands.ts → gen/changelog.ts} +16 -31
  223. package/src/cli/commands/gen/openapi.ts +71 -0
  224. package/src/cli/commands/gen.ts +18 -0
  225. package/src/cli/commands/{CoreCommands.ts → init.ts} +4 -40
  226. package/src/cli/commands/lint.ts +17 -0
  227. package/src/cli/commands/root.ts +41 -0
  228. package/src/cli/commands/run.ts +24 -0
  229. package/src/cli/commands/test.ts +42 -0
  230. package/src/cli/commands/typecheck.ts +24 -0
  231. package/src/cli/commands/{VerifyCommands.ts → verify.ts} +1 -13
  232. package/src/cli/defineConfig.ts +10 -1
  233. package/src/cli/index.ts +17 -7
  234. package/src/cli/services/AlephaCliUtils.ts +71 -32
  235. package/src/cli/services/GitMessageParser.ts +1 -1
  236. package/src/command/helpers/Asker.spec.ts +127 -0
  237. package/src/command/helpers/Runner.spec.ts +126 -0
  238. package/src/command/primitives/$command.spec.ts +1588 -0
  239. package/src/command/providers/CliProvider.ts +74 -24
  240. package/src/core/Alepha.ts +52 -4
  241. package/src/core/__tests__/Alepha-emit.spec.ts +22 -0
  242. package/src/core/__tests__/Alepha-graph.spec.ts +93 -0
  243. package/src/core/__tests__/Alepha-has.spec.ts +41 -0
  244. package/src/core/__tests__/Alepha-inject.spec.ts +93 -0
  245. package/src/core/__tests__/Alepha-register.spec.ts +81 -0
  246. package/src/core/__tests__/Alepha-start.spec.ts +176 -0
  247. package/src/core/__tests__/Alepha-with.spec.ts +14 -0
  248. package/src/core/__tests__/TypeBox-usecases.spec.ts +35 -0
  249. package/src/core/__tests__/TypeBoxLocale.spec.ts +15 -0
  250. package/src/core/__tests__/descriptor.spec.ts +34 -0
  251. package/src/core/__tests__/fixtures/A.ts +5 -0
  252. package/src/core/__tests__/pagination.spec.ts +77 -0
  253. package/src/core/helpers/jsonSchemaToTypeBox.ts +2 -2
  254. package/src/core/primitives/$atom.spec.ts +43 -0
  255. package/src/core/primitives/$hook.spec.ts +130 -0
  256. package/src/core/primitives/$inject.spec.ts +175 -0
  257. package/src/core/primitives/$module.spec.ts +115 -0
  258. package/src/core/providers/CodecManager.spec.ts +740 -0
  259. package/src/core/providers/EventManager.spec.ts +762 -0
  260. package/src/core/providers/EventManager.ts +4 -0
  261. package/src/core/providers/StateManager.spec.ts +365 -0
  262. package/src/core/providers/TypeProvider.spec.ts +1607 -0
  263. package/src/core/providers/TypeProvider.ts +20 -26
  264. package/src/datetime/primitives/$interval.spec.ts +103 -0
  265. package/src/datetime/providers/DateTimeProvider.spec.ts +86 -0
  266. package/src/email/primitives/$email.spec.ts +175 -0
  267. package/src/email/providers/LocalEmailProvider.spec.ts +341 -0
  268. package/src/fake/__tests__/keyName.example.ts +40 -0
  269. package/src/fake/__tests__/keyName.spec.ts +152 -0
  270. package/src/fake/__tests__/module.example.ts +32 -0
  271. package/src/fake/providers/FakeProvider.spec.ts +438 -0
  272. package/src/file/providers/FileSystemProvider.ts +8 -0
  273. package/src/file/providers/NodeFileSystemProvider.spec.ts +418 -0
  274. package/src/file/providers/NodeFileSystemProvider.ts +5 -0
  275. package/src/file/services/FileDetector.spec.ts +591 -0
  276. package/src/lock/core/__tests__/shared.ts +190 -0
  277. package/src/lock/core/providers/MemoryLockProvider.spec.ts +25 -0
  278. package/src/lock/redis/providers/RedisLockProvider.spec.ts +25 -0
  279. package/src/logger/__tests__/SimpleFormatterProvider.spec.ts +109 -0
  280. package/src/logger/primitives/$logger.spec.ts +108 -0
  281. package/src/logger/services/Logger.spec.ts +295 -0
  282. package/src/mcp/__tests__/errors.spec.ts +175 -0
  283. package/src/mcp/__tests__/integration.spec.ts +450 -0
  284. package/src/mcp/helpers/jsonrpc.spec.ts +380 -0
  285. package/src/mcp/primitives/$prompt.spec.ts +468 -0
  286. package/src/mcp/primitives/$resource.spec.ts +390 -0
  287. package/src/mcp/primitives/$tool.spec.ts +406 -0
  288. package/src/mcp/providers/McpServerProvider.spec.ts +797 -0
  289. package/src/orm/__tests__/$repository-crud.spec.ts +276 -0
  290. package/src/orm/__tests__/$repository-hooks.spec.ts +325 -0
  291. package/src/orm/__tests__/$repository-orderBy.spec.ts +128 -0
  292. package/src/orm/__tests__/$repository-pagination-sort.spec.ts +149 -0
  293. package/src/orm/__tests__/$repository-save.spec.ts +37 -0
  294. package/src/orm/__tests__/ModelBuilder-integration.spec.ts +490 -0
  295. package/src/orm/__tests__/ModelBuilder-types.spec.ts +186 -0
  296. package/src/orm/__tests__/PostgresProvider.spec.ts +46 -0
  297. package/src/orm/__tests__/delete-returning.spec.ts +256 -0
  298. package/src/orm/__tests__/deletedAt.spec.ts +80 -0
  299. package/src/orm/__tests__/enums.spec.ts +315 -0
  300. package/src/orm/__tests__/execute.spec.ts +72 -0
  301. package/src/orm/__tests__/fixtures/bigEntitySchema.ts +65 -0
  302. package/src/orm/__tests__/fixtures/userEntitySchema.ts +27 -0
  303. package/src/orm/__tests__/joins.spec.ts +1114 -0
  304. package/src/orm/__tests__/page.spec.ts +287 -0
  305. package/src/orm/__tests__/primaryKey.spec.ts +87 -0
  306. package/src/orm/__tests__/query-date-encoding.spec.ts +402 -0
  307. package/src/orm/__tests__/ref-auto-onDelete.spec.ts +156 -0
  308. package/src/orm/__tests__/references.spec.ts +102 -0
  309. package/src/orm/__tests__/security.spec.ts +710 -0
  310. package/src/orm/__tests__/sqlite.spec.ts +111 -0
  311. package/src/orm/__tests__/string-operators.spec.ts +429 -0
  312. package/src/orm/__tests__/timestamps.spec.ts +388 -0
  313. package/src/orm/__tests__/validation.spec.ts +183 -0
  314. package/src/orm/__tests__/version.spec.ts +64 -0
  315. package/src/orm/helpers/parseQueryString.spec.ts +196 -0
  316. package/src/orm/index.browser.ts +1 -1
  317. package/src/orm/index.ts +10 -6
  318. package/src/orm/primitives/$repository.spec.ts +137 -0
  319. package/src/orm/primitives/$sequence.spec.ts +29 -0
  320. package/src/orm/primitives/$transaction.spec.ts +82 -0
  321. package/src/orm/providers/{PostgresTypeProvider.ts → DatabaseTypeProvider.ts} +25 -3
  322. package/src/orm/providers/drivers/BunPostgresProvider.ts +3 -3
  323. package/src/orm/providers/drivers/BunSqliteProvider.ts +1 -1
  324. package/src/orm/providers/drivers/CloudflareD1Provider.ts +1 -1
  325. package/src/orm/providers/drivers/DatabaseProvider.ts +1 -1
  326. package/src/orm/providers/drivers/NodePostgresProvider.ts +3 -3
  327. package/src/orm/providers/drivers/NodeSqliteProvider.ts +1 -1
  328. package/src/orm/providers/drivers/PglitePostgresProvider.ts +2 -2
  329. package/src/orm/services/ModelBuilder.spec.ts +575 -0
  330. package/src/orm/services/Repository.spec.ts +137 -0
  331. package/src/queue/core/__tests__/shared.ts +143 -0
  332. package/src/queue/core/providers/MemoryQueueProvider.spec.ts +23 -0
  333. package/src/queue/core/providers/WorkerProvider.spec.ts +378 -0
  334. package/src/queue/redis/providers/RedisQueueProvider.spec.ts +23 -0
  335. package/src/redis/__tests__/redis.spec.ts +58 -0
  336. package/src/retry/primitives/$retry.spec.ts +234 -0
  337. package/src/retry/providers/RetryProvider.spec.ts +438 -0
  338. package/src/router/__tests__/match.spec.ts +252 -0
  339. package/src/router/providers/RouterProvider.spec.ts +197 -0
  340. package/src/scheduler/__tests__/$scheduler-cron.spec.ts +25 -0
  341. package/src/scheduler/__tests__/$scheduler-interval.spec.ts +25 -0
  342. package/src/scheduler/__tests__/shared.ts +77 -0
  343. package/src/security/__tests__/bug-1-wildcard-after-start.spec.ts +229 -0
  344. package/src/security/__tests__/bug-2-password-validation.spec.ts +245 -0
  345. package/src/security/__tests__/bug-3-regex-vulnerability.spec.ts +407 -0
  346. package/src/security/__tests__/bug-4-oauth2-validation.spec.ts +439 -0
  347. package/src/security/__tests__/multi-layer-permissions.spec.ts +522 -0
  348. package/src/security/primitives/$permission.spec.ts +30 -0
  349. package/src/security/primitives/$permission.ts +2 -2
  350. package/src/security/primitives/$realm.spec.ts +101 -0
  351. package/src/security/primitives/$role.spec.ts +52 -0
  352. package/src/security/primitives/$serviceAccount.spec.ts +61 -0
  353. package/src/security/providers/SecurityProvider.spec.ts +350 -0
  354. package/src/server/auth/providers/ServerAuthProvider.ts +0 -2
  355. package/src/server/cache/providers/ServerCacheProvider.spec.ts +942 -0
  356. package/src/server/compress/providers/ServerCompressProvider.spec.ts +31 -0
  357. package/src/server/compress/providers/ServerCompressProvider.ts +2 -0
  358. package/src/server/cookies/providers/ServerCookiesProvider.spec.ts +253 -0
  359. package/src/server/core/__tests__/ServerRouterProvider-getRoutes.spec.ts +334 -0
  360. package/src/server/core/__tests__/ServerRouterProvider-requestId.spec.ts +129 -0
  361. package/src/server/core/primitives/$action.spec.ts +191 -0
  362. package/src/server/core/primitives/$route.spec.ts +65 -0
  363. package/src/server/core/providers/ServerBodyParserProvider.spec.ts +93 -0
  364. package/src/server/core/providers/ServerLoggerProvider.spec.ts +100 -0
  365. package/src/server/core/providers/ServerProvider.ts +3 -1
  366. package/src/server/core/services/HttpClient.spec.ts +123 -0
  367. package/src/server/core/services/UserAgentParser.spec.ts +111 -0
  368. package/src/server/cors/providers/ServerCorsProvider.spec.ts +481 -0
  369. package/src/server/health/providers/ServerHealthProvider.spec.ts +22 -0
  370. package/src/server/helmet/providers/ServerHelmetProvider.spec.ts +105 -0
  371. package/src/server/links/__tests__/$action.spec.ts +238 -0
  372. package/src/server/links/__tests__/fixtures/CrudApp.ts +122 -0
  373. package/src/server/links/__tests__/requestId.spec.ts +120 -0
  374. package/src/server/links/primitives/$remote.spec.ts +228 -0
  375. package/src/server/links/providers/LinkProvider.spec.ts +54 -0
  376. package/src/server/links/providers/LinkProvider.ts +49 -3
  377. package/src/server/links/providers/ServerLinksProvider.ts +1 -53
  378. package/src/server/links/schemas/apiLinksResponseSchema.ts +7 -0
  379. package/src/server/metrics/providers/ServerMetricsProvider.spec.ts +25 -0
  380. package/src/server/multipart/providers/ServerMultipartProvider.spec.ts +528 -0
  381. package/src/server/proxy/primitives/$proxy.spec.ts +87 -0
  382. package/src/server/rate-limit/__tests__/ActionRateLimit.spec.ts +211 -0
  383. package/src/server/rate-limit/providers/ServerRateLimitProvider.spec.ts +344 -0
  384. package/src/server/security/__tests__/BasicAuth.spec.ts +684 -0
  385. package/src/server/security/__tests__/ServerSecurityProvider-realm.spec.ts +388 -0
  386. package/src/server/security/providers/ServerSecurityProvider.spec.ts +123 -0
  387. package/src/server/static/primitives/$serve.spec.ts +193 -0
  388. package/src/server/swagger/__tests__/ui.spec.ts +52 -0
  389. package/src/server/swagger/primitives/$swagger.spec.ts +193 -0
  390. package/src/server/swagger/providers/ServerSwaggerProvider.ts +18 -8
  391. package/src/sms/primitives/$sms.spec.ts +165 -0
  392. package/src/sms/providers/LocalSmsProvider.spec.ts +224 -0
  393. package/src/sms/providers/MemorySmsProvider.spec.ts +193 -0
  394. package/src/thread/primitives/$thread.spec.ts +186 -0
  395. package/src/topic/core/__tests__/shared.ts +144 -0
  396. package/src/topic/core/providers/MemoryTopicProvider.spec.ts +23 -0
  397. package/src/topic/redis/providers/RedisTopicProvider.spec.ts +23 -0
  398. package/src/vite/plugins/viteAlephaDev.ts +16 -4
  399. package/src/vite/tasks/runAlepha.ts +7 -1
  400. package/src/websocket/__tests__/$websocket-new.spec.ts +195 -0
  401. package/src/websocket/primitives/$channel.spec.ts +30 -0
  402. package/src/cli/commands/BiomeCommands.ts +0 -29
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["app","args","dependencies: Record<string, string>","devDependencies: Record<string, string>","scripts: Record<string, string>","packageJson","tasks: Promise<void | object>[]","g: any","cmd: string","sections: string[]","entry: ChangelogEntry","fromRef: string","config: Record<string, any>","modules: Array<Module>","external: string[]","entries: InlineConfig[]","workers: Promise<void>[]","files: string[]","modules: Module[]","module: Module"],"sources":["../../src/cli/assets/appRouterTs.ts","../../src/cli/assets/biomeJson.ts","../../src/cli/assets/dummySpecTs.ts","../../src/cli/assets/editorconfig.ts","../../src/cli/assets/indexHtml.ts","../../src/cli/assets/mainBrowserTs.ts","../../src/cli/assets/mainTs.ts","../../src/cli/assets/tsconfigJson.ts","../../src/cli/assets/viteConfigTs.ts","../../src/cli/version.ts","../../src/cli/services/AlephaCliUtils.ts","../../src/cli/commands/BiomeCommands.ts","../../src/cli/atoms/changelogOptions.ts","../../src/cli/services/GitMessageParser.ts","../../src/cli/commands/ChangelogCommands.ts","../../src/cli/commands/CoreCommands.ts","../../src/cli/commands/DeployCommands.ts","../../src/cli/commands/DrizzleCommands.ts","../../src/cli/commands/VerifyCommands.ts","../../src/cli/commands/ViteCommands.ts","../../src/cli/apps/AlephaCli.ts","../../src/cli/apps/AlephaPackageBuilderCli.ts","../../src/cli/defineConfig.ts"],"sourcesContent":["export const appRouterTs = () => `\nimport { $page } from \"@alepha/react\";\n\nexport class AppRouter {\n home = $page({\n component: () => \"Hello World\",\n });\n}\n`.trim();\n","export const biomeJson = `\n{\n \"$schema\": \"https://biomejs.dev/schemas/latest/schema.json\",\n \"vcs\": {\n \"enabled\": true,\n \"clientKind\": \"git\"\n },\n \"files\": {\n \"ignoreUnknown\": true,\n \"includes\": [\"**\", \"!node_modules\", \"!dist\"]\n },\n \"formatter\": {\n \"enabled\": true,\n \"useEditorconfig\": true\n },\n \"linter\": {\n \"enabled\": true,\n \"rules\": {\n \"recommended\": true\n },\n \"domains\": {\n \"react\": \"recommended\"\n }\n },\n \"assist\": {\n \"actions\": {\n \"source\": {\n \"organizeImports\": \"on\"\n }\n }\n }\n}\n`.trim();\n","export const dummySpecTs = () => `\nimport { test, expect } from \"vitest\";\n\ntest(\"dummy test\", () => {\n expect(1 + 1).toBe(2);\n});\n`.trim();\n","export const editorconfig = `\n# https://editorconfig.org\n\nroot = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\nindent_style = space\nindent_size = 2\n`.trim();\n","export const indexHtml = (\n browserEntry: string,\n) => `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <title>App</title>\n</head>\n<body>\n<div id=\"root\"></div>\n<script type=\"module\" src=\"${browserEntry}\"></script>\n</body>\n</html>\n`.trim();\n","export const mainBrowserTs = () => `\nimport { Alepha, run } from \"alepha\";\nimport { AppRouter } from \"./AppRouter.ts\";\n\nconst alepha = Alepha.create();\n\nalepha.with(AppRouter);\n\nrun(alepha);\n`.trim();\n","export const mainTs = () => `\nimport { run } from \"alepha\";\nimport { $route } from \"alepha/server\";\n\nclass App {\n root = $route({\n path: \"/\",\n handler: () => \"Hello, Alepha!\",\n });\n}\n\nrun(App);\n`.trim();\n","export const tsconfigJson = `\n{\n \"extends\": \"alepha/tsconfig.base\"\n}\n`.trim();\n","export const viteConfigTs = (\n serverEntry?: string,\n) => `\nimport { viteAlepha } from \"alepha/vite\";\n\nexport default {\n plugins: [\n viteAlepha(${serverEntry ? `{ serverEntry: \"${serverEntry}\" }` : \"\"}),\n ],\n test: {\n globals: true,\n },\n};\n`.trim();\n","import { readFileSync } from \"node:fs\";\n\nconst packageJson = JSON.parse(\n readFileSync(new URL(\"../../package.json\", import.meta.url), \"utf-8\"),\n);\n\nexport const version = packageJson.version;\n","import { spawn } from \"node:child_process\";\nimport { access, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { $inject, Alepha, AlephaError } from \"alepha\";\nimport { EnvUtils, type RunnerMethod } from \"alepha/command\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport { $logger } from \"alepha/logger\";\nimport { boot } from \"alepha/vite\";\nimport { tsImport } from \"tsx/esm/api\";\nimport { appRouterTs } from \"../assets/appRouterTs.ts\";\nimport { biomeJson } from \"../assets/biomeJson.ts\";\nimport { dummySpecTs } from \"../assets/dummySpecTs.ts\";\nimport { editorconfig } from \"../assets/editorconfig.ts\";\nimport { indexHtml } from \"../assets/indexHtml.ts\";\nimport { mainBrowserTs } from \"../assets/mainBrowserTs.ts\";\nimport { mainTs } from \"../assets/mainTs.ts\";\nimport { tsconfigJson } from \"../assets/tsconfigJson.ts\";\nimport { viteConfigTs } from \"../assets/viteConfigTs.ts\";\nimport { version } from \"../version.ts\";\n\n/**\n * Utility service for common project operations used by CLI commands.\n *\n * This service provides helper methods for:\n * - Project configuration file management (tsconfig.json, package.json, etc.)\n * - Package manager setup (Yarn, npm, pnpm)\n * - Sample project downloading\n * - Drizzle ORM/Kit utilities\n * - Alepha instance loading\n */\nexport class AlephaCliUtils {\n protected readonly log = $logger();\n protected readonly fs = $inject(FileSystemProvider);\n protected readonly envUtils = $inject(EnvUtils);\n\n /**\n * Execute a command using npx with inherited stdio.\n *\n * @example\n * ```ts\n * const runner = alepha.inject(ProcessRunner);\n * await runner.exec(\"tsx watch src/index.ts\");\n * ```\n */\n public async exec(\n command: string,\n options: {\n env?: Record<string, string>;\n global?: boolean;\n } = {},\n ): Promise<void> {\n const root = process.cwd();\n this.log.debug(`Executing command: ${command}`, { cwd: root });\n\n const runExec = async (app: string, args: string[]) => {\n const prog = spawn(app, args, {\n stdio: \"inherit\",\n cwd: root,\n env: {\n ...process.env,\n ...options.env,\n },\n });\n\n await new Promise<void>((resolve) =>\n prog.on(\"exit\", () => {\n resolve();\n }),\n );\n };\n\n if (options.global) {\n const [app, ...args] = command.split(\" \");\n await runExec(app, args);\n return;\n }\n\n const suffix = process.platform === \"win32\" ? \".cmd\" : \"\";\n const [app, ...args] = command.split(\" \");\n\n // find executable inside project node_modules\n let execPath = await this.checkFileExists(\n root,\n `node_modules/.bin/${app}${suffix}`,\n true,\n );\n\n // or, find executable inside alepha package node_modules (pnpm style)\n if (!execPath) {\n execPath = await this.checkFileExists(\n root,\n `node_modules/alepha/node_modules/.bin/${app}${suffix}`,\n true,\n );\n }\n\n if (!execPath) {\n throw new AlephaError(\n `Could not find executable for command '${app}'. Make sure the package is installed.`,\n );\n }\n\n await runExec(execPath, args);\n }\n\n /**\n * Write a configuration file to node_modules/.alepha directory.\n *\n * Creates the .alepha directory if it doesn't exist and writes the file with the given content.\n *\n * @param name - The name of the config file to create\n * @param content - The content to write to the file\n * @param root - The root directory (defaults to process.cwd())\n * @returns The absolute path to the created file\n *\n * @example\n * ```ts\n * const runner = alepha.inject(ProcessRunner);\n * const configPath = await runner.writeConfigFile(\"biome.json\", biomeConfig);\n * ```\n */\n public async writeConfigFile(\n name: string,\n content: string,\n root = process.cwd(),\n ): Promise<string> {\n const dir = join(root, \"node_modules\", \".alepha\");\n\n await mkdir(dir, {\n recursive: true,\n }).catch(() => null);\n\n const path = join(dir, name);\n await writeFile(path, content);\n\n this.log.debug(`Config file written: ${path}`);\n\n return path;\n }\n\n // ===================================================================================================================\n // Package Manager & Project Setup\n // ===================================================================================================================\n\n /**\n * Ensure Yarn is configured in the project directory.\n *\n * Creates a .yarnrc.yml file with node-modules linker if it doesn't exist.\n *\n * @param root - The root directory of the project\n */\n public async ensureYarn(root: string): Promise<void> {\n await this.ensureFileExists(\n root,\n \".yarnrc.yml\",\n \"nodeLinker: node-modules\",\n false,\n );\n\n // remove lock files from other package managers\n await this.fs.rm(join(root, \"package-lock.json\"), { force: true });\n await this.fs.rm(join(root, \"pnpm-lock.yaml\"), { force: true });\n }\n\n public async ensurePnpm(root: string): Promise<void> {\n // remove lock files from other package managers\n await this.fs.rm(join(root, \"package-lock.json\"), { force: true });\n await this.fs.rm(join(root, \"yarn.lock\"), { force: true });\n await this.fs.rm(join(root, \".yarn\"), { force: true, recursive: true });\n await this.fs.rm(join(root, \".yarnrc.yml\"), { force: true });\n }\n\n public async ensureNpm(root: string): Promise<void> {\n // remove lock files from other package managers\n await this.fs.rm(join(root, \"pnpm-lock.yaml\"), { force: true });\n await this.fs.rm(join(root, \"yarn.lock\"), { force: true });\n await this.fs.rm(join(root, \".yarn\"), { force: true, recursive: true });\n await this.fs.rm(join(root, \".yarnrc.yml\"), { force: true });\n }\n\n /**\n * Generate package.json content with Alepha dependencies.\n *\n * @param modes - Configuration for which dependencies to include\n * @returns Package.json partial with dependencies, devDependencies, and scripts\n */\n public generatePackageJsonContent(modes: DependencyModes): {\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n scripts: Record<string, string>;\n type: \"module\";\n } {\n const dependencies: Record<string, string> = {\n alepha: `^${version}`,\n };\n\n const devDependencies: Record<string, string> = {};\n\n const scripts: Record<string, string> = {\n dev: \"alepha dev\",\n build: \"alepha build\",\n lint: \"alepha lint\",\n typecheck: \"alepha typecheck\",\n verify: \"alepha verify\",\n };\n\n if (modes.ui) {\n dependencies[\"@alepha/ui\"] = `^${version}`;\n modes.react = true;\n }\n\n if (modes.react) {\n dependencies[\"@alepha/react\"] = `^${version}`;\n dependencies.react = \"^19.2.0\";\n dependencies[\"react-dom\"] = \"^19.2.0\";\n devDependencies[\"@types/react\"] = \"^19.2.0\";\n }\n\n return {\n type: \"module\",\n dependencies,\n devDependencies,\n scripts,\n };\n }\n\n /**\n * Ensure package.json exists and has correct configuration.\n *\n * Creates a new package.json if none exists, or updates an existing one to:\n * - Set \"type\": \"module\"\n * - Add Alepha dependencies\n * - Add standard scripts\n *\n * @param root - The root directory of the project\n * @param modes - Configuration for which dependencies to include\n */\n public async ensurePackageJson(\n root: string,\n modes: DependencyModes,\n ): Promise<object> {\n const packageJsonPath = join(root, \"package.json\");\n try {\n await access(packageJsonPath);\n } catch (error) {\n const obj = this.generatePackageJsonContent(modes);\n await writeFile(packageJsonPath, JSON.stringify(obj, null, 2));\n return obj;\n }\n\n const content = await readFile(packageJsonPath, \"utf8\");\n const packageJson = JSON.parse(content);\n\n const newPackageJson = this.generatePackageJsonContent(modes);\n\n packageJson.type = \"module\";\n packageJson.dependencies ??= {};\n packageJson.devDependencies ??= {};\n packageJson.scripts ??= {};\n\n Object.assign(packageJson.dependencies, newPackageJson.dependencies);\n Object.assign(packageJson.devDependencies, newPackageJson.devDependencies);\n Object.assign(packageJson.scripts, newPackageJson.scripts);\n\n await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));\n\n return packageJson;\n }\n\n public async ensureConfig(\n root: string,\n opts: {\n packageJson?: boolean | DependencyModes;\n tsconfigJson?: boolean;\n viteConfigTs?: boolean;\n indexHtml?: boolean;\n biomeJson?: boolean;\n editorconfig?: boolean;\n },\n ): Promise<Array<void | object>> {\n const tasks: Promise<void | object>[] = [];\n\n if (opts.packageJson) {\n tasks.push(\n this.ensurePackageJson(\n root,\n typeof opts.packageJson === \"boolean\" ? {} : opts.packageJson,\n ),\n );\n }\n if (opts.tsconfigJson) {\n tasks.push(this.ensureTsConfig(root));\n }\n if (opts.viteConfigTs) {\n tasks.push(this.ensureViteConfig(root));\n }\n if (opts.indexHtml) {\n tasks.push(this.ensureIndexHtml(root));\n }\n if (opts.biomeJson) {\n tasks.push(this.ensureBiomeConfig(root));\n }\n if (opts.editorconfig) {\n tasks.push(this.ensureEditorConfig(root));\n }\n\n return await Promise.all(tasks);\n }\n\n /**\n * Ensure tsconfig.json exists in the project.\n *\n * Creates a standard Alepha tsconfig.json if none exists.\n *\n * @param root - The root directory of the project\n */\n public async ensureTsConfig(root: string): Promise<void> {\n await this.ensureFileExists(root, \"tsconfig.json\", tsconfigJson, true);\n }\n\n /**\n * Ensure vite.config.ts exists in the project.\n *\n * Creates a standard Alepha vite.config.ts if none exists.\n */\n public async ensureViteConfig(\n root: string,\n serverEntry?: string,\n ): Promise<void> {\n await this.ensureFileExists(\n root,\n \"vite.config.ts\",\n viteConfigTs(serverEntry),\n false,\n );\n }\n\n protected async checkFileExists(\n root: string,\n name: string,\n checkParentDirectories: boolean = false,\n ): Promise<string | undefined> {\n const configPath = join(root, name);\n if (!checkParentDirectories) {\n try {\n await access(configPath);\n return configPath;\n } catch {\n return;\n }\n }\n\n let currentDir = root;\n const maxIterations = 10; // safety to prevent infinite loops\n let level = 0;\n\n while (level < maxIterations) {\n try {\n const maybe = join(currentDir, name);\n await access(maybe);\n return maybe;\n } catch {\n const parentDir = join(currentDir, \"..\");\n if (parentDir === currentDir) {\n break;\n }\n currentDir = parentDir;\n }\n level += 1;\n }\n }\n\n protected async ensureFileExists(\n root: string,\n name: string,\n content: string,\n checkParentDirectories: boolean = false,\n ): Promise<void> {\n const found = await this.checkFileExists(\n root,\n name,\n checkParentDirectories,\n );\n\n if (!found) {\n await writeFile(join(root, name), content);\n }\n }\n\n // ===================================================================================================================\n // Biome Configuration\n // ===================================================================================================================\n\n /**\n * Get the path to Biome configuration file.\n *\n * Looks for an existing biome.json in the project root, or creates one if it doesn't exist.\n */\n public async ensureBiomeConfig(root: string): Promise<void> {\n await this.ensureFileExists(root, \"biome.json\", biomeJson, true);\n }\n\n /**\n * Ensure .editorconfig exists in the project.\n *\n * Creates a standard .editorconfig if none exists.\n *\n * @param root - The root directory of the project\n */\n public async ensureEditorConfig(root: string): Promise<void> {\n await this.ensureFileExists(root, \".editorconfig\", editorconfig, true);\n }\n\n // ===================================================================================================================\n // Drizzle ORM & Kit Utilities\n // ===================================================================================================================\n\n /**\n * Load Alepha instance from a server entry file.\n *\n * Dynamically imports the server entry file and extracts the Alepha instance.\n * Skips the automatic start process.\n *\n * @param rootDir - The root directory of the project\n * @param explicitEntry - Optional explicit path to the entry file\n * @returns Object containing the Alepha instance and the entry file path\n * @throws {AlephaError} If the Alepha instance cannot be found\n */\n public async loadAlephaFromServerEntryFile(\n rootDir?: string,\n explicitEntry?: string,\n ): Promise<{\n alepha: Alepha;\n entry: string;\n }> {\n process.env.ALEPHA_CLI_IMPORT = \"true\";\n\n const entry = await boot.getServerEntry(rootDir, explicitEntry);\n const mod = await tsImport(entry, {\n parentURL: import.meta.url,\n });\n\n this.log.debug(`Load entry: ${entry}`);\n\n // check if alepha is correctly exported\n if (mod.default instanceof Alepha) {\n return {\n alepha: mod.default,\n entry,\n };\n }\n\n // else, try with global variable\n const g: any = global;\n if (g.__alepha) {\n return {\n alepha: g.__alepha,\n entry,\n };\n }\n\n throw new AlephaError(\n `Could not find Alepha instance in entry file: ${entry}`,\n );\n }\n\n /**\n * Generate JavaScript code for Drizzle entities export.\n *\n * Creates a temporary entities.js file that imports from the entry file\n * and exports database models for Drizzle Kit to process.\n *\n * @param entry - Path to the server entry file\n * @param provider - Name of the database provider\n * @param models - Array of model names to export\n * @returns JavaScript code as a string\n */\n public generateEntitiesJs(\n entry: string,\n provider: string,\n models: string[] = [],\n ): string {\n return `\nimport \"${entry}\";\nimport { DrizzleKitProvider, Repository } from \"alepha/orm\";\n\nconst alepha = globalThis.__alepha;\nconst kit = alepha.inject(DrizzleKitProvider);\nconst provider = alepha.services(Repository).find((it) => it.provider.name === \"${provider}\").provider;\nconst models = kit.getModels(provider);\n\n${models.map((it: string) => `export const ${it} = models[\"${it}\"];`).join(\"\\n\")}\n\n`.trim();\n }\n\n /**\n * Load environment variables from a .env file.\n *\n * Reads the .env file in the specified root directory and sets\n * the environment variables in process.env.\n */\n public async loadEnv(\n root: string,\n files: string[] = [\".env\"],\n ): Promise<void> {\n await this.envUtils.loadEnv(root, files);\n }\n\n public async getPackageManager(\n root: string,\n flags?: { yarn?: boolean; pnpm?: boolean; npm?: boolean; bun?: boolean },\n ): Promise<\"yarn\" | \"pnpm\" | \"npm\" | \"bun\"> {\n if (flags?.yarn) {\n return \"yarn\";\n }\n if (flags?.pnpm) {\n return \"pnpm\";\n }\n if (flags?.npm) {\n return \"npm\";\n }\n if (flags?.bun) {\n return \"bun\";\n }\n if (await this.checkFileExists(root, \"yarn.lock\", true)) {\n return \"yarn\";\n }\n if (await this.checkFileExists(root, \"pnpm-lock.yaml\", true)) {\n return \"pnpm\";\n }\n return \"npm\";\n }\n\n public async ensureIndexHtml(root: string) {\n if (await this.fs.exists(join(root, \"index.html\"))) {\n return;\n }\n\n const serverEntry = \"src/main.server.ts\";\n const browserEntry = \"src/main.browser.ts\";\n const appRouter = \"src/AppRouter.ts\";\n\n await this.fs.writeFile(join(root, \"index.html\"), indexHtml(browserEntry));\n\n try {\n await this.fs.mkdir(join(root, \"src\"), { recursive: true });\n } catch {}\n\n if (!(await this.fs.exists(join(root, browserEntry)))) {\n await this.fs.writeFile(join(root, browserEntry), mainBrowserTs());\n }\n\n if (!(await this.fs.exists(join(root, serverEntry)))) {\n await this.fs.writeFile(join(root, serverEntry), mainBrowserTs());\n }\n\n if (!(await this.fs.exists(join(root, appRouter)))) {\n await this.fs.writeFile(join(root, appRouter), appRouterTs());\n }\n }\n\n public async exists(root: string, dirName: string): Promise<boolean> {\n return this.fs.exists(join(root, dirName));\n }\n\n /**\n * Ensure src/main.ts exists with a minimal Alepha bootstrap.\n *\n * Creates the src directory and main.ts file if the src directory\n * doesn't exist or is empty.\n *\n * @param root - The root directory of the project\n */\n public async ensureSrcMain(root: string): Promise<void> {\n const srcDir = join(root, \"src\");\n const mainPath = join(srcDir, \"main.ts\");\n\n // Check if src directory exists\n const srcExists = await this.fs.exists(srcDir);\n\n if (!srcExists) {\n // Create src directory and main.ts\n await this.fs.mkdir(srcDir, { recursive: true });\n await this.fs.writeFile(mainPath, mainTs());\n return;\n }\n\n // Check if src directory is empty\n const files = await this.fs.ls(srcDir);\n if (files.length === 0) {\n await this.fs.writeFile(mainPath, mainTs());\n }\n }\n\n /**\n * Ensure test directory exists with a dummy test file.\n *\n * Creates the test directory and a dummy.spec.ts file if the test directory\n * doesn't exist or is empty.\n *\n * @param root - The root directory of the project\n */\n public async ensureTestDir(root: string): Promise<void> {\n const testDir = join(root, \"test\");\n const dummyPath = join(testDir, \"dummy.spec.ts\");\n\n // Check if test directory exists\n const testExists = await this.fs.exists(testDir);\n\n if (!testExists) {\n // Create test directory and dummy.spec.ts\n await this.fs.mkdir(testDir, { recursive: true });\n await this.fs.writeFile(dummyPath, dummySpecTs());\n return;\n }\n\n // Check if test directory is empty\n const files = await this.fs.ls(testDir);\n if (files.length === 0) {\n await this.fs.writeFile(dummyPath, dummySpecTs());\n }\n }\n\n async readPackageJson(root: string): Promise<Record<string, any>> {\n const packageJson = await this.fs\n .createFile({\n path: join(root, \"package.json\"),\n })\n .text();\n return JSON.parse(packageJson);\n }\n\n /**\n * Check if a dependency is installed in the project.\n *\n * @param root - The root directory of the project\n * @param packageName - The name of the package to check\n * @returns True if the package is in dependencies or devDependencies\n */\n async hasDependency(root: string, packageName: string): Promise<boolean> {\n try {\n const pkg = await this.readPackageJson(root);\n return !!(\n pkg.dependencies?.[packageName] || pkg.devDependencies?.[packageName]\n );\n } catch {\n return false;\n }\n }\n\n /**\n * Check if Expo is present in the project.\n *\n * @param root - The root directory of the project\n * @returns True if expo is in dependencies or devDependencies\n */\n async hasExpo(root: string): Promise<boolean> {\n return this.hasDependency(root, \"expo\");\n }\n\n /**\n * Install a dependency if it's missing from the project.\n *\n * Automatically detects the package manager (yarn, pnpm, npm) and installs\n * the package as a dev dependency if not already present.\n */\n async ensureDependency(\n root: string,\n packageName: string,\n options: { dev?: boolean; run?: RunnerMethod } = {},\n ): Promise<void> {\n const { dev = true } = options;\n\n if (await this.hasDependency(root, packageName)) {\n this.log.debug(`Dependency '${packageName}' is already installed`);\n return;\n }\n\n const pm = await this.getPackageManager(root);\n let cmd: string;\n\n switch (pm) {\n case \"yarn\":\n cmd = `yarn add ${dev ? \"-D\" : \"\"} ${packageName}`;\n break;\n case \"pnpm\":\n cmd = `pnpm add ${dev ? \"-D\" : \"\"} ${packageName}`;\n break;\n default:\n cmd = `npm install ${dev ? \"--save-dev\" : \"\"} ${packageName}`;\n }\n\n cmd = cmd.replace(/\\s+/g, \" \").trim();\n\n if (options.run) {\n // if it's during a Runner flow, just use the runner's run method\n await options.run(cmd, {\n alias: `installing ${packageName}`,\n });\n } else {\n // else, run directly with our util exec method\n this.log.debug(`Installing ${packageName}`);\n await this.exec(cmd, { global: true });\n }\n }\n}\n\nexport interface DependencyModes {\n react?: boolean;\n ui?: boolean;\n expo?: boolean;\n}\n","import { $inject } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { $logger } from \"alepha/logger\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\n\nexport class BiomeCommands {\n protected readonly log = $logger();\n protected readonly utils = $inject(AlephaCliUtils);\n\n public readonly format = $command({\n name: \"format\",\n description: \"Format the codebase using Biome\",\n handler: async ({ root }) => {\n await this.utils.ensureConfig(root, { biomeJson: true });\n await this.utils.ensureDependency(root, \"@biomejs/biome\");\n await this.utils.exec(`biome format --fix`);\n },\n });\n\n public readonly lint = $command({\n name: \"lint\",\n description: \"Run linter across the codebase using Biome\",\n handler: async ({ root }) => {\n await this.utils.ensureConfig(root, { biomeJson: true });\n await this.utils.ensureDependency(root, \"@biomejs/biome\");\n await this.utils.exec(`biome check --formatter-enabled=false --fix`);\n },\n });\n}\n","import { $atom, type Static, t } from \"alepha\";\n\n/**\n * Default scopes to ignore in changelog generation.\n * Commits with these scopes won't appear in release notes.\n */\nexport const DEFAULT_IGNORE = [\n \"project\",\n \"release\",\n \"starter\",\n \"example\",\n \"chore\",\n \"ci\",\n \"build\",\n \"test\",\n \"style\",\n];\n\n/**\n * Changelog configuration atom.\n *\n * Configure in `alepha.config.ts`:\n * ```ts\n * import { changelogOptions } from \"alepha/cli\";\n *\n * alepha.set(changelogOptions, {\n * ignore: [\"project\", \"release\", \"chore\", \"docs\"],\n * });\n * ```\n */\nexport const changelogOptions = $atom({\n name: \"alepha.changelog\",\n schema: t.object({\n /**\n * Scopes to ignore (e.g., \"project\", \"release\", \"chore\").\n * Commits like `feat(chore): ...` will be excluded from changelog.\n */\n ignore: t.optional(t.array(t.string())),\n }),\n default: {\n ignore: DEFAULT_IGNORE,\n },\n});\n\nexport type ChangelogOptions = Static<typeof changelogOptions.schema>;\n","import { $logger } from \"alepha/logger\";\nimport {\n type ChangelogOptions,\n DEFAULT_IGNORE,\n} from \"../atoms/changelogOptions.ts\";\nimport type { Commit } from \"../commands/ChangelogCommands.ts\";\n\n/**\n * Service for parsing git commit messages into structured format.\n *\n * Only parses **conventional commits with a scope**:\n * - `feat(scope): description` → feature\n * - `fix(scope): description` → bug fix\n * - `feat(scope)!: description` → breaking change\n *\n * Commits without scope are ignored, allowing developers to commit\n * work-in-progress changes without polluting release notes:\n * - `cli: work in progress` → ignored (no type)\n * - `fix: quick patch` → ignored (no scope)\n * - `feat(cli): add command` → included\n */\nexport class GitMessageParser {\n protected readonly log = $logger();\n\n /**\n * Parse a git commit line into a structured Commit object.\n *\n * **Format:** `type(scope): description` or `type(scope)!: description`\n *\n * **Supported types:** feat, fix, docs, refactor, perf, revert\n *\n * **Breaking changes:** Use `!` before `:` (e.g., `feat(api)!: remove endpoint`)\n *\n * @returns Commit object or null if not matching/ignored\n */\n parseCommit(line: string, config: ChangelogOptions): Commit | null {\n // Extract hash and message from git log --oneline format\n const match = line.match(/^([a-f0-9]+)\\s+(.+)$/);\n if (!match) return null;\n\n const [, hash, message] = match;\n const ignore = config.ignore ?? DEFAULT_IGNORE;\n\n // Conventional commit with REQUIRED scope: type(scope): description\n // The `!` before `:` marks a breaking change\n const conventionalMatch = message.match(\n /^(feat|fix|docs|refactor|perf|revert)\\(([^)]+)\\)(!)?:\\s*(.+)$/i,\n );\n\n if (!conventionalMatch) {\n // No match - commit doesn't follow required format\n return null;\n }\n\n const [, type, scope, breakingMark, description] = conventionalMatch;\n\n // Check if scope should be ignored\n const baseScope = scope.split(\"/\")[0];\n if (ignore.includes(baseScope) || ignore.includes(scope)) {\n return null;\n }\n\n // Breaking change detection:\n // 1. Explicit `!` marker: feat(api)!: change\n // 2. Word \"breaking\" in description: feat(api): breaking change to auth\n const breaking =\n breakingMark === \"!\" || description.toLowerCase().includes(\"breaking\");\n\n return {\n hash: hash.substring(0, 8),\n type: type.toLowerCase(),\n scope,\n description: description.trim(),\n breaking,\n };\n }\n}\n","import { exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { $inject, $use, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { $logger } from \"alepha/logger\";\nimport { changelogOptions } from \"../atoms/changelogOptions.ts\";\nimport { GitMessageParser } from \"../services/GitMessageParser.ts\";\n\nexport {\n type ChangelogOptions,\n changelogOptions,\n DEFAULT_IGNORE,\n} from \"../atoms/changelogOptions.ts\";\nexport { GitMessageParser } from \"../services/GitMessageParser.ts\";\n\nconst execAsync = promisify(exec);\n\n// =============================================================================\n// GIT PROVIDER\n// =============================================================================\n\n/**\n * Git provider for executing git commands.\n * Can be substituted in tests with a mock implementation.\n */\nexport class GitProvider {\n async exec(cmd: string, cwd: string): Promise<string> {\n const { stdout } = await execAsync(`git ${cmd}`, { cwd });\n return stdout;\n }\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface Commit {\n hash: string;\n type: string;\n scope: string | null;\n description: string;\n breaking: boolean;\n}\n\ninterface ChangelogEntry {\n features: Commit[];\n fixes: Commit[];\n breaking: Commit[];\n}\n\n// =============================================================================\n// CHANGELOG COMMANDS\n// =============================================================================\n\n/**\n * Changelog command for generating release notes from git commits.\n *\n * Usage:\n * - `alepha changelog` - Show unreleased changes since latest tag to HEAD\n * - `alepha changelog --from=1.0.0` - Show changes from version to HEAD\n * - `alepha changelog --from=1.0.0 --to=1.1.0` - Show changes between two refs\n * - `alepha changelog | tee -a CHANGELOG.md` - Append to file\n */\nexport class ChangelogCommands {\n protected readonly log = $logger();\n protected readonly git = $inject(GitProvider);\n protected readonly parser = $inject(GitMessageParser);\n protected readonly config = $use(changelogOptions);\n\n // ---------------------------------------------------------------------------\n // FORMATTING\n // ---------------------------------------------------------------------------\n\n /**\n * Format a single commit line.\n * Example: `- **cli**: add new command (\\`abc1234\\`)`\n */\n protected formatCommit(commit: Commit): string {\n return `- **${commit.scope}**: ${commit.description} (\\`${commit.hash}\\`)`;\n }\n\n /**\n * Format the changelog entry with sections.\n */\n protected formatEntry(entry: ChangelogEntry): string {\n const sections: string[] = [];\n\n if (entry.breaking.length > 0) {\n sections.push(\"### Breaking Changes\\n\");\n for (const commit of entry.breaking) {\n sections.push(this.formatCommit(commit));\n }\n sections.push(\"\");\n }\n\n if (entry.features.length > 0) {\n sections.push(\"### Features\\n\");\n for (const commit of entry.features) {\n sections.push(this.formatCommit(commit));\n }\n sections.push(\"\");\n }\n\n if (entry.fixes.length > 0) {\n sections.push(\"### Bug Fixes\\n\");\n for (const commit of entry.fixes) {\n sections.push(this.formatCommit(commit));\n }\n sections.push(\"\");\n }\n\n return sections.join(\"\\n\");\n }\n\n // ---------------------------------------------------------------------------\n // PARSING\n // ---------------------------------------------------------------------------\n\n /**\n * Parse git log output into a changelog entry.\n */\n protected parseCommits(commitsOutput: string): ChangelogEntry {\n const entry: ChangelogEntry = {\n features: [],\n fixes: [],\n breaking: [],\n };\n\n for (const line of commitsOutput.trim().split(\"\\n\")) {\n if (!line.trim()) continue;\n\n const commit = this.parser.parseCommit(line, this.config);\n if (!commit) {\n this.log.trace(\"Skipping commit\", { line });\n continue;\n }\n\n this.log.trace(\"Parsed commit\", { commit });\n\n // Categorize commit\n if (commit.breaking) {\n entry.breaking.push(commit);\n }\n if (commit.type === \"feat\") {\n entry.features.push(commit);\n } else if (commit.type === \"fix\") {\n entry.fixes.push(commit);\n }\n }\n\n return entry;\n }\n\n /**\n * Check if entry has any public commits.\n */\n protected hasChanges(entry: ChangelogEntry): boolean {\n return (\n entry.features.length > 0 ||\n entry.fixes.length > 0 ||\n entry.breaking.length > 0\n );\n }\n\n /**\n * Get the latest version tag.\n */\n protected async getLatestTag(\n git: (cmd: string) => Promise<string>,\n ): Promise<string | null> {\n const tagsOutput = await git(\"tag --sort=-version:refname\");\n const tags = tagsOutput\n .trim()\n .split(\"\\n\")\n .filter((tag) => tag.match(/^\\d+\\.\\d+\\.\\d+$/));\n\n return tags[0] || null;\n }\n\n // ---------------------------------------------------------------------------\n // COMMAND\n // ---------------------------------------------------------------------------\n\n public readonly changelog = $command({\n name: \"changelog\",\n description:\n \"Generate changelog from conventional commits (outputs to stdout)\",\n flags: t.object({\n /**\n * Show changes from this ref (tag, commit, branch).\n * Defaults to the latest version tag.\n * Example: --from=1.0.0\n */\n from: t.optional(\n t.string({\n aliases: [\"f\"],\n description: \"Starting ref (default: latest tag)\",\n }),\n ),\n /**\n * Show changes up to this ref (tag, commit, branch).\n * Defaults to HEAD.\n * Example: --to=main\n */\n to: t.optional(\n t.string({\n aliases: [\"t\"],\n description: \"Ending ref (default: HEAD)\",\n }),\n ),\n }),\n handler: async ({ flags, root }) => {\n const git = (cmd: string) => this.git.exec(cmd, root);\n\n // Determine the starting point\n let fromRef: string;\n\n if (flags.from) {\n // User specified a ref\n fromRef = flags.from;\n this.log.debug(\"Using specified from ref\", { from: fromRef });\n } else {\n // Use latest tag\n const latestTag = await this.getLatestTag(git);\n if (!latestTag) {\n process.stdout.write(\"No version tags found in repository\\n\");\n return;\n }\n fromRef = latestTag;\n this.log.debug(\"Using latest tag\", { from: fromRef });\n }\n\n // Determine the ending point\n const toRef = flags.to || \"HEAD\";\n this.log.debug(\"Using to ref\", { to: toRef });\n\n // Get commits in range\n const commitsOutput = await git(`log ${fromRef}..${toRef} --oneline`);\n\n if (!commitsOutput.trim()) {\n process.stdout.write(`No changes in range ${fromRef}..${toRef}\\n`);\n return;\n }\n\n // Parse and format\n const entry = this.parseCommits(commitsOutput);\n\n if (!this.hasChanges(entry)) {\n process.stdout.write(\n `No public changes in range ${fromRef}..${toRef}\\n`,\n );\n return;\n }\n\n // Output the formatted changelog (no header - caller adds it if needed)\n process.stdout.write(this.formatEntry(entry));\n },\n });\n}\n","import { $inject, t } from \"alepha\";\nimport { $command, CliProvider } from \"alepha/command\";\nimport { $logger } from \"alepha/logger\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\nimport { version } from \"../version.ts\";\n\nexport class CoreCommands {\n protected readonly log = $logger();\n protected readonly cli = $inject(CliProvider);\n protected readonly utils = $inject(AlephaCliUtils);\n\n /**\n * Called when no command is provided\n */\n public readonly root = $command({\n root: true,\n flags: t.object({\n version: t.optional(\n t.boolean({\n description: \"Show Alepha CLI version\",\n aliases: [\"v\"],\n }),\n ),\n }),\n handler: async ({ flags }) => {\n if (flags.version) {\n this.log.info(version);\n return;\n }\n\n this.cli.printHelp();\n },\n });\n\n /**\n * Clean the project, removing the \"dist\" directory\n */\n public readonly clean = $command({\n name: \"clean\",\n description: \"Clean the project\",\n handler: async ({ run }) => {\n await run.rm(\"./dist\");\n },\n });\n\n /**\n * Ensure the project has the necessary Alepha configuration files.\n * Add the correct dependencies to package.json and install them.\n */\n public readonly init = $command({\n name: \"init\",\n description: \"Add missing Alepha configuration files to the project\",\n flags: t.object({\n // choose package manager\n yarn: t.optional(t.boolean({ description: \"Use Yarn package manager\" })),\n pnpm: t.optional(t.boolean({ description: \"Use pnpm package manager\" })),\n npm: t.optional(t.boolean({ description: \"Use npm package manager\" })),\n bun: t.optional(t.boolean({ description: \"Use Bun package manager\" })),\n // choose which dependencies to add\n react: t.optional(\n t.boolean({ description: \"Include Alepha React dependencies\" }),\n ),\n ui: t.optional(\n t.boolean({ description: \"Include Alepha UI dependencies\" }),\n ),\n test: t.optional(\n t.boolean({ description: \"Include Vitest and create test directory\" }),\n ),\n }),\n handler: async ({ run, flags, root }) => {\n if (flags.ui) {\n flags.react = true;\n }\n\n const isExpo = await this.utils.hasExpo(root);\n\n await run({\n name: \"ensuring configuration files\",\n handler: async () => {\n await this.utils.ensureConfig(root, {\n tsconfigJson: true,\n packageJson: flags,\n biomeJson: true,\n viteConfigTs: !isExpo,\n editorconfig: true,\n indexHtml: !!flags.react && !isExpo,\n });\n\n // Create src/main.ts if src directory is empty or doesn't exist\n if (!flags.react) {\n await this.utils.ensureSrcMain(root);\n }\n },\n });\n\n // TODO: check if all alepha dependencies are same version\n\n const pm = await this.utils.getPackageManager(root, flags);\n if (pm === \"yarn\") {\n await this.utils.ensureYarn(root);\n await run(\"yarn set version stable\");\n } else if (pm === \"pnpm\") {\n await this.utils.ensurePnpm(root);\n } else {\n await this.utils.ensureNpm(root);\n }\n\n await run(`${pm} install`, {\n alias: `installing dependencies with ${pm}`,\n });\n\n if (!isExpo) {\n await this.utils.ensureDependency(root, \"vite\", { run });\n }\n\n await this.utils.ensureDependency(root, \"@biomejs/biome\", { run });\n\n // Install vitest and create test directory if --test flag is set\n if (flags.test) {\n await this.utils.ensureTestDir(root);\n await run(`${pm} ${pm === \"yarn\" ? \"add\" : \"install\"} -D vitest`, {\n alias: \"setup testing with Vitest\",\n });\n }\n },\n });\n}\n","import { join } from \"node:path\";\nimport { $inject, AlephaError, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { $logger } from \"alepha/logger\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\n\nexport class DeployCommands {\n protected readonly log = $logger();\n protected readonly utils = $inject(AlephaCliUtils);\n\n /**\n * Deploy the project to a hosting platform (e.g., Vercel, Cloudflare, Surge)\n *\n * Deploy command can be overridden by creating a alepha.config.ts in the project root:\n *\n * ```ts\n * import { defineConfig } from \"alepha/cli\";\n *\n * export default defineConfig({\n * commands: {\n * deploy: {\n * handler: async ({ root, mode, flags }) => {\n * // Custom deployment logic here\n * },\n * },\n * },\n * });\n * ```\n */\n public readonly deploy = $command({\n name: \"deploy\",\n description:\n \"Deploy the project to a hosting platform (e.g., Vercel, Cloudflare, Surge)\",\n mode: true,\n flags: t.object({\n build: t.boolean({\n description: \"Build the project before deployment\",\n default: false,\n }),\n migrate: t.boolean({\n description:\n \"Run database migrations before deployment (if applicable)\",\n default: false,\n }),\n }),\n env: t.object({\n VERCEL_TOKEN: t.optional(\n t.text({\n description: \"Vercel API token (e.g., xxxxxxxxxxxxxxxxxxxx)\",\n }),\n ),\n VERCEL_ORG_ID: t.optional(\n t.text({\n description: \"Vercel organization ID (e.g., team_abc123...)\",\n }),\n ),\n VERCEL_PROJECT_ID: t.optional(\n t.text({ description: \"Vercel project ID (e.g., prj_abc123...)\" }),\n ),\n CLOUDFLARE_API_TOKEN: t.optional(\n t.text({\n description: \"Cloudflare API token (e.g., xxxx-xxxx-xxxx-xxxx)\",\n }),\n ),\n CLOUDFLARE_ACCOUNT_ID: t.optional(\n t.text({\n description: \"Cloudflare account ID (e.g., abc123def456...)\",\n }),\n ),\n }),\n handler: async ({ root, mode, flags }) => {\n if (flags.build) {\n await this.utils.exec(\"alepha build\");\n }\n\n // Vercel deployment\n if (await this.utils.exists(root, \"dist/vercel.json\")) {\n if (flags.migrate) {\n this.log.debug(\"Running database migrations before deployment...\");\n await this.utils.exec(`alepha db migrate --mode=${mode}`);\n }\n await this.utils.ensureDependency(root, \"vercel\", { dev: true });\n const command =\n `vercel . --cwd=dist ${mode === \"production\" ? \"--prod\" : \"\"}`.trim();\n this.log.debug(`Deploying to Vercel with command: ${command}`);\n await this.utils.exec(command);\n return;\n }\n\n // Cloudflare deployment\n if (await this.utils.exists(root, \"dist/wrangler.jsonc\")) {\n if (flags.migrate) {\n this.log.debug(\"Running database migrations before deployment...\");\n await this.utils.exec(`alepha db migrate --mode=${mode}`);\n }\n await this.utils.ensureDependency(root, \"wrangler\", { dev: true });\n const command =\n `wrangler deploy ${mode === \"production\" ? \"\" : \"--env preview\"} --config=dist/wrangler.jsonc`.trim();\n this.log.info(`Deploying to Cloudflare with command: ${command}`);\n await this.utils.exec(command);\n return;\n }\n\n // Surge deployment\n if (await this.utils.exists(root, \"dist/public/404.html\")) {\n await this.utils.ensureDependency(root, \"surge\", { dev: true });\n const distPath = join(root, \"dist/public\");\n this.log.debug(`Deploying to Surge from directory: ${distPath}`);\n await this.utils.exec(`surge ${distPath}`);\n return;\n }\n\n throw new AlephaError(\n \"No deployment configuration found in the dist folder.\",\n );\n },\n });\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { $inject, AlephaError, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { $logger } from \"alepha/logger\";\nimport type {\n DatabaseProvider,\n DrizzleKitProvider,\n RepositoryProvider,\n} from \"alepha/orm\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\n\nconst drizzleCommandFlags = t.object({\n provider: t.optional(\n t.text({\n description:\n \"Database provider name to target (e.g., 'postgres', 'sqlite')\",\n }),\n ),\n mode: t.optional(\n t.text({\n description:\n \"Environment variable file(s) to load (e.g., 'production' to load .env.production) https://vite.dev/guide/env-and-mode\",\n }),\n ),\n});\n\nexport class DrizzleCommands {\n log = $logger();\n utils = $inject(AlephaCliUtils);\n\n /**\n * Check if database migrations are up to date.\n */\n check = $command({\n name: \"check-migrations\",\n description: \"Check if database migration files are up to date\",\n args: t.optional(\n t.text({\n title: \"path\",\n description: \"Path to the Alepha server entry file\",\n }),\n ),\n flags: drizzleCommandFlags,\n handler: async ({ args, root }) => {\n const rootDir = root;\n this.log.debug(`Using project root: ${rootDir}`);\n\n const { alepha } = await this.utils.loadAlephaFromServerEntryFile(\n rootDir,\n args,\n );\n\n const repositoryProvider =\n alepha.inject<RepositoryProvider>(\"RepositoryProvider\");\n const drizzleKitProvider =\n alepha.inject<DrizzleKitProvider>(\"DrizzleKitProvider\");\n const accepted = new Set<string>([]);\n\n for (const primitive of repositoryProvider.getRepositories()) {\n const provider = primitive.provider;\n const providerName = provider.name;\n if (accepted.has(providerName)) {\n continue;\n }\n\n accepted.add(providerName);\n\n const migrationDir = join(rootDir, \"migrations\", providerName);\n\n const journalFile = await readFile(\n `${migrationDir}/meta/_journal.json`,\n \"utf-8\",\n ).catch(() => null);\n\n if (!journalFile) {\n this.log.info(`No migration journal found.`);\n return;\n }\n\n const journal = JSON.parse(journalFile);\n const lastMigration = journal.entries[journal.entries.length - 1];\n const lastSnapshot = JSON.parse(\n await readFile(\n `${migrationDir}/meta/${String(lastMigration.idx).padStart(4, \"0\")}_snapshot.json`,\n \"utf-8\",\n ),\n );\n\n const models = drizzleKitProvider.getModels(provider);\n const kit = drizzleKitProvider.importDrizzleKit();\n const now = kit.generateDrizzleJson(models, lastSnapshot.id);\n\n const migrationStatements = await new Promise<Array<any>>((resolve) => {\n (async () => {\n const timer = setTimeout(() => {\n resolve([{ message: \"Migration generation timed out.\" }]);\n }, 5000);\n const statements = await kit.generateMigration(lastSnapshot, now);\n clearTimeout(timer);\n resolve(statements);\n })();\n });\n\n if (migrationStatements.length === 0) {\n this.log.info(\"No changes detected.\");\n return;\n }\n\n this.log.info(\"\");\n this.log.info(\"Detected migration statements:\");\n this.log.info(\"\");\n for (const stmt of migrationStatements) {\n this.log.info(stmt);\n }\n this.log.info(\"\");\n\n this.log.info(\n `At least ${migrationStatements.length} change(s) detected.`,\n );\n this.log.info(\n \"Please, run 'alepha db:generate' to update the migration files.\",\n );\n this.log.info(\"\");\n\n throw new AlephaError(\"Database migrations are not up to date.\");\n }\n },\n });\n\n /**\n * Generate database migration files\n *\n * - Loads the Alepha instance from the specified entry file.\n * - Retrieves all repository primitives to gather database models.\n * - Creates temporary entity definitions based on the current database schema.\n * - Writes these definitions to a temporary schema file. (node_modules/.db/entities.ts)\n * - Invokes Drizzle Kit's CLI to generate migration files based on the current schema.\n */\n generate = $command({\n name: \"generate\",\n description: \"Generate migration files based on current database schema\",\n summary: false,\n args: t.optional(\n t.text({\n title: \"path\",\n description: \"Path to the Alepha server entry file\",\n }),\n ),\n flags: t.extend(drizzleCommandFlags, {\n custom: t.optional(\n t.text({\n description:\n \"Custom migration name for drizzle-kit generate --custom\",\n }),\n ),\n }),\n handler: async ({ args, flags, root }) => {\n const commandFlags = flags.custom\n ? `--custom=${flags.custom}`\n : undefined;\n\n await this.runDrizzleKitCommand({\n root,\n args,\n command: \"generate\",\n commandFlags,\n provider: flags.provider,\n env: flags.mode,\n logMessage: (providerName, dialect) =>\n `Generate '${providerName}' migrations (${dialect}) ...`,\n });\n },\n });\n\n /**\n * Push database schema changes directly to the database\n *\n * - Loads the Alepha instance from the specified entry file.\n * - Retrieves all repository primitives to gather database models.\n * - Creates temporary entity definitions and Drizzle config.\n * - Invokes Drizzle Kit's push command to apply schema changes directly.\n */\n push = $command({\n name: \"push\",\n description: \"Push database schema changes directly to the database\",\n summary: false,\n args: t.optional(\n t.text({\n title: \"path\",\n description: \"Path to the Alepha server entry file\",\n }),\n ),\n flags: drizzleCommandFlags,\n handler: async ({ root, args, flags }) => {\n await this.runDrizzleKitCommand({\n root,\n args,\n command: \"push\",\n provider: flags.provider,\n env: flags.mode,\n logMessage: (providerName, dialect) =>\n `Push '${providerName}' schema (${dialect}) ...`,\n });\n },\n });\n\n /**\n * Apply pending database migrations\n *\n * - Loads the Alepha instance from the specified entry file.\n * - Retrieves all repository primitives to gather database models.\n * - Creates temporary entity definitions and Drizzle config.\n * - Invokes Drizzle Kit's migrate command to apply pending migrations.\n */\n migrate = $command({\n name: \"migrate\",\n description: \"Apply pending database migrations\",\n summary: false,\n args: t.optional(\n t.text({\n title: \"path\",\n description: \"Path to the Alepha server entry file\",\n }),\n ),\n flags: drizzleCommandFlags,\n handler: async ({ root, args, flags }) => {\n await this.runDrizzleKitCommand({\n root,\n args,\n command: \"migrate\",\n provider: flags.provider,\n env: flags.mode,\n logMessage: (providerName, dialect) =>\n `Migrate '${providerName}' database (${dialect}) ...`,\n });\n },\n });\n\n /**\n * Launch Drizzle Studio database browser\n *\n * - Loads the Alepha instance from the specified entry file.\n * - Retrieves all repository primitives to gather database models.\n * - Creates temporary entity definitions and Drizzle config.\n * - Invokes Drizzle Kit's studio command to launch the web-based database browser.\n */\n studio = $command({\n name: \"studio\",\n description: \"Launch Drizzle Studio database browser\",\n summary: false,\n args: t.optional(\n t.text({\n title: \"path\",\n description: \"Path to the Alepha server entry file\",\n }),\n ),\n flags: drizzleCommandFlags,\n handler: async ({ root, args, flags }) => {\n await this.runDrizzleKitCommand({\n root,\n args,\n command: \"studio\",\n provider: flags.provider,\n env: flags.mode,\n logMessage: (providerName, dialect) =>\n `Launch Studio for '${providerName}' (${dialect}) ...`,\n });\n },\n });\n\n /**\n * Parent command for database operations.\n */\n db = $command({\n name: \"db\",\n description: \"Database management commands\",\n children: [this.check, this.generate, this.push, this.migrate, this.studio],\n handler: async ({ help }) => {\n help();\n },\n });\n\n /**\n * Run a drizzle-kit command for all database providers in an Alepha instance.\n *\n * Iterates through all repository providers, prepares Drizzle config for each,\n * and executes the specified drizzle-kit command.\n *\n * @param options - Configuration including command to run, flags, and logging\n */\n public async runDrizzleKitCommand(options: {\n root: string;\n args?: string;\n command: string;\n commandFlags?: string;\n provider?: string;\n logMessage: (providerName: string, dialect: string) => string;\n env?: string;\n }): Promise<void> {\n const rootDir = options.root;\n\n const envFiles = [\".env\"];\n if (options.env) {\n envFiles.push(`.env.${options.env}`);\n }\n\n await this.utils.loadEnv(rootDir, envFiles);\n\n this.log.debug(`Using project root: ${rootDir}`);\n\n const { alepha, entry } = await this.utils.loadAlephaFromServerEntryFile(\n rootDir,\n options.args,\n );\n\n const drizzleKitProvider =\n alepha.inject<DrizzleKitProvider>(\"DrizzleKitProvider\");\n const repositoryProvider =\n alepha.inject<RepositoryProvider>(\"RepositoryProvider\");\n const accepted = new Set<string>([]);\n\n for (const primitive of repositoryProvider.getRepositories()) {\n const provider = primitive.provider;\n const providerName = provider.name;\n const dialect = provider.dialect;\n\n if (accepted.has(providerName)) {\n continue;\n }\n accepted.add(providerName);\n\n // Skip if provider filter is set and doesn't match\n if (options.provider && options.provider !== providerName) {\n this.log.debug(\n `Skipping provider '${providerName}' (filter: ${options.provider})`,\n );\n continue;\n }\n\n this.log.info(\"\");\n this.log.info(options.logMessage(providerName, dialect));\n\n const drizzleConfigJsPath = await this.prepareDrizzleConfig({\n kit: drizzleKitProvider,\n provider,\n providerName,\n providerUrl: provider.url,\n dialect,\n entry,\n rootDir,\n });\n\n const flags = options.commandFlags ? ` ${options.commandFlags}` : \"\";\n await this.utils.exec(\n `drizzle-kit ${options.command} --config=${drizzleConfigJsPath}${flags}`,\n {\n env: {\n NODE_OPTIONS: \"--import tsx\",\n },\n },\n );\n }\n }\n\n /**\n * Prepare Drizzle configuration files for a database provider.\n *\n * Creates temporary entities.js and drizzle.config.js files needed\n * for Drizzle Kit commands to run properly.\n *\n * @param options - Configuration options including kit, provider info, and paths\n * @returns Path to the generated drizzle.config.js file\n */\n public async prepareDrizzleConfig(options: {\n kit: any;\n provider: DatabaseProvider;\n providerName: string;\n providerUrl: string;\n dialect: string;\n entry: string;\n rootDir: string;\n }): Promise<string> {\n const models = Object.keys(options.kit.getModels(options.provider));\n const entitiesJs = this.utils.generateEntitiesJs(\n options.entry,\n options.providerName,\n models,\n );\n\n const entitiesJsPath = await this.utils.writeConfigFile(\n \"entities.js\",\n entitiesJs,\n options.rootDir,\n );\n\n const config: Record<string, any> = {\n schema: entitiesJsPath,\n out: `./migrations/${options.providerName}`,\n dialect: options.dialect,\n dbCredentials: {\n url: options.providerUrl,\n },\n };\n\n if (options.provider.schema) {\n config.schemaFilter = options.provider.schema;\n }\n\n if (options.providerName === \"d1\") {\n config.driver = \"d1-http\";\n }\n\n if (options.providerName === \"pglite\") {\n config.driver = \"pglite\";\n }\n\n if (options.dialect === \"sqlite\") {\n if (options.providerName === \"d1\") {\n const token = process.env.CLOUDFLARE_API_TOKEN;\n if (!token) {\n throw new AlephaError(\n \"CLOUDFLARE_API_TOKEN environment variable is not set. https://orm.drizzle.team/docs/guides/d1-http-with-drizzle-kit\",\n );\n }\n\n const accountId = process.env.CLOUDFLARE_ACCOUNT_ID;\n if (!accountId) {\n throw new AlephaError(\n \"CLOUDFLARE_ACCOUNT_ID environment variable is not set. https://orm.drizzle.team/docs/guides/d1-http-with-drizzle-kit\",\n );\n }\n\n const url = options.providerUrl;\n if (!url.startsWith(\"cloudflare-d1://\")) {\n throw new AlephaError(\n \"D1 provider URL must start with 'cloudflare-d1://'.\",\n );\n }\n\n const [, databaseId] = url\n .replace(\"cloudflare-d1://\", \"\")\n .replace(\"cloudflare-d1:\", \"\")\n .split(\":\");\n\n if (!databaseId) {\n throw new AlephaError(\n \"Database ID is missing in the D1 provider URL. Cloudflare D1 URL format: cloudflare-d1://<database_name>:<database_id>\",\n );\n }\n\n config.dbCredentials = {\n accountId,\n databaseId,\n token,\n };\n } else {\n let url = options.providerUrl;\n url = url.replace(\"sqlite://\", \"\").replace(\"file://\", \"\");\n url = join(options.rootDir, url);\n\n config.dbCredentials = {\n url,\n };\n }\n }\n\n const drizzleConfigJs = `export default ${JSON.stringify(config, null, 2)}`;\n\n return await this.utils.writeConfigFile(\n \"drizzle.config.js\",\n drizzleConfigJs,\n options.rootDir,\n );\n }\n\n // /**\n // * Drop database schema (development only)\n // *\n // * @experimental\n // */\n // drop = $command({\n // name: \"db:drop\",\n // description: \"Drop database schema (development only)\",\n // summary: false,\n // args: t.optional(\n // t.text({\n // title: \"path\",\n // description: \"Path to the Alepha server entry file\",\n // }),\n // ),\n // flags: drizzleCommandFlags,\n // handler: async ({ flags }) => {\n // // TODO: Implement db:drop\n // this.log.warn(\"db:drop is not yet implemented\");\n // if (flags.provider) {\n // this.log.info(`Provider filter: ${flags.provider}`);\n // }\n // },\n // });\n //\n // /**\n // * Seed database with initial data\n // *\n // * @experimental\n // */\n // seed = $command({\n // name: \"db:seed\",\n // description: \"Seed database with initial data\",\n // summary: false,\n // args: t.optional(\n // t.text({\n // title: \"path\",\n // description: \"Path to the Alepha server entry file\",\n // }),\n // ),\n // flags: drizzleCommandFlags,\n // handler: async ({ flags }) => {\n // // TODO: Implement db:seed\n // this.log.warn(\"db:seed is not yet implemented\");\n // if (flags.provider) {\n // this.log.info(`Provider filter: ${flags.provider}`);\n // }\n // },\n // });\n //\n // /**\n // * Show pending database migrations status\n // *\n // * @experimental\n // */\n // status = $command({\n // name: \"db:status\",\n // description: \"Show pending database migrations status\",\n // summary: false,\n // args: t.optional(\n // t.text({\n // title: \"path\",\n // description: \"Path to the Alepha server entry file\",\n // }),\n // ),\n // flags: drizzleCommandFlags,\n // handler: async ({ flags }) => {\n // // TODO: Implement db:status\n // this.log.warn(\"db:status is not yet implemented\");\n // if (flags.provider) {\n // this.log.info(`Provider filter: ${flags.provider}`);\n // }\n // },\n // });\n}\n","import { $inject } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\n\nexport class VerifyCommands {\n protected readonly utils = $inject(AlephaCliUtils);\n\n /**\n * Run a series of verification commands to ensure code quality and correctness.\n *\n * This command runs the following checks in order:\n * - Clean the project\n * - Format the code\n * - Lint the code\n * - Run tests (if Vitest is a dev dependency)\n * - Check database migrations (if a migrations directory exists)\n * - Type check the code\n * - Build the project\n * - Clean the project again\n */\n public readonly verify = $command({\n name: \"verify\",\n description: \"Verify the Alepha project\",\n handler: async ({ root, run }) => {\n await run(\"alepha clean\");\n await run(\"alepha format\");\n await run(\"alepha lint\");\n\n await run(\"alepha typecheck\");\n\n const pkg = await this.utils.readPackageJson(root);\n if (pkg.devDependencies?.vitest) {\n await run(\"alepha test\");\n }\n\n if (await this.utils.exists(root, \"migrations\")) {\n await run(\"alepha db:check-migrations\");\n }\n\n const isExpo = await this.utils.hasExpo(root);\n if (!isExpo) {\n await run(\"alepha build\");\n }\n await run(\"alepha clean\");\n },\n });\n\n /**\n * Run TypeScript type checking across the codebase with no emit.\n */\n public readonly typecheck = $command({\n name: \"typecheck\",\n description: \"Check TypeScript types across the codebase\",\n handler: async ({ root }) => {\n await this.utils.ensureDependency(root, \"typescript\");\n await this.utils.exec(\"tsc --noEmit\");\n },\n });\n}\n","import { access, readFile, unlink, writeFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { join } from \"node:path\";\nimport { $env, $inject, OPTIONS, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { $logger } from \"alepha/logger\";\nimport {\n boot,\n buildClient,\n buildServer,\n copyAssets,\n generateCloudflare,\n generateDocker,\n generateSitemap,\n generateVercel,\n prerenderPages,\n} from \"alepha/vite\";\nimport type * as Vite from \"vite\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\n\nexport class ViteCommands {\n protected readonly log = $logger();\n protected readonly utils = $inject(AlephaCliUtils);\n\n protected readonly env = $env(\n t.object({\n VITEST_ARGS: t.string({ default: \"\" }),\n }),\n );\n\n public readonly run = $command({\n name: \"run\",\n hide: true,\n description: \"Run a TypeScript file directly\",\n flags: t.object({\n watch: t.optional(\n t.boolean({ description: \"Watch file for changes\", alias: \"w\" }),\n ),\n }),\n summary: false,\n args: t.text({ title: \"path\", description: \"Filepath to run\" }),\n handler: async ({ args, flags, root }) => {\n await this.utils.ensureTsConfig(root);\n await this.utils.exec(`tsx ${flags.watch ? \"watch \" : \"\"}${args}`);\n },\n });\n\n /**\n * Will run the project in watch mode.\n *\n * - If an index.html file is found in the project root, it will run Vite in dev mode.\n * - Otherwise, it will look for a server entry file and run it with tsx in watch mode.\n */\n public readonly dev = $command({\n name: \"dev\",\n description: \"Run the project in development mode\",\n args: t.optional(t.text({ title: \"path\", description: \"Filepath to run\" })),\n handler: async ({ args, root }) => {\n const expo = await this.utils.hasExpo(root);\n\n await this.utils.ensureConfig(root, {\n viteConfigTs: !expo,\n tsconfigJson: true,\n });\n\n if (expo) {\n await this.utils.exec(`expo start`);\n return;\n }\n\n const entry = await boot.getServerEntry(root, args);\n this.log.trace(\"Entry file found\", { entry });\n\n try {\n await access(join(root, \"index.html\"));\n } catch {\n this.log.trace(\"No index.html found, running entry file with tsx\");\n let cmd = \"tsx --watch\";\n if (await this.utils.exists(root, \".env\")) {\n cmd += ` --env-file=./.env`;\n }\n cmd += ` ${entry}`;\n await this.utils.exec(cmd);\n return;\n }\n\n // Ensure vite is installed before running\n await this.utils.ensureDependency(root, \"vite\");\n await this.utils.exec(`vite`);\n },\n });\n\n public readonly build = $command({\n name: \"build\",\n description: \"Build the project for production\",\n args: t.optional(\n t.text({ title: \"path\", description: \"Filepath to build\" }),\n ),\n flags: t.object({\n stats: t.optional(\n t.boolean({\n description: \"Generate build stats report\",\n }),\n ),\n vercel: t.optional(\n t.boolean({\n description: \"Generate Vercel deployment configuration\",\n }),\n ),\n cloudflare: t.optional(\n t.boolean({\n description: \"Generate Cloudflare Workers configuration\",\n }),\n ),\n docker: t.optional(\n t.boolean({\n description: \"Generate Docker configuration\",\n }),\n ),\n sitemap: t.optional(\n t.text({\n description: \"Generate sitemap.xml with base URL\",\n }),\n ),\n }),\n handler: async ({ flags, args, run, root }) => {\n // Tell viteAlephaBuild plugin to skip - CLI handles all tasks\n process.env.ALEPHA_BUILD_MODE = \"cli\";\n process.env.NODE_ENV = \"production\";\n\n if (await this.utils.hasExpo(root)) {\n // will coming soon\n // 1. ensure \"expo prebuild\" is run\n return;\n }\n\n await this.utils.ensureConfig(root, {\n viteConfigTs: true,\n tsconfigJson: true,\n });\n\n const entry = await boot.getServerEntry(root, args);\n this.log.trace(\"Entry file found\", { entry });\n\n const distDir = \"dist\";\n const clientDir = \"public\";\n\n await this.utils.ensureDependency(root, \"vite\", {\n run,\n });\n\n await run.rm(\"dist\", {\n alias: \"clean dist\",\n });\n\n const vite: typeof Vite = createRequire(import.meta.url)(\"vite\");\n const config = await vite.resolveConfig({}, \"build\", \"production\");\n const alephaPlugin: any = config.plugins.find(\n (it) => it.name === \"alepha:build\",\n );\n const viteAlephaBuildOptions = alephaPlugin?.[OPTIONS] || {};\n\n await this.utils.loadEnv(root, [\".env\", \".env.production\"]);\n\n const stats = flags.stats ?? viteAlephaBuildOptions.stats ?? false;\n const hasServer = viteAlephaBuildOptions.serverEntry !== false;\n\n let hasClient = false;\n try {\n await access(join(root, \"index.html\"));\n hasClient = true;\n } catch {\n // No index.html\n }\n\n // Extract client options\n const clientOptions =\n typeof viteAlephaBuildOptions.client === \"object\"\n ? viteAlephaBuildOptions.client\n : {};\n\n // Build client\n if (hasClient) {\n await run({\n name: \"vite build client\",\n handler: () =>\n buildClient({\n silent: true,\n dist: `${distDir}/${clientDir}`,\n stats,\n precompress: clientOptions.precompress,\n }),\n });\n }\n\n // Build server\n await run({\n name: \"vite build server\",\n handler: async () => {\n // Check if client template exists\n let clientBuilt = false;\n try {\n await readFile(`${distDir}/${clientDir}/index.html`, \"utf-8\");\n clientBuilt = true;\n } catch {\n // No client build\n }\n\n await buildServer({\n silent: true,\n entry,\n distDir,\n clientDir: clientBuilt ? clientDir : undefined,\n stats,\n });\n\n // Server will handle index.html if both client & server are built\n if (clientBuilt && hasServer) {\n await unlink(`${distDir}/${clientDir}/index.html`);\n }\n },\n });\n\n // Copy assets\n await copyAssets({\n root,\n entry: `${distDir}/index.js`,\n distDir,\n run,\n });\n\n if (hasClient) {\n // Generate sitemap\n const sitemapBaseUrl = flags.sitemap ?? clientOptions.sitemap?.hostname;\n\n if (sitemapBaseUrl) {\n await run({\n name: \"add sitemap\",\n handler: async () => {\n await writeFile(\n `${distDir}/${clientDir}/sitemap.xml`,\n await generateSitemap({\n entry: `${distDir}/index.js`,\n baseUrl: sitemapBaseUrl,\n }),\n );\n },\n });\n }\n\n // Pre-render static pages\n const shouldPrerender = clientOptions.prerender;\n\n if (shouldPrerender) {\n await run({\n name: \"pre-render pages\",\n handler: async () => {\n await prerenderPages({\n dist: `${distDir}/${clientDir}`,\n entry: `${distDir}/index.js`,\n compress: clientOptions.precompress,\n });\n },\n });\n }\n }\n\n // Generate deployment configurations\n if (flags.vercel || viteAlephaBuildOptions.vercel) {\n const config =\n typeof viteAlephaBuildOptions.vercel === \"object\"\n ? viteAlephaBuildOptions.vercel\n : {};\n await run({\n name: \"add Vercel config\",\n handler: () =>\n generateVercel({\n distDir,\n clientDir,\n config,\n }),\n });\n }\n\n if (flags.cloudflare || viteAlephaBuildOptions.cloudflare) {\n const config =\n typeof viteAlephaBuildOptions.cloudflare === \"boolean\"\n ? {}\n : viteAlephaBuildOptions.cloudflare;\n await run({\n name: \"add Cloudflare config\",\n handler: () =>\n generateCloudflare({\n distDir,\n config,\n }),\n });\n }\n\n if (flags.docker || viteAlephaBuildOptions.docker) {\n const dockerConfig =\n typeof viteAlephaBuildOptions.docker === \"object\"\n ? viteAlephaBuildOptions.docker\n : {};\n await run({\n name: \"add Docker config\",\n handler: () =>\n generateDocker({\n distDir,\n ...dockerConfig,\n }),\n });\n }\n },\n });\n\n public readonly test = $command({\n name: \"test\",\n description: \"Run tests using Vitest\",\n flags: t.object({\n config: t.optional(\n t.string({\n description: \"Path to Vitest config file\",\n alias: \"c\",\n }),\n ),\n }),\n env: t.object({\n VITEST_ARGS: t.optional(\n t.string({\n default: \"\",\n description:\n \"Additional arguments to pass to Vitest. E.g., --coverage\",\n }),\n ),\n }),\n handler: async ({ root, flags, env }) => {\n await this.utils.ensureConfig(root, {\n tsconfigJson: true,\n viteConfigTs: true,\n });\n\n // Ensure vitest is installed before running\n await this.utils.ensureDependency(root, \"vitest\");\n\n const config = flags.config ? `--config=${flags.config}` : \"\";\n\n await this.utils.exec(`vitest run ${config} ${env.VITEST_ARGS}`);\n },\n });\n}\n","import { join } from \"node:path\";\nimport { $hook, $inject, $module, Alepha } from \"alepha\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport { BiomeCommands } from \"../commands/BiomeCommands.ts\";\nimport { ChangelogCommands } from \"../commands/ChangelogCommands.ts\";\nimport { CoreCommands } from \"../commands/CoreCommands.ts\";\nimport { DeployCommands } from \"../commands/DeployCommands.ts\";\nimport { DrizzleCommands } from \"../commands/DrizzleCommands.ts\";\nimport { VerifyCommands } from \"../commands/VerifyCommands.ts\";\nimport { ViteCommands } from \"../commands/ViteCommands.ts\";\n\nclass AlephaCliExtension {\n protected readonly alepha = $inject(Alepha);\n protected readonly fs = $inject(FileSystemProvider);\n\n protected readonly onConfigure = $hook({\n on: \"configure\",\n handler: async () => {\n const root = process.cwd();\n const extensionPath = join(root, \"alepha.config.ts\");\n const hasExtension = await this.fs.exists(extensionPath);\n if (!hasExtension) {\n return;\n }\n\n // import\n const { default: Extension } = await import(extensionPath);\n if (typeof Extension !== \"function\") {\n return;\n }\n\n this.alepha.inject(Extension, {\n args: [this.alepha],\n });\n },\n });\n}\n\nexport const AlephaCli = $module({\n name: \"alepha.cli\",\n services: [\n AlephaCliExtension,\n BiomeCommands,\n ChangelogCommands,\n CoreCommands,\n DeployCommands,\n DrizzleCommands,\n VerifyCommands,\n ViteCommands,\n ],\n});\n","import { access, readdir, readFile } from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport { join } from \"node:path\";\nimport { $inject } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport type { InlineConfig } from \"tsdown\";\n\ninterface Module {\n name: string;\n dependencies: string[];\n native?: boolean;\n browser?: boolean;\n node?: boolean;\n}\n\nexport class AlephaPackageBuilderCli {\n src = \"src\";\n dist = \"dist\";\n fs = $inject(FileSystemProvider);\n\n make = $command({\n root: true,\n handler: async ({ run, root }) => {\n const modules: Array<Module> = [];\n\n const pkg = await readFile(\"package.json\", \"utf-8\");\n const pkgData = JSON.parse(pkg);\n const packageName = pkgData.name as string;\n\n await run(\"analyze modules\", async () => {\n modules.push(\n ...(await analyzeModules(join(root, this.src), packageName)),\n );\n });\n\n pkgData.exports = {};\n\n for (const item of modules) {\n let m = `./${item.name.replace(\"core\", \"\")}`;\n if (m.endsWith(\"/\")) m = m.slice(0, -1);\n const path = m;\n\n pkgData.exports[path] = {};\n // order is important here for compatibility\n pkgData.exports[path].types = `./src/${item.name}/index.ts`;\n if (item.native) {\n pkgData.exports[path][\"react-native\"] =\n `./src/${item.name}/index.native.ts`;\n } else if (item.browser) {\n pkgData.exports[path][\"react-native\"] =\n `./src/${item.name}/index.browser.ts`;\n }\n\n if (item.browser) {\n pkgData.exports[path].browser = `./src/${item.name}/index.browser.ts`;\n }\n\n pkgData.exports[path].import = `./src/${item.name}/index.ts`;\n pkgData.exports[path].default = `./src/${item.name}/index.ts`;\n }\n\n if (packageName === \"alepha\") {\n pkgData.exports[\"./tsconfig.base\"] = \"./tsconfig.base.json\";\n pkgData.exports[\"./package.json\"] = \"./package.json\";\n }\n\n if (packageName === \"@alepha/ui\") {\n pkgData.exports[\"./styles\"] = \"./styles.css\";\n }\n\n await this.fs.writeFile(\"package.json\", JSON.stringify(pkgData, null, 2));\n\n const tmpDir = join(root, \"node_modules/.alepha\");\n await this.fs.mkdir(tmpDir, { recursive: true }).catch(() => {});\n\n await this.fs.writeFile(\n join(tmpDir, \"module-dependencies.json\"),\n JSON.stringify(modules, null, 2),\n );\n\n const tsconfig = await readFile(\n join(root, \"../../tsconfig.json\"),\n \"utf-8\",\n );\n\n const external: string[] = Object.keys(\n JSON.parse(tsconfig).compilerOptions.paths,\n );\n\n external.push(\"bun\");\n external.push(\"bun:sqlite\");\n\n await run.rm(this.dist);\n\n const build = async (item: Module) => {\n const entries: InlineConfig[] = [];\n const src = join(root, this.src, item.name);\n const dest = join(root, this.dist, item.name);\n\n entries.push({\n entry: join(src, \"index.ts\"),\n outDir: dest,\n format: [\"esm\"],\n sourcemap: true,\n fixedExtension: false,\n platform: \"node\", // TODO: node must be enabled only if index.node.ts exists\n external,\n dts: {\n sourcemap: true,\n resolve: false,\n },\n });\n\n if (item.native) {\n entries.push({\n entry: join(src, \"index.native.ts\"),\n outDir: dest,\n platform: \"neutral\",\n sourcemap: true,\n dts: false,\n external,\n });\n }\n\n if (item.browser) {\n entries.push({\n entry: join(src, \"index.browser.ts\"),\n outDir: dest,\n platform: \"browser\",\n sourcemap: true,\n dts: false,\n external,\n });\n }\n\n const config = join(\n tmpDir,\n `tsdown-${item.name.replace(\"/\", \"-\")}.config.js`,\n );\n await this.fs.writeFile(\n config,\n `export default ${JSON.stringify(entries, null, 2)};`,\n );\n await run(`npx tsdown -c=${config}`);\n //await this.fs.rm(config);\n };\n\n const concurrency = Math.ceil(os.cpus().length / 2);\n const queue = modules.slice();\n const workers: Promise<void>[] = [];\n for (let i = 0; i < concurrency; i++) {\n const worker = (async () => {\n while (queue.length > 0) {\n const item = queue.shift();\n if (item) {\n await build(item);\n } else {\n await new Promise((r) => setTimeout(r, 100));\n }\n }\n })();\n workers.push(worker);\n }\n await Promise.all(workers);\n },\n });\n}\n\nasync function getAllFiles(dir: string): Promise<string[]> {\n const files: string[] = [];\n\n async function scan(currentDir: string) {\n const entries = await readdir(currentDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(currentDir, entry.name);\n\n if (entry.isDirectory()) {\n await scan(fullPath);\n } else if (entry.isFile() && /\\.(ts|tsx)$/.test(entry.name)) {\n files.push(fullPath);\n }\n }\n }\n\n await scan(dir);\n return files;\n}\n\nfunction removeComments(content: string): string {\n // Remove single-line comments\n let cleaned = content.replace(/\\/\\/.*$/gm, \"\");\n\n // Remove multi-line comments\n cleaned = cleaned.replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\");\n\n return cleaned;\n}\n\nfunction extractAlephaDependencies(\n content: string,\n packageName: string,\n moduleName: string,\n): string[] {\n const deps = new Set<string>();\n const cleanedContent = removeComments(content);\n\n // Match: from \"alepha/xxx\" or from 'alepha/xxx'\n const importRegex = new RegExp(\n `from \"${packageName}/([a-zA-Z0-9_/]+)\";`,\n \"g\",\n );\n\n const matches = cleanedContent.matchAll(importRegex);\n for (const match of matches) {\n deps.add(match[1]);\n }\n\n return Array.from(deps);\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction detectCircularDependencies(modules: Module[]): void {\n const moduleMap = new Map(modules.map((m) => [m.name, m.dependencies]));\n\n function hasCycle(\n moduleName: string,\n visited: Set<string> = new Set(),\n path: string[] = [],\n ): string[] | null {\n if (visited.has(moduleName)) {\n // Found a cycle, return the path\n const cycleStart = path.indexOf(moduleName);\n return [...path.slice(cycleStart), moduleName];\n }\n\n const deps = moduleMap.get(moduleName);\n if (!deps) return null;\n\n visited.add(moduleName);\n path.push(moduleName);\n\n for (const dep of deps) {\n const cycle = hasCycle(dep, new Set(visited), [...path]);\n if (cycle) return cycle;\n }\n\n return null;\n }\n\n for (const module of modules) {\n const cycle = hasCycle(module.name);\n if (cycle) {\n throw new Error(`Circular dependency detected: ${cycle.join(\" -> \")}`);\n }\n }\n}\n\nexport async function analyzeModules(\n srcDir: string,\n packageName: string,\n): Promise<Module[]> {\n const modules: Module[] = [];\n\n async function scanDirectory(dir: string, prefix: string): Promise<void> {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const moduleName = prefix ? `${prefix}/${entry.name}` : entry.name;\n const modulePath = join(dir, entry.name);\n\n // Check if this directory has an index.ts (is a module)\n const hasIndex = await fileExists(join(modulePath, \"index.ts\"));\n\n if (hasIndex) {\n // This is a module\n const dependencies = new Set<string>();\n\n // Check for browser/node entry points\n const hasBrowser = await fileExists(\n join(modulePath, \"index.browser.ts\"),\n );\n const hasNative = await fileExists(\n join(modulePath, \"index.native.ts\"),\n );\n const hasNode = await fileExists(join(modulePath, \"index.node.ts\"));\n\n // Get all .ts/.tsx files in this module\n const files = await getAllFiles(modulePath);\n\n for (const file of files) {\n const content = await readFile(file, \"utf-8\");\n const deps = extractAlephaDependencies(\n content,\n packageName,\n moduleName,\n );\n for (const dep of deps) {\n if (dep.endsWith(\".ts\")) {\n throw new Error(\n `Invalid dependency '${dep}' in module '${moduleName}'. Do not include file extensions in Alepha module imports.`,\n );\n }\n if (dep.includes(\"-\")) {\n throw new Error(\n `Invalid dependency '${dep}' in module '${moduleName}'. Use '/' instead of '-' in Alepha module imports.`,\n );\n }\n dependencies.add(dep);\n }\n }\n\n const module: Module = {\n name: moduleName,\n dependencies: Array.from(dependencies),\n };\n\n if (hasNative) module.native = true;\n if (hasBrowser) module.browser = true;\n if (hasNode) module.node = true;\n\n modules.push(module);\n } else {\n // No index.ts, check subdirectories for modules\n await scanDirectory(modulePath, moduleName);\n }\n }\n }\n }\n\n await scanDirectory(srcDir, \"\");\n\n // Check for circular dependencies\n detectCircularDependencies(modules);\n\n return modules;\n}\n","import type { Alepha } from \"alepha\";\nimport type { CommandPrimitive } from \"alepha/command\";\n\nexport type AlephaCliConfig = (alepha: Alepha) => {\n commands?: Record<string, CommandPrimitive>;\n};\n\nexport const defineConfig = (config: AlephaCliConfig) => {\n return (alepha: Alepha) => {\n const { commands } = config(alepha);\n return {\n ...commands,\n };\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["app","args","packageJson"],"sources":["../../src/cli/assets/appRouterTs.ts","../../src/cli/assets/biomeJson.ts","../../src/cli/assets/dummySpecTs.ts","../../src/cli/assets/editorconfig.ts","../../src/cli/assets/indexHtml.ts","../../src/cli/assets/mainBrowserTs.ts","../../src/cli/assets/mainTs.ts","../../src/cli/assets/tsconfigJson.ts","../../src/cli/assets/viteConfigTs.ts","../../src/cli/version.ts","../../src/cli/services/AlephaCliUtils.ts","../../src/cli/commands/build.ts","../../src/cli/commands/clean.ts","../../src/cli/commands/db.ts","../../src/cli/commands/deploy.ts","../../src/cli/commands/dev.ts","../../src/cli/commands/format.ts","../../src/cli/atoms/changelogOptions.ts","../../src/cli/services/GitMessageParser.ts","../../src/cli/commands/gen/changelog.ts","../../src/cli/commands/gen/openapi.ts","../../src/cli/commands/gen.ts","../../src/cli/commands/init.ts","../../src/cli/commands/lint.ts","../../src/cli/commands/root.ts","../../src/cli/commands/run.ts","../../src/cli/commands/test.ts","../../src/cli/commands/typecheck.ts","../../src/cli/commands/verify.ts","../../src/cli/apps/AlephaCli.ts","../../src/cli/apps/AlephaPackageBuilderCli.ts","../../src/cli/defineConfig.ts"],"sourcesContent":["export const appRouterTs = () => `\nimport { $page } from \"@alepha/react/router\";\n\nexport class AppRouter {\n home = $page({\n component: () => \"Hello World\",\n });\n}\n`.trim();\n","export const biomeJson = `\n{\n \"$schema\": \"https://biomejs.dev/schemas/latest/schema.json\",\n \"vcs\": {\n \"enabled\": true,\n \"clientKind\": \"git\"\n },\n \"files\": {\n \"ignoreUnknown\": true,\n \"includes\": [\"**\", \"!node_modules\", \"!dist\"]\n },\n \"formatter\": {\n \"enabled\": true,\n \"useEditorconfig\": true\n },\n \"linter\": {\n \"enabled\": true,\n \"rules\": {\n \"recommended\": true\n },\n \"domains\": {\n \"react\": \"recommended\"\n }\n },\n \"assist\": {\n \"actions\": {\n \"source\": {\n \"organizeImports\": \"on\"\n }\n }\n }\n}\n`.trim();\n","export const dummySpecTs = () => `\nimport { test, expect } from \"vitest\";\n\ntest(\"dummy test\", () => {\n expect(1 + 1).toBe(2);\n});\n`.trim();\n","export const editorconfig = `\n# https://editorconfig.org\n\nroot = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\nindent_style = space\nindent_size = 2\n`.trim();\n","export const indexHtml = (\n browserEntry: string,\n) => `\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <title>App</title>\n</head>\n<body>\n<div id=\"root\"></div>\n<script type=\"module\" src=\"${browserEntry}\"></script>\n</body>\n</html>\n`.trim();\n","export const mainBrowserTs = () => `\nimport { Alepha, run } from \"alepha\";\nimport { AppRouter } from \"./AppRouter.ts\";\n\nconst alepha = Alepha.create();\n\nalepha.with(AppRouter);\n\nrun(alepha);\n`.trim();\n","export const mainTs = () => `\nimport { run } from \"alepha\";\nimport { $route } from \"alepha/server\";\n\nclass App {\n root = $route({\n path: \"/\",\n handler: () => \"Hello, Alepha!\",\n });\n}\n\nrun(App);\n`.trim();\n","export const tsconfigJson = `\n{\n \"extends\": \"alepha/tsconfig.base\"\n}\n`.trim();\n","export const viteConfigTs = (\n serverEntry?: string,\n) => `\nimport { viteAlepha } from \"alepha/vite\";\n\nexport default {\n plugins: [\n viteAlepha(${serverEntry ? `{ serverEntry: \"${serverEntry}\" }` : \"\"}),\n ],\n test: {\n globals: true,\n },\n};\n`.trim();\n","import { readFileSync } from \"node:fs\";\n\nconst packageJson = JSON.parse(\n readFileSync(new URL(\"../../package.json\", import.meta.url), \"utf-8\"),\n);\n\nexport const version = packageJson.version;\n","import { spawn } from \"node:child_process\";\nimport { access, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { $inject, Alepha, AlephaError } from \"alepha\";\nimport { EnvUtils, type RunnerMethod } from \"alepha/command\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport { $logger } from \"alepha/logger\";\nimport { boot } from \"alepha/vite\";\nimport { appRouterTs } from \"../assets/appRouterTs.ts\";\nimport { biomeJson } from \"../assets/biomeJson.ts\";\nimport { dummySpecTs } from \"../assets/dummySpecTs.ts\";\nimport { editorconfig } from \"../assets/editorconfig.ts\";\nimport { indexHtml } from \"../assets/indexHtml.ts\";\nimport { mainBrowserTs } from \"../assets/mainBrowserTs.ts\";\nimport { mainTs } from \"../assets/mainTs.ts\";\nimport { tsconfigJson } from \"../assets/tsconfigJson.ts\";\nimport { viteConfigTs } from \"../assets/viteConfigTs.ts\";\nimport { version } from \"../version.ts\";\n\n/**\n * Utility service for common project operations used by CLI commands.\n *\n * This service provides helper methods for:\n * - Project configuration file management (tsconfig.json, package.json, etc.)\n * - Package manager setup (Yarn, npm, pnpm)\n * - Sample project downloading\n * - Drizzle ORM/Kit utilities\n * - Alepha instance loading\n */\nexport class AlephaCliUtils {\n protected readonly log = $logger();\n protected readonly fs = $inject(FileSystemProvider);\n protected readonly envUtils = $inject(EnvUtils);\n protected readonly alepha = $inject(Alepha);\n\n /**\n * Execute a command using npx with inherited stdio.\n *\n * @example\n * ```ts\n * const runner = alepha.inject(ProcessRunner);\n * await runner.exec(\"tsx watch src/index.ts\");\n * ```\n */\n public async exec(\n command: string,\n options: {\n env?: Record<string, string>;\n global?: boolean;\n } = {},\n ): Promise<void> {\n const root = process.cwd();\n this.log.debug(`Executing command: ${command}`, { cwd: root });\n\n const runExec = async (app: string, args: string[]) => {\n const prog = spawn(app, args, {\n stdio: \"inherit\",\n cwd: root,\n env: {\n ...process.env,\n ...options.env,\n },\n });\n\n await new Promise<void>((resolve) =>\n prog.on(\"exit\", () => {\n resolve();\n }),\n );\n };\n\n if (options.global) {\n const [app, ...args] = command.split(\" \");\n await runExec(app, args);\n return;\n }\n\n const suffix = process.platform === \"win32\" ? \".cmd\" : \"\";\n const [app, ...args] = command.split(\" \");\n\n // find executable inside project node_modules\n let execPath = await this.checkFileExists(\n root,\n `node_modules/.bin/${app}${suffix}`,\n true,\n );\n\n // or, find executable inside alepha package node_modules (pnpm style)\n if (!execPath) {\n execPath = await this.checkFileExists(\n root,\n `node_modules/alepha/node_modules/.bin/${app}${suffix}`,\n true,\n );\n }\n\n if (!execPath) {\n throw new AlephaError(\n `Could not find executable for command '${app}'. Make sure the package is installed.`,\n );\n }\n\n await runExec(execPath, args);\n }\n\n /**\n * Write a configuration file to node_modules/.alepha directory.\n *\n * Creates the .alepha directory if it doesn't exist and writes the file with the given content.\n *\n * @param name - The name of the config file to create\n * @param content - The content to write to the file\n * @param root - The root directory (defaults to process.cwd())\n * @returns The absolute path to the created file\n *\n * @example\n * ```ts\n * const runner = alepha.inject(ProcessRunner);\n * const configPath = await runner.writeConfigFile(\"biome.json\", biomeConfig);\n * ```\n */\n public async writeConfigFile(\n name: string,\n content: string,\n root = process.cwd(),\n ): Promise<string> {\n const dir = join(root, \"node_modules\", \".alepha\");\n\n await mkdir(dir, {\n recursive: true,\n }).catch(() => null);\n\n const path = join(dir, name);\n await writeFile(path, content);\n\n this.log.debug(`Config file written: ${path}`);\n\n return path;\n }\n\n // ===================================================================================================================\n // Package Manager & Project Setup\n // ===================================================================================================================\n\n public async removeFiles(root: string, files: string[]): Promise<void> {\n await Promise.all(\n files.map((file) =>\n this.fs.rm(join(root, file), { force: true, recursive: true }),\n ),\n );\n }\n\n public async removeYarn(root: string): Promise<void> {\n await this.removeFiles(root, [\".yarn\", \".yarnrc.yml\", \".yarn\"]);\n }\n\n public async removePnpm(root: string): Promise<void> {\n await this.removeFiles(root, [\"pnpm-lock.yaml\", \"pnpm-workspace.yaml\"]);\n }\n\n public async removeNpm(root: string): Promise<void> {\n await this.removeFiles(root, [\"package-lock.json\"]);\n }\n\n public async removeBun(root: string): Promise<void> {\n await this.removeFiles(root, [\"bun.lockb\"]);\n }\n\n public async removeAllPmFilesExcept(\n root: string,\n except: string,\n ): Promise<void> {\n if (except !== \"yarn\") await this.removeYarn(root);\n if (except !== \"pnpm\") await this.removePnpm(root);\n if (except !== \"npm\") await this.removeNpm(root);\n if (except !== \"bun\") await this.removeBun(root);\n }\n\n /**\n * Ensure Yarn is configured in the project directory.\n *\n * Creates a .yarnrc.yml file with node-modules linker if it doesn't exist.\n *\n * @param root - The root directory of the project\n */\n public async ensureYarn(root: string): Promise<void> {\n await this.ensureFileExists(\n root,\n \".yarnrc.yml\",\n \"nodeLinker: node-modules\",\n false,\n );\n\n await this.removeAllPmFilesExcept(root, \"yarn\");\n }\n\n public async ensureBun(root: string): Promise<void> {\n await this.removeAllPmFilesExcept(root, \"bun\");\n }\n\n public async ensurePnpm(root: string): Promise<void> {\n await this.removeAllPmFilesExcept(root, \"pnpm\");\n }\n\n public async ensureNpm(root: string): Promise<void> {\n await this.removeAllPmFilesExcept(root, \"npm\");\n }\n\n /**\n * Generate package.json content with Alepha dependencies.\n *\n * @param modes - Configuration for which dependencies to include\n * @returns Package.json partial with dependencies, devDependencies, and scripts\n */\n public generatePackageJsonContent(modes: DependencyModes): {\n dependencies: Record<string, string>;\n devDependencies: Record<string, string>;\n scripts: Record<string, string>;\n type: \"module\";\n } {\n const dependencies: Record<string, string> = {\n alepha: `^${version}`,\n };\n\n const devDependencies: Record<string, string> = {};\n\n const scripts: Record<string, string> = {\n dev: \"alepha dev\",\n build: \"alepha build\",\n lint: \"alepha lint\",\n typecheck: \"alepha typecheck\",\n verify: \"alepha verify\",\n };\n\n if (modes.ui) {\n dependencies[\"@alepha/ui\"] = `^${version}`;\n modes.react = true;\n }\n\n if (modes.react) {\n dependencies[\"@alepha/react\"] = `^${version}`;\n dependencies.react = \"^19.2.0\";\n dependencies[\"react-dom\"] = \"^19.2.0\";\n devDependencies[\"@types/react\"] = \"^19.2.0\";\n }\n\n return {\n type: \"module\",\n dependencies,\n devDependencies,\n scripts,\n };\n }\n\n /**\n * Ensure package.json exists and has correct configuration.\n *\n * Creates a new package.json if none exists, or updates an existing one to:\n * - Set \"type\": \"module\"\n * - Add Alepha dependencies\n * - Add standard scripts\n *\n * @param root - The root directory of the project\n * @param modes - Configuration for which dependencies to include\n */\n public async ensurePackageJson(\n root: string,\n modes: DependencyModes,\n ): Promise<object> {\n const packageJsonPath = join(root, \"package.json\");\n try {\n await access(packageJsonPath);\n } catch (error) {\n const obj = this.generatePackageJsonContent(modes);\n await writeFile(packageJsonPath, JSON.stringify(obj, null, 2));\n return obj;\n }\n\n const content = await readFile(packageJsonPath, \"utf8\");\n const packageJson = JSON.parse(content);\n\n const newPackageJson = this.generatePackageJsonContent(modes);\n\n packageJson.type = \"module\";\n packageJson.dependencies ??= {};\n packageJson.devDependencies ??= {};\n packageJson.scripts ??= {};\n\n Object.assign(packageJson.dependencies, newPackageJson.dependencies);\n Object.assign(packageJson.devDependencies, newPackageJson.devDependencies);\n Object.assign(packageJson.scripts, newPackageJson.scripts);\n\n await writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));\n\n return packageJson;\n }\n\n public async ensureConfig(\n root: string,\n opts: {\n packageJson?: boolean | DependencyModes;\n tsconfigJson?: boolean;\n viteConfigTs?: boolean;\n indexHtml?: boolean;\n biomeJson?: boolean;\n editorconfig?: boolean;\n },\n ): Promise<Array<void | object>> {\n const tasks: Promise<void | object>[] = [];\n\n if (opts.packageJson) {\n tasks.push(\n this.ensurePackageJson(\n root,\n typeof opts.packageJson === \"boolean\" ? {} : opts.packageJson,\n ),\n );\n }\n if (opts.tsconfigJson) {\n tasks.push(this.ensureTsConfig(root));\n }\n if (opts.viteConfigTs) {\n tasks.push(this.ensureViteConfig(root));\n }\n if (opts.indexHtml) {\n tasks.push(this.ensureIndexHtml(root));\n }\n if (opts.biomeJson) {\n tasks.push(this.ensureBiomeConfig(root));\n }\n if (opts.editorconfig) {\n tasks.push(this.ensureEditorConfig(root));\n }\n\n return await Promise.all(tasks);\n }\n\n /**\n * Ensure tsconfig.json exists in the project.\n *\n * Creates a standard Alepha tsconfig.json if none exists.\n *\n * @param root - The root directory of the project\n */\n public async ensureTsConfig(root: string): Promise<void> {\n await this.ensureFileExists(root, \"tsconfig.json\", tsconfigJson, true);\n }\n\n /**\n * Ensure vite.config.ts exists in the project.\n *\n * Creates a standard Alepha vite.config.ts if none exists.\n */\n public async ensureViteConfig(\n root: string,\n serverEntry?: string,\n ): Promise<void> {\n await this.ensureFileExists(\n root,\n \"vite.config.ts\",\n viteConfigTs(serverEntry),\n false,\n );\n }\n\n protected async checkFileExists(\n root: string,\n name: string,\n checkParentDirectories: boolean = false,\n ): Promise<string | undefined> {\n const configPath = join(root, name);\n if (!checkParentDirectories) {\n try {\n await access(configPath);\n return configPath;\n } catch {\n return;\n }\n }\n\n let currentDir = root;\n const maxIterations = 10; // safety to prevent infinite loops\n let level = 0;\n\n while (level < maxIterations) {\n try {\n const maybe = join(currentDir, name);\n await access(maybe);\n return maybe;\n } catch {\n const parentDir = join(currentDir, \"..\");\n if (parentDir === currentDir) {\n break;\n }\n currentDir = parentDir;\n }\n level += 1;\n }\n }\n\n protected async ensureFileExists(\n root: string,\n name: string,\n content: string,\n checkParentDirectories: boolean = false,\n ): Promise<void> {\n const found = await this.checkFileExists(\n root,\n name,\n checkParentDirectories,\n );\n\n if (!found) {\n await writeFile(join(root, name), content);\n }\n }\n\n // ===================================================================================================================\n // Biome Configuration\n // ===================================================================================================================\n\n /**\n * Get the path to Biome configuration file.\n *\n * Looks for an existing biome.json in the project root, or creates one if it doesn't exist.\n */\n public async ensureBiomeConfig(root: string): Promise<void> {\n await this.ensureFileExists(root, \"biome.json\", biomeJson, true);\n }\n\n /**\n * Ensure .editorconfig exists in the project.\n *\n * Creates a standard .editorconfig if none exists.\n *\n * @param root - The root directory of the project\n */\n public async ensureEditorConfig(root: string): Promise<void> {\n await this.ensureFileExists(root, \".editorconfig\", editorconfig, true);\n }\n\n // ===================================================================================================================\n // Drizzle ORM & Kit Utilities\n // ===================================================================================================================\n\n /**\n * Load Alepha instance from a server entry file.\n *\n * Dynamically imports the server entry file and extracts the Alepha instance.\n * Skips the automatic start process.\n *\n * @param rootDir - The root directory of the project\n * @param explicitEntry - Optional explicit path to the entry file\n * @returns Object containing the Alepha instance and the entry file path\n * @throws {AlephaError} If the Alepha instance cannot be found\n */\n public async loadAlephaFromServerEntryFile(\n rootDir?: string,\n explicitEntry?: string,\n ): Promise<{\n alepha: Alepha;\n entry: string;\n }> {\n process.env.ALEPHA_CLI_IMPORT = \"true\";\n\n const entry = await boot.getServerEntry(rootDir, explicitEntry);\n\n delete (global as any).__alepha;\n\n const mod = await import(entry);\n\n this.log.debug(`Load entry: ${entry}`);\n\n // check if alepha is correctly exported\n if (mod.default instanceof Alepha) {\n return {\n alepha: mod.default,\n entry,\n };\n }\n\n // else, try with global variable\n const g: any = global;\n if (g.__alepha) {\n return {\n alepha: g.__alepha,\n entry,\n };\n }\n\n throw new AlephaError(\n `Could not find Alepha instance in entry file: ${entry}`,\n );\n }\n\n /**\n * Generate JavaScript code for Drizzle entities export.\n *\n * Creates a temporary entities.js file that imports from the entry file\n * and exports database models for Drizzle Kit to process.\n *\n * @param entry - Path to the server entry file\n * @param provider - Name of the database provider\n * @param models - Array of model names to export\n * @returns JavaScript code as a string\n */\n public generateEntitiesJs(\n entry: string,\n provider: string,\n models: string[] = [],\n ): string {\n return `\nimport \"${entry}\";\nimport { DrizzleKitProvider, Repository } from \"alepha/orm\";\n\nconst alepha = globalThis.__alepha;\nconst kit = alepha.inject(DrizzleKitProvider);\nconst provider = alepha.services(Repository).find((it) => it.provider.name === \"${provider}\").provider;\nconst models = kit.getModels(provider);\n\n${models.map((it: string) => `export const ${it} = models[\"${it}\"];`).join(\"\\n\")}\n\n`.trim();\n }\n\n /**\n * Load environment variables from a .env file.\n *\n * Reads the .env file in the specified root directory and sets\n * the environment variables in process.env.\n */\n public async loadEnv(\n root: string,\n files: string[] = [\".env\"],\n ): Promise<void> {\n await this.envUtils.loadEnv(root, files);\n }\n\n public async getPackageManager(\n root: string,\n flags?: { yarn?: boolean; pnpm?: boolean; npm?: boolean; bun?: boolean },\n ): Promise<\"yarn\" | \"pnpm\" | \"npm\" | \"bun\"> {\n if (flags?.yarn) {\n return \"yarn\";\n }\n if (flags?.pnpm) {\n return \"pnpm\";\n }\n if (flags?.npm) {\n return \"npm\";\n }\n if (flags?.bun) {\n return \"bun\";\n }\n if (this.alepha.isBun()) {\n return \"bun\";\n }\n if (await this.checkFileExists(root, \"yarn.lock\", true)) {\n return \"yarn\";\n }\n if (await this.checkFileExists(root, \"pnpm-lock.yaml\", true)) {\n return \"pnpm\";\n }\n return \"npm\";\n }\n\n public async ensureIndexHtml(root: string) {\n if (await this.fs.exists(join(root, \"index.html\"))) {\n return;\n }\n\n const serverEntry = \"src/main.server.ts\";\n const browserEntry = \"src/main.browser.ts\";\n const appRouter = \"src/AppRouter.ts\";\n\n await this.fs.writeFile(join(root, \"index.html\"), indexHtml(browserEntry));\n\n try {\n await this.fs.mkdir(join(root, \"src\"), { recursive: true });\n } catch {}\n\n if (!(await this.fs.exists(join(root, browserEntry)))) {\n await this.fs.writeFile(join(root, browserEntry), mainBrowserTs());\n }\n\n if (!(await this.fs.exists(join(root, serverEntry)))) {\n await this.fs.writeFile(join(root, serverEntry), mainBrowserTs());\n }\n\n if (!(await this.fs.exists(join(root, appRouter)))) {\n await this.fs.writeFile(join(root, appRouter), appRouterTs());\n }\n }\n\n public async exists(root: string, dirName: string): Promise<boolean> {\n return this.fs.exists(join(root, dirName));\n }\n\n /**\n * Ensure src/main.ts exists with a minimal Alepha bootstrap.\n *\n * Creates the src directory and main.ts file if the src directory\n * doesn't exist or is empty.\n *\n * @param root - The root directory of the project\n */\n public async ensureSrcMain(root: string): Promise<void> {\n const srcDir = join(root, \"src\");\n const mainPath = join(srcDir, \"main.ts\");\n\n // Check if src directory exists\n const srcExists = await this.fs.exists(srcDir);\n\n if (!srcExists) {\n // Create src directory and main.ts\n await this.fs.mkdir(srcDir, { recursive: true });\n await this.fs.writeFile(mainPath, mainTs());\n return;\n }\n\n // Check if src directory is empty\n const files = await this.fs.ls(srcDir);\n if (files.length === 0) {\n await this.fs.writeFile(mainPath, mainTs());\n }\n }\n\n /**\n * Ensure test directory exists with a dummy test file.\n *\n * Creates the test directory and a dummy.spec.ts file if the test directory\n * doesn't exist or is empty.\n *\n * @param root - The root directory of the project\n */\n public async ensureTestDir(root: string): Promise<void> {\n const testDir = join(root, \"test\");\n const dummyPath = join(testDir, \"dummy.spec.ts\");\n\n // Check if test directory exists\n const testExists = await this.fs.exists(testDir);\n\n if (!testExists) {\n // Create test directory and dummy.spec.ts\n await this.fs.mkdir(testDir, { recursive: true });\n await this.fs.writeFile(dummyPath, dummySpecTs());\n return;\n }\n\n // Check if test directory is empty\n const files = await this.fs.ls(testDir);\n if (files.length === 0) {\n await this.fs.writeFile(dummyPath, dummySpecTs());\n }\n }\n\n async readPackageJson(root: string): Promise<Record<string, any>> {\n const packageJson = await this.fs\n .createFile({\n path: join(root, \"package.json\"),\n })\n .text();\n return JSON.parse(packageJson);\n }\n\n /**\n * Check if a dependency is installed in the project.\n *\n * @param root - The root directory of the project\n * @param packageName - The name of the package to check\n * @returns True if the package is in dependencies or devDependencies\n */\n async hasDependency(root: string, packageName: string): Promise<boolean> {\n try {\n const pkg = await this.readPackageJson(root);\n return !!(\n pkg.dependencies?.[packageName] || pkg.devDependencies?.[packageName]\n );\n } catch {\n return false;\n }\n }\n\n /**\n * Check if Expo is present in the project.\n *\n * @param root - The root directory of the project\n * @returns True if expo is in dependencies or devDependencies\n */\n async hasExpo(root: string): Promise<boolean> {\n return this.hasDependency(root, \"expo\");\n }\n\n async getInstallCommand(root: string, packageName: string, dev = true) {\n const pm = await this.getPackageManager(root);\n let cmd: string;\n\n switch (pm) {\n case \"yarn\":\n cmd = `yarn add ${dev ? \"-D\" : \"\"} ${packageName}`;\n break;\n case \"pnpm\":\n cmd = `pnpm add ${dev ? \"-D\" : \"\"} ${packageName}`;\n break;\n case \"bun\":\n cmd = `bun add ${dev ? \"-d\" : \"\"} ${packageName}`;\n break;\n default:\n cmd = `npm install ${dev ? \"--save-dev\" : \"\"} ${packageName}`;\n }\n\n return cmd.replace(/\\s+/g, \" \").trim();\n }\n\n /**\n * Install a dependency if it's missing from the project.\n *\n * Automatically detects the package manager (yarn, pnpm, npm) and installs\n * the package as a dev dependency if not already present.\n */\n async ensureDependency(\n root: string,\n packageName: string,\n options: { dev?: boolean; run?: RunnerMethod } = {},\n ): Promise<void> {\n const { dev = true } = options;\n\n if (await this.hasDependency(root, packageName)) {\n this.log.debug(`Dependency '${packageName}' is already installed`);\n return;\n }\n\n const cmd = await this.getInstallCommand(root, packageName, dev);\n\n if (options.run) {\n // if it's during a Runner flow, just use the runner's run method\n await options.run(cmd, {\n alias: `installing ${packageName}`,\n });\n } else {\n // else, run directly with our util exec method\n this.log.debug(`Installing ${packageName}`);\n await this.exec(cmd, { global: true });\n }\n }\n}\n\nexport interface DependencyModes {\n react?: boolean;\n ui?: boolean;\n expo?: boolean;\n}\n","import { access, readFile, unlink, writeFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { join } from \"node:path\";\nimport { $inject, OPTIONS, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { $logger } from \"alepha/logger\";\nimport {\n boot,\n buildClient,\n buildServer,\n copyAssets,\n generateCloudflare,\n generateDocker,\n generateSitemap,\n generateVercel,\n prerenderPages,\n} from \"alepha/vite\";\nimport type * as Vite from \"vite\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\n\nexport class BuildCommand {\n protected readonly log = $logger();\n protected readonly utils = $inject(AlephaCliUtils);\n\n public readonly build = $command({\n name: \"build\",\n description: \"Build the project for production\",\n args: t.optional(\n t.text({ title: \"path\", description: \"Filepath to build\" }),\n ),\n flags: t.object({\n stats: t.optional(\n t.boolean({\n description: \"Generate build stats report\",\n }),\n ),\n vercel: t.optional(\n t.boolean({\n description: \"Generate Vercel deployment configuration\",\n }),\n ),\n cloudflare: t.optional(\n t.boolean({\n description: \"Generate Cloudflare Workers configuration\",\n }),\n ),\n docker: t.optional(\n t.boolean({\n description: \"Generate Docker configuration\",\n }),\n ),\n sitemap: t.optional(\n t.text({\n description: \"Generate sitemap.xml with base URL\",\n }),\n ),\n }),\n handler: async ({ flags, args, run, root }) => {\n // Tell viteAlephaBuild plugin to skip - CLI handles all tasks\n process.env.ALEPHA_BUILD_MODE = \"cli\";\n process.env.NODE_ENV = \"production\";\n\n if (await this.utils.hasExpo(root)) {\n // will coming soon\n // 1. ensure \"expo prebuild\" is run\n return;\n }\n\n await this.utils.ensureConfig(root, {\n viteConfigTs: true,\n tsconfigJson: true,\n });\n\n const entry = await boot.getServerEntry(root, args);\n this.log.trace(\"Entry file found\", { entry });\n\n const distDir = \"dist\";\n const clientDir = \"public\";\n\n await this.utils.ensureDependency(root, \"vite\", {\n run,\n });\n\n await run.rm(\"dist\", {\n alias: \"clean dist\",\n });\n\n const vite: typeof Vite = createRequire(import.meta.url)(\"vite\");\n const config = await vite.resolveConfig({}, \"build\", \"production\");\n const alephaPlugin: any = config.plugins.find(\n (it) => it.name === \"alepha:build\",\n );\n const viteAlephaBuildOptions = alephaPlugin?.[OPTIONS] || {};\n\n await this.utils.loadEnv(root, [\".env\", \".env.production\"]);\n\n const stats = flags.stats ?? viteAlephaBuildOptions.stats ?? false;\n const hasServer = viteAlephaBuildOptions.serverEntry !== false;\n\n let hasClient = false;\n try {\n await access(join(root, \"index.html\"));\n hasClient = true;\n } catch {\n // No index.html\n }\n\n // Extract client options\n const clientOptions =\n typeof viteAlephaBuildOptions.client === \"object\"\n ? viteAlephaBuildOptions.client\n : {};\n\n // Build client\n if (hasClient) {\n await run({\n name: \"vite build client\",\n handler: () =>\n buildClient({\n silent: true,\n dist: `${distDir}/${clientDir}`,\n stats,\n precompress: clientOptions.precompress,\n }),\n });\n }\n\n // Build server\n await run({\n name: \"vite build server\",\n handler: async () => {\n // Check if client template exists\n let clientBuilt = false;\n try {\n await readFile(`${distDir}/${clientDir}/index.html`, \"utf-8\");\n clientBuilt = true;\n } catch {\n // No client build\n }\n\n await buildServer({\n silent: true,\n entry,\n distDir,\n clientDir: clientBuilt ? clientDir : undefined,\n stats,\n });\n\n // Server will handle index.html if both client & server are built\n if (clientBuilt && hasServer) {\n await unlink(`${distDir}/${clientDir}/index.html`);\n }\n },\n });\n\n // Copy assets\n await copyAssets({\n root,\n entry: `${distDir}/index.js`,\n distDir,\n run,\n });\n\n if (hasClient) {\n // Generate sitemap\n const sitemapBaseUrl = flags.sitemap ?? clientOptions.sitemap?.hostname;\n\n if (sitemapBaseUrl) {\n await run({\n name: \"add sitemap\",\n handler: async () => {\n await writeFile(\n `${distDir}/${clientDir}/sitemap.xml`,\n await generateSitemap({\n entry: `${distDir}/index.js`,\n baseUrl: sitemapBaseUrl,\n }),\n );\n },\n });\n }\n\n // Pre-render static pages\n const shouldPrerender = clientOptions.prerender;\n\n if (shouldPrerender) {\n await run({\n name: \"pre-render pages\",\n handler: async () => {\n await prerenderPages({\n dist: `${distDir}/${clientDir}`,\n entry: `${distDir}/index.js`,\n compress: clientOptions.precompress,\n });\n },\n });\n }\n }\n\n // Generate deployment configurations\n if (flags.vercel || viteAlephaBuildOptions.vercel) {\n const config =\n typeof viteAlephaBuildOptions.vercel === \"object\"\n ? viteAlephaBuildOptions.vercel\n : {};\n await run({\n name: \"add Vercel config\",\n handler: () =>\n generateVercel({\n distDir,\n clientDir,\n config,\n }),\n });\n }\n\n if (flags.cloudflare || viteAlephaBuildOptions.cloudflare) {\n const config =\n typeof viteAlephaBuildOptions.cloudflare === \"boolean\"\n ? {}\n : viteAlephaBuildOptions.cloudflare;\n await run({\n name: \"add Cloudflare config\",\n handler: () =>\n generateCloudflare({\n distDir,\n config,\n }),\n });\n }\n\n if (flags.docker || viteAlephaBuildOptions.docker) {\n const dockerConfig =\n typeof viteAlephaBuildOptions.docker === \"object\"\n ? viteAlephaBuildOptions.docker\n : {};\n await run({\n name: \"add Docker config\",\n handler: () =>\n generateDocker({\n distDir,\n ...dockerConfig,\n }),\n });\n }\n },\n });\n}\n","import { $command } from \"alepha/command\";\n\nexport class CleanCommand {\n /**\n * Clean the project, removing the \"dist\" directory\n */\n public readonly clean = $command({\n name: \"clean\",\n description: \"Clean the project\",\n handler: async ({ run }) => {\n await run.rm(\"./dist\");\n },\n });\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { $inject, AlephaError, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { $logger } from \"alepha/logger\";\nimport type {\n DatabaseProvider,\n DrizzleKitProvider,\n RepositoryProvider,\n} from \"alepha/orm\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\n\nconst drizzleCommandFlags = t.object({\n provider: t.optional(\n t.text({\n description:\n \"Database provider name to target (e.g., 'postgres', 'sqlite')\",\n }),\n ),\n mode: t.optional(\n t.text({\n description:\n \"Environment variable file(s) to load (e.g., 'production' to load .env.production) https://vite.dev/guide/env-and-mode\",\n }),\n ),\n});\n\nexport class DbCommand {\n protected readonly log = $logger();\n protected readonly utils = $inject(AlephaCliUtils);\n\n /**\n * Check if database migrations are up to date.\n */\n protected readonly check = $command({\n name: \"check-migrations\",\n description: \"Check if database migration files are up to date\",\n args: t.optional(\n t.text({\n title: \"path\",\n description: \"Path to the Alepha server entry file\",\n }),\n ),\n flags: drizzleCommandFlags,\n handler: async ({ args, root }) => {\n const rootDir = root;\n this.log.debug(`Using project root: ${rootDir}`);\n\n const { alepha } = await this.utils.loadAlephaFromServerEntryFile(\n rootDir,\n args,\n );\n\n const repositoryProvider =\n alepha.inject<RepositoryProvider>(\"RepositoryProvider\");\n const drizzleKitProvider =\n alepha.inject<DrizzleKitProvider>(\"DrizzleKitProvider\");\n const accepted = new Set<string>([]);\n\n for (const primitive of repositoryProvider.getRepositories()) {\n const provider = primitive.provider;\n const providerName = provider.name;\n if (accepted.has(providerName)) {\n continue;\n }\n\n accepted.add(providerName);\n\n const migrationDir = join(rootDir, \"migrations\", providerName);\n\n const journalFile = await readFile(\n `${migrationDir}/meta/_journal.json`,\n \"utf-8\",\n ).catch(() => null);\n\n if (!journalFile) {\n this.log.info(\"No migration journal found.\");\n return;\n }\n\n const journal = JSON.parse(journalFile);\n const lastMigration = journal.entries[journal.entries.length - 1];\n const lastSnapshot = JSON.parse(\n await readFile(\n `${migrationDir}/meta/${String(lastMigration.idx).padStart(4, \"0\")}_snapshot.json`,\n \"utf-8\",\n ),\n );\n\n const models = drizzleKitProvider.getModels(provider);\n const kit = drizzleKitProvider.importDrizzleKit();\n const now = kit.generateDrizzleJson(models, lastSnapshot.id);\n\n const migrationStatements = await new Promise<Array<any>>((resolve) => {\n (async () => {\n const timer = setTimeout(() => {\n resolve([{ message: \"Migration generation timed out.\" }]);\n }, 5000);\n const statements = await kit.generateMigration(lastSnapshot, now);\n clearTimeout(timer);\n resolve(statements);\n })();\n });\n\n if (migrationStatements.length === 0) {\n this.log.info(\"No changes detected.\");\n return;\n }\n\n this.log.info(\"\");\n this.log.info(\"Detected migration statements:\");\n this.log.info(\"\");\n for (const stmt of migrationStatements) {\n this.log.info(stmt);\n }\n this.log.info(\"\");\n\n this.log.info(\n `At least ${migrationStatements.length} change(s) detected.`,\n );\n this.log.info(\n \"Please, run 'alepha db:generate' to update the migration files.\",\n );\n this.log.info(\"\");\n\n throw new AlephaError(\"Database migrations are not up to date.\");\n }\n },\n });\n\n /**\n * Generate database migration files\n */\n protected readonly generate = $command({\n name: \"generate\",\n description: \"Generate migration files based on current database schema\",\n summary: false,\n args: t.optional(\n t.text({\n title: \"path\",\n description: \"Path to the Alepha server entry file\",\n }),\n ),\n flags: t.extend(drizzleCommandFlags, {\n custom: t.optional(\n t.text({\n description:\n \"Custom migration name for drizzle-kit generate --custom\",\n }),\n ),\n }),\n handler: async ({ args, flags, root }) => {\n const commandFlags = flags.custom\n ? `--custom=${flags.custom}`\n : undefined;\n\n await this.runDrizzleKitCommand({\n root,\n args,\n command: \"generate\",\n commandFlags,\n provider: flags.provider,\n env: flags.mode,\n logMessage: (providerName, dialect) =>\n `Generate '${providerName}' migrations (${dialect}) ...`,\n });\n },\n });\n\n /**\n * Push database schema changes directly to the database\n */\n protected readonly push = $command({\n name: \"push\",\n description: \"Push database schema changes directly to the database\",\n summary: false,\n args: t.optional(\n t.text({\n title: \"path\",\n description: \"Path to the Alepha server entry file\",\n }),\n ),\n flags: drizzleCommandFlags,\n handler: async ({ root, args, flags }) => {\n await this.runDrizzleKitCommand({\n root,\n args,\n command: \"push\",\n provider: flags.provider,\n env: flags.mode,\n logMessage: (providerName, dialect) =>\n `Push '${providerName}' schema (${dialect}) ...`,\n });\n },\n });\n\n /**\n * Apply pending database migrations\n */\n protected readonly migrate = $command({\n name: \"migrate\",\n description: \"Apply pending database migrations\",\n summary: false,\n args: t.optional(\n t.text({\n title: \"path\",\n description: \"Path to the Alepha server entry file\",\n }),\n ),\n flags: drizzleCommandFlags,\n handler: async ({ root, args, flags }) => {\n await this.runDrizzleKitCommand({\n root,\n args,\n command: \"migrate\",\n provider: flags.provider,\n env: flags.mode,\n logMessage: (providerName, dialect) =>\n `Migrate '${providerName}' database (${dialect}) ...`,\n });\n },\n });\n\n /**\n * Launch Drizzle Studio database browser\n */\n protected readonly studio = $command({\n name: \"studio\",\n description: \"Launch Drizzle Studio database browser\",\n summary: false,\n args: t.optional(\n t.text({\n title: \"path\",\n description: \"Path to the Alepha server entry file\",\n }),\n ),\n flags: drizzleCommandFlags,\n handler: async ({ root, args, flags }) => {\n await this.runDrizzleKitCommand({\n root,\n args,\n command: \"studio\",\n provider: flags.provider,\n env: flags.mode,\n logMessage: (providerName, dialect) =>\n `Launch Studio for '${providerName}' (${dialect}) ...`,\n });\n },\n });\n\n /**\n * Parent command for database operations.\n */\n public readonly db = $command({\n name: \"db\",\n description: \"Database management commands\",\n children: [this.check, this.generate, this.push, this.migrate, this.studio],\n handler: async ({ help }) => {\n help();\n },\n });\n\n /**\n * Run a drizzle-kit command for all database providers in an Alepha instance.\n */\n public async runDrizzleKitCommand(options: {\n root: string;\n args?: string;\n command: string;\n commandFlags?: string;\n provider?: string;\n logMessage: (providerName: string, dialect: string) => string;\n env?: string;\n }): Promise<void> {\n const rootDir = options.root;\n\n const envFiles = [\".env\"];\n if (options.env) {\n envFiles.push(`.env.${options.env}`);\n }\n\n await this.utils.loadEnv(rootDir, envFiles);\n\n this.log.debug(`Using project root: ${rootDir}`);\n\n const { alepha, entry } = await this.utils.loadAlephaFromServerEntryFile(\n rootDir,\n options.args,\n );\n\n const drizzleKitProvider =\n alepha.inject<DrizzleKitProvider>(\"DrizzleKitProvider\");\n const repositoryProvider =\n alepha.inject<RepositoryProvider>(\"RepositoryProvider\");\n const accepted = new Set<string>([]);\n\n for (const primitive of repositoryProvider.getRepositories()) {\n const provider = primitive.provider;\n const providerName = provider.name;\n const dialect = provider.dialect;\n\n if (accepted.has(providerName)) {\n continue;\n }\n accepted.add(providerName);\n\n // Skip if provider filter is set and doesn't match\n if (options.provider && options.provider !== providerName) {\n this.log.debug(\n `Skipping provider '${providerName}' (filter: ${options.provider})`,\n );\n continue;\n }\n\n this.log.info(\"\");\n this.log.info(options.logMessage(providerName, dialect));\n\n const drizzleConfigJsPath = await this.prepareDrizzleConfig({\n kit: drizzleKitProvider,\n provider,\n providerName,\n providerUrl: provider.url,\n dialect,\n entry,\n rootDir,\n });\n\n const flags = options.commandFlags ? ` ${options.commandFlags}` : \"\";\n await this.utils.exec(\n `drizzle-kit ${options.command} --config=${drizzleConfigJsPath}${flags}`,\n {\n env: {\n NODE_OPTIONS: \"--import tsx\",\n },\n },\n );\n }\n }\n\n /**\n * Prepare Drizzle configuration files for a database provider.\n */\n public async prepareDrizzleConfig(options: {\n kit: any;\n provider: DatabaseProvider;\n providerName: string;\n providerUrl: string;\n dialect: string;\n entry: string;\n rootDir: string;\n }): Promise<string> {\n const models = Object.keys(options.kit.getModels(options.provider));\n const entitiesJs = this.utils.generateEntitiesJs(\n options.entry,\n options.providerName,\n models,\n );\n\n const entitiesJsPath = await this.utils.writeConfigFile(\n \"entities.js\",\n entitiesJs,\n options.rootDir,\n );\n\n const config: Record<string, any> = {\n schema: entitiesJsPath,\n out: `./migrations/${options.providerName}`,\n dialect: options.dialect,\n dbCredentials: {\n url: options.providerUrl,\n },\n };\n\n if (options.provider.schema) {\n config.schemaFilter = options.provider.schema;\n }\n\n if (options.providerName === \"d1\") {\n config.driver = \"d1-http\";\n }\n\n if (options.providerName === \"pglite\") {\n config.driver = \"pglite\";\n }\n\n if (options.dialect === \"sqlite\") {\n if (options.providerName === \"d1\") {\n const token = process.env.CLOUDFLARE_API_TOKEN;\n if (!token) {\n throw new AlephaError(\n \"CLOUDFLARE_API_TOKEN environment variable is not set. https://orm.drizzle.team/docs/guides/d1-http-with-drizzle-kit\",\n );\n }\n\n const accountId = process.env.CLOUDFLARE_ACCOUNT_ID;\n if (!accountId) {\n throw new AlephaError(\n \"CLOUDFLARE_ACCOUNT_ID environment variable is not set. https://orm.drizzle.team/docs/guides/d1-http-with-drizzle-kit\",\n );\n }\n\n const url = options.providerUrl;\n if (!url.startsWith(\"cloudflare-d1://\")) {\n throw new AlephaError(\n \"D1 provider URL must start with 'cloudflare-d1://'.\",\n );\n }\n\n const [, databaseId] = url\n .replace(\"cloudflare-d1://\", \"\")\n .replace(\"cloudflare-d1:\", \"\")\n .split(\":\");\n\n if (!databaseId) {\n throw new AlephaError(\n \"Database ID is missing in the D1 provider URL. Cloudflare D1 URL format: cloudflare-d1://<database_name>:<database_id>\",\n );\n }\n\n config.dbCredentials = {\n accountId,\n databaseId,\n token,\n };\n } else {\n let url = options.providerUrl;\n url = url.replace(\"sqlite://\", \"\").replace(\"file://\", \"\");\n url = join(options.rootDir, url);\n\n config.dbCredentials = {\n url,\n };\n }\n }\n\n const drizzleConfigJs = `export default ${JSON.stringify(config, null, 2)}`;\n\n return await this.utils.writeConfigFile(\n \"drizzle.config.js\",\n drizzleConfigJs,\n options.rootDir,\n );\n }\n}\n","import { join } from \"node:path\";\nimport { $inject, AlephaError, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { $logger } from \"alepha/logger\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\n\nexport class DeployCommand {\n protected readonly log = $logger();\n protected readonly utils = $inject(AlephaCliUtils);\n\n /**\n * Deploy the project to a hosting platform (e.g., Vercel, Cloudflare, Surge)\n *\n * Deploy command can be overridden by creating a alepha.config.ts in the project root:\n *\n * ```ts\n * import { defineConfig } from \"alepha/cli\";\n *\n * export default defineConfig({\n * commands: {\n * deploy: {\n * handler: async ({ root, mode, flags }) => {\n * // Custom deployment logic here\n * },\n * },\n * },\n * });\n * ```\n */\n public readonly deploy = $command({\n name: \"deploy\",\n description:\n \"Deploy the project to a hosting platform (e.g., Vercel, Cloudflare, Surge)\",\n mode: true,\n flags: t.object({\n build: t.boolean({\n description: \"Build the project before deployment\",\n default: false,\n }),\n migrate: t.boolean({\n description:\n \"Run database migrations before deployment (if applicable)\",\n default: false,\n }),\n }),\n env: t.object({\n VERCEL_TOKEN: t.optional(\n t.text({\n description: \"Vercel API token (e.g., xxxxxxxxxxxxxxxxxxxx)\",\n }),\n ),\n VERCEL_ORG_ID: t.optional(\n t.text({\n description: \"Vercel organization ID (e.g., team_abc123...)\",\n }),\n ),\n VERCEL_PROJECT_ID: t.optional(\n t.text({ description: \"Vercel project ID (e.g., prj_abc123...)\" }),\n ),\n CLOUDFLARE_API_TOKEN: t.optional(\n t.text({\n description: \"Cloudflare API token (e.g., xxxx-xxxx-xxxx-xxxx)\",\n }),\n ),\n CLOUDFLARE_ACCOUNT_ID: t.optional(\n t.text({\n description: \"Cloudflare account ID (e.g., abc123def456...)\",\n }),\n ),\n }),\n handler: async ({ root, mode, flags }) => {\n if (flags.build) {\n await this.utils.exec(\"alepha build\");\n }\n\n // Vercel deployment\n if (await this.utils.exists(root, \"dist/vercel.json\")) {\n if (flags.migrate) {\n this.log.debug(\"Running database migrations before deployment...\");\n await this.utils.exec(`alepha db migrate --mode=${mode}`);\n }\n await this.utils.ensureDependency(root, \"vercel\", { dev: true });\n const command =\n `vercel . --cwd=dist ${mode === \"production\" ? \"--prod\" : \"\"}`.trim();\n this.log.debug(`Deploying to Vercel with command: ${command}`);\n await this.utils.exec(command);\n return;\n }\n\n // Cloudflare deployment\n if (await this.utils.exists(root, \"dist/wrangler.jsonc\")) {\n if (flags.migrate) {\n this.log.debug(\"Running database migrations before deployment...\");\n await this.utils.exec(`alepha db migrate --mode=${mode}`);\n }\n await this.utils.ensureDependency(root, \"wrangler\", { dev: true });\n const command =\n `wrangler deploy ${mode === \"production\" ? \"\" : \"--env preview\"} --config=dist/wrangler.jsonc`.trim();\n this.log.info(`Deploying to Cloudflare with command: ${command}`);\n await this.utils.exec(command);\n return;\n }\n\n // Surge deployment\n if (await this.utils.exists(root, \"dist/public/404.html\")) {\n await this.utils.ensureDependency(root, \"surge\", { dev: true });\n const distPath = join(root, \"dist/public\");\n this.log.debug(`Deploying to Surge from directory: ${distPath}`);\n await this.utils.exec(`surge ${distPath}`);\n return;\n }\n\n throw new AlephaError(\n \"No deployment configuration found in the dist folder.\",\n );\n },\n });\n}\n","import { access } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { $inject, Alepha, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { $logger } from \"alepha/logger\";\nimport { boot } from \"alepha/vite\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\n\nexport class DevCommand {\n protected readonly log = $logger();\n protected readonly utils = $inject(AlephaCliUtils);\n protected readonly alepha = $inject(Alepha);\n\n /**\n * Will run the project in watch mode.\n *\n * - If an index.html file is found in the project root, it will run Vite in dev mode.\n * - Otherwise, it will look for a server entry file and run it with tsx in watch mode.\n */\n public readonly dev = $command({\n name: \"dev\",\n description: \"Run the project in development mode\",\n args: t.optional(t.text({ title: \"path\", description: \"Filepath to run\" })),\n handler: async ({ args, root }) => {\n const expo = await this.utils.hasExpo(root);\n\n await this.utils.ensureConfig(root, {\n viteConfigTs: !expo,\n tsconfigJson: true,\n });\n\n if (expo) {\n await this.utils.exec(\"expo start\");\n return;\n }\n\n const entry = await boot.getServerEntry(root, args);\n this.log.trace(\"Entry file found\", { entry });\n\n const isFullstack = await this.isFullstackProject(root);\n\n if (!isFullstack) {\n const exe = this.alepha.isBun() ? \"bun\" : \"tsx\";\n let cmd = `${exe} --watch`;\n if (await this.utils.exists(root, \".env\")) {\n cmd += \" --env-file=./.env\";\n }\n cmd += ` ${entry}`;\n await this.utils.exec(cmd, {\n global: exe === \"bun\",\n });\n return;\n }\n\n // Ensure vite is installed before running\n await this.utils.ensureDependency(root, \"vite\");\n await this.utils.exec(\"vite\");\n },\n });\n\n protected async isFullstackProject(root: string): Promise<boolean> {\n try {\n await access(join(root, \"index.html\"));\n return true;\n } catch {\n return false;\n }\n }\n}\n","import { $inject } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\n\nexport class FormatCommand {\n protected readonly utils = $inject(AlephaCliUtils);\n\n public readonly format = $command({\n name: \"format\",\n description: \"Format the codebase using Biome\",\n handler: async ({ root }) => {\n await this.utils.ensureConfig(root, { biomeJson: true });\n await this.utils.ensureDependency(root, \"@biomejs/biome\");\n await this.utils.exec(\"biome format --fix\");\n },\n });\n}\n","import { $atom, type Static, t } from \"alepha\";\n\n/**\n * Default scopes to ignore in changelog generation.\n * Commits with these scopes won't appear in release notes.\n */\nexport const DEFAULT_IGNORE = [\n \"project\",\n \"release\",\n \"starter\",\n \"example\",\n \"chore\",\n \"ci\",\n \"build\",\n \"test\",\n \"style\",\n];\n\n/**\n * Changelog configuration atom.\n *\n * Configure in `alepha.config.ts`:\n * ```ts\n * import { changelogOptions } from \"alepha/cli\";\n *\n * alepha.set(changelogOptions, {\n * ignore: [\"project\", \"release\", \"chore\", \"docs\"],\n * });\n * ```\n */\nexport const changelogOptions = $atom({\n name: \"alepha.changelog\",\n schema: t.object({\n /**\n * Scopes to ignore (e.g., \"project\", \"release\", \"chore\").\n * Commits like `feat(chore): ...` will be excluded from changelog.\n */\n ignore: t.optional(t.array(t.string())),\n }),\n default: {\n ignore: DEFAULT_IGNORE,\n },\n});\n\nexport type ChangelogOptions = Static<typeof changelogOptions.schema>;\n","import { $logger } from \"alepha/logger\";\nimport {\n type ChangelogOptions,\n DEFAULT_IGNORE,\n} from \"../atoms/changelogOptions.ts\";\nimport type { Commit } from \"../commands/gen/changelog.ts\";\n\n/**\n * Service for parsing git commit messages into structured format.\n *\n * Only parses **conventional commits with a scope**:\n * - `feat(scope): description` → feature\n * - `fix(scope): description` → bug fix\n * - `feat(scope)!: description` → breaking change\n *\n * Commits without scope are ignored, allowing developers to commit\n * work-in-progress changes without polluting release notes:\n * - `cli: work in progress` → ignored (no type)\n * - `fix: quick patch` → ignored (no scope)\n * - `feat(cli): add command` → included\n */\nexport class GitMessageParser {\n protected readonly log = $logger();\n\n /**\n * Parse a git commit line into a structured Commit object.\n *\n * **Format:** `type(scope): description` or `type(scope)!: description`\n *\n * **Supported types:** feat, fix, docs, refactor, perf, revert\n *\n * **Breaking changes:** Use `!` before `:` (e.g., `feat(api)!: remove endpoint`)\n *\n * @returns Commit object or null if not matching/ignored\n */\n parseCommit(line: string, config: ChangelogOptions): Commit | null {\n // Extract hash and message from git log --oneline format\n const match = line.match(/^([a-f0-9]+)\\s+(.+)$/);\n if (!match) return null;\n\n const [, hash, message] = match;\n const ignore = config.ignore ?? DEFAULT_IGNORE;\n\n // Conventional commit with REQUIRED scope: type(scope): description\n // The `!` before `:` marks a breaking change\n const conventionalMatch = message.match(\n /^(feat|fix|docs|refactor|perf|revert)\\(([^)]+)\\)(!)?:\\s*(.+)$/i,\n );\n\n if (!conventionalMatch) {\n // No match - commit doesn't follow required format\n return null;\n }\n\n const [, type, scope, breakingMark, description] = conventionalMatch;\n\n // Check if scope should be ignored\n const baseScope = scope.split(\"/\")[0];\n if (ignore.includes(baseScope) || ignore.includes(scope)) {\n return null;\n }\n\n // Breaking change detection:\n // 1. Explicit `!` marker: feat(api)!: change\n // 2. Word \"breaking\" in description: feat(api): breaking change to auth\n const breaking =\n breakingMark === \"!\" || description.toLowerCase().includes(\"breaking\");\n\n return {\n hash: hash.substring(0, 8),\n type: type.toLowerCase(),\n scope,\n description: description.trim(),\n breaking,\n };\n }\n}\n","import { exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { $inject, $use, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { $logger } from \"alepha/logger\";\nimport { changelogOptions } from \"../../atoms/changelogOptions.ts\";\nimport { GitMessageParser } from \"../../services/GitMessageParser.ts\";\n\nexport {\n type ChangelogOptions,\n changelogOptions,\n DEFAULT_IGNORE,\n} from \"../../atoms/changelogOptions.ts\";\nexport { GitMessageParser } from \"../../services/GitMessageParser.ts\";\n\nconst execAsync = promisify(exec);\n\n// =============================================================================\n// GIT PROVIDER\n// =============================================================================\n\n/**\n * Git provider for executing git commands.\n * Can be substituted in tests with a mock implementation.\n */\nexport class GitProvider {\n async exec(cmd: string, cwd: string): Promise<string> {\n const { stdout } = await execAsync(`git ${cmd}`, { cwd });\n return stdout;\n }\n}\n\n// =============================================================================\n// TYPES\n// =============================================================================\n\nexport interface Commit {\n hash: string;\n type: string;\n scope: string | null;\n description: string;\n breaking: boolean;\n}\n\ninterface ChangelogEntry {\n features: Commit[];\n fixes: Commit[];\n}\n\n// =============================================================================\n// CHANGELOG COMMAND\n// =============================================================================\n\n/**\n * Changelog command for generating release notes from git commits.\n *\n * Usage:\n * - `alepha gen changelog` - Show unreleased changes since latest tag to HEAD\n * - `alepha gen changelog --from=1.0.0` - Show changes from version to HEAD\n * - `alepha gen changelog --from=1.0.0 --to=1.1.0` - Show changes between two refs\n * - `alepha gen changelog | tee -a CHANGELOG.md` - Append to file\n */\nexport class ChangelogCommand {\n protected readonly log = $logger();\n protected readonly git = $inject(GitProvider);\n protected readonly parser = $inject(GitMessageParser);\n protected readonly config = $use(changelogOptions);\n\n // ---------------------------------------------------------------------------\n // FORMATTING\n // ---------------------------------------------------------------------------\n\n /**\n * Format a single commit line.\n * Example: `- **cli**: add new command (\\`abc1234\\`)`\n * Breaking changes are flagged: `- **cli**: add new command [BREAKING] (\\`abc1234\\`)`\n */\n protected formatCommit(commit: Commit): string {\n const breaking = commit.breaking ? \" [BREAKING]\" : \"\";\n return `- **${commit.scope}**: ${commit.description}${breaking} (\\`${commit.hash}\\`)`;\n }\n\n /**\n * Format the changelog entry with sections.\n */\n protected formatEntry(entry: ChangelogEntry): string {\n const sections: string[] = [];\n\n if (entry.features.length > 0) {\n sections.push(\"### Features\\n\");\n for (const commit of entry.features) {\n sections.push(this.formatCommit(commit));\n }\n sections.push(\"\");\n }\n\n if (entry.fixes.length > 0) {\n sections.push(\"### Bug Fixes\\n\");\n for (const commit of entry.fixes) {\n sections.push(this.formatCommit(commit));\n }\n sections.push(\"\");\n }\n\n return sections.join(\"\\n\");\n }\n\n // ---------------------------------------------------------------------------\n // PARSING\n // ---------------------------------------------------------------------------\n\n /**\n * Parse git log output into a changelog entry.\n */\n protected parseCommits(commitsOutput: string): ChangelogEntry {\n const entry: ChangelogEntry = {\n features: [],\n fixes: [],\n };\n\n for (const line of commitsOutput.trim().split(\"\\n\")) {\n if (!line.trim()) continue;\n\n const commit = this.parser.parseCommit(line, this.config);\n if (!commit) {\n this.log.trace(\"Skipping commit\", { line });\n continue;\n }\n\n this.log.trace(\"Parsed commit\", { commit });\n\n // Categorize commit (breaking flag is preserved on the commit itself)\n if (commit.type === \"feat\") {\n entry.features.push(commit);\n } else if (commit.type === \"fix\") {\n entry.fixes.push(commit);\n }\n }\n\n return entry;\n }\n\n /**\n * Check if entry has any public commits.\n */\n protected hasChanges(entry: ChangelogEntry): boolean {\n return entry.features.length > 0 || entry.fixes.length > 0;\n }\n\n /**\n * Get the latest version tag.\n */\n protected async getLatestTag(\n git: (cmd: string) => Promise<string>,\n ): Promise<string | null> {\n const tagsOutput = await git(\"tag --sort=-version:refname\");\n const tags = tagsOutput\n .trim()\n .split(\"\\n\")\n .filter((tag) => tag.match(/^\\d+\\.\\d+\\.\\d+$/));\n\n return tags[0] || null;\n }\n\n // ---------------------------------------------------------------------------\n // COMMAND\n // ---------------------------------------------------------------------------\n\n public readonly command = $command({\n name: \"changelog\",\n description:\n \"Generate changelog from conventional commits (outputs to stdout)\",\n flags: t.object({\n /**\n * Show changes from this ref (tag, commit, branch).\n * Defaults to the latest version tag.\n * Example: --from=1.0.0\n */\n from: t.optional(\n t.string({\n aliases: [\"f\"],\n description: \"Starting ref (default: latest tag)\",\n }),\n ),\n /**\n * Show changes up to this ref (tag, commit, branch).\n * Defaults to HEAD.\n * Example: --to=main\n */\n to: t.optional(\n t.string({\n aliases: [\"t\"],\n description: \"Ending ref (default: HEAD)\",\n }),\n ),\n }),\n handler: async ({ flags, root }) => {\n const git = (cmd: string) => this.git.exec(cmd, root);\n\n // Determine the starting point\n let fromRef: string;\n\n if (flags.from) {\n // User specified a ref\n fromRef = flags.from;\n this.log.debug(\"Using specified from ref\", { from: fromRef });\n } else {\n // Use latest tag\n const latestTag = await this.getLatestTag(git);\n if (!latestTag) {\n process.stdout.write(\"No version tags found in repository\\n\");\n return;\n }\n fromRef = latestTag;\n this.log.debug(\"Using latest tag\", { from: fromRef });\n }\n\n // Determine the ending point\n const toRef = flags.to || \"HEAD\";\n this.log.debug(\"Using to ref\", { to: toRef });\n\n // Get commits in range\n const commitsOutput = await git(`log ${fromRef}..${toRef} --oneline`);\n\n if (!commitsOutput.trim()) {\n process.stdout.write(`No changes in range ${fromRef}..${toRef}\\n`);\n return;\n }\n\n // Parse and format\n const entry = this.parseCommits(commitsOutput);\n\n if (!this.hasChanges(entry)) {\n process.stdout.write(\n `No public changes in range ${fromRef}..${toRef}\\n`,\n );\n return;\n }\n\n // Output the formatted changelog (no header - caller adds it if needed)\n process.stdout.write(this.formatEntry(entry));\n },\n });\n}\n","import { $inject, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport { $logger } from \"alepha/logger\";\nimport { ServerSwaggerProvider } from \"alepha/server/swagger\";\nimport { AlephaCliUtils } from \"../../services/AlephaCliUtils.ts\";\n\nexport class OpenApiCommand {\n protected readonly log = $logger();\n protected readonly utils = $inject(AlephaCliUtils);\n protected readonly fs = $inject(FileSystemProvider);\n\n public readonly command = $command({\n name: \"openapi\",\n description: \"Generate OpenAPI specification from actions\",\n flags: t.object({\n out: t.optional(\n t.text({\n aliases: [\"o\"],\n description: \"Output file path\",\n }),\n ),\n }),\n handler: async ({ root, flags }) => {\n const { alepha } = await this.utils.loadAlephaFromServerEntryFile(root);\n\n try {\n const openapiProvider = alepha.inject(\n ServerSwaggerProvider,\n ) as ServerSwaggerProvider;\n\n await alepha.events.emit(\"configure\", alepha);\n\n let json: any = openapiProvider.json;\n\n if (!json) {\n json = openapiProvider.generateSwaggerDoc({\n info: {\n title: \"API Documentation\",\n version: \"1.0.0\",\n },\n });\n }\n\n if (!json) {\n this.log.error(\"No actions found to generate OpenAPI specification.\");\n return;\n }\n\n if (flags.out) {\n await this.fs.writeFile(\n this.fs.join(root, flags.out),\n JSON.stringify(json, null, 2),\n );\n } else {\n this.log.info(JSON.stringify(json, null, 2));\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (message.includes(\"Service not found\")) {\n this.log.error(\n \"Missing $swagger() primitive in your server configuration.\",\n );\n return;\n }\n\n this.log.error(`OpenAPI generation failed - ${message}`, { err });\n }\n },\n });\n}\n","import { $inject } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { ChangelogCommand } from \"./gen/changelog.ts\";\nimport { OpenApiCommand } from \"./gen/openapi.ts\";\n\nexport class GenCommand {\n protected readonly changelog = $inject(ChangelogCommand);\n protected readonly openapi = $inject(OpenApiCommand);\n\n public readonly gen = $command({\n name: \"gen\",\n description: \"Generate code, documentation, ...\",\n children: [this.changelog.command, this.openapi.command],\n handler: async ({ help }) => {\n help();\n },\n });\n}\n","import { $inject, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\n\nexport class InitCommand {\n protected readonly utils = $inject(AlephaCliUtils);\n\n /**\n * Ensure the project has the necessary Alepha configuration files.\n * Add the correct dependencies to package.json and install them.\n */\n public readonly init = $command({\n name: \"init\",\n description: \"Add missing Alepha configuration files to the project\",\n flags: t.object({\n // choose package manager\n yarn: t.optional(t.boolean({ description: \"Use Yarn package manager\" })),\n pnpm: t.optional(t.boolean({ description: \"Use pnpm package manager\" })),\n npm: t.optional(t.boolean({ description: \"Use npm package manager\" })),\n bun: t.optional(t.boolean({ description: \"Use Bun package manager\" })),\n // choose which dependencies to add\n react: t.optional(\n t.boolean({ description: \"Include Alepha React dependencies\" }),\n ),\n ui: t.optional(\n t.boolean({ description: \"Include Alepha UI dependencies\" }),\n ),\n test: t.optional(\n t.boolean({ description: \"Include Vitest and create test directory\" }),\n ),\n }),\n handler: async ({ run, flags, root }) => {\n if (flags.ui) {\n flags.react = true;\n }\n\n const isExpo = await this.utils.hasExpo(root);\n\n await run({\n name: \"ensuring configuration files\",\n handler: async () => {\n await this.utils.ensureConfig(root, {\n tsconfigJson: true,\n packageJson: flags,\n biomeJson: true,\n viteConfigTs: !isExpo,\n editorconfig: true,\n indexHtml: !!flags.react && !isExpo,\n });\n\n // Create src/main.ts if src directory is empty or doesn't exist\n if (!flags.react) {\n await this.utils.ensureSrcMain(root);\n }\n },\n });\n\n // TODO: check if all alepha dependencies are same version\n\n const pm = await this.utils.getPackageManager(root, flags);\n if (pm === \"yarn\") {\n await this.utils.ensureYarn(root);\n await run(\"yarn set version stable\");\n } else if (pm === \"bun\") {\n await this.utils.ensureBun(root);\n } else if (pm === \"pnpm\") {\n await this.utils.ensurePnpm(root);\n } else {\n await this.utils.ensureNpm(root);\n }\n\n await run(`${pm} install`, {\n alias: `installing dependencies with ${pm}`,\n });\n\n if (!isExpo) {\n await this.utils.ensureDependency(root, \"vite\", { run });\n }\n\n await this.utils.ensureDependency(root, \"@biomejs/biome\", { run });\n\n // Install vitest and create test directory if --test flag is set\n if (flags.test) {\n await this.utils.ensureTestDir(root);\n await run(`${pm} ${pm === \"yarn\" ? \"add\" : \"install\"} -D vitest`, {\n alias: \"setup testing with Vitest\",\n });\n }\n },\n });\n}\n","import { $inject } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\n\nexport class LintCommand {\n protected readonly utils = $inject(AlephaCliUtils);\n\n public readonly lint = $command({\n name: \"lint\",\n description: \"Run linter across the codebase using Biome\",\n handler: async ({ root }) => {\n await this.utils.ensureConfig(root, { biomeJson: true });\n await this.utils.ensureDependency(root, \"@biomejs/biome\");\n await this.utils.exec(\"biome check --formatter-enabled=false --fix\");\n },\n });\n}\n","import { $inject, Alepha, t } from \"alepha\";\nimport { $command, CliProvider } from \"alepha/command\";\nimport { $logger, ConsoleColorProvider } from \"alepha/logger\";\nimport { version } from \"../version.ts\";\n\nexport class RootCommand {\n protected readonly log = $logger();\n protected readonly cli = $inject(CliProvider);\n protected readonly alepha = $inject(Alepha);\n protected readonly color = $inject(ConsoleColorProvider);\n\n /**\n * Called when no command is provided\n */\n public readonly root = $command({\n root: true,\n flags: t.object({\n version: t.optional(\n t.boolean({\n description: \"Show Alepha CLI version\",\n aliases: [\"v\"],\n }),\n ),\n }),\n handler: async ({ flags }) => {\n if (flags.version) {\n this.log.info(this.color.set(\"WHITE_BOLD\", `Alepha v${version}`));\n if (this.alepha.isBun()) {\n this.log.info(this.color.set(\"GREY_DARK\", `└─ Bun v${Bun.version}`));\n } else {\n this.log.info(\n this.color.set(\"GREY_DARK\", `└─ Node ${process.version}`),\n );\n }\n return;\n }\n\n this.cli.printHelp();\n },\n });\n}\n","import { $inject, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\n\nexport class RunCommand {\n protected readonly utils = $inject(AlephaCliUtils);\n\n public readonly run = $command({\n name: \"run\",\n hide: true,\n description: \"Run a TypeScript file directly\",\n flags: t.object({\n watch: t.optional(\n t.boolean({ description: \"Watch file for changes\", alias: \"w\" }),\n ),\n }),\n summary: false,\n args: t.text({ title: \"path\", description: \"Filepath to run\" }),\n handler: async ({ args, flags, root }) => {\n await this.utils.ensureTsConfig(root);\n await this.utils.exec(`tsx ${flags.watch ? \"watch \" : \"\"}${args}`);\n },\n });\n}\n","import { $inject, t } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\n\nexport class TestCommand {\n protected readonly utils = $inject(AlephaCliUtils);\n\n public readonly test = $command({\n name: \"test\",\n description: \"Run tests using Vitest\",\n flags: t.object({\n config: t.optional(\n t.string({\n description: \"Path to Vitest config file\",\n alias: \"c\",\n }),\n ),\n }),\n env: t.object({\n VITEST_ARGS: t.optional(\n t.string({\n default: \"\",\n description:\n \"Additional arguments to pass to Vitest. E.g., --coverage\",\n }),\n ),\n }),\n handler: async ({ root, flags, env }) => {\n await this.utils.ensureConfig(root, {\n tsconfigJson: true,\n viteConfigTs: true,\n });\n\n // Ensure vitest is installed before running\n await this.utils.ensureDependency(root, \"vitest\");\n\n const config = flags.config ? `--config=${flags.config}` : \"\";\n\n await this.utils.exec(`vitest run ${config} ${env.VITEST_ARGS}`);\n },\n });\n}\n","import { $inject } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { $logger } from \"alepha/logger\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\n\nexport class TypecheckCommand {\n protected readonly utils = $inject(AlephaCliUtils);\n protected readonly log = $logger();\n\n /**\n * Run TypeScript type checking across the codebase with no emit.\n */\n public readonly typecheck = $command({\n name: \"typecheck\",\n aliases: [\"tc\"],\n description: \"Check TypeScript types across the codebase\",\n handler: async ({ root }) => {\n this.log.info(\"Starting TypeScript type checking...\");\n await this.utils.ensureDependency(root, \"typescript\");\n await this.utils.exec(\"tsc --noEmit\");\n this.log.info(\"TypeScript type checking completed successfully.\");\n },\n });\n}\n","import { $inject } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { AlephaCliUtils } from \"../services/AlephaCliUtils.ts\";\n\nexport class VerifyCommand {\n protected readonly utils = $inject(AlephaCliUtils);\n\n /**\n * Run a series of verification commands to ensure code quality and correctness.\n *\n * This command runs the following checks in order:\n * - Clean the project\n * - Format the code\n * - Lint the code\n * - Run tests (if Vitest is a dev dependency)\n * - Check database migrations (if a migrations directory exists)\n * - Type check the code\n * - Build the project\n * - Clean the project again\n */\n public readonly verify = $command({\n name: \"verify\",\n description: \"Verify the Alepha project\",\n handler: async ({ root, run }) => {\n await run(\"alepha clean\");\n await run(\"alepha format\");\n await run(\"alepha lint\");\n\n await run(\"alepha typecheck\");\n\n const pkg = await this.utils.readPackageJson(root);\n if (pkg.devDependencies?.vitest) {\n await run(\"alepha test\");\n }\n\n if (await this.utils.exists(root, \"migrations\")) {\n await run(\"alepha db:check-migrations\");\n }\n\n const isExpo = await this.utils.hasExpo(root);\n if (!isExpo) {\n await run(\"alepha build\");\n }\n await run(\"alepha clean\");\n },\n });\n}\n","import { $hook, $inject, $module, Alepha } from \"alepha\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport { BuildCommand } from \"../commands/build.ts\";\nimport { CleanCommand } from \"../commands/clean.ts\";\nimport { DbCommand } from \"../commands/db.ts\";\nimport { DeployCommand } from \"../commands/deploy.ts\";\nimport { DevCommand } from \"../commands/dev.ts\";\nimport { FormatCommand } from \"../commands/format.ts\";\nimport { GitProvider } from \"../commands/gen/changelog.ts\";\nimport { GenCommand } from \"../commands/gen.ts\";\nimport { InitCommand } from \"../commands/init.ts\";\nimport { LintCommand } from \"../commands/lint.ts\";\nimport { RootCommand } from \"../commands/root.ts\";\nimport { RunCommand } from \"../commands/run.ts\";\nimport { TestCommand } from \"../commands/test.ts\";\nimport { TypecheckCommand } from \"../commands/typecheck.ts\";\nimport { VerifyCommand } from \"../commands/verify.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Register `tsx` when running in Node.js, ignore for Bun.\n *\n * It's required to have a full TypeScript support. (mostly .tsx files)\n */\n\nif (typeof Bun === \"undefined\") {\n const { register } = await import(\"tsx/esm/api\");\n register();\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Allow to extend Alepha CLI via `alepha.config.ts` file located in the project root.\n */\n\nclass AlephaCliExtension {\n protected readonly alepha = $inject(Alepha);\n protected readonly fs = $inject(FileSystemProvider);\n\n protected readonly onConfigure = $hook({\n on: \"configure\",\n handler: async () => {\n const root = process.cwd();\n const extensionPath = this.fs.join(root, \"alepha.config.ts\");\n const hasExtension = await this.fs.exists(extensionPath);\n if (!hasExtension) {\n return;\n }\n\n // import\n const { default: Extension } = await import(extensionPath);\n if (typeof Extension !== \"function\") {\n return;\n }\n\n this.alepha.inject(Extension, {\n args: [this.alepha],\n });\n },\n });\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport const AlephaCli = $module({\n name: \"alepha.cli\",\n services: [\n AlephaCliExtension,\n // Commands (one per file)\n BuildCommand,\n CleanCommand,\n DbCommand,\n DeployCommand,\n DevCommand,\n FormatCommand,\n InitCommand,\n LintCommand,\n RootCommand,\n RunCommand,\n TestCommand,\n TypecheckCommand,\n VerifyCommand,\n GenCommand,\n // Support services\n GitProvider,\n ],\n});\n","import { access, readdir, readFile } from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport { join } from \"node:path\";\nimport { $inject } from \"alepha\";\nimport { $command } from \"alepha/command\";\nimport { FileSystemProvider } from \"alepha/file\";\nimport type { InlineConfig } from \"tsdown\";\n\ninterface Module {\n name: string;\n dependencies: string[];\n native?: boolean;\n browser?: boolean;\n node?: boolean;\n}\n\nexport class AlephaPackageBuilderCli {\n src = \"src\";\n dist = \"dist\";\n fs = $inject(FileSystemProvider);\n\n make = $command({\n root: true,\n handler: async ({ run, root }) => {\n const modules: Array<Module> = [];\n\n const pkg = await readFile(\"package.json\", \"utf-8\");\n const pkgData = JSON.parse(pkg);\n const packageName = pkgData.name as string;\n\n await run(\"analyze modules\", async () => {\n modules.push(\n ...(await analyzeModules(join(root, this.src), packageName)),\n );\n });\n\n pkgData.exports = {};\n\n for (const item of modules) {\n let m = `./${item.name.replace(\"core\", \"\")}`;\n if (m.endsWith(\"/\")) m = m.slice(0, -1);\n const path = m;\n\n pkgData.exports[path] = {};\n // order is important here for compatibility\n pkgData.exports[path].types = `./src/${item.name}/index.ts`;\n if (item.native) {\n pkgData.exports[path][\"react-native\"] =\n `./src/${item.name}/index.native.ts`;\n } else if (item.browser) {\n pkgData.exports[path][\"react-native\"] =\n `./src/${item.name}/index.browser.ts`;\n }\n\n if (item.browser) {\n pkgData.exports[path].browser = `./src/${item.name}/index.browser.ts`;\n }\n\n pkgData.exports[path].import = `./src/${item.name}/index.ts`;\n pkgData.exports[path].default = `./src/${item.name}/index.ts`;\n }\n\n if (packageName === \"alepha\") {\n pkgData.exports[\"./tsconfig.base\"] = \"./tsconfig.base.json\";\n pkgData.exports[\"./package.json\"] = \"./package.json\";\n }\n\n if (packageName === \"@alepha/ui\") {\n pkgData.exports[\"./styles\"] = \"./src/core/styles.css\";\n pkgData.exports[\"./json/styles\"] = \"./src/json/styles.css\";\n }\n\n await this.fs.writeFile(\"package.json\", JSON.stringify(pkgData, null, 2));\n\n const tmpDir = join(root, \"node_modules/.alepha\");\n await this.fs.mkdir(tmpDir, { recursive: true }).catch(() => {});\n\n await this.fs.writeFile(\n join(tmpDir, \"module-dependencies.json\"),\n JSON.stringify(modules, null, 2),\n );\n\n const tsconfig = await readFile(\n join(root, \"../../tsconfig.json\"),\n \"utf-8\",\n );\n\n const external: string[] = Object.keys(\n JSON.parse(tsconfig).compilerOptions.paths,\n );\n\n external.push(\"bun\");\n external.push(\"bun:sqlite\");\n\n await run.rm(this.dist);\n\n const build = async (item: Module) => {\n const entries: InlineConfig[] = [];\n const src = join(root, this.src, item.name);\n const dest = join(root, this.dist, item.name);\n\n entries.push({\n entry: join(src, \"index.ts\"),\n outDir: dest,\n format: [\"esm\"],\n sourcemap: true,\n fixedExtension: false,\n platform: \"node\", // TODO: node must be enabled only if index.node.ts exists\n external,\n dts: {\n sourcemap: true,\n resolve: false,\n },\n });\n\n if (item.native) {\n entries.push({\n entry: join(src, \"index.native.ts\"),\n outDir: dest,\n platform: \"neutral\",\n sourcemap: true,\n dts: false,\n external,\n });\n }\n\n if (item.browser) {\n entries.push({\n entry: join(src, \"index.browser.ts\"),\n outDir: dest,\n platform: \"browser\",\n sourcemap: true,\n dts: false,\n external,\n });\n }\n\n const config = join(\n tmpDir,\n `tsdown-${item.name.replace(\"/\", \"-\")}.config.js`,\n );\n await this.fs.writeFile(\n config,\n `export default ${JSON.stringify(entries, null, 2)};`,\n );\n await run(`npx tsdown -c=${config}`);\n //await this.fs.rm(config);\n };\n\n const concurrency = Math.ceil(os.cpus().length / 2);\n const queue = modules.slice();\n const workers: Promise<void>[] = [];\n for (let i = 0; i < concurrency; i++) {\n const worker = (async () => {\n while (queue.length > 0) {\n const item = queue.shift();\n if (item) {\n await build(item);\n } else {\n await new Promise((r) => setTimeout(r, 100));\n }\n }\n })();\n workers.push(worker);\n }\n await Promise.all(workers);\n },\n });\n}\n\nasync function getAllFiles(dir: string): Promise<string[]> {\n const files: string[] = [];\n\n async function scan(currentDir: string) {\n const entries = await readdir(currentDir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(currentDir, entry.name);\n\n if (entry.isDirectory()) {\n await scan(fullPath);\n } else if (entry.isFile() && /\\.(ts|tsx)$/.test(entry.name)) {\n files.push(fullPath);\n }\n }\n }\n\n await scan(dir);\n return files;\n}\n\nfunction removeComments(content: string): string {\n // Remove single-line comments\n let cleaned = content.replace(/\\/\\/.*$/gm, \"\");\n\n // Remove multi-line comments\n cleaned = cleaned.replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\");\n\n return cleaned;\n}\n\nfunction extractAlephaDependencies(\n content: string,\n packageName: string,\n moduleName: string,\n): string[] {\n const deps = new Set<string>();\n const cleanedContent = removeComments(content);\n\n // Match: from \"alepha/xxx\" or from 'alepha/xxx'\n const importRegex = new RegExp(\n `from \"${packageName}/([a-zA-Z0-9_/]+)\";`,\n \"g\",\n );\n\n const matches = cleanedContent.matchAll(importRegex);\n for (const match of matches) {\n deps.add(match[1]);\n }\n\n return Array.from(deps);\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction detectCircularDependencies(modules: Module[]): void {\n const moduleMap = new Map(modules.map((m) => [m.name, m.dependencies]));\n\n function hasCycle(\n moduleName: string,\n visited: Set<string> = new Set(),\n path: string[] = [],\n ): string[] | null {\n if (visited.has(moduleName)) {\n // Found a cycle, return the path\n const cycleStart = path.indexOf(moduleName);\n return [...path.slice(cycleStart), moduleName];\n }\n\n const deps = moduleMap.get(moduleName);\n if (!deps) return null;\n\n visited.add(moduleName);\n path.push(moduleName);\n\n for (const dep of deps) {\n const cycle = hasCycle(dep, new Set(visited), [...path]);\n if (cycle) return cycle;\n }\n\n return null;\n }\n\n for (const module of modules) {\n const cycle = hasCycle(module.name);\n if (cycle) {\n throw new Error(`Circular dependency detected: ${cycle.join(\" -> \")}`);\n }\n }\n}\n\nexport async function analyzeModules(\n srcDir: string,\n packageName: string,\n): Promise<Module[]> {\n const modules: Module[] = [];\n\n async function scanDirectory(dir: string, prefix: string): Promise<void> {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const moduleName = prefix ? `${prefix}/${entry.name}` : entry.name;\n const modulePath = join(dir, entry.name);\n\n // Check if this directory has an index.ts (is a module)\n const hasIndex = await fileExists(join(modulePath, \"index.ts\"));\n\n if (hasIndex) {\n // This is a module\n const dependencies = new Set<string>();\n\n // Check for browser/node entry points\n const hasBrowser = await fileExists(\n join(modulePath, \"index.browser.ts\"),\n );\n const hasNative = await fileExists(\n join(modulePath, \"index.native.ts\"),\n );\n const hasNode = await fileExists(join(modulePath, \"index.node.ts\"));\n\n // Get all .ts/.tsx files in this module\n const files = await getAllFiles(modulePath);\n\n for (const file of files) {\n const content = await readFile(file, \"utf-8\");\n const deps = extractAlephaDependencies(\n content,\n packageName,\n moduleName,\n );\n for (const dep of deps) {\n if (dep.endsWith(\".ts\")) {\n throw new Error(\n `Invalid dependency '${dep}' in module '${moduleName}'. Do not include file extensions in Alepha module imports.`,\n );\n }\n if (dep.includes(\"-\")) {\n throw new Error(\n `Invalid dependency '${dep}' in module '${moduleName}'. Use '/' instead of '-' in Alepha module imports.`,\n );\n }\n dependencies.add(dep);\n }\n }\n\n const module: Module = {\n name: moduleName,\n dependencies: Array.from(dependencies),\n };\n\n if (hasNative) module.native = true;\n if (hasBrowser) module.browser = true;\n if (hasNode) module.node = true;\n\n modules.push(module);\n } else {\n // No index.ts, check subdirectories for modules\n await scanDirectory(modulePath, moduleName);\n }\n }\n }\n }\n\n await scanDirectory(srcDir, \"\");\n\n // Check for circular dependencies\n detectCircularDependencies(modules);\n\n return modules;\n}\n","import type { Alepha } from \"alepha\";\nimport type { CommandPrimitive } from \"alepha/command\";\n\nexport type AlephaCliConfig = (alepha: Alepha) => {\n commands?: Record<string, CommandPrimitive>;\n services?: Array<any>;\n};\n\nexport const defineConfig = (config: AlephaCliConfig) => {\n return (alepha: Alepha) => {\n const { commands, services = [] } = config(alepha);\n for (const it of services) {\n alepha.with(it);\n }\n return {\n ...commands,\n };\n };\n};\n\n/**\n * @alias defineConfig\n */\nexport const defineAlephaConfig = defineConfig;\n"],"mappings":"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"}