@hype-stack/cli 0.5.14 → 0.5.16

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.14", 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.16", 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);
2490
+ return;
2491
+ }
2492
+ if (!await vr(u, c)) {
2493
+ yr(l);
2473
2494
  return;
2474
2495
  }
2475
- let u = await s.confirm({
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,13 +3617,41 @@ 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"), ya(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
- async function ba(e, t = 15, n = 2e3) {
3626
+ function Ca(e) {
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;
3628
+ }
3629
+ function wa(e) {
3630
+ return e.match(/container name "\/?([^"]+)"/i)?.[1] ?? null;
3631
+ }
3632
+ function Ta(e) {
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;
3634
+ }
3635
+ function Ea(e) {
3636
+ let t = (e.stderr || e.stdout).trim(), n = Ca(t);
3637
+ if (!n) {
3638
+ t && s.log.warn(L.muted(t));
3639
+ return;
3640
+ }
3641
+ if (n === "container") {
3642
+ let e = wa(t);
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.`));
3644
+ } else {
3645
+ let e = Ta(t);
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.`));
3647
+ }
3648
+ z([
3649
+ `${L.command("docker ps")} ${L.muted("see what's already running")}`,
3650
+ `${L.command("docker compose down")} ${L.muted("run in the other project's apps/backend to free its services")}`,
3651
+ L.muted("then re-run this command and start Docker again")
3652
+ ].join("\n"), "Free up Docker, then retry"), t && s.log.warn(L.muted(t));
3653
+ }
3654
+ async function Da(e, t = 15, n = 2e3) {
3606
3655
  for (let r = 0; r < t; r++) {
3607
3656
  if ((await J("docker", [
3608
3657
  "compose",
@@ -3617,8 +3666,8 @@ async function ba(e, t = 15, n = 2e3) {
3617
3666
  }
3618
3667
  return !1;
3619
3668
  }
3620
- var xa = "Database schema is up to date";
3621
- async function Sa(e) {
3669
+ var Oa = "Database schema is up to date";
3670
+ async function ka(e) {
3622
3671
  let t = await J("pnpm", [
3623
3672
  "--filter",
3624
3673
  "@internal/backend",
@@ -3627,9 +3676,9 @@ async function Sa(e) {
3627
3676
  "migrate",
3628
3677
  "status"
3629
3678
  ], { cwd: e });
3630
- return t.exitCode === 0 ? `${t.stdout}\n${t.stderr}`.includes(xa) : !1;
3679
+ return t.exitCode === 0 ? `${t.stdout}\n${t.stderr}`.includes(Oa) : !1;
3631
3680
  }
3632
- async function Ca(e) {
3681
+ async function Aa(e) {
3633
3682
  let t = s.spinner();
3634
3683
  t.start("Running database migrations...");
3635
3684
  let n = await J("pnpm", [
@@ -3637,15 +3686,15 @@ async function Ca(e) {
3637
3686
  "@internal/backend",
3638
3687
  "migration:latest"
3639
3688
  ], { cwd: e });
3640
- 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);
3641
3690
  }
3642
- async function wa(e, t, n = {}) {
3643
- 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;
3644
3693
  let r = s.spinner();
3645
- return r.start("Waiting for Postgres to be ready..."), await ba(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);
3646
3695
  }
3647
- async function Ta(e, t, n = {}) {
3648
- if (!await wa(e, t, n)) return;
3696
+ async function Ma(e, t, n = {}) {
3697
+ if (!await ja(e, t, n)) return;
3649
3698
  let r = t ? !0 : await s.confirm({
3650
3699
  message: `Run database migrations with ${L.command("prisma migrate deploy")}?`,
3651
3700
  initialValue: !0
@@ -3654,21 +3703,21 @@ async function Ta(e, t, n = {}) {
3654
3703
  s.log.info(L.muted("Skipping database migrations."));
3655
3704
  return;
3656
3705
  }
3657
- await Ca(e);
3706
+ await Aa(e);
3658
3707
  }
3659
- async function Ea(e, t, n = {}) {
3660
- if (!await _a(e)) {
3708
+ async function Na(e, t, n = {}) {
3709
+ if (!await ba(e)) {
3661
3710
  s.log.warn(`${L.path(".env")} not found in ${L.path("apps/backend")}. Skipping Docker and migrations - configure it first.`);
3662
3711
  return;
3663
3712
  }
3664
- await Ta(e, t, n);
3713
+ await Ma(e, t, n);
3665
3714
  }
3666
- async function Da(e, t, n = {}) {
3667
- return await _a(e) ? wa(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);
3668
3717
  }
3669
3718
  //#endregion
3670
3719
  //#region src/core/resolve.ts
3671
- function Oa(e) {
3720
+ function Fa(e) {
3672
3721
  let t = /* @__PURE__ */ new Map();
3673
3722
  for (let n of e) t.set(n.name, {
3674
3723
  name: n.name,
@@ -3676,7 +3725,7 @@ function Oa(e) {
3676
3725
  });
3677
3726
  return t;
3678
3727
  }
3679
- function ka(e, t, n = /* @__PURE__ */ new Set()) {
3728
+ function Ia(e, t, n = /* @__PURE__ */ new Set()) {
3680
3729
  let r = /* @__PURE__ */ new Set();
3681
3730
  function i(e) {
3682
3731
  if (n.has(e)) return [];
@@ -3690,10 +3739,10 @@ function ka(e, t, n = /* @__PURE__ */ new Set()) {
3690
3739
  }
3691
3740
  return i(e);
3692
3741
  }
3693
- function Aa(e, t, n = []) {
3742
+ function La(e, t, n = []) {
3694
3743
  let r = new Set(n), i = new Set(n), a = [];
3695
3744
  for (let n of e) {
3696
- let e = ka(n, t, new Set(i));
3745
+ let e = Ia(n, t, new Set(i));
3697
3746
  for (let t of e) i.has(t) || (i.add(t), a.push(t));
3698
3747
  }
3699
3748
  return {
@@ -3701,7 +3750,7 @@ function Aa(e, t, n = []) {
3701
3750
  alreadyInstalled: e.filter((e) => r.has(e))
3702
3751
  };
3703
3752
  }
3704
- function ja(e) {
3753
+ function Ra(e) {
3705
3754
  let { order: t, graph: n, isLocked: r, installed: i = [] } = e, a = new Set(i), o = /* @__PURE__ */ new Set();
3706
3755
  for (let e of t) {
3707
3756
  let t = n.get(e)?.dependencies.some((e) => !a.has(e) && o.has(e)) ?? !1;
@@ -3714,7 +3763,7 @@ function ja(e) {
3714
3763
  }
3715
3764
  //#endregion
3716
3765
  //#region src/core/variants.ts
3717
- function Ma(e, t = {}) {
3766
+ function za(e, t = {}) {
3718
3767
  let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map();
3719
3768
  for (let i of e) {
3720
3769
  let e = t[i.family] ?? i.default;
@@ -3726,14 +3775,14 @@ function Ma(e, t = {}) {
3726
3775
  familyOf: r
3727
3776
  };
3728
3777
  }
3729
- function Na(e, t, n) {
3778
+ function Ba(e, t, n) {
3730
3779
  return [...e.map((e) => n.chosen.get(e.family) ?? e.default), ...t];
3731
3780
  }
3732
- function Pa(e, t) {
3781
+ function Va(e, t) {
3733
3782
  let n = t.familyOf.get(e);
3734
3783
  return n ? t.chosen.get(n) ?? e : e;
3735
3784
  }
3736
- function Fa(e, t) {
3785
+ function Ha(e, t) {
3737
3786
  let n = /* @__PURE__ */ new Map();
3738
3787
  for (let t of e) t.family && n.set(t.name, t.family);
3739
3788
  let r = new Set(t), i = /* @__PURE__ */ new Map();
@@ -3749,65 +3798,65 @@ function Fa(e, t) {
3749
3798
  familyOf: n
3750
3799
  };
3751
3800
  }
3752
- function Ia(e, t) {
3801
+ function Ua(e, t) {
3753
3802
  return e.map((e) => ({
3754
3803
  ...e,
3755
- dependencies: e.dependencies.map((e) => Pa(e, t))
3804
+ dependencies: e.dependencies.map((e) => Va(e, t))
3756
3805
  }));
3757
3806
  }
3758
3807
  //#endregion
3759
3808
  //#region src/ui/banner.ts
3760
- var La = [
3809
+ var Wa = [
3761
3810
  " ██╗ ██╗ ██╗ ██╗ ██████╗ ███████╗",
3762
3811
  " ██║ ██║ ╚██╗ ██╔╝ ██╔══██╗ ██╔════╝",
3763
3812
  " ███████║ ╚████╔╝ ██████╔╝ █████╗ ",
3764
3813
  " ██╔══██║ ╚██╔╝ ██╔═══╝ ██╔══╝ ",
3765
3814
  " ██║ ██║ ██║ ██║ ███████╗",
3766
3815
  " ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝"
3767
- ], Ra = [
3816
+ ], Ga = [
3768
3817
  " ███████╗ ████████╗ █████╗ ██████╗ ██╗ ██╗",
3769
3818
  " ██╔════╝ ╚══██╔══╝ ██╔══██╗ ██╔════╝ ██║ ██╔╝",
3770
3819
  " ███████╗ ██║ ███████║ ██║ █████╔╝ ",
3771
3820
  " ╚════██║ ██║ ██╔══██║ ██║ ██╔═██╗ ",
3772
3821
  " ███████║ ██║ ██║ ██║ ╚██████╗ ██║ ██╗",
3773
3822
  " ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝"
3774
- ], za = [
3823
+ ], Ka = [
3775
3824
  253,
3776
3825
  176,
3777
3826
  21
3778
- ], Ba = [
3827
+ ], qa = [
3779
3828
  245,
3780
3829
  76,
3781
3830
  2
3782
- ], Va = 5, Ha = [
3831
+ ], Ja = 5, Ya = [
3783
3832
  17,
3784
3833
  103,
3785
3834
  248
3786
- ], Ua = [
3835
+ ], Xa = [
3787
3836
  42,
3788
3837
  160,
3789
3838
  250
3790
- ], Wa = .2;
3791
- function Ga() {
3839
+ ], Za = .2;
3840
+ function Qa() {
3792
3841
  console.log();
3793
- for (let e of Se(La, {
3794
- start: za,
3795
- end: Ba,
3796
- angle: Va
3842
+ for (let e of Se(Wa, {
3843
+ start: Ka,
3844
+ end: qa,
3845
+ angle: Ja
3797
3846
  })) console.log(b.bold(e));
3798
- for (let e of Se(Ra, {
3799
- start: Ha,
3800
- end: Ua,
3801
- angle: Wa
3847
+ for (let e of Se(Ga, {
3848
+ start: Ya,
3849
+ end: Xa,
3850
+ angle: Za
3802
3851
  })) console.log(b.bold(e));
3803
3852
  console.log(), console.log(` ${R.spark} ${b.dim("v" + A)} ${b.dim("·")} ${be("Ship web + desktop apps from one codebase")}`), console.log();
3804
3853
  }
3805
- function Ka() {
3854
+ function $a() {
3806
3855
  console.log(), console.log(` ${R.bolt} ${_e.orange("Hype")}${_e.skyBlue("Stack")} ${b.dim("v" + A)}`), console.log();
3807
3856
  }
3808
3857
  //#endregion
3809
3858
  //#region src/ui/pack-multiselect.ts
3810
- var qa = class extends O {
3859
+ var eo = class extends O {
3811
3860
  options;
3812
3861
  cursor = 0;
3813
3862
  selected;
@@ -3911,64 +3960,64 @@ var qa = class extends O {
3911
3960
  }
3912
3961
  }
3913
3962
  };
3914
- function Ja(e) {
3915
- return new qa(e).prompt();
3963
+ function to(e) {
3964
+ return new eo(e).prompt();
3916
3965
  }
3917
3966
  //#endregion
3918
3967
  //#region src/utils/naming.ts
3919
- function Ya(e) {
3968
+ function no(e) {
3920
3969
  return e.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
3921
3970
  }
3922
- function Xa(e) {
3971
+ function ro(e) {
3923
3972
  return e.split(/[-_]/).filter(Boolean).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(" ");
3924
3973
  }
3925
3974
  //#endregion
3926
3975
  //#region src/utils/validate.ts
3927
- function Za(e) {
3976
+ function io(e) {
3928
3977
  if (!e.trim()) return "Project name cannot be empty";
3929
3978
  if (e.length > 214) return "Project name is too long (max 214 characters)";
3930
- let t = Ya(e);
3979
+ let t = no(e);
3931
3980
  if (!ie.test(t)) return "Project name must contain at least one letter or number";
3932
3981
  }
3933
3982
  //#endregion
3934
3983
  //#region src/core/apply-mode.ts
3935
- var Qa = "src/hooks/use-theme.ts", $a = /(\bexport\s+const\s+defaultTheme\s*=\s*)(["'])(?:light|dark)\2/;
3936
- function eo(e, t) {
3937
- return e.replace($a, (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}`);
3938
3987
  }
3939
- async function to(e, t) {
3940
- let n = T.resolve(e, Qa), r;
3988
+ async function co(e, t) {
3989
+ let n = T.resolve(e, ao), r;
3941
3990
  try {
3942
3991
  r = await y.readFile(n, "utf-8");
3943
3992
  } catch {
3944
3993
  return !1;
3945
3994
  }
3946
- let i = eo(r, t);
3995
+ let i = so(r, t);
3947
3996
  return i === r || await y.writeFile(n, i, "utf-8"), !0;
3948
3997
  }
3949
3998
  //#endregion
3950
3999
  //#region src/core/apply-radius.ts
3951
- var no = /(^[ \t]*--radius(?![\w-])[ \t]*:[ \t]*)([^;\n]*);/gm;
3952
- function ro(e) {
4000
+ var lo = /(^[ \t]*--radius(?![\w-])[ \t]*:[ \t]*)([^;\n]*);/gm;
4001
+ function uo(e) {
3953
4002
  return /^[0-9]*\.?[0-9]+(rem|em|px)$/.test(e.trim());
3954
4003
  }
3955
- function io(e, t) {
3956
- return e.replace(no, (e, n) => `${n}${t};`);
4004
+ function fo(e, t) {
4005
+ return e.replace(lo, (e, n) => `${n}${t};`);
3957
4006
  }
3958
- var ao = "assets/styles.css";
3959
- async function oo(e, t) {
3960
- let n = T.resolve(e, ao), r;
4007
+ var po = "assets/styles.css";
4008
+ async function mo(e, t) {
4009
+ let n = T.resolve(e, po), r;
3961
4010
  try {
3962
4011
  r = await y.readFile(n, "utf-8");
3963
4012
  } catch {
3964
4013
  return !1;
3965
4014
  }
3966
- let i = io(r, t);
4015
+ let i = fo(r, t);
3967
4016
  return i === r || await y.writeFile(n, i, "utf-8"), !0;
3968
4017
  }
3969
4018
  //#endregion
3970
4019
  //#region src/core/apply-theme.ts
3971
- function so(e, t) {
4020
+ function ho(e, t) {
3972
4021
  let n = 0;
3973
4022
  for (; n < e.length;) {
3974
4023
  let r = e.indexOf(t, n);
@@ -3991,46 +4040,46 @@ function so(e, t) {
3991
4040
  }
3992
4041
  return null;
3993
4042
  }
3994
- function co(e, t) {
4043
+ function go(e, t) {
3995
4044
  let n = e;
3996
4045
  for (let [e, r] of Object.entries(t)) {
3997
- let t = RegExp(`(^[ \\t]*--${lo(e)}[ \\t]*:[ \\t]*)([^;\\n]*);`, "m");
4046
+ let t = RegExp(`(^[ \\t]*--${_o(e)}[ \\t]*:[ \\t]*)([^;\\n]*);`, "m");
3998
4047
  n = n.replace(t, (e, t) => `${t}${r};`);
3999
4048
  }
4000
4049
  return n;
4001
4050
  }
4002
- function lo(e) {
4051
+ function _o(e) {
4003
4052
  return e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
4004
4053
  }
4005
- function uo(e, t) {
4006
- let n = so(e, ":root"), r = so(e, ".dark"), i = e;
4054
+ function vo(e, t) {
4055
+ let n = ho(e, ":root"), r = ho(e, ".dark"), i = e;
4007
4056
  if (n) {
4008
4057
  let e = i.slice(0, n.bodyStart), r = i.slice(n.bodyStart, n.bodyEnd), a = i.slice(n.bodyEnd);
4009
- i = e + co(r, t.light) + a;
4058
+ i = e + go(r, t.light) + a;
4010
4059
  }
4011
4060
  if (r) {
4012
- let e = so(i, ".dark");
4061
+ let e = ho(i, ".dark");
4013
4062
  if (e) {
4014
4063
  let n = i.slice(0, e.bodyStart), r = i.slice(e.bodyStart, e.bodyEnd), a = i.slice(e.bodyEnd);
4015
- i = n + co(r, t.dark) + a;
4064
+ i = n + go(r, t.dark) + a;
4016
4065
  }
4017
4066
  }
4018
4067
  return i;
4019
4068
  }
4020
- var fo = "assets/styles.css";
4021
- async function po(e, t) {
4022
- let n = T.resolve(e, fo), r;
4069
+ var yo = "assets/styles.css";
4070
+ async function bo(e, t) {
4071
+ let n = T.resolve(e, yo), r;
4023
4072
  try {
4024
4073
  r = await y.readFile(n, "utf-8");
4025
4074
  } catch {
4026
4075
  return !1;
4027
4076
  }
4028
- let i = uo(r, t);
4077
+ let i = vo(r, t);
4029
4078
  return i === r || await y.writeFile(n, i, "utf-8"), !0;
4030
4079
  }
4031
4080
  //#endregion
4032
4081
  //#region src/core/clone.ts
4033
- async function mo(e) {
4082
+ async function xo(e) {
4034
4083
  let t = await ee(te, {
4035
4084
  dir: e,
4036
4085
  force: !0
@@ -4042,7 +4091,7 @@ async function mo(e) {
4042
4091
  }
4043
4092
  //#endregion
4044
4093
  //#region src/core/editor-config.ts
4045
- function ho(e) {
4094
+ function So(e) {
4046
4095
  let t = {
4047
4096
  globs: [],
4048
4097
  alwaysApply: !1
@@ -4077,10 +4126,10 @@ function ho(e) {
4077
4126
  content: i
4078
4127
  };
4079
4128
  }
4080
- function go(e) {
4129
+ function Co(e) {
4081
4130
  return e.frontmatter.globs.length > 0 ? `---\npaths:\n${e.frontmatter.globs.map((e) => ` - "${e}"`).join("\n")}\n---\n\n${e.content}` : e.content;
4082
4131
  }
4083
- function _o(e) {
4132
+ function wo(e) {
4084
4133
  let t;
4085
4134
  t = e.frontmatter.alwaysApply ? "always_on" : e.frontmatter.globs.length > 0 ? "glob" : "model_decision";
4086
4135
  let n = [`trigger: ${t}`];
@@ -4090,30 +4139,30 @@ function _o(e) {
4090
4139
  }
4091
4140
  return e.frontmatter.description && n.push(`description: ${e.frontmatter.description}`), `---\n${n.join("\n")}\n---\n\n${e.content}`;
4092
4141
  }
4093
- function vo(e) {
4142
+ function To(e) {
4094
4143
  return e.frontmatter.globs.length > 0 ? `---\napplyTo: "${e.frontmatter.globs.join(", ")}"\n---\n\n${e.content}` : e.content;
4095
4144
  }
4096
- var yo = {
4145
+ var Eo = {
4097
4146
  claude: {
4098
4147
  rulesDir: ".claude/rules",
4099
4148
  extension: ".md",
4100
- convert: go
4149
+ convert: Co
4101
4150
  },
4102
4151
  windsurf: {
4103
4152
  rulesDir: ".windsurf/rules",
4104
4153
  extension: ".md",
4105
- convert: _o
4154
+ convert: wo
4106
4155
  },
4107
4156
  copilot: {
4108
4157
  rulesDir: ".github/instructions",
4109
4158
  extension: ".instructions.md",
4110
- convert: vo
4159
+ convert: To
4111
4160
  }
4112
4161
  };
4113
- async function bo(e) {
4162
+ async function Do(e) {
4114
4163
  let t = T.join(e, oe), n = (await y.readdir(t, { withFileTypes: !0 }).catch(() => [])).filter((e) => e.isFile() && e.name.endsWith(".mdc"));
4115
4164
  return await Promise.all(n.map(async (e) => {
4116
- let n = T.join(t, e.name), { frontmatter: r, content: i } = ho(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"));
4117
4166
  return {
4118
4167
  frontmatter: r,
4119
4168
  content: i,
@@ -4121,9 +4170,9 @@ async function bo(e) {
4121
4170
  };
4122
4171
  }));
4123
4172
  }
4124
- async function xo(e, t) {
4173
+ async function Oo(e, t) {
4125
4174
  if (t === "cursor") return;
4126
- let n = yo[t], r = await bo(e), i = T.join(e, n.rulesDir);
4175
+ let n = Eo[t], r = await Do(e), i = T.join(e, n.rulesDir);
4127
4176
  await y.mkdir(i, { recursive: !0 }), await Promise.all(r.map((e) => {
4128
4177
  let t = n.convert(e), r = e.filename.replace(/\.mdc$/, n.extension);
4129
4178
  return y.writeFile(T.join(i, r), t, "utf-8");
@@ -4131,21 +4180,21 @@ async function xo(e, t) {
4131
4180
  }
4132
4181
  //#endregion
4133
4182
  //#region src/core/env-files.ts
4134
- var So = [
4183
+ var ko = [
4135
4184
  "apps",
4136
4185
  "packages",
4137
4186
  "libs",
4138
4187
  "shared"
4139
4188
  ];
4140
- async function Co(e) {
4141
- let t = await wo(e);
4189
+ async function Ao(e) {
4190
+ let t = await jo(e);
4142
4191
  return (await Promise.all(t.map(async (t) => {
4143
4192
  let n = T.join(T.dirname(t), ".env");
4144
4193
  return await Y(n) ? null : (await y.copyFile(t, n), T.relative(e, n));
4145
4194
  }))).filter((e) => e !== null).sort();
4146
4195
  }
4147
- async function wo(e) {
4148
- let t = [T.join(e, ".env.example")], n = await Promise.all(So.map(async (t) => {
4196
+ async function jo(e) {
4197
+ let t = [T.join(e, ".env.example")], n = await Promise.all(ko.map(async (t) => {
4149
4198
  let n = T.join(e, t);
4150
4199
  return (await y.readdir(n, { withFileTypes: !0 }).catch(() => [])).filter((e) => e.isDirectory()).map((e) => T.join(n, e.name, ".env.example"));
4151
4200
  }));
@@ -4153,11 +4202,11 @@ async function wo(e) {
4153
4202
  }
4154
4203
  //#endregion
4155
4204
  //#region src/core/post-clone.ts
4156
- var Q = "@hype-stack/", To = "hype-stack", Eo = "@hype-stack/cli";
4157
- async function Do(e) {
4205
+ var Q = "@hype-stack/", Mo = "hype-stack", No = "@hype-stack/cli";
4206
+ async function Po(e) {
4158
4207
  await mr(T.join(e, ".git"));
4159
4208
  }
4160
- async function Oo(e) {
4209
+ async function Fo(e) {
4161
4210
  await J("git", ["init"], { cwd: e }), await J("git", ["add", "."], { cwd: e }), await J("git", [
4162
4211
  "-c",
4163
4212
  "user.name=Hype Stack CLI",
@@ -4168,19 +4217,19 @@ async function Oo(e) {
4168
4217
  "Initial commit from Hype Stack CLI"
4169
4218
  ], { cwd: e });
4170
4219
  }
4171
- async function ko(e, t) {
4172
- let n = `@${t}/`, r = await Lo(e);
4220
+ async function Io(e, t) {
4221
+ let n = `@${t}/`, r = await Wo(e);
4173
4222
  for (let e of r) {
4174
4223
  let t = await dr(e);
4175
4224
  if (!t) continue;
4176
4225
  let r = !1;
4177
- t.name?.startsWith(Q) && (t.name = t.name.replace(Q, n), r = !0), Po(t.dependencies, n) && (r = !0), Po(t.devDependencies, n) && (r = !0), t.nx && Fo(t.nx, n) && (r = !0);
4178
- 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);
4179
4228
  a === i ? r && await fr(e, t) : await y.writeFile(e, a, "utf-8");
4180
4229
  }
4181
- await qi(e, t), await Mo(e, t), await Io(e, t);
4230
+ await Xi(e, t), await zo(e, t), await Uo(e, t);
4182
4231
  }
4183
- var Ao = new Set([
4232
+ var Lo = new Set([
4184
4233
  ".git",
4185
4234
  "node_modules",
4186
4235
  "dist",
@@ -4188,10 +4237,10 @@ var Ao = new Set([
4188
4237
  ".nx",
4189
4238
  ".next",
4190
4239
  "coverage"
4191
- ]), jo = /^(docker-compose|compose)(\.[\w.-]+)?\.ya?ml$/;
4192
- async function Mo(e, t) {
4193
- if (t === To) return;
4194
- let n = await No(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);
4195
4244
  await Promise.all(n.map(async (e) => {
4196
4245
  let n = await y.readFile(e, "utf-8").catch(() => null);
4197
4246
  if (!n || !/^name:[ \t]*hype-stack/m.test(n)) return;
@@ -4199,23 +4248,23 @@ async function Mo(e, t) {
4199
4248
  await y.writeFile(e, r, "utf-8");
4200
4249
  }));
4201
4250
  }
4202
- async function No(e) {
4251
+ async function Bo(e) {
4203
4252
  let t = await y.readdir(e, { withFileTypes: !0 }).catch(() => []);
4204
4253
  return (await Promise.all(t.map(async (t) => {
4205
4254
  let n = T.join(e, t.name);
4206
- return t.isDirectory() ? Ao.has(t.name) ? [] : No(n) : t.isFile() && jo.test(t.name) ? [n] : [];
4255
+ return t.isDirectory() ? Lo.has(t.name) ? [] : Bo(n) : t.isFile() && Ro.test(t.name) ? [n] : [];
4207
4256
  }))).flat();
4208
4257
  }
4209
- function Po(e, t) {
4258
+ function Vo(e, t) {
4210
4259
  if (!e) return !1;
4211
4260
  let n = !1;
4212
- for (let r of Object.keys(e)) if (r !== Eo && r.startsWith(Q)) {
4261
+ for (let r of Object.keys(e)) if (r !== No && r.startsWith(Q)) {
4213
4262
  let i = r.replace(Q, t);
4214
4263
  e[i] = e[r], delete e[r], n = !0;
4215
4264
  }
4216
4265
  return n;
4217
4266
  }
4218
- function Fo(e, t) {
4267
+ function Ho(e, t) {
4219
4268
  if (!e) return !1;
4220
4269
  let n = !1;
4221
4270
  if (e.implicitDependencies &&= e.implicitDependencies.map((e) => e.startsWith(Q) ? (n = !0, e.replace(Q, t)) : e), e.targets) {
@@ -4223,13 +4272,13 @@ function Fo(e, t) {
4223
4272
  }
4224
4273
  return n;
4225
4274
  }
4226
- async function Io(e, t) {
4275
+ async function Uo(e, t) {
4227
4276
  let n = T.join(e, "packages/enums/src/app/index.ts"), r = await y.readFile(n, "utf-8").catch(() => null);
4228
4277
  if (!r) return;
4229
- let i = Xa(t), a = r.replaceAll(`id: "${To}"`, `id: "${t}"`).replaceAll(`name: "${To}"`, `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"`);
4230
4279
  await y.writeFile(n, a, "utf-8");
4231
4280
  }
4232
- async function Lo(e) {
4281
+ async function Wo(e) {
4233
4282
  let t = [], n = T.join(e, "package.json");
4234
4283
  (await y.stat(n).catch(() => null))?.isFile() && t.push(n);
4235
4284
  for (let n of [
@@ -4249,7 +4298,7 @@ async function Lo(e) {
4249
4298
  }
4250
4299
  //#endregion
4251
4300
  //#region src/core/readme.ts
4252
- var Ro = {
4301
+ var Go = {
4253
4302
  cursor: {
4254
4303
  label: "Cursor",
4255
4304
  rulesDir: ".cursor/rules"
@@ -4266,21 +4315,21 @@ var Ro = {
4266
4315
  label: "GitHub Copilot",
4267
4316
  rulesDir: ".github/instructions"
4268
4317
  }
4269
- }, zo = {
4318
+ }, Ko = {
4270
4319
  backend: "Hono API server (Postgres, Prisma, Kysely, Valkey cache, WorkOS auth)",
4271
4320
  frontend: "React + Vite app talking to the backend through the typed HyperFetch SDK"
4272
- }, Bo = {
4321
+ }, qo = {
4273
4322
  enums: "Shared enums and app config used across apps",
4274
4323
  cli: "Project tooling and code generators"
4275
4324
  };
4276
- function Vo(e, t) {
4325
+ function Jo(e, t) {
4277
4326
  return Object.entries(e).toSorted(([e], [t]) => e.localeCompare(t)).map(([e, n]) => {
4278
4327
  let r = t[e];
4279
4328
  return r ? `- \`${n}\` - ${r}` : `- \`${n}\``;
4280
4329
  });
4281
4330
  }
4282
- function Ho(e) {
4283
- let { projectName: t, editor: n, workspace: r } = e, i = Xa(t), a = Ro[n], o = !!r.apps.backend, s = Vo(r.apps, zo), c = Vo(r.packages, Bo), 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 = [];
4284
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)");
4285
4334
  let u = [];
4286
4335
  u.push(`# ${i}`), u.push([
@@ -4383,13 +4432,13 @@ function Ho(e) {
4383
4432
  "stays useful."
4384
4433
  ].join("\n")), u.join("\n\n") + "\n";
4385
4434
  }
4386
- async function Uo(e, t) {
4435
+ async function Xo(e, t) {
4387
4436
  let n = T.join(e, "README.md");
4388
- await y.writeFile(n, Ho(t), "utf-8");
4437
+ await y.writeFile(n, Yo(t), "utf-8");
4389
4438
  }
4390
4439
  //#endregion
4391
4440
  //#region src/core/tracking.ts
4392
- async function Wo(e) {
4441
+ async function Zo(e) {
4393
4442
  try {
4394
4443
  let t = {
4395
4444
  "X-Device-Id": er(),
@@ -4403,7 +4452,7 @@ async function Wo(e) {
4403
4452
  }
4404
4453
  //#endregion
4405
4454
  //#region src/core/npm-deps.ts
4406
- function Go(e, t) {
4455
+ function Qo(e, t) {
4407
4456
  let n = [], r = [];
4408
4457
  if (!e) return {
4409
4458
  errors: n,
@@ -4434,7 +4483,7 @@ function Go(e, t) {
4434
4483
  operations: r
4435
4484
  };
4436
4485
  }
4437
- function Ko(e) {
4486
+ function $o(e) {
4438
4487
  let t = {};
4439
4488
  for (let n of e) if (n) for (let [e, r] of Object.entries(n)) t[e] = {
4440
4489
  ...t[e],
@@ -4442,7 +4491,7 @@ function Ko(e) {
4442
4491
  };
4443
4492
  return t;
4444
4493
  }
4445
- async function qo(e, t, n = J) {
4494
+ async function es(e, t, n = J) {
4446
4495
  let r = [];
4447
4496
  for (let i of e) {
4448
4497
  let e = T.join(t, i.relativeDir);
@@ -4478,14 +4527,14 @@ async function qo(e, t, n = J) {
4478
4527
  function $(e) {
4479
4528
  return e instanceof Error ? e.message : String(e);
4480
4529
  }
4481
- async function Jo(e, t, n) {
4530
+ async function ts(e, t, n) {
4482
4531
  let r = e.filter((e) => e.tier === "paid" && !t.has(e.name)).map((e) => e.name);
4483
- return r.length === 0 ? {} : Wr(r, n).catch(() => ({}));
4532
+ return r.length === 0 ? {} : qr(r, n).catch(() => ({}));
4484
4533
  }
4485
- function Yo(e, t) {
4534
+ function ns(e, t) {
4486
4535
  return e === "free" ? L.success("free") : e === "owned" ? L.accent("owned") : `${L.highlight(`$${t}`)} ${L.muted("locked")}`;
4487
4536
  }
4488
- async function Xo(e, t, n) {
4537
+ async function rs(e, t, n) {
4489
4538
  let r = e.filter((e) => t(e)), i = e.filter((e) => !t(e));
4490
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) => ({
4491
4540
  name: e.name,
@@ -4493,7 +4542,7 @@ async function Xo(e, t, n) {
4493
4542
  price: e.price
4494
4543
  })));
4495
4544
  }
4496
- function Zo(e, t) {
4545
+ function is(e, t) {
4497
4546
  z([
4498
4547
  "These packs will be installed, in order:",
4499
4548
  "",
@@ -4503,10 +4552,10 @@ function Zo(e, t) {
4503
4552
  })
4504
4553
  ].join("\n"), "Install Plan");
4505
4554
  }
4506
- async function Qo(e, t) {
4555
+ async function as(e, t) {
4507
4556
  let n = [];
4508
4557
  for (let r of e) {
4509
- let e = await Rr(r), i = await zr(r, t);
4558
+ let e = await Vr(r), i = await Hr(r, t);
4510
4559
  if (i.status === "denied") throw Error(`Access to "${r}" was denied (${i.reason}). Try 'npx @hype-stack/cli login' or check your license.`);
4511
4560
  n.push({
4512
4561
  manifest: e,
@@ -4515,18 +4564,18 @@ async function Qo(e, t) {
4515
4564
  }
4516
4565
  return n;
4517
4566
  }
4518
- async function $o(e) {
4519
- let { prepared: t, paths: n, cwd: r, spinner: i } = e, a = Go(Ko(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);
4520
4569
  if (a.errors.length > 0) {
4521
4570
  for (let e of a.errors) s.log.error(e);
4522
4571
  return;
4523
4572
  }
4524
4573
  if (a.operations.length === 0) return;
4525
4574
  i.start("Installing npm dependencies...");
4526
- let o = await qo(a.operations, r);
4575
+ let o = await es(a.operations, r);
4527
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);
4528
4577
  }
4529
- function es() {
4578
+ function ss() {
4530
4579
  Te([{
4531
4580
  command: "npx @hype-stack/cli onboard",
4532
4581
  hint: "(set up env vars + run migrations)"
@@ -4535,7 +4584,7 @@ function es() {
4535
4584
  hint: "(start frontend + backend)"
4536
4585
  }]);
4537
4586
  }
4538
- function ts(e) {
4587
+ function cs(e) {
4539
4588
  if (e.length === 0) return;
4540
4589
  let t = e.map((e) => {
4541
4590
  let t = e.replace(/^\{\{[^}]+\}\}\//, "");
@@ -4543,10 +4592,10 @@ function ts(e) {
4543
4592
  });
4544
4593
  s.note(t.join("\n"), "Skipped (already exist)");
4545
4594
  }
4546
- async function ns(e) {
4595
+ async function ls(e) {
4547
4596
  let { prepared: t, config: n, cwd: r, force: i, yes: a, slotsByPack: o } = e, c = /* @__PURE__ */ new Set();
4548
4597
  if (i) return c;
4549
- let l = await na({
4598
+ let l = await aa({
4550
4599
  packs: t,
4551
4600
  config: n,
4552
4601
  projectRoot: r,
@@ -4573,7 +4622,7 @@ async function ns(e) {
4573
4622
  }
4574
4623
  //#endregion
4575
4624
  //#region src/ui/swatch.ts
4576
- function rs(e) {
4625
+ function us(e) {
4577
4626
  let t = e.trim().match(/^oklch\(([^)]+)\)$/i);
4578
4627
  if (!t) return null;
4579
4628
  let n = t[1].trim().split(/\s+/);
@@ -4592,56 +4641,56 @@ function rs(e) {
4592
4641
  h: a
4593
4642
  };
4594
4643
  }
4595
- function is(e) {
4644
+ function ds(e) {
4596
4645
  return Math.min(255, Math.max(0, Math.round(e)));
4597
4646
  }
4598
- function as(e) {
4647
+ function fs(e) {
4599
4648
  return e <= .0031308 ? 12.92 * e : 1.055 * e ** (1 / 2.4) - .055;
4600
4649
  }
4601
- function os({ l: e, c: t, h: n }) {
4650
+ function ps({ l: e, c: t, h: n }) {
4602
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;
4603
4652
  return [
4604
- is(as(f) * 255),
4605
- is(as(p) * 255),
4606
- is(as(m) * 255)
4653
+ ds(fs(f) * 255),
4654
+ ds(fs(p) * 255),
4655
+ ds(fs(m) * 255)
4607
4656
  ];
4608
4657
  }
4609
- var ss = "\x1B[49m";
4610
- function cs(e, t) {
4658
+ var ms = "\x1B[49m";
4659
+ function hs(e, t) {
4611
4660
  let n = e[t];
4612
4661
  if (!n) return b.dim(" ");
4613
- let r = rs(n);
4662
+ let r = us(n);
4614
4663
  if (!r) return b.dim(" ");
4615
- let [i, a, o] = os(r);
4616
- return `\x1b[48;2;${i};${a};${o}m ${ss}`;
4664
+ let [i, a, o] = ps(r);
4665
+ return `\x1b[48;2;${i};${a};${o}m ${ms}`;
4617
4666
  }
4618
- var ls = [
4667
+ var gs = [
4619
4668
  "primary",
4620
4669
  "secondary",
4621
4670
  "accent"
4622
4671
  ];
4623
- function us(e) {
4624
- return ls.map((t) => cs(e, t)).join("");
4672
+ function _s(e) {
4673
+ return gs.map((t) => hs(e, t)).join("");
4625
4674
  }
4626
- function ds(e) {
4627
- return `${us(e.light)} ${b.dim("·")} ${us(e.dark)}`;
4675
+ function vs(e) {
4676
+ return `${_s(e.light)} ${b.dim("·")} ${_s(e.dark)}`;
4628
4677
  }
4629
4678
  //#endregion
4630
4679
  //#region src/commands/create.ts
4631
- async function fs(e) {
4632
- e.skipBanner || Ga(), 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"));
4633
4682
  let o = e.yes === !0, c, l;
4634
4683
  if (o && e.name) {
4635
- let t = Za(e.name);
4636
- t && (s.log.error(t), B()), l = e.name, c = Ya(e.name);
4684
+ let t = io(e.name);
4685
+ t && (s.log.error(t), B()), l = e.name, c = no(e.name);
4637
4686
  } else {
4638
4687
  let t = await s.text({
4639
4688
  message: "What is your project named?",
4640
4689
  placeholder: "my-app",
4641
4690
  initialValue: e.name ?? "",
4642
- validate: (e) => Za(e ?? "")
4691
+ validate: (e) => io(e ?? "")
4643
4692
  });
4644
- s.isCancel(t) && B(), l = t, c = Ya(l);
4693
+ s.isCancel(t) && B(), l = t, c = no(l);
4645
4694
  }
4646
4695
  l.trim() !== c && s.log.info(L.muted(`Using "${L.highlight(c)}" as the project name`));
4647
4696
  let u;
@@ -4685,7 +4734,7 @@ async function fs(e) {
4685
4734
  message: "Pick a color theme",
4686
4735
  options: r.map((e) => ({
4687
4736
  value: e.name,
4688
- label: `${ds(e)} ${e.label}`
4737
+ label: `${vs(e)} ${e.label}`
4689
4738
  })),
4690
4739
  initialValue: h
4691
4740
  });
@@ -4703,24 +4752,24 @@ async function fs(e) {
4703
4752
  (s.isCancel(e) || !e) && B();
4704
4753
  }
4705
4754
  let _ = s.spinner();
4706
- _.start("Cloning Hype Stack template..."), await mo(d), _.stop(L.success("Template cloned"));
4755
+ _.start("Cloning Hype Stack template..."), await xo(d), _.stop(L.success("Template cloned"));
4707
4756
  let v = s.spinner();
4708
- v.start("Setting up project..."), await Do(d), await ko(d, c), await xo(d, p);
4709
- let y = await Pr(d), b = Ir(c, y);
4710
- await Nr(d, b), await Uo(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, {
4711
4760
  projectName: c,
4712
4761
  editor: p,
4713
4762
  workspace: y
4714
4763
  });
4715
4764
  let x = T.resolve(d, b.paths?.frontend.root ?? "apps/frontend");
4716
- a(g) && (await po(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 && ro(e.radius) && (await oo(x, e.radius) || s.log.warn(L.muted(`Could not find ${L.path("assets/styles.css")} to set the corner radius`))), await to(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"));
4717
4766
  let S = s.spinner();
4718
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.")));
4719
4768
  let C = s.spinner();
4720
- C.start("Initializing git repository..."), await Oo(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"));
4721
4770
  let w = s.spinner();
4722
4771
  w.start("Creating .env files from examples...");
4723
- let E = await Co(d);
4772
+ let E = await Ao(d);
4724
4773
  if (E.length > 0) {
4725
4774
  let e = E.length;
4726
4775
  w.stop(L.success(`Created ${e} .env file${e === 1 ? "" : "s"} from examples`));
@@ -4735,20 +4784,20 @@ async function fs(e) {
4735
4784
  message: "Would you like to start Docker services and run database migrations now?",
4736
4785
  initialValue: !0
4737
4786
  }));
4738
- s.isCancel(e) && B(), e ? await Ea(d, o) : s.log.info(L.muted("Docker and migrations can run later via `npx @hype-stack/cli onboard`.")), es();
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();
4739
4788
  }
4740
- return await Wo("project_create"), s.outro(L.muted("Happy building!")), d;
4789
+ return await Zo("project_create"), s.outro(L.muted("Happy building!")), d;
4741
4790
  }
4742
4791
  //#endregion
4743
4792
  //#region src/commands/init.ts
4744
- async function ps(e) {
4793
+ async function bs(e) {
4745
4794
  let t = e.cwd ?? process.cwd(), n = e.silent ?? !1;
4746
- if (n || (Ka(), 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)) {
4747
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.`));
4748
4797
  return;
4749
4798
  }
4750
- if (await Mr(t)) {
4751
- let e = await jr(t);
4799
+ if (await Fr(t)) {
4800
+ let e = await Pr(t);
4752
4801
  if (e && !n) {
4753
4802
  s.log.info(`Found existing ${L.path("stack.json")} for project ${L.highlight(e.name)}`);
4754
4803
  let t = await s.confirm({
@@ -4761,7 +4810,7 @@ async function ps(e) {
4761
4810
  }
4762
4811
  }
4763
4812
  }
4764
- let r = await Pr(t);
4813
+ let r = await Lr(t);
4765
4814
  if (!n) {
4766
4815
  let e = Object.entries(r.apps), t = Object.entries(r.packages);
4767
4816
  if (e.length > 0) {
@@ -4780,21 +4829,21 @@ async function ps(e) {
4780
4829
  message: "Project name for stack.json?",
4781
4830
  placeholder: i,
4782
4831
  initialValue: i,
4783
- validate: (e) => Za(e ?? "")
4832
+ validate: (e) => io(e ?? "")
4784
4833
  });
4785
- s.isCancel(e) && B(), a = Ya(e);
4834
+ s.isCancel(e) && B(), a = no(e);
4786
4835
  }
4787
- 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.")));
4788
4837
  }
4789
- async function ms(e, t = {}, n) {
4790
- if (await Mr(e)) return {
4838
+ async function xs(e, t = {}, n) {
4839
+ if (await Fr(e)) return {
4791
4840
  projectRoot: e,
4792
4841
  scaffolded: !1
4793
4842
  };
4794
- let r = t.runInit ?? ((e) => ps({
4843
+ let r = t.runInit ?? ((e) => bs({
4795
4844
  cwd: e,
4796
4845
  silent: !0
4797
- })), i = t.runCreate ?? ((e, t) => fs({
4846
+ })), i = t.runCreate ?? ((e, t) => ys({
4798
4847
  parentDirectory: e,
4799
4848
  deferSetup: !0,
4800
4849
  skipBanner: !0,
@@ -4802,7 +4851,7 @@ async function ms(e, t = {}, n) {
4802
4851
  defaultMode: t?.defaultMode,
4803
4852
  radius: t?.radius
4804
4853
  }));
4805
- if (await Lr(e)) {
4854
+ if (await Br(e)) {
4806
4855
  s.log.warn(`No ${L.path("stack.json")} found in ${L.path(e)}.`);
4807
4856
  let t = await s.confirm({
4808
4857
  message: `Create ${L.path("stack.json")} now?`,
@@ -4810,7 +4859,7 @@ async function ms(e, t = {}, n) {
4810
4859
  });
4811
4860
  if (s.isCancel(t) || !t) return null;
4812
4861
  await r(e);
4813
- let n = await Mr(e);
4862
+ let n = await Fr(e);
4814
4863
  return n && s.log.success(`${L.path("stack.json")} created`), n ? {
4815
4864
  projectRoot: e,
4816
4865
  scaffolded: !1
@@ -4828,19 +4877,19 @@ async function ms(e, t = {}, n) {
4828
4877
  });
4829
4878
  if (s.isCancel(o) || !o) return null;
4830
4879
  let c = await i(e, n);
4831
- return await Mr(c) ? {
4880
+ return await Fr(c) ? {
4832
4881
  projectRoot: c,
4833
4882
  scaffolded: !0
4834
4883
  } : null;
4835
4884
  }
4836
4885
  //#endregion
4837
4886
  //#region src/commands/compose.ts
4838
- async function hs(e = {}) {
4887
+ async function Ss(e = {}) {
4839
4888
  let t = e.cwd ?? process.cwd();
4840
- Ga();
4841
- let n = await ms(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;
4842
4891
  try {
4843
- a = await jr(r ?? t);
4892
+ a = await Pr(r ?? t);
4844
4893
  } catch (e) {
4845
4894
  s.cancel(`Could not parse ${L.path("stack.json")}: ${$(e)} Run 'npx @hype-stack/cli init' to regenerate it.`), process.exit(1);
4846
4895
  }
@@ -4851,18 +4900,18 @@ async function hs(e = {}) {
4851
4900
  c.start("Loading packs...");
4852
4901
  let l;
4853
4902
  try {
4854
- l = await Ur();
4903
+ l = await Kr();
4855
4904
  } catch (e) {
4856
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);
4857
4906
  }
4858
4907
  c.stop("Packs loaded");
4859
- 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 Jo(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, {
4860
4909
  token: m,
4861
4910
  key: p
4862
4911
  }), g = (e) => {
4863
4912
  let t = f.get(e);
4864
4913
  return !t || t.tier === "free" ? "free" : h[e]?.owned ? "owned" : "locked";
4865
- }, _ = (e) => !d.has(e) && g(e) === "locked", v = await gs({
4914
+ }, _ = (e) => !d.has(e) && g(e) === "locked", v = await Cs({
4866
4915
  packs: l,
4867
4916
  installedSet: d,
4868
4917
  stateOf: g,
@@ -4873,9 +4922,9 @@ async function hs(e = {}) {
4873
4922
  s.outro(L.muted("No packs selected. Nothing to do."));
4874
4923
  return;
4875
4924
  }
4876
- let b = ys(v), x = bs(v), S = Fa(l, b), C = Oa(Ia(l, S)), w;
4925
+ let b = Es(v), x = Ds(v), S = Ha(l, b), C = Fa(Ua(l, S)), w;
4877
4926
  try {
4878
- w = Aa(b, C, u);
4927
+ w = La(b, C, u);
4879
4928
  } catch (e) {
4880
4929
  s.cancel($(e)), process.exit(1);
4881
4930
  }
@@ -4883,7 +4932,7 @@ async function hs(e = {}) {
4883
4932
  z(`${w.alreadyInstalled.join(", ")} already installed.`, "Nothing to do"), s.outro(L.muted("Your selection is already part of the project."));
4884
4933
  return;
4885
4934
  }
4886
- let T = ja({
4935
+ let T = Ra({
4887
4936
  order: w.order,
4888
4937
  graph: C,
4889
4938
  isLocked: _,
@@ -4891,28 +4940,28 @@ async function hs(e = {}) {
4891
4940
  });
4892
4941
  if (T.blocked.length > 0 && !m && !p) {
4893
4942
  let e = await or();
4894
- e && (m = e, h = await Jo(l, d, {
4943
+ e && (m = e, h = await ts(l, d, {
4895
4944
  token: m,
4896
4945
  key: p
4897
- }), T = ja({
4946
+ }), T = Ra({
4898
4947
  order: w.order,
4899
4948
  graph: C,
4900
4949
  isLocked: _,
4901
4950
  installed: u
4902
4951
  }));
4903
4952
  }
4904
- if (T.blocked.length > 0 && await Xo(T.blocked, _, f), T.installable.length === 0) {
4953
+ if (T.blocked.length > 0 && await rs(T.blocked, _, f), T.installable.length === 0) {
4905
4954
  s.outro(L.muted("Nothing left to install once locked packs are removed."));
4906
4955
  return;
4907
4956
  }
4908
- if (Zo(T.installable, f), !e.yes) {
4957
+ if (is(T.installable, f), !e.yes) {
4909
4958
  let e = await s.confirm({ message: `Install ${T.installable.length} pack${T.installable.length === 1 ? "" : "s"}?` });
4910
4959
  (s.isCancel(e) || !e) && (s.cancel("Installation cancelled."), process.exit(0));
4911
4960
  }
4912
4961
  c.start("Downloading packs...");
4913
4962
  let E;
4914
4963
  try {
4915
- E = await Qo(T.installable, {
4964
+ E = await as(T.installable, {
4916
4965
  token: m,
4917
4966
  key: p
4918
4967
  });
@@ -4920,7 +4969,7 @@ async function hs(e = {}) {
4920
4969
  c.stop("Download failed"), s.cancel($(e)), process.exit(1);
4921
4970
  }
4922
4971
  c.stop(`Downloaded ${E.length} pack${E.length === 1 ? "" : "s"}`);
4923
- let D = await ns({
4972
+ let D = await ls({
4924
4973
  prepared: E,
4925
4974
  config: a,
4926
4975
  cwd: o,
@@ -4930,7 +4979,7 @@ async function hs(e = {}) {
4930
4979
  });
4931
4980
  try {
4932
4981
  c.start("Installing pack files...");
4933
- let t = await aa({
4982
+ let t = await ca({
4934
4983
  packs: E,
4935
4984
  config: a,
4936
4985
  projectRoot: o,
@@ -4943,22 +4992,22 @@ async function hs(e = {}) {
4943
4992
  for (let e of t.errors) s.log.error(e);
4944
4993
  s.cancel("No files were written. Fix the errors above (or pass --force for existing files) and try again."), process.exit(1);
4945
4994
  }
4946
- 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)`), ts(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));
4947
4996
  for (let e of t.errors) s.log.error(e);
4948
- await $o({
4997
+ await os({
4949
4998
  prepared: E,
4950
4999
  paths: a.paths,
4951
5000
  cwd: o,
4952
5001
  spinner: c
4953
5002
  });
4954
5003
  let n;
4955
- i && (n = await Da(o, e.yes ?? !1)), await _r({
5004
+ i && (n = await Pa(o, e.yes ?? !1)), await br({
4956
5005
  projectRoot: o,
4957
5006
  paths: a.paths,
4958
5007
  skipPrompts: e.yes ?? !1,
4959
5008
  dbReady: n,
4960
5009
  freshScaffold: i
4961
- }), es(), s.outro(L.brand(`Installed ${t.appliedPacks.join(", ")}.`));
5010
+ }), ss(), s.outro(L.brand(`Installed ${t.appliedPacks.join(", ")}.`));
4962
5011
  } finally {
4963
5012
  await Promise.all(E.map((e) => y.rm(e.packDir, {
4964
5013
  recursive: !0,
@@ -4966,10 +5015,10 @@ async function hs(e = {}) {
4966
5015
  })));
4967
5016
  }
4968
5017
  }
4969
- async function gs(e) {
5018
+ async function Cs(e) {
4970
5019
  let { packs: t, installedSet: n, stateOf: r, options: i, adminAvailable: a } = e;
4971
5020
  if (i.packs && i.packs.length > 0) {
4972
- let e = i.packs.map(vs), 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));
4973
5022
  return n.length > 0 && (s.cancel(`Unknown pack${n.length === 1 ? "" : "s"}: ${n.map((e) => e.name).join(", ")}`), process.exit(1)), e;
4974
5023
  }
4975
5024
  let o = t.filter((e) => n.has(e.name));
@@ -4978,13 +5027,13 @@ async function gs(e) {
4978
5027
  if (c.length === 0) return s.outro(L.muted("Every available pack is already installed.")), [];
4979
5028
  let l = le();
4980
5029
  z(c.map((e) => ` ${R.arrow} ${L.highlight(e.displayName)} ${ve(`${l}/packs/${e.name}`)}`).join("\n"), "Browse packs");
4981
- let u = pa(c, { adminAvailable: a }), d = [];
5030
+ let u = ga(c, { adminAvailable: a }), d = [];
4982
5031
  for (let e of u) {
4983
5032
  let t = e.packs.map((e) => {
4984
5033
  let t = r(e.name);
4985
5034
  return {
4986
5035
  value: e.name,
4987
- label: `${e.displayName} ${Yo(t, e.price)}`,
5036
+ label: `${e.displayName} ${ns(t, e.price)}`,
4988
5037
  hint: e.description
4989
5038
  };
4990
5039
  });
@@ -5001,7 +5050,7 @@ async function gs(e) {
5001
5050
  });
5002
5051
  continue;
5003
5052
  }
5004
- let n = await Ja({
5053
+ let n = await to({
5005
5054
  message: `Select ${e.label.toLowerCase()} to add (optional)`,
5006
5055
  options: t,
5007
5056
  required: !1
@@ -5011,20 +5060,20 @@ async function gs(e) {
5011
5060
  }
5012
5061
  return d;
5013
5062
  }
5014
- var _s = /@(frontend|admin)$/;
5015
- function vs(e) {
5016
- let t = e.match(_s);
5063
+ var ws = /@(frontend|admin)$/;
5064
+ function Ts(e) {
5065
+ let t = e.match(ws);
5017
5066
  return t ? {
5018
5067
  name: e.slice(0, -t[0].length),
5019
5068
  slot: t[1]
5020
5069
  } : { name: e };
5021
5070
  }
5022
- function ys(e) {
5071
+ function Es(e) {
5023
5072
  let t = /* @__PURE__ */ new Set(), n = [];
5024
5073
  for (let r of e) t.has(r.name) || (t.add(r.name), n.push(r.name));
5025
5074
  return n;
5026
5075
  }
5027
- function bs(e) {
5076
+ function Ds(e) {
5028
5077
  let t = /* @__PURE__ */ new Map();
5029
5078
  for (let n of e) {
5030
5079
  if (!n.slot) continue;
@@ -5035,8 +5084,8 @@ function bs(e) {
5035
5084
  }
5036
5085
  //#endregion
5037
5086
  //#region src/commands/login.ts
5038
- async function xs() {
5039
- Ka(), 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...");
5040
5089
  let e;
5041
5090
  try {
5042
5091
  e = await ar({ onUrl: (e) => {
@@ -5049,8 +5098,8 @@ async function xs() {
5049
5098
  }
5050
5099
  //#endregion
5051
5100
  //#region src/commands/logout.ts
5052
- async function Ss() {
5053
- Ka(), s.intro(L.brandBold("Log out of Hype Stack"));
5101
+ async function ks() {
5102
+ $a(), s.intro(L.brandBold("Log out of Hype Stack"));
5054
5103
  let e = F(), t = await Xn(e);
5055
5104
  if (!t) {
5056
5105
  s.outro(L.muted("You're not logged in."));
@@ -5060,7 +5109,7 @@ async function Ss() {
5060
5109
  }
5061
5110
  //#endregion
5062
5111
  //#region src/core/onboard-env.ts
5063
- function Cs(e) {
5112
+ function As(e) {
5064
5113
  let t = [], n = "";
5065
5114
  for (let r of e.split(/\r?\n/)) {
5066
5115
  let e = r.trim();
@@ -5086,14 +5135,14 @@ function Cs(e) {
5086
5135
  }
5087
5136
  return t;
5088
5137
  }
5089
- function ws(e) {
5138
+ function js(e) {
5090
5139
  let t = e.trim();
5091
5140
  if (t === "") return "";
5092
5141
  if (t.length <= 4) return "•".repeat(t.length);
5093
5142
  let n = Math.min(t.length - 4, 8);
5094
5143
  return `${"•".repeat(n)}${t.slice(-4)}`;
5095
5144
  }
5096
- function Ts(e, t, n) {
5145
+ function Ms(e, t, n) {
5097
5146
  let r = e.split(/\r?\n/), i = !1, a = r.map((e) => {
5098
5147
  if (i) return e;
5099
5148
  let r = e.trim();
@@ -5103,58 +5152,58 @@ function Ts(e, t, n) {
5103
5152
  });
5104
5153
  return i ? a.join("\n") : e + `${e.length > 0 && !e.endsWith("\n") ? "\n" : ""}${t}=${n}\n`;
5105
5154
  }
5106
- async function Es(e) {
5155
+ async function Ns(e) {
5107
5156
  return await Y(e) ? y.readFile(e, "utf-8") : "";
5108
5157
  }
5109
- async function Ds(e) {
5158
+ async function Ps(e) {
5110
5159
  let t = T.join(T.dirname(e), ".env");
5111
5160
  return await Y(t) || await y.copyFile(e, t), t;
5112
5161
  }
5113
- async function Os(e, t, n) {
5114
- let r = Ts(await Es(e), t, n);
5162
+ async function Fs(e, t, n) {
5163
+ let r = Ms(await Ns(e), t, n);
5115
5164
  await y.writeFile(e, r, "utf-8");
5116
5165
  }
5117
5166
  //#endregion
5118
5167
  //#region src/commands/onboard.ts
5119
- async function ks(e = {}) {
5168
+ async function Is(e = {}) {
5120
5169
  let t = e.cwd ?? process.cwd();
5121
- Ga(), s.intro(L.brandBold("Onboard your stack"));
5170
+ Qa(), s.intro(L.brandBold("Onboard your stack"));
5122
5171
  let n;
5123
5172
  try {
5124
- n = await jr(t);
5173
+ n = await Pr(t);
5125
5174
  } catch {
5126
5175
  n = null;
5127
5176
  }
5128
5177
  n || (s.cancel(`${L.path("stack.json")} not found. Run ${L.command("npx @hype-stack/cli init")} first.`), process.exit(1));
5129
- let r = n.installedPacks ?? [], i = n.onboarding?.envSections ?? [], a = await wo(t);
5178
+ let r = n.installedPacks ?? [], i = n.onboarding?.envSections ?? [], a = await jo(t);
5130
5179
  a.length === 0 && s.log.warn(L.muted("No .env.example files found; skipping env setup."));
5131
- for (let n of a) await As({
5180
+ for (let n of a) await Ls({
5132
5181
  examplePath: n,
5133
5182
  projectRoot: t,
5134
5183
  skipPrompts: e.yes ?? !1,
5135
5184
  installedEnvSections: i
5136
5185
  });
5137
- let o = Ar(r);
5138
- o.length > 0 && z(o.map((e) => ` ${L.muted("·")} ${e}`).join("\n"), "Tips"), e.skipMigrations || await Ns(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.`));
5139
5188
  }
5140
- async function As(e) {
5141
- let { examplePath: t, projectRoot: n, skipPrompts: r, installedEnvSections: i } = e, a = T.relative(n, t) || t, o = await Ds(t), c = await Es(o), l = Cs(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);
5142
5191
  s.log.step(`Env: ${u}`);
5143
5192
  for (let e of l) {
5144
5193
  if (e.vars.length === 0) continue;
5145
- if (!Er(e.section, i)) {
5194
+ if (!kr(e.section, i)) {
5146
5195
  let t = e.section ? L.bold(e.section) : L.bold("Variables");
5147
5196
  s.log.info(`${t} ${L.muted("skipped (not owned by an installed pack)")}`);
5148
5197
  continue;
5149
5198
  }
5150
- 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");
5151
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."));
5152
5201
  for (let n of e.vars) {
5153
5202
  if (r) {
5154
5203
  s.log.info(`${L.label(n.key)} ${L.muted("skipped (non-interactive)")}`);
5155
5204
  continue;
5156
5205
  }
5157
- let e = ws(js(c, n.key)), i = await s.text({
5206
+ let e = js(Rs(c, n.key)), i = await s.text({
5158
5207
  message: `${L.label(n.key)}`,
5159
5208
  placeholder: e ? `${e} ${L.muted("(Enter keeps this)")}` : t.hint
5160
5209
  });
@@ -5164,31 +5213,31 @@ async function As(e) {
5164
5213
  s.log.info(L.muted(`${n.key} unchanged.`));
5165
5214
  continue;
5166
5215
  }
5167
- await Os(o, n.key, a), s.log.success(`${n.key} saved`);
5216
+ await Fs(o, n.key, a), s.log.success(`${n.key} saved`);
5168
5217
  }
5169
5218
  }
5170
5219
  }
5171
- function js(e, t) {
5220
+ function Rs(e, t) {
5172
5221
  for (let n of e.split(/\r?\n/)) {
5173
- let e = n.match(RegExp(`^${Ms(t)}\\s*=\\s*(.*)$`));
5222
+ let e = n.match(RegExp(`^${zs(t)}\\s*=\\s*(.*)$`));
5174
5223
  if (e) return e[1].trim();
5175
5224
  }
5176
5225
  return "";
5177
5226
  }
5178
- function Ms(e) {
5227
+ function zs(e) {
5179
5228
  return e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
5180
5229
  }
5181
- async function Ns(e, t) {
5182
- if (!await ga() && !await va(e, t, !1)) {
5230
+ async function Bs(e, t) {
5231
+ if (!await ya() && !await xa(e, t, !1)) {
5183
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")}.`));
5184
5233
  return;
5185
5234
  }
5186
5235
  let n = s.spinner();
5187
- if (n.start("Waiting for Postgres to be ready..."), !await ba(e)) {
5236
+ if (n.start("Waiting for Postgres to be ready..."), !await Da(e)) {
5188
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")}`));
5189
5238
  return;
5190
5239
  }
5191
- if (n.stop(L.success("Postgres is ready")), await Sa(e)) {
5240
+ if (n.stop(L.success("Postgres is ready")), await ka(e)) {
5192
5241
  s.log.info(L.muted("Migrations already applied, skipping."));
5193
5242
  return;
5194
5243
  }
@@ -5200,20 +5249,20 @@ async function Ns(e, t) {
5200
5249
  s.log.info(L.muted("Skipping database migrations."));
5201
5250
  return;
5202
5251
  }
5203
- await Ca(e);
5252
+ await Aa(e);
5204
5253
  }
5205
5254
  //#endregion
5206
5255
  //#region src/core/templates.ts
5207
- var Ps = q.createRequest()({
5256
+ var Vs = q.createRequest()({
5208
5257
  endpoint: "/templates/list",
5209
5258
  method: "GET"
5210
5259
  });
5211
- async function Fs() {
5212
- let { data: e, error: t } = await Ps.send();
5260
+ async function Hs() {
5261
+ let { data: e, error: t } = await Vs.send();
5213
5262
  if (t || !e) throw Error(`Failed to fetch template list: ${String(t)}`);
5214
5263
  return e.templates;
5215
5264
  }
5216
- async function Is(e) {
5265
+ async function Us(e) {
5217
5266
  let { data: t, error: n, status: r } = await q.createRequest()({
5218
5267
  endpoint: `/templates/${encodeURIComponent(e)}/manifest`,
5219
5268
  method: "GET"
@@ -5222,7 +5271,7 @@ async function Is(e) {
5222
5271
  if (n || !t) throw Error(`Failed to load manifest for template "${e}": ${String(n)}`);
5223
5272
  return t;
5224
5273
  }
5225
- async function Ls(e, t = {}) {
5274
+ async function Ws(e, t = {}) {
5226
5275
  let n = q.createRequest()({
5227
5276
  endpoint: `/templates/${encodeURIComponent(e)}/download`,
5228
5277
  method: "POST"
@@ -5250,21 +5299,21 @@ async function Ls(e, t = {}) {
5250
5299
  }
5251
5300
  //#endregion
5252
5301
  //#region src/commands/template.ts
5253
- async function Rs(t = {}) {
5302
+ async function Gs(t = {}) {
5254
5303
  let n = t.cwd ?? process.cwd();
5255
- Ga();
5304
+ Qa();
5256
5305
  let r = s.spinner();
5257
5306
  r.start("Loading packs...");
5258
5307
  let o;
5259
5308
  try {
5260
- o = await Ur();
5309
+ o = await Kr();
5261
5310
  } catch (e) {
5262
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);
5263
5312
  }
5264
5313
  r.stop("Packs loaded"), r.start("Loading templates...");
5265
5314
  let c;
5266
5315
  try {
5267
- c = await Fs();
5316
+ c = await Hs();
5268
5317
  } catch (e) {
5269
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);
5270
5319
  }
@@ -5287,33 +5336,33 @@ async function Rs(t = {}) {
5287
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}`);
5288
5337
  let d;
5289
5338
  try {
5290
- d = await Is(u.id);
5339
+ d = await Us(u.id);
5291
5340
  } catch (e) {
5292
5341
  s.cancel($(e)), process.exit(1);
5293
5342
  }
5294
- let f = await ms(n, {}, {
5343
+ let f = await xs(n, {}, {
5295
5344
  defaultTheme: d.theme,
5296
5345
  defaultMode: d.defaultMode,
5297
5346
  radius: d.radius
5298
5347
  }), p = f?.projectRoot ?? null, m = f?.scaffolded ?? !1, h;
5299
5348
  try {
5300
- h = await jr(p ?? n);
5349
+ h = await Pr(p ?? n);
5301
5350
  } catch (e) {
5302
5351
  s.cancel(`Could not parse ${L.path("stack.json")}: ${$(e)} Run 'npx @hype-stack/cli init' to regenerate it.`), process.exit(1);
5303
5352
  }
5304
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));
5305
5354
  let g = p ?? n;
5306
5355
  s.intro(L.brandBold("Install a template"));
5307
- 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 zs(u, t.variants, t.yes ?? !1), w = Ma(u.slots, C), E = Na(u.slots, u.packs, w), D = await Bs({
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({
5308
5357
  packs: o,
5309
5358
  templatePacks: E,
5310
5359
  installedSet: v,
5311
5360
  options: t
5312
5361
  }), O = [...E, ...D.filter((e) => !E.includes(e))], k = O.filter((e) => !b.has(e));
5313
5362
  k.length > 0 && (s.cancel(`Unknown pack${k.length === 1 ? "" : "s"}: ${k.join(", ")}`), process.exit(1));
5314
- let ee = Ia(o, w), A = Oa(ee), te;
5363
+ let ee = Ua(o, w), A = Fa(ee), te;
5315
5364
  try {
5316
- te = Aa(O, A, _);
5365
+ te = La(O, A, _);
5317
5366
  } catch (e) {
5318
5367
  s.cancel($(e)), process.exit(1);
5319
5368
  }
@@ -5321,13 +5370,13 @@ async function Rs(t = {}) {
5321
5370
  s.outro(L.muted("Every pack in this template is already installed."));
5322
5371
  return;
5323
5372
  }
5324
- let ne = await Jo(ee, v, {
5373
+ let ne = await ts(ee, v, {
5325
5374
  token: S,
5326
5375
  key: x
5327
5376
  }), re = (e) => {
5328
5377
  let t = b.get(e);
5329
5378
  return !t || t.tier === "free" ? "free" : ne[e]?.owned ? "owned" : "locked";
5330
- }, j = (e) => !v.has(e) && re(e) === "locked", M = ja({
5379
+ }, j = (e) => !v.has(e) && re(e) === "locked", M = Ra({
5331
5380
  order: te.order,
5332
5381
  graph: A,
5333
5382
  isLocked: j,
@@ -5335,28 +5384,28 @@ async function Rs(t = {}) {
5335
5384
  });
5336
5385
  if (M.blocked.length > 0 && !S && !x) {
5337
5386
  let e = await or();
5338
- e && (S = e, ne = await Jo(ee, v, {
5387
+ e && (S = e, ne = await ts(ee, v, {
5339
5388
  token: S,
5340
5389
  key: x
5341
- }), M = ja({
5390
+ }), M = Ra({
5342
5391
  order: te.order,
5343
5392
  graph: A,
5344
5393
  isLocked: j,
5345
5394
  installed: _
5346
5395
  }));
5347
5396
  }
5348
- if (M.blocked.length > 0 && await Xo(M.blocked, j, b), M.installable.length === 0) {
5397
+ if (M.blocked.length > 0 && await rs(M.blocked, j, b), M.installable.length === 0) {
5349
5398
  s.outro(L.muted("Nothing left to install once locked packs are removed."));
5350
5399
  return;
5351
5400
  }
5352
- if (Zo(M.installable, b), !t.yes) {
5401
+ if (is(M.installable, b), !t.yes) {
5353
5402
  let e = await s.confirm({ message: `Install template ${L.brandBold(u.name)} (${M.installable.length} pack${M.installable.length === 1 ? "" : "s"})?` });
5354
5403
  (s.isCancel(e) || !e) && (s.cancel("Installation cancelled."), process.exit(0));
5355
5404
  }
5356
5405
  r.start("Downloading packs...");
5357
5406
  let N;
5358
5407
  try {
5359
- N = await Qo(M.installable, {
5408
+ N = await as(M.installable, {
5360
5409
  token: S,
5361
5410
  key: x
5362
5411
  });
@@ -5364,7 +5413,7 @@ async function Rs(t = {}) {
5364
5413
  r.stop("Download failed"), s.cancel($(e)), process.exit(1);
5365
5414
  }
5366
5415
  r.stop(`Downloaded ${N.length} pack${N.length === 1 ? "" : "s"}`);
5367
- let ie = await ns({
5416
+ let ie = await ls({
5368
5417
  prepared: N,
5369
5418
  config: h,
5370
5419
  cwd: g,
@@ -5373,7 +5422,7 @@ async function Rs(t = {}) {
5373
5422
  }), P = null;
5374
5423
  try {
5375
5424
  r.start("Installing pack files...");
5376
- let n = await aa({
5425
+ let n = await ca({
5377
5426
  packs: N,
5378
5427
  config: h,
5379
5428
  projectRoot: g,
@@ -5385,15 +5434,15 @@ async function Rs(t = {}) {
5385
5434
  for (let e of n.errors) s.log.error(e);
5386
5435
  s.cancel("No files were written. Fix the errors above (or pass --force for existing files) and try again."), process.exit(1);
5387
5436
  }
5388
- 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)`), ts(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));
5389
5438
  for (let e of n.errors) s.log.error(e);
5390
5439
  r.start("Applying template overrides...");
5391
- let o = await Ls(u.id, {
5440
+ let o = await Ws(u.id, {
5392
5441
  token: S,
5393
5442
  licenseKey: x
5394
5443
  });
5395
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;
5396
- let c = await sa({
5445
+ let c = await ua({
5397
5446
  manifest: d,
5398
5447
  config: h,
5399
5448
  projectRoot: g,
@@ -5403,11 +5452,11 @@ async function Rs(t = {}) {
5403
5452
  for (let e of c.errors) s.log.error(e);
5404
5453
  if (!m) {
5405
5454
  let t = T.resolve(g, h.paths?.frontend.root ?? "apps/frontend"), n = d.theme ?? "zinc-mono";
5406
- a(n) && (await po(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 && ro(d.radius) && (await oo(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`)));
5407
5456
  let r = d.defaultMode === "dark" || d.defaultMode === "light" ? d.defaultMode : e;
5408
- await to(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`));
5409
5458
  }
5410
- await Vs({
5459
+ await Js({
5411
5460
  prepared: N,
5412
5461
  templateNpm: d.dependencies_npm,
5413
5462
  paths: h.paths,
@@ -5415,13 +5464,13 @@ async function Rs(t = {}) {
5415
5464
  spinner: r
5416
5465
  });
5417
5466
  let l;
5418
- m && (l = await Da(g, t.yes ?? !1)), await _r({
5467
+ m && (l = await Pa(g, t.yes ?? !1)), await br({
5419
5468
  projectRoot: g,
5420
5469
  paths: h.paths,
5421
5470
  skipPrompts: t.yes ?? !1,
5422
5471
  dbReady: l,
5423
5472
  freshScaffold: m
5424
- }), es(), s.outro(L.brand(`Installed template ${u.name}.`));
5473
+ }), ss(), s.outro(L.brand(`Installed template ${u.name}.`));
5425
5474
  } finally {
5426
5475
  await Promise.all(N.map((e) => y.rm(e.packDir, {
5427
5476
  recursive: !0,
@@ -5432,7 +5481,7 @@ async function Rs(t = {}) {
5432
5481
  });
5433
5482
  }
5434
5483
  }
5435
- async function zs(e, t, n) {
5484
+ async function Ks(e, t, n) {
5436
5485
  let r = {};
5437
5486
  for (let i of e.slots) {
5438
5487
  if (t?.[i.family]) {
@@ -5456,7 +5505,7 @@ async function zs(e, t, n) {
5456
5505
  }
5457
5506
  return r;
5458
5507
  }
5459
- async function Bs(e) {
5508
+ async function qs(e) {
5460
5509
  let { packs: t, templatePacks: n, installedSet: r, options: i } = e, a = new Set(n);
5461
5510
  if (i.packs && i.packs.length > 0) {
5462
5511
  let e = i.packs.filter((e) => !t.some((t) => t.name === e));
@@ -5467,7 +5516,7 @@ async function Bs(e) {
5467
5516
  if (o.length === 0) return [];
5468
5517
  let c = le();
5469
5518
  z(o.map((e) => ` ${R.arrow} ${L.highlight(e.displayName)} ${ve(`${c}/packs/${e.name}`)}`).join("\n"), "Browse packs");
5470
- let l = await Ja({
5519
+ let l = await to({
5471
5520
  message: "Add extra packs on top of the template (optional)",
5472
5521
  options: o.map((e) => ({
5473
5522
  value: e.name,
@@ -5478,25 +5527,25 @@ async function Bs(e) {
5478
5527
  });
5479
5528
  return m(l) && (s.cancel("Cancelled."), process.exit(0)), l;
5480
5529
  }
5481
- async function Vs(e) {
5482
- let { prepared: t, templateNpm: n, paths: r, cwd: i, spinner: a } = e, o = Ko(t.map((e) => e.manifest.dependencies_npm)), c = Go(n ? Ko([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);
5483
5532
  if (c.errors.length > 0) {
5484
5533
  for (let e of c.errors) s.log.error(e);
5485
5534
  return;
5486
5535
  }
5487
5536
  if (c.operations.length === 0) return;
5488
5537
  a.start("Installing npm dependencies...");
5489
- let l = await qo(c.operations, i);
5538
+ let l = await es(c.operations, i);
5490
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);
5491
5540
  }
5492
5541
  //#endregion
5493
5542
  //#region src/cli.ts
5494
- function Hs(e) {
5543
+ function Ys(e) {
5495
5544
  if (!e) return;
5496
5545
  let t = e.split(",").map((e) => e.trim()).filter((e) => e.length > 0);
5497
5546
  return t.length > 0 ? t : void 0;
5498
5547
  }
5499
- function Us(e) {
5548
+ function Xs(e) {
5500
5549
  if (!e) return;
5501
5550
  let t = {};
5502
5551
  for (let n of e.split(",")) {
@@ -5505,10 +5554,10 @@ function Us(e) {
5505
5554
  }
5506
5555
  return Object.keys(t).length > 0 ? t : void 0;
5507
5556
  }
5508
- function Ws() {
5557
+ function Zs() {
5509
5558
  let e = new o();
5510
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) => {
5511
- await fs({
5560
+ await ys({
5512
5561
  name: e.name,
5513
5562
  directory: e.directory,
5514
5563
  install: e.install,
@@ -5518,38 +5567,38 @@ function Ws() {
5518
5567
  setup: e.setup
5519
5568
  });
5520
5569
  }), e.command("init").description("Initialize stack.json in the current project").action(async () => {
5521
- await ps({});
5570
+ await bs({});
5522
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) => {
5523
- await ks({
5572
+ await Is({
5524
5573
  cwd: e.cwd,
5525
5574
  yes: e.yes,
5526
5575
  skipMigrations: e.skipMigrations
5527
5576
  });
5528
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) => {
5529
- await hs({
5530
- packs: Hs(e.packs),
5578
+ await Ss({
5579
+ packs: Ys(e.packs),
5531
5580
  force: e.force,
5532
5581
  yes: e.yes,
5533
5582
  licenseKey: e.key ?? e.licenseKey,
5534
5583
  cwd: e.cwd
5535
5584
  });
5536
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) => {
5537
- await Rs({
5586
+ await Gs({
5538
5587
  templateId: e,
5539
- variants: Us(t.variants),
5540
- packs: Hs(t.packs),
5588
+ variants: Xs(t.variants),
5589
+ packs: Ys(t.packs),
5541
5590
  force: t.force,
5542
5591
  yes: t.yes,
5543
5592
  licenseKey: t.key ?? t.licenseKey,
5544
5593
  cwd: t.cwd
5545
5594
  });
5546
5595
  }), e.command("login").description("Log in via your browser to install packs your organization owns").action(async () => {
5547
- await xs();
5596
+ await Os();
5548
5597
  }), e.command("logout").description("Log out and remove the saved CLI token").action(async () => {
5549
- await Ss();
5598
+ await ks();
5550
5599
  }), e.command("auth").description("Alias for `login`").action(async () => {
5551
- await xs();
5600
+ await Os();
5552
5601
  }), e;
5553
5602
  }
5554
5603
  //#endregion
5555
- export { ms as a, hs as i, Ss as n, ps as o, xs as r, fs as s, Ws 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 };