@hype-stack/cli 0.5.15 → 0.5.17

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.
@@ -13,7 +13,7 @@ import { Prompt as O } from "@clack/core";
13
13
  import { styleText as k } from "node:util";
14
14
  import { downloadTemplate as ee } from "giget";
15
15
  //#region src/constants/constants.ts
16
- var A = "0.5.15", te = "gh:BetterTyped/hype-stack", ne = "stack.json", re = "/schema/stack.json", j = "https://api.hype-stack.dev", M = "HYPE_STACK_API_URL", N = "https://www.hype-stack.dev", ie = /^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/, P = [
16
+ var A = "0.5.17", te = "gh:BetterTyped/hype-stack", ne = "stack.json", re = "/schema/stack.json", j = "https://api.hype-stack.dev", M = "HYPE_STACK_API_URL", N = "https://www.hype-stack.dev", ie = /^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/, P = [
17
17
  {
18
18
  value: "cursor",
19
19
  label: "Cursor",
@@ -2452,44 +2452,65 @@ function gr(e) {
2452
2452
  `${L.command("pnpm exec prisma migrate dev")} ${L.muted("(create + apply tables for new packs)")}`
2453
2453
  ].join("\n"), "Database Setup");
2454
2454
  }
2455
- async function _r(e) {
2456
- let { projectRoot: t, paths: n, skipPrompts: r, dbReady: i, freshScaffold: a, runCommand: o = cr } = e, c = n.backend.root, l = T.join(t, c);
2457
- if (!await Y(T.join(l, "package.json"))) return;
2455
+ var _r = /P1001|can't reach database server|make sure your database server is running/i;
2456
+ async function vr(e, t) {
2457
+ let n = await t("pnpm", [
2458
+ "exec",
2459
+ "prisma",
2460
+ "migrate",
2461
+ "status"
2462
+ ], { cwd: e });
2463
+ return !_r.test(`${n.stdout}\n${n.stderr}`);
2464
+ }
2465
+ function yr(e) {
2466
+ s.log.error(L.muted("Can't reach the database. It's most likely not running yet.")), z([
2467
+ `${L.command(`cd ${e}`)}`,
2468
+ `${L.command("docker compose up -d")} ${L.muted("start Postgres and the other services")}`,
2469
+ `${L.command("pnpm exec prisma migrate dev")} ${L.muted("then create + apply tables for new packs")}`
2470
+ ].join("\n"), "Database not reachable");
2471
+ }
2472
+ async function br(e) {
2473
+ let { projectRoot: t, paths: n, skipPrompts: r, dbReady: i, freshScaffold: a, runCommand: o = cr, probeCommand: c = J } = e, l = n.backend.root, u = T.join(t, l);
2474
+ if (!await Y(T.join(u, "package.json"))) return;
2458
2475
  if (!r) {
2459
2476
  s.log.step(L.muted(`Generating Prisma client (${L.command("prisma generate")})...`));
2460
2477
  let e = await o("pnpm", [
2461
2478
  "exec",
2462
2479
  "prisma",
2463
2480
  "generate"
2464
- ], { cwd: l });
2481
+ ], { cwd: u });
2465
2482
  if (e.exitCode !== 0) {
2466
- s.log.error(L.muted("prisma generate failed. See the output above, or finish setup manually:")), vr(e), gr(c);
2483
+ s.log.error(L.muted("prisma generate failed. See the output above, or finish setup manually:")), xr(e), gr(l);
2467
2484
  return;
2468
2485
  }
2469
2486
  s.log.success("Prisma client generated");
2470
2487
  }
2471
2488
  if (r || i === !1) {
2472
- gr(c);
2489
+ gr(l);
2473
2490
  return;
2474
2491
  }
2475
- let u = await s.confirm({
2492
+ if (!await vr(u, c)) {
2493
+ yr(l);
2494
+ return;
2495
+ }
2496
+ let d = await s.confirm({
2476
2497
  message: `Run database setup now? (${L.command("prisma migrate dev")})`,
2477
2498
  initialValue: !0
2478
2499
  });
2479
- if (s.isCancel(u) || !u) {
2480
- gr(c);
2500
+ if (s.isCancel(d) || !d) {
2501
+ gr(l);
2481
2502
  return;
2482
2503
  }
2483
2504
  s.log.step(L.muted(`Running ${L.command("prisma migrate dev --name add-packs")}...`));
2484
- let d = await o("pnpm", [
2505
+ let f = await o("pnpm", [
2485
2506
  "exec",
2486
2507
  "prisma",
2487
2508
  "migrate",
2488
2509
  "dev",
2489
2510
  "--name",
2490
2511
  "add-packs"
2491
- ], { cwd: l });
2492
- if (d.exitCode !== 0 && a) {
2512
+ ], { cwd: u });
2513
+ if (f.exitCode !== 0 && a) {
2493
2514
  let e = await s.confirm({
2494
2515
  message: "migrate dev hit drift between the database and the local migrations. Reset the dev database and retry?",
2495
2516
  initialValue: !0
@@ -2502,28 +2523,28 @@ async function _r(e) {
2502
2523
  "migrate",
2503
2524
  "reset",
2504
2525
  "--force"
2505
- ], { cwd: l });
2506
- if (e.exitCode === 0) s.log.step(L.muted(`Running ${L.command("prisma migrate dev --name add-packs")}...`)), d = await o("pnpm", [
2526
+ ], { cwd: u });
2527
+ if (e.exitCode === 0) s.log.step(L.muted(`Running ${L.command("prisma migrate dev --name add-packs")}...`)), f = await o("pnpm", [
2507
2528
  "exec",
2508
2529
  "prisma",
2509
2530
  "migrate",
2510
2531
  "dev",
2511
2532
  "--name",
2512
2533
  "add-packs"
2513
- ], { cwd: l });
2534
+ ], { cwd: u });
2514
2535
  else {
2515
- s.log.error(L.muted("prisma migrate reset did not complete. See the output above, or finish setup manually:")), vr(e), gr(c);
2536
+ s.log.error(L.muted("prisma migrate reset did not complete. See the output above, or finish setup manually:")), xr(e), gr(l);
2516
2537
  return;
2517
2538
  }
2518
2539
  }
2519
2540
  }
2520
- if (d.exitCode !== 0) {
2521
- s.log.error(L.muted("prisma migrate dev did not complete. See the output above, or finish setup manually:")), vr(d), gr(c);
2541
+ if (f.exitCode !== 0) {
2542
+ s.log.error(L.muted("prisma migrate dev did not complete. See the output above, or finish setup manually:")), xr(f), gr(l);
2522
2543
  return;
2523
2544
  }
2524
2545
  s.log.success("Database schema applied");
2525
2546
  }
2526
- function vr(e) {
2547
+ function xr(e) {
2527
2548
  let t = (e.stderr || e.stdout).trim();
2528
2549
  t && s.log.warn(L.muted(t));
2529
2550
  }
@@ -2539,7 +2560,7 @@ var X = {
2539
2560
  Resend: "resend",
2540
2561
  IpLocate: "iplocate",
2541
2562
  Sentry: "sentry"
2542
- }, yr = {
2563
+ }, Sr = {
2543
2564
  [X.Config]: "Config",
2544
2565
  [X.Databases]: "Databases",
2545
2566
  [X.Workos]: "WorkOS",
@@ -2549,15 +2570,15 @@ var X = {
2549
2570
  [X.Resend]: "Resend",
2550
2571
  [X.IpLocate]: "IP Locate",
2551
2572
  [X.Sentry]: "Sentry"
2552
- }, br = new Set(Object.values(X));
2553
- function xr(e) {
2573
+ }, Cr = new Set(Object.values(X));
2574
+ function wr(e) {
2554
2575
  return e.toLowerCase().replace(/[^a-z0-9]+/g, "").trim();
2555
2576
  }
2556
- function Sr(e) {
2557
- let t = xr(e);
2558
- return br.has(t) ? t : void 0;
2577
+ function Tr(e) {
2578
+ let t = wr(e);
2579
+ return Cr.has(t) ? t : void 0;
2559
2580
  }
2560
- var Cr = {
2581
+ var Er = {
2561
2582
  [X.Config]: { hint: "App URLs. Defaults work for local dev." },
2562
2583
  [X.Databases]: { hint: "Credentials for the local Docker Postgres and Valkey containers." },
2563
2584
  [X.Workos]: {
@@ -2595,61 +2616,61 @@ var Cr = {
2595
2616
  link: "https://sentry.io",
2596
2617
  hint: "Your project DSN. Leave blank to skip Sentry for now."
2597
2618
  }
2598
- }, wr = { hint: "Add your value, or press Enter to leave it blank." };
2599
- function Tr(e) {
2600
- let t = Sr(e);
2601
- return t ? Cr[t] : wr;
2619
+ }, Dr = { hint: "Add your value, or press Enter to leave it blank." };
2620
+ function Or(e) {
2621
+ let t = Tr(e);
2622
+ return t ? Er[t] : Dr;
2602
2623
  }
2603
- function Er(e, t) {
2624
+ function kr(e, t) {
2604
2625
  if (t.length === 0) return !0;
2605
- let n = Sr(e);
2626
+ let n = Tr(e);
2606
2627
  return n ? t.includes(n) : !1;
2607
2628
  }
2608
- function Dr(e) {
2629
+ function Ar(e) {
2609
2630
  return e ? e.map((e) => {
2610
- let t = Sr(e.envExample.section);
2631
+ let t = Tr(e.envExample.section);
2611
2632
  if (!t) throw Error(`Unknown onboarding env section "${e.envExample.section}". Known sections: ${Object.values(X).join(", ")}.`);
2612
2633
  return t;
2613
2634
  }) : [];
2614
2635
  }
2615
- function Or(e) {
2636
+ function jr(e) {
2616
2637
  let t = /* @__PURE__ */ new Set(), n = [];
2617
2638
  for (let r of e) t.has(r) || (t.add(r), n.push(r));
2618
2639
  return n;
2619
2640
  }
2620
- var kr = {
2641
+ var Mr = {
2621
2642
  "starter-saas-workos": ["Your WebSocket upgrades can be authenticated with `authenticateWsUpgrade` from `@backend/middleware/auth/ws-auth` via `sockets.routes(authenticateWsUpgrade)`."],
2622
2643
  "starter-saas-betterauth": ["Your WebSocket upgrades can be authenticated with `authenticateWsUpgrade` from `@backend/middleware/auth/ws-auth` via `sockets.routes(authenticateWsUpgrade)`."],
2623
2644
  "pack-notifications": ["Notifications push over the `appChannel` socket channel; register it in your server startup to go live."],
2624
2645
  "pack-collaboration": ["Team and TeamMember are available as CASL subjects; project member and team management reuse the existing `Project` subject."]
2625
2646
  };
2626
- function Ar(e) {
2647
+ function Nr(e) {
2627
2648
  let t = /* @__PURE__ */ new Set(), n = [];
2628
2649
  for (let r of e) {
2629
- let e = kr[r];
2650
+ let e = Mr[r];
2630
2651
  if (e) for (let r of e) t.has(r) || (t.add(r), n.push(r));
2631
2652
  }
2632
2653
  return n;
2633
2654
  }
2634
2655
  //#endregion
2635
2656
  //#region src/core/stack-config.ts
2636
- async function jr(e) {
2657
+ async function Pr(e) {
2637
2658
  return dr(T.join(e, ne));
2638
2659
  }
2639
- async function Mr(e) {
2660
+ async function Fr(e) {
2640
2661
  return Y(T.join(e, ne));
2641
2662
  }
2642
- async function Nr(e, t) {
2663
+ async function Ir(e, t) {
2643
2664
  await fr(T.join(e, ne), t);
2644
2665
  }
2645
- async function Pr(e) {
2666
+ async function Lr(e) {
2646
2667
  let t = T.join(e, "apps"), n = T.join(e, "packages"), [r, i] = await Promise.all([pr(t), pr(n)]);
2647
2668
  return {
2648
2669
  apps: r,
2649
2670
  packages: i
2650
2671
  };
2651
2672
  }
2652
- function Fr(e) {
2673
+ function Rr(e) {
2653
2674
  let t = e.apps.backend ?? "apps/backend", n = e.apps.frontend ?? "apps/frontend", r = e.apps.admin ?? "apps/admin", i = e.packages.enums ?? "packages/enums";
2654
2675
  return {
2655
2676
  backend: {
@@ -2683,19 +2704,19 @@ function Fr(e) {
2683
2704
  }
2684
2705
  };
2685
2706
  }
2686
- function Ir(e, t) {
2707
+ function zr(e, t) {
2687
2708
  return {
2688
2709
  $schema: de(),
2689
2710
  version: 1,
2690
2711
  name: e,
2691
2712
  apps: t.apps,
2692
2713
  packages: t.packages,
2693
- paths: Fr(t),
2714
+ paths: Rr(t),
2694
2715
  installedPacks: [],
2695
2716
  licenseKey: null
2696
2717
  };
2697
2718
  }
2698
- async function Lr(e) {
2719
+ async function Br(e) {
2699
2720
  let t = T.join(e, "package.json"), n = T.join(e, "apps"), [r, i] = await Promise.all([Y(t), lr(n)]);
2700
2721
  return r && i;
2701
2722
  }
@@ -2710,7 +2731,7 @@ function Z(e, t) {
2710
2731
  }
2711
2732
  //#endregion
2712
2733
  //#region src/core/registry.ts
2713
- async function Rr(e) {
2734
+ async function Vr(e) {
2714
2735
  let { data: t, error: n, status: r } = await q.createRequest()({
2715
2736
  endpoint: `/packs/${encodeURIComponent(e)}/manifest`,
2716
2737
  method: "GET"
@@ -2719,7 +2740,7 @@ async function Rr(e) {
2719
2740
  if (n || !t) throw Error(`Failed to load manifest for "${e}": ${String(n)}`);
2720
2741
  return t;
2721
2742
  }
2722
- async function zr(e, t = {}) {
2743
+ async function Hr(e, t = {}) {
2723
2744
  let n = q.createRequest()({
2724
2745
  endpoint: `/packs/${encodeURIComponent(e)}/download`,
2725
2746
  method: "POST"
@@ -2745,23 +2766,23 @@ async function zr(e, t = {}) {
2745
2766
  packDir: s
2746
2767
  };
2747
2768
  }
2748
- function Br(e, t, n) {
2769
+ function Ur(e, t, n) {
2749
2770
  let r = Z(e, t);
2750
2771
  return T.resolve(n, r);
2751
2772
  }
2752
- function Vr(e, t) {
2773
+ function Wr(e, t) {
2753
2774
  return T.join(t, e);
2754
2775
  }
2755
- var Hr = q.createRequest()({
2776
+ var Gr = q.createRequest()({
2756
2777
  endpoint: "/packs/list",
2757
2778
  method: "GET"
2758
2779
  });
2759
- async function Ur() {
2760
- let { data: e, error: t } = await Hr.send();
2780
+ async function Kr() {
2781
+ let { data: e, error: t } = await Gr.send();
2761
2782
  if (t || !e) throw Error(`Failed to fetch pack list: ${String(t)}`);
2762
2783
  return e.packs;
2763
2784
  }
2764
- async function Wr(e, t = {}) {
2785
+ async function qr(e, t = {}) {
2765
2786
  if (e.length === 0) return {};
2766
2787
  let n = q.createRequest()({
2767
2788
  endpoint: "/packs/authorize",
@@ -2777,33 +2798,33 @@ async function Wr(e, t = {}) {
2777
2798
  }
2778
2799
  //#endregion
2779
2800
  //#region src/core/codemods.ts
2780
- var Gr = "@hype-stack/", Kr = /@hype-stack\/(?!cli\b)/g;
2781
- function qr(e, t) {
2782
- return e.replace(Kr, t);
2801
+ var Jr = "@hype-stack/", Yr = /@hype-stack\/(?!cli\b)/g;
2802
+ function Xr(e, t) {
2803
+ return e.replace(Yr, t);
2783
2804
  }
2784
- function Jr(e, t) {
2805
+ function Zr(e, t) {
2785
2806
  return Z(e === "admin" ? "{{admin.root}}" : "{{frontend.root}}", t);
2786
2807
  }
2787
- async function Yr(e, t, n) {
2808
+ async function Qr(e, t, n) {
2788
2809
  let r = Z("{{backend.root}}", t), i = T.resolve(n, r, "src/config/env/env.config.ts"), a = T.resolve(n, r, ".env.example"), o = T.resolve(n, r, ".env"), s = T.resolve(n, r, ".env.test");
2789
2810
  if (await Y(i)) {
2790
2811
  let t = await y.readFile(i, "utf-8");
2791
- for (let n of e) t.includes(`from "${n.from}"`) || (t = Xr(t, n), t = Zr(t, n));
2812
+ for (let n of e) t.includes(`from "${n.from}"`) || (t = $r(t, n), t = ei(t, n));
2792
2813
  await y.writeFile(i, t, "utf-8");
2793
2814
  }
2794
- if (await Promise.all([a, o].map((t) => Qr(t, e))), await Y(s)) {
2815
+ if (await Promise.all([a, o].map((t) => ti(t, e))), await Y(s)) {
2795
2816
  let t = await y.readFile(s, "utf-8");
2796
- for (let n of e) t = ei(t, n);
2817
+ for (let n of e) t = ri(t, n);
2797
2818
  await y.writeFile(s, t, "utf-8");
2798
2819
  }
2799
2820
  }
2800
- function Xr(e, t) {
2821
+ function $r(e, t) {
2801
2822
  let n = `import { ${t.import} } from "${t.from}";`, r = e.lastIndexOf("import ");
2802
2823
  if (r === -1) return n + "\n" + e;
2803
2824
  let i = e.indexOf("\n", e.indexOf(";", r));
2804
2825
  return i === -1 ? e + "\n" + n : e.slice(0, i + 1) + n + "\n" + e.slice(i + 1);
2805
2826
  }
2806
- function Zr(e, t) {
2827
+ function ei(e, t) {
2807
2828
  let n = `.extend(${t.import}.shape)`;
2808
2829
  if (e.includes(n)) return e;
2809
2830
  let r = e.indexOf("export const envSchema = z.object({");
@@ -2818,33 +2839,33 @@ function Zr(e, t) {
2818
2839
  let o = a + 2;
2819
2840
  return e.slice(0, o) + n + e.slice(o);
2820
2841
  }
2821
- async function Qr(e, t) {
2842
+ async function ti(e, t) {
2822
2843
  if (!await Y(e)) return;
2823
2844
  let n = await y.readFile(e, "utf-8");
2824
- for (let e of t) n = $r(n, e);
2845
+ for (let e of t) n = ni(n, e);
2825
2846
  await y.writeFile(e, n, "utf-8");
2826
2847
  }
2827
- function $r(e, t) {
2848
+ function ni(e, t) {
2828
2849
  for (let n of Object.keys(t.envExample.vars)) if (e.includes(`${n}=`)) return e;
2829
2850
  let n = [];
2830
- n.push(""), n.push(`# ${yr[t.envExample.section]}`);
2851
+ n.push(""), n.push(`# ${Sr[t.envExample.section]}`);
2831
2852
  for (let [e, r] of Object.entries(t.envExample.vars)) n.push(`${e}=${r}`);
2832
2853
  return e.trimEnd() + "\n" + n.join("\n") + "\n";
2833
2854
  }
2834
- function ei(e, t) {
2855
+ function ri(e, t) {
2835
2856
  for (let n of Object.keys(t.envTest)) if (e.includes(`${n}=`)) return e;
2836
2857
  let n = [""];
2837
2858
  for (let [e, r] of Object.entries(t.envTest)) n.push(`${e}=${r}`);
2838
2859
  return e.trimEnd() + "\n" + n.join("\n") + "\n";
2839
2860
  }
2840
- async function ti(e, t, n) {
2861
+ async function ii(e, t, n) {
2841
2862
  let r = T.resolve(n, Z("{{backend.routes}}", t), "index.ts");
2842
2863
  if (!await Y(r)) return;
2843
2864
  let i = await y.readFile(r, "utf-8");
2844
- for (let t of e) i.includes(`from "${t.from}"`) || (i = ni(i, t), i = ri(i, t));
2865
+ for (let t of e) i.includes(`from "${t.from}"`) || (i = ai(i, t), i = oi(i, t));
2845
2866
  await y.writeFile(r, i, "utf-8");
2846
2867
  }
2847
- function ni(e, t) {
2868
+ function ai(e, t) {
2848
2869
  let n = `import { ${t.import} } from "${t.from}";`, r = e.lastIndexOf("from \"./");
2849
2870
  if (r !== -1) {
2850
2871
  let t = e.indexOf("\n", r);
@@ -2853,7 +2874,7 @@ function ni(e, t) {
2853
2874
  let i = e.indexOf("export const registerRoutes");
2854
2875
  return i === -1 ? e : e.slice(0, i) + n + "\n\n" + e.slice(i);
2855
2876
  }
2856
- function ri(e, t) {
2877
+ function oi(e, t) {
2857
2878
  let n = `.route("${t.prefix}", ${t.import})`, r = e.match(/\.route\([^)]+\);/g);
2858
2879
  if (r) {
2859
2880
  let t = r[r.length - 1], i = e.lastIndexOf(t) + t.length - 1;
@@ -2861,14 +2882,14 @@ function ri(e, t) {
2861
2882
  }
2862
2883
  return e.replace("return app;", `return app\n ${n};`);
2863
2884
  }
2864
- async function ii(e, t, n) {
2885
+ async function si(e, t, n) {
2865
2886
  let r = T.resolve(n, Z("{{backend.root}}", t), "src/context.ts");
2866
2887
  if (!await Y(r)) return;
2867
2888
  let i = await y.readFile(r, "utf-8");
2868
- for (let t of e) i.includes(`export let ${t.export}`) || (i = ai(i, t), i = oi(i, t), i = si(i, t), i = li(i, t));
2889
+ for (let t of e) i.includes(`export let ${t.export}`) || (i = ci(i, t), i = li(i, t), i = ui(i, t), i = fi(i, t));
2869
2890
  await y.writeFile(r, i, "utf-8");
2870
2891
  }
2871
- function ai(e, t) {
2892
+ function ci(e, t) {
2872
2893
  let n = `import { ${t.typeImport.name} } from "${t.typeImport.from}";`;
2873
2894
  if (e.includes(`from "${t.typeImport.from}"`)) return e;
2874
2895
  let r = e.lastIndexOf("import ");
@@ -2876,7 +2897,7 @@ function ai(e, t) {
2876
2897
  let i = e.indexOf("\n", e.indexOf(";", r));
2877
2898
  return i === -1 ? e + "\n" + n : e.slice(0, i + 1) + n + "\n" + e.slice(i + 1);
2878
2899
  }
2879
- function oi(e, t) {
2900
+ function li(e, t) {
2880
2901
  let n = `export let ${t.export}: ${t.type};`, r = e.lastIndexOf("export let ");
2881
2902
  if (r === -1) {
2882
2903
  let t = e.indexOf("export const setupContext");
@@ -2885,15 +2906,15 @@ function oi(e, t) {
2885
2906
  let i = e.indexOf("\n", r);
2886
2907
  return i === -1 ? e + "\n" + n : e.slice(0, i + 1) + n + "\n" + e.slice(i + 1);
2887
2908
  }
2888
- function si(e, t) {
2909
+ function ui(e, t) {
2889
2910
  let n = ` ${t.export} = ${t.init};`, r = e.match(/export const setupContext\s*=\s*async\s*\([^)]*\)\s*=>\s*\{/);
2890
2911
  if (!r) return e;
2891
2912
  let i = e.indexOf("{", e.indexOf(r[0]));
2892
2913
  if (i === -1) return e;
2893
- let a = ci(e, i);
2914
+ let a = di(e, i);
2894
2915
  return a === -1 ? e : e.slice(0, a) + n + "\n" + e.slice(a);
2895
2916
  }
2896
- function ci(e, t) {
2917
+ function di(e, t) {
2897
2918
  let n = 0;
2898
2919
  for (let r = t; r < e.length; r++) {
2899
2920
  let t = e[r];
@@ -2902,20 +2923,20 @@ function ci(e, t) {
2902
2923
  }
2903
2924
  return -1;
2904
2925
  }
2905
- function li(e, t) {
2926
+ function fi(e, t) {
2906
2927
  let n = ` ${t.export}: ${t.type};`, r = e.indexOf("export type ContextVariables = {");
2907
2928
  if (r === -1) return e;
2908
2929
  let i = e.indexOf("};", r);
2909
2930
  return i === -1 ? e : e.slice(0, i) + n + "\n" + e.slice(i);
2910
2931
  }
2911
- async function ui(e, t, n) {
2932
+ async function pi(e, t, n) {
2912
2933
  let r = T.resolve(n, Z("{{enums.src}}", t), "index.ts");
2913
2934
  if (!await Y(r)) return;
2914
2935
  let i = await y.readFile(r, "utf-8");
2915
- for (let t of e) i.includes(`from "${t.from}"`) || (i = di(i, t));
2936
+ for (let t of e) i.includes(`from "${t.from}"`) || (i = mi(i, t));
2916
2937
  await y.writeFile(r, i, "utf-8");
2917
2938
  }
2918
- function di(e, t) {
2939
+ function mi(e, t) {
2919
2940
  let n = `export * from "${t.from}";`, r = e.lastIndexOf("export * from");
2920
2941
  if (r !== -1) {
2921
2942
  let t = e.indexOf("\n", r);
@@ -2923,14 +2944,14 @@ function di(e, t) {
2923
2944
  }
2924
2945
  return e.trim() === "" ? n + "\n" : e.trimEnd() + "\n" + n + "\n";
2925
2946
  }
2926
- async function fi(e, t, n) {
2947
+ async function hi(e, t, n) {
2927
2948
  let r = Z("{{backend.root}}", t), i = T.resolve(n, r, "src/sockets/index.ts");
2928
2949
  if (!await Y(i)) return;
2929
2950
  let a = await y.readFile(i, "utf-8");
2930
- for (let t of e) a.includes(`from "${t.from}"`) || (a = pi(a, t), a = mi(a, t));
2931
- await Y(T.resolve(n, r, "src/libs/websocket/ws-authenticate.ts")) && (a = hi(a)), await y.writeFile(i, a, "utf-8");
2951
+ for (let t of e) a.includes(`from "${t.from}"`) || (a = gi(a, t), a = _i(a, t));
2952
+ await Y(T.resolve(n, r, "src/libs/websocket/ws-authenticate.ts")) && (a = vi(a)), await y.writeFile(i, a, "utf-8");
2932
2953
  }
2933
- function pi(e, t) {
2954
+ function gi(e, t) {
2934
2955
  let n = `import { ${t.import} } from "${t.from}";`, r = e.lastIndexOf("from \"./");
2935
2956
  if (r !== -1) {
2936
2957
  let t = e.indexOf("\n", r);
@@ -2939,7 +2960,7 @@ function pi(e, t) {
2939
2960
  let i = e.indexOf("const sockets");
2940
2961
  return i === -1 ? e : e.slice(0, i) + n + "\n\n" + e.slice(i);
2941
2962
  }
2942
- function mi(e, t) {
2963
+ function _i(e, t) {
2943
2964
  let n = `.socket("${t.prefix}", ${t.import})`, r = e.indexOf("const sockets");
2944
2965
  if (r === -1) return e;
2945
2966
  let i = e.indexOf("new SocketRouter", r);
@@ -2953,7 +2974,7 @@ function mi(e, t) {
2953
2974
  }
2954
2975
  return e;
2955
2976
  }
2956
- function hi(e) {
2977
+ function vi(e) {
2957
2978
  if (e.includes("wsAuthenticate")) return e;
2958
2979
  let t = e.indexOf("from \"@backend/libs/websocket/socket-router\""), n = e;
2959
2980
  if (t !== -1) {
@@ -2962,14 +2983,14 @@ function hi(e) {
2962
2983
  }
2963
2984
  return n.replace("new SocketRouter()", "new SocketRouter({ authenticate: wsAuthenticate })");
2964
2985
  }
2965
- async function gi(e, t, n) {
2986
+ async function yi(e, t, n) {
2966
2987
  let r = Z("{{frontend.root}}", t), i = T.resolve(n, r, "src/api/sdk.ts");
2967
2988
  if (!await Y(i)) return;
2968
2989
  let a = await y.readFile(i, "utf-8");
2969
- for (let t of e) a.includes(`.$configure(${t.import})`) || (a = _i(a, t), a = vi(a, t));
2990
+ for (let t of e) a.includes(`.$configure(${t.import})`) || (a = bi(a, t), a = xi(a, t));
2970
2991
  await y.writeFile(i, a, "utf-8");
2971
2992
  }
2972
- function _i(e, t) {
2993
+ function bi(e, t) {
2973
2994
  let n = `import { ${t.import} } from "${t.from}";`;
2974
2995
  if (e.includes(n)) return e;
2975
2996
  let r = e.lastIndexOf("from \"./");
@@ -2980,20 +3001,20 @@ function _i(e, t) {
2980
3001
  let i = e.indexOf("export const sdk");
2981
3002
  return i === -1 ? e : e.slice(0, i) + n + "\n\n" + e.slice(i);
2982
3003
  }
2983
- function vi(e, t) {
3004
+ function xi(e, t) {
2984
3005
  let n = `.$configure(${t.import})`, r = e.indexOf("export const sdk");
2985
3006
  if (r === -1) return e;
2986
3007
  let i = e.indexOf(";", r);
2987
3008
  return i === -1 ? e : e.slice(0, i) + "\n " + n + e.slice(i);
2988
3009
  }
2989
- async function yi(e, t, n) {
3010
+ async function Si(e, t, n) {
2990
3011
  let r = T.resolve(n, Z("{{backend.utils}}", t), "frontend-url/frontend-url.ts");
2991
3012
  if (!await Y(r)) return;
2992
3013
  let i = await y.readFile(r, "utf-8");
2993
- for (let t of e) i.includes(`"${t.path}"`) || (i = bi(i, t));
3014
+ for (let t of e) i.includes(`"${t.path}"`) || (i = Ci(i, t));
2994
3015
  await y.writeFile(r, i, "utf-8");
2995
3016
  }
2996
- function bi(e, t) {
3017
+ function Ci(e, t) {
2997
3018
  let n = ` "${t.path}": ${t.search};`, r = e.indexOf("type RouteDefinitions = {");
2998
3019
  if (r === -1) return e;
2999
3020
  let i = e.indexOf("{", r);
@@ -3009,40 +3030,40 @@ function bi(e, t) {
3009
3030
  }
3010
3031
  return o === -1 ? e : e.slice(0, o) + n + "\n" + e.slice(o);
3011
3032
  }
3012
- var xi = "import { type LucideIcon } from \"lucide-react\";\n\n/* -------------------------------------------------------------------------------------------------\n * Types\n * -----------------------------------------------------------------------------------------------*/\n\nexport type NavItem = {\n label: string;\n icon: LucideIcon;\n to: string;\n params?: Record<string, string>;\n};\n\nexport type NavSection = {\n label: string;\n icon: LucideIcon;\n items: NavItem[];\n};\n\nexport type NavSectionLink = NavSection & { to: string; params?: Record<string, string> };\n\nexport type NavEntry = NavSection | NavSectionLink;\n\n/* -------------------------------------------------------------------------------------------------\n * Navigation\n * -----------------------------------------------------------------------------------------------*/\n\nexport const primaryNav: NavEntry[] = [];\n\nexport const secondaryNav: NavEntry[] = [];\n\nexport const tertiaryNav: NavEntry[] = [];\n\nexport const settingsNav: NavEntry[] = [];\n", Si = {
3033
+ var wi = "import { type LucideIcon } from \"lucide-react\";\n\n/* -------------------------------------------------------------------------------------------------\n * Types\n * -----------------------------------------------------------------------------------------------*/\n\nexport type NavItem = {\n label: string;\n icon: LucideIcon;\n to: string;\n params?: Record<string, string>;\n};\n\nexport type NavSection = {\n label: string;\n icon: LucideIcon;\n items: NavItem[];\n};\n\nexport type NavSectionLink = NavSection & { to: string; params?: Record<string, string> };\n\nexport type NavEntry = NavSection | NavSectionLink;\n\n/* -------------------------------------------------------------------------------------------------\n * Navigation\n * -----------------------------------------------------------------------------------------------*/\n\nexport const primaryNav: NavEntry[] = [];\n\nexport const secondaryNav: NavEntry[] = [];\n\nexport const tertiaryNav: NavEntry[] = [];\n\nexport const settingsNav: NavEntry[] = [];\n", Ti = {
3013
3034
  primary: "primaryNav",
3014
3035
  secondary: "secondaryNav",
3015
3036
  tertiary: "tertiaryNav",
3016
3037
  settings: "settingsNav"
3017
- }, Ci = new Set(["primary", "secondary"]);
3018
- async function wi(e) {
3019
- let { entries: t, paths: n, projectRoot: r, slot: i = "frontend", override: a = !1 } = e, o = Jr(i, n), s = T.resolve(r, o, "src/constants/nav.constants.ts"), c;
3020
- await Y(s) ? c = await y.readFile(s, "utf-8") : (await y.mkdir(T.dirname(s), { recursive: !0 }), c = xi);
3021
- for (let e of t) !a && c.includes(`label: "${e.label}"`) || (c = Di(c, e));
3022
- if (a) for (let e of t) c.includes(`label: "${e.label}"`) && (c = ji(c, e));
3023
- for (let e of t) Ci.has(e.group) && (c.includes(`label: "${e.label}"`) || (c = ki(c, e, "append")));
3024
- for (let e of t.toReversed()) Ci.has(e.group) || c.includes(`label: "${e.label}"`) || (c = ki(c, e, "prepend"));
3038
+ }, Ei = new Set(["primary", "secondary"]);
3039
+ async function Di(e) {
3040
+ let { entries: t, paths: n, projectRoot: r, slot: i = "frontend", override: a = !1 } = e, o = Zr(i, n), s = T.resolve(r, o, "src/constants/nav.constants.ts"), c;
3041
+ await Y(s) ? c = await y.readFile(s, "utf-8") : (await y.mkdir(T.dirname(s), { recursive: !0 }), c = wi);
3042
+ for (let e of t) !a && c.includes(`label: "${e.label}"`) || (c = Ai(c, e));
3043
+ if (a) for (let e of t) c.includes(`label: "${e.label}"`) && (c = Pi(c, e));
3044
+ for (let e of t) Ei.has(e.group) && (c.includes(`label: "${e.label}"`) || (c = Mi(c, e, "append")));
3045
+ for (let e of t.toReversed()) Ei.has(e.group) || c.includes(`label: "${e.label}"`) || (c = Mi(c, e, "prepend"));
3025
3046
  await y.writeFile(s, c, "utf-8");
3026
3047
  }
3027
- async function Ti(e) {
3028
- let { postLoginRedirect: t, paths: n, projectRoot: r, slot: i = "frontend" } = e, a = Jr(i, n), o = T.resolve(r, a, "src/features/auth/constants/auth.constants.ts");
3048
+ async function Oi(e) {
3049
+ let { postLoginRedirect: t, paths: n, projectRoot: r, slot: i = "frontend" } = e, a = Zr(i, n), o = T.resolve(r, a, "src/features/auth/constants/auth.constants.ts");
3029
3050
  if (!await Y(o)) return;
3030
3051
  let s = await y.readFile(o, "utf-8"), c = /export const POST_LOGIN_REDIRECT_PATH = "[^"]*";/;
3031
3052
  if (!c.test(s)) return;
3032
3053
  let l = s.replace(c, `export const POST_LOGIN_REDIRECT_PATH = "${t}";`);
3033
3054
  await y.writeFile(o, l, "utf-8");
3034
3055
  }
3035
- function Ei(e) {
3056
+ function ki(e) {
3036
3057
  let t = [e.icon];
3037
3058
  if (e.items) for (let n of e.items) t.includes(n.icon) || t.push(n.icon);
3038
3059
  return t;
3039
3060
  }
3040
- function Di(e, t) {
3041
- let n = Ei(t), r = e;
3042
- for (let e of n) r = Oi(r, e);
3061
+ function Ai(e, t) {
3062
+ let n = ki(t), r = e;
3063
+ for (let e of n) r = ji(r, e);
3043
3064
  return r;
3044
3065
  }
3045
- function Oi(e, t) {
3066
+ function ji(e, t) {
3046
3067
  let n = e.match(/import \{([^}]+)\} from "lucide-react";/);
3047
3068
  if (!n) return e;
3048
3069
  let r = n[1].split(",").map((e) => e.trim()).filter(Boolean);
@@ -3050,31 +3071,31 @@ function Oi(e, t) {
3050
3071
  let i = r.findIndex((e) => e.startsWith("type "));
3051
3072
  return i === -1 ? r.push(t) : r.splice(i, 0, t), e.replace(n[0], `import { ${r.join(", ")} } from "lucide-react";`);
3052
3073
  }
3053
- function ki(e, t, n) {
3054
- let r = Si[t.group];
3074
+ function Mi(e, t, n) {
3075
+ let r = Ti[t.group];
3055
3076
  if (!r) return e;
3056
- let i = Mi(t), a = RegExp(`export const ${r}: NavEntry\\[\\] = \\[`), o = e.match(a);
3077
+ let i = Fi(t), a = RegExp(`export const ${r}: NavEntry\\[\\] = \\[`), o = e.match(a);
3057
3078
  if (!o) return e;
3058
- let s = e.indexOf(o[0]) + o[0].length, c = Ai(e, s - 1);
3079
+ let s = e.indexOf(o[0]) + o[0].length, c = Ni(e, s - 1);
3059
3080
  return c === -1 ? e : e.slice(s, c).trim() === "" ? e.slice(0, s) + "\n" + i + "\n" + e.slice(s) : n === "append" ? e.slice(0, c) + i + "\n" + e.slice(c) : e.slice(0, s) + "\n" + i + e.slice(s);
3060
3081
  }
3061
- function Ai(e, t) {
3082
+ function Ni(e, t) {
3062
3083
  let n = 0;
3063
3084
  for (let r = t; r < e.length; r++) if (e[r] === "[") n++;
3064
3085
  else if (e[r] === "]" && (n--, n === 0)) return r;
3065
3086
  return -1;
3066
3087
  }
3067
- function ji(e, t) {
3088
+ function Pi(e, t) {
3068
3089
  let n = e.indexOf(`label: "${t.label}"`);
3069
3090
  if (n === -1) return e;
3070
3091
  let r = e.lastIndexOf("{", n);
3071
3092
  if (r === -1) return e;
3072
- let i = ci(e, r);
3093
+ let i = di(e, r);
3073
3094
  if (i === -1) return e;
3074
- let a = Mi(t).trimStart().replace(/,\s*$/, "");
3095
+ let a = Fi(t).trimStart().replace(/,\s*$/, "");
3075
3096
  return e.slice(0, r) + a + e.slice(i + 1);
3076
3097
  }
3077
- function Mi(e) {
3098
+ function Fi(e) {
3078
3099
  let t = [];
3079
3100
  if (t.push(" {"), t.push(` label: "${e.label}",`), t.push(` icon: ${e.icon},`), e.to && t.push(` to: "${e.to}",`), e.params && t.push(` params: ${e.params},`), e.items && e.items.length > 0) {
3080
3101
  t.push(" items: [");
@@ -3090,14 +3111,14 @@ function Mi(e) {
3090
3111
  } else t.push(" items: [],");
3091
3112
  return t.push(" },"), t.join("\n");
3092
3113
  }
3093
- async function Ni(e, t, n) {
3114
+ async function Ii(e, t, n) {
3094
3115
  let r = Z("{{backend.features}}", t), i = T.resolve(n, r, "organizations/modules/setup-organization/steps/index.ts");
3095
3116
  if (!await Y(i)) return;
3096
3117
  let a = await y.readFile(i, "utf-8");
3097
- for (let t of e) a.includes(`from "${t.from}"`) || (a = Pi(a, t), a = Fi(a, t));
3118
+ for (let t of e) a.includes(`from "${t.from}"`) || (a = Li(a, t), a = Ri(a, t));
3098
3119
  await y.writeFile(i, a, "utf-8");
3099
3120
  }
3100
- function Pi(e, t) {
3121
+ function Li(e, t) {
3101
3122
  let n = `import { ${t.import} } from "${t.from}";`, r = e.lastIndexOf("import ");
3102
3123
  if (r !== -1) {
3103
3124
  let t = e.indexOf("\n", e.indexOf(";", r));
@@ -3105,38 +3126,38 @@ function Pi(e, t) {
3105
3126
  }
3106
3127
  return e.indexOf("type "), n + "\n\n" + e;
3107
3128
  }
3108
- function Fi(e, t) {
3129
+ function Ri(e, t) {
3109
3130
  let n = ` { id: "${t.id}", execute: (ctx) => ${t.import}(ctx) },`, r = e.match(/export const steps:\s*Step\[\]\s*=\s*\[/);
3110
3131
  if (!r) return e;
3111
- let i = e.indexOf(r[0]) + r[0].length, a = Ii(e, i - 1);
3132
+ let i = e.indexOf(r[0]) + r[0].length, a = zi(e, i - 1);
3112
3133
  return a === -1 ? e : e.slice(i, a).trim() === "" ? e.slice(0, a) + "\n" + n + "\n" + e.slice(a) : e.slice(0, a) + n + "\n" + e.slice(a);
3113
3134
  }
3114
- function Ii(e, t) {
3135
+ function zi(e, t) {
3115
3136
  let n = 0;
3116
3137
  for (let r = t; r < e.length; r++) if (e[r] === "[") n++;
3117
3138
  else if (e[r] === "]" && (n--, n === 0)) return r;
3118
3139
  return -1;
3119
3140
  }
3120
- var Li = "import { type ComponentType } from \"react\";\n\nexport type NavbarAction = {\n id: string;\n component: ComponentType;\n};\n\nexport const navbarActions: NavbarAction[] = [];\n\nexport const userMenuActions: NavbarAction[] = [];\n";
3121
- async function Ri(e) {
3122
- await Bi({
3141
+ var Bi = "import { type ComponentType } from \"react\";\n\nexport type NavbarAction = {\n id: string;\n component: ComponentType;\n};\n\nexport const navbarActions: NavbarAction[] = [];\n\nexport const userMenuActions: NavbarAction[] = [];\n";
3142
+ async function Vi(e) {
3143
+ await Ui({
3123
3144
  ...e,
3124
3145
  arrayName: "navbarActions"
3125
3146
  });
3126
3147
  }
3127
- async function zi(e) {
3128
- await Bi({
3148
+ async function Hi(e) {
3149
+ await Ui({
3129
3150
  ...e,
3130
3151
  arrayName: "userMenuActions"
3131
3152
  });
3132
3153
  }
3133
- async function Bi({ actions: e, arrayName: t, paths: n, projectRoot: r, slot: i }) {
3134
- let a = Jr(i, n), o = T.resolve(r, a, "src/constants/navbar-actions.tsx"), s;
3135
- await Y(o) ? s = await y.readFile(o, "utf-8") : (await y.mkdir(T.dirname(o), { recursive: !0 }), s = Li);
3136
- for (let n of e) s = Vi(s, n), s = Hi(s, n, t);
3154
+ async function Ui({ actions: e, arrayName: t, paths: n, projectRoot: r, slot: i }) {
3155
+ let a = Zr(i, n), o = T.resolve(r, a, "src/constants/navbar-actions.tsx"), s;
3156
+ await Y(o) ? s = await y.readFile(o, "utf-8") : (await y.mkdir(T.dirname(o), { recursive: !0 }), s = Bi);
3157
+ for (let n of e) s = Wi(s, n), s = Gi(s, n, t);
3137
3158
  await y.writeFile(o, s, "utf-8");
3138
3159
  }
3139
- function Vi(e, t) {
3160
+ function Wi(e, t) {
3140
3161
  let n = `import { ${t.import} } from "${t.from}";`;
3141
3162
  if (e.includes(n)) return e;
3142
3163
  let r = e.lastIndexOf("import ");
@@ -3144,38 +3165,38 @@ function Vi(e, t) {
3144
3165
  let i = e.indexOf("\n", r);
3145
3166
  return i === -1 ? e + "\n" + n : e.slice(0, i + 1) + n + "\n" + e.slice(i + 1);
3146
3167
  }
3147
- function Hi(e, t, n) {
3168
+ function Gi(e, t, n) {
3148
3169
  let r = e.match(RegExp(`export const ${n}:\\s*NavbarAction\\[\\]\\s*=\\s*\\[`));
3149
3170
  if (!r) return e;
3150
- let i = e.indexOf(r[0]) + r[0].length, a = Ui(e, i - 1);
3171
+ let i = e.indexOf(r[0]) + r[0].length, a = Ki(e, i - 1);
3151
3172
  if (a === -1) return e;
3152
3173
  let o = e.slice(i, a);
3153
3174
  if (o.includes(`id: "${t.id}"`)) return e;
3154
3175
  let s = ` { id: "${t.id}", component: ${t.import} },`;
3155
3176
  return o.trim() === "" ? e.slice(0, a) + "\n" + s + "\n" + e.slice(a) : e.slice(0, a) + s + "\n" + e.slice(a);
3156
3177
  }
3157
- function Ui(e, t) {
3178
+ function Ki(e, t) {
3158
3179
  let n = 0;
3159
3180
  for (let r = t; r < e.length; r++) if (e[r] === "[") n++;
3160
3181
  else if (e[r] === "]" && (n--, n === 0)) return r;
3161
3182
  return -1;
3162
3183
  }
3163
- var Wi = new Set([
3184
+ var qi = new Set([
3164
3185
  ".ts",
3165
3186
  ".tsx",
3166
3187
  ".js",
3167
3188
  ".jsx"
3168
3189
  ]);
3169
- async function Gi(e) {
3190
+ async function Ji(e) {
3170
3191
  let { files: t, paths: n, projectRoot: r, projectName: i } = e;
3171
3192
  if (i === "hype-stack") return;
3172
3193
  let a = `@${i}/`;
3173
3194
  await Promise.all(t.map(async (e) => {
3174
- let t = Br(e.target, n, r), i = await y.stat(t).catch(() => null);
3175
- i?.isDirectory() ? await Ji(t, a) : i?.isFile() && Wi.has(T.extname(t)) && await Yi(t, a);
3195
+ let t = Ur(e.target, n, r), i = await y.stat(t).catch(() => null);
3196
+ i?.isDirectory() ? await Zi(t, a) : i?.isFile() && qi.has(T.extname(t)) && await Qi(t, a);
3176
3197
  }));
3177
3198
  }
3178
- var Ki = new Set([
3199
+ var Yi = new Set([
3179
3200
  ".git",
3180
3201
  "node_modules",
3181
3202
  "dist",
@@ -3184,43 +3205,43 @@ var Ki = new Set([
3184
3205
  ".next",
3185
3206
  "coverage"
3186
3207
  ]);
3187
- async function qi(e, t) {
3188
- t !== "hype-stack" && await Ji(e, `@${t}/`);
3208
+ async function Xi(e, t) {
3209
+ t !== "hype-stack" && await Zi(e, `@${t}/`);
3189
3210
  }
3190
- async function Ji(e, t) {
3211
+ async function Zi(e, t) {
3191
3212
  let n = await y.readdir(e, { withFileTypes: !0 });
3192
3213
  await Promise.all(n.map(async (n) => {
3193
3214
  let r = T.join(e, n.name);
3194
3215
  if (n.isDirectory()) {
3195
- if (Ki.has(n.name)) return;
3196
- await Ji(r, t);
3197
- } else n.isFile() && Wi.has(T.extname(n.name)) && await Yi(r, t);
3216
+ if (Yi.has(n.name)) return;
3217
+ await Zi(r, t);
3218
+ } else n.isFile() && qi.has(T.extname(n.name)) && await Qi(r, t);
3198
3219
  }));
3199
3220
  }
3200
- async function Yi(e, t) {
3221
+ async function Qi(e, t) {
3201
3222
  let n = await y.readFile(e, "utf-8");
3202
- if (!n.includes(Gr)) return;
3203
- let r = qr(n, t);
3223
+ if (!n.includes(Jr)) return;
3224
+ let r = Xr(n, t);
3204
3225
  r !== n && await y.writeFile(e, r, "utf-8");
3205
3226
  }
3206
3227
  //#endregion
3207
3228
  //#region src/core/installer.ts
3208
- function Xi(e, t) {
3229
+ function $i(e, t) {
3209
3230
  return e.slot ? t ? t.includes(e.slot) : e.slot === "frontend" : !0;
3210
3231
  }
3211
- async function Zi(e, t) {
3232
+ async function ea(e, t) {
3212
3233
  if ((await y.stat(e)).isDirectory()) {
3213
3234
  await y.mkdir(t, { recursive: !0 });
3214
3235
  let n = await y.readdir(e, { withFileTypes: !0 });
3215
- for (let r of n) await Zi(T.join(e, r.name), T.join(t, r.name));
3236
+ for (let r of n) await ea(T.join(e, r.name), T.join(t, r.name));
3216
3237
  } else await y.mkdir(T.dirname(t), { recursive: !0 }), await y.copyFile(e, t);
3217
3238
  }
3218
- async function Qi(e) {
3239
+ async function ta(e) {
3219
3240
  let { src: t, dest: n, projectRoot: r, skip: i } = e;
3220
3241
  if ((await y.stat(t)).isDirectory()) {
3221
3242
  await y.mkdir(n, { recursive: !0 });
3222
3243
  let e = await y.readdir(t, { withFileTypes: !0 });
3223
- return (await Promise.all(e.map((e) => Qi({
3244
+ return (await Promise.all(e.map((e) => ta({
3224
3245
  src: T.join(t, e.name),
3225
3246
  dest: T.join(n, e.name),
3226
3247
  projectRoot: r,
@@ -3229,8 +3250,8 @@ async function Qi(e) {
3229
3250
  }
3230
3251
  return i.has(t) ? [] : (await y.mkdir(T.dirname(n), { recursive: !0 }), await y.copyFile(t, n), [T.relative(r, n)]);
3231
3252
  }
3232
- async function $i(e) {
3233
- let { file: t, packDir: n, paths: r, projectRoot: i } = e, a = Vr(t.source, n), o = Br(t.target, r, i);
3253
+ async function na(e) {
3254
+ let { file: t, packDir: n, paths: r, projectRoot: i } = e, a = Wr(t.source, n), o = Ur(t.target, r, i);
3234
3255
  return {
3235
3256
  sourcePath: a,
3236
3257
  targetPath: o,
@@ -3238,8 +3259,8 @@ async function $i(e) {
3238
3259
  targetExists: await Y(o) || await lr(o)
3239
3260
  };
3240
3261
  }
3241
- async function ea(e) {
3242
- let { file: t, packDir: n, paths: r, projectRoot: i } = e, { sourcePath: a, targetPath: o, sourceExists: s, targetExists: c } = await $i({
3262
+ async function ra(e) {
3263
+ let { file: t, packDir: n, paths: r, projectRoot: i } = e, { sourcePath: a, targetPath: o, sourceExists: s, targetExists: c } = await na({
3243
3264
  file: t,
3244
3265
  packDir: n,
3245
3266
  paths: r,
@@ -3254,8 +3275,8 @@ async function ea(e) {
3254
3275
  default: return `${t.target}: Unknown strategy: ${String(t.strategy)}`;
3255
3276
  }
3256
3277
  }
3257
- async function ta(e) {
3258
- let { file: t, packDir: n, paths: r, projectRoot: i, force: a, overwrite: o } = e, { sourcePath: s, targetPath: c, sourceExists: l, targetExists: u } = await $i({
3278
+ async function ia(e) {
3279
+ let { file: t, packDir: n, paths: r, projectRoot: i, force: a, overwrite: o } = e, { sourcePath: s, targetPath: c, sourceExists: l, targetExists: u } = await na({
3259
3280
  file: t,
3260
3281
  packDir: n,
3261
3282
  paths: r,
@@ -3273,7 +3294,7 @@ async function ta(e) {
3273
3294
  status: "skipped",
3274
3295
  path: t.target,
3275
3296
  reason: "Already exists"
3276
- } : (await Zi(s, c), {
3297
+ } : (await ea(s, c), {
3277
3298
  status: "installed",
3278
3299
  path: t.target
3279
3300
  });
@@ -3282,16 +3303,16 @@ async function ta(e) {
3282
3303
  status: "skipped",
3283
3304
  path: t.target,
3284
3305
  reason: "Already exists (skip-if-exists)"
3285
- } : (await Zi(s, c), {
3306
+ } : (await ea(s, c), {
3286
3307
  status: "installed",
3287
3308
  path: t.target
3288
3309
  });
3289
- case "override": return await Zi(s, c), {
3310
+ case "override": return await ea(s, c), {
3290
3311
  status: "installed",
3291
3312
  path: t.target
3292
3313
  };
3293
3314
  case "merge": {
3294
- if (!u) return await Zi(s, c), {
3315
+ if (!u) return await ea(s, c), {
3295
3316
  status: "installed",
3296
3317
  path: t.target
3297
3318
  };
@@ -3321,15 +3342,15 @@ async function ta(e) {
3321
3342
  };
3322
3343
  }
3323
3344
  }
3324
- async function na(e) {
3345
+ async function aa(e) {
3325
3346
  let { packs: t, config: n, projectRoot: r, slotsByPack: i } = e, a = n.paths;
3326
3347
  if (!a) throw Error("stack.json is missing 'paths' configuration. Run 'npx @hype-stack/cli init' to set it up.");
3327
3348
  let o = [], s = /* @__PURE__ */ new Set();
3328
3349
  for (let e of t) {
3329
3350
  let t = i?.get(e.manifest.name);
3330
3351
  for (let n of e.manifest.files) {
3331
- if (n.strategy !== "create" || !Xi(n, t)) continue;
3332
- let { targetPath: i, targetExists: c } = await $i({
3352
+ if (n.strategy !== "create" || !$i(n, t)) continue;
3353
+ let { targetPath: i, targetExists: c } = await na({
3333
3354
  file: n,
3334
3355
  packDir: e.packDir,
3335
3356
  paths: a,
@@ -3344,13 +3365,13 @@ async function na(e) {
3344
3365
  }
3345
3366
  return o;
3346
3367
  }
3347
- async function ra(e) {
3368
+ async function oa(e) {
3348
3369
  let { manifest: t, config: n, projectRoot: r, force: i, packDir: a, slots: o } = e, s = n.paths;
3349
3370
  if (!s) throw Error("stack.json is missing 'paths' configuration. Run 'npx @hype-stack/cli init' to set it up.");
3350
3371
  let c = [];
3351
3372
  for (let e of t.files) {
3352
- if (!Xi(e, o)) continue;
3353
- let t = await ea({
3373
+ if (!$i(e, o)) continue;
3374
+ let t = await ra({
3354
3375
  file: e,
3355
3376
  packDir: a,
3356
3377
  paths: s,
@@ -3361,16 +3382,16 @@ async function ra(e) {
3361
3382
  }
3362
3383
  return c;
3363
3384
  }
3364
- async function ia(e) {
3385
+ async function sa(e) {
3365
3386
  let { manifest: t, config: n, projectRoot: r, force: i, overwrite: a, packDir: o, slots: s } = e, c = n.paths;
3366
3387
  if (!c) throw Error("stack.json is missing 'paths' configuration. Run 'npx @hype-stack/cli init' to set it up.");
3367
3388
  let l = {
3368
3389
  installed: [],
3369
3390
  skipped: [],
3370
3391
  errors: []
3371
- }, u = t.files.filter((e) => Xi(e, s));
3392
+ }, u = t.files.filter((e) => $i(e, s));
3372
3393
  for (let e of u) {
3373
- let t = await ta({
3394
+ let t = await ia({
3374
3395
  file: e,
3375
3396
  packDir: o,
3376
3397
  paths: c,
@@ -3390,40 +3411,40 @@ async function ia(e) {
3390
3411
  break;
3391
3412
  }
3392
3413
  }
3393
- await Gi({
3414
+ await Ji({
3394
3415
  files: u,
3395
3416
  paths: c,
3396
3417
  projectRoot: r,
3397
3418
  projectName: n.name
3398
- }), t.env && t.env.length > 0 && await Yr(t.env, c, r), t.routes && t.routes.length > 0 && await ti(t.routes, c, r), t.context && t.context.length > 0 && await ii(t.context, c, r), t.sockets && t.sockets.length > 0 && await fi(t.sockets, c, r), t.sdkConfigurations && t.sdkConfigurations.length > 0 && await gi(t.sdkConfigurations, c, r), t.enums && t.enums.length > 0 && await ui(t.enums, c, r), t.frontendRoutes && t.frontendRoutes.length > 0 && await yi(t.frontendRoutes, c, r);
3419
+ }), t.env && t.env.length > 0 && await Qr(t.env, c, r), t.routes && t.routes.length > 0 && await ii(t.routes, c, r), t.context && t.context.length > 0 && await si(t.context, c, r), t.sockets && t.sockets.length > 0 && await hi(t.sockets, c, r), t.sdkConfigurations && t.sdkConfigurations.length > 0 && await yi(t.sdkConfigurations, c, r), t.enums && t.enums.length > 0 && await pi(t.enums, c, r), t.frontendRoutes && t.frontendRoutes.length > 0 && await Si(t.frontendRoutes, c, r);
3399
3420
  let d = s && s.length > 0 ? s : ["frontend"];
3400
- for (let e of d) t.nav && t.nav.length > 0 && await wi({
3421
+ for (let e of d) t.nav && t.nav.length > 0 && await Di({
3401
3422
  entries: t.nav,
3402
3423
  paths: c,
3403
3424
  projectRoot: r,
3404
3425
  slot: e
3405
- }), t.navbarActions && t.navbarActions.length > 0 && await Ri({
3426
+ }), t.navbarActions && t.navbarActions.length > 0 && await Vi({
3406
3427
  actions: t.navbarActions,
3407
3428
  paths: c,
3408
3429
  projectRoot: r,
3409
3430
  slot: e
3410
- }), t.userMenuActions && t.userMenuActions.length > 0 && await zi({
3431
+ }), t.userMenuActions && t.userMenuActions.length > 0 && await Hi({
3411
3432
  actions: t.userMenuActions,
3412
3433
  paths: c,
3413
3434
  projectRoot: r,
3414
3435
  slot: e
3415
3436
  });
3416
- return t.onboardingSteps && t.onboardingSteps.length > 0 && await Ni(t.onboardingSteps, c, r), t.postLoginRedirect && await Ti({
3437
+ return t.onboardingSteps && t.onboardingSteps.length > 0 && await Ii(t.onboardingSteps, c, r), t.postLoginRedirect && await Oi({
3417
3438
  postLoginRedirect: t.postLoginRedirect,
3418
3439
  paths: c,
3419
3440
  projectRoot: r,
3420
3441
  slot: d[0]
3421
3442
  }), l;
3422
3443
  }
3423
- async function aa(e) {
3444
+ async function ca(e) {
3424
3445
  let { packs: t, config: n, projectRoot: r, force: i, overwrite: a, slotsByPack: o } = e, s = [];
3425
3446
  for (let e of t) {
3426
- let t = o?.get(e.manifest.name), a = await ra({
3447
+ let t = o?.get(e.manifest.name), a = await oa({
3427
3448
  manifest: e.manifest,
3428
3449
  config: n,
3429
3450
  projectRoot: r,
@@ -3443,7 +3464,7 @@ async function aa(e) {
3443
3464
  };
3444
3465
  let c = [], l = [], u = [], d = [], f = n;
3445
3466
  for (let e of t) {
3446
- let t = o?.get(e.manifest.name), n = await ia({
3467
+ let t = o?.get(e.manifest.name), n = await sa({
3447
3468
  manifest: e.manifest,
3448
3469
  config: f,
3449
3470
  projectRoot: r,
@@ -3452,7 +3473,7 @@ async function aa(e) {
3452
3473
  packDir: e.packDir,
3453
3474
  slots: t
3454
3475
  });
3455
- c.push(...n.installed), l.push(...n.skipped), u.push(...n.errors), f = await oa(f, e.manifest, r), d.push(e.manifest.name);
3476
+ c.push(...n.installed), l.push(...n.skipped), u.push(...n.errors), f = await la(f, e.manifest, r), d.push(e.manifest.name);
3456
3477
  }
3457
3478
  return {
3458
3479
  installed: c,
@@ -3463,8 +3484,8 @@ async function aa(e) {
3463
3484
  config: f
3464
3485
  };
3465
3486
  }
3466
- async function oa(e, t, n) {
3467
- let r = typeof t == "string" ? t : t.name, i = typeof t == "string" ? [] : Dr(t.env), a = Or([...e.onboarding?.envSections ?? [], ...i]), o = {
3487
+ async function la(e, t, n) {
3488
+ let r = typeof t == "string" ? t : t.name, i = typeof t == "string" ? [] : Ar(t.env), a = jr([...e.onboarding?.envSections ?? [], ...i]), o = {
3468
3489
  ...e,
3469
3490
  installedPacks: [...e.installedPacks ?? [], r],
3470
3491
  onboarding: {
@@ -3472,19 +3493,19 @@ async function oa(e, t, n) {
3472
3493
  envSections: a
3473
3494
  }
3474
3495
  };
3475
- return await Nr(n, o), o;
3496
+ return await Ir(n, o), o;
3476
3497
  }
3477
- async function sa(e) {
3498
+ async function ua(e) {
3478
3499
  let { manifest: t, config: n, projectRoot: r, templateDir: i } = e, a = n.paths;
3479
3500
  if (!a) throw Error("stack.json is missing 'paths' configuration. Run 'npx @hype-stack/cli init' to set it up.");
3480
- let o = [], s = [], c = t.files.filter((e) => e.strategy === "merge"), l = new Set(c.map((e) => Vr(e.source, i))), u = T.join(i, "files");
3501
+ let o = [], s = [], c = t.files.filter((e) => e.strategy === "merge"), l = new Set(c.map((e) => Wr(e.source, i))), u = T.join(i, "files");
3481
3502
  if (await lr(u)) {
3482
3503
  let e = await y.readdir(u, { withFileTypes: !0 });
3483
3504
  for (let t of e) {
3484
3505
  if (!t.isDirectory()) continue;
3485
3506
  let e = a[t.name]?.root;
3486
3507
  if (!e) continue;
3487
- let n = await Qi({
3508
+ let n = await ta({
3488
3509
  src: T.join(u, t.name),
3489
3510
  dest: T.resolve(r, e),
3490
3511
  projectRoot: r,
@@ -3494,7 +3515,7 @@ async function sa(e) {
3494
3515
  }
3495
3516
  }
3496
3517
  for (let e of c) {
3497
- let t = await ta({
3518
+ let t = await ia({
3498
3519
  file: e,
3499
3520
  packDir: i,
3500
3521
  paths: a,
@@ -3504,13 +3525,13 @@ async function sa(e) {
3504
3525
  });
3505
3526
  t.status === "installed" ? o.push(t.path) : t.status === "error" && s.push(`${t.path}: ${t.reason}`);
3506
3527
  }
3507
- let d = T.join(Br("{{frontend.root}}", a, r), "src", "routes"), f = T.join(d, "(public)", "index.tsx"), p = T.join(d, "(private)", "index.tsx");
3508
- return await Y(f) && await Y(p) && await y.rm(p, { force: !0 }), t.frontendRoutes && t.frontendRoutes.length > 0 && await yi(t.frontendRoutes, a, r), t.nav && t.nav.length > 0 && await wi({
3528
+ let d = T.join(Ur("{{frontend.root}}", a, r), "src", "routes"), f = T.join(d, "(public)", "index.tsx"), p = T.join(d, "(private)", "index.tsx");
3529
+ return await Y(f) && await Y(p) && await y.rm(p, { force: !0 }), t.frontendRoutes && t.frontendRoutes.length > 0 && await Si(t.frontendRoutes, a, r), t.nav && t.nav.length > 0 && await Di({
3509
3530
  entries: t.nav,
3510
3531
  paths: a,
3511
3532
  projectRoot: r,
3512
3533
  override: !0
3513
- }), t.postLoginRedirect && await Ti({
3534
+ }), t.postLoginRedirect && await Oi({
3514
3535
  postLoginRedirect: t.postLoginRedirect,
3515
3536
  paths: a,
3516
3537
  projectRoot: r
@@ -3521,32 +3542,32 @@ async function sa(e) {
3521
3542
  }
3522
3543
  //#endregion
3523
3544
  //#region src/core/pack-categories.ts
3524
- var ca = [
3545
+ var da = [
3525
3546
  "starter",
3526
3547
  "layout",
3527
3548
  "feature"
3528
- ], la = {
3549
+ ], fa = {
3529
3550
  starter: "Starter",
3530
3551
  layout: "Layout",
3531
3552
  feature: "Features"
3532
- }, ua = new Set(["starter", "layout"]), da = "starter-saas-betterauth", fa = "layout-basic";
3533
- function pa(e, t = {}) {
3553
+ }, pa = new Set(["starter", "layout"]), ma = "starter-saas-betterauth", ha = "layout-basic";
3554
+ function ga(e, t = {}) {
3534
3555
  let n = [];
3535
- for (let r of ca) {
3556
+ for (let r of da) {
3536
3557
  let i = e.filter((e) => e.category === r);
3537
3558
  if (i.length === 0) continue;
3538
- let a = ua.has(r) ? "single" : "multiple";
3559
+ let a = pa.has(r) ? "single" : "multiple";
3539
3560
  if (r === "layout") {
3540
- n.push(ha("frontend", i)), t.adminAvailable && n.push(ha("admin", i));
3561
+ n.push(va("frontend", i)), t.adminAvailable && n.push(va("admin", i));
3541
3562
  continue;
3542
3563
  }
3543
3564
  if (r === "starter") {
3544
- n.push(ma(i));
3565
+ n.push(_a(i));
3545
3566
  continue;
3546
3567
  }
3547
3568
  n.push({
3548
3569
  category: r,
3549
- label: la[r],
3570
+ label: fa[r],
3550
3571
  mode: a,
3551
3572
  packs: i,
3552
3573
  preselect: null
@@ -3554,36 +3575,36 @@ function pa(e, t = {}) {
3554
3575
  }
3555
3576
  return n;
3556
3577
  }
3557
- function ma(e) {
3558
- let t = e.some((e) => e.name === da);
3578
+ function _a(e) {
3579
+ let t = e.some((e) => e.name === ma);
3559
3580
  return {
3560
3581
  category: "starter",
3561
- label: la.starter,
3582
+ label: fa.starter,
3562
3583
  mode: "single",
3563
3584
  packs: e,
3564
- preselect: t ? da : null
3585
+ preselect: t ? ma : null
3565
3586
  };
3566
3587
  }
3567
- function ha(e, t) {
3568
- let n = t.some((e) => e.name === fa);
3588
+ function va(e, t) {
3589
+ let n = t.some((e) => e.name === ha);
3569
3590
  return {
3570
3591
  category: "layout",
3571
3592
  label: e === "admin" ? "Admin Layout" : "Layout",
3572
3593
  mode: "single",
3573
3594
  packs: t,
3574
- preselect: n ? fa : null,
3595
+ preselect: n ? ha : null,
3575
3596
  slot: e
3576
3597
  };
3577
3598
  }
3578
3599
  //#endregion
3579
3600
  //#region src/core/post-setup.ts
3580
- async function ga() {
3601
+ async function ya() {
3581
3602
  return (await J("docker", ["info"], { cwd: process.cwd() })).exitCode === 0;
3582
3603
  }
3583
- async function _a(e) {
3604
+ async function ba(e) {
3584
3605
  return Y(`${e}/apps/backend/.env`);
3585
3606
  }
3586
- async function va(e, t, n) {
3607
+ async function xa(e, t, n) {
3587
3608
  let r = n ? `Start services with ${L.command("docker compose up -d")}?` : `Docker is not running. Start services with ${L.command("docker compose up -d")}?`, i = t ? !0 : await s.confirm({
3588
3609
  message: r,
3589
3610
  initialValue: !0
@@ -3596,32 +3617,32 @@ async function va(e, t, n) {
3596
3617
  "up",
3597
3618
  "-d"
3598
3619
  ], { cwd: `${e}/apps/backend` });
3599
- return o.exitCode === 0 ? (a.stop(L.success("Docker services started")), !0) : (a.error("Failed to start Docker services"), Ca(o), !1);
3620
+ return o.exitCode === 0 ? (a.stop(L.success("Docker services started")), !0) : (a.error("Failed to start Docker services"), Ea(o), !1);
3600
3621
  }
3601
- function ya(e) {
3622
+ function Sa(e) {
3602
3623
  let t = (e.stderr || e.stdout).trim();
3603
3624
  t && s.log.warn(L.muted(t));
3604
3625
  }
3605
- function ba(e) {
3626
+ function Ca(e) {
3606
3627
  return /is already in use by container|Conflict\. The container name/i.test(e) ? "container" : /port is already allocated|address already in use|Bind for .+ failed|failed to (?:bind|set up) .*port/i.test(e) ? "port" : null;
3607
3628
  }
3608
- function xa(e) {
3629
+ function wa(e) {
3609
3630
  return e.match(/container name "\/?([^"]+)"/i)?.[1] ?? null;
3610
3631
  }
3611
- function Sa(e) {
3632
+ function Ta(e) {
3612
3633
  return e.match(/Bind for [^:]*:(\d{2,5})/i)?.[1] ?? e.match(/:(\d{2,5})(?:->|\b)[^\n]*(?:already allocated|already in use)/i)?.[1] ?? null;
3613
3634
  }
3614
- function Ca(e) {
3615
- let t = (e.stderr || e.stdout).trim(), n = ba(t);
3635
+ function Ea(e) {
3636
+ let t = (e.stderr || e.stdout).trim(), n = Ca(t);
3616
3637
  if (!n) {
3617
3638
  t && s.log.warn(L.muted(t));
3618
3639
  return;
3619
3640
  }
3620
3641
  if (n === "container") {
3621
- let e = xa(t);
3642
+ let e = wa(t);
3622
3643
  s.log.warn(L.muted(`${e ? `Container ${L.command(e)}` : "One of this project's containers"} is already running, most likely from another Hype Stack project. The template uses fixed container names, so two projects can't run their services at the same time.`));
3623
3644
  } else {
3624
- let e = Sa(t);
3645
+ let e = Ta(t);
3625
3646
  s.log.warn(L.muted(`${e ? `Host port ${L.command(e)}` : "A host port this project needs"} is already taken, most likely by another Hype Stack project. The template uses fixed ports, so two projects can't run their services at the same time.`));
3626
3647
  }
3627
3648
  z([
@@ -3630,7 +3651,7 @@ function Ca(e) {
3630
3651
  L.muted("then re-run this command and start Docker again")
3631
3652
  ].join("\n"), "Free up Docker, then retry"), t && s.log.warn(L.muted(t));
3632
3653
  }
3633
- async function wa(e, t = 15, n = 2e3) {
3654
+ async function Da(e, t = 15, n = 2e3) {
3634
3655
  for (let r = 0; r < t; r++) {
3635
3656
  if ((await J("docker", [
3636
3657
  "compose",
@@ -3645,8 +3666,8 @@ async function wa(e, t = 15, n = 2e3) {
3645
3666
  }
3646
3667
  return !1;
3647
3668
  }
3648
- var Ta = "Database schema is up to date";
3649
- async function Ea(e) {
3669
+ var Oa = "Database schema is up to date";
3670
+ async function ka(e) {
3650
3671
  let t = await J("pnpm", [
3651
3672
  "--filter",
3652
3673
  "@internal/backend",
@@ -3655,9 +3676,9 @@ async function Ea(e) {
3655
3676
  "migrate",
3656
3677
  "status"
3657
3678
  ], { cwd: e });
3658
- return t.exitCode === 0 ? `${t.stdout}\n${t.stderr}`.includes(Ta) : !1;
3679
+ return t.exitCode === 0 ? `${t.stdout}\n${t.stderr}`.includes(Oa) : !1;
3659
3680
  }
3660
- async function Da(e) {
3681
+ async function Aa(e) {
3661
3682
  let t = s.spinner();
3662
3683
  t.start("Running database migrations...");
3663
3684
  let n = await J("pnpm", [
@@ -3665,15 +3686,15 @@ async function Da(e) {
3665
3686
  "@internal/backend",
3666
3687
  "migration:latest"
3667
3688
  ], { cwd: e });
3668
- return n.exitCode === 0 ? (t.stop(L.success("Database migrations applied")), !0) : (t.error("Migrations failed"), ya(n), s.log.warn(L.muted("Run `pnpm --filter @internal/backend migration:latest` manually to apply migrations.")), !1);
3689
+ return n.exitCode === 0 ? (t.stop(L.success("Database migrations applied")), !0) : (t.error("Migrations failed"), Sa(n), s.log.warn(L.muted("Run `pnpm --filter @internal/backend migration:latest` manually to apply migrations.")), !1);
3669
3690
  }
3670
- async function Oa(e, t, n = {}) {
3671
- if (!await va(e, t, await ga())) return !1;
3691
+ async function ja(e, t, n = {}) {
3692
+ if (!await xa(e, t, await ya())) return !1;
3672
3693
  let r = s.spinner();
3673
- return r.start("Waiting for Postgres to be ready..."), await wa(e, n.postgresMaxAttempts ?? 15, n.postgresCheckIntervalMs ?? 2e3) ? (r.stop(L.success("Postgres is ready")), !0) : (r.error("Postgres health check timed out"), s.log.warn(L.muted("Run migrations manually once Postgres is ready: pnpm --filter @internal/backend migration:latest")), !1);
3694
+ return r.start("Waiting for Postgres to be ready..."), await Da(e, n.postgresMaxAttempts ?? 15, n.postgresCheckIntervalMs ?? 2e3) ? (r.stop(L.success("Postgres is ready")), !0) : (r.error("Postgres health check timed out"), s.log.warn(L.muted("Run migrations manually once Postgres is ready: pnpm --filter @internal/backend migration:latest")), !1);
3674
3695
  }
3675
- async function ka(e, t, n = {}) {
3676
- if (!await Oa(e, t, n)) return;
3696
+ async function Ma(e, t, n = {}) {
3697
+ if (!await ja(e, t, n)) return;
3677
3698
  let r = t ? !0 : await s.confirm({
3678
3699
  message: `Run database migrations with ${L.command("prisma migrate deploy")}?`,
3679
3700
  initialValue: !0
@@ -3682,21 +3703,21 @@ async function ka(e, t, n = {}) {
3682
3703
  s.log.info(L.muted("Skipping database migrations."));
3683
3704
  return;
3684
3705
  }
3685
- await Da(e);
3706
+ await Aa(e);
3686
3707
  }
3687
- async function Aa(e, t, n = {}) {
3688
- if (!await _a(e)) {
3708
+ async function Na(e, t, n = {}) {
3709
+ if (!await ba(e)) {
3689
3710
  s.log.warn(`${L.path(".env")} not found in ${L.path("apps/backend")}. Skipping Docker and migrations - configure it first.`);
3690
3711
  return;
3691
3712
  }
3692
- await ka(e, t, n);
3713
+ await Ma(e, t, n);
3693
3714
  }
3694
- async function ja(e, t, n = {}) {
3695
- return await _a(e) ? Oa(e, t, n) : (s.log.warn(`${L.path(".env")} not found in ${L.path("apps/backend")}. Skipping Docker - configure it first.`), !1);
3715
+ async function Pa(e, t, n = {}) {
3716
+ return await ba(e) ? ja(e, t, n) : (s.log.warn(`${L.path(".env")} not found in ${L.path("apps/backend")}. Skipping Docker - configure it first.`), !1);
3696
3717
  }
3697
3718
  //#endregion
3698
3719
  //#region src/core/resolve.ts
3699
- function Ma(e) {
3720
+ function Fa(e) {
3700
3721
  let t = /* @__PURE__ */ new Map();
3701
3722
  for (let n of e) t.set(n.name, {
3702
3723
  name: n.name,
@@ -3704,7 +3725,7 @@ function Ma(e) {
3704
3725
  });
3705
3726
  return t;
3706
3727
  }
3707
- function Na(e, t, n = /* @__PURE__ */ new Set()) {
3728
+ function Ia(e, t, n = /* @__PURE__ */ new Set()) {
3708
3729
  let r = /* @__PURE__ */ new Set();
3709
3730
  function i(e) {
3710
3731
  if (n.has(e)) return [];
@@ -3718,10 +3739,10 @@ function Na(e, t, n = /* @__PURE__ */ new Set()) {
3718
3739
  }
3719
3740
  return i(e);
3720
3741
  }
3721
- function Pa(e, t, n = []) {
3742
+ function La(e, t, n = []) {
3722
3743
  let r = new Set(n), i = new Set(n), a = [];
3723
3744
  for (let n of e) {
3724
- let e = Na(n, t, new Set(i));
3745
+ let e = Ia(n, t, new Set(i));
3725
3746
  for (let t of e) i.has(t) || (i.add(t), a.push(t));
3726
3747
  }
3727
3748
  return {
@@ -3729,7 +3750,7 @@ function Pa(e, t, n = []) {
3729
3750
  alreadyInstalled: e.filter((e) => r.has(e))
3730
3751
  };
3731
3752
  }
3732
- function Fa(e) {
3753
+ function Ra(e) {
3733
3754
  let { order: t, graph: n, isLocked: r, installed: i = [] } = e, a = new Set(i), o = /* @__PURE__ */ new Set();
3734
3755
  for (let e of t) {
3735
3756
  let t = n.get(e)?.dependencies.some((e) => !a.has(e) && o.has(e)) ?? !1;
@@ -3742,7 +3763,7 @@ function Fa(e) {
3742
3763
  }
3743
3764
  //#endregion
3744
3765
  //#region src/core/variants.ts
3745
- function Ia(e, t = {}) {
3766
+ function za(e, t = {}) {
3746
3767
  let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map();
3747
3768
  for (let i of e) {
3748
3769
  let e = t[i.family] ?? i.default;
@@ -3754,14 +3775,14 @@ function Ia(e, t = {}) {
3754
3775
  familyOf: r
3755
3776
  };
3756
3777
  }
3757
- function La(e, t, n) {
3778
+ function Ba(e, t, n) {
3758
3779
  return [...e.map((e) => n.chosen.get(e.family) ?? e.default), ...t];
3759
3780
  }
3760
- function Ra(e, t) {
3781
+ function Va(e, t) {
3761
3782
  let n = t.familyOf.get(e);
3762
3783
  return n ? t.chosen.get(n) ?? e : e;
3763
3784
  }
3764
- function za(e, t) {
3785
+ function Ha(e, t) {
3765
3786
  let n = /* @__PURE__ */ new Map();
3766
3787
  for (let t of e) t.family && n.set(t.name, t.family);
3767
3788
  let r = new Set(t), i = /* @__PURE__ */ new Map();
@@ -3777,65 +3798,65 @@ function za(e, t) {
3777
3798
  familyOf: n
3778
3799
  };
3779
3800
  }
3780
- function Ba(e, t) {
3801
+ function Ua(e, t) {
3781
3802
  return e.map((e) => ({
3782
3803
  ...e,
3783
- dependencies: e.dependencies.map((e) => Ra(e, t))
3804
+ dependencies: e.dependencies.map((e) => Va(e, t))
3784
3805
  }));
3785
3806
  }
3786
3807
  //#endregion
3787
3808
  //#region src/ui/banner.ts
3788
- var Va = [
3809
+ var Wa = [
3789
3810
  " ██╗ ██╗ ██╗ ██╗ ██████╗ ███████╗",
3790
3811
  " ██║ ██║ ╚██╗ ██╔╝ ██╔══██╗ ██╔════╝",
3791
3812
  " ███████║ ╚████╔╝ ██████╔╝ █████╗ ",
3792
3813
  " ██╔══██║ ╚██╔╝ ██╔═══╝ ██╔══╝ ",
3793
3814
  " ██║ ██║ ██║ ██║ ███████╗",
3794
3815
  " ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝"
3795
- ], Ha = [
3816
+ ], Ga = [
3796
3817
  " ███████╗ ████████╗ █████╗ ██████╗ ██╗ ██╗",
3797
3818
  " ██╔════╝ ╚══██╔══╝ ██╔══██╗ ██╔════╝ ██║ ██╔╝",
3798
3819
  " ███████╗ ██║ ███████║ ██║ █████╔╝ ",
3799
3820
  " ╚════██║ ██║ ██╔══██║ ██║ ██╔═██╗ ",
3800
3821
  " ███████║ ██║ ██║ ██║ ╚██████╗ ██║ ██╗",
3801
3822
  " ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝"
3802
- ], Ua = [
3823
+ ], Ka = [
3803
3824
  253,
3804
3825
  176,
3805
3826
  21
3806
- ], Wa = [
3827
+ ], qa = [
3807
3828
  245,
3808
3829
  76,
3809
3830
  2
3810
- ], Ga = 5, Ka = [
3831
+ ], Ja = 5, Ya = [
3811
3832
  17,
3812
3833
  103,
3813
3834
  248
3814
- ], qa = [
3835
+ ], Xa = [
3815
3836
  42,
3816
3837
  160,
3817
3838
  250
3818
- ], Ja = .2;
3819
- function Ya() {
3839
+ ], Za = .2;
3840
+ function Qa() {
3820
3841
  console.log();
3821
- for (let e of Se(Va, {
3822
- start: Ua,
3823
- end: Wa,
3824
- angle: Ga
3825
- })) console.log(b.bold(e));
3826
- for (let e of Se(Ha, {
3842
+ for (let e of Se(Wa, {
3827
3843
  start: Ka,
3828
3844
  end: qa,
3829
3845
  angle: Ja
3830
3846
  })) console.log(b.bold(e));
3847
+ for (let e of Se(Ga, {
3848
+ start: Ya,
3849
+ end: Xa,
3850
+ angle: Za
3851
+ })) console.log(b.bold(e));
3831
3852
  console.log(), console.log(` ${R.spark} ${b.dim("v" + A)} ${b.dim("·")} ${be("Ship web + desktop apps from one codebase")}`), console.log();
3832
3853
  }
3833
- function Xa() {
3854
+ function $a() {
3834
3855
  console.log(), console.log(` ${R.bolt} ${_e.orange("Hype")}${_e.skyBlue("Stack")} ${b.dim("v" + A)}`), console.log();
3835
3856
  }
3836
3857
  //#endregion
3837
3858
  //#region src/ui/pack-multiselect.ts
3838
- var Za = class extends O {
3859
+ var eo = class extends O {
3839
3860
  options;
3840
3861
  cursor = 0;
3841
3862
  selected;
@@ -3939,64 +3960,64 @@ var Za = class extends O {
3939
3960
  }
3940
3961
  }
3941
3962
  };
3942
- function Qa(e) {
3943
- return new Za(e).prompt();
3963
+ function to(e) {
3964
+ return new eo(e).prompt();
3944
3965
  }
3945
3966
  //#endregion
3946
3967
  //#region src/utils/naming.ts
3947
- function $a(e) {
3968
+ function no(e) {
3948
3969
  return e.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
3949
3970
  }
3950
- function eo(e) {
3971
+ function ro(e) {
3951
3972
  return e.split(/[-_]/).filter(Boolean).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(" ");
3952
3973
  }
3953
3974
  //#endregion
3954
3975
  //#region src/utils/validate.ts
3955
- function to(e) {
3976
+ function io(e) {
3956
3977
  if (!e.trim()) return "Project name cannot be empty";
3957
3978
  if (e.length > 214) return "Project name is too long (max 214 characters)";
3958
- let t = $a(e);
3979
+ let t = no(e);
3959
3980
  if (!ie.test(t)) return "Project name must contain at least one letter or number";
3960
3981
  }
3961
3982
  //#endregion
3962
3983
  //#region src/core/apply-mode.ts
3963
- var no = "src/hooks/use-theme.ts", ro = /(\bexport\s+const\s+defaultTheme\s*=\s*)(["'])(?:light|dark)\2/;
3964
- function io(e, t) {
3965
- return e.replace(ro, (e, n, r) => `${n}${r}${t}${r}`);
3984
+ var ao = "src/hooks/use-theme.ts", oo = /(\bexport\s+const\s+defaultTheme\s*=\s*)(["'])(?:light|dark)\2/;
3985
+ function so(e, t) {
3986
+ return e.replace(oo, (e, n, r) => `${n}${r}${t}${r}`);
3966
3987
  }
3967
- async function ao(e, t) {
3968
- let n = T.resolve(e, no), r;
3988
+ async function co(e, t) {
3989
+ let n = T.resolve(e, ao), r;
3969
3990
  try {
3970
3991
  r = await y.readFile(n, "utf-8");
3971
3992
  } catch {
3972
3993
  return !1;
3973
3994
  }
3974
- let i = io(r, t);
3995
+ let i = so(r, t);
3975
3996
  return i === r || await y.writeFile(n, i, "utf-8"), !0;
3976
3997
  }
3977
3998
  //#endregion
3978
3999
  //#region src/core/apply-radius.ts
3979
- var oo = /(^[ \t]*--radius(?![\w-])[ \t]*:[ \t]*)([^;\n]*);/gm;
3980
- function so(e) {
4000
+ var lo = /(^[ \t]*--radius(?![\w-])[ \t]*:[ \t]*)([^;\n]*);/gm;
4001
+ function uo(e) {
3981
4002
  return /^[0-9]*\.?[0-9]+(rem|em|px)$/.test(e.trim());
3982
4003
  }
3983
- function co(e, t) {
3984
- return e.replace(oo, (e, n) => `${n}${t};`);
4004
+ function fo(e, t) {
4005
+ return e.replace(lo, (e, n) => `${n}${t};`);
3985
4006
  }
3986
- var lo = "assets/styles.css";
3987
- async function uo(e, t) {
3988
- let n = T.resolve(e, lo), r;
4007
+ var po = "assets/styles.css";
4008
+ async function mo(e, t) {
4009
+ let n = T.resolve(e, po), r;
3989
4010
  try {
3990
4011
  r = await y.readFile(n, "utf-8");
3991
4012
  } catch {
3992
4013
  return !1;
3993
4014
  }
3994
- let i = co(r, t);
4015
+ let i = fo(r, t);
3995
4016
  return i === r || await y.writeFile(n, i, "utf-8"), !0;
3996
4017
  }
3997
4018
  //#endregion
3998
4019
  //#region src/core/apply-theme.ts
3999
- function fo(e, t) {
4020
+ function ho(e, t) {
4000
4021
  let n = 0;
4001
4022
  for (; n < e.length;) {
4002
4023
  let r = e.indexOf(t, n);
@@ -4019,46 +4040,46 @@ function fo(e, t) {
4019
4040
  }
4020
4041
  return null;
4021
4042
  }
4022
- function po(e, t) {
4043
+ function go(e, t) {
4023
4044
  let n = e;
4024
4045
  for (let [e, r] of Object.entries(t)) {
4025
- let t = RegExp(`(^[ \\t]*--${mo(e)}[ \\t]*:[ \\t]*)([^;\\n]*);`, "m");
4046
+ let t = RegExp(`(^[ \\t]*--${_o(e)}[ \\t]*:[ \\t]*)([^;\\n]*);`, "m");
4026
4047
  n = n.replace(t, (e, t) => `${t}${r};`);
4027
4048
  }
4028
4049
  return n;
4029
4050
  }
4030
- function mo(e) {
4051
+ function _o(e) {
4031
4052
  return e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
4032
4053
  }
4033
- function ho(e, t) {
4034
- let n = fo(e, ":root"), r = fo(e, ".dark"), i = e;
4054
+ function vo(e, t) {
4055
+ let n = ho(e, ":root"), r = ho(e, ".dark"), i = e;
4035
4056
  if (n) {
4036
4057
  let e = i.slice(0, n.bodyStart), r = i.slice(n.bodyStart, n.bodyEnd), a = i.slice(n.bodyEnd);
4037
- i = e + po(r, t.light) + a;
4058
+ i = e + go(r, t.light) + a;
4038
4059
  }
4039
4060
  if (r) {
4040
- let e = fo(i, ".dark");
4061
+ let e = ho(i, ".dark");
4041
4062
  if (e) {
4042
4063
  let n = i.slice(0, e.bodyStart), r = i.slice(e.bodyStart, e.bodyEnd), a = i.slice(e.bodyEnd);
4043
- i = n + po(r, t.dark) + a;
4064
+ i = n + go(r, t.dark) + a;
4044
4065
  }
4045
4066
  }
4046
4067
  return i;
4047
4068
  }
4048
- var go = "assets/styles.css";
4049
- async function _o(e, t) {
4050
- let n = T.resolve(e, go), r;
4069
+ var yo = "assets/styles.css";
4070
+ async function bo(e, t) {
4071
+ let n = T.resolve(e, yo), r;
4051
4072
  try {
4052
4073
  r = await y.readFile(n, "utf-8");
4053
4074
  } catch {
4054
4075
  return !1;
4055
4076
  }
4056
- let i = ho(r, t);
4077
+ let i = vo(r, t);
4057
4078
  return i === r || await y.writeFile(n, i, "utf-8"), !0;
4058
4079
  }
4059
4080
  //#endregion
4060
4081
  //#region src/core/clone.ts
4061
- async function vo(e) {
4082
+ async function xo(e) {
4062
4083
  let t = await ee(te, {
4063
4084
  dir: e,
4064
4085
  force: !0
@@ -4070,7 +4091,7 @@ async function vo(e) {
4070
4091
  }
4071
4092
  //#endregion
4072
4093
  //#region src/core/editor-config.ts
4073
- function yo(e) {
4094
+ function So(e) {
4074
4095
  let t = {
4075
4096
  globs: [],
4076
4097
  alwaysApply: !1
@@ -4105,10 +4126,10 @@ function yo(e) {
4105
4126
  content: i
4106
4127
  };
4107
4128
  }
4108
- function bo(e) {
4129
+ function Co(e) {
4109
4130
  return e.frontmatter.globs.length > 0 ? `---\npaths:\n${e.frontmatter.globs.map((e) => ` - "${e}"`).join("\n")}\n---\n\n${e.content}` : e.content;
4110
4131
  }
4111
- function xo(e) {
4132
+ function wo(e) {
4112
4133
  let t;
4113
4134
  t = e.frontmatter.alwaysApply ? "always_on" : e.frontmatter.globs.length > 0 ? "glob" : "model_decision";
4114
4135
  let n = [`trigger: ${t}`];
@@ -4118,30 +4139,30 @@ function xo(e) {
4118
4139
  }
4119
4140
  return e.frontmatter.description && n.push(`description: ${e.frontmatter.description}`), `---\n${n.join("\n")}\n---\n\n${e.content}`;
4120
4141
  }
4121
- function So(e) {
4142
+ function To(e) {
4122
4143
  return e.frontmatter.globs.length > 0 ? `---\napplyTo: "${e.frontmatter.globs.join(", ")}"\n---\n\n${e.content}` : e.content;
4123
4144
  }
4124
- var Co = {
4145
+ var Eo = {
4125
4146
  claude: {
4126
4147
  rulesDir: ".claude/rules",
4127
4148
  extension: ".md",
4128
- convert: bo
4149
+ convert: Co
4129
4150
  },
4130
4151
  windsurf: {
4131
4152
  rulesDir: ".windsurf/rules",
4132
4153
  extension: ".md",
4133
- convert: xo
4154
+ convert: wo
4134
4155
  },
4135
4156
  copilot: {
4136
4157
  rulesDir: ".github/instructions",
4137
4158
  extension: ".instructions.md",
4138
- convert: So
4159
+ convert: To
4139
4160
  }
4140
4161
  };
4141
- async function wo(e) {
4162
+ async function Do(e) {
4142
4163
  let t = T.join(e, oe), n = (await y.readdir(t, { withFileTypes: !0 }).catch(() => [])).filter((e) => e.isFile() && e.name.endsWith(".mdc"));
4143
4164
  return await Promise.all(n.map(async (e) => {
4144
- let n = T.join(t, e.name), { frontmatter: r, content: i } = yo(await y.readFile(n, "utf-8"));
4165
+ let n = T.join(t, e.name), { frontmatter: r, content: i } = So(await y.readFile(n, "utf-8"));
4145
4166
  return {
4146
4167
  frontmatter: r,
4147
4168
  content: i,
@@ -4149,9 +4170,9 @@ async function wo(e) {
4149
4170
  };
4150
4171
  }));
4151
4172
  }
4152
- async function To(e, t) {
4173
+ async function Oo(e, t) {
4153
4174
  if (t === "cursor") return;
4154
- let n = Co[t], r = await wo(e), i = T.join(e, n.rulesDir);
4175
+ let n = Eo[t], r = await Do(e), i = T.join(e, n.rulesDir);
4155
4176
  await y.mkdir(i, { recursive: !0 }), await Promise.all(r.map((e) => {
4156
4177
  let t = n.convert(e), r = e.filename.replace(/\.mdc$/, n.extension);
4157
4178
  return y.writeFile(T.join(i, r), t, "utf-8");
@@ -4159,21 +4180,21 @@ async function To(e, t) {
4159
4180
  }
4160
4181
  //#endregion
4161
4182
  //#region src/core/env-files.ts
4162
- var Eo = [
4183
+ var ko = [
4163
4184
  "apps",
4164
4185
  "packages",
4165
4186
  "libs",
4166
4187
  "shared"
4167
4188
  ];
4168
- async function Do(e) {
4169
- let t = await Oo(e);
4189
+ async function Ao(e) {
4190
+ let t = await jo(e);
4170
4191
  return (await Promise.all(t.map(async (t) => {
4171
4192
  let n = T.join(T.dirname(t), ".env");
4172
4193
  return await Y(n) ? null : (await y.copyFile(t, n), T.relative(e, n));
4173
4194
  }))).filter((e) => e !== null).sort();
4174
4195
  }
4175
- async function Oo(e) {
4176
- let t = [T.join(e, ".env.example")], n = await Promise.all(Eo.map(async (t) => {
4196
+ async function jo(e) {
4197
+ let t = [T.join(e, ".env.example")], n = await Promise.all(ko.map(async (t) => {
4177
4198
  let n = T.join(e, t);
4178
4199
  return (await y.readdir(n, { withFileTypes: !0 }).catch(() => [])).filter((e) => e.isDirectory()).map((e) => T.join(n, e.name, ".env.example"));
4179
4200
  }));
@@ -4181,11 +4202,11 @@ async function Oo(e) {
4181
4202
  }
4182
4203
  //#endregion
4183
4204
  //#region src/core/post-clone.ts
4184
- var Q = "@hype-stack/", ko = "hype-stack", Ao = "@hype-stack/cli";
4185
- async function jo(e) {
4205
+ var Q = "@hype-stack/", Mo = "hype-stack", No = "@hype-stack/cli";
4206
+ async function Po(e) {
4186
4207
  await mr(T.join(e, ".git"));
4187
4208
  }
4188
- async function Mo(e) {
4209
+ async function Fo(e) {
4189
4210
  await J("git", ["init"], { cwd: e }), await J("git", ["add", "."], { cwd: e }), await J("git", [
4190
4211
  "-c",
4191
4212
  "user.name=Hype Stack CLI",
@@ -4196,19 +4217,19 @@ async function Mo(e) {
4196
4217
  "Initial commit from Hype Stack CLI"
4197
4218
  ], { cwd: e });
4198
4219
  }
4199
- async function No(e, t) {
4200
- let n = `@${t}/`, r = await Vo(e);
4220
+ async function Io(e, t) {
4221
+ let n = `@${t}/`, r = await Wo(e);
4201
4222
  for (let e of r) {
4202
4223
  let t = await dr(e);
4203
4224
  if (!t) continue;
4204
4225
  let r = !1;
4205
- t.name?.startsWith(Q) && (t.name = t.name.replace(Q, n), r = !0), Ro(t.dependencies, n) && (r = !0), Ro(t.devDependencies, n) && (r = !0), t.nx && zo(t.nx, n) && (r = !0);
4206
- let i = await y.readFile(e, "utf-8"), a = qr(i, n);
4226
+ t.name?.startsWith(Q) && (t.name = t.name.replace(Q, n), r = !0), Vo(t.dependencies, n) && (r = !0), Vo(t.devDependencies, n) && (r = !0), t.nx && Ho(t.nx, n) && (r = !0);
4227
+ let i = await y.readFile(e, "utf-8"), a = Xr(i, n);
4207
4228
  a === i ? r && await fr(e, t) : await y.writeFile(e, a, "utf-8");
4208
4229
  }
4209
- await qi(e, t), await Io(e, t), await Bo(e, t);
4230
+ await Xi(e, t), await zo(e, t), await Uo(e, t);
4210
4231
  }
4211
- var Po = new Set([
4232
+ var Lo = new Set([
4212
4233
  ".git",
4213
4234
  "node_modules",
4214
4235
  "dist",
@@ -4216,34 +4237,34 @@ var Po = new Set([
4216
4237
  ".nx",
4217
4238
  ".next",
4218
4239
  "coverage"
4219
- ]), Fo = /^(docker-compose|compose)(\.[\w.-]+)?\.ya?ml$/;
4220
- async function Io(e, t) {
4221
- if (t === ko) return;
4222
- let n = await Lo(e);
4240
+ ]), Ro = /^(docker-compose|compose)(\.[\w.-]+)?\.ya?ml$/;
4241
+ async function zo(e, t) {
4242
+ if (t === Mo) return;
4243
+ let n = await Bo(e);
4223
4244
  await Promise.all(n.map(async (e) => {
4224
4245
  let n = await y.readFile(e, "utf-8").catch(() => null);
4225
- if (!n || !/^name:[ \t]*hype-stack/m.test(n)) return;
4226
- let r = n.replace(/^(name:[ \t]*)hype-stack/gm, `$1${t}`);
4246
+ if (!n || !/^[ \t]*(?:name|container_name):[ \t]*hype-stack/m.test(n)) return;
4247
+ let r = n.replace(/^(name:[ \t]*)hype-stack/gm, `$1${t}`).replace(/^([ \t]*container_name:[ \t]*)hype-stack/gm, `$1${t}`);
4227
4248
  await y.writeFile(e, r, "utf-8");
4228
4249
  }));
4229
4250
  }
4230
- async function Lo(e) {
4251
+ async function Bo(e) {
4231
4252
  let t = await y.readdir(e, { withFileTypes: !0 }).catch(() => []);
4232
4253
  return (await Promise.all(t.map(async (t) => {
4233
4254
  let n = T.join(e, t.name);
4234
- return t.isDirectory() ? Po.has(t.name) ? [] : Lo(n) : t.isFile() && Fo.test(t.name) ? [n] : [];
4255
+ return t.isDirectory() ? Lo.has(t.name) ? [] : Bo(n) : t.isFile() && Ro.test(t.name) ? [n] : [];
4235
4256
  }))).flat();
4236
4257
  }
4237
- function Ro(e, t) {
4258
+ function Vo(e, t) {
4238
4259
  if (!e) return !1;
4239
4260
  let n = !1;
4240
- for (let r of Object.keys(e)) if (r !== Ao && r.startsWith(Q)) {
4261
+ for (let r of Object.keys(e)) if (r !== No && r.startsWith(Q)) {
4241
4262
  let i = r.replace(Q, t);
4242
4263
  e[i] = e[r], delete e[r], n = !0;
4243
4264
  }
4244
4265
  return n;
4245
4266
  }
4246
- function zo(e, t) {
4267
+ function Ho(e, t) {
4247
4268
  if (!e) return !1;
4248
4269
  let n = !1;
4249
4270
  if (e.implicitDependencies &&= e.implicitDependencies.map((e) => e.startsWith(Q) ? (n = !0, e.replace(Q, t)) : e), e.targets) {
@@ -4251,13 +4272,13 @@ function zo(e, t) {
4251
4272
  }
4252
4273
  return n;
4253
4274
  }
4254
- async function Bo(e, t) {
4275
+ async function Uo(e, t) {
4255
4276
  let n = T.join(e, "packages/enums/src/app/index.ts"), r = await y.readFile(n, "utf-8").catch(() => null);
4256
4277
  if (!r) return;
4257
- let i = eo(t), a = r.replaceAll(`id: "${ko}"`, `id: "${t}"`).replaceAll(`name: "${ko}"`, `name: "${t}"`).replace(/name: "Hype Stack"/, `name: "${i}"`).replace(/description: ".*?"/, `description: "${i} application"`);
4278
+ let i = ro(t), a = r.replaceAll(`id: "${Mo}"`, `id: "${t}"`).replaceAll(`name: "${Mo}"`, `name: "${t}"`).replace(/name: "Hype Stack"/, `name: "${i}"`).replace(/description: ".*?"/, `description: "${i} application"`);
4258
4279
  await y.writeFile(n, a, "utf-8");
4259
4280
  }
4260
- async function Vo(e) {
4281
+ async function Wo(e) {
4261
4282
  let t = [], n = T.join(e, "package.json");
4262
4283
  (await y.stat(n).catch(() => null))?.isFile() && t.push(n);
4263
4284
  for (let n of [
@@ -4277,7 +4298,7 @@ async function Vo(e) {
4277
4298
  }
4278
4299
  //#endregion
4279
4300
  //#region src/core/readme.ts
4280
- var Ho = {
4301
+ var Go = {
4281
4302
  cursor: {
4282
4303
  label: "Cursor",
4283
4304
  rulesDir: ".cursor/rules"
@@ -4294,21 +4315,21 @@ var Ho = {
4294
4315
  label: "GitHub Copilot",
4295
4316
  rulesDir: ".github/instructions"
4296
4317
  }
4297
- }, Uo = {
4318
+ }, Ko = {
4298
4319
  backend: "Hono API server (Postgres, Prisma, Kysely, Valkey cache, WorkOS auth)",
4299
4320
  frontend: "React + Vite app talking to the backend through the typed HyperFetch SDK"
4300
- }, Wo = {
4321
+ }, qo = {
4301
4322
  enums: "Shared enums and app config used across apps",
4302
4323
  cli: "Project tooling and code generators"
4303
4324
  };
4304
- function Go(e, t) {
4325
+ function Jo(e, t) {
4305
4326
  return Object.entries(e).toSorted(([e], [t]) => e.localeCompare(t)).map(([e, n]) => {
4306
4327
  let r = t[e];
4307
4328
  return r ? `- \`${n}\` - ${r}` : `- \`${n}\``;
4308
4329
  });
4309
4330
  }
4310
- function Ko(e) {
4311
- let { projectName: t, editor: n, workspace: r } = e, i = eo(t), a = Ho[n], o = !!r.apps.backend, s = Go(r.apps, Uo), c = Go(r.packages, Wo), l = [];
4331
+ function Yo(e) {
4332
+ let { projectName: t, editor: n, workspace: r } = e, i = ro(t), a = Go[n], o = !!r.apps.backend, s = Jo(r.apps, Ko), c = Jo(r.packages, qo), l = [];
4312
4333
  s.length > 0 && l.push(...s), c.length > 0 && l.push(...c), l.push("- `stack.json` - Hype Stack workspace config (apps, paths, installed packs)");
4313
4334
  let u = [];
4314
4335
  u.push(`# ${i}`), u.push([
@@ -4411,13 +4432,13 @@ function Ko(e) {
4411
4432
  "stays useful."
4412
4433
  ].join("\n")), u.join("\n\n") + "\n";
4413
4434
  }
4414
- async function qo(e, t) {
4435
+ async function Xo(e, t) {
4415
4436
  let n = T.join(e, "README.md");
4416
- await y.writeFile(n, Ko(t), "utf-8");
4437
+ await y.writeFile(n, Yo(t), "utf-8");
4417
4438
  }
4418
4439
  //#endregion
4419
4440
  //#region src/core/tracking.ts
4420
- async function Jo(e) {
4441
+ async function Zo(e) {
4421
4442
  try {
4422
4443
  let t = {
4423
4444
  "X-Device-Id": er(),
@@ -4431,7 +4452,7 @@ async function Jo(e) {
4431
4452
  }
4432
4453
  //#endregion
4433
4454
  //#region src/core/npm-deps.ts
4434
- function Yo(e, t) {
4455
+ function Qo(e, t) {
4435
4456
  let n = [], r = [];
4436
4457
  if (!e) return {
4437
4458
  errors: n,
@@ -4462,7 +4483,7 @@ function Yo(e, t) {
4462
4483
  operations: r
4463
4484
  };
4464
4485
  }
4465
- function Xo(e) {
4486
+ function $o(e) {
4466
4487
  let t = {};
4467
4488
  for (let n of e) if (n) for (let [e, r] of Object.entries(n)) t[e] = {
4468
4489
  ...t[e],
@@ -4470,7 +4491,7 @@ function Xo(e) {
4470
4491
  };
4471
4492
  return t;
4472
4493
  }
4473
- async function Zo(e, t, n = J) {
4494
+ async function es(e, t, n = J) {
4474
4495
  let r = [];
4475
4496
  for (let i of e) {
4476
4497
  let e = T.join(t, i.relativeDir);
@@ -4506,14 +4527,14 @@ async function Zo(e, t, n = J) {
4506
4527
  function $(e) {
4507
4528
  return e instanceof Error ? e.message : String(e);
4508
4529
  }
4509
- async function Qo(e, t, n) {
4530
+ async function ts(e, t, n) {
4510
4531
  let r = e.filter((e) => e.tier === "paid" && !t.has(e.name)).map((e) => e.name);
4511
- return r.length === 0 ? {} : Wr(r, n).catch(() => ({}));
4532
+ return r.length === 0 ? {} : qr(r, n).catch(() => ({}));
4512
4533
  }
4513
- function $o(e, t) {
4534
+ function ns(e, t) {
4514
4535
  return e === "free" ? L.success("free") : e === "owned" ? L.accent("owned") : `${L.highlight(`$${t}`)} ${L.muted("locked")}`;
4515
4536
  }
4516
- async function es(e, t, n) {
4537
+ async function rs(e, t, n) {
4517
4538
  let r = e.filter((e) => t(e)), i = e.filter((e) => !t(e));
4518
4539
  i.length > 0 && s.log.warning(`Skipping ${i.join(", ")} because ${i.length === 1 ? "it depends" : "they depend"} on a pack you don't own yet.`), await sr(r.map((e) => n.get(e)).filter((e) => e !== void 0).map((e) => ({
4519
4540
  name: e.name,
@@ -4521,7 +4542,7 @@ async function es(e, t, n) {
4521
4542
  price: e.price
4522
4543
  })));
4523
4544
  }
4524
- function ts(e, t) {
4545
+ function is(e, t) {
4525
4546
  z([
4526
4547
  "These packs will be installed, in order:",
4527
4548
  "",
@@ -4531,10 +4552,10 @@ function ts(e, t) {
4531
4552
  })
4532
4553
  ].join("\n"), "Install Plan");
4533
4554
  }
4534
- async function ns(e, t) {
4555
+ async function as(e, t) {
4535
4556
  let n = [];
4536
4557
  for (let r of e) {
4537
- let e = await Rr(r), i = await zr(r, t);
4558
+ let e = await Vr(r), i = await Hr(r, t);
4538
4559
  if (i.status === "denied") throw Error(`Access to "${r}" was denied (${i.reason}). Try 'npx @hype-stack/cli login' or check your license.`);
4539
4560
  n.push({
4540
4561
  manifest: e,
@@ -4543,18 +4564,18 @@ async function ns(e, t) {
4543
4564
  }
4544
4565
  return n;
4545
4566
  }
4546
- async function rs(e) {
4547
- let { prepared: t, paths: n, cwd: r, spinner: i } = e, a = Yo(Xo(t.map((e) => e.manifest.dependencies_npm)), n);
4567
+ async function os(e) {
4568
+ let { prepared: t, paths: n, cwd: r, spinner: i } = e, a = Qo($o(t.map((e) => e.manifest.dependencies_npm)), n);
4548
4569
  if (a.errors.length > 0) {
4549
4570
  for (let e of a.errors) s.log.error(e);
4550
4571
  return;
4551
4572
  }
4552
4573
  if (a.operations.length === 0) return;
4553
4574
  i.start("Installing npm dependencies...");
4554
- let o = await Zo(a.operations, r);
4575
+ let o = await es(a.operations, r);
4555
4576
  if (i.stop(o.ok ? "npm dependencies installed" : "npm dependency installation failed"), !o.ok) for (let e of o.errors) s.log.error(e);
4556
4577
  }
4557
- function is() {
4578
+ function ss() {
4558
4579
  Te([{
4559
4580
  command: "npx @hype-stack/cli onboard",
4560
4581
  hint: "(set up env vars + run migrations)"
@@ -4563,7 +4584,7 @@ function is() {
4563
4584
  hint: "(start frontend + backend)"
4564
4585
  }]);
4565
4586
  }
4566
- function as(e) {
4587
+ function cs(e) {
4567
4588
  if (e.length === 0) return;
4568
4589
  let t = e.map((e) => {
4569
4590
  let t = e.replace(/^\{\{[^}]+\}\}\//, "");
@@ -4571,10 +4592,10 @@ function as(e) {
4571
4592
  });
4572
4593
  s.note(t.join("\n"), "Skipped (already exist)");
4573
4594
  }
4574
- async function os(e) {
4595
+ async function ls(e) {
4575
4596
  let { prepared: t, config: n, cwd: r, force: i, yes: a, slotsByPack: o } = e, c = /* @__PURE__ */ new Set();
4576
4597
  if (i) return c;
4577
- let l = await na({
4598
+ let l = await aa({
4578
4599
  packs: t,
4579
4600
  config: n,
4580
4601
  projectRoot: r,
@@ -4601,7 +4622,7 @@ async function os(e) {
4601
4622
  }
4602
4623
  //#endregion
4603
4624
  //#region src/ui/swatch.ts
4604
- function ss(e) {
4625
+ function us(e) {
4605
4626
  let t = e.trim().match(/^oklch\(([^)]+)\)$/i);
4606
4627
  if (!t) return null;
4607
4628
  let n = t[1].trim().split(/\s+/);
@@ -4620,56 +4641,56 @@ function ss(e) {
4620
4641
  h: a
4621
4642
  };
4622
4643
  }
4623
- function cs(e) {
4644
+ function ds(e) {
4624
4645
  return Math.min(255, Math.max(0, Math.round(e)));
4625
4646
  }
4626
- function ls(e) {
4647
+ function fs(e) {
4627
4648
  return e <= .0031308 ? 12.92 * e : 1.055 * e ** (1 / 2.4) - .055;
4628
4649
  }
4629
- function us({ l: e, c: t, h: n }) {
4650
+ function ps({ l: e, c: t, h: n }) {
4630
4651
  let r = n * Math.PI / 180, i = t * Math.cos(r), a = t * Math.sin(r), o = e + .3963377774 * i + .2158037573 * a, s = e - .1055613458 * i - .0638541728 * a, c = e - .0894841775 * i - 1.291485548 * a, l = o ** 3, u = s ** 3, d = c ** 3, f = 4.0767416621 * l - 3.3077115913 * u + .2309699292 * d, p = -1.2684380042 * l + 2.6097570613 * u - .3413193965 * d, m = -.0041960863 * l - .7034186147 * u + 1.7076146937 * d;
4631
4652
  return [
4632
- cs(ls(f) * 255),
4633
- cs(ls(p) * 255),
4634
- cs(ls(m) * 255)
4653
+ ds(fs(f) * 255),
4654
+ ds(fs(p) * 255),
4655
+ ds(fs(m) * 255)
4635
4656
  ];
4636
4657
  }
4637
- var ds = "\x1B[49m";
4638
- function fs(e, t) {
4658
+ var ms = "\x1B[49m";
4659
+ function hs(e, t) {
4639
4660
  let n = e[t];
4640
4661
  if (!n) return b.dim(" ");
4641
- let r = ss(n);
4662
+ let r = us(n);
4642
4663
  if (!r) return b.dim(" ");
4643
- let [i, a, o] = us(r);
4644
- return `\x1b[48;2;${i};${a};${o}m ${ds}`;
4664
+ let [i, a, o] = ps(r);
4665
+ return `\x1b[48;2;${i};${a};${o}m ${ms}`;
4645
4666
  }
4646
- var ps = [
4667
+ var gs = [
4647
4668
  "primary",
4648
4669
  "secondary",
4649
4670
  "accent"
4650
4671
  ];
4651
- function ms(e) {
4652
- return ps.map((t) => fs(e, t)).join("");
4672
+ function _s(e) {
4673
+ return gs.map((t) => hs(e, t)).join("");
4653
4674
  }
4654
- function hs(e) {
4655
- return `${ms(e.light)} ${b.dim("·")} ${ms(e.dark)}`;
4675
+ function vs(e) {
4676
+ return `${_s(e.light)} ${b.dim("·")} ${_s(e.dark)}`;
4656
4677
  }
4657
4678
  //#endregion
4658
4679
  //#region src/commands/create.ts
4659
- async function gs(e) {
4660
- e.skipBanner || Ya(), s.intro(L.brandBold("Create a new Hype Stack project"));
4680
+ async function ys(e) {
4681
+ e.skipBanner || Qa(), s.intro(L.brandBold("Create a new Hype Stack project"));
4661
4682
  let o = e.yes === !0, c, l;
4662
4683
  if (o && e.name) {
4663
- let t = to(e.name);
4664
- t && (s.log.error(t), B()), l = e.name, c = $a(e.name);
4684
+ let t = io(e.name);
4685
+ t && (s.log.error(t), B()), l = e.name, c = no(e.name);
4665
4686
  } else {
4666
4687
  let t = await s.text({
4667
4688
  message: "What is your project named?",
4668
4689
  placeholder: "my-app",
4669
4690
  initialValue: e.name ?? "",
4670
- validate: (e) => to(e ?? "")
4691
+ validate: (e) => io(e ?? "")
4671
4692
  });
4672
- s.isCancel(t) && B(), l = t, c = $a(l);
4693
+ s.isCancel(t) && B(), l = t, c = no(l);
4673
4694
  }
4674
4695
  l.trim() !== c && s.log.info(L.muted(`Using "${L.highlight(c)}" as the project name`));
4675
4696
  let u;
@@ -4713,7 +4734,7 @@ async function gs(e) {
4713
4734
  message: "Pick a color theme",
4714
4735
  options: r.map((e) => ({
4715
4736
  value: e.name,
4716
- label: `${hs(e)} ${e.label}`
4737
+ label: `${vs(e)} ${e.label}`
4717
4738
  })),
4718
4739
  initialValue: h
4719
4740
  });
@@ -4731,24 +4752,24 @@ async function gs(e) {
4731
4752
  (s.isCancel(e) || !e) && B();
4732
4753
  }
4733
4754
  let _ = s.spinner();
4734
- _.start("Cloning Hype Stack template..."), await vo(d), _.stop(L.success("Template cloned"));
4755
+ _.start("Cloning Hype Stack template..."), await xo(d), _.stop(L.success("Template cloned"));
4735
4756
  let v = s.spinner();
4736
- v.start("Setting up project..."), await jo(d), await No(d, c), await To(d, p);
4737
- let y = await Pr(d), b = Ir(c, y);
4738
- await Nr(d, b), await qo(d, {
4757
+ v.start("Setting up project..."), await Po(d), await Io(d, c), await Oo(d, p);
4758
+ let y = await Lr(d), b = zr(c, y);
4759
+ await Ir(d, b), await Xo(d, {
4739
4760
  projectName: c,
4740
4761
  editor: p,
4741
4762
  workspace: y
4742
4763
  });
4743
4764
  let x = T.resolve(d, b.paths?.frontend.root ?? "apps/frontend");
4744
- a(g) && (await _o(x, i(g)) || s.log.warn(L.muted(`Could not find ${L.path("assets/styles.css")} to apply the ${g} theme`))), e.radius !== void 0 && so(e.radius) && (await uo(x, e.radius) || s.log.warn(L.muted(`Could not find ${L.path("assets/styles.css")} to set the corner radius`))), await ao(x, e.defaultMode === "dark" || e.defaultMode === "light" ? e.defaultMode : "light") || s.log.warn(L.muted(`Could not find ${L.path("src/hooks/use-theme.ts")} to set the default color mode`)), v.stop(L.success("Project configured"));
4765
+ a(g) && (await bo(x, i(g)) || s.log.warn(L.muted(`Could not find ${L.path("assets/styles.css")} to apply the ${g} theme`))), e.radius !== void 0 && uo(e.radius) && (await mo(x, e.radius) || s.log.warn(L.muted(`Could not find ${L.path("assets/styles.css")} to set the corner radius`))), await co(x, e.defaultMode === "dark" || e.defaultMode === "light" ? e.defaultMode : "light") || s.log.warn(L.muted(`Could not find ${L.path("src/hooks/use-theme.ts")} to set the default color mode`)), v.stop(L.success("Project configured"));
4745
4766
  let S = s.spinner();
4746
4767
  S.start("Installing dependencies..."), (await J("pnpm", ["install"], { cwd: d })).exitCode === 0 ? S.stop(L.success("Dependencies installed")) : (S.stop(L.warning("Dependencies installed with warnings")), s.log.warn(L.muted("You may need to run `pnpm install` manually to resolve issues.")));
4747
4768
  let C = s.spinner();
4748
- C.start("Initializing git repository..."), await Mo(d), C.stop(L.success("Git repository initialized with clean history"));
4769
+ C.start("Initializing git repository..."), await Fo(d), C.stop(L.success("Git repository initialized with clean history"));
4749
4770
  let w = s.spinner();
4750
4771
  w.start("Creating .env files from examples...");
4751
- let E = await Do(d);
4772
+ let E = await Ao(d);
4752
4773
  if (E.length > 0) {
4753
4774
  let e = E.length;
4754
4775
  w.stop(L.success(`Created ${e} .env file${e === 1 ? "" : "s"} from examples`));
@@ -4763,20 +4784,20 @@ async function gs(e) {
4763
4784
  message: "Would you like to start Docker services and run database migrations now?",
4764
4785
  initialValue: !0
4765
4786
  }));
4766
- s.isCancel(e) && B(), e ? await Aa(d, o) : s.log.info(L.muted("Docker and migrations can run later via `npx @hype-stack/cli onboard`.")), is();
4787
+ s.isCancel(e) && B(), e ? await Na(d, o) : s.log.info(L.muted("Docker and migrations can run later via `npx @hype-stack/cli onboard`.")), ss();
4767
4788
  }
4768
- return await Jo("project_create"), s.outro(L.muted("Happy building!")), d;
4789
+ return await Zo("project_create"), s.outro(L.muted("Happy building!")), d;
4769
4790
  }
4770
4791
  //#endregion
4771
4792
  //#region src/commands/init.ts
4772
- async function _s(e) {
4793
+ async function bs(e) {
4773
4794
  let t = e.cwd ?? process.cwd(), n = e.silent ?? !1;
4774
- if (n || (Xa(), s.intro(L.brandBold("Initialize Hype Stack configuration"))), !await Lr(t)) {
4795
+ if (n || ($a(), s.intro(L.brandBold("Initialize Hype Stack configuration"))), !await Br(t)) {
4775
4796
  s.log.error(`This doesn't look like a Hype Stack project. ${L.muted("Expected apps/ directory and package.json")}`), s.outro(L.muted(`Run ${L.command("npx @hype-stack/cli create")} to scaffold a new project.`));
4776
4797
  return;
4777
4798
  }
4778
- if (await Mr(t)) {
4779
- let e = await jr(t);
4799
+ if (await Fr(t)) {
4800
+ let e = await Pr(t);
4780
4801
  if (e && !n) {
4781
4802
  s.log.info(`Found existing ${L.path("stack.json")} for project ${L.highlight(e.name)}`);
4782
4803
  let t = await s.confirm({
@@ -4789,7 +4810,7 @@ async function _s(e) {
4789
4810
  }
4790
4811
  }
4791
4812
  }
4792
- let r = await Pr(t);
4813
+ let r = await Lr(t);
4793
4814
  if (!n) {
4794
4815
  let e = Object.entries(r.apps), t = Object.entries(r.packages);
4795
4816
  if (e.length > 0) {
@@ -4808,21 +4829,21 @@ async function _s(e) {
4808
4829
  message: "Project name for stack.json?",
4809
4830
  placeholder: i,
4810
4831
  initialValue: i,
4811
- validate: (e) => to(e ?? "")
4832
+ validate: (e) => io(e ?? "")
4812
4833
  });
4813
- s.isCancel(e) && B(), a = $a(e);
4834
+ s.isCancel(e) && B(), a = no(e);
4814
4835
  }
4815
- await Nr(t, Ir(a, r)), n || (s.log.success(`${L.path("stack.json")} written successfully`), s.outro(L.muted("Your project is mapped and ready for Hype Stack CLI commands.")));
4836
+ await Ir(t, zr(a, r)), n || (s.log.success(`${L.path("stack.json")} written successfully`), s.outro(L.muted("Your project is mapped and ready for Hype Stack CLI commands.")));
4816
4837
  }
4817
- async function vs(e, t = {}, n) {
4818
- if (await Mr(e)) return {
4838
+ async function xs(e, t = {}, n) {
4839
+ if (await Fr(e)) return {
4819
4840
  projectRoot: e,
4820
4841
  scaffolded: !1
4821
4842
  };
4822
- let r = t.runInit ?? ((e) => _s({
4843
+ let r = t.runInit ?? ((e) => bs({
4823
4844
  cwd: e,
4824
4845
  silent: !0
4825
- })), i = t.runCreate ?? ((e, t) => gs({
4846
+ })), i = t.runCreate ?? ((e, t) => ys({
4826
4847
  parentDirectory: e,
4827
4848
  deferSetup: !0,
4828
4849
  skipBanner: !0,
@@ -4830,7 +4851,7 @@ async function vs(e, t = {}, n) {
4830
4851
  defaultMode: t?.defaultMode,
4831
4852
  radius: t?.radius
4832
4853
  }));
4833
- if (await Lr(e)) {
4854
+ if (await Br(e)) {
4834
4855
  s.log.warn(`No ${L.path("stack.json")} found in ${L.path(e)}.`);
4835
4856
  let t = await s.confirm({
4836
4857
  message: `Create ${L.path("stack.json")} now?`,
@@ -4838,7 +4859,7 @@ async function vs(e, t = {}, n) {
4838
4859
  });
4839
4860
  if (s.isCancel(t) || !t) return null;
4840
4861
  await r(e);
4841
- let n = await Mr(e);
4862
+ let n = await Fr(e);
4842
4863
  return n && s.log.success(`${L.path("stack.json")} created`), n ? {
4843
4864
  projectRoot: e,
4844
4865
  scaffolded: !1
@@ -4856,19 +4877,19 @@ async function vs(e, t = {}, n) {
4856
4877
  });
4857
4878
  if (s.isCancel(o) || !o) return null;
4858
4879
  let c = await i(e, n);
4859
- return await Mr(c) ? {
4880
+ return await Fr(c) ? {
4860
4881
  projectRoot: c,
4861
4882
  scaffolded: !0
4862
4883
  } : null;
4863
4884
  }
4864
4885
  //#endregion
4865
4886
  //#region src/commands/compose.ts
4866
- async function ys(e = {}) {
4887
+ async function Ss(e = {}) {
4867
4888
  let t = e.cwd ?? process.cwd();
4868
- Ya();
4869
- let n = await vs(t), r = n?.projectRoot ?? null, i = n?.scaffolded ?? !1, a;
4889
+ Qa();
4890
+ let n = await xs(t), r = n?.projectRoot ?? null, i = n?.scaffolded ?? !1, a;
4870
4891
  try {
4871
- a = await jr(r ?? t);
4892
+ a = await Pr(r ?? t);
4872
4893
  } catch (e) {
4873
4894
  s.cancel(`Could not parse ${L.path("stack.json")}: ${$(e)} Run 'npx @hype-stack/cli init' to regenerate it.`), process.exit(1);
4874
4895
  }
@@ -4879,18 +4900,18 @@ async function ys(e = {}) {
4879
4900
  c.start("Loading packs...");
4880
4901
  let l;
4881
4902
  try {
4882
- l = await Ur();
4903
+ l = await Kr();
4883
4904
  } catch (e) {
4884
4905
  c.stop("Failed to load packs"), s.cancel(`Could not reach Hype Stack. Check your connection and try again.\n${$(e)}`), process.exit(1);
4885
4906
  }
4886
4907
  c.stop("Packs loaded");
4887
- let u = a.installedPacks ?? [], d = new Set(u), f = new Map(l.map((e) => [e.name, e])), p = e.licenseKey ?? a.licenseKey ?? null, m = (await Xn(F()))?.token ?? null, h = await Qo(l, d, {
4908
+ let u = a.installedPacks ?? [], d = new Set(u), f = new Map(l.map((e) => [e.name, e])), p = e.licenseKey ?? a.licenseKey ?? null, m = (await Xn(F()))?.token ?? null, h = await ts(l, d, {
4888
4909
  token: m,
4889
4910
  key: p
4890
4911
  }), g = (e) => {
4891
4912
  let t = f.get(e);
4892
4913
  return !t || t.tier === "free" ? "free" : h[e]?.owned ? "owned" : "locked";
4893
- }, _ = (e) => !d.has(e) && g(e) === "locked", v = await bs({
4914
+ }, _ = (e) => !d.has(e) && g(e) === "locked", v = await Cs({
4894
4915
  packs: l,
4895
4916
  installedSet: d,
4896
4917
  stateOf: g,
@@ -4901,9 +4922,9 @@ async function ys(e = {}) {
4901
4922
  s.outro(L.muted("No packs selected. Nothing to do."));
4902
4923
  return;
4903
4924
  }
4904
- let b = Cs(v), x = ws(v), S = za(l, b), C = Ma(Ba(l, S)), w;
4925
+ let b = Es(v), x = Ds(v), S = Ha(l, b), C = Fa(Ua(l, S)), w;
4905
4926
  try {
4906
- w = Pa(b, C, u);
4927
+ w = La(b, C, u);
4907
4928
  } catch (e) {
4908
4929
  s.cancel($(e)), process.exit(1);
4909
4930
  }
@@ -4911,7 +4932,7 @@ async function ys(e = {}) {
4911
4932
  z(`${w.alreadyInstalled.join(", ")} already installed.`, "Nothing to do"), s.outro(L.muted("Your selection is already part of the project."));
4912
4933
  return;
4913
4934
  }
4914
- let T = Fa({
4935
+ let T = Ra({
4915
4936
  order: w.order,
4916
4937
  graph: C,
4917
4938
  isLocked: _,
@@ -4919,28 +4940,28 @@ async function ys(e = {}) {
4919
4940
  });
4920
4941
  if (T.blocked.length > 0 && !m && !p) {
4921
4942
  let e = await or();
4922
- e && (m = e, h = await Qo(l, d, {
4943
+ e && (m = e, h = await ts(l, d, {
4923
4944
  token: m,
4924
4945
  key: p
4925
- }), T = Fa({
4946
+ }), T = Ra({
4926
4947
  order: w.order,
4927
4948
  graph: C,
4928
4949
  isLocked: _,
4929
4950
  installed: u
4930
4951
  }));
4931
4952
  }
4932
- if (T.blocked.length > 0 && await es(T.blocked, _, f), T.installable.length === 0) {
4953
+ if (T.blocked.length > 0 && await rs(T.blocked, _, f), T.installable.length === 0) {
4933
4954
  s.outro(L.muted("Nothing left to install once locked packs are removed."));
4934
4955
  return;
4935
4956
  }
4936
- if (ts(T.installable, f), !e.yes) {
4957
+ if (is(T.installable, f), !e.yes) {
4937
4958
  let e = await s.confirm({ message: `Install ${T.installable.length} pack${T.installable.length === 1 ? "" : "s"}?` });
4938
4959
  (s.isCancel(e) || !e) && (s.cancel("Installation cancelled."), process.exit(0));
4939
4960
  }
4940
4961
  c.start("Downloading packs...");
4941
4962
  let E;
4942
4963
  try {
4943
- E = await ns(T.installable, {
4964
+ E = await as(T.installable, {
4944
4965
  token: m,
4945
4966
  key: p
4946
4967
  });
@@ -4948,7 +4969,7 @@ async function ys(e = {}) {
4948
4969
  c.stop("Download failed"), s.cancel($(e)), process.exit(1);
4949
4970
  }
4950
4971
  c.stop(`Downloaded ${E.length} pack${E.length === 1 ? "" : "s"}`);
4951
- let D = await os({
4972
+ let D = await ls({
4952
4973
  prepared: E,
4953
4974
  config: a,
4954
4975
  cwd: o,
@@ -4958,7 +4979,7 @@ async function ys(e = {}) {
4958
4979
  });
4959
4980
  try {
4960
4981
  c.start("Installing pack files...");
4961
- let t = await aa({
4982
+ let t = await ca({
4962
4983
  packs: E,
4963
4984
  config: a,
4964
4985
  projectRoot: o,
@@ -4971,22 +4992,22 @@ async function ys(e = {}) {
4971
4992
  for (let e of t.errors) s.log.error(e);
4972
4993
  s.cancel("No files were written. Fix the errors above (or pass --force for existing files) and try again."), process.exit(1);
4973
4994
  }
4974
- c.stop("Files installed"), t.installed.length > 0 && s.log.success(`${L.highlight(String(t.installed.length))} files installed`), t.skipped.length > 0 && (s.log.warning(`${t.skipped.length} files skipped (use --force to overwrite)`), as(t.skipped));
4995
+ c.stop("Files installed"), t.installed.length > 0 && s.log.success(`${L.highlight(String(t.installed.length))} files installed`), t.skipped.length > 0 && (s.log.warning(`${t.skipped.length} files skipped (use --force to overwrite)`), cs(t.skipped));
4975
4996
  for (let e of t.errors) s.log.error(e);
4976
- await rs({
4997
+ await os({
4977
4998
  prepared: E,
4978
4999
  paths: a.paths,
4979
5000
  cwd: o,
4980
5001
  spinner: c
4981
5002
  });
4982
5003
  let n;
4983
- i && (n = await ja(o, e.yes ?? !1)), await _r({
5004
+ i && (n = await Pa(o, e.yes ?? !1)), await br({
4984
5005
  projectRoot: o,
4985
5006
  paths: a.paths,
4986
5007
  skipPrompts: e.yes ?? !1,
4987
5008
  dbReady: n,
4988
5009
  freshScaffold: i
4989
- }), is(), s.outro(L.brand(`Installed ${t.appliedPacks.join(", ")}.`));
5010
+ }), ss(), s.outro(L.brand(`Installed ${t.appliedPacks.join(", ")}.`));
4990
5011
  } finally {
4991
5012
  await Promise.all(E.map((e) => y.rm(e.packDir, {
4992
5013
  recursive: !0,
@@ -4994,10 +5015,10 @@ async function ys(e = {}) {
4994
5015
  })));
4995
5016
  }
4996
5017
  }
4997
- async function bs(e) {
5018
+ async function Cs(e) {
4998
5019
  let { packs: t, installedSet: n, stateOf: r, options: i, adminAvailable: a } = e;
4999
5020
  if (i.packs && i.packs.length > 0) {
5000
- let e = i.packs.map(Ss), n = e.filter((e) => !t.some((t) => t.name === e.name));
5021
+ let e = i.packs.map(Ts), n = e.filter((e) => !t.some((t) => t.name === e.name));
5001
5022
  return n.length > 0 && (s.cancel(`Unknown pack${n.length === 1 ? "" : "s"}: ${n.map((e) => e.name).join(", ")}`), process.exit(1)), e;
5002
5023
  }
5003
5024
  let o = t.filter((e) => n.has(e.name));
@@ -5006,13 +5027,13 @@ async function bs(e) {
5006
5027
  if (c.length === 0) return s.outro(L.muted("Every available pack is already installed.")), [];
5007
5028
  let l = le();
5008
5029
  z(c.map((e) => ` ${R.arrow} ${L.highlight(e.displayName)} ${ve(`${l}/packs/${e.name}`)}`).join("\n"), "Browse packs");
5009
- let u = pa(c, { adminAvailable: a }), d = [];
5030
+ let u = ga(c, { adminAvailable: a }), d = [];
5010
5031
  for (let e of u) {
5011
5032
  let t = e.packs.map((e) => {
5012
5033
  let t = r(e.name);
5013
5034
  return {
5014
5035
  value: e.name,
5015
- label: `${e.displayName} ${$o(t, e.price)}`,
5036
+ label: `${e.displayName} ${ns(t, e.price)}`,
5016
5037
  hint: e.description
5017
5038
  };
5018
5039
  });
@@ -5029,7 +5050,7 @@ async function bs(e) {
5029
5050
  });
5030
5051
  continue;
5031
5052
  }
5032
- let n = await Qa({
5053
+ let n = await to({
5033
5054
  message: `Select ${e.label.toLowerCase()} to add (optional)`,
5034
5055
  options: t,
5035
5056
  required: !1
@@ -5039,20 +5060,20 @@ async function bs(e) {
5039
5060
  }
5040
5061
  return d;
5041
5062
  }
5042
- var xs = /@(frontend|admin)$/;
5043
- function Ss(e) {
5044
- let t = e.match(xs);
5063
+ var ws = /@(frontend|admin)$/;
5064
+ function Ts(e) {
5065
+ let t = e.match(ws);
5045
5066
  return t ? {
5046
5067
  name: e.slice(0, -t[0].length),
5047
5068
  slot: t[1]
5048
5069
  } : { name: e };
5049
5070
  }
5050
- function Cs(e) {
5071
+ function Es(e) {
5051
5072
  let t = /* @__PURE__ */ new Set(), n = [];
5052
5073
  for (let r of e) t.has(r.name) || (t.add(r.name), n.push(r.name));
5053
5074
  return n;
5054
5075
  }
5055
- function ws(e) {
5076
+ function Ds(e) {
5056
5077
  let t = /* @__PURE__ */ new Map();
5057
5078
  for (let n of e) {
5058
5079
  if (!n.slot) continue;
@@ -5063,8 +5084,8 @@ function ws(e) {
5063
5084
  }
5064
5085
  //#endregion
5065
5086
  //#region src/commands/login.ts
5066
- async function Ts() {
5067
- Xa(), s.intro(L.brandBold("Log in to Hype Stack")), s.log.step("Opening your browser to sign in...");
5087
+ async function Os() {
5088
+ $a(), s.intro(L.brandBold("Log in to Hype Stack")), s.log.step("Opening your browser to sign in...");
5068
5089
  let e;
5069
5090
  try {
5070
5091
  e = await ar({ onUrl: (e) => {
@@ -5077,8 +5098,8 @@ async function Ts() {
5077
5098
  }
5078
5099
  //#endregion
5079
5100
  //#region src/commands/logout.ts
5080
- async function Es() {
5081
- Xa(), s.intro(L.brandBold("Log out of Hype Stack"));
5101
+ async function ks() {
5102
+ $a(), s.intro(L.brandBold("Log out of Hype Stack"));
5082
5103
  let e = F(), t = await Xn(e);
5083
5104
  if (!t) {
5084
5105
  s.outro(L.muted("You're not logged in."));
@@ -5088,7 +5109,7 @@ async function Es() {
5088
5109
  }
5089
5110
  //#endregion
5090
5111
  //#region src/core/onboard-env.ts
5091
- function Ds(e) {
5112
+ function As(e) {
5092
5113
  let t = [], n = "";
5093
5114
  for (let r of e.split(/\r?\n/)) {
5094
5115
  let e = r.trim();
@@ -5114,14 +5135,14 @@ function Ds(e) {
5114
5135
  }
5115
5136
  return t;
5116
5137
  }
5117
- function Os(e) {
5138
+ function js(e) {
5118
5139
  let t = e.trim();
5119
5140
  if (t === "") return "";
5120
5141
  if (t.length <= 4) return "•".repeat(t.length);
5121
5142
  let n = Math.min(t.length - 4, 8);
5122
5143
  return `${"•".repeat(n)}${t.slice(-4)}`;
5123
5144
  }
5124
- function ks(e, t, n) {
5145
+ function Ms(e, t, n) {
5125
5146
  let r = e.split(/\r?\n/), i = !1, a = r.map((e) => {
5126
5147
  if (i) return e;
5127
5148
  let r = e.trim();
@@ -5131,58 +5152,58 @@ function ks(e, t, n) {
5131
5152
  });
5132
5153
  return i ? a.join("\n") : e + `${e.length > 0 && !e.endsWith("\n") ? "\n" : ""}${t}=${n}\n`;
5133
5154
  }
5134
- async function As(e) {
5155
+ async function Ns(e) {
5135
5156
  return await Y(e) ? y.readFile(e, "utf-8") : "";
5136
5157
  }
5137
- async function js(e) {
5158
+ async function Ps(e) {
5138
5159
  let t = T.join(T.dirname(e), ".env");
5139
5160
  return await Y(t) || await y.copyFile(e, t), t;
5140
5161
  }
5141
- async function Ms(e, t, n) {
5142
- let r = ks(await As(e), t, n);
5162
+ async function Fs(e, t, n) {
5163
+ let r = Ms(await Ns(e), t, n);
5143
5164
  await y.writeFile(e, r, "utf-8");
5144
5165
  }
5145
5166
  //#endregion
5146
5167
  //#region src/commands/onboard.ts
5147
- async function Ns(e = {}) {
5168
+ async function Is(e = {}) {
5148
5169
  let t = e.cwd ?? process.cwd();
5149
- Ya(), s.intro(L.brandBold("Onboard your stack"));
5170
+ Qa(), s.intro(L.brandBold("Onboard your stack"));
5150
5171
  let n;
5151
5172
  try {
5152
- n = await jr(t);
5173
+ n = await Pr(t);
5153
5174
  } catch {
5154
5175
  n = null;
5155
5176
  }
5156
5177
  n || (s.cancel(`${L.path("stack.json")} not found. Run ${L.command("npx @hype-stack/cli init")} first.`), process.exit(1));
5157
- let r = n.installedPacks ?? [], i = n.onboarding?.envSections ?? [], a = await Oo(t);
5178
+ let r = n.installedPacks ?? [], i = n.onboarding?.envSections ?? [], a = await jo(t);
5158
5179
  a.length === 0 && s.log.warn(L.muted("No .env.example files found; skipping env setup."));
5159
- for (let n of a) await Ps({
5180
+ for (let n of a) await Ls({
5160
5181
  examplePath: n,
5161
5182
  projectRoot: t,
5162
5183
  skipPrompts: e.yes ?? !1,
5163
5184
  installedEnvSections: i
5164
5185
  });
5165
- let o = Ar(r);
5166
- o.length > 0 && z(o.map((e) => ` ${L.muted("·")} ${e}`).join("\n"), "Tips"), e.skipMigrations || await Ls(t, e.yes ?? !1), s.outro(L.brand(`All set. Run ${L.command("pnpm dev")} to start your app.`));
5186
+ let o = Nr(r);
5187
+ o.length > 0 && z(o.map((e) => ` ${L.muted("·")} ${e}`).join("\n"), "Tips"), e.skipMigrations || await Bs(t, e.yes ?? !1), s.outro(L.brand(`All set. Run ${L.command("pnpm dev")} to start your app.`));
5167
5188
  }
5168
- async function Ps(e) {
5169
- let { examplePath: t, projectRoot: n, skipPrompts: r, installedEnvSections: i } = e, a = T.relative(n, t) || t, o = await js(t), c = await As(o), l = Ds(await y.readFile(t, "utf-8")), u = L.path(a);
5189
+ async function Ls(e) {
5190
+ let { examplePath: t, projectRoot: n, skipPrompts: r, installedEnvSections: i } = e, a = T.relative(n, t) || t, o = await Ps(t), c = await Ns(o), l = As(await y.readFile(t, "utf-8")), u = L.path(a);
5170
5191
  s.log.step(`Env: ${u}`);
5171
5192
  for (let e of l) {
5172
5193
  if (e.vars.length === 0) continue;
5173
- if (!Er(e.section, i)) {
5194
+ if (!kr(e.section, i)) {
5174
5195
  let t = e.section ? L.bold(e.section) : L.bold("Variables");
5175
5196
  s.log.info(`${t} ${L.muted("skipped (not owned by an installed pack)")}`);
5176
5197
  continue;
5177
5198
  }
5178
- let t = Tr(e.section), n = e.section ? L.bold(e.section) : L.bold("Variables");
5199
+ let t = Or(e.section), n = e.section ? L.bold(e.section) : L.bold("Variables");
5179
5200
  s.log.step(n), t.link && (s.log.info(`${L.muted("Get your values:")} ${ve(t.link)}`), t.serviceChecklist && t.serviceChecklist.length > 0 && z(t.serviceChecklist.map((e) => ` ${L.muted("·")} ${e}`).join("\n"), "Setup")), s.log.info(L.muted(t.hint)), s.log.info(L.muted("Press Enter to keep the current value."));
5180
5201
  for (let n of e.vars) {
5181
5202
  if (r) {
5182
5203
  s.log.info(`${L.label(n.key)} ${L.muted("skipped (non-interactive)")}`);
5183
5204
  continue;
5184
5205
  }
5185
- let e = Os(Fs(c, n.key)), i = await s.text({
5206
+ let e = js(Rs(c, n.key)), i = await s.text({
5186
5207
  message: `${L.label(n.key)}`,
5187
5208
  placeholder: e ? `${e} ${L.muted("(Enter keeps this)")}` : t.hint
5188
5209
  });
@@ -5192,31 +5213,31 @@ async function Ps(e) {
5192
5213
  s.log.info(L.muted(`${n.key} unchanged.`));
5193
5214
  continue;
5194
5215
  }
5195
- await Ms(o, n.key, a), s.log.success(`${n.key} saved`);
5216
+ await Fs(o, n.key, a), s.log.success(`${n.key} saved`);
5196
5217
  }
5197
5218
  }
5198
5219
  }
5199
- function Fs(e, t) {
5220
+ function Rs(e, t) {
5200
5221
  for (let n of e.split(/\r?\n/)) {
5201
- let e = n.match(RegExp(`^${Is(t)}\\s*=\\s*(.*)$`));
5222
+ let e = n.match(RegExp(`^${zs(t)}\\s*=\\s*(.*)$`));
5202
5223
  if (e) return e[1].trim();
5203
5224
  }
5204
5225
  return "";
5205
5226
  }
5206
- function Is(e) {
5227
+ function zs(e) {
5207
5228
  return e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
5208
5229
  }
5209
- async function Ls(e, t) {
5210
- if (!await ga() && !await va(e, t, !1)) {
5230
+ async function Bs(e, t) {
5231
+ if (!await ya() && !await xa(e, t, !1)) {
5211
5232
  s.log.info(L.muted(`Start services later with ${L.command("docker compose up -d")} (in apps/backend), then ${L.command("pnpm --filter @internal/backend migration:latest")}.`));
5212
5233
  return;
5213
5234
  }
5214
5235
  let n = s.spinner();
5215
- if (n.start("Waiting for Postgres to be ready..."), !await wa(e)) {
5236
+ if (n.start("Waiting for Postgres to be ready..."), !await Da(e)) {
5216
5237
  n.error("Postgres health check timed out"), s.log.warn(L.muted(`Run migrations manually once Postgres is ready: ${L.command("pnpm --filter @internal/backend migration:latest")}`));
5217
5238
  return;
5218
5239
  }
5219
- if (n.stop(L.success("Postgres is ready")), await Ea(e)) {
5240
+ if (n.stop(L.success("Postgres is ready")), await ka(e)) {
5220
5241
  s.log.info(L.muted("Migrations already applied, skipping."));
5221
5242
  return;
5222
5243
  }
@@ -5228,20 +5249,20 @@ async function Ls(e, t) {
5228
5249
  s.log.info(L.muted("Skipping database migrations."));
5229
5250
  return;
5230
5251
  }
5231
- await Da(e);
5252
+ await Aa(e);
5232
5253
  }
5233
5254
  //#endregion
5234
5255
  //#region src/core/templates.ts
5235
- var Rs = q.createRequest()({
5256
+ var Vs = q.createRequest()({
5236
5257
  endpoint: "/templates/list",
5237
5258
  method: "GET"
5238
5259
  });
5239
- async function zs() {
5240
- let { data: e, error: t } = await Rs.send();
5260
+ async function Hs() {
5261
+ let { data: e, error: t } = await Vs.send();
5241
5262
  if (t || !e) throw Error(`Failed to fetch template list: ${String(t)}`);
5242
5263
  return e.templates;
5243
5264
  }
5244
- async function Bs(e) {
5265
+ async function Us(e) {
5245
5266
  let { data: t, error: n, status: r } = await q.createRequest()({
5246
5267
  endpoint: `/templates/${encodeURIComponent(e)}/manifest`,
5247
5268
  method: "GET"
@@ -5250,7 +5271,7 @@ async function Bs(e) {
5250
5271
  if (n || !t) throw Error(`Failed to load manifest for template "${e}": ${String(n)}`);
5251
5272
  return t;
5252
5273
  }
5253
- async function Vs(e, t = {}) {
5274
+ async function Ws(e, t = {}) {
5254
5275
  let n = q.createRequest()({
5255
5276
  endpoint: `/templates/${encodeURIComponent(e)}/download`,
5256
5277
  method: "POST"
@@ -5278,21 +5299,21 @@ async function Vs(e, t = {}) {
5278
5299
  }
5279
5300
  //#endregion
5280
5301
  //#region src/commands/template.ts
5281
- async function Hs(t = {}) {
5302
+ async function Gs(t = {}) {
5282
5303
  let n = t.cwd ?? process.cwd();
5283
- Ya();
5304
+ Qa();
5284
5305
  let r = s.spinner();
5285
5306
  r.start("Loading packs...");
5286
5307
  let o;
5287
5308
  try {
5288
- o = await Ur();
5309
+ o = await Kr();
5289
5310
  } catch (e) {
5290
5311
  r.stop("Failed to load packs"), s.cancel(`Could not reach Hype Stack. Check your connection and try again.\n${$(e)}`), process.exit(1);
5291
5312
  }
5292
5313
  r.stop("Packs loaded"), r.start("Loading templates...");
5293
5314
  let c;
5294
5315
  try {
5295
- c = await zs();
5316
+ c = await Hs();
5296
5317
  } catch (e) {
5297
5318
  r.stop("Failed to load templates"), s.cancel(`Could not reach Hype Stack. Check your connection and try again.\n${$(e)}`), process.exit(1);
5298
5319
  }
@@ -5315,33 +5336,33 @@ async function Hs(t = {}) {
5315
5336
  u || (r.stop("Template not found"), s.cancel(`Template "${l}" not found. Available: ${c.map((e) => e.id).join(", ") || "(none)"}`), process.exit(1)), r.stop(`Template: ${u.name}`);
5316
5337
  let d;
5317
5338
  try {
5318
- d = await Bs(u.id);
5339
+ d = await Us(u.id);
5319
5340
  } catch (e) {
5320
5341
  s.cancel($(e)), process.exit(1);
5321
5342
  }
5322
- let f = await vs(n, {}, {
5343
+ let f = await xs(n, {}, {
5323
5344
  defaultTheme: d.theme,
5324
5345
  defaultMode: d.defaultMode,
5325
5346
  radius: d.radius
5326
5347
  }), p = f?.projectRoot ?? null, m = f?.scaffolded ?? !1, h;
5327
5348
  try {
5328
- h = await jr(p ?? n);
5349
+ h = await Pr(p ?? n);
5329
5350
  } catch (e) {
5330
5351
  s.cancel(`Could not parse ${L.path("stack.json")}: ${$(e)} Run 'npx @hype-stack/cli init' to regenerate it.`), process.exit(1);
5331
5352
  }
5332
5353
  h || (s.cancel(p ? `Could not read ${L.path("stack.json")}. Run 'npx @hype-stack/cli init' to regenerate it, then run 'npx @hype-stack/cli template' again.` : `No ${L.path("stack.json")}. Run 'npx @hype-stack/cli init' first, then 'npx @hype-stack/cli template'.`), process.exit(1)), h.paths || (s.cancel(`${L.path("stack.json")} is missing ${L.path("paths")}. Run 'npx @hype-stack/cli init' again to regenerate it.`), process.exit(1));
5333
5354
  let g = p ?? n;
5334
5355
  s.intro(L.brandBold("Install a template"));
5335
- let _ = h.installedPacks ?? [], v = new Set(_), b = new Map(o.map((e) => [e.name, e])), x = t.licenseKey ?? h.licenseKey ?? null, S = (await Xn(F()))?.token ?? null, C = await Us(u, t.variants, t.yes ?? !1), w = Ia(u.slots, C), E = La(u.slots, u.packs, w), D = await Ws({
5356
+ let _ = h.installedPacks ?? [], v = new Set(_), b = new Map(o.map((e) => [e.name, e])), x = t.licenseKey ?? h.licenseKey ?? null, S = (await Xn(F()))?.token ?? null, C = await Ks(u, t.variants, t.yes ?? !1), w = za(u.slots, C), E = Ba(u.slots, u.packs, w), D = await qs({
5336
5357
  packs: o,
5337
5358
  templatePacks: E,
5338
5359
  installedSet: v,
5339
5360
  options: t
5340
5361
  }), O = [...E, ...D.filter((e) => !E.includes(e))], k = O.filter((e) => !b.has(e));
5341
5362
  k.length > 0 && (s.cancel(`Unknown pack${k.length === 1 ? "" : "s"}: ${k.join(", ")}`), process.exit(1));
5342
- let ee = Ba(o, w), A = Ma(ee), te;
5363
+ let ee = Ua(o, w), A = Fa(ee), te;
5343
5364
  try {
5344
- te = Pa(O, A, _);
5365
+ te = La(O, A, _);
5345
5366
  } catch (e) {
5346
5367
  s.cancel($(e)), process.exit(1);
5347
5368
  }
@@ -5349,13 +5370,13 @@ async function Hs(t = {}) {
5349
5370
  s.outro(L.muted("Every pack in this template is already installed."));
5350
5371
  return;
5351
5372
  }
5352
- let ne = await Qo(ee, v, {
5373
+ let ne = await ts(ee, v, {
5353
5374
  token: S,
5354
5375
  key: x
5355
5376
  }), re = (e) => {
5356
5377
  let t = b.get(e);
5357
5378
  return !t || t.tier === "free" ? "free" : ne[e]?.owned ? "owned" : "locked";
5358
- }, j = (e) => !v.has(e) && re(e) === "locked", M = Fa({
5379
+ }, j = (e) => !v.has(e) && re(e) === "locked", M = Ra({
5359
5380
  order: te.order,
5360
5381
  graph: A,
5361
5382
  isLocked: j,
@@ -5363,28 +5384,28 @@ async function Hs(t = {}) {
5363
5384
  });
5364
5385
  if (M.blocked.length > 0 && !S && !x) {
5365
5386
  let e = await or();
5366
- e && (S = e, ne = await Qo(ee, v, {
5387
+ e && (S = e, ne = await ts(ee, v, {
5367
5388
  token: S,
5368
5389
  key: x
5369
- }), M = Fa({
5390
+ }), M = Ra({
5370
5391
  order: te.order,
5371
5392
  graph: A,
5372
5393
  isLocked: j,
5373
5394
  installed: _
5374
5395
  }));
5375
5396
  }
5376
- if (M.blocked.length > 0 && await es(M.blocked, j, b), M.installable.length === 0) {
5397
+ if (M.blocked.length > 0 && await rs(M.blocked, j, b), M.installable.length === 0) {
5377
5398
  s.outro(L.muted("Nothing left to install once locked packs are removed."));
5378
5399
  return;
5379
5400
  }
5380
- if (ts(M.installable, b), !t.yes) {
5401
+ if (is(M.installable, b), !t.yes) {
5381
5402
  let e = await s.confirm({ message: `Install template ${L.brandBold(u.name)} (${M.installable.length} pack${M.installable.length === 1 ? "" : "s"})?` });
5382
5403
  (s.isCancel(e) || !e) && (s.cancel("Installation cancelled."), process.exit(0));
5383
5404
  }
5384
5405
  r.start("Downloading packs...");
5385
5406
  let N;
5386
5407
  try {
5387
- N = await ns(M.installable, {
5408
+ N = await as(M.installable, {
5388
5409
  token: S,
5389
5410
  key: x
5390
5411
  });
@@ -5392,7 +5413,7 @@ async function Hs(t = {}) {
5392
5413
  r.stop("Download failed"), s.cancel($(e)), process.exit(1);
5393
5414
  }
5394
5415
  r.stop(`Downloaded ${N.length} pack${N.length === 1 ? "" : "s"}`);
5395
- let ie = await os({
5416
+ let ie = await ls({
5396
5417
  prepared: N,
5397
5418
  config: h,
5398
5419
  cwd: g,
@@ -5401,7 +5422,7 @@ async function Hs(t = {}) {
5401
5422
  }), P = null;
5402
5423
  try {
5403
5424
  r.start("Installing pack files...");
5404
- let n = await aa({
5425
+ let n = await ca({
5405
5426
  packs: N,
5406
5427
  config: h,
5407
5428
  projectRoot: g,
@@ -5413,15 +5434,15 @@ async function Hs(t = {}) {
5413
5434
  for (let e of n.errors) s.log.error(e);
5414
5435
  s.cancel("No files were written. Fix the errors above (or pass --force for existing files) and try again."), process.exit(1);
5415
5436
  }
5416
- r.stop("Files installed"), n.installed.length > 0 && s.log.success(`${L.highlight(String(n.installed.length))} files installed`), n.skipped.length > 0 && (s.log.warning(`${n.skipped.length} files skipped (use --force to overwrite)`), as(n.skipped));
5437
+ r.stop("Files installed"), n.installed.length > 0 && s.log.success(`${L.highlight(String(n.installed.length))} files installed`), n.skipped.length > 0 && (s.log.warning(`${n.skipped.length} files skipped (use --force to overwrite)`), cs(n.skipped));
5417
5438
  for (let e of n.errors) s.log.error(e);
5418
5439
  r.start("Applying template overrides...");
5419
- let o = await Vs(u.id, {
5440
+ let o = await Ws(u.id, {
5420
5441
  token: S,
5421
5442
  licenseKey: x
5422
5443
  });
5423
5444
  o.status === "denied" && (r.stop("Template download denied"), s.cancel(`Access to template "${u.id}" was denied (${o.reason}). Try 'npx @hype-stack/cli login' or check your license.`), process.exit(1)), P = o.templateDir;
5424
- let c = await sa({
5445
+ let c = await ua({
5425
5446
  manifest: d,
5426
5447
  config: h,
5427
5448
  projectRoot: g,
@@ -5431,11 +5452,11 @@ async function Hs(t = {}) {
5431
5452
  for (let e of c.errors) s.log.error(e);
5432
5453
  if (!m) {
5433
5454
  let t = T.resolve(g, h.paths?.frontend.root ?? "apps/frontend"), n = d.theme ?? "zinc-mono";
5434
- a(n) && (await _o(t, i(n)) ? s.log.success(`Applied the ${i(n).label} theme`) : s.log.warning(L.muted(`Could not find ${L.path("assets/styles.css")} to apply the theme`))), d.radius !== void 0 && so(d.radius) && (await uo(t, d.radius) ? s.log.success(`Set the corner radius to ${d.radius}`) : s.log.warning(L.muted(`Could not find ${L.path("assets/styles.css")} to set the corner radius`)));
5455
+ a(n) && (await bo(t, i(n)) ? s.log.success(`Applied the ${i(n).label} theme`) : s.log.warning(L.muted(`Could not find ${L.path("assets/styles.css")} to apply the theme`))), d.radius !== void 0 && uo(d.radius) && (await mo(t, d.radius) ? s.log.success(`Set the corner radius to ${d.radius}`) : s.log.warning(L.muted(`Could not find ${L.path("assets/styles.css")} to set the corner radius`)));
5435
5456
  let r = d.defaultMode === "dark" || d.defaultMode === "light" ? d.defaultMode : e;
5436
- await ao(t, r) ? s.log.success(`Default color mode set to ${r}`) : s.log.warning(L.muted(`Could not find ${L.path("src/hooks/use-theme.ts")} to set the default color mode`));
5457
+ await co(t, r) ? s.log.success(`Default color mode set to ${r}`) : s.log.warning(L.muted(`Could not find ${L.path("src/hooks/use-theme.ts")} to set the default color mode`));
5437
5458
  }
5438
- await Gs({
5459
+ await Js({
5439
5460
  prepared: N,
5440
5461
  templateNpm: d.dependencies_npm,
5441
5462
  paths: h.paths,
@@ -5443,13 +5464,13 @@ async function Hs(t = {}) {
5443
5464
  spinner: r
5444
5465
  });
5445
5466
  let l;
5446
- m && (l = await ja(g, t.yes ?? !1)), await _r({
5467
+ m && (l = await Pa(g, t.yes ?? !1)), await br({
5447
5468
  projectRoot: g,
5448
5469
  paths: h.paths,
5449
5470
  skipPrompts: t.yes ?? !1,
5450
5471
  dbReady: l,
5451
5472
  freshScaffold: m
5452
- }), is(), s.outro(L.brand(`Installed template ${u.name}.`));
5473
+ }), ss(), s.outro(L.brand(`Installed template ${u.name}.`));
5453
5474
  } finally {
5454
5475
  await Promise.all(N.map((e) => y.rm(e.packDir, {
5455
5476
  recursive: !0,
@@ -5460,7 +5481,7 @@ async function Hs(t = {}) {
5460
5481
  });
5461
5482
  }
5462
5483
  }
5463
- async function Us(e, t, n) {
5484
+ async function Ks(e, t, n) {
5464
5485
  let r = {};
5465
5486
  for (let i of e.slots) {
5466
5487
  if (t?.[i.family]) {
@@ -5484,7 +5505,7 @@ async function Us(e, t, n) {
5484
5505
  }
5485
5506
  return r;
5486
5507
  }
5487
- async function Ws(e) {
5508
+ async function qs(e) {
5488
5509
  let { packs: t, templatePacks: n, installedSet: r, options: i } = e, a = new Set(n);
5489
5510
  if (i.packs && i.packs.length > 0) {
5490
5511
  let e = i.packs.filter((e) => !t.some((t) => t.name === e));
@@ -5495,7 +5516,7 @@ async function Ws(e) {
5495
5516
  if (o.length === 0) return [];
5496
5517
  let c = le();
5497
5518
  z(o.map((e) => ` ${R.arrow} ${L.highlight(e.displayName)} ${ve(`${c}/packs/${e.name}`)}`).join("\n"), "Browse packs");
5498
- let l = await Qa({
5519
+ let l = await to({
5499
5520
  message: "Add extra packs on top of the template (optional)",
5500
5521
  options: o.map((e) => ({
5501
5522
  value: e.name,
@@ -5506,25 +5527,25 @@ async function Ws(e) {
5506
5527
  });
5507
5528
  return m(l) && (s.cancel("Cancelled."), process.exit(0)), l;
5508
5529
  }
5509
- async function Gs(e) {
5510
- let { prepared: t, templateNpm: n, paths: r, cwd: i, spinner: a } = e, o = Xo(t.map((e) => e.manifest.dependencies_npm)), c = Yo(n ? Xo([o, n]) : o, r);
5530
+ async function Js(e) {
5531
+ let { prepared: t, templateNpm: n, paths: r, cwd: i, spinner: a } = e, o = $o(t.map((e) => e.manifest.dependencies_npm)), c = Qo(n ? $o([o, n]) : o, r);
5511
5532
  if (c.errors.length > 0) {
5512
5533
  for (let e of c.errors) s.log.error(e);
5513
5534
  return;
5514
5535
  }
5515
5536
  if (c.operations.length === 0) return;
5516
5537
  a.start("Installing npm dependencies...");
5517
- let l = await Zo(c.operations, i);
5538
+ let l = await es(c.operations, i);
5518
5539
  if (a.stop(l.ok ? "npm dependencies installed" : "npm dependency installation failed"), !l.ok) for (let e of l.errors) s.log.error(e);
5519
5540
  }
5520
5541
  //#endregion
5521
5542
  //#region src/cli.ts
5522
- function Ks(e) {
5543
+ function Ys(e) {
5523
5544
  if (!e) return;
5524
5545
  let t = e.split(",").map((e) => e.trim()).filter((e) => e.length > 0);
5525
5546
  return t.length > 0 ? t : void 0;
5526
5547
  }
5527
- function qs(e) {
5548
+ function Xs(e) {
5528
5549
  if (!e) return;
5529
5550
  let t = {};
5530
5551
  for (let n of e.split(",")) {
@@ -5533,10 +5554,10 @@ function qs(e) {
5533
5554
  }
5534
5555
  return Object.keys(t).length > 0 ? t : void 0;
5535
5556
  }
5536
- function Js() {
5557
+ function Zs() {
5537
5558
  let e = new o();
5538
5559
  return e.name("hype-stack").description("Build with Hype Stack -- templates, components, modules, and more").version(A, "-v, --version"), e.command("create").description("Create a new Hype Stack project").option("-n, --name <name>", "Project name").option("-d, --directory <path>", "Target directory").option("-e, --editor <editor>", "Code editor (cursor, claude, windsurf, copilot)").option("-t, --theme <theme>", "Color theme (default, slate, rose, emerald, violet, amber, ocean, zinc-mono, crimson, midnight)").option("--no-install", "Skip dependency installation").option("--no-setup", "Skip Docker services and database migrations after create").option("-y, --yes", "Skip confirmation prompts (requires --name)").action(async (e) => {
5539
- await gs({
5560
+ await ys({
5540
5561
  name: e.name,
5541
5562
  directory: e.directory,
5542
5563
  install: e.install,
@@ -5546,38 +5567,38 @@ function Js() {
5546
5567
  setup: e.setup
5547
5568
  });
5548
5569
  }), e.command("init").description("Initialize stack.json in the current project").action(async () => {
5549
- await _s({});
5570
+ await bs({});
5550
5571
  }), e.command("onboard").description("Set up env vars, run migrations, and get the start command").option("-y, --yes", "Skip prompts, accept defaults").option("--skip-migrations", "Skip Docker services and database migrations").option("--cwd <path>", "Working directory").action(async (e) => {
5551
- await Ns({
5572
+ await Is({
5552
5573
  cwd: e.cwd,
5553
5574
  yes: e.yes,
5554
5575
  skipMigrations: e.skipMigrations
5555
5576
  });
5556
5577
  }), e.command("compose").description("Choose feature packs to add to your project").option("--packs <list>", "Comma-separated pack names (non-interactive). Append @frontend or @admin to a layout pack to target that app shell, e.g. layout-basic@frontend,layout-native-app-shell@admin").option("--force", "Overwrite existing files").option("-y, --yes", "Skip confirmation prompts").option("-k, --key <key>", "License key").option("--license-key <key>", "License key (alias for --key)").option("--cwd <path>", "Working directory").action(async (e) => {
5557
- await ys({
5558
- packs: Ks(e.packs),
5578
+ await Ss({
5579
+ packs: Ys(e.packs),
5559
5580
  force: e.force,
5560
5581
  yes: e.yes,
5561
5582
  licenseKey: e.key ?? e.licenseKey,
5562
5583
  cwd: e.cwd
5563
5584
  });
5564
5585
  }), e.command("template").description("Install a template by id, with starter/layout variant swaps and extra packs on top").argument("[id]", "Template id (omit to pick interactively)").option("--variants <map>", "Preselect slot variants, e.g. starter-saas=starter-saas-better-auth,layout=layout-basic").option("--packs <list>", "Extra packs to add on top of the template (comma-separated)").option("--force", "Overwrite existing files").option("-y, --yes", "Skip confirmation prompts (requires <id>)").option("-k, --key <key>", "License key").option("--license-key <key>", "License key (alias for --key)").option("--cwd <path>", "Working directory").action(async (e, t) => {
5565
- await Hs({
5586
+ await Gs({
5566
5587
  templateId: e,
5567
- variants: qs(t.variants),
5568
- packs: Ks(t.packs),
5588
+ variants: Xs(t.variants),
5589
+ packs: Ys(t.packs),
5569
5590
  force: t.force,
5570
5591
  yes: t.yes,
5571
5592
  licenseKey: t.key ?? t.licenseKey,
5572
5593
  cwd: t.cwd
5573
5594
  });
5574
5595
  }), e.command("login").description("Log in via your browser to install packs your organization owns").action(async () => {
5575
- await Ts();
5596
+ await Os();
5576
5597
  }), e.command("logout").description("Log out and remove the saved CLI token").action(async () => {
5577
- await Es();
5598
+ await ks();
5578
5599
  }), e.command("auth").description("Alias for `login`").action(async () => {
5579
- await Ts();
5600
+ await Os();
5580
5601
  }), e;
5581
5602
  }
5582
5603
  //#endregion
5583
- export { vs as a, ys as i, Es as n, _s as o, Ts as r, gs as s, Js as t };
5604
+ export { xs as a, Ss as i, ks as n, bs as o, Os as r, ys as s, Zs as t };