alepha 0.14.4 → 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 (277) hide show
  1. package/README.md +1 -4
  2. package/dist/api/audits/index.d.ts +619 -731
  3. package/dist/api/audits/index.d.ts.map +1 -1
  4. package/dist/api/files/index.d.ts +185 -298
  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 -356
  9. package/dist/api/jobs/index.d.ts.map +1 -1
  10. package/dist/api/notifications/index.d.ts +238 -350
  11. package/dist/api/notifications/index.d.ts.map +1 -1
  12. package/dist/api/parameters/index.d.ts +499 -611
  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 +1697 -1804
  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 +132 -132
  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 +302 -299
  32. package/dist/cli/index.d.ts.map +1 -1
  33. package/dist/cli/index.js +966 -564
  34. package/dist/cli/index.js.map +1 -1
  35. package/dist/command/index.d.ts +303 -299
  36. package/dist/command/index.d.ts.map +1 -1
  37. package/dist/command/index.js +11 -7
  38. package/dist/command/index.js.map +1 -1
  39. package/dist/core/index.browser.js +419 -99
  40. package/dist/core/index.browser.js.map +1 -1
  41. package/dist/core/index.d.ts +718 -625
  42. package/dist/core/index.d.ts.map +1 -1
  43. package/dist/core/index.js +420 -99
  44. package/dist/core/index.js.map +1 -1
  45. package/dist/core/index.native.js +419 -99
  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/mcp/index.d.ts +197 -197
  67. package/dist/mcp/index.d.ts.map +1 -1
  68. package/dist/orm/chunk-DtkW-qnP.js +38 -0
  69. package/dist/orm/index.browser.js.map +1 -1
  70. package/dist/orm/index.bun.js +2814 -0
  71. package/dist/orm/index.bun.js.map +1 -0
  72. package/dist/orm/index.d.ts +1205 -1057
  73. package/dist/orm/index.d.ts.map +1 -1
  74. package/dist/orm/index.js +2056 -1753
  75. package/dist/orm/index.js.map +1 -1
  76. package/dist/queue/core/index.d.ts +248 -248
  77. package/dist/queue/core/index.d.ts.map +1 -1
  78. package/dist/queue/redis/index.d.ts.map +1 -1
  79. package/dist/redis/index.bun.js +285 -0
  80. package/dist/redis/index.bun.js.map +1 -0
  81. package/dist/redis/index.d.ts +118 -136
  82. package/dist/redis/index.d.ts.map +1 -1
  83. package/dist/redis/index.js +18 -38
  84. package/dist/redis/index.js.map +1 -1
  85. package/dist/retry/index.d.ts +69 -69
  86. package/dist/retry/index.d.ts.map +1 -1
  87. package/dist/router/index.d.ts +6 -6
  88. package/dist/router/index.d.ts.map +1 -1
  89. package/dist/scheduler/index.d.ts +25 -25
  90. package/dist/scheduler/index.d.ts.map +1 -1
  91. package/dist/security/index.browser.js +5 -1
  92. package/dist/security/index.browser.js.map +1 -1
  93. package/dist/security/index.d.ts +417 -254
  94. package/dist/security/index.d.ts.map +1 -1
  95. package/dist/security/index.js +386 -86
  96. package/dist/security/index.js.map +1 -1
  97. package/dist/server/auth/index.d.ts +277 -277
  98. package/dist/server/auth/index.d.ts.map +1 -1
  99. package/dist/server/auth/index.js +20 -20
  100. package/dist/server/auth/index.js.map +1 -1
  101. package/dist/server/cache/index.d.ts +60 -57
  102. package/dist/server/cache/index.d.ts.map +1 -1
  103. package/dist/server/cache/index.js +1 -1
  104. package/dist/server/cache/index.js.map +1 -1
  105. package/dist/server/compress/index.d.ts +3 -3
  106. package/dist/server/compress/index.d.ts.map +1 -1
  107. package/dist/server/cookies/index.d.ts +6 -6
  108. package/dist/server/cookies/index.d.ts.map +1 -1
  109. package/dist/server/cookies/index.js +3 -3
  110. package/dist/server/cookies/index.js.map +1 -1
  111. package/dist/server/core/index.d.ts +242 -150
  112. package/dist/server/core/index.d.ts.map +1 -1
  113. package/dist/server/core/index.js +288 -122
  114. package/dist/server/core/index.js.map +1 -1
  115. package/dist/server/cors/index.d.ts +11 -12
  116. package/dist/server/cors/index.d.ts.map +1 -1
  117. package/dist/server/health/index.d.ts +0 -1
  118. package/dist/server/health/index.d.ts.map +1 -1
  119. package/dist/server/helmet/index.d.ts +2 -2
  120. package/dist/server/helmet/index.d.ts.map +1 -1
  121. package/dist/server/links/index.browser.js.map +1 -1
  122. package/dist/server/links/index.d.ts +84 -85
  123. package/dist/server/links/index.d.ts.map +1 -1
  124. package/dist/server/links/index.js +1 -2
  125. package/dist/server/links/index.js.map +1 -1
  126. package/dist/server/metrics/index.d.ts.map +1 -1
  127. package/dist/server/multipart/index.d.ts +6 -6
  128. package/dist/server/multipart/index.d.ts.map +1 -1
  129. package/dist/server/proxy/index.d.ts +102 -103
  130. package/dist/server/proxy/index.d.ts.map +1 -1
  131. package/dist/server/rate-limit/index.d.ts +16 -16
  132. package/dist/server/rate-limit/index.d.ts.map +1 -1
  133. package/dist/server/static/index.d.ts +44 -44
  134. package/dist/server/static/index.d.ts.map +1 -1
  135. package/dist/server/swagger/index.d.ts +48 -49
  136. package/dist/server/swagger/index.d.ts.map +1 -1
  137. package/dist/server/swagger/index.js +1 -2
  138. package/dist/server/swagger/index.js.map +1 -1
  139. package/dist/sms/index.d.ts +13 -11
  140. package/dist/sms/index.d.ts.map +1 -1
  141. package/dist/sms/index.js +7 -7
  142. package/dist/sms/index.js.map +1 -1
  143. package/dist/thread/index.d.ts +71 -72
  144. package/dist/thread/index.d.ts.map +1 -1
  145. package/dist/topic/core/index.d.ts +318 -318
  146. package/dist/topic/core/index.d.ts.map +1 -1
  147. package/dist/topic/redis/index.d.ts +6 -6
  148. package/dist/topic/redis/index.d.ts.map +1 -1
  149. package/dist/vite/index.d.ts +5720 -159
  150. package/dist/vite/index.d.ts.map +1 -1
  151. package/dist/vite/index.js +41 -18
  152. package/dist/vite/index.js.map +1 -1
  153. package/dist/websocket/index.browser.js +6 -6
  154. package/dist/websocket/index.browser.js.map +1 -1
  155. package/dist/websocket/index.d.ts +247 -247
  156. package/dist/websocket/index.d.ts.map +1 -1
  157. package/dist/websocket/index.js +6 -6
  158. package/dist/websocket/index.js.map +1 -1
  159. package/package.json +9 -14
  160. package/src/api/files/controllers/AdminFileStatsController.ts +0 -1
  161. package/src/api/users/atoms/realmAuthSettingsAtom.ts +5 -0
  162. package/src/api/users/controllers/{UserRealmController.ts → RealmController.ts} +11 -11
  163. package/src/api/users/entities/users.ts +1 -1
  164. package/src/api/users/index.ts +8 -8
  165. package/src/api/users/primitives/{$userRealm.ts → $realm.ts} +17 -19
  166. package/src/api/users/providers/{UserRealmProvider.ts → RealmProvider.ts} +26 -30
  167. package/src/api/users/schemas/{userRealmConfigSchema.ts → realmConfigSchema.ts} +2 -2
  168. package/src/api/users/services/CredentialService.ts +7 -7
  169. package/src/api/users/services/IdentityService.ts +4 -4
  170. package/src/api/users/services/RegistrationService.spec.ts +25 -27
  171. package/src/api/users/services/RegistrationService.ts +38 -27
  172. package/src/api/users/services/SessionCrudService.ts +3 -3
  173. package/src/api/users/services/SessionService.spec.ts +3 -3
  174. package/src/api/users/services/SessionService.ts +28 -9
  175. package/src/api/users/services/UserService.ts +7 -7
  176. package/src/batch/providers/BatchProvider.ts +1 -2
  177. package/src/cli/apps/AlephaPackageBuilderCli.ts +38 -19
  178. package/src/cli/assets/apiHelloControllerTs.ts +18 -0
  179. package/src/cli/assets/apiIndexTs.ts +16 -0
  180. package/src/cli/assets/claudeMd.ts +303 -0
  181. package/src/cli/assets/mainBrowserTs.ts +2 -2
  182. package/src/cli/assets/mainServerTs.ts +24 -0
  183. package/src/cli/assets/webAppRouterTs.ts +15 -0
  184. package/src/cli/assets/webHelloComponentTsx.ts +16 -0
  185. package/src/cli/assets/webIndexTs.ts +16 -0
  186. package/src/cli/commands/build.ts +41 -21
  187. package/src/cli/commands/db.ts +21 -18
  188. package/src/cli/commands/deploy.ts +17 -5
  189. package/src/cli/commands/dev.ts +13 -17
  190. package/src/cli/commands/format.ts +8 -2
  191. package/src/cli/commands/init.ts +74 -29
  192. package/src/cli/commands/lint.ts +8 -2
  193. package/src/cli/commands/test.ts +8 -2
  194. package/src/cli/commands/typecheck.ts +5 -1
  195. package/src/cli/commands/verify.ts +4 -2
  196. package/src/cli/services/AlephaCliUtils.ts +39 -600
  197. package/src/cli/services/PackageManagerUtils.ts +301 -0
  198. package/src/cli/services/ProjectScaffolder.ts +306 -0
  199. package/src/command/helpers/Runner.ts +15 -3
  200. package/src/core/__tests__/Alepha-graph.spec.ts +4 -0
  201. package/src/core/index.shared.ts +1 -0
  202. package/src/core/index.ts +2 -0
  203. package/src/core/primitives/$hook.ts +6 -2
  204. package/src/core/primitives/$module.spec.ts +4 -0
  205. package/src/core/providers/AlsProvider.ts +1 -1
  206. package/src/core/providers/CodecManager.spec.ts +12 -6
  207. package/src/core/providers/CodecManager.ts +26 -6
  208. package/src/core/providers/EventManager.ts +169 -13
  209. package/src/core/providers/KeylessJsonSchemaCodec.spec.ts +621 -0
  210. package/src/core/providers/KeylessJsonSchemaCodec.ts +407 -0
  211. package/src/core/providers/StateManager.spec.ts +27 -16
  212. package/src/email/providers/LocalEmailProvider.spec.ts +111 -87
  213. package/src/email/providers/LocalEmailProvider.ts +52 -15
  214. package/src/email/providers/NodemailerEmailProvider.ts +167 -56
  215. package/src/file/errors/FileError.ts +7 -0
  216. package/src/file/index.ts +9 -1
  217. package/src/file/providers/MemoryFileSystemProvider.ts +393 -0
  218. package/src/orm/index.browser.ts +1 -19
  219. package/src/orm/index.bun.ts +77 -0
  220. package/src/orm/index.shared-server.ts +22 -0
  221. package/src/orm/index.shared.ts +15 -0
  222. package/src/orm/index.ts +19 -39
  223. package/src/orm/providers/drivers/BunPostgresProvider.ts +3 -5
  224. package/src/orm/providers/drivers/BunSqliteProvider.ts +1 -1
  225. package/src/orm/providers/drivers/CloudflareD1Provider.ts +4 -0
  226. package/src/orm/providers/drivers/DatabaseProvider.ts +4 -0
  227. package/src/orm/providers/drivers/PglitePostgresProvider.ts +4 -0
  228. package/src/orm/services/Repository.ts +8 -0
  229. package/src/redis/index.bun.ts +35 -0
  230. package/src/redis/providers/BunRedisProvider.ts +12 -43
  231. package/src/redis/providers/BunRedisSubscriberProvider.ts +2 -3
  232. package/src/redis/providers/NodeRedisProvider.ts +16 -34
  233. package/src/{server/security → security}/__tests__/BasicAuth.spec.ts +11 -11
  234. package/src/{server/security → security}/__tests__/ServerSecurityProvider-realm.spec.ts +21 -16
  235. package/src/{server/security/providers → security/__tests__}/ServerSecurityProvider.spec.ts +5 -5
  236. package/src/security/index.browser.ts +5 -0
  237. package/src/security/index.ts +90 -7
  238. package/src/security/primitives/{$realm.spec.ts → $issuer.spec.ts} +11 -11
  239. package/src/security/primitives/{$realm.ts → $issuer.ts} +20 -17
  240. package/src/security/primitives/$role.ts +5 -5
  241. package/src/security/primitives/$serviceAccount.spec.ts +5 -5
  242. package/src/security/primitives/$serviceAccount.ts +3 -3
  243. package/src/{server/security → security}/providers/ServerSecurityProvider.ts +5 -7
  244. package/src/server/auth/primitives/$auth.ts +10 -10
  245. package/src/server/auth/primitives/$authCredentials.ts +3 -3
  246. package/src/server/auth/primitives/$authGithub.ts +3 -3
  247. package/src/server/auth/primitives/$authGoogle.ts +3 -3
  248. package/src/server/auth/providers/ServerAuthProvider.ts +13 -13
  249. package/src/server/cache/providers/ServerCacheProvider.ts +1 -1
  250. package/src/server/cookies/providers/ServerCookiesProvider.ts +3 -3
  251. package/src/server/core/providers/NodeHttpServerProvider.ts +25 -6
  252. package/src/server/core/providers/ServerBodyParserProvider.ts +19 -23
  253. package/src/server/core/providers/ServerLoggerProvider.ts +23 -19
  254. package/src/server/core/providers/ServerProvider.ts +144 -21
  255. package/src/server/core/providers/ServerRouterProvider.ts +259 -115
  256. package/src/server/core/providers/ServerTimingProvider.ts +2 -2
  257. package/src/server/links/index.ts +1 -1
  258. package/src/server/links/providers/LinkProvider.ts +1 -1
  259. package/src/server/swagger/index.ts +1 -1
  260. package/src/sms/providers/LocalSmsProvider.spec.ts +153 -111
  261. package/src/sms/providers/LocalSmsProvider.ts +8 -7
  262. package/src/vite/helpers/boot.ts +28 -17
  263. package/src/vite/tasks/buildServer.ts +12 -1
  264. package/src/vite/tasks/devServer.ts +3 -1
  265. package/src/vite/tasks/generateCloudflare.ts +7 -0
  266. package/dist/server/security/index.browser.js +0 -13
  267. package/dist/server/security/index.browser.js.map +0 -1
  268. package/dist/server/security/index.d.ts +0 -173
  269. package/dist/server/security/index.d.ts.map +0 -1
  270. package/dist/server/security/index.js +0 -311
  271. package/dist/server/security/index.js.map +0 -1
  272. package/src/cli/assets/appRouterTs.ts +0 -9
  273. package/src/cli/assets/mainTs.ts +0 -13
  274. package/src/server/security/index.browser.ts +0 -10
  275. package/src/server/security/index.ts +0 -94
  276. /package/src/{server/security → security}/primitives/$basicAuth.ts +0 -0
  277. /package/src/{server/security → security}/providers/ServerBasicAuthProvider.ts +0 -0
@@ -1,14 +1,18 @@
1
- import { access } from "node:fs/promises";
2
- import { join } from "node:path";
3
1
  import { $inject, Alepha, t } from "alepha";
4
2
  import { $command } from "alepha/command";
3
+ import { FileSystemProvider } from "alepha/file";
5
4
  import { $logger } from "alepha/logger";
6
5
  import { boot, devServer } from "alepha/vite";
7
6
  import { AlephaCliUtils } from "../services/AlephaCliUtils.ts";
7
+ import { PackageManagerUtils } from "../services/PackageManagerUtils.ts";
8
+ import { ProjectScaffolder } from "../services/ProjectScaffolder.ts";
8
9
 
9
10
  export class DevCommand {
10
11
  protected readonly log = $logger();
12
+ protected readonly fs = $inject(FileSystemProvider);
11
13
  protected readonly utils = $inject(AlephaCliUtils);
14
+ protected readonly pm = $inject(PackageManagerUtils);
15
+ protected readonly scaffolder = $inject(ProjectScaffolder);
12
16
  protected readonly alepha = $inject(Alepha);
13
17
 
14
18
  /**
@@ -22,9 +26,9 @@ export class DevCommand {
22
26
  description: "Run the project in development mode",
23
27
  args: t.optional(t.text({ title: "path", description: "Filepath to run" })),
24
28
  handler: async ({ args, root }) => {
25
- const expo = await this.utils.hasExpo(root);
29
+ const expo = await this.pm.hasExpo(root);
26
30
 
27
- await this.utils.ensureConfig(root, {
31
+ await this.scaffolder.ensureConfig(root, {
28
32
  tsconfigJson: true,
29
33
  });
30
34
 
@@ -52,7 +56,9 @@ export class DevCommand {
52
56
  }
53
57
 
54
58
  // Ensure vite is installed before running
55
- await this.utils.ensureDependency(root, "vite");
59
+ await this.pm.ensureDependency(root, "vite", {
60
+ exec: (cmd, opts) => this.utils.exec(cmd, opts),
61
+ });
56
62
 
57
63
  await devServer();
58
64
  },
@@ -62,20 +68,10 @@ export class DevCommand {
62
68
  if (this.alepha.isBun()) {
63
69
  return true;
64
70
  }
65
- try {
66
- await access(join(root, "bun.lock"));
67
- return true;
68
- } catch {
69
- return false;
70
- }
71
+ return this.fs.exists(this.fs.join(root, "bun.lock"));
71
72
  }
72
73
 
73
74
  protected async isFullstackProject(root: string): Promise<boolean> {
74
- try {
75
- await access(join(root, "index.html"));
76
- return true;
77
- } catch {
78
- return false;
79
- }
75
+ return this.fs.exists(this.fs.join(root, "index.html"));
80
76
  }
81
77
  }
@@ -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 FormatCommand {
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 format = $command({
9
13
  name: "format",
10
14
  description: "Format 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 format --fix");
15
21
  },
16
22
  });
@@ -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,79 +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
73
  editorconfig: true,
47
- indexHtml: !!flags.react && !isExpo,
74
+ indexHtml: !!flags.web && !isExpo,
75
+ claudeMd: flags.agent
76
+ ? { react: !!flags.web, ui: !!flags.admin }
77
+ : false,
48
78
  });
49
79
 
50
- // Create src/main.ts if src directory is empty or doesn't exist
51
- if (!flags.react) {
52
- await this.utils.ensureSrcMain(root);
80
+ // Create API project structure if not React
81
+ if (!flags.web) {
82
+ await this.scaffolder.ensureApiProject(root);
53
83
  }
54
84
  },
55
85
  });
56
86
 
57
87
  // TODO: check if all alepha dependencies are same version
58
88
 
59
- const pm = await this.utils.getPackageManager(root, flags);
60
- if (pm === "yarn") {
61
- await this.utils.ensureYarn(root);
62
- await run("yarn set version stable");
63
- } else if (pm === "bun") {
64
- await this.utils.ensureBun(root);
65
- } else if (pm === "pnpm") {
66
- 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);
67
97
  } else {
68
- await this.utils.ensureNpm(root);
98
+ await this.pm.ensureNpm(root);
69
99
  }
70
100
 
71
- await run(`${pm} install`, {
72
- alias: `installing dependencies with ${pm}`,
101
+ await run(`${pmName} install`, {
102
+ alias: `installing dependencies with ${pmName}`,
103
+ root,
73
104
  });
74
105
 
75
106
  if (!isExpo) {
76
- 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
+ });
77
111
  }
78
112
 
79
- 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
+ });
80
117
 
81
118
  // Install vitest and create test directory if --test flag is set
82
119
  if (flags.test) {
83
- await this.utils.ensureTestDir(root);
84
- await run(`${pm} ${pm === "yarn" ? "add" : "install"} -D vitest`, {
85
- alias: "setup testing with Vitest",
86
- });
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
+ );
87
127
  }
128
+
129
+ await run(`${pmName} run lint`, {
130
+ alias: "running linter",
131
+ root,
132
+ });
88
133
  },
89
134
  });
90
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,12 +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
35
  });
32
36
 
33
37
  // Ensure vitest is installed before running
34
- await this.utils.ensureDependency(root, "vitest");
38
+ await this.pm.ensureDependency(root, "vitest", {
39
+ exec: (cmd, opts) => this.utils.exec(cmd, opts),
40
+ });
35
41
 
36
42
  const config = flags.config ? `--config=${flags.config}` : "";
37
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,7 +30,7 @@ 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
  }
@@ -37,7 +39,7 @@ export class VerifyCommand {
37
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
  }