@hype-stack/cli 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{cli-C34Wgnjr.js → cli-CPgWymRN.js} +456 -423
- package/dist/commands/compose.d.ts.map +1 -1
- package/dist/commands/install-helpers.d.ts +7 -0
- package/dist/commands/install-helpers.d.ts.map +1 -1
- package/dist/commands/template.d.ts.map +1 -1
- package/dist/config/bin.js +1 -1
- package/dist/core/codegen.d.ts.map +1 -1
- package/dist/core/post-setup.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
|
@@ -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.
|
|
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
|
-
|
|
2440
|
+
l.start("Generating Prisma client...");
|
|
2441
|
+
let u = await i("pnpm", [
|
|
2441
2442
|
"exec",
|
|
2442
2443
|
"prisma",
|
|
2443
2444
|
"generate"
|
|
2444
|
-
], { cwd: s })
|
|
2445
|
-
|
|
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
|
|
2450
|
-
|
|
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 })
|
|
2458
|
-
|
|
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
|
-
|
|
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
|
|
2473
|
+
async function fr(e) {
|
|
2466
2474
|
return ir(w.join(e, ne));
|
|
2467
2475
|
}
|
|
2468
|
-
async function
|
|
2476
|
+
async function pr(e) {
|
|
2469
2477
|
return Y(w.join(e, ne));
|
|
2470
2478
|
}
|
|
2471
|
-
async function
|
|
2479
|
+
async function mr(e, t) {
|
|
2472
2480
|
await ar(w.join(e, ne), t);
|
|
2473
2481
|
}
|
|
2474
|
-
async function
|
|
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
|
|
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
|
|
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:
|
|
2530
|
+
paths: gr(t),
|
|
2523
2531
|
installedPacks: [],
|
|
2524
2532
|
licenseKey: null
|
|
2525
2533
|
};
|
|
2526
2534
|
}
|
|
2527
|
-
async function
|
|
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
|
|
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
|
|
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
|
|
2585
|
+
function xr(e, t, n) {
|
|
2578
2586
|
let r = X(e, t);
|
|
2579
2587
|
return w.resolve(n, r);
|
|
2580
2588
|
}
|
|
2581
|
-
function
|
|
2589
|
+
function Sr(e, t) {
|
|
2582
2590
|
return w.join(t, e);
|
|
2583
2591
|
}
|
|
2584
|
-
var
|
|
2592
|
+
var Cr = q.createRequest()({
|
|
2585
2593
|
endpoint: "/packs/list",
|
|
2586
2594
|
method: "GET"
|
|
2587
2595
|
});
|
|
2588
|
-
async function
|
|
2589
|
-
let { data: e, error: t } = await
|
|
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
|
|
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
|
|
2610
|
-
function
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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 =
|
|
2756
|
-
await Y(w.resolve(n, r, "src/libs/websocket/ws-authenticate.ts")) && (a =
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
2834
|
-
let { entries: t, paths: n, projectRoot: r, slot: i = "frontend" } = e, a =
|
|
2835
|
-
await Y(o) ? s = await v.readFile(o, "utf-8") : (await v.mkdir(w.dirname(o), { recursive: !0 }), s =
|
|
2836
|
-
for (let e of t) s.includes(`label: "${e.label}"`) || (s =
|
|
2837
|
-
for (let e of t.toReversed()) s.includes(`label: "${e.label}"`) || (s =
|
|
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
|
|
2841
|
-
let { postLoginRedirect: t, paths: n, projectRoot: r, slot: i = "frontend" } = e, a =
|
|
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
|
|
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
|
|
2854
|
-
let n =
|
|
2855
|
-
for (let e of n) r =
|
|
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
|
|
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
|
|
2867
|
-
let n =
|
|
2874
|
+
function oi(e, t) {
|
|
2875
|
+
let n = ei[t.group];
|
|
2868
2876
|
if (!n) return e;
|
|
2869
|
-
let r =
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
2924
|
-
async function
|
|
2925
|
-
await
|
|
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
|
|
2931
|
-
await
|
|
2938
|
+
async function hi(e) {
|
|
2939
|
+
await gi({
|
|
2932
2940
|
...e,
|
|
2933
2941
|
arrayName: "userMenuActions"
|
|
2934
2942
|
});
|
|
2935
2943
|
}
|
|
2936
|
-
async function
|
|
2937
|
-
let a =
|
|
2938
|
-
await Y(o) ? s = await v.readFile(o, "utf-8") : (await v.mkdir(w.dirname(o), { recursive: !0 }), s =
|
|
2939
|
-
for (let n of e) s =
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
2974
|
+
var bi = new Set([
|
|
2967
2975
|
".ts",
|
|
2968
2976
|
".tsx",
|
|
2969
2977
|
".js",
|
|
2970
2978
|
".jsx"
|
|
2971
2979
|
]);
|
|
2972
|
-
async function
|
|
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 =
|
|
2978
|
-
i?.isDirectory() ? await
|
|
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
|
|
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 (
|
|
2999
|
-
await
|
|
3000
|
-
} else n.isFile() &&
|
|
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
|
|
3011
|
+
async function Ti(e, t) {
|
|
3004
3012
|
let n = await v.readFile(e, "utf-8");
|
|
3005
|
-
if (!n.includes(
|
|
3006
|
-
let r = n.replaceAll(
|
|
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
|
|
3019
|
+
function Ei(e, t) {
|
|
3012
3020
|
return e.slot ? t ? t.includes(e.slot) : e.slot === "frontend" : !0;
|
|
3013
3021
|
}
|
|
3014
|
-
async function
|
|
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
|
|
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
|
|
3022
|
-
let { file: t, packDir: n, paths: r, projectRoot: i } = e, a =
|
|
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
|
|
3031
|
-
let { file: t, packDir: n, paths: r, projectRoot: i } = e, { sourcePath: a, targetPath: o, sourceExists: s, targetExists: c } = await
|
|
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
|
|
3047
|
-
let { file: t, packDir: n, paths: r, projectRoot: i, force: a, overwrite: o } = e, { sourcePath: s, targetPath: c, sourceExists: l, targetExists: u } = await
|
|
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
|
|
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
|
|
3082
|
+
} : (await Di(s, c), {
|
|
3075
3083
|
status: "installed",
|
|
3076
3084
|
path: t.target
|
|
3077
3085
|
});
|
|
3078
|
-
case "override": return await
|
|
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
|
|
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
|
|
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" || !
|
|
3121
|
-
let { targetPath: i, targetExists: c } = await
|
|
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
|
|
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 (!
|
|
3142
|
-
let t = await
|
|
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
|
|
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) =>
|
|
3168
|
+
}, u = t.files.filter((e) => Ei(e, s));
|
|
3161
3169
|
for (let e of u) {
|
|
3162
|
-
let t = await
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
3268
|
+
return await mr(n, r), r;
|
|
3261
3269
|
}
|
|
3262
|
-
async function
|
|
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
|
|
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
|
|
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
|
|
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
|
|
3308
|
+
var Li = [
|
|
3301
3309
|
"starter",
|
|
3302
3310
|
"layout",
|
|
3303
3311
|
"feature"
|
|
3304
|
-
],
|
|
3312
|
+
], Ri = {
|
|
3305
3313
|
starter: "Starter",
|
|
3306
3314
|
layout: "Layout",
|
|
3307
3315
|
feature: "Features"
|
|
3308
|
-
},
|
|
3309
|
-
function
|
|
3316
|
+
}, zi = new Set(["starter", "layout"]), Bi = "layout-basic";
|
|
3317
|
+
function Vi(e, t = {}) {
|
|
3310
3318
|
let n = [];
|
|
3311
|
-
for (let r of
|
|
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 =
|
|
3322
|
+
let a = zi.has(r) ? "single" : "multiple";
|
|
3315
3323
|
if (r === "layout") {
|
|
3316
|
-
n.push(
|
|
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:
|
|
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
|
|
3330
|
-
let n = t.some((e) => e.name ===
|
|
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 ?
|
|
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
|
|
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
|
|
3358
|
+
async function Wi() {
|
|
3351
3359
|
return (await J("docker", ["info"], { cwd: process.cwd() })).exitCode === 0;
|
|
3352
3360
|
}
|
|
3353
|
-
async function
|
|
3361
|
+
async function Gi(e) {
|
|
3354
3362
|
return Y(`${e}/apps/backend/.env`);
|
|
3355
3363
|
}
|
|
3356
|
-
async function
|
|
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
|
-
|
|
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` })
|
|
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
|
|
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
|
|
3385
|
-
if (!await
|
|
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
|
|
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
|
|
3392
|
-
r.
|
|
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
|
-
|
|
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 })
|
|
3410
|
-
|
|
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
|
|
3415
|
-
|
|
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 })
|
|
3420
|
-
|
|
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
|
-
|
|
3441
|
+
c.stop(L.success("Prisma client generated"));
|
|
3424
3442
|
}
|
|
3425
3443
|
//#endregion
|
|
3426
3444
|
//#region src/core/resolve.ts
|
|
3427
|
-
function
|
|
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
|
|
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
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
3503
|
+
function ta(e, t, n) {
|
|
3486
3504
|
return [...e.map((e) => n.chosen.get(e.family) ?? e.default), ...t];
|
|
3487
3505
|
}
|
|
3488
|
-
function
|
|
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
|
|
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
|
|
3526
|
+
function ia(e, t) {
|
|
3509
3527
|
return e.map((e) => ({
|
|
3510
3528
|
...e,
|
|
3511
|
-
dependencies: e.dependencies.map((e) =>
|
|
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
|
|
3534
|
+
var aa = [
|
|
3517
3535
|
" ██╗ ██╗ ██╗ ██╗ ██████╗ ███████╗",
|
|
3518
3536
|
" ██║ ██║ ╚██╗ ██╔╝ ██╔══██╗ ██╔════╝",
|
|
3519
3537
|
" ███████║ ╚████╔╝ ██████╔╝ █████╗ ",
|
|
3520
3538
|
" ██╔══██║ ╚██╔╝ ██╔═══╝ ██╔══╝ ",
|
|
3521
3539
|
" ██║ ██║ ██║ ██║ ███████╗",
|
|
3522
3540
|
" ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝"
|
|
3523
|
-
],
|
|
3541
|
+
], oa = [
|
|
3524
3542
|
" ███████╗ ████████╗ █████╗ ██████╗ ██╗ ██╗",
|
|
3525
3543
|
" ██╔════╝ ╚══██╔══╝ ██╔══██╗ ██╔════╝ ██║ ██╔╝",
|
|
3526
3544
|
" ███████╗ ██║ ███████║ ██║ █████╔╝ ",
|
|
3527
3545
|
" ╚════██║ ██║ ██╔══██║ ██║ ██╔═██╗ ",
|
|
3528
3546
|
" ███████║ ██║ ██║ ██║ ╚██████╗ ██║ ██╗",
|
|
3529
3547
|
" ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝"
|
|
3530
|
-
],
|
|
3548
|
+
], sa = [
|
|
3531
3549
|
253,
|
|
3532
3550
|
176,
|
|
3533
3551
|
21
|
|
3534
|
-
],
|
|
3552
|
+
], ca = [
|
|
3535
3553
|
245,
|
|
3536
3554
|
76,
|
|
3537
3555
|
2
|
|
3538
|
-
],
|
|
3556
|
+
], la = 5, ua = [
|
|
3539
3557
|
17,
|
|
3540
3558
|
103,
|
|
3541
3559
|
248
|
|
3542
|
-
],
|
|
3560
|
+
], da = [
|
|
3543
3561
|
42,
|
|
3544
3562
|
160,
|
|
3545
3563
|
250
|
|
3546
|
-
],
|
|
3547
|
-
function
|
|
3564
|
+
], fa = .2;
|
|
3565
|
+
function pa() {
|
|
3548
3566
|
console.log();
|
|
3549
|
-
for (let e of xe(
|
|
3550
|
-
start:
|
|
3551
|
-
end:
|
|
3552
|
-
angle:
|
|
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(
|
|
3555
|
-
start:
|
|
3556
|
-
end:
|
|
3557
|
-
angle:
|
|
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
|
|
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
|
|
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
|
|
3671
|
-
return new
|
|
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
|
|
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
|
|
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]*--${
|
|
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
|
|
3716
|
+
function ya(e) {
|
|
3699
3717
|
return e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
3700
3718
|
}
|
|
3701
|
-
function
|
|
3702
|
-
let n =
|
|
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 +
|
|
3723
|
+
i = e + va(r, t.light) + a;
|
|
3706
3724
|
}
|
|
3707
3725
|
if (r) {
|
|
3708
|
-
let e =
|
|
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 +
|
|
3729
|
+
i = n + va(r, t.dark) + a;
|
|
3712
3730
|
}
|
|
3713
3731
|
}
|
|
3714
3732
|
return i;
|
|
3715
3733
|
}
|
|
3716
|
-
var
|
|
3717
|
-
async function
|
|
3718
|
-
let n = w.resolve(e,
|
|
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 =
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
3810
|
+
var Oa = {
|
|
3793
3811
|
claude: {
|
|
3794
3812
|
rulesDir: ".claude/rules",
|
|
3795
3813
|
extension: ".md",
|
|
3796
|
-
convert:
|
|
3814
|
+
convert: Ta
|
|
3797
3815
|
},
|
|
3798
3816
|
windsurf: {
|
|
3799
3817
|
rulesDir: ".windsurf/rules",
|
|
3800
3818
|
extension: ".md",
|
|
3801
|
-
convert:
|
|
3819
|
+
convert: Ea
|
|
3802
3820
|
},
|
|
3803
3821
|
copilot: {
|
|
3804
3822
|
rulesDir: ".github/instructions",
|
|
3805
3823
|
extension: ".instructions.md",
|
|
3806
|
-
convert:
|
|
3824
|
+
convert: Da
|
|
3807
3825
|
}
|
|
3808
3826
|
};
|
|
3809
|
-
async function
|
|
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 } =
|
|
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
|
|
3838
|
+
async function Aa(e, t) {
|
|
3821
3839
|
if (t === "cursor") return;
|
|
3822
|
-
let n =
|
|
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
|
|
3848
|
+
var ja = [
|
|
3831
3849
|
"apps",
|
|
3832
3850
|
"packages",
|
|
3833
3851
|
"libs",
|
|
3834
3852
|
"shared"
|
|
3835
3853
|
];
|
|
3836
|
-
async function
|
|
3837
|
-
let t = await
|
|
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
|
|
3844
|
-
let t = [w.join(e, ".env.example")], n = await Promise.all(
|
|
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/",
|
|
3853
|
-
async function
|
|
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
|
|
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
|
|
3868
|
-
let n = `@${t}/`, r = await
|
|
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),
|
|
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
|
|
3898
|
+
await Ci(e, t), await Ba(e, t), await Wa(e, t);
|
|
3881
3899
|
}
|
|
3882
|
-
var
|
|
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
|
-
]),
|
|
3891
|
-
async function
|
|
3892
|
-
if (t ===
|
|
3893
|
-
let n = await
|
|
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
|
|
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() ?
|
|
3923
|
+
return t.isDirectory() ? Ra.has(t.name) ? [] : Va(n) : t.isFile() && za.test(t.name) ? [n] : [];
|
|
3906
3924
|
}))).flat();
|
|
3907
3925
|
}
|
|
3908
|
-
function
|
|
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
|
|
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
|
|
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: "${
|
|
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
|
|
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
|
|
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
|
-
},
|
|
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
|
-
},
|
|
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
|
|
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
|
|
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
|
|
3985
|
-
let { projectName: t, editor: n, workspace: r } = e, i =
|
|
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
|
|
4111
|
+
async function Qa(e, t) {
|
|
4094
4112
|
let n = w.join(e, "README.md");
|
|
4095
|
-
await v.writeFile(n,
|
|
4113
|
+
await v.writeFile(n, Za(t), "utf-8");
|
|
4096
4114
|
}
|
|
4097
4115
|
//#endregion
|
|
4098
4116
|
//#region src/core/tracking.ts
|
|
4099
|
-
async function
|
|
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
|
|
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
|
|
4150
|
+
function to(e) {
|
|
4133
4151
|
return Math.min(255, Math.max(0, Math.round(e)));
|
|
4134
4152
|
}
|
|
4135
|
-
function
|
|
4153
|
+
function no(e) {
|
|
4136
4154
|
return e <= .0031308 ? 12.92 * e : 1.055 * e ** (1 / 2.4) - .055;
|
|
4137
4155
|
}
|
|
4138
|
-
function
|
|
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
|
-
|
|
4142
|
-
|
|
4143
|
-
|
|
4159
|
+
to(no(f) * 255),
|
|
4160
|
+
to(no(p) * 255),
|
|
4161
|
+
to(no(m) * 255)
|
|
4144
4162
|
];
|
|
4145
4163
|
}
|
|
4146
|
-
var
|
|
4147
|
-
function
|
|
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 =
|
|
4168
|
+
let r = eo(n);
|
|
4151
4169
|
if (!r) return y.dim(" ");
|
|
4152
|
-
let [i, a, o] =
|
|
4153
|
-
return `\x1b[48;2;${i};${a};${o}m ${
|
|
4170
|
+
let [i, a, o] = ro(r);
|
|
4171
|
+
return `\x1b[48;2;${i};${a};${o}m ${io}`;
|
|
4154
4172
|
}
|
|
4155
|
-
var
|
|
4173
|
+
var oo = [
|
|
4156
4174
|
"primary",
|
|
4157
4175
|
"secondary",
|
|
4158
4176
|
"accent"
|
|
4159
4177
|
];
|
|
4160
|
-
function
|
|
4161
|
-
return
|
|
4178
|
+
function so(e) {
|
|
4179
|
+
return oo.map((t) => ao(e, t)).join("");
|
|
4162
4180
|
}
|
|
4163
|
-
function
|
|
4164
|
-
return `${
|
|
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
|
|
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
|
|
4176
|
-
a.skipBanner ||
|
|
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 =
|
|
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) =>
|
|
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: `${
|
|
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
|
|
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
|
|
4252
|
-
let _ = await
|
|
4253
|
-
await
|
|
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
|
|
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
|
|
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
|
|
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`),
|
|
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
|
|
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
|
-
])),
|
|
4301
|
+
])), Ui([`${L.command("pnpm dev")} ${L.muted("(start frontend + backend)")}`]);
|
|
4284
4302
|
}
|
|
4285
|
-
return await
|
|
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
|
|
4307
|
+
async function fo(e) {
|
|
4290
4308
|
let t = e.cwd ?? process.cwd(), n = e.silent ?? !1;
|
|
4291
|
-
if (n || (
|
|
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
|
|
4296
|
-
let e = await
|
|
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
|
|
4327
|
+
let r = await hr(t);
|
|
4310
4328
|
if (!n) {
|
|
4311
4329
|
let e = Object.entries(r.apps), t = Object.entries(r.packages);
|
|
4312
4330
|
if (e.length > 0) {
|
|
@@ -4328,22 +4346,22 @@ async function lo(e) {
|
|
|
4328
4346
|
});
|
|
4329
4347
|
o.isCancel(e) && Z(), a = e;
|
|
4330
4348
|
}
|
|
4331
|
-
await
|
|
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
|
|
4334
|
-
if (await
|
|
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) =>
|
|
4356
|
+
let n = t.runInit ?? ((e) => fo({
|
|
4339
4357
|
cwd: e,
|
|
4340
4358
|
silent: !0
|
|
4341
|
-
})), r = t.runCreate ?? ((e) =>
|
|
4359
|
+
})), r = t.runCreate ?? ((e) => uo({
|
|
4342
4360
|
parentDirectory: e,
|
|
4343
4361
|
deferSetup: !0,
|
|
4344
4362
|
skipBanner: !0
|
|
4345
4363
|
}));
|
|
4346
|
-
if (await
|
|
4364
|
+
if (await vr(e)) {
|
|
4347
4365
|
o.log.warn(`No ${L.path("stack.json")} found in ${L.path(e)}.`);
|
|
4348
4366
|
let t = await o.confirm({
|
|
4349
4367
|
message: `Create ${L.path("stack.json")} now?`,
|
|
@@ -4351,7 +4369,7 @@ async function uo(e, t = {}) {
|
|
|
4351
4369
|
});
|
|
4352
4370
|
if (o.isCancel(t) || !t) return null;
|
|
4353
4371
|
await n(e);
|
|
4354
|
-
let r = await
|
|
4372
|
+
let r = await pr(e);
|
|
4355
4373
|
return r && o.log.success(`${L.path("stack.json")} created`), r ? {
|
|
4356
4374
|
projectRoot: e,
|
|
4357
4375
|
scaffolded: !1
|
|
@@ -4369,14 +4387,14 @@ async function uo(e, t = {}) {
|
|
|
4369
4387
|
});
|
|
4370
4388
|
if (o.isCancel(a) || !a) return null;
|
|
4371
4389
|
let s = await r(e);
|
|
4372
|
-
return await
|
|
4390
|
+
return await pr(s) ? {
|
|
4373
4391
|
projectRoot: s,
|
|
4374
4392
|
scaffolded: !0
|
|
4375
4393
|
} : null;
|
|
4376
4394
|
}
|
|
4377
4395
|
//#endregion
|
|
4378
4396
|
//#region src/core/npm-deps.ts
|
|
4379
|
-
function
|
|
4397
|
+
function mo(e, t) {
|
|
4380
4398
|
let n = [], r = [];
|
|
4381
4399
|
if (!e) return {
|
|
4382
4400
|
errors: n,
|
|
@@ -4407,7 +4425,7 @@ function fo(e, t) {
|
|
|
4407
4425
|
operations: r
|
|
4408
4426
|
};
|
|
4409
4427
|
}
|
|
4410
|
-
function
|
|
4428
|
+
function ho(e) {
|
|
4411
4429
|
let t = {};
|
|
4412
4430
|
for (let n of e) if (n) for (let [e, r] of Object.entries(n)) t[e] = {
|
|
4413
4431
|
...t[e],
|
|
@@ -4415,7 +4433,7 @@ function po(e) {
|
|
|
4415
4433
|
};
|
|
4416
4434
|
return t;
|
|
4417
4435
|
}
|
|
4418
|
-
async function
|
|
4436
|
+
async function go(e, t, n = J) {
|
|
4419
4437
|
let r = [];
|
|
4420
4438
|
for (let i of e) {
|
|
4421
4439
|
let e = w.join(t, i.relativeDir);
|
|
@@ -4451,14 +4469,14 @@ async function mo(e, t, n = J) {
|
|
|
4451
4469
|
function $(e) {
|
|
4452
4470
|
return e instanceof Error ? e.message : String(e);
|
|
4453
4471
|
}
|
|
4454
|
-
async function
|
|
4472
|
+
async function _o(e, t, n) {
|
|
4455
4473
|
let r = e.filter((e) => e.tier === "paid" && !t.has(e.name)).map((e) => e.name);
|
|
4456
|
-
return r.length === 0 ? {} :
|
|
4474
|
+
return r.length === 0 ? {} : Tr(r, n).catch(() => ({}));
|
|
4457
4475
|
}
|
|
4458
|
-
function
|
|
4476
|
+
function vo(e, t) {
|
|
4459
4477
|
return e === "free" ? L.success("free") : e === "owned" ? L.accent("owned") : `${L.highlight(`$${t}`)} ${L.muted("locked")}`;
|
|
4460
4478
|
}
|
|
4461
|
-
async function
|
|
4479
|
+
async function yo(e, t, n) {
|
|
4462
4480
|
let r = e.filter((e) => t(e)), i = e.filter((e) => !t(e));
|
|
4463
4481
|
i.length > 0 && o.log.warning(`Skipping ${i.join(", ")} because ${i.length === 1 ? "it depends" : "they depend"} on a pack you don't own yet.`), await tr(r.map((e) => n.get(e)).filter((e) => e !== void 0).map((e) => ({
|
|
4464
4482
|
name: e.name,
|
|
@@ -4466,7 +4484,7 @@ async function _o(e, t, n) {
|
|
|
4466
4484
|
price: e.price
|
|
4467
4485
|
})));
|
|
4468
4486
|
}
|
|
4469
|
-
function
|
|
4487
|
+
function bo(e, t) {
|
|
4470
4488
|
let n = e.map((e, n) => {
|
|
4471
4489
|
let r = t.get(e), i = r ? r.displayName : e;
|
|
4472
4490
|
return ` ${L.muted(`${n + 1}.`)} ${L.brand(i)}`;
|
|
@@ -4477,10 +4495,10 @@ function vo(e, t) {
|
|
|
4477
4495
|
...n
|
|
4478
4496
|
].join("\n"), "Install Plan");
|
|
4479
4497
|
}
|
|
4480
|
-
async function
|
|
4498
|
+
async function xo(e, t) {
|
|
4481
4499
|
let n = [];
|
|
4482
4500
|
for (let r of e) {
|
|
4483
|
-
let e = await
|
|
4501
|
+
let e = await yr(r), i = await br(r, t);
|
|
4484
4502
|
if (i.status === "denied") throw Error(`Access to "${r}" was denied (${i.reason}). Try 'npx @hype-stack/cli login' or check your license.`);
|
|
4485
4503
|
n.push({
|
|
4486
4504
|
manifest: e,
|
|
@@ -4489,32 +4507,47 @@ async function yo(e, t) {
|
|
|
4489
4507
|
}
|
|
4490
4508
|
return n;
|
|
4491
4509
|
}
|
|
4492
|
-
async function
|
|
4493
|
-
let { prepared: t, paths: n, cwd: r, spinner: i } = e, a =
|
|
4510
|
+
async function So(e) {
|
|
4511
|
+
let { prepared: t, paths: n, cwd: r, spinner: i } = e, a = mo(ho(t.map((e) => e.manifest.dependencies_npm)), n);
|
|
4494
4512
|
if (a.errors.length > 0) {
|
|
4495
4513
|
for (let e of a.errors) o.log.error(e);
|
|
4496
4514
|
return;
|
|
4497
4515
|
}
|
|
4498
4516
|
if (a.operations.length === 0) return;
|
|
4499
4517
|
i.start("Installing npm dependencies...");
|
|
4500
|
-
let s = await
|
|
4518
|
+
let s = await go(a.operations, r);
|
|
4501
4519
|
if (i.stop(s.ok ? "npm dependencies installed" : "npm dependency installation failed"), !s.ok) for (let e of s.errors) o.log.error(e);
|
|
4502
4520
|
}
|
|
4503
|
-
function
|
|
4521
|
+
function Co(e) {
|
|
4504
4522
|
let t = e.flatMap((e) => e.manifest.postInstall ?? []), n = [...new Set(t)];
|
|
4505
4523
|
n.length !== 0 && o.note(n.map((e) => ` ${L.muted("→")} ${e}`).join("\n"), "Next Steps");
|
|
4506
4524
|
}
|
|
4507
|
-
|
|
4525
|
+
function wo(e) {
|
|
4526
|
+
if (e.length === 0) return;
|
|
4527
|
+
let t = e.map((e) => {
|
|
4528
|
+
let t = e.replace(/^\{\{[^}]+\}\}\//, "");
|
|
4529
|
+
return ` ${L.muted("•")} ${L.path(t)}`;
|
|
4530
|
+
});
|
|
4531
|
+
o.note(t.join("\n"), "Skipped (already exist)");
|
|
4532
|
+
}
|
|
4533
|
+
async function To(e) {
|
|
4508
4534
|
let { prepared: t, config: n, cwd: r, force: i, yes: a, slotsByPack: s } = e, c = /* @__PURE__ */ new Set();
|
|
4509
4535
|
if (i) return c;
|
|
4510
|
-
let l = await
|
|
4536
|
+
let l = await ji({
|
|
4511
4537
|
packs: t,
|
|
4512
4538
|
config: n,
|
|
4513
4539
|
projectRoot: r,
|
|
4514
4540
|
slotsByPack: s
|
|
4515
4541
|
});
|
|
4516
4542
|
if (l.length === 0) return c;
|
|
4517
|
-
if (a)
|
|
4543
|
+
if (a) {
|
|
4544
|
+
o.log.warning(`${l.length} existing file${l.length === 1 ? "" : "s"} kept. Pass ${L.command("--force")} to overwrite.`);
|
|
4545
|
+
let e = l.map((e) => {
|
|
4546
|
+
let t = w.relative(r, e.targetPath) || e.target;
|
|
4547
|
+
return ` ${L.muted("•")} ${L.path(t)} ${L.muted(`(${e.packName})`)}`;
|
|
4548
|
+
});
|
|
4549
|
+
return o.note(e.join("\n"), "Kept existing files"), c;
|
|
4550
|
+
}
|
|
4518
4551
|
o.log.warning(`${l.length} file${l.length === 1 ? "" : "s"} already exist in your project.`);
|
|
4519
4552
|
for (let e of l) {
|
|
4520
4553
|
let t = w.relative(r, e.targetPath) || e.target, n = await o.confirm({
|
|
@@ -4527,12 +4560,12 @@ async function So(e) {
|
|
|
4527
4560
|
}
|
|
4528
4561
|
//#endregion
|
|
4529
4562
|
//#region src/commands/compose.ts
|
|
4530
|
-
async function
|
|
4563
|
+
async function Eo(e = {}) {
|
|
4531
4564
|
let t = e.cwd ?? process.cwd();
|
|
4532
|
-
|
|
4533
|
-
let n = await
|
|
4565
|
+
pa();
|
|
4566
|
+
let n = await po(t), r = n?.projectRoot ?? null, i = n?.scaffolded ?? !1, a;
|
|
4534
4567
|
try {
|
|
4535
|
-
a = await
|
|
4568
|
+
a = await fr(r ?? t);
|
|
4536
4569
|
} catch (e) {
|
|
4537
4570
|
o.cancel(`Could not parse ${L.path("stack.json")}: ${$(e)} Run 'npx @hype-stack/cli init' to regenerate it.`), process.exit(1);
|
|
4538
4571
|
}
|
|
@@ -4543,18 +4576,18 @@ async function Co(e = {}) {
|
|
|
4543
4576
|
c.start("Loading packs...");
|
|
4544
4577
|
let l;
|
|
4545
4578
|
try {
|
|
4546
|
-
l = await
|
|
4579
|
+
l = await wr();
|
|
4547
4580
|
} catch (e) {
|
|
4548
4581
|
c.stop("Failed to load packs"), o.cancel(`Could not reach Hype Stack. Check your connection and try again.\n${$(e)}`), process.exit(1);
|
|
4549
4582
|
}
|
|
4550
4583
|
c.stop("Packs loaded");
|
|
4551
|
-
let u = a.installedPacks ?? [], d = new Set(u), f = new Map(l.map((e) => [e.name, e])), p = e.licenseKey ?? a.licenseKey ?? null, m = (await Wn(N()))?.token ?? null, h = await
|
|
4584
|
+
let u = a.installedPacks ?? [], d = new Set(u), f = new Map(l.map((e) => [e.name, e])), p = e.licenseKey ?? a.licenseKey ?? null, m = (await Wn(N()))?.token ?? null, h = await _o(l, d, {
|
|
4552
4585
|
token: m,
|
|
4553
4586
|
key: p
|
|
4554
4587
|
}), g = (e) => {
|
|
4555
4588
|
let t = f.get(e);
|
|
4556
4589
|
return !t || t.tier === "free" ? "free" : h[e]?.owned ? "owned" : "locked";
|
|
4557
|
-
}, _ = (e) => !d.has(e) && g(e) === "locked", y = await
|
|
4590
|
+
}, _ = (e) => !d.has(e) && g(e) === "locked", y = await Do({
|
|
4558
4591
|
packs: l,
|
|
4559
4592
|
installedSet: d,
|
|
4560
4593
|
stateOf: g,
|
|
@@ -4565,9 +4598,9 @@ async function Co(e = {}) {
|
|
|
4565
4598
|
o.outro(L.muted("No packs selected. Nothing to do."));
|
|
4566
4599
|
return;
|
|
4567
4600
|
}
|
|
4568
|
-
let b =
|
|
4601
|
+
let b = Ao(y), x = jo(y), S = ra(l, b), C = Xi(ia(l, S)), w;
|
|
4569
4602
|
try {
|
|
4570
|
-
w =
|
|
4603
|
+
w = Qi(b, C, u);
|
|
4571
4604
|
} catch (e) {
|
|
4572
4605
|
o.cancel($(e)), process.exit(1);
|
|
4573
4606
|
}
|
|
@@ -4575,7 +4608,7 @@ async function Co(e = {}) {
|
|
|
4575
4608
|
o.note(`${w.alreadyInstalled.join(", ")} already installed.`, "Nothing to do"), o.outro(L.muted("Your selection is already part of the project."));
|
|
4576
4609
|
return;
|
|
4577
4610
|
}
|
|
4578
|
-
let T =
|
|
4611
|
+
let T = $i({
|
|
4579
4612
|
order: w.order,
|
|
4580
4613
|
graph: C,
|
|
4581
4614
|
isLocked: _,
|
|
@@ -4583,28 +4616,28 @@ async function Co(e = {}) {
|
|
|
4583
4616
|
});
|
|
4584
4617
|
if (T.blocked.length > 0 && !m && !p) {
|
|
4585
4618
|
let e = await er();
|
|
4586
|
-
e && (m = e, h = await
|
|
4619
|
+
e && (m = e, h = await _o(l, d, {
|
|
4587
4620
|
token: m,
|
|
4588
4621
|
key: p
|
|
4589
|
-
}), T =
|
|
4622
|
+
}), T = $i({
|
|
4590
4623
|
order: w.order,
|
|
4591
4624
|
graph: C,
|
|
4592
4625
|
isLocked: _,
|
|
4593
4626
|
installed: u
|
|
4594
4627
|
}));
|
|
4595
4628
|
}
|
|
4596
|
-
if (T.blocked.length > 0 && await
|
|
4629
|
+
if (T.blocked.length > 0 && await yo(T.blocked, _, f), T.installable.length === 0) {
|
|
4597
4630
|
o.outro(L.muted("Nothing left to install once locked packs are removed."));
|
|
4598
4631
|
return;
|
|
4599
4632
|
}
|
|
4600
|
-
if (
|
|
4633
|
+
if (bo(T.installable, f), !e.yes) {
|
|
4601
4634
|
let e = await o.confirm({ message: `Install ${T.installable.length} pack${T.installable.length === 1 ? "" : "s"}?` });
|
|
4602
4635
|
(o.isCancel(e) || !e) && (o.cancel("Installation cancelled."), process.exit(0));
|
|
4603
4636
|
}
|
|
4604
4637
|
c.start("Downloading packs...");
|
|
4605
4638
|
let E;
|
|
4606
4639
|
try {
|
|
4607
|
-
E = await
|
|
4640
|
+
E = await xo(T.installable, {
|
|
4608
4641
|
token: m,
|
|
4609
4642
|
key: p
|
|
4610
4643
|
});
|
|
@@ -4612,7 +4645,7 @@ async function Co(e = {}) {
|
|
|
4612
4645
|
c.stop("Download failed"), o.cancel($(e)), process.exit(1);
|
|
4613
4646
|
}
|
|
4614
4647
|
c.stop(`Downloaded ${E.length} pack${E.length === 1 ? "" : "s"}`);
|
|
4615
|
-
let D = await
|
|
4648
|
+
let D = await To({
|
|
4616
4649
|
prepared: E,
|
|
4617
4650
|
config: a,
|
|
4618
4651
|
cwd: s,
|
|
@@ -4622,7 +4655,7 @@ async function Co(e = {}) {
|
|
|
4622
4655
|
});
|
|
4623
4656
|
try {
|
|
4624
4657
|
c.start("Installing pack files...");
|
|
4625
|
-
let t = await
|
|
4658
|
+
let t = await Pi({
|
|
4626
4659
|
packs: E,
|
|
4627
4660
|
config: a,
|
|
4628
4661
|
projectRoot: s,
|
|
@@ -4635,18 +4668,18 @@ async function Co(e = {}) {
|
|
|
4635
4668
|
for (let e of t.errors) o.log.error(e);
|
|
4636
4669
|
o.cancel("No files were written. Fix the errors above (or pass --force for existing files) and try again."), process.exit(1);
|
|
4637
4670
|
}
|
|
4638
|
-
c.stop("Files installed"), t.installed.length > 0 && o.log.success(`${L.highlight(String(t.installed.length))} files installed`), t.skipped.length > 0 && o.log.warning(`${t.skipped.length} files skipped (use --force to overwrite)`);
|
|
4671
|
+
c.stop("Files installed"), t.installed.length > 0 && o.log.success(`${L.highlight(String(t.installed.length))} files installed`), t.skipped.length > 0 && (o.log.warning(`${t.skipped.length} files skipped (use --force to overwrite)`), wo(t.skipped));
|
|
4639
4672
|
for (let e of t.errors) o.log.error(e);
|
|
4640
|
-
await
|
|
4673
|
+
await So({
|
|
4641
4674
|
prepared: E,
|
|
4642
4675
|
paths: a.paths,
|
|
4643
4676
|
cwd: s,
|
|
4644
4677
|
spinner: c
|
|
4645
|
-
}), i && await
|
|
4678
|
+
}), i && await Yi(s, e.yes ?? !1), await ur({
|
|
4646
4679
|
projectRoot: s,
|
|
4647
4680
|
paths: a.paths,
|
|
4648
4681
|
skipPrompts: e.yes ?? !1
|
|
4649
|
-
}),
|
|
4682
|
+
}), Co(E), o.outro(L.brand(`Installed ${t.appliedPacks.join(", ")}.`));
|
|
4650
4683
|
} finally {
|
|
4651
4684
|
await Promise.all(E.map((e) => v.rm(e.packDir, {
|
|
4652
4685
|
recursive: !0,
|
|
@@ -4654,10 +4687,10 @@ async function Co(e = {}) {
|
|
|
4654
4687
|
})));
|
|
4655
4688
|
}
|
|
4656
4689
|
}
|
|
4657
|
-
async function
|
|
4690
|
+
async function Do(e) {
|
|
4658
4691
|
let { packs: t, installedSet: n, stateOf: r, options: i, adminAvailable: a } = e;
|
|
4659
4692
|
if (i.packs && i.packs.length > 0) {
|
|
4660
|
-
let e = i.packs.map(
|
|
4693
|
+
let e = i.packs.map(ko), n = e.filter((e) => !t.some((t) => t.name === e.name));
|
|
4661
4694
|
return n.length > 0 && (o.cancel(`Unknown pack${n.length === 1 ? "" : "s"}: ${n.map((e) => e.name).join(", ")}`), process.exit(1)), e;
|
|
4662
4695
|
}
|
|
4663
4696
|
let s = t.filter((e) => n.has(e.name));
|
|
@@ -4666,13 +4699,13 @@ async function wo(e) {
|
|
|
4666
4699
|
if (c.length === 0) return o.outro(L.muted("Every available pack is already installed.")), [];
|
|
4667
4700
|
let l = P();
|
|
4668
4701
|
o.note(c.map((e) => ` ${R.arrow} ${L.highlight(e.displayName)} ${_e(`${l}/packs/${e.name}`)}`).join("\n"), "Browse packs");
|
|
4669
|
-
let u =
|
|
4702
|
+
let u = Vi(c, { adminAvailable: a }), d = [];
|
|
4670
4703
|
for (let e of u) {
|
|
4671
4704
|
let t = e.packs.map((e) => {
|
|
4672
4705
|
let t = r(e.name);
|
|
4673
4706
|
return {
|
|
4674
4707
|
value: e.name,
|
|
4675
|
-
label: `${e.displayName} ${
|
|
4708
|
+
label: `${e.displayName} ${vo(t, e.price)}`,
|
|
4676
4709
|
hint: e.description
|
|
4677
4710
|
};
|
|
4678
4711
|
});
|
|
@@ -4689,7 +4722,7 @@ async function wo(e) {
|
|
|
4689
4722
|
});
|
|
4690
4723
|
continue;
|
|
4691
4724
|
}
|
|
4692
|
-
let n = await
|
|
4725
|
+
let n = await ga({
|
|
4693
4726
|
message: `Select ${e.label.toLowerCase()} to add (optional)`,
|
|
4694
4727
|
options: t,
|
|
4695
4728
|
required: !1
|
|
@@ -4699,20 +4732,20 @@ async function wo(e) {
|
|
|
4699
4732
|
}
|
|
4700
4733
|
return d;
|
|
4701
4734
|
}
|
|
4702
|
-
var
|
|
4703
|
-
function
|
|
4704
|
-
let t = e.match(
|
|
4735
|
+
var Oo = /@(frontend|admin)$/;
|
|
4736
|
+
function ko(e) {
|
|
4737
|
+
let t = e.match(Oo);
|
|
4705
4738
|
return t ? {
|
|
4706
4739
|
name: e.slice(0, -t[0].length),
|
|
4707
4740
|
slot: t[1]
|
|
4708
4741
|
} : { name: e };
|
|
4709
4742
|
}
|
|
4710
|
-
function
|
|
4743
|
+
function Ao(e) {
|
|
4711
4744
|
let t = /* @__PURE__ */ new Set(), n = [];
|
|
4712
4745
|
for (let r of e) t.has(r.name) || (t.add(r.name), n.push(r.name));
|
|
4713
4746
|
return n;
|
|
4714
4747
|
}
|
|
4715
|
-
function
|
|
4748
|
+
function jo(e) {
|
|
4716
4749
|
let t = /* @__PURE__ */ new Map();
|
|
4717
4750
|
for (let n of e) {
|
|
4718
4751
|
if (!n.slot) continue;
|
|
@@ -4723,8 +4756,8 @@ function Oo(e) {
|
|
|
4723
4756
|
}
|
|
4724
4757
|
//#endregion
|
|
4725
4758
|
//#region src/commands/login.ts
|
|
4726
|
-
async function
|
|
4727
|
-
|
|
4759
|
+
async function Mo() {
|
|
4760
|
+
ma(), o.intro(L.brandBold("Log in to Hype Stack")), o.log.step("Opening your browser to sign in...");
|
|
4728
4761
|
let e;
|
|
4729
4762
|
try {
|
|
4730
4763
|
e = await $n({ onUrl: (e) => {
|
|
@@ -4737,8 +4770,8 @@ async function ko() {
|
|
|
4737
4770
|
}
|
|
4738
4771
|
//#endregion
|
|
4739
4772
|
//#region src/commands/logout.ts
|
|
4740
|
-
async function
|
|
4741
|
-
|
|
4773
|
+
async function No() {
|
|
4774
|
+
ma(), o.intro(L.brandBold("Log out of Hype Stack"));
|
|
4742
4775
|
let e = N(), t = await Wn(e);
|
|
4743
4776
|
if (!t) {
|
|
4744
4777
|
o.outro(L.muted("You're not logged in."));
|
|
@@ -4748,16 +4781,16 @@ async function Ao() {
|
|
|
4748
4781
|
}
|
|
4749
4782
|
//#endregion
|
|
4750
4783
|
//#region src/core/templates.ts
|
|
4751
|
-
var
|
|
4784
|
+
var Po = q.createRequest()({
|
|
4752
4785
|
endpoint: "/templates/list",
|
|
4753
4786
|
method: "GET"
|
|
4754
4787
|
});
|
|
4755
|
-
async function
|
|
4756
|
-
let { data: e, error: t } = await
|
|
4788
|
+
async function Fo() {
|
|
4789
|
+
let { data: e, error: t } = await Po.send();
|
|
4757
4790
|
if (t || !e) throw Error(`Failed to fetch template list: ${String(t)}`);
|
|
4758
4791
|
return e.templates;
|
|
4759
4792
|
}
|
|
4760
|
-
async function
|
|
4793
|
+
async function Io(e) {
|
|
4761
4794
|
let { data: t, error: n, status: r } = await q.createRequest()({
|
|
4762
4795
|
endpoint: `/templates/${encodeURIComponent(e)}/manifest`,
|
|
4763
4796
|
method: "GET"
|
|
@@ -4766,7 +4799,7 @@ async function No(e) {
|
|
|
4766
4799
|
if (n || !t) throw Error(`Failed to load manifest for template "${e}": ${String(n)}`);
|
|
4767
4800
|
return t;
|
|
4768
4801
|
}
|
|
4769
|
-
async function
|
|
4802
|
+
async function Lo(e, t = {}) {
|
|
4770
4803
|
let n = q.createRequest()({
|
|
4771
4804
|
endpoint: `/templates/${encodeURIComponent(e)}/download`,
|
|
4772
4805
|
method: "POST"
|
|
@@ -4794,12 +4827,12 @@ async function Po(e, t = {}) {
|
|
|
4794
4827
|
}
|
|
4795
4828
|
//#endregion
|
|
4796
4829
|
//#region src/commands/template.ts
|
|
4797
|
-
async function
|
|
4830
|
+
async function Ro(e = {}) {
|
|
4798
4831
|
let t = e.cwd ?? process.cwd();
|
|
4799
|
-
|
|
4800
|
-
let n = await
|
|
4832
|
+
pa();
|
|
4833
|
+
let n = await po(t), a = n?.projectRoot ?? null, s = n?.scaffolded ?? !1, c;
|
|
4801
4834
|
try {
|
|
4802
|
-
c = await
|
|
4835
|
+
c = await fr(a ?? t);
|
|
4803
4836
|
} catch (e) {
|
|
4804
4837
|
o.cancel(`Could not parse ${L.path("stack.json")}: ${$(e)} Run 'npx @hype-stack/cli init' to regenerate it.`), process.exit(1);
|
|
4805
4838
|
}
|
|
@@ -4810,7 +4843,7 @@ async function Fo(e = {}) {
|
|
|
4810
4843
|
u.start("Loading packs...");
|
|
4811
4844
|
let d;
|
|
4812
4845
|
try {
|
|
4813
|
-
d = await
|
|
4846
|
+
d = await wr();
|
|
4814
4847
|
} catch (e) {
|
|
4815
4848
|
u.stop("Failed to load packs"), o.cancel(`Could not reach Hype Stack. Check your connection and try again.\n${$(e)}`), process.exit(1);
|
|
4816
4849
|
}
|
|
@@ -4819,7 +4852,7 @@ async function Fo(e = {}) {
|
|
|
4819
4852
|
u.start("Loading templates...");
|
|
4820
4853
|
let _;
|
|
4821
4854
|
try {
|
|
4822
|
-
_ = await
|
|
4855
|
+
_ = await Fo();
|
|
4823
4856
|
} catch (e) {
|
|
4824
4857
|
u.stop("Failed to load templates"), o.cancel(`Could not reach Hype Stack. Check your connection and try again.\n${$(e)}`), process.exit(1);
|
|
4825
4858
|
}
|
|
@@ -4840,16 +4873,16 @@ async function Fo(e = {}) {
|
|
|
4840
4873
|
}
|
|
4841
4874
|
let b = _.find((e) => e.id === y);
|
|
4842
4875
|
b || (u.stop("Template not found"), o.cancel(`Template "${y}" not found. Available: ${_.map((e) => e.id).join(", ") || "(none)"}`), process.exit(1)), u.stop(`Template: ${b.name}`);
|
|
4843
|
-
let x = await
|
|
4876
|
+
let x = await zo(b, e.variants, e.yes ?? !1), S = ea(b.slots, x), C = ta(b.slots, b.packs, S), T = await Bo({
|
|
4844
4877
|
packs: d,
|
|
4845
4878
|
templatePacks: C,
|
|
4846
4879
|
installedSet: p,
|
|
4847
4880
|
options: e
|
|
4848
4881
|
}), E = [...C, ...T.filter((e) => !C.includes(e))], D = E.filter((e) => !m.has(e));
|
|
4849
4882
|
D.length > 0 && (o.cancel(`Unknown pack${D.length === 1 ? "" : "s"}: ${D.join(", ")}`), process.exit(1));
|
|
4850
|
-
let O =
|
|
4883
|
+
let O = ia(d, S), ee = Xi(O), k;
|
|
4851
4884
|
try {
|
|
4852
|
-
k =
|
|
4885
|
+
k = Qi(E, ee, f);
|
|
4853
4886
|
} catch (e) {
|
|
4854
4887
|
o.cancel($(e)), process.exit(1);
|
|
4855
4888
|
}
|
|
@@ -4857,13 +4890,13 @@ async function Fo(e = {}) {
|
|
|
4857
4890
|
o.outro(L.muted("Every pack in this template is already installed."));
|
|
4858
4891
|
return;
|
|
4859
4892
|
}
|
|
4860
|
-
let te = await
|
|
4893
|
+
let te = await _o(O, p, {
|
|
4861
4894
|
token: g,
|
|
4862
4895
|
key: h
|
|
4863
4896
|
}), ne = (e) => {
|
|
4864
4897
|
let t = m.get(e);
|
|
4865
4898
|
return !t || t.tier === "free" ? "free" : te[e]?.owned ? "owned" : "locked";
|
|
4866
|
-
}, re = (e) => !p.has(e) && ne(e) === "locked", A =
|
|
4899
|
+
}, re = (e) => !p.has(e) && ne(e) === "locked", A = $i({
|
|
4867
4900
|
order: k.order,
|
|
4868
4901
|
graph: ee,
|
|
4869
4902
|
isLocked: re,
|
|
@@ -4871,28 +4904,28 @@ async function Fo(e = {}) {
|
|
|
4871
4904
|
});
|
|
4872
4905
|
if (A.blocked.length > 0 && !g && !h) {
|
|
4873
4906
|
let e = await er();
|
|
4874
|
-
e && (g = e, te = await
|
|
4907
|
+
e && (g = e, te = await _o(O, p, {
|
|
4875
4908
|
token: g,
|
|
4876
4909
|
key: h
|
|
4877
|
-
}), A =
|
|
4910
|
+
}), A = $i({
|
|
4878
4911
|
order: k.order,
|
|
4879
4912
|
graph: ee,
|
|
4880
4913
|
isLocked: re,
|
|
4881
4914
|
installed: f
|
|
4882
4915
|
}));
|
|
4883
4916
|
}
|
|
4884
|
-
if (A.blocked.length > 0 && await
|
|
4917
|
+
if (A.blocked.length > 0 && await yo(A.blocked, re, m), A.installable.length === 0) {
|
|
4885
4918
|
o.outro(L.muted("Nothing left to install once locked packs are removed."));
|
|
4886
4919
|
return;
|
|
4887
4920
|
}
|
|
4888
|
-
if (
|
|
4921
|
+
if (bo(A.installable, m), !e.yes) {
|
|
4889
4922
|
let e = await o.confirm({ message: `Install template ${L.brandBold(b.name)} (${A.installable.length} pack${A.installable.length === 1 ? "" : "s"})?` });
|
|
4890
4923
|
(o.isCancel(e) || !e) && (o.cancel("Installation cancelled."), process.exit(0));
|
|
4891
4924
|
}
|
|
4892
4925
|
u.start("Downloading packs...");
|
|
4893
4926
|
let j;
|
|
4894
4927
|
try {
|
|
4895
|
-
j = await
|
|
4928
|
+
j = await xo(A.installable, {
|
|
4896
4929
|
token: g,
|
|
4897
4930
|
key: h
|
|
4898
4931
|
});
|
|
@@ -4900,7 +4933,7 @@ async function Fo(e = {}) {
|
|
|
4900
4933
|
u.stop("Download failed"), o.cancel($(e)), process.exit(1);
|
|
4901
4934
|
}
|
|
4902
4935
|
u.stop(`Downloaded ${j.length} pack${j.length === 1 ? "" : "s"}`);
|
|
4903
|
-
let ie = await
|
|
4936
|
+
let ie = await To({
|
|
4904
4937
|
prepared: j,
|
|
4905
4938
|
config: c,
|
|
4906
4939
|
cwd: l,
|
|
@@ -4909,7 +4942,7 @@ async function Fo(e = {}) {
|
|
|
4909
4942
|
}), M = null;
|
|
4910
4943
|
try {
|
|
4911
4944
|
u.start("Installing pack files...");
|
|
4912
|
-
let t = await
|
|
4945
|
+
let t = await Pi({
|
|
4913
4946
|
packs: j,
|
|
4914
4947
|
config: c,
|
|
4915
4948
|
projectRoot: l,
|
|
@@ -4921,15 +4954,15 @@ async function Fo(e = {}) {
|
|
|
4921
4954
|
for (let e of t.errors) o.log.error(e);
|
|
4922
4955
|
o.cancel("No files were written. Fix the errors above (or pass --force for existing files) and try again."), process.exit(1);
|
|
4923
4956
|
}
|
|
4924
|
-
u.stop("Files installed"), t.installed.length > 0 && o.log.success(`${L.highlight(String(t.installed.length))} files installed`), t.skipped.length > 0 && o.log.warning(`${t.skipped.length} files skipped (use --force to overwrite)`);
|
|
4957
|
+
u.stop("Files installed"), t.installed.length > 0 && o.log.success(`${L.highlight(String(t.installed.length))} files installed`), t.skipped.length > 0 && (o.log.warning(`${t.skipped.length} files skipped (use --force to overwrite)`), wo(t.skipped));
|
|
4925
4958
|
for (let e of t.errors) o.log.error(e);
|
|
4926
4959
|
u.start("Applying template overrides...");
|
|
4927
|
-
let n = await
|
|
4960
|
+
let n = await Io(b.id), a = await Lo(b.id, {
|
|
4928
4961
|
token: g,
|
|
4929
4962
|
licenseKey: h
|
|
4930
4963
|
});
|
|
4931
4964
|
a.status === "denied" && (u.stop("Template download denied"), o.cancel(`Access to template "${b.id}" was denied (${a.reason}). Try 'npx @hype-stack/cli login' or check your license.`), process.exit(1)), M = a.templateDir;
|
|
4932
|
-
let d = await
|
|
4965
|
+
let d = await Ii({
|
|
4933
4966
|
manifest: n,
|
|
4934
4967
|
config: c,
|
|
4935
4968
|
projectRoot: l,
|
|
@@ -4938,17 +4971,17 @@ async function Fo(e = {}) {
|
|
|
4938
4971
|
u.stop("Template overrides applied"), d.installed.length > 0 && o.log.success(`${d.installed.length} template file${d.installed.length === 1 ? "" : "s"} applied`);
|
|
4939
4972
|
for (let e of d.errors) o.log.error(e);
|
|
4940
4973
|
let f = n.theme ?? "zinc-mono";
|
|
4941
|
-
i(f) && (await
|
|
4974
|
+
i(f) && (await Sa(w.resolve(l, c.paths?.frontend.root ?? "apps/frontend"), r(f)) ? o.log.success(`Applied the ${r(f).label} theme`) : o.log.warning(L.muted(`Could not find ${L.path("assets/styles.css")} to apply the theme`))), await Vo({
|
|
4942
4975
|
prepared: j,
|
|
4943
4976
|
templateNpm: n.dependencies_npm,
|
|
4944
4977
|
paths: c.paths,
|
|
4945
4978
|
cwd: l,
|
|
4946
4979
|
spinner: u
|
|
4947
|
-
}), s && await
|
|
4980
|
+
}), s && await Yi(l, e.yes ?? !1), await ur({
|
|
4948
4981
|
projectRoot: l,
|
|
4949
4982
|
paths: c.paths,
|
|
4950
4983
|
skipPrompts: e.yes ?? !1
|
|
4951
|
-
}),
|
|
4984
|
+
}), Co(j), n.postInstall && n.postInstall.length > 0 && o.note(n.postInstall.map((e) => ` ${L.muted("→")} ${e}`).join("\n"), "Template Next Steps"), o.outro(L.brand(`Installed template ${b.name}.`));
|
|
4952
4985
|
} finally {
|
|
4953
4986
|
await Promise.all(j.map((e) => v.rm(e.packDir, {
|
|
4954
4987
|
recursive: !0,
|
|
@@ -4959,7 +4992,7 @@ async function Fo(e = {}) {
|
|
|
4959
4992
|
});
|
|
4960
4993
|
}
|
|
4961
4994
|
}
|
|
4962
|
-
async function
|
|
4995
|
+
async function zo(e, t, n) {
|
|
4963
4996
|
let r = {};
|
|
4964
4997
|
for (let i of e.slots) {
|
|
4965
4998
|
if (t?.[i.family]) {
|
|
@@ -4983,7 +5016,7 @@ async function Io(e, t, n) {
|
|
|
4983
5016
|
}
|
|
4984
5017
|
return r;
|
|
4985
5018
|
}
|
|
4986
|
-
async function
|
|
5019
|
+
async function Bo(e) {
|
|
4987
5020
|
let { packs: t, templatePacks: n, installedSet: r, options: i } = e, a = new Set(n);
|
|
4988
5021
|
if (i.packs && i.packs.length > 0) {
|
|
4989
5022
|
let e = i.packs.filter((e) => !t.some((t) => t.name === e));
|
|
@@ -4994,7 +5027,7 @@ async function Lo(e) {
|
|
|
4994
5027
|
if (s.length === 0) return [];
|
|
4995
5028
|
let c = P();
|
|
4996
5029
|
o.note(s.map((e) => ` ${R.arrow} ${L.highlight(e.displayName)} ${_e(`${c}/packs/${e.name}`)}`).join("\n"), "Browse packs");
|
|
4997
|
-
let l = await
|
|
5030
|
+
let l = await ga({
|
|
4998
5031
|
message: "Add extra packs on top of the template (optional)",
|
|
4999
5032
|
options: s.map((e) => ({
|
|
5000
5033
|
value: e.name,
|
|
@@ -5005,25 +5038,25 @@ async function Lo(e) {
|
|
|
5005
5038
|
});
|
|
5006
5039
|
return p(l) && (o.cancel("Cancelled."), process.exit(0)), l;
|
|
5007
5040
|
}
|
|
5008
|
-
async function
|
|
5009
|
-
let { prepared: t, templateNpm: n, paths: r, cwd: i, spinner: a } = e, s =
|
|
5041
|
+
async function Vo(e) {
|
|
5042
|
+
let { prepared: t, templateNpm: n, paths: r, cwd: i, spinner: a } = e, s = ho(t.map((e) => e.manifest.dependencies_npm)), c = mo(n ? ho([s, n]) : s, r);
|
|
5010
5043
|
if (c.errors.length > 0) {
|
|
5011
5044
|
for (let e of c.errors) o.log.error(e);
|
|
5012
5045
|
return;
|
|
5013
5046
|
}
|
|
5014
5047
|
if (c.operations.length === 0) return;
|
|
5015
5048
|
a.start("Installing npm dependencies...");
|
|
5016
|
-
let l = await
|
|
5049
|
+
let l = await go(c.operations, i);
|
|
5017
5050
|
if (a.stop(l.ok ? "npm dependencies installed" : "npm dependency installation failed"), !l.ok) for (let e of l.errors) o.log.error(e);
|
|
5018
5051
|
}
|
|
5019
5052
|
//#endregion
|
|
5020
5053
|
//#region src/cli.ts
|
|
5021
|
-
function
|
|
5054
|
+
function Ho(e) {
|
|
5022
5055
|
if (!e) return;
|
|
5023
5056
|
let t = e.split(",").map((e) => e.trim()).filter((e) => e.length > 0);
|
|
5024
5057
|
return t.length > 0 ? t : void 0;
|
|
5025
5058
|
}
|
|
5026
|
-
function
|
|
5059
|
+
function Uo(e) {
|
|
5027
5060
|
if (!e) return;
|
|
5028
5061
|
let t = {};
|
|
5029
5062
|
for (let n of e.split(",")) {
|
|
@@ -5032,10 +5065,10 @@ function Bo(e) {
|
|
|
5032
5065
|
}
|
|
5033
5066
|
return Object.keys(t).length > 0 ? t : void 0;
|
|
5034
5067
|
}
|
|
5035
|
-
function
|
|
5068
|
+
function Wo() {
|
|
5036
5069
|
let e = new a();
|
|
5037
5070
|
return e.name("hype-stack").description("Build with Hype Stack -- templates, components, modules, and more").version(k, "-v, --version"), e.command("create").description("Create a new Hype Stack project").option("-n, --name <name>", "Project name").option("-d, --directory <path>", "Target directory").option("-e, --editor <editor>", "Code editor (cursor, claude, windsurf, copilot)").option("-t, --theme <theme>", "Color theme (default, slate, rose, emerald, violet, amber, ocean, zinc-mono, crimson, midnight)").option("--no-install", "Skip dependency installation").option("--no-setup", "Skip Docker services and database migrations after create").option("-y, --yes", "Skip confirmation prompts (requires --name)").action(async (e) => {
|
|
5038
|
-
await
|
|
5071
|
+
await uo({
|
|
5039
5072
|
name: e.name,
|
|
5040
5073
|
directory: e.directory,
|
|
5041
5074
|
install: e.install,
|
|
@@ -5045,32 +5078,32 @@ function Vo() {
|
|
|
5045
5078
|
setup: e.setup
|
|
5046
5079
|
});
|
|
5047
5080
|
}), e.command("init").description("Initialize stack.json in the current project").action(async () => {
|
|
5048
|
-
await
|
|
5081
|
+
await fo({});
|
|
5049
5082
|
}), e.command("compose").description("Choose feature packs to add to your project").option("--packs <list>", "Comma-separated pack names (non-interactive). Append @frontend or @admin to a layout pack to target that app shell, e.g. layout-basic@frontend,layout-native-app-shell@admin").option("--force", "Overwrite existing files").option("-y, --yes", "Skip confirmation prompts").option("-k, --key <key>", "License key").option("--license-key <key>", "License key (alias for --key)").option("--cwd <path>", "Working directory").action(async (e) => {
|
|
5050
|
-
await
|
|
5051
|
-
packs:
|
|
5083
|
+
await Eo({
|
|
5084
|
+
packs: Ho(e.packs),
|
|
5052
5085
|
force: e.force,
|
|
5053
5086
|
yes: e.yes,
|
|
5054
5087
|
licenseKey: e.key ?? e.licenseKey,
|
|
5055
5088
|
cwd: e.cwd
|
|
5056
5089
|
});
|
|
5057
5090
|
}), e.command("template").description("Install a template by id, with starter/layout variant swaps and extra packs on top").argument("[id]", "Template id (omit to pick interactively)").option("--variants <map>", "Preselect slot variants, e.g. starter-saas=starter-saas-better-auth,layout=layout-basic").option("--packs <list>", "Extra packs to add on top of the template (comma-separated)").option("--force", "Overwrite existing files").option("-y, --yes", "Skip confirmation prompts (requires <id>)").option("-k, --key <key>", "License key").option("--license-key <key>", "License key (alias for --key)").option("--cwd <path>", "Working directory").action(async (e, t) => {
|
|
5058
|
-
await
|
|
5091
|
+
await Ro({
|
|
5059
5092
|
templateId: e,
|
|
5060
|
-
variants:
|
|
5061
|
-
packs:
|
|
5093
|
+
variants: Uo(t.variants),
|
|
5094
|
+
packs: Ho(t.packs),
|
|
5062
5095
|
force: t.force,
|
|
5063
5096
|
yes: t.yes,
|
|
5064
5097
|
licenseKey: t.key ?? t.licenseKey,
|
|
5065
5098
|
cwd: t.cwd
|
|
5066
5099
|
});
|
|
5067
5100
|
}), e.command("login").description("Log in via your browser to install packs your organization owns").action(async () => {
|
|
5068
|
-
await
|
|
5101
|
+
await Mo();
|
|
5069
5102
|
}), e.command("logout").description("Log out and remove the saved CLI token").action(async () => {
|
|
5070
|
-
await
|
|
5103
|
+
await No();
|
|
5071
5104
|
}), e.command("auth").description("Alias for `login`").action(async () => {
|
|
5072
|
-
await
|
|
5105
|
+
await Mo();
|
|
5073
5106
|
}), e;
|
|
5074
5107
|
}
|
|
5075
5108
|
//#endregion
|
|
5076
|
-
export {
|
|
5109
|
+
export { po as a, Eo as i, No as n, fo as o, Mo as r, uo as s, Wo as t };
|