@hype-stack/cli 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -13,7 +13,7 @@ import { Prompt as D } from "@clack/core";
13
13
  import { styleText as O } from "node:util";
14
14
  import { downloadTemplate as ee } from "giget";
15
15
  //#region src/constants/constants.ts
16
- var k = "0.4.0", te = "gh:BetterTyped/hype-stack", ne = "stack.json", re = "/schema/stack.json", A = "https://api.hype-stack.dev", j = "HYPE_STACK_API_URL", ie = "https://www.hype-stack.dev", M = /^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/, ae = [
16
+ var k = "0.5.0", te = "gh:BetterTyped/hype-stack", ne = "stack.json", re = "/schema/stack.json", A = "https://api.hype-stack.dev", j = "HYPE_STACK_API_URL", ie = "https://www.hype-stack.dev", M = /^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/, ae = [
17
17
  {
18
18
  value: "cursor",
19
19
  label: "Cursor",
@@ -2437,48 +2437,56 @@ async function ur(e) {
2437
2437
  return;
2438
2438
  }
2439
2439
  let l = o.spinner();
2440
- if (l.start("Generating Prisma client..."), (await i("pnpm", [
2440
+ l.start("Generating Prisma client...");
2441
+ let u = await i("pnpm", [
2441
2442
  "exec",
2442
2443
  "prisma",
2443
2444
  "generate"
2444
- ], { cwd: s })).exitCode !== 0) {
2445
- l.stop(L.warning("Prisma client generation failed")), lr(a);
2445
+ ], { cwd: s });
2446
+ if (u.exitCode !== 0) {
2447
+ l.error("Prisma client generation failed"), dr(u), lr(a);
2446
2448
  return;
2447
2449
  }
2448
2450
  l.stop(L.success("Prisma client generated"));
2449
- let u = o.spinner();
2450
- if (u.start("Applying database schema..."), (await i("pnpm", [
2451
+ let d = o.spinner();
2452
+ d.start("Applying database schema...");
2453
+ let f = await i("pnpm", [
2451
2454
  "exec",
2452
2455
  "prisma",
2453
2456
  "migrate",
2454
2457
  "dev",
2455
2458
  "--name",
2456
2459
  "add-packs"
2457
- ], { cwd: s })).exitCode !== 0) {
2458
- u.stop(L.warning("Database migration failed (is your database running?)")), lr(a);
2460
+ ], { cwd: s });
2461
+ if (f.exitCode !== 0) {
2462
+ d.error("Database migration failed (is your database running?)"), dr(f), lr(a);
2459
2463
  return;
2460
2464
  }
2461
- u.stop(L.success("Database schema applied"));
2465
+ d.stop(L.success("Database schema applied"));
2466
+ }
2467
+ function dr(e) {
2468
+ let t = (e.stderr || e.stdout).trim();
2469
+ t && o.log.warn(L.muted(t));
2462
2470
  }
2463
2471
  //#endregion
2464
2472
  //#region src/core/stack-config.ts
2465
- async function dr(e) {
2473
+ async function fr(e) {
2466
2474
  return ir(w.join(e, ne));
2467
2475
  }
2468
- async function fr(e) {
2476
+ async function pr(e) {
2469
2477
  return Y(w.join(e, ne));
2470
2478
  }
2471
- async function pr(e, t) {
2479
+ async function mr(e, t) {
2472
2480
  await ar(w.join(e, ne), t);
2473
2481
  }
2474
- async function mr(e) {
2482
+ async function hr(e) {
2475
2483
  let t = w.join(e, "apps"), n = w.join(e, "packages"), [r, i] = await Promise.all([or(t), or(n)]);
2476
2484
  return {
2477
2485
  apps: r,
2478
2486
  packages: i
2479
2487
  };
2480
2488
  }
2481
- function hr(e) {
2489
+ function gr(e) {
2482
2490
  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";
2483
2491
  return {
2484
2492
  backend: {
@@ -2512,19 +2520,19 @@ function hr(e) {
2512
2520
  }
2513
2521
  };
2514
2522
  }
2515
- function gr(e, t) {
2523
+ function _r(e, t) {
2516
2524
  return {
2517
2525
  $schema: de(),
2518
2526
  version: 1,
2519
2527
  name: e,
2520
2528
  apps: t.apps,
2521
2529
  packages: t.packages,
2522
- paths: hr(t),
2530
+ paths: gr(t),
2523
2531
  installedPacks: [],
2524
2532
  licenseKey: null
2525
2533
  };
2526
2534
  }
2527
- async function _r(e) {
2535
+ async function vr(e) {
2528
2536
  let t = w.join(e, "package.json"), n = w.join(e, "apps"), [r, i] = await Promise.all([Y(t), nr(n)]);
2529
2537
  return r && i;
2530
2538
  }
@@ -2539,7 +2547,7 @@ function X(e, t) {
2539
2547
  }
2540
2548
  //#endregion
2541
2549
  //#region src/core/registry.ts
2542
- async function vr(e) {
2550
+ async function yr(e) {
2543
2551
  let { data: t, error: n, status: r } = await q.createRequest()({
2544
2552
  endpoint: `/packs/${encodeURIComponent(e)}/manifest`,
2545
2553
  method: "GET"
@@ -2548,7 +2556,7 @@ async function vr(e) {
2548
2556
  if (n || !t) throw Error(`Failed to load manifest for "${e}": ${String(n)}`);
2549
2557
  return t;
2550
2558
  }
2551
- async function yr(e, t = {}) {
2559
+ async function br(e, t = {}) {
2552
2560
  let n = q.createRequest()({
2553
2561
  endpoint: `/packs/${encodeURIComponent(e)}/download`,
2554
2562
  method: "POST"
@@ -2574,23 +2582,23 @@ async function yr(e, t = {}) {
2574
2582
  packDir: s
2575
2583
  };
2576
2584
  }
2577
- function br(e, t, n) {
2585
+ function xr(e, t, n) {
2578
2586
  let r = X(e, t);
2579
2587
  return w.resolve(n, r);
2580
2588
  }
2581
- function xr(e, t) {
2589
+ function Sr(e, t) {
2582
2590
  return w.join(t, e);
2583
2591
  }
2584
- var Sr = q.createRequest()({
2592
+ var Cr = q.createRequest()({
2585
2593
  endpoint: "/packs/list",
2586
2594
  method: "GET"
2587
2595
  });
2588
- async function Cr() {
2589
- let { data: e, error: t } = await Sr.send();
2596
+ async function wr() {
2597
+ let { data: e, error: t } = await Cr.send();
2590
2598
  if (t || !e) throw Error(`Failed to fetch pack list: ${String(t)}`);
2591
2599
  return e.packs;
2592
2600
  }
2593
- async function wr(e, t = {}) {
2601
+ async function Tr(e, t = {}) {
2594
2602
  if (e.length === 0) return {};
2595
2603
  let n = q.createRequest()({
2596
2604
  endpoint: "/packs/authorize",
@@ -2606,35 +2614,35 @@ async function wr(e, t = {}) {
2606
2614
  }
2607
2615
  //#endregion
2608
2616
  //#region src/core/codemods.ts
2609
- var Tr = "@hype-stack/";
2610
- function Er(e, t) {
2617
+ var Er = "@hype-stack/";
2618
+ function Dr(e, t) {
2611
2619
  return X(e === "admin" ? "{{admin.root}}" : "{{frontend.root}}", t);
2612
2620
  }
2613
- async function Dr(e, t, n) {
2621
+ async function Or(e, t, n) {
2614
2622
  let r = X("{{backend.root}}", t), i = w.resolve(n, r, "src/config/env/env.config.ts"), a = w.resolve(n, r, ".env.example"), o = w.resolve(n, r, ".env.test");
2615
2623
  if (await Y(i)) {
2616
2624
  let t = await v.readFile(i, "utf-8");
2617
- for (let n of e) t.includes(`from "${n.from}"`) || (t = Or(t, n), t = kr(t, n));
2625
+ for (let n of e) t.includes(`from "${n.from}"`) || (t = kr(t, n), t = Ar(t, n));
2618
2626
  await v.writeFile(i, t, "utf-8");
2619
2627
  }
2620
2628
  if (await Y(a)) {
2621
2629
  let t = await v.readFile(a, "utf-8");
2622
- for (let n of e) t = Ar(t, n);
2630
+ for (let n of e) t = jr(t, n);
2623
2631
  await v.writeFile(a, t, "utf-8");
2624
2632
  }
2625
2633
  if (await Y(o)) {
2626
2634
  let t = await v.readFile(o, "utf-8");
2627
- for (let n of e) t = jr(t, n);
2635
+ for (let n of e) t = Mr(t, n);
2628
2636
  await v.writeFile(o, t, "utf-8");
2629
2637
  }
2630
2638
  }
2631
- function Or(e, t) {
2639
+ function kr(e, t) {
2632
2640
  let n = `import { ${t.import} } from "${t.from}";`, r = e.lastIndexOf("import ");
2633
2641
  if (r === -1) return n + "\n" + e;
2634
2642
  let i = e.indexOf("\n", e.indexOf(";", r));
2635
2643
  return i === -1 ? e + "\n" + n : e.slice(0, i + 1) + n + "\n" + e.slice(i + 1);
2636
2644
  }
2637
- function kr(e, t) {
2645
+ function Ar(e, t) {
2638
2646
  let n = `.extend(${t.import}.shape)`;
2639
2647
  if (e.includes(n)) return e;
2640
2648
  let r = e.indexOf("export const envSchema = z.object({");
@@ -2649,27 +2657,27 @@ function kr(e, t) {
2649
2657
  let o = a + 2;
2650
2658
  return e.slice(0, o) + n + e.slice(o);
2651
2659
  }
2652
- function Ar(e, t) {
2660
+ function jr(e, t) {
2653
2661
  for (let n of Object.keys(t.envExample.vars)) if (e.includes(`${n}=`)) return e;
2654
2662
  let n = [];
2655
2663
  n.push(""), n.push(`# ${t.envExample.section}`);
2656
2664
  for (let [e, r] of Object.entries(t.envExample.vars)) n.push(`${e}=${r}`);
2657
2665
  return e.trimEnd() + "\n" + n.join("\n") + "\n";
2658
2666
  }
2659
- function jr(e, t) {
2667
+ function Mr(e, t) {
2660
2668
  for (let n of Object.keys(t.envTest)) if (e.includes(`${n}=`)) return e;
2661
2669
  let n = [""];
2662
2670
  for (let [e, r] of Object.entries(t.envTest)) n.push(`${e}=${r}`);
2663
2671
  return e.trimEnd() + "\n" + n.join("\n") + "\n";
2664
2672
  }
2665
- async function Mr(e, t, n) {
2673
+ async function Nr(e, t, n) {
2666
2674
  let r = w.resolve(n, X("{{backend.routes}}", t), "index.ts");
2667
2675
  if (!await Y(r)) return;
2668
2676
  let i = await v.readFile(r, "utf-8");
2669
- for (let t of e) i.includes(`from "${t.from}"`) || (i = Nr(i, t), i = Pr(i, t));
2677
+ for (let t of e) i.includes(`from "${t.from}"`) || (i = Pr(i, t), i = Fr(i, t));
2670
2678
  await v.writeFile(r, i, "utf-8");
2671
2679
  }
2672
- function Nr(e, t) {
2680
+ function Pr(e, t) {
2673
2681
  let n = `import { ${t.import} } from "${t.from}";`, r = e.lastIndexOf("from \"./");
2674
2682
  if (r !== -1) {
2675
2683
  let t = e.indexOf("\n", r);
@@ -2678,7 +2686,7 @@ function Nr(e, t) {
2678
2686
  let i = e.indexOf("export const registerRoutes");
2679
2687
  return i === -1 ? e : e.slice(0, i) + n + "\n\n" + e.slice(i);
2680
2688
  }
2681
- function Pr(e, t) {
2689
+ function Fr(e, t) {
2682
2690
  let n = `.route("${t.prefix}", ${t.import})`, r = e.match(/\.route\([^)]+\);/g);
2683
2691
  if (r) {
2684
2692
  let t = r[r.length - 1], i = e.lastIndexOf(t) + t.length - 1;
@@ -2686,14 +2694,14 @@ function Pr(e, t) {
2686
2694
  }
2687
2695
  return e.replace("return app;", `return app\n ${n};`);
2688
2696
  }
2689
- async function Fr(e, t, n) {
2697
+ async function Ir(e, t, n) {
2690
2698
  let r = w.resolve(n, X("{{backend.root}}", t), "src/context.ts");
2691
2699
  if (!await Y(r)) return;
2692
2700
  let i = await v.readFile(r, "utf-8");
2693
- for (let t of e) i.includes(`export let ${t.export}`) || (i = Ir(i, t), i = Lr(i, t), i = Rr(i, t), i = Br(i, t));
2701
+ for (let t of e) i.includes(`export let ${t.export}`) || (i = Lr(i, t), i = Rr(i, t), i = zr(i, t), i = Vr(i, t));
2694
2702
  await v.writeFile(r, i, "utf-8");
2695
2703
  }
2696
- function Ir(e, t) {
2704
+ function Lr(e, t) {
2697
2705
  let n = `import { ${t.typeImport.name} } from "${t.typeImport.from}";`;
2698
2706
  if (e.includes(`from "${t.typeImport.from}"`)) return e;
2699
2707
  let r = e.lastIndexOf("import ");
@@ -2701,7 +2709,7 @@ function Ir(e, t) {
2701
2709
  let i = e.indexOf("\n", e.indexOf(";", r));
2702
2710
  return i === -1 ? e + "\n" + n : e.slice(0, i + 1) + n + "\n" + e.slice(i + 1);
2703
2711
  }
2704
- function Lr(e, t) {
2712
+ function Rr(e, t) {
2705
2713
  let n = `export let ${t.export}: ${t.type};`, r = e.lastIndexOf("export let ");
2706
2714
  if (r === -1) {
2707
2715
  let t = e.indexOf("export const setupContext");
@@ -2710,15 +2718,15 @@ function Lr(e, t) {
2710
2718
  let i = e.indexOf("\n", r);
2711
2719
  return i === -1 ? e + "\n" + n : e.slice(0, i + 1) + n + "\n" + e.slice(i + 1);
2712
2720
  }
2713
- function Rr(e, t) {
2721
+ function zr(e, t) {
2714
2722
  let n = ` ${t.export} = ${t.init};`, r = e.match(/export const setupContext\s*=\s*async\s*\([^)]*\)\s*=>\s*\{/);
2715
2723
  if (!r) return e;
2716
2724
  let i = e.indexOf("{", e.indexOf(r[0]));
2717
2725
  if (i === -1) return e;
2718
- let a = zr(e, i);
2726
+ let a = Br(e, i);
2719
2727
  return a === -1 ? e : e.slice(0, a) + n + "\n" + e.slice(a);
2720
2728
  }
2721
- function zr(e, t) {
2729
+ function Br(e, t) {
2722
2730
  let n = 0;
2723
2731
  for (let r = t; r < e.length; r++) {
2724
2732
  let t = e[r];
@@ -2727,20 +2735,20 @@ function zr(e, t) {
2727
2735
  }
2728
2736
  return -1;
2729
2737
  }
2730
- function Br(e, t) {
2738
+ function Vr(e, t) {
2731
2739
  let n = ` ${t.export}: ${t.type};`, r = e.indexOf("export type ContextVariables = {");
2732
2740
  if (r === -1) return e;
2733
2741
  let i = e.indexOf("};", r);
2734
2742
  return i === -1 ? e : e.slice(0, i) + n + "\n" + e.slice(i);
2735
2743
  }
2736
- async function Vr(e, t, n) {
2744
+ async function Hr(e, t, n) {
2737
2745
  let r = w.resolve(n, X("{{enums.src}}", t), "index.ts");
2738
2746
  if (!await Y(r)) return;
2739
2747
  let i = await v.readFile(r, "utf-8");
2740
- for (let t of e) i.includes(`from "${t.from}"`) || (i = Hr(i, t));
2748
+ for (let t of e) i.includes(`from "${t.from}"`) || (i = Ur(i, t));
2741
2749
  await v.writeFile(r, i, "utf-8");
2742
2750
  }
2743
- function Hr(e, t) {
2751
+ function Ur(e, t) {
2744
2752
  let n = `export * from "${t.from}";`, r = e.lastIndexOf("export * from");
2745
2753
  if (r !== -1) {
2746
2754
  let t = e.indexOf("\n", r);
@@ -2748,14 +2756,14 @@ function Hr(e, t) {
2748
2756
  }
2749
2757
  return e.trim() === "" ? n + "\n" : e.trimEnd() + "\n" + n + "\n";
2750
2758
  }
2751
- async function Ur(e, t, n) {
2759
+ async function Wr(e, t, n) {
2752
2760
  let r = X("{{backend.root}}", t), i = w.resolve(n, r, "src/sockets/index.ts");
2753
2761
  if (!await Y(i)) return;
2754
2762
  let a = await v.readFile(i, "utf-8");
2755
- for (let t of e) a.includes(`from "${t.from}"`) || (a = Wr(a, t), a = Gr(a, t));
2756
- await Y(w.resolve(n, r, "src/libs/websocket/ws-authenticate.ts")) && (a = Kr(a)), await v.writeFile(i, a, "utf-8");
2763
+ for (let t of e) a.includes(`from "${t.from}"`) || (a = Gr(a, t), a = Kr(a, t));
2764
+ await Y(w.resolve(n, r, "src/libs/websocket/ws-authenticate.ts")) && (a = qr(a)), await v.writeFile(i, a, "utf-8");
2757
2765
  }
2758
- function Wr(e, t) {
2766
+ function Gr(e, t) {
2759
2767
  let n = `import { ${t.import} } from "${t.from}";`, r = e.lastIndexOf("from \"./");
2760
2768
  if (r !== -1) {
2761
2769
  let t = e.indexOf("\n", r);
@@ -2764,7 +2772,7 @@ function Wr(e, t) {
2764
2772
  let i = e.indexOf("const sockets");
2765
2773
  return i === -1 ? e : e.slice(0, i) + n + "\n\n" + e.slice(i);
2766
2774
  }
2767
- function Gr(e, t) {
2775
+ function Kr(e, t) {
2768
2776
  let n = `.socket("${t.prefix}", ${t.import})`, r = e.indexOf("const sockets");
2769
2777
  if (r === -1) return e;
2770
2778
  let i = e.indexOf("new SocketRouter", r);
@@ -2778,7 +2786,7 @@ function Gr(e, t) {
2778
2786
  }
2779
2787
  return e;
2780
2788
  }
2781
- function Kr(e) {
2789
+ function qr(e) {
2782
2790
  if (e.includes("wsAuthenticate")) return e;
2783
2791
  let t = e.indexOf("from \"@backend/libs/websocket/socket-router\""), n = e;
2784
2792
  if (t !== -1) {
@@ -2787,14 +2795,14 @@ function Kr(e) {
2787
2795
  }
2788
2796
  return n.replace("new SocketRouter()", "new SocketRouter({ authenticate: wsAuthenticate })");
2789
2797
  }
2790
- async function qr(e, t, n) {
2798
+ async function Jr(e, t, n) {
2791
2799
  let r = X("{{frontend.root}}", t), i = w.resolve(n, r, "src/api/sdk.ts");
2792
2800
  if (!await Y(i)) return;
2793
2801
  let a = await v.readFile(i, "utf-8");
2794
- for (let t of e) a.includes(`.$configure(${t.import})`) || (a = Jr(a, t), a = Yr(a, t));
2802
+ for (let t of e) a.includes(`.$configure(${t.import})`) || (a = Yr(a, t), a = Xr(a, t));
2795
2803
  await v.writeFile(i, a, "utf-8");
2796
2804
  }
2797
- function Jr(e, t) {
2805
+ function Yr(e, t) {
2798
2806
  let n = `import { ${t.import} } from "${t.from}";`;
2799
2807
  if (e.includes(n)) return e;
2800
2808
  let r = e.lastIndexOf("from \"./");
@@ -2805,57 +2813,57 @@ function Jr(e, t) {
2805
2813
  let i = e.indexOf("export const sdk");
2806
2814
  return i === -1 ? e : e.slice(0, i) + n + "\n\n" + e.slice(i);
2807
2815
  }
2808
- function Yr(e, t) {
2816
+ function Xr(e, t) {
2809
2817
  let n = `.$configure(${t.import})`, r = e.indexOf("export const sdk");
2810
2818
  if (r === -1) return e;
2811
2819
  let i = e.indexOf(";", r);
2812
2820
  return i === -1 ? e : e.slice(0, i) + "\n " + n + e.slice(i);
2813
2821
  }
2814
- async function Xr(e, t, n) {
2822
+ async function Zr(e, t, n) {
2815
2823
  let r = w.resolve(n, X("{{backend.utils}}", t), "frontend-url/frontend-url.ts");
2816
2824
  if (!await Y(r)) return;
2817
2825
  let i = await v.readFile(r, "utf-8");
2818
- for (let t of e) i.includes(`"${t.path}"`) || (i = Zr(i, t));
2826
+ for (let t of e) i.includes(`"${t.path}"`) || (i = Qr(i, t));
2819
2827
  await v.writeFile(r, i, "utf-8");
2820
2828
  }
2821
- function Zr(e, t) {
2829
+ function Qr(e, t) {
2822
2830
  let n = ` "${t.path}": ${t.search};`, r = e.indexOf("type RouteDefinitions = {");
2823
2831
  if (r === -1) return e;
2824
2832
  let i = e.indexOf("};", r);
2825
2833
  return i === -1 ? e : e.slice(0, i) + n + "\n" + e.slice(i);
2826
2834
  }
2827
- var Qr = "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", $r = {
2835
+ var $r = "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", ei = {
2828
2836
  primary: "primaryNav",
2829
2837
  secondary: "secondaryNav",
2830
2838
  tertiary: "tertiaryNav",
2831
2839
  settings: "settingsNav"
2832
2840
  };
2833
- async function ei(e) {
2834
- let { entries: t, paths: n, projectRoot: r, slot: i = "frontend" } = e, a = Er(i, n), o = w.resolve(r, a, "src/constants/nav.constants.ts"), s;
2835
- await Y(o) ? s = await v.readFile(o, "utf-8") : (await v.mkdir(w.dirname(o), { recursive: !0 }), s = Qr);
2836
- for (let e of t) s.includes(`label: "${e.label}"`) || (s = ri(s, e));
2837
- for (let e of t.toReversed()) s.includes(`label: "${e.label}"`) || (s = ai(s, e));
2841
+ async function ti(e) {
2842
+ let { entries: t, paths: n, projectRoot: r, slot: i = "frontend" } = e, a = Dr(i, n), o = w.resolve(r, a, "src/constants/nav.constants.ts"), s;
2843
+ await Y(o) ? s = await v.readFile(o, "utf-8") : (await v.mkdir(w.dirname(o), { recursive: !0 }), s = $r);
2844
+ for (let e of t) s.includes(`label: "${e.label}"`) || (s = ii(s, e));
2845
+ for (let e of t.toReversed()) s.includes(`label: "${e.label}"`) || (s = oi(s, e));
2838
2846
  await v.writeFile(o, s, "utf-8");
2839
2847
  }
2840
- async function ti(e) {
2841
- let { postLoginRedirect: t, paths: n, projectRoot: r, slot: i = "frontend" } = e, a = Er(i, n), o = w.resolve(r, a, "src/features/auth/constants/auth.constants.ts");
2848
+ async function ni(e) {
2849
+ let { postLoginRedirect: t, paths: n, projectRoot: r, slot: i = "frontend" } = e, a = Dr(i, n), o = w.resolve(r, a, "src/features/auth/constants/auth.constants.ts");
2842
2850
  if (!await Y(o)) return;
2843
2851
  let s = await v.readFile(o, "utf-8"), c = /export const POST_LOGIN_REDIRECT_PATH = "[^"]*";/;
2844
2852
  if (!c.test(s)) return;
2845
2853
  let l = s.replace(c, `export const POST_LOGIN_REDIRECT_PATH = "${t}";`);
2846
2854
  await v.writeFile(o, l, "utf-8");
2847
2855
  }
2848
- function ni(e) {
2856
+ function ri(e) {
2849
2857
  let t = [e.icon];
2850
2858
  if (e.items) for (let n of e.items) t.includes(n.icon) || t.push(n.icon);
2851
2859
  return t;
2852
2860
  }
2853
- function ri(e, t) {
2854
- let n = ni(t), r = e;
2855
- for (let e of n) r = ii(r, e);
2861
+ function ii(e, t) {
2862
+ let n = ri(t), r = e;
2863
+ for (let e of n) r = ai(r, e);
2856
2864
  return r;
2857
2865
  }
2858
- function ii(e, t) {
2866
+ function ai(e, t) {
2859
2867
  let n = e.match(/import \{([^}]+)\} from "lucide-react";/);
2860
2868
  if (!n) return e;
2861
2869
  let r = n[1].split(",").map((e) => e.trim()).filter(Boolean);
@@ -2863,21 +2871,21 @@ function ii(e, t) {
2863
2871
  let i = r.findIndex((e) => e.startsWith("type "));
2864
2872
  return i === -1 ? r.push(t) : r.splice(i, 0, t), e.replace(n[0], `import { ${r.join(", ")} } from "lucide-react";`);
2865
2873
  }
2866
- function ai(e, t) {
2867
- let n = $r[t.group];
2874
+ function oi(e, t) {
2875
+ let n = ei[t.group];
2868
2876
  if (!n) return e;
2869
- let r = si(t), i = RegExp(`export const ${n}: NavEntry\\[\\] = \\[`), a = e.match(i);
2877
+ let r = ci(t), i = RegExp(`export const ${n}: NavEntry\\[\\] = \\[`), a = e.match(i);
2870
2878
  if (!a) return e;
2871
- let o = e.indexOf(a[0]) + a[0].length, s = oi(e, o - 1);
2879
+ let o = e.indexOf(a[0]) + a[0].length, s = si(e, o - 1);
2872
2880
  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);
2873
2881
  }
2874
- function oi(e, t) {
2882
+ function si(e, t) {
2875
2883
  let n = 0;
2876
2884
  for (let r = t; r < e.length; r++) if (e[r] === "[") n++;
2877
2885
  else if (e[r] === "]" && (n--, n === 0)) return r;
2878
2886
  return -1;
2879
2887
  }
2880
- function si(e) {
2888
+ function ci(e) {
2881
2889
  let t = [];
2882
2890
  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) {
2883
2891
  t.push(" items: [");
@@ -2893,14 +2901,14 @@ function si(e) {
2893
2901
  } else t.push(" items: [],");
2894
2902
  return t.push(" },"), t.join("\n");
2895
2903
  }
2896
- async function ci(e, t, n) {
2904
+ async function li(e, t, n) {
2897
2905
  let r = X("{{backend.features}}", t), i = w.resolve(n, r, "organizations/modules/setup-organization/steps/index.ts");
2898
2906
  if (!await Y(i)) return;
2899
2907
  let a = await v.readFile(i, "utf-8");
2900
- for (let t of e) a.includes(`from "${t.from}"`) || (a = li(a, t), a = ui(a, t));
2908
+ for (let t of e) a.includes(`from "${t.from}"`) || (a = ui(a, t), a = di(a, t));
2901
2909
  await v.writeFile(i, a, "utf-8");
2902
2910
  }
2903
- function li(e, t) {
2911
+ function ui(e, t) {
2904
2912
  let n = `import { ${t.import} } from "${t.from}";`, r = e.lastIndexOf("import ");
2905
2913
  if (r !== -1) {
2906
2914
  let t = e.indexOf("\n", e.indexOf(";", r));
@@ -2908,38 +2916,38 @@ function li(e, t) {
2908
2916
  }
2909
2917
  return e.indexOf("type "), n + "\n\n" + e;
2910
2918
  }
2911
- function ui(e, t) {
2919
+ function di(e, t) {
2912
2920
  let n = ` { id: "${t.id}", execute: (ctx) => ${t.import}(ctx) },`, r = e.match(/export const steps:\s*Step\[\]\s*=\s*\[/);
2913
2921
  if (!r) return e;
2914
- let i = e.indexOf(r[0]) + r[0].length, a = di(e, i - 1);
2922
+ let i = e.indexOf(r[0]) + r[0].length, a = fi(e, i - 1);
2915
2923
  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);
2916
2924
  }
2917
- function di(e, t) {
2925
+ function fi(e, t) {
2918
2926
  let n = 0;
2919
2927
  for (let r = t; r < e.length; r++) if (e[r] === "[") n++;
2920
2928
  else if (e[r] === "]" && (n--, n === 0)) return r;
2921
2929
  return -1;
2922
2930
  }
2923
- var fi = "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";
2924
- async function pi(e) {
2925
- await hi({
2931
+ var pi = "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";
2932
+ async function mi(e) {
2933
+ await gi({
2926
2934
  ...e,
2927
2935
  arrayName: "navbarActions"
2928
2936
  });
2929
2937
  }
2930
- async function mi(e) {
2931
- await hi({
2938
+ async function hi(e) {
2939
+ await gi({
2932
2940
  ...e,
2933
2941
  arrayName: "userMenuActions"
2934
2942
  });
2935
2943
  }
2936
- async function hi({ actions: e, arrayName: t, paths: n, projectRoot: r, slot: i }) {
2937
- let a = Er(i, n), o = w.resolve(r, a, "src/constants/navbar-actions.tsx"), s;
2938
- await Y(o) ? s = await v.readFile(o, "utf-8") : (await v.mkdir(w.dirname(o), { recursive: !0 }), s = fi);
2939
- for (let n of e) s = gi(s, n), s = _i(s, n, t);
2944
+ async function gi({ actions: e, arrayName: t, paths: n, projectRoot: r, slot: i }) {
2945
+ let a = Dr(i, n), o = w.resolve(r, a, "src/constants/navbar-actions.tsx"), s;
2946
+ await Y(o) ? s = await v.readFile(o, "utf-8") : (await v.mkdir(w.dirname(o), { recursive: !0 }), s = pi);
2947
+ for (let n of e) s = _i(s, n), s = vi(s, n, t);
2940
2948
  await v.writeFile(o, s, "utf-8");
2941
2949
  }
2942
- function gi(e, t) {
2950
+ function _i(e, t) {
2943
2951
  let n = `import { ${t.import} } from "${t.from}";`;
2944
2952
  if (e.includes(n)) return e;
2945
2953
  let r = e.lastIndexOf("import ");
@@ -2947,38 +2955,38 @@ function gi(e, t) {
2947
2955
  let i = e.indexOf("\n", r);
2948
2956
  return i === -1 ? e + "\n" + n : e.slice(0, i + 1) + n + "\n" + e.slice(i + 1);
2949
2957
  }
2950
- function _i(e, t, n) {
2958
+ function vi(e, t, n) {
2951
2959
  let r = e.match(RegExp(`export const ${n}:\\s*NavbarAction\\[\\]\\s*=\\s*\\[`));
2952
2960
  if (!r) return e;
2953
- let i = e.indexOf(r[0]) + r[0].length, a = vi(e, i - 1);
2961
+ let i = e.indexOf(r[0]) + r[0].length, a = yi(e, i - 1);
2954
2962
  if (a === -1) return e;
2955
2963
  let o = e.slice(i, a);
2956
2964
  if (o.includes(`id: "${t.id}"`)) return e;
2957
2965
  let s = ` { id: "${t.id}", component: ${t.import} },`;
2958
2966
  return o.trim() === "" ? e.slice(0, a) + "\n" + s + "\n" + e.slice(a) : e.slice(0, a) + s + "\n" + e.slice(a);
2959
2967
  }
2960
- function vi(e, t) {
2968
+ function yi(e, t) {
2961
2969
  let n = 0;
2962
2970
  for (let r = t; r < e.length; r++) if (e[r] === "[") n++;
2963
2971
  else if (e[r] === "]" && (n--, n === 0)) return r;
2964
2972
  return -1;
2965
2973
  }
2966
- var yi = new Set([
2974
+ var bi = new Set([
2967
2975
  ".ts",
2968
2976
  ".tsx",
2969
2977
  ".js",
2970
2978
  ".jsx"
2971
2979
  ]);
2972
- async function bi(e) {
2980
+ async function xi(e) {
2973
2981
  let { files: t, paths: n, projectRoot: r, projectName: i } = e;
2974
2982
  if (i === "hype-stack") return;
2975
2983
  let a = `@${i}/`;
2976
2984
  await Promise.all(t.map(async (e) => {
2977
- let t = br(e.target, n, r), i = await v.stat(t).catch(() => null);
2978
- i?.isDirectory() ? await Ci(t, a) : i?.isFile() && yi.has(w.extname(t)) && await wi(t, a);
2985
+ let t = xr(e.target, n, r), i = await v.stat(t).catch(() => null);
2986
+ i?.isDirectory() ? await wi(t, a) : i?.isFile() && bi.has(w.extname(t)) && await Ti(t, a);
2979
2987
  }));
2980
2988
  }
2981
- var xi = new Set([
2989
+ var Si = new Set([
2982
2990
  ".git",
2983
2991
  "node_modules",
2984
2992
  "dist",
@@ -2987,39 +2995,39 @@ var xi = new Set([
2987
2995
  ".next",
2988
2996
  "coverage"
2989
2997
  ]);
2990
- async function Si(e, t) {
2991
- t !== "hype-stack" && await Ci(e, `@${t}/`);
2992
- }
2993
2998
  async function Ci(e, t) {
2999
+ t !== "hype-stack" && await wi(e, `@${t}/`);
3000
+ }
3001
+ async function wi(e, t) {
2994
3002
  let n = await v.readdir(e, { withFileTypes: !0 });
2995
3003
  await Promise.all(n.map(async (n) => {
2996
3004
  let r = w.join(e, n.name);
2997
3005
  if (n.isDirectory()) {
2998
- if (xi.has(n.name)) return;
2999
- await Ci(r, t);
3000
- } else n.isFile() && yi.has(w.extname(n.name)) && await wi(r, t);
3006
+ if (Si.has(n.name)) return;
3007
+ await wi(r, t);
3008
+ } else n.isFile() && bi.has(w.extname(n.name)) && await Ti(r, t);
3001
3009
  }));
3002
3010
  }
3003
- async function wi(e, t) {
3011
+ async function Ti(e, t) {
3004
3012
  let n = await v.readFile(e, "utf-8");
3005
- if (!n.includes(Tr)) return;
3006
- let r = n.replaceAll(Tr, t);
3013
+ if (!n.includes(Er)) return;
3014
+ let r = n.replaceAll(Er, t);
3007
3015
  await v.writeFile(e, r, "utf-8");
3008
3016
  }
3009
3017
  //#endregion
3010
3018
  //#region src/core/installer.ts
3011
- function Ti(e, t) {
3019
+ function Ei(e, t) {
3012
3020
  return e.slot ? t ? t.includes(e.slot) : e.slot === "frontend" : !0;
3013
3021
  }
3014
- async function Ei(e, t) {
3022
+ async function Di(e, t) {
3015
3023
  if ((await v.stat(e)).isDirectory()) {
3016
3024
  await v.mkdir(t, { recursive: !0 });
3017
3025
  let n = await v.readdir(e, { withFileTypes: !0 });
3018
- for (let r of n) await Ei(w.join(e, r.name), w.join(t, r.name));
3026
+ for (let r of n) await Di(w.join(e, r.name), w.join(t, r.name));
3019
3027
  } else await v.mkdir(w.dirname(t), { recursive: !0 }), await v.copyFile(e, t);
3020
3028
  }
3021
- async function Di(e) {
3022
- let { file: t, packDir: n, paths: r, projectRoot: i } = e, a = xr(t.source, n), o = br(t.target, r, i);
3029
+ async function Oi(e) {
3030
+ let { file: t, packDir: n, paths: r, projectRoot: i } = e, a = Sr(t.source, n), o = xr(t.target, r, i);
3023
3031
  return {
3024
3032
  sourcePath: a,
3025
3033
  targetPath: o,
@@ -3027,8 +3035,8 @@ async function Di(e) {
3027
3035
  targetExists: await Y(o) || await nr(o)
3028
3036
  };
3029
3037
  }
3030
- async function Oi(e) {
3031
- let { file: t, packDir: n, paths: r, projectRoot: i } = e, { sourcePath: a, targetPath: o, sourceExists: s, targetExists: c } = await Di({
3038
+ async function ki(e) {
3039
+ let { file: t, packDir: n, paths: r, projectRoot: i } = e, { sourcePath: a, targetPath: o, sourceExists: s, targetExists: c } = await Oi({
3032
3040
  file: t,
3033
3041
  packDir: n,
3034
3042
  paths: r,
@@ -3043,8 +3051,8 @@ async function Oi(e) {
3043
3051
  default: return `${t.target}: Unknown strategy: ${String(t.strategy)}`;
3044
3052
  }
3045
3053
  }
3046
- async function ki(e) {
3047
- let { file: t, packDir: n, paths: r, projectRoot: i, force: a, overwrite: o } = e, { sourcePath: s, targetPath: c, sourceExists: l, targetExists: u } = await Di({
3054
+ async function Ai(e) {
3055
+ let { file: t, packDir: n, paths: r, projectRoot: i, force: a, overwrite: o } = e, { sourcePath: s, targetPath: c, sourceExists: l, targetExists: u } = await Oi({
3048
3056
  file: t,
3049
3057
  packDir: n,
3050
3058
  paths: r,
@@ -3062,7 +3070,7 @@ async function ki(e) {
3062
3070
  status: "skipped",
3063
3071
  path: t.target,
3064
3072
  reason: "Already exists"
3065
- } : (await Ei(s, c), {
3073
+ } : (await Di(s, c), {
3066
3074
  status: "installed",
3067
3075
  path: t.target
3068
3076
  });
@@ -3071,16 +3079,16 @@ async function ki(e) {
3071
3079
  status: "skipped",
3072
3080
  path: t.target,
3073
3081
  reason: "Already exists (skip-if-exists)"
3074
- } : (await Ei(s, c), {
3082
+ } : (await Di(s, c), {
3075
3083
  status: "installed",
3076
3084
  path: t.target
3077
3085
  });
3078
- case "override": return await Ei(s, c), {
3086
+ case "override": return await Di(s, c), {
3079
3087
  status: "installed",
3080
3088
  path: t.target
3081
3089
  };
3082
3090
  case "merge": {
3083
- if (!u) return await Ei(s, c), {
3091
+ if (!u) return await Di(s, c), {
3084
3092
  status: "installed",
3085
3093
  path: t.target
3086
3094
  };
@@ -3110,15 +3118,15 @@ async function ki(e) {
3110
3118
  };
3111
3119
  }
3112
3120
  }
3113
- async function Ai(e) {
3121
+ async function ji(e) {
3114
3122
  let { packs: t, config: n, projectRoot: r, slotsByPack: i } = e, a = n.paths;
3115
3123
  if (!a) throw Error("stack.json is missing 'paths' configuration. Run 'npx @hype-stack/cli init' to set it up.");
3116
3124
  let o = [], s = /* @__PURE__ */ new Set();
3117
3125
  for (let e of t) {
3118
3126
  let t = i?.get(e.manifest.name);
3119
3127
  for (let n of e.manifest.files) {
3120
- if (n.strategy !== "create" || !Ti(n, t)) continue;
3121
- let { targetPath: i, targetExists: c } = await Di({
3128
+ if (n.strategy !== "create" || !Ei(n, t)) continue;
3129
+ let { targetPath: i, targetExists: c } = await Oi({
3122
3130
  file: n,
3123
3131
  packDir: e.packDir,
3124
3132
  paths: a,
@@ -3133,13 +3141,13 @@ async function Ai(e) {
3133
3141
  }
3134
3142
  return o;
3135
3143
  }
3136
- async function ji(e) {
3144
+ async function Mi(e) {
3137
3145
  let { manifest: t, config: n, projectRoot: r, force: i, packDir: a, slots: o } = e, s = n.paths;
3138
3146
  if (!s) throw Error("stack.json is missing 'paths' configuration. Run 'npx @hype-stack/cli init' to set it up.");
3139
3147
  let c = [];
3140
3148
  for (let e of t.files) {
3141
- if (!Ti(e, o)) continue;
3142
- let t = await Oi({
3149
+ if (!Ei(e, o)) continue;
3150
+ let t = await ki({
3143
3151
  file: e,
3144
3152
  packDir: a,
3145
3153
  paths: s,
@@ -3150,16 +3158,16 @@ async function ji(e) {
3150
3158
  }
3151
3159
  return c;
3152
3160
  }
3153
- async function Mi(e) {
3161
+ async function Ni(e) {
3154
3162
  let { manifest: t, config: n, projectRoot: r, force: i, overwrite: a, packDir: o, slots: s } = e, c = n.paths;
3155
3163
  if (!c) throw Error("stack.json is missing 'paths' configuration. Run 'npx @hype-stack/cli init' to set it up.");
3156
3164
  let l = {
3157
3165
  installed: [],
3158
3166
  skipped: [],
3159
3167
  errors: []
3160
- }, u = t.files.filter((e) => Ti(e, s));
3168
+ }, u = t.files.filter((e) => Ei(e, s));
3161
3169
  for (let e of u) {
3162
- let t = await ki({
3170
+ let t = await Ai({
3163
3171
  file: e,
3164
3172
  packDir: o,
3165
3173
  paths: c,
@@ -3179,40 +3187,40 @@ async function Mi(e) {
3179
3187
  break;
3180
3188
  }
3181
3189
  }
3182
- await bi({
3190
+ await xi({
3183
3191
  files: u,
3184
3192
  paths: c,
3185
3193
  projectRoot: r,
3186
3194
  projectName: n.name
3187
- }), t.env && t.env.length > 0 && await Dr(t.env, c, r), t.routes && t.routes.length > 0 && await Mr(t.routes, c, r), t.context && t.context.length > 0 && await Fr(t.context, c, r), t.sockets && t.sockets.length > 0 && await Ur(t.sockets, c, r), t.sdkConfigurations && t.sdkConfigurations.length > 0 && await qr(t.sdkConfigurations, c, r), t.enums && t.enums.length > 0 && await Vr(t.enums, c, r), t.frontendRoutes && t.frontendRoutes.length > 0 && await Xr(t.frontendRoutes, c, r);
3195
+ }), t.env && t.env.length > 0 && await Or(t.env, c, r), t.routes && t.routes.length > 0 && await Nr(t.routes, c, r), t.context && t.context.length > 0 && await Ir(t.context, c, r), t.sockets && t.sockets.length > 0 && await Wr(t.sockets, c, r), t.sdkConfigurations && t.sdkConfigurations.length > 0 && await Jr(t.sdkConfigurations, c, r), t.enums && t.enums.length > 0 && await Hr(t.enums, c, r), t.frontendRoutes && t.frontendRoutes.length > 0 && await Zr(t.frontendRoutes, c, r);
3188
3196
  let d = s && s.length > 0 ? s : ["frontend"];
3189
- for (let e of d) t.nav && t.nav.length > 0 && await ei({
3197
+ for (let e of d) t.nav && t.nav.length > 0 && await ti({
3190
3198
  entries: t.nav,
3191
3199
  paths: c,
3192
3200
  projectRoot: r,
3193
3201
  slot: e
3194
- }), t.navbarActions && t.navbarActions.length > 0 && await pi({
3202
+ }), t.navbarActions && t.navbarActions.length > 0 && await mi({
3195
3203
  actions: t.navbarActions,
3196
3204
  paths: c,
3197
3205
  projectRoot: r,
3198
3206
  slot: e
3199
- }), t.userMenuActions && t.userMenuActions.length > 0 && await mi({
3207
+ }), t.userMenuActions && t.userMenuActions.length > 0 && await hi({
3200
3208
  actions: t.userMenuActions,
3201
3209
  paths: c,
3202
3210
  projectRoot: r,
3203
3211
  slot: e
3204
3212
  });
3205
- return t.onboardingSteps && t.onboardingSteps.length > 0 && await ci(t.onboardingSteps, c, r), t.postLoginRedirect && await ti({
3213
+ return t.onboardingSteps && t.onboardingSteps.length > 0 && await li(t.onboardingSteps, c, r), t.postLoginRedirect && await ni({
3206
3214
  postLoginRedirect: t.postLoginRedirect,
3207
3215
  paths: c,
3208
3216
  projectRoot: r,
3209
3217
  slot: d[0]
3210
3218
  }), l;
3211
3219
  }
3212
- async function Ni(e) {
3220
+ async function Pi(e) {
3213
3221
  let { packs: t, config: n, projectRoot: r, force: i, overwrite: a, slotsByPack: o } = e, s = [];
3214
3222
  for (let e of t) {
3215
- let t = o?.get(e.manifest.name), a = await ji({
3223
+ let t = o?.get(e.manifest.name), a = await Mi({
3216
3224
  manifest: e.manifest,
3217
3225
  config: n,
3218
3226
  projectRoot: r,
@@ -3232,7 +3240,7 @@ async function Ni(e) {
3232
3240
  };
3233
3241
  let c = [], l = [], u = [], d = [], f = n;
3234
3242
  for (let e of t) {
3235
- let t = o?.get(e.manifest.name), n = await Mi({
3243
+ let t = o?.get(e.manifest.name), n = await Ni({
3236
3244
  manifest: e.manifest,
3237
3245
  config: f,
3238
3246
  projectRoot: r,
@@ -3241,7 +3249,7 @@ async function Ni(e) {
3241
3249
  packDir: e.packDir,
3242
3250
  slots: t
3243
3251
  });
3244
- c.push(...n.installed), l.push(...n.skipped), u.push(...n.errors), f = await Pi(f, e.manifest.name, r), d.push(e.manifest.name);
3252
+ c.push(...n.installed), l.push(...n.skipped), u.push(...n.errors), f = await Fi(f, e.manifest.name, r), d.push(e.manifest.name);
3245
3253
  }
3246
3254
  return {
3247
3255
  installed: c,
@@ -3252,19 +3260,19 @@ async function Ni(e) {
3252
3260
  config: f
3253
3261
  };
3254
3262
  }
3255
- async function Pi(e, t, n) {
3263
+ async function Fi(e, t, n) {
3256
3264
  let r = {
3257
3265
  ...e,
3258
3266
  installedPacks: [...e.installedPacks ?? [], t]
3259
3267
  };
3260
- return await pr(n, r), r;
3268
+ return await mr(n, r), r;
3261
3269
  }
3262
- async function Fi(e) {
3270
+ async function Ii(e) {
3263
3271
  let { manifest: t, config: n, projectRoot: r, templateDir: i } = e, a = n.paths;
3264
3272
  if (!a) throw Error("stack.json is missing 'paths' configuration. Run 'npx @hype-stack/cli init' to set it up.");
3265
3273
  let o = [], s = [];
3266
3274
  for (let e of t.files) {
3267
- let t = await ki({
3275
+ let t = await Ai({
3268
3276
  file: e,
3269
3277
  packDir: i,
3270
3278
  paths: a,
@@ -3282,11 +3290,11 @@ async function Fi(e) {
3282
3290
  case "skipped": break;
3283
3291
  }
3284
3292
  }
3285
- return t.frontendRoutes && t.frontendRoutes.length > 0 && await Xr(t.frontendRoutes, a, r), t.nav && t.nav.length > 0 && await ei({
3293
+ return t.frontendRoutes && t.frontendRoutes.length > 0 && await Zr(t.frontendRoutes, a, r), t.nav && t.nav.length > 0 && await ti({
3286
3294
  entries: t.nav,
3287
3295
  paths: a,
3288
3296
  projectRoot: r
3289
- }), t.postLoginRedirect && await ti({
3297
+ }), t.postLoginRedirect && await ni({
3290
3298
  postLoginRedirect: t.postLoginRedirect,
3291
3299
  paths: a,
3292
3300
  projectRoot: r
@@ -3297,28 +3305,28 @@ async function Fi(e) {
3297
3305
  }
3298
3306
  //#endregion
3299
3307
  //#region src/core/pack-categories.ts
3300
- var Ii = [
3308
+ var Li = [
3301
3309
  "starter",
3302
3310
  "layout",
3303
3311
  "feature"
3304
- ], Li = {
3312
+ ], Ri = {
3305
3313
  starter: "Starter",
3306
3314
  layout: "Layout",
3307
3315
  feature: "Features"
3308
- }, Ri = new Set(["starter", "layout"]), zi = "layout-basic";
3309
- function Bi(e, t = {}) {
3316
+ }, zi = new Set(["starter", "layout"]), Bi = "layout-basic";
3317
+ function Vi(e, t = {}) {
3310
3318
  let n = [];
3311
- for (let r of Ii) {
3319
+ for (let r of Li) {
3312
3320
  let i = e.filter((e) => e.category === r);
3313
3321
  if (i.length === 0) continue;
3314
- let a = Ri.has(r) ? "single" : "multiple";
3322
+ let a = zi.has(r) ? "single" : "multiple";
3315
3323
  if (r === "layout") {
3316
- n.push(Vi("frontend", i)), t.adminAvailable && n.push(Vi("admin", i));
3324
+ n.push(Hi("frontend", i)), t.adminAvailable && n.push(Hi("admin", i));
3317
3325
  continue;
3318
3326
  }
3319
3327
  n.push({
3320
3328
  category: r,
3321
- label: Li[r],
3329
+ label: Ri[r],
3322
3330
  mode: a,
3323
3331
  packs: i,
3324
3332
  preselect: null
@@ -3326,20 +3334,20 @@ function Bi(e, t = {}) {
3326
3334
  }
3327
3335
  return n;
3328
3336
  }
3329
- function Vi(e, t) {
3330
- let n = t.some((e) => e.name === zi);
3337
+ function Hi(e, t) {
3338
+ let n = t.some((e) => e.name === Bi);
3331
3339
  return {
3332
3340
  category: "layout",
3333
3341
  label: e === "admin" ? "Admin Layout" : "Layout",
3334
3342
  mode: "single",
3335
3343
  packs: t,
3336
- preselect: n ? zi : null,
3344
+ preselect: n ? Bi : null,
3337
3345
  slot: e
3338
3346
  };
3339
3347
  }
3340
3348
  //#endregion
3341
3349
  //#region src/ui/logger.ts
3342
- function Hi(e) {
3350
+ function Ui(e) {
3343
3351
  o.note(e.map((e) => `${R.arrow} ${e}`).join("\n"), "Next steps");
3344
3352
  }
3345
3353
  function Z() {
@@ -3347,26 +3355,32 @@ function Z() {
3347
3355
  }
3348
3356
  //#endregion
3349
3357
  //#region src/core/post-setup.ts
3350
- async function Ui() {
3358
+ async function Wi() {
3351
3359
  return (await J("docker", ["info"], { cwd: process.cwd() })).exitCode === 0;
3352
3360
  }
3353
- async function Wi(e) {
3361
+ async function Gi(e) {
3354
3362
  return Y(`${e}/apps/backend/.env`);
3355
3363
  }
3356
- async function Gi(e, t, n) {
3364
+ async function Ki(e, t, n) {
3357
3365
  let r = n ? `Start services with ${L.command("docker compose up -d")}?` : `Docker is not running. Start services with ${L.command("docker compose up -d")}?`, i = t ? !0 : await o.confirm({
3358
3366
  message: r,
3359
3367
  initialValue: !0
3360
3368
  });
3361
3369
  if (o.isCancel(i) && Z(), !i) return o.log.info(L.muted("Skipping Docker services and database migrations.")), !1;
3362
3370
  let a = o.spinner();
3363
- return a.start("Starting Docker services..."), (await J("docker", [
3371
+ a.start("Starting Docker services...");
3372
+ let s = await J("docker", [
3364
3373
  "compose",
3365
3374
  "up",
3366
3375
  "-d"
3367
- ], { cwd: `${e}/apps/backend` })).exitCode === 0 ? (a.stop(L.success("Docker services started")), !0) : (a.stop(L.warning("Failed to start Docker services")), o.log.warn(L.muted("Run `docker compose up -d` in apps/backend manually to start services.")), o.log.info(L.muted("Skipping database migrations.")), !1);
3376
+ ], { cwd: `${e}/apps/backend` });
3377
+ return s.exitCode === 0 ? (a.stop(L.success("Docker services started")), !0) : (a.error("Failed to start Docker services"), qi(s), !1);
3378
+ }
3379
+ function qi(e) {
3380
+ let t = (e.stderr || e.stdout).trim();
3381
+ t && o.log.warn(L.muted(t));
3368
3382
  }
3369
- async function Ki(e, t = 15, n = 2e3) {
3383
+ async function Ji(e, t = 15, n = 2e3) {
3370
3384
  for (let r = 0; r < t; r++) {
3371
3385
  if ((await J("docker", [
3372
3386
  "compose",
@@ -3381,15 +3395,15 @@ async function Ki(e, t = 15, n = 2e3) {
3381
3395
  }
3382
3396
  return !1;
3383
3397
  }
3384
- async function qi(e, t, n = {}) {
3385
- if (!await Wi(e)) {
3398
+ async function Yi(e, t, n = {}) {
3399
+ if (!await Gi(e)) {
3386
3400
  o.log.warn(`${L.path(".env")} not found in ${L.path("apps/backend")}. Skipping Docker and migrations - configure it first.`);
3387
3401
  return;
3388
3402
  }
3389
- if (!await Gi(e, t, await Ui())) return;
3403
+ if (!await Ki(e, t, await Wi())) return;
3390
3404
  let r = o.spinner();
3391
- if (r.start("Waiting for Postgres to be ready..."), !await Ki(e, n.postgresMaxAttempts ?? 15, n.postgresCheckIntervalMs ?? 2e3)) {
3392
- r.stop(L.warning("Postgres health check timed out")), o.log.warn(L.muted("Run migrations manually once Postgres is ready: pnpm --filter @internal/backend migration:latest"));
3405
+ if (r.start("Waiting for Postgres to be ready..."), !await Ji(e, n.postgresMaxAttempts ?? 15, n.postgresCheckIntervalMs ?? 2e3)) {
3406
+ r.error("Postgres health check timed out"), o.log.warn(L.muted("Run migrations manually once Postgres is ready: pnpm --filter @internal/backend migration:latest"));
3393
3407
  return;
3394
3408
  }
3395
3409
  r.stop(L.success("Postgres is ready"));
@@ -3402,29 +3416,33 @@ async function qi(e, t, n = {}) {
3402
3416
  return;
3403
3417
  }
3404
3418
  let a = o.spinner();
3405
- if (a.start("Running database migrations..."), (await J("pnpm", [
3419
+ a.start("Running database migrations...");
3420
+ let s = await J("pnpm", [
3406
3421
  "--filter",
3407
3422
  "@internal/backend",
3408
3423
  "migration:latest"
3409
- ], { cwd: e })).exitCode !== 0) {
3410
- a.stop(L.warning("Migrations failed")), o.log.warn(L.muted("Run `pnpm --filter @internal/backend migration:latest` manually to apply migrations."));
3424
+ ], { cwd: e });
3425
+ if (s.exitCode !== 0) {
3426
+ a.error("Migrations failed"), qi(s), o.log.warn(L.muted("Run `pnpm --filter @internal/backend migration:latest` manually to apply migrations."));
3411
3427
  return;
3412
3428
  }
3413
3429
  a.stop(L.success("Database migrations applied"));
3414
- let s = o.spinner();
3415
- if (s.start("Generating Prisma client..."), (await J("pnpm", [
3430
+ let c = o.spinner();
3431
+ c.start("Generating Prisma client...");
3432
+ let l = await J("pnpm", [
3416
3433
  "--filter",
3417
3434
  "@internal/backend",
3418
3435
  "generate"
3419
- ], { cwd: e })).exitCode !== 0) {
3420
- s.stop(L.warning("Prisma client generation failed")), o.log.warn(L.muted("Run `pnpm --filter @internal/backend generate` manually."));
3436
+ ], { cwd: e });
3437
+ if (l.exitCode !== 0) {
3438
+ c.error("Prisma client generation failed"), qi(l), o.log.warn(L.muted("Run `pnpm --filter @internal/backend generate` manually."));
3421
3439
  return;
3422
3440
  }
3423
- s.stop(L.success("Prisma client generated"));
3441
+ c.stop(L.success("Prisma client generated"));
3424
3442
  }
3425
3443
  //#endregion
3426
3444
  //#region src/core/resolve.ts
3427
- function Ji(e) {
3445
+ function Xi(e) {
3428
3446
  let t = /* @__PURE__ */ new Map();
3429
3447
  for (let n of e) t.set(n.name, {
3430
3448
  name: n.name,
@@ -3432,7 +3450,7 @@ function Ji(e) {
3432
3450
  });
3433
3451
  return t;
3434
3452
  }
3435
- function Yi(e, t, n = /* @__PURE__ */ new Set()) {
3453
+ function Zi(e, t, n = /* @__PURE__ */ new Set()) {
3436
3454
  let r = /* @__PURE__ */ new Set();
3437
3455
  function i(e) {
3438
3456
  if (n.has(e)) return [];
@@ -3446,10 +3464,10 @@ function Yi(e, t, n = /* @__PURE__ */ new Set()) {
3446
3464
  }
3447
3465
  return i(e);
3448
3466
  }
3449
- function Xi(e, t, n = []) {
3467
+ function Qi(e, t, n = []) {
3450
3468
  let r = new Set(n), i = new Set(n), a = [];
3451
3469
  for (let n of e) {
3452
- let e = Yi(n, t, new Set(i));
3470
+ let e = Zi(n, t, new Set(i));
3453
3471
  for (let t of e) i.has(t) || (i.add(t), a.push(t));
3454
3472
  }
3455
3473
  return {
@@ -3457,7 +3475,7 @@ function Xi(e, t, n = []) {
3457
3475
  alreadyInstalled: e.filter((e) => r.has(e))
3458
3476
  };
3459
3477
  }
3460
- function Zi(e) {
3478
+ function $i(e) {
3461
3479
  let { order: t, graph: n, isLocked: r, installed: i = [] } = e, a = new Set(i), o = /* @__PURE__ */ new Set();
3462
3480
  for (let e of t) {
3463
3481
  let t = n.get(e)?.dependencies.some((e) => !a.has(e) && o.has(e)) ?? !1;
@@ -3470,7 +3488,7 @@ function Zi(e) {
3470
3488
  }
3471
3489
  //#endregion
3472
3490
  //#region src/core/variants.ts
3473
- function Qi(e, t = {}) {
3491
+ function ea(e, t = {}) {
3474
3492
  let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map();
3475
3493
  for (let i of e) {
3476
3494
  let e = t[i.family] ?? i.default;
@@ -3482,14 +3500,14 @@ function Qi(e, t = {}) {
3482
3500
  familyOf: r
3483
3501
  };
3484
3502
  }
3485
- function $i(e, t, n) {
3503
+ function ta(e, t, n) {
3486
3504
  return [...e.map((e) => n.chosen.get(e.family) ?? e.default), ...t];
3487
3505
  }
3488
- function ea(e, t) {
3506
+ function na(e, t) {
3489
3507
  let n = t.familyOf.get(e);
3490
3508
  return n ? t.chosen.get(n) ?? e : e;
3491
3509
  }
3492
- function ta(e, t) {
3510
+ function ra(e, t) {
3493
3511
  let n = /* @__PURE__ */ new Map();
3494
3512
  for (let t of e) t.family && n.set(t.name, t.family);
3495
3513
  let r = new Set(t), i = /* @__PURE__ */ new Map();
@@ -3505,65 +3523,65 @@ function ta(e, t) {
3505
3523
  familyOf: n
3506
3524
  };
3507
3525
  }
3508
- function na(e, t) {
3526
+ function ia(e, t) {
3509
3527
  return e.map((e) => ({
3510
3528
  ...e,
3511
- dependencies: e.dependencies.map((e) => ea(e, t))
3529
+ dependencies: e.dependencies.map((e) => na(e, t))
3512
3530
  }));
3513
3531
  }
3514
3532
  //#endregion
3515
3533
  //#region src/ui/banner.ts
3516
- var ra = [
3534
+ var aa = [
3517
3535
  " ██╗ ██╗ ██╗ ██╗ ██████╗ ███████╗",
3518
3536
  " ██║ ██║ ╚██╗ ██╔╝ ██╔══██╗ ██╔════╝",
3519
3537
  " ███████║ ╚████╔╝ ██████╔╝ █████╗ ",
3520
3538
  " ██╔══██║ ╚██╔╝ ██╔═══╝ ██╔══╝ ",
3521
3539
  " ██║ ██║ ██║ ██║ ███████╗",
3522
3540
  " ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝"
3523
- ], ia = [
3541
+ ], oa = [
3524
3542
  " ███████╗ ████████╗ █████╗ ██████╗ ██╗ ██╗",
3525
3543
  " ██╔════╝ ╚══██╔══╝ ██╔══██╗ ██╔════╝ ██║ ██╔╝",
3526
3544
  " ███████╗ ██║ ███████║ ██║ █████╔╝ ",
3527
3545
  " ╚════██║ ██║ ██╔══██║ ██║ ██╔═██╗ ",
3528
3546
  " ███████║ ██║ ██║ ██║ ╚██████╗ ██║ ██╗",
3529
3547
  " ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝"
3530
- ], aa = [
3548
+ ], sa = [
3531
3549
  253,
3532
3550
  176,
3533
3551
  21
3534
- ], oa = [
3552
+ ], ca = [
3535
3553
  245,
3536
3554
  76,
3537
3555
  2
3538
- ], sa = 5, ca = [
3556
+ ], la = 5, ua = [
3539
3557
  17,
3540
3558
  103,
3541
3559
  248
3542
- ], la = [
3560
+ ], da = [
3543
3561
  42,
3544
3562
  160,
3545
3563
  250
3546
- ], ua = .2;
3547
- function da() {
3564
+ ], fa = .2;
3565
+ function pa() {
3548
3566
  console.log();
3549
- for (let e of xe(ra, {
3550
- start: aa,
3551
- end: oa,
3552
- angle: sa
3567
+ for (let e of xe(aa, {
3568
+ start: sa,
3569
+ end: ca,
3570
+ angle: la
3553
3571
  })) console.log(y.bold(e));
3554
- for (let e of xe(ia, {
3555
- start: ca,
3556
- end: la,
3557
- angle: ua
3572
+ for (let e of xe(oa, {
3573
+ start: ua,
3574
+ end: da,
3575
+ angle: fa
3558
3576
  })) console.log(y.bold(e));
3559
3577
  console.log(), console.log(` ${R.spark} ${y.dim("v" + k)} ${y.dim("·")} ${ye("Ship web + desktop apps from one codebase")}`), console.log();
3560
3578
  }
3561
- function fa() {
3579
+ function ma() {
3562
3580
  console.log(), console.log(` ${R.bolt} ${ge.orange("Hype")}${ge.skyBlue("Stack")} ${y.dim("v" + k)}`), console.log();
3563
3581
  }
3564
3582
  //#endregion
3565
3583
  //#region src/ui/pack-multiselect.ts
3566
- var pa = class extends D {
3584
+ var ha = class extends D {
3567
3585
  options;
3568
3586
  cursor = 0;
3569
3587
  selected;
@@ -3667,12 +3685,12 @@ var pa = class extends D {
3667
3685
  }
3668
3686
  }
3669
3687
  };
3670
- function ma(e) {
3671
- return new pa(e).prompt();
3688
+ function ga(e) {
3689
+ return new ha(e).prompt();
3672
3690
  }
3673
3691
  //#endregion
3674
3692
  //#region src/core/apply-theme.ts
3675
- function ha(e, t) {
3693
+ function _a(e, t) {
3676
3694
  let n = e.indexOf(t);
3677
3695
  if (n === -1) return null;
3678
3696
  let r = e.indexOf("{", n);
@@ -3687,46 +3705,46 @@ function ha(e, t) {
3687
3705
  bodyEnd: a - 1
3688
3706
  } : null;
3689
3707
  }
3690
- function ga(e, t) {
3708
+ function va(e, t) {
3691
3709
  let n = e;
3692
3710
  for (let [e, r] of Object.entries(t)) {
3693
- let t = RegExp(`(^[ \\t]*--${_a(e)}[ \\t]*:[ \\t]*)([^;\\n]*);`, "m");
3711
+ let t = RegExp(`(^[ \\t]*--${ya(e)}[ \\t]*:[ \\t]*)([^;\\n]*);`, "m");
3694
3712
  n = n.replace(t, (e, t) => `${t}${r};`);
3695
3713
  }
3696
3714
  return n;
3697
3715
  }
3698
- function _a(e) {
3716
+ function ya(e) {
3699
3717
  return e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
3700
3718
  }
3701
- function va(e, t) {
3702
- let n = ha(e, ":root"), r = ha(e, ".dark"), i = e;
3719
+ function ba(e, t) {
3720
+ let n = _a(e, ":root"), r = _a(e, ".dark"), i = e;
3703
3721
  if (n) {
3704
3722
  let e = i.slice(0, n.bodyStart), r = i.slice(n.bodyStart, n.bodyEnd), a = i.slice(n.bodyEnd);
3705
- i = e + ga(r, t.light) + a;
3723
+ i = e + va(r, t.light) + a;
3706
3724
  }
3707
3725
  if (r) {
3708
- let e = ha(i, ".dark");
3726
+ let e = _a(i, ".dark");
3709
3727
  if (e) {
3710
3728
  let n = i.slice(0, e.bodyStart), r = i.slice(e.bodyStart, e.bodyEnd), a = i.slice(e.bodyEnd);
3711
- i = n + ga(r, t.dark) + a;
3729
+ i = n + va(r, t.dark) + a;
3712
3730
  }
3713
3731
  }
3714
3732
  return i;
3715
3733
  }
3716
- var ya = "assets/styles.css";
3717
- async function ba(e, t) {
3718
- let n = w.resolve(e, ya), r;
3734
+ var xa = "assets/styles.css";
3735
+ async function Sa(e, t) {
3736
+ let n = w.resolve(e, xa), r;
3719
3737
  try {
3720
3738
  r = await v.readFile(n, "utf-8");
3721
3739
  } catch {
3722
3740
  return !1;
3723
3741
  }
3724
- let i = va(r, t);
3742
+ let i = ba(r, t);
3725
3743
  return i === r || await v.writeFile(n, i, "utf-8"), !0;
3726
3744
  }
3727
3745
  //#endregion
3728
3746
  //#region src/core/clone.ts
3729
- async function xa(e) {
3747
+ async function Ca(e) {
3730
3748
  let t = await ee(te, {
3731
3749
  dir: e,
3732
3750
  force: !0
@@ -3738,7 +3756,7 @@ async function xa(e) {
3738
3756
  }
3739
3757
  //#endregion
3740
3758
  //#region src/core/editor-config.ts
3741
- function Sa(e) {
3759
+ function wa(e) {
3742
3760
  let t = {
3743
3761
  globs: [],
3744
3762
  alwaysApply: !1
@@ -3773,10 +3791,10 @@ function Sa(e) {
3773
3791
  content: i
3774
3792
  };
3775
3793
  }
3776
- function Ca(e) {
3794
+ function Ta(e) {
3777
3795
  return e.frontmatter.globs.length > 0 ? `---\npaths:\n${e.frontmatter.globs.map((e) => ` - "${e}"`).join("\n")}\n---\n\n${e.content}` : e.content;
3778
3796
  }
3779
- function wa(e) {
3797
+ function Ea(e) {
3780
3798
  let t;
3781
3799
  t = e.frontmatter.alwaysApply ? "always_on" : e.frontmatter.globs.length > 0 ? "glob" : "model_decision";
3782
3800
  let n = [`trigger: ${t}`];
@@ -3786,30 +3804,30 @@ function wa(e) {
3786
3804
  }
3787
3805
  return e.frontmatter.description && n.push(`description: ${e.frontmatter.description}`), `---\n${n.join("\n")}\n---\n\n${e.content}`;
3788
3806
  }
3789
- function Ta(e) {
3807
+ function Da(e) {
3790
3808
  return e.frontmatter.globs.length > 0 ? `---\napplyTo: "${e.frontmatter.globs.join(", ")}"\n---\n\n${e.content}` : e.content;
3791
3809
  }
3792
- var Ea = {
3810
+ var Oa = {
3793
3811
  claude: {
3794
3812
  rulesDir: ".claude/rules",
3795
3813
  extension: ".md",
3796
- convert: Ca
3814
+ convert: Ta
3797
3815
  },
3798
3816
  windsurf: {
3799
3817
  rulesDir: ".windsurf/rules",
3800
3818
  extension: ".md",
3801
- convert: wa
3819
+ convert: Ea
3802
3820
  },
3803
3821
  copilot: {
3804
3822
  rulesDir: ".github/instructions",
3805
3823
  extension: ".instructions.md",
3806
- convert: Ta
3824
+ convert: Da
3807
3825
  }
3808
3826
  };
3809
- async function Da(e) {
3827
+ async function ka(e) {
3810
3828
  let t = w.join(e, se), n = (await v.readdir(t, { withFileTypes: !0 }).catch(() => [])).filter((e) => e.isFile() && e.name.endsWith(".mdc"));
3811
3829
  return await Promise.all(n.map(async (e) => {
3812
- let n = w.join(t, e.name), { frontmatter: r, content: i } = Sa(await v.readFile(n, "utf-8"));
3830
+ let n = w.join(t, e.name), { frontmatter: r, content: i } = wa(await v.readFile(n, "utf-8"));
3813
3831
  return {
3814
3832
  frontmatter: r,
3815
3833
  content: i,
@@ -3817,9 +3835,9 @@ async function Da(e) {
3817
3835
  };
3818
3836
  }));
3819
3837
  }
3820
- async function Oa(e, t) {
3838
+ async function Aa(e, t) {
3821
3839
  if (t === "cursor") return;
3822
- let n = Ea[t], r = await Da(e), i = w.join(e, n.rulesDir);
3840
+ let n = Oa[t], r = await ka(e), i = w.join(e, n.rulesDir);
3823
3841
  await v.mkdir(i, { recursive: !0 }), await Promise.all(r.map((e) => {
3824
3842
  let t = n.convert(e), r = e.filename.replace(/\.mdc$/, n.extension);
3825
3843
  return v.writeFile(w.join(i, r), t, "utf-8");
@@ -3827,21 +3845,21 @@ async function Oa(e, t) {
3827
3845
  }
3828
3846
  //#endregion
3829
3847
  //#region src/core/env-files.ts
3830
- var ka = [
3848
+ var ja = [
3831
3849
  "apps",
3832
3850
  "packages",
3833
3851
  "libs",
3834
3852
  "shared"
3835
3853
  ];
3836
- async function Aa(e) {
3837
- let t = await ja(e);
3854
+ async function Ma(e) {
3855
+ let t = await Na(e);
3838
3856
  return (await Promise.all(t.map(async (t) => {
3839
3857
  let n = w.join(w.dirname(t), ".env");
3840
3858
  return await Y(n) ? null : (await v.copyFile(t, n), w.relative(e, n));
3841
3859
  }))).filter((e) => e !== null).sort();
3842
3860
  }
3843
- async function ja(e) {
3844
- let t = [w.join(e, ".env.example")], n = await Promise.all(ka.map(async (t) => {
3861
+ async function Na(e) {
3862
+ let t = [w.join(e, ".env.example")], n = await Promise.all(ja.map(async (t) => {
3845
3863
  let n = w.join(e, t);
3846
3864
  return (await v.readdir(n, { withFileTypes: !0 }).catch(() => [])).filter((e) => e.isDirectory()).map((e) => w.join(n, e.name, ".env.example"));
3847
3865
  }));
@@ -3849,11 +3867,11 @@ async function ja(e) {
3849
3867
  }
3850
3868
  //#endregion
3851
3869
  //#region src/core/post-clone.ts
3852
- var Q = "@hype-stack/", Ma = "hype-stack";
3853
- async function Na(e) {
3870
+ var Q = "@hype-stack/", Pa = "hype-stack";
3871
+ async function Fa(e) {
3854
3872
  await sr(w.join(e, ".git"));
3855
3873
  }
3856
- async function Pa(e) {
3874
+ async function Ia(e) {
3857
3875
  await J("git", ["init"], { cwd: e }), await J("git", ["add", "."], { cwd: e }), await J("git", [
3858
3876
  "-c",
3859
3877
  "user.name=Hype Stack CLI",
@@ -3864,22 +3882,22 @@ async function Pa(e) {
3864
3882
  "Initial commit from Hype Stack CLI"
3865
3883
  ], { cwd: e });
3866
3884
  }
3867
- async function Fa(e, t) {
3868
- let n = `@${t}/`, r = await Ua(e);
3885
+ async function La(e, t) {
3886
+ let n = `@${t}/`, r = await Ga(e);
3869
3887
  for (let e of r) {
3870
3888
  let t = await ir(e);
3871
3889
  if (!t) continue;
3872
3890
  let r = !1;
3873
- t.name?.startsWith(Q) && (t.name = t.name.replace(Q, n), r = !0), Ba(t.dependencies, n) && (r = !0), Ba(t.devDependencies, n) && (r = !0), t.nx && Va(t.nx, n) && (r = !0);
3891
+ t.name?.startsWith(Q) && (t.name = t.name.replace(Q, n), r = !0), Ha(t.dependencies, n) && (r = !0), Ha(t.devDependencies, n) && (r = !0), t.nx && Ua(t.nx, n) && (r = !0);
3874
3892
  let i = await v.readFile(e, "utf-8");
3875
3893
  if (i.includes(Q)) {
3876
3894
  let t = i.replaceAll(Q, n);
3877
3895
  await v.writeFile(e, t, "utf-8");
3878
3896
  } else r && await ar(e, t);
3879
3897
  }
3880
- await Si(e, t), await Ra(e, t), await Ha(e, t);
3898
+ await Ci(e, t), await Ba(e, t), await Wa(e, t);
3881
3899
  }
3882
- var Ia = new Set([
3900
+ var Ra = new Set([
3883
3901
  ".git",
3884
3902
  "node_modules",
3885
3903
  "dist",
@@ -3887,10 +3905,10 @@ var Ia = new Set([
3887
3905
  ".nx",
3888
3906
  ".next",
3889
3907
  "coverage"
3890
- ]), La = /^(docker-compose|compose)(\.[\w.-]+)?\.ya?ml$/;
3891
- async function Ra(e, t) {
3892
- if (t === Ma) return;
3893
- let n = await za(e);
3908
+ ]), za = /^(docker-compose|compose)(\.[\w.-]+)?\.ya?ml$/;
3909
+ async function Ba(e, t) {
3910
+ if (t === Pa) return;
3911
+ let n = await Va(e);
3894
3912
  await Promise.all(n.map(async (e) => {
3895
3913
  let n = await v.readFile(e, "utf-8").catch(() => null);
3896
3914
  if (!n || !/^name:[ \t]*hype-stack/m.test(n)) return;
@@ -3898,14 +3916,14 @@ async function Ra(e, t) {
3898
3916
  await v.writeFile(e, r, "utf-8");
3899
3917
  }));
3900
3918
  }
3901
- async function za(e) {
3919
+ async function Va(e) {
3902
3920
  let t = await v.readdir(e, { withFileTypes: !0 }).catch(() => []);
3903
3921
  return (await Promise.all(t.map(async (t) => {
3904
3922
  let n = w.join(e, t.name);
3905
- return t.isDirectory() ? Ia.has(t.name) ? [] : za(n) : t.isFile() && La.test(t.name) ? [n] : [];
3923
+ return t.isDirectory() ? Ra.has(t.name) ? [] : Va(n) : t.isFile() && za.test(t.name) ? [n] : [];
3906
3924
  }))).flat();
3907
3925
  }
3908
- function Ba(e, t) {
3926
+ function Ha(e, t) {
3909
3927
  if (!e) return !1;
3910
3928
  let n = !1;
3911
3929
  for (let r of Object.keys(e)) if (r.startsWith(Q)) {
@@ -3914,7 +3932,7 @@ function Ba(e, t) {
3914
3932
  }
3915
3933
  return n;
3916
3934
  }
3917
- function Va(e, t) {
3935
+ function Ua(e, t) {
3918
3936
  if (!e) return !1;
3919
3937
  let n = !1;
3920
3938
  if (e.implicitDependencies &&= e.implicitDependencies.map((e) => e.startsWith(Q) ? (n = !0, e.replace(Q, t)) : e), e.targets) {
@@ -3922,13 +3940,13 @@ function Va(e, t) {
3922
3940
  }
3923
3941
  return n;
3924
3942
  }
3925
- async function Ha(e, t) {
3943
+ async function Wa(e, t) {
3926
3944
  let n = w.join(e, "packages/enums/src/app/index.ts"), r = await v.readFile(n, "utf-8").catch(() => null);
3927
3945
  if (!r) return;
3928
- let i = t.split("-").map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(" "), a = r.replaceAll(`id: "${Ma}"`, `id: "${t}"`).replaceAll(`name: "${Ma}"`, `name: "${t}"`).replace(/name: "Hype Stack"/, `name: "${i}"`).replace(/description: ".*?"/, `description: "${i} application"`);
3946
+ let i = t.split("-").map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(" "), a = r.replaceAll(`id: "${Pa}"`, `id: "${t}"`).replaceAll(`name: "${Pa}"`, `name: "${t}"`).replace(/name: "Hype Stack"/, `name: "${i}"`).replace(/description: ".*?"/, `description: "${i} application"`);
3929
3947
  await v.writeFile(n, a, "utf-8");
3930
3948
  }
3931
- async function Ua(e) {
3949
+ async function Ga(e) {
3932
3950
  let t = [], n = w.join(e, "package.json");
3933
3951
  (await v.stat(n).catch(() => null))?.isFile() && t.push(n);
3934
3952
  for (let n of [
@@ -3948,7 +3966,7 @@ async function Ua(e) {
3948
3966
  }
3949
3967
  //#endregion
3950
3968
  //#region src/core/readme.ts
3951
- var Wa = {
3969
+ var Ka = {
3952
3970
  cursor: {
3953
3971
  label: "Cursor",
3954
3972
  rulesDir: ".cursor/rules"
@@ -3965,24 +3983,24 @@ var Wa = {
3965
3983
  label: "GitHub Copilot",
3966
3984
  rulesDir: ".github/instructions"
3967
3985
  }
3968
- }, Ga = {
3986
+ }, qa = {
3969
3987
  backend: "Hono API server (Postgres, Prisma, Kysely, Valkey cache, WorkOS auth)",
3970
3988
  frontend: "React + Vite app talking to the backend through the typed HyperFetch SDK"
3971
- }, Ka = {
3989
+ }, Ja = {
3972
3990
  enums: "Shared enums and app config used across apps",
3973
3991
  cli: "Project tooling and code generators"
3974
3992
  };
3975
- function qa(e) {
3993
+ function Ya(e) {
3976
3994
  return e.split(/[-_]/).filter(Boolean).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(" ");
3977
3995
  }
3978
- function Ja(e, t) {
3996
+ function Xa(e, t) {
3979
3997
  return Object.entries(e).toSorted(([e], [t]) => e.localeCompare(t)).map(([e, n]) => {
3980
3998
  let r = t[e];
3981
3999
  return r ? `- \`${n}\` - ${r}` : `- \`${n}\``;
3982
4000
  });
3983
4001
  }
3984
- function Ya(e) {
3985
- let { projectName: t, editor: n, workspace: r } = e, i = qa(t), a = Wa[n], o = !!r.apps.backend, s = Ja(r.apps, Ga), c = Ja(r.packages, Ka), l = [];
4002
+ function Za(e) {
4003
+ let { projectName: t, editor: n, workspace: r } = e, i = Ya(t), a = Ka[n], o = !!r.apps.backend, s = Xa(r.apps, qa), c = Xa(r.packages, Ja), l = [];
3986
4004
  s.length > 0 && l.push(...s), c.length > 0 && l.push(...c), l.push("- `stack.json` - Hype Stack workspace config (apps, paths, installed packs)");
3987
4005
  let u = [];
3988
4006
  u.push(`# ${i}`), u.push([
@@ -4090,13 +4108,13 @@ function Ya(e) {
4090
4108
  "stays useful."
4091
4109
  ].join("\n")), u.join("\n\n") + "\n";
4092
4110
  }
4093
- async function Xa(e, t) {
4111
+ async function Qa(e, t) {
4094
4112
  let n = w.join(e, "README.md");
4095
- await v.writeFile(n, Ya(t), "utf-8");
4113
+ await v.writeFile(n, Za(t), "utf-8");
4096
4114
  }
4097
4115
  //#endregion
4098
4116
  //#region src/core/tracking.ts
4099
- async function Za(e) {
4117
+ async function $a(e) {
4100
4118
  try {
4101
4119
  let t = {
4102
4120
  "X-Device-Id": Jn(),
@@ -4110,7 +4128,7 @@ async function Za(e) {
4110
4128
  }
4111
4129
  //#endregion
4112
4130
  //#region src/ui/swatch.ts
4113
- function Qa(e) {
4131
+ function eo(e) {
4114
4132
  let t = e.trim().match(/^oklch\(([^)]+)\)$/i);
4115
4133
  if (!t) return null;
4116
4134
  let n = t[1].trim().split(/\s+/);
@@ -4129,61 +4147,61 @@ function Qa(e) {
4129
4147
  h: a
4130
4148
  };
4131
4149
  }
4132
- function $a(e) {
4150
+ function to(e) {
4133
4151
  return Math.min(255, Math.max(0, Math.round(e)));
4134
4152
  }
4135
- function eo(e) {
4153
+ function no(e) {
4136
4154
  return e <= .0031308 ? 12.92 * e : 1.055 * e ** (1 / 2.4) - .055;
4137
4155
  }
4138
- function to({ l: e, c: t, h: n }) {
4156
+ function ro({ l: e, c: t, h: n }) {
4139
4157
  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;
4140
4158
  return [
4141
- $a(eo(f) * 255),
4142
- $a(eo(p) * 255),
4143
- $a(eo(m) * 255)
4159
+ to(no(f) * 255),
4160
+ to(no(p) * 255),
4161
+ to(no(m) * 255)
4144
4162
  ];
4145
4163
  }
4146
- var no = "\x1B[49m";
4147
- function ro(e, t) {
4164
+ var io = "\x1B[49m";
4165
+ function ao(e, t) {
4148
4166
  let n = e[t];
4149
4167
  if (!n) return y.dim(" ");
4150
- let r = Qa(n);
4168
+ let r = eo(n);
4151
4169
  if (!r) return y.dim(" ");
4152
- let [i, a, o] = to(r);
4153
- return `\x1b[48;2;${i};${a};${o}m ${no}`;
4170
+ let [i, a, o] = ro(r);
4171
+ return `\x1b[48;2;${i};${a};${o}m ${io}`;
4154
4172
  }
4155
- var io = [
4173
+ var oo = [
4156
4174
  "primary",
4157
4175
  "secondary",
4158
4176
  "accent"
4159
4177
  ];
4160
- function ao(e) {
4161
- return io.map((t) => ro(e, t)).join("");
4178
+ function so(e) {
4179
+ return oo.map((t) => ao(e, t)).join("");
4162
4180
  }
4163
- function oo(e) {
4164
- return `${ao(e.light)} ${y.dim("·")} ${ao(e.dark)}`;
4181
+ function co(e) {
4182
+ return `${so(e.light)} ${y.dim("·")} ${so(e.dark)}`;
4165
4183
  }
4166
4184
  //#endregion
4167
4185
  //#region src/utils/validate.ts
4168
- function so(e) {
4186
+ function lo(e) {
4169
4187
  if (!e.trim()) return "Project name cannot be empty";
4170
4188
  if (!M.test(e)) return "Project name must be lowercase, alphanumeric, and may contain hyphens, dots, or underscores";
4171
4189
  if (e.length > 214) return "Project name is too long (max 214 characters)";
4172
4190
  }
4173
4191
  //#endregion
4174
4192
  //#region src/commands/create.ts
4175
- async function co(a) {
4176
- a.skipBanner || da(), o.intro(L.brandBold("Create a new Hype Stack project"));
4193
+ async function uo(a) {
4194
+ a.skipBanner || pa(), o.intro(L.brandBold("Create a new Hype Stack project"));
4177
4195
  let s = a.yes === !0, c;
4178
4196
  if (s && a.name) {
4179
- let e = so(a.name);
4197
+ let e = lo(a.name);
4180
4198
  e && (o.log.error(e), Z()), c = a.name;
4181
4199
  } else {
4182
4200
  let e = await o.text({
4183
4201
  message: "What is your project named?",
4184
4202
  placeholder: "my-app",
4185
4203
  initialValue: a.name ?? "",
4186
- validate: (e) => so(e ?? "")
4204
+ validate: (e) => lo(e ?? "")
4187
4205
  });
4188
4206
  o.isCancel(e) && Z(), c = e;
4189
4207
  }
@@ -4228,7 +4246,7 @@ async function co(a) {
4228
4246
  message: "Pick a color theme",
4229
4247
  options: n.map((e) => ({
4230
4248
  value: e.name,
4231
- label: `${oo(e)} ${e.label}`
4249
+ label: `${co(e)} ${e.label}`
4232
4250
  })),
4233
4251
  initialValue: e
4234
4252
  });
@@ -4246,29 +4264,29 @@ async function co(a) {
4246
4264
  (o.isCancel(e) || !e) && Z();
4247
4265
  }
4248
4266
  let h = o.spinner();
4249
- h.start("Cloning Hype Stack template..."), await xa(u), h.stop(L.success("Template cloned"));
4267
+ h.start("Cloning Hype Stack template..."), await Ca(u), h.stop(L.success("Template cloned"));
4250
4268
  let g = o.spinner();
4251
- g.start("Setting up project..."), await Na(u), await Fa(u, c), await Oa(u, f);
4252
- let _ = await mr(u), v = gr(c, _);
4253
- await pr(u, v), await Xa(u, {
4269
+ g.start("Setting up project..."), await Fa(u), await La(u, c), await Aa(u, f);
4270
+ let _ = await hr(u), v = _r(c, _);
4271
+ await mr(u, v), await Qa(u, {
4254
4272
  projectName: c,
4255
4273
  editor: f,
4256
4274
  workspace: _
4257
- }), i(m) && (await ba(w.resolve(u, v.paths?.frontend.root ?? "apps/frontend"), r(m)) || o.log.warn(L.muted(`Could not find ${L.path("assets/styles.css")} to apply the ${m} theme`))), g.stop(L.success("Project configured"));
4275
+ }), i(m) && (await Sa(w.resolve(u, v.paths?.frontend.root ?? "apps/frontend"), r(m)) || o.log.warn(L.muted(`Could not find ${L.path("assets/styles.css")} to apply the ${m} theme`))), g.stop(L.success("Project configured"));
4258
4276
  let y = o.spinner();
4259
4277
  y.start("Installing dependencies..."), (await J("pnpm", ["install"], { cwd: u })).exitCode === 0 ? y.stop(L.success("Dependencies installed")) : (y.stop(L.warning("Dependencies installed with warnings")), o.log.warn(L.muted("You may need to run `pnpm install` manually to resolve issues.")));
4260
4278
  let b = o.spinner();
4261
- b.start("Initializing git repository..."), await Pa(u), b.stop(L.success("Git repository initialized with clean history"));
4279
+ b.start("Initializing git repository..."), await Ia(u), b.stop(L.success("Git repository initialized with clean history"));
4262
4280
  let x = o.spinner();
4263
4281
  x.start("Creating .env files from examples...");
4264
- let S = await Aa(u);
4282
+ let S = await Ma(u);
4265
4283
  if (S.length > 0) {
4266
4284
  let e = S.length;
4267
4285
  x.stop(L.success(`Created ${e} .env file${e === 1 ? "" : "s"} from examples`));
4268
4286
  } else x.stop(L.muted("No .env.example files to copy"));
4269
4287
  o.log.success(`${L.brandBold("Hype Stack")} project ${L.highlight(c)} is ready!`);
4270
4288
  let C = w.relative(process.cwd(), u) || ".", T = [`${L.command(`cd ${C}`)}`];
4271
- S.length > 0 ? T.push(`Review your ${L.path(".env")} files and fill in any secrets`) : T.push(`Copy ${L.path(".env.example")} to ${L.path(".env")} and configure`), Hi(T);
4289
+ S.length > 0 ? T.push(`Review your ${L.path(".env")} files and fill in any secrets`) : T.push(`Copy ${L.path(".env.example")} to ${L.path(".env")} and configure`), Ui(T);
4272
4290
  let E = a.setup === !1;
4273
4291
  if (a.deferSetup) o.log.info(L.muted("Docker and migrations will run after your packs are installed."));
4274
4292
  else {
@@ -4276,24 +4294,24 @@ async function co(a) {
4276
4294
  message: "Would you like to start Docker services and run database migrations now?",
4277
4295
  initialValue: !0
4278
4296
  }));
4279
- o.isCancel(e) && Z(), e ? await qi(u, s) : (o.log.info(L.muted("You can start services later:")), Hi([
4297
+ o.isCancel(e) && Z(), e ? await Yi(u, s) : (o.log.info(L.muted("You can start services later:")), Ui([
4280
4298
  `${L.command("docker compose up -d")} ${L.muted("(in apps/backend - start Postgres, Valkey, RustFS)")}`,
4281
4299
  `${L.command("pnpm --filter @internal/backend migration:latest")} ${L.muted("(apply migrations)")}`,
4282
4300
  `${L.command("pnpm run generate")} ${L.muted("(generate Prisma client)")}`
4283
- ])), Hi([`${L.command("pnpm dev")} ${L.muted("(start frontend + backend)")}`]);
4301
+ ])), Ui([`${L.command("pnpm dev")} ${L.muted("(start frontend + backend)")}`]);
4284
4302
  }
4285
- return await Za("project_create"), o.outro(L.muted("Happy building!")), u;
4303
+ return await $a("project_create"), o.outro(L.muted("Happy building!")), u;
4286
4304
  }
4287
4305
  //#endregion
4288
4306
  //#region src/commands/init.ts
4289
- async function lo(e) {
4307
+ async function fo(e) {
4290
4308
  let t = e.cwd ?? process.cwd(), n = e.silent ?? !1;
4291
- if (n || (fa(), o.intro(L.brandBold("Initialize Hype Stack configuration"))), !await _r(t)) {
4309
+ if (n || (ma(), o.intro(L.brandBold("Initialize Hype Stack configuration"))), !await vr(t)) {
4292
4310
  o.log.error(`This doesn't look like a Hype Stack project. ${L.muted("Expected apps/ directory and package.json")}`), o.outro(L.muted(`Run ${L.command("npx @hype-stack/cli create")} to scaffold a new project.`));
4293
4311
  return;
4294
4312
  }
4295
- if (await fr(t)) {
4296
- let e = await dr(t);
4313
+ if (await pr(t)) {
4314
+ let e = await fr(t);
4297
4315
  if (e && !n) {
4298
4316
  o.log.info(`Found existing ${L.path("stack.json")} for project ${L.highlight(e.name)}`);
4299
4317
  let t = await o.confirm({
@@ -4306,7 +4324,7 @@ async function lo(e) {
4306
4324
  }
4307
4325
  }
4308
4326
  }
4309
- let r = await mr(t);
4327
+ let r = await hr(t);
4310
4328
  if (!n) {
4311
4329
  let e = Object.entries(r.apps), t = Object.entries(r.packages);
4312
4330
  if (e.length > 0) {
@@ -4328,22 +4346,22 @@ async function lo(e) {
4328
4346
  });
4329
4347
  o.isCancel(e) && Z(), a = e;
4330
4348
  }
4331
- await pr(t, gr(a, r)), n || (o.log.success(`${L.path("stack.json")} written successfully`), o.outro(L.muted("Your project is mapped and ready for Hype Stack CLI commands.")));
4349
+ await mr(t, _r(a, r)), n || (o.log.success(`${L.path("stack.json")} written successfully`), o.outro(L.muted("Your project is mapped and ready for Hype Stack CLI commands.")));
4332
4350
  }
4333
- async function uo(e, t = {}) {
4334
- if (await fr(e)) return {
4351
+ async function po(e, t = {}) {
4352
+ if (await pr(e)) return {
4335
4353
  projectRoot: e,
4336
4354
  scaffolded: !1
4337
4355
  };
4338
- let n = t.runInit ?? ((e) => lo({
4356
+ let n = t.runInit ?? ((e) => fo({
4339
4357
  cwd: e,
4340
4358
  silent: !0
4341
- })), r = t.runCreate ?? ((e) => co({
4359
+ })), r = t.runCreate ?? ((e) => uo({
4342
4360
  parentDirectory: e,
4343
4361
  deferSetup: !0,
4344
4362
  skipBanner: !0
4345
4363
  }));
4346
- if (await _r(e)) {
4364
+ if (await vr(e)) {
4347
4365
  o.log.warn(`No ${L.path("stack.json")} found in ${L.path(e)}.`);
4348
4366
  let t = await o.confirm({
4349
4367
  message: `Create ${L.path("stack.json")} now?`,
@@ -4351,7 +4369,7 @@ async function uo(e, t = {}) {
4351
4369
  });
4352
4370
  if (o.isCancel(t) || !t) return null;
4353
4371
  await n(e);
4354
- let r = await fr(e);
4372
+ let r = await pr(e);
4355
4373
  return r && o.log.success(`${L.path("stack.json")} created`), r ? {
4356
4374
  projectRoot: e,
4357
4375
  scaffolded: !1
@@ -4369,14 +4387,14 @@ async function uo(e, t = {}) {
4369
4387
  });
4370
4388
  if (o.isCancel(a) || !a) return null;
4371
4389
  let s = await r(e);
4372
- return await fr(s) ? {
4390
+ return await pr(s) ? {
4373
4391
  projectRoot: s,
4374
4392
  scaffolded: !0
4375
4393
  } : null;
4376
4394
  }
4377
4395
  //#endregion
4378
4396
  //#region src/core/npm-deps.ts
4379
- function fo(e, t) {
4397
+ function mo(e, t) {
4380
4398
  let n = [], r = [];
4381
4399
  if (!e) return {
4382
4400
  errors: n,
@@ -4407,7 +4425,7 @@ function fo(e, t) {
4407
4425
  operations: r
4408
4426
  };
4409
4427
  }
4410
- function po(e) {
4428
+ function ho(e) {
4411
4429
  let t = {};
4412
4430
  for (let n of e) if (n) for (let [e, r] of Object.entries(n)) t[e] = {
4413
4431
  ...t[e],
@@ -4415,7 +4433,7 @@ function po(e) {
4415
4433
  };
4416
4434
  return t;
4417
4435
  }
4418
- async function mo(e, t, n = J) {
4436
+ async function go(e, t, n = J) {
4419
4437
  let r = [];
4420
4438
  for (let i of e) {
4421
4439
  let e = w.join(t, i.relativeDir);
@@ -4451,14 +4469,14 @@ async function mo(e, t, n = J) {
4451
4469
  function $(e) {
4452
4470
  return e instanceof Error ? e.message : String(e);
4453
4471
  }
4454
- async function ho(e, t, n) {
4472
+ async function _o(e, t, n) {
4455
4473
  let r = e.filter((e) => e.tier === "paid" && !t.has(e.name)).map((e) => e.name);
4456
- return r.length === 0 ? {} : wr(r, n).catch(() => ({}));
4474
+ return r.length === 0 ? {} : Tr(r, n).catch(() => ({}));
4457
4475
  }
4458
- function go(e, t) {
4476
+ function vo(e, t) {
4459
4477
  return e === "free" ? L.success("free") : e === "owned" ? L.accent("owned") : `${L.highlight(`$${t}`)} ${L.muted("locked")}`;
4460
4478
  }
4461
- async function _o(e, t, n) {
4479
+ async function yo(e, t, n) {
4462
4480
  let r = e.filter((e) => t(e)), i = e.filter((e) => !t(e));
4463
4481
  i.length > 0 && o.log.warning(`Skipping ${i.join(", ")} because ${i.length === 1 ? "it depends" : "they depend"} on a pack you don't own yet.`), await tr(r.map((e) => n.get(e)).filter((e) => e !== void 0).map((e) => ({
4464
4482
  name: e.name,
@@ -4466,7 +4484,7 @@ async function _o(e, t, n) {
4466
4484
  price: e.price
4467
4485
  })));
4468
4486
  }
4469
- function vo(e, t) {
4487
+ function bo(e, t) {
4470
4488
  let n = e.map((e, n) => {
4471
4489
  let r = t.get(e), i = r ? r.displayName : e;
4472
4490
  return ` ${L.muted(`${n + 1}.`)} ${L.brand(i)}`;
@@ -4477,10 +4495,10 @@ function vo(e, t) {
4477
4495
  ...n
4478
4496
  ].join("\n"), "Install Plan");
4479
4497
  }
4480
- async function yo(e, t) {
4498
+ async function xo(e, t) {
4481
4499
  let n = [];
4482
4500
  for (let r of e) {
4483
- let e = await vr(r), i = await yr(r, t);
4501
+ let e = await yr(r), i = await br(r, t);
4484
4502
  if (i.status === "denied") throw Error(`Access to "${r}" was denied (${i.reason}). Try 'npx @hype-stack/cli login' or check your license.`);
4485
4503
  n.push({
4486
4504
  manifest: e,
@@ -4489,32 +4507,47 @@ async function yo(e, t) {
4489
4507
  }
4490
4508
  return n;
4491
4509
  }
4492
- async function bo(e) {
4493
- let { prepared: t, paths: n, cwd: r, spinner: i } = e, a = fo(po(t.map((e) => e.manifest.dependencies_npm)), n);
4510
+ async function So(e) {
4511
+ let { prepared: t, paths: n, cwd: r, spinner: i } = e, a = mo(ho(t.map((e) => e.manifest.dependencies_npm)), n);
4494
4512
  if (a.errors.length > 0) {
4495
4513
  for (let e of a.errors) o.log.error(e);
4496
4514
  return;
4497
4515
  }
4498
4516
  if (a.operations.length === 0) return;
4499
4517
  i.start("Installing npm dependencies...");
4500
- let s = await mo(a.operations, r);
4518
+ let s = await go(a.operations, r);
4501
4519
  if (i.stop(s.ok ? "npm dependencies installed" : "npm dependency installation failed"), !s.ok) for (let e of s.errors) o.log.error(e);
4502
4520
  }
4503
- function xo(e) {
4521
+ function Co(e) {
4504
4522
  let t = e.flatMap((e) => e.manifest.postInstall ?? []), n = [...new Set(t)];
4505
4523
  n.length !== 0 && o.note(n.map((e) => ` ${L.muted("→")} ${e}`).join("\n"), "Next Steps");
4506
4524
  }
4507
- async function So(e) {
4525
+ function wo(e) {
4526
+ if (e.length === 0) return;
4527
+ let t = e.map((e) => {
4528
+ let t = e.replace(/^\{\{[^}]+\}\}\//, "");
4529
+ return ` ${L.muted("•")} ${L.path(t)}`;
4530
+ });
4531
+ o.note(t.join("\n"), "Skipped (already exist)");
4532
+ }
4533
+ async function To(e) {
4508
4534
  let { prepared: t, config: n, cwd: r, force: i, yes: a, slotsByPack: s } = e, c = /* @__PURE__ */ new Set();
4509
4535
  if (i) return c;
4510
- let l = await Ai({
4536
+ let l = await ji({
4511
4537
  packs: t,
4512
4538
  config: n,
4513
4539
  projectRoot: r,
4514
4540
  slotsByPack: s
4515
4541
  });
4516
4542
  if (l.length === 0) return c;
4517
- if (a) return o.log.warning(`${l.length} existing file${l.length === 1 ? "" : "s"} kept. Pass ${L.command("--force")} to overwrite.`), c;
4543
+ if (a) {
4544
+ o.log.warning(`${l.length} existing file${l.length === 1 ? "" : "s"} kept. Pass ${L.command("--force")} to overwrite.`);
4545
+ let e = l.map((e) => {
4546
+ let t = w.relative(r, e.targetPath) || e.target;
4547
+ return ` ${L.muted("•")} ${L.path(t)} ${L.muted(`(${e.packName})`)}`;
4548
+ });
4549
+ return o.note(e.join("\n"), "Kept existing files"), c;
4550
+ }
4518
4551
  o.log.warning(`${l.length} file${l.length === 1 ? "" : "s"} already exist in your project.`);
4519
4552
  for (let e of l) {
4520
4553
  let t = w.relative(r, e.targetPath) || e.target, n = await o.confirm({
@@ -4527,12 +4560,12 @@ async function So(e) {
4527
4560
  }
4528
4561
  //#endregion
4529
4562
  //#region src/commands/compose.ts
4530
- async function Co(e = {}) {
4563
+ async function Eo(e = {}) {
4531
4564
  let t = e.cwd ?? process.cwd();
4532
- da();
4533
- let n = await uo(t), r = n?.projectRoot ?? null, i = n?.scaffolded ?? !1, a;
4565
+ pa();
4566
+ let n = await po(t), r = n?.projectRoot ?? null, i = n?.scaffolded ?? !1, a;
4534
4567
  try {
4535
- a = await dr(r ?? t);
4568
+ a = await fr(r ?? t);
4536
4569
  } catch (e) {
4537
4570
  o.cancel(`Could not parse ${L.path("stack.json")}: ${$(e)} Run 'npx @hype-stack/cli init' to regenerate it.`), process.exit(1);
4538
4571
  }
@@ -4543,18 +4576,18 @@ async function Co(e = {}) {
4543
4576
  c.start("Loading packs...");
4544
4577
  let l;
4545
4578
  try {
4546
- l = await Cr();
4579
+ l = await wr();
4547
4580
  } catch (e) {
4548
4581
  c.stop("Failed to load packs"), o.cancel(`Could not reach Hype Stack. Check your connection and try again.\n${$(e)}`), process.exit(1);
4549
4582
  }
4550
4583
  c.stop("Packs loaded");
4551
- 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 Wn(N()))?.token ?? null, h = await ho(l, d, {
4584
+ 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 Wn(N()))?.token ?? null, h = await _o(l, d, {
4552
4585
  token: m,
4553
4586
  key: p
4554
4587
  }), g = (e) => {
4555
4588
  let t = f.get(e);
4556
4589
  return !t || t.tier === "free" ? "free" : h[e]?.owned ? "owned" : "locked";
4557
- }, _ = (e) => !d.has(e) && g(e) === "locked", y = await wo({
4590
+ }, _ = (e) => !d.has(e) && g(e) === "locked", y = await Do({
4558
4591
  packs: l,
4559
4592
  installedSet: d,
4560
4593
  stateOf: g,
@@ -4565,9 +4598,9 @@ async function Co(e = {}) {
4565
4598
  o.outro(L.muted("No packs selected. Nothing to do."));
4566
4599
  return;
4567
4600
  }
4568
- let b = Do(y), x = Oo(y), S = ta(l, b), C = Ji(na(l, S)), w;
4601
+ let b = Ao(y), x = jo(y), S = ra(l, b), C = Xi(ia(l, S)), w;
4569
4602
  try {
4570
- w = Xi(b, C, u);
4603
+ w = Qi(b, C, u);
4571
4604
  } catch (e) {
4572
4605
  o.cancel($(e)), process.exit(1);
4573
4606
  }
@@ -4575,7 +4608,7 @@ async function Co(e = {}) {
4575
4608
  o.note(`${w.alreadyInstalled.join(", ")} already installed.`, "Nothing to do"), o.outro(L.muted("Your selection is already part of the project."));
4576
4609
  return;
4577
4610
  }
4578
- let T = Zi({
4611
+ let T = $i({
4579
4612
  order: w.order,
4580
4613
  graph: C,
4581
4614
  isLocked: _,
@@ -4583,28 +4616,28 @@ async function Co(e = {}) {
4583
4616
  });
4584
4617
  if (T.blocked.length > 0 && !m && !p) {
4585
4618
  let e = await er();
4586
- e && (m = e, h = await ho(l, d, {
4619
+ e && (m = e, h = await _o(l, d, {
4587
4620
  token: m,
4588
4621
  key: p
4589
- }), T = Zi({
4622
+ }), T = $i({
4590
4623
  order: w.order,
4591
4624
  graph: C,
4592
4625
  isLocked: _,
4593
4626
  installed: u
4594
4627
  }));
4595
4628
  }
4596
- if (T.blocked.length > 0 && await _o(T.blocked, _, f), T.installable.length === 0) {
4629
+ if (T.blocked.length > 0 && await yo(T.blocked, _, f), T.installable.length === 0) {
4597
4630
  o.outro(L.muted("Nothing left to install once locked packs are removed."));
4598
4631
  return;
4599
4632
  }
4600
- if (vo(T.installable, f), !e.yes) {
4633
+ if (bo(T.installable, f), !e.yes) {
4601
4634
  let e = await o.confirm({ message: `Install ${T.installable.length} pack${T.installable.length === 1 ? "" : "s"}?` });
4602
4635
  (o.isCancel(e) || !e) && (o.cancel("Installation cancelled."), process.exit(0));
4603
4636
  }
4604
4637
  c.start("Downloading packs...");
4605
4638
  let E;
4606
4639
  try {
4607
- E = await yo(T.installable, {
4640
+ E = await xo(T.installable, {
4608
4641
  token: m,
4609
4642
  key: p
4610
4643
  });
@@ -4612,7 +4645,7 @@ async function Co(e = {}) {
4612
4645
  c.stop("Download failed"), o.cancel($(e)), process.exit(1);
4613
4646
  }
4614
4647
  c.stop(`Downloaded ${E.length} pack${E.length === 1 ? "" : "s"}`);
4615
- let D = await So({
4648
+ let D = await To({
4616
4649
  prepared: E,
4617
4650
  config: a,
4618
4651
  cwd: s,
@@ -4622,7 +4655,7 @@ async function Co(e = {}) {
4622
4655
  });
4623
4656
  try {
4624
4657
  c.start("Installing pack files...");
4625
- let t = await Ni({
4658
+ let t = await Pi({
4626
4659
  packs: E,
4627
4660
  config: a,
4628
4661
  projectRoot: s,
@@ -4635,18 +4668,18 @@ async function Co(e = {}) {
4635
4668
  for (let e of t.errors) o.log.error(e);
4636
4669
  o.cancel("No files were written. Fix the errors above (or pass --force for existing files) and try again."), process.exit(1);
4637
4670
  }
4638
- c.stop("Files installed"), t.installed.length > 0 && o.log.success(`${L.highlight(String(t.installed.length))} files installed`), t.skipped.length > 0 && o.log.warning(`${t.skipped.length} files skipped (use --force to overwrite)`);
4671
+ c.stop("Files installed"), t.installed.length > 0 && o.log.success(`${L.highlight(String(t.installed.length))} files installed`), t.skipped.length > 0 && (o.log.warning(`${t.skipped.length} files skipped (use --force to overwrite)`), wo(t.skipped));
4639
4672
  for (let e of t.errors) o.log.error(e);
4640
- await bo({
4673
+ await So({
4641
4674
  prepared: E,
4642
4675
  paths: a.paths,
4643
4676
  cwd: s,
4644
4677
  spinner: c
4645
- }), i && await qi(s, e.yes ?? !1), await ur({
4678
+ }), i && await Yi(s, e.yes ?? !1), await ur({
4646
4679
  projectRoot: s,
4647
4680
  paths: a.paths,
4648
4681
  skipPrompts: e.yes ?? !1
4649
- }), xo(E), o.outro(L.brand(`Installed ${t.appliedPacks.join(", ")}.`));
4682
+ }), Co(E), o.outro(L.brand(`Installed ${t.appliedPacks.join(", ")}.`));
4650
4683
  } finally {
4651
4684
  await Promise.all(E.map((e) => v.rm(e.packDir, {
4652
4685
  recursive: !0,
@@ -4654,10 +4687,10 @@ async function Co(e = {}) {
4654
4687
  })));
4655
4688
  }
4656
4689
  }
4657
- async function wo(e) {
4690
+ async function Do(e) {
4658
4691
  let { packs: t, installedSet: n, stateOf: r, options: i, adminAvailable: a } = e;
4659
4692
  if (i.packs && i.packs.length > 0) {
4660
- let e = i.packs.map(Eo), n = e.filter((e) => !t.some((t) => t.name === e.name));
4693
+ let e = i.packs.map(ko), n = e.filter((e) => !t.some((t) => t.name === e.name));
4661
4694
  return n.length > 0 && (o.cancel(`Unknown pack${n.length === 1 ? "" : "s"}: ${n.map((e) => e.name).join(", ")}`), process.exit(1)), e;
4662
4695
  }
4663
4696
  let s = t.filter((e) => n.has(e.name));
@@ -4666,13 +4699,13 @@ async function wo(e) {
4666
4699
  if (c.length === 0) return o.outro(L.muted("Every available pack is already installed.")), [];
4667
4700
  let l = P();
4668
4701
  o.note(c.map((e) => ` ${R.arrow} ${L.highlight(e.displayName)} ${_e(`${l}/packs/${e.name}`)}`).join("\n"), "Browse packs");
4669
- let u = Bi(c, { adminAvailable: a }), d = [];
4702
+ let u = Vi(c, { adminAvailable: a }), d = [];
4670
4703
  for (let e of u) {
4671
4704
  let t = e.packs.map((e) => {
4672
4705
  let t = r(e.name);
4673
4706
  return {
4674
4707
  value: e.name,
4675
- label: `${e.displayName} ${go(t, e.price)}`,
4708
+ label: `${e.displayName} ${vo(t, e.price)}`,
4676
4709
  hint: e.description
4677
4710
  };
4678
4711
  });
@@ -4689,7 +4722,7 @@ async function wo(e) {
4689
4722
  });
4690
4723
  continue;
4691
4724
  }
4692
- let n = await ma({
4725
+ let n = await ga({
4693
4726
  message: `Select ${e.label.toLowerCase()} to add (optional)`,
4694
4727
  options: t,
4695
4728
  required: !1
@@ -4699,20 +4732,20 @@ async function wo(e) {
4699
4732
  }
4700
4733
  return d;
4701
4734
  }
4702
- var To = /@(frontend|admin)$/;
4703
- function Eo(e) {
4704
- let t = e.match(To);
4735
+ var Oo = /@(frontend|admin)$/;
4736
+ function ko(e) {
4737
+ let t = e.match(Oo);
4705
4738
  return t ? {
4706
4739
  name: e.slice(0, -t[0].length),
4707
4740
  slot: t[1]
4708
4741
  } : { name: e };
4709
4742
  }
4710
- function Do(e) {
4743
+ function Ao(e) {
4711
4744
  let t = /* @__PURE__ */ new Set(), n = [];
4712
4745
  for (let r of e) t.has(r.name) || (t.add(r.name), n.push(r.name));
4713
4746
  return n;
4714
4747
  }
4715
- function Oo(e) {
4748
+ function jo(e) {
4716
4749
  let t = /* @__PURE__ */ new Map();
4717
4750
  for (let n of e) {
4718
4751
  if (!n.slot) continue;
@@ -4723,8 +4756,8 @@ function Oo(e) {
4723
4756
  }
4724
4757
  //#endregion
4725
4758
  //#region src/commands/login.ts
4726
- async function ko() {
4727
- fa(), o.intro(L.brandBold("Log in to Hype Stack")), o.log.step("Opening your browser to sign in...");
4759
+ async function Mo() {
4760
+ ma(), o.intro(L.brandBold("Log in to Hype Stack")), o.log.step("Opening your browser to sign in...");
4728
4761
  let e;
4729
4762
  try {
4730
4763
  e = await $n({ onUrl: (e) => {
@@ -4737,8 +4770,8 @@ async function ko() {
4737
4770
  }
4738
4771
  //#endregion
4739
4772
  //#region src/commands/logout.ts
4740
- async function Ao() {
4741
- fa(), o.intro(L.brandBold("Log out of Hype Stack"));
4773
+ async function No() {
4774
+ ma(), o.intro(L.brandBold("Log out of Hype Stack"));
4742
4775
  let e = N(), t = await Wn(e);
4743
4776
  if (!t) {
4744
4777
  o.outro(L.muted("You're not logged in."));
@@ -4748,16 +4781,16 @@ async function Ao() {
4748
4781
  }
4749
4782
  //#endregion
4750
4783
  //#region src/core/templates.ts
4751
- var jo = q.createRequest()({
4784
+ var Po = q.createRequest()({
4752
4785
  endpoint: "/templates/list",
4753
4786
  method: "GET"
4754
4787
  });
4755
- async function Mo() {
4756
- let { data: e, error: t } = await jo.send();
4788
+ async function Fo() {
4789
+ let { data: e, error: t } = await Po.send();
4757
4790
  if (t || !e) throw Error(`Failed to fetch template list: ${String(t)}`);
4758
4791
  return e.templates;
4759
4792
  }
4760
- async function No(e) {
4793
+ async function Io(e) {
4761
4794
  let { data: t, error: n, status: r } = await q.createRequest()({
4762
4795
  endpoint: `/templates/${encodeURIComponent(e)}/manifest`,
4763
4796
  method: "GET"
@@ -4766,7 +4799,7 @@ async function No(e) {
4766
4799
  if (n || !t) throw Error(`Failed to load manifest for template "${e}": ${String(n)}`);
4767
4800
  return t;
4768
4801
  }
4769
- async function Po(e, t = {}) {
4802
+ async function Lo(e, t = {}) {
4770
4803
  let n = q.createRequest()({
4771
4804
  endpoint: `/templates/${encodeURIComponent(e)}/download`,
4772
4805
  method: "POST"
@@ -4794,12 +4827,12 @@ async function Po(e, t = {}) {
4794
4827
  }
4795
4828
  //#endregion
4796
4829
  //#region src/commands/template.ts
4797
- async function Fo(e = {}) {
4830
+ async function Ro(e = {}) {
4798
4831
  let t = e.cwd ?? process.cwd();
4799
- da();
4800
- let n = await uo(t), a = n?.projectRoot ?? null, s = n?.scaffolded ?? !1, c;
4832
+ pa();
4833
+ let n = await po(t), a = n?.projectRoot ?? null, s = n?.scaffolded ?? !1, c;
4801
4834
  try {
4802
- c = await dr(a ?? t);
4835
+ c = await fr(a ?? t);
4803
4836
  } catch (e) {
4804
4837
  o.cancel(`Could not parse ${L.path("stack.json")}: ${$(e)} Run 'npx @hype-stack/cli init' to regenerate it.`), process.exit(1);
4805
4838
  }
@@ -4810,7 +4843,7 @@ async function Fo(e = {}) {
4810
4843
  u.start("Loading packs...");
4811
4844
  let d;
4812
4845
  try {
4813
- d = await Cr();
4846
+ d = await wr();
4814
4847
  } catch (e) {
4815
4848
  u.stop("Failed to load packs"), o.cancel(`Could not reach Hype Stack. Check your connection and try again.\n${$(e)}`), process.exit(1);
4816
4849
  }
@@ -4819,7 +4852,7 @@ async function Fo(e = {}) {
4819
4852
  u.start("Loading templates...");
4820
4853
  let _;
4821
4854
  try {
4822
- _ = await Mo();
4855
+ _ = await Fo();
4823
4856
  } catch (e) {
4824
4857
  u.stop("Failed to load templates"), o.cancel(`Could not reach Hype Stack. Check your connection and try again.\n${$(e)}`), process.exit(1);
4825
4858
  }
@@ -4840,16 +4873,16 @@ async function Fo(e = {}) {
4840
4873
  }
4841
4874
  let b = _.find((e) => e.id === y);
4842
4875
  b || (u.stop("Template not found"), o.cancel(`Template "${y}" not found. Available: ${_.map((e) => e.id).join(", ") || "(none)"}`), process.exit(1)), u.stop(`Template: ${b.name}`);
4843
- let x = await Io(b, e.variants, e.yes ?? !1), S = Qi(b.slots, x), C = $i(b.slots, b.packs, S), T = await Lo({
4876
+ let x = await zo(b, e.variants, e.yes ?? !1), S = ea(b.slots, x), C = ta(b.slots, b.packs, S), T = await Bo({
4844
4877
  packs: d,
4845
4878
  templatePacks: C,
4846
4879
  installedSet: p,
4847
4880
  options: e
4848
4881
  }), E = [...C, ...T.filter((e) => !C.includes(e))], D = E.filter((e) => !m.has(e));
4849
4882
  D.length > 0 && (o.cancel(`Unknown pack${D.length === 1 ? "" : "s"}: ${D.join(", ")}`), process.exit(1));
4850
- let O = na(d, S), ee = Ji(O), k;
4883
+ let O = ia(d, S), ee = Xi(O), k;
4851
4884
  try {
4852
- k = Xi(E, ee, f);
4885
+ k = Qi(E, ee, f);
4853
4886
  } catch (e) {
4854
4887
  o.cancel($(e)), process.exit(1);
4855
4888
  }
@@ -4857,13 +4890,13 @@ async function Fo(e = {}) {
4857
4890
  o.outro(L.muted("Every pack in this template is already installed."));
4858
4891
  return;
4859
4892
  }
4860
- let te = await ho(O, p, {
4893
+ let te = await _o(O, p, {
4861
4894
  token: g,
4862
4895
  key: h
4863
4896
  }), ne = (e) => {
4864
4897
  let t = m.get(e);
4865
4898
  return !t || t.tier === "free" ? "free" : te[e]?.owned ? "owned" : "locked";
4866
- }, re = (e) => !p.has(e) && ne(e) === "locked", A = Zi({
4899
+ }, re = (e) => !p.has(e) && ne(e) === "locked", A = $i({
4867
4900
  order: k.order,
4868
4901
  graph: ee,
4869
4902
  isLocked: re,
@@ -4871,28 +4904,28 @@ async function Fo(e = {}) {
4871
4904
  });
4872
4905
  if (A.blocked.length > 0 && !g && !h) {
4873
4906
  let e = await er();
4874
- e && (g = e, te = await ho(O, p, {
4907
+ e && (g = e, te = await _o(O, p, {
4875
4908
  token: g,
4876
4909
  key: h
4877
- }), A = Zi({
4910
+ }), A = $i({
4878
4911
  order: k.order,
4879
4912
  graph: ee,
4880
4913
  isLocked: re,
4881
4914
  installed: f
4882
4915
  }));
4883
4916
  }
4884
- if (A.blocked.length > 0 && await _o(A.blocked, re, m), A.installable.length === 0) {
4917
+ if (A.blocked.length > 0 && await yo(A.blocked, re, m), A.installable.length === 0) {
4885
4918
  o.outro(L.muted("Nothing left to install once locked packs are removed."));
4886
4919
  return;
4887
4920
  }
4888
- if (vo(A.installable, m), !e.yes) {
4921
+ if (bo(A.installable, m), !e.yes) {
4889
4922
  let e = await o.confirm({ message: `Install template ${L.brandBold(b.name)} (${A.installable.length} pack${A.installable.length === 1 ? "" : "s"})?` });
4890
4923
  (o.isCancel(e) || !e) && (o.cancel("Installation cancelled."), process.exit(0));
4891
4924
  }
4892
4925
  u.start("Downloading packs...");
4893
4926
  let j;
4894
4927
  try {
4895
- j = await yo(A.installable, {
4928
+ j = await xo(A.installable, {
4896
4929
  token: g,
4897
4930
  key: h
4898
4931
  });
@@ -4900,7 +4933,7 @@ async function Fo(e = {}) {
4900
4933
  u.stop("Download failed"), o.cancel($(e)), process.exit(1);
4901
4934
  }
4902
4935
  u.stop(`Downloaded ${j.length} pack${j.length === 1 ? "" : "s"}`);
4903
- let ie = await So({
4936
+ let ie = await To({
4904
4937
  prepared: j,
4905
4938
  config: c,
4906
4939
  cwd: l,
@@ -4909,7 +4942,7 @@ async function Fo(e = {}) {
4909
4942
  }), M = null;
4910
4943
  try {
4911
4944
  u.start("Installing pack files...");
4912
- let t = await Ni({
4945
+ let t = await Pi({
4913
4946
  packs: j,
4914
4947
  config: c,
4915
4948
  projectRoot: l,
@@ -4921,15 +4954,15 @@ async function Fo(e = {}) {
4921
4954
  for (let e of t.errors) o.log.error(e);
4922
4955
  o.cancel("No files were written. Fix the errors above (or pass --force for existing files) and try again."), process.exit(1);
4923
4956
  }
4924
- u.stop("Files installed"), t.installed.length > 0 && o.log.success(`${L.highlight(String(t.installed.length))} files installed`), t.skipped.length > 0 && o.log.warning(`${t.skipped.length} files skipped (use --force to overwrite)`);
4957
+ u.stop("Files installed"), t.installed.length > 0 && o.log.success(`${L.highlight(String(t.installed.length))} files installed`), t.skipped.length > 0 && (o.log.warning(`${t.skipped.length} files skipped (use --force to overwrite)`), wo(t.skipped));
4925
4958
  for (let e of t.errors) o.log.error(e);
4926
4959
  u.start("Applying template overrides...");
4927
- let n = await No(b.id), a = await Po(b.id, {
4960
+ let n = await Io(b.id), a = await Lo(b.id, {
4928
4961
  token: g,
4929
4962
  licenseKey: h
4930
4963
  });
4931
4964
  a.status === "denied" && (u.stop("Template download denied"), o.cancel(`Access to template "${b.id}" was denied (${a.reason}). Try 'npx @hype-stack/cli login' or check your license.`), process.exit(1)), M = a.templateDir;
4932
- let d = await Fi({
4965
+ let d = await Ii({
4933
4966
  manifest: n,
4934
4967
  config: c,
4935
4968
  projectRoot: l,
@@ -4938,17 +4971,17 @@ async function Fo(e = {}) {
4938
4971
  u.stop("Template overrides applied"), d.installed.length > 0 && o.log.success(`${d.installed.length} template file${d.installed.length === 1 ? "" : "s"} applied`);
4939
4972
  for (let e of d.errors) o.log.error(e);
4940
4973
  let f = n.theme ?? "zinc-mono";
4941
- i(f) && (await ba(w.resolve(l, c.paths?.frontend.root ?? "apps/frontend"), r(f)) ? o.log.success(`Applied the ${r(f).label} theme`) : o.log.warning(L.muted(`Could not find ${L.path("assets/styles.css")} to apply the theme`))), await Ro({
4974
+ i(f) && (await Sa(w.resolve(l, c.paths?.frontend.root ?? "apps/frontend"), r(f)) ? o.log.success(`Applied the ${r(f).label} theme`) : o.log.warning(L.muted(`Could not find ${L.path("assets/styles.css")} to apply the theme`))), await Vo({
4942
4975
  prepared: j,
4943
4976
  templateNpm: n.dependencies_npm,
4944
4977
  paths: c.paths,
4945
4978
  cwd: l,
4946
4979
  spinner: u
4947
- }), s && await qi(l, e.yes ?? !1), await ur({
4980
+ }), s && await Yi(l, e.yes ?? !1), await ur({
4948
4981
  projectRoot: l,
4949
4982
  paths: c.paths,
4950
4983
  skipPrompts: e.yes ?? !1
4951
- }), xo(j), n.postInstall && n.postInstall.length > 0 && o.note(n.postInstall.map((e) => ` ${L.muted("→")} ${e}`).join("\n"), "Template Next Steps"), o.outro(L.brand(`Installed template ${b.name}.`));
4984
+ }), Co(j), n.postInstall && n.postInstall.length > 0 && o.note(n.postInstall.map((e) => ` ${L.muted("→")} ${e}`).join("\n"), "Template Next Steps"), o.outro(L.brand(`Installed template ${b.name}.`));
4952
4985
  } finally {
4953
4986
  await Promise.all(j.map((e) => v.rm(e.packDir, {
4954
4987
  recursive: !0,
@@ -4959,7 +4992,7 @@ async function Fo(e = {}) {
4959
4992
  });
4960
4993
  }
4961
4994
  }
4962
- async function Io(e, t, n) {
4995
+ async function zo(e, t, n) {
4963
4996
  let r = {};
4964
4997
  for (let i of e.slots) {
4965
4998
  if (t?.[i.family]) {
@@ -4983,7 +5016,7 @@ async function Io(e, t, n) {
4983
5016
  }
4984
5017
  return r;
4985
5018
  }
4986
- async function Lo(e) {
5019
+ async function Bo(e) {
4987
5020
  let { packs: t, templatePacks: n, installedSet: r, options: i } = e, a = new Set(n);
4988
5021
  if (i.packs && i.packs.length > 0) {
4989
5022
  let e = i.packs.filter((e) => !t.some((t) => t.name === e));
@@ -4994,7 +5027,7 @@ async function Lo(e) {
4994
5027
  if (s.length === 0) return [];
4995
5028
  let c = P();
4996
5029
  o.note(s.map((e) => ` ${R.arrow} ${L.highlight(e.displayName)} ${_e(`${c}/packs/${e.name}`)}`).join("\n"), "Browse packs");
4997
- let l = await ma({
5030
+ let l = await ga({
4998
5031
  message: "Add extra packs on top of the template (optional)",
4999
5032
  options: s.map((e) => ({
5000
5033
  value: e.name,
@@ -5005,25 +5038,25 @@ async function Lo(e) {
5005
5038
  });
5006
5039
  return p(l) && (o.cancel("Cancelled."), process.exit(0)), l;
5007
5040
  }
5008
- async function Ro(e) {
5009
- let { prepared: t, templateNpm: n, paths: r, cwd: i, spinner: a } = e, s = po(t.map((e) => e.manifest.dependencies_npm)), c = fo(n ? po([s, n]) : s, r);
5041
+ async function Vo(e) {
5042
+ let { prepared: t, templateNpm: n, paths: r, cwd: i, spinner: a } = e, s = ho(t.map((e) => e.manifest.dependencies_npm)), c = mo(n ? ho([s, n]) : s, r);
5010
5043
  if (c.errors.length > 0) {
5011
5044
  for (let e of c.errors) o.log.error(e);
5012
5045
  return;
5013
5046
  }
5014
5047
  if (c.operations.length === 0) return;
5015
5048
  a.start("Installing npm dependencies...");
5016
- let l = await mo(c.operations, i);
5049
+ let l = await go(c.operations, i);
5017
5050
  if (a.stop(l.ok ? "npm dependencies installed" : "npm dependency installation failed"), !l.ok) for (let e of l.errors) o.log.error(e);
5018
5051
  }
5019
5052
  //#endregion
5020
5053
  //#region src/cli.ts
5021
- function zo(e) {
5054
+ function Ho(e) {
5022
5055
  if (!e) return;
5023
5056
  let t = e.split(",").map((e) => e.trim()).filter((e) => e.length > 0);
5024
5057
  return t.length > 0 ? t : void 0;
5025
5058
  }
5026
- function Bo(e) {
5059
+ function Uo(e) {
5027
5060
  if (!e) return;
5028
5061
  let t = {};
5029
5062
  for (let n of e.split(",")) {
@@ -5032,10 +5065,10 @@ function Bo(e) {
5032
5065
  }
5033
5066
  return Object.keys(t).length > 0 ? t : void 0;
5034
5067
  }
5035
- function Vo() {
5068
+ function Wo() {
5036
5069
  let e = new a();
5037
5070
  return e.name("hype-stack").description("Build with Hype Stack -- templates, components, modules, and more").version(k, "-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) => {
5038
- await co({
5071
+ await uo({
5039
5072
  name: e.name,
5040
5073
  directory: e.directory,
5041
5074
  install: e.install,
@@ -5045,32 +5078,32 @@ function Vo() {
5045
5078
  setup: e.setup
5046
5079
  });
5047
5080
  }), e.command("init").description("Initialize stack.json in the current project").action(async () => {
5048
- await lo({});
5081
+ await fo({});
5049
5082
  }), 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) => {
5050
- await Co({
5051
- packs: zo(e.packs),
5083
+ await Eo({
5084
+ packs: Ho(e.packs),
5052
5085
  force: e.force,
5053
5086
  yes: e.yes,
5054
5087
  licenseKey: e.key ?? e.licenseKey,
5055
5088
  cwd: e.cwd
5056
5089
  });
5057
5090
  }), 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) => {
5058
- await Fo({
5091
+ await Ro({
5059
5092
  templateId: e,
5060
- variants: Bo(t.variants),
5061
- packs: zo(t.packs),
5093
+ variants: Uo(t.variants),
5094
+ packs: Ho(t.packs),
5062
5095
  force: t.force,
5063
5096
  yes: t.yes,
5064
5097
  licenseKey: t.key ?? t.licenseKey,
5065
5098
  cwd: t.cwd
5066
5099
  });
5067
5100
  }), e.command("login").description("Log in via your browser to install packs your organization owns").action(async () => {
5068
- await ko();
5101
+ await Mo();
5069
5102
  }), e.command("logout").description("Log out and remove the saved CLI token").action(async () => {
5070
- await Ao();
5103
+ await No();
5071
5104
  }), e.command("auth").description("Alias for `login`").action(async () => {
5072
- await ko();
5105
+ await Mo();
5073
5106
  }), e;
5074
5107
  }
5075
5108
  //#endregion
5076
- export { uo as a, Co as i, Ao as n, lo as o, ko as r, co as s, Vo as t };
5109
+ export { po as a, Eo as i, No as n, fo as o, Mo as r, uo as s, Wo as t };