alepha 0.14.3 → 0.15.0

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 (317) hide show
  1. package/README.md +2 -5
  2. package/dist/api/audits/index.d.ts +620 -811
  3. package/dist/api/audits/index.d.ts.map +1 -1
  4. package/dist/api/files/index.d.ts +185 -377
  5. package/dist/api/files/index.d.ts.map +1 -1
  6. package/dist/api/files/index.js +0 -1
  7. package/dist/api/files/index.js.map +1 -1
  8. package/dist/api/jobs/index.d.ts +245 -435
  9. package/dist/api/jobs/index.d.ts.map +1 -1
  10. package/dist/api/notifications/index.d.ts +238 -429
  11. package/dist/api/notifications/index.d.ts.map +1 -1
  12. package/dist/api/parameters/index.d.ts +236 -427
  13. package/dist/api/parameters/index.d.ts.map +1 -1
  14. package/dist/api/users/index.browser.js +1 -2
  15. package/dist/api/users/index.browser.js.map +1 -1
  16. package/dist/api/users/index.d.ts +1010 -1196
  17. package/dist/api/users/index.d.ts.map +1 -1
  18. package/dist/api/users/index.js +178 -151
  19. package/dist/api/users/index.js.map +1 -1
  20. package/dist/api/verifications/index.d.ts +17 -17
  21. package/dist/api/verifications/index.d.ts.map +1 -1
  22. package/dist/batch/index.d.ts +122 -122
  23. package/dist/batch/index.d.ts.map +1 -1
  24. package/dist/batch/index.js +1 -2
  25. package/dist/batch/index.js.map +1 -1
  26. package/dist/bucket/index.d.ts +163 -163
  27. package/dist/bucket/index.d.ts.map +1 -1
  28. package/dist/cache/core/index.d.ts +46 -46
  29. package/dist/cache/core/index.d.ts.map +1 -1
  30. package/dist/cache/redis/index.d.ts.map +1 -1
  31. package/dist/cli/index.d.ts +384 -285
  32. package/dist/cli/index.d.ts.map +1 -1
  33. package/dist/cli/index.js +1113 -623
  34. package/dist/cli/index.js.map +1 -1
  35. package/dist/command/index.d.ts +299 -300
  36. package/dist/command/index.d.ts.map +1 -1
  37. package/dist/command/index.js +13 -9
  38. package/dist/command/index.js.map +1 -1
  39. package/dist/core/index.browser.js +445 -103
  40. package/dist/core/index.browser.js.map +1 -1
  41. package/dist/core/index.d.ts +733 -625
  42. package/dist/core/index.d.ts.map +1 -1
  43. package/dist/core/index.js +446 -103
  44. package/dist/core/index.js.map +1 -1
  45. package/dist/core/index.native.js +445 -103
  46. package/dist/core/index.native.js.map +1 -1
  47. package/dist/datetime/index.d.ts +44 -44
  48. package/dist/datetime/index.d.ts.map +1 -1
  49. package/dist/datetime/index.js +4 -4
  50. package/dist/datetime/index.js.map +1 -1
  51. package/dist/email/index.d.ts +97 -50
  52. package/dist/email/index.d.ts.map +1 -1
  53. package/dist/email/index.js +129 -33
  54. package/dist/email/index.js.map +1 -1
  55. package/dist/fake/index.d.ts +7981 -14
  56. package/dist/fake/index.d.ts.map +1 -1
  57. package/dist/file/index.d.ts +523 -390
  58. package/dist/file/index.d.ts.map +1 -1
  59. package/dist/file/index.js +253 -1
  60. package/dist/file/index.js.map +1 -1
  61. package/dist/lock/core/index.d.ts +208 -208
  62. package/dist/lock/core/index.d.ts.map +1 -1
  63. package/dist/lock/redis/index.d.ts.map +1 -1
  64. package/dist/logger/index.d.ts +25 -26
  65. package/dist/logger/index.d.ts.map +1 -1
  66. package/dist/logger/index.js +12 -2
  67. package/dist/logger/index.js.map +1 -1
  68. package/dist/mcp/index.d.ts +197 -197
  69. package/dist/mcp/index.d.ts.map +1 -1
  70. package/dist/mcp/index.js +1 -1
  71. package/dist/mcp/index.js.map +1 -1
  72. package/dist/orm/chunk-DtkW-qnP.js +38 -0
  73. package/dist/orm/index.browser.js.map +1 -1
  74. package/dist/orm/index.bun.js +2814 -0
  75. package/dist/orm/index.bun.js.map +1 -0
  76. package/dist/orm/index.d.ts +1228 -1216
  77. package/dist/orm/index.d.ts.map +1 -1
  78. package/dist/orm/index.js +2041 -1967
  79. package/dist/orm/index.js.map +1 -1
  80. package/dist/queue/core/index.d.ts +248 -248
  81. package/dist/queue/core/index.d.ts.map +1 -1
  82. package/dist/queue/redis/index.d.ts.map +1 -1
  83. package/dist/redis/index.bun.js +285 -0
  84. package/dist/redis/index.bun.js.map +1 -0
  85. package/dist/redis/index.d.ts +118 -136
  86. package/dist/redis/index.d.ts.map +1 -1
  87. package/dist/redis/index.js +18 -38
  88. package/dist/redis/index.js.map +1 -1
  89. package/dist/retry/index.d.ts +69 -69
  90. package/dist/retry/index.d.ts.map +1 -1
  91. package/dist/router/index.d.ts +6 -6
  92. package/dist/router/index.d.ts.map +1 -1
  93. package/dist/scheduler/index.d.ts +25 -25
  94. package/dist/scheduler/index.d.ts.map +1 -1
  95. package/dist/security/index.browser.js +5 -1
  96. package/dist/security/index.browser.js.map +1 -1
  97. package/dist/security/index.d.ts +417 -254
  98. package/dist/security/index.d.ts.map +1 -1
  99. package/dist/security/index.js +386 -86
  100. package/dist/security/index.js.map +1 -1
  101. package/dist/server/auth/index.d.ts +110 -110
  102. package/dist/server/auth/index.d.ts.map +1 -1
  103. package/dist/server/auth/index.js +20 -20
  104. package/dist/server/auth/index.js.map +1 -1
  105. package/dist/server/cache/index.d.ts +62 -47
  106. package/dist/server/cache/index.d.ts.map +1 -1
  107. package/dist/server/cache/index.js +56 -3
  108. package/dist/server/cache/index.js.map +1 -1
  109. package/dist/server/compress/index.d.ts +6 -0
  110. package/dist/server/compress/index.d.ts.map +1 -1
  111. package/dist/server/compress/index.js +36 -1
  112. package/dist/server/compress/index.js.map +1 -1
  113. package/dist/server/cookies/index.d.ts +6 -6
  114. package/dist/server/cookies/index.d.ts.map +1 -1
  115. package/dist/server/cookies/index.js +3 -3
  116. package/dist/server/cookies/index.js.map +1 -1
  117. package/dist/server/core/index.browser.js +2 -2
  118. package/dist/server/core/index.browser.js.map +1 -1
  119. package/dist/server/core/index.d.ts +242 -150
  120. package/dist/server/core/index.d.ts.map +1 -1
  121. package/dist/server/core/index.js +294 -125
  122. package/dist/server/core/index.js.map +1 -1
  123. package/dist/server/cors/index.d.ts +11 -12
  124. package/dist/server/cors/index.d.ts.map +1 -1
  125. package/dist/server/health/index.d.ts +0 -1
  126. package/dist/server/health/index.d.ts.map +1 -1
  127. package/dist/server/helmet/index.d.ts +2 -2
  128. package/dist/server/helmet/index.d.ts.map +1 -1
  129. package/dist/server/links/index.browser.js.map +1 -1
  130. package/dist/server/links/index.d.ts +123 -124
  131. package/dist/server/links/index.d.ts.map +1 -1
  132. package/dist/server/links/index.js +1 -2
  133. package/dist/server/links/index.js.map +1 -1
  134. package/dist/server/metrics/index.d.ts.map +1 -1
  135. package/dist/server/multipart/index.d.ts +6 -6
  136. package/dist/server/multipart/index.d.ts.map +1 -1
  137. package/dist/server/proxy/index.d.ts +102 -103
  138. package/dist/server/proxy/index.d.ts.map +1 -1
  139. package/dist/server/rate-limit/index.d.ts +16 -16
  140. package/dist/server/rate-limit/index.d.ts.map +1 -1
  141. package/dist/server/static/index.d.ts +44 -44
  142. package/dist/server/static/index.d.ts.map +1 -1
  143. package/dist/server/static/index.js +4 -0
  144. package/dist/server/static/index.js.map +1 -1
  145. package/dist/server/swagger/index.d.ts +48 -49
  146. package/dist/server/swagger/index.d.ts.map +1 -1
  147. package/dist/server/swagger/index.js +3 -5
  148. package/dist/server/swagger/index.js.map +1 -1
  149. package/dist/sms/index.d.ts +13 -11
  150. package/dist/sms/index.d.ts.map +1 -1
  151. package/dist/sms/index.js +7 -7
  152. package/dist/sms/index.js.map +1 -1
  153. package/dist/thread/index.d.ts +71 -72
  154. package/dist/thread/index.d.ts.map +1 -1
  155. package/dist/topic/core/index.d.ts +318 -318
  156. package/dist/topic/core/index.d.ts.map +1 -1
  157. package/dist/topic/redis/index.d.ts +6 -6
  158. package/dist/topic/redis/index.d.ts.map +1 -1
  159. package/dist/vite/index.d.ts +5805 -249
  160. package/dist/vite/index.d.ts.map +1 -1
  161. package/dist/vite/index.js +599 -513
  162. package/dist/vite/index.js.map +1 -1
  163. package/dist/websocket/index.browser.js +6 -6
  164. package/dist/websocket/index.browser.js.map +1 -1
  165. package/dist/websocket/index.d.ts +247 -247
  166. package/dist/websocket/index.d.ts.map +1 -1
  167. package/dist/websocket/index.js +6 -6
  168. package/dist/websocket/index.js.map +1 -1
  169. package/package.json +9 -14
  170. package/src/api/files/controllers/AdminFileStatsController.ts +0 -1
  171. package/src/api/users/atoms/realmAuthSettingsAtom.ts +5 -0
  172. package/src/api/users/controllers/{UserRealmController.ts → RealmController.ts} +11 -11
  173. package/src/api/users/entities/users.ts +1 -1
  174. package/src/api/users/index.ts +8 -8
  175. package/src/api/users/primitives/{$userRealm.ts → $realm.ts} +17 -19
  176. package/src/api/users/providers/{UserRealmProvider.ts → RealmProvider.ts} +26 -30
  177. package/src/api/users/schemas/{userRealmConfigSchema.ts → realmConfigSchema.ts} +2 -2
  178. package/src/api/users/services/CredentialService.ts +7 -7
  179. package/src/api/users/services/IdentityService.ts +4 -4
  180. package/src/api/users/services/RegistrationService.spec.ts +25 -27
  181. package/src/api/users/services/RegistrationService.ts +38 -27
  182. package/src/api/users/services/SessionCrudService.ts +3 -3
  183. package/src/api/users/services/SessionService.spec.ts +3 -3
  184. package/src/api/users/services/SessionService.ts +28 -9
  185. package/src/api/users/services/UserService.ts +7 -7
  186. package/src/batch/providers/BatchProvider.ts +1 -2
  187. package/src/cli/apps/AlephaCli.ts +0 -2
  188. package/src/cli/apps/AlephaPackageBuilderCli.ts +38 -19
  189. package/src/cli/assets/apiHelloControllerTs.ts +18 -0
  190. package/src/cli/assets/apiIndexTs.ts +16 -0
  191. package/src/cli/assets/claudeMd.ts +303 -0
  192. package/src/cli/assets/mainBrowserTs.ts +2 -2
  193. package/src/cli/assets/mainServerTs.ts +24 -0
  194. package/src/cli/assets/webAppRouterTs.ts +15 -0
  195. package/src/cli/assets/webHelloComponentTsx.ts +16 -0
  196. package/src/cli/assets/webIndexTs.ts +16 -0
  197. package/src/cli/atoms/buildOptions.ts +88 -0
  198. package/src/cli/commands/build.ts +70 -87
  199. package/src/cli/commands/db.ts +21 -22
  200. package/src/cli/commands/deploy.ts +17 -5
  201. package/src/cli/commands/dev.ts +22 -14
  202. package/src/cli/commands/format.ts +8 -2
  203. package/src/cli/commands/gen/env.ts +53 -0
  204. package/src/cli/commands/gen/openapi.ts +1 -1
  205. package/src/cli/commands/gen/resource.ts +15 -0
  206. package/src/cli/commands/gen.ts +7 -1
  207. package/src/cli/commands/init.ts +74 -30
  208. package/src/cli/commands/lint.ts +8 -2
  209. package/src/cli/commands/test.ts +8 -3
  210. package/src/cli/commands/typecheck.ts +5 -1
  211. package/src/cli/commands/verify.ts +5 -3
  212. package/src/cli/defineConfig.ts +49 -7
  213. package/src/cli/index.ts +0 -1
  214. package/src/cli/services/AlephaCliUtils.ts +39 -589
  215. package/src/cli/services/PackageManagerUtils.ts +301 -0
  216. package/src/cli/services/ProjectScaffolder.ts +306 -0
  217. package/src/command/helpers/Runner.spec.ts +2 -2
  218. package/src/command/helpers/Runner.ts +16 -4
  219. package/src/command/primitives/$command.ts +0 -6
  220. package/src/command/providers/CliProvider.ts +1 -3
  221. package/src/core/Alepha.ts +42 -0
  222. package/src/core/__tests__/Alepha-graph.spec.ts +4 -0
  223. package/src/core/index.shared.ts +1 -0
  224. package/src/core/index.ts +2 -0
  225. package/src/core/primitives/$hook.ts +6 -2
  226. package/src/core/primitives/$module.spec.ts +4 -0
  227. package/src/core/providers/AlsProvider.ts +1 -1
  228. package/src/core/providers/CodecManager.spec.ts +12 -6
  229. package/src/core/providers/CodecManager.ts +26 -6
  230. package/src/core/providers/EventManager.ts +169 -13
  231. package/src/core/providers/KeylessJsonSchemaCodec.spec.ts +621 -0
  232. package/src/core/providers/KeylessJsonSchemaCodec.ts +407 -0
  233. package/src/core/providers/StateManager.spec.ts +27 -16
  234. package/src/email/providers/LocalEmailProvider.spec.ts +111 -87
  235. package/src/email/providers/LocalEmailProvider.ts +52 -15
  236. package/src/email/providers/NodemailerEmailProvider.ts +167 -56
  237. package/src/file/errors/FileError.ts +7 -0
  238. package/src/file/index.ts +9 -1
  239. package/src/file/providers/MemoryFileSystemProvider.ts +393 -0
  240. package/src/logger/index.ts +15 -3
  241. package/src/mcp/transports/StdioMcpTransport.ts +1 -1
  242. package/src/orm/index.browser.ts +1 -19
  243. package/src/orm/index.bun.ts +77 -0
  244. package/src/orm/index.shared-server.ts +22 -0
  245. package/src/orm/index.shared.ts +15 -0
  246. package/src/orm/index.ts +13 -39
  247. package/src/orm/providers/drivers/BunPostgresProvider.ts +3 -5
  248. package/src/orm/providers/drivers/BunSqliteProvider.ts +1 -1
  249. package/src/orm/providers/drivers/CloudflareD1Provider.ts +4 -0
  250. package/src/orm/providers/drivers/DatabaseProvider.ts +4 -0
  251. package/src/orm/providers/drivers/PglitePostgresProvider.ts +4 -0
  252. package/src/orm/services/Repository.ts +8 -0
  253. package/src/queue/core/providers/WorkerProvider.spec.ts +48 -32
  254. package/src/redis/index.bun.ts +35 -0
  255. package/src/redis/providers/BunRedisProvider.ts +12 -43
  256. package/src/redis/providers/BunRedisSubscriberProvider.ts +2 -3
  257. package/src/redis/providers/NodeRedisProvider.ts +16 -34
  258. package/src/{server/security → security}/__tests__/BasicAuth.spec.ts +11 -11
  259. package/src/{server/security → security}/__tests__/ServerSecurityProvider-realm.spec.ts +21 -16
  260. package/src/{server/security/providers → security/__tests__}/ServerSecurityProvider.spec.ts +5 -5
  261. package/src/security/index.browser.ts +5 -0
  262. package/src/security/index.ts +90 -7
  263. package/src/security/primitives/{$realm.spec.ts → $issuer.spec.ts} +11 -11
  264. package/src/security/primitives/{$realm.ts → $issuer.ts} +20 -17
  265. package/src/security/primitives/$role.ts +5 -5
  266. package/src/security/primitives/$serviceAccount.spec.ts +5 -5
  267. package/src/security/primitives/$serviceAccount.ts +3 -3
  268. package/src/{server/security → security}/providers/ServerSecurityProvider.ts +5 -7
  269. package/src/server/auth/primitives/$auth.ts +10 -10
  270. package/src/server/auth/primitives/$authCredentials.ts +3 -3
  271. package/src/server/auth/primitives/$authGithub.ts +3 -3
  272. package/src/server/auth/primitives/$authGoogle.ts +3 -3
  273. package/src/server/auth/providers/ServerAuthProvider.ts +13 -13
  274. package/src/server/cache/providers/ServerCacheProvider.spec.ts +183 -0
  275. package/src/server/cache/providers/ServerCacheProvider.ts +95 -10
  276. package/src/server/compress/providers/ServerCompressProvider.ts +61 -2
  277. package/src/server/cookies/providers/ServerCookiesProvider.ts +3 -3
  278. package/src/server/core/helpers/ServerReply.ts +2 -2
  279. package/src/server/core/providers/NodeHttpServerProvider.ts +25 -6
  280. package/src/server/core/providers/ServerBodyParserProvider.ts +19 -23
  281. package/src/server/core/providers/ServerLoggerProvider.ts +23 -19
  282. package/src/server/core/providers/ServerProvider.ts +155 -22
  283. package/src/server/core/providers/ServerRouterProvider.ts +259 -115
  284. package/src/server/core/providers/ServerTimingProvider.ts +2 -2
  285. package/src/server/links/index.ts +1 -1
  286. package/src/server/links/providers/LinkProvider.ts +1 -1
  287. package/src/server/static/providers/ServerStaticProvider.ts +10 -0
  288. package/src/server/swagger/index.ts +1 -1
  289. package/src/server/swagger/providers/ServerSwaggerProvider.ts +5 -8
  290. package/src/sms/providers/LocalSmsProvider.spec.ts +153 -111
  291. package/src/sms/providers/LocalSmsProvider.ts +8 -7
  292. package/src/vite/helpers/boot.ts +28 -17
  293. package/src/vite/helpers/importViteReact.ts +13 -0
  294. package/src/vite/index.ts +1 -21
  295. package/src/vite/plugins/viteAlephaDev.ts +16 -1
  296. package/src/vite/plugins/viteAlephaSsrPreload.ts +222 -0
  297. package/src/vite/tasks/buildClient.ts +11 -0
  298. package/src/vite/tasks/buildServer.ts +59 -4
  299. package/src/vite/tasks/devServer.ts +71 -0
  300. package/src/vite/tasks/generateCloudflare.ts +7 -0
  301. package/src/vite/tasks/index.ts +2 -1
  302. package/dist/server/security/index.browser.js +0 -13
  303. package/dist/server/security/index.browser.js.map +0 -1
  304. package/dist/server/security/index.d.ts +0 -173
  305. package/dist/server/security/index.d.ts.map +0 -1
  306. package/dist/server/security/index.js +0 -311
  307. package/dist/server/security/index.js.map +0 -1
  308. package/src/cli/assets/appRouterTs.ts +0 -9
  309. package/src/cli/assets/mainTs.ts +0 -13
  310. package/src/cli/assets/viteConfigTs.ts +0 -14
  311. package/src/cli/commands/run.ts +0 -24
  312. package/src/server/security/index.browser.ts +0 -10
  313. package/src/server/security/index.ts +0 -94
  314. package/src/vite/plugins/viteAlepha.ts +0 -37
  315. package/src/vite/plugins/viteAlephaBuild.ts +0 -281
  316. /package/src/{server/security → security}/primitives/$basicAuth.ts +0 -0
  317. /package/src/{server/security → security}/providers/ServerBasicAuthProvider.ts +0 -0
@@ -1,9 +1,15 @@
1
1
  import { $inject, t } from "alepha";
2
2
  import { $command } from "alepha/command";
3
+ import { FileSystemProvider } from "alepha/file";
3
4
  import { AlephaCliUtils } from "../services/AlephaCliUtils.ts";
5
+ import { PackageManagerUtils } from "../services/PackageManagerUtils.ts";
6
+ import { ProjectScaffolder } from "../services/ProjectScaffolder.ts";
4
7
 
5
8
  export class InitCommand {
6
9
  protected readonly utils = $inject(AlephaCliUtils);
10
+ protected readonly pm = $inject(PackageManagerUtils);
11
+ protected readonly scaffolder = $inject(ProjectScaffolder);
12
+ protected readonly fs = $inject(FileSystemProvider);
7
13
 
8
14
  /**
9
15
  * Ensure the project has the necessary Alepha configuration files.
@@ -12,80 +18,118 @@ export class InitCommand {
12
18
  public readonly init = $command({
13
19
  name: "init",
14
20
  description: "Add missing Alepha configuration files to the project",
21
+ args: t.optional(
22
+ t.text({
23
+ title: "path",
24
+ trim: true,
25
+ lowercase: true,
26
+ }),
27
+ ),
15
28
  flags: t.object({
29
+ agent: t.optional(
30
+ t.boolean({
31
+ aliases: ["a"],
32
+ description: "Add CLAUDE.md for Claude Code AI assistant",
33
+ }),
34
+ ),
16
35
  // choose package manager
17
36
  yarn: t.optional(t.boolean({ description: "Use Yarn package manager" })),
18
37
  pnpm: t.optional(t.boolean({ description: "Use pnpm package manager" })),
19
38
  npm: t.optional(t.boolean({ description: "Use npm package manager" })),
20
39
  bun: t.optional(t.boolean({ description: "Use Bun package manager" })),
21
40
  // choose which dependencies to add
22
- react: t.optional(
23
- t.boolean({ description: "Include Alepha React dependencies" }),
41
+ web: t.optional(
42
+ t.boolean({
43
+ aliases: ["r"],
44
+ description: "Include Alepha React dependencies",
45
+ }),
24
46
  ),
25
- ui: t.optional(
47
+ admin: t.optional(
26
48
  t.boolean({ description: "Include Alepha UI dependencies" }),
27
49
  ),
28
50
  test: t.optional(
29
51
  t.boolean({ description: "Include Vitest and create test directory" }),
30
52
  ),
31
53
  }),
32
- handler: async ({ run, flags, root }) => {
33
- if (flags.ui) {
34
- flags.react = true;
54
+ handler: async ({ run, flags, root, args }) => {
55
+ if (flags.admin) {
56
+ flags.web = true;
57
+ }
58
+
59
+ if (args) {
60
+ root = this.fs.join(root, args);
61
+ await this.fs.mkdir(root);
35
62
  }
36
63
 
37
- const isExpo = await this.utils.hasExpo(root);
64
+ const isExpo = await this.pm.hasExpo(root);
38
65
 
39
66
  await run({
40
67
  name: "ensuring configuration files",
41
68
  handler: async () => {
42
- await this.utils.ensureConfig(root, {
69
+ await this.scaffolder.ensureConfig(root, {
43
70
  tsconfigJson: true,
44
71
  packageJson: flags,
45
72
  biomeJson: true,
46
- viteConfigTs: !isExpo,
47
73
  editorconfig: true,
48
- indexHtml: !!flags.react && !isExpo,
74
+ indexHtml: !!flags.web && !isExpo,
75
+ claudeMd: flags.agent
76
+ ? { react: !!flags.web, ui: !!flags.admin }
77
+ : false,
49
78
  });
50
79
 
51
- // Create src/main.ts if src directory is empty or doesn't exist
52
- if (!flags.react) {
53
- await this.utils.ensureSrcMain(root);
80
+ // Create API project structure if not React
81
+ if (!flags.web) {
82
+ await this.scaffolder.ensureApiProject(root);
54
83
  }
55
84
  },
56
85
  });
57
86
 
58
87
  // TODO: check if all alepha dependencies are same version
59
88
 
60
- const pm = await this.utils.getPackageManager(root, flags);
61
- if (pm === "yarn") {
62
- await this.utils.ensureYarn(root);
63
- await run("yarn set version stable");
64
- } else if (pm === "bun") {
65
- await this.utils.ensureBun(root);
66
- } else if (pm === "pnpm") {
67
- await this.utils.ensurePnpm(root);
89
+ const pmName = await this.pm.getPackageManager(root, flags);
90
+ if (pmName === "yarn") {
91
+ await this.pm.ensureYarn(root);
92
+ await run("yarn set version stable", { root });
93
+ } else if (pmName === "bun") {
94
+ await this.pm.ensureBun(root);
95
+ } else if (pmName === "pnpm") {
96
+ await this.pm.ensurePnpm(root);
68
97
  } else {
69
- await this.utils.ensureNpm(root);
98
+ await this.pm.ensureNpm(root);
70
99
  }
71
100
 
72
- await run(`${pm} install`, {
73
- alias: `installing dependencies with ${pm}`,
101
+ await run(`${pmName} install`, {
102
+ alias: `installing dependencies with ${pmName}`,
103
+ root,
74
104
  });
75
105
 
76
106
  if (!isExpo) {
77
- await this.utils.ensureDependency(root, "vite", { run });
107
+ await this.pm.ensureDependency(root, "vite", {
108
+ run,
109
+ exec: (cmd, opts) => this.utils.exec(cmd, opts),
110
+ });
78
111
  }
79
112
 
80
- await this.utils.ensureDependency(root, "@biomejs/biome", { run });
113
+ await this.pm.ensureDependency(root, "@biomejs/biome", {
114
+ run,
115
+ exec: (cmd, opts) => this.utils.exec(cmd, opts),
116
+ });
81
117
 
82
118
  // Install vitest and create test directory if --test flag is set
83
119
  if (flags.test) {
84
- await this.utils.ensureTestDir(root);
85
- await run(`${pm} ${pm === "yarn" ? "add" : "install"} -D vitest`, {
86
- alias: "setup testing with Vitest",
87
- });
120
+ await this.scaffolder.ensureTestDir(root);
121
+ await run(
122
+ `${pmName} ${pmName === "yarn" ? "add" : "install"} -D vitest`,
123
+ {
124
+ alias: "setup testing with Vitest",
125
+ },
126
+ );
88
127
  }
128
+
129
+ await run(`${pmName} run lint`, {
130
+ alias: "running linter",
131
+ root,
132
+ });
89
133
  },
90
134
  });
91
135
  }
@@ -1,16 +1,22 @@
1
1
  import { $inject } from "alepha";
2
2
  import { $command } from "alepha/command";
3
3
  import { AlephaCliUtils } from "../services/AlephaCliUtils.ts";
4
+ import { PackageManagerUtils } from "../services/PackageManagerUtils.ts";
5
+ import { ProjectScaffolder } from "../services/ProjectScaffolder.ts";
4
6
 
5
7
  export class LintCommand {
6
8
  protected readonly utils = $inject(AlephaCliUtils);
9
+ protected readonly pm = $inject(PackageManagerUtils);
10
+ protected readonly scaffolder = $inject(ProjectScaffolder);
7
11
 
8
12
  public readonly lint = $command({
9
13
  name: "lint",
10
14
  description: "Run linter across the codebase using Biome",
11
15
  handler: async ({ root }) => {
12
- await this.utils.ensureConfig(root, { biomeJson: true });
13
- await this.utils.ensureDependency(root, "@biomejs/biome");
16
+ await this.scaffolder.ensureConfig(root, { biomeJson: true });
17
+ await this.pm.ensureDependency(root, "@biomejs/biome", {
18
+ exec: (cmd, opts) => this.utils.exec(cmd, opts),
19
+ });
14
20
  await this.utils.exec("biome check --formatter-enabled=false --fix");
15
21
  },
16
22
  });
@@ -1,9 +1,13 @@
1
1
  import { $inject, t } from "alepha";
2
2
  import { $command } from "alepha/command";
3
3
  import { AlephaCliUtils } from "../services/AlephaCliUtils.ts";
4
+ import { PackageManagerUtils } from "../services/PackageManagerUtils.ts";
5
+ import { ProjectScaffolder } from "../services/ProjectScaffolder.ts";
4
6
 
5
7
  export class TestCommand {
6
8
  protected readonly utils = $inject(AlephaCliUtils);
9
+ protected readonly pm = $inject(PackageManagerUtils);
10
+ protected readonly scaffolder = $inject(ProjectScaffolder);
7
11
 
8
12
  public readonly test = $command({
9
13
  name: "test",
@@ -26,13 +30,14 @@ export class TestCommand {
26
30
  ),
27
31
  }),
28
32
  handler: async ({ root, flags, env }) => {
29
- await this.utils.ensureConfig(root, {
33
+ await this.scaffolder.ensureConfig(root, {
30
34
  tsconfigJson: true,
31
- viteConfigTs: true,
32
35
  });
33
36
 
34
37
  // Ensure vitest is installed before running
35
- await this.utils.ensureDependency(root, "vitest");
38
+ await this.pm.ensureDependency(root, "vitest", {
39
+ exec: (cmd, opts) => this.utils.exec(cmd, opts),
40
+ });
36
41
 
37
42
  const config = flags.config ? `--config=${flags.config}` : "";
38
43
 
@@ -2,9 +2,11 @@ import { $inject } from "alepha";
2
2
  import { $command } from "alepha/command";
3
3
  import { $logger } from "alepha/logger";
4
4
  import { AlephaCliUtils } from "../services/AlephaCliUtils.ts";
5
+ import { PackageManagerUtils } from "../services/PackageManagerUtils.ts";
5
6
 
6
7
  export class TypecheckCommand {
7
8
  protected readonly utils = $inject(AlephaCliUtils);
9
+ protected readonly pm = $inject(PackageManagerUtils);
8
10
  protected readonly log = $logger();
9
11
 
10
12
  /**
@@ -16,7 +18,9 @@ export class TypecheckCommand {
16
18
  description: "Check TypeScript types across the codebase",
17
19
  handler: async ({ root }) => {
18
20
  this.log.info("Starting TypeScript type checking...");
19
- await this.utils.ensureDependency(root, "typescript");
21
+ await this.pm.ensureDependency(root, "typescript", {
22
+ exec: (cmd, opts) => this.utils.exec(cmd, opts),
23
+ });
20
24
  await this.utils.exec("tsc --noEmit");
21
25
  this.log.info("TypeScript type checking completed successfully.");
22
26
  },
@@ -1,9 +1,11 @@
1
1
  import { $inject } from "alepha";
2
2
  import { $command } from "alepha/command";
3
3
  import { AlephaCliUtils } from "../services/AlephaCliUtils.ts";
4
+ import { PackageManagerUtils } from "../services/PackageManagerUtils.ts";
4
5
 
5
6
  export class VerifyCommand {
6
7
  protected readonly utils = $inject(AlephaCliUtils);
8
+ protected readonly pm = $inject(PackageManagerUtils);
7
9
 
8
10
  /**
9
11
  * Run a series of verification commands to ensure code quality and correctness.
@@ -28,16 +30,16 @@ export class VerifyCommand {
28
30
 
29
31
  await run("alepha typecheck");
30
32
 
31
- const pkg = await this.utils.readPackageJson(root);
33
+ const pkg = await this.pm.readPackageJson(root);
32
34
  if (pkg.devDependencies?.vitest) {
33
35
  await run("alepha test");
34
36
  }
35
37
 
36
38
  if (await this.utils.exists(root, "migrations")) {
37
- await run("alepha db:check-migrations");
39
+ await run("alepha db check-migrations");
38
40
  }
39
41
 
40
- const isExpo = await this.utils.hasExpo(root);
42
+ const isExpo = await this.pm.hasExpo(root);
41
43
  if (!isExpo) {
42
44
  await run("alepha build");
43
45
  }
@@ -1,19 +1,61 @@
1
1
  import type { Alepha } from "alepha";
2
2
  import type { CommandPrimitive } from "alepha/command";
3
+ import { type BuildOptions, buildOptions } from "./atoms/buildOptions.ts";
3
4
 
4
- export type AlephaCliConfig = (alepha: Alepha) => {
5
+ export interface AlephaCliConfig {
6
+ /**
7
+ * Add custom commands to the Alepha CLI.
8
+ *
9
+ * You can override 'deploy', 'build', 'dev', 'start' commands this way.
10
+ * But you can also add your own commands and run them via `alepha <command>`.
11
+ */
5
12
  commands?: Record<string, CommandPrimitive>;
13
+
14
+ /**
15
+ * Register more services to the Alepha CLI (enhancements, commands, etc.).
16
+ */
6
17
  services?: Array<any>;
7
- };
8
18
 
9
- export const defineConfig = (config: AlephaCliConfig) => {
19
+ /**
20
+ * Configure Alepha build command.
21
+ */
22
+ build?: BuildOptions;
23
+
24
+ /**
25
+ * Environment variables to set before running commands.
26
+ *
27
+ * Always use .env files by default, this is only for dynamic values.
28
+ */
29
+ env?: Record<string, unknown>;
30
+ }
31
+
32
+ export type AlephaCliConfigFn = (alepha: Alepha) => AlephaCliConfig;
33
+
34
+ export const defineConfig = (
35
+ runConfig: AlephaCliConfig | AlephaCliConfigFn,
36
+ ) => {
10
37
  return (alepha: Alepha) => {
11
- const { commands, services = [] } = config(alepha);
12
- for (const it of services) {
13
- alepha.with(it);
38
+ const config =
39
+ typeof runConfig === "function" ? runConfig(alepha) : runConfig;
40
+
41
+ if (config.services) {
42
+ for (const it of config.services) {
43
+ alepha.with(it);
44
+ }
14
45
  }
46
+
47
+ if (config.env) {
48
+ for (const [key, value] of Object.entries(config.env)) {
49
+ process.env[key] = String(value);
50
+ }
51
+ }
52
+
53
+ if (config.build) {
54
+ alepha.set(buildOptions, config.build);
55
+ }
56
+
15
57
  return {
16
- ...commands,
58
+ ...config.commands,
17
59
  };
18
60
  };
19
61
  };
package/src/cli/index.ts CHANGED
@@ -12,7 +12,6 @@ export * from "./commands/gen/openapi.ts";
12
12
  export * from "./commands/init.ts";
13
13
  export * from "./commands/lint.ts";
14
14
  export * from "./commands/root.ts";
15
- export * from "./commands/run.ts";
16
15
  export * from "./commands/test.ts";
17
16
  export * from "./commands/typecheck.ts";
18
17
  export * from "./commands/verify.ts";