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