alepha 0.15.4 → 0.15.5

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 (282) hide show
  1. package/README.md +26 -11
  2. package/dist/api/audits/index.d.ts +3 -3
  3. package/dist/api/audits/index.js +3 -3
  4. package/dist/api/audits/index.js.map +1 -1
  5. package/dist/api/files/index.d.ts +3 -3
  6. package/dist/api/files/index.js +3 -3
  7. package/dist/api/files/index.js.map +1 -1
  8. package/dist/api/jobs/index.d.ts +47 -4
  9. package/dist/api/jobs/index.d.ts.map +1 -1
  10. package/dist/api/jobs/index.js +100 -5
  11. package/dist/api/jobs/index.js.map +1 -1
  12. package/dist/api/keys/index.d.ts +3 -3
  13. package/dist/api/keys/index.js +3 -3
  14. package/dist/api/keys/index.js.map +1 -1
  15. package/dist/api/notifications/index.d.ts +3 -3
  16. package/dist/api/notifications/index.js +3 -3
  17. package/dist/api/notifications/index.js.map +1 -1
  18. package/dist/api/parameters/index.d.ts +263 -263
  19. package/dist/api/parameters/index.d.ts.map +1 -1
  20. package/dist/api/parameters/index.js +31 -30
  21. package/dist/api/parameters/index.js.map +1 -1
  22. package/dist/api/users/index.d.ts +373 -67
  23. package/dist/api/users/index.d.ts.map +1 -1
  24. package/dist/api/users/index.js +273 -72
  25. package/dist/api/users/index.js.map +1 -1
  26. package/dist/api/verifications/index.d.ts +3 -3
  27. package/dist/api/verifications/index.js +3 -3
  28. package/dist/api/verifications/index.js.map +1 -1
  29. package/dist/batch/index.d.ts +7 -7
  30. package/dist/batch/index.js +3 -3
  31. package/dist/batch/index.js.map +1 -1
  32. package/dist/bucket/index.d.ts +3 -3
  33. package/dist/bucket/index.js +6 -6
  34. package/dist/bucket/index.js.map +1 -1
  35. package/dist/cache/core/index.d.ts +3 -3
  36. package/dist/cache/core/index.js +3 -3
  37. package/dist/cache/core/index.js.map +1 -1
  38. package/dist/cli/index.d.ts +5607 -20
  39. package/dist/cli/index.d.ts.map +1 -1
  40. package/dist/cli/index.js +103 -89
  41. package/dist/cli/index.js.map +1 -1
  42. package/dist/command/index.d.ts +11 -4
  43. package/dist/command/index.d.ts.map +1 -1
  44. package/dist/command/index.js +8 -6
  45. package/dist/command/index.js.map +1 -1
  46. package/dist/core/index.browser.js.map +1 -1
  47. package/dist/core/index.d.ts +4 -8
  48. package/dist/core/index.d.ts.map +1 -1
  49. package/dist/core/index.js +3 -3
  50. package/dist/core/index.js.map +1 -1
  51. package/dist/core/index.native.js.map +1 -1
  52. package/dist/datetime/index.d.ts +3 -3
  53. package/dist/datetime/index.js +3 -3
  54. package/dist/datetime/index.js.map +1 -1
  55. package/dist/email/index.d.ts +3 -3
  56. package/dist/email/index.js +8 -8
  57. package/dist/email/index.js.map +1 -1
  58. package/dist/fake/index.d.ts +3 -3
  59. package/dist/fake/index.js +3 -3
  60. package/dist/fake/index.js.map +1 -1
  61. package/dist/lock/core/index.d.ts +3 -3
  62. package/dist/lock/core/index.js +3 -3
  63. package/dist/lock/core/index.js.map +1 -1
  64. package/dist/logger/index.d.ts +3 -3
  65. package/dist/logger/index.js +6 -3
  66. package/dist/logger/index.js.map +1 -1
  67. package/dist/mcp/index.d.ts +3 -3
  68. package/dist/mcp/index.js +3 -3
  69. package/dist/mcp/index.js.map +1 -1
  70. package/dist/orm/index.d.ts +12 -12
  71. package/dist/orm/index.js +4 -4
  72. package/dist/orm/index.js.map +1 -1
  73. package/dist/queue/core/index.d.ts +3 -3
  74. package/dist/queue/core/index.js +3 -3
  75. package/dist/queue/core/index.js.map +1 -1
  76. package/dist/react/auth/index.d.ts +3 -3
  77. package/dist/react/auth/index.js +3 -3
  78. package/dist/react/auth/index.js.map +1 -1
  79. package/dist/react/core/index.d.ts +3 -3
  80. package/dist/react/core/index.js +3 -3
  81. package/dist/react/core/index.js.map +1 -1
  82. package/dist/react/form/index.d.ts +3 -3
  83. package/dist/react/form/index.js +3 -3
  84. package/dist/react/form/index.js.map +1 -1
  85. package/dist/react/head/index.d.ts +3 -3
  86. package/dist/react/head/index.js +3 -3
  87. package/dist/react/head/index.js.map +1 -1
  88. package/dist/react/i18n/index.d.ts +3 -3
  89. package/dist/react/i18n/index.js +3 -3
  90. package/dist/react/i18n/index.js.map +1 -1
  91. package/dist/react/intro/index.css +337 -0
  92. package/dist/react/intro/index.css.map +1 -0
  93. package/dist/react/intro/index.d.ts +10 -0
  94. package/dist/react/intro/index.d.ts.map +1 -0
  95. package/dist/react/intro/index.js +222 -0
  96. package/dist/react/intro/index.js.map +1 -0
  97. package/dist/react/router/index.browser.js +2 -2
  98. package/dist/react/router/index.browser.js.map +1 -1
  99. package/dist/react/router/index.d.ts +1 -1
  100. package/dist/react/router/index.d.ts.map +1 -1
  101. package/dist/react/router/index.js +5 -5
  102. package/dist/react/router/index.js.map +1 -1
  103. package/dist/redis/index.d.ts +17 -17
  104. package/dist/redis/index.js +3 -3
  105. package/dist/redis/index.js.map +1 -1
  106. package/dist/retry/index.d.ts +3 -3
  107. package/dist/retry/index.js +3 -3
  108. package/dist/retry/index.js.map +1 -1
  109. package/dist/scheduler/index.d.ts +3 -3
  110. package/dist/scheduler/index.js +3 -3
  111. package/dist/scheduler/index.js.map +1 -1
  112. package/dist/security/index.d.ts +3 -3
  113. package/dist/security/index.js +5 -5
  114. package/dist/security/index.js.map +1 -1
  115. package/dist/server/auth/index.d.ts +3 -3
  116. package/dist/server/auth/index.js +3 -3
  117. package/dist/server/auth/index.js.map +1 -1
  118. package/dist/server/cache/index.d.ts +3 -3
  119. package/dist/server/cache/index.js +3 -3
  120. package/dist/server/cache/index.js.map +1 -1
  121. package/dist/server/compress/index.d.ts +3 -3
  122. package/dist/server/compress/index.js +3 -3
  123. package/dist/server/compress/index.js.map +1 -1
  124. package/dist/server/cookies/index.d.ts +3 -3
  125. package/dist/server/cookies/index.js +3 -3
  126. package/dist/server/cookies/index.js.map +1 -1
  127. package/dist/server/core/index.d.ts +5 -16
  128. package/dist/server/core/index.d.ts.map +1 -1
  129. package/dist/server/core/index.js +13 -29
  130. package/dist/server/core/index.js.map +1 -1
  131. package/dist/server/cors/index.d.ts +3 -3
  132. package/dist/server/cors/index.js +3 -3
  133. package/dist/server/cors/index.js.map +1 -1
  134. package/dist/server/health/index.d.ts +20 -20
  135. package/dist/server/health/index.js +3 -3
  136. package/dist/server/health/index.js.map +1 -1
  137. package/dist/server/helmet/index.d.ts +3 -3
  138. package/dist/server/helmet/index.js +3 -3
  139. package/dist/server/helmet/index.js.map +1 -1
  140. package/dist/server/links/index.d.ts +42 -42
  141. package/dist/server/links/index.d.ts.map +1 -1
  142. package/dist/server/links/index.js +3 -3
  143. package/dist/server/links/index.js.map +1 -1
  144. package/dist/server/metrics/index.d.ts +3 -3
  145. package/dist/server/metrics/index.js +3 -3
  146. package/dist/server/metrics/index.js.map +1 -1
  147. package/dist/server/multipart/index.d.ts +3 -3
  148. package/dist/server/multipart/index.js +3 -3
  149. package/dist/server/multipart/index.js.map +1 -1
  150. package/dist/server/proxy/index.d.ts +3 -3
  151. package/dist/server/proxy/index.js +3 -3
  152. package/dist/server/proxy/index.js.map +1 -1
  153. package/dist/server/rate-limit/index.d.ts +3 -3
  154. package/dist/server/rate-limit/index.js +3 -3
  155. package/dist/server/rate-limit/index.js.map +1 -1
  156. package/dist/server/static/index.d.ts +3 -3
  157. package/dist/server/static/index.js +6 -6
  158. package/dist/server/static/index.js.map +1 -1
  159. package/dist/server/swagger/index.d.ts +3 -3
  160. package/dist/server/swagger/index.js +6 -6
  161. package/dist/server/swagger/index.js.map +1 -1
  162. package/dist/sms/index.d.ts +3 -3
  163. package/dist/sms/index.js +6 -6
  164. package/dist/sms/index.js.map +1 -1
  165. package/dist/system/index.d.ts +3 -3
  166. package/dist/system/index.js +3 -3
  167. package/dist/system/index.js.map +1 -1
  168. package/dist/thread/index.d.ts +3 -3
  169. package/dist/thread/index.js +3 -3
  170. package/dist/thread/index.js.map +1 -1
  171. package/dist/topic/core/index.d.ts +3 -3
  172. package/dist/topic/core/index.js +3 -3
  173. package/dist/topic/core/index.js.map +1 -1
  174. package/dist/vite/index.d.ts +6284 -3
  175. package/dist/vite/index.d.ts.map +1 -1
  176. package/dist/websocket/index.d.ts +3 -3
  177. package/dist/websocket/index.js +3 -3
  178. package/dist/websocket/index.js.map +1 -1
  179. package/package.json +7 -2
  180. package/src/api/audits/index.ts +3 -3
  181. package/src/api/files/index.ts +3 -3
  182. package/src/api/jobs/controllers/AdminJobController.ts +15 -2
  183. package/src/api/jobs/index.ts +4 -3
  184. package/src/api/jobs/services/JobAudits.spec.ts +89 -0
  185. package/src/api/jobs/services/JobAudits.ts +101 -0
  186. package/src/api/keys/index.ts +3 -3
  187. package/src/api/notifications/index.ts +3 -3
  188. package/src/api/parameters/index.ts +5 -3
  189. package/src/api/users/__tests__/ApiKeys-integration.spec.ts +1 -1
  190. package/src/api/users/__tests__/ApiKeys.spec.ts +1 -1
  191. package/src/api/users/__tests__/EmailVerification.spec.ts +16 -1
  192. package/src/api/users/__tests__/PasswordReset.spec.ts +11 -0
  193. package/src/api/users/atoms/realmAuthSettingsAtom.ts +10 -0
  194. package/src/api/users/index.ts +8 -9
  195. package/src/api/users/primitives/$realm.ts +117 -19
  196. package/src/api/users/providers/RealmProvider.ts +15 -7
  197. package/src/api/users/services/CredentialService.spec.ts +11 -0
  198. package/src/api/users/services/CredentialService.ts +47 -24
  199. package/src/api/users/services/IdentityService.ts +12 -4
  200. package/src/api/users/services/RegistrationService.spec.ts +11 -0
  201. package/src/api/users/services/RegistrationService.ts +33 -12
  202. package/src/api/users/services/SessionService.ts +83 -12
  203. package/src/api/users/services/UserAudits.ts +47 -0
  204. package/src/api/users/services/UserFiles.ts +19 -0
  205. package/src/api/users/services/UserJobs.spec.ts +107 -0
  206. package/src/api/users/services/UserJobs.ts +62 -0
  207. package/src/api/users/services/UserParameters.ts +23 -0
  208. package/src/api/users/services/UserService.ts +34 -17
  209. package/src/api/verifications/index.ts +3 -3
  210. package/src/batch/index.ts +3 -3
  211. package/src/bucket/index.ts +3 -3
  212. package/src/cache/core/index.ts +3 -3
  213. package/src/cli/commands/db.ts +9 -0
  214. package/src/cli/commands/init.spec.ts +2 -17
  215. package/src/cli/commands/init.ts +37 -1
  216. package/src/cli/providers/ViteDevServerProvider.ts +5 -2
  217. package/src/cli/services/AlephaCliUtils.ts +17 -0
  218. package/src/cli/services/PackageManagerUtils.ts +15 -1
  219. package/src/cli/services/ProjectScaffolder.ts +8 -13
  220. package/src/cli/templates/agentMd.ts +2 -25
  221. package/src/cli/templates/apiAppSecurityTs.ts +37 -2
  222. package/src/cli/templates/mainCss.ts +2 -32
  223. package/src/cli/templates/webAppRouterTs.ts +5 -5
  224. package/src/cli/templates/webHomeComponentTsx.ts +10 -0
  225. package/src/command/helpers/Runner.ts +14 -1
  226. package/src/command/index.ts +3 -3
  227. package/src/core/helpers/primitive.ts +0 -5
  228. package/src/core/index.ts +3 -3
  229. package/src/datetime/index.ts +3 -3
  230. package/src/email/index.ts +3 -3
  231. package/src/email/providers/LocalEmailProvider.ts +2 -2
  232. package/src/fake/index.ts +3 -3
  233. package/src/lock/core/index.ts +3 -3
  234. package/src/logger/index.ts +3 -3
  235. package/src/logger/providers/PrettyFormatterProvider.ts +7 -0
  236. package/src/mcp/index.ts +3 -3
  237. package/src/orm/index.ts +3 -3
  238. package/src/orm/providers/drivers/NodeSqliteProvider.ts +1 -1
  239. package/src/queue/core/index.ts +3 -3
  240. package/src/react/auth/index.ts +3 -3
  241. package/src/react/core/index.ts +3 -3
  242. package/src/react/form/index.ts +3 -3
  243. package/src/react/head/index.ts +3 -3
  244. package/src/react/i18n/index.ts +3 -3
  245. package/src/react/intro/components/GettingStarted.css +334 -0
  246. package/src/react/intro/components/GettingStarted.tsx +276 -0
  247. package/src/react/intro/index.ts +1 -0
  248. package/src/react/router/index.browser.ts +2 -0
  249. package/src/react/router/index.ts +2 -0
  250. package/src/redis/index.ts +3 -3
  251. package/src/retry/index.ts +3 -3
  252. package/src/router/index.ts +3 -3
  253. package/src/scheduler/index.ts +3 -3
  254. package/src/security/index.ts +3 -3
  255. package/src/security/providers/JwtProvider.ts +2 -2
  256. package/src/server/auth/index.ts +3 -3
  257. package/src/server/cache/index.ts +3 -3
  258. package/src/server/compress/index.ts +3 -3
  259. package/src/server/cookies/index.ts +3 -3
  260. package/src/server/core/index.ts +3 -3
  261. package/src/server/core/primitives/$action.spec.ts +3 -2
  262. package/src/server/core/primitives/$action.ts +6 -2
  263. package/src/server/core/providers/NodeHttpServerProvider.ts +2 -15
  264. package/src/server/core/providers/ServerProvider.ts +4 -2
  265. package/src/server/core/providers/ServerRouterProvider.ts +5 -27
  266. package/src/server/cors/index.ts +3 -3
  267. package/src/server/health/index.ts +3 -3
  268. package/src/server/helmet/index.ts +3 -3
  269. package/src/server/links/index.ts +3 -3
  270. package/src/server/metrics/index.ts +3 -3
  271. package/src/server/multipart/index.ts +3 -3
  272. package/src/server/proxy/index.ts +3 -3
  273. package/src/server/rate-limit/index.ts +3 -3
  274. package/src/server/static/index.ts +3 -3
  275. package/src/server/swagger/index.ts +3 -3
  276. package/src/sms/index.ts +3 -3
  277. package/src/system/index.ts +3 -3
  278. package/src/thread/index.ts +3 -3
  279. package/src/topic/core/index.ts +3 -3
  280. package/src/websocket/index.ts +3 -3
  281. package/src/cli/templates/webHelloComponentTsx.ts +0 -30
  282. /package/src/api/users/{notifications → services}/UserNotifications.ts +0 -0
package/dist/cli/index.js CHANGED
@@ -1814,9 +1814,9 @@ var ShellProvider = class {};
1814
1814
  //#endregion
1815
1815
  //#region ../../src/system/index.ts
1816
1816
  /**
1817
- * | type | quality | stability |
1818
- * |------|---------|-----------|
1819
- * | tooling | standard | stable |
1817
+ * | Stability | Since | Runtime |
1818
+ * |-----------|-------|---------|
1819
+ * | 3 - stable | 0.14.0 | node, bun, browser|
1820
1820
  *
1821
1821
  * System-level abstractions for portable code across runtimes.
1822
1822
  *
@@ -2238,6 +2238,18 @@ ${models.map((it) => `export const ${it} = models["${it}"];`).join("\n")}
2238
2238
  return "unknown";
2239
2239
  }
2240
2240
  }
2241
+ /**
2242
+ * Get the user's email from git config.
2243
+ *
2244
+ * @returns The git user email or undefined if not configured
2245
+ */
2246
+ async getGitEmail() {
2247
+ try {
2248
+ return (await this.shell.run("git config user.email", { capture: true })).trim() || void 0;
2249
+ } catch {
2250
+ return;
2251
+ }
2252
+ }
2241
2253
  };
2242
2254
 
2243
2255
  //#endregion
@@ -2264,6 +2276,7 @@ var devDependencies = {
2264
2276
  "react-dom": "^19.2.4",
2265
2277
  "swagger-ui-dist": "^5.31.0",
2266
2278
  "tsdown": "^0.20.1",
2279
+ "vite": "^7.3.1",
2267
2280
  "vitest": "^4.0.18",
2268
2281
  "worker-mailer": "^1.2.1"
2269
2282
  };
@@ -2290,6 +2303,7 @@ var PackageManagerUtils = class {
2290
2303
  alepha = $inject(Alepha);
2291
2304
  /**
2292
2305
  * Detect the package manager used in the project.
2306
+ * Checks current directory first, then workspace root if in a monorepo.
2293
2307
  */
2294
2308
  async getPackageManager(root, pm) {
2295
2309
  if (pm) return pm;
@@ -2297,6 +2311,9 @@ var PackageManagerUtils = class {
2297
2311
  if (await this.fs.exists(this.fs.join(root, "bun.lock"))) return "bun";
2298
2312
  if (await this.fs.exists(this.fs.join(root, "yarn.lock"))) return "yarn";
2299
2313
  if (await this.fs.exists(this.fs.join(root, "pnpm-lock.yaml"))) return "pnpm";
2314
+ if (await this.fs.exists(this.fs.join(root, "package-lock.json"))) return "npm";
2315
+ const workspace = await this.getWorkspaceContext(root);
2316
+ if (workspace.packageManager) return workspace.packageManager;
2300
2317
  return "npm";
2301
2318
  }
2302
2319
  /**
@@ -2493,7 +2510,7 @@ var PackageManagerUtils = class {
2493
2510
  generatePackageJsonContent(modes) {
2494
2511
  const alephaDeps = devDependencies;
2495
2512
  const dependencies = { alepha: `^${version}` };
2496
- const devDependencies$1 = {};
2513
+ const devDependencies$1 = { vite: alephaDeps.vite };
2497
2514
  if (!modes.isPackage) {
2498
2515
  devDependencies$1["@biomejs/biome"] = alephaDeps["@biomejs/biome"];
2499
2516
  if (modes.test) devDependencies$1.vitest = alephaDeps.vitest;
@@ -2545,6 +2562,7 @@ This file provides guidance to AI coding assistants when working with this Aleph
2545
2562
 
2546
2563
  ### Pages with \`$page\`
2547
2564
  \`\`\`tsx
2565
+ import { t } from "alepha";
2548
2566
  import { $page } from "alepha/react/router";
2549
2567
  import { $client } from "alepha/server/links";
2550
2568
  import type { UserController } from "./UserController.ts";
@@ -2709,31 +2727,6 @@ class AppRouter {
2709
2727
  }
2710
2728
  \`\`\`
2711
2729
 
2712
- ### Modules with \`$module\`
2713
- \`\`\`typescript
2714
- // src/api/index.ts - Groups all API services
2715
- import { $module } from "alepha";
2716
-
2717
- export const ApiModule = $module({
2718
- name: "app.api",
2719
- services: [
2720
- UserController,
2721
- OrderController,
2722
- UserService,
2723
- ],
2724
- });
2725
-
2726
- // src/web/index.ts - Groups all web services (React only)
2727
- export const WebModule = $module({
2728
- name: "app.web",
2729
- services: [AppRouter, Toaster],
2730
- register(alepha) {
2731
- // Optional: configure additional services
2732
- alepha.with(SomeLibrary);
2733
- },
2734
- });
2735
- \`\`\`
2736
-
2737
2730
  ### Environment Variables
2738
2731
  \`\`\`typescript
2739
2732
  import { $env, t } from "alepha";
@@ -2777,6 +2770,7 @@ describe("UserService", () => {
2777
2770
  it("should create user", async () => {
2778
2771
  const alepha = Alepha.create().with(UserService);
2779
2772
  const service = alepha.inject(UserService);
2773
+ await alepha.start();
2780
2774
 
2781
2775
  const user = await service.create({ email: "test@example.com" });
2782
2776
  expect(user.email).toBe("test@example.com");
@@ -2831,13 +2825,46 @@ Full framework source available at \`node_modules/alepha/src/\`.
2831
2825
 
2832
2826
  //#endregion
2833
2827
  //#region ../../src/cli/templates/apiAppSecurityTs.ts
2834
- const apiAppSecurityTs = () => {
2828
+ const apiAppSecurityTs = (opts = {}) => {
2835
2829
  return `
2836
2830
  import { $realm } from "alepha/api/users";
2837
2831
 
2838
2832
  export class AppSecurity {
2839
2833
  users = $realm({
2840
- // configure your realm here
2834
+ settings: {
2835
+ // Auto-promote these users to admin on login
2836
+ adminEmails: ${opts.adminEmail ? `["${opts.adminEmail}"]` : "[]"},
2837
+ adminUsernames: [],
2838
+
2839
+ // Registration & login options
2840
+ registrationAllowed: true,
2841
+ emailEnabled: true,
2842
+ emailRequired: true,
2843
+ usernameEnabled: false,
2844
+ usernameRequired: false,
2845
+ phoneEnabled: false,
2846
+ phoneRequired: false,
2847
+
2848
+ // Verification (requires notifications feature)
2849
+ verifyEmailRequired: false,
2850
+ verifyPhoneRequired: false,
2851
+ resetPasswordAllowed: false,
2852
+ },
2853
+ features: {
2854
+ // Enable additional features
2855
+ notifications: false,
2856
+ audits: false,
2857
+ apiKeys: false,
2858
+ jobs: false,
2859
+ files: false,
2860
+ parameters: false,
2861
+ },
2862
+ identities: {
2863
+ // Enable authentication providers
2864
+ credentials: true,
2865
+ // google: true,
2866
+ // github: true,
2867
+ },
2841
2868
  });
2842
2869
  }
2843
2870
  `.trim();
@@ -3004,31 +3031,8 @@ run(alepha);
3004
3031
 
3005
3032
  //#endregion
3006
3033
  //#region ../../src/cli/templates/mainCss.ts
3007
- const mainCss = (options = {}) => {
3008
- if (options.ui) return `@import "@alepha/ui/styles";`;
3009
- return `
3010
- * {
3011
- box-sizing: border-box;
3012
- margin: 0;
3013
- padding: 0;
3014
- }
3015
-
3016
- html,
3017
- body {
3018
- height: 100%;
3019
- }
3020
-
3021
- body {
3022
- font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
3023
- "Helvetica Neue", Arial, sans-serif;
3024
- line-height: 1.5;
3025
- -webkit-font-smoothing: antialiased;
3026
- }
3027
-
3028
- #root {
3029
- height: 100%;
3030
- }
3031
- `.trim();
3034
+ const mainCss = () => {
3035
+ return `@import "@alepha/ui/styles";`;
3032
3036
  };
3033
3037
 
3034
3038
  //#endregion
@@ -3082,18 +3086,18 @@ const webAppRouterTs = (options) => {
3082
3086
  if (options.auth) classMembers.push(" uiAuth = $uiAuth();");
3083
3087
  if (options.admin) classMembers.push(" uiAdmin = $uiAdmin();");
3084
3088
  classMembers.push(` layout = $page({
3085
- parent: this.ui.root,
3086
- children: () => [this.home],
3087
- });`);
3089
+ parent: this.ui.root,
3090
+ children: () => [this.home],
3091
+ });`);
3088
3092
  }
3089
3093
  if (options.api) classMembers.push(` home = $page({
3090
3094
  path: "/",
3091
- lazy: () => import("./components/Hello.tsx"),
3095
+ lazy: () => import("./components/Home.tsx"),
3092
3096
  loader: () => this.api.hello(),
3093
3097
  });`);
3094
3098
  else classMembers.push(` home = $page({
3095
3099
  path: "/",
3096
- lazy: () => import("./components/Hello.tsx"),
3100
+ lazy: () => import("./components/Home.tsx"),
3097
3101
  });`);
3098
3102
  return `${imports.join("\n")}
3099
3103
 
@@ -3103,30 +3107,15 @@ ${classMembers.join("\n\n")}
3103
3107
  };
3104
3108
 
3105
3109
  //#endregion
3106
- //#region ../../src/cli/templates/webHelloComponentTsx.ts
3107
- const webHelloComponentTsx = (options = {}) => {
3108
- const imports = [];
3109
- if (options.auth) imports.push("import { UserButton } from \"@alepha/ui/auth\";");
3110
- imports.push("import { useState } from \"react\";");
3111
- const userButton = options.auth ? "\n <UserButton />" : "";
3112
- return `${imports.join("\n")}
3113
-
3114
- interface Props {
3115
- message?: string;
3116
- }
3110
+ //#region ../../src/cli/templates/webHomeComponentTsx.ts
3111
+ const webHomeComponentTsx = () => {
3112
+ return `import { GettingStarted } from "alepha/react/intro";
3117
3113
 
3118
- const Hello = (props: Props) => {
3119
- const [message, setMessage] = useState(props.message ?? "");
3120
- return (
3121
- <div>
3122
- <h1>{message}</h1>
3123
- <input value={message} onChange={(e) => setMessage(e.target.value)} />
3124
- <p>Edit this component in src/web/components/Hello.tsx</p>${userButton}
3125
- </div>
3126
- );
3114
+ const Home = () => {
3115
+ return <GettingStarted />;
3127
3116
  };
3128
3117
 
3129
- export default Hello;
3118
+ export default Home;
3130
3119
  `;
3131
3120
  };
3132
3121
 
@@ -3154,7 +3143,7 @@ export const WebModule = $module({
3154
3143
  * - Project structure (src/api, src/web)
3155
3144
  * - Configuration files (tsconfig, biome, editorconfig)
3156
3145
  * - Entry points (main.server.ts, main.browser.ts)
3157
- * - Example code (HelloController, Hello component)
3146
+ * - Example code (HelloController, Home component)
3158
3147
  */
3159
3148
  var ProjectScaffolder = class {
3160
3149
  log = $logger();
@@ -3253,7 +3242,7 @@ var ProjectScaffolder = class {
3253
3242
  auth: opts.auth
3254
3243
  }), opts.force);
3255
3244
  await this.ensureFile(root, "src/api/controllers/HelloController.ts", apiHelloControllerTs(), opts.force);
3256
- if (opts.auth) await this.ensureFile(root, "src/api/AppSecurity.ts", apiAppSecurityTs(), opts.force);
3245
+ if (opts.auth) await this.ensureFile(root, "src/api/AppSecurity.ts", apiAppSecurityTs({ adminEmail: opts.adminEmail }), opts.force);
3257
3246
  }
3258
3247
  /**
3259
3248
  * Ensure web/React project structure exists.
@@ -3261,12 +3250,12 @@ var ProjectScaffolder = class {
3261
3250
  * Creates:
3262
3251
  * - src/main.browser.ts
3263
3252
  * - src/main.css
3264
- * - src/web/index.ts, src/web/AppRouter.ts, src/web/components/Hello.tsx
3253
+ * - src/web/index.ts, src/web/AppRouter.ts, src/web/components/Home.tsx
3265
3254
  */
3266
3255
  async ensureWebProject(root, opts = {}) {
3267
3256
  const appName = this.getAppName(root);
3268
3257
  await this.fs.mkdir(this.fs.join(root, "src/web/components"), { recursive: true });
3269
- await this.ensureFile(root, "src/main.css", mainCss({ ui: opts.ui }), opts.force);
3258
+ await this.ensureFile(root, "src/main.css", mainCss(), opts.force);
3270
3259
  await this.ensureFile(root, "src/web/index.ts", webIndexTs({ appName }), opts.force);
3271
3260
  await this.ensureFile(root, "src/web/AppRouter.ts", webAppRouterTs({
3272
3261
  api: opts.api,
@@ -3274,7 +3263,7 @@ var ProjectScaffolder = class {
3274
3263
  auth: opts.auth,
3275
3264
  admin: opts.admin
3276
3265
  }), opts.force);
3277
- await this.ensureFile(root, "src/web/components/Hello.tsx", webHelloComponentTsx({ auth: opts.auth }), opts.force);
3266
+ await this.ensureFile(root, "src/web/components/Home.tsx", webHomeComponentTsx(), opts.force);
3278
3267
  await this.ensureFile(root, "src/main.browser.ts", mainBrowserTs(), opts.force);
3279
3268
  }
3280
3269
  /**
@@ -3551,6 +3540,7 @@ var DbCommand = class {
3551
3540
  log = $logger();
3552
3541
  fs = $inject(FileSystemProvider);
3553
3542
  utils = $inject(AlephaCliUtils);
3543
+ pm = $inject(PackageManagerUtils);
3554
3544
  entryProvider = $inject(AppEntryProvider);
3555
3545
  /**
3556
3546
  * Check if database migrations are up to date.
@@ -3755,6 +3745,10 @@ var DbCommand = class {
3755
3745
  }
3756
3746
  this.log.info("");
3757
3747
  this.log.info(options.logMessage(providerName, dialect));
3748
+ if (dialect === "sqlite") await this.pm.ensureDependency(options.root, "better-sqlite3", {
3749
+ dev: true,
3750
+ exec: (cmd, opts) => this.utils.exec(cmd, opts)
3751
+ });
3758
3752
  const drizzleConfigJsPath = await this.prepareDrizzleConfig({
3759
3753
  kit: drizzleKitProvider,
3760
3754
  provider,
@@ -4050,6 +4044,7 @@ var ViteDevServerProvider = class {
4050
4044
  await this.server.ssrLoadModule(this.options.entry.server);
4051
4045
  const alepha = globalThis.__alepha;
4052
4046
  if (!alepha) throw new AlephaError("Alepha instance not found after loading entry module");
4047
+ alepha.store.set("alepha.vite.server", this.server);
4053
4048
  this.alepha = alepha;
4054
4049
  await this.setupAlepha();
4055
4050
  this.hasError = false;
@@ -4123,7 +4118,7 @@ var ViteDevServerProvider = class {
4123
4118
  const originalWrite = res.write.bind(res);
4124
4119
  const originalEnd = res.end.bind(res);
4125
4120
  const guardedCall = (fn, ...args) => {
4126
- if (resolved && !ctx.metadata.vite) return;
4121
+ if (resolved && ctx.metadata.vite) return;
4127
4122
  return fn(...args);
4128
4123
  };
4129
4124
  res.setHeader = (...args) => guardedCall(originalSetHeader, ...args);
@@ -4505,6 +4500,8 @@ var GenCommand = class {
4505
4500
  //#endregion
4506
4501
  //#region ../../src/cli/commands/init.ts
4507
4502
  var InitCommand = class {
4503
+ log = $logger();
4504
+ colors = $inject(ConsoleColorProvider);
4508
4505
  utils = $inject(AlephaCliUtils);
4509
4506
  pm = $inject(PackageManagerUtils);
4510
4507
  scaffolder = $inject(ProjectScaffolder);
@@ -4558,17 +4555,18 @@ var InitCommand = class {
4558
4555
  let agentType = false;
4559
4556
  if (flags.ai) agentType = await this.utils.isInstalledAsync("claude") ? "claude" : "agents";
4560
4557
  const isExpo = await this.pm.hasExpo(root);
4558
+ const adminEmail = flags.auth ? await this.utils.getGitEmail() : void 0;
4561
4559
  const force = !!flags.force;
4562
4560
  await run({
4563
4561
  name: "ensuring configuration files",
4564
4562
  handler: async () => {
4565
4563
  await this.scaffolder.ensureConfig(root, {
4566
4564
  force,
4567
- tsconfigJson: !workspace.config.tsconfigJson,
4568
4565
  packageJson: {
4569
4566
  ...flags,
4570
4567
  isPackage: workspace.isPackage
4571
4568
  },
4569
+ tsconfigJson: !workspace.config.tsconfigJson,
4572
4570
  biomeJson: !workspace.config.biomeJson,
4573
4571
  editorconfig: !workspace.config.editorconfig,
4574
4572
  agentMd: agentType ? {
@@ -4584,6 +4582,7 @@ var InitCommand = class {
4584
4582
  });
4585
4583
  if (flags.api) await this.scaffolder.ensureApiProject(root, {
4586
4584
  auth: !!flags.auth,
4585
+ adminEmail,
4587
4586
  force
4588
4587
  });
4589
4588
  if (flags.react && !isExpo) await this.scaffolder.ensureWebProject(root, {
@@ -4618,6 +4617,21 @@ var InitCommand = class {
4618
4617
  root
4619
4618
  });
4620
4619
  }
4620
+ run.end();
4621
+ const projectName = args || ".";
4622
+ const pmRun = pmName === "npm" ? "npm run" : pmName;
4623
+ const c = this.colors;
4624
+ this.log.info("");
4625
+ this.log.info(` ${c.set("GREEN", "✓")} Project ready!`);
4626
+ this.log.info("");
4627
+ this.log.info(` ${c.set("GREY_DARK", "$")} cd ${c.set("CYAN", projectName)}`);
4628
+ this.log.info(` ${c.set("GREY_DARK", "$")} ${c.set("CYAN", `${pmRun} dev`)}`);
4629
+ if (adminEmail) {
4630
+ this.log.info("");
4631
+ this.log.info(` Admin email: ${c.set("GREEN", adminEmail)}`);
4632
+ this.log.info(` ${c.set("GREY_DARK", "(from git config, change in src/api/AppSecurity.ts)")}`);
4633
+ }
4634
+ this.log.info("");
4621
4635
  }
4622
4636
  });
4623
4637
  };