@hype-stack/cli 0.3.2 → 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.0.1", 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
- 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,21 +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
- deferSetup: !0
4361
+ deferSetup: !0,
4362
+ skipBanner: !0
4344
4363
  }));
4345
- if (await _r(e)) {
4364
+ if (await vr(e)) {
4346
4365
  o.log.warn(`No ${L.path("stack.json")} found in ${L.path(e)}.`);
4347
4366
  let t = await o.confirm({
4348
4367
  message: `Create ${L.path("stack.json")} now?`,
@@ -4350,7 +4369,7 @@ async function uo(e, t = {}) {
4350
4369
  });
4351
4370
  if (o.isCancel(t) || !t) return null;
4352
4371
  await n(e);
4353
- let r = await fr(e);
4372
+ let r = await pr(e);
4354
4373
  return r && o.log.success(`${L.path("stack.json")} created`), r ? {
4355
4374
  projectRoot: e,
4356
4375
  scaffolded: !1
@@ -4368,14 +4387,14 @@ async function uo(e, t = {}) {
4368
4387
  });
4369
4388
  if (o.isCancel(a) || !a) return null;
4370
4389
  let s = await r(e);
4371
- return await fr(s) ? {
4390
+ return await pr(s) ? {
4372
4391
  projectRoot: s,
4373
4392
  scaffolded: !0
4374
4393
  } : null;
4375
4394
  }
4376
4395
  //#endregion
4377
4396
  //#region src/core/npm-deps.ts
4378
- function fo(e, t) {
4397
+ function mo(e, t) {
4379
4398
  let n = [], r = [];
4380
4399
  if (!e) return {
4381
4400
  errors: n,
@@ -4406,7 +4425,7 @@ function fo(e, t) {
4406
4425
  operations: r
4407
4426
  };
4408
4427
  }
4409
- function po(e) {
4428
+ function ho(e) {
4410
4429
  let t = {};
4411
4430
  for (let n of e) if (n) for (let [e, r] of Object.entries(n)) t[e] = {
4412
4431
  ...t[e],
@@ -4414,7 +4433,7 @@ function po(e) {
4414
4433
  };
4415
4434
  return t;
4416
4435
  }
4417
- async function mo(e, t, n = J) {
4436
+ async function go(e, t, n = J) {
4418
4437
  let r = [];
4419
4438
  for (let i of e) {
4420
4439
  let e = w.join(t, i.relativeDir);
@@ -4450,14 +4469,14 @@ async function mo(e, t, n = J) {
4450
4469
  function $(e) {
4451
4470
  return e instanceof Error ? e.message : String(e);
4452
4471
  }
4453
- async function ho(e, t, n) {
4472
+ async function _o(e, t, n) {
4454
4473
  let r = e.filter((e) => e.tier === "paid" && !t.has(e.name)).map((e) => e.name);
4455
- return r.length === 0 ? {} : wr(r, n).catch(() => ({}));
4474
+ return r.length === 0 ? {} : Tr(r, n).catch(() => ({}));
4456
4475
  }
4457
- function go(e, t) {
4476
+ function vo(e, t) {
4458
4477
  return e === "free" ? L.success("free") : e === "owned" ? L.accent("owned") : `${L.highlight(`$${t}`)} ${L.muted("locked")}`;
4459
4478
  }
4460
- async function _o(e, t, n) {
4479
+ async function yo(e, t, n) {
4461
4480
  let r = e.filter((e) => t(e)), i = e.filter((e) => !t(e));
4462
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) => ({
4463
4482
  name: e.name,
@@ -4465,7 +4484,7 @@ async function _o(e, t, n) {
4465
4484
  price: e.price
4466
4485
  })));
4467
4486
  }
4468
- function vo(e, t) {
4487
+ function bo(e, t) {
4469
4488
  let n = e.map((e, n) => {
4470
4489
  let r = t.get(e), i = r ? r.displayName : e;
4471
4490
  return ` ${L.muted(`${n + 1}.`)} ${L.brand(i)}`;
@@ -4476,10 +4495,10 @@ function vo(e, t) {
4476
4495
  ...n
4477
4496
  ].join("\n"), "Install Plan");
4478
4497
  }
4479
- async function yo(e, t) {
4498
+ async function xo(e, t) {
4480
4499
  let n = [];
4481
4500
  for (let r of e) {
4482
- let e = await vr(r), i = await yr(r, t);
4501
+ let e = await yr(r), i = await br(r, t);
4483
4502
  if (i.status === "denied") throw Error(`Access to "${r}" was denied (${i.reason}). Try 'npx @hype-stack/cli login' or check your license.`);
4484
4503
  n.push({
4485
4504
  manifest: e,
@@ -4488,32 +4507,47 @@ async function yo(e, t) {
4488
4507
  }
4489
4508
  return n;
4490
4509
  }
4491
- async function bo(e) {
4492
- 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);
4493
4512
  if (a.errors.length > 0) {
4494
4513
  for (let e of a.errors) o.log.error(e);
4495
4514
  return;
4496
4515
  }
4497
4516
  if (a.operations.length === 0) return;
4498
4517
  i.start("Installing npm dependencies...");
4499
- let s = await mo(a.operations, r);
4518
+ let s = await go(a.operations, r);
4500
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);
4501
4520
  }
4502
- function xo(e) {
4521
+ function Co(e) {
4503
4522
  let t = e.flatMap((e) => e.manifest.postInstall ?? []), n = [...new Set(t)];
4504
4523
  n.length !== 0 && o.note(n.map((e) => ` ${L.muted("→")} ${e}`).join("\n"), "Next Steps");
4505
4524
  }
4506
- 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) {
4507
4534
  let { prepared: t, config: n, cwd: r, force: i, yes: a, slotsByPack: s } = e, c = /* @__PURE__ */ new Set();
4508
4535
  if (i) return c;
4509
- let l = await Ai({
4536
+ let l = await ji({
4510
4537
  packs: t,
4511
4538
  config: n,
4512
4539
  projectRoot: r,
4513
4540
  slotsByPack: s
4514
4541
  });
4515
4542
  if (l.length === 0) return c;
4516
- 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
+ }
4517
4551
  o.log.warning(`${l.length} file${l.length === 1 ? "" : "s"} already exist in your project.`);
4518
4552
  for (let e of l) {
4519
4553
  let t = w.relative(r, e.targetPath) || e.target, n = await o.confirm({
@@ -4526,12 +4560,12 @@ async function So(e) {
4526
4560
  }
4527
4561
  //#endregion
4528
4562
  //#region src/commands/compose.ts
4529
- async function Co(e = {}) {
4563
+ async function Eo(e = {}) {
4530
4564
  let t = e.cwd ?? process.cwd();
4531
- fa();
4532
- 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;
4533
4567
  try {
4534
- a = await dr(r ?? t);
4568
+ a = await fr(r ?? t);
4535
4569
  } catch (e) {
4536
4570
  o.cancel(`Could not parse ${L.path("stack.json")}: ${$(e)} Run 'npx @hype-stack/cli init' to regenerate it.`), process.exit(1);
4537
4571
  }
@@ -4542,18 +4576,18 @@ async function Co(e = {}) {
4542
4576
  c.start("Loading packs...");
4543
4577
  let l;
4544
4578
  try {
4545
- l = await Cr();
4579
+ l = await wr();
4546
4580
  } catch (e) {
4547
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);
4548
4582
  }
4549
4583
  c.stop("Packs loaded");
4550
- 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, {
4551
4585
  token: m,
4552
4586
  key: p
4553
4587
  }), g = (e) => {
4554
4588
  let t = f.get(e);
4555
4589
  return !t || t.tier === "free" ? "free" : h[e]?.owned ? "owned" : "locked";
4556
- }, _ = (e) => !d.has(e) && g(e) === "locked", y = await wo({
4590
+ }, _ = (e) => !d.has(e) && g(e) === "locked", y = await Do({
4557
4591
  packs: l,
4558
4592
  installedSet: d,
4559
4593
  stateOf: g,
@@ -4564,9 +4598,9 @@ async function Co(e = {}) {
4564
4598
  o.outro(L.muted("No packs selected. Nothing to do."));
4565
4599
  return;
4566
4600
  }
4567
- 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;
4568
4602
  try {
4569
- w = Xi(b, C, u);
4603
+ w = Qi(b, C, u);
4570
4604
  } catch (e) {
4571
4605
  o.cancel($(e)), process.exit(1);
4572
4606
  }
@@ -4574,7 +4608,7 @@ async function Co(e = {}) {
4574
4608
  o.note(`${w.alreadyInstalled.join(", ")} already installed.`, "Nothing to do"), o.outro(L.muted("Your selection is already part of the project."));
4575
4609
  return;
4576
4610
  }
4577
- let T = Zi({
4611
+ let T = $i({
4578
4612
  order: w.order,
4579
4613
  graph: C,
4580
4614
  isLocked: _,
@@ -4582,28 +4616,28 @@ async function Co(e = {}) {
4582
4616
  });
4583
4617
  if (T.blocked.length > 0 && !m && !p) {
4584
4618
  let e = await er();
4585
- e && (m = e, h = await ho(l, d, {
4619
+ e && (m = e, h = await _o(l, d, {
4586
4620
  token: m,
4587
4621
  key: p
4588
- }), T = Zi({
4622
+ }), T = $i({
4589
4623
  order: w.order,
4590
4624
  graph: C,
4591
4625
  isLocked: _,
4592
4626
  installed: u
4593
4627
  }));
4594
4628
  }
4595
- 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) {
4596
4630
  o.outro(L.muted("Nothing left to install once locked packs are removed."));
4597
4631
  return;
4598
4632
  }
4599
- if (vo(T.installable, f), !e.yes) {
4633
+ if (bo(T.installable, f), !e.yes) {
4600
4634
  let e = await o.confirm({ message: `Install ${T.installable.length} pack${T.installable.length === 1 ? "" : "s"}?` });
4601
4635
  (o.isCancel(e) || !e) && (o.cancel("Installation cancelled."), process.exit(0));
4602
4636
  }
4603
4637
  c.start("Downloading packs...");
4604
4638
  let E;
4605
4639
  try {
4606
- E = await yo(T.installable, {
4640
+ E = await xo(T.installable, {
4607
4641
  token: m,
4608
4642
  key: p
4609
4643
  });
@@ -4611,7 +4645,7 @@ async function Co(e = {}) {
4611
4645
  c.stop("Download failed"), o.cancel($(e)), process.exit(1);
4612
4646
  }
4613
4647
  c.stop(`Downloaded ${E.length} pack${E.length === 1 ? "" : "s"}`);
4614
- let D = await So({
4648
+ let D = await To({
4615
4649
  prepared: E,
4616
4650
  config: a,
4617
4651
  cwd: s,
@@ -4621,7 +4655,7 @@ async function Co(e = {}) {
4621
4655
  });
4622
4656
  try {
4623
4657
  c.start("Installing pack files...");
4624
- let t = await Ni({
4658
+ let t = await Pi({
4625
4659
  packs: E,
4626
4660
  config: a,
4627
4661
  projectRoot: s,
@@ -4634,18 +4668,18 @@ async function Co(e = {}) {
4634
4668
  for (let e of t.errors) o.log.error(e);
4635
4669
  o.cancel("No files were written. Fix the errors above (or pass --force for existing files) and try again."), process.exit(1);
4636
4670
  }
4637
- 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));
4638
4672
  for (let e of t.errors) o.log.error(e);
4639
- await bo({
4673
+ await So({
4640
4674
  prepared: E,
4641
4675
  paths: a.paths,
4642
4676
  cwd: s,
4643
4677
  spinner: c
4644
- }), i && await qi(s, e.yes ?? !1), await ur({
4678
+ }), i && await Yi(s, e.yes ?? !1), await ur({
4645
4679
  projectRoot: s,
4646
4680
  paths: a.paths,
4647
4681
  skipPrompts: e.yes ?? !1
4648
- }), xo(E), o.outro(L.brand(`Installed ${t.appliedPacks.join(", ")}.`));
4682
+ }), Co(E), o.outro(L.brand(`Installed ${t.appliedPacks.join(", ")}.`));
4649
4683
  } finally {
4650
4684
  await Promise.all(E.map((e) => v.rm(e.packDir, {
4651
4685
  recursive: !0,
@@ -4653,10 +4687,10 @@ async function Co(e = {}) {
4653
4687
  })));
4654
4688
  }
4655
4689
  }
4656
- async function wo(e) {
4690
+ async function Do(e) {
4657
4691
  let { packs: t, installedSet: n, stateOf: r, options: i, adminAvailable: a } = e;
4658
4692
  if (i.packs && i.packs.length > 0) {
4659
- 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));
4660
4694
  return n.length > 0 && (o.cancel(`Unknown pack${n.length === 1 ? "" : "s"}: ${n.map((e) => e.name).join(", ")}`), process.exit(1)), e;
4661
4695
  }
4662
4696
  let s = t.filter((e) => n.has(e.name));
@@ -4665,13 +4699,13 @@ async function wo(e) {
4665
4699
  if (c.length === 0) return o.outro(L.muted("Every available pack is already installed.")), [];
4666
4700
  let l = P();
4667
4701
  o.note(c.map((e) => ` ${R.arrow} ${L.highlight(e.displayName)} ${_e(`${l}/packs/${e.name}`)}`).join("\n"), "Browse packs");
4668
- let u = Bi(c, { adminAvailable: a }), d = [];
4702
+ let u = Vi(c, { adminAvailable: a }), d = [];
4669
4703
  for (let e of u) {
4670
4704
  let t = e.packs.map((e) => {
4671
4705
  let t = r(e.name);
4672
4706
  return {
4673
4707
  value: e.name,
4674
- label: `${e.displayName} ${go(t, e.price)}`,
4708
+ label: `${e.displayName} ${vo(t, e.price)}`,
4675
4709
  hint: e.description
4676
4710
  };
4677
4711
  });
@@ -4688,7 +4722,7 @@ async function wo(e) {
4688
4722
  });
4689
4723
  continue;
4690
4724
  }
4691
- let n = await ma({
4725
+ let n = await ga({
4692
4726
  message: `Select ${e.label.toLowerCase()} to add (optional)`,
4693
4727
  options: t,
4694
4728
  required: !1
@@ -4698,20 +4732,20 @@ async function wo(e) {
4698
4732
  }
4699
4733
  return d;
4700
4734
  }
4701
- var To = /@(frontend|admin)$/;
4702
- function Eo(e) {
4703
- let t = e.match(To);
4735
+ var Oo = /@(frontend|admin)$/;
4736
+ function ko(e) {
4737
+ let t = e.match(Oo);
4704
4738
  return t ? {
4705
4739
  name: e.slice(0, -t[0].length),
4706
4740
  slot: t[1]
4707
4741
  } : { name: e };
4708
4742
  }
4709
- function Do(e) {
4743
+ function Ao(e) {
4710
4744
  let t = /* @__PURE__ */ new Set(), n = [];
4711
4745
  for (let r of e) t.has(r.name) || (t.add(r.name), n.push(r.name));
4712
4746
  return n;
4713
4747
  }
4714
- function Oo(e) {
4748
+ function jo(e) {
4715
4749
  let t = /* @__PURE__ */ new Map();
4716
4750
  for (let n of e) {
4717
4751
  if (!n.slot) continue;
@@ -4722,8 +4756,8 @@ function Oo(e) {
4722
4756
  }
4723
4757
  //#endregion
4724
4758
  //#region src/commands/login.ts
4725
- async function ko() {
4726
- 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...");
4727
4761
  let e;
4728
4762
  try {
4729
4763
  e = await $n({ onUrl: (e) => {
@@ -4736,8 +4770,8 @@ async function ko() {
4736
4770
  }
4737
4771
  //#endregion
4738
4772
  //#region src/commands/logout.ts
4739
- async function Ao() {
4740
- 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"));
4741
4775
  let e = N(), t = await Wn(e);
4742
4776
  if (!t) {
4743
4777
  o.outro(L.muted("You're not logged in."));
@@ -4747,16 +4781,16 @@ async function Ao() {
4747
4781
  }
4748
4782
  //#endregion
4749
4783
  //#region src/core/templates.ts
4750
- var jo = q.createRequest()({
4784
+ var Po = q.createRequest()({
4751
4785
  endpoint: "/templates/list",
4752
4786
  method: "GET"
4753
4787
  });
4754
- async function Mo() {
4755
- let { data: e, error: t } = await jo.send();
4788
+ async function Fo() {
4789
+ let { data: e, error: t } = await Po.send();
4756
4790
  if (t || !e) throw Error(`Failed to fetch template list: ${String(t)}`);
4757
4791
  return e.templates;
4758
4792
  }
4759
- async function No(e) {
4793
+ async function Io(e) {
4760
4794
  let { data: t, error: n, status: r } = await q.createRequest()({
4761
4795
  endpoint: `/templates/${encodeURIComponent(e)}/manifest`,
4762
4796
  method: "GET"
@@ -4765,7 +4799,7 @@ async function No(e) {
4765
4799
  if (n || !t) throw Error(`Failed to load manifest for template "${e}": ${String(n)}`);
4766
4800
  return t;
4767
4801
  }
4768
- async function Po(e, t = {}) {
4802
+ async function Lo(e, t = {}) {
4769
4803
  let n = q.createRequest()({
4770
4804
  endpoint: `/templates/${encodeURIComponent(e)}/download`,
4771
4805
  method: "POST"
@@ -4793,12 +4827,12 @@ async function Po(e, t = {}) {
4793
4827
  }
4794
4828
  //#endregion
4795
4829
  //#region src/commands/template.ts
4796
- async function Fo(e = {}) {
4830
+ async function Ro(e = {}) {
4797
4831
  let t = e.cwd ?? process.cwd();
4798
- fa();
4799
- 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;
4800
4834
  try {
4801
- c = await dr(a ?? t);
4835
+ c = await fr(a ?? t);
4802
4836
  } catch (e) {
4803
4837
  o.cancel(`Could not parse ${L.path("stack.json")}: ${$(e)} Run 'npx @hype-stack/cli init' to regenerate it.`), process.exit(1);
4804
4838
  }
@@ -4809,7 +4843,7 @@ async function Fo(e = {}) {
4809
4843
  u.start("Loading packs...");
4810
4844
  let d;
4811
4845
  try {
4812
- d = await Cr();
4846
+ d = await wr();
4813
4847
  } catch (e) {
4814
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);
4815
4849
  }
@@ -4818,7 +4852,7 @@ async function Fo(e = {}) {
4818
4852
  u.start("Loading templates...");
4819
4853
  let _;
4820
4854
  try {
4821
- _ = await Mo();
4855
+ _ = await Fo();
4822
4856
  } catch (e) {
4823
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);
4824
4858
  }
@@ -4839,16 +4873,16 @@ async function Fo(e = {}) {
4839
4873
  }
4840
4874
  let b = _.find((e) => e.id === y);
4841
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}`);
4842
- 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({
4843
4877
  packs: d,
4844
4878
  templatePacks: C,
4845
4879
  installedSet: p,
4846
4880
  options: e
4847
4881
  }), E = [...C, ...T.filter((e) => !C.includes(e))], D = E.filter((e) => !m.has(e));
4848
4882
  D.length > 0 && (o.cancel(`Unknown pack${D.length === 1 ? "" : "s"}: ${D.join(", ")}`), process.exit(1));
4849
- let O = na(d, S), ee = Ji(O), k;
4883
+ let O = ia(d, S), ee = Xi(O), k;
4850
4884
  try {
4851
- k = Xi(E, ee, f);
4885
+ k = Qi(E, ee, f);
4852
4886
  } catch (e) {
4853
4887
  o.cancel($(e)), process.exit(1);
4854
4888
  }
@@ -4856,13 +4890,13 @@ async function Fo(e = {}) {
4856
4890
  o.outro(L.muted("Every pack in this template is already installed."));
4857
4891
  return;
4858
4892
  }
4859
- let te = await ho(O, p, {
4893
+ let te = await _o(O, p, {
4860
4894
  token: g,
4861
4895
  key: h
4862
4896
  }), ne = (e) => {
4863
4897
  let t = m.get(e);
4864
4898
  return !t || t.tier === "free" ? "free" : te[e]?.owned ? "owned" : "locked";
4865
- }, re = (e) => !p.has(e) && ne(e) === "locked", A = Zi({
4899
+ }, re = (e) => !p.has(e) && ne(e) === "locked", A = $i({
4866
4900
  order: k.order,
4867
4901
  graph: ee,
4868
4902
  isLocked: re,
@@ -4870,28 +4904,28 @@ async function Fo(e = {}) {
4870
4904
  });
4871
4905
  if (A.blocked.length > 0 && !g && !h) {
4872
4906
  let e = await er();
4873
- e && (g = e, te = await ho(O, p, {
4907
+ e && (g = e, te = await _o(O, p, {
4874
4908
  token: g,
4875
4909
  key: h
4876
- }), A = Zi({
4910
+ }), A = $i({
4877
4911
  order: k.order,
4878
4912
  graph: ee,
4879
4913
  isLocked: re,
4880
4914
  installed: f
4881
4915
  }));
4882
4916
  }
4883
- 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) {
4884
4918
  o.outro(L.muted("Nothing left to install once locked packs are removed."));
4885
4919
  return;
4886
4920
  }
4887
- if (vo(A.installable, m), !e.yes) {
4921
+ if (bo(A.installable, m), !e.yes) {
4888
4922
  let e = await o.confirm({ message: `Install template ${L.brandBold(b.name)} (${A.installable.length} pack${A.installable.length === 1 ? "" : "s"})?` });
4889
4923
  (o.isCancel(e) || !e) && (o.cancel("Installation cancelled."), process.exit(0));
4890
4924
  }
4891
4925
  u.start("Downloading packs...");
4892
4926
  let j;
4893
4927
  try {
4894
- j = await yo(A.installable, {
4928
+ j = await xo(A.installable, {
4895
4929
  token: g,
4896
4930
  key: h
4897
4931
  });
@@ -4899,7 +4933,7 @@ async function Fo(e = {}) {
4899
4933
  u.stop("Download failed"), o.cancel($(e)), process.exit(1);
4900
4934
  }
4901
4935
  u.stop(`Downloaded ${j.length} pack${j.length === 1 ? "" : "s"}`);
4902
- let ie = await So({
4936
+ let ie = await To({
4903
4937
  prepared: j,
4904
4938
  config: c,
4905
4939
  cwd: l,
@@ -4908,7 +4942,7 @@ async function Fo(e = {}) {
4908
4942
  }), M = null;
4909
4943
  try {
4910
4944
  u.start("Installing pack files...");
4911
- let t = await Ni({
4945
+ let t = await Pi({
4912
4946
  packs: j,
4913
4947
  config: c,
4914
4948
  projectRoot: l,
@@ -4920,15 +4954,15 @@ async function Fo(e = {}) {
4920
4954
  for (let e of t.errors) o.log.error(e);
4921
4955
  o.cancel("No files were written. Fix the errors above (or pass --force for existing files) and try again."), process.exit(1);
4922
4956
  }
4923
- 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));
4924
4958
  for (let e of t.errors) o.log.error(e);
4925
4959
  u.start("Applying template overrides...");
4926
- let n = await No(b.id), a = await Po(b.id, {
4960
+ let n = await Io(b.id), a = await Lo(b.id, {
4927
4961
  token: g,
4928
4962
  licenseKey: h
4929
4963
  });
4930
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;
4931
- let d = await Fi({
4965
+ let d = await Ii({
4932
4966
  manifest: n,
4933
4967
  config: c,
4934
4968
  projectRoot: l,
@@ -4937,17 +4971,17 @@ async function Fo(e = {}) {
4937
4971
  u.stop("Template overrides applied"), d.installed.length > 0 && o.log.success(`${d.installed.length} template file${d.installed.length === 1 ? "" : "s"} applied`);
4938
4972
  for (let e of d.errors) o.log.error(e);
4939
4973
  let f = n.theme ?? "zinc-mono";
4940
- 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({
4941
4975
  prepared: j,
4942
4976
  templateNpm: n.dependencies_npm,
4943
4977
  paths: c.paths,
4944
4978
  cwd: l,
4945
4979
  spinner: u
4946
- }), s && await qi(l, e.yes ?? !1), await ur({
4980
+ }), s && await Yi(l, e.yes ?? !1), await ur({
4947
4981
  projectRoot: l,
4948
4982
  paths: c.paths,
4949
4983
  skipPrompts: e.yes ?? !1
4950
- }), 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}.`));
4951
4985
  } finally {
4952
4986
  await Promise.all(j.map((e) => v.rm(e.packDir, {
4953
4987
  recursive: !0,
@@ -4958,7 +4992,7 @@ async function Fo(e = {}) {
4958
4992
  });
4959
4993
  }
4960
4994
  }
4961
- async function Io(e, t, n) {
4995
+ async function zo(e, t, n) {
4962
4996
  let r = {};
4963
4997
  for (let i of e.slots) {
4964
4998
  if (t?.[i.family]) {
@@ -4982,7 +5016,7 @@ async function Io(e, t, n) {
4982
5016
  }
4983
5017
  return r;
4984
5018
  }
4985
- async function Lo(e) {
5019
+ async function Bo(e) {
4986
5020
  let { packs: t, templatePacks: n, installedSet: r, options: i } = e, a = new Set(n);
4987
5021
  if (i.packs && i.packs.length > 0) {
4988
5022
  let e = i.packs.filter((e) => !t.some((t) => t.name === e));
@@ -4993,7 +5027,7 @@ async function Lo(e) {
4993
5027
  if (s.length === 0) return [];
4994
5028
  let c = P();
4995
5029
  o.note(s.map((e) => ` ${R.arrow} ${L.highlight(e.displayName)} ${_e(`${c}/packs/${e.name}`)}`).join("\n"), "Browse packs");
4996
- let l = await ma({
5030
+ let l = await ga({
4997
5031
  message: "Add extra packs on top of the template (optional)",
4998
5032
  options: s.map((e) => ({
4999
5033
  value: e.name,
@@ -5004,25 +5038,25 @@ async function Lo(e) {
5004
5038
  });
5005
5039
  return p(l) && (o.cancel("Cancelled."), process.exit(0)), l;
5006
5040
  }
5007
- async function Ro(e) {
5008
- 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);
5009
5043
  if (c.errors.length > 0) {
5010
5044
  for (let e of c.errors) o.log.error(e);
5011
5045
  return;
5012
5046
  }
5013
5047
  if (c.operations.length === 0) return;
5014
5048
  a.start("Installing npm dependencies...");
5015
- let l = await mo(c.operations, i);
5049
+ let l = await go(c.operations, i);
5016
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);
5017
5051
  }
5018
5052
  //#endregion
5019
5053
  //#region src/cli.ts
5020
- function zo(e) {
5054
+ function Ho(e) {
5021
5055
  if (!e) return;
5022
5056
  let t = e.split(",").map((e) => e.trim()).filter((e) => e.length > 0);
5023
5057
  return t.length > 0 ? t : void 0;
5024
5058
  }
5025
- function Bo(e) {
5059
+ function Uo(e) {
5026
5060
  if (!e) return;
5027
5061
  let t = {};
5028
5062
  for (let n of e.split(",")) {
@@ -5031,10 +5065,10 @@ function Bo(e) {
5031
5065
  }
5032
5066
  return Object.keys(t).length > 0 ? t : void 0;
5033
5067
  }
5034
- function Vo() {
5068
+ function Wo() {
5035
5069
  let e = new a();
5036
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) => {
5037
- await co({
5071
+ await uo({
5038
5072
  name: e.name,
5039
5073
  directory: e.directory,
5040
5074
  install: e.install,
@@ -5044,32 +5078,32 @@ function Vo() {
5044
5078
  setup: e.setup
5045
5079
  });
5046
5080
  }), e.command("init").description("Initialize stack.json in the current project").action(async () => {
5047
- await lo({});
5081
+ await fo({});
5048
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) => {
5049
- await Co({
5050
- packs: zo(e.packs),
5083
+ await Eo({
5084
+ packs: Ho(e.packs),
5051
5085
  force: e.force,
5052
5086
  yes: e.yes,
5053
5087
  licenseKey: e.key ?? e.licenseKey,
5054
5088
  cwd: e.cwd
5055
5089
  });
5056
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) => {
5057
- await Fo({
5091
+ await Ro({
5058
5092
  templateId: e,
5059
- variants: Bo(t.variants),
5060
- packs: zo(t.packs),
5093
+ variants: Uo(t.variants),
5094
+ packs: Ho(t.packs),
5061
5095
  force: t.force,
5062
5096
  yes: t.yes,
5063
5097
  licenseKey: t.key ?? t.licenseKey,
5064
5098
  cwd: t.cwd
5065
5099
  });
5066
5100
  }), e.command("login").description("Log in via your browser to install packs your organization owns").action(async () => {
5067
- await ko();
5101
+ await Mo();
5068
5102
  }), e.command("logout").description("Log out and remove the saved CLI token").action(async () => {
5069
- await Ao();
5103
+ await No();
5070
5104
  }), e.command("auth").description("Alias for `login`").action(async () => {
5071
- await ko();
5105
+ await Mo();
5072
5106
  }), e;
5073
5107
  }
5074
5108
  //#endregion
5075
- 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 };