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
@@ -0,0 +1,315 @@
1
+ import { Alepha } from "alepha";
2
+ import { cliOptions } from "alepha/command";
3
+ import {
4
+ LogDestinationProvider,
5
+ MemoryDestinationProvider,
6
+ } from "alepha/logger";
7
+ import { describe, expect, test } from "vitest";
8
+ import {
9
+ ChangelogCommand,
10
+ changelogOptions,
11
+ GitMessageParser,
12
+ GitProvider,
13
+ } from "./changelog.ts";
14
+
15
+ // =============================================================================
16
+ // MOCK GIT PROVIDER
17
+ // =============================================================================
18
+
19
+ let currentMockResponses: Map<string, string> | null = null;
20
+
21
+ class MockGitProvider extends GitProvider {
22
+ override async exec(cmd: string, _cwd: string): Promise<string> {
23
+ if (!currentMockResponses) {
24
+ throw new Error("No git mocks configured");
25
+ }
26
+ const response = currentMockResponses.get(cmd);
27
+ if (response === undefined) {
28
+ throw new Error(`Unmocked git command: ${cmd}`);
29
+ }
30
+ return response;
31
+ }
32
+ }
33
+
34
+ function setMockGitResponses(
35
+ mocks: Array<{ cmd: string; response: string }>,
36
+ ): void {
37
+ currentMockResponses = new Map<string, string>();
38
+ for (const { cmd, response } of mocks) {
39
+ currentMockResponses.set(cmd, response);
40
+ }
41
+ }
42
+
43
+ // =============================================================================
44
+ // TESTS
45
+ // =============================================================================
46
+
47
+ describe("changelog", () => {
48
+ describe("GitMessageParser.parseCommit", () => {
49
+ const defaultConfig = { ignore: ["chore", "ci", "build", "test"] };
50
+
51
+ const getParser = () => {
52
+ const alepha = Alepha.create();
53
+ return alepha.inject(GitMessageParser);
54
+ };
55
+
56
+ test("should parse conventional commit with scope", () => {
57
+ const parser = getParser();
58
+ const result = parser.parseCommit(
59
+ "abc12345 feat(ui): add button component",
60
+ defaultConfig,
61
+ );
62
+
63
+ expect(result).toEqual({
64
+ hash: "abc12345",
65
+ type: "feat",
66
+ scope: "ui",
67
+ description: "add button component",
68
+ breaking: false,
69
+ });
70
+ });
71
+
72
+ test("should ignore conventional commit without scope", () => {
73
+ const parser = getParser();
74
+ const result = parser.parseCommit(
75
+ "def45678 fix: resolve memory leak",
76
+ defaultConfig,
77
+ );
78
+ expect(result).toBeNull();
79
+ });
80
+
81
+ test("should detect breaking change with ! marker", () => {
82
+ const parser = getParser();
83
+ const result = parser.parseCommit(
84
+ "aaa78901 feat(api)!: remove deprecated endpoint",
85
+ defaultConfig,
86
+ );
87
+
88
+ expect(result).toEqual({
89
+ hash: "aaa78901",
90
+ type: "feat",
91
+ scope: "api",
92
+ description: "remove deprecated endpoint",
93
+ breaking: true,
94
+ });
95
+ });
96
+
97
+ test("should detect breaking change in description", () => {
98
+ const parser = getParser();
99
+ const result = parser.parseCommit(
100
+ "bbb01234 feat(auth): breaking change to token format",
101
+ defaultConfig,
102
+ );
103
+
104
+ expect(result).toEqual({
105
+ hash: "bbb01234",
106
+ type: "feat",
107
+ scope: "auth",
108
+ description: "breaking change to token format",
109
+ breaking: true,
110
+ });
111
+ });
112
+
113
+ test("should ignore commits with ignored scope", () => {
114
+ const parser = getParser();
115
+ const result = parser.parseCommit(
116
+ "ccc34567 feat(chore): update deps",
117
+ defaultConfig,
118
+ );
119
+ expect(result).toBeNull();
120
+ });
121
+
122
+ test("should ignore commits with nested ignored scope", () => {
123
+ const parser = getParser();
124
+ const result = parser.parseCommit(
125
+ "ddd67890 feat(test/unit): add tests",
126
+ defaultConfig,
127
+ );
128
+ expect(result).toBeNull();
129
+ });
130
+
131
+ test("should ignore module-style commits (no type)", () => {
132
+ const parser = getParser();
133
+ const result = parser.parseCommit("eee90123 cli: add new command", {});
134
+ expect(result).toBeNull();
135
+ });
136
+
137
+ test("should return null for non-matching commits", () => {
138
+ const parser = getParser();
139
+ const result = parser.parseCommit(
140
+ "fff78901 random commit message",
141
+ defaultConfig,
142
+ );
143
+ expect(result).toBeNull();
144
+ });
145
+
146
+ test("should truncate hash to 8 characters", () => {
147
+ const parser = getParser();
148
+ const result = parser.parseCommit(
149
+ "abcdef1234567890 feat(core): something",
150
+ defaultConfig,
151
+ );
152
+ expect(result?.hash).toBe("abcdef12");
153
+ });
154
+
155
+ test("should parse all supported types", () => {
156
+ const parser = getParser();
157
+ const types = ["feat", "fix", "docs", "refactor", "perf", "revert"];
158
+
159
+ for (const type of types) {
160
+ const result = parser.parseCommit(
161
+ `abc12345 ${type}(core): test`,
162
+ defaultConfig,
163
+ );
164
+ expect(result?.type).toBe(type);
165
+ }
166
+ });
167
+
168
+ test("should handle nested scopes", () => {
169
+ const parser = getParser();
170
+ const result = parser.parseCommit(
171
+ "abc12345 feat(api/users): add endpoint",
172
+ defaultConfig,
173
+ );
174
+
175
+ expect(result).toEqual({
176
+ hash: "abc12345",
177
+ type: "feat",
178
+ scope: "api/users",
179
+ description: "add endpoint",
180
+ breaking: false,
181
+ });
182
+ });
183
+ });
184
+
185
+ describe("changelogOptions atom", () => {
186
+ test("should have default ignore list", async () => {
187
+ const alepha = Alepha.create();
188
+ await alepha.start();
189
+
190
+ const config = alepha.store.get(changelogOptions);
191
+ expect(config.ignore).toContain("chore");
192
+ expect(config.ignore).toContain("ci");
193
+ expect(config.ignore).toContain("build");
194
+ expect(config.ignore).toContain("test");
195
+ });
196
+
197
+ test("should allow custom configuration", async () => {
198
+ const alepha = Alepha.create();
199
+ alepha.set(changelogOptions, {
200
+ ignore: ["custom", "internal"],
201
+ });
202
+ await alepha.start();
203
+
204
+ const config = alepha.store.get(changelogOptions);
205
+ expect(config.ignore).toEqual(["custom", "internal"]);
206
+ });
207
+ });
208
+
209
+ describe("changelog command", () => {
210
+ const setupCommand = async (
211
+ gitMocks: { cmd: string; response: string }[],
212
+ argv: string[] = ["changelog"],
213
+ options?: { ignore?: string[] },
214
+ ) => {
215
+ setMockGitResponses(gitMocks);
216
+
217
+ const alepha = Alepha.create()
218
+ .with({
219
+ provide: LogDestinationProvider,
220
+ use: MemoryDestinationProvider,
221
+ })
222
+ .with({ provide: GitProvider, use: MockGitProvider })
223
+ .with(ChangelogCommand);
224
+
225
+ alepha.store.mut(cliOptions, (old) => ({
226
+ ...old,
227
+ argv,
228
+ }));
229
+
230
+ if (options) {
231
+ alepha.set(changelogOptions, options);
232
+ }
233
+
234
+ await alepha.start();
235
+
236
+ return {
237
+ alepha,
238
+ logger: alepha.inject(MemoryDestinationProvider),
239
+ };
240
+ };
241
+
242
+ test("should show changes since latest tag", async () => {
243
+ await setupCommand([
244
+ { cmd: "tag --sort=-version:refname", response: "1.0.0\n0.9.0\n" },
245
+ {
246
+ cmd: "log 1.0.0..HEAD --oneline",
247
+ response: [
248
+ "abc12345 feat(ui): add dashboard",
249
+ "def56789 fix(core): resolve crash",
250
+ ].join("\n"),
251
+ },
252
+ ]);
253
+ // Outputs to stdout - test verifies no error
254
+ });
255
+
256
+ test("should show changes from specified version", async () => {
257
+ await setupCommand(
258
+ [
259
+ {
260
+ cmd: "log 0.5.0..HEAD --oneline",
261
+ response: "abc12345 feat(api): new feature",
262
+ },
263
+ ],
264
+ ["changelog", "--from=0.5.0"],
265
+ );
266
+ // Outputs to stdout - test verifies no error
267
+ });
268
+
269
+ test("should handle no tags found", async () => {
270
+ await setupCommand([
271
+ { cmd: "tag --sort=-version:refname", response: "" },
272
+ ]);
273
+ // Should output "No version tags found" - no error
274
+ });
275
+
276
+ test("should handle no changes since tag", async () => {
277
+ await setupCommand([
278
+ { cmd: "tag --sort=-version:refname", response: "1.0.0\n" },
279
+ { cmd: "log 1.0.0..HEAD --oneline", response: "" },
280
+ ]);
281
+ // Should output "No changes since 1.0.0" - no error
282
+ });
283
+
284
+ test("should filter commits by ignore list", async () => {
285
+ await setupCommand(
286
+ [
287
+ { cmd: "tag --sort=-version:refname", response: "1.0.0\n" },
288
+ {
289
+ cmd: "log 1.0.0..HEAD --oneline",
290
+ response: [
291
+ "abc12345 feat(ui): add dashboard",
292
+ "def56789 feat(internal): should be filtered",
293
+ ].join("\n"),
294
+ },
295
+ ],
296
+ ["changelog"],
297
+ { ignore: ["internal"] },
298
+ );
299
+ // "feat(internal)" is filtered out
300
+ });
301
+
302
+ test("should use -f alias for --from", async () => {
303
+ await setupCommand(
304
+ [
305
+ {
306
+ cmd: "log 0.8.0..HEAD --oneline",
307
+ response: "abc12345 feat(cli): new command",
308
+ },
309
+ ],
310
+ ["changelog", "-f=0.8.0"],
311
+ );
312
+ // Outputs to stdout - test verifies no error
313
+ });
314
+ });
315
+ });
@@ -3,15 +3,15 @@ import { promisify } from "node:util";
3
3
  import { $inject, $use, t } from "alepha";
4
4
  import { $command } from "alepha/command";
5
5
  import { $logger } from "alepha/logger";
6
- import { changelogOptions } from "../atoms/changelogOptions.ts";
7
- import { GitMessageParser } from "../services/GitMessageParser.ts";
6
+ import { changelogOptions } from "../../atoms/changelogOptions.ts";
7
+ import { GitMessageParser } from "../../services/GitMessageParser.ts";
8
8
 
9
9
  export {
10
10
  type ChangelogOptions,
11
11
  changelogOptions,
12
12
  DEFAULT_IGNORE,
13
- } from "../atoms/changelogOptions.ts";
14
- export { GitMessageParser } from "../services/GitMessageParser.ts";
13
+ } from "../../atoms/changelogOptions.ts";
14
+ export { GitMessageParser } from "../../services/GitMessageParser.ts";
15
15
 
16
16
  const execAsync = promisify(exec);
17
17
 
@@ -45,23 +45,22 @@ export interface Commit {
45
45
  interface ChangelogEntry {
46
46
  features: Commit[];
47
47
  fixes: Commit[];
48
- breaking: Commit[];
49
48
  }
50
49
 
51
50
  // =============================================================================
52
- // CHANGELOG COMMANDS
51
+ // CHANGELOG COMMAND
53
52
  // =============================================================================
54
53
 
55
54
  /**
56
55
  * Changelog command for generating release notes from git commits.
57
56
  *
58
57
  * Usage:
59
- * - `alepha changelog` - Show unreleased changes since latest tag to HEAD
60
- * - `alepha changelog --from=1.0.0` - Show changes from version to HEAD
61
- * - `alepha changelog --from=1.0.0 --to=1.1.0` - Show changes between two refs
62
- * - `alepha changelog | tee -a CHANGELOG.md` - Append to file
58
+ * - `alepha gen changelog` - Show unreleased changes since latest tag to HEAD
59
+ * - `alepha gen changelog --from=1.0.0` - Show changes from version to HEAD
60
+ * - `alepha gen changelog --from=1.0.0 --to=1.1.0` - Show changes between two refs
61
+ * - `alepha gen changelog | tee -a CHANGELOG.md` - Append to file
63
62
  */
64
- export class ChangelogCommands {
63
+ export class ChangelogCommand {
65
64
  protected readonly log = $logger();
66
65
  protected readonly git = $inject(GitProvider);
67
66
  protected readonly parser = $inject(GitMessageParser);
@@ -74,9 +73,11 @@ export class ChangelogCommands {
74
73
  /**
75
74
  * Format a single commit line.
76
75
  * Example: `- **cli**: add new command (\`abc1234\`)`
76
+ * Breaking changes are flagged: `- **cli**: add new command [BREAKING] (\`abc1234\`)`
77
77
  */
78
78
  protected formatCommit(commit: Commit): string {
79
- return `- **${commit.scope}**: ${commit.description} (\`${commit.hash}\`)`;
79
+ const breaking = commit.breaking ? " [BREAKING]" : "";
80
+ return `- **${commit.scope}**: ${commit.description}${breaking} (\`${commit.hash}\`)`;
80
81
  }
81
82
 
82
83
  /**
@@ -85,14 +86,6 @@ export class ChangelogCommands {
85
86
  protected formatEntry(entry: ChangelogEntry): string {
86
87
  const sections: string[] = [];
87
88
 
88
- if (entry.breaking.length > 0) {
89
- sections.push("### Breaking Changes\n");
90
- for (const commit of entry.breaking) {
91
- sections.push(this.formatCommit(commit));
92
- }
93
- sections.push("");
94
- }
95
-
96
89
  if (entry.features.length > 0) {
97
90
  sections.push("### Features\n");
98
91
  for (const commit of entry.features) {
@@ -123,7 +116,6 @@ export class ChangelogCommands {
123
116
  const entry: ChangelogEntry = {
124
117
  features: [],
125
118
  fixes: [],
126
- breaking: [],
127
119
  };
128
120
 
129
121
  for (const line of commitsOutput.trim().split("\n")) {
@@ -137,10 +129,7 @@ export class ChangelogCommands {
137
129
 
138
130
  this.log.trace("Parsed commit", { commit });
139
131
 
140
- // Categorize commit
141
- if (commit.breaking) {
142
- entry.breaking.push(commit);
143
- }
132
+ // Categorize commit (breaking flag is preserved on the commit itself)
144
133
  if (commit.type === "feat") {
145
134
  entry.features.push(commit);
146
135
  } else if (commit.type === "fix") {
@@ -155,11 +144,7 @@ export class ChangelogCommands {
155
144
  * Check if entry has any public commits.
156
145
  */
157
146
  protected hasChanges(entry: ChangelogEntry): boolean {
158
- return (
159
- entry.features.length > 0 ||
160
- entry.fixes.length > 0 ||
161
- entry.breaking.length > 0
162
- );
147
+ return entry.features.length > 0 || entry.fixes.length > 0;
163
148
  }
164
149
 
165
150
  /**
@@ -181,7 +166,7 @@ export class ChangelogCommands {
181
166
  // COMMAND
182
167
  // ---------------------------------------------------------------------------
183
168
 
184
- public readonly changelog = $command({
169
+ public readonly command = $command({
185
170
  name: "changelog",
186
171
  description:
187
172
  "Generate changelog from conventional commits (outputs to stdout)",
@@ -0,0 +1,71 @@
1
+ import { $inject, t } from "alepha";
2
+ import { $command } from "alepha/command";
3
+ import { FileSystemProvider } from "alepha/file";
4
+ import { $logger } from "alepha/logger";
5
+ import { ServerSwaggerProvider } from "alepha/server/swagger";
6
+ import { AlephaCliUtils } from "../../services/AlephaCliUtils.ts";
7
+
8
+ export class OpenApiCommand {
9
+ protected readonly log = $logger();
10
+ protected readonly utils = $inject(AlephaCliUtils);
11
+ protected readonly fs = $inject(FileSystemProvider);
12
+
13
+ public readonly command = $command({
14
+ name: "openapi",
15
+ description: "Generate OpenAPI specification from actions",
16
+ flags: t.object({
17
+ out: t.optional(
18
+ t.text({
19
+ aliases: ["o"],
20
+ description: "Output file path",
21
+ }),
22
+ ),
23
+ }),
24
+ handler: async ({ root, flags }) => {
25
+ const { alepha } = await this.utils.loadAlephaFromServerEntryFile(root);
26
+
27
+ try {
28
+ const openapiProvider = alepha.inject(
29
+ ServerSwaggerProvider,
30
+ ) as ServerSwaggerProvider;
31
+
32
+ await alepha.events.emit("configure", alepha);
33
+
34
+ let json: any = openapiProvider.json;
35
+
36
+ if (!json) {
37
+ json = openapiProvider.generateSwaggerDoc({
38
+ info: {
39
+ title: "API Documentation",
40
+ version: "1.0.0",
41
+ },
42
+ });
43
+ }
44
+
45
+ if (!json) {
46
+ this.log.error("No actions found to generate OpenAPI specification.");
47
+ return;
48
+ }
49
+
50
+ if (flags.out) {
51
+ await this.fs.writeFile(
52
+ this.fs.join(root, flags.out),
53
+ JSON.stringify(json, null, 2),
54
+ );
55
+ } else {
56
+ this.log.info(JSON.stringify(json, null, 2));
57
+ }
58
+ } catch (err) {
59
+ const message = err instanceof Error ? err.message : String(err);
60
+ if (message.includes("Service not found")) {
61
+ this.log.error(
62
+ "Missing $swagger() primitive in your server configuration.",
63
+ );
64
+ return;
65
+ }
66
+
67
+ this.log.error(`OpenAPI generation failed - ${message}`, { err });
68
+ }
69
+ },
70
+ });
71
+ }
@@ -0,0 +1,18 @@
1
+ import { $inject } from "alepha";
2
+ import { $command } from "alepha/command";
3
+ import { ChangelogCommand } from "./gen/changelog.ts";
4
+ import { OpenApiCommand } from "./gen/openapi.ts";
5
+
6
+ export class GenCommand {
7
+ protected readonly changelog = $inject(ChangelogCommand);
8
+ protected readonly openapi = $inject(OpenApiCommand);
9
+
10
+ public readonly gen = $command({
11
+ name: "gen",
12
+ description: "Generate code, documentation, ...",
13
+ children: [this.changelog.command, this.openapi.command],
14
+ handler: async ({ help }) => {
15
+ help();
16
+ },
17
+ });
18
+ }
@@ -1,48 +1,10 @@
1
1
  import { $inject, t } from "alepha";
2
- import { $command, CliProvider } from "alepha/command";
3
- import { $logger } from "alepha/logger";
2
+ import { $command } from "alepha/command";
4
3
  import { AlephaCliUtils } from "../services/AlephaCliUtils.ts";
5
- import { version } from "../version.ts";
6
4
 
7
- export class CoreCommands {
8
- protected readonly log = $logger();
9
- protected readonly cli = $inject(CliProvider);
5
+ export class InitCommand {
10
6
  protected readonly utils = $inject(AlephaCliUtils);
11
7
 
12
- /**
13
- * Called when no command is provided
14
- */
15
- public readonly root = $command({
16
- root: true,
17
- flags: t.object({
18
- version: t.optional(
19
- t.boolean({
20
- description: "Show Alepha CLI version",
21
- aliases: ["v"],
22
- }),
23
- ),
24
- }),
25
- handler: async ({ flags }) => {
26
- if (flags.version) {
27
- this.log.info(version);
28
- return;
29
- }
30
-
31
- this.cli.printHelp();
32
- },
33
- });
34
-
35
- /**
36
- * Clean the project, removing the "dist" directory
37
- */
38
- public readonly clean = $command({
39
- name: "clean",
40
- description: "Clean the project",
41
- handler: async ({ run }) => {
42
- await run.rm("./dist");
43
- },
44
- });
45
-
46
8
  /**
47
9
  * Ensure the project has the necessary Alepha configuration files.
48
10
  * Add the correct dependencies to package.json and install them.
@@ -99,6 +61,8 @@ export class CoreCommands {
99
61
  if (pm === "yarn") {
100
62
  await this.utils.ensureYarn(root);
101
63
  await run("yarn set version stable");
64
+ } else if (pm === "bun") {
65
+ await this.utils.ensureBun(root);
102
66
  } else if (pm === "pnpm") {
103
67
  await this.utils.ensurePnpm(root);
104
68
  } else {
@@ -0,0 +1,17 @@
1
+ import { $inject } from "alepha";
2
+ import { $command } from "alepha/command";
3
+ import { AlephaCliUtils } from "../services/AlephaCliUtils.ts";
4
+
5
+ export class LintCommand {
6
+ protected readonly utils = $inject(AlephaCliUtils);
7
+
8
+ public readonly lint = $command({
9
+ name: "lint",
10
+ description: "Run linter across the codebase using Biome",
11
+ handler: async ({ root }) => {
12
+ await this.utils.ensureConfig(root, { biomeJson: true });
13
+ await this.utils.ensureDependency(root, "@biomejs/biome");
14
+ await this.utils.exec("biome check --formatter-enabled=false --fix");
15
+ },
16
+ });
17
+ }
@@ -0,0 +1,41 @@
1
+ import { $inject, Alepha, t } from "alepha";
2
+ import { $command, CliProvider } from "alepha/command";
3
+ import { $logger, ConsoleColorProvider } from "alepha/logger";
4
+ import { version } from "../version.ts";
5
+
6
+ export class RootCommand {
7
+ protected readonly log = $logger();
8
+ protected readonly cli = $inject(CliProvider);
9
+ protected readonly alepha = $inject(Alepha);
10
+ protected readonly color = $inject(ConsoleColorProvider);
11
+
12
+ /**
13
+ * Called when no command is provided
14
+ */
15
+ public readonly root = $command({
16
+ root: true,
17
+ flags: t.object({
18
+ version: t.optional(
19
+ t.boolean({
20
+ description: "Show Alepha CLI version",
21
+ aliases: ["v"],
22
+ }),
23
+ ),
24
+ }),
25
+ handler: async ({ flags }) => {
26
+ if (flags.version) {
27
+ this.log.info(this.color.set("WHITE_BOLD", `Alepha v${version}`));
28
+ if (this.alepha.isBun()) {
29
+ this.log.info(this.color.set("GREY_DARK", `└─ Bun v${Bun.version}`));
30
+ } else {
31
+ this.log.info(
32
+ this.color.set("GREY_DARK", `└─ Node ${process.version}`),
33
+ );
34
+ }
35
+ return;
36
+ }
37
+
38
+ this.cli.printHelp();
39
+ },
40
+ });
41
+ }
@@ -0,0 +1,24 @@
1
+ import { $inject, t } from "alepha";
2
+ import { $command } from "alepha/command";
3
+ import { AlephaCliUtils } from "../services/AlephaCliUtils.ts";
4
+
5
+ export class RunCommand {
6
+ protected readonly utils = $inject(AlephaCliUtils);
7
+
8
+ public readonly run = $command({
9
+ name: "run",
10
+ hide: true,
11
+ description: "Run a TypeScript file directly",
12
+ flags: t.object({
13
+ watch: t.optional(
14
+ t.boolean({ description: "Watch file for changes", alias: "w" }),
15
+ ),
16
+ }),
17
+ summary: false,
18
+ args: t.text({ title: "path", description: "Filepath to run" }),
19
+ handler: async ({ args, flags, root }) => {
20
+ await this.utils.ensureTsConfig(root);
21
+ await this.utils.exec(`tsx ${flags.watch ? "watch " : ""}${args}`);
22
+ },
23
+ });
24
+ }