@hype-stack/cli 0.5.10 → 0.5.12

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.10", te = "gh:BetterTyped/hype-stack", j = "stack.json", ne = "/schema/stack.json", M = "https://api.hype-stack.dev", N = "HYPE_STACK_API_URL", P = "https://www.hype-stack.dev", re = /^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/, F = [
16
+ var A = "0.5.12", te = "gh:BetterTyped/hype-stack", j = "stack.json", ne = "/schema/stack.json", M = "https://api.hype-stack.dev", N = "HYPE_STACK_API_URL", P = "https://www.hype-stack.dev", re = /^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/, F = [
17
17
  {
18
18
  value: "cursor",
19
19
  label: "Cursor",
@@ -2584,61 +2584,56 @@ function xr(e) {
2584
2584
  let t = vr(e);
2585
2585
  return t ? yr[t] : br;
2586
2586
  }
2587
- var Sr = new Set([
2588
- Y.Config,
2589
- Y.Databases,
2590
- Y.Sentry,
2591
- Y.Resend
2592
- ]);
2593
- function Cr(e, t) {
2587
+ function Sr(e, t) {
2588
+ if (t.length === 0) return !0;
2594
2589
  let n = vr(e);
2595
- return n && Sr.has(n) || t.length === 0 ? !0 : n ? t.includes(n) : !1;
2590
+ return n ? t.includes(n) : !1;
2596
2591
  }
2597
- function wr(e) {
2592
+ function Cr(e) {
2598
2593
  return e ? e.map((e) => {
2599
2594
  let t = vr(e.envExample.section);
2600
2595
  if (!t) throw Error(`Unknown onboarding env section "${e.envExample.section}". Known sections: ${Object.values(Y).join(", ")}.`);
2601
2596
  return t;
2602
2597
  }) : [];
2603
2598
  }
2604
- function Tr(e) {
2599
+ function wr(e) {
2605
2600
  let t = /* @__PURE__ */ new Set(), n = [];
2606
2601
  for (let r of e) t.has(r) || (t.add(r), n.push(r));
2607
2602
  return n;
2608
2603
  }
2609
- var Er = {
2604
+ var Tr = {
2610
2605
  "starter-saas-workos": ["Your WebSocket upgrades can be authenticated with `authenticateWsUpgrade` from `@backend/middleware/auth/ws-auth` via `sockets.routes(authenticateWsUpgrade)`."],
2611
2606
  "starter-saas-betterauth": ["Your WebSocket upgrades can be authenticated with `authenticateWsUpgrade` from `@backend/middleware/auth/ws-auth` via `sockets.routes(authenticateWsUpgrade)`."],
2612
2607
  "pack-notifications": ["Notifications push over the `appChannel` socket channel; register it in your server startup to go live."],
2613
2608
  "pack-collaboration": ["Team and TeamMember are available as CASL subjects; project member and team management reuse the existing `Project` subject."]
2614
2609
  };
2615
- function Dr(e) {
2610
+ function Er(e) {
2616
2611
  let t = /* @__PURE__ */ new Set(), n = [];
2617
2612
  for (let r of e) {
2618
- let e = Er[r];
2613
+ let e = Tr[r];
2619
2614
  if (e) for (let r of e) t.has(r) || (t.add(r), n.push(r));
2620
2615
  }
2621
2616
  return n;
2622
2617
  }
2623
2618
  //#endregion
2624
2619
  //#region src/core/stack-config.ts
2625
- async function Or(e) {
2620
+ async function Dr(e) {
2626
2621
  return sr(T.join(e, j));
2627
2622
  }
2628
- async function kr(e) {
2623
+ async function Or(e) {
2629
2624
  return J(T.join(e, j));
2630
2625
  }
2631
- async function Ar(e, t) {
2626
+ async function kr(e, t) {
2632
2627
  await cr(T.join(e, j), t);
2633
2628
  }
2634
- async function jr(e) {
2629
+ async function Ar(e) {
2635
2630
  let t = T.join(e, "apps"), n = T.join(e, "packages"), [r, i] = await Promise.all([lr(t), lr(n)]);
2636
2631
  return {
2637
2632
  apps: r,
2638
2633
  packages: i
2639
2634
  };
2640
2635
  }
2641
- function Mr(e) {
2636
+ function jr(e) {
2642
2637
  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";
2643
2638
  return {
2644
2639
  backend: {
@@ -2672,19 +2667,19 @@ function Mr(e) {
2672
2667
  }
2673
2668
  };
2674
2669
  }
2675
- function Nr(e, t) {
2670
+ function Mr(e, t) {
2676
2671
  return {
2677
2672
  $schema: ue(),
2678
2673
  version: 1,
2679
2674
  name: e,
2680
2675
  apps: t.apps,
2681
2676
  packages: t.packages,
2682
- paths: Mr(t),
2677
+ paths: jr(t),
2683
2678
  installedPacks: [],
2684
2679
  licenseKey: null
2685
2680
  };
2686
2681
  }
2687
- async function Pr(e) {
2682
+ async function Nr(e) {
2688
2683
  let t = T.join(e, "package.json"), n = T.join(e, "apps"), [r, i] = await Promise.all([J(t), ar(n)]);
2689
2684
  return r && i;
2690
2685
  }
@@ -2699,7 +2694,7 @@ function X(e, t) {
2699
2694
  }
2700
2695
  //#endregion
2701
2696
  //#region src/core/registry.ts
2702
- async function Fr(e) {
2697
+ async function Pr(e) {
2703
2698
  let { data: t, error: n, status: r } = await K.createRequest()({
2704
2699
  endpoint: `/packs/${encodeURIComponent(e)}/manifest`,
2705
2700
  method: "GET"
@@ -2708,7 +2703,7 @@ async function Fr(e) {
2708
2703
  if (n || !t) throw Error(`Failed to load manifest for "${e}": ${String(n)}`);
2709
2704
  return t;
2710
2705
  }
2711
- async function Ir(e, t = {}) {
2706
+ async function Fr(e, t = {}) {
2712
2707
  let n = K.createRequest()({
2713
2708
  endpoint: `/packs/${encodeURIComponent(e)}/download`,
2714
2709
  method: "POST"
@@ -2734,23 +2729,23 @@ async function Ir(e, t = {}) {
2734
2729
  packDir: s
2735
2730
  };
2736
2731
  }
2737
- function Lr(e, t, n) {
2732
+ function Ir(e, t, n) {
2738
2733
  let r = X(e, t);
2739
2734
  return T.resolve(n, r);
2740
2735
  }
2741
- function Rr(e, t) {
2736
+ function Lr(e, t) {
2742
2737
  return T.join(t, e);
2743
2738
  }
2744
- var zr = K.createRequest()({
2739
+ var Rr = K.createRequest()({
2745
2740
  endpoint: "/packs/list",
2746
2741
  method: "GET"
2747
2742
  });
2748
- async function Br() {
2749
- let { data: e, error: t } = await zr.send();
2743
+ async function zr() {
2744
+ let { data: e, error: t } = await Rr.send();
2750
2745
  if (t || !e) throw Error(`Failed to fetch pack list: ${String(t)}`);
2751
2746
  return e.packs;
2752
2747
  }
2753
- async function Vr(e, t = {}) {
2748
+ async function Br(e, t = {}) {
2754
2749
  if (e.length === 0) return {};
2755
2750
  let n = K.createRequest()({
2756
2751
  endpoint: "/packs/authorize",
@@ -2766,30 +2761,33 @@ async function Vr(e, t = {}) {
2766
2761
  }
2767
2762
  //#endregion
2768
2763
  //#region src/core/codemods.ts
2769
- var Hr = "@hype-stack/";
2764
+ var Vr = "@hype-stack/", Hr = /@hype-stack\/(?!cli\b)/g;
2770
2765
  function Ur(e, t) {
2766
+ return e.replace(Hr, t);
2767
+ }
2768
+ function Wr(e, t) {
2771
2769
  return X(e === "admin" ? "{{admin.root}}" : "{{frontend.root}}", t);
2772
2770
  }
2773
- async function Wr(e, t, n) {
2771
+ async function Gr(e, t, n) {
2774
2772
  let r = X("{{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");
2775
2773
  if (await J(i)) {
2776
2774
  let t = await y.readFile(i, "utf-8");
2777
- for (let n of e) t.includes(`from "${n.from}"`) || (t = Gr(t, n), t = Kr(t, n));
2775
+ for (let n of e) t.includes(`from "${n.from}"`) || (t = Kr(t, n), t = qr(t, n));
2778
2776
  await y.writeFile(i, t, "utf-8");
2779
2777
  }
2780
- if (await Promise.all([a, o].map((t) => qr(t, e))), await J(s)) {
2778
+ if (await Promise.all([a, o].map((t) => Jr(t, e))), await J(s)) {
2781
2779
  let t = await y.readFile(s, "utf-8");
2782
- for (let n of e) t = Yr(t, n);
2780
+ for (let n of e) t = Xr(t, n);
2783
2781
  await y.writeFile(s, t, "utf-8");
2784
2782
  }
2785
2783
  }
2786
- function Gr(e, t) {
2784
+ function Kr(e, t) {
2787
2785
  let n = `import { ${t.import} } from "${t.from}";`, r = e.lastIndexOf("import ");
2788
2786
  if (r === -1) return n + "\n" + e;
2789
2787
  let i = e.indexOf("\n", e.indexOf(";", r));
2790
2788
  return i === -1 ? e + "\n" + n : e.slice(0, i + 1) + n + "\n" + e.slice(i + 1);
2791
2789
  }
2792
- function Kr(e, t) {
2790
+ function qr(e, t) {
2793
2791
  let n = `.extend(${t.import}.shape)`;
2794
2792
  if (e.includes(n)) return e;
2795
2793
  let r = e.indexOf("export const envSchema = z.object({");
@@ -2804,33 +2802,33 @@ function Kr(e, t) {
2804
2802
  let o = a + 2;
2805
2803
  return e.slice(0, o) + n + e.slice(o);
2806
2804
  }
2807
- async function qr(e, t) {
2805
+ async function Jr(e, t) {
2808
2806
  if (!await J(e)) return;
2809
2807
  let n = await y.readFile(e, "utf-8");
2810
- for (let e of t) n = Jr(n, e);
2808
+ for (let e of t) n = Yr(n, e);
2811
2809
  await y.writeFile(e, n, "utf-8");
2812
2810
  }
2813
- function Jr(e, t) {
2811
+ function Yr(e, t) {
2814
2812
  for (let n of Object.keys(t.envExample.vars)) if (e.includes(`${n}=`)) return e;
2815
2813
  let n = [];
2816
2814
  n.push(""), n.push(`# ${hr[t.envExample.section]}`);
2817
2815
  for (let [e, r] of Object.entries(t.envExample.vars)) n.push(`${e}=${r}`);
2818
2816
  return e.trimEnd() + "\n" + n.join("\n") + "\n";
2819
2817
  }
2820
- function Yr(e, t) {
2818
+ function Xr(e, t) {
2821
2819
  for (let n of Object.keys(t.envTest)) if (e.includes(`${n}=`)) return e;
2822
2820
  let n = [""];
2823
2821
  for (let [e, r] of Object.entries(t.envTest)) n.push(`${e}=${r}`);
2824
2822
  return e.trimEnd() + "\n" + n.join("\n") + "\n";
2825
2823
  }
2826
- async function Xr(e, t, n) {
2824
+ async function Zr(e, t, n) {
2827
2825
  let r = T.resolve(n, X("{{backend.routes}}", t), "index.ts");
2828
2826
  if (!await J(r)) return;
2829
2827
  let i = await y.readFile(r, "utf-8");
2830
- for (let t of e) i.includes(`from "${t.from}"`) || (i = Zr(i, t), i = Qr(i, t));
2828
+ for (let t of e) i.includes(`from "${t.from}"`) || (i = Qr(i, t), i = $r(i, t));
2831
2829
  await y.writeFile(r, i, "utf-8");
2832
2830
  }
2833
- function Zr(e, t) {
2831
+ function Qr(e, t) {
2834
2832
  let n = `import { ${t.import} } from "${t.from}";`, r = e.lastIndexOf("from \"./");
2835
2833
  if (r !== -1) {
2836
2834
  let t = e.indexOf("\n", r);
@@ -2839,7 +2837,7 @@ function Zr(e, t) {
2839
2837
  let i = e.indexOf("export const registerRoutes");
2840
2838
  return i === -1 ? e : e.slice(0, i) + n + "\n\n" + e.slice(i);
2841
2839
  }
2842
- function Qr(e, t) {
2840
+ function $r(e, t) {
2843
2841
  let n = `.route("${t.prefix}", ${t.import})`, r = e.match(/\.route\([^)]+\);/g);
2844
2842
  if (r) {
2845
2843
  let t = r[r.length - 1], i = e.lastIndexOf(t) + t.length - 1;
@@ -2847,14 +2845,14 @@ function Qr(e, t) {
2847
2845
  }
2848
2846
  return e.replace("return app;", `return app\n ${n};`);
2849
2847
  }
2850
- async function $r(e, t, n) {
2848
+ async function ei(e, t, n) {
2851
2849
  let r = T.resolve(n, X("{{backend.root}}", t), "src/context.ts");
2852
2850
  if (!await J(r)) return;
2853
2851
  let i = await y.readFile(r, "utf-8");
2854
- for (let t of e) i.includes(`export let ${t.export}`) || (i = ei(i, t), i = ti(i, t), i = ni(i, t), i = ii(i, t));
2852
+ for (let t of e) i.includes(`export let ${t.export}`) || (i = ti(i, t), i = ni(i, t), i = ri(i, t), i = ai(i, t));
2855
2853
  await y.writeFile(r, i, "utf-8");
2856
2854
  }
2857
- function ei(e, t) {
2855
+ function ti(e, t) {
2858
2856
  let n = `import { ${t.typeImport.name} } from "${t.typeImport.from}";`;
2859
2857
  if (e.includes(`from "${t.typeImport.from}"`)) return e;
2860
2858
  let r = e.lastIndexOf("import ");
@@ -2862,7 +2860,7 @@ function ei(e, t) {
2862
2860
  let i = e.indexOf("\n", e.indexOf(";", r));
2863
2861
  return i === -1 ? e + "\n" + n : e.slice(0, i + 1) + n + "\n" + e.slice(i + 1);
2864
2862
  }
2865
- function ti(e, t) {
2863
+ function ni(e, t) {
2866
2864
  let n = `export let ${t.export}: ${t.type};`, r = e.lastIndexOf("export let ");
2867
2865
  if (r === -1) {
2868
2866
  let t = e.indexOf("export const setupContext");
@@ -2871,15 +2869,15 @@ function ti(e, t) {
2871
2869
  let i = e.indexOf("\n", r);
2872
2870
  return i === -1 ? e + "\n" + n : e.slice(0, i + 1) + n + "\n" + e.slice(i + 1);
2873
2871
  }
2874
- function ni(e, t) {
2872
+ function ri(e, t) {
2875
2873
  let n = ` ${t.export} = ${t.init};`, r = e.match(/export const setupContext\s*=\s*async\s*\([^)]*\)\s*=>\s*\{/);
2876
2874
  if (!r) return e;
2877
2875
  let i = e.indexOf("{", e.indexOf(r[0]));
2878
2876
  if (i === -1) return e;
2879
- let a = ri(e, i);
2877
+ let a = ii(e, i);
2880
2878
  return a === -1 ? e : e.slice(0, a) + n + "\n" + e.slice(a);
2881
2879
  }
2882
- function ri(e, t) {
2880
+ function ii(e, t) {
2883
2881
  let n = 0;
2884
2882
  for (let r = t; r < e.length; r++) {
2885
2883
  let t = e[r];
@@ -2888,20 +2886,20 @@ function ri(e, t) {
2888
2886
  }
2889
2887
  return -1;
2890
2888
  }
2891
- function ii(e, t) {
2889
+ function ai(e, t) {
2892
2890
  let n = ` ${t.export}: ${t.type};`, r = e.indexOf("export type ContextVariables = {");
2893
2891
  if (r === -1) return e;
2894
2892
  let i = e.indexOf("};", r);
2895
2893
  return i === -1 ? e : e.slice(0, i) + n + "\n" + e.slice(i);
2896
2894
  }
2897
- async function ai(e, t, n) {
2895
+ async function oi(e, t, n) {
2898
2896
  let r = T.resolve(n, X("{{enums.src}}", t), "index.ts");
2899
2897
  if (!await J(r)) return;
2900
2898
  let i = await y.readFile(r, "utf-8");
2901
- for (let t of e) i.includes(`from "${t.from}"`) || (i = oi(i, t));
2899
+ for (let t of e) i.includes(`from "${t.from}"`) || (i = si(i, t));
2902
2900
  await y.writeFile(r, i, "utf-8");
2903
2901
  }
2904
- function oi(e, t) {
2902
+ function si(e, t) {
2905
2903
  let n = `export * from "${t.from}";`, r = e.lastIndexOf("export * from");
2906
2904
  if (r !== -1) {
2907
2905
  let t = e.indexOf("\n", r);
@@ -2909,14 +2907,14 @@ function oi(e, t) {
2909
2907
  }
2910
2908
  return e.trim() === "" ? n + "\n" : e.trimEnd() + "\n" + n + "\n";
2911
2909
  }
2912
- async function si(e, t, n) {
2910
+ async function ci(e, t, n) {
2913
2911
  let r = X("{{backend.root}}", t), i = T.resolve(n, r, "src/sockets/index.ts");
2914
2912
  if (!await J(i)) return;
2915
2913
  let a = await y.readFile(i, "utf-8");
2916
- for (let t of e) a.includes(`from "${t.from}"`) || (a = ci(a, t), a = li(a, t));
2917
- await J(T.resolve(n, r, "src/libs/websocket/ws-authenticate.ts")) && (a = ui(a)), await y.writeFile(i, a, "utf-8");
2914
+ for (let t of e) a.includes(`from "${t.from}"`) || (a = li(a, t), a = ui(a, t));
2915
+ await J(T.resolve(n, r, "src/libs/websocket/ws-authenticate.ts")) && (a = di(a)), await y.writeFile(i, a, "utf-8");
2918
2916
  }
2919
- function ci(e, t) {
2917
+ function li(e, t) {
2920
2918
  let n = `import { ${t.import} } from "${t.from}";`, r = e.lastIndexOf("from \"./");
2921
2919
  if (r !== -1) {
2922
2920
  let t = e.indexOf("\n", r);
@@ -2925,7 +2923,7 @@ function ci(e, t) {
2925
2923
  let i = e.indexOf("const sockets");
2926
2924
  return i === -1 ? e : e.slice(0, i) + n + "\n\n" + e.slice(i);
2927
2925
  }
2928
- function li(e, t) {
2926
+ function ui(e, t) {
2929
2927
  let n = `.socket("${t.prefix}", ${t.import})`, r = e.indexOf("const sockets");
2930
2928
  if (r === -1) return e;
2931
2929
  let i = e.indexOf("new SocketRouter", r);
@@ -2939,7 +2937,7 @@ function li(e, t) {
2939
2937
  }
2940
2938
  return e;
2941
2939
  }
2942
- function ui(e) {
2940
+ function di(e) {
2943
2941
  if (e.includes("wsAuthenticate")) return e;
2944
2942
  let t = e.indexOf("from \"@backend/libs/websocket/socket-router\""), n = e;
2945
2943
  if (t !== -1) {
@@ -2948,14 +2946,14 @@ function ui(e) {
2948
2946
  }
2949
2947
  return n.replace("new SocketRouter()", "new SocketRouter({ authenticate: wsAuthenticate })");
2950
2948
  }
2951
- async function di(e, t, n) {
2949
+ async function fi(e, t, n) {
2952
2950
  let r = X("{{frontend.root}}", t), i = T.resolve(n, r, "src/api/sdk.ts");
2953
2951
  if (!await J(i)) return;
2954
2952
  let a = await y.readFile(i, "utf-8");
2955
- for (let t of e) a.includes(`.$configure(${t.import})`) || (a = fi(a, t), a = pi(a, t));
2953
+ for (let t of e) a.includes(`.$configure(${t.import})`) || (a = pi(a, t), a = mi(a, t));
2956
2954
  await y.writeFile(i, a, "utf-8");
2957
2955
  }
2958
- function fi(e, t) {
2956
+ function pi(e, t) {
2959
2957
  let n = `import { ${t.import} } from "${t.from}";`;
2960
2958
  if (e.includes(n)) return e;
2961
2959
  let r = e.lastIndexOf("from \"./");
@@ -2966,20 +2964,20 @@ function fi(e, t) {
2966
2964
  let i = e.indexOf("export const sdk");
2967
2965
  return i === -1 ? e : e.slice(0, i) + n + "\n\n" + e.slice(i);
2968
2966
  }
2969
- function pi(e, t) {
2967
+ function mi(e, t) {
2970
2968
  let n = `.$configure(${t.import})`, r = e.indexOf("export const sdk");
2971
2969
  if (r === -1) return e;
2972
2970
  let i = e.indexOf(";", r);
2973
2971
  return i === -1 ? e : e.slice(0, i) + "\n " + n + e.slice(i);
2974
2972
  }
2975
- async function mi(e, t, n) {
2973
+ async function hi(e, t, n) {
2976
2974
  let r = T.resolve(n, X("{{backend.utils}}", t), "frontend-url/frontend-url.ts");
2977
2975
  if (!await J(r)) return;
2978
2976
  let i = await y.readFile(r, "utf-8");
2979
- for (let t of e) i.includes(`"${t.path}"`) || (i = hi(i, t));
2977
+ for (let t of e) i.includes(`"${t.path}"`) || (i = gi(i, t));
2980
2978
  await y.writeFile(r, i, "utf-8");
2981
2979
  }
2982
- function hi(e, t) {
2980
+ function gi(e, t) {
2983
2981
  let n = ` "${t.path}": ${t.search};`, r = e.indexOf("type RouteDefinitions = {");
2984
2982
  if (r === -1) return e;
2985
2983
  let i = e.indexOf("{", r);
@@ -2995,38 +2993,38 @@ function hi(e, t) {
2995
2993
  }
2996
2994
  return o === -1 ? e : e.slice(0, o) + n + "\n" + e.slice(o);
2997
2995
  }
2998
- var gi = "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", _i = {
2996
+ var _i = "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", vi = {
2999
2997
  primary: "primaryNav",
3000
2998
  secondary: "secondaryNav",
3001
2999
  tertiary: "tertiaryNav",
3002
3000
  settings: "settingsNav"
3003
3001
  };
3004
- async function vi(e) {
3005
- let { entries: t, paths: n, projectRoot: r, slot: i = "frontend" } = e, a = Ur(i, n), o = T.resolve(r, a, "src/constants/nav.constants.ts"), s;
3006
- await J(o) ? s = await y.readFile(o, "utf-8") : (await y.mkdir(T.dirname(o), { recursive: !0 }), s = gi);
3007
- for (let e of t) s.includes(`label: "${e.label}"`) || (s = xi(s, e));
3008
- for (let e of t.toReversed()) s.includes(`label: "${e.label}"`) || (s = Ci(s, e));
3002
+ async function yi(e) {
3003
+ let { entries: t, paths: n, projectRoot: r, slot: i = "frontend" } = e, a = Wr(i, n), o = T.resolve(r, a, "src/constants/nav.constants.ts"), s;
3004
+ await J(o) ? s = await y.readFile(o, "utf-8") : (await y.mkdir(T.dirname(o), { recursive: !0 }), s = _i);
3005
+ for (let e of t) s.includes(`label: "${e.label}"`) || (s = Si(s, e));
3006
+ for (let e of t.toReversed()) s.includes(`label: "${e.label}"`) || (s = wi(s, e));
3009
3007
  await y.writeFile(o, s, "utf-8");
3010
3008
  }
3011
- async function yi(e) {
3012
- let { postLoginRedirect: t, paths: n, projectRoot: r, slot: i = "frontend" } = e, a = Ur(i, n), o = T.resolve(r, a, "src/features/auth/constants/auth.constants.ts");
3009
+ async function bi(e) {
3010
+ let { postLoginRedirect: t, paths: n, projectRoot: r, slot: i = "frontend" } = e, a = Wr(i, n), o = T.resolve(r, a, "src/features/auth/constants/auth.constants.ts");
3013
3011
  if (!await J(o)) return;
3014
3012
  let s = await y.readFile(o, "utf-8"), c = /export const POST_LOGIN_REDIRECT_PATH = "[^"]*";/;
3015
3013
  if (!c.test(s)) return;
3016
3014
  let l = s.replace(c, `export const POST_LOGIN_REDIRECT_PATH = "${t}";`);
3017
3015
  await y.writeFile(o, l, "utf-8");
3018
3016
  }
3019
- function bi(e) {
3017
+ function xi(e) {
3020
3018
  let t = [e.icon];
3021
3019
  if (e.items) for (let n of e.items) t.includes(n.icon) || t.push(n.icon);
3022
3020
  return t;
3023
3021
  }
3024
- function xi(e, t) {
3025
- let n = bi(t), r = e;
3026
- for (let e of n) r = Si(r, e);
3022
+ function Si(e, t) {
3023
+ let n = xi(t), r = e;
3024
+ for (let e of n) r = Ci(r, e);
3027
3025
  return r;
3028
3026
  }
3029
- function Si(e, t) {
3027
+ function Ci(e, t) {
3030
3028
  let n = e.match(/import \{([^}]+)\} from "lucide-react";/);
3031
3029
  if (!n) return e;
3032
3030
  let r = n[1].split(",").map((e) => e.trim()).filter(Boolean);
@@ -3034,21 +3032,21 @@ function Si(e, t) {
3034
3032
  let i = r.findIndex((e) => e.startsWith("type "));
3035
3033
  return i === -1 ? r.push(t) : r.splice(i, 0, t), e.replace(n[0], `import { ${r.join(", ")} } from "lucide-react";`);
3036
3034
  }
3037
- function Ci(e, t) {
3038
- let n = _i[t.group];
3035
+ function wi(e, t) {
3036
+ let n = vi[t.group];
3039
3037
  if (!n) return e;
3040
- let r = Ti(t), i = RegExp(`export const ${n}: NavEntry\\[\\] = \\[`), a = e.match(i);
3038
+ let r = Ei(t), i = RegExp(`export const ${n}: NavEntry\\[\\] = \\[`), a = e.match(i);
3041
3039
  if (!a) return e;
3042
- let o = e.indexOf(a[0]) + a[0].length, s = wi(e, o - 1);
3040
+ let o = e.indexOf(a[0]) + a[0].length, s = Ti(e, o - 1);
3043
3041
  return s === -1 ? e : e.slice(o, s).trim() === "" ? e.slice(0, o) + "\n" + r + "\n" + e.slice(o) : e.slice(0, o) + "\n" + r + e.slice(o);
3044
3042
  }
3045
- function wi(e, t) {
3043
+ function Ti(e, t) {
3046
3044
  let n = 0;
3047
3045
  for (let r = t; r < e.length; r++) if (e[r] === "[") n++;
3048
3046
  else if (e[r] === "]" && (n--, n === 0)) return r;
3049
3047
  return -1;
3050
3048
  }
3051
- function Ti(e) {
3049
+ function Ei(e) {
3052
3050
  let t = [];
3053
3051
  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) {
3054
3052
  t.push(" items: [");
@@ -3064,14 +3062,14 @@ function Ti(e) {
3064
3062
  } else t.push(" items: [],");
3065
3063
  return t.push(" },"), t.join("\n");
3066
3064
  }
3067
- async function Ei(e, t, n) {
3065
+ async function Di(e, t, n) {
3068
3066
  let r = X("{{backend.features}}", t), i = T.resolve(n, r, "organizations/modules/setup-organization/steps/index.ts");
3069
3067
  if (!await J(i)) return;
3070
3068
  let a = await y.readFile(i, "utf-8");
3071
- for (let t of e) a.includes(`from "${t.from}"`) || (a = Di(a, t), a = Oi(a, t));
3069
+ for (let t of e) a.includes(`from "${t.from}"`) || (a = Oi(a, t), a = ki(a, t));
3072
3070
  await y.writeFile(i, a, "utf-8");
3073
3071
  }
3074
- function Di(e, t) {
3072
+ function Oi(e, t) {
3075
3073
  let n = `import { ${t.import} } from "${t.from}";`, r = e.lastIndexOf("import ");
3076
3074
  if (r !== -1) {
3077
3075
  let t = e.indexOf("\n", e.indexOf(";", r));
@@ -3079,38 +3077,38 @@ function Di(e, t) {
3079
3077
  }
3080
3078
  return e.indexOf("type "), n + "\n\n" + e;
3081
3079
  }
3082
- function Oi(e, t) {
3080
+ function ki(e, t) {
3083
3081
  let n = ` { id: "${t.id}", execute: (ctx) => ${t.import}(ctx) },`, r = e.match(/export const steps:\s*Step\[\]\s*=\s*\[/);
3084
3082
  if (!r) return e;
3085
- let i = e.indexOf(r[0]) + r[0].length, a = ki(e, i - 1);
3083
+ let i = e.indexOf(r[0]) + r[0].length, a = Ai(e, i - 1);
3086
3084
  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);
3087
3085
  }
3088
- function ki(e, t) {
3086
+ function Ai(e, t) {
3089
3087
  let n = 0;
3090
3088
  for (let r = t; r < e.length; r++) if (e[r] === "[") n++;
3091
3089
  else if (e[r] === "]" && (n--, n === 0)) return r;
3092
3090
  return -1;
3093
3091
  }
3094
- var Ai = "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";
3095
- async function ji(e) {
3096
- await Ni({
3092
+ var ji = "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";
3093
+ async function Mi(e) {
3094
+ await Pi({
3097
3095
  ...e,
3098
3096
  arrayName: "navbarActions"
3099
3097
  });
3100
3098
  }
3101
- async function Mi(e) {
3102
- await Ni({
3099
+ async function Ni(e) {
3100
+ await Pi({
3103
3101
  ...e,
3104
3102
  arrayName: "userMenuActions"
3105
3103
  });
3106
3104
  }
3107
- async function Ni({ actions: e, arrayName: t, paths: n, projectRoot: r, slot: i }) {
3108
- let a = Ur(i, n), o = T.resolve(r, a, "src/constants/navbar-actions.tsx"), s;
3109
- await J(o) ? s = await y.readFile(o, "utf-8") : (await y.mkdir(T.dirname(o), { recursive: !0 }), s = Ai);
3110
- for (let n of e) s = Pi(s, n), s = Fi(s, n, t);
3105
+ async function Pi({ actions: e, arrayName: t, paths: n, projectRoot: r, slot: i }) {
3106
+ let a = Wr(i, n), o = T.resolve(r, a, "src/constants/navbar-actions.tsx"), s;
3107
+ await J(o) ? s = await y.readFile(o, "utf-8") : (await y.mkdir(T.dirname(o), { recursive: !0 }), s = ji);
3108
+ for (let n of e) s = Fi(s, n), s = Ii(s, n, t);
3111
3109
  await y.writeFile(o, s, "utf-8");
3112
3110
  }
3113
- function Pi(e, t) {
3111
+ function Fi(e, t) {
3114
3112
  let n = `import { ${t.import} } from "${t.from}";`;
3115
3113
  if (e.includes(n)) return e;
3116
3114
  let r = e.lastIndexOf("import ");
@@ -3118,38 +3116,38 @@ function Pi(e, t) {
3118
3116
  let i = e.indexOf("\n", r);
3119
3117
  return i === -1 ? e + "\n" + n : e.slice(0, i + 1) + n + "\n" + e.slice(i + 1);
3120
3118
  }
3121
- function Fi(e, t, n) {
3119
+ function Ii(e, t, n) {
3122
3120
  let r = e.match(RegExp(`export const ${n}:\\s*NavbarAction\\[\\]\\s*=\\s*\\[`));
3123
3121
  if (!r) return e;
3124
- let i = e.indexOf(r[0]) + r[0].length, a = Ii(e, i - 1);
3122
+ let i = e.indexOf(r[0]) + r[0].length, a = Li(e, i - 1);
3125
3123
  if (a === -1) return e;
3126
3124
  let o = e.slice(i, a);
3127
3125
  if (o.includes(`id: "${t.id}"`)) return e;
3128
3126
  let s = ` { id: "${t.id}", component: ${t.import} },`;
3129
3127
  return o.trim() === "" ? e.slice(0, a) + "\n" + s + "\n" + e.slice(a) : e.slice(0, a) + s + "\n" + e.slice(a);
3130
3128
  }
3131
- function Ii(e, t) {
3129
+ function Li(e, t) {
3132
3130
  let n = 0;
3133
3131
  for (let r = t; r < e.length; r++) if (e[r] === "[") n++;
3134
3132
  else if (e[r] === "]" && (n--, n === 0)) return r;
3135
3133
  return -1;
3136
3134
  }
3137
- var Li = new Set([
3135
+ var Ri = new Set([
3138
3136
  ".ts",
3139
3137
  ".tsx",
3140
3138
  ".js",
3141
3139
  ".jsx"
3142
3140
  ]);
3143
- async function Ri(e) {
3141
+ async function zi(e) {
3144
3142
  let { files: t, paths: n, projectRoot: r, projectName: i } = e;
3145
3143
  if (i === "hype-stack") return;
3146
3144
  let a = `@${i}/`;
3147
3145
  await Promise.all(t.map(async (e) => {
3148
- let t = Lr(e.target, n, r), i = await y.stat(t).catch(() => null);
3149
- i?.isDirectory() ? await Vi(t, a) : i?.isFile() && Li.has(T.extname(t)) && await Hi(t, a);
3146
+ let t = Ir(e.target, n, r), i = await y.stat(t).catch(() => null);
3147
+ i?.isDirectory() ? await Hi(t, a) : i?.isFile() && Ri.has(T.extname(t)) && await Ui(t, a);
3150
3148
  }));
3151
3149
  }
3152
- var zi = new Set([
3150
+ var Bi = new Set([
3153
3151
  ".git",
3154
3152
  "node_modules",
3155
3153
  "dist",
@@ -3158,43 +3156,43 @@ var zi = new Set([
3158
3156
  ".next",
3159
3157
  "coverage"
3160
3158
  ]);
3161
- async function Bi(e, t) {
3162
- t !== "hype-stack" && await Vi(e, `@${t}/`);
3163
- }
3164
3159
  async function Vi(e, t) {
3160
+ t !== "hype-stack" && await Hi(e, `@${t}/`);
3161
+ }
3162
+ async function Hi(e, t) {
3165
3163
  let n = await y.readdir(e, { withFileTypes: !0 });
3166
3164
  await Promise.all(n.map(async (n) => {
3167
3165
  let r = T.join(e, n.name);
3168
3166
  if (n.isDirectory()) {
3169
- if (zi.has(n.name)) return;
3170
- await Vi(r, t);
3171
- } else n.isFile() && Li.has(T.extname(n.name)) && await Hi(r, t);
3167
+ if (Bi.has(n.name)) return;
3168
+ await Hi(r, t);
3169
+ } else n.isFile() && Ri.has(T.extname(n.name)) && await Ui(r, t);
3172
3170
  }));
3173
3171
  }
3174
- async function Hi(e, t) {
3172
+ async function Ui(e, t) {
3175
3173
  let n = await y.readFile(e, "utf-8");
3176
- if (!n.includes(Hr)) return;
3177
- let r = n.replaceAll(Hr, t);
3178
- await y.writeFile(e, r, "utf-8");
3174
+ if (!n.includes(Vr)) return;
3175
+ let r = Ur(n, t);
3176
+ r !== n && await y.writeFile(e, r, "utf-8");
3179
3177
  }
3180
3178
  //#endregion
3181
3179
  //#region src/core/installer.ts
3182
- function Ui(e, t) {
3180
+ function Wi(e, t) {
3183
3181
  return e.slot ? t ? t.includes(e.slot) : e.slot === "frontend" : !0;
3184
3182
  }
3185
- async function Wi(e, t) {
3183
+ async function Gi(e, t) {
3186
3184
  if ((await y.stat(e)).isDirectory()) {
3187
3185
  await y.mkdir(t, { recursive: !0 });
3188
3186
  let n = await y.readdir(e, { withFileTypes: !0 });
3189
- for (let r of n) await Wi(T.join(e, r.name), T.join(t, r.name));
3187
+ for (let r of n) await Gi(T.join(e, r.name), T.join(t, r.name));
3190
3188
  } else await y.mkdir(T.dirname(t), { recursive: !0 }), await y.copyFile(e, t);
3191
3189
  }
3192
- async function Gi(e) {
3190
+ async function Ki(e) {
3193
3191
  let { src: t, dest: n, projectRoot: r, skip: i } = e;
3194
3192
  if ((await y.stat(t)).isDirectory()) {
3195
3193
  await y.mkdir(n, { recursive: !0 });
3196
3194
  let e = await y.readdir(t, { withFileTypes: !0 });
3197
- return (await Promise.all(e.map((e) => Gi({
3195
+ return (await Promise.all(e.map((e) => Ki({
3198
3196
  src: T.join(t, e.name),
3199
3197
  dest: T.join(n, e.name),
3200
3198
  projectRoot: r,
@@ -3203,8 +3201,8 @@ async function Gi(e) {
3203
3201
  }
3204
3202
  return i.has(t) ? [] : (await y.mkdir(T.dirname(n), { recursive: !0 }), await y.copyFile(t, n), [T.relative(r, n)]);
3205
3203
  }
3206
- async function Ki(e) {
3207
- let { file: t, packDir: n, paths: r, projectRoot: i } = e, a = Rr(t.source, n), o = Lr(t.target, r, i);
3204
+ async function qi(e) {
3205
+ let { file: t, packDir: n, paths: r, projectRoot: i } = e, a = Lr(t.source, n), o = Ir(t.target, r, i);
3208
3206
  return {
3209
3207
  sourcePath: a,
3210
3208
  targetPath: o,
@@ -3212,8 +3210,8 @@ async function Ki(e) {
3212
3210
  targetExists: await J(o) || await ar(o)
3213
3211
  };
3214
3212
  }
3215
- async function qi(e) {
3216
- let { file: t, packDir: n, paths: r, projectRoot: i } = e, { sourcePath: a, targetPath: o, sourceExists: s, targetExists: c } = await Ki({
3213
+ async function Ji(e) {
3214
+ let { file: t, packDir: n, paths: r, projectRoot: i } = e, { sourcePath: a, targetPath: o, sourceExists: s, targetExists: c } = await qi({
3217
3215
  file: t,
3218
3216
  packDir: n,
3219
3217
  paths: r,
@@ -3228,8 +3226,8 @@ async function qi(e) {
3228
3226
  default: return `${t.target}: Unknown strategy: ${String(t.strategy)}`;
3229
3227
  }
3230
3228
  }
3231
- async function Ji(e) {
3232
- let { file: t, packDir: n, paths: r, projectRoot: i, force: a, overwrite: o } = e, { sourcePath: s, targetPath: c, sourceExists: l, targetExists: u } = await Ki({
3229
+ async function Yi(e) {
3230
+ let { file: t, packDir: n, paths: r, projectRoot: i, force: a, overwrite: o } = e, { sourcePath: s, targetPath: c, sourceExists: l, targetExists: u } = await qi({
3233
3231
  file: t,
3234
3232
  packDir: n,
3235
3233
  paths: r,
@@ -3247,7 +3245,7 @@ async function Ji(e) {
3247
3245
  status: "skipped",
3248
3246
  path: t.target,
3249
3247
  reason: "Already exists"
3250
- } : (await Wi(s, c), {
3248
+ } : (await Gi(s, c), {
3251
3249
  status: "installed",
3252
3250
  path: t.target
3253
3251
  });
@@ -3256,16 +3254,16 @@ async function Ji(e) {
3256
3254
  status: "skipped",
3257
3255
  path: t.target,
3258
3256
  reason: "Already exists (skip-if-exists)"
3259
- } : (await Wi(s, c), {
3257
+ } : (await Gi(s, c), {
3260
3258
  status: "installed",
3261
3259
  path: t.target
3262
3260
  });
3263
- case "override": return await Wi(s, c), {
3261
+ case "override": return await Gi(s, c), {
3264
3262
  status: "installed",
3265
3263
  path: t.target
3266
3264
  };
3267
3265
  case "merge": {
3268
- if (!u) return await Wi(s, c), {
3266
+ if (!u) return await Gi(s, c), {
3269
3267
  status: "installed",
3270
3268
  path: t.target
3271
3269
  };
@@ -3295,15 +3293,15 @@ async function Ji(e) {
3295
3293
  };
3296
3294
  }
3297
3295
  }
3298
- async function Yi(e) {
3296
+ async function Xi(e) {
3299
3297
  let { packs: t, config: n, projectRoot: r, slotsByPack: i } = e, a = n.paths;
3300
3298
  if (!a) throw Error("stack.json is missing 'paths' configuration. Run 'npx @hype-stack/cli init' to set it up.");
3301
3299
  let o = [], s = /* @__PURE__ */ new Set();
3302
3300
  for (let e of t) {
3303
3301
  let t = i?.get(e.manifest.name);
3304
3302
  for (let n of e.manifest.files) {
3305
- if (n.strategy !== "create" || !Ui(n, t)) continue;
3306
- let { targetPath: i, targetExists: c } = await Ki({
3303
+ if (n.strategy !== "create" || !Wi(n, t)) continue;
3304
+ let { targetPath: i, targetExists: c } = await qi({
3307
3305
  file: n,
3308
3306
  packDir: e.packDir,
3309
3307
  paths: a,
@@ -3318,13 +3316,13 @@ async function Yi(e) {
3318
3316
  }
3319
3317
  return o;
3320
3318
  }
3321
- async function Xi(e) {
3319
+ async function Zi(e) {
3322
3320
  let { manifest: t, config: n, projectRoot: r, force: i, packDir: a, slots: o } = e, s = n.paths;
3323
3321
  if (!s) throw Error("stack.json is missing 'paths' configuration. Run 'npx @hype-stack/cli init' to set it up.");
3324
3322
  let c = [];
3325
3323
  for (let e of t.files) {
3326
- if (!Ui(e, o)) continue;
3327
- let t = await qi({
3324
+ if (!Wi(e, o)) continue;
3325
+ let t = await Ji({
3328
3326
  file: e,
3329
3327
  packDir: a,
3330
3328
  paths: s,
@@ -3335,16 +3333,16 @@ async function Xi(e) {
3335
3333
  }
3336
3334
  return c;
3337
3335
  }
3338
- async function Zi(e) {
3336
+ async function Qi(e) {
3339
3337
  let { manifest: t, config: n, projectRoot: r, force: i, overwrite: a, packDir: o, slots: s } = e, c = n.paths;
3340
3338
  if (!c) throw Error("stack.json is missing 'paths' configuration. Run 'npx @hype-stack/cli init' to set it up.");
3341
3339
  let l = {
3342
3340
  installed: [],
3343
3341
  skipped: [],
3344
3342
  errors: []
3345
- }, u = t.files.filter((e) => Ui(e, s));
3343
+ }, u = t.files.filter((e) => Wi(e, s));
3346
3344
  for (let e of u) {
3347
- let t = await Ji({
3345
+ let t = await Yi({
3348
3346
  file: e,
3349
3347
  packDir: o,
3350
3348
  paths: c,
@@ -3364,40 +3362,40 @@ async function Zi(e) {
3364
3362
  break;
3365
3363
  }
3366
3364
  }
3367
- await Ri({
3365
+ await zi({
3368
3366
  files: u,
3369
3367
  paths: c,
3370
3368
  projectRoot: r,
3371
3369
  projectName: n.name
3372
- }), t.env && t.env.length > 0 && await Wr(t.env, c, r), t.routes && t.routes.length > 0 && await Xr(t.routes, c, r), t.context && t.context.length > 0 && await $r(t.context, c, r), t.sockets && t.sockets.length > 0 && await si(t.sockets, c, r), t.sdkConfigurations && t.sdkConfigurations.length > 0 && await di(t.sdkConfigurations, c, r), t.enums && t.enums.length > 0 && await ai(t.enums, c, r), t.frontendRoutes && t.frontendRoutes.length > 0 && await mi(t.frontendRoutes, c, r);
3370
+ }), t.env && t.env.length > 0 && await Gr(t.env, c, r), t.routes && t.routes.length > 0 && await Zr(t.routes, c, r), t.context && t.context.length > 0 && await ei(t.context, c, r), t.sockets && t.sockets.length > 0 && await ci(t.sockets, c, r), t.sdkConfigurations && t.sdkConfigurations.length > 0 && await fi(t.sdkConfigurations, c, r), t.enums && t.enums.length > 0 && await oi(t.enums, c, r), t.frontendRoutes && t.frontendRoutes.length > 0 && await hi(t.frontendRoutes, c, r);
3373
3371
  let d = s && s.length > 0 ? s : ["frontend"];
3374
- for (let e of d) t.nav && t.nav.length > 0 && await vi({
3372
+ for (let e of d) t.nav && t.nav.length > 0 && await yi({
3375
3373
  entries: t.nav,
3376
3374
  paths: c,
3377
3375
  projectRoot: r,
3378
3376
  slot: e
3379
- }), t.navbarActions && t.navbarActions.length > 0 && await ji({
3377
+ }), t.navbarActions && t.navbarActions.length > 0 && await Mi({
3380
3378
  actions: t.navbarActions,
3381
3379
  paths: c,
3382
3380
  projectRoot: r,
3383
3381
  slot: e
3384
- }), t.userMenuActions && t.userMenuActions.length > 0 && await Mi({
3382
+ }), t.userMenuActions && t.userMenuActions.length > 0 && await Ni({
3385
3383
  actions: t.userMenuActions,
3386
3384
  paths: c,
3387
3385
  projectRoot: r,
3388
3386
  slot: e
3389
3387
  });
3390
- return t.onboardingSteps && t.onboardingSteps.length > 0 && await Ei(t.onboardingSteps, c, r), t.postLoginRedirect && await yi({
3388
+ return t.onboardingSteps && t.onboardingSteps.length > 0 && await Di(t.onboardingSteps, c, r), t.postLoginRedirect && await bi({
3391
3389
  postLoginRedirect: t.postLoginRedirect,
3392
3390
  paths: c,
3393
3391
  projectRoot: r,
3394
3392
  slot: d[0]
3395
3393
  }), l;
3396
3394
  }
3397
- async function Qi(e) {
3395
+ async function $i(e) {
3398
3396
  let { packs: t, config: n, projectRoot: r, force: i, overwrite: a, slotsByPack: o } = e, s = [];
3399
3397
  for (let e of t) {
3400
- let t = o?.get(e.manifest.name), a = await Xi({
3398
+ let t = o?.get(e.manifest.name), a = await Zi({
3401
3399
  manifest: e.manifest,
3402
3400
  config: n,
3403
3401
  projectRoot: r,
@@ -3417,7 +3415,7 @@ async function Qi(e) {
3417
3415
  };
3418
3416
  let c = [], l = [], u = [], d = [], f = n;
3419
3417
  for (let e of t) {
3420
- let t = o?.get(e.manifest.name), n = await Zi({
3418
+ let t = o?.get(e.manifest.name), n = await Qi({
3421
3419
  manifest: e.manifest,
3422
3420
  config: f,
3423
3421
  projectRoot: r,
@@ -3426,7 +3424,7 @@ async function Qi(e) {
3426
3424
  packDir: e.packDir,
3427
3425
  slots: t
3428
3426
  });
3429
- c.push(...n.installed), l.push(...n.skipped), u.push(...n.errors), f = await $i(f, e.manifest, r), d.push(e.manifest.name);
3427
+ c.push(...n.installed), l.push(...n.skipped), u.push(...n.errors), f = await ea(f, e.manifest, r), d.push(e.manifest.name);
3430
3428
  }
3431
3429
  return {
3432
3430
  installed: c,
@@ -3437,8 +3435,8 @@ async function Qi(e) {
3437
3435
  config: f
3438
3436
  };
3439
3437
  }
3440
- async function $i(e, t, n) {
3441
- let r = typeof t == "string" ? t : t.name, i = typeof t == "string" ? [] : wr(t.env), a = Tr([...e.onboarding?.envSections ?? [], ...i]), o = {
3438
+ async function ea(e, t, n) {
3439
+ let r = typeof t == "string" ? t : t.name, i = typeof t == "string" ? [] : Cr(t.env), a = wr([...e.onboarding?.envSections ?? [], ...i]), o = {
3442
3440
  ...e,
3443
3441
  installedPacks: [...e.installedPacks ?? [], r],
3444
3442
  onboarding: {
@@ -3446,19 +3444,19 @@ async function $i(e, t, n) {
3446
3444
  envSections: a
3447
3445
  }
3448
3446
  };
3449
- return await Ar(n, o), o;
3447
+ return await kr(n, o), o;
3450
3448
  }
3451
- async function ea(e) {
3449
+ async function ta(e) {
3452
3450
  let { manifest: t, config: n, projectRoot: r, templateDir: i } = e, a = n.paths;
3453
3451
  if (!a) throw Error("stack.json is missing 'paths' configuration. Run 'npx @hype-stack/cli init' to set it up.");
3454
- let o = [], s = [], c = t.files.filter((e) => e.strategy === "merge"), l = new Set(c.map((e) => Rr(e.source, i))), u = T.join(i, "files");
3452
+ let o = [], s = [], c = t.files.filter((e) => e.strategy === "merge"), l = new Set(c.map((e) => Lr(e.source, i))), u = T.join(i, "files");
3455
3453
  if (await ar(u)) {
3456
3454
  let e = await y.readdir(u, { withFileTypes: !0 });
3457
3455
  for (let t of e) {
3458
3456
  if (!t.isDirectory()) continue;
3459
3457
  let e = a[t.name]?.root;
3460
3458
  if (!e) continue;
3461
- let n = await Gi({
3459
+ let n = await Ki({
3462
3460
  src: T.join(u, t.name),
3463
3461
  dest: T.resolve(r, e),
3464
3462
  projectRoot: r,
@@ -3468,7 +3466,7 @@ async function ea(e) {
3468
3466
  }
3469
3467
  }
3470
3468
  for (let e of c) {
3471
- let t = await Ji({
3469
+ let t = await Yi({
3472
3470
  file: e,
3473
3471
  packDir: i,
3474
3472
  paths: a,
@@ -3478,12 +3476,12 @@ async function ea(e) {
3478
3476
  });
3479
3477
  t.status === "installed" ? o.push(t.path) : t.status === "error" && s.push(`${t.path}: ${t.reason}`);
3480
3478
  }
3481
- let d = T.join(Lr("{{frontend.root}}", a, r), "src", "routes"), f = T.join(d, "(public)", "index.tsx"), p = T.join(d, "(private)", "index.tsx");
3482
- return await J(f) && await J(p) && await y.rm(p, { force: !0 }), t.frontendRoutes && t.frontendRoutes.length > 0 && await mi(t.frontendRoutes, a, r), t.nav && t.nav.length > 0 && await vi({
3479
+ let d = T.join(Ir("{{frontend.root}}", a, r), "src", "routes"), f = T.join(d, "(public)", "index.tsx"), p = T.join(d, "(private)", "index.tsx");
3480
+ return await J(f) && await J(p) && await y.rm(p, { force: !0 }), t.frontendRoutes && t.frontendRoutes.length > 0 && await hi(t.frontendRoutes, a, r), t.nav && t.nav.length > 0 && await yi({
3483
3481
  entries: t.nav,
3484
3482
  paths: a,
3485
3483
  projectRoot: r
3486
- }), t.postLoginRedirect && await yi({
3484
+ }), t.postLoginRedirect && await bi({
3487
3485
  postLoginRedirect: t.postLoginRedirect,
3488
3486
  paths: a,
3489
3487
  projectRoot: r
@@ -3494,32 +3492,32 @@ async function ea(e) {
3494
3492
  }
3495
3493
  //#endregion
3496
3494
  //#region src/core/pack-categories.ts
3497
- var ta = [
3495
+ var na = [
3498
3496
  "starter",
3499
3497
  "layout",
3500
3498
  "feature"
3501
- ], na = {
3499
+ ], ra = {
3502
3500
  starter: "Starter",
3503
3501
  layout: "Layout",
3504
3502
  feature: "Features"
3505
- }, ra = new Set(["starter", "layout"]), ia = "starter-saas-betterauth", aa = "layout-basic";
3506
- function oa(e, t = {}) {
3503
+ }, ia = new Set(["starter", "layout"]), aa = "starter-saas-betterauth", oa = "layout-basic";
3504
+ function sa(e, t = {}) {
3507
3505
  let n = [];
3508
- for (let r of ta) {
3506
+ for (let r of na) {
3509
3507
  let i = e.filter((e) => e.category === r);
3510
3508
  if (i.length === 0) continue;
3511
- let a = ra.has(r) ? "single" : "multiple";
3509
+ let a = ia.has(r) ? "single" : "multiple";
3512
3510
  if (r === "layout") {
3513
- n.push(ca("frontend", i)), t.adminAvailable && n.push(ca("admin", i));
3511
+ n.push(la("frontend", i)), t.adminAvailable && n.push(la("admin", i));
3514
3512
  continue;
3515
3513
  }
3516
3514
  if (r === "starter") {
3517
- n.push(sa(i));
3515
+ n.push(ca(i));
3518
3516
  continue;
3519
3517
  }
3520
3518
  n.push({
3521
3519
  category: r,
3522
- label: na[r],
3520
+ label: ra[r],
3523
3521
  mode: a,
3524
3522
  packs: i,
3525
3523
  preselect: null
@@ -3527,33 +3525,33 @@ function oa(e, t = {}) {
3527
3525
  }
3528
3526
  return n;
3529
3527
  }
3530
- function sa(e) {
3531
- let t = e.some((e) => e.name === ia);
3528
+ function ca(e) {
3529
+ let t = e.some((e) => e.name === aa);
3532
3530
  return {
3533
3531
  category: "starter",
3534
- label: na.starter,
3532
+ label: ra.starter,
3535
3533
  mode: "single",
3536
3534
  packs: e,
3537
- preselect: t ? ia : null
3535
+ preselect: t ? aa : null
3538
3536
  };
3539
3537
  }
3540
- function ca(e, t) {
3541
- let n = t.some((e) => e.name === aa);
3538
+ function la(e, t) {
3539
+ let n = t.some((e) => e.name === oa);
3542
3540
  return {
3543
3541
  category: "layout",
3544
3542
  label: e === "admin" ? "Admin Layout" : "Layout",
3545
3543
  mode: "single",
3546
3544
  packs: t,
3547
- preselect: n ? aa : null,
3545
+ preselect: n ? oa : null,
3548
3546
  slot: e
3549
3547
  };
3550
3548
  }
3551
3549
  //#endregion
3552
3550
  //#region src/ui/logger.ts
3553
- var la = [he.orangeBright, he.skyBlue];
3554
- function ua(e) {
3551
+ var ua = [he.orangeBright, he.skyBlue];
3552
+ function da(e) {
3555
3553
  let t = e.map((e, t) => {
3556
- let n = la[t % la.length];
3554
+ let n = ua[t % ua.length];
3557
3555
  return `${z.bold(n(`${t + 1}.`))} ${z.bold(e)}`;
3558
3556
  }).join("\n");
3559
3557
  s.note(t, "Next steps");
@@ -3563,13 +3561,13 @@ function Z() {
3563
3561
  }
3564
3562
  //#endregion
3565
3563
  //#region src/core/post-setup.ts
3566
- async function da() {
3564
+ async function fa() {
3567
3565
  return (await q("docker", ["info"], { cwd: process.cwd() })).exitCode === 0;
3568
3566
  }
3569
- async function fa(e) {
3567
+ async function pa(e) {
3570
3568
  return J(`${e}/apps/backend/.env`);
3571
3569
  }
3572
- async function pa(e, t, n) {
3570
+ async function ma(e, t, n) {
3573
3571
  let r = n ? `Start services with ${z.command("docker compose up -d")}?` : `Docker is not running. Start services with ${z.command("docker compose up -d")}?`, i = t ? !0 : await s.confirm({
3574
3572
  message: r,
3575
3573
  initialValue: !0
@@ -3582,13 +3580,13 @@ async function pa(e, t, n) {
3582
3580
  "up",
3583
3581
  "-d"
3584
3582
  ], { cwd: `${e}/apps/backend` });
3585
- return o.exitCode === 0 ? (a.stop(z.success("Docker services started")), !0) : (a.error("Failed to start Docker services"), ma(o), !1);
3583
+ return o.exitCode === 0 ? (a.stop(z.success("Docker services started")), !0) : (a.error("Failed to start Docker services"), ha(o), !1);
3586
3584
  }
3587
- function ma(e) {
3585
+ function ha(e) {
3588
3586
  let t = (e.stderr || e.stdout).trim();
3589
3587
  t && s.log.warn(z.muted(t));
3590
3588
  }
3591
- async function ha(e, t = 15, n = 2e3) {
3589
+ async function ga(e, t = 15, n = 2e3) {
3592
3590
  for (let r = 0; r < t; r++) {
3593
3591
  if ((await q("docker", [
3594
3592
  "compose",
@@ -3603,8 +3601,8 @@ async function ha(e, t = 15, n = 2e3) {
3603
3601
  }
3604
3602
  return !1;
3605
3603
  }
3606
- var ga = "Database schema is up to date";
3607
- async function _a(e) {
3604
+ var _a = "Database schema is up to date";
3605
+ async function va(e) {
3608
3606
  let t = await q("pnpm", [
3609
3607
  "--filter",
3610
3608
  "@internal/backend",
@@ -3613,9 +3611,9 @@ async function _a(e) {
3613
3611
  "migrate",
3614
3612
  "status"
3615
3613
  ], { cwd: e });
3616
- return t.exitCode === 0 ? `${t.stdout}\n${t.stderr}`.includes(ga) : !1;
3614
+ return t.exitCode === 0 ? `${t.stdout}\n${t.stderr}`.includes(_a) : !1;
3617
3615
  }
3618
- async function va(e) {
3616
+ async function ya(e) {
3619
3617
  let t = s.spinner();
3620
3618
  t.start("Running database migrations...");
3621
3619
  let n = await q("pnpm", [
@@ -3623,15 +3621,15 @@ async function va(e) {
3623
3621
  "@internal/backend",
3624
3622
  "migration:latest"
3625
3623
  ], { cwd: e });
3626
- return n.exitCode === 0 ? (t.stop(z.success("Database migrations applied")), !0) : (t.error("Migrations failed"), ma(n), s.log.warn(z.muted("Run `pnpm --filter @internal/backend migration:latest` manually to apply migrations.")), !1);
3624
+ return n.exitCode === 0 ? (t.stop(z.success("Database migrations applied")), !0) : (t.error("Migrations failed"), ha(n), s.log.warn(z.muted("Run `pnpm --filter @internal/backend migration:latest` manually to apply migrations.")), !1);
3627
3625
  }
3628
- async function ya(e, t, n = {}) {
3629
- if (!await pa(e, t, await da())) return !1;
3626
+ async function ba(e, t, n = {}) {
3627
+ if (!await ma(e, t, await fa())) return !1;
3630
3628
  let r = s.spinner();
3631
- return r.start("Waiting for Postgres to be ready..."), await ha(e, n.postgresMaxAttempts ?? 15, n.postgresCheckIntervalMs ?? 2e3) ? (r.stop(z.success("Postgres is ready")), !0) : (r.error("Postgres health check timed out"), s.log.warn(z.muted("Run migrations manually once Postgres is ready: pnpm --filter @internal/backend migration:latest")), !1);
3629
+ return r.start("Waiting for Postgres to be ready..."), await ga(e, n.postgresMaxAttempts ?? 15, n.postgresCheckIntervalMs ?? 2e3) ? (r.stop(z.success("Postgres is ready")), !0) : (r.error("Postgres health check timed out"), s.log.warn(z.muted("Run migrations manually once Postgres is ready: pnpm --filter @internal/backend migration:latest")), !1);
3632
3630
  }
3633
- async function ba(e, t, n = {}) {
3634
- if (!await ya(e, t, n)) return;
3631
+ async function xa(e, t, n = {}) {
3632
+ if (!await ba(e, t, n)) return;
3635
3633
  let r = t ? !0 : await s.confirm({
3636
3634
  message: `Run database migrations with ${z.command("prisma migrate deploy")}?`,
3637
3635
  initialValue: !0
@@ -3640,21 +3638,21 @@ async function ba(e, t, n = {}) {
3640
3638
  s.log.info(z.muted("Skipping database migrations."));
3641
3639
  return;
3642
3640
  }
3643
- await va(e);
3641
+ await ya(e);
3644
3642
  }
3645
- async function xa(e, t, n = {}) {
3646
- if (!await fa(e)) {
3643
+ async function Sa(e, t, n = {}) {
3644
+ if (!await pa(e)) {
3647
3645
  s.log.warn(`${z.path(".env")} not found in ${z.path("apps/backend")}. Skipping Docker and migrations - configure it first.`);
3648
3646
  return;
3649
3647
  }
3650
- await ba(e, t, n);
3648
+ await xa(e, t, n);
3651
3649
  }
3652
- async function Sa(e, t, n = {}) {
3653
- return await fa(e) ? ya(e, t, n) : (s.log.warn(`${z.path(".env")} not found in ${z.path("apps/backend")}. Skipping Docker - configure it first.`), !1);
3650
+ async function Ca(e, t, n = {}) {
3651
+ return await pa(e) ? ba(e, t, n) : (s.log.warn(`${z.path(".env")} not found in ${z.path("apps/backend")}. Skipping Docker - configure it first.`), !1);
3654
3652
  }
3655
3653
  //#endregion
3656
3654
  //#region src/core/resolve.ts
3657
- function Ca(e) {
3655
+ function wa(e) {
3658
3656
  let t = /* @__PURE__ */ new Map();
3659
3657
  for (let n of e) t.set(n.name, {
3660
3658
  name: n.name,
@@ -3662,7 +3660,7 @@ function Ca(e) {
3662
3660
  });
3663
3661
  return t;
3664
3662
  }
3665
- function wa(e, t, n = /* @__PURE__ */ new Set()) {
3663
+ function Ta(e, t, n = /* @__PURE__ */ new Set()) {
3666
3664
  let r = /* @__PURE__ */ new Set();
3667
3665
  function i(e) {
3668
3666
  if (n.has(e)) return [];
@@ -3676,10 +3674,10 @@ function wa(e, t, n = /* @__PURE__ */ new Set()) {
3676
3674
  }
3677
3675
  return i(e);
3678
3676
  }
3679
- function Ta(e, t, n = []) {
3677
+ function Ea(e, t, n = []) {
3680
3678
  let r = new Set(n), i = new Set(n), a = [];
3681
3679
  for (let n of e) {
3682
- let e = wa(n, t, new Set(i));
3680
+ let e = Ta(n, t, new Set(i));
3683
3681
  for (let t of e) i.has(t) || (i.add(t), a.push(t));
3684
3682
  }
3685
3683
  return {
@@ -3687,7 +3685,7 @@ function Ta(e, t, n = []) {
3687
3685
  alreadyInstalled: e.filter((e) => r.has(e))
3688
3686
  };
3689
3687
  }
3690
- function Ea(e) {
3688
+ function Da(e) {
3691
3689
  let { order: t, graph: n, isLocked: r, installed: i = [] } = e, a = new Set(i), o = /* @__PURE__ */ new Set();
3692
3690
  for (let e of t) {
3693
3691
  let t = n.get(e)?.dependencies.some((e) => !a.has(e) && o.has(e)) ?? !1;
@@ -3700,7 +3698,7 @@ function Ea(e) {
3700
3698
  }
3701
3699
  //#endregion
3702
3700
  //#region src/core/variants.ts
3703
- function Da(e, t = {}) {
3701
+ function Oa(e, t = {}) {
3704
3702
  let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map();
3705
3703
  for (let i of e) {
3706
3704
  let e = t[i.family] ?? i.default;
@@ -3712,14 +3710,14 @@ function Da(e, t = {}) {
3712
3710
  familyOf: r
3713
3711
  };
3714
3712
  }
3715
- function Oa(e, t, n) {
3713
+ function ka(e, t, n) {
3716
3714
  return [...e.map((e) => n.chosen.get(e.family) ?? e.default), ...t];
3717
3715
  }
3718
- function ka(e, t) {
3716
+ function Aa(e, t) {
3719
3717
  let n = t.familyOf.get(e);
3720
3718
  return n ? t.chosen.get(n) ?? e : e;
3721
3719
  }
3722
- function Aa(e, t) {
3720
+ function ja(e, t) {
3723
3721
  let n = /* @__PURE__ */ new Map();
3724
3722
  for (let t of e) t.family && n.set(t.name, t.family);
3725
3723
  let r = new Set(t), i = /* @__PURE__ */ new Map();
@@ -3735,65 +3733,65 @@ function Aa(e, t) {
3735
3733
  familyOf: n
3736
3734
  };
3737
3735
  }
3738
- function ja(e, t) {
3736
+ function Ma(e, t) {
3739
3737
  return e.map((e) => ({
3740
3738
  ...e,
3741
- dependencies: e.dependencies.map((e) => ka(e, t))
3739
+ dependencies: e.dependencies.map((e) => Aa(e, t))
3742
3740
  }));
3743
3741
  }
3744
3742
  //#endregion
3745
3743
  //#region src/ui/banner.ts
3746
- var Ma = [
3744
+ var Na = [
3747
3745
  " ██╗ ██╗ ██╗ ██╗ ██████╗ ███████╗",
3748
3746
  " ██║ ██║ ╚██╗ ██╔╝ ██╔══██╗ ██╔════╝",
3749
3747
  " ███████║ ╚████╔╝ ██████╔╝ █████╗ ",
3750
3748
  " ██╔══██║ ╚██╔╝ ██╔═══╝ ██╔══╝ ",
3751
3749
  " ██║ ██║ ██║ ██║ ███████╗",
3752
3750
  " ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝"
3753
- ], Na = [
3751
+ ], Pa = [
3754
3752
  " ███████╗ ████████╗ █████╗ ██████╗ ██╗ ██╗",
3755
3753
  " ██╔════╝ ╚══██╔══╝ ██╔══██╗ ██╔════╝ ██║ ██╔╝",
3756
3754
  " ███████╗ ██║ ███████║ ██║ █████╔╝ ",
3757
3755
  " ╚════██║ ██║ ██╔══██║ ██║ ██╔═██╗ ",
3758
3756
  " ███████║ ██║ ██║ ██║ ╚██████╗ ██║ ██╗",
3759
3757
  " ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝"
3760
- ], Pa = [
3758
+ ], Fa = [
3761
3759
  253,
3762
3760
  176,
3763
3761
  21
3764
- ], Fa = [
3762
+ ], Ia = [
3765
3763
  245,
3766
3764
  76,
3767
3765
  2
3768
- ], Ia = 5, La = [
3766
+ ], La = 5, Ra = [
3769
3767
  17,
3770
3768
  103,
3771
3769
  248
3772
- ], Ra = [
3770
+ ], za = [
3773
3771
  42,
3774
3772
  160,
3775
3773
  250
3776
- ], za = .2;
3777
- function Ba() {
3774
+ ], Ba = .2;
3775
+ function Va() {
3778
3776
  console.log();
3779
- for (let e of be(Ma, {
3780
- start: Pa,
3781
- end: Fa,
3782
- angle: Ia
3783
- })) console.log(b.bold(e));
3784
3777
  for (let e of be(Na, {
3785
- start: La,
3786
- end: Ra,
3787
- angle: za
3778
+ start: Fa,
3779
+ end: Ia,
3780
+ angle: La
3781
+ })) console.log(b.bold(e));
3782
+ for (let e of be(Pa, {
3783
+ start: Ra,
3784
+ end: za,
3785
+ angle: Ba
3788
3786
  })) console.log(b.bold(e));
3789
3787
  console.log(), console.log(` ${B.spark} ${b.dim("v" + A)} ${b.dim("·")} ${ve("Ship web + desktop apps from one codebase")}`), console.log();
3790
3788
  }
3791
- function Va() {
3789
+ function Ha() {
3792
3790
  console.log(), console.log(` ${B.bolt} ${he.orange("Hype")}${he.skyBlue("Stack")} ${b.dim("v" + A)}`), console.log();
3793
3791
  }
3794
3792
  //#endregion
3795
3793
  //#region src/ui/pack-multiselect.ts
3796
- var Ha = class extends O {
3794
+ var Ua = class extends O {
3797
3795
  options;
3798
3796
  cursor = 0;
3799
3797
  selected;
@@ -3897,44 +3895,44 @@ var Ha = class extends O {
3897
3895
  }
3898
3896
  }
3899
3897
  };
3900
- function Ua(e) {
3901
- return new Ha(e).prompt();
3898
+ function Wa(e) {
3899
+ return new Ua(e).prompt();
3902
3900
  }
3903
3901
  //#endregion
3904
3902
  //#region src/utils/naming.ts
3905
- function Wa(e) {
3903
+ function Ga(e) {
3906
3904
  return e.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
3907
3905
  }
3908
- function Ga(e) {
3906
+ function Ka(e) {
3909
3907
  return e.split(/[-_]/).filter(Boolean).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(" ");
3910
3908
  }
3911
3909
  //#endregion
3912
3910
  //#region src/utils/validate.ts
3913
- function Ka(e) {
3911
+ function qa(e) {
3914
3912
  if (!e.trim()) return "Project name cannot be empty";
3915
3913
  if (e.length > 214) return "Project name is too long (max 214 characters)";
3916
- let t = Wa(e);
3914
+ let t = Ga(e);
3917
3915
  if (!re.test(t)) return "Project name must contain at least one letter or number";
3918
3916
  }
3919
3917
  //#endregion
3920
3918
  //#region src/core/apply-mode.ts
3921
- var qa = "src/hooks/use-theme.ts", Ja = /(\bexport\s+const\s+defaultTheme\s*=\s*)(["'])(?:light|dark)\2/;
3922
- function Ya(e, t) {
3923
- return e.replace(Ja, (e, n, r) => `${n}${r}${t}${r}`);
3919
+ var Ja = "src/hooks/use-theme.ts", Ya = /(\bexport\s+const\s+defaultTheme\s*=\s*)(["'])(?:light|dark)\2/;
3920
+ function Xa(e, t) {
3921
+ return e.replace(Ya, (e, n, r) => `${n}${r}${t}${r}`);
3924
3922
  }
3925
- async function Xa(e, t) {
3926
- let n = T.resolve(e, qa), r;
3923
+ async function Za(e, t) {
3924
+ let n = T.resolve(e, Ja), r;
3927
3925
  try {
3928
3926
  r = await y.readFile(n, "utf-8");
3929
3927
  } catch {
3930
3928
  return !1;
3931
3929
  }
3932
- let i = Ya(r, t);
3930
+ let i = Xa(r, t);
3933
3931
  return i === r || await y.writeFile(n, i, "utf-8"), !0;
3934
3932
  }
3935
3933
  //#endregion
3936
3934
  //#region src/core/apply-theme.ts
3937
- function Za(e, t) {
3935
+ function Qa(e, t) {
3938
3936
  let n = 0;
3939
3937
  for (; n < e.length;) {
3940
3938
  let r = e.indexOf(t, n);
@@ -3957,46 +3955,46 @@ function Za(e, t) {
3957
3955
  }
3958
3956
  return null;
3959
3957
  }
3960
- function Qa(e, t) {
3958
+ function $a(e, t) {
3961
3959
  let n = e;
3962
3960
  for (let [e, r] of Object.entries(t)) {
3963
- let t = RegExp(`(^[ \\t]*--${$a(e)}[ \\t]*:[ \\t]*)([^;\\n]*);`, "m");
3961
+ let t = RegExp(`(^[ \\t]*--${eo(e)}[ \\t]*:[ \\t]*)([^;\\n]*);`, "m");
3964
3962
  n = n.replace(t, (e, t) => `${t}${r};`);
3965
3963
  }
3966
3964
  return n;
3967
3965
  }
3968
- function $a(e) {
3966
+ function eo(e) {
3969
3967
  return e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
3970
3968
  }
3971
- function eo(e, t) {
3972
- let n = Za(e, ":root"), r = Za(e, ".dark"), i = e;
3969
+ function to(e, t) {
3970
+ let n = Qa(e, ":root"), r = Qa(e, ".dark"), i = e;
3973
3971
  if (n) {
3974
3972
  let e = i.slice(0, n.bodyStart), r = i.slice(n.bodyStart, n.bodyEnd), a = i.slice(n.bodyEnd);
3975
- i = e + Qa(r, t.light) + a;
3973
+ i = e + $a(r, t.light) + a;
3976
3974
  }
3977
3975
  if (r) {
3978
- let e = Za(i, ".dark");
3976
+ let e = Qa(i, ".dark");
3979
3977
  if (e) {
3980
3978
  let n = i.slice(0, e.bodyStart), r = i.slice(e.bodyStart, e.bodyEnd), a = i.slice(e.bodyEnd);
3981
- i = n + Qa(r, t.dark) + a;
3979
+ i = n + $a(r, t.dark) + a;
3982
3980
  }
3983
3981
  }
3984
3982
  return i;
3985
3983
  }
3986
- var to = "assets/styles.css";
3987
- async function no(e, t) {
3988
- let n = T.resolve(e, to), r;
3984
+ var no = "assets/styles.css";
3985
+ async function ro(e, t) {
3986
+ let n = T.resolve(e, no), r;
3989
3987
  try {
3990
3988
  r = await y.readFile(n, "utf-8");
3991
3989
  } catch {
3992
3990
  return !1;
3993
3991
  }
3994
- let i = eo(r, t);
3992
+ let i = to(r, t);
3995
3993
  return i === r || await y.writeFile(n, i, "utf-8"), !0;
3996
3994
  }
3997
3995
  //#endregion
3998
3996
  //#region src/core/clone.ts
3999
- async function ro(e) {
3997
+ async function io(e) {
4000
3998
  let t = await ee(te, {
4001
3999
  dir: e,
4002
4000
  force: !0
@@ -4008,7 +4006,7 @@ async function ro(e) {
4008
4006
  }
4009
4007
  //#endregion
4010
4008
  //#region src/core/editor-config.ts
4011
- function io(e) {
4009
+ function ao(e) {
4012
4010
  let t = {
4013
4011
  globs: [],
4014
4012
  alwaysApply: !1
@@ -4043,10 +4041,10 @@ function io(e) {
4043
4041
  content: i
4044
4042
  };
4045
4043
  }
4046
- function ao(e) {
4044
+ function oo(e) {
4047
4045
  return e.frontmatter.globs.length > 0 ? `---\npaths:\n${e.frontmatter.globs.map((e) => ` - "${e}"`).join("\n")}\n---\n\n${e.content}` : e.content;
4048
4046
  }
4049
- function oo(e) {
4047
+ function so(e) {
4050
4048
  let t;
4051
4049
  t = e.frontmatter.alwaysApply ? "always_on" : e.frontmatter.globs.length > 0 ? "glob" : "model_decision";
4052
4050
  let n = [`trigger: ${t}`];
@@ -4056,30 +4054,30 @@ function oo(e) {
4056
4054
  }
4057
4055
  return e.frontmatter.description && n.push(`description: ${e.frontmatter.description}`), `---\n${n.join("\n")}\n---\n\n${e.content}`;
4058
4056
  }
4059
- function so(e) {
4057
+ function co(e) {
4060
4058
  return e.frontmatter.globs.length > 0 ? `---\napplyTo: "${e.frontmatter.globs.join(", ")}"\n---\n\n${e.content}` : e.content;
4061
4059
  }
4062
- var co = {
4060
+ var lo = {
4063
4061
  claude: {
4064
4062
  rulesDir: ".claude/rules",
4065
4063
  extension: ".md",
4066
- convert: ao
4064
+ convert: oo
4067
4065
  },
4068
4066
  windsurf: {
4069
4067
  rulesDir: ".windsurf/rules",
4070
4068
  extension: ".md",
4071
- convert: oo
4069
+ convert: so
4072
4070
  },
4073
4071
  copilot: {
4074
4072
  rulesDir: ".github/instructions",
4075
4073
  extension: ".instructions.md",
4076
- convert: so
4074
+ convert: co
4077
4075
  }
4078
4076
  };
4079
- async function lo(e) {
4077
+ async function uo(e) {
4080
4078
  let t = T.join(e, ae), n = (await y.readdir(t, { withFileTypes: !0 }).catch(() => [])).filter((e) => e.isFile() && e.name.endsWith(".mdc"));
4081
4079
  return await Promise.all(n.map(async (e) => {
4082
- let n = T.join(t, e.name), { frontmatter: r, content: i } = io(await y.readFile(n, "utf-8"));
4080
+ let n = T.join(t, e.name), { frontmatter: r, content: i } = ao(await y.readFile(n, "utf-8"));
4083
4081
  return {
4084
4082
  frontmatter: r,
4085
4083
  content: i,
@@ -4087,9 +4085,9 @@ async function lo(e) {
4087
4085
  };
4088
4086
  }));
4089
4087
  }
4090
- async function uo(e, t) {
4088
+ async function fo(e, t) {
4091
4089
  if (t === "cursor") return;
4092
- let n = co[t], r = await lo(e), i = T.join(e, n.rulesDir);
4090
+ let n = lo[t], r = await uo(e), i = T.join(e, n.rulesDir);
4093
4091
  await y.mkdir(i, { recursive: !0 }), await Promise.all(r.map((e) => {
4094
4092
  let t = n.convert(e), r = e.filename.replace(/\.mdc$/, n.extension);
4095
4093
  return y.writeFile(T.join(i, r), t, "utf-8");
@@ -4097,21 +4095,21 @@ async function uo(e, t) {
4097
4095
  }
4098
4096
  //#endregion
4099
4097
  //#region src/core/env-files.ts
4100
- var fo = [
4098
+ var po = [
4101
4099
  "apps",
4102
4100
  "packages",
4103
4101
  "libs",
4104
4102
  "shared"
4105
4103
  ];
4106
- async function po(e) {
4107
- let t = await mo(e);
4104
+ async function mo(e) {
4105
+ let t = await ho(e);
4108
4106
  return (await Promise.all(t.map(async (t) => {
4109
4107
  let n = T.join(T.dirname(t), ".env");
4110
4108
  return await J(n) ? null : (await y.copyFile(t, n), T.relative(e, n));
4111
4109
  }))).filter((e) => e !== null).sort();
4112
4110
  }
4113
- async function mo(e) {
4114
- let t = [T.join(e, ".env.example")], n = await Promise.all(fo.map(async (t) => {
4111
+ async function ho(e) {
4112
+ let t = [T.join(e, ".env.example")], n = await Promise.all(po.map(async (t) => {
4115
4113
  let n = T.join(e, t);
4116
4114
  return (await y.readdir(n, { withFileTypes: !0 }).catch(() => [])).filter((e) => e.isDirectory()).map((e) => T.join(n, e.name, ".env.example"));
4117
4115
  }));
@@ -4119,11 +4117,11 @@ async function mo(e) {
4119
4117
  }
4120
4118
  //#endregion
4121
4119
  //#region src/core/post-clone.ts
4122
- var Q = "@hype-stack/", ho = "hype-stack";
4123
- async function go(e) {
4120
+ var Q = "@hype-stack/", go = "hype-stack", _o = "@hype-stack/cli";
4121
+ async function vo(e) {
4124
4122
  await ur(T.join(e, ".git"));
4125
4123
  }
4126
- async function _o(e) {
4124
+ async function yo(e) {
4127
4125
  await q("git", ["init"], { cwd: e }), await q("git", ["add", "."], { cwd: e }), await q("git", [
4128
4126
  "-c",
4129
4127
  "user.name=Hype Stack CLI",
@@ -4134,22 +4132,19 @@ async function _o(e) {
4134
4132
  "Initial commit from Hype Stack CLI"
4135
4133
  ], { cwd: e });
4136
4134
  }
4137
- async function vo(e, t) {
4138
- let n = `@${t}/`, r = await Eo(e);
4135
+ async function bo(e, t) {
4136
+ let n = `@${t}/`, r = await Oo(e);
4139
4137
  for (let e of r) {
4140
4138
  let t = await sr(e);
4141
4139
  if (!t) continue;
4142
4140
  let r = !1;
4143
- t.name?.startsWith(Q) && (t.name = t.name.replace(Q, n), r = !0), Co(t.dependencies, n) && (r = !0), Co(t.devDependencies, n) && (r = !0), t.nx && wo(t.nx, n) && (r = !0);
4144
- let i = await y.readFile(e, "utf-8");
4145
- if (i.includes(Q)) {
4146
- let t = i.replaceAll(Q, n);
4147
- await y.writeFile(e, t, "utf-8");
4148
- } else r && await cr(e, t);
4141
+ t.name?.startsWith(Q) && (t.name = t.name.replace(Q, n), r = !0), To(t.dependencies, n) && (r = !0), To(t.devDependencies, n) && (r = !0), t.nx && Eo(t.nx, n) && (r = !0);
4142
+ let i = await y.readFile(e, "utf-8"), a = Ur(i, n);
4143
+ a === i ? r && await cr(e, t) : await y.writeFile(e, a, "utf-8");
4149
4144
  }
4150
- await Bi(e, t), await xo(e, t), await To(e, t);
4145
+ await Vi(e, t), await Co(e, t), await Do(e, t);
4151
4146
  }
4152
- var yo = new Set([
4147
+ var xo = new Set([
4153
4148
  ".git",
4154
4149
  "node_modules",
4155
4150
  "dist",
@@ -4157,10 +4152,10 @@ var yo = new Set([
4157
4152
  ".nx",
4158
4153
  ".next",
4159
4154
  "coverage"
4160
- ]), bo = /^(docker-compose|compose)(\.[\w.-]+)?\.ya?ml$/;
4161
- async function xo(e, t) {
4162
- if (t === ho) return;
4163
- let n = await So(e);
4155
+ ]), So = /^(docker-compose|compose)(\.[\w.-]+)?\.ya?ml$/;
4156
+ async function Co(e, t) {
4157
+ if (t === go) return;
4158
+ let n = await wo(e);
4164
4159
  await Promise.all(n.map(async (e) => {
4165
4160
  let n = await y.readFile(e, "utf-8").catch(() => null);
4166
4161
  if (!n || !/^name:[ \t]*hype-stack/m.test(n)) return;
@@ -4168,23 +4163,23 @@ async function xo(e, t) {
4168
4163
  await y.writeFile(e, r, "utf-8");
4169
4164
  }));
4170
4165
  }
4171
- async function So(e) {
4166
+ async function wo(e) {
4172
4167
  let t = await y.readdir(e, { withFileTypes: !0 }).catch(() => []);
4173
4168
  return (await Promise.all(t.map(async (t) => {
4174
4169
  let n = T.join(e, t.name);
4175
- return t.isDirectory() ? yo.has(t.name) ? [] : So(n) : t.isFile() && bo.test(t.name) ? [n] : [];
4170
+ return t.isDirectory() ? xo.has(t.name) ? [] : wo(n) : t.isFile() && So.test(t.name) ? [n] : [];
4176
4171
  }))).flat();
4177
4172
  }
4178
- function Co(e, t) {
4173
+ function To(e, t) {
4179
4174
  if (!e) return !1;
4180
4175
  let n = !1;
4181
- for (let r of Object.keys(e)) if (r.startsWith(Q)) {
4176
+ for (let r of Object.keys(e)) if (r !== _o && r.startsWith(Q)) {
4182
4177
  let i = r.replace(Q, t);
4183
4178
  e[i] = e[r], delete e[r], n = !0;
4184
4179
  }
4185
4180
  return n;
4186
4181
  }
4187
- function wo(e, t) {
4182
+ function Eo(e, t) {
4188
4183
  if (!e) return !1;
4189
4184
  let n = !1;
4190
4185
  if (e.implicitDependencies &&= e.implicitDependencies.map((e) => e.startsWith(Q) ? (n = !0, e.replace(Q, t)) : e), e.targets) {
@@ -4192,13 +4187,13 @@ function wo(e, t) {
4192
4187
  }
4193
4188
  return n;
4194
4189
  }
4195
- async function To(e, t) {
4190
+ async function Do(e, t) {
4196
4191
  let n = T.join(e, "packages/enums/src/app/index.ts"), r = await y.readFile(n, "utf-8").catch(() => null);
4197
4192
  if (!r) return;
4198
- let i = Ga(t), a = r.replaceAll(`id: "${ho}"`, `id: "${t}"`).replaceAll(`name: "${ho}"`, `name: "${t}"`).replace(/name: "Hype Stack"/, `name: "${i}"`).replace(/description: ".*?"/, `description: "${i} application"`);
4193
+ let i = Ka(t), a = r.replaceAll(`id: "${go}"`, `id: "${t}"`).replaceAll(`name: "${go}"`, `name: "${t}"`).replace(/name: "Hype Stack"/, `name: "${i}"`).replace(/description: ".*?"/, `description: "${i} application"`);
4199
4194
  await y.writeFile(n, a, "utf-8");
4200
4195
  }
4201
- async function Eo(e) {
4196
+ async function Oo(e) {
4202
4197
  let t = [], n = T.join(e, "package.json");
4203
4198
  (await y.stat(n).catch(() => null))?.isFile() && t.push(n);
4204
4199
  for (let n of [
@@ -4218,7 +4213,7 @@ async function Eo(e) {
4218
4213
  }
4219
4214
  //#endregion
4220
4215
  //#region src/core/readme.ts
4221
- var Do = {
4216
+ var ko = {
4222
4217
  cursor: {
4223
4218
  label: "Cursor",
4224
4219
  rulesDir: ".cursor/rules"
@@ -4235,21 +4230,21 @@ var Do = {
4235
4230
  label: "GitHub Copilot",
4236
4231
  rulesDir: ".github/instructions"
4237
4232
  }
4238
- }, Oo = {
4233
+ }, Ao = {
4239
4234
  backend: "Hono API server (Postgres, Prisma, Kysely, Valkey cache, WorkOS auth)",
4240
4235
  frontend: "React + Vite app talking to the backend through the typed HyperFetch SDK"
4241
- }, ko = {
4236
+ }, jo = {
4242
4237
  enums: "Shared enums and app config used across apps",
4243
4238
  cli: "Project tooling and code generators"
4244
4239
  };
4245
- function Ao(e, t) {
4240
+ function Mo(e, t) {
4246
4241
  return Object.entries(e).toSorted(([e], [t]) => e.localeCompare(t)).map(([e, n]) => {
4247
4242
  let r = t[e];
4248
4243
  return r ? `- \`${n}\` - ${r}` : `- \`${n}\``;
4249
4244
  });
4250
4245
  }
4251
- function jo(e) {
4252
- let { projectName: t, editor: n, workspace: r } = e, i = Ga(t), a = Do[n], o = !!r.apps.backend, s = Ao(r.apps, Oo), c = Ao(r.packages, ko), l = [];
4246
+ function No(e) {
4247
+ let { projectName: t, editor: n, workspace: r } = e, i = Ka(t), a = ko[n], o = !!r.apps.backend, s = Mo(r.apps, Ao), c = Mo(r.packages, jo), l = [];
4253
4248
  s.length > 0 && l.push(...s), c.length > 0 && l.push(...c), l.push("- `stack.json` - Hype Stack workspace config (apps, paths, installed packs)");
4254
4249
  let u = [];
4255
4250
  u.push(`# ${i}`), u.push([
@@ -4352,13 +4347,13 @@ function jo(e) {
4352
4347
  "stays useful."
4353
4348
  ].join("\n")), u.join("\n\n") + "\n";
4354
4349
  }
4355
- async function Mo(e, t) {
4350
+ async function Po(e, t) {
4356
4351
  let n = T.join(e, "README.md");
4357
- await y.writeFile(n, jo(t), "utf-8");
4352
+ await y.writeFile(n, No(t), "utf-8");
4358
4353
  }
4359
4354
  //#endregion
4360
4355
  //#region src/core/tracking.ts
4361
- async function No(e) {
4356
+ async function Fo(e) {
4362
4357
  try {
4363
4358
  let t = {
4364
4359
  "X-Device-Id": Xn(),
@@ -4372,7 +4367,7 @@ async function No(e) {
4372
4367
  }
4373
4368
  //#endregion
4374
4369
  //#region src/core/npm-deps.ts
4375
- function Po(e, t) {
4370
+ function Io(e, t) {
4376
4371
  let n = [], r = [];
4377
4372
  if (!e) return {
4378
4373
  errors: n,
@@ -4403,7 +4398,7 @@ function Po(e, t) {
4403
4398
  operations: r
4404
4399
  };
4405
4400
  }
4406
- function Fo(e) {
4401
+ function Lo(e) {
4407
4402
  let t = {};
4408
4403
  for (let n of e) if (n) for (let [e, r] of Object.entries(n)) t[e] = {
4409
4404
  ...t[e],
@@ -4411,7 +4406,7 @@ function Fo(e) {
4411
4406
  };
4412
4407
  return t;
4413
4408
  }
4414
- async function Io(e, t, n = q) {
4409
+ async function Ro(e, t, n = q) {
4415
4410
  let r = [];
4416
4411
  for (let i of e) {
4417
4412
  let e = T.join(t, i.relativeDir);
@@ -4447,14 +4442,14 @@ async function Io(e, t, n = q) {
4447
4442
  function $(e) {
4448
4443
  return e instanceof Error ? e.message : String(e);
4449
4444
  }
4450
- async function Lo(e, t, n) {
4445
+ async function zo(e, t, n) {
4451
4446
  let r = e.filter((e) => e.tier === "paid" && !t.has(e.name)).map((e) => e.name);
4452
- return r.length === 0 ? {} : Vr(r, n).catch(() => ({}));
4447
+ return r.length === 0 ? {} : Br(r, n).catch(() => ({}));
4453
4448
  }
4454
- function Ro(e, t) {
4449
+ function Bo(e, t) {
4455
4450
  return e === "free" ? z.success("free") : e === "owned" ? z.accent("owned") : `${z.highlight(`$${t}`)} ${z.muted("locked")}`;
4456
4451
  }
4457
- async function zo(e, t, n) {
4452
+ async function Vo(e, t, n) {
4458
4453
  let r = e.filter((e) => t(e)), i = e.filter((e) => !t(e));
4459
4454
  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 rr(r.map((e) => n.get(e)).filter((e) => e !== void 0).map((e) => ({
4460
4455
  name: e.name,
@@ -4462,7 +4457,7 @@ async function zo(e, t, n) {
4462
4457
  price: e.price
4463
4458
  })));
4464
4459
  }
4465
- function Bo(e, t) {
4460
+ function Ho(e, t) {
4466
4461
  let n = e.map((e, n) => {
4467
4462
  let r = t.get(e), i = r ? r.displayName : e;
4468
4463
  return ` ${z.muted(`${n + 1}.`)} ${z.brand(i)}`;
@@ -4473,10 +4468,10 @@ function Bo(e, t) {
4473
4468
  ...n
4474
4469
  ].join("\n"), "Install Plan");
4475
4470
  }
4476
- async function Vo(e, t) {
4471
+ async function Uo(e, t) {
4477
4472
  let n = [];
4478
4473
  for (let r of e) {
4479
- let e = await Fr(r), i = await Ir(r, t);
4474
+ let e = await Pr(r), i = await Fr(r, t);
4480
4475
  if (i.status === "denied") throw Error(`Access to "${r}" was denied (${i.reason}). Try 'npx @hype-stack/cli login' or check your license.`);
4481
4476
  n.push({
4482
4477
  manifest: e,
@@ -4485,21 +4480,21 @@ async function Vo(e, t) {
4485
4480
  }
4486
4481
  return n;
4487
4482
  }
4488
- async function Ho(e) {
4489
- let { prepared: t, paths: n, cwd: r, spinner: i } = e, a = Po(Fo(t.map((e) => e.manifest.dependencies_npm)), n);
4483
+ async function Wo(e) {
4484
+ let { prepared: t, paths: n, cwd: r, spinner: i } = e, a = Io(Lo(t.map((e) => e.manifest.dependencies_npm)), n);
4490
4485
  if (a.errors.length > 0) {
4491
4486
  for (let e of a.errors) s.log.error(e);
4492
4487
  return;
4493
4488
  }
4494
4489
  if (a.operations.length === 0) return;
4495
4490
  i.start("Installing npm dependencies...");
4496
- let o = await Io(a.operations, r);
4491
+ let o = await Ro(a.operations, r);
4497
4492
  if (i.stop(o.ok ? "npm dependencies installed" : "npm dependency installation failed"), !o.ok) for (let e of o.errors) s.log.error(e);
4498
4493
  }
4499
- function Uo() {
4500
- ua([`${z.command("npx @hype-stack/cli onboard")} ${z.muted("(set up env vars + run migrations)")}`, `${z.command("pnpm dev")} ${z.muted("(start frontend + backend)")}`]);
4494
+ function Go() {
4495
+ da([`${z.command("npx @hype-stack/cli onboard")} ${z.muted("(set up env vars + run migrations)")}`, `${z.command("pnpm dev")} ${z.muted("(start frontend + backend)")}`]);
4501
4496
  }
4502
- function Wo(e) {
4497
+ function Ko(e) {
4503
4498
  if (e.length === 0) return;
4504
4499
  let t = e.map((e) => {
4505
4500
  let t = e.replace(/^\{\{[^}]+\}\}\//, "");
@@ -4507,10 +4502,10 @@ function Wo(e) {
4507
4502
  });
4508
4503
  s.note(t.join("\n"), "Skipped (already exist)");
4509
4504
  }
4510
- async function Go(e) {
4505
+ async function qo(e) {
4511
4506
  let { prepared: t, config: n, cwd: r, force: i, yes: a, slotsByPack: o } = e, c = /* @__PURE__ */ new Set();
4512
4507
  if (i) return c;
4513
- let l = await Yi({
4508
+ let l = await Xi({
4514
4509
  packs: t,
4515
4510
  config: n,
4516
4511
  projectRoot: r,
@@ -4537,7 +4532,7 @@ async function Go(e) {
4537
4532
  }
4538
4533
  //#endregion
4539
4534
  //#region src/ui/swatch.ts
4540
- function Ko(e) {
4535
+ function Jo(e) {
4541
4536
  let t = e.trim().match(/^oklch\(([^)]+)\)$/i);
4542
4537
  if (!t) return null;
4543
4538
  let n = t[1].trim().split(/\s+/);
@@ -4556,56 +4551,56 @@ function Ko(e) {
4556
4551
  h: a
4557
4552
  };
4558
4553
  }
4559
- function qo(e) {
4554
+ function Yo(e) {
4560
4555
  return Math.min(255, Math.max(0, Math.round(e)));
4561
4556
  }
4562
- function Jo(e) {
4557
+ function Xo(e) {
4563
4558
  return e <= .0031308 ? 12.92 * e : 1.055 * e ** (1 / 2.4) - .055;
4564
4559
  }
4565
- function Yo({ l: e, c: t, h: n }) {
4560
+ function Zo({ l: e, c: t, h: n }) {
4566
4561
  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;
4567
4562
  return [
4568
- qo(Jo(f) * 255),
4569
- qo(Jo(p) * 255),
4570
- qo(Jo(m) * 255)
4563
+ Yo(Xo(f) * 255),
4564
+ Yo(Xo(p) * 255),
4565
+ Yo(Xo(m) * 255)
4571
4566
  ];
4572
4567
  }
4573
- var Xo = "\x1B[49m";
4574
- function Zo(e, t) {
4568
+ var Qo = "\x1B[49m";
4569
+ function $o(e, t) {
4575
4570
  let n = e[t];
4576
4571
  if (!n) return b.dim(" ");
4577
- let r = Ko(n);
4572
+ let r = Jo(n);
4578
4573
  if (!r) return b.dim(" ");
4579
- let [i, a, o] = Yo(r);
4580
- return `\x1b[48;2;${i};${a};${o}m ${Xo}`;
4574
+ let [i, a, o] = Zo(r);
4575
+ return `\x1b[48;2;${i};${a};${o}m ${Qo}`;
4581
4576
  }
4582
- var Qo = [
4577
+ var es = [
4583
4578
  "primary",
4584
4579
  "secondary",
4585
4580
  "accent"
4586
4581
  ];
4587
- function $o(e) {
4588
- return Qo.map((t) => Zo(e, t)).join("");
4582
+ function ts(e) {
4583
+ return es.map((t) => $o(e, t)).join("");
4589
4584
  }
4590
- function es(e) {
4591
- return `${$o(e.light)} ${b.dim("·")} ${$o(e.dark)}`;
4585
+ function ns(e) {
4586
+ return `${ts(e.light)} ${b.dim("·")} ${ts(e.dark)}`;
4592
4587
  }
4593
4588
  //#endregion
4594
4589
  //#region src/commands/create.ts
4595
- async function ts(e) {
4596
- e.skipBanner || Ba(), s.intro(z.brandBold("Create a new Hype Stack project"));
4590
+ async function rs(e) {
4591
+ e.skipBanner || Va(), s.intro(z.brandBold("Create a new Hype Stack project"));
4597
4592
  let o = e.yes === !0, c, l;
4598
4593
  if (o && e.name) {
4599
- let t = Ka(e.name);
4600
- t && (s.log.error(t), Z()), l = e.name, c = Wa(e.name);
4594
+ let t = qa(e.name);
4595
+ t && (s.log.error(t), Z()), l = e.name, c = Ga(e.name);
4601
4596
  } else {
4602
4597
  let t = await s.text({
4603
4598
  message: "What is your project named?",
4604
4599
  placeholder: "my-app",
4605
4600
  initialValue: e.name ?? "",
4606
- validate: (e) => Ka(e ?? "")
4601
+ validate: (e) => qa(e ?? "")
4607
4602
  });
4608
- s.isCancel(t) && Z(), l = t, c = Wa(l);
4603
+ s.isCancel(t) && Z(), l = t, c = Ga(l);
4609
4604
  }
4610
4605
  l.trim() !== c && s.log.info(z.muted(`Using "${z.highlight(c)}" as the project name`));
4611
4606
  let u;
@@ -4649,7 +4644,7 @@ async function ts(e) {
4649
4644
  message: "Pick a color theme",
4650
4645
  options: r.map((e) => ({
4651
4646
  value: e.name,
4652
- label: `${es(e)} ${e.label}`
4647
+ label: `${ns(e)} ${e.label}`
4653
4648
  })),
4654
4649
  initialValue: h
4655
4650
  });
@@ -4667,31 +4662,31 @@ async function ts(e) {
4667
4662
  (s.isCancel(e) || !e) && Z();
4668
4663
  }
4669
4664
  let _ = s.spinner();
4670
- _.start("Cloning Hype Stack template..."), await ro(d), _.stop(z.success("Template cloned"));
4665
+ _.start("Cloning Hype Stack template..."), await io(d), _.stop(z.success("Template cloned"));
4671
4666
  let v = s.spinner();
4672
- v.start("Setting up project..."), await go(d), await vo(d, c), await uo(d, p);
4673
- let y = await jr(d), b = Nr(c, y);
4674
- await Ar(d, b), await Mo(d, {
4667
+ v.start("Setting up project..."), await vo(d), await bo(d, c), await fo(d, p);
4668
+ let y = await Ar(d), b = Mr(c, y);
4669
+ await kr(d, b), await Po(d, {
4675
4670
  projectName: c,
4676
4671
  editor: p,
4677
4672
  workspace: y
4678
4673
  });
4679
4674
  let x = T.resolve(d, b.paths?.frontend.root ?? "apps/frontend");
4680
- a(g) && (await no(x, i(g)) || s.log.warn(z.muted(`Could not find ${z.path("assets/styles.css")} to apply the ${g} theme`))), await Xa(x, e.defaultMode === "dark" || e.defaultMode === "light" ? e.defaultMode : "light") || s.log.warn(z.muted(`Could not find ${z.path("src/hooks/use-theme.ts")} to set the default color mode`)), v.stop(z.success("Project configured"));
4675
+ a(g) && (await ro(x, i(g)) || s.log.warn(z.muted(`Could not find ${z.path("assets/styles.css")} to apply the ${g} theme`))), await Za(x, e.defaultMode === "dark" || e.defaultMode === "light" ? e.defaultMode : "light") || s.log.warn(z.muted(`Could not find ${z.path("src/hooks/use-theme.ts")} to set the default color mode`)), v.stop(z.success("Project configured"));
4681
4676
  let S = s.spinner();
4682
4677
  S.start("Installing dependencies..."), (await q("pnpm", ["install"], { cwd: d })).exitCode === 0 ? S.stop(z.success("Dependencies installed")) : (S.stop(z.warning("Dependencies installed with warnings")), s.log.warn(z.muted("You may need to run `pnpm install` manually to resolve issues.")));
4683
4678
  let C = s.spinner();
4684
- C.start("Initializing git repository..."), await _o(d), C.stop(z.success("Git repository initialized with clean history"));
4679
+ C.start("Initializing git repository..."), await yo(d), C.stop(z.success("Git repository initialized with clean history"));
4685
4680
  let w = s.spinner();
4686
4681
  w.start("Creating .env files from examples...");
4687
- let E = await po(d);
4682
+ let E = await mo(d);
4688
4683
  if (E.length > 0) {
4689
4684
  let e = E.length;
4690
4685
  w.stop(z.success(`Created ${e} .env file${e === 1 ? "" : "s"} from examples`));
4691
4686
  } else w.stop(z.muted("No .env.example files to copy"));
4692
4687
  s.log.success(`${z.brandBold("Hype Stack")} project ${z.highlight(c)} is ready!`);
4693
4688
  let D = T.relative(process.cwd(), d) || ".", O = [`${z.command(`cd ${D}`)}`];
4694
- E.length > 0 ? O.push(`Review your ${z.path(".env")} files and fill in any secrets`) : O.push(`Copy ${z.path(".env.example")} to ${z.path(".env")} and configure`), ua(O);
4689
+ E.length > 0 ? O.push(`Review your ${z.path(".env")} files and fill in any secrets`) : O.push(`Copy ${z.path(".env.example")} to ${z.path(".env")} and configure`), da(O);
4695
4690
  let k = e.setup === !1;
4696
4691
  if (e.deferSetup) s.log.info(z.muted("Docker and migrations will run after your packs are installed."));
4697
4692
  else {
@@ -4699,20 +4694,20 @@ async function ts(e) {
4699
4694
  message: "Would you like to start Docker services and run database migrations now?",
4700
4695
  initialValue: !0
4701
4696
  }));
4702
- s.isCancel(e) && Z(), e ? await xa(d, o) : s.log.info(z.muted("Docker and migrations can run later via `npx @hype-stack/cli onboard`.")), Uo();
4697
+ s.isCancel(e) && Z(), e ? await Sa(d, o) : s.log.info(z.muted("Docker and migrations can run later via `npx @hype-stack/cli onboard`.")), Go();
4703
4698
  }
4704
- return await No("project_create"), s.outro(z.muted("Happy building!")), d;
4699
+ return await Fo("project_create"), s.outro(z.muted("Happy building!")), d;
4705
4700
  }
4706
4701
  //#endregion
4707
4702
  //#region src/commands/init.ts
4708
- async function ns(e) {
4703
+ async function is(e) {
4709
4704
  let t = e.cwd ?? process.cwd(), n = e.silent ?? !1;
4710
- if (n || (Va(), s.intro(z.brandBold("Initialize Hype Stack configuration"))), !await Pr(t)) {
4705
+ if (n || (Ha(), s.intro(z.brandBold("Initialize Hype Stack configuration"))), !await Nr(t)) {
4711
4706
  s.log.error(`This doesn't look like a Hype Stack project. ${z.muted("Expected apps/ directory and package.json")}`), s.outro(z.muted(`Run ${z.command("npx @hype-stack/cli create")} to scaffold a new project.`));
4712
4707
  return;
4713
4708
  }
4714
- if (await kr(t)) {
4715
- let e = await Or(t);
4709
+ if (await Or(t)) {
4710
+ let e = await Dr(t);
4716
4711
  if (e && !n) {
4717
4712
  s.log.info(`Found existing ${z.path("stack.json")} for project ${z.highlight(e.name)}`);
4718
4713
  let t = await s.confirm({
@@ -4725,7 +4720,7 @@ async function ns(e) {
4725
4720
  }
4726
4721
  }
4727
4722
  }
4728
- let r = await jr(t);
4723
+ let r = await Ar(t);
4729
4724
  if (!n) {
4730
4725
  let e = Object.entries(r.apps), t = Object.entries(r.packages);
4731
4726
  if (e.length > 0) {
@@ -4744,28 +4739,28 @@ async function ns(e) {
4744
4739
  message: "Project name for stack.json?",
4745
4740
  placeholder: i,
4746
4741
  initialValue: i,
4747
- validate: (e) => Ka(e ?? "")
4742
+ validate: (e) => qa(e ?? "")
4748
4743
  });
4749
- s.isCancel(e) && Z(), a = Wa(e);
4744
+ s.isCancel(e) && Z(), a = Ga(e);
4750
4745
  }
4751
- await Ar(t, Nr(a, r)), n || (s.log.success(`${z.path("stack.json")} written successfully`), s.outro(z.muted("Your project is mapped and ready for Hype Stack CLI commands.")));
4746
+ await kr(t, Mr(a, r)), n || (s.log.success(`${z.path("stack.json")} written successfully`), s.outro(z.muted("Your project is mapped and ready for Hype Stack CLI commands.")));
4752
4747
  }
4753
- async function rs(e, t = {}, n) {
4754
- if (await kr(e)) return {
4748
+ async function as(e, t = {}, n) {
4749
+ if (await Or(e)) return {
4755
4750
  projectRoot: e,
4756
4751
  scaffolded: !1
4757
4752
  };
4758
- let r = t.runInit ?? ((e) => ns({
4753
+ let r = t.runInit ?? ((e) => is({
4759
4754
  cwd: e,
4760
4755
  silent: !0
4761
- })), i = t.runCreate ?? ((e, t) => ts({
4756
+ })), i = t.runCreate ?? ((e, t) => rs({
4762
4757
  parentDirectory: e,
4763
4758
  deferSetup: !0,
4764
4759
  skipBanner: !0,
4765
4760
  defaultTheme: t?.defaultTheme,
4766
4761
  defaultMode: t?.defaultMode
4767
4762
  }));
4768
- if (await Pr(e)) {
4763
+ if (await Nr(e)) {
4769
4764
  s.log.warn(`No ${z.path("stack.json")} found in ${z.path(e)}.`);
4770
4765
  let t = await s.confirm({
4771
4766
  message: `Create ${z.path("stack.json")} now?`,
@@ -4773,7 +4768,7 @@ async function rs(e, t = {}, n) {
4773
4768
  });
4774
4769
  if (s.isCancel(t) || !t) return null;
4775
4770
  await r(e);
4776
- let n = await kr(e);
4771
+ let n = await Or(e);
4777
4772
  return n && s.log.success(`${z.path("stack.json")} created`), n ? {
4778
4773
  projectRoot: e,
4779
4774
  scaffolded: !1
@@ -4791,19 +4786,19 @@ async function rs(e, t = {}, n) {
4791
4786
  });
4792
4787
  if (s.isCancel(o) || !o) return null;
4793
4788
  let c = await i(e, n);
4794
- return await kr(c) ? {
4789
+ return await Or(c) ? {
4795
4790
  projectRoot: c,
4796
4791
  scaffolded: !0
4797
4792
  } : null;
4798
4793
  }
4799
4794
  //#endregion
4800
4795
  //#region src/commands/compose.ts
4801
- async function is(e = {}) {
4796
+ async function os(e = {}) {
4802
4797
  let t = e.cwd ?? process.cwd();
4803
- Ba();
4804
- let n = await rs(t), r = n?.projectRoot ?? null, i = n?.scaffolded ?? !1, a;
4798
+ Va();
4799
+ let n = await as(t), r = n?.projectRoot ?? null, i = n?.scaffolded ?? !1, a;
4805
4800
  try {
4806
- a = await Or(r ?? t);
4801
+ a = await Dr(r ?? t);
4807
4802
  } catch (e) {
4808
4803
  s.cancel(`Could not parse ${z.path("stack.json")}: ${$(e)} Run 'npx @hype-stack/cli init' to regenerate it.`), process.exit(1);
4809
4804
  }
@@ -4814,18 +4809,18 @@ async function is(e = {}) {
4814
4809
  c.start("Loading packs...");
4815
4810
  let l;
4816
4811
  try {
4817
- l = await Br();
4812
+ l = await zr();
4818
4813
  } catch (e) {
4819
4814
  c.stop("Failed to load packs"), s.cancel(`Could not reach Hype Stack. Check your connection and try again.\n${$(e)}`), process.exit(1);
4820
4815
  }
4821
4816
  c.stop("Packs loaded");
4822
- 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 Kn(I()))?.token ?? null, h = await Lo(l, d, {
4817
+ 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 Kn(I()))?.token ?? null, h = await zo(l, d, {
4823
4818
  token: m,
4824
4819
  key: p
4825
4820
  }), g = (e) => {
4826
4821
  let t = f.get(e);
4827
4822
  return !t || t.tier === "free" ? "free" : h[e]?.owned ? "owned" : "locked";
4828
- }, _ = (e) => !d.has(e) && g(e) === "locked", v = await as({
4823
+ }, _ = (e) => !d.has(e) && g(e) === "locked", v = await ss({
4829
4824
  packs: l,
4830
4825
  installedSet: d,
4831
4826
  stateOf: g,
@@ -4836,9 +4831,9 @@ async function is(e = {}) {
4836
4831
  s.outro(z.muted("No packs selected. Nothing to do."));
4837
4832
  return;
4838
4833
  }
4839
- let b = cs(v), x = ls(v), S = Aa(l, b), C = Ca(ja(l, S)), w;
4834
+ let b = us(v), x = ds(v), S = ja(l, b), C = wa(Ma(l, S)), w;
4840
4835
  try {
4841
- w = Ta(b, C, u);
4836
+ w = Ea(b, C, u);
4842
4837
  } catch (e) {
4843
4838
  s.cancel($(e)), process.exit(1);
4844
4839
  }
@@ -4846,7 +4841,7 @@ async function is(e = {}) {
4846
4841
  s.note(`${w.alreadyInstalled.join(", ")} already installed.`, "Nothing to do"), s.outro(z.muted("Your selection is already part of the project."));
4847
4842
  return;
4848
4843
  }
4849
- let T = Ea({
4844
+ let T = Da({
4850
4845
  order: w.order,
4851
4846
  graph: C,
4852
4847
  isLocked: _,
@@ -4854,28 +4849,28 @@ async function is(e = {}) {
4854
4849
  });
4855
4850
  if (T.blocked.length > 0 && !m && !p) {
4856
4851
  let e = await nr();
4857
- e && (m = e, h = await Lo(l, d, {
4852
+ e && (m = e, h = await zo(l, d, {
4858
4853
  token: m,
4859
4854
  key: p
4860
- }), T = Ea({
4855
+ }), T = Da({
4861
4856
  order: w.order,
4862
4857
  graph: C,
4863
4858
  isLocked: _,
4864
4859
  installed: u
4865
4860
  }));
4866
4861
  }
4867
- if (T.blocked.length > 0 && await zo(T.blocked, _, f), T.installable.length === 0) {
4862
+ if (T.blocked.length > 0 && await Vo(T.blocked, _, f), T.installable.length === 0) {
4868
4863
  s.outro(z.muted("Nothing left to install once locked packs are removed."));
4869
4864
  return;
4870
4865
  }
4871
- if (Bo(T.installable, f), !e.yes) {
4866
+ if (Ho(T.installable, f), !e.yes) {
4872
4867
  let e = await s.confirm({ message: `Install ${T.installable.length} pack${T.installable.length === 1 ? "" : "s"}?` });
4873
4868
  (s.isCancel(e) || !e) && (s.cancel("Installation cancelled."), process.exit(0));
4874
4869
  }
4875
4870
  c.start("Downloading packs...");
4876
4871
  let E;
4877
4872
  try {
4878
- E = await Vo(T.installable, {
4873
+ E = await Uo(T.installable, {
4879
4874
  token: m,
4880
4875
  key: p
4881
4876
  });
@@ -4883,7 +4878,7 @@ async function is(e = {}) {
4883
4878
  c.stop("Download failed"), s.cancel($(e)), process.exit(1);
4884
4879
  }
4885
4880
  c.stop(`Downloaded ${E.length} pack${E.length === 1 ? "" : "s"}`);
4886
- let D = await Go({
4881
+ let D = await qo({
4887
4882
  prepared: E,
4888
4883
  config: a,
4889
4884
  cwd: o,
@@ -4893,7 +4888,7 @@ async function is(e = {}) {
4893
4888
  });
4894
4889
  try {
4895
4890
  c.start("Installing pack files...");
4896
- let t = await Qi({
4891
+ let t = await $i({
4897
4892
  packs: E,
4898
4893
  config: a,
4899
4894
  projectRoot: o,
@@ -4906,22 +4901,22 @@ async function is(e = {}) {
4906
4901
  for (let e of t.errors) s.log.error(e);
4907
4902
  s.cancel("No files were written. Fix the errors above (or pass --force for existing files) and try again."), process.exit(1);
4908
4903
  }
4909
- c.stop("Files installed"), t.installed.length > 0 && s.log.success(`${z.highlight(String(t.installed.length))} files installed`), t.skipped.length > 0 && (s.log.warning(`${t.skipped.length} files skipped (use --force to overwrite)`), Wo(t.skipped));
4904
+ c.stop("Files installed"), t.installed.length > 0 && s.log.success(`${z.highlight(String(t.installed.length))} files installed`), t.skipped.length > 0 && (s.log.warning(`${t.skipped.length} files skipped (use --force to overwrite)`), Ko(t.skipped));
4910
4905
  for (let e of t.errors) s.log.error(e);
4911
- await Ho({
4906
+ await Wo({
4912
4907
  prepared: E,
4913
4908
  paths: a.paths,
4914
4909
  cwd: o,
4915
4910
  spinner: c
4916
4911
  });
4917
4912
  let n;
4918
- i && (n = await Sa(o, e.yes ?? !1)), await pr({
4913
+ i && (n = await Ca(o, e.yes ?? !1)), await pr({
4919
4914
  projectRoot: o,
4920
4915
  paths: a.paths,
4921
4916
  skipPrompts: e.yes ?? !1,
4922
4917
  dbReady: n,
4923
4918
  freshScaffold: i
4924
- }), Uo(), s.outro(z.brand(`Installed ${t.appliedPacks.join(", ")}.`));
4919
+ }), Go(), s.outro(z.brand(`Installed ${t.appliedPacks.join(", ")}.`));
4925
4920
  } finally {
4926
4921
  await Promise.all(E.map((e) => y.rm(e.packDir, {
4927
4922
  recursive: !0,
@@ -4929,10 +4924,10 @@ async function is(e = {}) {
4929
4924
  })));
4930
4925
  }
4931
4926
  }
4932
- async function as(e) {
4927
+ async function ss(e) {
4933
4928
  let { packs: t, installedSet: n, stateOf: r, options: i, adminAvailable: a } = e;
4934
4929
  if (i.packs && i.packs.length > 0) {
4935
- let e = i.packs.map(ss), n = e.filter((e) => !t.some((t) => t.name === e.name));
4930
+ let e = i.packs.map(ls), n = e.filter((e) => !t.some((t) => t.name === e.name));
4936
4931
  return n.length > 0 && (s.cancel(`Unknown pack${n.length === 1 ? "" : "s"}: ${n.map((e) => e.name).join(", ")}`), process.exit(1)), e;
4937
4932
  }
4938
4933
  let o = t.filter((e) => n.has(e.name));
@@ -4941,13 +4936,13 @@ async function as(e) {
4941
4936
  if (c.length === 0) return s.outro(z.muted("Every available pack is already installed.")), [];
4942
4937
  let l = ce();
4943
4938
  s.note(c.map((e) => ` ${B.arrow} ${z.highlight(e.displayName)} ${ge(`${l}/packs/${e.name}`)}`).join("\n"), "Browse packs");
4944
- let u = oa(c, { adminAvailable: a }), d = [];
4939
+ let u = sa(c, { adminAvailable: a }), d = [];
4945
4940
  for (let e of u) {
4946
4941
  let t = e.packs.map((e) => {
4947
4942
  let t = r(e.name);
4948
4943
  return {
4949
4944
  value: e.name,
4950
- label: `${e.displayName} ${Ro(t, e.price)}`,
4945
+ label: `${e.displayName} ${Bo(t, e.price)}`,
4951
4946
  hint: e.description
4952
4947
  };
4953
4948
  });
@@ -4964,7 +4959,7 @@ async function as(e) {
4964
4959
  });
4965
4960
  continue;
4966
4961
  }
4967
- let n = await Ua({
4962
+ let n = await Wa({
4968
4963
  message: `Select ${e.label.toLowerCase()} to add (optional)`,
4969
4964
  options: t,
4970
4965
  required: !1
@@ -4974,20 +4969,20 @@ async function as(e) {
4974
4969
  }
4975
4970
  return d;
4976
4971
  }
4977
- var os = /@(frontend|admin)$/;
4978
- function ss(e) {
4979
- let t = e.match(os);
4972
+ var cs = /@(frontend|admin)$/;
4973
+ function ls(e) {
4974
+ let t = e.match(cs);
4980
4975
  return t ? {
4981
4976
  name: e.slice(0, -t[0].length),
4982
4977
  slot: t[1]
4983
4978
  } : { name: e };
4984
4979
  }
4985
- function cs(e) {
4980
+ function us(e) {
4986
4981
  let t = /* @__PURE__ */ new Set(), n = [];
4987
4982
  for (let r of e) t.has(r.name) || (t.add(r.name), n.push(r.name));
4988
4983
  return n;
4989
4984
  }
4990
- function ls(e) {
4985
+ function ds(e) {
4991
4986
  let t = /* @__PURE__ */ new Map();
4992
4987
  for (let n of e) {
4993
4988
  if (!n.slot) continue;
@@ -4998,8 +4993,8 @@ function ls(e) {
4998
4993
  }
4999
4994
  //#endregion
5000
4995
  //#region src/commands/login.ts
5001
- async function us() {
5002
- Va(), s.intro(z.brandBold("Log in to Hype Stack")), s.log.step("Opening your browser to sign in...");
4996
+ async function fs() {
4997
+ Ha(), s.intro(z.brandBold("Log in to Hype Stack")), s.log.step("Opening your browser to sign in...");
5003
4998
  let e;
5004
4999
  try {
5005
5000
  e = await tr({ onUrl: (e) => {
@@ -5012,8 +5007,8 @@ async function us() {
5012
5007
  }
5013
5008
  //#endregion
5014
5009
  //#region src/commands/logout.ts
5015
- async function ds() {
5016
- Va(), s.intro(z.brandBold("Log out of Hype Stack"));
5010
+ async function ps() {
5011
+ Ha(), s.intro(z.brandBold("Log out of Hype Stack"));
5017
5012
  let e = I(), t = await Kn(e);
5018
5013
  if (!t) {
5019
5014
  s.outro(z.muted("You're not logged in."));
@@ -5023,7 +5018,7 @@ async function ds() {
5023
5018
  }
5024
5019
  //#endregion
5025
5020
  //#region src/core/onboard-env.ts
5026
- function fs(e) {
5021
+ function ms(e) {
5027
5022
  let t = [], n = "";
5028
5023
  for (let r of e.split(/\r?\n/)) {
5029
5024
  let e = r.trim();
@@ -5049,7 +5044,14 @@ function fs(e) {
5049
5044
  }
5050
5045
  return t;
5051
5046
  }
5052
- function ps(e, t, n) {
5047
+ function hs(e) {
5048
+ let t = e.trim();
5049
+ if (t === "") return "";
5050
+ if (t.length <= 4) return "•".repeat(t.length);
5051
+ let n = Math.min(t.length - 4, 8);
5052
+ return `${"•".repeat(n)}${t.slice(-4)}`;
5053
+ }
5054
+ function gs(e, t, n) {
5053
5055
  let r = e.split(/\r?\n/), i = !1, a = r.map((e) => {
5054
5056
  if (i) return e;
5055
5057
  let r = e.trim();
@@ -5059,48 +5061,48 @@ function ps(e, t, n) {
5059
5061
  });
5060
5062
  return i ? a.join("\n") : e + `${e.length > 0 && !e.endsWith("\n") ? "\n" : ""}${t}=${n}\n`;
5061
5063
  }
5062
- async function ms(e) {
5064
+ async function _s(e) {
5063
5065
  return await J(e) ? y.readFile(e, "utf-8") : "";
5064
5066
  }
5065
- async function hs(e) {
5067
+ async function vs(e) {
5066
5068
  let t = T.join(T.dirname(e), ".env");
5067
5069
  return await J(t) || await y.copyFile(e, t), t;
5068
5070
  }
5069
- async function gs(e, t, n) {
5070
- let r = ps(await ms(e), t, n);
5071
+ async function ys(e, t, n) {
5072
+ let r = gs(await _s(e), t, n);
5071
5073
  await y.writeFile(e, r, "utf-8");
5072
5074
  }
5073
5075
  //#endregion
5074
5076
  //#region src/commands/onboard.ts
5075
- async function _s(e = {}) {
5077
+ async function bs(e = {}) {
5076
5078
  let t = e.cwd ?? process.cwd();
5077
- Ba(), s.intro(z.brandBold("Onboard your stack"));
5079
+ Va(), s.intro(z.brandBold("Onboard your stack"));
5078
5080
  let n;
5079
5081
  try {
5080
- n = await Or(t);
5082
+ n = await Dr(t);
5081
5083
  } catch {
5082
5084
  n = null;
5083
5085
  }
5084
5086
  n || (s.cancel(`${z.path("stack.json")} not found. Run ${z.command("npx @hype-stack/cli init")} first.`), process.exit(1));
5085
- let r = n.installedPacks ?? [], i = n.onboarding?.envSections ?? [], a = await mo(t);
5087
+ let r = n.installedPacks ?? [], i = n.onboarding?.envSections ?? [], a = await ho(t);
5086
5088
  a.length === 0 && s.log.warn(z.muted("No .env.example files found; skipping env setup."));
5087
- for (let n of a) await vs({
5089
+ for (let n of a) await xs({
5088
5090
  examplePath: n,
5089
5091
  projectRoot: t,
5090
5092
  skipPrompts: e.yes ?? !1,
5091
5093
  installedEnvSections: i
5092
5094
  });
5093
- let o = Dr(r);
5094
- o.length > 0 && s.note(o.map((e) => ` ${z.muted("·")} ${e}`).join("\n"), "Tips"), e.skipMigrations || await xs(t, e.yes ?? !1), s.outro(z.brand(`All set. Run ${z.command("pnpm dev")} to start your app.`));
5095
+ let o = Er(r);
5096
+ o.length > 0 && s.note(o.map((e) => ` ${z.muted("·")} ${e}`).join("\n"), "Tips"), e.skipMigrations || await ws(t, e.yes ?? !1), s.outro(z.brand(`All set. Run ${z.command("pnpm dev")} to start your app.`));
5095
5097
  }
5096
- async function vs(e) {
5097
- let { examplePath: t, projectRoot: n, skipPrompts: r, installedEnvSections: i } = e, a = T.relative(n, t) || t, o = await hs(t), c = await ms(o), l = fs(await y.readFile(t, "utf-8")), u = z.path(a);
5098
+ async function xs(e) {
5099
+ let { examplePath: t, projectRoot: n, skipPrompts: r, installedEnvSections: i } = e, a = T.relative(n, t) || t, o = await vs(t), c = await _s(o), l = ms(await y.readFile(t, "utf-8")), u = z.path(a);
5098
5100
  s.log.step(`Env: ${u}`);
5099
5101
  for (let e of l) {
5100
5102
  if (e.vars.length === 0) continue;
5101
- if (!Cr(e.section, i)) {
5103
+ if (!Sr(e.section, i)) {
5102
5104
  let t = e.section ? z.bold(e.section) : z.bold("Variables");
5103
- s.log.info(`${t} ${z.muted("skipped (pack not installed)")}`);
5105
+ s.log.info(`${t} ${z.muted("skipped (not owned by an installed pack)")}`);
5104
5106
  continue;
5105
5107
  }
5106
5108
  let t = xr(e.section), n = e.section ? z.bold(e.section) : z.bold("Variables");
@@ -5110,7 +5112,7 @@ async function vs(e) {
5110
5112
  s.log.info(`${z.label(n.key)} ${z.muted("skipped (non-interactive)")}`);
5111
5113
  continue;
5112
5114
  }
5113
- let e = ys(c, n.key), i = await s.text({
5115
+ let e = hs(Ss(c, n.key)), i = await s.text({
5114
5116
  message: `${z.label(n.key)}`,
5115
5117
  placeholder: e ? `${e} ${z.muted("(Enter keeps this)")}` : t.hint
5116
5118
  });
@@ -5120,31 +5122,31 @@ async function vs(e) {
5120
5122
  s.log.info(z.muted(`${n.key} unchanged.`));
5121
5123
  continue;
5122
5124
  }
5123
- await gs(o, n.key, a), s.log.success(`${n.key} saved`);
5125
+ await ys(o, n.key, a), s.log.success(`${n.key} saved`);
5124
5126
  }
5125
5127
  }
5126
5128
  }
5127
- function ys(e, t) {
5129
+ function Ss(e, t) {
5128
5130
  for (let n of e.split(/\r?\n/)) {
5129
- let e = n.match(RegExp(`^${bs(t)}\\s*=\\s*(.*)$`));
5131
+ let e = n.match(RegExp(`^${Cs(t)}\\s*=\\s*(.*)$`));
5130
5132
  if (e) return e[1].trim();
5131
5133
  }
5132
5134
  return "";
5133
5135
  }
5134
- function bs(e) {
5136
+ function Cs(e) {
5135
5137
  return e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
5136
5138
  }
5137
- async function xs(e, t) {
5138
- if (!await da() && !await pa(e, t, !1)) {
5139
+ async function ws(e, t) {
5140
+ if (!await fa() && !await ma(e, t, !1)) {
5139
5141
  s.log.info(z.muted(`Start services later with ${z.command("docker compose up -d")} (in apps/backend), then ${z.command("pnpm --filter @internal/backend migration:latest")}.`));
5140
5142
  return;
5141
5143
  }
5142
5144
  let n = s.spinner();
5143
- if (n.start("Waiting for Postgres to be ready..."), !await ha(e)) {
5145
+ if (n.start("Waiting for Postgres to be ready..."), !await ga(e)) {
5144
5146
  n.error("Postgres health check timed out"), s.log.warn(z.muted(`Run migrations manually once Postgres is ready: ${z.command("pnpm --filter @internal/backend migration:latest")}`));
5145
5147
  return;
5146
5148
  }
5147
- if (n.stop(z.success("Postgres is ready")), await _a(e)) {
5149
+ if (n.stop(z.success("Postgres is ready")), await va(e)) {
5148
5150
  s.log.info(z.muted("Migrations already applied, skipping."));
5149
5151
  return;
5150
5152
  }
@@ -5156,20 +5158,20 @@ async function xs(e, t) {
5156
5158
  s.log.info(z.muted("Skipping database migrations."));
5157
5159
  return;
5158
5160
  }
5159
- await va(e);
5161
+ await ya(e);
5160
5162
  }
5161
5163
  //#endregion
5162
5164
  //#region src/core/templates.ts
5163
- var Ss = K.createRequest()({
5165
+ var Ts = K.createRequest()({
5164
5166
  endpoint: "/templates/list",
5165
5167
  method: "GET"
5166
5168
  });
5167
- async function Cs() {
5168
- let { data: e, error: t } = await Ss.send();
5169
+ async function Es() {
5170
+ let { data: e, error: t } = await Ts.send();
5169
5171
  if (t || !e) throw Error(`Failed to fetch template list: ${String(t)}`);
5170
5172
  return e.templates;
5171
5173
  }
5172
- async function ws(e) {
5174
+ async function Ds(e) {
5173
5175
  let { data: t, error: n, status: r } = await K.createRequest()({
5174
5176
  endpoint: `/templates/${encodeURIComponent(e)}/manifest`,
5175
5177
  method: "GET"
@@ -5178,7 +5180,7 @@ async function ws(e) {
5178
5180
  if (n || !t) throw Error(`Failed to load manifest for template "${e}": ${String(n)}`);
5179
5181
  return t;
5180
5182
  }
5181
- async function Ts(e, t = {}) {
5183
+ async function Os(e, t = {}) {
5182
5184
  let n = K.createRequest()({
5183
5185
  endpoint: `/templates/${encodeURIComponent(e)}/download`,
5184
5186
  method: "POST"
@@ -5206,21 +5208,21 @@ async function Ts(e, t = {}) {
5206
5208
  }
5207
5209
  //#endregion
5208
5210
  //#region src/commands/template.ts
5209
- async function Es(t = {}) {
5211
+ async function ks(t = {}) {
5210
5212
  let n = t.cwd ?? process.cwd();
5211
- Ba();
5213
+ Va();
5212
5214
  let r = s.spinner();
5213
5215
  r.start("Loading packs...");
5214
5216
  let o;
5215
5217
  try {
5216
- o = await Br();
5218
+ o = await zr();
5217
5219
  } catch (e) {
5218
5220
  r.stop("Failed to load packs"), s.cancel(`Could not reach Hype Stack. Check your connection and try again.\n${$(e)}`), process.exit(1);
5219
5221
  }
5220
5222
  r.stop("Packs loaded"), r.start("Loading templates...");
5221
5223
  let c;
5222
5224
  try {
5223
- c = await Cs();
5225
+ c = await Es();
5224
5226
  } catch (e) {
5225
5227
  r.stop("Failed to load templates"), s.cancel(`Could not reach Hype Stack. Check your connection and try again.\n${$(e)}`), process.exit(1);
5226
5228
  }
@@ -5243,32 +5245,32 @@ async function Es(t = {}) {
5243
5245
  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}`);
5244
5246
  let d;
5245
5247
  try {
5246
- d = await ws(u.id);
5248
+ d = await Ds(u.id);
5247
5249
  } catch (e) {
5248
5250
  s.cancel($(e)), process.exit(1);
5249
5251
  }
5250
- let f = await rs(n, {}, {
5252
+ let f = await as(n, {}, {
5251
5253
  defaultTheme: d.theme,
5252
5254
  defaultMode: d.defaultMode
5253
5255
  }), p = f?.projectRoot ?? null, m = f?.scaffolded ?? !1, h;
5254
5256
  try {
5255
- h = await Or(p ?? n);
5257
+ h = await Dr(p ?? n);
5256
5258
  } catch (e) {
5257
5259
  s.cancel(`Could not parse ${z.path("stack.json")}: ${$(e)} Run 'npx @hype-stack/cli init' to regenerate it.`), process.exit(1);
5258
5260
  }
5259
5261
  h || (s.cancel(p ? `Could not read ${z.path("stack.json")}. Run 'npx @hype-stack/cli init' to regenerate it, then run 'npx @hype-stack/cli template' again.` : `No ${z.path("stack.json")}. Run 'npx @hype-stack/cli init' first, then 'npx @hype-stack/cli template'.`), process.exit(1)), h.paths || (s.cancel(`${z.path("stack.json")} is missing ${z.path("paths")}. Run 'npx @hype-stack/cli init' again to regenerate it.`), process.exit(1));
5260
5262
  let g = p ?? n;
5261
5263
  s.intro(z.brandBold("Install a template"));
5262
- let _ = h.installedPacks ?? [], v = new Set(_), b = new Map(o.map((e) => [e.name, e])), x = t.licenseKey ?? h.licenseKey ?? null, S = (await Kn(I()))?.token ?? null, C = await Ds(u, t.variants, t.yes ?? !1), w = Da(u.slots, C), E = Oa(u.slots, u.packs, w), D = await Os({
5264
+ let _ = h.installedPacks ?? [], v = new Set(_), b = new Map(o.map((e) => [e.name, e])), x = t.licenseKey ?? h.licenseKey ?? null, S = (await Kn(I()))?.token ?? null, C = await As(u, t.variants, t.yes ?? !1), w = Oa(u.slots, C), E = ka(u.slots, u.packs, w), D = await js({
5263
5265
  packs: o,
5264
5266
  templatePacks: E,
5265
5267
  installedSet: v,
5266
5268
  options: t
5267
5269
  }), O = [...E, ...D.filter((e) => !E.includes(e))], k = O.filter((e) => !b.has(e));
5268
5270
  k.length > 0 && (s.cancel(`Unknown pack${k.length === 1 ? "" : "s"}: ${k.join(", ")}`), process.exit(1));
5269
- let ee = ja(o, w), A = Ca(ee), te;
5271
+ let ee = Ma(o, w), A = wa(ee), te;
5270
5272
  try {
5271
- te = Ta(O, A, _);
5273
+ te = Ea(O, A, _);
5272
5274
  } catch (e) {
5273
5275
  s.cancel($(e)), process.exit(1);
5274
5276
  }
@@ -5276,13 +5278,13 @@ async function Es(t = {}) {
5276
5278
  s.outro(z.muted("Every pack in this template is already installed."));
5277
5279
  return;
5278
5280
  }
5279
- let j = await Lo(ee, v, {
5281
+ let j = await zo(ee, v, {
5280
5282
  token: S,
5281
5283
  key: x
5282
5284
  }), ne = (e) => {
5283
5285
  let t = b.get(e);
5284
5286
  return !t || t.tier === "free" ? "free" : j[e]?.owned ? "owned" : "locked";
5285
- }, M = (e) => !v.has(e) && ne(e) === "locked", N = Ea({
5287
+ }, M = (e) => !v.has(e) && ne(e) === "locked", N = Da({
5286
5288
  order: te.order,
5287
5289
  graph: A,
5288
5290
  isLocked: M,
@@ -5290,28 +5292,28 @@ async function Es(t = {}) {
5290
5292
  });
5291
5293
  if (N.blocked.length > 0 && !S && !x) {
5292
5294
  let e = await nr();
5293
- e && (S = e, j = await Lo(ee, v, {
5295
+ e && (S = e, j = await zo(ee, v, {
5294
5296
  token: S,
5295
5297
  key: x
5296
- }), N = Ea({
5298
+ }), N = Da({
5297
5299
  order: te.order,
5298
5300
  graph: A,
5299
5301
  isLocked: M,
5300
5302
  installed: _
5301
5303
  }));
5302
5304
  }
5303
- if (N.blocked.length > 0 && await zo(N.blocked, M, b), N.installable.length === 0) {
5305
+ if (N.blocked.length > 0 && await Vo(N.blocked, M, b), N.installable.length === 0) {
5304
5306
  s.outro(z.muted("Nothing left to install once locked packs are removed."));
5305
5307
  return;
5306
5308
  }
5307
- if (Bo(N.installable, b), !t.yes) {
5309
+ if (Ho(N.installable, b), !t.yes) {
5308
5310
  let e = await s.confirm({ message: `Install template ${z.brandBold(u.name)} (${N.installable.length} pack${N.installable.length === 1 ? "" : "s"})?` });
5309
5311
  (s.isCancel(e) || !e) && (s.cancel("Installation cancelled."), process.exit(0));
5310
5312
  }
5311
5313
  r.start("Downloading packs...");
5312
5314
  let P;
5313
5315
  try {
5314
- P = await Vo(N.installable, {
5316
+ P = await Uo(N.installable, {
5315
5317
  token: S,
5316
5318
  key: x
5317
5319
  });
@@ -5319,7 +5321,7 @@ async function Es(t = {}) {
5319
5321
  r.stop("Download failed"), s.cancel($(e)), process.exit(1);
5320
5322
  }
5321
5323
  r.stop(`Downloaded ${P.length} pack${P.length === 1 ? "" : "s"}`);
5322
- let re = await Go({
5324
+ let re = await qo({
5323
5325
  prepared: P,
5324
5326
  config: h,
5325
5327
  cwd: g,
@@ -5328,7 +5330,7 @@ async function Es(t = {}) {
5328
5330
  }), F = null;
5329
5331
  try {
5330
5332
  r.start("Installing pack files...");
5331
- let n = await Qi({
5333
+ let n = await $i({
5332
5334
  packs: P,
5333
5335
  config: h,
5334
5336
  projectRoot: g,
@@ -5340,15 +5342,15 @@ async function Es(t = {}) {
5340
5342
  for (let e of n.errors) s.log.error(e);
5341
5343
  s.cancel("No files were written. Fix the errors above (or pass --force for existing files) and try again."), process.exit(1);
5342
5344
  }
5343
- r.stop("Files installed"), n.installed.length > 0 && s.log.success(`${z.highlight(String(n.installed.length))} files installed`), n.skipped.length > 0 && (s.log.warning(`${n.skipped.length} files skipped (use --force to overwrite)`), Wo(n.skipped));
5345
+ r.stop("Files installed"), n.installed.length > 0 && s.log.success(`${z.highlight(String(n.installed.length))} files installed`), n.skipped.length > 0 && (s.log.warning(`${n.skipped.length} files skipped (use --force to overwrite)`), Ko(n.skipped));
5344
5346
  for (let e of n.errors) s.log.error(e);
5345
5347
  r.start("Applying template overrides...");
5346
- let o = await Ts(u.id, {
5348
+ let o = await Os(u.id, {
5347
5349
  token: S,
5348
5350
  licenseKey: x
5349
5351
  });
5350
5352
  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)), F = o.templateDir;
5351
- let c = await ea({
5353
+ let c = await ta({
5352
5354
  manifest: d,
5353
5355
  config: h,
5354
5356
  projectRoot: g,
@@ -5358,11 +5360,11 @@ async function Es(t = {}) {
5358
5360
  for (let e of c.errors) s.log.error(e);
5359
5361
  if (!m) {
5360
5362
  let t = T.resolve(g, h.paths?.frontend.root ?? "apps/frontend"), n = d.theme ?? "zinc-mono";
5361
- a(n) && (await no(t, i(n)) ? s.log.success(`Applied the ${i(n).label} theme`) : s.log.warning(z.muted(`Could not find ${z.path("assets/styles.css")} to apply the theme`)));
5363
+ a(n) && (await ro(t, i(n)) ? s.log.success(`Applied the ${i(n).label} theme`) : s.log.warning(z.muted(`Could not find ${z.path("assets/styles.css")} to apply the theme`)));
5362
5364
  let r = d.defaultMode === "dark" || d.defaultMode === "light" ? d.defaultMode : e;
5363
- await Xa(t, r) ? s.log.success(`Default color mode set to ${r}`) : s.log.warning(z.muted(`Could not find ${z.path("src/hooks/use-theme.ts")} to set the default color mode`));
5365
+ await Za(t, r) ? s.log.success(`Default color mode set to ${r}`) : s.log.warning(z.muted(`Could not find ${z.path("src/hooks/use-theme.ts")} to set the default color mode`));
5364
5366
  }
5365
- await ks({
5367
+ await Ms({
5366
5368
  prepared: P,
5367
5369
  templateNpm: d.dependencies_npm,
5368
5370
  paths: h.paths,
@@ -5370,13 +5372,13 @@ async function Es(t = {}) {
5370
5372
  spinner: r
5371
5373
  });
5372
5374
  let l;
5373
- m && (l = await Sa(g, t.yes ?? !1)), await pr({
5375
+ m && (l = await Ca(g, t.yes ?? !1)), await pr({
5374
5376
  projectRoot: g,
5375
5377
  paths: h.paths,
5376
5378
  skipPrompts: t.yes ?? !1,
5377
5379
  dbReady: l,
5378
5380
  freshScaffold: m
5379
- }), Uo(), s.outro(z.brand(`Installed template ${u.name}.`));
5381
+ }), Go(), s.outro(z.brand(`Installed template ${u.name}.`));
5380
5382
  } finally {
5381
5383
  await Promise.all(P.map((e) => y.rm(e.packDir, {
5382
5384
  recursive: !0,
@@ -5387,7 +5389,7 @@ async function Es(t = {}) {
5387
5389
  });
5388
5390
  }
5389
5391
  }
5390
- async function Ds(e, t, n) {
5392
+ async function As(e, t, n) {
5391
5393
  let r = {};
5392
5394
  for (let i of e.slots) {
5393
5395
  if (t?.[i.family]) {
@@ -5411,7 +5413,7 @@ async function Ds(e, t, n) {
5411
5413
  }
5412
5414
  return r;
5413
5415
  }
5414
- async function Os(e) {
5416
+ async function js(e) {
5415
5417
  let { packs: t, templatePacks: n, installedSet: r, options: i } = e, a = new Set(n);
5416
5418
  if (i.packs && i.packs.length > 0) {
5417
5419
  let e = i.packs.filter((e) => !t.some((t) => t.name === e));
@@ -5422,7 +5424,7 @@ async function Os(e) {
5422
5424
  if (o.length === 0) return [];
5423
5425
  let c = ce();
5424
5426
  s.note(o.map((e) => ` ${B.arrow} ${z.highlight(e.displayName)} ${ge(`${c}/packs/${e.name}`)}`).join("\n"), "Browse packs");
5425
- let l = await Ua({
5427
+ let l = await Wa({
5426
5428
  message: "Add extra packs on top of the template (optional)",
5427
5429
  options: o.map((e) => ({
5428
5430
  value: e.name,
@@ -5433,25 +5435,25 @@ async function Os(e) {
5433
5435
  });
5434
5436
  return m(l) && (s.cancel("Cancelled."), process.exit(0)), l;
5435
5437
  }
5436
- async function ks(e) {
5437
- let { prepared: t, templateNpm: n, paths: r, cwd: i, spinner: a } = e, o = Fo(t.map((e) => e.manifest.dependencies_npm)), c = Po(n ? Fo([o, n]) : o, r);
5438
+ async function Ms(e) {
5439
+ let { prepared: t, templateNpm: n, paths: r, cwd: i, spinner: a } = e, o = Lo(t.map((e) => e.manifest.dependencies_npm)), c = Io(n ? Lo([o, n]) : o, r);
5438
5440
  if (c.errors.length > 0) {
5439
5441
  for (let e of c.errors) s.log.error(e);
5440
5442
  return;
5441
5443
  }
5442
5444
  if (c.operations.length === 0) return;
5443
5445
  a.start("Installing npm dependencies...");
5444
- let l = await Io(c.operations, i);
5446
+ let l = await Ro(c.operations, i);
5445
5447
  if (a.stop(l.ok ? "npm dependencies installed" : "npm dependency installation failed"), !l.ok) for (let e of l.errors) s.log.error(e);
5446
5448
  }
5447
5449
  //#endregion
5448
5450
  //#region src/cli.ts
5449
- function As(e) {
5451
+ function Ns(e) {
5450
5452
  if (!e) return;
5451
5453
  let t = e.split(",").map((e) => e.trim()).filter((e) => e.length > 0);
5452
5454
  return t.length > 0 ? t : void 0;
5453
5455
  }
5454
- function js(e) {
5456
+ function Ps(e) {
5455
5457
  if (!e) return;
5456
5458
  let t = {};
5457
5459
  for (let n of e.split(",")) {
@@ -5460,10 +5462,10 @@ function js(e) {
5460
5462
  }
5461
5463
  return Object.keys(t).length > 0 ? t : void 0;
5462
5464
  }
5463
- function Ms() {
5465
+ function Fs() {
5464
5466
  let e = new o();
5465
5467
  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) => {
5466
- await ts({
5468
+ await rs({
5467
5469
  name: e.name,
5468
5470
  directory: e.directory,
5469
5471
  install: e.install,
@@ -5473,38 +5475,38 @@ function Ms() {
5473
5475
  setup: e.setup
5474
5476
  });
5475
5477
  }), e.command("init").description("Initialize stack.json in the current project").action(async () => {
5476
- await ns({});
5478
+ await is({});
5477
5479
  }), 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) => {
5478
- await _s({
5480
+ await bs({
5479
5481
  cwd: e.cwd,
5480
5482
  yes: e.yes,
5481
5483
  skipMigrations: e.skipMigrations
5482
5484
  });
5483
5485
  }), 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) => {
5484
- await is({
5485
- packs: As(e.packs),
5486
+ await os({
5487
+ packs: Ns(e.packs),
5486
5488
  force: e.force,
5487
5489
  yes: e.yes,
5488
5490
  licenseKey: e.key ?? e.licenseKey,
5489
5491
  cwd: e.cwd
5490
5492
  });
5491
5493
  }), 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) => {
5492
- await Es({
5494
+ await ks({
5493
5495
  templateId: e,
5494
- variants: js(t.variants),
5495
- packs: As(t.packs),
5496
+ variants: Ps(t.variants),
5497
+ packs: Ns(t.packs),
5496
5498
  force: t.force,
5497
5499
  yes: t.yes,
5498
5500
  licenseKey: t.key ?? t.licenseKey,
5499
5501
  cwd: t.cwd
5500
5502
  });
5501
5503
  }), e.command("login").description("Log in via your browser to install packs your organization owns").action(async () => {
5502
- await us();
5504
+ await fs();
5503
5505
  }), e.command("logout").description("Log out and remove the saved CLI token").action(async () => {
5504
- await ds();
5506
+ await ps();
5505
5507
  }), e.command("auth").description("Alias for `login`").action(async () => {
5506
- await us();
5508
+ await fs();
5507
5509
  }), e;
5508
5510
  }
5509
5511
  //#endregion
5510
- export { rs as a, is as i, ds as n, ns as o, us as r, ts as s, Ms as t };
5512
+ export { as as a, os as i, ps as n, is as o, fs as r, rs as s, Fs as t };