@hype-stack/cli 0.5.15 → 0.5.17
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-Ck7P--h6.js → cli-CpvJkOtv.js} +557 -536
- package/dist/config/bin.js +1 -1
- package/dist/core/codegen.d.ts +2 -0
- package/dist/core/codegen.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
|
@@ -13,7 +13,7 @@ import { Prompt as O } from "@clack/core";
|
|
|
13
13
|
import { styleText as k } from "node:util";
|
|
14
14
|
import { downloadTemplate as ee } from "giget";
|
|
15
15
|
//#region src/constants/constants.ts
|
|
16
|
-
var A = "0.5.
|
|
16
|
+
var A = "0.5.17", te = "gh:BetterTyped/hype-stack", ne = "stack.json", re = "/schema/stack.json", j = "https://api.hype-stack.dev", M = "HYPE_STACK_API_URL", N = "https://www.hype-stack.dev", ie = /^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/, P = [
|
|
17
17
|
{
|
|
18
18
|
value: "cursor",
|
|
19
19
|
label: "Cursor",
|
|
@@ -2452,44 +2452,65 @@ function gr(e) {
|
|
|
2452
2452
|
`${L.command("pnpm exec prisma migrate dev")} ${L.muted("(create + apply tables for new packs)")}`
|
|
2453
2453
|
].join("\n"), "Database Setup");
|
|
2454
2454
|
}
|
|
2455
|
-
|
|
2456
|
-
|
|
2457
|
-
|
|
2455
|
+
var _r = /P1001|can't reach database server|make sure your database server is running/i;
|
|
2456
|
+
async function vr(e, t) {
|
|
2457
|
+
let n = await t("pnpm", [
|
|
2458
|
+
"exec",
|
|
2459
|
+
"prisma",
|
|
2460
|
+
"migrate",
|
|
2461
|
+
"status"
|
|
2462
|
+
], { cwd: e });
|
|
2463
|
+
return !_r.test(`${n.stdout}\n${n.stderr}`);
|
|
2464
|
+
}
|
|
2465
|
+
function yr(e) {
|
|
2466
|
+
s.log.error(L.muted("Can't reach the database. It's most likely not running yet.")), z([
|
|
2467
|
+
`${L.command(`cd ${e}`)}`,
|
|
2468
|
+
`${L.command("docker compose up -d")} ${L.muted("start Postgres and the other services")}`,
|
|
2469
|
+
`${L.command("pnpm exec prisma migrate dev")} ${L.muted("then create + apply tables for new packs")}`
|
|
2470
|
+
].join("\n"), "Database not reachable");
|
|
2471
|
+
}
|
|
2472
|
+
async function br(e) {
|
|
2473
|
+
let { projectRoot: t, paths: n, skipPrompts: r, dbReady: i, freshScaffold: a, runCommand: o = cr, probeCommand: c = J } = e, l = n.backend.root, u = T.join(t, l);
|
|
2474
|
+
if (!await Y(T.join(u, "package.json"))) return;
|
|
2458
2475
|
if (!r) {
|
|
2459
2476
|
s.log.step(L.muted(`Generating Prisma client (${L.command("prisma generate")})...`));
|
|
2460
2477
|
let e = await o("pnpm", [
|
|
2461
2478
|
"exec",
|
|
2462
2479
|
"prisma",
|
|
2463
2480
|
"generate"
|
|
2464
|
-
], { cwd:
|
|
2481
|
+
], { cwd: u });
|
|
2465
2482
|
if (e.exitCode !== 0) {
|
|
2466
|
-
s.log.error(L.muted("prisma generate failed. See the output above, or finish setup manually:")),
|
|
2483
|
+
s.log.error(L.muted("prisma generate failed. See the output above, or finish setup manually:")), xr(e), gr(l);
|
|
2467
2484
|
return;
|
|
2468
2485
|
}
|
|
2469
2486
|
s.log.success("Prisma client generated");
|
|
2470
2487
|
}
|
|
2471
2488
|
if (r || i === !1) {
|
|
2472
|
-
gr(
|
|
2489
|
+
gr(l);
|
|
2473
2490
|
return;
|
|
2474
2491
|
}
|
|
2475
|
-
|
|
2492
|
+
if (!await vr(u, c)) {
|
|
2493
|
+
yr(l);
|
|
2494
|
+
return;
|
|
2495
|
+
}
|
|
2496
|
+
let d = await s.confirm({
|
|
2476
2497
|
message: `Run database setup now? (${L.command("prisma migrate dev")})`,
|
|
2477
2498
|
initialValue: !0
|
|
2478
2499
|
});
|
|
2479
|
-
if (s.isCancel(
|
|
2480
|
-
gr(
|
|
2500
|
+
if (s.isCancel(d) || !d) {
|
|
2501
|
+
gr(l);
|
|
2481
2502
|
return;
|
|
2482
2503
|
}
|
|
2483
2504
|
s.log.step(L.muted(`Running ${L.command("prisma migrate dev --name add-packs")}...`));
|
|
2484
|
-
let
|
|
2505
|
+
let f = await o("pnpm", [
|
|
2485
2506
|
"exec",
|
|
2486
2507
|
"prisma",
|
|
2487
2508
|
"migrate",
|
|
2488
2509
|
"dev",
|
|
2489
2510
|
"--name",
|
|
2490
2511
|
"add-packs"
|
|
2491
|
-
], { cwd:
|
|
2492
|
-
if (
|
|
2512
|
+
], { cwd: u });
|
|
2513
|
+
if (f.exitCode !== 0 && a) {
|
|
2493
2514
|
let e = await s.confirm({
|
|
2494
2515
|
message: "migrate dev hit drift between the database and the local migrations. Reset the dev database and retry?",
|
|
2495
2516
|
initialValue: !0
|
|
@@ -2502,28 +2523,28 @@ async function _r(e) {
|
|
|
2502
2523
|
"migrate",
|
|
2503
2524
|
"reset",
|
|
2504
2525
|
"--force"
|
|
2505
|
-
], { cwd:
|
|
2506
|
-
if (e.exitCode === 0) s.log.step(L.muted(`Running ${L.command("prisma migrate dev --name add-packs")}...`)),
|
|
2526
|
+
], { cwd: u });
|
|
2527
|
+
if (e.exitCode === 0) s.log.step(L.muted(`Running ${L.command("prisma migrate dev --name add-packs")}...`)), f = await o("pnpm", [
|
|
2507
2528
|
"exec",
|
|
2508
2529
|
"prisma",
|
|
2509
2530
|
"migrate",
|
|
2510
2531
|
"dev",
|
|
2511
2532
|
"--name",
|
|
2512
2533
|
"add-packs"
|
|
2513
|
-
], { cwd:
|
|
2534
|
+
], { cwd: u });
|
|
2514
2535
|
else {
|
|
2515
|
-
s.log.error(L.muted("prisma migrate reset did not complete. See the output above, or finish setup manually:")),
|
|
2536
|
+
s.log.error(L.muted("prisma migrate reset did not complete. See the output above, or finish setup manually:")), xr(e), gr(l);
|
|
2516
2537
|
return;
|
|
2517
2538
|
}
|
|
2518
2539
|
}
|
|
2519
2540
|
}
|
|
2520
|
-
if (
|
|
2521
|
-
s.log.error(L.muted("prisma migrate dev did not complete. See the output above, or finish setup manually:")),
|
|
2541
|
+
if (f.exitCode !== 0) {
|
|
2542
|
+
s.log.error(L.muted("prisma migrate dev did not complete. See the output above, or finish setup manually:")), xr(f), gr(l);
|
|
2522
2543
|
return;
|
|
2523
2544
|
}
|
|
2524
2545
|
s.log.success("Database schema applied");
|
|
2525
2546
|
}
|
|
2526
|
-
function
|
|
2547
|
+
function xr(e) {
|
|
2527
2548
|
let t = (e.stderr || e.stdout).trim();
|
|
2528
2549
|
t && s.log.warn(L.muted(t));
|
|
2529
2550
|
}
|
|
@@ -2539,7 +2560,7 @@ var X = {
|
|
|
2539
2560
|
Resend: "resend",
|
|
2540
2561
|
IpLocate: "iplocate",
|
|
2541
2562
|
Sentry: "sentry"
|
|
2542
|
-
},
|
|
2563
|
+
}, Sr = {
|
|
2543
2564
|
[X.Config]: "Config",
|
|
2544
2565
|
[X.Databases]: "Databases",
|
|
2545
2566
|
[X.Workos]: "WorkOS",
|
|
@@ -2549,15 +2570,15 @@ var X = {
|
|
|
2549
2570
|
[X.Resend]: "Resend",
|
|
2550
2571
|
[X.IpLocate]: "IP Locate",
|
|
2551
2572
|
[X.Sentry]: "Sentry"
|
|
2552
|
-
},
|
|
2553
|
-
function
|
|
2573
|
+
}, Cr = new Set(Object.values(X));
|
|
2574
|
+
function wr(e) {
|
|
2554
2575
|
return e.toLowerCase().replace(/[^a-z0-9]+/g, "").trim();
|
|
2555
2576
|
}
|
|
2556
|
-
function
|
|
2557
|
-
let t =
|
|
2558
|
-
return
|
|
2577
|
+
function Tr(e) {
|
|
2578
|
+
let t = wr(e);
|
|
2579
|
+
return Cr.has(t) ? t : void 0;
|
|
2559
2580
|
}
|
|
2560
|
-
var
|
|
2581
|
+
var Er = {
|
|
2561
2582
|
[X.Config]: { hint: "App URLs. Defaults work for local dev." },
|
|
2562
2583
|
[X.Databases]: { hint: "Credentials for the local Docker Postgres and Valkey containers." },
|
|
2563
2584
|
[X.Workos]: {
|
|
@@ -2595,61 +2616,61 @@ var Cr = {
|
|
|
2595
2616
|
link: "https://sentry.io",
|
|
2596
2617
|
hint: "Your project DSN. Leave blank to skip Sentry for now."
|
|
2597
2618
|
}
|
|
2598
|
-
},
|
|
2599
|
-
function
|
|
2600
|
-
let t =
|
|
2601
|
-
return t ?
|
|
2619
|
+
}, Dr = { hint: "Add your value, or press Enter to leave it blank." };
|
|
2620
|
+
function Or(e) {
|
|
2621
|
+
let t = Tr(e);
|
|
2622
|
+
return t ? Er[t] : Dr;
|
|
2602
2623
|
}
|
|
2603
|
-
function
|
|
2624
|
+
function kr(e, t) {
|
|
2604
2625
|
if (t.length === 0) return !0;
|
|
2605
|
-
let n =
|
|
2626
|
+
let n = Tr(e);
|
|
2606
2627
|
return n ? t.includes(n) : !1;
|
|
2607
2628
|
}
|
|
2608
|
-
function
|
|
2629
|
+
function Ar(e) {
|
|
2609
2630
|
return e ? e.map((e) => {
|
|
2610
|
-
let t =
|
|
2631
|
+
let t = Tr(e.envExample.section);
|
|
2611
2632
|
if (!t) throw Error(`Unknown onboarding env section "${e.envExample.section}". Known sections: ${Object.values(X).join(", ")}.`);
|
|
2612
2633
|
return t;
|
|
2613
2634
|
}) : [];
|
|
2614
2635
|
}
|
|
2615
|
-
function
|
|
2636
|
+
function jr(e) {
|
|
2616
2637
|
let t = /* @__PURE__ */ new Set(), n = [];
|
|
2617
2638
|
for (let r of e) t.has(r) || (t.add(r), n.push(r));
|
|
2618
2639
|
return n;
|
|
2619
2640
|
}
|
|
2620
|
-
var
|
|
2641
|
+
var Mr = {
|
|
2621
2642
|
"starter-saas-workos": ["Your WebSocket upgrades can be authenticated with `authenticateWsUpgrade` from `@backend/middleware/auth/ws-auth` via `sockets.routes(authenticateWsUpgrade)`."],
|
|
2622
2643
|
"starter-saas-betterauth": ["Your WebSocket upgrades can be authenticated with `authenticateWsUpgrade` from `@backend/middleware/auth/ws-auth` via `sockets.routes(authenticateWsUpgrade)`."],
|
|
2623
2644
|
"pack-notifications": ["Notifications push over the `appChannel` socket channel; register it in your server startup to go live."],
|
|
2624
2645
|
"pack-collaboration": ["Team and TeamMember are available as CASL subjects; project member and team management reuse the existing `Project` subject."]
|
|
2625
2646
|
};
|
|
2626
|
-
function
|
|
2647
|
+
function Nr(e) {
|
|
2627
2648
|
let t = /* @__PURE__ */ new Set(), n = [];
|
|
2628
2649
|
for (let r of e) {
|
|
2629
|
-
let e =
|
|
2650
|
+
let e = Mr[r];
|
|
2630
2651
|
if (e) for (let r of e) t.has(r) || (t.add(r), n.push(r));
|
|
2631
2652
|
}
|
|
2632
2653
|
return n;
|
|
2633
2654
|
}
|
|
2634
2655
|
//#endregion
|
|
2635
2656
|
//#region src/core/stack-config.ts
|
|
2636
|
-
async function
|
|
2657
|
+
async function Pr(e) {
|
|
2637
2658
|
return dr(T.join(e, ne));
|
|
2638
2659
|
}
|
|
2639
|
-
async function
|
|
2660
|
+
async function Fr(e) {
|
|
2640
2661
|
return Y(T.join(e, ne));
|
|
2641
2662
|
}
|
|
2642
|
-
async function
|
|
2663
|
+
async function Ir(e, t) {
|
|
2643
2664
|
await fr(T.join(e, ne), t);
|
|
2644
2665
|
}
|
|
2645
|
-
async function
|
|
2666
|
+
async function Lr(e) {
|
|
2646
2667
|
let t = T.join(e, "apps"), n = T.join(e, "packages"), [r, i] = await Promise.all([pr(t), pr(n)]);
|
|
2647
2668
|
return {
|
|
2648
2669
|
apps: r,
|
|
2649
2670
|
packages: i
|
|
2650
2671
|
};
|
|
2651
2672
|
}
|
|
2652
|
-
function
|
|
2673
|
+
function Rr(e) {
|
|
2653
2674
|
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";
|
|
2654
2675
|
return {
|
|
2655
2676
|
backend: {
|
|
@@ -2683,19 +2704,19 @@ function Fr(e) {
|
|
|
2683
2704
|
}
|
|
2684
2705
|
};
|
|
2685
2706
|
}
|
|
2686
|
-
function
|
|
2707
|
+
function zr(e, t) {
|
|
2687
2708
|
return {
|
|
2688
2709
|
$schema: de(),
|
|
2689
2710
|
version: 1,
|
|
2690
2711
|
name: e,
|
|
2691
2712
|
apps: t.apps,
|
|
2692
2713
|
packages: t.packages,
|
|
2693
|
-
paths:
|
|
2714
|
+
paths: Rr(t),
|
|
2694
2715
|
installedPacks: [],
|
|
2695
2716
|
licenseKey: null
|
|
2696
2717
|
};
|
|
2697
2718
|
}
|
|
2698
|
-
async function
|
|
2719
|
+
async function Br(e) {
|
|
2699
2720
|
let t = T.join(e, "package.json"), n = T.join(e, "apps"), [r, i] = await Promise.all([Y(t), lr(n)]);
|
|
2700
2721
|
return r && i;
|
|
2701
2722
|
}
|
|
@@ -2710,7 +2731,7 @@ function Z(e, t) {
|
|
|
2710
2731
|
}
|
|
2711
2732
|
//#endregion
|
|
2712
2733
|
//#region src/core/registry.ts
|
|
2713
|
-
async function
|
|
2734
|
+
async function Vr(e) {
|
|
2714
2735
|
let { data: t, error: n, status: r } = await q.createRequest()({
|
|
2715
2736
|
endpoint: `/packs/${encodeURIComponent(e)}/manifest`,
|
|
2716
2737
|
method: "GET"
|
|
@@ -2719,7 +2740,7 @@ async function Rr(e) {
|
|
|
2719
2740
|
if (n || !t) throw Error(`Failed to load manifest for "${e}": ${String(n)}`);
|
|
2720
2741
|
return t;
|
|
2721
2742
|
}
|
|
2722
|
-
async function
|
|
2743
|
+
async function Hr(e, t = {}) {
|
|
2723
2744
|
let n = q.createRequest()({
|
|
2724
2745
|
endpoint: `/packs/${encodeURIComponent(e)}/download`,
|
|
2725
2746
|
method: "POST"
|
|
@@ -2745,23 +2766,23 @@ async function zr(e, t = {}) {
|
|
|
2745
2766
|
packDir: s
|
|
2746
2767
|
};
|
|
2747
2768
|
}
|
|
2748
|
-
function
|
|
2769
|
+
function Ur(e, t, n) {
|
|
2749
2770
|
let r = Z(e, t);
|
|
2750
2771
|
return T.resolve(n, r);
|
|
2751
2772
|
}
|
|
2752
|
-
function
|
|
2773
|
+
function Wr(e, t) {
|
|
2753
2774
|
return T.join(t, e);
|
|
2754
2775
|
}
|
|
2755
|
-
var
|
|
2776
|
+
var Gr = q.createRequest()({
|
|
2756
2777
|
endpoint: "/packs/list",
|
|
2757
2778
|
method: "GET"
|
|
2758
2779
|
});
|
|
2759
|
-
async function
|
|
2760
|
-
let { data: e, error: t } = await
|
|
2780
|
+
async function Kr() {
|
|
2781
|
+
let { data: e, error: t } = await Gr.send();
|
|
2761
2782
|
if (t || !e) throw Error(`Failed to fetch pack list: ${String(t)}`);
|
|
2762
2783
|
return e.packs;
|
|
2763
2784
|
}
|
|
2764
|
-
async function
|
|
2785
|
+
async function qr(e, t = {}) {
|
|
2765
2786
|
if (e.length === 0) return {};
|
|
2766
2787
|
let n = q.createRequest()({
|
|
2767
2788
|
endpoint: "/packs/authorize",
|
|
@@ -2777,33 +2798,33 @@ async function Wr(e, t = {}) {
|
|
|
2777
2798
|
}
|
|
2778
2799
|
//#endregion
|
|
2779
2800
|
//#region src/core/codemods.ts
|
|
2780
|
-
var
|
|
2781
|
-
function
|
|
2782
|
-
return e.replace(
|
|
2801
|
+
var Jr = "@hype-stack/", Yr = /@hype-stack\/(?!cli\b)/g;
|
|
2802
|
+
function Xr(e, t) {
|
|
2803
|
+
return e.replace(Yr, t);
|
|
2783
2804
|
}
|
|
2784
|
-
function
|
|
2805
|
+
function Zr(e, t) {
|
|
2785
2806
|
return Z(e === "admin" ? "{{admin.root}}" : "{{frontend.root}}", t);
|
|
2786
2807
|
}
|
|
2787
|
-
async function
|
|
2808
|
+
async function Qr(e, t, n) {
|
|
2788
2809
|
let r = Z("{{backend.root}}", t), i = T.resolve(n, r, "src/config/env/env.config.ts"), a = T.resolve(n, r, ".env.example"), o = T.resolve(n, r, ".env"), s = T.resolve(n, r, ".env.test");
|
|
2789
2810
|
if (await Y(i)) {
|
|
2790
2811
|
let t = await y.readFile(i, "utf-8");
|
|
2791
|
-
for (let n of e) t.includes(`from "${n.from}"`) || (t =
|
|
2812
|
+
for (let n of e) t.includes(`from "${n.from}"`) || (t = $r(t, n), t = ei(t, n));
|
|
2792
2813
|
await y.writeFile(i, t, "utf-8");
|
|
2793
2814
|
}
|
|
2794
|
-
if (await Promise.all([a, o].map((t) =>
|
|
2815
|
+
if (await Promise.all([a, o].map((t) => ti(t, e))), await Y(s)) {
|
|
2795
2816
|
let t = await y.readFile(s, "utf-8");
|
|
2796
|
-
for (let n of e) t =
|
|
2817
|
+
for (let n of e) t = ri(t, n);
|
|
2797
2818
|
await y.writeFile(s, t, "utf-8");
|
|
2798
2819
|
}
|
|
2799
2820
|
}
|
|
2800
|
-
function
|
|
2821
|
+
function $r(e, t) {
|
|
2801
2822
|
let n = `import { ${t.import} } from "${t.from}";`, r = e.lastIndexOf("import ");
|
|
2802
2823
|
if (r === -1) return n + "\n" + e;
|
|
2803
2824
|
let i = e.indexOf("\n", e.indexOf(";", r));
|
|
2804
2825
|
return i === -1 ? e + "\n" + n : e.slice(0, i + 1) + n + "\n" + e.slice(i + 1);
|
|
2805
2826
|
}
|
|
2806
|
-
function
|
|
2827
|
+
function ei(e, t) {
|
|
2807
2828
|
let n = `.extend(${t.import}.shape)`;
|
|
2808
2829
|
if (e.includes(n)) return e;
|
|
2809
2830
|
let r = e.indexOf("export const envSchema = z.object({");
|
|
@@ -2818,33 +2839,33 @@ function Zr(e, t) {
|
|
|
2818
2839
|
let o = a + 2;
|
|
2819
2840
|
return e.slice(0, o) + n + e.slice(o);
|
|
2820
2841
|
}
|
|
2821
|
-
async function
|
|
2842
|
+
async function ti(e, t) {
|
|
2822
2843
|
if (!await Y(e)) return;
|
|
2823
2844
|
let n = await y.readFile(e, "utf-8");
|
|
2824
|
-
for (let e of t) n =
|
|
2845
|
+
for (let e of t) n = ni(n, e);
|
|
2825
2846
|
await y.writeFile(e, n, "utf-8");
|
|
2826
2847
|
}
|
|
2827
|
-
function
|
|
2848
|
+
function ni(e, t) {
|
|
2828
2849
|
for (let n of Object.keys(t.envExample.vars)) if (e.includes(`${n}=`)) return e;
|
|
2829
2850
|
let n = [];
|
|
2830
|
-
n.push(""), n.push(`# ${
|
|
2851
|
+
n.push(""), n.push(`# ${Sr[t.envExample.section]}`);
|
|
2831
2852
|
for (let [e, r] of Object.entries(t.envExample.vars)) n.push(`${e}=${r}`);
|
|
2832
2853
|
return e.trimEnd() + "\n" + n.join("\n") + "\n";
|
|
2833
2854
|
}
|
|
2834
|
-
function
|
|
2855
|
+
function ri(e, t) {
|
|
2835
2856
|
for (let n of Object.keys(t.envTest)) if (e.includes(`${n}=`)) return e;
|
|
2836
2857
|
let n = [""];
|
|
2837
2858
|
for (let [e, r] of Object.entries(t.envTest)) n.push(`${e}=${r}`);
|
|
2838
2859
|
return e.trimEnd() + "\n" + n.join("\n") + "\n";
|
|
2839
2860
|
}
|
|
2840
|
-
async function
|
|
2861
|
+
async function ii(e, t, n) {
|
|
2841
2862
|
let r = T.resolve(n, Z("{{backend.routes}}", t), "index.ts");
|
|
2842
2863
|
if (!await Y(r)) return;
|
|
2843
2864
|
let i = await y.readFile(r, "utf-8");
|
|
2844
|
-
for (let t of e) i.includes(`from "${t.from}"`) || (i =
|
|
2865
|
+
for (let t of e) i.includes(`from "${t.from}"`) || (i = ai(i, t), i = oi(i, t));
|
|
2845
2866
|
await y.writeFile(r, i, "utf-8");
|
|
2846
2867
|
}
|
|
2847
|
-
function
|
|
2868
|
+
function ai(e, t) {
|
|
2848
2869
|
let n = `import { ${t.import} } from "${t.from}";`, r = e.lastIndexOf("from \"./");
|
|
2849
2870
|
if (r !== -1) {
|
|
2850
2871
|
let t = e.indexOf("\n", r);
|
|
@@ -2853,7 +2874,7 @@ function ni(e, t) {
|
|
|
2853
2874
|
let i = e.indexOf("export const registerRoutes");
|
|
2854
2875
|
return i === -1 ? e : e.slice(0, i) + n + "\n\n" + e.slice(i);
|
|
2855
2876
|
}
|
|
2856
|
-
function
|
|
2877
|
+
function oi(e, t) {
|
|
2857
2878
|
let n = `.route("${t.prefix}", ${t.import})`, r = e.match(/\.route\([^)]+\);/g);
|
|
2858
2879
|
if (r) {
|
|
2859
2880
|
let t = r[r.length - 1], i = e.lastIndexOf(t) + t.length - 1;
|
|
@@ -2861,14 +2882,14 @@ function ri(e, t) {
|
|
|
2861
2882
|
}
|
|
2862
2883
|
return e.replace("return app;", `return app\n ${n};`);
|
|
2863
2884
|
}
|
|
2864
|
-
async function
|
|
2885
|
+
async function si(e, t, n) {
|
|
2865
2886
|
let r = T.resolve(n, Z("{{backend.root}}", t), "src/context.ts");
|
|
2866
2887
|
if (!await Y(r)) return;
|
|
2867
2888
|
let i = await y.readFile(r, "utf-8");
|
|
2868
|
-
for (let t of e) i.includes(`export let ${t.export}`) || (i =
|
|
2889
|
+
for (let t of e) i.includes(`export let ${t.export}`) || (i = ci(i, t), i = li(i, t), i = ui(i, t), i = fi(i, t));
|
|
2869
2890
|
await y.writeFile(r, i, "utf-8");
|
|
2870
2891
|
}
|
|
2871
|
-
function
|
|
2892
|
+
function ci(e, t) {
|
|
2872
2893
|
let n = `import { ${t.typeImport.name} } from "${t.typeImport.from}";`;
|
|
2873
2894
|
if (e.includes(`from "${t.typeImport.from}"`)) return e;
|
|
2874
2895
|
let r = e.lastIndexOf("import ");
|
|
@@ -2876,7 +2897,7 @@ function ai(e, t) {
|
|
|
2876
2897
|
let i = e.indexOf("\n", e.indexOf(";", r));
|
|
2877
2898
|
return i === -1 ? e + "\n" + n : e.slice(0, i + 1) + n + "\n" + e.slice(i + 1);
|
|
2878
2899
|
}
|
|
2879
|
-
function
|
|
2900
|
+
function li(e, t) {
|
|
2880
2901
|
let n = `export let ${t.export}: ${t.type};`, r = e.lastIndexOf("export let ");
|
|
2881
2902
|
if (r === -1) {
|
|
2882
2903
|
let t = e.indexOf("export const setupContext");
|
|
@@ -2885,15 +2906,15 @@ function oi(e, t) {
|
|
|
2885
2906
|
let i = e.indexOf("\n", r);
|
|
2886
2907
|
return i === -1 ? e + "\n" + n : e.slice(0, i + 1) + n + "\n" + e.slice(i + 1);
|
|
2887
2908
|
}
|
|
2888
|
-
function
|
|
2909
|
+
function ui(e, t) {
|
|
2889
2910
|
let n = ` ${t.export} = ${t.init};`, r = e.match(/export const setupContext\s*=\s*async\s*\([^)]*\)\s*=>\s*\{/);
|
|
2890
2911
|
if (!r) return e;
|
|
2891
2912
|
let i = e.indexOf("{", e.indexOf(r[0]));
|
|
2892
2913
|
if (i === -1) return e;
|
|
2893
|
-
let a =
|
|
2914
|
+
let a = di(e, i);
|
|
2894
2915
|
return a === -1 ? e : e.slice(0, a) + n + "\n" + e.slice(a);
|
|
2895
2916
|
}
|
|
2896
|
-
function
|
|
2917
|
+
function di(e, t) {
|
|
2897
2918
|
let n = 0;
|
|
2898
2919
|
for (let r = t; r < e.length; r++) {
|
|
2899
2920
|
let t = e[r];
|
|
@@ -2902,20 +2923,20 @@ function ci(e, t) {
|
|
|
2902
2923
|
}
|
|
2903
2924
|
return -1;
|
|
2904
2925
|
}
|
|
2905
|
-
function
|
|
2926
|
+
function fi(e, t) {
|
|
2906
2927
|
let n = ` ${t.export}: ${t.type};`, r = e.indexOf("export type ContextVariables = {");
|
|
2907
2928
|
if (r === -1) return e;
|
|
2908
2929
|
let i = e.indexOf("};", r);
|
|
2909
2930
|
return i === -1 ? e : e.slice(0, i) + n + "\n" + e.slice(i);
|
|
2910
2931
|
}
|
|
2911
|
-
async function
|
|
2932
|
+
async function pi(e, t, n) {
|
|
2912
2933
|
let r = T.resolve(n, Z("{{enums.src}}", t), "index.ts");
|
|
2913
2934
|
if (!await Y(r)) return;
|
|
2914
2935
|
let i = await y.readFile(r, "utf-8");
|
|
2915
|
-
for (let t of e) i.includes(`from "${t.from}"`) || (i =
|
|
2936
|
+
for (let t of e) i.includes(`from "${t.from}"`) || (i = mi(i, t));
|
|
2916
2937
|
await y.writeFile(r, i, "utf-8");
|
|
2917
2938
|
}
|
|
2918
|
-
function
|
|
2939
|
+
function mi(e, t) {
|
|
2919
2940
|
let n = `export * from "${t.from}";`, r = e.lastIndexOf("export * from");
|
|
2920
2941
|
if (r !== -1) {
|
|
2921
2942
|
let t = e.indexOf("\n", r);
|
|
@@ -2923,14 +2944,14 @@ function di(e, t) {
|
|
|
2923
2944
|
}
|
|
2924
2945
|
return e.trim() === "" ? n + "\n" : e.trimEnd() + "\n" + n + "\n";
|
|
2925
2946
|
}
|
|
2926
|
-
async function
|
|
2947
|
+
async function hi(e, t, n) {
|
|
2927
2948
|
let r = Z("{{backend.root}}", t), i = T.resolve(n, r, "src/sockets/index.ts");
|
|
2928
2949
|
if (!await Y(i)) return;
|
|
2929
2950
|
let a = await y.readFile(i, "utf-8");
|
|
2930
|
-
for (let t of e) a.includes(`from "${t.from}"`) || (a =
|
|
2931
|
-
await Y(T.resolve(n, r, "src/libs/websocket/ws-authenticate.ts")) && (a =
|
|
2951
|
+
for (let t of e) a.includes(`from "${t.from}"`) || (a = gi(a, t), a = _i(a, t));
|
|
2952
|
+
await Y(T.resolve(n, r, "src/libs/websocket/ws-authenticate.ts")) && (a = vi(a)), await y.writeFile(i, a, "utf-8");
|
|
2932
2953
|
}
|
|
2933
|
-
function
|
|
2954
|
+
function gi(e, t) {
|
|
2934
2955
|
let n = `import { ${t.import} } from "${t.from}";`, r = e.lastIndexOf("from \"./");
|
|
2935
2956
|
if (r !== -1) {
|
|
2936
2957
|
let t = e.indexOf("\n", r);
|
|
@@ -2939,7 +2960,7 @@ function pi(e, t) {
|
|
|
2939
2960
|
let i = e.indexOf("const sockets");
|
|
2940
2961
|
return i === -1 ? e : e.slice(0, i) + n + "\n\n" + e.slice(i);
|
|
2941
2962
|
}
|
|
2942
|
-
function
|
|
2963
|
+
function _i(e, t) {
|
|
2943
2964
|
let n = `.socket("${t.prefix}", ${t.import})`, r = e.indexOf("const sockets");
|
|
2944
2965
|
if (r === -1) return e;
|
|
2945
2966
|
let i = e.indexOf("new SocketRouter", r);
|
|
@@ -2953,7 +2974,7 @@ function mi(e, t) {
|
|
|
2953
2974
|
}
|
|
2954
2975
|
return e;
|
|
2955
2976
|
}
|
|
2956
|
-
function
|
|
2977
|
+
function vi(e) {
|
|
2957
2978
|
if (e.includes("wsAuthenticate")) return e;
|
|
2958
2979
|
let t = e.indexOf("from \"@backend/libs/websocket/socket-router\""), n = e;
|
|
2959
2980
|
if (t !== -1) {
|
|
@@ -2962,14 +2983,14 @@ function hi(e) {
|
|
|
2962
2983
|
}
|
|
2963
2984
|
return n.replace("new SocketRouter()", "new SocketRouter({ authenticate: wsAuthenticate })");
|
|
2964
2985
|
}
|
|
2965
|
-
async function
|
|
2986
|
+
async function yi(e, t, n) {
|
|
2966
2987
|
let r = Z("{{frontend.root}}", t), i = T.resolve(n, r, "src/api/sdk.ts");
|
|
2967
2988
|
if (!await Y(i)) return;
|
|
2968
2989
|
let a = await y.readFile(i, "utf-8");
|
|
2969
|
-
for (let t of e) a.includes(`.$configure(${t.import})`) || (a =
|
|
2990
|
+
for (let t of e) a.includes(`.$configure(${t.import})`) || (a = bi(a, t), a = xi(a, t));
|
|
2970
2991
|
await y.writeFile(i, a, "utf-8");
|
|
2971
2992
|
}
|
|
2972
|
-
function
|
|
2993
|
+
function bi(e, t) {
|
|
2973
2994
|
let n = `import { ${t.import} } from "${t.from}";`;
|
|
2974
2995
|
if (e.includes(n)) return e;
|
|
2975
2996
|
let r = e.lastIndexOf("from \"./");
|
|
@@ -2980,20 +3001,20 @@ function _i(e, t) {
|
|
|
2980
3001
|
let i = e.indexOf("export const sdk");
|
|
2981
3002
|
return i === -1 ? e : e.slice(0, i) + n + "\n\n" + e.slice(i);
|
|
2982
3003
|
}
|
|
2983
|
-
function
|
|
3004
|
+
function xi(e, t) {
|
|
2984
3005
|
let n = `.$configure(${t.import})`, r = e.indexOf("export const sdk");
|
|
2985
3006
|
if (r === -1) return e;
|
|
2986
3007
|
let i = e.indexOf(";", r);
|
|
2987
3008
|
return i === -1 ? e : e.slice(0, i) + "\n " + n + e.slice(i);
|
|
2988
3009
|
}
|
|
2989
|
-
async function
|
|
3010
|
+
async function Si(e, t, n) {
|
|
2990
3011
|
let r = T.resolve(n, Z("{{backend.utils}}", t), "frontend-url/frontend-url.ts");
|
|
2991
3012
|
if (!await Y(r)) return;
|
|
2992
3013
|
let i = await y.readFile(r, "utf-8");
|
|
2993
|
-
for (let t of e) i.includes(`"${t.path}"`) || (i =
|
|
3014
|
+
for (let t of e) i.includes(`"${t.path}"`) || (i = Ci(i, t));
|
|
2994
3015
|
await y.writeFile(r, i, "utf-8");
|
|
2995
3016
|
}
|
|
2996
|
-
function
|
|
3017
|
+
function Ci(e, t) {
|
|
2997
3018
|
let n = ` "${t.path}": ${t.search};`, r = e.indexOf("type RouteDefinitions = {");
|
|
2998
3019
|
if (r === -1) return e;
|
|
2999
3020
|
let i = e.indexOf("{", r);
|
|
@@ -3009,40 +3030,40 @@ function bi(e, t) {
|
|
|
3009
3030
|
}
|
|
3010
3031
|
return o === -1 ? e : e.slice(0, o) + n + "\n" + e.slice(o);
|
|
3011
3032
|
}
|
|
3012
|
-
var
|
|
3033
|
+
var wi = "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", Ti = {
|
|
3013
3034
|
primary: "primaryNav",
|
|
3014
3035
|
secondary: "secondaryNav",
|
|
3015
3036
|
tertiary: "tertiaryNav",
|
|
3016
3037
|
settings: "settingsNav"
|
|
3017
|
-
},
|
|
3018
|
-
async function
|
|
3019
|
-
let { entries: t, paths: n, projectRoot: r, slot: i = "frontend", override: a = !1 } = e, o =
|
|
3020
|
-
await Y(s) ? c = await y.readFile(s, "utf-8") : (await y.mkdir(T.dirname(s), { recursive: !0 }), c =
|
|
3021
|
-
for (let e of t) !a && c.includes(`label: "${e.label}"`) || (c =
|
|
3022
|
-
if (a) for (let e of t) c.includes(`label: "${e.label}"`) && (c =
|
|
3023
|
-
for (let e of t)
|
|
3024
|
-
for (let e of t.toReversed())
|
|
3038
|
+
}, Ei = new Set(["primary", "secondary"]);
|
|
3039
|
+
async function Di(e) {
|
|
3040
|
+
let { entries: t, paths: n, projectRoot: r, slot: i = "frontend", override: a = !1 } = e, o = Zr(i, n), s = T.resolve(r, o, "src/constants/nav.constants.ts"), c;
|
|
3041
|
+
await Y(s) ? c = await y.readFile(s, "utf-8") : (await y.mkdir(T.dirname(s), { recursive: !0 }), c = wi);
|
|
3042
|
+
for (let e of t) !a && c.includes(`label: "${e.label}"`) || (c = Ai(c, e));
|
|
3043
|
+
if (a) for (let e of t) c.includes(`label: "${e.label}"`) && (c = Pi(c, e));
|
|
3044
|
+
for (let e of t) Ei.has(e.group) && (c.includes(`label: "${e.label}"`) || (c = Mi(c, e, "append")));
|
|
3045
|
+
for (let e of t.toReversed()) Ei.has(e.group) || c.includes(`label: "${e.label}"`) || (c = Mi(c, e, "prepend"));
|
|
3025
3046
|
await y.writeFile(s, c, "utf-8");
|
|
3026
3047
|
}
|
|
3027
|
-
async function
|
|
3028
|
-
let { postLoginRedirect: t, paths: n, projectRoot: r, slot: i = "frontend" } = e, a =
|
|
3048
|
+
async function Oi(e) {
|
|
3049
|
+
let { postLoginRedirect: t, paths: n, projectRoot: r, slot: i = "frontend" } = e, a = Zr(i, n), o = T.resolve(r, a, "src/features/auth/constants/auth.constants.ts");
|
|
3029
3050
|
if (!await Y(o)) return;
|
|
3030
3051
|
let s = await y.readFile(o, "utf-8"), c = /export const POST_LOGIN_REDIRECT_PATH = "[^"]*";/;
|
|
3031
3052
|
if (!c.test(s)) return;
|
|
3032
3053
|
let l = s.replace(c, `export const POST_LOGIN_REDIRECT_PATH = "${t}";`);
|
|
3033
3054
|
await y.writeFile(o, l, "utf-8");
|
|
3034
3055
|
}
|
|
3035
|
-
function
|
|
3056
|
+
function ki(e) {
|
|
3036
3057
|
let t = [e.icon];
|
|
3037
3058
|
if (e.items) for (let n of e.items) t.includes(n.icon) || t.push(n.icon);
|
|
3038
3059
|
return t;
|
|
3039
3060
|
}
|
|
3040
|
-
function
|
|
3041
|
-
let n =
|
|
3042
|
-
for (let e of n) r =
|
|
3061
|
+
function Ai(e, t) {
|
|
3062
|
+
let n = ki(t), r = e;
|
|
3063
|
+
for (let e of n) r = ji(r, e);
|
|
3043
3064
|
return r;
|
|
3044
3065
|
}
|
|
3045
|
-
function
|
|
3066
|
+
function ji(e, t) {
|
|
3046
3067
|
let n = e.match(/import \{([^}]+)\} from "lucide-react";/);
|
|
3047
3068
|
if (!n) return e;
|
|
3048
3069
|
let r = n[1].split(",").map((e) => e.trim()).filter(Boolean);
|
|
@@ -3050,31 +3071,31 @@ function Oi(e, t) {
|
|
|
3050
3071
|
let i = r.findIndex((e) => e.startsWith("type "));
|
|
3051
3072
|
return i === -1 ? r.push(t) : r.splice(i, 0, t), e.replace(n[0], `import { ${r.join(", ")} } from "lucide-react";`);
|
|
3052
3073
|
}
|
|
3053
|
-
function
|
|
3054
|
-
let r =
|
|
3074
|
+
function Mi(e, t, n) {
|
|
3075
|
+
let r = Ti[t.group];
|
|
3055
3076
|
if (!r) return e;
|
|
3056
|
-
let i =
|
|
3077
|
+
let i = Fi(t), a = RegExp(`export const ${r}: NavEntry\\[\\] = \\[`), o = e.match(a);
|
|
3057
3078
|
if (!o) return e;
|
|
3058
|
-
let s = e.indexOf(o[0]) + o[0].length, c =
|
|
3079
|
+
let s = e.indexOf(o[0]) + o[0].length, c = Ni(e, s - 1);
|
|
3059
3080
|
return c === -1 ? e : e.slice(s, c).trim() === "" ? e.slice(0, s) + "\n" + i + "\n" + e.slice(s) : n === "append" ? e.slice(0, c) + i + "\n" + e.slice(c) : e.slice(0, s) + "\n" + i + e.slice(s);
|
|
3060
3081
|
}
|
|
3061
|
-
function
|
|
3082
|
+
function Ni(e, t) {
|
|
3062
3083
|
let n = 0;
|
|
3063
3084
|
for (let r = t; r < e.length; r++) if (e[r] === "[") n++;
|
|
3064
3085
|
else if (e[r] === "]" && (n--, n === 0)) return r;
|
|
3065
3086
|
return -1;
|
|
3066
3087
|
}
|
|
3067
|
-
function
|
|
3088
|
+
function Pi(e, t) {
|
|
3068
3089
|
let n = e.indexOf(`label: "${t.label}"`);
|
|
3069
3090
|
if (n === -1) return e;
|
|
3070
3091
|
let r = e.lastIndexOf("{", n);
|
|
3071
3092
|
if (r === -1) return e;
|
|
3072
|
-
let i =
|
|
3093
|
+
let i = di(e, r);
|
|
3073
3094
|
if (i === -1) return e;
|
|
3074
|
-
let a =
|
|
3095
|
+
let a = Fi(t).trimStart().replace(/,\s*$/, "");
|
|
3075
3096
|
return e.slice(0, r) + a + e.slice(i + 1);
|
|
3076
3097
|
}
|
|
3077
|
-
function
|
|
3098
|
+
function Fi(e) {
|
|
3078
3099
|
let t = [];
|
|
3079
3100
|
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) {
|
|
3080
3101
|
t.push(" items: [");
|
|
@@ -3090,14 +3111,14 @@ function Mi(e) {
|
|
|
3090
3111
|
} else t.push(" items: [],");
|
|
3091
3112
|
return t.push(" },"), t.join("\n");
|
|
3092
3113
|
}
|
|
3093
|
-
async function
|
|
3114
|
+
async function Ii(e, t, n) {
|
|
3094
3115
|
let r = Z("{{backend.features}}", t), i = T.resolve(n, r, "organizations/modules/setup-organization/steps/index.ts");
|
|
3095
3116
|
if (!await Y(i)) return;
|
|
3096
3117
|
let a = await y.readFile(i, "utf-8");
|
|
3097
|
-
for (let t of e) a.includes(`from "${t.from}"`) || (a =
|
|
3118
|
+
for (let t of e) a.includes(`from "${t.from}"`) || (a = Li(a, t), a = Ri(a, t));
|
|
3098
3119
|
await y.writeFile(i, a, "utf-8");
|
|
3099
3120
|
}
|
|
3100
|
-
function
|
|
3121
|
+
function Li(e, t) {
|
|
3101
3122
|
let n = `import { ${t.import} } from "${t.from}";`, r = e.lastIndexOf("import ");
|
|
3102
3123
|
if (r !== -1) {
|
|
3103
3124
|
let t = e.indexOf("\n", e.indexOf(";", r));
|
|
@@ -3105,38 +3126,38 @@ function Pi(e, t) {
|
|
|
3105
3126
|
}
|
|
3106
3127
|
return e.indexOf("type "), n + "\n\n" + e;
|
|
3107
3128
|
}
|
|
3108
|
-
function
|
|
3129
|
+
function Ri(e, t) {
|
|
3109
3130
|
let n = ` { id: "${t.id}", execute: (ctx) => ${t.import}(ctx) },`, r = e.match(/export const steps:\s*Step\[\]\s*=\s*\[/);
|
|
3110
3131
|
if (!r) return e;
|
|
3111
|
-
let i = e.indexOf(r[0]) + r[0].length, a =
|
|
3132
|
+
let i = e.indexOf(r[0]) + r[0].length, a = zi(e, i - 1);
|
|
3112
3133
|
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);
|
|
3113
3134
|
}
|
|
3114
|
-
function
|
|
3135
|
+
function zi(e, t) {
|
|
3115
3136
|
let n = 0;
|
|
3116
3137
|
for (let r = t; r < e.length; r++) if (e[r] === "[") n++;
|
|
3117
3138
|
else if (e[r] === "]" && (n--, n === 0)) return r;
|
|
3118
3139
|
return -1;
|
|
3119
3140
|
}
|
|
3120
|
-
var
|
|
3121
|
-
async function
|
|
3122
|
-
await
|
|
3141
|
+
var Bi = "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";
|
|
3142
|
+
async function Vi(e) {
|
|
3143
|
+
await Ui({
|
|
3123
3144
|
...e,
|
|
3124
3145
|
arrayName: "navbarActions"
|
|
3125
3146
|
});
|
|
3126
3147
|
}
|
|
3127
|
-
async function
|
|
3128
|
-
await
|
|
3148
|
+
async function Hi(e) {
|
|
3149
|
+
await Ui({
|
|
3129
3150
|
...e,
|
|
3130
3151
|
arrayName: "userMenuActions"
|
|
3131
3152
|
});
|
|
3132
3153
|
}
|
|
3133
|
-
async function
|
|
3134
|
-
let a =
|
|
3135
|
-
await Y(o) ? s = await y.readFile(o, "utf-8") : (await y.mkdir(T.dirname(o), { recursive: !0 }), s =
|
|
3136
|
-
for (let n of e) s =
|
|
3154
|
+
async function Ui({ actions: e, arrayName: t, paths: n, projectRoot: r, slot: i }) {
|
|
3155
|
+
let a = Zr(i, n), o = T.resolve(r, a, "src/constants/navbar-actions.tsx"), s;
|
|
3156
|
+
await Y(o) ? s = await y.readFile(o, "utf-8") : (await y.mkdir(T.dirname(o), { recursive: !0 }), s = Bi);
|
|
3157
|
+
for (let n of e) s = Wi(s, n), s = Gi(s, n, t);
|
|
3137
3158
|
await y.writeFile(o, s, "utf-8");
|
|
3138
3159
|
}
|
|
3139
|
-
function
|
|
3160
|
+
function Wi(e, t) {
|
|
3140
3161
|
let n = `import { ${t.import} } from "${t.from}";`;
|
|
3141
3162
|
if (e.includes(n)) return e;
|
|
3142
3163
|
let r = e.lastIndexOf("import ");
|
|
@@ -3144,38 +3165,38 @@ function Vi(e, t) {
|
|
|
3144
3165
|
let i = e.indexOf("\n", r);
|
|
3145
3166
|
return i === -1 ? e + "\n" + n : e.slice(0, i + 1) + n + "\n" + e.slice(i + 1);
|
|
3146
3167
|
}
|
|
3147
|
-
function
|
|
3168
|
+
function Gi(e, t, n) {
|
|
3148
3169
|
let r = e.match(RegExp(`export const ${n}:\\s*NavbarAction\\[\\]\\s*=\\s*\\[`));
|
|
3149
3170
|
if (!r) return e;
|
|
3150
|
-
let i = e.indexOf(r[0]) + r[0].length, a =
|
|
3171
|
+
let i = e.indexOf(r[0]) + r[0].length, a = Ki(e, i - 1);
|
|
3151
3172
|
if (a === -1) return e;
|
|
3152
3173
|
let o = e.slice(i, a);
|
|
3153
3174
|
if (o.includes(`id: "${t.id}"`)) return e;
|
|
3154
3175
|
let s = ` { id: "${t.id}", component: ${t.import} },`;
|
|
3155
3176
|
return o.trim() === "" ? e.slice(0, a) + "\n" + s + "\n" + e.slice(a) : e.slice(0, a) + s + "\n" + e.slice(a);
|
|
3156
3177
|
}
|
|
3157
|
-
function
|
|
3178
|
+
function Ki(e, t) {
|
|
3158
3179
|
let n = 0;
|
|
3159
3180
|
for (let r = t; r < e.length; r++) if (e[r] === "[") n++;
|
|
3160
3181
|
else if (e[r] === "]" && (n--, n === 0)) return r;
|
|
3161
3182
|
return -1;
|
|
3162
3183
|
}
|
|
3163
|
-
var
|
|
3184
|
+
var qi = new Set([
|
|
3164
3185
|
".ts",
|
|
3165
3186
|
".tsx",
|
|
3166
3187
|
".js",
|
|
3167
3188
|
".jsx"
|
|
3168
3189
|
]);
|
|
3169
|
-
async function
|
|
3190
|
+
async function Ji(e) {
|
|
3170
3191
|
let { files: t, paths: n, projectRoot: r, projectName: i } = e;
|
|
3171
3192
|
if (i === "hype-stack") return;
|
|
3172
3193
|
let a = `@${i}/`;
|
|
3173
3194
|
await Promise.all(t.map(async (e) => {
|
|
3174
|
-
let t =
|
|
3175
|
-
i?.isDirectory() ? await
|
|
3195
|
+
let t = Ur(e.target, n, r), i = await y.stat(t).catch(() => null);
|
|
3196
|
+
i?.isDirectory() ? await Zi(t, a) : i?.isFile() && qi.has(T.extname(t)) && await Qi(t, a);
|
|
3176
3197
|
}));
|
|
3177
3198
|
}
|
|
3178
|
-
var
|
|
3199
|
+
var Yi = new Set([
|
|
3179
3200
|
".git",
|
|
3180
3201
|
"node_modules",
|
|
3181
3202
|
"dist",
|
|
@@ -3184,43 +3205,43 @@ var Ki = new Set([
|
|
|
3184
3205
|
".next",
|
|
3185
3206
|
"coverage"
|
|
3186
3207
|
]);
|
|
3187
|
-
async function
|
|
3188
|
-
t !== "hype-stack" && await
|
|
3208
|
+
async function Xi(e, t) {
|
|
3209
|
+
t !== "hype-stack" && await Zi(e, `@${t}/`);
|
|
3189
3210
|
}
|
|
3190
|
-
async function
|
|
3211
|
+
async function Zi(e, t) {
|
|
3191
3212
|
let n = await y.readdir(e, { withFileTypes: !0 });
|
|
3192
3213
|
await Promise.all(n.map(async (n) => {
|
|
3193
3214
|
let r = T.join(e, n.name);
|
|
3194
3215
|
if (n.isDirectory()) {
|
|
3195
|
-
if (
|
|
3196
|
-
await
|
|
3197
|
-
} else n.isFile() &&
|
|
3216
|
+
if (Yi.has(n.name)) return;
|
|
3217
|
+
await Zi(r, t);
|
|
3218
|
+
} else n.isFile() && qi.has(T.extname(n.name)) && await Qi(r, t);
|
|
3198
3219
|
}));
|
|
3199
3220
|
}
|
|
3200
|
-
async function
|
|
3221
|
+
async function Qi(e, t) {
|
|
3201
3222
|
let n = await y.readFile(e, "utf-8");
|
|
3202
|
-
if (!n.includes(
|
|
3203
|
-
let r =
|
|
3223
|
+
if (!n.includes(Jr)) return;
|
|
3224
|
+
let r = Xr(n, t);
|
|
3204
3225
|
r !== n && await y.writeFile(e, r, "utf-8");
|
|
3205
3226
|
}
|
|
3206
3227
|
//#endregion
|
|
3207
3228
|
//#region src/core/installer.ts
|
|
3208
|
-
function
|
|
3229
|
+
function $i(e, t) {
|
|
3209
3230
|
return e.slot ? t ? t.includes(e.slot) : e.slot === "frontend" : !0;
|
|
3210
3231
|
}
|
|
3211
|
-
async function
|
|
3232
|
+
async function ea(e, t) {
|
|
3212
3233
|
if ((await y.stat(e)).isDirectory()) {
|
|
3213
3234
|
await y.mkdir(t, { recursive: !0 });
|
|
3214
3235
|
let n = await y.readdir(e, { withFileTypes: !0 });
|
|
3215
|
-
for (let r of n) await
|
|
3236
|
+
for (let r of n) await ea(T.join(e, r.name), T.join(t, r.name));
|
|
3216
3237
|
} else await y.mkdir(T.dirname(t), { recursive: !0 }), await y.copyFile(e, t);
|
|
3217
3238
|
}
|
|
3218
|
-
async function
|
|
3239
|
+
async function ta(e) {
|
|
3219
3240
|
let { src: t, dest: n, projectRoot: r, skip: i } = e;
|
|
3220
3241
|
if ((await y.stat(t)).isDirectory()) {
|
|
3221
3242
|
await y.mkdir(n, { recursive: !0 });
|
|
3222
3243
|
let e = await y.readdir(t, { withFileTypes: !0 });
|
|
3223
|
-
return (await Promise.all(e.map((e) =>
|
|
3244
|
+
return (await Promise.all(e.map((e) => ta({
|
|
3224
3245
|
src: T.join(t, e.name),
|
|
3225
3246
|
dest: T.join(n, e.name),
|
|
3226
3247
|
projectRoot: r,
|
|
@@ -3229,8 +3250,8 @@ async function Qi(e) {
|
|
|
3229
3250
|
}
|
|
3230
3251
|
return i.has(t) ? [] : (await y.mkdir(T.dirname(n), { recursive: !0 }), await y.copyFile(t, n), [T.relative(r, n)]);
|
|
3231
3252
|
}
|
|
3232
|
-
async function
|
|
3233
|
-
let { file: t, packDir: n, paths: r, projectRoot: i } = e, a =
|
|
3253
|
+
async function na(e) {
|
|
3254
|
+
let { file: t, packDir: n, paths: r, projectRoot: i } = e, a = Wr(t.source, n), o = Ur(t.target, r, i);
|
|
3234
3255
|
return {
|
|
3235
3256
|
sourcePath: a,
|
|
3236
3257
|
targetPath: o,
|
|
@@ -3238,8 +3259,8 @@ async function $i(e) {
|
|
|
3238
3259
|
targetExists: await Y(o) || await lr(o)
|
|
3239
3260
|
};
|
|
3240
3261
|
}
|
|
3241
|
-
async function
|
|
3242
|
-
let { file: t, packDir: n, paths: r, projectRoot: i } = e, { sourcePath: a, targetPath: o, sourceExists: s, targetExists: c } = await
|
|
3262
|
+
async function ra(e) {
|
|
3263
|
+
let { file: t, packDir: n, paths: r, projectRoot: i } = e, { sourcePath: a, targetPath: o, sourceExists: s, targetExists: c } = await na({
|
|
3243
3264
|
file: t,
|
|
3244
3265
|
packDir: n,
|
|
3245
3266
|
paths: r,
|
|
@@ -3254,8 +3275,8 @@ async function ea(e) {
|
|
|
3254
3275
|
default: return `${t.target}: Unknown strategy: ${String(t.strategy)}`;
|
|
3255
3276
|
}
|
|
3256
3277
|
}
|
|
3257
|
-
async function
|
|
3258
|
-
let { file: t, packDir: n, paths: r, projectRoot: i, force: a, overwrite: o } = e, { sourcePath: s, targetPath: c, sourceExists: l, targetExists: u } = await
|
|
3278
|
+
async function ia(e) {
|
|
3279
|
+
let { file: t, packDir: n, paths: r, projectRoot: i, force: a, overwrite: o } = e, { sourcePath: s, targetPath: c, sourceExists: l, targetExists: u } = await na({
|
|
3259
3280
|
file: t,
|
|
3260
3281
|
packDir: n,
|
|
3261
3282
|
paths: r,
|
|
@@ -3273,7 +3294,7 @@ async function ta(e) {
|
|
|
3273
3294
|
status: "skipped",
|
|
3274
3295
|
path: t.target,
|
|
3275
3296
|
reason: "Already exists"
|
|
3276
|
-
} : (await
|
|
3297
|
+
} : (await ea(s, c), {
|
|
3277
3298
|
status: "installed",
|
|
3278
3299
|
path: t.target
|
|
3279
3300
|
});
|
|
@@ -3282,16 +3303,16 @@ async function ta(e) {
|
|
|
3282
3303
|
status: "skipped",
|
|
3283
3304
|
path: t.target,
|
|
3284
3305
|
reason: "Already exists (skip-if-exists)"
|
|
3285
|
-
} : (await
|
|
3306
|
+
} : (await ea(s, c), {
|
|
3286
3307
|
status: "installed",
|
|
3287
3308
|
path: t.target
|
|
3288
3309
|
});
|
|
3289
|
-
case "override": return await
|
|
3310
|
+
case "override": return await ea(s, c), {
|
|
3290
3311
|
status: "installed",
|
|
3291
3312
|
path: t.target
|
|
3292
3313
|
};
|
|
3293
3314
|
case "merge": {
|
|
3294
|
-
if (!u) return await
|
|
3315
|
+
if (!u) return await ea(s, c), {
|
|
3295
3316
|
status: "installed",
|
|
3296
3317
|
path: t.target
|
|
3297
3318
|
};
|
|
@@ -3321,15 +3342,15 @@ async function ta(e) {
|
|
|
3321
3342
|
};
|
|
3322
3343
|
}
|
|
3323
3344
|
}
|
|
3324
|
-
async function
|
|
3345
|
+
async function aa(e) {
|
|
3325
3346
|
let { packs: t, config: n, projectRoot: r, slotsByPack: i } = e, a = n.paths;
|
|
3326
3347
|
if (!a) throw Error("stack.json is missing 'paths' configuration. Run 'npx @hype-stack/cli init' to set it up.");
|
|
3327
3348
|
let o = [], s = /* @__PURE__ */ new Set();
|
|
3328
3349
|
for (let e of t) {
|
|
3329
3350
|
let t = i?.get(e.manifest.name);
|
|
3330
3351
|
for (let n of e.manifest.files) {
|
|
3331
|
-
if (n.strategy !== "create" ||
|
|
3332
|
-
let { targetPath: i, targetExists: c } = await
|
|
3352
|
+
if (n.strategy !== "create" || !$i(n, t)) continue;
|
|
3353
|
+
let { targetPath: i, targetExists: c } = await na({
|
|
3333
3354
|
file: n,
|
|
3334
3355
|
packDir: e.packDir,
|
|
3335
3356
|
paths: a,
|
|
@@ -3344,13 +3365,13 @@ async function na(e) {
|
|
|
3344
3365
|
}
|
|
3345
3366
|
return o;
|
|
3346
3367
|
}
|
|
3347
|
-
async function
|
|
3368
|
+
async function oa(e) {
|
|
3348
3369
|
let { manifest: t, config: n, projectRoot: r, force: i, packDir: a, slots: o } = e, s = n.paths;
|
|
3349
3370
|
if (!s) throw Error("stack.json is missing 'paths' configuration. Run 'npx @hype-stack/cli init' to set it up.");
|
|
3350
3371
|
let c = [];
|
|
3351
3372
|
for (let e of t.files) {
|
|
3352
|
-
if (
|
|
3353
|
-
let t = await
|
|
3373
|
+
if (!$i(e, o)) continue;
|
|
3374
|
+
let t = await ra({
|
|
3354
3375
|
file: e,
|
|
3355
3376
|
packDir: a,
|
|
3356
3377
|
paths: s,
|
|
@@ -3361,16 +3382,16 @@ async function ra(e) {
|
|
|
3361
3382
|
}
|
|
3362
3383
|
return c;
|
|
3363
3384
|
}
|
|
3364
|
-
async function
|
|
3385
|
+
async function sa(e) {
|
|
3365
3386
|
let { manifest: t, config: n, projectRoot: r, force: i, overwrite: a, packDir: o, slots: s } = e, c = n.paths;
|
|
3366
3387
|
if (!c) throw Error("stack.json is missing 'paths' configuration. Run 'npx @hype-stack/cli init' to set it up.");
|
|
3367
3388
|
let l = {
|
|
3368
3389
|
installed: [],
|
|
3369
3390
|
skipped: [],
|
|
3370
3391
|
errors: []
|
|
3371
|
-
}, u = t.files.filter((e) =>
|
|
3392
|
+
}, u = t.files.filter((e) => $i(e, s));
|
|
3372
3393
|
for (let e of u) {
|
|
3373
|
-
let t = await
|
|
3394
|
+
let t = await ia({
|
|
3374
3395
|
file: e,
|
|
3375
3396
|
packDir: o,
|
|
3376
3397
|
paths: c,
|
|
@@ -3390,40 +3411,40 @@ async function ia(e) {
|
|
|
3390
3411
|
break;
|
|
3391
3412
|
}
|
|
3392
3413
|
}
|
|
3393
|
-
await
|
|
3414
|
+
await Ji({
|
|
3394
3415
|
files: u,
|
|
3395
3416
|
paths: c,
|
|
3396
3417
|
projectRoot: r,
|
|
3397
3418
|
projectName: n.name
|
|
3398
|
-
}), t.env && t.env.length > 0 && await
|
|
3419
|
+
}), t.env && t.env.length > 0 && await Qr(t.env, c, r), t.routes && t.routes.length > 0 && await ii(t.routes, c, r), t.context && t.context.length > 0 && await si(t.context, c, r), t.sockets && t.sockets.length > 0 && await hi(t.sockets, c, r), t.sdkConfigurations && t.sdkConfigurations.length > 0 && await yi(t.sdkConfigurations, c, r), t.enums && t.enums.length > 0 && await pi(t.enums, c, r), t.frontendRoutes && t.frontendRoutes.length > 0 && await Si(t.frontendRoutes, c, r);
|
|
3399
3420
|
let d = s && s.length > 0 ? s : ["frontend"];
|
|
3400
|
-
for (let e of d) t.nav && t.nav.length > 0 && await
|
|
3421
|
+
for (let e of d) t.nav && t.nav.length > 0 && await Di({
|
|
3401
3422
|
entries: t.nav,
|
|
3402
3423
|
paths: c,
|
|
3403
3424
|
projectRoot: r,
|
|
3404
3425
|
slot: e
|
|
3405
|
-
}), t.navbarActions && t.navbarActions.length > 0 && await
|
|
3426
|
+
}), t.navbarActions && t.navbarActions.length > 0 && await Vi({
|
|
3406
3427
|
actions: t.navbarActions,
|
|
3407
3428
|
paths: c,
|
|
3408
3429
|
projectRoot: r,
|
|
3409
3430
|
slot: e
|
|
3410
|
-
}), t.userMenuActions && t.userMenuActions.length > 0 && await
|
|
3431
|
+
}), t.userMenuActions && t.userMenuActions.length > 0 && await Hi({
|
|
3411
3432
|
actions: t.userMenuActions,
|
|
3412
3433
|
paths: c,
|
|
3413
3434
|
projectRoot: r,
|
|
3414
3435
|
slot: e
|
|
3415
3436
|
});
|
|
3416
|
-
return t.onboardingSteps && t.onboardingSteps.length > 0 && await
|
|
3437
|
+
return t.onboardingSteps && t.onboardingSteps.length > 0 && await Ii(t.onboardingSteps, c, r), t.postLoginRedirect && await Oi({
|
|
3417
3438
|
postLoginRedirect: t.postLoginRedirect,
|
|
3418
3439
|
paths: c,
|
|
3419
3440
|
projectRoot: r,
|
|
3420
3441
|
slot: d[0]
|
|
3421
3442
|
}), l;
|
|
3422
3443
|
}
|
|
3423
|
-
async function
|
|
3444
|
+
async function ca(e) {
|
|
3424
3445
|
let { packs: t, config: n, projectRoot: r, force: i, overwrite: a, slotsByPack: o } = e, s = [];
|
|
3425
3446
|
for (let e of t) {
|
|
3426
|
-
let t = o?.get(e.manifest.name), a = await
|
|
3447
|
+
let t = o?.get(e.manifest.name), a = await oa({
|
|
3427
3448
|
manifest: e.manifest,
|
|
3428
3449
|
config: n,
|
|
3429
3450
|
projectRoot: r,
|
|
@@ -3443,7 +3464,7 @@ async function aa(e) {
|
|
|
3443
3464
|
};
|
|
3444
3465
|
let c = [], l = [], u = [], d = [], f = n;
|
|
3445
3466
|
for (let e of t) {
|
|
3446
|
-
let t = o?.get(e.manifest.name), n = await
|
|
3467
|
+
let t = o?.get(e.manifest.name), n = await sa({
|
|
3447
3468
|
manifest: e.manifest,
|
|
3448
3469
|
config: f,
|
|
3449
3470
|
projectRoot: r,
|
|
@@ -3452,7 +3473,7 @@ async function aa(e) {
|
|
|
3452
3473
|
packDir: e.packDir,
|
|
3453
3474
|
slots: t
|
|
3454
3475
|
});
|
|
3455
|
-
c.push(...n.installed), l.push(...n.skipped), u.push(...n.errors), f = await
|
|
3476
|
+
c.push(...n.installed), l.push(...n.skipped), u.push(...n.errors), f = await la(f, e.manifest, r), d.push(e.manifest.name);
|
|
3456
3477
|
}
|
|
3457
3478
|
return {
|
|
3458
3479
|
installed: c,
|
|
@@ -3463,8 +3484,8 @@ async function aa(e) {
|
|
|
3463
3484
|
config: f
|
|
3464
3485
|
};
|
|
3465
3486
|
}
|
|
3466
|
-
async function
|
|
3467
|
-
let r = typeof t == "string" ? t : t.name, i = typeof t == "string" ? [] :
|
|
3487
|
+
async function la(e, t, n) {
|
|
3488
|
+
let r = typeof t == "string" ? t : t.name, i = typeof t == "string" ? [] : Ar(t.env), a = jr([...e.onboarding?.envSections ?? [], ...i]), o = {
|
|
3468
3489
|
...e,
|
|
3469
3490
|
installedPacks: [...e.installedPacks ?? [], r],
|
|
3470
3491
|
onboarding: {
|
|
@@ -3472,19 +3493,19 @@ async function oa(e, t, n) {
|
|
|
3472
3493
|
envSections: a
|
|
3473
3494
|
}
|
|
3474
3495
|
};
|
|
3475
|
-
return await
|
|
3496
|
+
return await Ir(n, o), o;
|
|
3476
3497
|
}
|
|
3477
|
-
async function
|
|
3498
|
+
async function ua(e) {
|
|
3478
3499
|
let { manifest: t, config: n, projectRoot: r, templateDir: i } = e, a = n.paths;
|
|
3479
3500
|
if (!a) throw Error("stack.json is missing 'paths' configuration. Run 'npx @hype-stack/cli init' to set it up.");
|
|
3480
|
-
let o = [], s = [], c = t.files.filter((e) => e.strategy === "merge"), l = new Set(c.map((e) =>
|
|
3501
|
+
let o = [], s = [], c = t.files.filter((e) => e.strategy === "merge"), l = new Set(c.map((e) => Wr(e.source, i))), u = T.join(i, "files");
|
|
3481
3502
|
if (await lr(u)) {
|
|
3482
3503
|
let e = await y.readdir(u, { withFileTypes: !0 });
|
|
3483
3504
|
for (let t of e) {
|
|
3484
3505
|
if (!t.isDirectory()) continue;
|
|
3485
3506
|
let e = a[t.name]?.root;
|
|
3486
3507
|
if (!e) continue;
|
|
3487
|
-
let n = await
|
|
3508
|
+
let n = await ta({
|
|
3488
3509
|
src: T.join(u, t.name),
|
|
3489
3510
|
dest: T.resolve(r, e),
|
|
3490
3511
|
projectRoot: r,
|
|
@@ -3494,7 +3515,7 @@ async function sa(e) {
|
|
|
3494
3515
|
}
|
|
3495
3516
|
}
|
|
3496
3517
|
for (let e of c) {
|
|
3497
|
-
let t = await
|
|
3518
|
+
let t = await ia({
|
|
3498
3519
|
file: e,
|
|
3499
3520
|
packDir: i,
|
|
3500
3521
|
paths: a,
|
|
@@ -3504,13 +3525,13 @@ async function sa(e) {
|
|
|
3504
3525
|
});
|
|
3505
3526
|
t.status === "installed" ? o.push(t.path) : t.status === "error" && s.push(`${t.path}: ${t.reason}`);
|
|
3506
3527
|
}
|
|
3507
|
-
let d = T.join(
|
|
3508
|
-
return await Y(f) && await Y(p) && await y.rm(p, { force: !0 }), t.frontendRoutes && t.frontendRoutes.length > 0 && await
|
|
3528
|
+
let d = T.join(Ur("{{frontend.root}}", a, r), "src", "routes"), f = T.join(d, "(public)", "index.tsx"), p = T.join(d, "(private)", "index.tsx");
|
|
3529
|
+
return await Y(f) && await Y(p) && await y.rm(p, { force: !0 }), t.frontendRoutes && t.frontendRoutes.length > 0 && await Si(t.frontendRoutes, a, r), t.nav && t.nav.length > 0 && await Di({
|
|
3509
3530
|
entries: t.nav,
|
|
3510
3531
|
paths: a,
|
|
3511
3532
|
projectRoot: r,
|
|
3512
3533
|
override: !0
|
|
3513
|
-
}), t.postLoginRedirect && await
|
|
3534
|
+
}), t.postLoginRedirect && await Oi({
|
|
3514
3535
|
postLoginRedirect: t.postLoginRedirect,
|
|
3515
3536
|
paths: a,
|
|
3516
3537
|
projectRoot: r
|
|
@@ -3521,32 +3542,32 @@ async function sa(e) {
|
|
|
3521
3542
|
}
|
|
3522
3543
|
//#endregion
|
|
3523
3544
|
//#region src/core/pack-categories.ts
|
|
3524
|
-
var
|
|
3545
|
+
var da = [
|
|
3525
3546
|
"starter",
|
|
3526
3547
|
"layout",
|
|
3527
3548
|
"feature"
|
|
3528
|
-
],
|
|
3549
|
+
], fa = {
|
|
3529
3550
|
starter: "Starter",
|
|
3530
3551
|
layout: "Layout",
|
|
3531
3552
|
feature: "Features"
|
|
3532
|
-
},
|
|
3533
|
-
function
|
|
3553
|
+
}, pa = new Set(["starter", "layout"]), ma = "starter-saas-betterauth", ha = "layout-basic";
|
|
3554
|
+
function ga(e, t = {}) {
|
|
3534
3555
|
let n = [];
|
|
3535
|
-
for (let r of
|
|
3556
|
+
for (let r of da) {
|
|
3536
3557
|
let i = e.filter((e) => e.category === r);
|
|
3537
3558
|
if (i.length === 0) continue;
|
|
3538
|
-
let a =
|
|
3559
|
+
let a = pa.has(r) ? "single" : "multiple";
|
|
3539
3560
|
if (r === "layout") {
|
|
3540
|
-
n.push(
|
|
3561
|
+
n.push(va("frontend", i)), t.adminAvailable && n.push(va("admin", i));
|
|
3541
3562
|
continue;
|
|
3542
3563
|
}
|
|
3543
3564
|
if (r === "starter") {
|
|
3544
|
-
n.push(
|
|
3565
|
+
n.push(_a(i));
|
|
3545
3566
|
continue;
|
|
3546
3567
|
}
|
|
3547
3568
|
n.push({
|
|
3548
3569
|
category: r,
|
|
3549
|
-
label:
|
|
3570
|
+
label: fa[r],
|
|
3550
3571
|
mode: a,
|
|
3551
3572
|
packs: i,
|
|
3552
3573
|
preselect: null
|
|
@@ -3554,36 +3575,36 @@ function pa(e, t = {}) {
|
|
|
3554
3575
|
}
|
|
3555
3576
|
return n;
|
|
3556
3577
|
}
|
|
3557
|
-
function
|
|
3558
|
-
let t = e.some((e) => e.name ===
|
|
3578
|
+
function _a(e) {
|
|
3579
|
+
let t = e.some((e) => e.name === ma);
|
|
3559
3580
|
return {
|
|
3560
3581
|
category: "starter",
|
|
3561
|
-
label:
|
|
3582
|
+
label: fa.starter,
|
|
3562
3583
|
mode: "single",
|
|
3563
3584
|
packs: e,
|
|
3564
|
-
preselect: t ?
|
|
3585
|
+
preselect: t ? ma : null
|
|
3565
3586
|
};
|
|
3566
3587
|
}
|
|
3567
|
-
function
|
|
3568
|
-
let n = t.some((e) => e.name ===
|
|
3588
|
+
function va(e, t) {
|
|
3589
|
+
let n = t.some((e) => e.name === ha);
|
|
3569
3590
|
return {
|
|
3570
3591
|
category: "layout",
|
|
3571
3592
|
label: e === "admin" ? "Admin Layout" : "Layout",
|
|
3572
3593
|
mode: "single",
|
|
3573
3594
|
packs: t,
|
|
3574
|
-
preselect: n ?
|
|
3595
|
+
preselect: n ? ha : null,
|
|
3575
3596
|
slot: e
|
|
3576
3597
|
};
|
|
3577
3598
|
}
|
|
3578
3599
|
//#endregion
|
|
3579
3600
|
//#region src/core/post-setup.ts
|
|
3580
|
-
async function
|
|
3601
|
+
async function ya() {
|
|
3581
3602
|
return (await J("docker", ["info"], { cwd: process.cwd() })).exitCode === 0;
|
|
3582
3603
|
}
|
|
3583
|
-
async function
|
|
3604
|
+
async function ba(e) {
|
|
3584
3605
|
return Y(`${e}/apps/backend/.env`);
|
|
3585
3606
|
}
|
|
3586
|
-
async function
|
|
3607
|
+
async function xa(e, t, n) {
|
|
3587
3608
|
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 s.confirm({
|
|
3588
3609
|
message: r,
|
|
3589
3610
|
initialValue: !0
|
|
@@ -3596,32 +3617,32 @@ async function va(e, t, n) {
|
|
|
3596
3617
|
"up",
|
|
3597
3618
|
"-d"
|
|
3598
3619
|
], { cwd: `${e}/apps/backend` });
|
|
3599
|
-
return o.exitCode === 0 ? (a.stop(L.success("Docker services started")), !0) : (a.error("Failed to start Docker services"),
|
|
3620
|
+
return o.exitCode === 0 ? (a.stop(L.success("Docker services started")), !0) : (a.error("Failed to start Docker services"), Ea(o), !1);
|
|
3600
3621
|
}
|
|
3601
|
-
function
|
|
3622
|
+
function Sa(e) {
|
|
3602
3623
|
let t = (e.stderr || e.stdout).trim();
|
|
3603
3624
|
t && s.log.warn(L.muted(t));
|
|
3604
3625
|
}
|
|
3605
|
-
function
|
|
3626
|
+
function Ca(e) {
|
|
3606
3627
|
return /is already in use by container|Conflict\. The container name/i.test(e) ? "container" : /port is already allocated|address already in use|Bind for .+ failed|failed to (?:bind|set up) .*port/i.test(e) ? "port" : null;
|
|
3607
3628
|
}
|
|
3608
|
-
function
|
|
3629
|
+
function wa(e) {
|
|
3609
3630
|
return e.match(/container name "\/?([^"]+)"/i)?.[1] ?? null;
|
|
3610
3631
|
}
|
|
3611
|
-
function
|
|
3632
|
+
function Ta(e) {
|
|
3612
3633
|
return e.match(/Bind for [^:]*:(\d{2,5})/i)?.[1] ?? e.match(/:(\d{2,5})(?:->|\b)[^\n]*(?:already allocated|already in use)/i)?.[1] ?? null;
|
|
3613
3634
|
}
|
|
3614
|
-
function
|
|
3615
|
-
let t = (e.stderr || e.stdout).trim(), n =
|
|
3635
|
+
function Ea(e) {
|
|
3636
|
+
let t = (e.stderr || e.stdout).trim(), n = Ca(t);
|
|
3616
3637
|
if (!n) {
|
|
3617
3638
|
t && s.log.warn(L.muted(t));
|
|
3618
3639
|
return;
|
|
3619
3640
|
}
|
|
3620
3641
|
if (n === "container") {
|
|
3621
|
-
let e =
|
|
3642
|
+
let e = wa(t);
|
|
3622
3643
|
s.log.warn(L.muted(`${e ? `Container ${L.command(e)}` : "One of this project's containers"} is already running, most likely from another Hype Stack project. The template uses fixed container names, so two projects can't run their services at the same time.`));
|
|
3623
3644
|
} else {
|
|
3624
|
-
let e =
|
|
3645
|
+
let e = Ta(t);
|
|
3625
3646
|
s.log.warn(L.muted(`${e ? `Host port ${L.command(e)}` : "A host port this project needs"} is already taken, most likely by another Hype Stack project. The template uses fixed ports, so two projects can't run their services at the same time.`));
|
|
3626
3647
|
}
|
|
3627
3648
|
z([
|
|
@@ -3630,7 +3651,7 @@ function Ca(e) {
|
|
|
3630
3651
|
L.muted("then re-run this command and start Docker again")
|
|
3631
3652
|
].join("\n"), "Free up Docker, then retry"), t && s.log.warn(L.muted(t));
|
|
3632
3653
|
}
|
|
3633
|
-
async function
|
|
3654
|
+
async function Da(e, t = 15, n = 2e3) {
|
|
3634
3655
|
for (let r = 0; r < t; r++) {
|
|
3635
3656
|
if ((await J("docker", [
|
|
3636
3657
|
"compose",
|
|
@@ -3645,8 +3666,8 @@ async function wa(e, t = 15, n = 2e3) {
|
|
|
3645
3666
|
}
|
|
3646
3667
|
return !1;
|
|
3647
3668
|
}
|
|
3648
|
-
var
|
|
3649
|
-
async function
|
|
3669
|
+
var Oa = "Database schema is up to date";
|
|
3670
|
+
async function ka(e) {
|
|
3650
3671
|
let t = await J("pnpm", [
|
|
3651
3672
|
"--filter",
|
|
3652
3673
|
"@internal/backend",
|
|
@@ -3655,9 +3676,9 @@ async function Ea(e) {
|
|
|
3655
3676
|
"migrate",
|
|
3656
3677
|
"status"
|
|
3657
3678
|
], { cwd: e });
|
|
3658
|
-
return t.exitCode === 0 ? `${t.stdout}\n${t.stderr}`.includes(
|
|
3679
|
+
return t.exitCode === 0 ? `${t.stdout}\n${t.stderr}`.includes(Oa) : !1;
|
|
3659
3680
|
}
|
|
3660
|
-
async function
|
|
3681
|
+
async function Aa(e) {
|
|
3661
3682
|
let t = s.spinner();
|
|
3662
3683
|
t.start("Running database migrations...");
|
|
3663
3684
|
let n = await J("pnpm", [
|
|
@@ -3665,15 +3686,15 @@ async function Da(e) {
|
|
|
3665
3686
|
"@internal/backend",
|
|
3666
3687
|
"migration:latest"
|
|
3667
3688
|
], { cwd: e });
|
|
3668
|
-
return n.exitCode === 0 ? (t.stop(L.success("Database migrations applied")), !0) : (t.error("Migrations failed"),
|
|
3689
|
+
return n.exitCode === 0 ? (t.stop(L.success("Database migrations applied")), !0) : (t.error("Migrations failed"), Sa(n), s.log.warn(L.muted("Run `pnpm --filter @internal/backend migration:latest` manually to apply migrations.")), !1);
|
|
3669
3690
|
}
|
|
3670
|
-
async function
|
|
3671
|
-
if (!await
|
|
3691
|
+
async function ja(e, t, n = {}) {
|
|
3692
|
+
if (!await xa(e, t, await ya())) return !1;
|
|
3672
3693
|
let r = s.spinner();
|
|
3673
|
-
return r.start("Waiting for Postgres to be ready..."), await
|
|
3694
|
+
return r.start("Waiting for Postgres to be ready..."), await Da(e, n.postgresMaxAttempts ?? 15, n.postgresCheckIntervalMs ?? 2e3) ? (r.stop(L.success("Postgres is ready")), !0) : (r.error("Postgres health check timed out"), s.log.warn(L.muted("Run migrations manually once Postgres is ready: pnpm --filter @internal/backend migration:latest")), !1);
|
|
3674
3695
|
}
|
|
3675
|
-
async function
|
|
3676
|
-
if (!await
|
|
3696
|
+
async function Ma(e, t, n = {}) {
|
|
3697
|
+
if (!await ja(e, t, n)) return;
|
|
3677
3698
|
let r = t ? !0 : await s.confirm({
|
|
3678
3699
|
message: `Run database migrations with ${L.command("prisma migrate deploy")}?`,
|
|
3679
3700
|
initialValue: !0
|
|
@@ -3682,21 +3703,21 @@ async function ka(e, t, n = {}) {
|
|
|
3682
3703
|
s.log.info(L.muted("Skipping database migrations."));
|
|
3683
3704
|
return;
|
|
3684
3705
|
}
|
|
3685
|
-
await
|
|
3706
|
+
await Aa(e);
|
|
3686
3707
|
}
|
|
3687
|
-
async function
|
|
3688
|
-
if (!await
|
|
3708
|
+
async function Na(e, t, n = {}) {
|
|
3709
|
+
if (!await ba(e)) {
|
|
3689
3710
|
s.log.warn(`${L.path(".env")} not found in ${L.path("apps/backend")}. Skipping Docker and migrations - configure it first.`);
|
|
3690
3711
|
return;
|
|
3691
3712
|
}
|
|
3692
|
-
await
|
|
3713
|
+
await Ma(e, t, n);
|
|
3693
3714
|
}
|
|
3694
|
-
async function
|
|
3695
|
-
return await
|
|
3715
|
+
async function Pa(e, t, n = {}) {
|
|
3716
|
+
return await ba(e) ? ja(e, t, n) : (s.log.warn(`${L.path(".env")} not found in ${L.path("apps/backend")}. Skipping Docker - configure it first.`), !1);
|
|
3696
3717
|
}
|
|
3697
3718
|
//#endregion
|
|
3698
3719
|
//#region src/core/resolve.ts
|
|
3699
|
-
function
|
|
3720
|
+
function Fa(e) {
|
|
3700
3721
|
let t = /* @__PURE__ */ new Map();
|
|
3701
3722
|
for (let n of e) t.set(n.name, {
|
|
3702
3723
|
name: n.name,
|
|
@@ -3704,7 +3725,7 @@ function Ma(e) {
|
|
|
3704
3725
|
});
|
|
3705
3726
|
return t;
|
|
3706
3727
|
}
|
|
3707
|
-
function
|
|
3728
|
+
function Ia(e, t, n = /* @__PURE__ */ new Set()) {
|
|
3708
3729
|
let r = /* @__PURE__ */ new Set();
|
|
3709
3730
|
function i(e) {
|
|
3710
3731
|
if (n.has(e)) return [];
|
|
@@ -3718,10 +3739,10 @@ function Na(e, t, n = /* @__PURE__ */ new Set()) {
|
|
|
3718
3739
|
}
|
|
3719
3740
|
return i(e);
|
|
3720
3741
|
}
|
|
3721
|
-
function
|
|
3742
|
+
function La(e, t, n = []) {
|
|
3722
3743
|
let r = new Set(n), i = new Set(n), a = [];
|
|
3723
3744
|
for (let n of e) {
|
|
3724
|
-
let e =
|
|
3745
|
+
let e = Ia(n, t, new Set(i));
|
|
3725
3746
|
for (let t of e) i.has(t) || (i.add(t), a.push(t));
|
|
3726
3747
|
}
|
|
3727
3748
|
return {
|
|
@@ -3729,7 +3750,7 @@ function Pa(e, t, n = []) {
|
|
|
3729
3750
|
alreadyInstalled: e.filter((e) => r.has(e))
|
|
3730
3751
|
};
|
|
3731
3752
|
}
|
|
3732
|
-
function
|
|
3753
|
+
function Ra(e) {
|
|
3733
3754
|
let { order: t, graph: n, isLocked: r, installed: i = [] } = e, a = new Set(i), o = /* @__PURE__ */ new Set();
|
|
3734
3755
|
for (let e of t) {
|
|
3735
3756
|
let t = n.get(e)?.dependencies.some((e) => !a.has(e) && o.has(e)) ?? !1;
|
|
@@ -3742,7 +3763,7 @@ function Fa(e) {
|
|
|
3742
3763
|
}
|
|
3743
3764
|
//#endregion
|
|
3744
3765
|
//#region src/core/variants.ts
|
|
3745
|
-
function
|
|
3766
|
+
function za(e, t = {}) {
|
|
3746
3767
|
let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map();
|
|
3747
3768
|
for (let i of e) {
|
|
3748
3769
|
let e = t[i.family] ?? i.default;
|
|
@@ -3754,14 +3775,14 @@ function Ia(e, t = {}) {
|
|
|
3754
3775
|
familyOf: r
|
|
3755
3776
|
};
|
|
3756
3777
|
}
|
|
3757
|
-
function
|
|
3778
|
+
function Ba(e, t, n) {
|
|
3758
3779
|
return [...e.map((e) => n.chosen.get(e.family) ?? e.default), ...t];
|
|
3759
3780
|
}
|
|
3760
|
-
function
|
|
3781
|
+
function Va(e, t) {
|
|
3761
3782
|
let n = t.familyOf.get(e);
|
|
3762
3783
|
return n ? t.chosen.get(n) ?? e : e;
|
|
3763
3784
|
}
|
|
3764
|
-
function
|
|
3785
|
+
function Ha(e, t) {
|
|
3765
3786
|
let n = /* @__PURE__ */ new Map();
|
|
3766
3787
|
for (let t of e) t.family && n.set(t.name, t.family);
|
|
3767
3788
|
let r = new Set(t), i = /* @__PURE__ */ new Map();
|
|
@@ -3777,65 +3798,65 @@ function za(e, t) {
|
|
|
3777
3798
|
familyOf: n
|
|
3778
3799
|
};
|
|
3779
3800
|
}
|
|
3780
|
-
function
|
|
3801
|
+
function Ua(e, t) {
|
|
3781
3802
|
return e.map((e) => ({
|
|
3782
3803
|
...e,
|
|
3783
|
-
dependencies: e.dependencies.map((e) =>
|
|
3804
|
+
dependencies: e.dependencies.map((e) => Va(e, t))
|
|
3784
3805
|
}));
|
|
3785
3806
|
}
|
|
3786
3807
|
//#endregion
|
|
3787
3808
|
//#region src/ui/banner.ts
|
|
3788
|
-
var
|
|
3809
|
+
var Wa = [
|
|
3789
3810
|
" ██╗ ██╗ ██╗ ██╗ ██████╗ ███████╗",
|
|
3790
3811
|
" ██║ ██║ ╚██╗ ██╔╝ ██╔══██╗ ██╔════╝",
|
|
3791
3812
|
" ███████║ ╚████╔╝ ██████╔╝ █████╗ ",
|
|
3792
3813
|
" ██╔══██║ ╚██╔╝ ██╔═══╝ ██╔══╝ ",
|
|
3793
3814
|
" ██║ ██║ ██║ ██║ ███████╗",
|
|
3794
3815
|
" ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝"
|
|
3795
|
-
],
|
|
3816
|
+
], Ga = [
|
|
3796
3817
|
" ███████╗ ████████╗ █████╗ ██████╗ ██╗ ██╗",
|
|
3797
3818
|
" ██╔════╝ ╚══██╔══╝ ██╔══██╗ ██╔════╝ ██║ ██╔╝",
|
|
3798
3819
|
" ███████╗ ██║ ███████║ ██║ █████╔╝ ",
|
|
3799
3820
|
" ╚════██║ ██║ ██╔══██║ ██║ ██╔═██╗ ",
|
|
3800
3821
|
" ███████║ ██║ ██║ ██║ ╚██████╗ ██║ ██╗",
|
|
3801
3822
|
" ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝"
|
|
3802
|
-
],
|
|
3823
|
+
], Ka = [
|
|
3803
3824
|
253,
|
|
3804
3825
|
176,
|
|
3805
3826
|
21
|
|
3806
|
-
],
|
|
3827
|
+
], qa = [
|
|
3807
3828
|
245,
|
|
3808
3829
|
76,
|
|
3809
3830
|
2
|
|
3810
|
-
],
|
|
3831
|
+
], Ja = 5, Ya = [
|
|
3811
3832
|
17,
|
|
3812
3833
|
103,
|
|
3813
3834
|
248
|
|
3814
|
-
],
|
|
3835
|
+
], Xa = [
|
|
3815
3836
|
42,
|
|
3816
3837
|
160,
|
|
3817
3838
|
250
|
|
3818
|
-
],
|
|
3819
|
-
function
|
|
3839
|
+
], Za = .2;
|
|
3840
|
+
function Qa() {
|
|
3820
3841
|
console.log();
|
|
3821
|
-
for (let e of Se(
|
|
3822
|
-
start: Ua,
|
|
3823
|
-
end: Wa,
|
|
3824
|
-
angle: Ga
|
|
3825
|
-
})) console.log(b.bold(e));
|
|
3826
|
-
for (let e of Se(Ha, {
|
|
3842
|
+
for (let e of Se(Wa, {
|
|
3827
3843
|
start: Ka,
|
|
3828
3844
|
end: qa,
|
|
3829
3845
|
angle: Ja
|
|
3830
3846
|
})) console.log(b.bold(e));
|
|
3847
|
+
for (let e of Se(Ga, {
|
|
3848
|
+
start: Ya,
|
|
3849
|
+
end: Xa,
|
|
3850
|
+
angle: Za
|
|
3851
|
+
})) console.log(b.bold(e));
|
|
3831
3852
|
console.log(), console.log(` ${R.spark} ${b.dim("v" + A)} ${b.dim("·")} ${be("Ship web + desktop apps from one codebase")}`), console.log();
|
|
3832
3853
|
}
|
|
3833
|
-
function
|
|
3854
|
+
function $a() {
|
|
3834
3855
|
console.log(), console.log(` ${R.bolt} ${_e.orange("Hype")}${_e.skyBlue("Stack")} ${b.dim("v" + A)}`), console.log();
|
|
3835
3856
|
}
|
|
3836
3857
|
//#endregion
|
|
3837
3858
|
//#region src/ui/pack-multiselect.ts
|
|
3838
|
-
var
|
|
3859
|
+
var eo = class extends O {
|
|
3839
3860
|
options;
|
|
3840
3861
|
cursor = 0;
|
|
3841
3862
|
selected;
|
|
@@ -3939,64 +3960,64 @@ var Za = class extends O {
|
|
|
3939
3960
|
}
|
|
3940
3961
|
}
|
|
3941
3962
|
};
|
|
3942
|
-
function
|
|
3943
|
-
return new
|
|
3963
|
+
function to(e) {
|
|
3964
|
+
return new eo(e).prompt();
|
|
3944
3965
|
}
|
|
3945
3966
|
//#endregion
|
|
3946
3967
|
//#region src/utils/naming.ts
|
|
3947
|
-
function
|
|
3968
|
+
function no(e) {
|
|
3948
3969
|
return e.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
3949
3970
|
}
|
|
3950
|
-
function
|
|
3971
|
+
function ro(e) {
|
|
3951
3972
|
return e.split(/[-_]/).filter(Boolean).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(" ");
|
|
3952
3973
|
}
|
|
3953
3974
|
//#endregion
|
|
3954
3975
|
//#region src/utils/validate.ts
|
|
3955
|
-
function
|
|
3976
|
+
function io(e) {
|
|
3956
3977
|
if (!e.trim()) return "Project name cannot be empty";
|
|
3957
3978
|
if (e.length > 214) return "Project name is too long (max 214 characters)";
|
|
3958
|
-
let t =
|
|
3979
|
+
let t = no(e);
|
|
3959
3980
|
if (!ie.test(t)) return "Project name must contain at least one letter or number";
|
|
3960
3981
|
}
|
|
3961
3982
|
//#endregion
|
|
3962
3983
|
//#region src/core/apply-mode.ts
|
|
3963
|
-
var
|
|
3964
|
-
function
|
|
3965
|
-
return e.replace(
|
|
3984
|
+
var ao = "src/hooks/use-theme.ts", oo = /(\bexport\s+const\s+defaultTheme\s*=\s*)(["'])(?:light|dark)\2/;
|
|
3985
|
+
function so(e, t) {
|
|
3986
|
+
return e.replace(oo, (e, n, r) => `${n}${r}${t}${r}`);
|
|
3966
3987
|
}
|
|
3967
|
-
async function
|
|
3968
|
-
let n = T.resolve(e,
|
|
3988
|
+
async function co(e, t) {
|
|
3989
|
+
let n = T.resolve(e, ao), r;
|
|
3969
3990
|
try {
|
|
3970
3991
|
r = await y.readFile(n, "utf-8");
|
|
3971
3992
|
} catch {
|
|
3972
3993
|
return !1;
|
|
3973
3994
|
}
|
|
3974
|
-
let i =
|
|
3995
|
+
let i = so(r, t);
|
|
3975
3996
|
return i === r || await y.writeFile(n, i, "utf-8"), !0;
|
|
3976
3997
|
}
|
|
3977
3998
|
//#endregion
|
|
3978
3999
|
//#region src/core/apply-radius.ts
|
|
3979
|
-
var
|
|
3980
|
-
function
|
|
4000
|
+
var lo = /(^[ \t]*--radius(?![\w-])[ \t]*:[ \t]*)([^;\n]*);/gm;
|
|
4001
|
+
function uo(e) {
|
|
3981
4002
|
return /^[0-9]*\.?[0-9]+(rem|em|px)$/.test(e.trim());
|
|
3982
4003
|
}
|
|
3983
|
-
function
|
|
3984
|
-
return e.replace(
|
|
4004
|
+
function fo(e, t) {
|
|
4005
|
+
return e.replace(lo, (e, n) => `${n}${t};`);
|
|
3985
4006
|
}
|
|
3986
|
-
var
|
|
3987
|
-
async function
|
|
3988
|
-
let n = T.resolve(e,
|
|
4007
|
+
var po = "assets/styles.css";
|
|
4008
|
+
async function mo(e, t) {
|
|
4009
|
+
let n = T.resolve(e, po), r;
|
|
3989
4010
|
try {
|
|
3990
4011
|
r = await y.readFile(n, "utf-8");
|
|
3991
4012
|
} catch {
|
|
3992
4013
|
return !1;
|
|
3993
4014
|
}
|
|
3994
|
-
let i =
|
|
4015
|
+
let i = fo(r, t);
|
|
3995
4016
|
return i === r || await y.writeFile(n, i, "utf-8"), !0;
|
|
3996
4017
|
}
|
|
3997
4018
|
//#endregion
|
|
3998
4019
|
//#region src/core/apply-theme.ts
|
|
3999
|
-
function
|
|
4020
|
+
function ho(e, t) {
|
|
4000
4021
|
let n = 0;
|
|
4001
4022
|
for (; n < e.length;) {
|
|
4002
4023
|
let r = e.indexOf(t, n);
|
|
@@ -4019,46 +4040,46 @@ function fo(e, t) {
|
|
|
4019
4040
|
}
|
|
4020
4041
|
return null;
|
|
4021
4042
|
}
|
|
4022
|
-
function
|
|
4043
|
+
function go(e, t) {
|
|
4023
4044
|
let n = e;
|
|
4024
4045
|
for (let [e, r] of Object.entries(t)) {
|
|
4025
|
-
let t = RegExp(`(^[ \\t]*--${
|
|
4046
|
+
let t = RegExp(`(^[ \\t]*--${_o(e)}[ \\t]*:[ \\t]*)([^;\\n]*);`, "m");
|
|
4026
4047
|
n = n.replace(t, (e, t) => `${t}${r};`);
|
|
4027
4048
|
}
|
|
4028
4049
|
return n;
|
|
4029
4050
|
}
|
|
4030
|
-
function
|
|
4051
|
+
function _o(e) {
|
|
4031
4052
|
return e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
4032
4053
|
}
|
|
4033
|
-
function
|
|
4034
|
-
let n =
|
|
4054
|
+
function vo(e, t) {
|
|
4055
|
+
let n = ho(e, ":root"), r = ho(e, ".dark"), i = e;
|
|
4035
4056
|
if (n) {
|
|
4036
4057
|
let e = i.slice(0, n.bodyStart), r = i.slice(n.bodyStart, n.bodyEnd), a = i.slice(n.bodyEnd);
|
|
4037
|
-
i = e +
|
|
4058
|
+
i = e + go(r, t.light) + a;
|
|
4038
4059
|
}
|
|
4039
4060
|
if (r) {
|
|
4040
|
-
let e =
|
|
4061
|
+
let e = ho(i, ".dark");
|
|
4041
4062
|
if (e) {
|
|
4042
4063
|
let n = i.slice(0, e.bodyStart), r = i.slice(e.bodyStart, e.bodyEnd), a = i.slice(e.bodyEnd);
|
|
4043
|
-
i = n +
|
|
4064
|
+
i = n + go(r, t.dark) + a;
|
|
4044
4065
|
}
|
|
4045
4066
|
}
|
|
4046
4067
|
return i;
|
|
4047
4068
|
}
|
|
4048
|
-
var
|
|
4049
|
-
async function
|
|
4050
|
-
let n = T.resolve(e,
|
|
4069
|
+
var yo = "assets/styles.css";
|
|
4070
|
+
async function bo(e, t) {
|
|
4071
|
+
let n = T.resolve(e, yo), r;
|
|
4051
4072
|
try {
|
|
4052
4073
|
r = await y.readFile(n, "utf-8");
|
|
4053
4074
|
} catch {
|
|
4054
4075
|
return !1;
|
|
4055
4076
|
}
|
|
4056
|
-
let i =
|
|
4077
|
+
let i = vo(r, t);
|
|
4057
4078
|
return i === r || await y.writeFile(n, i, "utf-8"), !0;
|
|
4058
4079
|
}
|
|
4059
4080
|
//#endregion
|
|
4060
4081
|
//#region src/core/clone.ts
|
|
4061
|
-
async function
|
|
4082
|
+
async function xo(e) {
|
|
4062
4083
|
let t = await ee(te, {
|
|
4063
4084
|
dir: e,
|
|
4064
4085
|
force: !0
|
|
@@ -4070,7 +4091,7 @@ async function vo(e) {
|
|
|
4070
4091
|
}
|
|
4071
4092
|
//#endregion
|
|
4072
4093
|
//#region src/core/editor-config.ts
|
|
4073
|
-
function
|
|
4094
|
+
function So(e) {
|
|
4074
4095
|
let t = {
|
|
4075
4096
|
globs: [],
|
|
4076
4097
|
alwaysApply: !1
|
|
@@ -4105,10 +4126,10 @@ function yo(e) {
|
|
|
4105
4126
|
content: i
|
|
4106
4127
|
};
|
|
4107
4128
|
}
|
|
4108
|
-
function
|
|
4129
|
+
function Co(e) {
|
|
4109
4130
|
return e.frontmatter.globs.length > 0 ? `---\npaths:\n${e.frontmatter.globs.map((e) => ` - "${e}"`).join("\n")}\n---\n\n${e.content}` : e.content;
|
|
4110
4131
|
}
|
|
4111
|
-
function
|
|
4132
|
+
function wo(e) {
|
|
4112
4133
|
let t;
|
|
4113
4134
|
t = e.frontmatter.alwaysApply ? "always_on" : e.frontmatter.globs.length > 0 ? "glob" : "model_decision";
|
|
4114
4135
|
let n = [`trigger: ${t}`];
|
|
@@ -4118,30 +4139,30 @@ function xo(e) {
|
|
|
4118
4139
|
}
|
|
4119
4140
|
return e.frontmatter.description && n.push(`description: ${e.frontmatter.description}`), `---\n${n.join("\n")}\n---\n\n${e.content}`;
|
|
4120
4141
|
}
|
|
4121
|
-
function
|
|
4142
|
+
function To(e) {
|
|
4122
4143
|
return e.frontmatter.globs.length > 0 ? `---\napplyTo: "${e.frontmatter.globs.join(", ")}"\n---\n\n${e.content}` : e.content;
|
|
4123
4144
|
}
|
|
4124
|
-
var
|
|
4145
|
+
var Eo = {
|
|
4125
4146
|
claude: {
|
|
4126
4147
|
rulesDir: ".claude/rules",
|
|
4127
4148
|
extension: ".md",
|
|
4128
|
-
convert:
|
|
4149
|
+
convert: Co
|
|
4129
4150
|
},
|
|
4130
4151
|
windsurf: {
|
|
4131
4152
|
rulesDir: ".windsurf/rules",
|
|
4132
4153
|
extension: ".md",
|
|
4133
|
-
convert:
|
|
4154
|
+
convert: wo
|
|
4134
4155
|
},
|
|
4135
4156
|
copilot: {
|
|
4136
4157
|
rulesDir: ".github/instructions",
|
|
4137
4158
|
extension: ".instructions.md",
|
|
4138
|
-
convert:
|
|
4159
|
+
convert: To
|
|
4139
4160
|
}
|
|
4140
4161
|
};
|
|
4141
|
-
async function
|
|
4162
|
+
async function Do(e) {
|
|
4142
4163
|
let t = T.join(e, oe), n = (await y.readdir(t, { withFileTypes: !0 }).catch(() => [])).filter((e) => e.isFile() && e.name.endsWith(".mdc"));
|
|
4143
4164
|
return await Promise.all(n.map(async (e) => {
|
|
4144
|
-
let n = T.join(t, e.name), { frontmatter: r, content: i } =
|
|
4165
|
+
let n = T.join(t, e.name), { frontmatter: r, content: i } = So(await y.readFile(n, "utf-8"));
|
|
4145
4166
|
return {
|
|
4146
4167
|
frontmatter: r,
|
|
4147
4168
|
content: i,
|
|
@@ -4149,9 +4170,9 @@ async function wo(e) {
|
|
|
4149
4170
|
};
|
|
4150
4171
|
}));
|
|
4151
4172
|
}
|
|
4152
|
-
async function
|
|
4173
|
+
async function Oo(e, t) {
|
|
4153
4174
|
if (t === "cursor") return;
|
|
4154
|
-
let n =
|
|
4175
|
+
let n = Eo[t], r = await Do(e), i = T.join(e, n.rulesDir);
|
|
4155
4176
|
await y.mkdir(i, { recursive: !0 }), await Promise.all(r.map((e) => {
|
|
4156
4177
|
let t = n.convert(e), r = e.filename.replace(/\.mdc$/, n.extension);
|
|
4157
4178
|
return y.writeFile(T.join(i, r), t, "utf-8");
|
|
@@ -4159,21 +4180,21 @@ async function To(e, t) {
|
|
|
4159
4180
|
}
|
|
4160
4181
|
//#endregion
|
|
4161
4182
|
//#region src/core/env-files.ts
|
|
4162
|
-
var
|
|
4183
|
+
var ko = [
|
|
4163
4184
|
"apps",
|
|
4164
4185
|
"packages",
|
|
4165
4186
|
"libs",
|
|
4166
4187
|
"shared"
|
|
4167
4188
|
];
|
|
4168
|
-
async function
|
|
4169
|
-
let t = await
|
|
4189
|
+
async function Ao(e) {
|
|
4190
|
+
let t = await jo(e);
|
|
4170
4191
|
return (await Promise.all(t.map(async (t) => {
|
|
4171
4192
|
let n = T.join(T.dirname(t), ".env");
|
|
4172
4193
|
return await Y(n) ? null : (await y.copyFile(t, n), T.relative(e, n));
|
|
4173
4194
|
}))).filter((e) => e !== null).sort();
|
|
4174
4195
|
}
|
|
4175
|
-
async function
|
|
4176
|
-
let t = [T.join(e, ".env.example")], n = await Promise.all(
|
|
4196
|
+
async function jo(e) {
|
|
4197
|
+
let t = [T.join(e, ".env.example")], n = await Promise.all(ko.map(async (t) => {
|
|
4177
4198
|
let n = T.join(e, t);
|
|
4178
4199
|
return (await y.readdir(n, { withFileTypes: !0 }).catch(() => [])).filter((e) => e.isDirectory()).map((e) => T.join(n, e.name, ".env.example"));
|
|
4179
4200
|
}));
|
|
@@ -4181,11 +4202,11 @@ async function Oo(e) {
|
|
|
4181
4202
|
}
|
|
4182
4203
|
//#endregion
|
|
4183
4204
|
//#region src/core/post-clone.ts
|
|
4184
|
-
var Q = "@hype-stack/",
|
|
4185
|
-
async function
|
|
4205
|
+
var Q = "@hype-stack/", Mo = "hype-stack", No = "@hype-stack/cli";
|
|
4206
|
+
async function Po(e) {
|
|
4186
4207
|
await mr(T.join(e, ".git"));
|
|
4187
4208
|
}
|
|
4188
|
-
async function
|
|
4209
|
+
async function Fo(e) {
|
|
4189
4210
|
await J("git", ["init"], { cwd: e }), await J("git", ["add", "."], { cwd: e }), await J("git", [
|
|
4190
4211
|
"-c",
|
|
4191
4212
|
"user.name=Hype Stack CLI",
|
|
@@ -4196,19 +4217,19 @@ async function Mo(e) {
|
|
|
4196
4217
|
"Initial commit from Hype Stack CLI"
|
|
4197
4218
|
], { cwd: e });
|
|
4198
4219
|
}
|
|
4199
|
-
async function
|
|
4200
|
-
let n = `@${t}/`, r = await
|
|
4220
|
+
async function Io(e, t) {
|
|
4221
|
+
let n = `@${t}/`, r = await Wo(e);
|
|
4201
4222
|
for (let e of r) {
|
|
4202
4223
|
let t = await dr(e);
|
|
4203
4224
|
if (!t) continue;
|
|
4204
4225
|
let r = !1;
|
|
4205
|
-
t.name?.startsWith(Q) && (t.name = t.name.replace(Q, n), r = !0),
|
|
4206
|
-
let i = await y.readFile(e, "utf-8"), a =
|
|
4226
|
+
t.name?.startsWith(Q) && (t.name = t.name.replace(Q, n), r = !0), Vo(t.dependencies, n) && (r = !0), Vo(t.devDependencies, n) && (r = !0), t.nx && Ho(t.nx, n) && (r = !0);
|
|
4227
|
+
let i = await y.readFile(e, "utf-8"), a = Xr(i, n);
|
|
4207
4228
|
a === i ? r && await fr(e, t) : await y.writeFile(e, a, "utf-8");
|
|
4208
4229
|
}
|
|
4209
|
-
await
|
|
4230
|
+
await Xi(e, t), await zo(e, t), await Uo(e, t);
|
|
4210
4231
|
}
|
|
4211
|
-
var
|
|
4232
|
+
var Lo = new Set([
|
|
4212
4233
|
".git",
|
|
4213
4234
|
"node_modules",
|
|
4214
4235
|
"dist",
|
|
@@ -4216,34 +4237,34 @@ var Po = new Set([
|
|
|
4216
4237
|
".nx",
|
|
4217
4238
|
".next",
|
|
4218
4239
|
"coverage"
|
|
4219
|
-
]),
|
|
4220
|
-
async function
|
|
4221
|
-
if (t ===
|
|
4222
|
-
let n = await
|
|
4240
|
+
]), Ro = /^(docker-compose|compose)(\.[\w.-]+)?\.ya?ml$/;
|
|
4241
|
+
async function zo(e, t) {
|
|
4242
|
+
if (t === Mo) return;
|
|
4243
|
+
let n = await Bo(e);
|
|
4223
4244
|
await Promise.all(n.map(async (e) => {
|
|
4224
4245
|
let n = await y.readFile(e, "utf-8").catch(() => null);
|
|
4225
|
-
if (!n || !/^name:[ \t]*hype-stack/m.test(n)) return;
|
|
4226
|
-
let r = n.replace(/^(name:[ \t]*)hype-stack/gm, `$1${t}`);
|
|
4246
|
+
if (!n || !/^[ \t]*(?:name|container_name):[ \t]*hype-stack/m.test(n)) return;
|
|
4247
|
+
let r = n.replace(/^(name:[ \t]*)hype-stack/gm, `$1${t}`).replace(/^([ \t]*container_name:[ \t]*)hype-stack/gm, `$1${t}`);
|
|
4227
4248
|
await y.writeFile(e, r, "utf-8");
|
|
4228
4249
|
}));
|
|
4229
4250
|
}
|
|
4230
|
-
async function
|
|
4251
|
+
async function Bo(e) {
|
|
4231
4252
|
let t = await y.readdir(e, { withFileTypes: !0 }).catch(() => []);
|
|
4232
4253
|
return (await Promise.all(t.map(async (t) => {
|
|
4233
4254
|
let n = T.join(e, t.name);
|
|
4234
|
-
return t.isDirectory() ?
|
|
4255
|
+
return t.isDirectory() ? Lo.has(t.name) ? [] : Bo(n) : t.isFile() && Ro.test(t.name) ? [n] : [];
|
|
4235
4256
|
}))).flat();
|
|
4236
4257
|
}
|
|
4237
|
-
function
|
|
4258
|
+
function Vo(e, t) {
|
|
4238
4259
|
if (!e) return !1;
|
|
4239
4260
|
let n = !1;
|
|
4240
|
-
for (let r of Object.keys(e)) if (r !==
|
|
4261
|
+
for (let r of Object.keys(e)) if (r !== No && r.startsWith(Q)) {
|
|
4241
4262
|
let i = r.replace(Q, t);
|
|
4242
4263
|
e[i] = e[r], delete e[r], n = !0;
|
|
4243
4264
|
}
|
|
4244
4265
|
return n;
|
|
4245
4266
|
}
|
|
4246
|
-
function
|
|
4267
|
+
function Ho(e, t) {
|
|
4247
4268
|
if (!e) return !1;
|
|
4248
4269
|
let n = !1;
|
|
4249
4270
|
if (e.implicitDependencies &&= e.implicitDependencies.map((e) => e.startsWith(Q) ? (n = !0, e.replace(Q, t)) : e), e.targets) {
|
|
@@ -4251,13 +4272,13 @@ function zo(e, t) {
|
|
|
4251
4272
|
}
|
|
4252
4273
|
return n;
|
|
4253
4274
|
}
|
|
4254
|
-
async function
|
|
4275
|
+
async function Uo(e, t) {
|
|
4255
4276
|
let n = T.join(e, "packages/enums/src/app/index.ts"), r = await y.readFile(n, "utf-8").catch(() => null);
|
|
4256
4277
|
if (!r) return;
|
|
4257
|
-
let i =
|
|
4278
|
+
let i = ro(t), a = r.replaceAll(`id: "${Mo}"`, `id: "${t}"`).replaceAll(`name: "${Mo}"`, `name: "${t}"`).replace(/name: "Hype Stack"/, `name: "${i}"`).replace(/description: ".*?"/, `description: "${i} application"`);
|
|
4258
4279
|
await y.writeFile(n, a, "utf-8");
|
|
4259
4280
|
}
|
|
4260
|
-
async function
|
|
4281
|
+
async function Wo(e) {
|
|
4261
4282
|
let t = [], n = T.join(e, "package.json");
|
|
4262
4283
|
(await y.stat(n).catch(() => null))?.isFile() && t.push(n);
|
|
4263
4284
|
for (let n of [
|
|
@@ -4277,7 +4298,7 @@ async function Vo(e) {
|
|
|
4277
4298
|
}
|
|
4278
4299
|
//#endregion
|
|
4279
4300
|
//#region src/core/readme.ts
|
|
4280
|
-
var
|
|
4301
|
+
var Go = {
|
|
4281
4302
|
cursor: {
|
|
4282
4303
|
label: "Cursor",
|
|
4283
4304
|
rulesDir: ".cursor/rules"
|
|
@@ -4294,21 +4315,21 @@ var Ho = {
|
|
|
4294
4315
|
label: "GitHub Copilot",
|
|
4295
4316
|
rulesDir: ".github/instructions"
|
|
4296
4317
|
}
|
|
4297
|
-
},
|
|
4318
|
+
}, Ko = {
|
|
4298
4319
|
backend: "Hono API server (Postgres, Prisma, Kysely, Valkey cache, WorkOS auth)",
|
|
4299
4320
|
frontend: "React + Vite app talking to the backend through the typed HyperFetch SDK"
|
|
4300
|
-
},
|
|
4321
|
+
}, qo = {
|
|
4301
4322
|
enums: "Shared enums and app config used across apps",
|
|
4302
4323
|
cli: "Project tooling and code generators"
|
|
4303
4324
|
};
|
|
4304
|
-
function
|
|
4325
|
+
function Jo(e, t) {
|
|
4305
4326
|
return Object.entries(e).toSorted(([e], [t]) => e.localeCompare(t)).map(([e, n]) => {
|
|
4306
4327
|
let r = t[e];
|
|
4307
4328
|
return r ? `- \`${n}\` - ${r}` : `- \`${n}\``;
|
|
4308
4329
|
});
|
|
4309
4330
|
}
|
|
4310
|
-
function
|
|
4311
|
-
let { projectName: t, editor: n, workspace: r } = e, i =
|
|
4331
|
+
function Yo(e) {
|
|
4332
|
+
let { projectName: t, editor: n, workspace: r } = e, i = ro(t), a = Go[n], o = !!r.apps.backend, s = Jo(r.apps, Ko), c = Jo(r.packages, qo), l = [];
|
|
4312
4333
|
s.length > 0 && l.push(...s), c.length > 0 && l.push(...c), l.push("- `stack.json` - Hype Stack workspace config (apps, paths, installed packs)");
|
|
4313
4334
|
let u = [];
|
|
4314
4335
|
u.push(`# ${i}`), u.push([
|
|
@@ -4411,13 +4432,13 @@ function Ko(e) {
|
|
|
4411
4432
|
"stays useful."
|
|
4412
4433
|
].join("\n")), u.join("\n\n") + "\n";
|
|
4413
4434
|
}
|
|
4414
|
-
async function
|
|
4435
|
+
async function Xo(e, t) {
|
|
4415
4436
|
let n = T.join(e, "README.md");
|
|
4416
|
-
await y.writeFile(n,
|
|
4437
|
+
await y.writeFile(n, Yo(t), "utf-8");
|
|
4417
4438
|
}
|
|
4418
4439
|
//#endregion
|
|
4419
4440
|
//#region src/core/tracking.ts
|
|
4420
|
-
async function
|
|
4441
|
+
async function Zo(e) {
|
|
4421
4442
|
try {
|
|
4422
4443
|
let t = {
|
|
4423
4444
|
"X-Device-Id": er(),
|
|
@@ -4431,7 +4452,7 @@ async function Jo(e) {
|
|
|
4431
4452
|
}
|
|
4432
4453
|
//#endregion
|
|
4433
4454
|
//#region src/core/npm-deps.ts
|
|
4434
|
-
function
|
|
4455
|
+
function Qo(e, t) {
|
|
4435
4456
|
let n = [], r = [];
|
|
4436
4457
|
if (!e) return {
|
|
4437
4458
|
errors: n,
|
|
@@ -4462,7 +4483,7 @@ function Yo(e, t) {
|
|
|
4462
4483
|
operations: r
|
|
4463
4484
|
};
|
|
4464
4485
|
}
|
|
4465
|
-
function
|
|
4486
|
+
function $o(e) {
|
|
4466
4487
|
let t = {};
|
|
4467
4488
|
for (let n of e) if (n) for (let [e, r] of Object.entries(n)) t[e] = {
|
|
4468
4489
|
...t[e],
|
|
@@ -4470,7 +4491,7 @@ function Xo(e) {
|
|
|
4470
4491
|
};
|
|
4471
4492
|
return t;
|
|
4472
4493
|
}
|
|
4473
|
-
async function
|
|
4494
|
+
async function es(e, t, n = J) {
|
|
4474
4495
|
let r = [];
|
|
4475
4496
|
for (let i of e) {
|
|
4476
4497
|
let e = T.join(t, i.relativeDir);
|
|
@@ -4506,14 +4527,14 @@ async function Zo(e, t, n = J) {
|
|
|
4506
4527
|
function $(e) {
|
|
4507
4528
|
return e instanceof Error ? e.message : String(e);
|
|
4508
4529
|
}
|
|
4509
|
-
async function
|
|
4530
|
+
async function ts(e, t, n) {
|
|
4510
4531
|
let r = e.filter((e) => e.tier === "paid" && !t.has(e.name)).map((e) => e.name);
|
|
4511
|
-
return r.length === 0 ? {} :
|
|
4532
|
+
return r.length === 0 ? {} : qr(r, n).catch(() => ({}));
|
|
4512
4533
|
}
|
|
4513
|
-
function
|
|
4534
|
+
function ns(e, t) {
|
|
4514
4535
|
return e === "free" ? L.success("free") : e === "owned" ? L.accent("owned") : `${L.highlight(`$${t}`)} ${L.muted("locked")}`;
|
|
4515
4536
|
}
|
|
4516
|
-
async function
|
|
4537
|
+
async function rs(e, t, n) {
|
|
4517
4538
|
let r = e.filter((e) => t(e)), i = e.filter((e) => !t(e));
|
|
4518
4539
|
i.length > 0 && s.log.warning(`Skipping ${i.join(", ")} because ${i.length === 1 ? "it depends" : "they depend"} on a pack you don't own yet.`), await sr(r.map((e) => n.get(e)).filter((e) => e !== void 0).map((e) => ({
|
|
4519
4540
|
name: e.name,
|
|
@@ -4521,7 +4542,7 @@ async function es(e, t, n) {
|
|
|
4521
4542
|
price: e.price
|
|
4522
4543
|
})));
|
|
4523
4544
|
}
|
|
4524
|
-
function
|
|
4545
|
+
function is(e, t) {
|
|
4525
4546
|
z([
|
|
4526
4547
|
"These packs will be installed, in order:",
|
|
4527
4548
|
"",
|
|
@@ -4531,10 +4552,10 @@ function ts(e, t) {
|
|
|
4531
4552
|
})
|
|
4532
4553
|
].join("\n"), "Install Plan");
|
|
4533
4554
|
}
|
|
4534
|
-
async function
|
|
4555
|
+
async function as(e, t) {
|
|
4535
4556
|
let n = [];
|
|
4536
4557
|
for (let r of e) {
|
|
4537
|
-
let e = await
|
|
4558
|
+
let e = await Vr(r), i = await Hr(r, t);
|
|
4538
4559
|
if (i.status === "denied") throw Error(`Access to "${r}" was denied (${i.reason}). Try 'npx @hype-stack/cli login' or check your license.`);
|
|
4539
4560
|
n.push({
|
|
4540
4561
|
manifest: e,
|
|
@@ -4543,18 +4564,18 @@ async function ns(e, t) {
|
|
|
4543
4564
|
}
|
|
4544
4565
|
return n;
|
|
4545
4566
|
}
|
|
4546
|
-
async function
|
|
4547
|
-
let { prepared: t, paths: n, cwd: r, spinner: i } = e, a =
|
|
4567
|
+
async function os(e) {
|
|
4568
|
+
let { prepared: t, paths: n, cwd: r, spinner: i } = e, a = Qo($o(t.map((e) => e.manifest.dependencies_npm)), n);
|
|
4548
4569
|
if (a.errors.length > 0) {
|
|
4549
4570
|
for (let e of a.errors) s.log.error(e);
|
|
4550
4571
|
return;
|
|
4551
4572
|
}
|
|
4552
4573
|
if (a.operations.length === 0) return;
|
|
4553
4574
|
i.start("Installing npm dependencies...");
|
|
4554
|
-
let o = await
|
|
4575
|
+
let o = await es(a.operations, r);
|
|
4555
4576
|
if (i.stop(o.ok ? "npm dependencies installed" : "npm dependency installation failed"), !o.ok) for (let e of o.errors) s.log.error(e);
|
|
4556
4577
|
}
|
|
4557
|
-
function
|
|
4578
|
+
function ss() {
|
|
4558
4579
|
Te([{
|
|
4559
4580
|
command: "npx @hype-stack/cli onboard",
|
|
4560
4581
|
hint: "(set up env vars + run migrations)"
|
|
@@ -4563,7 +4584,7 @@ function is() {
|
|
|
4563
4584
|
hint: "(start frontend + backend)"
|
|
4564
4585
|
}]);
|
|
4565
4586
|
}
|
|
4566
|
-
function
|
|
4587
|
+
function cs(e) {
|
|
4567
4588
|
if (e.length === 0) return;
|
|
4568
4589
|
let t = e.map((e) => {
|
|
4569
4590
|
let t = e.replace(/^\{\{[^}]+\}\}\//, "");
|
|
@@ -4571,10 +4592,10 @@ function as(e) {
|
|
|
4571
4592
|
});
|
|
4572
4593
|
s.note(t.join("\n"), "Skipped (already exist)");
|
|
4573
4594
|
}
|
|
4574
|
-
async function
|
|
4595
|
+
async function ls(e) {
|
|
4575
4596
|
let { prepared: t, config: n, cwd: r, force: i, yes: a, slotsByPack: o } = e, c = /* @__PURE__ */ new Set();
|
|
4576
4597
|
if (i) return c;
|
|
4577
|
-
let l = await
|
|
4598
|
+
let l = await aa({
|
|
4578
4599
|
packs: t,
|
|
4579
4600
|
config: n,
|
|
4580
4601
|
projectRoot: r,
|
|
@@ -4601,7 +4622,7 @@ async function os(e) {
|
|
|
4601
4622
|
}
|
|
4602
4623
|
//#endregion
|
|
4603
4624
|
//#region src/ui/swatch.ts
|
|
4604
|
-
function
|
|
4625
|
+
function us(e) {
|
|
4605
4626
|
let t = e.trim().match(/^oklch\(([^)]+)\)$/i);
|
|
4606
4627
|
if (!t) return null;
|
|
4607
4628
|
let n = t[1].trim().split(/\s+/);
|
|
@@ -4620,56 +4641,56 @@ function ss(e) {
|
|
|
4620
4641
|
h: a
|
|
4621
4642
|
};
|
|
4622
4643
|
}
|
|
4623
|
-
function
|
|
4644
|
+
function ds(e) {
|
|
4624
4645
|
return Math.min(255, Math.max(0, Math.round(e)));
|
|
4625
4646
|
}
|
|
4626
|
-
function
|
|
4647
|
+
function fs(e) {
|
|
4627
4648
|
return e <= .0031308 ? 12.92 * e : 1.055 * e ** (1 / 2.4) - .055;
|
|
4628
4649
|
}
|
|
4629
|
-
function
|
|
4650
|
+
function ps({ l: e, c: t, h: n }) {
|
|
4630
4651
|
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;
|
|
4631
4652
|
return [
|
|
4632
|
-
|
|
4633
|
-
|
|
4634
|
-
|
|
4653
|
+
ds(fs(f) * 255),
|
|
4654
|
+
ds(fs(p) * 255),
|
|
4655
|
+
ds(fs(m) * 255)
|
|
4635
4656
|
];
|
|
4636
4657
|
}
|
|
4637
|
-
var
|
|
4638
|
-
function
|
|
4658
|
+
var ms = "\x1B[49m";
|
|
4659
|
+
function hs(e, t) {
|
|
4639
4660
|
let n = e[t];
|
|
4640
4661
|
if (!n) return b.dim(" ");
|
|
4641
|
-
let r =
|
|
4662
|
+
let r = us(n);
|
|
4642
4663
|
if (!r) return b.dim(" ");
|
|
4643
|
-
let [i, a, o] =
|
|
4644
|
-
return `\x1b[48;2;${i};${a};${o}m ${
|
|
4664
|
+
let [i, a, o] = ps(r);
|
|
4665
|
+
return `\x1b[48;2;${i};${a};${o}m ${ms}`;
|
|
4645
4666
|
}
|
|
4646
|
-
var
|
|
4667
|
+
var gs = [
|
|
4647
4668
|
"primary",
|
|
4648
4669
|
"secondary",
|
|
4649
4670
|
"accent"
|
|
4650
4671
|
];
|
|
4651
|
-
function
|
|
4652
|
-
return
|
|
4672
|
+
function _s(e) {
|
|
4673
|
+
return gs.map((t) => hs(e, t)).join("");
|
|
4653
4674
|
}
|
|
4654
|
-
function
|
|
4655
|
-
return `${
|
|
4675
|
+
function vs(e) {
|
|
4676
|
+
return `${_s(e.light)} ${b.dim("·")} ${_s(e.dark)}`;
|
|
4656
4677
|
}
|
|
4657
4678
|
//#endregion
|
|
4658
4679
|
//#region src/commands/create.ts
|
|
4659
|
-
async function
|
|
4660
|
-
e.skipBanner ||
|
|
4680
|
+
async function ys(e) {
|
|
4681
|
+
e.skipBanner || Qa(), s.intro(L.brandBold("Create a new Hype Stack project"));
|
|
4661
4682
|
let o = e.yes === !0, c, l;
|
|
4662
4683
|
if (o && e.name) {
|
|
4663
|
-
let t =
|
|
4664
|
-
t && (s.log.error(t), B()), l = e.name, c =
|
|
4684
|
+
let t = io(e.name);
|
|
4685
|
+
t && (s.log.error(t), B()), l = e.name, c = no(e.name);
|
|
4665
4686
|
} else {
|
|
4666
4687
|
let t = await s.text({
|
|
4667
4688
|
message: "What is your project named?",
|
|
4668
4689
|
placeholder: "my-app",
|
|
4669
4690
|
initialValue: e.name ?? "",
|
|
4670
|
-
validate: (e) =>
|
|
4691
|
+
validate: (e) => io(e ?? "")
|
|
4671
4692
|
});
|
|
4672
|
-
s.isCancel(t) && B(), l = t, c =
|
|
4693
|
+
s.isCancel(t) && B(), l = t, c = no(l);
|
|
4673
4694
|
}
|
|
4674
4695
|
l.trim() !== c && s.log.info(L.muted(`Using "${L.highlight(c)}" as the project name`));
|
|
4675
4696
|
let u;
|
|
@@ -4713,7 +4734,7 @@ async function gs(e) {
|
|
|
4713
4734
|
message: "Pick a color theme",
|
|
4714
4735
|
options: r.map((e) => ({
|
|
4715
4736
|
value: e.name,
|
|
4716
|
-
label: `${
|
|
4737
|
+
label: `${vs(e)} ${e.label}`
|
|
4717
4738
|
})),
|
|
4718
4739
|
initialValue: h
|
|
4719
4740
|
});
|
|
@@ -4731,24 +4752,24 @@ async function gs(e) {
|
|
|
4731
4752
|
(s.isCancel(e) || !e) && B();
|
|
4732
4753
|
}
|
|
4733
4754
|
let _ = s.spinner();
|
|
4734
|
-
_.start("Cloning Hype Stack template..."), await
|
|
4755
|
+
_.start("Cloning Hype Stack template..."), await xo(d), _.stop(L.success("Template cloned"));
|
|
4735
4756
|
let v = s.spinner();
|
|
4736
|
-
v.start("Setting up project..."), await
|
|
4737
|
-
let y = await
|
|
4738
|
-
await
|
|
4757
|
+
v.start("Setting up project..."), await Po(d), await Io(d, c), await Oo(d, p);
|
|
4758
|
+
let y = await Lr(d), b = zr(c, y);
|
|
4759
|
+
await Ir(d, b), await Xo(d, {
|
|
4739
4760
|
projectName: c,
|
|
4740
4761
|
editor: p,
|
|
4741
4762
|
workspace: y
|
|
4742
4763
|
});
|
|
4743
4764
|
let x = T.resolve(d, b.paths?.frontend.root ?? "apps/frontend");
|
|
4744
|
-
a(g) && (await
|
|
4765
|
+
a(g) && (await bo(x, i(g)) || s.log.warn(L.muted(`Could not find ${L.path("assets/styles.css")} to apply the ${g} theme`))), e.radius !== void 0 && uo(e.radius) && (await mo(x, e.radius) || s.log.warn(L.muted(`Could not find ${L.path("assets/styles.css")} to set the corner radius`))), await co(x, e.defaultMode === "dark" || e.defaultMode === "light" ? e.defaultMode : "light") || s.log.warn(L.muted(`Could not find ${L.path("src/hooks/use-theme.ts")} to set the default color mode`)), v.stop(L.success("Project configured"));
|
|
4745
4766
|
let S = s.spinner();
|
|
4746
4767
|
S.start("Installing dependencies..."), (await J("pnpm", ["install"], { cwd: d })).exitCode === 0 ? S.stop(L.success("Dependencies installed")) : (S.stop(L.warning("Dependencies installed with warnings")), s.log.warn(L.muted("You may need to run `pnpm install` manually to resolve issues.")));
|
|
4747
4768
|
let C = s.spinner();
|
|
4748
|
-
C.start("Initializing git repository..."), await
|
|
4769
|
+
C.start("Initializing git repository..."), await Fo(d), C.stop(L.success("Git repository initialized with clean history"));
|
|
4749
4770
|
let w = s.spinner();
|
|
4750
4771
|
w.start("Creating .env files from examples...");
|
|
4751
|
-
let E = await
|
|
4772
|
+
let E = await Ao(d);
|
|
4752
4773
|
if (E.length > 0) {
|
|
4753
4774
|
let e = E.length;
|
|
4754
4775
|
w.stop(L.success(`Created ${e} .env file${e === 1 ? "" : "s"} from examples`));
|
|
@@ -4763,20 +4784,20 @@ async function gs(e) {
|
|
|
4763
4784
|
message: "Would you like to start Docker services and run database migrations now?",
|
|
4764
4785
|
initialValue: !0
|
|
4765
4786
|
}));
|
|
4766
|
-
s.isCancel(e) && B(), e ? await
|
|
4787
|
+
s.isCancel(e) && B(), e ? await Na(d, o) : s.log.info(L.muted("Docker and migrations can run later via `npx @hype-stack/cli onboard`.")), ss();
|
|
4767
4788
|
}
|
|
4768
|
-
return await
|
|
4789
|
+
return await Zo("project_create"), s.outro(L.muted("Happy building!")), d;
|
|
4769
4790
|
}
|
|
4770
4791
|
//#endregion
|
|
4771
4792
|
//#region src/commands/init.ts
|
|
4772
|
-
async function
|
|
4793
|
+
async function bs(e) {
|
|
4773
4794
|
let t = e.cwd ?? process.cwd(), n = e.silent ?? !1;
|
|
4774
|
-
if (n || (
|
|
4795
|
+
if (n || ($a(), s.intro(L.brandBold("Initialize Hype Stack configuration"))), !await Br(t)) {
|
|
4775
4796
|
s.log.error(`This doesn't look like a Hype Stack project. ${L.muted("Expected apps/ directory and package.json")}`), s.outro(L.muted(`Run ${L.command("npx @hype-stack/cli create")} to scaffold a new project.`));
|
|
4776
4797
|
return;
|
|
4777
4798
|
}
|
|
4778
|
-
if (await
|
|
4779
|
-
let e = await
|
|
4799
|
+
if (await Fr(t)) {
|
|
4800
|
+
let e = await Pr(t);
|
|
4780
4801
|
if (e && !n) {
|
|
4781
4802
|
s.log.info(`Found existing ${L.path("stack.json")} for project ${L.highlight(e.name)}`);
|
|
4782
4803
|
let t = await s.confirm({
|
|
@@ -4789,7 +4810,7 @@ async function _s(e) {
|
|
|
4789
4810
|
}
|
|
4790
4811
|
}
|
|
4791
4812
|
}
|
|
4792
|
-
let r = await
|
|
4813
|
+
let r = await Lr(t);
|
|
4793
4814
|
if (!n) {
|
|
4794
4815
|
let e = Object.entries(r.apps), t = Object.entries(r.packages);
|
|
4795
4816
|
if (e.length > 0) {
|
|
@@ -4808,21 +4829,21 @@ async function _s(e) {
|
|
|
4808
4829
|
message: "Project name for stack.json?",
|
|
4809
4830
|
placeholder: i,
|
|
4810
4831
|
initialValue: i,
|
|
4811
|
-
validate: (e) =>
|
|
4832
|
+
validate: (e) => io(e ?? "")
|
|
4812
4833
|
});
|
|
4813
|
-
s.isCancel(e) && B(), a =
|
|
4834
|
+
s.isCancel(e) && B(), a = no(e);
|
|
4814
4835
|
}
|
|
4815
|
-
await
|
|
4836
|
+
await Ir(t, zr(a, r)), n || (s.log.success(`${L.path("stack.json")} written successfully`), s.outro(L.muted("Your project is mapped and ready for Hype Stack CLI commands.")));
|
|
4816
4837
|
}
|
|
4817
|
-
async function
|
|
4818
|
-
if (await
|
|
4838
|
+
async function xs(e, t = {}, n) {
|
|
4839
|
+
if (await Fr(e)) return {
|
|
4819
4840
|
projectRoot: e,
|
|
4820
4841
|
scaffolded: !1
|
|
4821
4842
|
};
|
|
4822
|
-
let r = t.runInit ?? ((e) =>
|
|
4843
|
+
let r = t.runInit ?? ((e) => bs({
|
|
4823
4844
|
cwd: e,
|
|
4824
4845
|
silent: !0
|
|
4825
|
-
})), i = t.runCreate ?? ((e, t) =>
|
|
4846
|
+
})), i = t.runCreate ?? ((e, t) => ys({
|
|
4826
4847
|
parentDirectory: e,
|
|
4827
4848
|
deferSetup: !0,
|
|
4828
4849
|
skipBanner: !0,
|
|
@@ -4830,7 +4851,7 @@ async function vs(e, t = {}, n) {
|
|
|
4830
4851
|
defaultMode: t?.defaultMode,
|
|
4831
4852
|
radius: t?.radius
|
|
4832
4853
|
}));
|
|
4833
|
-
if (await
|
|
4854
|
+
if (await Br(e)) {
|
|
4834
4855
|
s.log.warn(`No ${L.path("stack.json")} found in ${L.path(e)}.`);
|
|
4835
4856
|
let t = await s.confirm({
|
|
4836
4857
|
message: `Create ${L.path("stack.json")} now?`,
|
|
@@ -4838,7 +4859,7 @@ async function vs(e, t = {}, n) {
|
|
|
4838
4859
|
});
|
|
4839
4860
|
if (s.isCancel(t) || !t) return null;
|
|
4840
4861
|
await r(e);
|
|
4841
|
-
let n = await
|
|
4862
|
+
let n = await Fr(e);
|
|
4842
4863
|
return n && s.log.success(`${L.path("stack.json")} created`), n ? {
|
|
4843
4864
|
projectRoot: e,
|
|
4844
4865
|
scaffolded: !1
|
|
@@ -4856,19 +4877,19 @@ async function vs(e, t = {}, n) {
|
|
|
4856
4877
|
});
|
|
4857
4878
|
if (s.isCancel(o) || !o) return null;
|
|
4858
4879
|
let c = await i(e, n);
|
|
4859
|
-
return await
|
|
4880
|
+
return await Fr(c) ? {
|
|
4860
4881
|
projectRoot: c,
|
|
4861
4882
|
scaffolded: !0
|
|
4862
4883
|
} : null;
|
|
4863
4884
|
}
|
|
4864
4885
|
//#endregion
|
|
4865
4886
|
//#region src/commands/compose.ts
|
|
4866
|
-
async function
|
|
4887
|
+
async function Ss(e = {}) {
|
|
4867
4888
|
let t = e.cwd ?? process.cwd();
|
|
4868
|
-
|
|
4869
|
-
let n = await
|
|
4889
|
+
Qa();
|
|
4890
|
+
let n = await xs(t), r = n?.projectRoot ?? null, i = n?.scaffolded ?? !1, a;
|
|
4870
4891
|
try {
|
|
4871
|
-
a = await
|
|
4892
|
+
a = await Pr(r ?? t);
|
|
4872
4893
|
} catch (e) {
|
|
4873
4894
|
s.cancel(`Could not parse ${L.path("stack.json")}: ${$(e)} Run 'npx @hype-stack/cli init' to regenerate it.`), process.exit(1);
|
|
4874
4895
|
}
|
|
@@ -4879,18 +4900,18 @@ async function ys(e = {}) {
|
|
|
4879
4900
|
c.start("Loading packs...");
|
|
4880
4901
|
let l;
|
|
4881
4902
|
try {
|
|
4882
|
-
l = await
|
|
4903
|
+
l = await Kr();
|
|
4883
4904
|
} catch (e) {
|
|
4884
4905
|
c.stop("Failed to load packs"), s.cancel(`Could not reach Hype Stack. Check your connection and try again.\n${$(e)}`), process.exit(1);
|
|
4885
4906
|
}
|
|
4886
4907
|
c.stop("Packs loaded");
|
|
4887
|
-
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 Xn(F()))?.token ?? null, h = await
|
|
4908
|
+
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 Xn(F()))?.token ?? null, h = await ts(l, d, {
|
|
4888
4909
|
token: m,
|
|
4889
4910
|
key: p
|
|
4890
4911
|
}), g = (e) => {
|
|
4891
4912
|
let t = f.get(e);
|
|
4892
4913
|
return !t || t.tier === "free" ? "free" : h[e]?.owned ? "owned" : "locked";
|
|
4893
|
-
}, _ = (e) => !d.has(e) && g(e) === "locked", v = await
|
|
4914
|
+
}, _ = (e) => !d.has(e) && g(e) === "locked", v = await Cs({
|
|
4894
4915
|
packs: l,
|
|
4895
4916
|
installedSet: d,
|
|
4896
4917
|
stateOf: g,
|
|
@@ -4901,9 +4922,9 @@ async function ys(e = {}) {
|
|
|
4901
4922
|
s.outro(L.muted("No packs selected. Nothing to do."));
|
|
4902
4923
|
return;
|
|
4903
4924
|
}
|
|
4904
|
-
let b =
|
|
4925
|
+
let b = Es(v), x = Ds(v), S = Ha(l, b), C = Fa(Ua(l, S)), w;
|
|
4905
4926
|
try {
|
|
4906
|
-
w =
|
|
4927
|
+
w = La(b, C, u);
|
|
4907
4928
|
} catch (e) {
|
|
4908
4929
|
s.cancel($(e)), process.exit(1);
|
|
4909
4930
|
}
|
|
@@ -4911,7 +4932,7 @@ async function ys(e = {}) {
|
|
|
4911
4932
|
z(`${w.alreadyInstalled.join(", ")} already installed.`, "Nothing to do"), s.outro(L.muted("Your selection is already part of the project."));
|
|
4912
4933
|
return;
|
|
4913
4934
|
}
|
|
4914
|
-
let T =
|
|
4935
|
+
let T = Ra({
|
|
4915
4936
|
order: w.order,
|
|
4916
4937
|
graph: C,
|
|
4917
4938
|
isLocked: _,
|
|
@@ -4919,28 +4940,28 @@ async function ys(e = {}) {
|
|
|
4919
4940
|
});
|
|
4920
4941
|
if (T.blocked.length > 0 && !m && !p) {
|
|
4921
4942
|
let e = await or();
|
|
4922
|
-
e && (m = e, h = await
|
|
4943
|
+
e && (m = e, h = await ts(l, d, {
|
|
4923
4944
|
token: m,
|
|
4924
4945
|
key: p
|
|
4925
|
-
}), T =
|
|
4946
|
+
}), T = Ra({
|
|
4926
4947
|
order: w.order,
|
|
4927
4948
|
graph: C,
|
|
4928
4949
|
isLocked: _,
|
|
4929
4950
|
installed: u
|
|
4930
4951
|
}));
|
|
4931
4952
|
}
|
|
4932
|
-
if (T.blocked.length > 0 && await
|
|
4953
|
+
if (T.blocked.length > 0 && await rs(T.blocked, _, f), T.installable.length === 0) {
|
|
4933
4954
|
s.outro(L.muted("Nothing left to install once locked packs are removed."));
|
|
4934
4955
|
return;
|
|
4935
4956
|
}
|
|
4936
|
-
if (
|
|
4957
|
+
if (is(T.installable, f), !e.yes) {
|
|
4937
4958
|
let e = await s.confirm({ message: `Install ${T.installable.length} pack${T.installable.length === 1 ? "" : "s"}?` });
|
|
4938
4959
|
(s.isCancel(e) || !e) && (s.cancel("Installation cancelled."), process.exit(0));
|
|
4939
4960
|
}
|
|
4940
4961
|
c.start("Downloading packs...");
|
|
4941
4962
|
let E;
|
|
4942
4963
|
try {
|
|
4943
|
-
E = await
|
|
4964
|
+
E = await as(T.installable, {
|
|
4944
4965
|
token: m,
|
|
4945
4966
|
key: p
|
|
4946
4967
|
});
|
|
@@ -4948,7 +4969,7 @@ async function ys(e = {}) {
|
|
|
4948
4969
|
c.stop("Download failed"), s.cancel($(e)), process.exit(1);
|
|
4949
4970
|
}
|
|
4950
4971
|
c.stop(`Downloaded ${E.length} pack${E.length === 1 ? "" : "s"}`);
|
|
4951
|
-
let D = await
|
|
4972
|
+
let D = await ls({
|
|
4952
4973
|
prepared: E,
|
|
4953
4974
|
config: a,
|
|
4954
4975
|
cwd: o,
|
|
@@ -4958,7 +4979,7 @@ async function ys(e = {}) {
|
|
|
4958
4979
|
});
|
|
4959
4980
|
try {
|
|
4960
4981
|
c.start("Installing pack files...");
|
|
4961
|
-
let t = await
|
|
4982
|
+
let t = await ca({
|
|
4962
4983
|
packs: E,
|
|
4963
4984
|
config: a,
|
|
4964
4985
|
projectRoot: o,
|
|
@@ -4971,22 +4992,22 @@ async function ys(e = {}) {
|
|
|
4971
4992
|
for (let e of t.errors) s.log.error(e);
|
|
4972
4993
|
s.cancel("No files were written. Fix the errors above (or pass --force for existing files) and try again."), process.exit(1);
|
|
4973
4994
|
}
|
|
4974
|
-
c.stop("Files installed"), t.installed.length > 0 && s.log.success(`${L.highlight(String(t.installed.length))} files installed`), t.skipped.length > 0 && (s.log.warning(`${t.skipped.length} files skipped (use --force to overwrite)`),
|
|
4995
|
+
c.stop("Files installed"), t.installed.length > 0 && s.log.success(`${L.highlight(String(t.installed.length))} files installed`), t.skipped.length > 0 && (s.log.warning(`${t.skipped.length} files skipped (use --force to overwrite)`), cs(t.skipped));
|
|
4975
4996
|
for (let e of t.errors) s.log.error(e);
|
|
4976
|
-
await
|
|
4997
|
+
await os({
|
|
4977
4998
|
prepared: E,
|
|
4978
4999
|
paths: a.paths,
|
|
4979
5000
|
cwd: o,
|
|
4980
5001
|
spinner: c
|
|
4981
5002
|
});
|
|
4982
5003
|
let n;
|
|
4983
|
-
i && (n = await
|
|
5004
|
+
i && (n = await Pa(o, e.yes ?? !1)), await br({
|
|
4984
5005
|
projectRoot: o,
|
|
4985
5006
|
paths: a.paths,
|
|
4986
5007
|
skipPrompts: e.yes ?? !1,
|
|
4987
5008
|
dbReady: n,
|
|
4988
5009
|
freshScaffold: i
|
|
4989
|
-
}),
|
|
5010
|
+
}), ss(), s.outro(L.brand(`Installed ${t.appliedPacks.join(", ")}.`));
|
|
4990
5011
|
} finally {
|
|
4991
5012
|
await Promise.all(E.map((e) => y.rm(e.packDir, {
|
|
4992
5013
|
recursive: !0,
|
|
@@ -4994,10 +5015,10 @@ async function ys(e = {}) {
|
|
|
4994
5015
|
})));
|
|
4995
5016
|
}
|
|
4996
5017
|
}
|
|
4997
|
-
async function
|
|
5018
|
+
async function Cs(e) {
|
|
4998
5019
|
let { packs: t, installedSet: n, stateOf: r, options: i, adminAvailable: a } = e;
|
|
4999
5020
|
if (i.packs && i.packs.length > 0) {
|
|
5000
|
-
let e = i.packs.map(
|
|
5021
|
+
let e = i.packs.map(Ts), n = e.filter((e) => !t.some((t) => t.name === e.name));
|
|
5001
5022
|
return n.length > 0 && (s.cancel(`Unknown pack${n.length === 1 ? "" : "s"}: ${n.map((e) => e.name).join(", ")}`), process.exit(1)), e;
|
|
5002
5023
|
}
|
|
5003
5024
|
let o = t.filter((e) => n.has(e.name));
|
|
@@ -5006,13 +5027,13 @@ async function bs(e) {
|
|
|
5006
5027
|
if (c.length === 0) return s.outro(L.muted("Every available pack is already installed.")), [];
|
|
5007
5028
|
let l = le();
|
|
5008
5029
|
z(c.map((e) => ` ${R.arrow} ${L.highlight(e.displayName)} ${ve(`${l}/packs/${e.name}`)}`).join("\n"), "Browse packs");
|
|
5009
|
-
let u =
|
|
5030
|
+
let u = ga(c, { adminAvailable: a }), d = [];
|
|
5010
5031
|
for (let e of u) {
|
|
5011
5032
|
let t = e.packs.map((e) => {
|
|
5012
5033
|
let t = r(e.name);
|
|
5013
5034
|
return {
|
|
5014
5035
|
value: e.name,
|
|
5015
|
-
label: `${e.displayName} ${
|
|
5036
|
+
label: `${e.displayName} ${ns(t, e.price)}`,
|
|
5016
5037
|
hint: e.description
|
|
5017
5038
|
};
|
|
5018
5039
|
});
|
|
@@ -5029,7 +5050,7 @@ async function bs(e) {
|
|
|
5029
5050
|
});
|
|
5030
5051
|
continue;
|
|
5031
5052
|
}
|
|
5032
|
-
let n = await
|
|
5053
|
+
let n = await to({
|
|
5033
5054
|
message: `Select ${e.label.toLowerCase()} to add (optional)`,
|
|
5034
5055
|
options: t,
|
|
5035
5056
|
required: !1
|
|
@@ -5039,20 +5060,20 @@ async function bs(e) {
|
|
|
5039
5060
|
}
|
|
5040
5061
|
return d;
|
|
5041
5062
|
}
|
|
5042
|
-
var
|
|
5043
|
-
function
|
|
5044
|
-
let t = e.match(
|
|
5063
|
+
var ws = /@(frontend|admin)$/;
|
|
5064
|
+
function Ts(e) {
|
|
5065
|
+
let t = e.match(ws);
|
|
5045
5066
|
return t ? {
|
|
5046
5067
|
name: e.slice(0, -t[0].length),
|
|
5047
5068
|
slot: t[1]
|
|
5048
5069
|
} : { name: e };
|
|
5049
5070
|
}
|
|
5050
|
-
function
|
|
5071
|
+
function Es(e) {
|
|
5051
5072
|
let t = /* @__PURE__ */ new Set(), n = [];
|
|
5052
5073
|
for (let r of e) t.has(r.name) || (t.add(r.name), n.push(r.name));
|
|
5053
5074
|
return n;
|
|
5054
5075
|
}
|
|
5055
|
-
function
|
|
5076
|
+
function Ds(e) {
|
|
5056
5077
|
let t = /* @__PURE__ */ new Map();
|
|
5057
5078
|
for (let n of e) {
|
|
5058
5079
|
if (!n.slot) continue;
|
|
@@ -5063,8 +5084,8 @@ function ws(e) {
|
|
|
5063
5084
|
}
|
|
5064
5085
|
//#endregion
|
|
5065
5086
|
//#region src/commands/login.ts
|
|
5066
|
-
async function
|
|
5067
|
-
|
|
5087
|
+
async function Os() {
|
|
5088
|
+
$a(), s.intro(L.brandBold("Log in to Hype Stack")), s.log.step("Opening your browser to sign in...");
|
|
5068
5089
|
let e;
|
|
5069
5090
|
try {
|
|
5070
5091
|
e = await ar({ onUrl: (e) => {
|
|
@@ -5077,8 +5098,8 @@ async function Ts() {
|
|
|
5077
5098
|
}
|
|
5078
5099
|
//#endregion
|
|
5079
5100
|
//#region src/commands/logout.ts
|
|
5080
|
-
async function
|
|
5081
|
-
|
|
5101
|
+
async function ks() {
|
|
5102
|
+
$a(), s.intro(L.brandBold("Log out of Hype Stack"));
|
|
5082
5103
|
let e = F(), t = await Xn(e);
|
|
5083
5104
|
if (!t) {
|
|
5084
5105
|
s.outro(L.muted("You're not logged in."));
|
|
@@ -5088,7 +5109,7 @@ async function Es() {
|
|
|
5088
5109
|
}
|
|
5089
5110
|
//#endregion
|
|
5090
5111
|
//#region src/core/onboard-env.ts
|
|
5091
|
-
function
|
|
5112
|
+
function As(e) {
|
|
5092
5113
|
let t = [], n = "";
|
|
5093
5114
|
for (let r of e.split(/\r?\n/)) {
|
|
5094
5115
|
let e = r.trim();
|
|
@@ -5114,14 +5135,14 @@ function Ds(e) {
|
|
|
5114
5135
|
}
|
|
5115
5136
|
return t;
|
|
5116
5137
|
}
|
|
5117
|
-
function
|
|
5138
|
+
function js(e) {
|
|
5118
5139
|
let t = e.trim();
|
|
5119
5140
|
if (t === "") return "";
|
|
5120
5141
|
if (t.length <= 4) return "•".repeat(t.length);
|
|
5121
5142
|
let n = Math.min(t.length - 4, 8);
|
|
5122
5143
|
return `${"•".repeat(n)}${t.slice(-4)}`;
|
|
5123
5144
|
}
|
|
5124
|
-
function
|
|
5145
|
+
function Ms(e, t, n) {
|
|
5125
5146
|
let r = e.split(/\r?\n/), i = !1, a = r.map((e) => {
|
|
5126
5147
|
if (i) return e;
|
|
5127
5148
|
let r = e.trim();
|
|
@@ -5131,58 +5152,58 @@ function ks(e, t, n) {
|
|
|
5131
5152
|
});
|
|
5132
5153
|
return i ? a.join("\n") : e + `${e.length > 0 && !e.endsWith("\n") ? "\n" : ""}${t}=${n}\n`;
|
|
5133
5154
|
}
|
|
5134
|
-
async function
|
|
5155
|
+
async function Ns(e) {
|
|
5135
5156
|
return await Y(e) ? y.readFile(e, "utf-8") : "";
|
|
5136
5157
|
}
|
|
5137
|
-
async function
|
|
5158
|
+
async function Ps(e) {
|
|
5138
5159
|
let t = T.join(T.dirname(e), ".env");
|
|
5139
5160
|
return await Y(t) || await y.copyFile(e, t), t;
|
|
5140
5161
|
}
|
|
5141
|
-
async function
|
|
5142
|
-
let r =
|
|
5162
|
+
async function Fs(e, t, n) {
|
|
5163
|
+
let r = Ms(await Ns(e), t, n);
|
|
5143
5164
|
await y.writeFile(e, r, "utf-8");
|
|
5144
5165
|
}
|
|
5145
5166
|
//#endregion
|
|
5146
5167
|
//#region src/commands/onboard.ts
|
|
5147
|
-
async function
|
|
5168
|
+
async function Is(e = {}) {
|
|
5148
5169
|
let t = e.cwd ?? process.cwd();
|
|
5149
|
-
|
|
5170
|
+
Qa(), s.intro(L.brandBold("Onboard your stack"));
|
|
5150
5171
|
let n;
|
|
5151
5172
|
try {
|
|
5152
|
-
n = await
|
|
5173
|
+
n = await Pr(t);
|
|
5153
5174
|
} catch {
|
|
5154
5175
|
n = null;
|
|
5155
5176
|
}
|
|
5156
5177
|
n || (s.cancel(`${L.path("stack.json")} not found. Run ${L.command("npx @hype-stack/cli init")} first.`), process.exit(1));
|
|
5157
|
-
let r = n.installedPacks ?? [], i = n.onboarding?.envSections ?? [], a = await
|
|
5178
|
+
let r = n.installedPacks ?? [], i = n.onboarding?.envSections ?? [], a = await jo(t);
|
|
5158
5179
|
a.length === 0 && s.log.warn(L.muted("No .env.example files found; skipping env setup."));
|
|
5159
|
-
for (let n of a) await
|
|
5180
|
+
for (let n of a) await Ls({
|
|
5160
5181
|
examplePath: n,
|
|
5161
5182
|
projectRoot: t,
|
|
5162
5183
|
skipPrompts: e.yes ?? !1,
|
|
5163
5184
|
installedEnvSections: i
|
|
5164
5185
|
});
|
|
5165
|
-
let o =
|
|
5166
|
-
o.length > 0 && z(o.map((e) => ` ${L.muted("·")} ${e}`).join("\n"), "Tips"), e.skipMigrations || await
|
|
5186
|
+
let o = Nr(r);
|
|
5187
|
+
o.length > 0 && z(o.map((e) => ` ${L.muted("·")} ${e}`).join("\n"), "Tips"), e.skipMigrations || await Bs(t, e.yes ?? !1), s.outro(L.brand(`All set. Run ${L.command("pnpm dev")} to start your app.`));
|
|
5167
5188
|
}
|
|
5168
|
-
async function
|
|
5169
|
-
let { examplePath: t, projectRoot: n, skipPrompts: r, installedEnvSections: i } = e, a = T.relative(n, t) || t, o = await
|
|
5189
|
+
async function Ls(e) {
|
|
5190
|
+
let { examplePath: t, projectRoot: n, skipPrompts: r, installedEnvSections: i } = e, a = T.relative(n, t) || t, o = await Ps(t), c = await Ns(o), l = As(await y.readFile(t, "utf-8")), u = L.path(a);
|
|
5170
5191
|
s.log.step(`Env: ${u}`);
|
|
5171
5192
|
for (let e of l) {
|
|
5172
5193
|
if (e.vars.length === 0) continue;
|
|
5173
|
-
if (!
|
|
5194
|
+
if (!kr(e.section, i)) {
|
|
5174
5195
|
let t = e.section ? L.bold(e.section) : L.bold("Variables");
|
|
5175
5196
|
s.log.info(`${t} ${L.muted("skipped (not owned by an installed pack)")}`);
|
|
5176
5197
|
continue;
|
|
5177
5198
|
}
|
|
5178
|
-
let t =
|
|
5199
|
+
let t = Or(e.section), n = e.section ? L.bold(e.section) : L.bold("Variables");
|
|
5179
5200
|
s.log.step(n), t.link && (s.log.info(`${L.muted("Get your values:")} ${ve(t.link)}`), t.serviceChecklist && t.serviceChecklist.length > 0 && z(t.serviceChecklist.map((e) => ` ${L.muted("·")} ${e}`).join("\n"), "Setup")), s.log.info(L.muted(t.hint)), s.log.info(L.muted("Press Enter to keep the current value."));
|
|
5180
5201
|
for (let n of e.vars) {
|
|
5181
5202
|
if (r) {
|
|
5182
5203
|
s.log.info(`${L.label(n.key)} ${L.muted("skipped (non-interactive)")}`);
|
|
5183
5204
|
continue;
|
|
5184
5205
|
}
|
|
5185
|
-
let e =
|
|
5206
|
+
let e = js(Rs(c, n.key)), i = await s.text({
|
|
5186
5207
|
message: `${L.label(n.key)}`,
|
|
5187
5208
|
placeholder: e ? `${e} ${L.muted("(Enter keeps this)")}` : t.hint
|
|
5188
5209
|
});
|
|
@@ -5192,31 +5213,31 @@ async function Ps(e) {
|
|
|
5192
5213
|
s.log.info(L.muted(`${n.key} unchanged.`));
|
|
5193
5214
|
continue;
|
|
5194
5215
|
}
|
|
5195
|
-
await
|
|
5216
|
+
await Fs(o, n.key, a), s.log.success(`${n.key} saved`);
|
|
5196
5217
|
}
|
|
5197
5218
|
}
|
|
5198
5219
|
}
|
|
5199
|
-
function
|
|
5220
|
+
function Rs(e, t) {
|
|
5200
5221
|
for (let n of e.split(/\r?\n/)) {
|
|
5201
|
-
let e = n.match(RegExp(`^${
|
|
5222
|
+
let e = n.match(RegExp(`^${zs(t)}\\s*=\\s*(.*)$`));
|
|
5202
5223
|
if (e) return e[1].trim();
|
|
5203
5224
|
}
|
|
5204
5225
|
return "";
|
|
5205
5226
|
}
|
|
5206
|
-
function
|
|
5227
|
+
function zs(e) {
|
|
5207
5228
|
return e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
5208
5229
|
}
|
|
5209
|
-
async function
|
|
5210
|
-
if (!await
|
|
5230
|
+
async function Bs(e, t) {
|
|
5231
|
+
if (!await ya() && !await xa(e, t, !1)) {
|
|
5211
5232
|
s.log.info(L.muted(`Start services later with ${L.command("docker compose up -d")} (in apps/backend), then ${L.command("pnpm --filter @internal/backend migration:latest")}.`));
|
|
5212
5233
|
return;
|
|
5213
5234
|
}
|
|
5214
5235
|
let n = s.spinner();
|
|
5215
|
-
if (n.start("Waiting for Postgres to be ready..."), !await
|
|
5236
|
+
if (n.start("Waiting for Postgres to be ready..."), !await Da(e)) {
|
|
5216
5237
|
n.error("Postgres health check timed out"), s.log.warn(L.muted(`Run migrations manually once Postgres is ready: ${L.command("pnpm --filter @internal/backend migration:latest")}`));
|
|
5217
5238
|
return;
|
|
5218
5239
|
}
|
|
5219
|
-
if (n.stop(L.success("Postgres is ready")), await
|
|
5240
|
+
if (n.stop(L.success("Postgres is ready")), await ka(e)) {
|
|
5220
5241
|
s.log.info(L.muted("Migrations already applied, skipping."));
|
|
5221
5242
|
return;
|
|
5222
5243
|
}
|
|
@@ -5228,20 +5249,20 @@ async function Ls(e, t) {
|
|
|
5228
5249
|
s.log.info(L.muted("Skipping database migrations."));
|
|
5229
5250
|
return;
|
|
5230
5251
|
}
|
|
5231
|
-
await
|
|
5252
|
+
await Aa(e);
|
|
5232
5253
|
}
|
|
5233
5254
|
//#endregion
|
|
5234
5255
|
//#region src/core/templates.ts
|
|
5235
|
-
var
|
|
5256
|
+
var Vs = q.createRequest()({
|
|
5236
5257
|
endpoint: "/templates/list",
|
|
5237
5258
|
method: "GET"
|
|
5238
5259
|
});
|
|
5239
|
-
async function
|
|
5240
|
-
let { data: e, error: t } = await
|
|
5260
|
+
async function Hs() {
|
|
5261
|
+
let { data: e, error: t } = await Vs.send();
|
|
5241
5262
|
if (t || !e) throw Error(`Failed to fetch template list: ${String(t)}`);
|
|
5242
5263
|
return e.templates;
|
|
5243
5264
|
}
|
|
5244
|
-
async function
|
|
5265
|
+
async function Us(e) {
|
|
5245
5266
|
let { data: t, error: n, status: r } = await q.createRequest()({
|
|
5246
5267
|
endpoint: `/templates/${encodeURIComponent(e)}/manifest`,
|
|
5247
5268
|
method: "GET"
|
|
@@ -5250,7 +5271,7 @@ async function Bs(e) {
|
|
|
5250
5271
|
if (n || !t) throw Error(`Failed to load manifest for template "${e}": ${String(n)}`);
|
|
5251
5272
|
return t;
|
|
5252
5273
|
}
|
|
5253
|
-
async function
|
|
5274
|
+
async function Ws(e, t = {}) {
|
|
5254
5275
|
let n = q.createRequest()({
|
|
5255
5276
|
endpoint: `/templates/${encodeURIComponent(e)}/download`,
|
|
5256
5277
|
method: "POST"
|
|
@@ -5278,21 +5299,21 @@ async function Vs(e, t = {}) {
|
|
|
5278
5299
|
}
|
|
5279
5300
|
//#endregion
|
|
5280
5301
|
//#region src/commands/template.ts
|
|
5281
|
-
async function
|
|
5302
|
+
async function Gs(t = {}) {
|
|
5282
5303
|
let n = t.cwd ?? process.cwd();
|
|
5283
|
-
|
|
5304
|
+
Qa();
|
|
5284
5305
|
let r = s.spinner();
|
|
5285
5306
|
r.start("Loading packs...");
|
|
5286
5307
|
let o;
|
|
5287
5308
|
try {
|
|
5288
|
-
o = await
|
|
5309
|
+
o = await Kr();
|
|
5289
5310
|
} catch (e) {
|
|
5290
5311
|
r.stop("Failed to load packs"), s.cancel(`Could not reach Hype Stack. Check your connection and try again.\n${$(e)}`), process.exit(1);
|
|
5291
5312
|
}
|
|
5292
5313
|
r.stop("Packs loaded"), r.start("Loading templates...");
|
|
5293
5314
|
let c;
|
|
5294
5315
|
try {
|
|
5295
|
-
c = await
|
|
5316
|
+
c = await Hs();
|
|
5296
5317
|
} catch (e) {
|
|
5297
5318
|
r.stop("Failed to load templates"), s.cancel(`Could not reach Hype Stack. Check your connection and try again.\n${$(e)}`), process.exit(1);
|
|
5298
5319
|
}
|
|
@@ -5315,33 +5336,33 @@ async function Hs(t = {}) {
|
|
|
5315
5336
|
u || (r.stop("Template not found"), s.cancel(`Template "${l}" not found. Available: ${c.map((e) => e.id).join(", ") || "(none)"}`), process.exit(1)), r.stop(`Template: ${u.name}`);
|
|
5316
5337
|
let d;
|
|
5317
5338
|
try {
|
|
5318
|
-
d = await
|
|
5339
|
+
d = await Us(u.id);
|
|
5319
5340
|
} catch (e) {
|
|
5320
5341
|
s.cancel($(e)), process.exit(1);
|
|
5321
5342
|
}
|
|
5322
|
-
let f = await
|
|
5343
|
+
let f = await xs(n, {}, {
|
|
5323
5344
|
defaultTheme: d.theme,
|
|
5324
5345
|
defaultMode: d.defaultMode,
|
|
5325
5346
|
radius: d.radius
|
|
5326
5347
|
}), p = f?.projectRoot ?? null, m = f?.scaffolded ?? !1, h;
|
|
5327
5348
|
try {
|
|
5328
|
-
h = await
|
|
5349
|
+
h = await Pr(p ?? n);
|
|
5329
5350
|
} catch (e) {
|
|
5330
5351
|
s.cancel(`Could not parse ${L.path("stack.json")}: ${$(e)} Run 'npx @hype-stack/cli init' to regenerate it.`), process.exit(1);
|
|
5331
5352
|
}
|
|
5332
5353
|
h || (s.cancel(p ? `Could not read ${L.path("stack.json")}. Run 'npx @hype-stack/cli init' to regenerate it, then run 'npx @hype-stack/cli template' again.` : `No ${L.path("stack.json")}. Run 'npx @hype-stack/cli init' first, then 'npx @hype-stack/cli template'.`), process.exit(1)), h.paths || (s.cancel(`${L.path("stack.json")} is missing ${L.path("paths")}. Run 'npx @hype-stack/cli init' again to regenerate it.`), process.exit(1));
|
|
5333
5354
|
let g = p ?? n;
|
|
5334
5355
|
s.intro(L.brandBold("Install a template"));
|
|
5335
|
-
let _ = h.installedPacks ?? [], v = new Set(_), b = new Map(o.map((e) => [e.name, e])), x = t.licenseKey ?? h.licenseKey ?? null, S = (await Xn(F()))?.token ?? null, C = await
|
|
5356
|
+
let _ = h.installedPacks ?? [], v = new Set(_), b = new Map(o.map((e) => [e.name, e])), x = t.licenseKey ?? h.licenseKey ?? null, S = (await Xn(F()))?.token ?? null, C = await Ks(u, t.variants, t.yes ?? !1), w = za(u.slots, C), E = Ba(u.slots, u.packs, w), D = await qs({
|
|
5336
5357
|
packs: o,
|
|
5337
5358
|
templatePacks: E,
|
|
5338
5359
|
installedSet: v,
|
|
5339
5360
|
options: t
|
|
5340
5361
|
}), O = [...E, ...D.filter((e) => !E.includes(e))], k = O.filter((e) => !b.has(e));
|
|
5341
5362
|
k.length > 0 && (s.cancel(`Unknown pack${k.length === 1 ? "" : "s"}: ${k.join(", ")}`), process.exit(1));
|
|
5342
|
-
let ee =
|
|
5363
|
+
let ee = Ua(o, w), A = Fa(ee), te;
|
|
5343
5364
|
try {
|
|
5344
|
-
te =
|
|
5365
|
+
te = La(O, A, _);
|
|
5345
5366
|
} catch (e) {
|
|
5346
5367
|
s.cancel($(e)), process.exit(1);
|
|
5347
5368
|
}
|
|
@@ -5349,13 +5370,13 @@ async function Hs(t = {}) {
|
|
|
5349
5370
|
s.outro(L.muted("Every pack in this template is already installed."));
|
|
5350
5371
|
return;
|
|
5351
5372
|
}
|
|
5352
|
-
let ne = await
|
|
5373
|
+
let ne = await ts(ee, v, {
|
|
5353
5374
|
token: S,
|
|
5354
5375
|
key: x
|
|
5355
5376
|
}), re = (e) => {
|
|
5356
5377
|
let t = b.get(e);
|
|
5357
5378
|
return !t || t.tier === "free" ? "free" : ne[e]?.owned ? "owned" : "locked";
|
|
5358
|
-
}, j = (e) => !v.has(e) && re(e) === "locked", M =
|
|
5379
|
+
}, j = (e) => !v.has(e) && re(e) === "locked", M = Ra({
|
|
5359
5380
|
order: te.order,
|
|
5360
5381
|
graph: A,
|
|
5361
5382
|
isLocked: j,
|
|
@@ -5363,28 +5384,28 @@ async function Hs(t = {}) {
|
|
|
5363
5384
|
});
|
|
5364
5385
|
if (M.blocked.length > 0 && !S && !x) {
|
|
5365
5386
|
let e = await or();
|
|
5366
|
-
e && (S = e, ne = await
|
|
5387
|
+
e && (S = e, ne = await ts(ee, v, {
|
|
5367
5388
|
token: S,
|
|
5368
5389
|
key: x
|
|
5369
|
-
}), M =
|
|
5390
|
+
}), M = Ra({
|
|
5370
5391
|
order: te.order,
|
|
5371
5392
|
graph: A,
|
|
5372
5393
|
isLocked: j,
|
|
5373
5394
|
installed: _
|
|
5374
5395
|
}));
|
|
5375
5396
|
}
|
|
5376
|
-
if (M.blocked.length > 0 && await
|
|
5397
|
+
if (M.blocked.length > 0 && await rs(M.blocked, j, b), M.installable.length === 0) {
|
|
5377
5398
|
s.outro(L.muted("Nothing left to install once locked packs are removed."));
|
|
5378
5399
|
return;
|
|
5379
5400
|
}
|
|
5380
|
-
if (
|
|
5401
|
+
if (is(M.installable, b), !t.yes) {
|
|
5381
5402
|
let e = await s.confirm({ message: `Install template ${L.brandBold(u.name)} (${M.installable.length} pack${M.installable.length === 1 ? "" : "s"})?` });
|
|
5382
5403
|
(s.isCancel(e) || !e) && (s.cancel("Installation cancelled."), process.exit(0));
|
|
5383
5404
|
}
|
|
5384
5405
|
r.start("Downloading packs...");
|
|
5385
5406
|
let N;
|
|
5386
5407
|
try {
|
|
5387
|
-
N = await
|
|
5408
|
+
N = await as(M.installable, {
|
|
5388
5409
|
token: S,
|
|
5389
5410
|
key: x
|
|
5390
5411
|
});
|
|
@@ -5392,7 +5413,7 @@ async function Hs(t = {}) {
|
|
|
5392
5413
|
r.stop("Download failed"), s.cancel($(e)), process.exit(1);
|
|
5393
5414
|
}
|
|
5394
5415
|
r.stop(`Downloaded ${N.length} pack${N.length === 1 ? "" : "s"}`);
|
|
5395
|
-
let ie = await
|
|
5416
|
+
let ie = await ls({
|
|
5396
5417
|
prepared: N,
|
|
5397
5418
|
config: h,
|
|
5398
5419
|
cwd: g,
|
|
@@ -5401,7 +5422,7 @@ async function Hs(t = {}) {
|
|
|
5401
5422
|
}), P = null;
|
|
5402
5423
|
try {
|
|
5403
5424
|
r.start("Installing pack files...");
|
|
5404
|
-
let n = await
|
|
5425
|
+
let n = await ca({
|
|
5405
5426
|
packs: N,
|
|
5406
5427
|
config: h,
|
|
5407
5428
|
projectRoot: g,
|
|
@@ -5413,15 +5434,15 @@ async function Hs(t = {}) {
|
|
|
5413
5434
|
for (let e of n.errors) s.log.error(e);
|
|
5414
5435
|
s.cancel("No files were written. Fix the errors above (or pass --force for existing files) and try again."), process.exit(1);
|
|
5415
5436
|
}
|
|
5416
|
-
r.stop("Files installed"), n.installed.length > 0 && s.log.success(`${L.highlight(String(n.installed.length))} files installed`), n.skipped.length > 0 && (s.log.warning(`${n.skipped.length} files skipped (use --force to overwrite)`),
|
|
5437
|
+
r.stop("Files installed"), n.installed.length > 0 && s.log.success(`${L.highlight(String(n.installed.length))} files installed`), n.skipped.length > 0 && (s.log.warning(`${n.skipped.length} files skipped (use --force to overwrite)`), cs(n.skipped));
|
|
5417
5438
|
for (let e of n.errors) s.log.error(e);
|
|
5418
5439
|
r.start("Applying template overrides...");
|
|
5419
|
-
let o = await
|
|
5440
|
+
let o = await Ws(u.id, {
|
|
5420
5441
|
token: S,
|
|
5421
5442
|
licenseKey: x
|
|
5422
5443
|
});
|
|
5423
5444
|
o.status === "denied" && (r.stop("Template download denied"), s.cancel(`Access to template "${u.id}" was denied (${o.reason}). Try 'npx @hype-stack/cli login' or check your license.`), process.exit(1)), P = o.templateDir;
|
|
5424
|
-
let c = await
|
|
5445
|
+
let c = await ua({
|
|
5425
5446
|
manifest: d,
|
|
5426
5447
|
config: h,
|
|
5427
5448
|
projectRoot: g,
|
|
@@ -5431,11 +5452,11 @@ async function Hs(t = {}) {
|
|
|
5431
5452
|
for (let e of c.errors) s.log.error(e);
|
|
5432
5453
|
if (!m) {
|
|
5433
5454
|
let t = T.resolve(g, h.paths?.frontend.root ?? "apps/frontend"), n = d.theme ?? "zinc-mono";
|
|
5434
|
-
a(n) && (await
|
|
5455
|
+
a(n) && (await bo(t, i(n)) ? s.log.success(`Applied the ${i(n).label} theme`) : s.log.warning(L.muted(`Could not find ${L.path("assets/styles.css")} to apply the theme`))), d.radius !== void 0 && uo(d.radius) && (await mo(t, d.radius) ? s.log.success(`Set the corner radius to ${d.radius}`) : s.log.warning(L.muted(`Could not find ${L.path("assets/styles.css")} to set the corner radius`)));
|
|
5435
5456
|
let r = d.defaultMode === "dark" || d.defaultMode === "light" ? d.defaultMode : e;
|
|
5436
|
-
await
|
|
5457
|
+
await co(t, r) ? s.log.success(`Default color mode set to ${r}`) : s.log.warning(L.muted(`Could not find ${L.path("src/hooks/use-theme.ts")} to set the default color mode`));
|
|
5437
5458
|
}
|
|
5438
|
-
await
|
|
5459
|
+
await Js({
|
|
5439
5460
|
prepared: N,
|
|
5440
5461
|
templateNpm: d.dependencies_npm,
|
|
5441
5462
|
paths: h.paths,
|
|
@@ -5443,13 +5464,13 @@ async function Hs(t = {}) {
|
|
|
5443
5464
|
spinner: r
|
|
5444
5465
|
});
|
|
5445
5466
|
let l;
|
|
5446
|
-
m && (l = await
|
|
5467
|
+
m && (l = await Pa(g, t.yes ?? !1)), await br({
|
|
5447
5468
|
projectRoot: g,
|
|
5448
5469
|
paths: h.paths,
|
|
5449
5470
|
skipPrompts: t.yes ?? !1,
|
|
5450
5471
|
dbReady: l,
|
|
5451
5472
|
freshScaffold: m
|
|
5452
|
-
}),
|
|
5473
|
+
}), ss(), s.outro(L.brand(`Installed template ${u.name}.`));
|
|
5453
5474
|
} finally {
|
|
5454
5475
|
await Promise.all(N.map((e) => y.rm(e.packDir, {
|
|
5455
5476
|
recursive: !0,
|
|
@@ -5460,7 +5481,7 @@ async function Hs(t = {}) {
|
|
|
5460
5481
|
});
|
|
5461
5482
|
}
|
|
5462
5483
|
}
|
|
5463
|
-
async function
|
|
5484
|
+
async function Ks(e, t, n) {
|
|
5464
5485
|
let r = {};
|
|
5465
5486
|
for (let i of e.slots) {
|
|
5466
5487
|
if (t?.[i.family]) {
|
|
@@ -5484,7 +5505,7 @@ async function Us(e, t, n) {
|
|
|
5484
5505
|
}
|
|
5485
5506
|
return r;
|
|
5486
5507
|
}
|
|
5487
|
-
async function
|
|
5508
|
+
async function qs(e) {
|
|
5488
5509
|
let { packs: t, templatePacks: n, installedSet: r, options: i } = e, a = new Set(n);
|
|
5489
5510
|
if (i.packs && i.packs.length > 0) {
|
|
5490
5511
|
let e = i.packs.filter((e) => !t.some((t) => t.name === e));
|
|
@@ -5495,7 +5516,7 @@ async function Ws(e) {
|
|
|
5495
5516
|
if (o.length === 0) return [];
|
|
5496
5517
|
let c = le();
|
|
5497
5518
|
z(o.map((e) => ` ${R.arrow} ${L.highlight(e.displayName)} ${ve(`${c}/packs/${e.name}`)}`).join("\n"), "Browse packs");
|
|
5498
|
-
let l = await
|
|
5519
|
+
let l = await to({
|
|
5499
5520
|
message: "Add extra packs on top of the template (optional)",
|
|
5500
5521
|
options: o.map((e) => ({
|
|
5501
5522
|
value: e.name,
|
|
@@ -5506,25 +5527,25 @@ async function Ws(e) {
|
|
|
5506
5527
|
});
|
|
5507
5528
|
return m(l) && (s.cancel("Cancelled."), process.exit(0)), l;
|
|
5508
5529
|
}
|
|
5509
|
-
async function
|
|
5510
|
-
let { prepared: t, templateNpm: n, paths: r, cwd: i, spinner: a } = e, o =
|
|
5530
|
+
async function Js(e) {
|
|
5531
|
+
let { prepared: t, templateNpm: n, paths: r, cwd: i, spinner: a } = e, o = $o(t.map((e) => e.manifest.dependencies_npm)), c = Qo(n ? $o([o, n]) : o, r);
|
|
5511
5532
|
if (c.errors.length > 0) {
|
|
5512
5533
|
for (let e of c.errors) s.log.error(e);
|
|
5513
5534
|
return;
|
|
5514
5535
|
}
|
|
5515
5536
|
if (c.operations.length === 0) return;
|
|
5516
5537
|
a.start("Installing npm dependencies...");
|
|
5517
|
-
let l = await
|
|
5538
|
+
let l = await es(c.operations, i);
|
|
5518
5539
|
if (a.stop(l.ok ? "npm dependencies installed" : "npm dependency installation failed"), !l.ok) for (let e of l.errors) s.log.error(e);
|
|
5519
5540
|
}
|
|
5520
5541
|
//#endregion
|
|
5521
5542
|
//#region src/cli.ts
|
|
5522
|
-
function
|
|
5543
|
+
function Ys(e) {
|
|
5523
5544
|
if (!e) return;
|
|
5524
5545
|
let t = e.split(",").map((e) => e.trim()).filter((e) => e.length > 0);
|
|
5525
5546
|
return t.length > 0 ? t : void 0;
|
|
5526
5547
|
}
|
|
5527
|
-
function
|
|
5548
|
+
function Xs(e) {
|
|
5528
5549
|
if (!e) return;
|
|
5529
5550
|
let t = {};
|
|
5530
5551
|
for (let n of e.split(",")) {
|
|
@@ -5533,10 +5554,10 @@ function qs(e) {
|
|
|
5533
5554
|
}
|
|
5534
5555
|
return Object.keys(t).length > 0 ? t : void 0;
|
|
5535
5556
|
}
|
|
5536
|
-
function
|
|
5557
|
+
function Zs() {
|
|
5537
5558
|
let e = new o();
|
|
5538
5559
|
return e.name("hype-stack").description("Build with Hype Stack -- templates, components, modules, and more").version(A, "-v, --version"), e.command("create").description("Create a new Hype Stack project").option("-n, --name <name>", "Project name").option("-d, --directory <path>", "Target directory").option("-e, --editor <editor>", "Code editor (cursor, claude, windsurf, copilot)").option("-t, --theme <theme>", "Color theme (default, slate, rose, emerald, violet, amber, ocean, zinc-mono, crimson, midnight)").option("--no-install", "Skip dependency installation").option("--no-setup", "Skip Docker services and database migrations after create").option("-y, --yes", "Skip confirmation prompts (requires --name)").action(async (e) => {
|
|
5539
|
-
await
|
|
5560
|
+
await ys({
|
|
5540
5561
|
name: e.name,
|
|
5541
5562
|
directory: e.directory,
|
|
5542
5563
|
install: e.install,
|
|
@@ -5546,38 +5567,38 @@ function Js() {
|
|
|
5546
5567
|
setup: e.setup
|
|
5547
5568
|
});
|
|
5548
5569
|
}), e.command("init").description("Initialize stack.json in the current project").action(async () => {
|
|
5549
|
-
await
|
|
5570
|
+
await bs({});
|
|
5550
5571
|
}), e.command("onboard").description("Set up env vars, run migrations, and get the start command").option("-y, --yes", "Skip prompts, accept defaults").option("--skip-migrations", "Skip Docker services and database migrations").option("--cwd <path>", "Working directory").action(async (e) => {
|
|
5551
|
-
await
|
|
5572
|
+
await Is({
|
|
5552
5573
|
cwd: e.cwd,
|
|
5553
5574
|
yes: e.yes,
|
|
5554
5575
|
skipMigrations: e.skipMigrations
|
|
5555
5576
|
});
|
|
5556
5577
|
}), 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) => {
|
|
5557
|
-
await
|
|
5558
|
-
packs:
|
|
5578
|
+
await Ss({
|
|
5579
|
+
packs: Ys(e.packs),
|
|
5559
5580
|
force: e.force,
|
|
5560
5581
|
yes: e.yes,
|
|
5561
5582
|
licenseKey: e.key ?? e.licenseKey,
|
|
5562
5583
|
cwd: e.cwd
|
|
5563
5584
|
});
|
|
5564
5585
|
}), 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) => {
|
|
5565
|
-
await
|
|
5586
|
+
await Gs({
|
|
5566
5587
|
templateId: e,
|
|
5567
|
-
variants:
|
|
5568
|
-
packs:
|
|
5588
|
+
variants: Xs(t.variants),
|
|
5589
|
+
packs: Ys(t.packs),
|
|
5569
5590
|
force: t.force,
|
|
5570
5591
|
yes: t.yes,
|
|
5571
5592
|
licenseKey: t.key ?? t.licenseKey,
|
|
5572
5593
|
cwd: t.cwd
|
|
5573
5594
|
});
|
|
5574
5595
|
}), e.command("login").description("Log in via your browser to install packs your organization owns").action(async () => {
|
|
5575
|
-
await
|
|
5596
|
+
await Os();
|
|
5576
5597
|
}), e.command("logout").description("Log out and remove the saved CLI token").action(async () => {
|
|
5577
|
-
await
|
|
5598
|
+
await ks();
|
|
5578
5599
|
}), e.command("auth").description("Alias for `login`").action(async () => {
|
|
5579
|
-
await
|
|
5600
|
+
await Os();
|
|
5580
5601
|
}), e;
|
|
5581
5602
|
}
|
|
5582
5603
|
//#endregion
|
|
5583
|
-
export {
|
|
5604
|
+
export { xs as a, Ss as i, ks as n, bs as o, Os as r, ys as s, Zs as t };
|