@hype-stack/cli 0.5.14 → 0.5.16
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-B8l-9vsh.js → cli-af9BUVrT.js} +578 -529
- 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/core/post-setup.d.ts +7 -0
- package/dist/core/post-setup.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
|
@@ -13,7 +13,7 @@ import { Prompt as 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.16", 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);
|
|
2490
|
+
return;
|
|
2491
|
+
}
|
|
2492
|
+
if (!await vr(u, c)) {
|
|
2493
|
+
yr(l);
|
|
2473
2494
|
return;
|
|
2474
2495
|
}
|
|
2475
|
-
let
|
|
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,13 +3617,41 @@ 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
|
-
|
|
3626
|
+
function Ca(e) {
|
|
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;
|
|
3628
|
+
}
|
|
3629
|
+
function wa(e) {
|
|
3630
|
+
return e.match(/container name "\/?([^"]+)"/i)?.[1] ?? null;
|
|
3631
|
+
}
|
|
3632
|
+
function Ta(e) {
|
|
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;
|
|
3634
|
+
}
|
|
3635
|
+
function Ea(e) {
|
|
3636
|
+
let t = (e.stderr || e.stdout).trim(), n = Ca(t);
|
|
3637
|
+
if (!n) {
|
|
3638
|
+
t && s.log.warn(L.muted(t));
|
|
3639
|
+
return;
|
|
3640
|
+
}
|
|
3641
|
+
if (n === "container") {
|
|
3642
|
+
let e = wa(t);
|
|
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.`));
|
|
3644
|
+
} else {
|
|
3645
|
+
let e = Ta(t);
|
|
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.`));
|
|
3647
|
+
}
|
|
3648
|
+
z([
|
|
3649
|
+
`${L.command("docker ps")} ${L.muted("see what's already running")}`,
|
|
3650
|
+
`${L.command("docker compose down")} ${L.muted("run in the other project's apps/backend to free its services")}`,
|
|
3651
|
+
L.muted("then re-run this command and start Docker again")
|
|
3652
|
+
].join("\n"), "Free up Docker, then retry"), t && s.log.warn(L.muted(t));
|
|
3653
|
+
}
|
|
3654
|
+
async function Da(e, t = 15, n = 2e3) {
|
|
3606
3655
|
for (let r = 0; r < t; r++) {
|
|
3607
3656
|
if ((await J("docker", [
|
|
3608
3657
|
"compose",
|
|
@@ -3617,8 +3666,8 @@ async function ba(e, t = 15, n = 2e3) {
|
|
|
3617
3666
|
}
|
|
3618
3667
|
return !1;
|
|
3619
3668
|
}
|
|
3620
|
-
var
|
|
3621
|
-
async function
|
|
3669
|
+
var Oa = "Database schema is up to date";
|
|
3670
|
+
async function ka(e) {
|
|
3622
3671
|
let t = await J("pnpm", [
|
|
3623
3672
|
"--filter",
|
|
3624
3673
|
"@internal/backend",
|
|
@@ -3627,9 +3676,9 @@ async function Sa(e) {
|
|
|
3627
3676
|
"migrate",
|
|
3628
3677
|
"status"
|
|
3629
3678
|
], { cwd: e });
|
|
3630
|
-
return t.exitCode === 0 ? `${t.stdout}\n${t.stderr}`.includes(
|
|
3679
|
+
return t.exitCode === 0 ? `${t.stdout}\n${t.stderr}`.includes(Oa) : !1;
|
|
3631
3680
|
}
|
|
3632
|
-
async function
|
|
3681
|
+
async function Aa(e) {
|
|
3633
3682
|
let t = s.spinner();
|
|
3634
3683
|
t.start("Running database migrations...");
|
|
3635
3684
|
let n = await J("pnpm", [
|
|
@@ -3637,15 +3686,15 @@ async function Ca(e) {
|
|
|
3637
3686
|
"@internal/backend",
|
|
3638
3687
|
"migration:latest"
|
|
3639
3688
|
], { cwd: e });
|
|
3640
|
-
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);
|
|
3641
3690
|
}
|
|
3642
|
-
async function
|
|
3643
|
-
if (!await
|
|
3691
|
+
async function ja(e, t, n = {}) {
|
|
3692
|
+
if (!await xa(e, t, await ya())) return !1;
|
|
3644
3693
|
let r = s.spinner();
|
|
3645
|
-
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);
|
|
3646
3695
|
}
|
|
3647
|
-
async function
|
|
3648
|
-
if (!await
|
|
3696
|
+
async function Ma(e, t, n = {}) {
|
|
3697
|
+
if (!await ja(e, t, n)) return;
|
|
3649
3698
|
let r = t ? !0 : await s.confirm({
|
|
3650
3699
|
message: `Run database migrations with ${L.command("prisma migrate deploy")}?`,
|
|
3651
3700
|
initialValue: !0
|
|
@@ -3654,21 +3703,21 @@ async function Ta(e, t, n = {}) {
|
|
|
3654
3703
|
s.log.info(L.muted("Skipping database migrations."));
|
|
3655
3704
|
return;
|
|
3656
3705
|
}
|
|
3657
|
-
await
|
|
3706
|
+
await Aa(e);
|
|
3658
3707
|
}
|
|
3659
|
-
async function
|
|
3660
|
-
if (!await
|
|
3708
|
+
async function Na(e, t, n = {}) {
|
|
3709
|
+
if (!await ba(e)) {
|
|
3661
3710
|
s.log.warn(`${L.path(".env")} not found in ${L.path("apps/backend")}. Skipping Docker and migrations - configure it first.`);
|
|
3662
3711
|
return;
|
|
3663
3712
|
}
|
|
3664
|
-
await
|
|
3713
|
+
await Ma(e, t, n);
|
|
3665
3714
|
}
|
|
3666
|
-
async function
|
|
3667
|
-
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);
|
|
3668
3717
|
}
|
|
3669
3718
|
//#endregion
|
|
3670
3719
|
//#region src/core/resolve.ts
|
|
3671
|
-
function
|
|
3720
|
+
function Fa(e) {
|
|
3672
3721
|
let t = /* @__PURE__ */ new Map();
|
|
3673
3722
|
for (let n of e) t.set(n.name, {
|
|
3674
3723
|
name: n.name,
|
|
@@ -3676,7 +3725,7 @@ function Oa(e) {
|
|
|
3676
3725
|
});
|
|
3677
3726
|
return t;
|
|
3678
3727
|
}
|
|
3679
|
-
function
|
|
3728
|
+
function Ia(e, t, n = /* @__PURE__ */ new Set()) {
|
|
3680
3729
|
let r = /* @__PURE__ */ new Set();
|
|
3681
3730
|
function i(e) {
|
|
3682
3731
|
if (n.has(e)) return [];
|
|
@@ -3690,10 +3739,10 @@ function ka(e, t, n = /* @__PURE__ */ new Set()) {
|
|
|
3690
3739
|
}
|
|
3691
3740
|
return i(e);
|
|
3692
3741
|
}
|
|
3693
|
-
function
|
|
3742
|
+
function La(e, t, n = []) {
|
|
3694
3743
|
let r = new Set(n), i = new Set(n), a = [];
|
|
3695
3744
|
for (let n of e) {
|
|
3696
|
-
let e =
|
|
3745
|
+
let e = Ia(n, t, new Set(i));
|
|
3697
3746
|
for (let t of e) i.has(t) || (i.add(t), a.push(t));
|
|
3698
3747
|
}
|
|
3699
3748
|
return {
|
|
@@ -3701,7 +3750,7 @@ function Aa(e, t, n = []) {
|
|
|
3701
3750
|
alreadyInstalled: e.filter((e) => r.has(e))
|
|
3702
3751
|
};
|
|
3703
3752
|
}
|
|
3704
|
-
function
|
|
3753
|
+
function Ra(e) {
|
|
3705
3754
|
let { order: t, graph: n, isLocked: r, installed: i = [] } = e, a = new Set(i), o = /* @__PURE__ */ new Set();
|
|
3706
3755
|
for (let e of t) {
|
|
3707
3756
|
let t = n.get(e)?.dependencies.some((e) => !a.has(e) && o.has(e)) ?? !1;
|
|
@@ -3714,7 +3763,7 @@ function ja(e) {
|
|
|
3714
3763
|
}
|
|
3715
3764
|
//#endregion
|
|
3716
3765
|
//#region src/core/variants.ts
|
|
3717
|
-
function
|
|
3766
|
+
function za(e, t = {}) {
|
|
3718
3767
|
let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map();
|
|
3719
3768
|
for (let i of e) {
|
|
3720
3769
|
let e = t[i.family] ?? i.default;
|
|
@@ -3726,14 +3775,14 @@ function Ma(e, t = {}) {
|
|
|
3726
3775
|
familyOf: r
|
|
3727
3776
|
};
|
|
3728
3777
|
}
|
|
3729
|
-
function
|
|
3778
|
+
function Ba(e, t, n) {
|
|
3730
3779
|
return [...e.map((e) => n.chosen.get(e.family) ?? e.default), ...t];
|
|
3731
3780
|
}
|
|
3732
|
-
function
|
|
3781
|
+
function Va(e, t) {
|
|
3733
3782
|
let n = t.familyOf.get(e);
|
|
3734
3783
|
return n ? t.chosen.get(n) ?? e : e;
|
|
3735
3784
|
}
|
|
3736
|
-
function
|
|
3785
|
+
function Ha(e, t) {
|
|
3737
3786
|
let n = /* @__PURE__ */ new Map();
|
|
3738
3787
|
for (let t of e) t.family && n.set(t.name, t.family);
|
|
3739
3788
|
let r = new Set(t), i = /* @__PURE__ */ new Map();
|
|
@@ -3749,65 +3798,65 @@ function Fa(e, t) {
|
|
|
3749
3798
|
familyOf: n
|
|
3750
3799
|
};
|
|
3751
3800
|
}
|
|
3752
|
-
function
|
|
3801
|
+
function Ua(e, t) {
|
|
3753
3802
|
return e.map((e) => ({
|
|
3754
3803
|
...e,
|
|
3755
|
-
dependencies: e.dependencies.map((e) =>
|
|
3804
|
+
dependencies: e.dependencies.map((e) => Va(e, t))
|
|
3756
3805
|
}));
|
|
3757
3806
|
}
|
|
3758
3807
|
//#endregion
|
|
3759
3808
|
//#region src/ui/banner.ts
|
|
3760
|
-
var
|
|
3809
|
+
var Wa = [
|
|
3761
3810
|
" ██╗ ██╗ ██╗ ██╗ ██████╗ ███████╗",
|
|
3762
3811
|
" ██║ ██║ ╚██╗ ██╔╝ ██╔══██╗ ██╔════╝",
|
|
3763
3812
|
" ███████║ ╚████╔╝ ██████╔╝ █████╗ ",
|
|
3764
3813
|
" ██╔══██║ ╚██╔╝ ██╔═══╝ ██╔══╝ ",
|
|
3765
3814
|
" ██║ ██║ ██║ ██║ ███████╗",
|
|
3766
3815
|
" ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝"
|
|
3767
|
-
],
|
|
3816
|
+
], Ga = [
|
|
3768
3817
|
" ███████╗ ████████╗ █████╗ ██████╗ ██╗ ██╗",
|
|
3769
3818
|
" ██╔════╝ ╚══██╔══╝ ██╔══██╗ ██╔════╝ ██║ ██╔╝",
|
|
3770
3819
|
" ███████╗ ██║ ███████║ ██║ █████╔╝ ",
|
|
3771
3820
|
" ╚════██║ ██║ ██╔══██║ ██║ ██╔═██╗ ",
|
|
3772
3821
|
" ███████║ ██║ ██║ ██║ ╚██████╗ ██║ ██╗",
|
|
3773
3822
|
" ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝"
|
|
3774
|
-
],
|
|
3823
|
+
], Ka = [
|
|
3775
3824
|
253,
|
|
3776
3825
|
176,
|
|
3777
3826
|
21
|
|
3778
|
-
],
|
|
3827
|
+
], qa = [
|
|
3779
3828
|
245,
|
|
3780
3829
|
76,
|
|
3781
3830
|
2
|
|
3782
|
-
],
|
|
3831
|
+
], Ja = 5, Ya = [
|
|
3783
3832
|
17,
|
|
3784
3833
|
103,
|
|
3785
3834
|
248
|
|
3786
|
-
],
|
|
3835
|
+
], Xa = [
|
|
3787
3836
|
42,
|
|
3788
3837
|
160,
|
|
3789
3838
|
250
|
|
3790
|
-
],
|
|
3791
|
-
function
|
|
3839
|
+
], Za = .2;
|
|
3840
|
+
function Qa() {
|
|
3792
3841
|
console.log();
|
|
3793
|
-
for (let e of Se(
|
|
3794
|
-
start:
|
|
3795
|
-
end:
|
|
3796
|
-
angle:
|
|
3842
|
+
for (let e of Se(Wa, {
|
|
3843
|
+
start: Ka,
|
|
3844
|
+
end: qa,
|
|
3845
|
+
angle: Ja
|
|
3797
3846
|
})) console.log(b.bold(e));
|
|
3798
|
-
for (let e of Se(
|
|
3799
|
-
start:
|
|
3800
|
-
end:
|
|
3801
|
-
angle:
|
|
3847
|
+
for (let e of Se(Ga, {
|
|
3848
|
+
start: Ya,
|
|
3849
|
+
end: Xa,
|
|
3850
|
+
angle: Za
|
|
3802
3851
|
})) console.log(b.bold(e));
|
|
3803
3852
|
console.log(), console.log(` ${R.spark} ${b.dim("v" + A)} ${b.dim("·")} ${be("Ship web + desktop apps from one codebase")}`), console.log();
|
|
3804
3853
|
}
|
|
3805
|
-
function
|
|
3854
|
+
function $a() {
|
|
3806
3855
|
console.log(), console.log(` ${R.bolt} ${_e.orange("Hype")}${_e.skyBlue("Stack")} ${b.dim("v" + A)}`), console.log();
|
|
3807
3856
|
}
|
|
3808
3857
|
//#endregion
|
|
3809
3858
|
//#region src/ui/pack-multiselect.ts
|
|
3810
|
-
var
|
|
3859
|
+
var eo = class extends O {
|
|
3811
3860
|
options;
|
|
3812
3861
|
cursor = 0;
|
|
3813
3862
|
selected;
|
|
@@ -3911,64 +3960,64 @@ var qa = class extends O {
|
|
|
3911
3960
|
}
|
|
3912
3961
|
}
|
|
3913
3962
|
};
|
|
3914
|
-
function
|
|
3915
|
-
return new
|
|
3963
|
+
function to(e) {
|
|
3964
|
+
return new eo(e).prompt();
|
|
3916
3965
|
}
|
|
3917
3966
|
//#endregion
|
|
3918
3967
|
//#region src/utils/naming.ts
|
|
3919
|
-
function
|
|
3968
|
+
function no(e) {
|
|
3920
3969
|
return e.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
3921
3970
|
}
|
|
3922
|
-
function
|
|
3971
|
+
function ro(e) {
|
|
3923
3972
|
return e.split(/[-_]/).filter(Boolean).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(" ");
|
|
3924
3973
|
}
|
|
3925
3974
|
//#endregion
|
|
3926
3975
|
//#region src/utils/validate.ts
|
|
3927
|
-
function
|
|
3976
|
+
function io(e) {
|
|
3928
3977
|
if (!e.trim()) return "Project name cannot be empty";
|
|
3929
3978
|
if (e.length > 214) return "Project name is too long (max 214 characters)";
|
|
3930
|
-
let t =
|
|
3979
|
+
let t = no(e);
|
|
3931
3980
|
if (!ie.test(t)) return "Project name must contain at least one letter or number";
|
|
3932
3981
|
}
|
|
3933
3982
|
//#endregion
|
|
3934
3983
|
//#region src/core/apply-mode.ts
|
|
3935
|
-
var
|
|
3936
|
-
function
|
|
3937
|
-
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}`);
|
|
3938
3987
|
}
|
|
3939
|
-
async function
|
|
3940
|
-
let n = T.resolve(e,
|
|
3988
|
+
async function co(e, t) {
|
|
3989
|
+
let n = T.resolve(e, ao), r;
|
|
3941
3990
|
try {
|
|
3942
3991
|
r = await y.readFile(n, "utf-8");
|
|
3943
3992
|
} catch {
|
|
3944
3993
|
return !1;
|
|
3945
3994
|
}
|
|
3946
|
-
let i =
|
|
3995
|
+
let i = so(r, t);
|
|
3947
3996
|
return i === r || await y.writeFile(n, i, "utf-8"), !0;
|
|
3948
3997
|
}
|
|
3949
3998
|
//#endregion
|
|
3950
3999
|
//#region src/core/apply-radius.ts
|
|
3951
|
-
var
|
|
3952
|
-
function
|
|
4000
|
+
var lo = /(^[ \t]*--radius(?![\w-])[ \t]*:[ \t]*)([^;\n]*);/gm;
|
|
4001
|
+
function uo(e) {
|
|
3953
4002
|
return /^[0-9]*\.?[0-9]+(rem|em|px)$/.test(e.trim());
|
|
3954
4003
|
}
|
|
3955
|
-
function
|
|
3956
|
-
return e.replace(
|
|
4004
|
+
function fo(e, t) {
|
|
4005
|
+
return e.replace(lo, (e, n) => `${n}${t};`);
|
|
3957
4006
|
}
|
|
3958
|
-
var
|
|
3959
|
-
async function
|
|
3960
|
-
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;
|
|
3961
4010
|
try {
|
|
3962
4011
|
r = await y.readFile(n, "utf-8");
|
|
3963
4012
|
} catch {
|
|
3964
4013
|
return !1;
|
|
3965
4014
|
}
|
|
3966
|
-
let i =
|
|
4015
|
+
let i = fo(r, t);
|
|
3967
4016
|
return i === r || await y.writeFile(n, i, "utf-8"), !0;
|
|
3968
4017
|
}
|
|
3969
4018
|
//#endregion
|
|
3970
4019
|
//#region src/core/apply-theme.ts
|
|
3971
|
-
function
|
|
4020
|
+
function ho(e, t) {
|
|
3972
4021
|
let n = 0;
|
|
3973
4022
|
for (; n < e.length;) {
|
|
3974
4023
|
let r = e.indexOf(t, n);
|
|
@@ -3991,46 +4040,46 @@ function so(e, t) {
|
|
|
3991
4040
|
}
|
|
3992
4041
|
return null;
|
|
3993
4042
|
}
|
|
3994
|
-
function
|
|
4043
|
+
function go(e, t) {
|
|
3995
4044
|
let n = e;
|
|
3996
4045
|
for (let [e, r] of Object.entries(t)) {
|
|
3997
|
-
let t = RegExp(`(^[ \\t]*--${
|
|
4046
|
+
let t = RegExp(`(^[ \\t]*--${_o(e)}[ \\t]*:[ \\t]*)([^;\\n]*);`, "m");
|
|
3998
4047
|
n = n.replace(t, (e, t) => `${t}${r};`);
|
|
3999
4048
|
}
|
|
4000
4049
|
return n;
|
|
4001
4050
|
}
|
|
4002
|
-
function
|
|
4051
|
+
function _o(e) {
|
|
4003
4052
|
return e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
4004
4053
|
}
|
|
4005
|
-
function
|
|
4006
|
-
let n =
|
|
4054
|
+
function vo(e, t) {
|
|
4055
|
+
let n = ho(e, ":root"), r = ho(e, ".dark"), i = e;
|
|
4007
4056
|
if (n) {
|
|
4008
4057
|
let e = i.slice(0, n.bodyStart), r = i.slice(n.bodyStart, n.bodyEnd), a = i.slice(n.bodyEnd);
|
|
4009
|
-
i = e +
|
|
4058
|
+
i = e + go(r, t.light) + a;
|
|
4010
4059
|
}
|
|
4011
4060
|
if (r) {
|
|
4012
|
-
let e =
|
|
4061
|
+
let e = ho(i, ".dark");
|
|
4013
4062
|
if (e) {
|
|
4014
4063
|
let n = i.slice(0, e.bodyStart), r = i.slice(e.bodyStart, e.bodyEnd), a = i.slice(e.bodyEnd);
|
|
4015
|
-
i = n +
|
|
4064
|
+
i = n + go(r, t.dark) + a;
|
|
4016
4065
|
}
|
|
4017
4066
|
}
|
|
4018
4067
|
return i;
|
|
4019
4068
|
}
|
|
4020
|
-
var
|
|
4021
|
-
async function
|
|
4022
|
-
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;
|
|
4023
4072
|
try {
|
|
4024
4073
|
r = await y.readFile(n, "utf-8");
|
|
4025
4074
|
} catch {
|
|
4026
4075
|
return !1;
|
|
4027
4076
|
}
|
|
4028
|
-
let i =
|
|
4077
|
+
let i = vo(r, t);
|
|
4029
4078
|
return i === r || await y.writeFile(n, i, "utf-8"), !0;
|
|
4030
4079
|
}
|
|
4031
4080
|
//#endregion
|
|
4032
4081
|
//#region src/core/clone.ts
|
|
4033
|
-
async function
|
|
4082
|
+
async function xo(e) {
|
|
4034
4083
|
let t = await ee(te, {
|
|
4035
4084
|
dir: e,
|
|
4036
4085
|
force: !0
|
|
@@ -4042,7 +4091,7 @@ async function mo(e) {
|
|
|
4042
4091
|
}
|
|
4043
4092
|
//#endregion
|
|
4044
4093
|
//#region src/core/editor-config.ts
|
|
4045
|
-
function
|
|
4094
|
+
function So(e) {
|
|
4046
4095
|
let t = {
|
|
4047
4096
|
globs: [],
|
|
4048
4097
|
alwaysApply: !1
|
|
@@ -4077,10 +4126,10 @@ function ho(e) {
|
|
|
4077
4126
|
content: i
|
|
4078
4127
|
};
|
|
4079
4128
|
}
|
|
4080
|
-
function
|
|
4129
|
+
function Co(e) {
|
|
4081
4130
|
return e.frontmatter.globs.length > 0 ? `---\npaths:\n${e.frontmatter.globs.map((e) => ` - "${e}"`).join("\n")}\n---\n\n${e.content}` : e.content;
|
|
4082
4131
|
}
|
|
4083
|
-
function
|
|
4132
|
+
function wo(e) {
|
|
4084
4133
|
let t;
|
|
4085
4134
|
t = e.frontmatter.alwaysApply ? "always_on" : e.frontmatter.globs.length > 0 ? "glob" : "model_decision";
|
|
4086
4135
|
let n = [`trigger: ${t}`];
|
|
@@ -4090,30 +4139,30 @@ function _o(e) {
|
|
|
4090
4139
|
}
|
|
4091
4140
|
return e.frontmatter.description && n.push(`description: ${e.frontmatter.description}`), `---\n${n.join("\n")}\n---\n\n${e.content}`;
|
|
4092
4141
|
}
|
|
4093
|
-
function
|
|
4142
|
+
function To(e) {
|
|
4094
4143
|
return e.frontmatter.globs.length > 0 ? `---\napplyTo: "${e.frontmatter.globs.join(", ")}"\n---\n\n${e.content}` : e.content;
|
|
4095
4144
|
}
|
|
4096
|
-
var
|
|
4145
|
+
var Eo = {
|
|
4097
4146
|
claude: {
|
|
4098
4147
|
rulesDir: ".claude/rules",
|
|
4099
4148
|
extension: ".md",
|
|
4100
|
-
convert:
|
|
4149
|
+
convert: Co
|
|
4101
4150
|
},
|
|
4102
4151
|
windsurf: {
|
|
4103
4152
|
rulesDir: ".windsurf/rules",
|
|
4104
4153
|
extension: ".md",
|
|
4105
|
-
convert:
|
|
4154
|
+
convert: wo
|
|
4106
4155
|
},
|
|
4107
4156
|
copilot: {
|
|
4108
4157
|
rulesDir: ".github/instructions",
|
|
4109
4158
|
extension: ".instructions.md",
|
|
4110
|
-
convert:
|
|
4159
|
+
convert: To
|
|
4111
4160
|
}
|
|
4112
4161
|
};
|
|
4113
|
-
async function
|
|
4162
|
+
async function Do(e) {
|
|
4114
4163
|
let t = T.join(e, oe), n = (await y.readdir(t, { withFileTypes: !0 }).catch(() => [])).filter((e) => e.isFile() && e.name.endsWith(".mdc"));
|
|
4115
4164
|
return await Promise.all(n.map(async (e) => {
|
|
4116
|
-
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"));
|
|
4117
4166
|
return {
|
|
4118
4167
|
frontmatter: r,
|
|
4119
4168
|
content: i,
|
|
@@ -4121,9 +4170,9 @@ async function bo(e) {
|
|
|
4121
4170
|
};
|
|
4122
4171
|
}));
|
|
4123
4172
|
}
|
|
4124
|
-
async function
|
|
4173
|
+
async function Oo(e, t) {
|
|
4125
4174
|
if (t === "cursor") return;
|
|
4126
|
-
let n =
|
|
4175
|
+
let n = Eo[t], r = await Do(e), i = T.join(e, n.rulesDir);
|
|
4127
4176
|
await y.mkdir(i, { recursive: !0 }), await Promise.all(r.map((e) => {
|
|
4128
4177
|
let t = n.convert(e), r = e.filename.replace(/\.mdc$/, n.extension);
|
|
4129
4178
|
return y.writeFile(T.join(i, r), t, "utf-8");
|
|
@@ -4131,21 +4180,21 @@ async function xo(e, t) {
|
|
|
4131
4180
|
}
|
|
4132
4181
|
//#endregion
|
|
4133
4182
|
//#region src/core/env-files.ts
|
|
4134
|
-
var
|
|
4183
|
+
var ko = [
|
|
4135
4184
|
"apps",
|
|
4136
4185
|
"packages",
|
|
4137
4186
|
"libs",
|
|
4138
4187
|
"shared"
|
|
4139
4188
|
];
|
|
4140
|
-
async function
|
|
4141
|
-
let t = await
|
|
4189
|
+
async function Ao(e) {
|
|
4190
|
+
let t = await jo(e);
|
|
4142
4191
|
return (await Promise.all(t.map(async (t) => {
|
|
4143
4192
|
let n = T.join(T.dirname(t), ".env");
|
|
4144
4193
|
return await Y(n) ? null : (await y.copyFile(t, n), T.relative(e, n));
|
|
4145
4194
|
}))).filter((e) => e !== null).sort();
|
|
4146
4195
|
}
|
|
4147
|
-
async function
|
|
4148
|
-
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) => {
|
|
4149
4198
|
let n = T.join(e, t);
|
|
4150
4199
|
return (await y.readdir(n, { withFileTypes: !0 }).catch(() => [])).filter((e) => e.isDirectory()).map((e) => T.join(n, e.name, ".env.example"));
|
|
4151
4200
|
}));
|
|
@@ -4153,11 +4202,11 @@ async function wo(e) {
|
|
|
4153
4202
|
}
|
|
4154
4203
|
//#endregion
|
|
4155
4204
|
//#region src/core/post-clone.ts
|
|
4156
|
-
var Q = "@hype-stack/",
|
|
4157
|
-
async function
|
|
4205
|
+
var Q = "@hype-stack/", Mo = "hype-stack", No = "@hype-stack/cli";
|
|
4206
|
+
async function Po(e) {
|
|
4158
4207
|
await mr(T.join(e, ".git"));
|
|
4159
4208
|
}
|
|
4160
|
-
async function
|
|
4209
|
+
async function Fo(e) {
|
|
4161
4210
|
await J("git", ["init"], { cwd: e }), await J("git", ["add", "."], { cwd: e }), await J("git", [
|
|
4162
4211
|
"-c",
|
|
4163
4212
|
"user.name=Hype Stack CLI",
|
|
@@ -4168,19 +4217,19 @@ async function Oo(e) {
|
|
|
4168
4217
|
"Initial commit from Hype Stack CLI"
|
|
4169
4218
|
], { cwd: e });
|
|
4170
4219
|
}
|
|
4171
|
-
async function
|
|
4172
|
-
let n = `@${t}/`, r = await
|
|
4220
|
+
async function Io(e, t) {
|
|
4221
|
+
let n = `@${t}/`, r = await Wo(e);
|
|
4173
4222
|
for (let e of r) {
|
|
4174
4223
|
let t = await dr(e);
|
|
4175
4224
|
if (!t) continue;
|
|
4176
4225
|
let r = !1;
|
|
4177
|
-
t.name?.startsWith(Q) && (t.name = t.name.replace(Q, n), r = !0),
|
|
4178
|
-
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);
|
|
4179
4228
|
a === i ? r && await fr(e, t) : await y.writeFile(e, a, "utf-8");
|
|
4180
4229
|
}
|
|
4181
|
-
await
|
|
4230
|
+
await Xi(e, t), await zo(e, t), await Uo(e, t);
|
|
4182
4231
|
}
|
|
4183
|
-
var
|
|
4232
|
+
var Lo = new Set([
|
|
4184
4233
|
".git",
|
|
4185
4234
|
"node_modules",
|
|
4186
4235
|
"dist",
|
|
@@ -4188,10 +4237,10 @@ var Ao = new Set([
|
|
|
4188
4237
|
".nx",
|
|
4189
4238
|
".next",
|
|
4190
4239
|
"coverage"
|
|
4191
|
-
]),
|
|
4192
|
-
async function
|
|
4193
|
-
if (t ===
|
|
4194
|
-
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);
|
|
4195
4244
|
await Promise.all(n.map(async (e) => {
|
|
4196
4245
|
let n = await y.readFile(e, "utf-8").catch(() => null);
|
|
4197
4246
|
if (!n || !/^name:[ \t]*hype-stack/m.test(n)) return;
|
|
@@ -4199,23 +4248,23 @@ async function Mo(e, t) {
|
|
|
4199
4248
|
await y.writeFile(e, r, "utf-8");
|
|
4200
4249
|
}));
|
|
4201
4250
|
}
|
|
4202
|
-
async function
|
|
4251
|
+
async function Bo(e) {
|
|
4203
4252
|
let t = await y.readdir(e, { withFileTypes: !0 }).catch(() => []);
|
|
4204
4253
|
return (await Promise.all(t.map(async (t) => {
|
|
4205
4254
|
let n = T.join(e, t.name);
|
|
4206
|
-
return t.isDirectory() ?
|
|
4255
|
+
return t.isDirectory() ? Lo.has(t.name) ? [] : Bo(n) : t.isFile() && Ro.test(t.name) ? [n] : [];
|
|
4207
4256
|
}))).flat();
|
|
4208
4257
|
}
|
|
4209
|
-
function
|
|
4258
|
+
function Vo(e, t) {
|
|
4210
4259
|
if (!e) return !1;
|
|
4211
4260
|
let n = !1;
|
|
4212
|
-
for (let r of Object.keys(e)) if (r !==
|
|
4261
|
+
for (let r of Object.keys(e)) if (r !== No && r.startsWith(Q)) {
|
|
4213
4262
|
let i = r.replace(Q, t);
|
|
4214
4263
|
e[i] = e[r], delete e[r], n = !0;
|
|
4215
4264
|
}
|
|
4216
4265
|
return n;
|
|
4217
4266
|
}
|
|
4218
|
-
function
|
|
4267
|
+
function Ho(e, t) {
|
|
4219
4268
|
if (!e) return !1;
|
|
4220
4269
|
let n = !1;
|
|
4221
4270
|
if (e.implicitDependencies &&= e.implicitDependencies.map((e) => e.startsWith(Q) ? (n = !0, e.replace(Q, t)) : e), e.targets) {
|
|
@@ -4223,13 +4272,13 @@ function Fo(e, t) {
|
|
|
4223
4272
|
}
|
|
4224
4273
|
return n;
|
|
4225
4274
|
}
|
|
4226
|
-
async function
|
|
4275
|
+
async function Uo(e, t) {
|
|
4227
4276
|
let n = T.join(e, "packages/enums/src/app/index.ts"), r = await y.readFile(n, "utf-8").catch(() => null);
|
|
4228
4277
|
if (!r) return;
|
|
4229
|
-
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"`);
|
|
4230
4279
|
await y.writeFile(n, a, "utf-8");
|
|
4231
4280
|
}
|
|
4232
|
-
async function
|
|
4281
|
+
async function Wo(e) {
|
|
4233
4282
|
let t = [], n = T.join(e, "package.json");
|
|
4234
4283
|
(await y.stat(n).catch(() => null))?.isFile() && t.push(n);
|
|
4235
4284
|
for (let n of [
|
|
@@ -4249,7 +4298,7 @@ async function Lo(e) {
|
|
|
4249
4298
|
}
|
|
4250
4299
|
//#endregion
|
|
4251
4300
|
//#region src/core/readme.ts
|
|
4252
|
-
var
|
|
4301
|
+
var Go = {
|
|
4253
4302
|
cursor: {
|
|
4254
4303
|
label: "Cursor",
|
|
4255
4304
|
rulesDir: ".cursor/rules"
|
|
@@ -4266,21 +4315,21 @@ var Ro = {
|
|
|
4266
4315
|
label: "GitHub Copilot",
|
|
4267
4316
|
rulesDir: ".github/instructions"
|
|
4268
4317
|
}
|
|
4269
|
-
},
|
|
4318
|
+
}, Ko = {
|
|
4270
4319
|
backend: "Hono API server (Postgres, Prisma, Kysely, Valkey cache, WorkOS auth)",
|
|
4271
4320
|
frontend: "React + Vite app talking to the backend through the typed HyperFetch SDK"
|
|
4272
|
-
},
|
|
4321
|
+
}, qo = {
|
|
4273
4322
|
enums: "Shared enums and app config used across apps",
|
|
4274
4323
|
cli: "Project tooling and code generators"
|
|
4275
4324
|
};
|
|
4276
|
-
function
|
|
4325
|
+
function Jo(e, t) {
|
|
4277
4326
|
return Object.entries(e).toSorted(([e], [t]) => e.localeCompare(t)).map(([e, n]) => {
|
|
4278
4327
|
let r = t[e];
|
|
4279
4328
|
return r ? `- \`${n}\` - ${r}` : `- \`${n}\``;
|
|
4280
4329
|
});
|
|
4281
4330
|
}
|
|
4282
|
-
function
|
|
4283
|
-
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 = [];
|
|
4284
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)");
|
|
4285
4334
|
let u = [];
|
|
4286
4335
|
u.push(`# ${i}`), u.push([
|
|
@@ -4383,13 +4432,13 @@ function Ho(e) {
|
|
|
4383
4432
|
"stays useful."
|
|
4384
4433
|
].join("\n")), u.join("\n\n") + "\n";
|
|
4385
4434
|
}
|
|
4386
|
-
async function
|
|
4435
|
+
async function Xo(e, t) {
|
|
4387
4436
|
let n = T.join(e, "README.md");
|
|
4388
|
-
await y.writeFile(n,
|
|
4437
|
+
await y.writeFile(n, Yo(t), "utf-8");
|
|
4389
4438
|
}
|
|
4390
4439
|
//#endregion
|
|
4391
4440
|
//#region src/core/tracking.ts
|
|
4392
|
-
async function
|
|
4441
|
+
async function Zo(e) {
|
|
4393
4442
|
try {
|
|
4394
4443
|
let t = {
|
|
4395
4444
|
"X-Device-Id": er(),
|
|
@@ -4403,7 +4452,7 @@ async function Wo(e) {
|
|
|
4403
4452
|
}
|
|
4404
4453
|
//#endregion
|
|
4405
4454
|
//#region src/core/npm-deps.ts
|
|
4406
|
-
function
|
|
4455
|
+
function Qo(e, t) {
|
|
4407
4456
|
let n = [], r = [];
|
|
4408
4457
|
if (!e) return {
|
|
4409
4458
|
errors: n,
|
|
@@ -4434,7 +4483,7 @@ function Go(e, t) {
|
|
|
4434
4483
|
operations: r
|
|
4435
4484
|
};
|
|
4436
4485
|
}
|
|
4437
|
-
function
|
|
4486
|
+
function $o(e) {
|
|
4438
4487
|
let t = {};
|
|
4439
4488
|
for (let n of e) if (n) for (let [e, r] of Object.entries(n)) t[e] = {
|
|
4440
4489
|
...t[e],
|
|
@@ -4442,7 +4491,7 @@ function Ko(e) {
|
|
|
4442
4491
|
};
|
|
4443
4492
|
return t;
|
|
4444
4493
|
}
|
|
4445
|
-
async function
|
|
4494
|
+
async function es(e, t, n = J) {
|
|
4446
4495
|
let r = [];
|
|
4447
4496
|
for (let i of e) {
|
|
4448
4497
|
let e = T.join(t, i.relativeDir);
|
|
@@ -4478,14 +4527,14 @@ async function qo(e, t, n = J) {
|
|
|
4478
4527
|
function $(e) {
|
|
4479
4528
|
return e instanceof Error ? e.message : String(e);
|
|
4480
4529
|
}
|
|
4481
|
-
async function
|
|
4530
|
+
async function ts(e, t, n) {
|
|
4482
4531
|
let r = e.filter((e) => e.tier === "paid" && !t.has(e.name)).map((e) => e.name);
|
|
4483
|
-
return r.length === 0 ? {} :
|
|
4532
|
+
return r.length === 0 ? {} : qr(r, n).catch(() => ({}));
|
|
4484
4533
|
}
|
|
4485
|
-
function
|
|
4534
|
+
function ns(e, t) {
|
|
4486
4535
|
return e === "free" ? L.success("free") : e === "owned" ? L.accent("owned") : `${L.highlight(`$${t}`)} ${L.muted("locked")}`;
|
|
4487
4536
|
}
|
|
4488
|
-
async function
|
|
4537
|
+
async function rs(e, t, n) {
|
|
4489
4538
|
let r = e.filter((e) => t(e)), i = e.filter((e) => !t(e));
|
|
4490
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) => ({
|
|
4491
4540
|
name: e.name,
|
|
@@ -4493,7 +4542,7 @@ async function Xo(e, t, n) {
|
|
|
4493
4542
|
price: e.price
|
|
4494
4543
|
})));
|
|
4495
4544
|
}
|
|
4496
|
-
function
|
|
4545
|
+
function is(e, t) {
|
|
4497
4546
|
z([
|
|
4498
4547
|
"These packs will be installed, in order:",
|
|
4499
4548
|
"",
|
|
@@ -4503,10 +4552,10 @@ function Zo(e, t) {
|
|
|
4503
4552
|
})
|
|
4504
4553
|
].join("\n"), "Install Plan");
|
|
4505
4554
|
}
|
|
4506
|
-
async function
|
|
4555
|
+
async function as(e, t) {
|
|
4507
4556
|
let n = [];
|
|
4508
4557
|
for (let r of e) {
|
|
4509
|
-
let e = await
|
|
4558
|
+
let e = await Vr(r), i = await Hr(r, t);
|
|
4510
4559
|
if (i.status === "denied") throw Error(`Access to "${r}" was denied (${i.reason}). Try 'npx @hype-stack/cli login' or check your license.`);
|
|
4511
4560
|
n.push({
|
|
4512
4561
|
manifest: e,
|
|
@@ -4515,18 +4564,18 @@ async function Qo(e, t) {
|
|
|
4515
4564
|
}
|
|
4516
4565
|
return n;
|
|
4517
4566
|
}
|
|
4518
|
-
async function
|
|
4519
|
-
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);
|
|
4520
4569
|
if (a.errors.length > 0) {
|
|
4521
4570
|
for (let e of a.errors) s.log.error(e);
|
|
4522
4571
|
return;
|
|
4523
4572
|
}
|
|
4524
4573
|
if (a.operations.length === 0) return;
|
|
4525
4574
|
i.start("Installing npm dependencies...");
|
|
4526
|
-
let o = await
|
|
4575
|
+
let o = await es(a.operations, r);
|
|
4527
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);
|
|
4528
4577
|
}
|
|
4529
|
-
function
|
|
4578
|
+
function ss() {
|
|
4530
4579
|
Te([{
|
|
4531
4580
|
command: "npx @hype-stack/cli onboard",
|
|
4532
4581
|
hint: "(set up env vars + run migrations)"
|
|
@@ -4535,7 +4584,7 @@ function es() {
|
|
|
4535
4584
|
hint: "(start frontend + backend)"
|
|
4536
4585
|
}]);
|
|
4537
4586
|
}
|
|
4538
|
-
function
|
|
4587
|
+
function cs(e) {
|
|
4539
4588
|
if (e.length === 0) return;
|
|
4540
4589
|
let t = e.map((e) => {
|
|
4541
4590
|
let t = e.replace(/^\{\{[^}]+\}\}\//, "");
|
|
@@ -4543,10 +4592,10 @@ function ts(e) {
|
|
|
4543
4592
|
});
|
|
4544
4593
|
s.note(t.join("\n"), "Skipped (already exist)");
|
|
4545
4594
|
}
|
|
4546
|
-
async function
|
|
4595
|
+
async function ls(e) {
|
|
4547
4596
|
let { prepared: t, config: n, cwd: r, force: i, yes: a, slotsByPack: o } = e, c = /* @__PURE__ */ new Set();
|
|
4548
4597
|
if (i) return c;
|
|
4549
|
-
let l = await
|
|
4598
|
+
let l = await aa({
|
|
4550
4599
|
packs: t,
|
|
4551
4600
|
config: n,
|
|
4552
4601
|
projectRoot: r,
|
|
@@ -4573,7 +4622,7 @@ async function ns(e) {
|
|
|
4573
4622
|
}
|
|
4574
4623
|
//#endregion
|
|
4575
4624
|
//#region src/ui/swatch.ts
|
|
4576
|
-
function
|
|
4625
|
+
function us(e) {
|
|
4577
4626
|
let t = e.trim().match(/^oklch\(([^)]+)\)$/i);
|
|
4578
4627
|
if (!t) return null;
|
|
4579
4628
|
let n = t[1].trim().split(/\s+/);
|
|
@@ -4592,56 +4641,56 @@ function rs(e) {
|
|
|
4592
4641
|
h: a
|
|
4593
4642
|
};
|
|
4594
4643
|
}
|
|
4595
|
-
function
|
|
4644
|
+
function ds(e) {
|
|
4596
4645
|
return Math.min(255, Math.max(0, Math.round(e)));
|
|
4597
4646
|
}
|
|
4598
|
-
function
|
|
4647
|
+
function fs(e) {
|
|
4599
4648
|
return e <= .0031308 ? 12.92 * e : 1.055 * e ** (1 / 2.4) - .055;
|
|
4600
4649
|
}
|
|
4601
|
-
function
|
|
4650
|
+
function ps({ l: e, c: t, h: n }) {
|
|
4602
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;
|
|
4603
4652
|
return [
|
|
4604
|
-
|
|
4605
|
-
|
|
4606
|
-
|
|
4653
|
+
ds(fs(f) * 255),
|
|
4654
|
+
ds(fs(p) * 255),
|
|
4655
|
+
ds(fs(m) * 255)
|
|
4607
4656
|
];
|
|
4608
4657
|
}
|
|
4609
|
-
var
|
|
4610
|
-
function
|
|
4658
|
+
var ms = "\x1B[49m";
|
|
4659
|
+
function hs(e, t) {
|
|
4611
4660
|
let n = e[t];
|
|
4612
4661
|
if (!n) return b.dim(" ");
|
|
4613
|
-
let r =
|
|
4662
|
+
let r = us(n);
|
|
4614
4663
|
if (!r) return b.dim(" ");
|
|
4615
|
-
let [i, a, o] =
|
|
4616
|
-
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}`;
|
|
4617
4666
|
}
|
|
4618
|
-
var
|
|
4667
|
+
var gs = [
|
|
4619
4668
|
"primary",
|
|
4620
4669
|
"secondary",
|
|
4621
4670
|
"accent"
|
|
4622
4671
|
];
|
|
4623
|
-
function
|
|
4624
|
-
return
|
|
4672
|
+
function _s(e) {
|
|
4673
|
+
return gs.map((t) => hs(e, t)).join("");
|
|
4625
4674
|
}
|
|
4626
|
-
function
|
|
4627
|
-
return `${
|
|
4675
|
+
function vs(e) {
|
|
4676
|
+
return `${_s(e.light)} ${b.dim("·")} ${_s(e.dark)}`;
|
|
4628
4677
|
}
|
|
4629
4678
|
//#endregion
|
|
4630
4679
|
//#region src/commands/create.ts
|
|
4631
|
-
async function
|
|
4632
|
-
e.skipBanner ||
|
|
4680
|
+
async function ys(e) {
|
|
4681
|
+
e.skipBanner || Qa(), s.intro(L.brandBold("Create a new Hype Stack project"));
|
|
4633
4682
|
let o = e.yes === !0, c, l;
|
|
4634
4683
|
if (o && e.name) {
|
|
4635
|
-
let t =
|
|
4636
|
-
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);
|
|
4637
4686
|
} else {
|
|
4638
4687
|
let t = await s.text({
|
|
4639
4688
|
message: "What is your project named?",
|
|
4640
4689
|
placeholder: "my-app",
|
|
4641
4690
|
initialValue: e.name ?? "",
|
|
4642
|
-
validate: (e) =>
|
|
4691
|
+
validate: (e) => io(e ?? "")
|
|
4643
4692
|
});
|
|
4644
|
-
s.isCancel(t) && B(), l = t, c =
|
|
4693
|
+
s.isCancel(t) && B(), l = t, c = no(l);
|
|
4645
4694
|
}
|
|
4646
4695
|
l.trim() !== c && s.log.info(L.muted(`Using "${L.highlight(c)}" as the project name`));
|
|
4647
4696
|
let u;
|
|
@@ -4685,7 +4734,7 @@ async function fs(e) {
|
|
|
4685
4734
|
message: "Pick a color theme",
|
|
4686
4735
|
options: r.map((e) => ({
|
|
4687
4736
|
value: e.name,
|
|
4688
|
-
label: `${
|
|
4737
|
+
label: `${vs(e)} ${e.label}`
|
|
4689
4738
|
})),
|
|
4690
4739
|
initialValue: h
|
|
4691
4740
|
});
|
|
@@ -4703,24 +4752,24 @@ async function fs(e) {
|
|
|
4703
4752
|
(s.isCancel(e) || !e) && B();
|
|
4704
4753
|
}
|
|
4705
4754
|
let _ = s.spinner();
|
|
4706
|
-
_.start("Cloning Hype Stack template..."), await
|
|
4755
|
+
_.start("Cloning Hype Stack template..."), await xo(d), _.stop(L.success("Template cloned"));
|
|
4707
4756
|
let v = s.spinner();
|
|
4708
|
-
v.start("Setting up project..."), await
|
|
4709
|
-
let y = await
|
|
4710
|
-
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, {
|
|
4711
4760
|
projectName: c,
|
|
4712
4761
|
editor: p,
|
|
4713
4762
|
workspace: y
|
|
4714
4763
|
});
|
|
4715
4764
|
let x = T.resolve(d, b.paths?.frontend.root ?? "apps/frontend");
|
|
4716
|
-
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"));
|
|
4717
4766
|
let S = s.spinner();
|
|
4718
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.")));
|
|
4719
4768
|
let C = s.spinner();
|
|
4720
|
-
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"));
|
|
4721
4770
|
let w = s.spinner();
|
|
4722
4771
|
w.start("Creating .env files from examples...");
|
|
4723
|
-
let E = await
|
|
4772
|
+
let E = await Ao(d);
|
|
4724
4773
|
if (E.length > 0) {
|
|
4725
4774
|
let e = E.length;
|
|
4726
4775
|
w.stop(L.success(`Created ${e} .env file${e === 1 ? "" : "s"} from examples`));
|
|
@@ -4735,20 +4784,20 @@ async function fs(e) {
|
|
|
4735
4784
|
message: "Would you like to start Docker services and run database migrations now?",
|
|
4736
4785
|
initialValue: !0
|
|
4737
4786
|
}));
|
|
4738
|
-
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();
|
|
4739
4788
|
}
|
|
4740
|
-
return await
|
|
4789
|
+
return await Zo("project_create"), s.outro(L.muted("Happy building!")), d;
|
|
4741
4790
|
}
|
|
4742
4791
|
//#endregion
|
|
4743
4792
|
//#region src/commands/init.ts
|
|
4744
|
-
async function
|
|
4793
|
+
async function bs(e) {
|
|
4745
4794
|
let t = e.cwd ?? process.cwd(), n = e.silent ?? !1;
|
|
4746
|
-
if (n || (
|
|
4795
|
+
if (n || ($a(), s.intro(L.brandBold("Initialize Hype Stack configuration"))), !await Br(t)) {
|
|
4747
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.`));
|
|
4748
4797
|
return;
|
|
4749
4798
|
}
|
|
4750
|
-
if (await
|
|
4751
|
-
let e = await
|
|
4799
|
+
if (await Fr(t)) {
|
|
4800
|
+
let e = await Pr(t);
|
|
4752
4801
|
if (e && !n) {
|
|
4753
4802
|
s.log.info(`Found existing ${L.path("stack.json")} for project ${L.highlight(e.name)}`);
|
|
4754
4803
|
let t = await s.confirm({
|
|
@@ -4761,7 +4810,7 @@ async function ps(e) {
|
|
|
4761
4810
|
}
|
|
4762
4811
|
}
|
|
4763
4812
|
}
|
|
4764
|
-
let r = await
|
|
4813
|
+
let r = await Lr(t);
|
|
4765
4814
|
if (!n) {
|
|
4766
4815
|
let e = Object.entries(r.apps), t = Object.entries(r.packages);
|
|
4767
4816
|
if (e.length > 0) {
|
|
@@ -4780,21 +4829,21 @@ async function ps(e) {
|
|
|
4780
4829
|
message: "Project name for stack.json?",
|
|
4781
4830
|
placeholder: i,
|
|
4782
4831
|
initialValue: i,
|
|
4783
|
-
validate: (e) =>
|
|
4832
|
+
validate: (e) => io(e ?? "")
|
|
4784
4833
|
});
|
|
4785
|
-
s.isCancel(e) && B(), a =
|
|
4834
|
+
s.isCancel(e) && B(), a = no(e);
|
|
4786
4835
|
}
|
|
4787
|
-
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.")));
|
|
4788
4837
|
}
|
|
4789
|
-
async function
|
|
4790
|
-
if (await
|
|
4838
|
+
async function xs(e, t = {}, n) {
|
|
4839
|
+
if (await Fr(e)) return {
|
|
4791
4840
|
projectRoot: e,
|
|
4792
4841
|
scaffolded: !1
|
|
4793
4842
|
};
|
|
4794
|
-
let r = t.runInit ?? ((e) =>
|
|
4843
|
+
let r = t.runInit ?? ((e) => bs({
|
|
4795
4844
|
cwd: e,
|
|
4796
4845
|
silent: !0
|
|
4797
|
-
})), i = t.runCreate ?? ((e, t) =>
|
|
4846
|
+
})), i = t.runCreate ?? ((e, t) => ys({
|
|
4798
4847
|
parentDirectory: e,
|
|
4799
4848
|
deferSetup: !0,
|
|
4800
4849
|
skipBanner: !0,
|
|
@@ -4802,7 +4851,7 @@ async function ms(e, t = {}, n) {
|
|
|
4802
4851
|
defaultMode: t?.defaultMode,
|
|
4803
4852
|
radius: t?.radius
|
|
4804
4853
|
}));
|
|
4805
|
-
if (await
|
|
4854
|
+
if (await Br(e)) {
|
|
4806
4855
|
s.log.warn(`No ${L.path("stack.json")} found in ${L.path(e)}.`);
|
|
4807
4856
|
let t = await s.confirm({
|
|
4808
4857
|
message: `Create ${L.path("stack.json")} now?`,
|
|
@@ -4810,7 +4859,7 @@ async function ms(e, t = {}, n) {
|
|
|
4810
4859
|
});
|
|
4811
4860
|
if (s.isCancel(t) || !t) return null;
|
|
4812
4861
|
await r(e);
|
|
4813
|
-
let n = await
|
|
4862
|
+
let n = await Fr(e);
|
|
4814
4863
|
return n && s.log.success(`${L.path("stack.json")} created`), n ? {
|
|
4815
4864
|
projectRoot: e,
|
|
4816
4865
|
scaffolded: !1
|
|
@@ -4828,19 +4877,19 @@ async function ms(e, t = {}, n) {
|
|
|
4828
4877
|
});
|
|
4829
4878
|
if (s.isCancel(o) || !o) return null;
|
|
4830
4879
|
let c = await i(e, n);
|
|
4831
|
-
return await
|
|
4880
|
+
return await Fr(c) ? {
|
|
4832
4881
|
projectRoot: c,
|
|
4833
4882
|
scaffolded: !0
|
|
4834
4883
|
} : null;
|
|
4835
4884
|
}
|
|
4836
4885
|
//#endregion
|
|
4837
4886
|
//#region src/commands/compose.ts
|
|
4838
|
-
async function
|
|
4887
|
+
async function Ss(e = {}) {
|
|
4839
4888
|
let t = e.cwd ?? process.cwd();
|
|
4840
|
-
|
|
4841
|
-
let n = await
|
|
4889
|
+
Qa();
|
|
4890
|
+
let n = await xs(t), r = n?.projectRoot ?? null, i = n?.scaffolded ?? !1, a;
|
|
4842
4891
|
try {
|
|
4843
|
-
a = await
|
|
4892
|
+
a = await Pr(r ?? t);
|
|
4844
4893
|
} catch (e) {
|
|
4845
4894
|
s.cancel(`Could not parse ${L.path("stack.json")}: ${$(e)} Run 'npx @hype-stack/cli init' to regenerate it.`), process.exit(1);
|
|
4846
4895
|
}
|
|
@@ -4851,18 +4900,18 @@ async function hs(e = {}) {
|
|
|
4851
4900
|
c.start("Loading packs...");
|
|
4852
4901
|
let l;
|
|
4853
4902
|
try {
|
|
4854
|
-
l = await
|
|
4903
|
+
l = await Kr();
|
|
4855
4904
|
} catch (e) {
|
|
4856
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);
|
|
4857
4906
|
}
|
|
4858
4907
|
c.stop("Packs loaded");
|
|
4859
|
-
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, {
|
|
4860
4909
|
token: m,
|
|
4861
4910
|
key: p
|
|
4862
4911
|
}), g = (e) => {
|
|
4863
4912
|
let t = f.get(e);
|
|
4864
4913
|
return !t || t.tier === "free" ? "free" : h[e]?.owned ? "owned" : "locked";
|
|
4865
|
-
}, _ = (e) => !d.has(e) && g(e) === "locked", v = await
|
|
4914
|
+
}, _ = (e) => !d.has(e) && g(e) === "locked", v = await Cs({
|
|
4866
4915
|
packs: l,
|
|
4867
4916
|
installedSet: d,
|
|
4868
4917
|
stateOf: g,
|
|
@@ -4873,9 +4922,9 @@ async function hs(e = {}) {
|
|
|
4873
4922
|
s.outro(L.muted("No packs selected. Nothing to do."));
|
|
4874
4923
|
return;
|
|
4875
4924
|
}
|
|
4876
|
-
let b =
|
|
4925
|
+
let b = Es(v), x = Ds(v), S = Ha(l, b), C = Fa(Ua(l, S)), w;
|
|
4877
4926
|
try {
|
|
4878
|
-
w =
|
|
4927
|
+
w = La(b, C, u);
|
|
4879
4928
|
} catch (e) {
|
|
4880
4929
|
s.cancel($(e)), process.exit(1);
|
|
4881
4930
|
}
|
|
@@ -4883,7 +4932,7 @@ async function hs(e = {}) {
|
|
|
4883
4932
|
z(`${w.alreadyInstalled.join(", ")} already installed.`, "Nothing to do"), s.outro(L.muted("Your selection is already part of the project."));
|
|
4884
4933
|
return;
|
|
4885
4934
|
}
|
|
4886
|
-
let T =
|
|
4935
|
+
let T = Ra({
|
|
4887
4936
|
order: w.order,
|
|
4888
4937
|
graph: C,
|
|
4889
4938
|
isLocked: _,
|
|
@@ -4891,28 +4940,28 @@ async function hs(e = {}) {
|
|
|
4891
4940
|
});
|
|
4892
4941
|
if (T.blocked.length > 0 && !m && !p) {
|
|
4893
4942
|
let e = await or();
|
|
4894
|
-
e && (m = e, h = await
|
|
4943
|
+
e && (m = e, h = await ts(l, d, {
|
|
4895
4944
|
token: m,
|
|
4896
4945
|
key: p
|
|
4897
|
-
}), T =
|
|
4946
|
+
}), T = Ra({
|
|
4898
4947
|
order: w.order,
|
|
4899
4948
|
graph: C,
|
|
4900
4949
|
isLocked: _,
|
|
4901
4950
|
installed: u
|
|
4902
4951
|
}));
|
|
4903
4952
|
}
|
|
4904
|
-
if (T.blocked.length > 0 && await
|
|
4953
|
+
if (T.blocked.length > 0 && await rs(T.blocked, _, f), T.installable.length === 0) {
|
|
4905
4954
|
s.outro(L.muted("Nothing left to install once locked packs are removed."));
|
|
4906
4955
|
return;
|
|
4907
4956
|
}
|
|
4908
|
-
if (
|
|
4957
|
+
if (is(T.installable, f), !e.yes) {
|
|
4909
4958
|
let e = await s.confirm({ message: `Install ${T.installable.length} pack${T.installable.length === 1 ? "" : "s"}?` });
|
|
4910
4959
|
(s.isCancel(e) || !e) && (s.cancel("Installation cancelled."), process.exit(0));
|
|
4911
4960
|
}
|
|
4912
4961
|
c.start("Downloading packs...");
|
|
4913
4962
|
let E;
|
|
4914
4963
|
try {
|
|
4915
|
-
E = await
|
|
4964
|
+
E = await as(T.installable, {
|
|
4916
4965
|
token: m,
|
|
4917
4966
|
key: p
|
|
4918
4967
|
});
|
|
@@ -4920,7 +4969,7 @@ async function hs(e = {}) {
|
|
|
4920
4969
|
c.stop("Download failed"), s.cancel($(e)), process.exit(1);
|
|
4921
4970
|
}
|
|
4922
4971
|
c.stop(`Downloaded ${E.length} pack${E.length === 1 ? "" : "s"}`);
|
|
4923
|
-
let D = await
|
|
4972
|
+
let D = await ls({
|
|
4924
4973
|
prepared: E,
|
|
4925
4974
|
config: a,
|
|
4926
4975
|
cwd: o,
|
|
@@ -4930,7 +4979,7 @@ async function hs(e = {}) {
|
|
|
4930
4979
|
});
|
|
4931
4980
|
try {
|
|
4932
4981
|
c.start("Installing pack files...");
|
|
4933
|
-
let t = await
|
|
4982
|
+
let t = await ca({
|
|
4934
4983
|
packs: E,
|
|
4935
4984
|
config: a,
|
|
4936
4985
|
projectRoot: o,
|
|
@@ -4943,22 +4992,22 @@ async function hs(e = {}) {
|
|
|
4943
4992
|
for (let e of t.errors) s.log.error(e);
|
|
4944
4993
|
s.cancel("No files were written. Fix the errors above (or pass --force for existing files) and try again."), process.exit(1);
|
|
4945
4994
|
}
|
|
4946
|
-
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));
|
|
4947
4996
|
for (let e of t.errors) s.log.error(e);
|
|
4948
|
-
await
|
|
4997
|
+
await os({
|
|
4949
4998
|
prepared: E,
|
|
4950
4999
|
paths: a.paths,
|
|
4951
5000
|
cwd: o,
|
|
4952
5001
|
spinner: c
|
|
4953
5002
|
});
|
|
4954
5003
|
let n;
|
|
4955
|
-
i && (n = await
|
|
5004
|
+
i && (n = await Pa(o, e.yes ?? !1)), await br({
|
|
4956
5005
|
projectRoot: o,
|
|
4957
5006
|
paths: a.paths,
|
|
4958
5007
|
skipPrompts: e.yes ?? !1,
|
|
4959
5008
|
dbReady: n,
|
|
4960
5009
|
freshScaffold: i
|
|
4961
|
-
}),
|
|
5010
|
+
}), ss(), s.outro(L.brand(`Installed ${t.appliedPacks.join(", ")}.`));
|
|
4962
5011
|
} finally {
|
|
4963
5012
|
await Promise.all(E.map((e) => y.rm(e.packDir, {
|
|
4964
5013
|
recursive: !0,
|
|
@@ -4966,10 +5015,10 @@ async function hs(e = {}) {
|
|
|
4966
5015
|
})));
|
|
4967
5016
|
}
|
|
4968
5017
|
}
|
|
4969
|
-
async function
|
|
5018
|
+
async function Cs(e) {
|
|
4970
5019
|
let { packs: t, installedSet: n, stateOf: r, options: i, adminAvailable: a } = e;
|
|
4971
5020
|
if (i.packs && i.packs.length > 0) {
|
|
4972
|
-
let e = i.packs.map(
|
|
5021
|
+
let e = i.packs.map(Ts), n = e.filter((e) => !t.some((t) => t.name === e.name));
|
|
4973
5022
|
return n.length > 0 && (s.cancel(`Unknown pack${n.length === 1 ? "" : "s"}: ${n.map((e) => e.name).join(", ")}`), process.exit(1)), e;
|
|
4974
5023
|
}
|
|
4975
5024
|
let o = t.filter((e) => n.has(e.name));
|
|
@@ -4978,13 +5027,13 @@ async function gs(e) {
|
|
|
4978
5027
|
if (c.length === 0) return s.outro(L.muted("Every available pack is already installed.")), [];
|
|
4979
5028
|
let l = le();
|
|
4980
5029
|
z(c.map((e) => ` ${R.arrow} ${L.highlight(e.displayName)} ${ve(`${l}/packs/${e.name}`)}`).join("\n"), "Browse packs");
|
|
4981
|
-
let u =
|
|
5030
|
+
let u = ga(c, { adminAvailable: a }), d = [];
|
|
4982
5031
|
for (let e of u) {
|
|
4983
5032
|
let t = e.packs.map((e) => {
|
|
4984
5033
|
let t = r(e.name);
|
|
4985
5034
|
return {
|
|
4986
5035
|
value: e.name,
|
|
4987
|
-
label: `${e.displayName} ${
|
|
5036
|
+
label: `${e.displayName} ${ns(t, e.price)}`,
|
|
4988
5037
|
hint: e.description
|
|
4989
5038
|
};
|
|
4990
5039
|
});
|
|
@@ -5001,7 +5050,7 @@ async function gs(e) {
|
|
|
5001
5050
|
});
|
|
5002
5051
|
continue;
|
|
5003
5052
|
}
|
|
5004
|
-
let n = await
|
|
5053
|
+
let n = await to({
|
|
5005
5054
|
message: `Select ${e.label.toLowerCase()} to add (optional)`,
|
|
5006
5055
|
options: t,
|
|
5007
5056
|
required: !1
|
|
@@ -5011,20 +5060,20 @@ async function gs(e) {
|
|
|
5011
5060
|
}
|
|
5012
5061
|
return d;
|
|
5013
5062
|
}
|
|
5014
|
-
var
|
|
5015
|
-
function
|
|
5016
|
-
let t = e.match(
|
|
5063
|
+
var ws = /@(frontend|admin)$/;
|
|
5064
|
+
function Ts(e) {
|
|
5065
|
+
let t = e.match(ws);
|
|
5017
5066
|
return t ? {
|
|
5018
5067
|
name: e.slice(0, -t[0].length),
|
|
5019
5068
|
slot: t[1]
|
|
5020
5069
|
} : { name: e };
|
|
5021
5070
|
}
|
|
5022
|
-
function
|
|
5071
|
+
function Es(e) {
|
|
5023
5072
|
let t = /* @__PURE__ */ new Set(), n = [];
|
|
5024
5073
|
for (let r of e) t.has(r.name) || (t.add(r.name), n.push(r.name));
|
|
5025
5074
|
return n;
|
|
5026
5075
|
}
|
|
5027
|
-
function
|
|
5076
|
+
function Ds(e) {
|
|
5028
5077
|
let t = /* @__PURE__ */ new Map();
|
|
5029
5078
|
for (let n of e) {
|
|
5030
5079
|
if (!n.slot) continue;
|
|
@@ -5035,8 +5084,8 @@ function bs(e) {
|
|
|
5035
5084
|
}
|
|
5036
5085
|
//#endregion
|
|
5037
5086
|
//#region src/commands/login.ts
|
|
5038
|
-
async function
|
|
5039
|
-
|
|
5087
|
+
async function Os() {
|
|
5088
|
+
$a(), s.intro(L.brandBold("Log in to Hype Stack")), s.log.step("Opening your browser to sign in...");
|
|
5040
5089
|
let e;
|
|
5041
5090
|
try {
|
|
5042
5091
|
e = await ar({ onUrl: (e) => {
|
|
@@ -5049,8 +5098,8 @@ async function xs() {
|
|
|
5049
5098
|
}
|
|
5050
5099
|
//#endregion
|
|
5051
5100
|
//#region src/commands/logout.ts
|
|
5052
|
-
async function
|
|
5053
|
-
|
|
5101
|
+
async function ks() {
|
|
5102
|
+
$a(), s.intro(L.brandBold("Log out of Hype Stack"));
|
|
5054
5103
|
let e = F(), t = await Xn(e);
|
|
5055
5104
|
if (!t) {
|
|
5056
5105
|
s.outro(L.muted("You're not logged in."));
|
|
@@ -5060,7 +5109,7 @@ async function Ss() {
|
|
|
5060
5109
|
}
|
|
5061
5110
|
//#endregion
|
|
5062
5111
|
//#region src/core/onboard-env.ts
|
|
5063
|
-
function
|
|
5112
|
+
function As(e) {
|
|
5064
5113
|
let t = [], n = "";
|
|
5065
5114
|
for (let r of e.split(/\r?\n/)) {
|
|
5066
5115
|
let e = r.trim();
|
|
@@ -5086,14 +5135,14 @@ function Cs(e) {
|
|
|
5086
5135
|
}
|
|
5087
5136
|
return t;
|
|
5088
5137
|
}
|
|
5089
|
-
function
|
|
5138
|
+
function js(e) {
|
|
5090
5139
|
let t = e.trim();
|
|
5091
5140
|
if (t === "") return "";
|
|
5092
5141
|
if (t.length <= 4) return "•".repeat(t.length);
|
|
5093
5142
|
let n = Math.min(t.length - 4, 8);
|
|
5094
5143
|
return `${"•".repeat(n)}${t.slice(-4)}`;
|
|
5095
5144
|
}
|
|
5096
|
-
function
|
|
5145
|
+
function Ms(e, t, n) {
|
|
5097
5146
|
let r = e.split(/\r?\n/), i = !1, a = r.map((e) => {
|
|
5098
5147
|
if (i) return e;
|
|
5099
5148
|
let r = e.trim();
|
|
@@ -5103,58 +5152,58 @@ function Ts(e, t, n) {
|
|
|
5103
5152
|
});
|
|
5104
5153
|
return i ? a.join("\n") : e + `${e.length > 0 && !e.endsWith("\n") ? "\n" : ""}${t}=${n}\n`;
|
|
5105
5154
|
}
|
|
5106
|
-
async function
|
|
5155
|
+
async function Ns(e) {
|
|
5107
5156
|
return await Y(e) ? y.readFile(e, "utf-8") : "";
|
|
5108
5157
|
}
|
|
5109
|
-
async function
|
|
5158
|
+
async function Ps(e) {
|
|
5110
5159
|
let t = T.join(T.dirname(e), ".env");
|
|
5111
5160
|
return await Y(t) || await y.copyFile(e, t), t;
|
|
5112
5161
|
}
|
|
5113
|
-
async function
|
|
5114
|
-
let r =
|
|
5162
|
+
async function Fs(e, t, n) {
|
|
5163
|
+
let r = Ms(await Ns(e), t, n);
|
|
5115
5164
|
await y.writeFile(e, r, "utf-8");
|
|
5116
5165
|
}
|
|
5117
5166
|
//#endregion
|
|
5118
5167
|
//#region src/commands/onboard.ts
|
|
5119
|
-
async function
|
|
5168
|
+
async function Is(e = {}) {
|
|
5120
5169
|
let t = e.cwd ?? process.cwd();
|
|
5121
|
-
|
|
5170
|
+
Qa(), s.intro(L.brandBold("Onboard your stack"));
|
|
5122
5171
|
let n;
|
|
5123
5172
|
try {
|
|
5124
|
-
n = await
|
|
5173
|
+
n = await Pr(t);
|
|
5125
5174
|
} catch {
|
|
5126
5175
|
n = null;
|
|
5127
5176
|
}
|
|
5128
5177
|
n || (s.cancel(`${L.path("stack.json")} not found. Run ${L.command("npx @hype-stack/cli init")} first.`), process.exit(1));
|
|
5129
|
-
let r = n.installedPacks ?? [], i = n.onboarding?.envSections ?? [], a = await
|
|
5178
|
+
let r = n.installedPacks ?? [], i = n.onboarding?.envSections ?? [], a = await jo(t);
|
|
5130
5179
|
a.length === 0 && s.log.warn(L.muted("No .env.example files found; skipping env setup."));
|
|
5131
|
-
for (let n of a) await
|
|
5180
|
+
for (let n of a) await Ls({
|
|
5132
5181
|
examplePath: n,
|
|
5133
5182
|
projectRoot: t,
|
|
5134
5183
|
skipPrompts: e.yes ?? !1,
|
|
5135
5184
|
installedEnvSections: i
|
|
5136
5185
|
});
|
|
5137
|
-
let o =
|
|
5138
|
-
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.`));
|
|
5139
5188
|
}
|
|
5140
|
-
async function
|
|
5141
|
-
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);
|
|
5142
5191
|
s.log.step(`Env: ${u}`);
|
|
5143
5192
|
for (let e of l) {
|
|
5144
5193
|
if (e.vars.length === 0) continue;
|
|
5145
|
-
if (!
|
|
5194
|
+
if (!kr(e.section, i)) {
|
|
5146
5195
|
let t = e.section ? L.bold(e.section) : L.bold("Variables");
|
|
5147
5196
|
s.log.info(`${t} ${L.muted("skipped (not owned by an installed pack)")}`);
|
|
5148
5197
|
continue;
|
|
5149
5198
|
}
|
|
5150
|
-
let t =
|
|
5199
|
+
let t = Or(e.section), n = e.section ? L.bold(e.section) : L.bold("Variables");
|
|
5151
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."));
|
|
5152
5201
|
for (let n of e.vars) {
|
|
5153
5202
|
if (r) {
|
|
5154
5203
|
s.log.info(`${L.label(n.key)} ${L.muted("skipped (non-interactive)")}`);
|
|
5155
5204
|
continue;
|
|
5156
5205
|
}
|
|
5157
|
-
let e =
|
|
5206
|
+
let e = js(Rs(c, n.key)), i = await s.text({
|
|
5158
5207
|
message: `${L.label(n.key)}`,
|
|
5159
5208
|
placeholder: e ? `${e} ${L.muted("(Enter keeps this)")}` : t.hint
|
|
5160
5209
|
});
|
|
@@ -5164,31 +5213,31 @@ async function As(e) {
|
|
|
5164
5213
|
s.log.info(L.muted(`${n.key} unchanged.`));
|
|
5165
5214
|
continue;
|
|
5166
5215
|
}
|
|
5167
|
-
await
|
|
5216
|
+
await Fs(o, n.key, a), s.log.success(`${n.key} saved`);
|
|
5168
5217
|
}
|
|
5169
5218
|
}
|
|
5170
5219
|
}
|
|
5171
|
-
function
|
|
5220
|
+
function Rs(e, t) {
|
|
5172
5221
|
for (let n of e.split(/\r?\n/)) {
|
|
5173
|
-
let e = n.match(RegExp(`^${
|
|
5222
|
+
let e = n.match(RegExp(`^${zs(t)}\\s*=\\s*(.*)$`));
|
|
5174
5223
|
if (e) return e[1].trim();
|
|
5175
5224
|
}
|
|
5176
5225
|
return "";
|
|
5177
5226
|
}
|
|
5178
|
-
function
|
|
5227
|
+
function zs(e) {
|
|
5179
5228
|
return e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
5180
5229
|
}
|
|
5181
|
-
async function
|
|
5182
|
-
if (!await
|
|
5230
|
+
async function Bs(e, t) {
|
|
5231
|
+
if (!await ya() && !await xa(e, t, !1)) {
|
|
5183
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")}.`));
|
|
5184
5233
|
return;
|
|
5185
5234
|
}
|
|
5186
5235
|
let n = s.spinner();
|
|
5187
|
-
if (n.start("Waiting for Postgres to be ready..."), !await
|
|
5236
|
+
if (n.start("Waiting for Postgres to be ready..."), !await Da(e)) {
|
|
5188
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")}`));
|
|
5189
5238
|
return;
|
|
5190
5239
|
}
|
|
5191
|
-
if (n.stop(L.success("Postgres is ready")), await
|
|
5240
|
+
if (n.stop(L.success("Postgres is ready")), await ka(e)) {
|
|
5192
5241
|
s.log.info(L.muted("Migrations already applied, skipping."));
|
|
5193
5242
|
return;
|
|
5194
5243
|
}
|
|
@@ -5200,20 +5249,20 @@ async function Ns(e, t) {
|
|
|
5200
5249
|
s.log.info(L.muted("Skipping database migrations."));
|
|
5201
5250
|
return;
|
|
5202
5251
|
}
|
|
5203
|
-
await
|
|
5252
|
+
await Aa(e);
|
|
5204
5253
|
}
|
|
5205
5254
|
//#endregion
|
|
5206
5255
|
//#region src/core/templates.ts
|
|
5207
|
-
var
|
|
5256
|
+
var Vs = q.createRequest()({
|
|
5208
5257
|
endpoint: "/templates/list",
|
|
5209
5258
|
method: "GET"
|
|
5210
5259
|
});
|
|
5211
|
-
async function
|
|
5212
|
-
let { data: e, error: t } = await
|
|
5260
|
+
async function Hs() {
|
|
5261
|
+
let { data: e, error: t } = await Vs.send();
|
|
5213
5262
|
if (t || !e) throw Error(`Failed to fetch template list: ${String(t)}`);
|
|
5214
5263
|
return e.templates;
|
|
5215
5264
|
}
|
|
5216
|
-
async function
|
|
5265
|
+
async function Us(e) {
|
|
5217
5266
|
let { data: t, error: n, status: r } = await q.createRequest()({
|
|
5218
5267
|
endpoint: `/templates/${encodeURIComponent(e)}/manifest`,
|
|
5219
5268
|
method: "GET"
|
|
@@ -5222,7 +5271,7 @@ async function Is(e) {
|
|
|
5222
5271
|
if (n || !t) throw Error(`Failed to load manifest for template "${e}": ${String(n)}`);
|
|
5223
5272
|
return t;
|
|
5224
5273
|
}
|
|
5225
|
-
async function
|
|
5274
|
+
async function Ws(e, t = {}) {
|
|
5226
5275
|
let n = q.createRequest()({
|
|
5227
5276
|
endpoint: `/templates/${encodeURIComponent(e)}/download`,
|
|
5228
5277
|
method: "POST"
|
|
@@ -5250,21 +5299,21 @@ async function Ls(e, t = {}) {
|
|
|
5250
5299
|
}
|
|
5251
5300
|
//#endregion
|
|
5252
5301
|
//#region src/commands/template.ts
|
|
5253
|
-
async function
|
|
5302
|
+
async function Gs(t = {}) {
|
|
5254
5303
|
let n = t.cwd ?? process.cwd();
|
|
5255
|
-
|
|
5304
|
+
Qa();
|
|
5256
5305
|
let r = s.spinner();
|
|
5257
5306
|
r.start("Loading packs...");
|
|
5258
5307
|
let o;
|
|
5259
5308
|
try {
|
|
5260
|
-
o = await
|
|
5309
|
+
o = await Kr();
|
|
5261
5310
|
} catch (e) {
|
|
5262
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);
|
|
5263
5312
|
}
|
|
5264
5313
|
r.stop("Packs loaded"), r.start("Loading templates...");
|
|
5265
5314
|
let c;
|
|
5266
5315
|
try {
|
|
5267
|
-
c = await
|
|
5316
|
+
c = await Hs();
|
|
5268
5317
|
} catch (e) {
|
|
5269
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);
|
|
5270
5319
|
}
|
|
@@ -5287,33 +5336,33 @@ async function Rs(t = {}) {
|
|
|
5287
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}`);
|
|
5288
5337
|
let d;
|
|
5289
5338
|
try {
|
|
5290
|
-
d = await
|
|
5339
|
+
d = await Us(u.id);
|
|
5291
5340
|
} catch (e) {
|
|
5292
5341
|
s.cancel($(e)), process.exit(1);
|
|
5293
5342
|
}
|
|
5294
|
-
let f = await
|
|
5343
|
+
let f = await xs(n, {}, {
|
|
5295
5344
|
defaultTheme: d.theme,
|
|
5296
5345
|
defaultMode: d.defaultMode,
|
|
5297
5346
|
radius: d.radius
|
|
5298
5347
|
}), p = f?.projectRoot ?? null, m = f?.scaffolded ?? !1, h;
|
|
5299
5348
|
try {
|
|
5300
|
-
h = await
|
|
5349
|
+
h = await Pr(p ?? n);
|
|
5301
5350
|
} catch (e) {
|
|
5302
5351
|
s.cancel(`Could not parse ${L.path("stack.json")}: ${$(e)} Run 'npx @hype-stack/cli init' to regenerate it.`), process.exit(1);
|
|
5303
5352
|
}
|
|
5304
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));
|
|
5305
5354
|
let g = p ?? n;
|
|
5306
5355
|
s.intro(L.brandBold("Install a template"));
|
|
5307
|
-
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({
|
|
5308
5357
|
packs: o,
|
|
5309
5358
|
templatePacks: E,
|
|
5310
5359
|
installedSet: v,
|
|
5311
5360
|
options: t
|
|
5312
5361
|
}), O = [...E, ...D.filter((e) => !E.includes(e))], k = O.filter((e) => !b.has(e));
|
|
5313
5362
|
k.length > 0 && (s.cancel(`Unknown pack${k.length === 1 ? "" : "s"}: ${k.join(", ")}`), process.exit(1));
|
|
5314
|
-
let ee =
|
|
5363
|
+
let ee = Ua(o, w), A = Fa(ee), te;
|
|
5315
5364
|
try {
|
|
5316
|
-
te =
|
|
5365
|
+
te = La(O, A, _);
|
|
5317
5366
|
} catch (e) {
|
|
5318
5367
|
s.cancel($(e)), process.exit(1);
|
|
5319
5368
|
}
|
|
@@ -5321,13 +5370,13 @@ async function Rs(t = {}) {
|
|
|
5321
5370
|
s.outro(L.muted("Every pack in this template is already installed."));
|
|
5322
5371
|
return;
|
|
5323
5372
|
}
|
|
5324
|
-
let ne = await
|
|
5373
|
+
let ne = await ts(ee, v, {
|
|
5325
5374
|
token: S,
|
|
5326
5375
|
key: x
|
|
5327
5376
|
}), re = (e) => {
|
|
5328
5377
|
let t = b.get(e);
|
|
5329
5378
|
return !t || t.tier === "free" ? "free" : ne[e]?.owned ? "owned" : "locked";
|
|
5330
|
-
}, j = (e) => !v.has(e) && re(e) === "locked", M =
|
|
5379
|
+
}, j = (e) => !v.has(e) && re(e) === "locked", M = Ra({
|
|
5331
5380
|
order: te.order,
|
|
5332
5381
|
graph: A,
|
|
5333
5382
|
isLocked: j,
|
|
@@ -5335,28 +5384,28 @@ async function Rs(t = {}) {
|
|
|
5335
5384
|
});
|
|
5336
5385
|
if (M.blocked.length > 0 && !S && !x) {
|
|
5337
5386
|
let e = await or();
|
|
5338
|
-
e && (S = e, ne = await
|
|
5387
|
+
e && (S = e, ne = await ts(ee, v, {
|
|
5339
5388
|
token: S,
|
|
5340
5389
|
key: x
|
|
5341
|
-
}), M =
|
|
5390
|
+
}), M = Ra({
|
|
5342
5391
|
order: te.order,
|
|
5343
5392
|
graph: A,
|
|
5344
5393
|
isLocked: j,
|
|
5345
5394
|
installed: _
|
|
5346
5395
|
}));
|
|
5347
5396
|
}
|
|
5348
|
-
if (M.blocked.length > 0 && await
|
|
5397
|
+
if (M.blocked.length > 0 && await rs(M.blocked, j, b), M.installable.length === 0) {
|
|
5349
5398
|
s.outro(L.muted("Nothing left to install once locked packs are removed."));
|
|
5350
5399
|
return;
|
|
5351
5400
|
}
|
|
5352
|
-
if (
|
|
5401
|
+
if (is(M.installable, b), !t.yes) {
|
|
5353
5402
|
let e = await s.confirm({ message: `Install template ${L.brandBold(u.name)} (${M.installable.length} pack${M.installable.length === 1 ? "" : "s"})?` });
|
|
5354
5403
|
(s.isCancel(e) || !e) && (s.cancel("Installation cancelled."), process.exit(0));
|
|
5355
5404
|
}
|
|
5356
5405
|
r.start("Downloading packs...");
|
|
5357
5406
|
let N;
|
|
5358
5407
|
try {
|
|
5359
|
-
N = await
|
|
5408
|
+
N = await as(M.installable, {
|
|
5360
5409
|
token: S,
|
|
5361
5410
|
key: x
|
|
5362
5411
|
});
|
|
@@ -5364,7 +5413,7 @@ async function Rs(t = {}) {
|
|
|
5364
5413
|
r.stop("Download failed"), s.cancel($(e)), process.exit(1);
|
|
5365
5414
|
}
|
|
5366
5415
|
r.stop(`Downloaded ${N.length} pack${N.length === 1 ? "" : "s"}`);
|
|
5367
|
-
let ie = await
|
|
5416
|
+
let ie = await ls({
|
|
5368
5417
|
prepared: N,
|
|
5369
5418
|
config: h,
|
|
5370
5419
|
cwd: g,
|
|
@@ -5373,7 +5422,7 @@ async function Rs(t = {}) {
|
|
|
5373
5422
|
}), P = null;
|
|
5374
5423
|
try {
|
|
5375
5424
|
r.start("Installing pack files...");
|
|
5376
|
-
let n = await
|
|
5425
|
+
let n = await ca({
|
|
5377
5426
|
packs: N,
|
|
5378
5427
|
config: h,
|
|
5379
5428
|
projectRoot: g,
|
|
@@ -5385,15 +5434,15 @@ async function Rs(t = {}) {
|
|
|
5385
5434
|
for (let e of n.errors) s.log.error(e);
|
|
5386
5435
|
s.cancel("No files were written. Fix the errors above (or pass --force for existing files) and try again."), process.exit(1);
|
|
5387
5436
|
}
|
|
5388
|
-
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));
|
|
5389
5438
|
for (let e of n.errors) s.log.error(e);
|
|
5390
5439
|
r.start("Applying template overrides...");
|
|
5391
|
-
let o = await
|
|
5440
|
+
let o = await Ws(u.id, {
|
|
5392
5441
|
token: S,
|
|
5393
5442
|
licenseKey: x
|
|
5394
5443
|
});
|
|
5395
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;
|
|
5396
|
-
let c = await
|
|
5445
|
+
let c = await ua({
|
|
5397
5446
|
manifest: d,
|
|
5398
5447
|
config: h,
|
|
5399
5448
|
projectRoot: g,
|
|
@@ -5403,11 +5452,11 @@ async function Rs(t = {}) {
|
|
|
5403
5452
|
for (let e of c.errors) s.log.error(e);
|
|
5404
5453
|
if (!m) {
|
|
5405
5454
|
let t = T.resolve(g, h.paths?.frontend.root ?? "apps/frontend"), n = d.theme ?? "zinc-mono";
|
|
5406
|
-
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`)));
|
|
5407
5456
|
let r = d.defaultMode === "dark" || d.defaultMode === "light" ? d.defaultMode : e;
|
|
5408
|
-
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`));
|
|
5409
5458
|
}
|
|
5410
|
-
await
|
|
5459
|
+
await Js({
|
|
5411
5460
|
prepared: N,
|
|
5412
5461
|
templateNpm: d.dependencies_npm,
|
|
5413
5462
|
paths: h.paths,
|
|
@@ -5415,13 +5464,13 @@ async function Rs(t = {}) {
|
|
|
5415
5464
|
spinner: r
|
|
5416
5465
|
});
|
|
5417
5466
|
let l;
|
|
5418
|
-
m && (l = await
|
|
5467
|
+
m && (l = await Pa(g, t.yes ?? !1)), await br({
|
|
5419
5468
|
projectRoot: g,
|
|
5420
5469
|
paths: h.paths,
|
|
5421
5470
|
skipPrompts: t.yes ?? !1,
|
|
5422
5471
|
dbReady: l,
|
|
5423
5472
|
freshScaffold: m
|
|
5424
|
-
}),
|
|
5473
|
+
}), ss(), s.outro(L.brand(`Installed template ${u.name}.`));
|
|
5425
5474
|
} finally {
|
|
5426
5475
|
await Promise.all(N.map((e) => y.rm(e.packDir, {
|
|
5427
5476
|
recursive: !0,
|
|
@@ -5432,7 +5481,7 @@ async function Rs(t = {}) {
|
|
|
5432
5481
|
});
|
|
5433
5482
|
}
|
|
5434
5483
|
}
|
|
5435
|
-
async function
|
|
5484
|
+
async function Ks(e, t, n) {
|
|
5436
5485
|
let r = {};
|
|
5437
5486
|
for (let i of e.slots) {
|
|
5438
5487
|
if (t?.[i.family]) {
|
|
@@ -5456,7 +5505,7 @@ async function zs(e, t, n) {
|
|
|
5456
5505
|
}
|
|
5457
5506
|
return r;
|
|
5458
5507
|
}
|
|
5459
|
-
async function
|
|
5508
|
+
async function qs(e) {
|
|
5460
5509
|
let { packs: t, templatePacks: n, installedSet: r, options: i } = e, a = new Set(n);
|
|
5461
5510
|
if (i.packs && i.packs.length > 0) {
|
|
5462
5511
|
let e = i.packs.filter((e) => !t.some((t) => t.name === e));
|
|
@@ -5467,7 +5516,7 @@ async function Bs(e) {
|
|
|
5467
5516
|
if (o.length === 0) return [];
|
|
5468
5517
|
let c = le();
|
|
5469
5518
|
z(o.map((e) => ` ${R.arrow} ${L.highlight(e.displayName)} ${ve(`${c}/packs/${e.name}`)}`).join("\n"), "Browse packs");
|
|
5470
|
-
let l = await
|
|
5519
|
+
let l = await to({
|
|
5471
5520
|
message: "Add extra packs on top of the template (optional)",
|
|
5472
5521
|
options: o.map((e) => ({
|
|
5473
5522
|
value: e.name,
|
|
@@ -5478,25 +5527,25 @@ async function Bs(e) {
|
|
|
5478
5527
|
});
|
|
5479
5528
|
return m(l) && (s.cancel("Cancelled."), process.exit(0)), l;
|
|
5480
5529
|
}
|
|
5481
|
-
async function
|
|
5482
|
-
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);
|
|
5483
5532
|
if (c.errors.length > 0) {
|
|
5484
5533
|
for (let e of c.errors) s.log.error(e);
|
|
5485
5534
|
return;
|
|
5486
5535
|
}
|
|
5487
5536
|
if (c.operations.length === 0) return;
|
|
5488
5537
|
a.start("Installing npm dependencies...");
|
|
5489
|
-
let l = await
|
|
5538
|
+
let l = await es(c.operations, i);
|
|
5490
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);
|
|
5491
5540
|
}
|
|
5492
5541
|
//#endregion
|
|
5493
5542
|
//#region src/cli.ts
|
|
5494
|
-
function
|
|
5543
|
+
function Ys(e) {
|
|
5495
5544
|
if (!e) return;
|
|
5496
5545
|
let t = e.split(",").map((e) => e.trim()).filter((e) => e.length > 0);
|
|
5497
5546
|
return t.length > 0 ? t : void 0;
|
|
5498
5547
|
}
|
|
5499
|
-
function
|
|
5548
|
+
function Xs(e) {
|
|
5500
5549
|
if (!e) return;
|
|
5501
5550
|
let t = {};
|
|
5502
5551
|
for (let n of e.split(",")) {
|
|
@@ -5505,10 +5554,10 @@ function Us(e) {
|
|
|
5505
5554
|
}
|
|
5506
5555
|
return Object.keys(t).length > 0 ? t : void 0;
|
|
5507
5556
|
}
|
|
5508
|
-
function
|
|
5557
|
+
function Zs() {
|
|
5509
5558
|
let e = new o();
|
|
5510
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) => {
|
|
5511
|
-
await
|
|
5560
|
+
await ys({
|
|
5512
5561
|
name: e.name,
|
|
5513
5562
|
directory: e.directory,
|
|
5514
5563
|
install: e.install,
|
|
@@ -5518,38 +5567,38 @@ function Ws() {
|
|
|
5518
5567
|
setup: e.setup
|
|
5519
5568
|
});
|
|
5520
5569
|
}), e.command("init").description("Initialize stack.json in the current project").action(async () => {
|
|
5521
|
-
await
|
|
5570
|
+
await bs({});
|
|
5522
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) => {
|
|
5523
|
-
await
|
|
5572
|
+
await Is({
|
|
5524
5573
|
cwd: e.cwd,
|
|
5525
5574
|
yes: e.yes,
|
|
5526
5575
|
skipMigrations: e.skipMigrations
|
|
5527
5576
|
});
|
|
5528
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) => {
|
|
5529
|
-
await
|
|
5530
|
-
packs:
|
|
5578
|
+
await Ss({
|
|
5579
|
+
packs: Ys(e.packs),
|
|
5531
5580
|
force: e.force,
|
|
5532
5581
|
yes: e.yes,
|
|
5533
5582
|
licenseKey: e.key ?? e.licenseKey,
|
|
5534
5583
|
cwd: e.cwd
|
|
5535
5584
|
});
|
|
5536
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) => {
|
|
5537
|
-
await
|
|
5586
|
+
await Gs({
|
|
5538
5587
|
templateId: e,
|
|
5539
|
-
variants:
|
|
5540
|
-
packs:
|
|
5588
|
+
variants: Xs(t.variants),
|
|
5589
|
+
packs: Ys(t.packs),
|
|
5541
5590
|
force: t.force,
|
|
5542
5591
|
yes: t.yes,
|
|
5543
5592
|
licenseKey: t.key ?? t.licenseKey,
|
|
5544
5593
|
cwd: t.cwd
|
|
5545
5594
|
});
|
|
5546
5595
|
}), e.command("login").description("Log in via your browser to install packs your organization owns").action(async () => {
|
|
5547
|
-
await
|
|
5596
|
+
await Os();
|
|
5548
5597
|
}), e.command("logout").description("Log out and remove the saved CLI token").action(async () => {
|
|
5549
|
-
await
|
|
5598
|
+
await ks();
|
|
5550
5599
|
}), e.command("auth").description("Alias for `login`").action(async () => {
|
|
5551
|
-
await
|
|
5600
|
+
await Os();
|
|
5552
5601
|
}), e;
|
|
5553
5602
|
}
|
|
5554
5603
|
//#endregion
|
|
5555
|
-
export {
|
|
5604
|
+
export { xs as a, Ss as i, ks as n, bs as o, Os as r, ys as s, Zs as t };
|