@hype-stack/cli 0.5.10 → 0.5.12
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-BoOxL4ry.js → cli-CHPFj1jR.js} +497 -495
- package/dist/config/bin.js +1 -1
- package/dist/core/codemods.d.ts +2 -0
- package/dist/core/codemods.d.ts.map +1 -1
- package/dist/core/onboard-catalog.d.ts +10 -9
- package/dist/core/onboard-catalog.d.ts.map +1 -1
- package/dist/core/onboard-env.d.ts +8 -0
- package/dist/core/onboard-env.d.ts.map +1 -1
- package/dist/core/post-clone.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.12", te = "gh:BetterTyped/hype-stack", j = "stack.json", ne = "/schema/stack.json", M = "https://api.hype-stack.dev", N = "HYPE_STACK_API_URL", P = "https://www.hype-stack.dev", re = /^[a-z0-9](?:[a-z0-9._-]*[a-z0-9])?$/, F = [
|
|
17
17
|
{
|
|
18
18
|
value: "cursor",
|
|
19
19
|
label: "Cursor",
|
|
@@ -2584,61 +2584,56 @@ function xr(e) {
|
|
|
2584
2584
|
let t = vr(e);
|
|
2585
2585
|
return t ? yr[t] : br;
|
|
2586
2586
|
}
|
|
2587
|
-
|
|
2588
|
-
|
|
2589
|
-
Y.Databases,
|
|
2590
|
-
Y.Sentry,
|
|
2591
|
-
Y.Resend
|
|
2592
|
-
]);
|
|
2593
|
-
function Cr(e, t) {
|
|
2587
|
+
function Sr(e, t) {
|
|
2588
|
+
if (t.length === 0) return !0;
|
|
2594
2589
|
let n = vr(e);
|
|
2595
|
-
return n
|
|
2590
|
+
return n ? t.includes(n) : !1;
|
|
2596
2591
|
}
|
|
2597
|
-
function
|
|
2592
|
+
function Cr(e) {
|
|
2598
2593
|
return e ? e.map((e) => {
|
|
2599
2594
|
let t = vr(e.envExample.section);
|
|
2600
2595
|
if (!t) throw Error(`Unknown onboarding env section "${e.envExample.section}". Known sections: ${Object.values(Y).join(", ")}.`);
|
|
2601
2596
|
return t;
|
|
2602
2597
|
}) : [];
|
|
2603
2598
|
}
|
|
2604
|
-
function
|
|
2599
|
+
function wr(e) {
|
|
2605
2600
|
let t = /* @__PURE__ */ new Set(), n = [];
|
|
2606
2601
|
for (let r of e) t.has(r) || (t.add(r), n.push(r));
|
|
2607
2602
|
return n;
|
|
2608
2603
|
}
|
|
2609
|
-
var
|
|
2604
|
+
var Tr = {
|
|
2610
2605
|
"starter-saas-workos": ["Your WebSocket upgrades can be authenticated with `authenticateWsUpgrade` from `@backend/middleware/auth/ws-auth` via `sockets.routes(authenticateWsUpgrade)`."],
|
|
2611
2606
|
"starter-saas-betterauth": ["Your WebSocket upgrades can be authenticated with `authenticateWsUpgrade` from `@backend/middleware/auth/ws-auth` via `sockets.routes(authenticateWsUpgrade)`."],
|
|
2612
2607
|
"pack-notifications": ["Notifications push over the `appChannel` socket channel; register it in your server startup to go live."],
|
|
2613
2608
|
"pack-collaboration": ["Team and TeamMember are available as CASL subjects; project member and team management reuse the existing `Project` subject."]
|
|
2614
2609
|
};
|
|
2615
|
-
function
|
|
2610
|
+
function Er(e) {
|
|
2616
2611
|
let t = /* @__PURE__ */ new Set(), n = [];
|
|
2617
2612
|
for (let r of e) {
|
|
2618
|
-
let e =
|
|
2613
|
+
let e = Tr[r];
|
|
2619
2614
|
if (e) for (let r of e) t.has(r) || (t.add(r), n.push(r));
|
|
2620
2615
|
}
|
|
2621
2616
|
return n;
|
|
2622
2617
|
}
|
|
2623
2618
|
//#endregion
|
|
2624
2619
|
//#region src/core/stack-config.ts
|
|
2625
|
-
async function
|
|
2620
|
+
async function Dr(e) {
|
|
2626
2621
|
return sr(T.join(e, j));
|
|
2627
2622
|
}
|
|
2628
|
-
async function
|
|
2623
|
+
async function Or(e) {
|
|
2629
2624
|
return J(T.join(e, j));
|
|
2630
2625
|
}
|
|
2631
|
-
async function
|
|
2626
|
+
async function kr(e, t) {
|
|
2632
2627
|
await cr(T.join(e, j), t);
|
|
2633
2628
|
}
|
|
2634
|
-
async function
|
|
2629
|
+
async function Ar(e) {
|
|
2635
2630
|
let t = T.join(e, "apps"), n = T.join(e, "packages"), [r, i] = await Promise.all([lr(t), lr(n)]);
|
|
2636
2631
|
return {
|
|
2637
2632
|
apps: r,
|
|
2638
2633
|
packages: i
|
|
2639
2634
|
};
|
|
2640
2635
|
}
|
|
2641
|
-
function
|
|
2636
|
+
function jr(e) {
|
|
2642
2637
|
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";
|
|
2643
2638
|
return {
|
|
2644
2639
|
backend: {
|
|
@@ -2672,19 +2667,19 @@ function Mr(e) {
|
|
|
2672
2667
|
}
|
|
2673
2668
|
};
|
|
2674
2669
|
}
|
|
2675
|
-
function
|
|
2670
|
+
function Mr(e, t) {
|
|
2676
2671
|
return {
|
|
2677
2672
|
$schema: ue(),
|
|
2678
2673
|
version: 1,
|
|
2679
2674
|
name: e,
|
|
2680
2675
|
apps: t.apps,
|
|
2681
2676
|
packages: t.packages,
|
|
2682
|
-
paths:
|
|
2677
|
+
paths: jr(t),
|
|
2683
2678
|
installedPacks: [],
|
|
2684
2679
|
licenseKey: null
|
|
2685
2680
|
};
|
|
2686
2681
|
}
|
|
2687
|
-
async function
|
|
2682
|
+
async function Nr(e) {
|
|
2688
2683
|
let t = T.join(e, "package.json"), n = T.join(e, "apps"), [r, i] = await Promise.all([J(t), ar(n)]);
|
|
2689
2684
|
return r && i;
|
|
2690
2685
|
}
|
|
@@ -2699,7 +2694,7 @@ function X(e, t) {
|
|
|
2699
2694
|
}
|
|
2700
2695
|
//#endregion
|
|
2701
2696
|
//#region src/core/registry.ts
|
|
2702
|
-
async function
|
|
2697
|
+
async function Pr(e) {
|
|
2703
2698
|
let { data: t, error: n, status: r } = await K.createRequest()({
|
|
2704
2699
|
endpoint: `/packs/${encodeURIComponent(e)}/manifest`,
|
|
2705
2700
|
method: "GET"
|
|
@@ -2708,7 +2703,7 @@ async function Fr(e) {
|
|
|
2708
2703
|
if (n || !t) throw Error(`Failed to load manifest for "${e}": ${String(n)}`);
|
|
2709
2704
|
return t;
|
|
2710
2705
|
}
|
|
2711
|
-
async function
|
|
2706
|
+
async function Fr(e, t = {}) {
|
|
2712
2707
|
let n = K.createRequest()({
|
|
2713
2708
|
endpoint: `/packs/${encodeURIComponent(e)}/download`,
|
|
2714
2709
|
method: "POST"
|
|
@@ -2734,23 +2729,23 @@ async function Ir(e, t = {}) {
|
|
|
2734
2729
|
packDir: s
|
|
2735
2730
|
};
|
|
2736
2731
|
}
|
|
2737
|
-
function
|
|
2732
|
+
function Ir(e, t, n) {
|
|
2738
2733
|
let r = X(e, t);
|
|
2739
2734
|
return T.resolve(n, r);
|
|
2740
2735
|
}
|
|
2741
|
-
function
|
|
2736
|
+
function Lr(e, t) {
|
|
2742
2737
|
return T.join(t, e);
|
|
2743
2738
|
}
|
|
2744
|
-
var
|
|
2739
|
+
var Rr = K.createRequest()({
|
|
2745
2740
|
endpoint: "/packs/list",
|
|
2746
2741
|
method: "GET"
|
|
2747
2742
|
});
|
|
2748
|
-
async function
|
|
2749
|
-
let { data: e, error: t } = await
|
|
2743
|
+
async function zr() {
|
|
2744
|
+
let { data: e, error: t } = await Rr.send();
|
|
2750
2745
|
if (t || !e) throw Error(`Failed to fetch pack list: ${String(t)}`);
|
|
2751
2746
|
return e.packs;
|
|
2752
2747
|
}
|
|
2753
|
-
async function
|
|
2748
|
+
async function Br(e, t = {}) {
|
|
2754
2749
|
if (e.length === 0) return {};
|
|
2755
2750
|
let n = K.createRequest()({
|
|
2756
2751
|
endpoint: "/packs/authorize",
|
|
@@ -2766,30 +2761,33 @@ async function Vr(e, t = {}) {
|
|
|
2766
2761
|
}
|
|
2767
2762
|
//#endregion
|
|
2768
2763
|
//#region src/core/codemods.ts
|
|
2769
|
-
var
|
|
2764
|
+
var Vr = "@hype-stack/", Hr = /@hype-stack\/(?!cli\b)/g;
|
|
2770
2765
|
function Ur(e, t) {
|
|
2766
|
+
return e.replace(Hr, t);
|
|
2767
|
+
}
|
|
2768
|
+
function Wr(e, t) {
|
|
2771
2769
|
return X(e === "admin" ? "{{admin.root}}" : "{{frontend.root}}", t);
|
|
2772
2770
|
}
|
|
2773
|
-
async function
|
|
2771
|
+
async function Gr(e, t, n) {
|
|
2774
2772
|
let r = X("{{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");
|
|
2775
2773
|
if (await J(i)) {
|
|
2776
2774
|
let t = await y.readFile(i, "utf-8");
|
|
2777
|
-
for (let n of e) t.includes(`from "${n.from}"`) || (t =
|
|
2775
|
+
for (let n of e) t.includes(`from "${n.from}"`) || (t = Kr(t, n), t = qr(t, n));
|
|
2778
2776
|
await y.writeFile(i, t, "utf-8");
|
|
2779
2777
|
}
|
|
2780
|
-
if (await Promise.all([a, o].map((t) =>
|
|
2778
|
+
if (await Promise.all([a, o].map((t) => Jr(t, e))), await J(s)) {
|
|
2781
2779
|
let t = await y.readFile(s, "utf-8");
|
|
2782
|
-
for (let n of e) t =
|
|
2780
|
+
for (let n of e) t = Xr(t, n);
|
|
2783
2781
|
await y.writeFile(s, t, "utf-8");
|
|
2784
2782
|
}
|
|
2785
2783
|
}
|
|
2786
|
-
function
|
|
2784
|
+
function Kr(e, t) {
|
|
2787
2785
|
let n = `import { ${t.import} } from "${t.from}";`, r = e.lastIndexOf("import ");
|
|
2788
2786
|
if (r === -1) return n + "\n" + e;
|
|
2789
2787
|
let i = e.indexOf("\n", e.indexOf(";", r));
|
|
2790
2788
|
return i === -1 ? e + "\n" + n : e.slice(0, i + 1) + n + "\n" + e.slice(i + 1);
|
|
2791
2789
|
}
|
|
2792
|
-
function
|
|
2790
|
+
function qr(e, t) {
|
|
2793
2791
|
let n = `.extend(${t.import}.shape)`;
|
|
2794
2792
|
if (e.includes(n)) return e;
|
|
2795
2793
|
let r = e.indexOf("export const envSchema = z.object({");
|
|
@@ -2804,33 +2802,33 @@ function Kr(e, t) {
|
|
|
2804
2802
|
let o = a + 2;
|
|
2805
2803
|
return e.slice(0, o) + n + e.slice(o);
|
|
2806
2804
|
}
|
|
2807
|
-
async function
|
|
2805
|
+
async function Jr(e, t) {
|
|
2808
2806
|
if (!await J(e)) return;
|
|
2809
2807
|
let n = await y.readFile(e, "utf-8");
|
|
2810
|
-
for (let e of t) n =
|
|
2808
|
+
for (let e of t) n = Yr(n, e);
|
|
2811
2809
|
await y.writeFile(e, n, "utf-8");
|
|
2812
2810
|
}
|
|
2813
|
-
function
|
|
2811
|
+
function Yr(e, t) {
|
|
2814
2812
|
for (let n of Object.keys(t.envExample.vars)) if (e.includes(`${n}=`)) return e;
|
|
2815
2813
|
let n = [];
|
|
2816
2814
|
n.push(""), n.push(`# ${hr[t.envExample.section]}`);
|
|
2817
2815
|
for (let [e, r] of Object.entries(t.envExample.vars)) n.push(`${e}=${r}`);
|
|
2818
2816
|
return e.trimEnd() + "\n" + n.join("\n") + "\n";
|
|
2819
2817
|
}
|
|
2820
|
-
function
|
|
2818
|
+
function Xr(e, t) {
|
|
2821
2819
|
for (let n of Object.keys(t.envTest)) if (e.includes(`${n}=`)) return e;
|
|
2822
2820
|
let n = [""];
|
|
2823
2821
|
for (let [e, r] of Object.entries(t.envTest)) n.push(`${e}=${r}`);
|
|
2824
2822
|
return e.trimEnd() + "\n" + n.join("\n") + "\n";
|
|
2825
2823
|
}
|
|
2826
|
-
async function
|
|
2824
|
+
async function Zr(e, t, n) {
|
|
2827
2825
|
let r = T.resolve(n, X("{{backend.routes}}", t), "index.ts");
|
|
2828
2826
|
if (!await J(r)) return;
|
|
2829
2827
|
let i = await y.readFile(r, "utf-8");
|
|
2830
|
-
for (let t of e) i.includes(`from "${t.from}"`) || (i =
|
|
2828
|
+
for (let t of e) i.includes(`from "${t.from}"`) || (i = Qr(i, t), i = $r(i, t));
|
|
2831
2829
|
await y.writeFile(r, i, "utf-8");
|
|
2832
2830
|
}
|
|
2833
|
-
function
|
|
2831
|
+
function Qr(e, t) {
|
|
2834
2832
|
let n = `import { ${t.import} } from "${t.from}";`, r = e.lastIndexOf("from \"./");
|
|
2835
2833
|
if (r !== -1) {
|
|
2836
2834
|
let t = e.indexOf("\n", r);
|
|
@@ -2839,7 +2837,7 @@ function Zr(e, t) {
|
|
|
2839
2837
|
let i = e.indexOf("export const registerRoutes");
|
|
2840
2838
|
return i === -1 ? e : e.slice(0, i) + n + "\n\n" + e.slice(i);
|
|
2841
2839
|
}
|
|
2842
|
-
function
|
|
2840
|
+
function $r(e, t) {
|
|
2843
2841
|
let n = `.route("${t.prefix}", ${t.import})`, r = e.match(/\.route\([^)]+\);/g);
|
|
2844
2842
|
if (r) {
|
|
2845
2843
|
let t = r[r.length - 1], i = e.lastIndexOf(t) + t.length - 1;
|
|
@@ -2847,14 +2845,14 @@ function Qr(e, t) {
|
|
|
2847
2845
|
}
|
|
2848
2846
|
return e.replace("return app;", `return app\n ${n};`);
|
|
2849
2847
|
}
|
|
2850
|
-
async function
|
|
2848
|
+
async function ei(e, t, n) {
|
|
2851
2849
|
let r = T.resolve(n, X("{{backend.root}}", t), "src/context.ts");
|
|
2852
2850
|
if (!await J(r)) return;
|
|
2853
2851
|
let i = await y.readFile(r, "utf-8");
|
|
2854
|
-
for (let t of e) i.includes(`export let ${t.export}`) || (i =
|
|
2852
|
+
for (let t of e) i.includes(`export let ${t.export}`) || (i = ti(i, t), i = ni(i, t), i = ri(i, t), i = ai(i, t));
|
|
2855
2853
|
await y.writeFile(r, i, "utf-8");
|
|
2856
2854
|
}
|
|
2857
|
-
function
|
|
2855
|
+
function ti(e, t) {
|
|
2858
2856
|
let n = `import { ${t.typeImport.name} } from "${t.typeImport.from}";`;
|
|
2859
2857
|
if (e.includes(`from "${t.typeImport.from}"`)) return e;
|
|
2860
2858
|
let r = e.lastIndexOf("import ");
|
|
@@ -2862,7 +2860,7 @@ function ei(e, t) {
|
|
|
2862
2860
|
let i = e.indexOf("\n", e.indexOf(";", r));
|
|
2863
2861
|
return i === -1 ? e + "\n" + n : e.slice(0, i + 1) + n + "\n" + e.slice(i + 1);
|
|
2864
2862
|
}
|
|
2865
|
-
function
|
|
2863
|
+
function ni(e, t) {
|
|
2866
2864
|
let n = `export let ${t.export}: ${t.type};`, r = e.lastIndexOf("export let ");
|
|
2867
2865
|
if (r === -1) {
|
|
2868
2866
|
let t = e.indexOf("export const setupContext");
|
|
@@ -2871,15 +2869,15 @@ function ti(e, t) {
|
|
|
2871
2869
|
let i = e.indexOf("\n", r);
|
|
2872
2870
|
return i === -1 ? e + "\n" + n : e.slice(0, i + 1) + n + "\n" + e.slice(i + 1);
|
|
2873
2871
|
}
|
|
2874
|
-
function
|
|
2872
|
+
function ri(e, t) {
|
|
2875
2873
|
let n = ` ${t.export} = ${t.init};`, r = e.match(/export const setupContext\s*=\s*async\s*\([^)]*\)\s*=>\s*\{/);
|
|
2876
2874
|
if (!r) return e;
|
|
2877
2875
|
let i = e.indexOf("{", e.indexOf(r[0]));
|
|
2878
2876
|
if (i === -1) return e;
|
|
2879
|
-
let a =
|
|
2877
|
+
let a = ii(e, i);
|
|
2880
2878
|
return a === -1 ? e : e.slice(0, a) + n + "\n" + e.slice(a);
|
|
2881
2879
|
}
|
|
2882
|
-
function
|
|
2880
|
+
function ii(e, t) {
|
|
2883
2881
|
let n = 0;
|
|
2884
2882
|
for (let r = t; r < e.length; r++) {
|
|
2885
2883
|
let t = e[r];
|
|
@@ -2888,20 +2886,20 @@ function ri(e, t) {
|
|
|
2888
2886
|
}
|
|
2889
2887
|
return -1;
|
|
2890
2888
|
}
|
|
2891
|
-
function
|
|
2889
|
+
function ai(e, t) {
|
|
2892
2890
|
let n = ` ${t.export}: ${t.type};`, r = e.indexOf("export type ContextVariables = {");
|
|
2893
2891
|
if (r === -1) return e;
|
|
2894
2892
|
let i = e.indexOf("};", r);
|
|
2895
2893
|
return i === -1 ? e : e.slice(0, i) + n + "\n" + e.slice(i);
|
|
2896
2894
|
}
|
|
2897
|
-
async function
|
|
2895
|
+
async function oi(e, t, n) {
|
|
2898
2896
|
let r = T.resolve(n, X("{{enums.src}}", t), "index.ts");
|
|
2899
2897
|
if (!await J(r)) return;
|
|
2900
2898
|
let i = await y.readFile(r, "utf-8");
|
|
2901
|
-
for (let t of e) i.includes(`from "${t.from}"`) || (i =
|
|
2899
|
+
for (let t of e) i.includes(`from "${t.from}"`) || (i = si(i, t));
|
|
2902
2900
|
await y.writeFile(r, i, "utf-8");
|
|
2903
2901
|
}
|
|
2904
|
-
function
|
|
2902
|
+
function si(e, t) {
|
|
2905
2903
|
let n = `export * from "${t.from}";`, r = e.lastIndexOf("export * from");
|
|
2906
2904
|
if (r !== -1) {
|
|
2907
2905
|
let t = e.indexOf("\n", r);
|
|
@@ -2909,14 +2907,14 @@ function oi(e, t) {
|
|
|
2909
2907
|
}
|
|
2910
2908
|
return e.trim() === "" ? n + "\n" : e.trimEnd() + "\n" + n + "\n";
|
|
2911
2909
|
}
|
|
2912
|
-
async function
|
|
2910
|
+
async function ci(e, t, n) {
|
|
2913
2911
|
let r = X("{{backend.root}}", t), i = T.resolve(n, r, "src/sockets/index.ts");
|
|
2914
2912
|
if (!await J(i)) return;
|
|
2915
2913
|
let a = await y.readFile(i, "utf-8");
|
|
2916
|
-
for (let t of e) a.includes(`from "${t.from}"`) || (a =
|
|
2917
|
-
await J(T.resolve(n, r, "src/libs/websocket/ws-authenticate.ts")) && (a =
|
|
2914
|
+
for (let t of e) a.includes(`from "${t.from}"`) || (a = li(a, t), a = ui(a, t));
|
|
2915
|
+
await J(T.resolve(n, r, "src/libs/websocket/ws-authenticate.ts")) && (a = di(a)), await y.writeFile(i, a, "utf-8");
|
|
2918
2916
|
}
|
|
2919
|
-
function
|
|
2917
|
+
function li(e, t) {
|
|
2920
2918
|
let n = `import { ${t.import} } from "${t.from}";`, r = e.lastIndexOf("from \"./");
|
|
2921
2919
|
if (r !== -1) {
|
|
2922
2920
|
let t = e.indexOf("\n", r);
|
|
@@ -2925,7 +2923,7 @@ function ci(e, t) {
|
|
|
2925
2923
|
let i = e.indexOf("const sockets");
|
|
2926
2924
|
return i === -1 ? e : e.slice(0, i) + n + "\n\n" + e.slice(i);
|
|
2927
2925
|
}
|
|
2928
|
-
function
|
|
2926
|
+
function ui(e, t) {
|
|
2929
2927
|
let n = `.socket("${t.prefix}", ${t.import})`, r = e.indexOf("const sockets");
|
|
2930
2928
|
if (r === -1) return e;
|
|
2931
2929
|
let i = e.indexOf("new SocketRouter", r);
|
|
@@ -2939,7 +2937,7 @@ function li(e, t) {
|
|
|
2939
2937
|
}
|
|
2940
2938
|
return e;
|
|
2941
2939
|
}
|
|
2942
|
-
function
|
|
2940
|
+
function di(e) {
|
|
2943
2941
|
if (e.includes("wsAuthenticate")) return e;
|
|
2944
2942
|
let t = e.indexOf("from \"@backend/libs/websocket/socket-router\""), n = e;
|
|
2945
2943
|
if (t !== -1) {
|
|
@@ -2948,14 +2946,14 @@ function ui(e) {
|
|
|
2948
2946
|
}
|
|
2949
2947
|
return n.replace("new SocketRouter()", "new SocketRouter({ authenticate: wsAuthenticate })");
|
|
2950
2948
|
}
|
|
2951
|
-
async function
|
|
2949
|
+
async function fi(e, t, n) {
|
|
2952
2950
|
let r = X("{{frontend.root}}", t), i = T.resolve(n, r, "src/api/sdk.ts");
|
|
2953
2951
|
if (!await J(i)) return;
|
|
2954
2952
|
let a = await y.readFile(i, "utf-8");
|
|
2955
|
-
for (let t of e) a.includes(`.$configure(${t.import})`) || (a =
|
|
2953
|
+
for (let t of e) a.includes(`.$configure(${t.import})`) || (a = pi(a, t), a = mi(a, t));
|
|
2956
2954
|
await y.writeFile(i, a, "utf-8");
|
|
2957
2955
|
}
|
|
2958
|
-
function
|
|
2956
|
+
function pi(e, t) {
|
|
2959
2957
|
let n = `import { ${t.import} } from "${t.from}";`;
|
|
2960
2958
|
if (e.includes(n)) return e;
|
|
2961
2959
|
let r = e.lastIndexOf("from \"./");
|
|
@@ -2966,20 +2964,20 @@ function fi(e, t) {
|
|
|
2966
2964
|
let i = e.indexOf("export const sdk");
|
|
2967
2965
|
return i === -1 ? e : e.slice(0, i) + n + "\n\n" + e.slice(i);
|
|
2968
2966
|
}
|
|
2969
|
-
function
|
|
2967
|
+
function mi(e, t) {
|
|
2970
2968
|
let n = `.$configure(${t.import})`, r = e.indexOf("export const sdk");
|
|
2971
2969
|
if (r === -1) return e;
|
|
2972
2970
|
let i = e.indexOf(";", r);
|
|
2973
2971
|
return i === -1 ? e : e.slice(0, i) + "\n " + n + e.slice(i);
|
|
2974
2972
|
}
|
|
2975
|
-
async function
|
|
2973
|
+
async function hi(e, t, n) {
|
|
2976
2974
|
let r = T.resolve(n, X("{{backend.utils}}", t), "frontend-url/frontend-url.ts");
|
|
2977
2975
|
if (!await J(r)) return;
|
|
2978
2976
|
let i = await y.readFile(r, "utf-8");
|
|
2979
|
-
for (let t of e) i.includes(`"${t.path}"`) || (i =
|
|
2977
|
+
for (let t of e) i.includes(`"${t.path}"`) || (i = gi(i, t));
|
|
2980
2978
|
await y.writeFile(r, i, "utf-8");
|
|
2981
2979
|
}
|
|
2982
|
-
function
|
|
2980
|
+
function gi(e, t) {
|
|
2983
2981
|
let n = ` "${t.path}": ${t.search};`, r = e.indexOf("type RouteDefinitions = {");
|
|
2984
2982
|
if (r === -1) return e;
|
|
2985
2983
|
let i = e.indexOf("{", r);
|
|
@@ -2995,38 +2993,38 @@ function hi(e, t) {
|
|
|
2995
2993
|
}
|
|
2996
2994
|
return o === -1 ? e : e.slice(0, o) + n + "\n" + e.slice(o);
|
|
2997
2995
|
}
|
|
2998
|
-
var
|
|
2996
|
+
var _i = "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", vi = {
|
|
2999
2997
|
primary: "primaryNav",
|
|
3000
2998
|
secondary: "secondaryNav",
|
|
3001
2999
|
tertiary: "tertiaryNav",
|
|
3002
3000
|
settings: "settingsNav"
|
|
3003
3001
|
};
|
|
3004
|
-
async function
|
|
3005
|
-
let { entries: t, paths: n, projectRoot: r, slot: i = "frontend" } = e, a =
|
|
3006
|
-
await J(o) ? s = await y.readFile(o, "utf-8") : (await y.mkdir(T.dirname(o), { recursive: !0 }), s =
|
|
3007
|
-
for (let e of t) s.includes(`label: "${e.label}"`) || (s =
|
|
3008
|
-
for (let e of t.toReversed()) s.includes(`label: "${e.label}"`) || (s =
|
|
3002
|
+
async function yi(e) {
|
|
3003
|
+
let { entries: t, paths: n, projectRoot: r, slot: i = "frontend" } = e, a = Wr(i, n), o = T.resolve(r, a, "src/constants/nav.constants.ts"), s;
|
|
3004
|
+
await J(o) ? s = await y.readFile(o, "utf-8") : (await y.mkdir(T.dirname(o), { recursive: !0 }), s = _i);
|
|
3005
|
+
for (let e of t) s.includes(`label: "${e.label}"`) || (s = Si(s, e));
|
|
3006
|
+
for (let e of t.toReversed()) s.includes(`label: "${e.label}"`) || (s = wi(s, e));
|
|
3009
3007
|
await y.writeFile(o, s, "utf-8");
|
|
3010
3008
|
}
|
|
3011
|
-
async function
|
|
3012
|
-
let { postLoginRedirect: t, paths: n, projectRoot: r, slot: i = "frontend" } = e, a =
|
|
3009
|
+
async function bi(e) {
|
|
3010
|
+
let { postLoginRedirect: t, paths: n, projectRoot: r, slot: i = "frontend" } = e, a = Wr(i, n), o = T.resolve(r, a, "src/features/auth/constants/auth.constants.ts");
|
|
3013
3011
|
if (!await J(o)) return;
|
|
3014
3012
|
let s = await y.readFile(o, "utf-8"), c = /export const POST_LOGIN_REDIRECT_PATH = "[^"]*";/;
|
|
3015
3013
|
if (!c.test(s)) return;
|
|
3016
3014
|
let l = s.replace(c, `export const POST_LOGIN_REDIRECT_PATH = "${t}";`);
|
|
3017
3015
|
await y.writeFile(o, l, "utf-8");
|
|
3018
3016
|
}
|
|
3019
|
-
function
|
|
3017
|
+
function xi(e) {
|
|
3020
3018
|
let t = [e.icon];
|
|
3021
3019
|
if (e.items) for (let n of e.items) t.includes(n.icon) || t.push(n.icon);
|
|
3022
3020
|
return t;
|
|
3023
3021
|
}
|
|
3024
|
-
function
|
|
3025
|
-
let n =
|
|
3026
|
-
for (let e of n) r =
|
|
3022
|
+
function Si(e, t) {
|
|
3023
|
+
let n = xi(t), r = e;
|
|
3024
|
+
for (let e of n) r = Ci(r, e);
|
|
3027
3025
|
return r;
|
|
3028
3026
|
}
|
|
3029
|
-
function
|
|
3027
|
+
function Ci(e, t) {
|
|
3030
3028
|
let n = e.match(/import \{([^}]+)\} from "lucide-react";/);
|
|
3031
3029
|
if (!n) return e;
|
|
3032
3030
|
let r = n[1].split(",").map((e) => e.trim()).filter(Boolean);
|
|
@@ -3034,21 +3032,21 @@ function Si(e, t) {
|
|
|
3034
3032
|
let i = r.findIndex((e) => e.startsWith("type "));
|
|
3035
3033
|
return i === -1 ? r.push(t) : r.splice(i, 0, t), e.replace(n[0], `import { ${r.join(", ")} } from "lucide-react";`);
|
|
3036
3034
|
}
|
|
3037
|
-
function
|
|
3038
|
-
let n =
|
|
3035
|
+
function wi(e, t) {
|
|
3036
|
+
let n = vi[t.group];
|
|
3039
3037
|
if (!n) return e;
|
|
3040
|
-
let r =
|
|
3038
|
+
let r = Ei(t), i = RegExp(`export const ${n}: NavEntry\\[\\] = \\[`), a = e.match(i);
|
|
3041
3039
|
if (!a) return e;
|
|
3042
|
-
let o = e.indexOf(a[0]) + a[0].length, s =
|
|
3040
|
+
let o = e.indexOf(a[0]) + a[0].length, s = Ti(e, o - 1);
|
|
3043
3041
|
return s === -1 ? e : e.slice(o, s).trim() === "" ? e.slice(0, o) + "\n" + r + "\n" + e.slice(o) : e.slice(0, o) + "\n" + r + e.slice(o);
|
|
3044
3042
|
}
|
|
3045
|
-
function
|
|
3043
|
+
function Ti(e, t) {
|
|
3046
3044
|
let n = 0;
|
|
3047
3045
|
for (let r = t; r < e.length; r++) if (e[r] === "[") n++;
|
|
3048
3046
|
else if (e[r] === "]" && (n--, n === 0)) return r;
|
|
3049
3047
|
return -1;
|
|
3050
3048
|
}
|
|
3051
|
-
function
|
|
3049
|
+
function Ei(e) {
|
|
3052
3050
|
let t = [];
|
|
3053
3051
|
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) {
|
|
3054
3052
|
t.push(" items: [");
|
|
@@ -3064,14 +3062,14 @@ function Ti(e) {
|
|
|
3064
3062
|
} else t.push(" items: [],");
|
|
3065
3063
|
return t.push(" },"), t.join("\n");
|
|
3066
3064
|
}
|
|
3067
|
-
async function
|
|
3065
|
+
async function Di(e, t, n) {
|
|
3068
3066
|
let r = X("{{backend.features}}", t), i = T.resolve(n, r, "organizations/modules/setup-organization/steps/index.ts");
|
|
3069
3067
|
if (!await J(i)) return;
|
|
3070
3068
|
let a = await y.readFile(i, "utf-8");
|
|
3071
|
-
for (let t of e) a.includes(`from "${t.from}"`) || (a =
|
|
3069
|
+
for (let t of e) a.includes(`from "${t.from}"`) || (a = Oi(a, t), a = ki(a, t));
|
|
3072
3070
|
await y.writeFile(i, a, "utf-8");
|
|
3073
3071
|
}
|
|
3074
|
-
function
|
|
3072
|
+
function Oi(e, t) {
|
|
3075
3073
|
let n = `import { ${t.import} } from "${t.from}";`, r = e.lastIndexOf("import ");
|
|
3076
3074
|
if (r !== -1) {
|
|
3077
3075
|
let t = e.indexOf("\n", e.indexOf(";", r));
|
|
@@ -3079,38 +3077,38 @@ function Di(e, t) {
|
|
|
3079
3077
|
}
|
|
3080
3078
|
return e.indexOf("type "), n + "\n\n" + e;
|
|
3081
3079
|
}
|
|
3082
|
-
function
|
|
3080
|
+
function ki(e, t) {
|
|
3083
3081
|
let n = ` { id: "${t.id}", execute: (ctx) => ${t.import}(ctx) },`, r = e.match(/export const steps:\s*Step\[\]\s*=\s*\[/);
|
|
3084
3082
|
if (!r) return e;
|
|
3085
|
-
let i = e.indexOf(r[0]) + r[0].length, a =
|
|
3083
|
+
let i = e.indexOf(r[0]) + r[0].length, a = Ai(e, i - 1);
|
|
3086
3084
|
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);
|
|
3087
3085
|
}
|
|
3088
|
-
function
|
|
3086
|
+
function Ai(e, t) {
|
|
3089
3087
|
let n = 0;
|
|
3090
3088
|
for (let r = t; r < e.length; r++) if (e[r] === "[") n++;
|
|
3091
3089
|
else if (e[r] === "]" && (n--, n === 0)) return r;
|
|
3092
3090
|
return -1;
|
|
3093
3091
|
}
|
|
3094
|
-
var
|
|
3095
|
-
async function
|
|
3096
|
-
await
|
|
3092
|
+
var ji = "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";
|
|
3093
|
+
async function Mi(e) {
|
|
3094
|
+
await Pi({
|
|
3097
3095
|
...e,
|
|
3098
3096
|
arrayName: "navbarActions"
|
|
3099
3097
|
});
|
|
3100
3098
|
}
|
|
3101
|
-
async function
|
|
3102
|
-
await
|
|
3099
|
+
async function Ni(e) {
|
|
3100
|
+
await Pi({
|
|
3103
3101
|
...e,
|
|
3104
3102
|
arrayName: "userMenuActions"
|
|
3105
3103
|
});
|
|
3106
3104
|
}
|
|
3107
|
-
async function
|
|
3108
|
-
let a =
|
|
3109
|
-
await J(o) ? s = await y.readFile(o, "utf-8") : (await y.mkdir(T.dirname(o), { recursive: !0 }), s =
|
|
3110
|
-
for (let n of e) s =
|
|
3105
|
+
async function Pi({ actions: e, arrayName: t, paths: n, projectRoot: r, slot: i }) {
|
|
3106
|
+
let a = Wr(i, n), o = T.resolve(r, a, "src/constants/navbar-actions.tsx"), s;
|
|
3107
|
+
await J(o) ? s = await y.readFile(o, "utf-8") : (await y.mkdir(T.dirname(o), { recursive: !0 }), s = ji);
|
|
3108
|
+
for (let n of e) s = Fi(s, n), s = Ii(s, n, t);
|
|
3111
3109
|
await y.writeFile(o, s, "utf-8");
|
|
3112
3110
|
}
|
|
3113
|
-
function
|
|
3111
|
+
function Fi(e, t) {
|
|
3114
3112
|
let n = `import { ${t.import} } from "${t.from}";`;
|
|
3115
3113
|
if (e.includes(n)) return e;
|
|
3116
3114
|
let r = e.lastIndexOf("import ");
|
|
@@ -3118,38 +3116,38 @@ function Pi(e, t) {
|
|
|
3118
3116
|
let i = e.indexOf("\n", r);
|
|
3119
3117
|
return i === -1 ? e + "\n" + n : e.slice(0, i + 1) + n + "\n" + e.slice(i + 1);
|
|
3120
3118
|
}
|
|
3121
|
-
function
|
|
3119
|
+
function Ii(e, t, n) {
|
|
3122
3120
|
let r = e.match(RegExp(`export const ${n}:\\s*NavbarAction\\[\\]\\s*=\\s*\\[`));
|
|
3123
3121
|
if (!r) return e;
|
|
3124
|
-
let i = e.indexOf(r[0]) + r[0].length, a =
|
|
3122
|
+
let i = e.indexOf(r[0]) + r[0].length, a = Li(e, i - 1);
|
|
3125
3123
|
if (a === -1) return e;
|
|
3126
3124
|
let o = e.slice(i, a);
|
|
3127
3125
|
if (o.includes(`id: "${t.id}"`)) return e;
|
|
3128
3126
|
let s = ` { id: "${t.id}", component: ${t.import} },`;
|
|
3129
3127
|
return o.trim() === "" ? e.slice(0, a) + "\n" + s + "\n" + e.slice(a) : e.slice(0, a) + s + "\n" + e.slice(a);
|
|
3130
3128
|
}
|
|
3131
|
-
function
|
|
3129
|
+
function Li(e, t) {
|
|
3132
3130
|
let n = 0;
|
|
3133
3131
|
for (let r = t; r < e.length; r++) if (e[r] === "[") n++;
|
|
3134
3132
|
else if (e[r] === "]" && (n--, n === 0)) return r;
|
|
3135
3133
|
return -1;
|
|
3136
3134
|
}
|
|
3137
|
-
var
|
|
3135
|
+
var Ri = new Set([
|
|
3138
3136
|
".ts",
|
|
3139
3137
|
".tsx",
|
|
3140
3138
|
".js",
|
|
3141
3139
|
".jsx"
|
|
3142
3140
|
]);
|
|
3143
|
-
async function
|
|
3141
|
+
async function zi(e) {
|
|
3144
3142
|
let { files: t, paths: n, projectRoot: r, projectName: i } = e;
|
|
3145
3143
|
if (i === "hype-stack") return;
|
|
3146
3144
|
let a = `@${i}/`;
|
|
3147
3145
|
await Promise.all(t.map(async (e) => {
|
|
3148
|
-
let t =
|
|
3149
|
-
i?.isDirectory() ? await
|
|
3146
|
+
let t = Ir(e.target, n, r), i = await y.stat(t).catch(() => null);
|
|
3147
|
+
i?.isDirectory() ? await Hi(t, a) : i?.isFile() && Ri.has(T.extname(t)) && await Ui(t, a);
|
|
3150
3148
|
}));
|
|
3151
3149
|
}
|
|
3152
|
-
var
|
|
3150
|
+
var Bi = new Set([
|
|
3153
3151
|
".git",
|
|
3154
3152
|
"node_modules",
|
|
3155
3153
|
"dist",
|
|
@@ -3158,43 +3156,43 @@ var zi = new Set([
|
|
|
3158
3156
|
".next",
|
|
3159
3157
|
"coverage"
|
|
3160
3158
|
]);
|
|
3161
|
-
async function Bi(e, t) {
|
|
3162
|
-
t !== "hype-stack" && await Vi(e, `@${t}/`);
|
|
3163
|
-
}
|
|
3164
3159
|
async function Vi(e, t) {
|
|
3160
|
+
t !== "hype-stack" && await Hi(e, `@${t}/`);
|
|
3161
|
+
}
|
|
3162
|
+
async function Hi(e, t) {
|
|
3165
3163
|
let n = await y.readdir(e, { withFileTypes: !0 });
|
|
3166
3164
|
await Promise.all(n.map(async (n) => {
|
|
3167
3165
|
let r = T.join(e, n.name);
|
|
3168
3166
|
if (n.isDirectory()) {
|
|
3169
|
-
if (
|
|
3170
|
-
await
|
|
3171
|
-
} else n.isFile() &&
|
|
3167
|
+
if (Bi.has(n.name)) return;
|
|
3168
|
+
await Hi(r, t);
|
|
3169
|
+
} else n.isFile() && Ri.has(T.extname(n.name)) && await Ui(r, t);
|
|
3172
3170
|
}));
|
|
3173
3171
|
}
|
|
3174
|
-
async function
|
|
3172
|
+
async function Ui(e, t) {
|
|
3175
3173
|
let n = await y.readFile(e, "utf-8");
|
|
3176
|
-
if (!n.includes(
|
|
3177
|
-
let r = n
|
|
3178
|
-
await y.writeFile(e, r, "utf-8");
|
|
3174
|
+
if (!n.includes(Vr)) return;
|
|
3175
|
+
let r = Ur(n, t);
|
|
3176
|
+
r !== n && await y.writeFile(e, r, "utf-8");
|
|
3179
3177
|
}
|
|
3180
3178
|
//#endregion
|
|
3181
3179
|
//#region src/core/installer.ts
|
|
3182
|
-
function
|
|
3180
|
+
function Wi(e, t) {
|
|
3183
3181
|
return e.slot ? t ? t.includes(e.slot) : e.slot === "frontend" : !0;
|
|
3184
3182
|
}
|
|
3185
|
-
async function
|
|
3183
|
+
async function Gi(e, t) {
|
|
3186
3184
|
if ((await y.stat(e)).isDirectory()) {
|
|
3187
3185
|
await y.mkdir(t, { recursive: !0 });
|
|
3188
3186
|
let n = await y.readdir(e, { withFileTypes: !0 });
|
|
3189
|
-
for (let r of n) await
|
|
3187
|
+
for (let r of n) await Gi(T.join(e, r.name), T.join(t, r.name));
|
|
3190
3188
|
} else await y.mkdir(T.dirname(t), { recursive: !0 }), await y.copyFile(e, t);
|
|
3191
3189
|
}
|
|
3192
|
-
async function
|
|
3190
|
+
async function Ki(e) {
|
|
3193
3191
|
let { src: t, dest: n, projectRoot: r, skip: i } = e;
|
|
3194
3192
|
if ((await y.stat(t)).isDirectory()) {
|
|
3195
3193
|
await y.mkdir(n, { recursive: !0 });
|
|
3196
3194
|
let e = await y.readdir(t, { withFileTypes: !0 });
|
|
3197
|
-
return (await Promise.all(e.map((e) =>
|
|
3195
|
+
return (await Promise.all(e.map((e) => Ki({
|
|
3198
3196
|
src: T.join(t, e.name),
|
|
3199
3197
|
dest: T.join(n, e.name),
|
|
3200
3198
|
projectRoot: r,
|
|
@@ -3203,8 +3201,8 @@ async function Gi(e) {
|
|
|
3203
3201
|
}
|
|
3204
3202
|
return i.has(t) ? [] : (await y.mkdir(T.dirname(n), { recursive: !0 }), await y.copyFile(t, n), [T.relative(r, n)]);
|
|
3205
3203
|
}
|
|
3206
|
-
async function
|
|
3207
|
-
let { file: t, packDir: n, paths: r, projectRoot: i } = e, a =
|
|
3204
|
+
async function qi(e) {
|
|
3205
|
+
let { file: t, packDir: n, paths: r, projectRoot: i } = e, a = Lr(t.source, n), o = Ir(t.target, r, i);
|
|
3208
3206
|
return {
|
|
3209
3207
|
sourcePath: a,
|
|
3210
3208
|
targetPath: o,
|
|
@@ -3212,8 +3210,8 @@ async function Ki(e) {
|
|
|
3212
3210
|
targetExists: await J(o) || await ar(o)
|
|
3213
3211
|
};
|
|
3214
3212
|
}
|
|
3215
|
-
async function
|
|
3216
|
-
let { file: t, packDir: n, paths: r, projectRoot: i } = e, { sourcePath: a, targetPath: o, sourceExists: s, targetExists: c } = await
|
|
3213
|
+
async function Ji(e) {
|
|
3214
|
+
let { file: t, packDir: n, paths: r, projectRoot: i } = e, { sourcePath: a, targetPath: o, sourceExists: s, targetExists: c } = await qi({
|
|
3217
3215
|
file: t,
|
|
3218
3216
|
packDir: n,
|
|
3219
3217
|
paths: r,
|
|
@@ -3228,8 +3226,8 @@ async function qi(e) {
|
|
|
3228
3226
|
default: return `${t.target}: Unknown strategy: ${String(t.strategy)}`;
|
|
3229
3227
|
}
|
|
3230
3228
|
}
|
|
3231
|
-
async function
|
|
3232
|
-
let { file: t, packDir: n, paths: r, projectRoot: i, force: a, overwrite: o } = e, { sourcePath: s, targetPath: c, sourceExists: l, targetExists: u } = await
|
|
3229
|
+
async function Yi(e) {
|
|
3230
|
+
let { file: t, packDir: n, paths: r, projectRoot: i, force: a, overwrite: o } = e, { sourcePath: s, targetPath: c, sourceExists: l, targetExists: u } = await qi({
|
|
3233
3231
|
file: t,
|
|
3234
3232
|
packDir: n,
|
|
3235
3233
|
paths: r,
|
|
@@ -3247,7 +3245,7 @@ async function Ji(e) {
|
|
|
3247
3245
|
status: "skipped",
|
|
3248
3246
|
path: t.target,
|
|
3249
3247
|
reason: "Already exists"
|
|
3250
|
-
} : (await
|
|
3248
|
+
} : (await Gi(s, c), {
|
|
3251
3249
|
status: "installed",
|
|
3252
3250
|
path: t.target
|
|
3253
3251
|
});
|
|
@@ -3256,16 +3254,16 @@ async function Ji(e) {
|
|
|
3256
3254
|
status: "skipped",
|
|
3257
3255
|
path: t.target,
|
|
3258
3256
|
reason: "Already exists (skip-if-exists)"
|
|
3259
|
-
} : (await
|
|
3257
|
+
} : (await Gi(s, c), {
|
|
3260
3258
|
status: "installed",
|
|
3261
3259
|
path: t.target
|
|
3262
3260
|
});
|
|
3263
|
-
case "override": return await
|
|
3261
|
+
case "override": return await Gi(s, c), {
|
|
3264
3262
|
status: "installed",
|
|
3265
3263
|
path: t.target
|
|
3266
3264
|
};
|
|
3267
3265
|
case "merge": {
|
|
3268
|
-
if (!u) return await
|
|
3266
|
+
if (!u) return await Gi(s, c), {
|
|
3269
3267
|
status: "installed",
|
|
3270
3268
|
path: t.target
|
|
3271
3269
|
};
|
|
@@ -3295,15 +3293,15 @@ async function Ji(e) {
|
|
|
3295
3293
|
};
|
|
3296
3294
|
}
|
|
3297
3295
|
}
|
|
3298
|
-
async function
|
|
3296
|
+
async function Xi(e) {
|
|
3299
3297
|
let { packs: t, config: n, projectRoot: r, slotsByPack: i } = e, a = n.paths;
|
|
3300
3298
|
if (!a) throw Error("stack.json is missing 'paths' configuration. Run 'npx @hype-stack/cli init' to set it up.");
|
|
3301
3299
|
let o = [], s = /* @__PURE__ */ new Set();
|
|
3302
3300
|
for (let e of t) {
|
|
3303
3301
|
let t = i?.get(e.manifest.name);
|
|
3304
3302
|
for (let n of e.manifest.files) {
|
|
3305
|
-
if (n.strategy !== "create" || !
|
|
3306
|
-
let { targetPath: i, targetExists: c } = await
|
|
3303
|
+
if (n.strategy !== "create" || !Wi(n, t)) continue;
|
|
3304
|
+
let { targetPath: i, targetExists: c } = await qi({
|
|
3307
3305
|
file: n,
|
|
3308
3306
|
packDir: e.packDir,
|
|
3309
3307
|
paths: a,
|
|
@@ -3318,13 +3316,13 @@ async function Yi(e) {
|
|
|
3318
3316
|
}
|
|
3319
3317
|
return o;
|
|
3320
3318
|
}
|
|
3321
|
-
async function
|
|
3319
|
+
async function Zi(e) {
|
|
3322
3320
|
let { manifest: t, config: n, projectRoot: r, force: i, packDir: a, slots: o } = e, s = n.paths;
|
|
3323
3321
|
if (!s) throw Error("stack.json is missing 'paths' configuration. Run 'npx @hype-stack/cli init' to set it up.");
|
|
3324
3322
|
let c = [];
|
|
3325
3323
|
for (let e of t.files) {
|
|
3326
|
-
if (!
|
|
3327
|
-
let t = await
|
|
3324
|
+
if (!Wi(e, o)) continue;
|
|
3325
|
+
let t = await Ji({
|
|
3328
3326
|
file: e,
|
|
3329
3327
|
packDir: a,
|
|
3330
3328
|
paths: s,
|
|
@@ -3335,16 +3333,16 @@ async function Xi(e) {
|
|
|
3335
3333
|
}
|
|
3336
3334
|
return c;
|
|
3337
3335
|
}
|
|
3338
|
-
async function
|
|
3336
|
+
async function Qi(e) {
|
|
3339
3337
|
let { manifest: t, config: n, projectRoot: r, force: i, overwrite: a, packDir: o, slots: s } = e, c = n.paths;
|
|
3340
3338
|
if (!c) throw Error("stack.json is missing 'paths' configuration. Run 'npx @hype-stack/cli init' to set it up.");
|
|
3341
3339
|
let l = {
|
|
3342
3340
|
installed: [],
|
|
3343
3341
|
skipped: [],
|
|
3344
3342
|
errors: []
|
|
3345
|
-
}, u = t.files.filter((e) =>
|
|
3343
|
+
}, u = t.files.filter((e) => Wi(e, s));
|
|
3346
3344
|
for (let e of u) {
|
|
3347
|
-
let t = await
|
|
3345
|
+
let t = await Yi({
|
|
3348
3346
|
file: e,
|
|
3349
3347
|
packDir: o,
|
|
3350
3348
|
paths: c,
|
|
@@ -3364,40 +3362,40 @@ async function Zi(e) {
|
|
|
3364
3362
|
break;
|
|
3365
3363
|
}
|
|
3366
3364
|
}
|
|
3367
|
-
await
|
|
3365
|
+
await zi({
|
|
3368
3366
|
files: u,
|
|
3369
3367
|
paths: c,
|
|
3370
3368
|
projectRoot: r,
|
|
3371
3369
|
projectName: n.name
|
|
3372
|
-
}), t.env && t.env.length > 0 && await
|
|
3370
|
+
}), t.env && t.env.length > 0 && await Gr(t.env, c, r), t.routes && t.routes.length > 0 && await Zr(t.routes, c, r), t.context && t.context.length > 0 && await ei(t.context, c, r), t.sockets && t.sockets.length > 0 && await ci(t.sockets, c, r), t.sdkConfigurations && t.sdkConfigurations.length > 0 && await fi(t.sdkConfigurations, c, r), t.enums && t.enums.length > 0 && await oi(t.enums, c, r), t.frontendRoutes && t.frontendRoutes.length > 0 && await hi(t.frontendRoutes, c, r);
|
|
3373
3371
|
let d = s && s.length > 0 ? s : ["frontend"];
|
|
3374
|
-
for (let e of d) t.nav && t.nav.length > 0 && await
|
|
3372
|
+
for (let e of d) t.nav && t.nav.length > 0 && await yi({
|
|
3375
3373
|
entries: t.nav,
|
|
3376
3374
|
paths: c,
|
|
3377
3375
|
projectRoot: r,
|
|
3378
3376
|
slot: e
|
|
3379
|
-
}), t.navbarActions && t.navbarActions.length > 0 && await
|
|
3377
|
+
}), t.navbarActions && t.navbarActions.length > 0 && await Mi({
|
|
3380
3378
|
actions: t.navbarActions,
|
|
3381
3379
|
paths: c,
|
|
3382
3380
|
projectRoot: r,
|
|
3383
3381
|
slot: e
|
|
3384
|
-
}), t.userMenuActions && t.userMenuActions.length > 0 && await
|
|
3382
|
+
}), t.userMenuActions && t.userMenuActions.length > 0 && await Ni({
|
|
3385
3383
|
actions: t.userMenuActions,
|
|
3386
3384
|
paths: c,
|
|
3387
3385
|
projectRoot: r,
|
|
3388
3386
|
slot: e
|
|
3389
3387
|
});
|
|
3390
|
-
return t.onboardingSteps && t.onboardingSteps.length > 0 && await
|
|
3388
|
+
return t.onboardingSteps && t.onboardingSteps.length > 0 && await Di(t.onboardingSteps, c, r), t.postLoginRedirect && await bi({
|
|
3391
3389
|
postLoginRedirect: t.postLoginRedirect,
|
|
3392
3390
|
paths: c,
|
|
3393
3391
|
projectRoot: r,
|
|
3394
3392
|
slot: d[0]
|
|
3395
3393
|
}), l;
|
|
3396
3394
|
}
|
|
3397
|
-
async function
|
|
3395
|
+
async function $i(e) {
|
|
3398
3396
|
let { packs: t, config: n, projectRoot: r, force: i, overwrite: a, slotsByPack: o } = e, s = [];
|
|
3399
3397
|
for (let e of t) {
|
|
3400
|
-
let t = o?.get(e.manifest.name), a = await
|
|
3398
|
+
let t = o?.get(e.manifest.name), a = await Zi({
|
|
3401
3399
|
manifest: e.manifest,
|
|
3402
3400
|
config: n,
|
|
3403
3401
|
projectRoot: r,
|
|
@@ -3417,7 +3415,7 @@ async function Qi(e) {
|
|
|
3417
3415
|
};
|
|
3418
3416
|
let c = [], l = [], u = [], d = [], f = n;
|
|
3419
3417
|
for (let e of t) {
|
|
3420
|
-
let t = o?.get(e.manifest.name), n = await
|
|
3418
|
+
let t = o?.get(e.manifest.name), n = await Qi({
|
|
3421
3419
|
manifest: e.manifest,
|
|
3422
3420
|
config: f,
|
|
3423
3421
|
projectRoot: r,
|
|
@@ -3426,7 +3424,7 @@ async function Qi(e) {
|
|
|
3426
3424
|
packDir: e.packDir,
|
|
3427
3425
|
slots: t
|
|
3428
3426
|
});
|
|
3429
|
-
c.push(...n.installed), l.push(...n.skipped), u.push(...n.errors), f = await
|
|
3427
|
+
c.push(...n.installed), l.push(...n.skipped), u.push(...n.errors), f = await ea(f, e.manifest, r), d.push(e.manifest.name);
|
|
3430
3428
|
}
|
|
3431
3429
|
return {
|
|
3432
3430
|
installed: c,
|
|
@@ -3437,8 +3435,8 @@ async function Qi(e) {
|
|
|
3437
3435
|
config: f
|
|
3438
3436
|
};
|
|
3439
3437
|
}
|
|
3440
|
-
async function
|
|
3441
|
-
let r = typeof t == "string" ? t : t.name, i = typeof t == "string" ? [] :
|
|
3438
|
+
async function ea(e, t, n) {
|
|
3439
|
+
let r = typeof t == "string" ? t : t.name, i = typeof t == "string" ? [] : Cr(t.env), a = wr([...e.onboarding?.envSections ?? [], ...i]), o = {
|
|
3442
3440
|
...e,
|
|
3443
3441
|
installedPacks: [...e.installedPacks ?? [], r],
|
|
3444
3442
|
onboarding: {
|
|
@@ -3446,19 +3444,19 @@ async function $i(e, t, n) {
|
|
|
3446
3444
|
envSections: a
|
|
3447
3445
|
}
|
|
3448
3446
|
};
|
|
3449
|
-
return await
|
|
3447
|
+
return await kr(n, o), o;
|
|
3450
3448
|
}
|
|
3451
|
-
async function
|
|
3449
|
+
async function ta(e) {
|
|
3452
3450
|
let { manifest: t, config: n, projectRoot: r, templateDir: i } = e, a = n.paths;
|
|
3453
3451
|
if (!a) throw Error("stack.json is missing 'paths' configuration. Run 'npx @hype-stack/cli init' to set it up.");
|
|
3454
|
-
let o = [], s = [], c = t.files.filter((e) => e.strategy === "merge"), l = new Set(c.map((e) =>
|
|
3452
|
+
let o = [], s = [], c = t.files.filter((e) => e.strategy === "merge"), l = new Set(c.map((e) => Lr(e.source, i))), u = T.join(i, "files");
|
|
3455
3453
|
if (await ar(u)) {
|
|
3456
3454
|
let e = await y.readdir(u, { withFileTypes: !0 });
|
|
3457
3455
|
for (let t of e) {
|
|
3458
3456
|
if (!t.isDirectory()) continue;
|
|
3459
3457
|
let e = a[t.name]?.root;
|
|
3460
3458
|
if (!e) continue;
|
|
3461
|
-
let n = await
|
|
3459
|
+
let n = await Ki({
|
|
3462
3460
|
src: T.join(u, t.name),
|
|
3463
3461
|
dest: T.resolve(r, e),
|
|
3464
3462
|
projectRoot: r,
|
|
@@ -3468,7 +3466,7 @@ async function ea(e) {
|
|
|
3468
3466
|
}
|
|
3469
3467
|
}
|
|
3470
3468
|
for (let e of c) {
|
|
3471
|
-
let t = await
|
|
3469
|
+
let t = await Yi({
|
|
3472
3470
|
file: e,
|
|
3473
3471
|
packDir: i,
|
|
3474
3472
|
paths: a,
|
|
@@ -3478,12 +3476,12 @@ async function ea(e) {
|
|
|
3478
3476
|
});
|
|
3479
3477
|
t.status === "installed" ? o.push(t.path) : t.status === "error" && s.push(`${t.path}: ${t.reason}`);
|
|
3480
3478
|
}
|
|
3481
|
-
let d = T.join(
|
|
3482
|
-
return await J(f) && await J(p) && await y.rm(p, { force: !0 }), t.frontendRoutes && t.frontendRoutes.length > 0 && await
|
|
3479
|
+
let d = T.join(Ir("{{frontend.root}}", a, r), "src", "routes"), f = T.join(d, "(public)", "index.tsx"), p = T.join(d, "(private)", "index.tsx");
|
|
3480
|
+
return await J(f) && await J(p) && await y.rm(p, { force: !0 }), t.frontendRoutes && t.frontendRoutes.length > 0 && await hi(t.frontendRoutes, a, r), t.nav && t.nav.length > 0 && await yi({
|
|
3483
3481
|
entries: t.nav,
|
|
3484
3482
|
paths: a,
|
|
3485
3483
|
projectRoot: r
|
|
3486
|
-
}), t.postLoginRedirect && await
|
|
3484
|
+
}), t.postLoginRedirect && await bi({
|
|
3487
3485
|
postLoginRedirect: t.postLoginRedirect,
|
|
3488
3486
|
paths: a,
|
|
3489
3487
|
projectRoot: r
|
|
@@ -3494,32 +3492,32 @@ async function ea(e) {
|
|
|
3494
3492
|
}
|
|
3495
3493
|
//#endregion
|
|
3496
3494
|
//#region src/core/pack-categories.ts
|
|
3497
|
-
var
|
|
3495
|
+
var na = [
|
|
3498
3496
|
"starter",
|
|
3499
3497
|
"layout",
|
|
3500
3498
|
"feature"
|
|
3501
|
-
],
|
|
3499
|
+
], ra = {
|
|
3502
3500
|
starter: "Starter",
|
|
3503
3501
|
layout: "Layout",
|
|
3504
3502
|
feature: "Features"
|
|
3505
|
-
},
|
|
3506
|
-
function
|
|
3503
|
+
}, ia = new Set(["starter", "layout"]), aa = "starter-saas-betterauth", oa = "layout-basic";
|
|
3504
|
+
function sa(e, t = {}) {
|
|
3507
3505
|
let n = [];
|
|
3508
|
-
for (let r of
|
|
3506
|
+
for (let r of na) {
|
|
3509
3507
|
let i = e.filter((e) => e.category === r);
|
|
3510
3508
|
if (i.length === 0) continue;
|
|
3511
|
-
let a =
|
|
3509
|
+
let a = ia.has(r) ? "single" : "multiple";
|
|
3512
3510
|
if (r === "layout") {
|
|
3513
|
-
n.push(
|
|
3511
|
+
n.push(la("frontend", i)), t.adminAvailable && n.push(la("admin", i));
|
|
3514
3512
|
continue;
|
|
3515
3513
|
}
|
|
3516
3514
|
if (r === "starter") {
|
|
3517
|
-
n.push(
|
|
3515
|
+
n.push(ca(i));
|
|
3518
3516
|
continue;
|
|
3519
3517
|
}
|
|
3520
3518
|
n.push({
|
|
3521
3519
|
category: r,
|
|
3522
|
-
label:
|
|
3520
|
+
label: ra[r],
|
|
3523
3521
|
mode: a,
|
|
3524
3522
|
packs: i,
|
|
3525
3523
|
preselect: null
|
|
@@ -3527,33 +3525,33 @@ function oa(e, t = {}) {
|
|
|
3527
3525
|
}
|
|
3528
3526
|
return n;
|
|
3529
3527
|
}
|
|
3530
|
-
function
|
|
3531
|
-
let t = e.some((e) => e.name ===
|
|
3528
|
+
function ca(e) {
|
|
3529
|
+
let t = e.some((e) => e.name === aa);
|
|
3532
3530
|
return {
|
|
3533
3531
|
category: "starter",
|
|
3534
|
-
label:
|
|
3532
|
+
label: ra.starter,
|
|
3535
3533
|
mode: "single",
|
|
3536
3534
|
packs: e,
|
|
3537
|
-
preselect: t ?
|
|
3535
|
+
preselect: t ? aa : null
|
|
3538
3536
|
};
|
|
3539
3537
|
}
|
|
3540
|
-
function
|
|
3541
|
-
let n = t.some((e) => e.name ===
|
|
3538
|
+
function la(e, t) {
|
|
3539
|
+
let n = t.some((e) => e.name === oa);
|
|
3542
3540
|
return {
|
|
3543
3541
|
category: "layout",
|
|
3544
3542
|
label: e === "admin" ? "Admin Layout" : "Layout",
|
|
3545
3543
|
mode: "single",
|
|
3546
3544
|
packs: t,
|
|
3547
|
-
preselect: n ?
|
|
3545
|
+
preselect: n ? oa : null,
|
|
3548
3546
|
slot: e
|
|
3549
3547
|
};
|
|
3550
3548
|
}
|
|
3551
3549
|
//#endregion
|
|
3552
3550
|
//#region src/ui/logger.ts
|
|
3553
|
-
var
|
|
3554
|
-
function
|
|
3551
|
+
var ua = [he.orangeBright, he.skyBlue];
|
|
3552
|
+
function da(e) {
|
|
3555
3553
|
let t = e.map((e, t) => {
|
|
3556
|
-
let n =
|
|
3554
|
+
let n = ua[t % ua.length];
|
|
3557
3555
|
return `${z.bold(n(`${t + 1}.`))} ${z.bold(e)}`;
|
|
3558
3556
|
}).join("\n");
|
|
3559
3557
|
s.note(t, "Next steps");
|
|
@@ -3563,13 +3561,13 @@ function Z() {
|
|
|
3563
3561
|
}
|
|
3564
3562
|
//#endregion
|
|
3565
3563
|
//#region src/core/post-setup.ts
|
|
3566
|
-
async function
|
|
3564
|
+
async function fa() {
|
|
3567
3565
|
return (await q("docker", ["info"], { cwd: process.cwd() })).exitCode === 0;
|
|
3568
3566
|
}
|
|
3569
|
-
async function
|
|
3567
|
+
async function pa(e) {
|
|
3570
3568
|
return J(`${e}/apps/backend/.env`);
|
|
3571
3569
|
}
|
|
3572
|
-
async function
|
|
3570
|
+
async function ma(e, t, n) {
|
|
3573
3571
|
let r = n ? `Start services with ${z.command("docker compose up -d")}?` : `Docker is not running. Start services with ${z.command("docker compose up -d")}?`, i = t ? !0 : await s.confirm({
|
|
3574
3572
|
message: r,
|
|
3575
3573
|
initialValue: !0
|
|
@@ -3582,13 +3580,13 @@ async function pa(e, t, n) {
|
|
|
3582
3580
|
"up",
|
|
3583
3581
|
"-d"
|
|
3584
3582
|
], { cwd: `${e}/apps/backend` });
|
|
3585
|
-
return o.exitCode === 0 ? (a.stop(z.success("Docker services started")), !0) : (a.error("Failed to start Docker services"),
|
|
3583
|
+
return o.exitCode === 0 ? (a.stop(z.success("Docker services started")), !0) : (a.error("Failed to start Docker services"), ha(o), !1);
|
|
3586
3584
|
}
|
|
3587
|
-
function
|
|
3585
|
+
function ha(e) {
|
|
3588
3586
|
let t = (e.stderr || e.stdout).trim();
|
|
3589
3587
|
t && s.log.warn(z.muted(t));
|
|
3590
3588
|
}
|
|
3591
|
-
async function
|
|
3589
|
+
async function ga(e, t = 15, n = 2e3) {
|
|
3592
3590
|
for (let r = 0; r < t; r++) {
|
|
3593
3591
|
if ((await q("docker", [
|
|
3594
3592
|
"compose",
|
|
@@ -3603,8 +3601,8 @@ async function ha(e, t = 15, n = 2e3) {
|
|
|
3603
3601
|
}
|
|
3604
3602
|
return !1;
|
|
3605
3603
|
}
|
|
3606
|
-
var
|
|
3607
|
-
async function
|
|
3604
|
+
var _a = "Database schema is up to date";
|
|
3605
|
+
async function va(e) {
|
|
3608
3606
|
let t = await q("pnpm", [
|
|
3609
3607
|
"--filter",
|
|
3610
3608
|
"@internal/backend",
|
|
@@ -3613,9 +3611,9 @@ async function _a(e) {
|
|
|
3613
3611
|
"migrate",
|
|
3614
3612
|
"status"
|
|
3615
3613
|
], { cwd: e });
|
|
3616
|
-
return t.exitCode === 0 ? `${t.stdout}\n${t.stderr}`.includes(
|
|
3614
|
+
return t.exitCode === 0 ? `${t.stdout}\n${t.stderr}`.includes(_a) : !1;
|
|
3617
3615
|
}
|
|
3618
|
-
async function
|
|
3616
|
+
async function ya(e) {
|
|
3619
3617
|
let t = s.spinner();
|
|
3620
3618
|
t.start("Running database migrations...");
|
|
3621
3619
|
let n = await q("pnpm", [
|
|
@@ -3623,15 +3621,15 @@ async function va(e) {
|
|
|
3623
3621
|
"@internal/backend",
|
|
3624
3622
|
"migration:latest"
|
|
3625
3623
|
], { cwd: e });
|
|
3626
|
-
return n.exitCode === 0 ? (t.stop(z.success("Database migrations applied")), !0) : (t.error("Migrations failed"),
|
|
3624
|
+
return n.exitCode === 0 ? (t.stop(z.success("Database migrations applied")), !0) : (t.error("Migrations failed"), ha(n), s.log.warn(z.muted("Run `pnpm --filter @internal/backend migration:latest` manually to apply migrations.")), !1);
|
|
3627
3625
|
}
|
|
3628
|
-
async function
|
|
3629
|
-
if (!await
|
|
3626
|
+
async function ba(e, t, n = {}) {
|
|
3627
|
+
if (!await ma(e, t, await fa())) return !1;
|
|
3630
3628
|
let r = s.spinner();
|
|
3631
|
-
return r.start("Waiting for Postgres to be ready..."), await
|
|
3629
|
+
return r.start("Waiting for Postgres to be ready..."), await ga(e, n.postgresMaxAttempts ?? 15, n.postgresCheckIntervalMs ?? 2e3) ? (r.stop(z.success("Postgres is ready")), !0) : (r.error("Postgres health check timed out"), s.log.warn(z.muted("Run migrations manually once Postgres is ready: pnpm --filter @internal/backend migration:latest")), !1);
|
|
3632
3630
|
}
|
|
3633
|
-
async function
|
|
3634
|
-
if (!await
|
|
3631
|
+
async function xa(e, t, n = {}) {
|
|
3632
|
+
if (!await ba(e, t, n)) return;
|
|
3635
3633
|
let r = t ? !0 : await s.confirm({
|
|
3636
3634
|
message: `Run database migrations with ${z.command("prisma migrate deploy")}?`,
|
|
3637
3635
|
initialValue: !0
|
|
@@ -3640,21 +3638,21 @@ async function ba(e, t, n = {}) {
|
|
|
3640
3638
|
s.log.info(z.muted("Skipping database migrations."));
|
|
3641
3639
|
return;
|
|
3642
3640
|
}
|
|
3643
|
-
await
|
|
3641
|
+
await ya(e);
|
|
3644
3642
|
}
|
|
3645
|
-
async function
|
|
3646
|
-
if (!await
|
|
3643
|
+
async function Sa(e, t, n = {}) {
|
|
3644
|
+
if (!await pa(e)) {
|
|
3647
3645
|
s.log.warn(`${z.path(".env")} not found in ${z.path("apps/backend")}. Skipping Docker and migrations - configure it first.`);
|
|
3648
3646
|
return;
|
|
3649
3647
|
}
|
|
3650
|
-
await
|
|
3648
|
+
await xa(e, t, n);
|
|
3651
3649
|
}
|
|
3652
|
-
async function
|
|
3653
|
-
return await
|
|
3650
|
+
async function Ca(e, t, n = {}) {
|
|
3651
|
+
return await pa(e) ? ba(e, t, n) : (s.log.warn(`${z.path(".env")} not found in ${z.path("apps/backend")}. Skipping Docker - configure it first.`), !1);
|
|
3654
3652
|
}
|
|
3655
3653
|
//#endregion
|
|
3656
3654
|
//#region src/core/resolve.ts
|
|
3657
|
-
function
|
|
3655
|
+
function wa(e) {
|
|
3658
3656
|
let t = /* @__PURE__ */ new Map();
|
|
3659
3657
|
for (let n of e) t.set(n.name, {
|
|
3660
3658
|
name: n.name,
|
|
@@ -3662,7 +3660,7 @@ function Ca(e) {
|
|
|
3662
3660
|
});
|
|
3663
3661
|
return t;
|
|
3664
3662
|
}
|
|
3665
|
-
function
|
|
3663
|
+
function Ta(e, t, n = /* @__PURE__ */ new Set()) {
|
|
3666
3664
|
let r = /* @__PURE__ */ new Set();
|
|
3667
3665
|
function i(e) {
|
|
3668
3666
|
if (n.has(e)) return [];
|
|
@@ -3676,10 +3674,10 @@ function wa(e, t, n = /* @__PURE__ */ new Set()) {
|
|
|
3676
3674
|
}
|
|
3677
3675
|
return i(e);
|
|
3678
3676
|
}
|
|
3679
|
-
function
|
|
3677
|
+
function Ea(e, t, n = []) {
|
|
3680
3678
|
let r = new Set(n), i = new Set(n), a = [];
|
|
3681
3679
|
for (let n of e) {
|
|
3682
|
-
let e =
|
|
3680
|
+
let e = Ta(n, t, new Set(i));
|
|
3683
3681
|
for (let t of e) i.has(t) || (i.add(t), a.push(t));
|
|
3684
3682
|
}
|
|
3685
3683
|
return {
|
|
@@ -3687,7 +3685,7 @@ function Ta(e, t, n = []) {
|
|
|
3687
3685
|
alreadyInstalled: e.filter((e) => r.has(e))
|
|
3688
3686
|
};
|
|
3689
3687
|
}
|
|
3690
|
-
function
|
|
3688
|
+
function Da(e) {
|
|
3691
3689
|
let { order: t, graph: n, isLocked: r, installed: i = [] } = e, a = new Set(i), o = /* @__PURE__ */ new Set();
|
|
3692
3690
|
for (let e of t) {
|
|
3693
3691
|
let t = n.get(e)?.dependencies.some((e) => !a.has(e) && o.has(e)) ?? !1;
|
|
@@ -3700,7 +3698,7 @@ function Ea(e) {
|
|
|
3700
3698
|
}
|
|
3701
3699
|
//#endregion
|
|
3702
3700
|
//#region src/core/variants.ts
|
|
3703
|
-
function
|
|
3701
|
+
function Oa(e, t = {}) {
|
|
3704
3702
|
let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map();
|
|
3705
3703
|
for (let i of e) {
|
|
3706
3704
|
let e = t[i.family] ?? i.default;
|
|
@@ -3712,14 +3710,14 @@ function Da(e, t = {}) {
|
|
|
3712
3710
|
familyOf: r
|
|
3713
3711
|
};
|
|
3714
3712
|
}
|
|
3715
|
-
function
|
|
3713
|
+
function ka(e, t, n) {
|
|
3716
3714
|
return [...e.map((e) => n.chosen.get(e.family) ?? e.default), ...t];
|
|
3717
3715
|
}
|
|
3718
|
-
function
|
|
3716
|
+
function Aa(e, t) {
|
|
3719
3717
|
let n = t.familyOf.get(e);
|
|
3720
3718
|
return n ? t.chosen.get(n) ?? e : e;
|
|
3721
3719
|
}
|
|
3722
|
-
function
|
|
3720
|
+
function ja(e, t) {
|
|
3723
3721
|
let n = /* @__PURE__ */ new Map();
|
|
3724
3722
|
for (let t of e) t.family && n.set(t.name, t.family);
|
|
3725
3723
|
let r = new Set(t), i = /* @__PURE__ */ new Map();
|
|
@@ -3735,65 +3733,65 @@ function Aa(e, t) {
|
|
|
3735
3733
|
familyOf: n
|
|
3736
3734
|
};
|
|
3737
3735
|
}
|
|
3738
|
-
function
|
|
3736
|
+
function Ma(e, t) {
|
|
3739
3737
|
return e.map((e) => ({
|
|
3740
3738
|
...e,
|
|
3741
|
-
dependencies: e.dependencies.map((e) =>
|
|
3739
|
+
dependencies: e.dependencies.map((e) => Aa(e, t))
|
|
3742
3740
|
}));
|
|
3743
3741
|
}
|
|
3744
3742
|
//#endregion
|
|
3745
3743
|
//#region src/ui/banner.ts
|
|
3746
|
-
var
|
|
3744
|
+
var Na = [
|
|
3747
3745
|
" ██╗ ██╗ ██╗ ██╗ ██████╗ ███████╗",
|
|
3748
3746
|
" ██║ ██║ ╚██╗ ██╔╝ ██╔══██╗ ██╔════╝",
|
|
3749
3747
|
" ███████║ ╚████╔╝ ██████╔╝ █████╗ ",
|
|
3750
3748
|
" ██╔══██║ ╚██╔╝ ██╔═══╝ ██╔══╝ ",
|
|
3751
3749
|
" ██║ ██║ ██║ ██║ ███████╗",
|
|
3752
3750
|
" ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝"
|
|
3753
|
-
],
|
|
3751
|
+
], Pa = [
|
|
3754
3752
|
" ███████╗ ████████╗ █████╗ ██████╗ ██╗ ██╗",
|
|
3755
3753
|
" ██╔════╝ ╚══██╔══╝ ██╔══██╗ ██╔════╝ ██║ ██╔╝",
|
|
3756
3754
|
" ███████╗ ██║ ███████║ ██║ █████╔╝ ",
|
|
3757
3755
|
" ╚════██║ ██║ ██╔══██║ ██║ ██╔═██╗ ",
|
|
3758
3756
|
" ███████║ ██║ ██║ ██║ ╚██████╗ ██║ ██╗",
|
|
3759
3757
|
" ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝"
|
|
3760
|
-
],
|
|
3758
|
+
], Fa = [
|
|
3761
3759
|
253,
|
|
3762
3760
|
176,
|
|
3763
3761
|
21
|
|
3764
|
-
],
|
|
3762
|
+
], Ia = [
|
|
3765
3763
|
245,
|
|
3766
3764
|
76,
|
|
3767
3765
|
2
|
|
3768
|
-
],
|
|
3766
|
+
], La = 5, Ra = [
|
|
3769
3767
|
17,
|
|
3770
3768
|
103,
|
|
3771
3769
|
248
|
|
3772
|
-
],
|
|
3770
|
+
], za = [
|
|
3773
3771
|
42,
|
|
3774
3772
|
160,
|
|
3775
3773
|
250
|
|
3776
|
-
],
|
|
3777
|
-
function
|
|
3774
|
+
], Ba = .2;
|
|
3775
|
+
function Va() {
|
|
3778
3776
|
console.log();
|
|
3779
|
-
for (let e of be(Ma, {
|
|
3780
|
-
start: Pa,
|
|
3781
|
-
end: Fa,
|
|
3782
|
-
angle: Ia
|
|
3783
|
-
})) console.log(b.bold(e));
|
|
3784
3777
|
for (let e of be(Na, {
|
|
3785
|
-
start:
|
|
3786
|
-
end:
|
|
3787
|
-
angle:
|
|
3778
|
+
start: Fa,
|
|
3779
|
+
end: Ia,
|
|
3780
|
+
angle: La
|
|
3781
|
+
})) console.log(b.bold(e));
|
|
3782
|
+
for (let e of be(Pa, {
|
|
3783
|
+
start: Ra,
|
|
3784
|
+
end: za,
|
|
3785
|
+
angle: Ba
|
|
3788
3786
|
})) console.log(b.bold(e));
|
|
3789
3787
|
console.log(), console.log(` ${B.spark} ${b.dim("v" + A)} ${b.dim("·")} ${ve("Ship web + desktop apps from one codebase")}`), console.log();
|
|
3790
3788
|
}
|
|
3791
|
-
function
|
|
3789
|
+
function Ha() {
|
|
3792
3790
|
console.log(), console.log(` ${B.bolt} ${he.orange("Hype")}${he.skyBlue("Stack")} ${b.dim("v" + A)}`), console.log();
|
|
3793
3791
|
}
|
|
3794
3792
|
//#endregion
|
|
3795
3793
|
//#region src/ui/pack-multiselect.ts
|
|
3796
|
-
var
|
|
3794
|
+
var Ua = class extends O {
|
|
3797
3795
|
options;
|
|
3798
3796
|
cursor = 0;
|
|
3799
3797
|
selected;
|
|
@@ -3897,44 +3895,44 @@ var Ha = class extends O {
|
|
|
3897
3895
|
}
|
|
3898
3896
|
}
|
|
3899
3897
|
};
|
|
3900
|
-
function
|
|
3901
|
-
return new
|
|
3898
|
+
function Wa(e) {
|
|
3899
|
+
return new Ua(e).prompt();
|
|
3902
3900
|
}
|
|
3903
3901
|
//#endregion
|
|
3904
3902
|
//#region src/utils/naming.ts
|
|
3905
|
-
function
|
|
3903
|
+
function Ga(e) {
|
|
3906
3904
|
return e.trim().toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
3907
3905
|
}
|
|
3908
|
-
function
|
|
3906
|
+
function Ka(e) {
|
|
3909
3907
|
return e.split(/[-_]/).filter(Boolean).map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(" ");
|
|
3910
3908
|
}
|
|
3911
3909
|
//#endregion
|
|
3912
3910
|
//#region src/utils/validate.ts
|
|
3913
|
-
function
|
|
3911
|
+
function qa(e) {
|
|
3914
3912
|
if (!e.trim()) return "Project name cannot be empty";
|
|
3915
3913
|
if (e.length > 214) return "Project name is too long (max 214 characters)";
|
|
3916
|
-
let t =
|
|
3914
|
+
let t = Ga(e);
|
|
3917
3915
|
if (!re.test(t)) return "Project name must contain at least one letter or number";
|
|
3918
3916
|
}
|
|
3919
3917
|
//#endregion
|
|
3920
3918
|
//#region src/core/apply-mode.ts
|
|
3921
|
-
var
|
|
3922
|
-
function
|
|
3923
|
-
return e.replace(
|
|
3919
|
+
var Ja = "src/hooks/use-theme.ts", Ya = /(\bexport\s+const\s+defaultTheme\s*=\s*)(["'])(?:light|dark)\2/;
|
|
3920
|
+
function Xa(e, t) {
|
|
3921
|
+
return e.replace(Ya, (e, n, r) => `${n}${r}${t}${r}`);
|
|
3924
3922
|
}
|
|
3925
|
-
async function
|
|
3926
|
-
let n = T.resolve(e,
|
|
3923
|
+
async function Za(e, t) {
|
|
3924
|
+
let n = T.resolve(e, Ja), r;
|
|
3927
3925
|
try {
|
|
3928
3926
|
r = await y.readFile(n, "utf-8");
|
|
3929
3927
|
} catch {
|
|
3930
3928
|
return !1;
|
|
3931
3929
|
}
|
|
3932
|
-
let i =
|
|
3930
|
+
let i = Xa(r, t);
|
|
3933
3931
|
return i === r || await y.writeFile(n, i, "utf-8"), !0;
|
|
3934
3932
|
}
|
|
3935
3933
|
//#endregion
|
|
3936
3934
|
//#region src/core/apply-theme.ts
|
|
3937
|
-
function
|
|
3935
|
+
function Qa(e, t) {
|
|
3938
3936
|
let n = 0;
|
|
3939
3937
|
for (; n < e.length;) {
|
|
3940
3938
|
let r = e.indexOf(t, n);
|
|
@@ -3957,46 +3955,46 @@ function Za(e, t) {
|
|
|
3957
3955
|
}
|
|
3958
3956
|
return null;
|
|
3959
3957
|
}
|
|
3960
|
-
function
|
|
3958
|
+
function $a(e, t) {
|
|
3961
3959
|
let n = e;
|
|
3962
3960
|
for (let [e, r] of Object.entries(t)) {
|
|
3963
|
-
let t = RegExp(`(^[ \\t]*--${
|
|
3961
|
+
let t = RegExp(`(^[ \\t]*--${eo(e)}[ \\t]*:[ \\t]*)([^;\\n]*);`, "m");
|
|
3964
3962
|
n = n.replace(t, (e, t) => `${t}${r};`);
|
|
3965
3963
|
}
|
|
3966
3964
|
return n;
|
|
3967
3965
|
}
|
|
3968
|
-
function
|
|
3966
|
+
function eo(e) {
|
|
3969
3967
|
return e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
3970
3968
|
}
|
|
3971
|
-
function
|
|
3972
|
-
let n =
|
|
3969
|
+
function to(e, t) {
|
|
3970
|
+
let n = Qa(e, ":root"), r = Qa(e, ".dark"), i = e;
|
|
3973
3971
|
if (n) {
|
|
3974
3972
|
let e = i.slice(0, n.bodyStart), r = i.slice(n.bodyStart, n.bodyEnd), a = i.slice(n.bodyEnd);
|
|
3975
|
-
i = e +
|
|
3973
|
+
i = e + $a(r, t.light) + a;
|
|
3976
3974
|
}
|
|
3977
3975
|
if (r) {
|
|
3978
|
-
let e =
|
|
3976
|
+
let e = Qa(i, ".dark");
|
|
3979
3977
|
if (e) {
|
|
3980
3978
|
let n = i.slice(0, e.bodyStart), r = i.slice(e.bodyStart, e.bodyEnd), a = i.slice(e.bodyEnd);
|
|
3981
|
-
i = n +
|
|
3979
|
+
i = n + $a(r, t.dark) + a;
|
|
3982
3980
|
}
|
|
3983
3981
|
}
|
|
3984
3982
|
return i;
|
|
3985
3983
|
}
|
|
3986
|
-
var
|
|
3987
|
-
async function
|
|
3988
|
-
let n = T.resolve(e,
|
|
3984
|
+
var no = "assets/styles.css";
|
|
3985
|
+
async function ro(e, t) {
|
|
3986
|
+
let n = T.resolve(e, no), r;
|
|
3989
3987
|
try {
|
|
3990
3988
|
r = await y.readFile(n, "utf-8");
|
|
3991
3989
|
} catch {
|
|
3992
3990
|
return !1;
|
|
3993
3991
|
}
|
|
3994
|
-
let i =
|
|
3992
|
+
let i = to(r, t);
|
|
3995
3993
|
return i === r || await y.writeFile(n, i, "utf-8"), !0;
|
|
3996
3994
|
}
|
|
3997
3995
|
//#endregion
|
|
3998
3996
|
//#region src/core/clone.ts
|
|
3999
|
-
async function
|
|
3997
|
+
async function io(e) {
|
|
4000
3998
|
let t = await ee(te, {
|
|
4001
3999
|
dir: e,
|
|
4002
4000
|
force: !0
|
|
@@ -4008,7 +4006,7 @@ async function ro(e) {
|
|
|
4008
4006
|
}
|
|
4009
4007
|
//#endregion
|
|
4010
4008
|
//#region src/core/editor-config.ts
|
|
4011
|
-
function
|
|
4009
|
+
function ao(e) {
|
|
4012
4010
|
let t = {
|
|
4013
4011
|
globs: [],
|
|
4014
4012
|
alwaysApply: !1
|
|
@@ -4043,10 +4041,10 @@ function io(e) {
|
|
|
4043
4041
|
content: i
|
|
4044
4042
|
};
|
|
4045
4043
|
}
|
|
4046
|
-
function
|
|
4044
|
+
function oo(e) {
|
|
4047
4045
|
return e.frontmatter.globs.length > 0 ? `---\npaths:\n${e.frontmatter.globs.map((e) => ` - "${e}"`).join("\n")}\n---\n\n${e.content}` : e.content;
|
|
4048
4046
|
}
|
|
4049
|
-
function
|
|
4047
|
+
function so(e) {
|
|
4050
4048
|
let t;
|
|
4051
4049
|
t = e.frontmatter.alwaysApply ? "always_on" : e.frontmatter.globs.length > 0 ? "glob" : "model_decision";
|
|
4052
4050
|
let n = [`trigger: ${t}`];
|
|
@@ -4056,30 +4054,30 @@ function oo(e) {
|
|
|
4056
4054
|
}
|
|
4057
4055
|
return e.frontmatter.description && n.push(`description: ${e.frontmatter.description}`), `---\n${n.join("\n")}\n---\n\n${e.content}`;
|
|
4058
4056
|
}
|
|
4059
|
-
function
|
|
4057
|
+
function co(e) {
|
|
4060
4058
|
return e.frontmatter.globs.length > 0 ? `---\napplyTo: "${e.frontmatter.globs.join(", ")}"\n---\n\n${e.content}` : e.content;
|
|
4061
4059
|
}
|
|
4062
|
-
var
|
|
4060
|
+
var lo = {
|
|
4063
4061
|
claude: {
|
|
4064
4062
|
rulesDir: ".claude/rules",
|
|
4065
4063
|
extension: ".md",
|
|
4066
|
-
convert:
|
|
4064
|
+
convert: oo
|
|
4067
4065
|
},
|
|
4068
4066
|
windsurf: {
|
|
4069
4067
|
rulesDir: ".windsurf/rules",
|
|
4070
4068
|
extension: ".md",
|
|
4071
|
-
convert:
|
|
4069
|
+
convert: so
|
|
4072
4070
|
},
|
|
4073
4071
|
copilot: {
|
|
4074
4072
|
rulesDir: ".github/instructions",
|
|
4075
4073
|
extension: ".instructions.md",
|
|
4076
|
-
convert:
|
|
4074
|
+
convert: co
|
|
4077
4075
|
}
|
|
4078
4076
|
};
|
|
4079
|
-
async function
|
|
4077
|
+
async function uo(e) {
|
|
4080
4078
|
let t = T.join(e, ae), n = (await y.readdir(t, { withFileTypes: !0 }).catch(() => [])).filter((e) => e.isFile() && e.name.endsWith(".mdc"));
|
|
4081
4079
|
return await Promise.all(n.map(async (e) => {
|
|
4082
|
-
let n = T.join(t, e.name), { frontmatter: r, content: i } =
|
|
4080
|
+
let n = T.join(t, e.name), { frontmatter: r, content: i } = ao(await y.readFile(n, "utf-8"));
|
|
4083
4081
|
return {
|
|
4084
4082
|
frontmatter: r,
|
|
4085
4083
|
content: i,
|
|
@@ -4087,9 +4085,9 @@ async function lo(e) {
|
|
|
4087
4085
|
};
|
|
4088
4086
|
}));
|
|
4089
4087
|
}
|
|
4090
|
-
async function
|
|
4088
|
+
async function fo(e, t) {
|
|
4091
4089
|
if (t === "cursor") return;
|
|
4092
|
-
let n =
|
|
4090
|
+
let n = lo[t], r = await uo(e), i = T.join(e, n.rulesDir);
|
|
4093
4091
|
await y.mkdir(i, { recursive: !0 }), await Promise.all(r.map((e) => {
|
|
4094
4092
|
let t = n.convert(e), r = e.filename.replace(/\.mdc$/, n.extension);
|
|
4095
4093
|
return y.writeFile(T.join(i, r), t, "utf-8");
|
|
@@ -4097,21 +4095,21 @@ async function uo(e, t) {
|
|
|
4097
4095
|
}
|
|
4098
4096
|
//#endregion
|
|
4099
4097
|
//#region src/core/env-files.ts
|
|
4100
|
-
var
|
|
4098
|
+
var po = [
|
|
4101
4099
|
"apps",
|
|
4102
4100
|
"packages",
|
|
4103
4101
|
"libs",
|
|
4104
4102
|
"shared"
|
|
4105
4103
|
];
|
|
4106
|
-
async function
|
|
4107
|
-
let t = await
|
|
4104
|
+
async function mo(e) {
|
|
4105
|
+
let t = await ho(e);
|
|
4108
4106
|
return (await Promise.all(t.map(async (t) => {
|
|
4109
4107
|
let n = T.join(T.dirname(t), ".env");
|
|
4110
4108
|
return await J(n) ? null : (await y.copyFile(t, n), T.relative(e, n));
|
|
4111
4109
|
}))).filter((e) => e !== null).sort();
|
|
4112
4110
|
}
|
|
4113
|
-
async function
|
|
4114
|
-
let t = [T.join(e, ".env.example")], n = await Promise.all(
|
|
4111
|
+
async function ho(e) {
|
|
4112
|
+
let t = [T.join(e, ".env.example")], n = await Promise.all(po.map(async (t) => {
|
|
4115
4113
|
let n = T.join(e, t);
|
|
4116
4114
|
return (await y.readdir(n, { withFileTypes: !0 }).catch(() => [])).filter((e) => e.isDirectory()).map((e) => T.join(n, e.name, ".env.example"));
|
|
4117
4115
|
}));
|
|
@@ -4119,11 +4117,11 @@ async function mo(e) {
|
|
|
4119
4117
|
}
|
|
4120
4118
|
//#endregion
|
|
4121
4119
|
//#region src/core/post-clone.ts
|
|
4122
|
-
var Q = "@hype-stack/",
|
|
4123
|
-
async function
|
|
4120
|
+
var Q = "@hype-stack/", go = "hype-stack", _o = "@hype-stack/cli";
|
|
4121
|
+
async function vo(e) {
|
|
4124
4122
|
await ur(T.join(e, ".git"));
|
|
4125
4123
|
}
|
|
4126
|
-
async function
|
|
4124
|
+
async function yo(e) {
|
|
4127
4125
|
await q("git", ["init"], { cwd: e }), await q("git", ["add", "."], { cwd: e }), await q("git", [
|
|
4128
4126
|
"-c",
|
|
4129
4127
|
"user.name=Hype Stack CLI",
|
|
@@ -4134,22 +4132,19 @@ async function _o(e) {
|
|
|
4134
4132
|
"Initial commit from Hype Stack CLI"
|
|
4135
4133
|
], { cwd: e });
|
|
4136
4134
|
}
|
|
4137
|
-
async function
|
|
4138
|
-
let n = `@${t}/`, r = await
|
|
4135
|
+
async function bo(e, t) {
|
|
4136
|
+
let n = `@${t}/`, r = await Oo(e);
|
|
4139
4137
|
for (let e of r) {
|
|
4140
4138
|
let t = await sr(e);
|
|
4141
4139
|
if (!t) continue;
|
|
4142
4140
|
let r = !1;
|
|
4143
|
-
t.name?.startsWith(Q) && (t.name = t.name.replace(Q, n), r = !0),
|
|
4144
|
-
let i = await y.readFile(e, "utf-8");
|
|
4145
|
-
|
|
4146
|
-
let t = i.replaceAll(Q, n);
|
|
4147
|
-
await y.writeFile(e, t, "utf-8");
|
|
4148
|
-
} else r && await cr(e, t);
|
|
4141
|
+
t.name?.startsWith(Q) && (t.name = t.name.replace(Q, n), r = !0), To(t.dependencies, n) && (r = !0), To(t.devDependencies, n) && (r = !0), t.nx && Eo(t.nx, n) && (r = !0);
|
|
4142
|
+
let i = await y.readFile(e, "utf-8"), a = Ur(i, n);
|
|
4143
|
+
a === i ? r && await cr(e, t) : await y.writeFile(e, a, "utf-8");
|
|
4149
4144
|
}
|
|
4150
|
-
await
|
|
4145
|
+
await Vi(e, t), await Co(e, t), await Do(e, t);
|
|
4151
4146
|
}
|
|
4152
|
-
var
|
|
4147
|
+
var xo = new Set([
|
|
4153
4148
|
".git",
|
|
4154
4149
|
"node_modules",
|
|
4155
4150
|
"dist",
|
|
@@ -4157,10 +4152,10 @@ var yo = new Set([
|
|
|
4157
4152
|
".nx",
|
|
4158
4153
|
".next",
|
|
4159
4154
|
"coverage"
|
|
4160
|
-
]),
|
|
4161
|
-
async function
|
|
4162
|
-
if (t ===
|
|
4163
|
-
let n = await
|
|
4155
|
+
]), So = /^(docker-compose|compose)(\.[\w.-]+)?\.ya?ml$/;
|
|
4156
|
+
async function Co(e, t) {
|
|
4157
|
+
if (t === go) return;
|
|
4158
|
+
let n = await wo(e);
|
|
4164
4159
|
await Promise.all(n.map(async (e) => {
|
|
4165
4160
|
let n = await y.readFile(e, "utf-8").catch(() => null);
|
|
4166
4161
|
if (!n || !/^name:[ \t]*hype-stack/m.test(n)) return;
|
|
@@ -4168,23 +4163,23 @@ async function xo(e, t) {
|
|
|
4168
4163
|
await y.writeFile(e, r, "utf-8");
|
|
4169
4164
|
}));
|
|
4170
4165
|
}
|
|
4171
|
-
async function
|
|
4166
|
+
async function wo(e) {
|
|
4172
4167
|
let t = await y.readdir(e, { withFileTypes: !0 }).catch(() => []);
|
|
4173
4168
|
return (await Promise.all(t.map(async (t) => {
|
|
4174
4169
|
let n = T.join(e, t.name);
|
|
4175
|
-
return t.isDirectory() ?
|
|
4170
|
+
return t.isDirectory() ? xo.has(t.name) ? [] : wo(n) : t.isFile() && So.test(t.name) ? [n] : [];
|
|
4176
4171
|
}))).flat();
|
|
4177
4172
|
}
|
|
4178
|
-
function
|
|
4173
|
+
function To(e, t) {
|
|
4179
4174
|
if (!e) return !1;
|
|
4180
4175
|
let n = !1;
|
|
4181
|
-
for (let r of Object.keys(e)) if (r.startsWith(Q)) {
|
|
4176
|
+
for (let r of Object.keys(e)) if (r !== _o && r.startsWith(Q)) {
|
|
4182
4177
|
let i = r.replace(Q, t);
|
|
4183
4178
|
e[i] = e[r], delete e[r], n = !0;
|
|
4184
4179
|
}
|
|
4185
4180
|
return n;
|
|
4186
4181
|
}
|
|
4187
|
-
function
|
|
4182
|
+
function Eo(e, t) {
|
|
4188
4183
|
if (!e) return !1;
|
|
4189
4184
|
let n = !1;
|
|
4190
4185
|
if (e.implicitDependencies &&= e.implicitDependencies.map((e) => e.startsWith(Q) ? (n = !0, e.replace(Q, t)) : e), e.targets) {
|
|
@@ -4192,13 +4187,13 @@ function wo(e, t) {
|
|
|
4192
4187
|
}
|
|
4193
4188
|
return n;
|
|
4194
4189
|
}
|
|
4195
|
-
async function
|
|
4190
|
+
async function Do(e, t) {
|
|
4196
4191
|
let n = T.join(e, "packages/enums/src/app/index.ts"), r = await y.readFile(n, "utf-8").catch(() => null);
|
|
4197
4192
|
if (!r) return;
|
|
4198
|
-
let i =
|
|
4193
|
+
let i = Ka(t), a = r.replaceAll(`id: "${go}"`, `id: "${t}"`).replaceAll(`name: "${go}"`, `name: "${t}"`).replace(/name: "Hype Stack"/, `name: "${i}"`).replace(/description: ".*?"/, `description: "${i} application"`);
|
|
4199
4194
|
await y.writeFile(n, a, "utf-8");
|
|
4200
4195
|
}
|
|
4201
|
-
async function
|
|
4196
|
+
async function Oo(e) {
|
|
4202
4197
|
let t = [], n = T.join(e, "package.json");
|
|
4203
4198
|
(await y.stat(n).catch(() => null))?.isFile() && t.push(n);
|
|
4204
4199
|
for (let n of [
|
|
@@ -4218,7 +4213,7 @@ async function Eo(e) {
|
|
|
4218
4213
|
}
|
|
4219
4214
|
//#endregion
|
|
4220
4215
|
//#region src/core/readme.ts
|
|
4221
|
-
var
|
|
4216
|
+
var ko = {
|
|
4222
4217
|
cursor: {
|
|
4223
4218
|
label: "Cursor",
|
|
4224
4219
|
rulesDir: ".cursor/rules"
|
|
@@ -4235,21 +4230,21 @@ var Do = {
|
|
|
4235
4230
|
label: "GitHub Copilot",
|
|
4236
4231
|
rulesDir: ".github/instructions"
|
|
4237
4232
|
}
|
|
4238
|
-
},
|
|
4233
|
+
}, Ao = {
|
|
4239
4234
|
backend: "Hono API server (Postgres, Prisma, Kysely, Valkey cache, WorkOS auth)",
|
|
4240
4235
|
frontend: "React + Vite app talking to the backend through the typed HyperFetch SDK"
|
|
4241
|
-
},
|
|
4236
|
+
}, jo = {
|
|
4242
4237
|
enums: "Shared enums and app config used across apps",
|
|
4243
4238
|
cli: "Project tooling and code generators"
|
|
4244
4239
|
};
|
|
4245
|
-
function
|
|
4240
|
+
function Mo(e, t) {
|
|
4246
4241
|
return Object.entries(e).toSorted(([e], [t]) => e.localeCompare(t)).map(([e, n]) => {
|
|
4247
4242
|
let r = t[e];
|
|
4248
4243
|
return r ? `- \`${n}\` - ${r}` : `- \`${n}\``;
|
|
4249
4244
|
});
|
|
4250
4245
|
}
|
|
4251
|
-
function
|
|
4252
|
-
let { projectName: t, editor: n, workspace: r } = e, i =
|
|
4246
|
+
function No(e) {
|
|
4247
|
+
let { projectName: t, editor: n, workspace: r } = e, i = Ka(t), a = ko[n], o = !!r.apps.backend, s = Mo(r.apps, Ao), c = Mo(r.packages, jo), l = [];
|
|
4253
4248
|
s.length > 0 && l.push(...s), c.length > 0 && l.push(...c), l.push("- `stack.json` - Hype Stack workspace config (apps, paths, installed packs)");
|
|
4254
4249
|
let u = [];
|
|
4255
4250
|
u.push(`# ${i}`), u.push([
|
|
@@ -4352,13 +4347,13 @@ function jo(e) {
|
|
|
4352
4347
|
"stays useful."
|
|
4353
4348
|
].join("\n")), u.join("\n\n") + "\n";
|
|
4354
4349
|
}
|
|
4355
|
-
async function
|
|
4350
|
+
async function Po(e, t) {
|
|
4356
4351
|
let n = T.join(e, "README.md");
|
|
4357
|
-
await y.writeFile(n,
|
|
4352
|
+
await y.writeFile(n, No(t), "utf-8");
|
|
4358
4353
|
}
|
|
4359
4354
|
//#endregion
|
|
4360
4355
|
//#region src/core/tracking.ts
|
|
4361
|
-
async function
|
|
4356
|
+
async function Fo(e) {
|
|
4362
4357
|
try {
|
|
4363
4358
|
let t = {
|
|
4364
4359
|
"X-Device-Id": Xn(),
|
|
@@ -4372,7 +4367,7 @@ async function No(e) {
|
|
|
4372
4367
|
}
|
|
4373
4368
|
//#endregion
|
|
4374
4369
|
//#region src/core/npm-deps.ts
|
|
4375
|
-
function
|
|
4370
|
+
function Io(e, t) {
|
|
4376
4371
|
let n = [], r = [];
|
|
4377
4372
|
if (!e) return {
|
|
4378
4373
|
errors: n,
|
|
@@ -4403,7 +4398,7 @@ function Po(e, t) {
|
|
|
4403
4398
|
operations: r
|
|
4404
4399
|
};
|
|
4405
4400
|
}
|
|
4406
|
-
function
|
|
4401
|
+
function Lo(e) {
|
|
4407
4402
|
let t = {};
|
|
4408
4403
|
for (let n of e) if (n) for (let [e, r] of Object.entries(n)) t[e] = {
|
|
4409
4404
|
...t[e],
|
|
@@ -4411,7 +4406,7 @@ function Fo(e) {
|
|
|
4411
4406
|
};
|
|
4412
4407
|
return t;
|
|
4413
4408
|
}
|
|
4414
|
-
async function
|
|
4409
|
+
async function Ro(e, t, n = q) {
|
|
4415
4410
|
let r = [];
|
|
4416
4411
|
for (let i of e) {
|
|
4417
4412
|
let e = T.join(t, i.relativeDir);
|
|
@@ -4447,14 +4442,14 @@ async function Io(e, t, n = q) {
|
|
|
4447
4442
|
function $(e) {
|
|
4448
4443
|
return e instanceof Error ? e.message : String(e);
|
|
4449
4444
|
}
|
|
4450
|
-
async function
|
|
4445
|
+
async function zo(e, t, n) {
|
|
4451
4446
|
let r = e.filter((e) => e.tier === "paid" && !t.has(e.name)).map((e) => e.name);
|
|
4452
|
-
return r.length === 0 ? {} :
|
|
4447
|
+
return r.length === 0 ? {} : Br(r, n).catch(() => ({}));
|
|
4453
4448
|
}
|
|
4454
|
-
function
|
|
4449
|
+
function Bo(e, t) {
|
|
4455
4450
|
return e === "free" ? z.success("free") : e === "owned" ? z.accent("owned") : `${z.highlight(`$${t}`)} ${z.muted("locked")}`;
|
|
4456
4451
|
}
|
|
4457
|
-
async function
|
|
4452
|
+
async function Vo(e, t, n) {
|
|
4458
4453
|
let r = e.filter((e) => t(e)), i = e.filter((e) => !t(e));
|
|
4459
4454
|
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 rr(r.map((e) => n.get(e)).filter((e) => e !== void 0).map((e) => ({
|
|
4460
4455
|
name: e.name,
|
|
@@ -4462,7 +4457,7 @@ async function zo(e, t, n) {
|
|
|
4462
4457
|
price: e.price
|
|
4463
4458
|
})));
|
|
4464
4459
|
}
|
|
4465
|
-
function
|
|
4460
|
+
function Ho(e, t) {
|
|
4466
4461
|
let n = e.map((e, n) => {
|
|
4467
4462
|
let r = t.get(e), i = r ? r.displayName : e;
|
|
4468
4463
|
return ` ${z.muted(`${n + 1}.`)} ${z.brand(i)}`;
|
|
@@ -4473,10 +4468,10 @@ function Bo(e, t) {
|
|
|
4473
4468
|
...n
|
|
4474
4469
|
].join("\n"), "Install Plan");
|
|
4475
4470
|
}
|
|
4476
|
-
async function
|
|
4471
|
+
async function Uo(e, t) {
|
|
4477
4472
|
let n = [];
|
|
4478
4473
|
for (let r of e) {
|
|
4479
|
-
let e = await
|
|
4474
|
+
let e = await Pr(r), i = await Fr(r, t);
|
|
4480
4475
|
if (i.status === "denied") throw Error(`Access to "${r}" was denied (${i.reason}). Try 'npx @hype-stack/cli login' or check your license.`);
|
|
4481
4476
|
n.push({
|
|
4482
4477
|
manifest: e,
|
|
@@ -4485,21 +4480,21 @@ async function Vo(e, t) {
|
|
|
4485
4480
|
}
|
|
4486
4481
|
return n;
|
|
4487
4482
|
}
|
|
4488
|
-
async function
|
|
4489
|
-
let { prepared: t, paths: n, cwd: r, spinner: i } = e, a =
|
|
4483
|
+
async function Wo(e) {
|
|
4484
|
+
let { prepared: t, paths: n, cwd: r, spinner: i } = e, a = Io(Lo(t.map((e) => e.manifest.dependencies_npm)), n);
|
|
4490
4485
|
if (a.errors.length > 0) {
|
|
4491
4486
|
for (let e of a.errors) s.log.error(e);
|
|
4492
4487
|
return;
|
|
4493
4488
|
}
|
|
4494
4489
|
if (a.operations.length === 0) return;
|
|
4495
4490
|
i.start("Installing npm dependencies...");
|
|
4496
|
-
let o = await
|
|
4491
|
+
let o = await Ro(a.operations, r);
|
|
4497
4492
|
if (i.stop(o.ok ? "npm dependencies installed" : "npm dependency installation failed"), !o.ok) for (let e of o.errors) s.log.error(e);
|
|
4498
4493
|
}
|
|
4499
|
-
function
|
|
4500
|
-
|
|
4494
|
+
function Go() {
|
|
4495
|
+
da([`${z.command("npx @hype-stack/cli onboard")} ${z.muted("(set up env vars + run migrations)")}`, `${z.command("pnpm dev")} ${z.muted("(start frontend + backend)")}`]);
|
|
4501
4496
|
}
|
|
4502
|
-
function
|
|
4497
|
+
function Ko(e) {
|
|
4503
4498
|
if (e.length === 0) return;
|
|
4504
4499
|
let t = e.map((e) => {
|
|
4505
4500
|
let t = e.replace(/^\{\{[^}]+\}\}\//, "");
|
|
@@ -4507,10 +4502,10 @@ function Wo(e) {
|
|
|
4507
4502
|
});
|
|
4508
4503
|
s.note(t.join("\n"), "Skipped (already exist)");
|
|
4509
4504
|
}
|
|
4510
|
-
async function
|
|
4505
|
+
async function qo(e) {
|
|
4511
4506
|
let { prepared: t, config: n, cwd: r, force: i, yes: a, slotsByPack: o } = e, c = /* @__PURE__ */ new Set();
|
|
4512
4507
|
if (i) return c;
|
|
4513
|
-
let l = await
|
|
4508
|
+
let l = await Xi({
|
|
4514
4509
|
packs: t,
|
|
4515
4510
|
config: n,
|
|
4516
4511
|
projectRoot: r,
|
|
@@ -4537,7 +4532,7 @@ async function Go(e) {
|
|
|
4537
4532
|
}
|
|
4538
4533
|
//#endregion
|
|
4539
4534
|
//#region src/ui/swatch.ts
|
|
4540
|
-
function
|
|
4535
|
+
function Jo(e) {
|
|
4541
4536
|
let t = e.trim().match(/^oklch\(([^)]+)\)$/i);
|
|
4542
4537
|
if (!t) return null;
|
|
4543
4538
|
let n = t[1].trim().split(/\s+/);
|
|
@@ -4556,56 +4551,56 @@ function Ko(e) {
|
|
|
4556
4551
|
h: a
|
|
4557
4552
|
};
|
|
4558
4553
|
}
|
|
4559
|
-
function
|
|
4554
|
+
function Yo(e) {
|
|
4560
4555
|
return Math.min(255, Math.max(0, Math.round(e)));
|
|
4561
4556
|
}
|
|
4562
|
-
function
|
|
4557
|
+
function Xo(e) {
|
|
4563
4558
|
return e <= .0031308 ? 12.92 * e : 1.055 * e ** (1 / 2.4) - .055;
|
|
4564
4559
|
}
|
|
4565
|
-
function
|
|
4560
|
+
function Zo({ l: e, c: t, h: n }) {
|
|
4566
4561
|
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;
|
|
4567
4562
|
return [
|
|
4568
|
-
|
|
4569
|
-
|
|
4570
|
-
|
|
4563
|
+
Yo(Xo(f) * 255),
|
|
4564
|
+
Yo(Xo(p) * 255),
|
|
4565
|
+
Yo(Xo(m) * 255)
|
|
4571
4566
|
];
|
|
4572
4567
|
}
|
|
4573
|
-
var
|
|
4574
|
-
function
|
|
4568
|
+
var Qo = "\x1B[49m";
|
|
4569
|
+
function $o(e, t) {
|
|
4575
4570
|
let n = e[t];
|
|
4576
4571
|
if (!n) return b.dim(" ");
|
|
4577
|
-
let r =
|
|
4572
|
+
let r = Jo(n);
|
|
4578
4573
|
if (!r) return b.dim(" ");
|
|
4579
|
-
let [i, a, o] =
|
|
4580
|
-
return `\x1b[48;2;${i};${a};${o}m ${
|
|
4574
|
+
let [i, a, o] = Zo(r);
|
|
4575
|
+
return `\x1b[48;2;${i};${a};${o}m ${Qo}`;
|
|
4581
4576
|
}
|
|
4582
|
-
var
|
|
4577
|
+
var es = [
|
|
4583
4578
|
"primary",
|
|
4584
4579
|
"secondary",
|
|
4585
4580
|
"accent"
|
|
4586
4581
|
];
|
|
4587
|
-
function
|
|
4588
|
-
return
|
|
4582
|
+
function ts(e) {
|
|
4583
|
+
return es.map((t) => $o(e, t)).join("");
|
|
4589
4584
|
}
|
|
4590
|
-
function
|
|
4591
|
-
return `${
|
|
4585
|
+
function ns(e) {
|
|
4586
|
+
return `${ts(e.light)} ${b.dim("·")} ${ts(e.dark)}`;
|
|
4592
4587
|
}
|
|
4593
4588
|
//#endregion
|
|
4594
4589
|
//#region src/commands/create.ts
|
|
4595
|
-
async function
|
|
4596
|
-
e.skipBanner ||
|
|
4590
|
+
async function rs(e) {
|
|
4591
|
+
e.skipBanner || Va(), s.intro(z.brandBold("Create a new Hype Stack project"));
|
|
4597
4592
|
let o = e.yes === !0, c, l;
|
|
4598
4593
|
if (o && e.name) {
|
|
4599
|
-
let t =
|
|
4600
|
-
t && (s.log.error(t), Z()), l = e.name, c =
|
|
4594
|
+
let t = qa(e.name);
|
|
4595
|
+
t && (s.log.error(t), Z()), l = e.name, c = Ga(e.name);
|
|
4601
4596
|
} else {
|
|
4602
4597
|
let t = await s.text({
|
|
4603
4598
|
message: "What is your project named?",
|
|
4604
4599
|
placeholder: "my-app",
|
|
4605
4600
|
initialValue: e.name ?? "",
|
|
4606
|
-
validate: (e) =>
|
|
4601
|
+
validate: (e) => qa(e ?? "")
|
|
4607
4602
|
});
|
|
4608
|
-
s.isCancel(t) && Z(), l = t, c =
|
|
4603
|
+
s.isCancel(t) && Z(), l = t, c = Ga(l);
|
|
4609
4604
|
}
|
|
4610
4605
|
l.trim() !== c && s.log.info(z.muted(`Using "${z.highlight(c)}" as the project name`));
|
|
4611
4606
|
let u;
|
|
@@ -4649,7 +4644,7 @@ async function ts(e) {
|
|
|
4649
4644
|
message: "Pick a color theme",
|
|
4650
4645
|
options: r.map((e) => ({
|
|
4651
4646
|
value: e.name,
|
|
4652
|
-
label: `${
|
|
4647
|
+
label: `${ns(e)} ${e.label}`
|
|
4653
4648
|
})),
|
|
4654
4649
|
initialValue: h
|
|
4655
4650
|
});
|
|
@@ -4667,31 +4662,31 @@ async function ts(e) {
|
|
|
4667
4662
|
(s.isCancel(e) || !e) && Z();
|
|
4668
4663
|
}
|
|
4669
4664
|
let _ = s.spinner();
|
|
4670
|
-
_.start("Cloning Hype Stack template..."), await
|
|
4665
|
+
_.start("Cloning Hype Stack template..."), await io(d), _.stop(z.success("Template cloned"));
|
|
4671
4666
|
let v = s.spinner();
|
|
4672
|
-
v.start("Setting up project..."), await
|
|
4673
|
-
let y = await
|
|
4674
|
-
await
|
|
4667
|
+
v.start("Setting up project..."), await vo(d), await bo(d, c), await fo(d, p);
|
|
4668
|
+
let y = await Ar(d), b = Mr(c, y);
|
|
4669
|
+
await kr(d, b), await Po(d, {
|
|
4675
4670
|
projectName: c,
|
|
4676
4671
|
editor: p,
|
|
4677
4672
|
workspace: y
|
|
4678
4673
|
});
|
|
4679
4674
|
let x = T.resolve(d, b.paths?.frontend.root ?? "apps/frontend");
|
|
4680
|
-
a(g) && (await
|
|
4675
|
+
a(g) && (await ro(x, i(g)) || s.log.warn(z.muted(`Could not find ${z.path("assets/styles.css")} to apply the ${g} theme`))), await Za(x, e.defaultMode === "dark" || e.defaultMode === "light" ? e.defaultMode : "light") || s.log.warn(z.muted(`Could not find ${z.path("src/hooks/use-theme.ts")} to set the default color mode`)), v.stop(z.success("Project configured"));
|
|
4681
4676
|
let S = s.spinner();
|
|
4682
4677
|
S.start("Installing dependencies..."), (await q("pnpm", ["install"], { cwd: d })).exitCode === 0 ? S.stop(z.success("Dependencies installed")) : (S.stop(z.warning("Dependencies installed with warnings")), s.log.warn(z.muted("You may need to run `pnpm install` manually to resolve issues.")));
|
|
4683
4678
|
let C = s.spinner();
|
|
4684
|
-
C.start("Initializing git repository..."), await
|
|
4679
|
+
C.start("Initializing git repository..."), await yo(d), C.stop(z.success("Git repository initialized with clean history"));
|
|
4685
4680
|
let w = s.spinner();
|
|
4686
4681
|
w.start("Creating .env files from examples...");
|
|
4687
|
-
let E = await
|
|
4682
|
+
let E = await mo(d);
|
|
4688
4683
|
if (E.length > 0) {
|
|
4689
4684
|
let e = E.length;
|
|
4690
4685
|
w.stop(z.success(`Created ${e} .env file${e === 1 ? "" : "s"} from examples`));
|
|
4691
4686
|
} else w.stop(z.muted("No .env.example files to copy"));
|
|
4692
4687
|
s.log.success(`${z.brandBold("Hype Stack")} project ${z.highlight(c)} is ready!`);
|
|
4693
4688
|
let D = T.relative(process.cwd(), d) || ".", O = [`${z.command(`cd ${D}`)}`];
|
|
4694
|
-
E.length > 0 ? O.push(`Review your ${z.path(".env")} files and fill in any secrets`) : O.push(`Copy ${z.path(".env.example")} to ${z.path(".env")} and configure`),
|
|
4689
|
+
E.length > 0 ? O.push(`Review your ${z.path(".env")} files and fill in any secrets`) : O.push(`Copy ${z.path(".env.example")} to ${z.path(".env")} and configure`), da(O);
|
|
4695
4690
|
let k = e.setup === !1;
|
|
4696
4691
|
if (e.deferSetup) s.log.info(z.muted("Docker and migrations will run after your packs are installed."));
|
|
4697
4692
|
else {
|
|
@@ -4699,20 +4694,20 @@ async function ts(e) {
|
|
|
4699
4694
|
message: "Would you like to start Docker services and run database migrations now?",
|
|
4700
4695
|
initialValue: !0
|
|
4701
4696
|
}));
|
|
4702
|
-
s.isCancel(e) && Z(), e ? await
|
|
4697
|
+
s.isCancel(e) && Z(), e ? await Sa(d, o) : s.log.info(z.muted("Docker and migrations can run later via `npx @hype-stack/cli onboard`.")), Go();
|
|
4703
4698
|
}
|
|
4704
|
-
return await
|
|
4699
|
+
return await Fo("project_create"), s.outro(z.muted("Happy building!")), d;
|
|
4705
4700
|
}
|
|
4706
4701
|
//#endregion
|
|
4707
4702
|
//#region src/commands/init.ts
|
|
4708
|
-
async function
|
|
4703
|
+
async function is(e) {
|
|
4709
4704
|
let t = e.cwd ?? process.cwd(), n = e.silent ?? !1;
|
|
4710
|
-
if (n || (
|
|
4705
|
+
if (n || (Ha(), s.intro(z.brandBold("Initialize Hype Stack configuration"))), !await Nr(t)) {
|
|
4711
4706
|
s.log.error(`This doesn't look like a Hype Stack project. ${z.muted("Expected apps/ directory and package.json")}`), s.outro(z.muted(`Run ${z.command("npx @hype-stack/cli create")} to scaffold a new project.`));
|
|
4712
4707
|
return;
|
|
4713
4708
|
}
|
|
4714
|
-
if (await
|
|
4715
|
-
let e = await
|
|
4709
|
+
if (await Or(t)) {
|
|
4710
|
+
let e = await Dr(t);
|
|
4716
4711
|
if (e && !n) {
|
|
4717
4712
|
s.log.info(`Found existing ${z.path("stack.json")} for project ${z.highlight(e.name)}`);
|
|
4718
4713
|
let t = await s.confirm({
|
|
@@ -4725,7 +4720,7 @@ async function ns(e) {
|
|
|
4725
4720
|
}
|
|
4726
4721
|
}
|
|
4727
4722
|
}
|
|
4728
|
-
let r = await
|
|
4723
|
+
let r = await Ar(t);
|
|
4729
4724
|
if (!n) {
|
|
4730
4725
|
let e = Object.entries(r.apps), t = Object.entries(r.packages);
|
|
4731
4726
|
if (e.length > 0) {
|
|
@@ -4744,28 +4739,28 @@ async function ns(e) {
|
|
|
4744
4739
|
message: "Project name for stack.json?",
|
|
4745
4740
|
placeholder: i,
|
|
4746
4741
|
initialValue: i,
|
|
4747
|
-
validate: (e) =>
|
|
4742
|
+
validate: (e) => qa(e ?? "")
|
|
4748
4743
|
});
|
|
4749
|
-
s.isCancel(e) && Z(), a =
|
|
4744
|
+
s.isCancel(e) && Z(), a = Ga(e);
|
|
4750
4745
|
}
|
|
4751
|
-
await
|
|
4746
|
+
await kr(t, Mr(a, r)), n || (s.log.success(`${z.path("stack.json")} written successfully`), s.outro(z.muted("Your project is mapped and ready for Hype Stack CLI commands.")));
|
|
4752
4747
|
}
|
|
4753
|
-
async function
|
|
4754
|
-
if (await
|
|
4748
|
+
async function as(e, t = {}, n) {
|
|
4749
|
+
if (await Or(e)) return {
|
|
4755
4750
|
projectRoot: e,
|
|
4756
4751
|
scaffolded: !1
|
|
4757
4752
|
};
|
|
4758
|
-
let r = t.runInit ?? ((e) =>
|
|
4753
|
+
let r = t.runInit ?? ((e) => is({
|
|
4759
4754
|
cwd: e,
|
|
4760
4755
|
silent: !0
|
|
4761
|
-
})), i = t.runCreate ?? ((e, t) =>
|
|
4756
|
+
})), i = t.runCreate ?? ((e, t) => rs({
|
|
4762
4757
|
parentDirectory: e,
|
|
4763
4758
|
deferSetup: !0,
|
|
4764
4759
|
skipBanner: !0,
|
|
4765
4760
|
defaultTheme: t?.defaultTheme,
|
|
4766
4761
|
defaultMode: t?.defaultMode
|
|
4767
4762
|
}));
|
|
4768
|
-
if (await
|
|
4763
|
+
if (await Nr(e)) {
|
|
4769
4764
|
s.log.warn(`No ${z.path("stack.json")} found in ${z.path(e)}.`);
|
|
4770
4765
|
let t = await s.confirm({
|
|
4771
4766
|
message: `Create ${z.path("stack.json")} now?`,
|
|
@@ -4773,7 +4768,7 @@ async function rs(e, t = {}, n) {
|
|
|
4773
4768
|
});
|
|
4774
4769
|
if (s.isCancel(t) || !t) return null;
|
|
4775
4770
|
await r(e);
|
|
4776
|
-
let n = await
|
|
4771
|
+
let n = await Or(e);
|
|
4777
4772
|
return n && s.log.success(`${z.path("stack.json")} created`), n ? {
|
|
4778
4773
|
projectRoot: e,
|
|
4779
4774
|
scaffolded: !1
|
|
@@ -4791,19 +4786,19 @@ async function rs(e, t = {}, n) {
|
|
|
4791
4786
|
});
|
|
4792
4787
|
if (s.isCancel(o) || !o) return null;
|
|
4793
4788
|
let c = await i(e, n);
|
|
4794
|
-
return await
|
|
4789
|
+
return await Or(c) ? {
|
|
4795
4790
|
projectRoot: c,
|
|
4796
4791
|
scaffolded: !0
|
|
4797
4792
|
} : null;
|
|
4798
4793
|
}
|
|
4799
4794
|
//#endregion
|
|
4800
4795
|
//#region src/commands/compose.ts
|
|
4801
|
-
async function
|
|
4796
|
+
async function os(e = {}) {
|
|
4802
4797
|
let t = e.cwd ?? process.cwd();
|
|
4803
|
-
|
|
4804
|
-
let n = await
|
|
4798
|
+
Va();
|
|
4799
|
+
let n = await as(t), r = n?.projectRoot ?? null, i = n?.scaffolded ?? !1, a;
|
|
4805
4800
|
try {
|
|
4806
|
-
a = await
|
|
4801
|
+
a = await Dr(r ?? t);
|
|
4807
4802
|
} catch (e) {
|
|
4808
4803
|
s.cancel(`Could not parse ${z.path("stack.json")}: ${$(e)} Run 'npx @hype-stack/cli init' to regenerate it.`), process.exit(1);
|
|
4809
4804
|
}
|
|
@@ -4814,18 +4809,18 @@ async function is(e = {}) {
|
|
|
4814
4809
|
c.start("Loading packs...");
|
|
4815
4810
|
let l;
|
|
4816
4811
|
try {
|
|
4817
|
-
l = await
|
|
4812
|
+
l = await zr();
|
|
4818
4813
|
} catch (e) {
|
|
4819
4814
|
c.stop("Failed to load packs"), s.cancel(`Could not reach Hype Stack. Check your connection and try again.\n${$(e)}`), process.exit(1);
|
|
4820
4815
|
}
|
|
4821
4816
|
c.stop("Packs loaded");
|
|
4822
|
-
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 Kn(I()))?.token ?? null, h = await
|
|
4817
|
+
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 Kn(I()))?.token ?? null, h = await zo(l, d, {
|
|
4823
4818
|
token: m,
|
|
4824
4819
|
key: p
|
|
4825
4820
|
}), g = (e) => {
|
|
4826
4821
|
let t = f.get(e);
|
|
4827
4822
|
return !t || t.tier === "free" ? "free" : h[e]?.owned ? "owned" : "locked";
|
|
4828
|
-
}, _ = (e) => !d.has(e) && g(e) === "locked", v = await
|
|
4823
|
+
}, _ = (e) => !d.has(e) && g(e) === "locked", v = await ss({
|
|
4829
4824
|
packs: l,
|
|
4830
4825
|
installedSet: d,
|
|
4831
4826
|
stateOf: g,
|
|
@@ -4836,9 +4831,9 @@ async function is(e = {}) {
|
|
|
4836
4831
|
s.outro(z.muted("No packs selected. Nothing to do."));
|
|
4837
4832
|
return;
|
|
4838
4833
|
}
|
|
4839
|
-
let b =
|
|
4834
|
+
let b = us(v), x = ds(v), S = ja(l, b), C = wa(Ma(l, S)), w;
|
|
4840
4835
|
try {
|
|
4841
|
-
w =
|
|
4836
|
+
w = Ea(b, C, u);
|
|
4842
4837
|
} catch (e) {
|
|
4843
4838
|
s.cancel($(e)), process.exit(1);
|
|
4844
4839
|
}
|
|
@@ -4846,7 +4841,7 @@ async function is(e = {}) {
|
|
|
4846
4841
|
s.note(`${w.alreadyInstalled.join(", ")} already installed.`, "Nothing to do"), s.outro(z.muted("Your selection is already part of the project."));
|
|
4847
4842
|
return;
|
|
4848
4843
|
}
|
|
4849
|
-
let T =
|
|
4844
|
+
let T = Da({
|
|
4850
4845
|
order: w.order,
|
|
4851
4846
|
graph: C,
|
|
4852
4847
|
isLocked: _,
|
|
@@ -4854,28 +4849,28 @@ async function is(e = {}) {
|
|
|
4854
4849
|
});
|
|
4855
4850
|
if (T.blocked.length > 0 && !m && !p) {
|
|
4856
4851
|
let e = await nr();
|
|
4857
|
-
e && (m = e, h = await
|
|
4852
|
+
e && (m = e, h = await zo(l, d, {
|
|
4858
4853
|
token: m,
|
|
4859
4854
|
key: p
|
|
4860
|
-
}), T =
|
|
4855
|
+
}), T = Da({
|
|
4861
4856
|
order: w.order,
|
|
4862
4857
|
graph: C,
|
|
4863
4858
|
isLocked: _,
|
|
4864
4859
|
installed: u
|
|
4865
4860
|
}));
|
|
4866
4861
|
}
|
|
4867
|
-
if (T.blocked.length > 0 && await
|
|
4862
|
+
if (T.blocked.length > 0 && await Vo(T.blocked, _, f), T.installable.length === 0) {
|
|
4868
4863
|
s.outro(z.muted("Nothing left to install once locked packs are removed."));
|
|
4869
4864
|
return;
|
|
4870
4865
|
}
|
|
4871
|
-
if (
|
|
4866
|
+
if (Ho(T.installable, f), !e.yes) {
|
|
4872
4867
|
let e = await s.confirm({ message: `Install ${T.installable.length} pack${T.installable.length === 1 ? "" : "s"}?` });
|
|
4873
4868
|
(s.isCancel(e) || !e) && (s.cancel("Installation cancelled."), process.exit(0));
|
|
4874
4869
|
}
|
|
4875
4870
|
c.start("Downloading packs...");
|
|
4876
4871
|
let E;
|
|
4877
4872
|
try {
|
|
4878
|
-
E = await
|
|
4873
|
+
E = await Uo(T.installable, {
|
|
4879
4874
|
token: m,
|
|
4880
4875
|
key: p
|
|
4881
4876
|
});
|
|
@@ -4883,7 +4878,7 @@ async function is(e = {}) {
|
|
|
4883
4878
|
c.stop("Download failed"), s.cancel($(e)), process.exit(1);
|
|
4884
4879
|
}
|
|
4885
4880
|
c.stop(`Downloaded ${E.length} pack${E.length === 1 ? "" : "s"}`);
|
|
4886
|
-
let D = await
|
|
4881
|
+
let D = await qo({
|
|
4887
4882
|
prepared: E,
|
|
4888
4883
|
config: a,
|
|
4889
4884
|
cwd: o,
|
|
@@ -4893,7 +4888,7 @@ async function is(e = {}) {
|
|
|
4893
4888
|
});
|
|
4894
4889
|
try {
|
|
4895
4890
|
c.start("Installing pack files...");
|
|
4896
|
-
let t = await
|
|
4891
|
+
let t = await $i({
|
|
4897
4892
|
packs: E,
|
|
4898
4893
|
config: a,
|
|
4899
4894
|
projectRoot: o,
|
|
@@ -4906,22 +4901,22 @@ async function is(e = {}) {
|
|
|
4906
4901
|
for (let e of t.errors) s.log.error(e);
|
|
4907
4902
|
s.cancel("No files were written. Fix the errors above (or pass --force for existing files) and try again."), process.exit(1);
|
|
4908
4903
|
}
|
|
4909
|
-
c.stop("Files installed"), t.installed.length > 0 && s.log.success(`${z.highlight(String(t.installed.length))} files installed`), t.skipped.length > 0 && (s.log.warning(`${t.skipped.length} files skipped (use --force to overwrite)`),
|
|
4904
|
+
c.stop("Files installed"), t.installed.length > 0 && s.log.success(`${z.highlight(String(t.installed.length))} files installed`), t.skipped.length > 0 && (s.log.warning(`${t.skipped.length} files skipped (use --force to overwrite)`), Ko(t.skipped));
|
|
4910
4905
|
for (let e of t.errors) s.log.error(e);
|
|
4911
|
-
await
|
|
4906
|
+
await Wo({
|
|
4912
4907
|
prepared: E,
|
|
4913
4908
|
paths: a.paths,
|
|
4914
4909
|
cwd: o,
|
|
4915
4910
|
spinner: c
|
|
4916
4911
|
});
|
|
4917
4912
|
let n;
|
|
4918
|
-
i && (n = await
|
|
4913
|
+
i && (n = await Ca(o, e.yes ?? !1)), await pr({
|
|
4919
4914
|
projectRoot: o,
|
|
4920
4915
|
paths: a.paths,
|
|
4921
4916
|
skipPrompts: e.yes ?? !1,
|
|
4922
4917
|
dbReady: n,
|
|
4923
4918
|
freshScaffold: i
|
|
4924
|
-
}),
|
|
4919
|
+
}), Go(), s.outro(z.brand(`Installed ${t.appliedPacks.join(", ")}.`));
|
|
4925
4920
|
} finally {
|
|
4926
4921
|
await Promise.all(E.map((e) => y.rm(e.packDir, {
|
|
4927
4922
|
recursive: !0,
|
|
@@ -4929,10 +4924,10 @@ async function is(e = {}) {
|
|
|
4929
4924
|
})));
|
|
4930
4925
|
}
|
|
4931
4926
|
}
|
|
4932
|
-
async function
|
|
4927
|
+
async function ss(e) {
|
|
4933
4928
|
let { packs: t, installedSet: n, stateOf: r, options: i, adminAvailable: a } = e;
|
|
4934
4929
|
if (i.packs && i.packs.length > 0) {
|
|
4935
|
-
let e = i.packs.map(
|
|
4930
|
+
let e = i.packs.map(ls), n = e.filter((e) => !t.some((t) => t.name === e.name));
|
|
4936
4931
|
return n.length > 0 && (s.cancel(`Unknown pack${n.length === 1 ? "" : "s"}: ${n.map((e) => e.name).join(", ")}`), process.exit(1)), e;
|
|
4937
4932
|
}
|
|
4938
4933
|
let o = t.filter((e) => n.has(e.name));
|
|
@@ -4941,13 +4936,13 @@ async function as(e) {
|
|
|
4941
4936
|
if (c.length === 0) return s.outro(z.muted("Every available pack is already installed.")), [];
|
|
4942
4937
|
let l = ce();
|
|
4943
4938
|
s.note(c.map((e) => ` ${B.arrow} ${z.highlight(e.displayName)} ${ge(`${l}/packs/${e.name}`)}`).join("\n"), "Browse packs");
|
|
4944
|
-
let u =
|
|
4939
|
+
let u = sa(c, { adminAvailable: a }), d = [];
|
|
4945
4940
|
for (let e of u) {
|
|
4946
4941
|
let t = e.packs.map((e) => {
|
|
4947
4942
|
let t = r(e.name);
|
|
4948
4943
|
return {
|
|
4949
4944
|
value: e.name,
|
|
4950
|
-
label: `${e.displayName} ${
|
|
4945
|
+
label: `${e.displayName} ${Bo(t, e.price)}`,
|
|
4951
4946
|
hint: e.description
|
|
4952
4947
|
};
|
|
4953
4948
|
});
|
|
@@ -4964,7 +4959,7 @@ async function as(e) {
|
|
|
4964
4959
|
});
|
|
4965
4960
|
continue;
|
|
4966
4961
|
}
|
|
4967
|
-
let n = await
|
|
4962
|
+
let n = await Wa({
|
|
4968
4963
|
message: `Select ${e.label.toLowerCase()} to add (optional)`,
|
|
4969
4964
|
options: t,
|
|
4970
4965
|
required: !1
|
|
@@ -4974,20 +4969,20 @@ async function as(e) {
|
|
|
4974
4969
|
}
|
|
4975
4970
|
return d;
|
|
4976
4971
|
}
|
|
4977
|
-
var
|
|
4978
|
-
function
|
|
4979
|
-
let t = e.match(
|
|
4972
|
+
var cs = /@(frontend|admin)$/;
|
|
4973
|
+
function ls(e) {
|
|
4974
|
+
let t = e.match(cs);
|
|
4980
4975
|
return t ? {
|
|
4981
4976
|
name: e.slice(0, -t[0].length),
|
|
4982
4977
|
slot: t[1]
|
|
4983
4978
|
} : { name: e };
|
|
4984
4979
|
}
|
|
4985
|
-
function
|
|
4980
|
+
function us(e) {
|
|
4986
4981
|
let t = /* @__PURE__ */ new Set(), n = [];
|
|
4987
4982
|
for (let r of e) t.has(r.name) || (t.add(r.name), n.push(r.name));
|
|
4988
4983
|
return n;
|
|
4989
4984
|
}
|
|
4990
|
-
function
|
|
4985
|
+
function ds(e) {
|
|
4991
4986
|
let t = /* @__PURE__ */ new Map();
|
|
4992
4987
|
for (let n of e) {
|
|
4993
4988
|
if (!n.slot) continue;
|
|
@@ -4998,8 +4993,8 @@ function ls(e) {
|
|
|
4998
4993
|
}
|
|
4999
4994
|
//#endregion
|
|
5000
4995
|
//#region src/commands/login.ts
|
|
5001
|
-
async function
|
|
5002
|
-
|
|
4996
|
+
async function fs() {
|
|
4997
|
+
Ha(), s.intro(z.brandBold("Log in to Hype Stack")), s.log.step("Opening your browser to sign in...");
|
|
5003
4998
|
let e;
|
|
5004
4999
|
try {
|
|
5005
5000
|
e = await tr({ onUrl: (e) => {
|
|
@@ -5012,8 +5007,8 @@ async function us() {
|
|
|
5012
5007
|
}
|
|
5013
5008
|
//#endregion
|
|
5014
5009
|
//#region src/commands/logout.ts
|
|
5015
|
-
async function
|
|
5016
|
-
|
|
5010
|
+
async function ps() {
|
|
5011
|
+
Ha(), s.intro(z.brandBold("Log out of Hype Stack"));
|
|
5017
5012
|
let e = I(), t = await Kn(e);
|
|
5018
5013
|
if (!t) {
|
|
5019
5014
|
s.outro(z.muted("You're not logged in."));
|
|
@@ -5023,7 +5018,7 @@ async function ds() {
|
|
|
5023
5018
|
}
|
|
5024
5019
|
//#endregion
|
|
5025
5020
|
//#region src/core/onboard-env.ts
|
|
5026
|
-
function
|
|
5021
|
+
function ms(e) {
|
|
5027
5022
|
let t = [], n = "";
|
|
5028
5023
|
for (let r of e.split(/\r?\n/)) {
|
|
5029
5024
|
let e = r.trim();
|
|
@@ -5049,7 +5044,14 @@ function fs(e) {
|
|
|
5049
5044
|
}
|
|
5050
5045
|
return t;
|
|
5051
5046
|
}
|
|
5052
|
-
function
|
|
5047
|
+
function hs(e) {
|
|
5048
|
+
let t = e.trim();
|
|
5049
|
+
if (t === "") return "";
|
|
5050
|
+
if (t.length <= 4) return "•".repeat(t.length);
|
|
5051
|
+
let n = Math.min(t.length - 4, 8);
|
|
5052
|
+
return `${"•".repeat(n)}${t.slice(-4)}`;
|
|
5053
|
+
}
|
|
5054
|
+
function gs(e, t, n) {
|
|
5053
5055
|
let r = e.split(/\r?\n/), i = !1, a = r.map((e) => {
|
|
5054
5056
|
if (i) return e;
|
|
5055
5057
|
let r = e.trim();
|
|
@@ -5059,48 +5061,48 @@ function ps(e, t, n) {
|
|
|
5059
5061
|
});
|
|
5060
5062
|
return i ? a.join("\n") : e + `${e.length > 0 && !e.endsWith("\n") ? "\n" : ""}${t}=${n}\n`;
|
|
5061
5063
|
}
|
|
5062
|
-
async function
|
|
5064
|
+
async function _s(e) {
|
|
5063
5065
|
return await J(e) ? y.readFile(e, "utf-8") : "";
|
|
5064
5066
|
}
|
|
5065
|
-
async function
|
|
5067
|
+
async function vs(e) {
|
|
5066
5068
|
let t = T.join(T.dirname(e), ".env");
|
|
5067
5069
|
return await J(t) || await y.copyFile(e, t), t;
|
|
5068
5070
|
}
|
|
5069
|
-
async function
|
|
5070
|
-
let r =
|
|
5071
|
+
async function ys(e, t, n) {
|
|
5072
|
+
let r = gs(await _s(e), t, n);
|
|
5071
5073
|
await y.writeFile(e, r, "utf-8");
|
|
5072
5074
|
}
|
|
5073
5075
|
//#endregion
|
|
5074
5076
|
//#region src/commands/onboard.ts
|
|
5075
|
-
async function
|
|
5077
|
+
async function bs(e = {}) {
|
|
5076
5078
|
let t = e.cwd ?? process.cwd();
|
|
5077
|
-
|
|
5079
|
+
Va(), s.intro(z.brandBold("Onboard your stack"));
|
|
5078
5080
|
let n;
|
|
5079
5081
|
try {
|
|
5080
|
-
n = await
|
|
5082
|
+
n = await Dr(t);
|
|
5081
5083
|
} catch {
|
|
5082
5084
|
n = null;
|
|
5083
5085
|
}
|
|
5084
5086
|
n || (s.cancel(`${z.path("stack.json")} not found. Run ${z.command("npx @hype-stack/cli init")} first.`), process.exit(1));
|
|
5085
|
-
let r = n.installedPacks ?? [], i = n.onboarding?.envSections ?? [], a = await
|
|
5087
|
+
let r = n.installedPacks ?? [], i = n.onboarding?.envSections ?? [], a = await ho(t);
|
|
5086
5088
|
a.length === 0 && s.log.warn(z.muted("No .env.example files found; skipping env setup."));
|
|
5087
|
-
for (let n of a) await
|
|
5089
|
+
for (let n of a) await xs({
|
|
5088
5090
|
examplePath: n,
|
|
5089
5091
|
projectRoot: t,
|
|
5090
5092
|
skipPrompts: e.yes ?? !1,
|
|
5091
5093
|
installedEnvSections: i
|
|
5092
5094
|
});
|
|
5093
|
-
let o =
|
|
5094
|
-
o.length > 0 && s.note(o.map((e) => ` ${z.muted("·")} ${e}`).join("\n"), "Tips"), e.skipMigrations || await
|
|
5095
|
+
let o = Er(r);
|
|
5096
|
+
o.length > 0 && s.note(o.map((e) => ` ${z.muted("·")} ${e}`).join("\n"), "Tips"), e.skipMigrations || await ws(t, e.yes ?? !1), s.outro(z.brand(`All set. Run ${z.command("pnpm dev")} to start your app.`));
|
|
5095
5097
|
}
|
|
5096
|
-
async function
|
|
5097
|
-
let { examplePath: t, projectRoot: n, skipPrompts: r, installedEnvSections: i } = e, a = T.relative(n, t) || t, o = await
|
|
5098
|
+
async function xs(e) {
|
|
5099
|
+
let { examplePath: t, projectRoot: n, skipPrompts: r, installedEnvSections: i } = e, a = T.relative(n, t) || t, o = await vs(t), c = await _s(o), l = ms(await y.readFile(t, "utf-8")), u = z.path(a);
|
|
5098
5100
|
s.log.step(`Env: ${u}`);
|
|
5099
5101
|
for (let e of l) {
|
|
5100
5102
|
if (e.vars.length === 0) continue;
|
|
5101
|
-
if (!
|
|
5103
|
+
if (!Sr(e.section, i)) {
|
|
5102
5104
|
let t = e.section ? z.bold(e.section) : z.bold("Variables");
|
|
5103
|
-
s.log.info(`${t} ${z.muted("skipped (
|
|
5105
|
+
s.log.info(`${t} ${z.muted("skipped (not owned by an installed pack)")}`);
|
|
5104
5106
|
continue;
|
|
5105
5107
|
}
|
|
5106
5108
|
let t = xr(e.section), n = e.section ? z.bold(e.section) : z.bold("Variables");
|
|
@@ -5110,7 +5112,7 @@ async function vs(e) {
|
|
|
5110
5112
|
s.log.info(`${z.label(n.key)} ${z.muted("skipped (non-interactive)")}`);
|
|
5111
5113
|
continue;
|
|
5112
5114
|
}
|
|
5113
|
-
let e =
|
|
5115
|
+
let e = hs(Ss(c, n.key)), i = await s.text({
|
|
5114
5116
|
message: `${z.label(n.key)}`,
|
|
5115
5117
|
placeholder: e ? `${e} ${z.muted("(Enter keeps this)")}` : t.hint
|
|
5116
5118
|
});
|
|
@@ -5120,31 +5122,31 @@ async function vs(e) {
|
|
|
5120
5122
|
s.log.info(z.muted(`${n.key} unchanged.`));
|
|
5121
5123
|
continue;
|
|
5122
5124
|
}
|
|
5123
|
-
await
|
|
5125
|
+
await ys(o, n.key, a), s.log.success(`${n.key} saved`);
|
|
5124
5126
|
}
|
|
5125
5127
|
}
|
|
5126
5128
|
}
|
|
5127
|
-
function
|
|
5129
|
+
function Ss(e, t) {
|
|
5128
5130
|
for (let n of e.split(/\r?\n/)) {
|
|
5129
|
-
let e = n.match(RegExp(`^${
|
|
5131
|
+
let e = n.match(RegExp(`^${Cs(t)}\\s*=\\s*(.*)$`));
|
|
5130
5132
|
if (e) return e[1].trim();
|
|
5131
5133
|
}
|
|
5132
5134
|
return "";
|
|
5133
5135
|
}
|
|
5134
|
-
function
|
|
5136
|
+
function Cs(e) {
|
|
5135
5137
|
return e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
5136
5138
|
}
|
|
5137
|
-
async function
|
|
5138
|
-
if (!await
|
|
5139
|
+
async function ws(e, t) {
|
|
5140
|
+
if (!await fa() && !await ma(e, t, !1)) {
|
|
5139
5141
|
s.log.info(z.muted(`Start services later with ${z.command("docker compose up -d")} (in apps/backend), then ${z.command("pnpm --filter @internal/backend migration:latest")}.`));
|
|
5140
5142
|
return;
|
|
5141
5143
|
}
|
|
5142
5144
|
let n = s.spinner();
|
|
5143
|
-
if (n.start("Waiting for Postgres to be ready..."), !await
|
|
5145
|
+
if (n.start("Waiting for Postgres to be ready..."), !await ga(e)) {
|
|
5144
5146
|
n.error("Postgres health check timed out"), s.log.warn(z.muted(`Run migrations manually once Postgres is ready: ${z.command("pnpm --filter @internal/backend migration:latest")}`));
|
|
5145
5147
|
return;
|
|
5146
5148
|
}
|
|
5147
|
-
if (n.stop(z.success("Postgres is ready")), await
|
|
5149
|
+
if (n.stop(z.success("Postgres is ready")), await va(e)) {
|
|
5148
5150
|
s.log.info(z.muted("Migrations already applied, skipping."));
|
|
5149
5151
|
return;
|
|
5150
5152
|
}
|
|
@@ -5156,20 +5158,20 @@ async function xs(e, t) {
|
|
|
5156
5158
|
s.log.info(z.muted("Skipping database migrations."));
|
|
5157
5159
|
return;
|
|
5158
5160
|
}
|
|
5159
|
-
await
|
|
5161
|
+
await ya(e);
|
|
5160
5162
|
}
|
|
5161
5163
|
//#endregion
|
|
5162
5164
|
//#region src/core/templates.ts
|
|
5163
|
-
var
|
|
5165
|
+
var Ts = K.createRequest()({
|
|
5164
5166
|
endpoint: "/templates/list",
|
|
5165
5167
|
method: "GET"
|
|
5166
5168
|
});
|
|
5167
|
-
async function
|
|
5168
|
-
let { data: e, error: t } = await
|
|
5169
|
+
async function Es() {
|
|
5170
|
+
let { data: e, error: t } = await Ts.send();
|
|
5169
5171
|
if (t || !e) throw Error(`Failed to fetch template list: ${String(t)}`);
|
|
5170
5172
|
return e.templates;
|
|
5171
5173
|
}
|
|
5172
|
-
async function
|
|
5174
|
+
async function Ds(e) {
|
|
5173
5175
|
let { data: t, error: n, status: r } = await K.createRequest()({
|
|
5174
5176
|
endpoint: `/templates/${encodeURIComponent(e)}/manifest`,
|
|
5175
5177
|
method: "GET"
|
|
@@ -5178,7 +5180,7 @@ async function ws(e) {
|
|
|
5178
5180
|
if (n || !t) throw Error(`Failed to load manifest for template "${e}": ${String(n)}`);
|
|
5179
5181
|
return t;
|
|
5180
5182
|
}
|
|
5181
|
-
async function
|
|
5183
|
+
async function Os(e, t = {}) {
|
|
5182
5184
|
let n = K.createRequest()({
|
|
5183
5185
|
endpoint: `/templates/${encodeURIComponent(e)}/download`,
|
|
5184
5186
|
method: "POST"
|
|
@@ -5206,21 +5208,21 @@ async function Ts(e, t = {}) {
|
|
|
5206
5208
|
}
|
|
5207
5209
|
//#endregion
|
|
5208
5210
|
//#region src/commands/template.ts
|
|
5209
|
-
async function
|
|
5211
|
+
async function ks(t = {}) {
|
|
5210
5212
|
let n = t.cwd ?? process.cwd();
|
|
5211
|
-
|
|
5213
|
+
Va();
|
|
5212
5214
|
let r = s.spinner();
|
|
5213
5215
|
r.start("Loading packs...");
|
|
5214
5216
|
let o;
|
|
5215
5217
|
try {
|
|
5216
|
-
o = await
|
|
5218
|
+
o = await zr();
|
|
5217
5219
|
} catch (e) {
|
|
5218
5220
|
r.stop("Failed to load packs"), s.cancel(`Could not reach Hype Stack. Check your connection and try again.\n${$(e)}`), process.exit(1);
|
|
5219
5221
|
}
|
|
5220
5222
|
r.stop("Packs loaded"), r.start("Loading templates...");
|
|
5221
5223
|
let c;
|
|
5222
5224
|
try {
|
|
5223
|
-
c = await
|
|
5225
|
+
c = await Es();
|
|
5224
5226
|
} catch (e) {
|
|
5225
5227
|
r.stop("Failed to load templates"), s.cancel(`Could not reach Hype Stack. Check your connection and try again.\n${$(e)}`), process.exit(1);
|
|
5226
5228
|
}
|
|
@@ -5243,32 +5245,32 @@ async function Es(t = {}) {
|
|
|
5243
5245
|
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}`);
|
|
5244
5246
|
let d;
|
|
5245
5247
|
try {
|
|
5246
|
-
d = await
|
|
5248
|
+
d = await Ds(u.id);
|
|
5247
5249
|
} catch (e) {
|
|
5248
5250
|
s.cancel($(e)), process.exit(1);
|
|
5249
5251
|
}
|
|
5250
|
-
let f = await
|
|
5252
|
+
let f = await as(n, {}, {
|
|
5251
5253
|
defaultTheme: d.theme,
|
|
5252
5254
|
defaultMode: d.defaultMode
|
|
5253
5255
|
}), p = f?.projectRoot ?? null, m = f?.scaffolded ?? !1, h;
|
|
5254
5256
|
try {
|
|
5255
|
-
h = await
|
|
5257
|
+
h = await Dr(p ?? n);
|
|
5256
5258
|
} catch (e) {
|
|
5257
5259
|
s.cancel(`Could not parse ${z.path("stack.json")}: ${$(e)} Run 'npx @hype-stack/cli init' to regenerate it.`), process.exit(1);
|
|
5258
5260
|
}
|
|
5259
5261
|
h || (s.cancel(p ? `Could not read ${z.path("stack.json")}. Run 'npx @hype-stack/cli init' to regenerate it, then run 'npx @hype-stack/cli template' again.` : `No ${z.path("stack.json")}. Run 'npx @hype-stack/cli init' first, then 'npx @hype-stack/cli template'.`), process.exit(1)), h.paths || (s.cancel(`${z.path("stack.json")} is missing ${z.path("paths")}. Run 'npx @hype-stack/cli init' again to regenerate it.`), process.exit(1));
|
|
5260
5262
|
let g = p ?? n;
|
|
5261
5263
|
s.intro(z.brandBold("Install a template"));
|
|
5262
|
-
let _ = h.installedPacks ?? [], v = new Set(_), b = new Map(o.map((e) => [e.name, e])), x = t.licenseKey ?? h.licenseKey ?? null, S = (await Kn(I()))?.token ?? null, C = await
|
|
5264
|
+
let _ = h.installedPacks ?? [], v = new Set(_), b = new Map(o.map((e) => [e.name, e])), x = t.licenseKey ?? h.licenseKey ?? null, S = (await Kn(I()))?.token ?? null, C = await As(u, t.variants, t.yes ?? !1), w = Oa(u.slots, C), E = ka(u.slots, u.packs, w), D = await js({
|
|
5263
5265
|
packs: o,
|
|
5264
5266
|
templatePacks: E,
|
|
5265
5267
|
installedSet: v,
|
|
5266
5268
|
options: t
|
|
5267
5269
|
}), O = [...E, ...D.filter((e) => !E.includes(e))], k = O.filter((e) => !b.has(e));
|
|
5268
5270
|
k.length > 0 && (s.cancel(`Unknown pack${k.length === 1 ? "" : "s"}: ${k.join(", ")}`), process.exit(1));
|
|
5269
|
-
let ee =
|
|
5271
|
+
let ee = Ma(o, w), A = wa(ee), te;
|
|
5270
5272
|
try {
|
|
5271
|
-
te =
|
|
5273
|
+
te = Ea(O, A, _);
|
|
5272
5274
|
} catch (e) {
|
|
5273
5275
|
s.cancel($(e)), process.exit(1);
|
|
5274
5276
|
}
|
|
@@ -5276,13 +5278,13 @@ async function Es(t = {}) {
|
|
|
5276
5278
|
s.outro(z.muted("Every pack in this template is already installed."));
|
|
5277
5279
|
return;
|
|
5278
5280
|
}
|
|
5279
|
-
let j = await
|
|
5281
|
+
let j = await zo(ee, v, {
|
|
5280
5282
|
token: S,
|
|
5281
5283
|
key: x
|
|
5282
5284
|
}), ne = (e) => {
|
|
5283
5285
|
let t = b.get(e);
|
|
5284
5286
|
return !t || t.tier === "free" ? "free" : j[e]?.owned ? "owned" : "locked";
|
|
5285
|
-
}, M = (e) => !v.has(e) && ne(e) === "locked", N =
|
|
5287
|
+
}, M = (e) => !v.has(e) && ne(e) === "locked", N = Da({
|
|
5286
5288
|
order: te.order,
|
|
5287
5289
|
graph: A,
|
|
5288
5290
|
isLocked: M,
|
|
@@ -5290,28 +5292,28 @@ async function Es(t = {}) {
|
|
|
5290
5292
|
});
|
|
5291
5293
|
if (N.blocked.length > 0 && !S && !x) {
|
|
5292
5294
|
let e = await nr();
|
|
5293
|
-
e && (S = e, j = await
|
|
5295
|
+
e && (S = e, j = await zo(ee, v, {
|
|
5294
5296
|
token: S,
|
|
5295
5297
|
key: x
|
|
5296
|
-
}), N =
|
|
5298
|
+
}), N = Da({
|
|
5297
5299
|
order: te.order,
|
|
5298
5300
|
graph: A,
|
|
5299
5301
|
isLocked: M,
|
|
5300
5302
|
installed: _
|
|
5301
5303
|
}));
|
|
5302
5304
|
}
|
|
5303
|
-
if (N.blocked.length > 0 && await
|
|
5305
|
+
if (N.blocked.length > 0 && await Vo(N.blocked, M, b), N.installable.length === 0) {
|
|
5304
5306
|
s.outro(z.muted("Nothing left to install once locked packs are removed."));
|
|
5305
5307
|
return;
|
|
5306
5308
|
}
|
|
5307
|
-
if (
|
|
5309
|
+
if (Ho(N.installable, b), !t.yes) {
|
|
5308
5310
|
let e = await s.confirm({ message: `Install template ${z.brandBold(u.name)} (${N.installable.length} pack${N.installable.length === 1 ? "" : "s"})?` });
|
|
5309
5311
|
(s.isCancel(e) || !e) && (s.cancel("Installation cancelled."), process.exit(0));
|
|
5310
5312
|
}
|
|
5311
5313
|
r.start("Downloading packs...");
|
|
5312
5314
|
let P;
|
|
5313
5315
|
try {
|
|
5314
|
-
P = await
|
|
5316
|
+
P = await Uo(N.installable, {
|
|
5315
5317
|
token: S,
|
|
5316
5318
|
key: x
|
|
5317
5319
|
});
|
|
@@ -5319,7 +5321,7 @@ async function Es(t = {}) {
|
|
|
5319
5321
|
r.stop("Download failed"), s.cancel($(e)), process.exit(1);
|
|
5320
5322
|
}
|
|
5321
5323
|
r.stop(`Downloaded ${P.length} pack${P.length === 1 ? "" : "s"}`);
|
|
5322
|
-
let re = await
|
|
5324
|
+
let re = await qo({
|
|
5323
5325
|
prepared: P,
|
|
5324
5326
|
config: h,
|
|
5325
5327
|
cwd: g,
|
|
@@ -5328,7 +5330,7 @@ async function Es(t = {}) {
|
|
|
5328
5330
|
}), F = null;
|
|
5329
5331
|
try {
|
|
5330
5332
|
r.start("Installing pack files...");
|
|
5331
|
-
let n = await
|
|
5333
|
+
let n = await $i({
|
|
5332
5334
|
packs: P,
|
|
5333
5335
|
config: h,
|
|
5334
5336
|
projectRoot: g,
|
|
@@ -5340,15 +5342,15 @@ async function Es(t = {}) {
|
|
|
5340
5342
|
for (let e of n.errors) s.log.error(e);
|
|
5341
5343
|
s.cancel("No files were written. Fix the errors above (or pass --force for existing files) and try again."), process.exit(1);
|
|
5342
5344
|
}
|
|
5343
|
-
r.stop("Files installed"), n.installed.length > 0 && s.log.success(`${z.highlight(String(n.installed.length))} files installed`), n.skipped.length > 0 && (s.log.warning(`${n.skipped.length} files skipped (use --force to overwrite)`),
|
|
5345
|
+
r.stop("Files installed"), n.installed.length > 0 && s.log.success(`${z.highlight(String(n.installed.length))} files installed`), n.skipped.length > 0 && (s.log.warning(`${n.skipped.length} files skipped (use --force to overwrite)`), Ko(n.skipped));
|
|
5344
5346
|
for (let e of n.errors) s.log.error(e);
|
|
5345
5347
|
r.start("Applying template overrides...");
|
|
5346
|
-
let o = await
|
|
5348
|
+
let o = await Os(u.id, {
|
|
5347
5349
|
token: S,
|
|
5348
5350
|
licenseKey: x
|
|
5349
5351
|
});
|
|
5350
5352
|
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)), F = o.templateDir;
|
|
5351
|
-
let c = await
|
|
5353
|
+
let c = await ta({
|
|
5352
5354
|
manifest: d,
|
|
5353
5355
|
config: h,
|
|
5354
5356
|
projectRoot: g,
|
|
@@ -5358,11 +5360,11 @@ async function Es(t = {}) {
|
|
|
5358
5360
|
for (let e of c.errors) s.log.error(e);
|
|
5359
5361
|
if (!m) {
|
|
5360
5362
|
let t = T.resolve(g, h.paths?.frontend.root ?? "apps/frontend"), n = d.theme ?? "zinc-mono";
|
|
5361
|
-
a(n) && (await
|
|
5363
|
+
a(n) && (await ro(t, i(n)) ? s.log.success(`Applied the ${i(n).label} theme`) : s.log.warning(z.muted(`Could not find ${z.path("assets/styles.css")} to apply the theme`)));
|
|
5362
5364
|
let r = d.defaultMode === "dark" || d.defaultMode === "light" ? d.defaultMode : e;
|
|
5363
|
-
await
|
|
5365
|
+
await Za(t, r) ? s.log.success(`Default color mode set to ${r}`) : s.log.warning(z.muted(`Could not find ${z.path("src/hooks/use-theme.ts")} to set the default color mode`));
|
|
5364
5366
|
}
|
|
5365
|
-
await
|
|
5367
|
+
await Ms({
|
|
5366
5368
|
prepared: P,
|
|
5367
5369
|
templateNpm: d.dependencies_npm,
|
|
5368
5370
|
paths: h.paths,
|
|
@@ -5370,13 +5372,13 @@ async function Es(t = {}) {
|
|
|
5370
5372
|
spinner: r
|
|
5371
5373
|
});
|
|
5372
5374
|
let l;
|
|
5373
|
-
m && (l = await
|
|
5375
|
+
m && (l = await Ca(g, t.yes ?? !1)), await pr({
|
|
5374
5376
|
projectRoot: g,
|
|
5375
5377
|
paths: h.paths,
|
|
5376
5378
|
skipPrompts: t.yes ?? !1,
|
|
5377
5379
|
dbReady: l,
|
|
5378
5380
|
freshScaffold: m
|
|
5379
|
-
}),
|
|
5381
|
+
}), Go(), s.outro(z.brand(`Installed template ${u.name}.`));
|
|
5380
5382
|
} finally {
|
|
5381
5383
|
await Promise.all(P.map((e) => y.rm(e.packDir, {
|
|
5382
5384
|
recursive: !0,
|
|
@@ -5387,7 +5389,7 @@ async function Es(t = {}) {
|
|
|
5387
5389
|
});
|
|
5388
5390
|
}
|
|
5389
5391
|
}
|
|
5390
|
-
async function
|
|
5392
|
+
async function As(e, t, n) {
|
|
5391
5393
|
let r = {};
|
|
5392
5394
|
for (let i of e.slots) {
|
|
5393
5395
|
if (t?.[i.family]) {
|
|
@@ -5411,7 +5413,7 @@ async function Ds(e, t, n) {
|
|
|
5411
5413
|
}
|
|
5412
5414
|
return r;
|
|
5413
5415
|
}
|
|
5414
|
-
async function
|
|
5416
|
+
async function js(e) {
|
|
5415
5417
|
let { packs: t, templatePacks: n, installedSet: r, options: i } = e, a = new Set(n);
|
|
5416
5418
|
if (i.packs && i.packs.length > 0) {
|
|
5417
5419
|
let e = i.packs.filter((e) => !t.some((t) => t.name === e));
|
|
@@ -5422,7 +5424,7 @@ async function Os(e) {
|
|
|
5422
5424
|
if (o.length === 0) return [];
|
|
5423
5425
|
let c = ce();
|
|
5424
5426
|
s.note(o.map((e) => ` ${B.arrow} ${z.highlight(e.displayName)} ${ge(`${c}/packs/${e.name}`)}`).join("\n"), "Browse packs");
|
|
5425
|
-
let l = await
|
|
5427
|
+
let l = await Wa({
|
|
5426
5428
|
message: "Add extra packs on top of the template (optional)",
|
|
5427
5429
|
options: o.map((e) => ({
|
|
5428
5430
|
value: e.name,
|
|
@@ -5433,25 +5435,25 @@ async function Os(e) {
|
|
|
5433
5435
|
});
|
|
5434
5436
|
return m(l) && (s.cancel("Cancelled."), process.exit(0)), l;
|
|
5435
5437
|
}
|
|
5436
|
-
async function
|
|
5437
|
-
let { prepared: t, templateNpm: n, paths: r, cwd: i, spinner: a } = e, o =
|
|
5438
|
+
async function Ms(e) {
|
|
5439
|
+
let { prepared: t, templateNpm: n, paths: r, cwd: i, spinner: a } = e, o = Lo(t.map((e) => e.manifest.dependencies_npm)), c = Io(n ? Lo([o, n]) : o, r);
|
|
5438
5440
|
if (c.errors.length > 0) {
|
|
5439
5441
|
for (let e of c.errors) s.log.error(e);
|
|
5440
5442
|
return;
|
|
5441
5443
|
}
|
|
5442
5444
|
if (c.operations.length === 0) return;
|
|
5443
5445
|
a.start("Installing npm dependencies...");
|
|
5444
|
-
let l = await
|
|
5446
|
+
let l = await Ro(c.operations, i);
|
|
5445
5447
|
if (a.stop(l.ok ? "npm dependencies installed" : "npm dependency installation failed"), !l.ok) for (let e of l.errors) s.log.error(e);
|
|
5446
5448
|
}
|
|
5447
5449
|
//#endregion
|
|
5448
5450
|
//#region src/cli.ts
|
|
5449
|
-
function
|
|
5451
|
+
function Ns(e) {
|
|
5450
5452
|
if (!e) return;
|
|
5451
5453
|
let t = e.split(",").map((e) => e.trim()).filter((e) => e.length > 0);
|
|
5452
5454
|
return t.length > 0 ? t : void 0;
|
|
5453
5455
|
}
|
|
5454
|
-
function
|
|
5456
|
+
function Ps(e) {
|
|
5455
5457
|
if (!e) return;
|
|
5456
5458
|
let t = {};
|
|
5457
5459
|
for (let n of e.split(",")) {
|
|
@@ -5460,10 +5462,10 @@ function js(e) {
|
|
|
5460
5462
|
}
|
|
5461
5463
|
return Object.keys(t).length > 0 ? t : void 0;
|
|
5462
5464
|
}
|
|
5463
|
-
function
|
|
5465
|
+
function Fs() {
|
|
5464
5466
|
let e = new o();
|
|
5465
5467
|
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) => {
|
|
5466
|
-
await
|
|
5468
|
+
await rs({
|
|
5467
5469
|
name: e.name,
|
|
5468
5470
|
directory: e.directory,
|
|
5469
5471
|
install: e.install,
|
|
@@ -5473,38 +5475,38 @@ function Ms() {
|
|
|
5473
5475
|
setup: e.setup
|
|
5474
5476
|
});
|
|
5475
5477
|
}), e.command("init").description("Initialize stack.json in the current project").action(async () => {
|
|
5476
|
-
await
|
|
5478
|
+
await is({});
|
|
5477
5479
|
}), 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) => {
|
|
5478
|
-
await
|
|
5480
|
+
await bs({
|
|
5479
5481
|
cwd: e.cwd,
|
|
5480
5482
|
yes: e.yes,
|
|
5481
5483
|
skipMigrations: e.skipMigrations
|
|
5482
5484
|
});
|
|
5483
5485
|
}), 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) => {
|
|
5484
|
-
await
|
|
5485
|
-
packs:
|
|
5486
|
+
await os({
|
|
5487
|
+
packs: Ns(e.packs),
|
|
5486
5488
|
force: e.force,
|
|
5487
5489
|
yes: e.yes,
|
|
5488
5490
|
licenseKey: e.key ?? e.licenseKey,
|
|
5489
5491
|
cwd: e.cwd
|
|
5490
5492
|
});
|
|
5491
5493
|
}), 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) => {
|
|
5492
|
-
await
|
|
5494
|
+
await ks({
|
|
5493
5495
|
templateId: e,
|
|
5494
|
-
variants:
|
|
5495
|
-
packs:
|
|
5496
|
+
variants: Ps(t.variants),
|
|
5497
|
+
packs: Ns(t.packs),
|
|
5496
5498
|
force: t.force,
|
|
5497
5499
|
yes: t.yes,
|
|
5498
5500
|
licenseKey: t.key ?? t.licenseKey,
|
|
5499
5501
|
cwd: t.cwd
|
|
5500
5502
|
});
|
|
5501
5503
|
}), e.command("login").description("Log in via your browser to install packs your organization owns").action(async () => {
|
|
5502
|
-
await
|
|
5504
|
+
await fs();
|
|
5503
5505
|
}), e.command("logout").description("Log out and remove the saved CLI token").action(async () => {
|
|
5504
|
-
await
|
|
5506
|
+
await ps();
|
|
5505
5507
|
}), e.command("auth").description("Alias for `login`").action(async () => {
|
|
5506
|
-
await
|
|
5508
|
+
await fs();
|
|
5507
5509
|
}), e;
|
|
5508
5510
|
}
|
|
5509
5511
|
//#endregion
|
|
5510
|
-
export {
|
|
5512
|
+
export { as as a, os as i, ps as n, is as o, fs as r, rs as s, Fs as t };
|